diff --git a/common/servertalk.h b/common/servertalk.h index d537bb825..595f9d02e 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -2065,9 +2065,10 @@ struct ServerExpeditionSetting_Struct { uint8 enabled; }; -struct ServerExpeditionCharacterName_Struct { +struct ServerExpeditionCharacterLockout_Struct { char character_name[64]; char expedition_name[128]; + char event_name[256]; }; struct ServerExpeditionCharacterID_Struct { diff --git a/world/expedition.cpp b/world/expedition.cpp index ff2476e50..58c21a919 100644 --- a/world/expedition.cpp +++ b/world/expedition.cpp @@ -437,7 +437,7 @@ void ExpeditionMessage::HandleZoneMessage(ServerPacket* pack) } case ServerOP_ExpeditionRemoveCharLockouts: { - auto buf = reinterpret_cast(pack->pBuffer); + auto buf = reinterpret_cast(pack->pBuffer); client_list.SendPacket(buf->character_name, pack); break; } diff --git a/zone/command.cpp b/zone/command.cpp index f7028cd96..caa7684ab 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -6932,11 +6932,19 @@ void command_dz(Client* c, const Seperator* sep) { if (strcasecmp(sep->arg[2], "remove") == 0 && sep->arg[3][0] != '\0') { - c->Message(Chat::White, fmt::format( - "Removing [{}] lockouts on [{}].", sep->arg[4][0] ? sep->arg[4] : "all", sep->arg[3] - ).c_str()); - - Expedition::RemoveAllCharacterLockouts(sep->arg[3], sep->arg[4]); + if (sep->arg[5][0] == '\0') + { + c->Message(Chat::White, fmt::format( + "Removing [{}] lockouts on [{}].", sep->arg[4][0] ? sep->arg[4] : "all", sep->arg[3] + ).c_str()); + } + else + { + c->Message(Chat::White, fmt::format( + "Removing [{}]:[{}] lockout on [{}].", sep->arg[4], sep->arg[5], sep->arg[3] + ).c_str()); + } + Expedition::RemoveCharacterLockouts(sep->arg[3], sep->arg[4], sep->arg[5]); } } else @@ -6948,6 +6956,7 @@ void command_dz(Client* c, const Seperator* sep) c->Message(Chat::White, "#dz list [all] - list dynamic zone instances from database -- 'all' includes expired"); c->Message(Chat::White, "#dz lockouts remove - delete all of character's expedition lockouts"); c->Message(Chat::White, "#dz lockouts remove \"\" - delete lockouts by expedition"); + c->Message(Chat::White, "#dz lockouts remove \"\" \"\" - delete lockout by expedition event"); } } diff --git a/zone/expedition.cpp b/zone/expedition.cpp index 6c388fe7c..5057bcaa3 100644 --- a/zone/expedition.cpp +++ b/zone/expedition.cpp @@ -1556,17 +1556,15 @@ void Expedition::SendWorldGetOnlineMembers() worldserver.SendPacket(pack.get()); } -void Expedition::RemoveAllCharacterLockouts(std::string character_name, std::string expedition_name) +void Expedition::RemoveCharacterLockouts( + std::string character_name, std::string expedition_name, std::string event_name) { - uint32_t pack_size = sizeof(ServerExpeditionCharacterName_Struct); + uint32_t pack_size = sizeof(ServerExpeditionCharacterLockout_Struct); auto pack = std::unique_ptr(new ServerPacket(ServerOP_ExpeditionRemoveCharLockouts, pack_size)); - auto buf = reinterpret_cast(pack->pBuffer); + auto buf = reinterpret_cast(pack->pBuffer); strn0cpy(buf->character_name, character_name.c_str(), sizeof(buf->character_name)); - buf->expedition_name[0] = '\0'; - if (!expedition_name.empty()) - { - strn0cpy(buf->expedition_name, expedition_name.c_str(), sizeof(buf->expedition_name)); - } + strn0cpy(buf->expedition_name, expedition_name.c_str(), sizeof(buf->expedition_name)); + strn0cpy(buf->event_name, event_name.c_str(), sizeof(buf->event_name)); worldserver.SendPacket(pack.get()); } @@ -1788,11 +1786,18 @@ void Expedition::HandleWorldMessage(ServerPacket* pack) } case ServerOP_ExpeditionRemoveCharLockouts: { - auto buf = reinterpret_cast(pack->pBuffer); + auto buf = reinterpret_cast(pack->pBuffer); Client* client = entity_list.GetClientByName(buf->character_name); if (client) { - client->RemoveAllExpeditionLockouts(buf->expedition_name); + if (buf->event_name[0] != '\0') + { + client->RemoveExpeditionLockout(buf->expedition_name, buf->event_name, true); + } + else + { + client->RemoveAllExpeditionLockouts(buf->expedition_name); + } } break; } diff --git a/zone/expedition.h b/zone/expedition.h index 4ad4460f5..cb40227f0 100644 --- a/zone/expedition.h +++ b/zone/expedition.h @@ -84,7 +84,7 @@ public: static Expedition* FindCachedExpeditionByCharacterName(const std::string& char_name); static Expedition* FindCachedExpeditionByID(uint32_t expedition_id); static Expedition* FindExpeditionByInstanceID(uint32_t instance_id); - static void RemoveAllCharacterLockouts(std::string character_name, std::string expedition_name = {}); + static void RemoveCharacterLockouts(std::string character_name, std::string expedition_name = {}, std::string event_name = {}); static void HandleWorldMessage(ServerPacket* pack); uint32_t GetID() const { return m_id; }