diff --git a/common/features.h b/common/features.h index 757eb8dd4..195d825dc 100644 --- a/common/features.h +++ b/common/features.h @@ -238,25 +238,6 @@ enum { //some random constants // Timer to update aggrometer #define AGGRO_METER_UPDATE_MS 1000 -//Some hard coded statuses from commands and other places: -enum { - minStatusToBeGM = 40, - minStatusToUseGMCommands = 80, - minStatusToKick = 150, - minStatusToAvoidFalling = 100, - minStatusToIgnoreZoneFlags = 80, - minStatusToSeeOthersZoneFlags = 80, - minStatusToEditOtherGuilds = 80, - commandMovecharSelfOnly = 80, //below this == only self move allowed - commandMovecharToSpecials = 200, //ability to send people to cshom/load zones - commandCastSpecials = 100, //can cast special spells - commandDoAnimOthers = 100, //can #doanim on others - commandEditPlayerCorpses = 150, //can Edit Player Corpses - commandInterrogateInv = 100, //below this == only log on error state and self-only target dump - commandInvSnapshot = 150 //ability to clear/restore snapshots -}; - - // This is the item ID we use for say links, we use the max that fits in 5 ASCII chars #define SAYLINK_ITEM_ID 0xFFFFF diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 34937aa1d..b2911a9c6 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1385,10 +1385,6 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) InitInnates(); - /* If GM not set in DB, and does not meet min status to be GM, reset */ - if (m_pp.gm && admin < minStatusToBeGM) - m_pp.gm = 0; - /* Load Guild */ if (!IsInAGuild()) { m_pp.guild_id = GUILD_NONE; @@ -1702,8 +1698,9 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) this is not quite where live sends inventory, they do it after tribute */ if (loaditems) { /* Don't load if a length error occurs */ - if (admin >= minStatusToBeGM) + if (m_pp.gm) { m_inv.SetGMInventory(true); // set to true to allow expansion-restricted packets through + } BulkSendInventoryItems(); /* Send stuff on the cursor which isn't sent in bulk */ @@ -6238,7 +6235,7 @@ void Client::Handle_OP_EnvDamage(const EQApplicationPacket *app) damage = 31337; } - if (admin >= minStatusToAvoidFalling && GetGM()) { + if (GetGM()) { Message( Chat::Red, fmt::format( @@ -6446,84 +6443,90 @@ void Client::Handle_OP_GetGuildsList(const EQApplicationPacket *app) void Client::Handle_OP_GMBecomeNPC(const EQApplicationPacket *app) { - if (Admin() < minStatusToUseGMCommands) { + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /becomenpc when they shouldn't be able to"}); return; } + if (app->size != sizeof(BecomeNPC_Struct)) { LogError("Wrong size: OP_GMBecomeNPC, size=[{}], expected [{}]", app->size, sizeof(BecomeNPC_Struct)); return; } - //entity_list.QueueClients(this, app, false); - BecomeNPC_Struct* bnpc = (BecomeNPC_Struct*)app->pBuffer; - Mob* cli = (Mob*)entity_list.GetMob(bnpc->id); - if (cli == nullptr) { + auto *b = (BecomeNPC_Struct *) app->pBuffer; + + Mob *m = entity_list.GetMob(b->id); + if (!m) { return; } - if (cli->IsClient()) { - Client* target = cli->CastToClient(); - target->QueuePacket(app); - if(target->GetGM()) { - target->SetInvul(false); - target->SetHideMe(false); - target->SetGM(false); + if (m->IsClient()) { + Client *t = m->CastToClient(); + t->QueuePacket(app); + if (t->GetGM()) { + t->SetInvul(false); + t->SetHideMe(false); + t->SetGM(false); } - cli->SendAppearancePacket(AT_NPCName, 1, true); - target->SetBecomeNPC(true); - target->SetBecomeNPCLevel(bnpc->maxlevel); - cli->MessageString(Chat::White, TOGGLE_OFF); - target->tellsoff = true; - target->UpdateWho(); + m->SendAppearancePacket(AT_NPCName, 1, true); + t->SetBecomeNPC(true); + t->SetBecomeNPCLevel(b->maxlevel); + m->MessageString(Chat::White, TOGGLE_OFF); + t->tellsoff = true; + t->UpdateWho(); } - return; } void Client::Handle_OP_GMDelCorpse(const EQApplicationPacket *app) { - if (app->size != sizeof(GMDelCorpse_Struct)) + if (app->size != sizeof(GMDelCorpse_Struct)) { return; - if (Admin() < commandEditPlayerCorpses) { + } + + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /delcorpse"}); return; } - GMDelCorpse_Struct* dc = (GMDelCorpse_Struct *)app->pBuffer; - Mob* corpse = entity_list.GetMob(dc->corpsename); - if (corpse == 0) { + + auto *c = (GMDelCorpse_Struct *) app->pBuffer; + Mob *corpse = entity_list.GetMob(c->corpsename); + if (!c) { return; } - if (corpse->IsCorpse() != true) { + + if (!corpse->IsCorpse()) { return; } + corpse->CastToCorpse()->Delete(); - std::cout << name << " deleted corpse " << dc->corpsename << std::endl; - Message(Chat::Red, "Corpse %s deleted.", dc->corpsename); - return; + Message(Chat::Red, fmt::format("Corpse {} deleted.", c->corpsename).c_str()); } void Client::Handle_OP_GMEmoteZone(const EQApplicationPacket *app) { - if (Admin() < minStatusToUseGMCommands) { - Message(Chat::Red, "Your account has been reported for hacking."); - return; - } if (app->size != sizeof(GMEmoteZone_Struct)) { LogError("Wrong size: OP_GMEmoteZone, size=[{}], expected [{}]", app->size, sizeof(GMEmoteZone_Struct)); return; } - GMEmoteZone_Struct* gmez = (GMEmoteZone_Struct*)app->pBuffer; - char* newmessage = nullptr; - if (strstr(gmez->text, "^") == 0) - entity_list.Message(Chat::White, 15, gmez->text); - else { - for (newmessage = strtok((char*)gmez->text, "^"); newmessage != nullptr; newmessage = strtok(nullptr, "^")) - entity_list.Message(Chat::White, 15, newmessage); + + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /emote"}); + return; + } + + auto *gmez = (GMEmoteZone_Struct*)app->pBuffer; + char *newmessage = nullptr; + if (strstr(gmez->text, "^") == 0) { + entity_list.Message(0, Chat::White, gmez->text); + } else { + for (newmessage = strtok((char *) gmez->text, "^"); newmessage != nullptr; newmessage = strtok(nullptr, "^")) { + entity_list.Message(0, Chat::White, newmessage); + } } - return; } void Client::Handle_OP_GMEndTraining(const EQApplicationPacket *app) @@ -6533,154 +6536,149 @@ void Client::Handle_OP_GMEndTraining(const EQApplicationPacket *app) DumpPacket(app); return; } + OPGMEndTraining(app); - return; } void Client::Handle_OP_GMFind(const EQApplicationPacket *app) { - if (Admin() < minStatusToUseGMCommands) { - Message(Chat::Red, "Your account has been reported for hacking."); - RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /find"}); - return; - } - if (app->size != sizeof(GMFind_Struct)) { LogError("Wrong size: OP_GMFind, size=[{}], expected [{}]", app->size, sizeof(GMFind_Struct)); return; } - //Break down incoming - auto* request = (GMFind_Struct*) app->pBuffer; - //Create a new outgoing - auto outapp = new EQApplicationPacket(OP_GMFind, sizeof(GMFind_Struct)); - auto* foundplayer = (GMFind_Struct*) outapp->pBuffer; - //Copy the constants - strcpy(foundplayer->charname, request->charname); - strcpy(foundplayer->gmname, request->gmname); - //Check if the NPC exits intrazone... - auto* gt = entity_list.GetMob(request->charname); - if (gt) { - foundplayer->success = 1; - foundplayer->x = gt->GetX(); - foundplayer->y = gt->GetY(); - foundplayer->z = gt->GetZ(); - foundplayer->zoneID = zone->GetZoneID(); + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /find"}); + return; } - //Send the packet... + + auto *r = (GMFind_Struct *) app->pBuffer; + auto outapp = new EQApplicationPacket(OP_GMFind, sizeof(GMFind_Struct)); + auto *f = (GMFind_Struct *) outapp->pBuffer; + + strcpy(f->charname, r->charname); + strcpy(f->gmname, r->gmname); + + auto* gt = entity_list.GetMob(r->charname); + if (gt) { + f->success = 1; + f->x = gt->GetX(); + f->y = gt->GetY(); + f->z = gt->GetZ(); + f->zoneID = zone->GetZoneID(); + } + FastQueuePacket(&outapp); - return; } void Client::Handle_OP_GMGoto(const EQApplicationPacket *app) { if (app->size != sizeof(GMSummon_Struct)) { - std::cout << "Wrong size on OP_GMGoto. Got: " << app->size << ", Expected: " << sizeof(GMSummon_Struct) << std::endl; + LogError("Wrong size: OP_GMGoto, size=[{}], expected [{}]", app->size, sizeof(GMSummon_Struct)); return; } - if (Admin() < minStatusToUseGMCommands) { + + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /goto"}); return; } - GMSummon_Struct* gmg = (GMSummon_Struct*)app->pBuffer; - Mob* gt = entity_list.GetMob(gmg->charname); - if (gt != nullptr) { + + auto *gmg = (GMSummon_Struct *) app->pBuffer; + Mob *gt = entity_list.GetMob(gmg->charname); + if (!gt) { MovePC(zone->GetZoneID(), zone->GetInstanceID(), gt->GetX(), gt->GetY(), gt->GetZ(), gt->GetHeading()); - } - else if (!worldserver.Connected()) + } else if (!worldserver.Connected()) { Message(Chat::Red, "Error: World server disconnected."); - else { + } else { auto pack = new ServerPacket(ServerOP_GMGoto, sizeof(ServerGMGoto_Struct)); memset(pack->pBuffer, 0, pack->size); - ServerGMGoto_Struct* wsgmg = (ServerGMGoto_Struct*)pack->pBuffer; + ServerGMGoto_Struct *wsgmg = (ServerGMGoto_Struct *) pack->pBuffer; strcpy(wsgmg->myname, GetName()); strcpy(wsgmg->gotoname, gmg->charname); wsgmg->admin = admin; worldserver.SendPacket(pack); safe_delete(pack); } - return; } void Client::Handle_OP_GMHideMe(const EQApplicationPacket *app) { - if (Admin() < minStatusToUseGMCommands) { - Message(Chat::Red, "Your account has been reported for hacking."); - RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /hideme"}); - return; - } if (app->size != sizeof(SpawnAppearance_Struct)) { LogError("Wrong size: OP_GMHideMe, size=[{}], expected [{}]", app->size, sizeof(SpawnAppearance_Struct)); return; } - SpawnAppearance_Struct* sa = (SpawnAppearance_Struct*)app->pBuffer; - Message(Chat::Red, "#: %i, %i", sa->type, sa->parameter); - SetHideMe(!sa->parameter); - return; + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /hideme"}); + return; + } + + auto *sa = (SpawnAppearance_Struct *) app->pBuffer; + SetHideMe(!sa->parameter); } void Client::Handle_OP_GMKick(const EQApplicationPacket *app) { - if (app->size != sizeof(GMKick_Struct)) + if (app->size != sizeof(GMKick_Struct)) { return; - if (Admin() < minStatusToKick) { + } + + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /kick"}); return; } - GMKick_Struct* gmk = (GMKick_Struct *)app->pBuffer; - Client* client = entity_list.GetClientByName(gmk->name); - if (client == 0) { - if (!worldserver.Connected()) + auto *gmk = (GMKick_Struct *)app->pBuffer; + Client *c = entity_list.GetClientByName(gmk->name); + if (!c) { + if (!worldserver.Connected()) { Message(Chat::Red, "Error: World server disconnected"); - else { + } else { auto pack = new ServerPacket(ServerOP_KickPlayer, sizeof(ServerKickPlayer_Struct)); - ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*)pack->pBuffer; + auto *skp = (ServerKickPlayer_Struct *) pack->pBuffer; strcpy(skp->adminname, gmk->gmname); strcpy(skp->name, gmk->name); skp->adminrank = Admin(); worldserver.SendPacket(pack); safe_delete(pack); } - } - else { + } else { entity_list.QueueClients(this, app); - //client->Kick(); } - return; } void Client::Handle_OP_GMKill(const EQApplicationPacket *app) { - if (Admin() < minStatusToUseGMCommands) { - Message(Chat::Red, "Your account has been reported for hacking."); - RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /kill"}); - return; - } if (app->size != sizeof(GMKill_Struct)) { LogError("Wrong size: OP_GMKill, size=[{}], expected [{}]", app->size, sizeof(GMKill_Struct)); return; } - GMKill_Struct* gmk = (GMKill_Struct *)app->pBuffer; - Mob* obj = entity_list.GetMob(gmk->name); - Client* client = entity_list.GetClientByName(gmk->name); - if (obj != 0) { - if (client != 0) { + + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /kill"}); + return; + } + + auto *gmk = (GMKill_Struct *) app->pBuffer; + Mob *obj = entity_list.GetMob(gmk->name); + Client *c = entity_list.GetClientByName(gmk->name); + if (obj) { + if (c) { entity_list.QueueClients(this, app); - } - else { + } else { obj->Kill(); } - } - else { - if (!worldserver.Connected()) + } else { + if (!worldserver.Connected()) { Message(Chat::Red, "Error: World server disconnected"); - else { + } else { auto pack = new ServerPacket(ServerOP_KillPlayer, sizeof(ServerKillPlayer_Struct)); - ServerKillPlayer_Struct* skp = (ServerKillPlayer_Struct*)pack->pBuffer; + auto *skp = (ServerKillPlayer_Struct *) pack->pBuffer; strcpy(skp->gmname, gmk->gmname); strcpy(skp->target, gmk->name); skp->admin = Admin(); @@ -6688,7 +6686,6 @@ void Client::Handle_OP_GMKill(const EQApplicationPacket *app) safe_delete(pack); } } - return; } void Client::Handle_OP_GMLastName(const EQApplicationPacket *app) @@ -6697,32 +6694,30 @@ void Client::Handle_OP_GMLastName(const EQApplicationPacket *app) std::cout << "Wrong size on OP_GMLastName. Got: " << app->size << ", Expected: " << sizeof(GMLastName_Struct) << std::endl; return; } - GMLastName_Struct* gmln = (GMLastName_Struct*)app->pBuffer; - if (strlen(gmln->lastname) >= 64) { - Message(Chat::Red, "/LastName: New last name too long. (max=63)"); - } - else { - Client* client = entity_list.GetClientByName(gmln->name); - if (client == 0) { - Message(Chat::Red, "/LastName: %s not found", gmln->name); - } - else { - if (Admin() < minStatusToUseGMCommands) { - Message(Chat::Red, "Your account has been reported for hacking."); - RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /lastname"}); - return; - } - else - client->ChangeLastName(gmln->lastname); + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /lastname"}); + return; + } + + auto *gmln = (GMLastName_Struct *) app->pBuffer; + if (strlen(gmln->lastname) >= 64) { + Message(Chat::Red, "/LastName: New last name too long. Max length is 63."); + } else { + Client *c = entity_list.GetClientByName(gmln->name); + if (!c) { + Message(Chat::Red, fmt::format("/LastName: {} not found", gmln->name).c_str()); + } else { + c->ChangeLastName(gmln->lastname); } + gmln->unknown[0] = 1; gmln->unknown[1] = 1; gmln->unknown[2] = 1; gmln->unknown[3] = 1; entity_list.QueueClients(this, app, false); } - return; } void Client::Handle_OP_GMNameChange(const EQApplicationPacket *app) @@ -6731,44 +6726,49 @@ void Client::Handle_OP_GMNameChange(const EQApplicationPacket *app) LogError("Wrong size: OP_GMNameChange, size=[{}], expected [{}]", app->size, sizeof(GMName_Struct)); return; } - const GMName_Struct* gmn = (const GMName_Struct *)app->pBuffer; - if (Admin() < minStatusToUseGMCommands) { + + auto *gmn = (GMName_Struct *) app->pBuffer; + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /name"}); return; } - Client* client = entity_list.GetClientByName(gmn->oldname); - LogInfo("GM([{}]) changeing players name. Old:[{}] New:[{}]", GetName(), gmn->oldname, gmn->newname); - bool usedname = database.CheckUsedName(gmn->newname); - if (client == 0) { - Message(Chat::Red, "%s not found for name change. Operation failed!", gmn->oldname); - return; - } - if ((strlen(gmn->newname) > 63) || (strlen(gmn->newname) == 0)) { - Message(Chat::Red, "Invalid number of characters in new name (%s).", gmn->newname); - return; - } - if (!usedname) { - Message(Chat::Red, "%s is already in use. Operation failed!", gmn->newname); - return; + Client *c = entity_list.GetClientByName(gmn->oldname); + LogInfo("GM([{}]) changeing players name. Old:[{}] New:[{}]", GetName(), gmn->oldname, gmn->newname); + + const bool used_name = database.CheckUsedName(gmn->newname); + if (!c) { + Message(Chat::Red, fmt::format("{} not found for name change. Operation failed!", gmn->oldname).c_str()); + return; } + + if (strlen(gmn->newname) > 63 || strlen(gmn->newname) == 0) { + Message(Chat::Red, fmt::format("Invalid number of characters in new name '{}'.", gmn->newname).c_str()); + return; + } + + if (!used_name) { + Message(Chat::Red, fmt::format("{} is already in use. Operation failed!", gmn->newname).c_str()); + return; + } + database.UpdateName(gmn->oldname, gmn->newname); - strcpy(client->name, gmn->newname); - client->Save(); + strcpy(c->name, gmn->newname); + c->Save(); if (gmn->badname == 1) { database.AddToNameFilter(gmn->oldname); } - EQApplicationPacket* outapp = app->Copy(); - GMName_Struct* gmn2 = (GMName_Struct*)outapp->pBuffer; + + auto *outapp = app->Copy(); + auto *gmn2 = (GMName_Struct *) outapp->pBuffer; gmn2->unknown[0] = 1; gmn2->unknown[1] = 1; gmn2->unknown[2] = 1; entity_list.QueueClients(this, outapp, false); safe_delete(outapp); UpdateWho(); - return; } void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app) @@ -6863,6 +6863,13 @@ void Client::Handle_OP_GMSummon(const EQApplicationPacket *app) std::cout << "Wrong size on OP_GMSummon. Got: " << app->size << ", Expected: " << sizeof(GMSummon_Struct) << std::endl; return; } + + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /summon"}); + return; + } + OPGMSummon(app); return; } @@ -6873,12 +6880,14 @@ void Client::Handle_OP_GMToggle(const EQApplicationPacket *app) std::cout << "Wrong size on OP_GMToggle. Got: " << app->size << ", Expected: " << sizeof(GMToggle_Struct) << std::endl; return; } - if (Admin() < minStatusToUseGMCommands) { + + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /toggle"}); return; } - GMToggle_Struct *ts = (GMToggle_Struct *)app->pBuffer; + + auto *ts = (GMToggle_Struct *)app->pBuffer; if (ts->toggle == 0) { MessageString(Chat::White, TOGGLE_OFF); tellsoff = true; @@ -6886,10 +6895,10 @@ void Client::Handle_OP_GMToggle(const EQApplicationPacket *app) MessageString(Chat::White, TOGGLE_ON); tellsoff = false; } else { - Message(Chat::White, "Unkown value in /toggle packet"); + Message(Chat::White, "Unknown value in /toggle packet."); } + UpdateWho(); - return; } void Client::Handle_OP_GMTraining(const EQApplicationPacket *app) @@ -6899,6 +6908,7 @@ void Client::Handle_OP_GMTraining(const EQApplicationPacket *app) DumpPacket(app); return; } + OPGMTraining(app); return; } @@ -6910,6 +6920,7 @@ void Client::Handle_OP_GMTrainSkill(const EQApplicationPacket *app) DumpPacket(app); return; } + OPGMTrainSkill(app); return; } @@ -6920,27 +6931,30 @@ void Client::Handle_OP_GMZoneRequest(const EQApplicationPacket *app) std::cout << "Wrong size on OP_GMZoneRequest. Got: " << app->size << ", Expected: " << sizeof(GMZoneRequest_Struct) << std::endl; return; } - if (Admin() < minStatusToBeGM) { + + if (!GetGM()) { Message(Chat::Red, "Your account has been reported for hacking."); RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /zone"}); return; } - auto* gmzr = (GMZoneRequest_Struct*)app->pBuffer; + auto *gmzr = (GMZoneRequest_Struct *) app->pBuffer; float target_x = -1, target_y = -1, target_z = -1, target_heading; - int16 min_status = AccountStatus::Player; - uint8 min_level = 0; - char target_zone[32]; - uint16 zone_id = gmzr->zone_id; - if (gmzr->zone_id == 0) + int16 min_status = AccountStatus::Player; + uint8 min_level = 0; + char target_zone[32]; + uint16 zone_id = gmzr->zone_id; + if (gmzr->zone_id == 0) { zone_id = zonesummon_id; + } - const char* zone_short_name = ZoneName(zone_id); - if (zone_short_name == nullptr) + const char *zone_short_name = ZoneName(zone_id); + if (zone_short_name == nullptr) { target_zone[0] = 0; - else + } else { strcpy(target_zone, zone_short_name); + } // this both loads the safe points and does a sanity check on zone name auto z = GetZone(target_zone, 0); @@ -6954,41 +6968,40 @@ void Client::Handle_OP_GMZoneRequest(const EQApplicationPacket *app) } auto outapp = new EQApplicationPacket(OP_GMZoneRequest, sizeof(GMZoneRequest_Struct)); - auto* gmzr2 = (GMZoneRequest_Struct*)outapp->pBuffer; + auto *gmzr2 = (GMZoneRequest_Struct *) outapp->pBuffer; strcpy(gmzr2->charname, GetName()); gmzr2->zone_id = gmzr->zone_id; - gmzr2->x = target_x; - gmzr2->y = target_y; - gmzr2->z = target_z; + gmzr2->x = target_x; + gmzr2->y = target_y; + gmzr2->z = target_z; gmzr2->heading = target_heading; - // Next line stolen from ZoneChange as well... - This gives us a nicer message than the normal "zone is down" message... - if (target_zone[0] != 0 && admin >= min_status && GetLevel() >= min_level) + + if (target_zone[0] != 0 && admin >= min_status && GetLevel() >= min_level) { gmzr2->success = 1; - else { - std::cout << "GetZoneSafeCoords failed. zoneid = " << gmzr->zone_id << "; czone = " << zone->GetZoneID() << std::endl; + } else { + LogError("GetZoneSafeCoords failed. Zone ID [{}] Current Zone [{}]", gmzr->zone_id, zone->GetZoneID()); gmzr2->success = 0; } QueuePacket(outapp); safe_delete(outapp); - return; } void Client::Handle_OP_GMZoneRequest2(const EQApplicationPacket *app) { - if (Admin() < minStatusToBeGM) { - Message(Chat::Red, "Your account has been reported for hacking."); - RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /zone"}); - return; - } if (app->size < sizeof(uint32)) { LogError("OP size error: OP_GMZoneRequest2 expected:[{}] got:[{}]", sizeof(uint32), app->size); return; } + if (!GetGM()) { + Message(Chat::Red, "Your account has been reported for hacking."); + RecordPlayerEventLog(PlayerEvent::POSSIBLE_HACK, PlayerEvent::PossibleHackEvent{.message = "Used /zone"}); + return; + } + uint32 zonereq = *((uint32 *)app->pBuffer); GoToSafeCoords(zonereq, 0); - return; } void Client::Handle_OP_GroupAcknowledge(const EQApplicationPacket *app) diff --git a/zone/doors.cpp b/zone/doors.cpp index 70ae6671a..98cbccb06 100644 --- a/zone/doors.cpp +++ b/zone/doors.cpp @@ -277,7 +277,7 @@ void Doors::HandleClick(Client *sender, uint8 trigger) // enforce flags before they hit zoning process auto z = GetZone(m_destination_zone_name, 0); if (z && !z->flag_needed.empty() && Strings::IsNumber(z->flag_needed) && Strings::ToInt(z->flag_needed) == 1) { - if (sender->Admin() < minStatusToIgnoreZoneFlags && !sender->HasZoneFlag(z->zoneidnumber)) { + if (!sender->GetGM() && !sender->HasZoneFlag(z->zoneidnumber)) { LogInfo( "Character [{}] does not have the flag to be in this zone [{}]!", sender->GetCleanName(), diff --git a/zone/gm_commands/castspell.cpp b/zone/gm_commands/castspell.cpp index fe119fc9b..47597c19a 100755 --- a/zone/gm_commands/castspell.cpp +++ b/zone/gm_commands/castspell.cpp @@ -23,10 +23,7 @@ void command_castspell(Client *c, const Seperator *sep) const uint16 spell_id = Strings::ToUnsignedInt(sep->arg[1]); - if (IsCastRestrictedSpell(spell_id) && c->Admin() < commandCastSpecials) { - c->Message(Chat::White, "Unable to cast spell."); - return; - } else if (spell_id >= SPDAT_RECORDS) { + if (spell_id >= SPDAT_RECORDS) { c->Message(Chat::White, "Invalid Spell ID."); return; } diff --git a/zone/gm_commands/corpse.cpp b/zone/gm_commands/corpse.cpp index 2c3eae8b3..14f914c7d 100755 --- a/zone/gm_commands/corpse.cpp +++ b/zone/gm_commands/corpse.cpp @@ -9,18 +9,22 @@ void command_corpse(Client *c, const Seperator *sep) c->Message(Chat::White, "Usage: #corpse deletenpccorpses - Deletes all NPC corpses"); c->Message(Chat::White, "Usage: #corpse inspectloot - Inspects the loot on a corpse"); c->Message(Chat::White, "Usage: #corpse listnpc - Lists all NPC corpses"); - c->Message(Chat::White, "Usage: #corpse lock - Locks the corpse, only GMs can loot the corpse when it is locked"); + c->Message( + Chat::White, + "Usage: #corpse lock - Locks the corpse, only GMs can loot the corpse when it is locked" + ); c->Message(Chat::White, "Usage: #corpse removecash - Removes the cash from a corpse"); c->Message(Chat::White, "Usage: #corpse unlock - Unlocks the corpses, allowing non-GMs to loot the corpse"); - if (c->Admin() >= commandEditPlayerCorpses) { - c->Message(Chat::White, "Usage: #corpse charid [Character ID] - Change player corpse's owner"); - c->Message(Chat::White, "Usage: #corpse deleteplayercorpses - Deletes all player corpses"); - c->Message(Chat::White, "Usage: #corpse depop [Bury] - Depops single target corpse."); - c->Message(Chat::White, "Usage: #corpse depopall [Bury] - Depops all target player's corpses."); - c->Message(Chat::White, "Usage: #corpse listplayer - Lists all player corpses"); - c->Message(Chat::White, "Usage: #corpse moveallgraveyard - Moves all player corpses to the current zone's graveyard or non-instance"); - c->Message(Chat::White, "Note: Set bury to 0 to skip burying the corpses."); - } + c->Message(Chat::White, "Usage: #corpse charid [Character ID] - Change player corpse's owner"); + c->Message(Chat::White, "Usage: #corpse deleteplayercorpses - Deletes all player corpses"); + c->Message(Chat::White, "Usage: #corpse depop [Bury] - Depops single target corpse."); + c->Message(Chat::White, "Usage: #corpse depopall [Bury] - Depops all target player's corpses."); + c->Message(Chat::White, "Usage: #corpse listplayer - Lists all player corpses"); + c->Message( + Chat::White, + "Usage: #corpse moveallgraveyard - Moves all player corpses to the current zone's graveyard or non-instance" + ); + c->Message(Chat::White, "Note: Set bury to 0 to skip burying the corpses."); return; } @@ -59,72 +63,57 @@ void command_corpse(Client *c, const Seperator *sep) c->Message(Chat::White, "Usage: #corpse deletenpccorpses - Deletes all NPC corpses"); c->Message(Chat::White, "Usage: #corpse inspectloot - Inspects the loot on a corpse"); c->Message(Chat::White, "Usage: #corpse listnpc - Lists all NPC corpses"); - c->Message(Chat::White, "Usage: #corpse lock - Locks the corpse, only GMs can loot the corpse when it is locked"); + c->Message( + Chat::White, + "Usage: #corpse lock - Locks the corpse, only GMs can loot the corpse when it is locked" + ); c->Message(Chat::White, "Usage: #corpse removecash - Removes the cash from a corpse"); c->Message(Chat::White, "Usage: #corpse unlock - Unlocks the corpses, allowing non-GMs to loot the corpse"); - if (c->Admin() >= commandEditPlayerCorpses) { - c->Message(Chat::White, "Usage: #corpse charid [Character ID] - Change player corpse's owner"); - c->Message(Chat::White, "Usage: #corpse deleteplayercorpses - Deletes all player corpses"); - c->Message(Chat::White, "Usage: #corpse depop [Bury] - Depops single target corpse."); - c->Message(Chat::White, "Usage: #corpse depopall [Bury] - Depops all target player's corpses."); - c->Message(Chat::White, "Usage: #corpse listplayer - Lists all player corpses"); - c->Message(Chat::White, "Usage: #corpse moveallgraveyard - Moves all player corpses to the current zone's graveyard or non-instance"); - c->Message(Chat::White, "Note: Set bury to 0 to skip burying the corpses."); - } + c->Message(Chat::White, "Usage: #corpse charid [Character ID] - Change player corpse's owner"); + c->Message(Chat::White, "Usage: #corpse deleteplayercorpses - Deletes all player corpses"); + c->Message(Chat::White, "Usage: #corpse depop [Bury] - Depops single target corpse."); + c->Message(Chat::White, "Usage: #corpse depopall [Bury] - Depops all target player's corpses."); + c->Message(Chat::White, "Usage: #corpse listplayer - Lists all player corpses"); + c->Message( + Chat::White, + "Usage: #corpse moveallgraveyard - Moves all player corpses to the current zone's graveyard or non-instance" + ); + c->Message(Chat::White, "Note: Set bury to 0 to skip burying the corpses."); return; } if (is_delete_player_corpses) { - if (c->Admin() >= commandEditPlayerCorpses) { - auto corpses_deleted = entity_list.DeletePlayerCorpses(); - auto deleted_string = ( - corpses_deleted ? - fmt::format( - "{} Player corpse{} deleted.", - corpses_deleted, - corpses_deleted != 1 ? "s" : "" - ) : - "There are no player corpses to delete." - ); - c->Message(Chat::White, deleted_string.c_str()); - } else { - c->Message(Chat::White, "Your status is not high enough to delete player corpses."); - return; - } + auto corpses_deleted = entity_list.DeletePlayerCorpses(); + auto deleted_string = ( + corpses_deleted ? + fmt::format( + "{} Player corpse{} deleted.", + corpses_deleted, + corpses_deleted != 1 ? "s" : "" + ) : + "There are no player corpses to delete." + ); + c->Message(Chat::White, deleted_string.c_str()); } else if (is_delete) { if (!target || !target->IsCorpse()) { c->Message(Chat::White, "You must target a corpse to use this command."); return; } - if (target->IsPlayerCorpse() && c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to delete a player corpse."); - return; - } + c->Message( + Chat::White, + fmt::format( + "Deleting {} corpse {}.", + target->IsNPCCorpse() ? "NPC" : "player", + c->GetTargetDescription(target) + ).c_str() + ); - if ( - target->IsNPCCorpse() || - c->Admin() >= commandEditPlayerCorpses - ) { - c->Message( - Chat::White, - fmt::format( - "Deleting {} corpse {}.", - target->IsNPCCorpse() ? "NPC" : "player", - c->GetTargetDescription(target) - ).c_str() - ); - target->CastToCorpse()->Delete(); - } + target->CastToCorpse()->Delete(); } else if (is_list_npc) { entity_list.ListNPCCorpses(c); } else if (is_list_player) { - if (c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to list player corpses."); - return; - } - entity_list.ListPlayerCorpses(c); } else if (is_delete_npc_corpses) { auto corpses_deleted = entity_list.DeleteNPCCorpses(); @@ -139,42 +128,32 @@ void command_corpse(Client *c, const Seperator *sep) ); c->Message(Chat::White, deleted_string.c_str()); } else if (is_character_id) { - if (c->Admin() >= commandEditPlayerCorpses) { - if (!target || !target->IsPlayerCorpse()) { - c->Message(Chat::White, "You must target a player corpse to use this command."); - return; - } - - if (!sep->IsNumber(2)) { - c->Message(Chat::White, "Usage: #corpse charid [Character ID] - Change player corpse's owner"); - return; - } - - auto character_id = Strings::ToInt(sep->arg[2]); - c->Message( - Chat::White, - fmt::format( - "Setting the owner to {} ({}) for the player corpse {}.", - database.GetCharNameByID(character_id), - target->CastToCorpse()->SetCharID(character_id), - c->GetTargetDescription(target) - ).c_str() - ); - } else { - c->Message(Chat::White, "Your status is not high enough to modify a player corpse's owner."); + if (!target || !target->IsPlayerCorpse()) { + c->Message(Chat::White, "You must target a player corpse to use this command."); return; } + + if (!sep->IsNumber(2)) { + c->Message(Chat::White, "Usage: #corpse charid [Character ID] - Change player corpse's owner"); + return; + } + + const uint32 character_id = Strings::ToUnsignedInt(sep->arg[2]); + c->Message( + Chat::White, + fmt::format( + "Setting the owner to {} ({}) for the player corpse {}.", + database.GetCharNameByID(character_id), + target->CastToCorpse()->SetCharID(character_id), + c->GetTargetDescription(target) + ).c_str() + ); } else if (is_reset_looter) { if (!target || !target->IsCorpse()) { c->Message(Chat::White, "You must target a corpse to use this command."); return; } - if (target->IsPlayerCorpse() && c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to reset looter on a player corpse."); - return; - } - target->CastToCorpse()->ResetLooter(); c->Message( Chat::White, @@ -190,36 +169,22 @@ void command_corpse(Client *c, const Seperator *sep) return; } - if (target->IsPlayerCorpse() && c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to remove cash from a player corpse."); - return; - } + target->CastToCorpse()->RemoveCash(); - if ( - target->IsNPCCorpse() || - c->Admin() >= commandEditPlayerCorpses - ) { - target->CastToCorpse()->RemoveCash(); - c->Message( - Chat::White, - fmt::format( - "Removed cash from {} corpse {}.", - target->IsNPCCorpse() ? "NPC" : "player", - c->GetTargetDescription(target) - ).c_str() - ); - } + c->Message( + Chat::White, + fmt::format( + "Removed cash from {} corpse {}.", + target->IsNPCCorpse() ? "NPC" : "player", + c->GetTargetDescription(target) + ).c_str() + ); } else if (is_inspect_loot) { if (!target || !target->IsCorpse()) { c->Message(Chat::White, "You must target a corpse to use this command."); return; } - if (target->IsPlayerCorpse() && c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to inspect the loot of a player corpse."); - return; - } - target->CastToCorpse()->QueryLoot(c); } else if (is_lock) { if (!target || !target->IsCorpse()) { @@ -227,11 +192,6 @@ void command_corpse(Client *c, const Seperator *sep) return; } - if (target->IsPlayerCorpse() && c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to lock player corpses."); - return; - } - target->CastToCorpse()->Lock(); c->Message( Chat::White, @@ -247,11 +207,6 @@ void command_corpse(Client *c, const Seperator *sep) return; } - if (target->IsPlayerCorpse() && c->Admin() < commandEditPlayerCorpses) { - c->Message(Chat::White, "Your status is not high enough to unlock player corpses."); - return; - } - target->CastToCorpse()->UnLock(); c->Message( Chat::White, @@ -267,30 +222,20 @@ void command_corpse(Client *c, const Seperator *sep) return; } - if (c->Admin() >= commandEditPlayerCorpses) { - bool bury_corpse = ( - sep->IsNumber(2) ? - ( - Strings::ToInt(sep->arg[2]) != 0 ? - true : - false - ) : - false - ); - c->Message( - Chat::White, - fmt::format( - "Depopping player corpse {}.", - c->GetTargetDescription(target) - ).c_str() - ); - target->CastToCorpse()->DepopPlayerCorpse(); - if (bury_corpse) { - target->CastToCorpse()->Bury(); - } - } else { - c->Message(Chat::White, "Your status is not high enough to depop a player corpse."); - return; + const bool bury_corpse = sep->IsNumber(2) ? Strings::ToBool(sep->arg[2]) : false; + + c->Message( + Chat::White, + fmt::format( + "Depopping player corpse {}.", + c->GetTargetDescription(target) + ).c_str() + ); + + target->CastToCorpse()->DepopPlayerCorpse(); + + if (bury_corpse) { + target->CastToCorpse()->Bury(); } } else if (is_depop_all) { if (!target || !target->IsClient()) { @@ -298,50 +243,36 @@ void command_corpse(Client *c, const Seperator *sep) return; } - if (c->Admin() >= commandEditPlayerCorpses) { - bool bury_corpse = ( - sep->IsNumber(2) ? - ( - Strings::ToInt(sep->arg[2]) != 0 ? - true : - false - ) : - false - ); + const bool bury_corpse = sep->IsNumber(2) ? Strings::ToBool(sep->arg[2]) : false; + + c->Message( + Chat::White, + fmt::format( + "Depopping all player corpses for {}.", + c->GetTargetDescription(target) + ).c_str() + ); + + target->CastToClient()->DepopAllCorpses(); + + if (bury_corpse) { + target->CastToClient()->BuryPlayerCorpses(); + } + } else if (is_move_all_to_graveyard) { + const int moved_count = entity_list.MovePlayerCorpsesToGraveyard(true); + if (moved_count) { c->Message( Chat::White, fmt::format( - "Depopping all player corpses for {}.", - c->GetTargetDescription(target) + "Moved {} player corpse{} to graveyard in {} ({}).", + moved_count, + moved_count != 1 ? "s" : "", + ZoneLongName(zone->GetZoneID()), + ZoneName(zone->GetZoneID()) ).c_str() ); - target->CastToClient()->DepopAllCorpses(); - if (bury_corpse) { - target->CastToClient()->BuryPlayerCorpses(); - } } else { - c->Message(Chat::White, "Your status is not high enough to depop all of a player's corpses."); - return; - } - } else if (is_move_all_to_graveyard) { - int moved_count = entity_list.MovePlayerCorpsesToGraveyard(true); - if (c->Admin() >= commandEditPlayerCorpses) { - if (moved_count) { - c->Message( - Chat::White, - fmt::format( - "Moved {} player corpse{} to graveyard in {} ({}).", - moved_count, - moved_count != 1 ? "s" : "", - ZoneLongName(zone->GetZoneID()), - ZoneName(zone->GetZoneID()) - ).c_str() - ); - } else { - c->Message(Chat::White, "There are no player corpses to move to the graveyard."); - } - } else { - c->Message(Chat::White, "Your status is not high enough to move all player corpses to the graveyard."); + c->Message(Chat::White, "There are no player corpses to move to the graveyard."); } } } diff --git a/zone/gm_commands/doanim.cpp b/zone/gm_commands/doanim.cpp index 1391e54b3..1f777a604 100755 --- a/zone/gm_commands/doanim.cpp +++ b/zone/gm_commands/doanim.cpp @@ -10,7 +10,7 @@ void command_doanim(Client *c, const Seperator *sep) } Mob* t = c; - if (c->GetTarget() && c->Admin() >= commandDoAnimOthers) { + if (c->GetTarget()) { t = c->GetTarget(); } diff --git a/zone/gm_commands/guild.cpp b/zone/gm_commands/guild.cpp index ebf98dca1..1860ef2ba 100755 --- a/zone/gm_commands/guild.cpp +++ b/zone/gm_commands/guild.cpp @@ -81,11 +81,6 @@ void command_guild(Client *c, const Seperator *sep) ).c_str() ); } else { - if (c->Admin() < minStatusToEditOtherGuilds) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } - auto guild_name = sep->argplus[3]; auto guild_id = guild_mgr.CreateGuild(sep->argplus[3], leader_id); @@ -144,16 +139,6 @@ void command_guild(Client *c, const Seperator *sep) return; } - if (c->Admin() < minStatusToEditOtherGuilds) { - if (c->GuildID() != guild_id) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } else if (!guild_mgr.CheckGMStatus(guild_id, c->Admin())) { - c->Message(Chat::White, "You cannot edit your current guild, your status is not high enough."); - return; - } - } - LogGuilds( "[{}]: Deleting guild [{}] ([{}]) with GM command", c->GetName(), @@ -175,16 +160,10 @@ void command_guild(Client *c, const Seperator *sep) SendGuildSubCommands(c); } else if (is_info) { if (arguments != 2 && c->IsInAGuild()) { - if (c->Admin() >= minStatusToEditOtherGuilds) { - c->Message(Chat::White, "#guild info [Guild ID]"); - } else { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - } + c->Message(Chat::White, "#guild info [Guild ID]"); } else { auto guild_id = GUILD_NONE; - if (arguments != 2 || !sep->IsNumber(2)) { - guild_id = c->GuildID(); - } else if (c->Admin() >= minStatusToEditOtherGuilds) { + if (sep->IsNumber(2)) { guild_id = Strings::ToUnsignedInt(sep->arg[2]); } @@ -193,11 +172,6 @@ void command_guild(Client *c, const Seperator *sep) } } } else if (is_list) { - if (c->Admin() < minStatusToEditOtherGuilds) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } - guild_mgr.ListGuilds(c, std::string()); } else if (is_rename) { if (!sep->IsNumber(2)) { @@ -215,16 +189,6 @@ void command_guild(Client *c, const Seperator *sep) return; } - if (c->Admin() < minStatusToEditOtherGuilds) { - if (c->GuildID() != guild_id) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } else if (!guild_mgr.CheckGMStatus(guild_id, c->Admin())) { - c->Message(Chat::White, "You cannot edit your current guild, your status is not high enough."); - return; - } - } - auto new_guild_name = sep->argplus[3]; LogGuilds( "[{}]: Renaming guild [{}] ([{}]) to [{}] with GM command", @@ -293,11 +257,6 @@ void command_guild(Client *c, const Seperator *sep) return; } - if (c->Admin() < minStatusToEditOtherGuilds && guild_id != c->GuildID()) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } - if (!guild_id || guild_id == GUILD_NONE) { LogGuilds( "[{}]: Removing [{}] ([{}]) from guild with GM command", @@ -390,16 +349,6 @@ void command_guild(Client *c, const Seperator *sep) return; } - if (c->Admin() < minStatusToEditOtherGuilds) { - if (c->GuildID() != guild_id) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } else if (!guild_mgr.CheckGMStatus(guild_id, c->Admin())) { - c->Message(Chat::White, "You cannot edit your current guild, your status is not high enough."); - return; - } - } - LogGuilds( "[{}]: Setting leader of guild [{}] ([{}]) to [{}] with GM command", c->GetName(), @@ -461,11 +410,6 @@ void command_guild(Client *c, const Seperator *sep) return; } - if (c->Admin() < minStatusToEditOtherGuilds && character_id != c->CharacterID()) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); - return; - } - LogGuilds( "[{}]: Setting [{}] ([{}])'s guild rank to [{}] with GM command", c->GetName(), @@ -498,8 +442,6 @@ void command_guild(Client *c, const Seperator *sep) ); if (!client) { c->Message(Chat::White, "You must target someone or specify a character name."); - } else if (c->Admin() < minStatusToEditOtherGuilds && client->GuildID() != c->GuildID()) { - c->Message(Chat::White, "You cannot edit other peoples' guilds."); } else { if (!client->IsInAGuild()) { c->Message( diff --git a/zone/gm_commands/interrogateinv.cpp b/zone/gm_commands/interrogateinv.cpp index 58451e05c..cf6a4fb75 100755 --- a/zone/gm_commands/interrogateinv.cpp +++ b/zone/gm_commands/interrogateinv.cpp @@ -15,20 +15,13 @@ void command_interrogateinv(Client *c, const Seperator *sep) // same or not. if (strcasecmp(sep->arg[1], "help") == 0) { - if (c->Admin() < commandInterrogateInv) { - c->Message(Chat::White, "Usage: #interrogateinv"); - c->Message(Chat::White, " Displays your inventory's current in-memory nested storage references"); - } - else { - c->Message(Chat::White, "Usage: #interrogateinv [log] [silent]"); - c->Message( - Chat::White, - " Displays your or your Player target inventory's current in-memory nested storage references" - ); - c->Message(Chat::White, " [log] - Logs interrogation to file"); - c->Message(Chat::White, " [silent] - Omits the in-game message portion of the interrogation"); - } - return; + c->Message(Chat::White, "Usage: #interrogateinv [log] [silent]"); + c->Message( + Chat::White, + " Displays your or your Player target inventory's current in-memory nested storage references" + ); + c->Message(Chat::White, " [log] - Logs interrogation to file"); + c->Message(Chat::White, " [silent] - Omits the in-game message portion of the interrogation"); } Client *target = nullptr; @@ -38,33 +31,20 @@ void command_interrogateinv(Client *c, const Seperator *sep) bool error = false; bool allowtrip = false; - if (c->Admin() < commandInterrogateInv) { - if (c->GetInterrogateInvState()) { - c->Message(Chat::Red, "The last use of #interrogateinv on this inventory instance discovered an error..."); - c->Message(Chat::Red, "Logging out, zoning or re-arranging items at this point will result in item loss!"); - return; - } - target = c; - allowtrip = true; + if (c->GetTarget() == nullptr) { + target = c; + } else if (c->GetTarget()->IsClient()) { + target = c->GetTarget()->CastToClient(); + } else { + c->Message(Chat::Default, "Use of this command is limited to Client entities"); + return; } - else { - if (c->GetTarget() == nullptr) { - target = c; - } - else if (c->GetTarget()->IsClient()) { - target = c->GetTarget()->CastToClient(); - } - else { - c->Message(Chat::Default, "Use of this command is limited to Client entities"); - return; - } - if (strcasecmp(sep->arg[1], "log") == 0) { - log = true; - } - if (strcasecmp(sep->arg[2], "silent") == 0) { - silent = true; - } + if (strcasecmp(sep->arg[1], "log") == 0) { + log = true; + } + if (strcasecmp(sep->arg[2], "silent") == 0) { + silent = true; } bool success = target->InterrogateInventory(c, log, silent, allowtrip, error); diff --git a/zone/gm_commands/invsnapshot.cpp b/zone/gm_commands/invsnapshot.cpp index 4c60fb8ce..425c04f58 100755 --- a/zone/gm_commands/invsnapshot.cpp +++ b/zone/gm_commands/invsnapshot.cpp @@ -27,50 +27,48 @@ void command_invsnapshot(Client *c, const Seperator *sep) "takes snapshot of character inventory" ""; - if (c->Admin() >= commandInvSnapshot) { - window_text.append( - "" - "gcount" - "" - "returns global snapshot count" - "" - "" - "gclear" - "
now" - "delete all snapshots - rule
delete all snapshots - now" - "" - "" - "count" - "" - "returns character snapshot count" - "" - "" - "clear" - "
now" - "delete character snapshots - rule
delete character snapshots - now" - "" - "" - "list" - "
count" - "lists entry ids for current character
limits to count" - "" - "" - "parse" - "tstmp" - "displays slots and items in snapshot" - "" - "" - "compare" - "tstmp" - "compares inventory against snapshot" - "" - "" - "restore" - "tstmp" - "restores slots and items in snapshot" - "" - ); - } + window_text.append( + "" + "gcount" + "" + "returns global snapshot count" + "" + "" + "gclear" + "
now" + "delete all snapshots - rule
delete all snapshots - now" + "" + "" + "count" + "" + "returns character snapshot count" + "" + "" + "clear" + "
now" + "delete character snapshots - rule
delete character snapshots - now" + "" + "" + "list" + "
count" + "lists entry ids for current character
limits to count" + "" + "" + "parse" + "tstmp" + "displays slots and items in snapshot" + "" + "" + "compare" + "tstmp" + "compares inventory against snapshot" + "" + "" + "restore" + "tstmp" + "restores slots and items in snapshot" + "" + ); window_text.append( "" @@ -81,34 +79,30 @@ void command_invsnapshot(Client *c, const Seperator *sep) return; } - if (c->Admin() >= commandInvSnapshot) { // global arguments + if (strcmp(sep->arg[1], "gcount") == 0) { + auto is_count = database.CountInvSnapshots(); + c->Message( + Chat::White, + "There %s %i inventory snapshot%s.", + (is_count == 1 ? "is" : "are"), + is_count, + (is_count == 1 ? "" : "s")); - if (strcmp(sep->arg[1], "gcount") == 0) { - auto is_count = database.CountInvSnapshots(); + return; + } + + if (strcmp(sep->arg[1], "gclear") == 0) { + if (strcmp(sep->arg[2], "now") == 0) { + database.ClearInvSnapshots(true); + c->Message(Chat::White, "Inventory snapshots cleared using current time."); + } else { + database.ClearInvSnapshots(); c->Message( - Chat::White, - "There %s %i inventory snapshot%s.", - (is_count == 1 ? "is" : "are"), - is_count, - (is_count == 1 ? "" : "s")); - - return; + Chat::White, "Inventory snapshots cleared using RuleI(Character, InvSnapshotHistoryD) (%i day%s).", + RuleI(Character, InvSnapshotHistoryD), (RuleI(Character, InvSnapshotHistoryD) == 1 ? "" : "s")); } - if (strcmp(sep->arg[1], "gclear") == 0) { - if (strcmp(sep->arg[2], "now") == 0) { - database.ClearInvSnapshots(true); - c->Message(Chat::White, "Inventory snapshots cleared using current time."); - } - else { - database.ClearInvSnapshots(); - c->Message( - Chat::White, "Inventory snapshots cleared using RuleI(Character, InvSnapshotHistoryD) (%i day%s).", - RuleI(Character, InvSnapshotHistoryD), (RuleI(Character, InvSnapshotHistoryD) == 1 ? "" : "s")); - } - - return; - } + return; } if (!c->GetTarget() || !c->GetTarget()->IsClient()) { @@ -127,8 +121,7 @@ void command_invsnapshot(Client *c, const Seperator *sep) tc->GetName(), RuleI(Character, InvSnapshotMinIntervalM), (RuleI(Character, InvSnapshotMinIntervalM) == 1 ? "" : "s")); - } - else { + } else { tc->SetNextInvSnapshot(RuleI(Character, InvSnapshotMinRetryM)); c->Message( Chat::White, @@ -141,278 +134,266 @@ void command_invsnapshot(Client *c, const Seperator *sep) return; } - if (c->Admin() >= commandInvSnapshot) { - if (strcmp(sep->arg[1], "count") == 0) { - auto is_count = database.CountCharacterInvSnapshots(tc->CharacterID()); + if (strcmp(sep->arg[1], "count") == 0) { + auto is_count = database.CountCharacterInvSnapshots(tc->CharacterID()); + c->Message( + Chat::White, + "%s (id: %u) has %i inventory snapshot%s.", + tc->GetName(), + tc->CharacterID(), + is_count, + (is_count == 1 ? "" : "s")); + + return; + } + + if (strcmp(sep->arg[1], "clear") == 0) { + if (strcmp(sep->arg[2], "now") == 0) { + database.ClearCharacterInvSnapshots(tc->CharacterID(), true); c->Message( Chat::White, - "%s (id: %u) has %i inventory snapshot%s.", + "%s\'s (id: %u) inventory snapshots cleared using current time.", + tc->GetName(), + tc->CharacterID()); + } else { + database.ClearCharacterInvSnapshots(tc->CharacterID()); + c->Message( + Chat::White, + "%s\'s (id: %u) inventory snapshots cleared using RuleI(Character, InvSnapshotHistoryD) (%i day%s).", tc->GetName(), tc->CharacterID(), - is_count, - (is_count == 1 ? "" : "s")); + RuleI(Character, InvSnapshotHistoryD), + (RuleI(Character, InvSnapshotHistoryD) == 1 ? "" : "s")); + } + return; + } + + if (strcmp(sep->arg[1], "list") == 0) { + std::list> is_list; + database.ListCharacterInvSnapshots(tc->CharacterID(), is_list); + + if (is_list.empty()) { + c->Message(Chat::White, "No inventory snapshots for %s (id: %u)", tc->GetName(), tc->CharacterID()); return; } - if (strcmp(sep->arg[1], "clear") == 0) { - if (strcmp(sep->arg[2], "now") == 0) { - database.ClearCharacterInvSnapshots(tc->CharacterID(), true); - c->Message( - Chat::White, - "%s\'s (id: %u) inventory snapshots cleared using current time.", - tc->GetName(), - tc->CharacterID()); - } - else { - database.ClearCharacterInvSnapshots(tc->CharacterID()); - c->Message( - Chat::White, - "%s\'s (id: %u) inventory snapshots cleared using RuleI(Character, InvSnapshotHistoryD) (%i day%s).", - tc->GetName(), - tc->CharacterID(), - RuleI(Character, InvSnapshotHistoryD), - (RuleI(Character, InvSnapshotHistoryD) == 1 ? "" : "s")); - } - - return; + auto list_count = 0; + if (sep->IsNumber(2)) { + list_count = Strings::ToInt(sep->arg[2]); + } + if (list_count < 1 || list_count > is_list.size()) { + list_count = is_list.size(); } - if (strcmp(sep->arg[1], "list") == 0) { - std::list> is_list; - database.ListCharacterInvSnapshots(tc->CharacterID(), is_list); + std::string window_title = StringFormat("Snapshots for %s", tc->GetName()); - if (is_list.empty()) { - c->Message(Chat::White, "No inventory snapshots for %s (id: %u)", tc->GetName(), tc->CharacterID()); - return; - } - - auto list_count = 0; - if (sep->IsNumber(2)) { - list_count = Strings::ToInt(sep->arg[2]); - } - if (list_count < 1 || list_count > is_list.size()) { - list_count = is_list.size(); - } - - std::string window_title = StringFormat("Snapshots for %s", tc->GetName()); - - std::string window_text = - "" - "" - "" - "" - ""; - - for (auto iter : is_list) { - if (!list_count) { - break; - } - - window_text.append( - StringFormat( + std::string window_text = + "
TimestampEntry Count
" "" - "" - "" - "", - iter.first, - iter.second - )); + "" + "" + ""; - --list_count; + for (auto iter: is_list) { + if (!list_count) { + break; } window_text.append( - "
%u%i
TimestampEntry Count
" - ); - - c->SendPopupToClient(window_title.c_str(), window_text.c_str()); - - return; - } - - if (strcmp(sep->arg[1], "parse") == 0) { - if (!sep->IsNumber(2)) { - c->Message(Chat::White, "A timestamp is required to use this option."); - return; - } - - uint32 timestamp = Strings::ToUnsignedInt(sep->arg[2]); - - if (!database.ValidateCharacterInvSnapshotTimestamp(tc->CharacterID(), timestamp)) { - c->Message( - Chat::White, - "No inventory snapshots for %s (id: %u) exist at %u.", - tc->GetName(), - tc->CharacterID(), - timestamp - ); - return; - } - - std::list> parse_list; - database.ParseCharacterInvSnapshot(tc->CharacterID(), timestamp, parse_list); - - std::string window_title = StringFormat("Snapshot Parse for %s @ %u", tc->GetName(), timestamp); - - std::string window_text = "Slot: ItemID - Description
"; - - for (auto iter : parse_list) { - auto item_data = database.GetItem(iter.second); - std::string window_line = StringFormat( - "%i: %u - %s
", + StringFormat( + "" + "%u" + "%i" + "", iter.first, - iter.second, - (item_data ? item_data->Name : "[error]")); + iter.second + )); - if (window_text.length() + window_line.length() < 4095) { - window_text.append(window_line); - } - else { - c->Message(Chat::White, "Too many snapshot entries to list..."); - break; - } - } + --list_count; + } - c->SendPopupToClient(window_title.c_str(), window_text.c_str()); + window_text.append( + "" + ); + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); + + return; + } + + if (strcmp(sep->arg[1], "parse") == 0) { + if (!sep->IsNumber(2)) { + c->Message(Chat::White, "A timestamp is required to use this option."); return; } - if (strcmp(sep->arg[1], "compare") == 0) { - if (!sep->IsNumber(2)) { - c->Message(Chat::White, "A timestamp is required to use this option."); - return; + uint32 timestamp = Strings::ToUnsignedInt(sep->arg[2]); + + if (!database.ValidateCharacterInvSnapshotTimestamp(tc->CharacterID(), timestamp)) { + c->Message( + Chat::White, + "No inventory snapshots for %s (id: %u) exist at %u.", + tc->GetName(), + tc->CharacterID(), + timestamp + ); + return; + } + + std::list> parse_list; + database.ParseCharacterInvSnapshot(tc->CharacterID(), timestamp, parse_list); + + std::string window_title = StringFormat("Snapshot Parse for %s @ %u", tc->GetName(), timestamp); + + std::string window_text = "Slot: ItemID - Description
"; + + for (auto iter: parse_list) { + auto item_data = database.GetItem(iter.second); + std::string window_line = StringFormat( + "%i: %u - %s
", + iter.first, + iter.second, + (item_data ? item_data->Name : "[error]")); + + if (window_text.length() + window_line.length() < 4095) { + window_text.append(window_line); + } else { + c->Message(Chat::White, "Too many snapshot entries to list..."); + break; } + } - uint32 timestamp = Strings::ToUnsignedInt(sep->arg[2]); + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); - if (!database.ValidateCharacterInvSnapshotTimestamp(tc->CharacterID(), timestamp)) { - c->Message( - Chat::White, - "No inventory snapshots for %s (id: %u) exist at %u.", - tc->GetName(), - tc->CharacterID(), - timestamp - ); - return; - } + return; + } - std::list> inv_compare_list; - database.DivergeCharacterInventoryFromInvSnapshot(tc->CharacterID(), timestamp, inv_compare_list); + if (strcmp(sep->arg[1], "compare") == 0) { + if (!sep->IsNumber(2)) { + c->Message(Chat::White, "A timestamp is required to use this option."); + return; + } - std::list> iss_compare_list; - database.DivergeCharacterInvSnapshotFromInventory(tc->CharacterID(), timestamp, iss_compare_list); + uint32 timestamp = Strings::ToUnsignedInt(sep->arg[2]); - std::string window_title = StringFormat("Snapshot Comparison for %s @ %u", tc->GetName(), timestamp); + if (!database.ValidateCharacterInvSnapshotTimestamp(tc->CharacterID(), timestamp)) { + c->Message( + Chat::White, + "No inventory snapshots for %s (id: %u) exist at %u.", + tc->GetName(), + tc->CharacterID(), + timestamp + ); + return; + } - std::string window_text = "Slot: (action) Snapshot -> Inventory
"; + std::list> inv_compare_list; + database.DivergeCharacterInventoryFromInvSnapshot(tc->CharacterID(), timestamp, inv_compare_list); - auto inv_iter = inv_compare_list.begin(); - auto iss_iter = iss_compare_list.begin(); + std::list> iss_compare_list; + database.DivergeCharacterInvSnapshotFromInventory(tc->CharacterID(), timestamp, iss_compare_list); - while (true) { - std::string window_line; + std::string window_title = StringFormat("Snapshot Comparison for %s @ %u", tc->GetName(), timestamp); - if (inv_iter == inv_compare_list.end() && iss_iter == iss_compare_list.end()) { - break; - } - else if (inv_iter != inv_compare_list.end() && iss_iter == iss_compare_list.end()) { - window_line = StringFormat("%i: (delete) [empty] -> %u
", inv_iter->first, inv_iter->second); + std::string window_text = "Slot: (action) Snapshot -> Inventory
"; + + auto inv_iter = inv_compare_list.begin(); + auto iss_iter = iss_compare_list.begin(); + + while (true) { + std::string window_line; + + if (inv_iter == inv_compare_list.end() && iss_iter == iss_compare_list.end()) { + break; + } else if (inv_iter != inv_compare_list.end() && iss_iter == iss_compare_list.end()) { + window_line = StringFormat("%i: (delete) [empty] -> %u
", inv_iter->first, inv_iter->second); + ++inv_iter; + } else if (inv_iter == inv_compare_list.end() && iss_iter != iss_compare_list.end()) { + window_line = StringFormat("%i: (insert) %u -> [empty]
", iss_iter->first, iss_iter->second); + ++iss_iter; + } else { + if (inv_iter->first < iss_iter->first) { + window_line = StringFormat( + "%i: (delete) [empty] -> %u
", + inv_iter->first, + inv_iter->second + ); + ++inv_iter; + } else if (inv_iter->first > iss_iter->first) { + window_line = StringFormat( + "%i: (insert) %u -> [empty]
", + iss_iter->first, + iss_iter->second + ); + ++iss_iter; + } else { + window_line = StringFormat( + "%i: (replace) %u -> %u
", + iss_iter->first, + iss_iter->second, + inv_iter->second + ); ++inv_iter; - } - else if (inv_iter == inv_compare_list.end() && iss_iter != iss_compare_list.end()) { - window_line = StringFormat("%i: (insert) %u -> [empty]
", iss_iter->first, iss_iter->second); ++iss_iter; } - else { - if (inv_iter->first < iss_iter->first) { - window_line = StringFormat( - "%i: (delete) [empty] -> %u
", - inv_iter->first, - inv_iter->second - ); - ++inv_iter; - } - else if (inv_iter->first > iss_iter->first) { - window_line = StringFormat( - "%i: (insert) %u -> [empty]
", - iss_iter->first, - iss_iter->second - ); - ++iss_iter; - } - else { - window_line = StringFormat( - "%i: (replace) %u -> %u
", - iss_iter->first, - iss_iter->second, - inv_iter->second - ); - ++inv_iter; - ++iss_iter; - } - } - - if (window_text.length() + window_line.length() < 4095) { - window_text.append(window_line); - } - else { - c->Message(Chat::White, "Too many comparison entries to list..."); - break; - } } - c->SendPopupToClient(window_title.c_str(), window_text.c_str()); + if (window_text.length() + window_line.length() < 4095) { + window_text.append(window_line); + } else { + c->Message(Chat::White, "Too many comparison entries to list..."); + break; + } + } + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); + + return; + } + + if (strcmp(sep->arg[1], "restore") == 0) { + if (!sep->IsNumber(2)) { + c->Message(Chat::White, "A timestamp is required to use this option."); return; } - if (strcmp(sep->arg[1], "restore") == 0) { - if (!sep->IsNumber(2)) { - c->Message(Chat::White, "A timestamp is required to use this option."); - return; - } - - uint32 timestamp = Strings::ToUnsignedInt(sep->arg[2]); - - if (!database.ValidateCharacterInvSnapshotTimestamp(tc->CharacterID(), timestamp)) { - c->Message( - Chat::White, - "No inventory snapshots for %s (id: %u) exist at %u.", - tc->GetName(), - tc->CharacterID(), - timestamp - ); - return; - } - - if (database.SaveCharacterInvSnapshot(tc->CharacterID())) { - tc->SetNextInvSnapshot(RuleI(Character, InvSnapshotMinIntervalM)); - } - else { - c->Message( - Chat::Red, "Failed to take pre-restore inventory snapshot of %s (id: %u).", - tc->GetName(), tc->CharacterID()); - return; - } - - if (database.RestoreCharacterInvSnapshot(tc->CharacterID(), timestamp)) { - // cannot delete all valid item slots from client..so, we worldkick - tc->WorldKick(); // self restores update before the 'kick' is processed - - c->Message( - Chat::White, "Successfully applied snapshot %u to %s's (id: %u) inventory.", - timestamp, tc->GetName(), tc->CharacterID()); - } - else { - c->Message( - Chat::Red, "Failed to apply snapshot %u to %s's (id: %u) inventory.", - timestamp, tc->GetName(), tc->CharacterID()); - } + uint32 timestamp = Strings::ToUnsignedInt(sep->arg[2]); + if (!database.ValidateCharacterInvSnapshotTimestamp(tc->CharacterID(), timestamp)) { + c->Message( + Chat::White, + "No inventory snapshots for %s (id: %u) exist at %u.", + tc->GetName(), + tc->CharacterID(), + timestamp + ); return; } + + if (database.SaveCharacterInvSnapshot(tc->CharacterID())) { + tc->SetNextInvSnapshot(RuleI(Character, InvSnapshotMinIntervalM)); + } else { + c->Message( + Chat::Red, "Failed to take pre-restore inventory snapshot of %s (id: %u).", + tc->GetName(), tc->CharacterID()); + return; + } + + if (database.RestoreCharacterInvSnapshot(tc->CharacterID(), timestamp)) { + // cannot delete all valid item slots from client..so, we worldkick + tc->WorldKick(); // self restores update before the 'kick' is processed + + c->Message( + Chat::White, "Successfully applied snapshot %u to %s's (id: %u) inventory.", + timestamp, tc->GetName(), tc->CharacterID()); + } else { + c->Message( + Chat::Red, "Failed to apply snapshot %u to %s's (id: %u) inventory.", + timestamp, tc->GetName(), tc->CharacterID()); + } + + return; } } diff --git a/zone/gm_commands/movechar.cpp b/zone/gm_commands/movechar.cpp index 6ce81fd61..e6102cedd 100755 --- a/zone/gm_commands/movechar.cpp +++ b/zone/gm_commands/movechar.cpp @@ -2,18 +2,18 @@ void command_movechar(Client *c, const Seperator *sep) { - int arguments = sep->argnum; + const int arguments = sep->argnum; if (arguments < 2) { c->Message(Chat::White, "Usage: #movechar [Character ID|Character Name] [Zone ID|Zone Short Name]"); return; } - std::string character_name = ( + const std::string &character_name = ( sep->IsNumber(1) ? database.GetCharNameByID(Strings::ToUnsignedInt(sep->arg[1])) : sep->arg[1] ); - auto character_id = database.GetCharacterID(character_name.c_str()); + const uint32 character_id = database.GetCharacterID(character_name.c_str()); if (!character_id) { c->Message( Chat::White, @@ -25,15 +25,15 @@ void command_movechar(Client *c, const Seperator *sep) return; } - auto account_id = database.GetAccountIDByChar(character_name.c_str()); + const uint32 account_id = database.GetAccountIDByChar(character_name.c_str()); - std::string zone_short_name = Strings::ToLower( + const std::string &zone_short_name = Strings::ToLower( sep->IsNumber(2) ? ZoneName(Strings::ToUnsignedInt(sep->arg[2]), true) : sep->arg[2] ); - bool is_unknown_zone = zone_short_name.find("unknown") != std::string::npos; + const bool is_unknown_zone = zone_short_name.find("unknown") != std::string::npos; if (is_unknown_zone) { c->Message( Chat::White, @@ -45,63 +45,34 @@ void command_movechar(Client *c, const Seperator *sep) return; } - auto zone_id = ZoneID(zone_short_name); - auto z = GetZone(zone_id); + const uint32 zone_id = ZoneID(zone_short_name); + auto z = GetZone(zone_id); if (!z) { c->Message(Chat::Red, "Invalid zone."); return; } - bool is_special_zone = ( - zone_short_name.find("cshome") != std::string::npos || - zone_short_name.find("load") != std::string::npos || - zone_short_name.find("load2") != std::string::npos + const bool moved = database.MoveCharacterToZone(character_name.c_str(), zone_id); + std::string moved_string = moved ? "Succeeded" : "Failed"; + c->Message( + Chat::White, + fmt::format( + "Character Move {} | Character: {} ({})", + moved_string, + character_name, + character_id + ).c_str() ); - if (c->Admin() < commandMovecharToSpecials && is_special_zone) { - c->Message( - Chat::White, - fmt::format( - "{} ({}) is a special zone and you cannot move someone there.", - z->long_name, - zone_short_name - ).c_str() - ); - return; - } - - if ( - c->Admin() >= commandMovecharSelfOnly || - account_id == c->AccountID() - ) { - bool moved = database.MoveCharacterToZone(character_name.c_str(), zone_id); - std::string moved_string = ( - moved ? - "Succeeded" : - "Failed" - ); - c->Message( - Chat::White, - fmt::format( - "Character Move {} | Character: {} ({})", - moved_string, - character_name, - character_id - ).c_str() - ); - - c->Message( - Chat::White, - fmt::format( - "Character Move {} | Zone: {} ({}) ID: {}", - moved_string, - z->long_name, - zone_short_name, - zone_id - ).c_str() - ); - } else { - c->Message(Chat::White, "You cannot move characters that are not on your account."); - } + c->Message( + Chat::White, + fmt::format( + "Character Move {} | Zone: {} ({}) ID: {}", + moved_string, + z->long_name, + zone_short_name, + zone_id + ).c_str() + ); } diff --git a/zone/gm_commands/show/flags.cpp b/zone/gm_commands/show/flags.cpp index 27a4345ef..50b5e183c 100644 --- a/zone/gm_commands/show/flags.cpp +++ b/zone/gm_commands/show/flags.cpp @@ -2,13 +2,8 @@ void ShowFlags(Client *c, const Seperator *sep) { - auto t = c; - - if ( - c->GetTarget() && - c->GetTarget()->IsClient() && - c->Admin() >= minStatusToSeeOthersZoneFlags - ) { + Client *t = c; + if (c->GetTarget() && c->GetTarget()->IsClient()) { t = c->GetTarget()->CastToClient(); } diff --git a/zone/gm_commands/show/peqzone_flags.cpp b/zone/gm_commands/show/peqzone_flags.cpp index 9efa6e09f..e8112436e 100644 --- a/zone/gm_commands/show/peqzone_flags.cpp +++ b/zone/gm_commands/show/peqzone_flags.cpp @@ -2,12 +2,8 @@ void ShowPEQZoneFlags(Client *c, const Seperator *sep) { - auto t = c; - if ( - c->GetTarget() && - c->GetTarget()->IsClient() && - c->Admin() >= minStatusToSeeOthersZoneFlags - ) { + Client *t = c; + if (c->GetTarget() && c->GetTarget()->IsClient()) { t = c->GetTarget()->CastToClient(); } diff --git a/zone/zoning.cpp b/zone/zoning.cpp index 4e00a7e71..b9e479b4d 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -1343,7 +1343,7 @@ bool Client::CanEnterZone(const std::string& zone_short_name, int16 instance_ver } if (!z->flag_needed.empty() && Strings::IsNumber(z->flag_needed) && Strings::ToBool(z->flag_needed)) { - if (Admin() < minStatusToIgnoreZoneFlags && !HasZoneFlag(z->zoneidnumber)) { + if (!GetGM() && !HasZoneFlag(z->zoneidnumber)) { LogInfo( "Character [{}] does not have the flag to be in this zone [{}]!", GetCleanName(),