Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.


)... but the short run down... ieatacid fixed it all and got it fully in its grand state in 6 hours... took me 3 days... =\ i've been updating offsets and structures for years... i understand what the mq2 code does (for the most part) and STILL couldn't beat the devs over there... they do a AMAZING job and would be well missed if they ever left...I find this topic interesting, don't have time to elaborate right now, I'll type something up tomorrow, was a long day, patch took 12 hours, so if you can do it in 2 mins, I hope to learn from you![]()

i'm a decent programmer... i do understand the basics of c++ and packets.. and structures... and i STILL would never attempt at beating (or even bragging i can beat) the developers at mq2... here are the steps though... very simple according to you....
update the offsets
update the structures
... not hard right? go for it big dog![]()
Mad Props eqmule! btw your donations go through paypal using email [email protected] right?
Btw, I took 3 years of C++ in college about 10 years back and understand the basics of updating MQ2. I've managed to successful get a working MQ2 (mind you it loaded on patch day with some bugs), but it took several hours worth of work for a half way working mq2 on a small patch.
I also tried this again when House of Thule came out (Remember MQ2 being down for more than a week?) and holy shit... I was completely lost. The amount of skill that goes into mq2 is beyond my comprehension. No matter how much schooling you have had, you have to gifted to be able to patch it when a major expansion hits.
To think that you could update mq2 in a couple minutes is insane, in fact, its impossible. Long story short, donate and appreciate the mq2 devs, because if they decide they don't want to do this anymore... we are screwed.
vtable 0
pPrev 4
pNext 8
SpeedMultiplier 18
TimeStamp 30
Lastname 38
Y 64
X 68
SpeedY 70
SpeedX 74
SpeedZ 78
SpeedRun 7c
Heading 80
CameraAngle 90
FeetWet a1
Name a4
Type 125
UnknownHeight 13c
AvatarHeight2 140
Zone 438
Instance 43a
Z 6C
AvatarHeight 138
SpawnID 148
MasterID 1E4
HPMax 254
HPCurrent 1CC
GuildID 1F0
SpeedHeading 8C
Race eb8
Class 0EBC
Level 3A0
Sneak 52C
PvPFlag 21C
StandState 4D8
Light 271
RunSpeed 1C4
Linkdead 1AC
GM 215
LFG 3A8
BodyType 128
Anon 220
DisplayedName 0E4
AARank 2A0
GuildStatus 44C
Deity 444
Holding 418
Title 4D9
Suffix 450
LastTick 4CC
RespawnTimer 18C
UnderWater 94
GetMeleeRangeVar1 504
InnateETA 2D0
FishingETA 1FC
IsABoat 150
Mount 154
Rider 158
WhoFollowing 0E48
PetID 1DC
GroupAssistNPC 0E4C
RaidAssistNPC 0E50
GroupMarkNPC 0E5C
RaidMarkNPC 0E68
TargetOfTarget 0E74
CastingData 470
FishingEvent 264
Trader 1C8
Buyer 440
Mercenary 4D0
pcactorex 1020
InNonPCRaceIllusion 0EAC
Equipment 0F34
FaceStyle 0EB0
Gender 0EBD
FaceRelatedActorStruct 1028
HairStyle 0EB5
HairColor 0EB1
FacialHair 0EB6
FacialHairColor 0EB2
EyeColor1 eb3
EyeColor2 eb4
ArmorColor 0F00
pActorClient 0EA8
Heritage 0F28
Tattoo 0F2C
Details 0F30
ActorDef 0EBE
Animation 10C8
HideCorpse 11D4
WalkSpeed 11D0
InvitedToGroup 1218
GroupMemberTargeted 121C
Fellowship 13A0
CampfireY 1D84
CampfireX 1d88
CampfireZ 1d8c
CampfireZoneID 1d90
InstanceID 1d92
pSpawn 1EC8
Levitate 1ECC
ManaMax 318
ManaCurrent 448
EnduranceMax 42C
EnduranceCurrent 260
AFK 43C
HideMode 190
GetMeleeRangeVar2 1060
CampfireTimestamp 1D94
Campfire 1DA0
vtable2 1EC0
// actual size is 0x1F18 in Sep 13 2013 version of eqgame.exe (59A998)- eqmule
typedef struct _SPAWNINFO {
/*0x0000*/ void* vtable;
/*0x0004*/ struct _SPAWNINFO* pPrev;
/*0x0008*/ struct _SPAWNINFO* pNext;
/*0x000c*/ BYTE Unknown0x000c[0xc];
/*0x0018*/ FLOAT SpeedMultiplier;
/*0x001c*/ BYTE Unknown0x001c[0x14];
/*0x0030*/ DWORD TimeStamp;
/*0x0034*/ BYTE Unknown0x0034[0x4];
/*0x0038*/ CHAR Lastname[0x20];
/*0x0058*/ BYTE Unknown0x0058[0xc];
/*0x0064*/ FLOAT Y;
/*0x0068*/ FLOAT X;
/*0x006c*/ FLOAT Z;
/*0x0070*/ FLOAT SpeedY;
/*0x0074*/ FLOAT SpeedX;
/*0x0078*/ FLOAT SpeedZ;
/*0x007c*/ FLOAT SpeedRun;
/*0x0080*/ FLOAT Heading;
/*0x0084*/ BYTE Unknown0x0084[0x8];
/*0x008c*/ FLOAT SpeedHeading;
/*0x0090*/ FLOAT CameraAngle;
/*0x0094*/ BYTE UnderWater;
/*0x0095*/ BYTE Unknown0x0095[0xc];
/*0x00a1*/ BYTE FeetWet;
/*0x00a2*/ BYTE Unknown0x00a2[0x2];
/*0x00a4*/ CHAR Name[0x40]; // ie priest_of_discord00
/*0x00e4*/ CHAR DisplayedName[0x40]; // ie Priest of Discord
/*0x0124*/ BYTE Unknown0x0124;
/*0x0125*/ BYTE Type;
/*0x0126*/ BYTE Unknown0x0126[0x2];
/*0x0128*/ DWORD** BodyType;
/*0x012c*/ BYTE Unknown0x012c[0xc];
/*0x0138*/ FLOAT AvatarHeight; // height of avatar from groundwhen standing
/*0x013c*/ FLOAT UnknownHeight;
/*0x0140*/ FLOAT AvatarHeight2; // height of avatar from groundwhen crouched/sitting
/*0x0144*/ BYTE Unknown0x0144[0x4];
/*0x0148*/ DWORD SpawnID;
/*0x014c*/ BYTE Unknown0x014c[0x4];
/*0x0150*/ DWORD IsABoat; // 1 = a type of boat
/*0x0154*/ struct _SPAWNINFO* Mount; // NULL if no mount present
/*0x0158*/ struct _SPAWNINFO* Rider; // _SPAWNINFO of mount's rider
/*0x015c*/ BYTE Unknown0x015c[0x30];
/*0x018c*/ DWORD RespawnTimer; // TimeStamp of when RespawnWnd will close - 0 when you're alive
/*0x0190*/ BYTE HideMode;
/*0x0191*/ BYTE Unknown0x0191[0x1b];
/*0x01ac*/ BYTE Linkdead;
/*0x01ad*/ BYTE Unknown0x01ad[0x17];
/*0x01c4*/ FLOAT RunSpeed;//0.70 on runspeed 5...
/*0x01c8*/ DWORD Trader;//found in CEverQuest__RightClickedOnPlayer_x
/*0x01cc*/ LONG HPCurrent;
/*0x01d0*/ BYTE Unknown0x01d0[0xc];
/*0x01dc*/ DWORD PetID;
/*0x01e0*/ BYTE Unknown0x01e0[0x4];
/*0x01e4*/ DWORD MasterID;
/*0x01e8*/ BYTE Unknown0x01e8[0x8];
/*0x01f0*/ DWORD GuildID;
/*0x01f4*/ BYTE Unknown0x01f4[0x8];
/*0x01fc*/ DWORD FishingETA;
/*0x0200*/ BYTE Unknown0x0200[0x15];
/*0x0215*/ BYTE GM;
/*0x0216*/ BYTE Unknown0x0216[0x6];
/*0x021c*/ BYTE PvPFlag;
/*0x021d*/ BYTE Unknown0x021d[0x3];
/*0x0220*/ DWORD Anon;//found in EQPlayer__SetNameSpriteTint_x
/*0x0224*/ BYTE Unknown0x0224[0x30];
/*0x0254*/ DWORD HPMax;
/*0x0258*/ BYTE Unknown0x0258[0x8];
/*0x0260*/ DWORD EnduranceCurrent;
/*0x0264*/ BYTE FishingEvent;
/*0x0265*/ BYTE Unknown0x0265[0xc];
/*0x0271*/ BYTE Light;
/*0x0272*/ BYTE Unknown0x0272[0x2e];
/*0x02a0*/ DWORD AARank;
/*0x02a4*/ BYTE Unknown0x02a4[0x2c];
/*0x02d0*/ DWORD InnateETA; //Calculated TimeStamp when innate skill will be ready (LoH, HT, Bash)
/*0x02d4*/ BYTE Unknown0x02d4[0x44];
/*0x0318*/ DWORD ManaMax;
/*0x031c*/ BYTE Unknown0x031c[0x84];
/*0x03a0*/ BYTE Level;
/*0x03a1*/ BYTE Unknown0x03a1[0x7];
/*0x03a8*/ BYTE LFG;
/*0x03a9*/ BYTE Unknown0x03a9[0x6f];
/*0x0418*/ BYTE Holding;
/*0x0419*/ BYTE Unknown0x0419[0x13];
/*0x042c*/ DWORD EnduranceMax;
/*0x0430*/ BYTE Unknown0x0430[0x8];
/*0x0438*/ WORD Zone;
/*0x043a*/ WORD Instance;
/*0x043c*/ DWORD AFK;
/*0x0440*/ DWORD Buyer;
/*0x0444*/ DWORD Deity;
/*0x0448*/ DWORD ManaCurrent;
/*0x044c*/ DWORD GuildStatus;
/*0x0450*/ CHAR Suffix[0x20];
/*0x0470*/ struct _LAUNCHSPELLDATA CastingData; // size: 0x50
/*0x04c0*/ BYTE Unknown0x04c0[0xc];
/*0x04cc*/ DWORD LastTick;
/*0x04d0*/ BYTE Mercenary;
/*0x04d1*/ BYTE Unknown0x04d1[0x7];
/*0x04d8*/ BYTE StandState;
/*0x04d9*/ CHAR Title[0x20];
/*0x04f9*/ BYTE Unknown0x04f9[0xb];
/*0x0504*/ FLOAT GetMeleeRangeVar1; // used by GetMeleeRange
/*0x0508*/ BYTE Unknown0x0508[0x24];
/*0x052c*/ BYTE Sneak;
/*0x052d*/ BYTE Unknown0x052d[0x91b];
/*0x0e48*/ struct _SPAWNINFO* WhoFollowing; // NULL if autofollow off
/*0x0e4c*/ int GroupAssistNPC[0x1];
/*0x0e50*/ int RaidAssistNPC[0x3];
/*0x0e5c*/ int GroupMarkNPC[0x3];
/*0x0e68*/ int RaidMarkNPC[0x3];
/*0x0e74*/ int TargetOfTarget;
/*0x0e78*/ BYTE Unknown0x0e78[0x30];
/*0x0ea8*/ void* pActorClient; // start of ActorClient struct
/*0x0eac*/ BYTE InNonPCRaceIllusion;
/*0x0ead*/ BYTE Unknown0x0ead[0x3];
/*0x0eb0*/ BYTE FaceStyle;
/*0x0eb1*/ BYTE HairColor;
/*0x0eb2*/ BYTE FacialHairColor;
/*0x0eb3*/ BYTE EyeColor1;
/*0x0eb4*/ BYTE EyeColor2;
/*0x0eb5*/ BYTE HairStyle;
/*0x0eb6*/ BYTE FacialHair;
/*0x0eb7*/ BYTE Unknown0x0eb7;
/*0x0eb8*/ DWORD Race;
/*0x0ebc*/ BYTE Class;
/*0x0ebd*/ BYTE Gender;
/*0x0ebe*/ CHAR ActorDef[0x40];
/*0x0efe*/ BYTE Unknown0x0efe[0x2];
/*0x0f00*/ ARGBCOLOR ArmorColor[0x9];
/*0x0f24*/ BYTE Unknown0x0f24[0x4];
/*0x0f28*/ DWORD Heritage; //drakkin only face setting
/*0x0f2c*/ DWORD Tattoo; //drakkin only face setting
/*0x0f30*/ DWORD Details; //drakkin only face setting
/*0x0f34*/ struct _EQUIPMENT Equipment; // size 0xb4
/*0x0fe8*/ BYTE Unknown0x0fe8[0x38];
/*0x1020*/ VOID* pcactorex; // ActorInterface*
/*0x1024*/ BYTE Unknown0x1024[0x4];
/*0x1028*/ VOID* FaceRelatedActorStruct;
/*0x102c*/ BYTE Unknown0x102c[0x34];
/*0x1060*/ FLOAT GetMeleeRangeVar2; // used by GetMeleeRange
/*0x1064*/ BYTE Unknown0x1064[0x64];
/*0x10c8*/ DWORD Animation;
/*0x10cc*/ BYTE Unknown0x10cc[0x104];
/*0x11d0*/ FLOAT WalkSpeed;
/*0x11d4*/ DWORD HideCorpse;
/*0x11d8*/ BYTE Unknown0x11d8[0x40];
/*0x1218*/ BYTE InvitedToGroup;
/*0x1219*/ BYTE Unknown0x1219[0x3];
/*0x121c*/ DWORD GroupMemberTargeted; // 0xFFFFFFFF if no target, else 1 through 5
/*0x1220*/ BYTE Unknown0x1220[0x180];
/*0x13a0*/ struct _FELLOWSHIPINFO Fellowship; // size 0x9e4
/*0x1d84*/ FLOAT CampfireY;
/*0x1d88*/ FLOAT CampfireX;
/*0x1d8c*/ FLOAT CampfireZ;
/*0x1d90*/ WORD CampfireZoneID; // zone ID where campfire is
/*0x1d92*/ WORD InstanceID;
/*0x1d94*/ DWORD CampfireTimestamp; // CampfireTimestamp-FastTime()=time left on campfire
/*0x1d98*/ BYTE Unknown0x1d98[0x8];
/*0x1da0*/ DWORD Campfire; // do we have a campfire up?
/*0x1da4*/ BYTE Unknown0x1da4[0x11c];
/*0x1ec0*/ void* vtable2;
/*0x1ec4*/ BYTE Unknown0x1ec4[0x4];
/*0x1ec8*/ struct _SPAWNINFO* pSpawn;
/*0x1ecc*/ DWORD Levitate;
/*0x1ec8*/ BYTE Unknown0x1ec8[0x50];
/*0x1f18*/
} SPAWNINFO, *PSPAWNINFO;

what i will do is try to do this fully manually once to make sure i understand all of what is involved and get back to you if i make any interesting progress.
You could be a professional programmer and work 16 hour days for 365 days a year for 40 years and never develop the skills required to fully understand MQ2. Why? Because the hard work in MQ2 is reverse engineering. The vast majority of programmers don't have the first idea what goes into this, because the industry does not value this. I believe that you are a programmer, and possibly even good (I have no way of knowing this, but it's entirely probable). However, how often at your job do you have to use IDA, look at assembly, or even just simply have to find offsets while no one has told you anything about how they programmed something? What professional programmers see as "reverse engineering" is simply being given a piece of code from someone else and trying to figure out what it does without comments. Now try to get an executable from a company that specifically uses processes to obfuscate through the compiler, disassemble it, and try to figure out what's going on in the entire program. It's not easy, and not very automatable. eqmule... I wish I had your skills in RE, I've only really done packet reversing and a little of IDA/ReClass work. I'm still looking for those telltale functions in the executable that will help me fill out those UI structs....

You don't need to do any of that, just reading eqmule's post shows it. You surely need to do that to DEV mq2 to begin with, eons ago, but that work is done, you just need to figure out what changes & map to it accordingly.
& the Professional programmer part wasn't about that, it was just about all the "you can't because i kinda know some C++ & i can't". Honestly even redoing MQ2 wouldn't be that hard, but that would take a loooooong while![]()

btw rk1 i wasn't trying to put you down or say it can't be done... (well the 2 min part absolutly can't... but that asside) i'm just trying to give you a fair warning on how much work eqmule, ieatacid, dkaa, and the other devs at mq2 have put into every patch...
your best bet after doing everything on that post and updating your own patch is to go to their site and check out their forums.... including the vip forums... i have monitored those since i started using mq2 and thats how i learned so much... gl to ya and hope you can help them with all their work...
)
