[Performance] Send Smarter Emote Packets (#4818)

This commit is contained in:
Chris Miles 2025-03-29 19:50:44 -05:00 committed by GitHub
parent 950cc4a325
commit c8a7066d0e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 92 additions and 15 deletions

View File

@ -1886,3 +1886,36 @@ std::vector<uint32_t> ClientList::GetGuildZoneServers(uint32 guild_id)
return zone_server_ids; return zone_server_ids;
} }
std::vector<uint32_t> ClientList::GetZoneServersWithGMs()
{
std::vector<uint32_t> zone_server_ids;
std::unordered_set<uint32_t> seen_ids;
LinkedListIterator<ClientListEntry *> iterator(clientlist);
iterator.Reset();
while (iterator.MoreElements()) {
ClientListEntry *cle = iterator.GetData();
if (cle->Online() != CLE_Status::InZone) {
iterator.Advance();
continue;
}
if (!cle->Server()) {
iterator.Advance();
continue;
}
if (cle->Admin() > 0) {
uint32_t id = cle->Server()->GetID();
if (seen_ids.insert(id).second) {
zone_server_ids.emplace_back(id);
}
}
iterator.Advance();
}
return zone_server_ids;
}

View File

@ -61,6 +61,7 @@ public:
void CLEKeepAlive(uint32 numupdates, uint32* wid); void CLEKeepAlive(uint32 numupdates, uint32* wid);
void CLEAdd(uint32 login_server_id, const char* login_server_name, const char* login_name, const char* login_key, int16 world_admin = AccountStatus::Player, uint32 ip_address = 0, uint8 is_local=0); void CLEAdd(uint32 login_server_id, const char* login_server_name, const char* login_name, const char* login_key, int16 world_admin = AccountStatus::Player, uint32 ip_address = 0, uint8 is_local=0);
std::vector<uint32_t> GetGuildZoneServers(uint32 guild_id); std::vector<uint32_t> GetGuildZoneServers(uint32 guild_id);
std::vector<uint32_t> GetZoneServersWithGMs();
void UpdateClientGuild(uint32 char_id, uint32 guild_id); void UpdateClientGuild(uint32 char_id, uint32 guild_id);
bool IsAccountInGame(uint32 iLSID); bool IsAccountInGame(uint32 iLSID);

View File

@ -517,19 +517,27 @@ void ZSList::SendEmoteMessage(const char* to, uint32 to_guilddbid, int16 to_mins
SendEmoteMessageRaw(to, to_guilddbid, to_minstatus, type, buffer); SendEmoteMessageRaw(to, to_guilddbid, to_minstatus, type, buffer);
} }
void ZSList::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message) { void ZSList::SendEmoteMessageRaw(
if (!message) const char *to,
uint32 to_guilddbid,
int16 to_minstatus,
uint32 type,
const char *message
)
{
if (!message) {
return; return;
}
auto pack = new ServerPacket; auto pack = new ServerPacket;
pack->opcode = ServerOP_EmoteMessage; pack->opcode = ServerOP_EmoteMessage;
pack->size = sizeof(ServerEmoteMessage_Struct) + strlen(message) + 1; pack->size = sizeof(ServerEmoteMessage_Struct) + strlen(message) + 1;
pack->pBuffer = new uchar[pack->size]; pack->pBuffer = new uchar[pack->size];
memset(pack->pBuffer, 0, pack->size); memset(pack->pBuffer, 0, pack->size);
ServerEmoteMessage_Struct* sem = (ServerEmoteMessage_Struct*)pack->pBuffer; ServerEmoteMessage_Struct *sem = (ServerEmoteMessage_Struct *) pack->pBuffer;
if (to) { if (to) {
strcpy((char *)sem->to, to); strcpy((char *) sem->to, to);
} }
else { else {
sem->to[0] = 0; sem->to[0] = 0;
@ -537,22 +545,37 @@ void ZSList::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_m
sem->guilddbid = to_guilddbid; sem->guilddbid = to_guilddbid;
sem->minstatus = to_minstatus; sem->minstatus = to_minstatus;
sem->type = type; sem->type = type;
strcpy(&sem->message[0], message); strcpy(&sem->message[0], message);
char tempto[64] = { 0 }; char tempto[64] = {0};
if (to) if (to) {
strn0cpy(tempto, to, 64); strn0cpy(tempto, to, 64);
}
if (tempto[0] == 0) { if (tempto[0] == 0) {
SendPacket(pack); if (to_guilddbid > 0) {
SendPacketToZonesWithGuild(to_guilddbid, pack);
}
else if (to_minstatus > 0) {
SendPacketToZonesWithGMs(pack);
} else {
SendPacket(pack);
}
} }
else { else {
ZoneServer* zs = FindByName(to); ZoneServer *zs = FindByName(to);
if (zs) {
if (zs != 0)
zs->SendPacket(pack); zs->SendPacket(pack);
else }
else if (to_guilddbid > 0) {
SendPacketToZonesWithGuild(to_guilddbid, pack);
}
else if (to_minstatus > 0) {
SendPacketToZonesWithGMs(pack);
}
else {
SendPacket(pack); SendPacket(pack);
}
} }
delete pack; delete pack;
} }
@ -887,6 +910,19 @@ bool ZSList::SendPacketToZonesWithGuild(uint32 guild_id, ServerPacket* pack)
return true; return true;
} }
bool ZSList::SendPacketToZonesWithGMs(ServerPacket* pack)
{
for (auto const &z: zone_server_list) {
for (auto const &server_id: client_list.GetZoneServersWithGMs()) {
if (z->GetID() == server_id && z->GetZoneID() > 0) {
z->SendPacket(pack);
}
}
}
return true;
}
void ZSList::SendServerReload(ServerReload::Type type, uchar *packet) void ZSList::SendServerReload(ServerReload::Type type, uchar *packet)
{ {
static auto pack = ServerPacket(ServerOP_ServerReloadRequest, sizeof(ServerReload::Request)); static auto pack = ServerPacket(ServerOP_ServerReloadRequest, sizeof(ServerReload::Request));

View File

@ -30,6 +30,7 @@ public:
bool SendPacket(uint32 zoneid, ServerPacket *pack); bool SendPacket(uint32 zoneid, ServerPacket *pack);
bool SendPacket(uint32 zoneid, uint16 instanceid, ServerPacket *pack); bool SendPacket(uint32 zoneid, uint16 instanceid, ServerPacket *pack);
bool SendPacketToZonesWithGuild(uint32 guild_id, ServerPacket *pack); bool SendPacketToZonesWithGuild(uint32 guild_id, ServerPacket *pack);
bool SendPacketToZonesWithGMs(ServerPacket *pack);
bool SendPacketToBootedZones(ServerPacket* pack); bool SendPacketToBootedZones(ServerPacket* pack);
bool SetLockedZone(uint16 iZoneID, bool iLock); bool SetLockedZone(uint16 iZoneID, bool iLock);

View File

@ -571,7 +571,13 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
); );
} }
} }
zoneserver_list.SendPacket(pack); if (scm->guilddbid > 0) {
zoneserver_list.SendPacketToZonesWithGuild(scm->guilddbid, pack);
} else if (scm->chan_num == ChatChannel_GMSAY) {
zoneserver_list.SendPacketToZonesWithGMs(pack);
} else {
zoneserver_list.SendPacket(pack);
}
} }
break; break;