Fishing Packet Information (From Retail)
Posted: Mon Dec 15, 2014 8:42 pm
Since the last major fishing update the fishing packets have changed. 0x66 and 0x81 are no longer used and have been replaced with:
- 0x110 (Sent from the client.)
- 0x115 (Sent from the server.)
Packet 0x115 Information
This looks to be a copy over from the original 0x81 with some modifications done to it. Possibly to help deter hacks. This is how the client uses the packet:
The pointer seen here 'dword_1043EF34', is the clients internal fishing structure. What this is doing is populating the fishing structure with the new fishing data.
The known offsets inside of the client are currently:
+00 = max stamina
+04 = stamina
+12 = id3
+20 = id1
+24 = id2
+28 = id4
+32 = fight time
Which line up with this packet perfectly. (With some unknown values.)
This packet can be interpreted like this:
Note the comments, some of the values are altered to skew their info from being visually readable.
- 0x110 (Sent from the client.)
- 0x115 (Sent from the server.)
Packet 0x115 Information
This looks to be a copy over from the original 0x81 with some modifications done to it. Possibly to help deter hacks. This is how the client uses the packet:
Code: Select all
char __cdecl sub_10097B70(int a1, int a2, int a3)
{
unsigned int v3; // eax@1
unsigned int v5; // eax@5
unsigned int v6; // ecx@5
JUMPOUT(dword_1043EF30, 0, *(unsigned int *)std__codecvt_base__do_always_noconv);
dword_1043EF30 = (int)operator new(8u);
v3 = (unsigned int)operator new(0x38u);
dword_1043EF34 = v3;
if ( !dword_1043EF30 )
{
LABEL_7:
JUMPOUT(v3, 0, *(unsigned int *)std__codecvt_base__do_always_noconv);
sub_102E0550(v3);
dword_1043EF34 = 0;
JUMPOUT(*(int *)std__codecvt_base__do_always_noconv);
}
if ( !v3 )
{
sub_102E0550(dword_1043EF30);
v3 = dword_1043EF34;
dword_1043EF30 = 0;
goto LABEL_7;
}
*(_DWORD *)dword_1043EF30 = *(_DWORD *)(a3 + 20);
*(_DWORD *)(dword_1043EF34 + 8) = *(_WORD *)(a3 + 4);
*(_DWORD *)(dword_1043EF34 + 4) = *(_DWORD *)(dword_1043EF34 + 8);
*(_DWORD *)dword_1043EF34 = *(_DWORD *)(dword_1043EF34 + 4);
*(_DWORD *)(dword_1043EF34 + 12) = *(_WORD *)(a3 + 6);
*(_DWORD *)(dword_1043EF34 + 16) = *(_WORD *)(a3 + 8) - 128;
if ( !*(_WORD *)(a3 + 10) )
*(_WORD *)(a3 + 10) = 1;
*(_DWORD *)(dword_1043EF34 + 20) = 20 * *(_WORD *)(a3 + 10);
*(_DWORD *)(dword_1043EF34 + 24) = *(_WORD *)(a3 + 12);
*(_DWORD *)(dword_1043EF34 + 28) = *(_WORD *)(a3 + 14);
*(_DWORD *)(dword_1043EF34 + 32) = 60 * *(_WORD *)(a3 + 16);
*(_DWORD *)(dword_1043EF34 + 36) = 0;
*(_DWORD *)(dword_1043EF34 + 40) = *(_BYTE *)(a3 + 18) & 1;
*(_DWORD *)(dword_1043EF34 + 44) = ((unsigned int)*(_BYTE *)(a3 + 18) >> 1) & 1;
JUMPOUT(*(_DWORD *)(dword_1043EF34 + 44), 0, *(unsigned int *)std__codecvt_base__do_always_noconv);
v5 = sub_101A6CD0(dword_1043EF34);
JUMPOUT(v5, 0, *(unsigned int *)std__codecvt_base__do_always_noconv);
v6 = *(_DWORD *)(v5 + 160);
JUMPOUT(v6, 0, *(unsigned int *)std__codecvt_base__do_always_noconv);
(*(void (__cdecl **)(signed int, unsigned int, signed int, _DWORD, _DWORD))(*(_DWORD *)v6 + 672))(
905,
v6,
1852399981,
0,
0);
return 1;
}
The known offsets inside of the client are currently:
+00 = max stamina
+04 = stamina
+12 = id3
+20 = id1
+24 = id2
+28 = id4
+32 = fight time
Which line up with this packet perfectly. (With some unknown values.)
This packet can be interpreted like this:
Code: Select all
struct packet_115
{
unsigned int header;
unsigned short Stamina;
unsigned short FishID3;
unsigned short Unknown1; // -128
unsigned short FishID1; // *20
unsigned short FishID2;
unsigned short FishID4;
unsigned short FightTime; // *60
unsigned char Unknown2; // &1
unsigned char Unknown3; // Not used (padding)
unsigned int Unknown4; // Not sure
};