Distracted by world server issues

This commit is contained in:
KimLS 2024-10-22 20:08:31 -07:00
parent 6db7c624e9
commit acdd65b55c
4 changed files with 269 additions and 214 deletions

View File

@ -126,7 +126,16 @@ namespace Larion
// ENCODE methods // ENCODE methods
ENCODE(OP_LogServer) { ENCODE(OP_LogServer) {
EQApplicationPacket* in = *p;
*p = nullptr;
LogServer_Struct* emu = (LogServer_Struct*)in->pBuffer;
auto outapp = new EQApplicationPacket(OP_LogServer, 1840);
dest->FastQueuePacket(&outapp);
safe_delete(in);
} }
// DECODE methods // DECODE methods

View File

@ -12,204 +12,204 @@ namespace Larion {
}; };
struct LogServer_Struct { struct LogServer_Struct {
//As far as I can tell the client does not read this field ////As far as I can tell the client does not read this field
/*000*/ uint32 unknown000; ///*000*/ uint32 unknown000;
//client sets this to 140e32edc, confirmed it deals with pvp via disassembly aka hasn't moved ////client sets this to 140e32edc, confirmed it deals with pvp via disassembly aka hasn't moved
/*004*/ uint8 enable_pvp; ///*004*/ uint8 enable_pvp;
/*005*/ uint8 unknown005; ///*005*/ uint8 unknown005;
/*006*/ uint8 unknown006; ///*006*/ uint8 unknown006;
/*007*/ uint8 unknown007; ///*007*/ uint8 unknown007;
//client sets this to 140e32ee0, this was set to 1 on special ruleset servers but 0 on non-special ruleset servers ////client sets this to 140e32ee0, this was set to 1 on special ruleset servers but 0 on non-special ruleset servers
/*008*/ uint8 special_ruleset; ///*008*/ uint8 special_ruleset;
//client sets this to 140e3bedd ////client sets this to 140e3bedd
//I've seen 0 on normal servers ////I've seen 0 on normal servers
//it deals with char select and # of char slots somehow ////it deals with char select and # of char slots somehow
/*009*/ uint8 unknown009; ///*009*/ uint8 unknown009;
//client sets this to 140e32ee1, confirmed via disassembly to be enable_FV ////client sets this to 140e32ee1, confirmed via disassembly to be enable_FV
/*00a*/ uint8 enable_FV; ///*00a*/ uint8 enable_FV;
//client sets this to 140e3bf0, seems to affect the made by label on items ////client sets this to 140e3bf0, seems to affect the made by label on items
//always has been 0 for me ////always has been 0 for me
/*00b*/ uint8 enable_made_by; ///*00b*/ uint8 enable_made_by;
//client sets this to 140e3bf09 ////client sets this to 140e3bf09
//I see it being written to but not read in code ////I see it being written to but not read in code
//I've only ever seen it passed as 1 ////I've only ever seen it passed as 1
/*00c*/ uint8 unknown00c; ///*00c*/ uint8 unknown00c;
//client sets this to 140e3bf0a ////client sets this to 140e3bf0a
//I've only ever seen it passed as 1 ////I've only ever seen it passed as 1
//0 seems to disable something about languages? ////0 seems to disable something about languages?
/*00d*/ uint8 languages_enabled; ///*00d*/ uint8 languages_enabled;
/*00e*/ uint8 unknown00e; ///*00e*/ uint8 unknown00e;
/*00f*/ uint8 unknown00f; ///*00f*/ uint8 unknown00f;
/*010*/ uint8 unknown010; ///*010*/ uint8 unknown010;
/*011*/ uint8 unknown011; ///*011*/ uint8 unknown011;
/*012*/ uint8 unknown012; ///*012*/ uint8 unknown012;
/*013*/ uint8 unknown013; ///*013*/ uint8 unknown013;
/*014*/ uint8 unknown014; ///*014*/ uint8 unknown014;
/*015*/ char worldshortname[32]; ///*015*/ char worldshortname[32];
/*035*/ uint8 unknown035[11]; ///*035*/ uint8 unknown035[11];
/*040*/ uint8 unknown040[16]; ///*040*/ uint8 unknown040[16];
/*050*/ uint8 unknown050[16]; ///*050*/ uint8 unknown050[16];
/*060*/ uint8 unknown060[16]; ///*060*/ uint8 unknown060[16];
/*070*/ uint8 unknown070[16]; ///*070*/ uint8 unknown070[16];
/*080*/ uint8 unknown080[16]; ///*080*/ uint8 unknown080[16];
/*090*/ uint8 unknown090[16]; ///*090*/ uint8 unknown090[16];
/*0a0*/ uint8 unknown0a0[16]; ///*0a0*/ uint8 unknown0a0[16];
/*0b0*/ uint8 unknown0b0[16]; ///*0b0*/ uint8 unknown0b0[16];
/*0c0*/ uint8 unknown0c0[16]; ///*0c0*/ uint8 unknown0c0[16];
/*0d0*/ uint8 unknown0d0[16]; ///*0d0*/ uint8 unknown0d0[16];
/*0e0*/ uint8 unknown0e0[16]; ///*0e0*/ uint8 unknown0e0[16];
/*0f0*/ uint8 unknown0f0[16]; ///*0f0*/ uint8 unknown0f0[16];
/*100*/ uint8 unknown100[16]; ///*100*/ uint8 unknown100[16];
/*110*/ uint8 unknown110[16]; ///*110*/ uint8 unknown110[16];
/*120*/ uint8 unknown120[16]; ///*120*/ uint8 unknown120[16];
/*130*/ uint8 unknown130[16]; ///*130*/ uint8 unknown130[16];
/*140*/ uint8 unknown140[16]; ///*140*/ uint8 unknown140[16];
/*140*/ uint8 unknown140[16]; ///*140*/ uint8 unknown140[16];
/*150*/ uint8 unknown150[16]; ///*150*/ uint8 unknown150[16];
/*160*/ uint8 unknown160[16]; ///*160*/ uint8 unknown160[16];
/*170*/ uint8 unknown170[16]; ///*170*/ uint8 unknown170[16];
/*180*/ uint8 unknown180[16]; ///*180*/ uint8 unknown180[16];
/*190*/ uint8 unknown190[16]; ///*190*/ uint8 unknown190[16];
/*1a0*/ uint8 unknown1a0[16]; ///*1a0*/ uint8 unknown1a0[16];
/*1b0*/ uint8 unknown1b0[16]; ///*1b0*/ uint8 unknown1b0[16];
/*1c0*/ uint8 unknown1c0[16]; ///*1c0*/ uint8 unknown1c0[16];
/*1d0*/ uint8 unknown1d0[16]; ///*1d0*/ uint8 unknown1d0[16];
/*1e0*/ uint8 unknown1e0[16]; ///*1e0*/ uint8 unknown1e0[16];
/*1f0*/ uint8 unknown1f0[16]; ///*1f0*/ uint8 unknown1f0[16];
/*200*/ uint8 unknown200[16]; ///*200*/ uint8 unknown200[16];
/*210*/ uint8 unknown210[16]; ///*210*/ uint8 unknown210[16];
/*220*/ uint8 unknown220[16]; ///*220*/ uint8 unknown220[16];
/*230*/ uint8 unknown230[16]; ///*230*/ uint8 unknown230[16];
/*240*/ uint8 unknown240[16]; ///*240*/ uint8 unknown240[16];
/*240*/ uint8 unknown240[16]; ///*240*/ uint8 unknown240[16];
/*250*/ uint8 unknown250[16]; ///*250*/ uint8 unknown250[16];
/*260*/ uint8 unknown260[16]; ///*260*/ uint8 unknown260[16];
/*270*/ uint8 unknown270[16]; ///*270*/ uint8 unknown270[16];
/*280*/ uint8 unknown280[16]; ///*280*/ uint8 unknown280[16];
/*290*/ uint8 unknown290[16]; ///*290*/ uint8 unknown290[16];
/*2a0*/ uint8 unknown2a0[16]; ///*2a0*/ uint8 unknown2a0[16];
/*2b0*/ uint8 unknown2b0[16]; ///*2b0*/ uint8 unknown2b0[16];
/*2c0*/ uint8 unknown2c0[16]; ///*2c0*/ uint8 unknown2c0[16];
/*2d0*/ uint8 unknown2d0[16]; ///*2d0*/ uint8 unknown2d0[16];
/*2e0*/ uint8 unknown2e0[16]; ///*2e0*/ uint8 unknown2e0[16];
/*2f0*/ uint8 unknown2f0[16]; ///*2f0*/ uint8 unknown2f0[16];
/*300*/ uint8 unknown300[16]; ///*300*/ uint8 unknown300[16];
/*310*/ uint8 unknown310[16]; ///*310*/ uint8 unknown310[16];
/*320*/ uint8 unknown320[16]; ///*320*/ uint8 unknown320[16];
/*330*/ uint8 unknown330[16]; ///*330*/ uint8 unknown330[16];
/*340*/ uint8 unknown340[16]; ///*340*/ uint8 unknown340[16];
/*340*/ uint8 unknown340[16]; ///*340*/ uint8 unknown340[16];
/*350*/ uint8 unknown350[16]; ///*350*/ uint8 unknown350[16];
/*360*/ uint8 unknown360[16]; ///*360*/ uint8 unknown360[16];
/*370*/ uint8 unknown370[16]; ///*370*/ uint8 unknown370[16];
/*380*/ uint8 unknown380[16]; ///*380*/ uint8 unknown380[16];
/*390*/ uint8 unknown390[16]; ///*390*/ uint8 unknown390[16];
/*3a0*/ uint8 unknown3a0[16]; ///*3a0*/ uint8 unknown3a0[16];
/*3b0*/ uint8 unknown3b0[16]; ///*3b0*/ uint8 unknown3b0[16];
/*3c0*/ uint8 unknown3c0[16]; ///*3c0*/ uint8 unknown3c0[16];
/*3d0*/ uint8 unknown3d0[16]; ///*3d0*/ uint8 unknown3d0[16];
/*3e0*/ uint8 unknown3e0[16]; ///*3e0*/ uint8 unknown3e0[16];
/*3f0*/ uint8 unknown3f0[16]; ///*3f0*/ uint8 unknown3f0[16];
/*400*/ uint8 unknown400[16]; ///*400*/ uint8 unknown400[16];
/*410*/ uint8 unknown410[16]; ///*410*/ uint8 unknown410[16];
/*420*/ uint8 unknown420[16]; ///*420*/ uint8 unknown420[16];
/*430*/ uint8 unknown430[16]; ///*430*/ uint8 unknown430[16];
/*440*/ uint8 unknown440[16]; ///*440*/ uint8 unknown440[16];
/*440*/ uint8 unknown440[16]; ///*440*/ uint8 unknown440[16];
/*450*/ uint8 unknown450[16]; ///*450*/ uint8 unknown450[16];
/*460*/ uint8 unknown460[16]; ///*460*/ uint8 unknown460[16];
/*470*/ uint8 unknown470[16]; ///*470*/ uint8 unknown470[16];
/*480*/ uint8 unknown480[16]; ///*480*/ uint8 unknown480[16];
/*490*/ uint8 unknown490[16]; ///*490*/ uint8 unknown490[16];
/*4a0*/ uint8 unknown4a0[16]; ///*4a0*/ uint8 unknown4a0[16];
/*4b0*/ uint8 unknown4b0[16]; ///*4b0*/ uint8 unknown4b0[16];
/*4c0*/ uint8 unknown4c0[16]; ///*4c0*/ uint8 unknown4c0[16];
/*4d0*/ uint8 unknown4d0[16]; ///*4d0*/ uint8 unknown4d0[16];
/*4e0*/ uint8 unknown4e0[16]; ///*4e0*/ uint8 unknown4e0[16];
/*4f0*/ uint8 unknown4f0[16]; ///*4f0*/ uint8 unknown4f0[16];
/*500*/ uint8 unknown500[16]; ///*500*/ uint8 unknown500[16];
/*510*/ uint8 unknown510[16]; ///*510*/ uint8 unknown510[16];
/*520*/ uint8 unknown520[16]; ///*520*/ uint8 unknown520[16];
/*530*/ uint8 unknown530[16]; ///*530*/ uint8 unknown530[16];
/*540*/ uint8 unknown540[16]; ///*540*/ uint8 unknown540[16];
/*540*/ uint8 unknown540[16]; ///*540*/ uint8 unknown540[16];
/*550*/ uint8 unknown550[16]; ///*550*/ uint8 unknown550[16];
/*560*/ uint8 unknown560[16]; ///*560*/ uint8 unknown560[16];
/*570*/ uint8 unknown570[16]; ///*570*/ uint8 unknown570[16];
/*580*/ uint8 unknown580[16]; ///*580*/ uint8 unknown580[16];
/*590*/ uint8 unknown590[16]; ///*590*/ uint8 unknown590[16];
/*5a0*/ uint8 unknown5a0[12]; ///*5a0*/ uint8 unknown5a0[12];
//Client reads this and sets it to 140e32ee2 ////Client reads this and sets it to 140e32ee2
//I've only ever seen 0, it affects some calculation in the client ////I've only ever seen 0, it affects some calculation in the client
/*5ac*/ uint8 unknown5ac; ///*5ac*/ uint8 unknown5ac;
/*5ad*/ uint8 unknown5ad[3]; ///*5ad*/ uint8 unknown5ad[3];
/*5b0*/ uint8 unknown5b0[3]; ///*5b0*/ uint8 unknown5b0[3];
//Client reads this and sets it to 140e3bf18 ////Client reads this and sets it to 140e3bf18
//seems to enable the voice system ////seems to enable the voice system
/*5b4*/ uint8 enable_voice_system; ///*5b4*/ uint8 enable_voice_system;
//Client reads this and sets it to 140e3bef0 ////Client reads this and sets it to 140e3bef0
//Seems to enable the mail system ////Seems to enable the mail system
/*5b5*/ uint8 enable_mail; ///*5b5*/ uint8 enable_mail;
//Client reads this and sets it to 140e3bef1 ////Client reads this and sets it to 140e3bef1
//Not entirely sure what this does, it seems to be related to character create ////Not entirely sure what this does, it seems to be related to character create
//I've only ever seen it set to 0 ////I've only ever seen it set to 0
/*5b6*/ uint8 unknown5b6; ///*5b6*/ uint8 unknown5b6;
/*5b7*/ uint8 unknown5b7; ///*5b7*/ uint8 unknown5b7;
//Client reads this and sets it to 140e3bef2 ////Client reads this and sets it to 140e3bef2
//Not entirely sure what this does, it seems to be related to character create ////Not entirely sure what this does, it seems to be related to character create
//Seen set to 1 ////Seen set to 1
/*5b8*/ uint8 unknown5b8; ///*5b8*/ uint8 unknown5b8;
/*5b9*/ uint8 unknown5b9[8]; ///*5b9*/ uint8 unknown5b9[8];
//Client sets this to 140e3beec ////Client sets this to 140e3beec
//Seems to help enable beta buff command ////Seems to help enable beta buff command
/*5c0*/ uint8 beta_buff_enabled; ///*5c0*/ uint8 beta_buff_enabled;
//Client sets this to 140e3beed ////Client sets this to 140e3beed
//Guessing this is for marking as a beta server ////Guessing this is for marking as a beta server
/*5c1*/ uint8 is_beta_server; ///*5c1*/ uint8 is_beta_server;
//Client sets this to 140e3beee ////Client sets this to 140e3beee
//Test sets this to one and all 3 of these need to be 1 to use /betabuff ////Test sets this to one and all 3 of these need to be 1 to use /betabuff
/*5c2*/ uint8 is_test_server; ///*5c2*/ uint8 is_test_server;
//Client sets this to 140e3beef ////Client sets this to 140e3beef
//Client writes but doesn't read this anywhere as far as I can tell ////Client writes but doesn't read this anywhere as far as I can tell
/*5c3*/ uint8 unknown5c3; ///*5c3*/ uint8 unknown5c3;
/*5c4*/ uint8 unknown5c4[12]; ///*5c4*/ uint8 unknown5c4[12];
/*5d0*/ uint8 unknown5d0[16]; ///*5d0*/ uint8 unknown5d0[16];
/*5e0*/ uint8 unknown5e0[16]; ///*5e0*/ uint8 unknown5e0[16];
/*5f0*/ uint8 unknown5f0[12]; ///*5f0*/ uint8 unknown5f0[12];
//Client sets this to 140e3d5f4 ////Client sets this to 140e3d5f4
//Not sure what this affects ////Not sure what this affects
//I've seen ff ff ff ff passed ////I've seen ff ff ff ff passed
/*5fc*/ int32 unknown5fc; ///*5fc*/ int32 unknown5fc;
//Client sets this to 140e3d5f4 ////Client sets this to 140e3d5f4
//not sure what this does ////not sure what this does
//Ive seen 0 on normal servers but 1 on test ////Ive seen 0 on normal servers but 1 on test
/*600*/ int32 unknown600; ///*600*/ int32 unknown600;
/*604*/ uint8 unknown604[12]; ///*604*/ uint8 unknown604[12];
/*610*/ uint8 unknown610[16]; ///*610*/ uint8 unknown610[16];
/*620*/ uint8 unknown620[16]; ///*620*/ uint8 unknown620[16];
/*630*/ uint8 unknown630[16]; ///*630*/ uint8 unknown630[16];
/*640*/ uint8 unknown640[16]; ///*640*/ uint8 unknown640[16];
/*640*/ uint8 unknown640[16]; ///*640*/ uint8 unknown640[16];
/*650*/ uint8 unknown650[16]; ///*650*/ uint8 unknown650[16];
/*660*/ uint8 unknown660[16]; ///*660*/ uint8 unknown660[16];
/*670*/ uint8 unknown670[16]; ///*670*/ uint8 unknown670[16];
/*680*/ uint8 unknown680[16]; ///*680*/ uint8 unknown680[16];
/*690*/ uint8 unknown690[16]; ///*690*/ uint8 unknown690[16];
/*6a0*/ uint8 unknown6a0[16]; ///*6a0*/ uint8 unknown6a0[16];
/*6b0*/ uint8 unknown6b0[16]; ///*6b0*/ uint8 unknown6b0[16];
/*6c0*/ uint8 unknown6c0[16]; ///*6c0*/ uint8 unknown6c0[16];
/*6d0*/ uint8 unknown6d0[16]; ///*6d0*/ uint8 unknown6d0[16];
/*6e0*/ uint8 unknown6e0[16]; ///*6e0*/ uint8 unknown6e0[16];
/*6f0*/ uint8 unknown6f0[16]; ///*6f0*/ uint8 unknown6f0[16];
/*700*/ uint8 unknown700[16]; ///*700*/ uint8 unknown700[16];
/*710*/ uint8 unknown710[14]; ///*710*/ uint8 unknown710[14];
//Client reads this and sets it to 140e32ee2 ////Client reads this and sets it to 140e32ee2
//based on strings near related disassembly im guessing this controls ////based on strings near related disassembly im guessing this controls
//which kind of items are allowed (there are strings for heirloom, prestige, etc) ////which kind of items are allowed (there are strings for heirloom, prestige, etc)
//every server ive logged in so far has had this to 0 but I haven't tried a TLP yet ////every server ive logged in so far has had this to 0 but I haven't tried a TLP yet
/*71d*/ uint8 heirlooms_disabled; ///*71d*/ uint8 heirlooms_disabled;
/*71e*/ uint8 unknown71e; ///*71e*/ uint8 unknown71e;
/*720*/ uint8 unknown720[16]; ///*720*/ uint8 unknown720[16];
}; };
struct ClientZoneEntry_Struct { struct ClientZoneEntry_Struct {

View File

@ -977,8 +977,7 @@ bool WorldServer::ValidateWorldServerAdminLogin(
return false; return false;
} }
void WorldServer::SerializeForClientServerList(SerializeBuffer& out, bool use_local_ip, LSClientVersion version) const void WorldServer::SerializeForClientServerListLegacy(class SerializeBuffer& out, bool use_local_ip) const {
{
// see LoginClientServerData_Struct // see LoginClientServerData_Struct
if (use_local_ip) { if (use_local_ip) {
out.WriteString(GetLocalIP()); out.WriteString(GetLocalIP());
@ -987,10 +986,6 @@ void WorldServer::SerializeForClientServerList(SerializeBuffer& out, bool use_lo
out.WriteString(GetRemoteIP()); out.WriteString(GetRemoteIP());
} }
if (version == cv_larion) {
out.WriteUInt32(9000);
}
switch (GetServerListID()) { switch (GetServerListID()) {
case LS::ServerType::Legends: case LS::ServerType::Legends:
out.WriteInt32(LS::ServerTypeFlags::Legends); out.WriteInt32(LS::ServerTypeFlags::Legends);
@ -1002,15 +997,8 @@ void WorldServer::SerializeForClientServerList(SerializeBuffer& out, bool use_lo
out.WriteInt32(LS::ServerTypeFlags::Standard); out.WriteInt32(LS::ServerTypeFlags::Standard);
break; break;
} }
if (version == cv_larion) {
auto server_id = GetServerId(); out.WriteUInt32(GetServerId());
//if this is 0, the client will not show the server in the list
out.WriteUInt32(1);
out.WriteUInt32(server_id);
}
else {
out.WriteUInt32(GetServerId());
}
out.WriteString(GetServerLongName()); out.WriteString(GetServerLongName());
out.WriteString("us"); // country code out.WriteString("us"); // country code
@ -1032,6 +1020,61 @@ void WorldServer::SerializeForClientServerList(SerializeBuffer& out, bool use_lo
out.WriteUInt32(GetPlayersOnline()); out.WriteUInt32(GetPlayersOnline());
} }
void WorldServer::SerializeForClientServerListLarion(class SerializeBuffer& out, bool use_local_ip) const {
if (use_local_ip) {
out.WriteString(GetLocalIP());
}
else {
out.WriteString(GetRemoteIP());
}
out.WriteUInt32(9000);
out.WriteUInt32(0);
uint32_t flags = 32; //all servers i saw had this set
switch (GetServerListID()) {
case LS::ServerType::Legends:
flags += LS::ServerTypeFlags::Legends;
break;
case LS::ServerType::Preferred:
flags += LS::ServerTypeFlags::Preferred;
break;
default:
flags += LS::ServerTypeFlags::Standard;
break;
}
out.WriteUInt32(flags);
out.WriteUInt32(GetServerId());
out.WriteString(GetServerLongName());
out.WriteString("EN");
out.WriteString("US");
if (GetStatus() < 0) {
if (GetZonesBooted() == 0) {
out.WriteInt32(LS::ServerStatusFlags::Down);
}
else {
out.WriteInt32(LS::ServerStatusFlags::Locked);
}
}
else {
out.WriteInt32(LS::ServerStatusFlags::Up);
}
out.WriteUInt32(GetPlayersOnline());
}
void WorldServer::SerializeForClientServerList(SerializeBuffer& out, bool use_local_ip, LSClientVersion version) const
{
if (version == cv_larion) {
SerializeForClientServerListLarion(out, use_local_ip);
}
else {
SerializeForClientServerListLegacy(out, use_local_ip);
}
}
/** /**
* @param in_server_list_id * @param in_server_list_id
* @return * @return

View File

@ -149,7 +149,10 @@ public:
bool HandleNewLoginserverRegisteredOnly(Database::DbWorldRegistration &world_registration); bool HandleNewLoginserverRegisteredOnly(Database::DbWorldRegistration &world_registration);
bool HandleNewLoginserverInfoUnregisteredAllowed(Database::DbWorldRegistration &world_registration); bool HandleNewLoginserverInfoUnregisteredAllowed(Database::DbWorldRegistration &world_registration);
private:
void SerializeForClientServerListLegacy(class SerializeBuffer& out, bool use_local_ip) const;
void SerializeForClientServerListLarion(class SerializeBuffer& out, bool use_local_ip) const;
public:
void SerializeForClientServerList(class SerializeBuffer& out, bool use_local_ip, LSClientVersion version) const; void SerializeForClientServerList(class SerializeBuffer& out, bool use_local_ip, LSClientVersion version) const;
private: private: