Free FFXIV Fishing Bot, works with v2.3.5

09/22/2014 01:45 StolasZagan#16
Quote:
Originally Posted by lucid View Post
There are a few mooch detection possibilities:
  • Chat log
  • Hotkey availability
  • Fishing result; sourced from on-screen popup gathering result or HQ animation upon reel-in

The last option requires advance knowledge of which fish are part of mooch chains, which means each fish and possibly each location must be sourced prior to runtime. Since you already appear to know whether the result is HQ or not, you should be able to tell whether or mooch can be used or not by the type of fish (ex. Merlthor Goby HQ = yes).

BTW you do not need to inject code to read from the chat log. In fact, you never need to inject code to read anything from memory.

I believe the chat structure works similar to the 1.0, an array of line lengths and a pointer to the data blob. Chat is in a binary format you'll need to parse (auto-translates, item links, etc are in there too). The format is quite similar to the log files, except the offsets and the data are stored separately in memory and the log file has a start and end line number at the top.

My private bot uses the hotbar data for mooching, I found it to be the best fit for what I wanted. If you're looking for new features, mine has a few I didn't see mentioned:
  • Automatic enabling of cast light (to avoid looking like a bot)
  • Catching big fish only (dump bad results with Quit because it is faster)
  • Ability to pregame for a fish before a window and automatically hold the nth mooch
  • Ability to repair
  • Ability to move/reset fishing location ("The fish sense something is amiss")
  • Multibox support?

You could also consider reading the user's configuration so they can set hotbars however they'd like.

Catching big fish only is not an indication that the person is botting because players can listen to the sound of the fish biting and determine the size. Small fish sound like a slight rattle, medium fish have a more robust rattling sound and big fish sound like a stick (rod) breaking/snapping.
Thanks for the suggestions!

I've been using code injection to extract dynamic pointers as I had no luck finding a base pointer for e.g. the chat log, but I found very easily where the different pointers were used in the code, so I injected some code to write the pointers in codecave.

I'll be working on a feature update next month. Been very busy with work these past few weeks.
09/22/2014 05:26 lucid#17
Quote:
Originally Posted by StolasZagan View Post
I've been using code injection to extract dynamic pointers as I had no luck finding a base pointer for e.g. the chat log, but I found very easily where the different pointers were used in the code, so I injected some code to write the pointers in codecave.
Why not simply search the instruction bytes and extract the pointer's value? There's no injection required to do that.

For example:
8B 8D DC F8 FF FF 51 B9 ?? ?? ?? ?? E8 XX XX XX XX 8B 0D XX XX XX XX E8 XX XX XX XX 85 C0 0F 84 XX XX XX XX 8B 95 DC F8 FF FF 52

The question marks represent the desired 4-byte pointer, the X's represent wildcards.
  1. Attach Cheat Engine to FFXIV
  2. Perform a new "Array of Bytes" value type scan
  3. Under "Memory Scan Options" make sure "Writable" is either unchecked or checked and grayed out (NOT simply checked)
  4. Enter the signature above as the search value
  5. Scan

You should get one result. The pointer to the fish bait value is at +0x8 from that resulting address:

Code:
 0  1  2  3  4  5  6  7  8
↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
8B 8D DC F8 FF FF 51 B9 ?? ?? ?? ?? E8 XX XX XX XX 8B 0D...
                       [ 1  2  3  4 ]
...so if you get a match at 0x10FCEFD, you'd do 0x10FCEFD + 0x8 = 0x010FCF05. That address contains a pointer, not the value.

The pointer at 0x010FCF05 isn't quite the end, there is one other offset which for patch 2.38 happens to be 0x30C. You could find the 0x30C value with a signature similar to the above process.

So if 0x010FCF05→0x01BF1AB0, you add 0x30C to 0x01BF1AB0, the result of which is the address for the bait ID value.

This can all be performed programmatically; no injection required :)

This is commonly called "pattern scanning" or "signature scanning" but doesn't require any injection or codecaves.
09/22/2014 11:51 StolasZagan#18
Quote:
Originally Posted by lucid View Post
Why not simply search the instruction bytes and extract the pointer's value? There's no injection required to do that.

For example:
8B 8D DC F8 FF FF 51 B9 ?? ?? ?? ?? E8 XX XX XX XX 8B 0D XX XX XX XX E8 XX XX XX XX 85 C0 0F 84 XX XX XX XX 8B 95 DC F8 FF FF 52

The question marks represent the desired 4-byte pointer, the X's represent wildcards.
  1. Attach Cheat Engine to FFXIV
  2. Perform a new "Array of Bytes" value type scan
  3. Under "Memory Scan Options" make sure "Writable" is either unchecked or checked and grayed out (NOT simply checked)
  4. Enter the signature above as the search value
  5. Scan

You should get one result. The pointer to the fish bait value is at +0x8 from that resulting address:

Code:
 0  1  2  3  4  5  6  7  8
↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓ ↓↓
8B 8D DC F8 FF FF 51 B9 ?? ?? ?? ?? E8 XX XX XX XX 8B 0D...
                       [ 1  2  3  4 ]
...so if you get a match at 0x10FCEFD, you'd do 0x10FCEFD + 0x8 = 0x010FCF05. That address contains a pointer, not the value.

The pointer at 0x010FCF05 isn't quite the end, there is one other offset which for patch 2.38 happens to be 0x30C. You could find the 0x30C value with a signature similar to the above process.

So if 0x010FCF05→0x01BF1AB0, you add 0x30C to 0x01BF1AB0, the result of which is the address for the bait ID value.

This can all be performed programmatically; no injection required :)

This is commonly called "pattern scanning" or "signature scanning" but doesn't require any injection or codecaves.
Thanks for the example!

I have no idea why I haven't thought of doing that before.

I tried the example you gave me and noticed that the pointer to the AoB blob is in static memory at ffxiv.exe+51CEFD, thus you could just use

ffxiv.exe+51CEFD -> ? + 0x8 -> ? + 0x30c -> Bait ID

And so my question is, do you simply use that pointer in your bot, or have you implemented a pattern scanner such that your bot can find these pointers even if the base pointer was to change after a game update?

EDIT:
Oh and for curiosity's sake, are you looking up the name of the bait IDs in the game's memory, or do you have some table of ID->Names stored in the bot? I imagine the former but figured I'd ask just in case :)
09/22/2014 14:47 lucid#19
Quote:
Originally Posted by StolasZagan View Post
I tried the example you gave me and noticed that the pointer to the AoB blob is in static memory at ffxiv.exe+51CEFD, thus you could just use

ffxiv.exe+51CEFD -> ? + 0x8 -> ? + 0x30c -> Bait ID

And so my question is, do you simply use that pointer in your bot, or have you implemented a pattern scanner such that your bot can find these pointers even if the base pointer was to change after a game update?
I read the actual pointer and do not convert it to base+offset. Base+offset is a nice portable way of talking about it so you could quickly reference it to someone else but when thinking about making your program stand up to updates it would be better to simply use the pointers obtained from scans.

Quote:
Originally Posted by StolasZagan View Post
Oh and for curiosity's sake, are you looking up the name of the bait IDs in the game's memory, or do you have some table of ID->Names stored in the bot? I imagine the former but figured I'd ask just in case :)
I have all baits stored, I don't anticipate more (their IDs are consecutive and bookended by other non-bait item IDs) but if they did add more they'd be exceptionally quick and easy to find since you only need one piece of the bait, one time. Fishing holes and mooch locations are a bit more subject to massive change, expansion... so I was firmly against storing mooch chains (too much probable maintenance).
09/22/2014 15:35 StolasZagan#20
Quote:
Originally Posted by lucid View Post
I read the actual pointer and do not convert it to base+offset. Base+offset is a nice portable way of talking about it so you could quickly reference it to someone else but when thinking about making your program stand up to updates it would be better to simply use the pointers obtained from scans.



I have all baits stored, I don't anticipate more (their IDs are consecutive and bookended by other non-bait item IDs) but if they did add more they'd be exceptionally quick and easy to find since you only need one piece of the bait, one time. Fishing holes and mooch locations are a bit more subject to massive change, expansion... so I was firmly against storing mooch chains (too much probable maintenance).
That makes a lot of sense. Thanks for replying :)
09/23/2014 19:32 Gael77#21
Hi ^^

Thanks for this bot, it works very well.
I play in french and i have no issue to get my fishes but i found a little bug : In the "fish name" column, instead to put the name of the fish i get, it always try to put the name of a tank earring. See yourself :

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

The full name it tries to put it "Boucles D'oreilles De Protecteur Des Tremblements Dévastateurs" (which is "Tremor Earrings Of Fending" in english).

The amout column is good, the only issue is on the name.

I know it's not a big deal (and to be honest i dont really care) but i thought it was a good thing to let you know about this bug ^^
09/23/2014 20:38 Kamigee#22
Awesome, works great :D
thanks so much!
09/25/2014 11:53 StolasZagan#23
Quote:
Originally Posted by Gael77 View Post
Hi ^^

Thanks for this bot, it works very well.
I play in french and i have no issue to get my fishes but i found a little bug : In the "fish name" column, instead to put the name of the fish i get, it always try to put the name of a tank earring. See yourself :

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

The full name it tries to put it "Boucles D'oreilles De Protecteur Des Tremblements Dévastateurs" (which is "Tremor Earrings Of Fending" in english).

The amout column is good, the only issue is on the name.

I know it's not a big deal (and to be honest i dont really care) but i thought it was a good thing to let you know about this bug ^^
Thank you for the feedback!

I am aware of a similar issue with the Japanese version of the client, so for now I'm assuming that the catch list only works with the English client. I'll have more time to work more on the bot in the next week, so I'll try to get this issue resolved asap.
09/27/2014 17:38 rahstamagunja#24
thank you so much! works amazing :) will there be any updates soon?
09/28/2014 17:30 StolasZagan#25
Quote:
Originally Posted by rahstamagunja View Post
thank you so much! works amazing :) will there be any updates soon?
Thank you!

Yes, I plan on releasing a new version next week with some new features, but it all depends on how busy I am at work next week.
09/30/2014 10:07 Gael77#26
Something strange happened to me today. When i went into the folder where the bot is, the .exe file was replaced by a .tmp

Any idea why ? (no antivirus or anything on my PC that could replace my files)


Also i tried to download the file in page 1 but the link seems dead (i can only dl the v 1.0.0.0)
09/30/2014 13:26 Toids0#27
Thank you so much for this, works really well.

The links still work just fine, was able to download the latest one just now.
10/01/2014 13:22 paulomaulokaulo#28
stoped working for me after the hotfix, can someone else confirm?
10/01/2014 14:59 Toids0#29
I can confirm as well, after the recent hotfix Oct. 1st it does not work as intended.
When started it attempts to the cast the line and it does in game but I do not think it registers properly back to the program as it keeps trying to recast the fishing line. It then stops because it thinks it is unable to cast the fishing line when it in fact did.
10/01/2014 19:31 Kamigee#30
Yep, after the hotfix last night, Oct 1st it does not work, like the posters above.
I can cast normally but it doesn't hook, gives the message "You lose your bait..."
Also there's nothing in the bot logs, it just stops for me after the first cast where it can't hook.

Just pitching in, in hopes that it helps, I know it's already reported :O