mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-27 08:17:16 +00:00
Merge pull request #5066 from dannuic/tob_loginpatches
TOB packet work through zone in
This commit is contained in:
+101
-66
@@ -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,12 +3017,12 @@ 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);
|
||||||
|
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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*/
|
||||||
};
|
};
|
||||||
|
|||||||
+31
-31
@@ -7,11 +7,11 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
### World/Zone Opcode Implementation Status
|
### World/Zone Opcode Implementation Status
|
||||||
|
|
||||||
| Opcode | Status | Notes | Working On |
|
| Opcode | Status | Notes | Working On |
|
||||||
| :--- | :--- | :--- | :--- |
|
|:----------------------------------|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------|
|
||||||
| `OP_AAAction` | 🟡 Unverified | | |
|
| `OP_AAAction` | 🟡 Unverified | | |
|
||||||
| `OP_AAExpUpdate` | 🟡 Unverified | | |
|
| `OP_AAExpUpdate` | 🟡 Unverified | | |
|
||||||
| `OP_AcceptNewTask` | 🔴 Not-Set | | |
|
| `OP_AcceptNewTask` | 🔴 Not-Set | | |
|
||||||
| `OP_AckPacket` | 🟡 Unverified | | |
|
| `OP_AckPacket` | 🟢 Verified | | |
|
||||||
| `OP_Action` | 🟡 Unverified | | |
|
| `OP_Action` | 🟡 Unverified | | |
|
||||||
| `OP_Action2` | 🔴 Not-Set | | |
|
| `OP_Action2` | 🔴 Not-Set | | |
|
||||||
| `OP_AddNimbusEffect` | 🟡 Unverified | | |
|
| `OP_AddNimbusEffect` | 🟡 Unverified | | |
|
||||||
@@ -44,7 +44,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_Animation` | 🟡 Unverified | | |
|
| `OP_Animation` | 🟡 Unverified | | |
|
||||||
| `OP_AnnoyingZoneUnknown` | 🔴 Not-Set | | |
|
| `OP_AnnoyingZoneUnknown` | 🔴 Not-Set | | |
|
||||||
| `OP_ApplyPoison` | 🟡 Unverified | | |
|
| `OP_ApplyPoison` | 🟡 Unverified | | |
|
||||||
| `OP_ApproveName` | 🟡 Unverified | | |
|
| `OP_ApproveName` | 🟡 Unverified | This takes multiple parameters from the client, and it can take multiple integer values from the server | |
|
||||||
| `OP_ApproveWorld` | 🔴 Not-Set | | |
|
| `OP_ApproveWorld` | 🔴 Not-Set | | |
|
||||||
| `OP_ApproveZone` | 🔴 Not-Set | | |
|
| `OP_ApproveZone` | 🔴 Not-Set | | |
|
||||||
| `OP_Assist` | 🟡 Unverified | | |
|
| `OP_Assist` | 🟡 Unverified | | |
|
||||||
@@ -83,8 +83,8 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_ChangeSize` | 🟡 Unverified | | |
|
| `OP_ChangeSize` | 🟡 Unverified | | |
|
||||||
| `OP_ChannelMessage` | 🟡 Unverified | | |
|
| `OP_ChannelMessage` | 🟡 Unverified | | |
|
||||||
| `OP_ChangePetName` | 🔴 Not-Set | | |
|
| `OP_ChangePetName` | 🔴 Not-Set | | |
|
||||||
| `OP_CharacterCreate` | 🟡 Unverified | Wasn't sure on the status of this | |
|
| `OP_CharacterCreate` | 🟢 Verified | Sends heroic type, can be used for something? | |
|
||||||
| `OP_CharacterCreateRequest` | 🟡 Unverified | Wasn't sure on status of this | |
|
| `OP_CharacterCreateRequest` | 🟢 Verified | | |
|
||||||
| `OP_CharInventory` | 🟡 Unverified | | |
|
| `OP_CharInventory` | 🟡 Unverified | | |
|
||||||
| `OP_Charm` | 🟡 Unverified | | |
|
| `OP_Charm` | 🟡 Unverified | | |
|
||||||
| `OP_ChatMessage` | 🔴 Not-Set | | |
|
| `OP_ChatMessage` | 🔴 Not-Set | | |
|
||||||
@@ -125,7 +125,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_Damage` | 🟡 Unverified | | |
|
| `OP_Damage` | 🟡 Unverified | | |
|
||||||
| `OP_Death` | 🟡 Unverified | | |
|
| `OP_Death` | 🟡 Unverified | | |
|
||||||
| `OP_DelegateAbility` | 🔴 Not-Set | | |
|
| `OP_DelegateAbility` | 🔴 Not-Set | | |
|
||||||
| `OP_DeleteCharacter` | 🟡 Unverified | | |
|
| `OP_DeleteCharacter` | 🟢 Verified | | |
|
||||||
| `OP_DeleteCharge` | 🟡 Unverified | | |
|
| `OP_DeleteCharge` | 🟡 Unverified | | |
|
||||||
| `OP_DeleteItem` | 🟡 Unverified | | |
|
| `OP_DeleteItem` | 🟡 Unverified | | |
|
||||||
| `OP_DeletePetition` | 🔴 Not-Set | | |
|
| `OP_DeletePetition` | 🔴 Not-Set | | |
|
||||||
@@ -166,7 +166,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_EndLootRequest` | 🟡 Unverified | | |
|
| `OP_EndLootRequest` | 🟡 Unverified | | |
|
||||||
| `OP_EnduranceUpdate` | 🔴 Not-Set | | |
|
| `OP_EnduranceUpdate` | 🔴 Not-Set | | |
|
||||||
| `OP_EnterChat` | 🔴 Not-Set | | |
|
| `OP_EnterChat` | 🔴 Not-Set | | |
|
||||||
| `OP_EnterWorld` | 🟢 Verified | Seems to largely work | |
|
| `OP_EnterWorld` | 🟢 Verified | | |
|
||||||
| `OP_EnvDamage` | 🟡 Unverified | | |
|
| `OP_EnvDamage` | 🟡 Unverified | | |
|
||||||
| `OP_EvolveItem` | 🔴 Not-Set | | |
|
| `OP_EvolveItem` | 🔴 Not-Set | | |
|
||||||
| `OP_ExpansionInfo` | 🟢 Verified | Updated from u32 to u64 and works now | |
|
| `OP_ExpansionInfo` | 🟢 Verified | Updated from u32 to u64 and works now | |
|
||||||
@@ -182,7 +182,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_FinishWindow2` | 🟡 Unverified | | |
|
| `OP_FinishWindow2` | 🟡 Unverified | | |
|
||||||
| `OP_Fishing` | 🟡 Unverified | | |
|
| `OP_Fishing` | 🟡 Unverified | | |
|
||||||
| `OP_Fling` | 🟡 Unverified | | |
|
| `OP_Fling` | 🟡 Unverified | | |
|
||||||
| `OP_FloatListThing` | 🟡 Unverified | | |
|
| `OP_FloatListThing` | 🟢 Verified | Movement History. Sent from client, but emu doesn't use it so setting it as varified. Reference is 0x1402FFAD0 | |
|
||||||
| `OP_Forage` | 🟡 Unverified | | |
|
| `OP_Forage` | 🟡 Unverified | | |
|
||||||
| `OP_ForceFindPerson` | 🔴 Not-Set | | |
|
| `OP_ForceFindPerson` | 🔴 Not-Set | | |
|
||||||
| `OP_FormattedMessage` | 🟡 Unverified | | |
|
| `OP_FormattedMessage` | 🟡 Unverified | | |
|
||||||
@@ -320,7 +320,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_LeaveAdventure` | 🔴 Not-Set | | |
|
| `OP_LeaveAdventure` | 🔴 Not-Set | | |
|
||||||
| `OP_LeaveBoat` | 🟡 Unverified | | |
|
| `OP_LeaveBoat` | 🟡 Unverified | | |
|
||||||
| `OP_LevelAppearance` | 🟡 Unverified | | |
|
| `OP_LevelAppearance` | 🟡 Unverified | | |
|
||||||
| `OP_LevelUpdate` | 🟡 Unverified | | |
|
| `OP_LevelUpdate` | 🟢 Verified | | |
|
||||||
| `OP_LFGAppearance` | 🔴 Not-Set | | |
|
| `OP_LFGAppearance` | 🔴 Not-Set | | |
|
||||||
| `OP_LFGCommand` | 🔴 Not-Set | | |
|
| `OP_LFGCommand` | 🔴 Not-Set | | |
|
||||||
| `OP_LFGGetMatchesRequest` | 🔴 Not-Set | | |
|
| `OP_LFGGetMatchesRequest` | 🔴 Not-Set | | |
|
||||||
@@ -342,7 +342,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_LoginUnknown2` | 🔴 Not-Set | | |
|
| `OP_LoginUnknown2` | 🔴 Not-Set | | |
|
||||||
| `OP_Logout` | 🟡 Unverified | | |
|
| `OP_Logout` | 🟡 Unverified | | |
|
||||||
| `OP_LogoutReply` | 🔴 Not-Set | | |
|
| `OP_LogoutReply` | 🔴 Not-Set | | |
|
||||||
| `OP_LogServer` | 🟡 Unverified | Set via disassembly, lots of unknowns still | |
|
| `OP_LogServer` | 🟢 Verified | Mostly unused values | |
|
||||||
| `OP_LootComplete` | 🟡 Unverified | | |
|
| `OP_LootComplete` | 🟡 Unverified | | |
|
||||||
| `OP_LootItem` | 🟡 Unverified | | |
|
| `OP_LootItem` | 🟡 Unverified | | |
|
||||||
| `OP_LootRequest` | 🟡 Unverified | | |
|
| `OP_LootRequest` | 🟡 Unverified | | |
|
||||||
@@ -376,7 +376,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_MobUpdate` | 🔴 Not-Set | | |
|
| `OP_MobUpdate` | 🔴 Not-Set | | |
|
||||||
| `OP_MoneyOnCorpse` | 🟡 Unverified | | |
|
| `OP_MoneyOnCorpse` | 🟡 Unverified | | |
|
||||||
| `OP_MoneyUpdate` | 🟡 Unverified | | |
|
| `OP_MoneyUpdate` | 🟡 Unverified | | |
|
||||||
| `OP_MOTD` | 🟡 Unverified | | |
|
| `OP_MOTD` | 🟢 Verified | | |
|
||||||
| `OP_MoveCoin` | 🟡 Unverified | | |
|
| `OP_MoveCoin` | 🟡 Unverified | | |
|
||||||
| `OP_MoveDoor` | 🟡 Unverified | | |
|
| `OP_MoveDoor` | 🟡 Unverified | | |
|
||||||
| `OP_MoveItem` | 🟡 Unverified | | |
|
| `OP_MoveItem` | 🟡 Unverified | | |
|
||||||
@@ -384,7 +384,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_MoveLogDisregard` | 🔴 Not-Set | | |
|
| `OP_MoveLogDisregard` | 🔴 Not-Set | | |
|
||||||
| `OP_MoveLogRequest` | 🔴 Not-Set | | |
|
| `OP_MoveLogRequest` | 🔴 Not-Set | | |
|
||||||
| `OP_MultiLineMsg` | 🔴 Not-Set | | |
|
| `OP_MultiLineMsg` | 🔴 Not-Set | | |
|
||||||
| `OP_NewSpawn` | 🟡 Unverified | | |
|
| `OP_NewSpawn` | 🟢 Verified | Deprecated in the client, already handled in emu | |
|
||||||
| `OP_NewTitlesAvailable` | 🔴 Not-Set | | |
|
| `OP_NewTitlesAvailable` | 🔴 Not-Set | | |
|
||||||
| `OP_NewZone` | 🟢 Verified | | |
|
| `OP_NewZone` | 🟢 Verified | | |
|
||||||
| `OP_NPCMoveUpdate` | 🔴 Not-Set | | |
|
| `OP_NPCMoveUpdate` | 🔴 Not-Set | | |
|
||||||
@@ -441,7 +441,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_RaidInvite` | 🔴 Not-Set | | |
|
| `OP_RaidInvite` | 🔴 Not-Set | | |
|
||||||
| `OP_RaidJoin` | 🔴 Not-Set | | |
|
| `OP_RaidJoin` | 🔴 Not-Set | | |
|
||||||
| `OP_RaidUpdate` | 🔴 Not-Set | | |
|
| `OP_RaidUpdate` | 🔴 Not-Set | | |
|
||||||
| `OP_RandomNameGenerator` | 🟡 Unverified | | |
|
| `OP_RandomNameGenerator` | 🟢 Verified | The client no longer sends this packet (random name generation is done entirely in the client). The client will still accept this packet to set name (emu doesn't do this, but it's always been supported) | |
|
||||||
| `OP_RandomReply` | 🟡 Unverified | | |
|
| `OP_RandomReply` | 🟡 Unverified | | |
|
||||||
| `OP_RandomReq` | 🟡 Unverified | | |
|
| `OP_RandomReq` | 🟡 Unverified | | |
|
||||||
| `OP_ReadBook` | 🟡 Unverified | | |
|
| `OP_ReadBook` | 🟡 Unverified | | |
|
||||||
@@ -458,8 +458,8 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_RemoveTrap` | 🔴 Not-Set | | |
|
| `OP_RemoveTrap` | 🔴 Not-Set | | |
|
||||||
| `OP_Report` | 🟡 Unverified | | |
|
| `OP_Report` | 🟡 Unverified | | |
|
||||||
| `OP_ReqClientSpawn` | 🟢 Verified | | |
|
| `OP_ReqClientSpawn` | 🟢 Verified | | |
|
||||||
| `OP_ReqNewZone` | 🟢 Verified | | |
|
| `OP_ReqNewZone` | 🟢 Verified | Client does not send this (in LS or TOB), but it does receive it. emu does not send it | |
|
||||||
| `OP_RequestClientZoneChange` | 🟡 Unverified | | |
|
| `OP_RequestClientZoneChange` | 🟢 Verified | parity with RoF2, there's a string that gets passed to teleport at the end that's not known | |
|
||||||
| `OP_RequestDuel` | 🔴 Not-Set | | |
|
| `OP_RequestDuel` | 🔴 Not-Set | | |
|
||||||
| `OP_RequestGuildTributes` | 🔴 Not-Set | | |
|
| `OP_RequestGuildTributes` | 🔴 Not-Set | | |
|
||||||
| `OP_RequestKnowledgeBase` | 🔴 Not-Set | | |
|
| `OP_RequestKnowledgeBase` | 🔴 Not-Set | | |
|
||||||
@@ -479,14 +479,14 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_SelectTribute` | 🔴 Not-Set | | |
|
| `OP_SelectTribute` | 🔴 Not-Set | | |
|
||||||
| `OP_SendAAStats` | 🟡 Unverified | | |
|
| `OP_SendAAStats` | 🟡 Unverified | | |
|
||||||
| `OP_SendAATable` | 🟡 Unverified | | |
|
| `OP_SendAATable` | 🟡 Unverified | | |
|
||||||
| `OP_SendCharInfo` | 🟢 Verified | Seems to largely work correctly | |
|
| `OP_SendCharInfo` | 🟢 Verified | | |
|
||||||
| `OP_SendExpZonein` | 🟡 Unverified | | |
|
| `OP_SendExpZonein` | 🟡 Unverified | | |
|
||||||
| `OP_SendFindableNPCs` | 🔴 Not-Set | | |
|
| `OP_SendFindableNPCs` | 🔴 Not-Set | | |
|
||||||
| `OP_SendGuildTributes` | 🔴 Not-Set | | |
|
| `OP_SendGuildTributes` | 🔴 Not-Set | | |
|
||||||
| `OP_SendLoginInfo` | 🟢 Verified | | |
|
| `OP_SendLoginInfo` | 🟢 Verified | | |
|
||||||
| `OP_SendMaxCharacters` | 🟢 Verified | | |
|
| `OP_SendMaxCharacters` | 🟢 Verified | | |
|
||||||
| `OP_SendMembership` | 🟡 Unverified | Seems right but may be new stuff we need to figure out | |
|
| `OP_SendMembership` | 🟢 Verified | | |
|
||||||
| `OP_SendMembershipDetails` | 🟡 Unverified | Seems right but may be new stuff we need to figure out | |
|
| `OP_SendMembershipDetails` | 🟢 Verified | The struct is correct, will need reversing for actual option keys/values | |
|
||||||
| `OP_SendSystemStats` | 🔴 Not-Set | | |
|
| `OP_SendSystemStats` | 🔴 Not-Set | | |
|
||||||
| `OP_SendTitleList` | 🔴 Not-Set | | |
|
| `OP_SendTitleList` | 🔴 Not-Set | | |
|
||||||
| `OP_SendTributes` | 🔴 Not-Set | | |
|
| `OP_SendTributes` | 🔴 Not-Set | | |
|
||||||
@@ -497,7 +497,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_ServerListResponse` | 🔴 Not-Set | | |
|
| `OP_ServerListResponse` | 🔴 Not-Set | | |
|
||||||
| `OP_SessionReady` | 🔴 Not-Set | | |
|
| `OP_SessionReady` | 🔴 Not-Set | | |
|
||||||
| `OP_SetChatServer` | 🔴 Not-Set | | |
|
| `OP_SetChatServer` | 🔴 Not-Set | | |
|
||||||
| `OP_SetChatServer2` | 🟡 Unverified | | |
|
| `OP_SetChatServer2` | 🟢 Verified | | |
|
||||||
| `OP_SetFace` | 🔴 Not-Set | | |
|
| `OP_SetFace` | 🔴 Not-Set | | |
|
||||||
| `OP_SetGroupTarget` | 🔴 Not-Set | | |
|
| `OP_SetGroupTarget` | 🔴 Not-Set | | |
|
||||||
| `OP_SetGuildMOTD` | 🔴 Not-Set | | |
|
| `OP_SetGuildMOTD` | 🔴 Not-Set | | |
|
||||||
@@ -546,7 +546,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_SpecialMesg` | 🟡 Unverified | | |
|
| `OP_SpecialMesg` | 🟡 Unverified | | |
|
||||||
| `OP_SpellEffect` | 🟡 Unverified | | |
|
| `OP_SpellEffect` | 🟡 Unverified | | |
|
||||||
| `OP_Split` | 🟡 Unverified | | |
|
| `OP_Split` | 🟡 Unverified | | |
|
||||||
| `OP_Stamina` | 🟡 Unverified | | |
|
| `OP_Stamina` | 🟢 Verified | These values are 0-32k instead of 0-127 | |
|
||||||
| `OP_Stun` | 🟡 Unverified | | |
|
| `OP_Stun` | 🟡 Unverified | | |
|
||||||
| `OP_Surname` | 🔴 Not-Set | | |
|
| `OP_Surname` | 🔴 Not-Set | | |
|
||||||
| `OP_SwapSpell` | 🟡 Unverified | | |
|
| `OP_SwapSpell` | 🟡 Unverified | | |
|
||||||
@@ -566,7 +566,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_Taunt` | 🟡 Unverified | | |
|
| `OP_Taunt` | 🟡 Unverified | | |
|
||||||
| `OP_TestBuff` | 🔴 Not-Set | | |
|
| `OP_TestBuff` | 🔴 Not-Set | | |
|
||||||
| `OP_TGB` | 🔴 Not-Set | | |
|
| `OP_TGB` | 🔴 Not-Set | | |
|
||||||
| `OP_TimeOfDay` | 🟡 Unverified | | |
|
| `OP_TimeOfDay` | 🟢 Verified | | |
|
||||||
| `OP_Track` | 🟡 Unverified | | |
|
| `OP_Track` | 🟡 Unverified | | |
|
||||||
| `OP_TrackTarget` | 🟡 Unverified | | |
|
| `OP_TrackTarget` | 🟡 Unverified | | |
|
||||||
| `OP_TrackUnknown` | 🟡 Unverified | | |
|
| `OP_TrackUnknown` | 🟡 Unverified | | |
|
||||||
@@ -608,29 +608,29 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_Weblink` | 🟡 Unverified | | |
|
| `OP_Weblink` | 🟡 Unverified | | |
|
||||||
| `OP_WhoAllRequest` | 🟡 Unverified | | |
|
| `OP_WhoAllRequest` | 🟡 Unverified | | |
|
||||||
| `OP_WhoAllResponse` | 🟡 Unverified | | |
|
| `OP_WhoAllResponse` | 🟡 Unverified | | |
|
||||||
| `OP_World_Client_CRC1` | 🟡 Unverified | | |
|
| `OP_World_Client_CRC1` | 🟢 Verified | | |
|
||||||
| `OP_World_Client_CRC2` | 🟡 Unverified | | |
|
| `OP_World_Client_CRC2` | 🟢 Verified | | |
|
||||||
| `OP_World_Client_CRC3` | 🟡 Unverified | | |
|
| `OP_World_Client_CRC3` | 🟢 Verified | | |
|
||||||
| `OP_WorldClientReady` | 🟡 Unverified | | |
|
| `OP_WorldClientReady` | 🟢 Verified | | |
|
||||||
| `OP_WorldComplete` | 🟡 Unverified | | |
|
| `OP_WorldComplete` | 🟢 Verified | | |
|
||||||
| `OP_WorldLogout` | 🔴 Not-Set | | |
|
| `OP_WorldLogout` | 🔴 Not-Set | | |
|
||||||
| `OP_WorldObjectsSent` | 🟡 Unverified | | |
|
| `OP_WorldObjectsSent` | 🟡 Unverified | | |
|
||||||
| `OP_WorldUnknown001` | 🟡 Unverified | | |
|
| `OP_WorldUnknown001` | 🟢 Verified | SetServerTime. emu doesn't currently send it so setting it to verified, but the reference is 0x140292550 | |
|
||||||
| `OP_XTargetAutoAddHaters` | 🔴 Not-Set | | |
|
| `OP_XTargetAutoAddHaters` | 🔴 Not-Set | | |
|
||||||
| `OP_XTargetOpen` | 🔴 Not-Set | | |
|
| `OP_XTargetOpen` | 🔴 Not-Set | | |
|
||||||
| `OP_XTargetOpenResponse` | 🔴 Not-Set | | |
|
| `OP_XTargetOpenResponse` | 🔴 Not-Set | | |
|
||||||
| `OP_XTargetRequest` | 🔴 Not-Set | | |
|
| `OP_XTargetRequest` | 🔴 Not-Set | | |
|
||||||
| `OP_XTargetResponse` | 🔴 Not-Set | | |
|
| `OP_XTargetResponse` | 🔴 Not-Set | | |
|
||||||
| `OP_YellForHelp` | 🟡 Unverified | | |
|
| `OP_YellForHelp` | 🟡 Unverified | | |
|
||||||
| `OP_ZoneChange` | 🟡 Unverified | | |
|
| `OP_ZoneChange` | 🟢 Verified | | |
|
||||||
| `OP_ZoneComplete` | 🔴 Not-Set | | |
|
| `OP_ZoneComplete` | 🔴 Not-Set | | |
|
||||||
| `OP_ZoneEntry` | 🟢 Verified | | |
|
| `OP_ZoneEntry` | 🟢 Verified | unknown fields in C->S struct are various CRCs, emu doesn't use them | |
|
||||||
| `OP_ZoneGuildList` | 🔴 Not-Set | | |
|
| `OP_ZoneGuildList` | 🔴 Not-Set | | |
|
||||||
| `OP_ZoneInUnknown` | 🔴 Not-Set | | |
|
| `OP_ZoneInUnknown` | 🔴 Not-Set | | |
|
||||||
| `OP_ZonePlayerToBind` | 🟡 Unverified | | |
|
| `OP_ZonePlayerToBind` | 🟡 Unverified | | |
|
||||||
| `OP_ZoneServerInfo` | 🟢 Verified | | |
|
| `OP_ZoneServerInfo` | 🟢 Verified | | |
|
||||||
| `OP_ZoneServerReady` | 🔴 Not-Set | | |
|
| `OP_ZoneServerReady` | 🔴 Not-Set | | |
|
||||||
| `OP_ZoneSpawns` | 🟢 Verified | | |
|
| `OP_ZoneSpawns` | 🟢 Verified | This is deprecated in the client (and emu never sends it directly) | |
|
||||||
| `OP_ZoneUnavail` | 🟡 Unverified | | |
|
| `OP_ZoneUnavail` | 🟢 Verified | The client discards all content of this packet | |
|
||||||
| `OP_ResetAA` | 🟡 Unverified | | |
|
| `OP_ResetAA` | 🟡 Unverified | | |
|
||||||
| `OP_UnderWorld` | 🟡 Unverified | | |
|
| `OP_UnderWorld` | 🟡 Unverified | | |
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user