Merge pull request #5066 from dannuic/tob_loginpatches

TOB packet work through zone in
This commit is contained in:
Alex
2026-04-15 22:03:39 -07:00
committed by GitHub
5 changed files with 837 additions and 751 deletions
+102 -67
View File
@@ -856,82 +856,70 @@ namespace TOB
SETUP_VAR_ENCODE(LogServer_Struct); SETUP_VAR_ENCODE(LogServer_Struct);
ALLOC_LEN_ENCODE(1932); ALLOC_LEN_ENCODE(1932);
//pvp // pvp
if (emu->enable_pvp) { if (emu->enable_pvp) {
*(char*)&__packet->pBuffer[0x04] = 1; *(char*)&__packet->pBuffer[0x04] = 1;
} }
if (emu->enable_FV) { if (emu->enable_FV) {
//FV sets these both to 1 *(char*)&__packet->pBuffer[0x08] = 1; // RP server
//one appears to enable the no drop flag the other just marks the server as special? *(char*)&__packet->pBuffer[0x0a] = 1; // free loot server
*(char*)&__packet->pBuffer[0x08] = 1;
*(char*)&__packet->pBuffer[0x0a] = 1;
} }
//This has something to do with heirloom and prestige items but im not sure what it does // this lets you transfer no drop items in the shared bank
//Seems to sit at 0
*(char*)&__packet->pBuffer[0x75d] = 0; *(char*)&__packet->pBuffer[0x75d] = 0;
//not sure what this does, something to do with server select // disable tutorial at character create/select
*(char*)&__packet->pBuffer[0x09] = 0; *(char*)&__packet->pBuffer[0x09] = 0;
//this appears to have some effect on the tradeskill system; disabling made by tags perhaps? // this is the auto-identify flag
*(char*)&__packet->pBuffer[0x0b] = 0; *(char*)&__packet->pBuffer[0x0b] = 0;
//not sure, setting it to the value ive seen // not actually used in the client, has to do with name gen
*(char*)&__packet->pBuffer[0x0c] = 1; *(char*)&__packet->pBuffer[0x0c] = 1;
//Something to do with languages // unknown languages are gibberish
*(char*)&__packet->pBuffer[0x0d] = 1; *(char*)&__packet->pBuffer[0x0d] = 1;
//These seem to affect if server has betabuff enabled // is_dev_server flags
*(char*)&__packet->pBuffer[0x600] = 0; *(char*)&__packet->pBuffer[0x600] = 0; // is beta server
*(char*)&__packet->pBuffer[0x601] = 0; *(char*)&__packet->pBuffer[0x601] = 0; // override allow beta buff (for any server)
//This is set on test so it's probably indicating this is a test server *(char*)&__packet->pBuffer[0x602] = 0; // is test server (name reservations are unavailable)
*(char*)&__packet->pBuffer[0x602] = 0; *(char*)&__packet->pBuffer[0x603] = 0; // unused in the client
//not sure, but it's grouped with the beta and test stuff
*(char*)&__packet->pBuffer[0x603] = 0;
//world short name //world short name
strncpy((char*)&__packet->pBuffer[0x15], emu->worldshortname, 32); strncpy((char*)&__packet->pBuffer[0x15], emu->worldshortname, 32);
//not sure, affects some player calculation but didn't care to look more // static base HP/MP regen
*(char*)&__packet->pBuffer[0x5ec] = 0; *(char*)&__packet->pBuffer[0x5ec] = 0;
//Looks right // use mail system
if (emu->enablemail) { if (emu->enablemail) {
*(char*)&__packet->pBuffer[0x5f5] = 1; *(char*)&__packet->pBuffer[0x5f5] = 1;
} }
//Looks right // use voice macros
if (emu->enablevoicemacros) { if (emu->enablevoicemacros) {
*(char*)&__packet->pBuffer[0x5f4] = 1; *(char*)&__packet->pBuffer[0x5f4] = 1;
} }
//Not sure, sending what we've seen // Disable character select buttons except create character
*(char*)&__packet->pBuffer[0x5f6] = 0; *(char*)&__packet->pBuffer[0x5f6] = 0;
//Not sure sending what we've seen // enable tutorial at character create/select
*(char*)&__packet->pBuffer[0x5f8] = 1; *(char*)&__packet->pBuffer[0x5f8] = 1;
//Not sure sending what we've seen // client defaults, unused
*(int32_t*)&__packet->pBuffer[0x63c] = -1; *(int32_t*)&__packet->pBuffer[0x63c] = -1;
//Test sets this to 1, everyone else seems to set it to 0
*(int32_t*)&__packet->pBuffer[0x640] = 0; *(int32_t*)&__packet->pBuffer[0x640] = 0;
//Disassembly puts it next to code dealing with commands, ive not seen anyone send anything but 0
*(char*)&__packet->pBuffer[0x745] = 0; *(char*)&__packet->pBuffer[0x745] = 0;
//Something about item restrictions, seems to always be set to 1
*(char*)&__packet->pBuffer[0x750] = 1; *(char*)&__packet->pBuffer[0x750] = 1;
//This and 0x724 are often multiplied together in guild favor calcs, live and test send 1.0f // these are always multiplied together in guild favor calcs for display, live and test send 1.0f
*(float*)&__packet->pBuffer[0x760] = 1.0f; *(float*)&__packet->pBuffer[0x760] = 1.0f;
*(float*)&__packet->pBuffer[0x764] = 1.0f; *(float*)&__packet->pBuffer[0x764] = 1.0f;
//This and 0x72c are often multiplied together in non-guild favor calcs, live and test send 1.0f // these are always multiplied together in non-guild favor calcs for display, live and test send 1.0f
*(float*)&__packet->pBuffer[0x768] = 1.0f; *(float*)&__packet->pBuffer[0x768] = 1.0f;
*(float*)&__packet->pBuffer[0x76c] = 1.0f; *(float*)&__packet->pBuffer[0x76c] = 1.0f;
@@ -2599,16 +2587,16 @@ namespace TOB
eq_cse->Face = emu_cse->Face; eq_cse->Face = emu_cse->Face;
for (int equip_index = 0; equip_index < EQ::textures::materialCount; equip_index++) { for (int equip_index = 0; equip_index < EQ::textures::materialCount; equip_index++) {
eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; // type
eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; // variation
eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; // material
eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HerosForgeModel; eq_cse->Equip[equip_index].HeroForgeModel = emu_cse->Equip[equip_index].HerosForgeModel; // new armor id
eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Unknown2; eq_cse->Equip[equip_index].Material2 = emu_cse->Equip[equip_index].Unknown2; // new armor type
eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color; eq_cse->Equip[equip_index].Color = emu_cse->Equip[equip_index].Color; // tint
} }
eq_cse->Unknown1 = 255; eq_cse->TextureType = 255;
eq_cse->Unknown2 = 0; eq_cse->HeadType = 0;
eq_cse->DrakkinTattoo = emu_cse->DrakkinTattoo; eq_cse->DrakkinTattoo = emu_cse->DrakkinTattoo;
eq_cse->DrakkinDetails = emu_cse->DrakkinDetails; eq_cse->DrakkinDetails = emu_cse->DrakkinDetails;
eq_cse->Deity = emu_cse->Deity; eq_cse->Deity = emu_cse->Deity;
@@ -2620,18 +2608,16 @@ namespace TOB
eq_cse->EyeColor2 = emu_cse->EyeColor2; eq_cse->EyeColor2 = emu_cse->EyeColor2;
eq_cse->HairStyle = emu_cse->HairStyle; eq_cse->HairStyle = emu_cse->HairStyle;
eq_cse->Beard = emu_cse->Beard; eq_cse->Beard = emu_cse->Beard;
eq_cse->GoHome = emu_cse->GoHome; eq_cse->PreFTP = 1;
eq_cse->Tutorial = emu_cse->Tutorial; eq_cse->Tutorial = emu_cse->Tutorial;
eq_cse->DrakkinHeritage = emu_cse->DrakkinHeritage; eq_cse->DrakkinHeritage = emu_cse->DrakkinHeritage;
eq_cse->Enabled = emu_cse->Enabled; eq_cse->GoHome = emu_cse->GoHome;
eq_cse->LastLogin = emu_cse->LastLogin; eq_cse->LastLogin = emu_cse->LastLogin;
eq_cse->Unknown3 = 0; eq_cse->TooHighLevel = 0;
eq_cse->Unknown4 = 0; eq_cse->Usable = emu_cse->Enabled; // this doesn't seem to do anything
eq_cse->Unknown5 = 0; eq_cse->Shrouded = 0;
eq_cse->Unknown6 = 0; eq_cse->Unknown = 0;
eq_cse->Unknown7 = 0;
eq_cse->CharacterId = 0; eq_cse->CharacterId = 0;
eq_cse->Unknown8 = 1;
emu_ptr += sizeof(CharacterSelectEntry_Struct); emu_ptr += sizeof(CharacterSelectEntry_Struct);
eq_ptr += sizeof(structs::CharacterSelectEntry_Struct); eq_ptr += sizeof(structs::CharacterSelectEntry_Struct);
@@ -2646,21 +2632,23 @@ namespace TOB
ENCODE_LENGTH_EXACT(MaxCharacters_Struct); ENCODE_LENGTH_EXACT(MaxCharacters_Struct);
SETUP_DIRECT_ENCODE(MaxCharacters_Struct, structs::MaxCharacters_Struct); SETUP_DIRECT_ENCODE(MaxCharacters_Struct, structs::MaxCharacters_Struct);
//OUT(max_chars); *eq = {0};
eq->max_chars = 8; //needs to be fixed eq->total_character_slots = 8;
eq->marketplace_chars = 0; eq->marketplace_character_slots = 0;
eq->unknown008 = -1; eq->unknown008 = -1;
eq->unknown00c = 196608; eq->head_start_button = 0;
eq->unknown010 = 0; eq->heroic_related = 0x0003;
eq->unknown014 = 0; eq->heroic_50_count = 0;
eq->unknown018 = 0; eq->heroic_100_count = 0;
eq->unknown01c = 0; eq->disable_character_creation = 0; // this works, but it soft-locks the UI for some reason, needs to be fixed
eq->unknown020 = -1; eq->monthly_claim = -1;
eq->unknown024 = 0; eq->marketplace_related = 0;
eq->unknown028 = 0; eq->add_marketplace_chars = 0;
eq->unknown02c = 0; eq->add_unknown = 0;
eq->unknown030 = 0; eq->legacy_characters_ruleset = 0;
eq->unknown034 = 0; eq->num_max_characters = 0;
eq->num_personas_available = 10;
eq->has_de_ranger = 1; // this is probably an expansion flag only
FINISH_ENCODE(); FINISH_ENCODE();
} }
@@ -3029,13 +3017,13 @@ namespace TOB
ENCODE_LENGTH_EXACT(ZoneChange_Struct); ENCODE_LENGTH_EXACT(ZoneChange_Struct);
SETUP_DIRECT_ENCODE(ZoneChange_Struct, structs::ZoneChange_Struct); SETUP_DIRECT_ENCODE(ZoneChange_Struct, structs::ZoneChange_Struct);
memcpy(eq->char_name, emu->char_name, sizeof(emu->char_name)); OUT_str(char_name);
OUT(zoneID); OUT(zoneID);
OUT(instanceID); OUT(instanceID);
OUT(y); OUT(y);
OUT(x); OUT(x);
OUT(z) OUT(z);
OUT(zone_reason); OUT(zone_reason);
OUT(success); OUT(success);
if (eq->success < 0) if (eq->success < 0)
@@ -3544,6 +3532,20 @@ namespace TOB
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ApproveName)
{
DECODE_LENGTH_EXACT(structs::NameApproval_Struct);
SETUP_DIRECT_DECODE(NameApproval_Struct, structs::NameApproval_Struct);
IN_str(name);
IN(race_id);
IN(class_id);
// TODO: expand the approval logic to include the rest of the TOB struct values (and remove the direct translation here)
FINISH_DIRECT_DECODE();
}
DECODE(OP_AugmentInfo) DECODE(OP_AugmentInfo)
{ {
DECODE_LENGTH_EXACT(structs::AugmentInfo_Struct); DECODE_LENGTH_EXACT(structs::AugmentInfo_Struct);
@@ -3642,6 +3644,39 @@ namespace TOB
delete[] __eq_buffer; delete[] __eq_buffer;
} }
DECODE(OP_CharacterCreate) {
DECODE_LENGTH_EXACT(structs::CharCreate_Struct);
SETUP_DIRECT_DECODE(CharCreate_Struct, structs::CharCreate_Struct);
IN(gender);
IN(race);
IN(class_);
IN(deity);
IN(start_zone);
IN(haircolor);
IN(beard);
IN(beardcolor);
IN(hairstyle);
IN(face);
IN(eyecolor1);
IN(eyecolor2);
IN(drakkin_heritage);
IN(drakkin_tattoo);
IN(drakkin_details);
IN(STR);
IN(STA);
IN(AGI);
IN(DEX);
IN(WIS);
IN(INT);
IN(CHA);
IN(tutorial);
// TODO: can handle the heroic type here as well (new member)
FINISH_DIRECT_DECODE();
}
DECODE(OP_ClickDoor) DECODE(OP_ClickDoor)
{ {
DECODE_LENGTH_EXACT(structs::ClickDoor_Struct); DECODE_LENGTH_EXACT(structs::ClickDoor_Struct);
@@ -3868,7 +3903,7 @@ namespace TOB
DECODE_LENGTH_EXACT(structs::ClientZoneEntry_Struct); DECODE_LENGTH_EXACT(structs::ClientZoneEntry_Struct);
SETUP_DIRECT_DECODE(ClientZoneEntry_Struct, structs::ClientZoneEntry_Struct); SETUP_DIRECT_DECODE(ClientZoneEntry_Struct, structs::ClientZoneEntry_Struct);
memcpy(emu->char_name, eq->char_name, sizeof(emu->char_name)); IN_str(char_name);
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
+2
View File
@@ -66,11 +66,13 @@ E(OP_ZoneSpawns)
//list of packets we need to decode on the way in: //list of packets we need to decode on the way in:
D(OP_Animation) D(OP_Animation)
D(OP_ApplyPoison) D(OP_ApplyPoison)
D(OP_ApproveName)
D(OP_AugmentInfo) D(OP_AugmentInfo)
D(OP_AugmentItem) D(OP_AugmentItem)
D(OP_BlockedBuffs) D(OP_BlockedBuffs)
D(OP_CastSpell) D(OP_CastSpell)
D(OP_ChannelMessage) D(OP_ChannelMessage)
D(OP_CharacterCreate)
D(OP_ClientUpdate) D(OP_ClientUpdate)
D(OP_ClickDoor) D(OP_ClickDoor)
D(OP_Consider) D(OP_Consider)
+93 -44
View File
@@ -75,21 +75,28 @@ namespace TOB {
}; };
struct MaxCharacters_Struct { struct MaxCharacters_Struct {
/*000*/ uint32 max_chars; /*000*/ uint32 total_character_slots; // total character slots, different than max characters
/*004*/ uint32 marketplace_chars; /*004*/ uint32 marketplace_character_slots;
/*008*/ int32 unknown008; //some of these probably deal with heroic characters or something /*008*/ uint32 unknown008; // definitely 4 bytes, read in client, value for CEverQuest::Unknown0x0608
/*00c*/ int32 unknown00c; /*00c*/ uint8 head_start_button;
/*010*/ int32 unknown010; /*00d*/ uint8 unused00d;
/*014*/ int32 unknown014; /*00e*/ uint16 heroic_related;
/*018*/ int32 unknown018; /*010*/ int64 heroic_50_count; // read as 64 bits in the client
/*01c*/ int32 unknown01c; /*018*/ int32 heroic_100_count;
/*020*/ int32 unknown020; /*01c*/ uint8 disable_character_creation;
/*024*/ int32 unknown024; /*01d*/ uint8 unused01d[3];
/*028*/ int32 unknown028; /*020*/ int32 monthly_claim; // (-1 for don't set)
/*02c*/ int32 unknown02c; /*024*/ uint8 marketplace_related; // marketplace related boolean (int32 for convenience here, it's 4 bytes)
/*030*/ int32 unknown030; /*025*/ uint8 unused025[3];
/*034*/ int32 unknown034; /*028*/ int32 unused028;
/*038*/ /*02c*/ uint8 add_marketplace_chars; // boolean on whether to add or set marketplace characters
/*02d*/ uint8 add_unknown; // boolean on whether to add unknown008 or set marketplace characters to some unknown global
/*02e*/ uint8 legacy_characters_ruleset;
/*02f*/ uint8 unused02f;
/*030*/ int32 num_max_characters; // used for legacy exp calculation
/*034*/ int32 num_personas_available;
/*038*/ int32 has_de_ranger;
/*03c*/
}; };
struct ExpansionInfo_Struct { struct ExpansionInfo_Struct {
@@ -98,16 +105,16 @@ namespace TOB {
}; };
/* /*
* Visible equiptment. * Visible equipment.
* Size: 20 Octets * Size: 20 Octets
*/ */
struct Texture_Struct struct Texture_Struct
{ {
uint32 Material; uint32 Material; // type
uint32 Unknown1; uint32 Unknown1; // material
uint32 EliteMaterial; uint32 EliteMaterial; // variation
uint32 HeroForgeModel; uint32 HeroForgeModel; // new armor ID
uint32 Material2; // Same as material? uint32 Material2; // new armor type
}; };
/* /*
@@ -145,10 +152,10 @@ namespace TOB {
uint8 Gender; uint8 Gender;
uint8 Face; uint8 Face;
CharSelectEquip Equip[9]; CharSelectEquip Equip[9];
uint8 Unknown1; //Seen 256 uint8 TextureType; //Seen 256
uint8 Unknown2; //Seen 0 uint8 HeadType; //Seen 0
uint32 DrakkinTattoo; uint32 DrakkinTattoo; // tattoo index
uint32 DrakkinDetails; uint32 DrakkinDetails; // face attachment index
uint32 Deity; uint32 Deity;
uint32 PrimaryIDFile; uint32 PrimaryIDFile;
uint32 SecondaryIDFile; uint32 SecondaryIDFile;
@@ -158,18 +165,16 @@ namespace TOB {
uint8 EyeColor2; uint8 EyeColor2;
uint8 HairStyle; uint8 HairStyle;
uint8 Beard; uint8 Beard;
uint8 Enabled;
uint8 Tutorial;
uint32 DrakkinHeritage;
uint8 Unknown3;
uint8 GoHome; uint8 GoHome;
uint8 Tutorial;
uint32 DrakkinHeritage; // parent ID
uint8 TooHighLevel;
uint8 PreFTP;
uint32 LastLogin; uint32 LastLogin;
uint8 Unknown4; // Seen 0 uint8 Usable;
uint8 Unknown5; // Seen 0 uint16 Shrouded;
uint8 Unknown6; // Seen 0 uint8 Unknown;
uint8 Unknown7; // Seen 0 uint64 CharacterId; // A Guess, Character I made a little bit after has a number a few hundred after the first
uint32 CharacterId; //A Guess, Character I made a little bit after has a number a few hundred after the first
uint32 Unknown8; // Seen 1
}; };
/* /*
@@ -181,6 +186,50 @@ namespace TOB {
/*000*/ uint32 CharCount; //number of chars in this packet /*000*/ uint32 CharCount; //number of chars in this packet
}; };
/*
** Character Creation struct
** Length: 168 Bytes
** OpCode: 0x1859
*/
struct CharCreate_Struct
{
/*00*/ uint8 padding[72];
/*48*/ uint32 gender;
/*4c*/ uint32 race;
/*50*/ uint32 class_;
/*54*/ uint32 deity;
/*58*/ uint32 start_zone; // this is the zone ID of the start zone
/*5c*/ uint32 haircolor;
/*60*/ uint32 beard;
/*64*/ uint32 beardcolor;
/*68*/ uint32 hairstyle;
/*6c*/ uint32 face;
/*70*/ uint32 eyecolor1;
/*74*/ uint32 eyecolor2;
/*78*/ uint32 drakkin_heritage;
/*7c*/ uint32 drakkin_tattoo;
/*80*/ uint32 drakkin_details;
/*84*/ uint32 STR;
/*88*/ uint32 STA;
/*8c*/ uint32 AGI;
/*90*/ uint32 DEX;
/*94*/ uint32 WIS;
/*98*/ uint32 INT;
/*9c*/ uint32 CHA;
/*a0*/ uint32 tutorial;
/*a4*/ uint32 heroic_type;
/*a8*/
};
struct NameApproval_Struct {
char name[64];
uint32 race_id;
uint32 class_id;
uint32 deity_id;
uint32 heroic_type; // seen 0, client can also send 1-4
uint32 unknown; // always 0?
};
enum TOBAppearance : uint32 enum TOBAppearance : uint32
{ {
None, None,
@@ -285,21 +334,21 @@ namespace TOB {
struct { struct {
signed deltaHeading : 10; signed deltaHeading : 10;
signed animation : 10; signed animation : 10;
// unsigned pad1 : 12; unsigned pad1 : 12;
signed deltaX : 13; signed deltaX : 13;
signed z : 19; signed z : 19;
signed y : 19; signed y : 19;
unsigned heading : 12; unsigned heading : 12;
// unsigned pad2 : 1; unsigned pad2 : 1;
signed x : 19; signed x : 19;
signed deltaZ : 13; signed deltaZ : 13;
unsigned pitch : 12; unsigned pitch : 12;
signed deltaY : 13; signed deltaY : 13;
// unsigned pad3 : 7; unsigned pad3 : 7;
}; };
uint32_t raw[5]; uint32_t raw[5];
}; };
@@ -311,15 +360,15 @@ namespace TOB {
/*0x04*/ float delta_y; /*0x04*/ float delta_y;
/*0x08*/ float x; /*0x08*/ float x;
/*0x0c*/ int animation : 10; /*0x0c*/ int animation : 10;
// signed padding1 : 22; signed padding1 : 22;
/*0x10*/ float delta_x; /*0x10*/ float delta_x;
/*0x14*/ float z; /*0x14*/ float z;
/*0x18*/ float delta_z; /*0x18*/ float delta_z;
/*0x1c*/ int heading : 12; /*0x1c*/ int heading : 12;
int pitch : 12; int pitch : 12;
// signed padding2 : 8; signed padding2 : 8;
/*0x20*/ int delta_heading : 10; /*0x20*/ int delta_heading : 10;
// signed padding3 : 22; signed padding3 : 22;
/*0x24*/ /*0x24*/
}; };
@@ -399,8 +448,8 @@ namespace TOB {
struct EnterWorld_Struct { struct EnterWorld_Struct {
/*000*/ char name[64]; /*000*/ char name[64];
/*064*/ int32 unknown1; /*064*/ int32 unknown1; // this appears to always be 0
/*068*/ int32 unknown2; //tob handles these differently so for now im just going to ignore them till i figure it out /*068*/ int32 zoneID; // this is -1 for "last zone"
}; };
struct ZoneChange_Struct { struct ZoneChange_Struct {
@@ -427,7 +476,7 @@ namespace TOB {
/*016*/ float z; /*016*/ float z;
/*020*/ float heading; /*020*/ float heading;
/*024*/ uint32 type; //unknown... values /*024*/ uint32 type; //unknown... values
/*032*/ uint8 unknown032[144]; /*032*/ uint8 unknown032[144]; // this is mostly a string passed to the teleport function (follow starting at 0x1401F71BA), it appears to be an override for a message
/*172*/ uint32 unknown172; /*172*/ uint32 unknown172;
/*176*/ /*176*/
}; };
+628 -628
View File
File diff suppressed because it is too large Load Diff
+12 -12
View File
@@ -14,18 +14,18 @@ OP_ExploreUnknown=0x0000 # used for unknown explorer
# world packets # world packets
# Required to reach Char Select: # Required to reach Char Select:
OP_SendLoginInfo=0x722A OP_SendLoginInfo=0x722a
OP_ApproveWorld=0x0000 OP_ApproveWorld=0x0000
OP_LogServer=0x2cae OP_LogServer=0x2cae
OP_SendCharInfo=0x5d1a OP_SendCharInfo=0x5d1a
OP_ExpansionInfo=0x393a OP_ExpansionInfo=0x393a
OP_EnterWorld=0x7fb8 OP_EnterWorld=0x7fb8
OP_PostEnterWorld=0x1945 OP_PostEnterWorld=0x1945 # unused
OP_World_Client_CRC1=0x777f OP_World_Client_CRC1=0x777f # This is OP_SendExeChecksum
OP_World_Client_CRC2=0x492 OP_World_Client_CRC2=0x0492 # This is OP_SendBaseDataChecksum
OP_World_Client_CRC3=0x690 OP_World_Client_CRC3=0x0690 # This is OP_SendSkillCapsChecksum
OP_SendSpellChecksum=0x0000 OP_SendSpellChecksum=0x0000 # There is no spell checksum in TOB
OP_SendSkillCapsChecksum=0x0000 OP_SendSkillCapsChecksum=0x0690
# Character Select Related: # Character Select Related:
OP_SendMaxCharacters=0x25eb OP_SendMaxCharacters=0x25eb
@@ -34,15 +34,15 @@ OP_SendMembershipDetails=0x2373
OP_CharacterCreateRequest=0x6b67 OP_CharacterCreateRequest=0x6b67
OP_CharacterCreate=0x1859 OP_CharacterCreate=0x1859
OP_DeleteCharacter=0x71ca OP_DeleteCharacter=0x71ca
OP_RandomNameGenerator=0x7f4a OP_RandomNameGenerator=0x7f4a # TOB client no longer sends this, and the S->C packet isn't used by emu
OP_ApproveName=0x5306 OP_ApproveName=0x5306
OP_MOTD=0x1eef OP_MOTD=0x1eef
OP_SetChatServer=0x0000 OP_SetChatServer=0x0000
OP_SetChatServer2=0x34c1 OP_SetChatServer2=0x34c1
OP_ZoneServerInfo=0x2323 OP_ZoneServerInfo=0x2323
OP_WorldComplete=0x1223 OP_WorldComplete=0x1223
OP_WorldUnknown001=0x7723 OP_WorldUnknown001=0x7723 # SetServerTime, S->C
OP_FloatListThing=0x504f OP_FloatListThing=0x504f # Movement History, C->S
# Reasons for Disconnect: # Reasons for Disconnect:
OP_ZoneUnavail=0x29a6 OP_ZoneUnavail=0x29a6
@@ -54,8 +54,8 @@ OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000 OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000 OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000 OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000 OP_SendExeChecksum=0x777f
OP_SendBaseDataChecksum=0x0000 OP_SendBaseDataChecksum=0x0492
# Zone in opcodes # Zone in opcodes
OP_AckPacket=0x776d OP_AckPacket=0x776d