[Logging] Add detailed zoning logging (#3555)

* WIP: Add zoning logging

* Update zoning.cpp
This commit is contained in:
Chris Miles 2023-08-19 23:53:34 -05:00 committed by GitHub
parent 5631a0711f
commit 9cbfd5c8f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 202 additions and 17 deletions

View File

@ -138,6 +138,7 @@ namespace Logs {
QuestErrors, QuestErrors,
PlayerEvents, PlayerEvents,
DataBuckets, DataBuckets,
Zoning,
MaxCategoryID /* Don't Remove this */ MaxCategoryID /* Don't Remove this */
}; };
@ -235,6 +236,7 @@ namespace Logs {
"QuestErrors", "QuestErrors",
"PlayerEvents", "PlayerEvents",
"DataBuckets", "DataBuckets",
"Zoning",
}; };
} }

View File

@ -804,6 +804,16 @@
OutF(LogSys, Logs::Detail, Logs::DataBuckets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ OutF(LogSys, Logs::Detail, Logs::DataBuckets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0) } while (0)
#define LogZoning(message, ...) do {\
if (LogSys.IsLogEnabled(Logs::General, Logs::Zoning))\
OutF(LogSys, Logs::General, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0)
#define LogZoningDetail(message, ...) do {\
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Zoning))\
OutF(LogSys, Logs::Detail, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0)
#define Log(debug_level, log_category, message, ...) do {\ #define Log(debug_level, log_category, message, ...) do {\
if (LogSys.IsLogEnabled(debug_level, log_category))\ if (LogSys.IsLogEnabled(debug_level, log_category))\
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\

View File

@ -795,11 +795,29 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
client = client_list.FindCharacter(ztz->name); client = client_list.FindCharacter(ztz->name);
} }
LogInfo("ZoneToZone request for [{}] current zone [{}] req zone [{}]", ztz->name, ztz->current_zone_id, ztz->requested_zone_id); LogZoning(
"ZoneToZone request for client [{}] guild_id [{}] requested_zone [{}] requested_zone_id [{}] requested_instance_id [{}] current_zone [{}] current_zone_id [{}] current_instance_id [{}] response [{}] admin [{}] ignorerestrictions [{}]",
ztz->name,
ztz->guild_id,
ZoneName(ztz->requested_zone_id),
ztz->requested_zone_id,
ztz->requested_instance_id,
ZoneName(ztz->current_zone_id),
ztz->current_zone_id,
ztz->current_instance_id,
ztz->response,
ztz->admin,
ztz->ignorerestrictions
);
/* This is a request from the egress zone */ /* This is a request from the egress zone */
if (GetZoneID() == ztz->current_zone_id && GetInstanceID() == ztz->current_instance_id) { if (GetZoneID() == ztz->current_zone_id && GetInstanceID() == ztz->current_instance_id) {
LogInfo("Processing ZTZ for egress from zone for client [{}]", ztz->name); LogZoning(
"ZoneToZone request for client [{}] for egress from zone [{}]",
ztz->name,
ZoneName(ztz->current_zone_id),
ztz->current_zone_id
);
if ( if (
ztz->admin < AccountStatus::QuestTroupe && ztz->admin < AccountStatus::QuestTroupe &&
@ -807,6 +825,14 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
zoneserver_list.IsZoneLocked(ztz->requested_zone_id) zoneserver_list.IsZoneLocked(ztz->requested_zone_id)
) { ) {
ztz->response = 0; ztz->response = 0;
LogZoning(
"ZoneToZone request for client [{}] for egress from zone [{}] denied, zone is locked",
ztz->name,
ZoneName(ztz->current_zone_id),
ztz->current_zone_id
);
SendPacket(pack); SendPacket(pack);
break; break;
} }
@ -818,12 +844,25 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
); );
if (ingress_server) { if (ingress_server) {
LogInfo("Found a zone already booted for [{}]", ztz->name); LogZoning(
"Found a zone already booted for ZoneToZone for client [{}] for ingress_server from zone [{}] found booted zone",
ztz->name,
ZoneName(ztz->current_zone_id),
ztz->current_zone_id
);
ztz->response = 1; ztz->response = 1;
} else { } else {
int server_id; int server_id;
if ((server_id = zoneserver_list.TriggerBootup(ztz->requested_zone_id, ztz->requested_instance_id))) { if ((server_id = zoneserver_list.TriggerBootup(ztz->requested_zone_id, ztz->requested_instance_id))) {
LogInfo("Successfully booted a zone for [{}]", ztz->name); LogZoning(
"ZoneToZone successfully booted a zone for character [{}] zone [{}] ({}) instance [{}] ({})",
ztz->name,
ZoneName(ztz->requested_zone_id),
ztz->requested_zone_id,
ztz->requested_instance_id,
server_id
);
ztz->response = 1; ztz->response = 1;
ingress_server = zoneserver_list.FindByID(server_id); ingress_server = zoneserver_list.FindByID(server_id);
} else { } else {
@ -841,8 +880,8 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
ingress_server->SendPacket(pack); // inform target server ingress_server->SendPacket(pack); // inform target server
} }
} else { } else {
LogInfo( LogZoning(
"Processing ZTZ for ingress to zone for client [{}] instance_id [{}] zone_id [{}]", "Processing ZTZ for egress to zone for client [{}] instance_id [{}] zone_id [{}]",
ztz->name, ztz->name,
ztz->current_instance_id, ztz->current_instance_id,
ztz->current_zone_id ztz->current_zone_id
@ -854,7 +893,13 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
); );
if (egress_server) { if (egress_server) {
LogInfo("Found egress server, forwarding client"); LogZoning(
"Found egress server_id [{}] zone_id [{}] zone_name [{}] instance_id [{}], forwarding client",
egress_server->GetID(),
egress_server->GetZoneID(),
egress_server->GetZoneName(),
egress_server->GetInstanceID()
);
egress_server->SendPacket(pack); egress_server->SendPacket(pack);
} }
} }

View File

@ -11768,3 +11768,29 @@ void Client::ShowSpells(Client* c, ShowSpellType show_spell_type)
spell_table.c_str() spell_table.c_str()
); );
} }
std::string GetZoneModeString(ZoneMode mode)
{
switch (mode) {
case ZoneToSafeCoords:
return "ZoneToSafeCoords";
case GMSummon:
return "GMSummon";
case ZoneToBindPoint:
return "ZoneToBindPoint";
case ZoneSolicited:
return "ZoneSolicited";
case ZoneUnsolicited:
return "ZoneUnsolicited";
case GateToBindPoint:
return "GateToBindPoint";
case SummonPC:
return "SummonPC";
case Rewind:
return "Rewind";
case EvacToSafeCoords:
return "EvacToSafeCoords";
default:
return "Unknown";
}
}

View File

@ -123,6 +123,9 @@ typedef enum {
EvacToSafeCoords EvacToSafeCoords
} ZoneMode; } ZoneMode;
// translate above enum to a string
std::string GetZoneModeString(ZoneMode mode);
enum { enum {
HideCorpseNone = 0, HideCorpseNone = 0,
HideCorpseAll = 1, HideCorpseAll = 1,

View File

@ -355,8 +355,24 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break; break;
ZoneToZone_Struct* ztz = (ZoneToZone_Struct*)pack->pBuffer; ZoneToZone_Struct* ztz = (ZoneToZone_Struct*)pack->pBuffer;
if (ztz->current_zone_id == zone->GetZoneID() LogZoning(
&& ztz->current_instance_id == zone->GetInstanceID()) { "ZoneToZone client [{}] guild_id [{}] requested_zone [{}] requested_zone_id [{}] requested_instance_id [{}] current_zone [{}] current_zone_id [{}] current_instance_id [{}] response [{}] admin [{}] ignorerestrictions [{}]",
ztz->name,
ztz->guild_id,
ZoneName(ztz->requested_zone_id),
ztz->requested_zone_id,
ztz->requested_instance_id,
ZoneName(ztz->current_zone_id),
ztz->current_zone_id,
ztz->current_instance_id,
ztz->response,
ztz->admin,
ztz->ignorerestrictions
);
// the client was rejected by the world server
// zone was not ready for some reason
if (ztz->current_zone_id == zone->GetZoneID() && ztz->current_instance_id == zone->GetInstanceID()) {
// it's a response // it's a response
Entity* entity = entity_list.GetClientByName(ztz->name); Entity* entity = entity_list.GetClientByName(ztz->name);
if (entity == 0) if (entity == 0)
@ -371,6 +387,20 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
entity->CastToMob()->SetZone(ztz->current_zone_id, ztz->current_instance_id); entity->CastToMob()->SetZone(ztz->current_zone_id, ztz->current_instance_id);
entity->CastToClient()->SetZoning(false); entity->CastToClient()->SetZoning(false);
entity->CastToClient()->SetLockSavePosition(false); entity->CastToClient()->SetLockSavePosition(false);
LogZoning("ZoneToZone (ZoneNotReady) client [{}] guild_id [{}] requested_zone [{}] requested_zone_id [{}] requested_instance_id [{}] current_zone [{}] current_zone_id [{}] current_instance_id [{}] response [{}] admin [{}] ignorerestrictions [{}] ",
ztz->name,
ztz->guild_id,
ZoneName(ztz->requested_zone_id),
ztz->requested_zone_id,
ztz->requested_instance_id,
ZoneName(ztz->current_zone_id),
ztz->current_zone_id,
ztz->current_instance_id,
ztz->response,
ztz->admin,
ztz->ignorerestrictions
);
} }
else { else {
entity->CastToClient()->UpdateWho(1); entity->CastToClient()->UpdateWho(1);
@ -411,6 +441,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
} }
} }
} }
// the client was accepted by the world server
else { else {
// it's a request // it's a request
ztz->response = 0; ztz->response = 0;

View File

@ -4632,8 +4632,6 @@ void ZoneDatabase::SaveCharacterBinds(Client *c)
} }
} }
LogInfo("bind count is [{}]", bind_count);
// allocate memory for binds // allocate memory for binds
binds.reserve(bind_count); binds.reserve(bind_count);

View File

@ -55,6 +55,22 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
#endif #endif
auto* zc = (ZoneChange_Struct*)app->pBuffer; auto* zc = (ZoneChange_Struct*)app->pBuffer;
LogZoning(
"Client [{}] zoning to [{}] ({}) instance_id [{}] x [{}] y [{}] z [{}] zone_reason [{}] success [{}] zone_mode [{}] ({})",
GetCleanName(),
zc->char_name,
ZoneName(zc->zoneID),
zc->zoneID,
zc->instanceID,
zc->x,
zc->y,
zc->z,
zc->zone_reason,
zc->success,
GetZoneModeString(zone_mode),
zone_mode
);
uint16 target_zone_id = 0; uint16 target_zone_id = 0;
auto target_instance_id = zc->instanceID; auto target_instance_id = zc->instanceID;
ZonePoint* zone_point = nullptr; ZonePoint* zone_point = nullptr;
@ -132,6 +148,14 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
} }
if (target_instance_id) { if (target_instance_id) {
LogZoning(
"Client [{}] attempting zone to instance_id [{}] zone [{}] ({})",
GetCleanName(),
target_instance_id,
ZoneName(target_zone_id),
target_zone_id
);
//make sure we are in it and it's unexpired. //make sure we are in it and it's unexpired.
if (!database.VerifyInstanceAlive(target_instance_id, CharacterID())) { if (!database.VerifyInstanceAlive(target_instance_id, CharacterID())) {
Message( Message(
@ -185,7 +209,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
int16 min_status = AccountStatus::Player; int16 min_status = AccountStatus::Player;
uint8 min_level = 0; uint8 min_level = 0;
LogInfo("Loaded zone flag [{}]", zone_data->flag_needed); LogZoning("Loaded zone flag [{}]", zone_data->flag_needed);
safe_x = zone_data->safe_x; safe_x = zone_data->safe_x;
safe_y = zone_data->safe_y; safe_y = zone_data->safe_y;
@ -328,7 +352,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
meets_zone_expansion_check = true; meets_zone_expansion_check = true;
} }
LogInfo( LogZoning(
"Checking zone request [{}] for expansion [{}] ({}) success [{}]", "Checking zone request [{}] for expansion [{}] ({}) success [{}]",
target_zone_name, target_zone_name,
(content_service.GetCurrentExpansion()), (content_service.GetCurrentExpansion()),
@ -360,12 +384,41 @@ void Client::SendZoneCancel(ZoneChange_Struct *zc) {
EQApplicationPacket *outapp = nullptr; EQApplicationPacket *outapp = nullptr;
outapp = new EQApplicationPacket(OP_ZoneChange, sizeof(ZoneChange_Struct)); outapp = new EQApplicationPacket(OP_ZoneChange, sizeof(ZoneChange_Struct));
ZoneChange_Struct *zc2 = (ZoneChange_Struct*)outapp->pBuffer; ZoneChange_Struct *zc2 = (ZoneChange_Struct*)outapp->pBuffer;
LogZoning(
"(zs) Client [{}] char_name [{}] zoning to [{}] ({}) cancelled instance_id [{}] x [{}] y [{}] z [{}] zone_reason [{}] success [{}]",
GetCleanName(),
zc->char_name,
ZoneName(zc2->zoneID),
zc->zoneID,
zc->instanceID,
zc->x,
zc->y,
zc->z,
zc->zone_reason,
zc->success
);
strcpy(zc2->char_name, zc->char_name); strcpy(zc2->char_name, zc->char_name);
zc2->zoneID = zone->GetZoneID(); zc2->zoneID = zone->GetZoneID();
zc2->success = 1; zc2->success = 1;
outapp->priority = 6; outapp->priority = 6;
FastQueuePacket(&outapp); FastQueuePacket(&outapp);
LogZoning(
"(zc2) Client [{}] char_name [{}] zoning to [{}] ({}) cancelled instance_id [{}] x [{}] y [{}] z [{}] zone_reason [{}] success [{}]",
GetCleanName(),
zc2->char_name,
ZoneName(zc2->zoneID),
zc2->zoneID,
zc2->instanceID,
zc2->x,
zc2->y,
zc2->z,
zc2->zone_reason,
zc2->success
);
//reset to unsolicited. //reset to unsolicited.
zone_mode = ZoneUnsolicited; zone_mode = ZoneUnsolicited;
// reset since we're not zoning anymore // reset since we're not zoning anymore
@ -387,6 +440,20 @@ void Client::SendZoneError(ZoneChange_Struct *zc, int8 err)
outapp->priority = 6; outapp->priority = 6;
FastQueuePacket(&outapp); FastQueuePacket(&outapp);
LogZoning(
"Client [{}] char_name [{}] zoning to [{}] ({}) (error) instance_id [{}] x [{}] y [{}] z [{}] zone_reason [{}] success [{}]",
GetCleanName(),
zc2->char_name,
ZoneName(zc2->zoneID),
zc2->zoneID,
zc2->instanceID,
zc2->x,
zc2->y,
zc2->z,
zc2->zone_reason,
zc2->success
);
//reset to unsolicited. //reset to unsolicited.
zone_mode = ZoneUnsolicited; zone_mode = ZoneUnsolicited;
// reset since we're not zoning anymore // reset since we're not zoning anymore
@ -423,15 +490,18 @@ void Client::DoZoneSuccess(ZoneChange_Struct *zc, uint16 zone_id, uint32 instanc
} }
} }
LogInfo( LogZoning(
"Zoning [{}] to: [{}] ([{}]) - ([{}]) x [{}] y [{}] z [{}]", "Client [{}] char_name [{}] zoning to [{}] ({}) instance_id [{}] x [{}] y [{}] z [{}] zone_reason [{}] success [{}]",
m_pp.name, GetCleanName(),
zc->char_name,
ZoneName(zone_id), ZoneName(zone_id),
zone_id, zone_id,
instance_id, instance_id,
dest_x, dest_x,
dest_y, dest_y,
dest_z dest_z,
zc->zone_reason,
zc->success
); );
//set the player's coordinates in the new zone so they have them //set the player's coordinates in the new zone so they have them