Memory Location for FFXIV?

02/04/2012 21:24 lucid#16
Sorry I was mistaken... do the "W" in "Window_"

In your image, you would do a pointerscan, Lv1 Max 1024 for anything pointing to the address 035B97FA (which is the "W" in "Window_MainMenuWidget")

You should only get 1 result from the pointerscan. If you get more than 1, rescan it.

Once you find the pointer chain, then you have a valid pointer to the top of the widget stack. You can iterate over them to read the data programmatically.
02/04/2012 21:49 Millenia1983#17
Look, i isolated target name. I know static address, offset for MainMenu. Which should be my next step?

[Only registered and activated users can see links. Click Here To Register...]
02/04/2012 22:10 lucid#18
Target name is not stored in the widget structure AFAIK. I don't have an active account so I can't check but I am 99% sure that is not the case.

You will probably need to find more information and look in the memory region around the target name in order to determine what the contents of the larger memory structure are, then find the first of those contents (like you did with Window_MainMenuWidget). This means the pointers for the target would be entirely separate from the pointers for the widgets.

If it is stored in the widget struct and you don't know how to find it then you probably need more general programming experience before getting involved in this. There are many lessons you would learn in a context where they'll be easier to correct without having to worry about things like dec<->hex, pointers, and all of the uncontrollable variables that come into play. Having solid programming skills would make understanding and dealing with data much easier than it will be if you're learning both memory-related skills in addition to programming. Not to say you couldn't do it, but you will likely spend most of your time correcting issues which arise out of lack of programming experience.
02/04/2012 23:02 Millenia1983#19
God, i'm not even programmer i just ask how to find offset between 2 address'.
02/04/2012 23:33 Cooleko#20
Target name/ID are not related to the offset you found. This means no offset exists between target and main widget.

If you wish to find an offset for target name, then you need to perform a pointer scan (either by hand or CE) for that offset.

I recommend you change tactics. It is much easier to find a target ID address than target name, no offsets needed!
02/05/2012 14:01 Millenia1983#21
Thanx. So.
Step1. Find offset between base address and parent widget.
Step2. Find offset (or offsets) between parent widget and widget part.
Step3. Final offset to access ui part is base adress -> offset from step1 -> offset (or offsets) from step2. Right?

Is inventory menu also related to main menu? truly, what i need is to find the currently selected item name from inventory.
02/05/2012 14:55 lucid#22
Scroll through the widgets in the memory views, you'll get a good idea of what is there.

Basically, the high-level values of each widget will be stored in there, but not the contents of the widget. For example the "active" craft widget has the progress, durability, quality. Many widgets also have a byte which indicates if the widget is active or not.

Inventory is not stored in there, no list-style data is since each widget block is a fixed length as I previously mentioned. This means no variable-length data will be stored in the widgets.

For widgets you will:
  1. (prep) Determine the pointers (as you have) - you'll need to do this after each patch too
  2. (runtime) Read the pointer values so you get the address of "W" in "Window_"
  3. (runtime) Iterate over the widget struct
  4. (runtime) Add offsets to widget struct to get values internal to widget

If you don't know how to do that, I'd recommend getting more comfortable with programming. You will need to do math on the address you are reading with some dec<->hex converting.

So the whole thing might look like this (pseudo code):

Code:
' This will get the base of the game'
FFXIVBaseAddress = ReadAddressAsIntPtr(BaseOffsets)

' This will get the base of the widgets ("W" in "Window_")'
WidgetBase = ReadAddressAsIntPtr(FFXIVBaseAddress + BaseOffset)

' This will give us the base of the widget we are after, you would need to get CraftWidgetOffset'
CraftWidgetAddress = WidgetBase + CraftWidgetOffset

' Progress is 72 bytes (dec), or 0x48 (hex) from the start of the widget'
Progress = ReadAddressAsInteger(CraftWidgetAddress + 0x48)
' Now Progress should be set to whatever the in-game progress was when this code was run'
As you can see, programming is very much a requirement of making these things work. This means if you would struggle to come up with any of the above numbers (for example, CraftWidgetOffset), you would probably benefit from more programming experience before you jump in. I would also add that these lines of code will not be as they appear in a well-written program. Those features would be abstracted into functions and other programming structures, so you wouldn't see them back-to-back as they are.

Though you say you're not a programmer, you have your [Only registered and activated users can see links. Click Here To Register...] in the other thread. Is that your first attempt at programming anything, or are you just saying that you don't have a lot of prior programming experience?

Based upon the fact that you use pixel detection, I assume your tools are written using AutoIt or AutoHotKey. You'll want to move away from those at some point since they cause problems which cannot be resolved. For example, when sending keystrokes they send a lot of "noise" commands like WM_NULL and other bad stuff. Those platforms can also cause keys like the caps lock or left shift to become stuck if you ever press them while the bot is sending keystrokes.

Finally, a good part of the programming will involve what I showed you above with the memory reading functions. You will need to write or find someone else' code to perform the memory reading and to return the proper data types. ReadAddressAsIntPtr() and ReadAddressAsInteger(), you'll of course need ReadAddressAsString() and probably eventually ReadAddressAsByte().

In short, there is no quick answer anyone can provide about how to do this. There are several different aspects to creating tools like this and any gaps in your skill-set could make things significantly more challenging from a maintenance perspective.
02/05/2012 16:33 Millenia1983#23
Quote:
Originally Posted by lucid View Post
Though you say you're not a programmer, you have your tools pack in the other thread. Is that your first attempt at programming anything, or are you just saying that you don't have a lot of prior programming experience?
My tools work with graphics, but i completely have no experience with memory. Craftbot and most of tools work fine, but memory analysis can be impletented in selling tool and fishbot logic. All i want is just improving my project.

Quote:
For example, when sending keystrokes they send a lot of "noise" commands like WM_NULL and other bad stuff. Those platforms can also cause keys like the caps lock or left shift to become stuck if you ever press them while the bot is sending keystrokes.
I solved it by just disabling user's input while sending keystrokes (ReDresser does so).

OH GODS FINALY!!!!

[Only registered and activated users can see links. Click Here To Register...]

THANK YOU
02/06/2012 22:36 Millenia1983#24
How do you get fishing messages like "Fish is taking line", "You feel no bite" etc? They are not stored in FishingInputWidget, but all that messages have some prefix ~150 bytes above.
02/07/2012 00:03 Cooleko#25
they are sent to the chat log
02/07/2012 01:23 Millenia1983#26
Is chatlog an another widget or array with pointer?

Im' stuck here

[Only registered and activated users can see links. Click Here To Register...]

Fishing bot works perfectly in alt-tab, but i still cannot read messages.
02/07/2012 11:09 13ouncer#27
Try searching for text in the memory viewer, but before you search for the text follow these steps:

1.Have the widget window open.
2.Have the memory viewer search open.
3.Type the text that will appear in chat, after you click a button on the widget, in the memory viewer search box (the white area that shows all sorts of text and periods), but don't search for it yet (leave it open and ready to search)
4. Quickly press the widget button you chose and then perform the search in the memory viewer (almost simultaneously)

The reason you must do it quickly: SE scrambles the text and then logs it, almost as soon as it pops up. If you do it fast enough you can locate the address.

This is how I did it anyways.

GL!
02/07/2012 17:29 Cooleko#28
the chatlog is its own block of memory, maybe about 0x4000 long. the memory structure for the chat log holds where every line is as well as where the next line to be written to is.
02/07/2012 21:02 Millenia1983#29
Quote:
Originally Posted by Cooleko View Post
the chatlog is its own block of memory, maybe about 0x4000 long. the memory structure for the chat log holds where every line is as well as where the next line to be written to is.
look at pic, i've found it. last string is at top, older go downward. but it has no 1lvl pointer, only 5+
02/07/2012 21:22 Cooleko#30
From the looks of that picture you have not found the chat log, which is why i piped up. However, you may not be looking for the chatlog I am familiar with.