diff --git a/zone/command.h b/zone/command.h index 663b7bc4f..b079ee217 100644 --- a/zone/command.h +++ b/zone/command.h @@ -33,6 +33,7 @@ std::map GetModifyNPCStatMap(); std::string GetModifyNPCStatDescription(std::string stat); void SendNPCEditSubCommands(Client *c); void SendRuleSubCommands(Client *c); +void SendGuildSubCommands(Client *c); // Commands void command_acceptrules(Client *c, const Seperator *sep); diff --git a/zone/gm_commands/guild.cpp b/zone/gm_commands/guild.cpp index c1afc7259..13fd07cb4 100755 --- a/zone/gm_commands/guild.cpp +++ b/zone/gm_commands/guild.cpp @@ -8,24 +8,15 @@ extern WorldServer worldserver; void command_guild(Client *c, const Seperator *sep) { - int arguments = sep->argnum; + const auto arguments = sep->argnum; if (!arguments) { - c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]"); - c->Message(Chat::White, "#guild delete [Guild ID]"); - c->Message(Chat::White, "#guild help"); - c->Message(Chat::White, "#guild info [Guild ID]"); - c->Message(Chat::White, "#guild list"); - c->Message(Chat::White, "#guild rename [Guild ID] [New Name]"); - c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)"); - c->Message(Chat::White, "#guild setleader [Guild ID] [Character ID|Character Name]"); - c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]"); - c->Message(Chat::White, "#guild status [Character ID|Character Name]"); + SendGuildSubCommands(c); return; } - auto target = c; + auto t = c; if (c->GetTarget() && c->GetTarget()->IsClient()) { - target = c->GetTarget()->CastToClient(); + t = c->GetTarget()->CastToClient(); } bool is_create = !strcasecmp(sep->arg[1], "create"); @@ -34,6 +25,7 @@ void command_guild(Client *c, const Seperator *sep) bool is_info = !strcasecmp(sep->arg[1], "info"); bool is_list = !strcasecmp(sep->arg[1], "list"); bool is_rename = !strcasecmp(sep->arg[1], "rename"); + bool is_search = !strcasecmp(sep->arg[1], "search"); bool is_set = !strcasecmp(sep->arg[1], "set"); bool is_set_leader = !strcasecmp(sep->arg[1], "setleader"); bool is_set_rank = !strcasecmp(sep->arg[1], "setrank"); @@ -45,21 +37,13 @@ void command_guild(Client *c, const Seperator *sep) !is_info && !is_list && !is_rename && + !is_search && !is_set && !is_set_leader && !is_set_rank && !is_status ) { - c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]"); - c->Message(Chat::White, "#guild delete [Guild ID]"); - c->Message(Chat::White, "#guild help"); - c->Message(Chat::White, "#guild info [Guild ID]"); - c->Message(Chat::White, "#guild list"); - c->Message(Chat::White, "#guild rename [Guild ID] [New Name]"); - c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)"); - c->Message(Chat::White, "#guild setleader [Guild ID] [Character ID|Character Name]"); - c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]"); - c->Message(Chat::White, "#guild status [Character ID|Character Name]"); + SendGuildSubCommands(c); return; } @@ -188,16 +172,7 @@ void command_guild(Client *c, const Seperator *sep) ); } } else if (is_help) { - c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]"); - c->Message(Chat::White, "#guild delete [Guild ID]"); - c->Message(Chat::White, "#guild help"); - c->Message(Chat::White, "#guild info [Guild ID]"); - c->Message(Chat::White, "#guild list"); - c->Message(Chat::White, "#guild rename [Guild ID] [New Name]"); - c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)"); - c->Message(Chat::White, "#guild setleader [Guild ID] [Character ID|Character Name]"); - c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]"); - c->Message(Chat::White, "#guild status [Character ID|Character Name]"); + SendGuildSubCommands(c); } else if (is_info) { if (arguments != 2 && c->IsInAGuild()) { if (c->Admin() >= minStatusToEditOtherGuilds) { @@ -223,7 +198,7 @@ void command_guild(Client *c, const Seperator *sep) return; } - guild_mgr.ListGuilds(c); + guild_mgr.ListGuilds(c, std::string()); } else if (is_rename) { if (!sep->IsNumber(2)) { c->Message(Chat::White, "Usage: #guild rename [Guild ID] [New Guild Name]"); @@ -269,6 +244,16 @@ void command_guild(Client *c, const Seperator *sep) ).c_str() ); } + } else if (is_search) { + if (Strings::IsNumber(sep->arg[2])) { + const auto guild_id = std::stoul(sep->arg[2]); + + guild_mgr.ListGuilds(c, guild_id); + } else { + const std::string search_criteria = sep->argplus[2]; + + guild_mgr.ListGuilds(c, search_criteria); + } } else if (is_set) { if ( arguments != 3 || @@ -292,7 +277,7 @@ void command_guild(Client *c, const Seperator *sep) } auto character_id = ( - sep->IsNumber(2) ? + sep->IsNumber(2) ? std::stoul(sep->arg[2]) : database.GetCharacterID(sep->arg[2]) ); @@ -330,7 +315,7 @@ void command_guild(Client *c, const Seperator *sep) guild_id ); } - + if (guild_id && guild_id != GUILD_NONE) { c->Message( Chat::White, @@ -360,7 +345,7 @@ void command_guild(Client *c, const Seperator *sep) !sep->IsNumber(2) ) { c->Message(Chat::White, "Usage: #guild setleader [Guild ID] [Character ID|Character Name]"); - } else { + } else { auto leader_id = ( sep->IsNumber(2) ? std::stoul(sep->arg[2]) : @@ -404,7 +389,7 @@ void command_guild(Client *c, const Seperator *sep) return; } - if (c->Admin() < minStatusToEditOtherGuilds) { + if (c->Admin() < minStatusToEditOtherGuilds) { if (c->GuildID() != guild_id) { c->Message(Chat::White, "You cannot edit other peoples' guilds."); return; @@ -502,8 +487,8 @@ void command_guild(Client *c, const Seperator *sep) } } else if (is_status) { auto client = ( - target ? - target : + t ? + t : ( arguments == 2 ? entity_list.GetClientByName(sep->arg[2]) : @@ -521,7 +506,7 @@ void command_guild(Client *c, const Seperator *sep) fmt::format( "{} {} not in a guild.", c->GetTargetDescription(client, TargetDescriptionType::UCYou), - c == target ? "are" : "is" + c == t ? "are" : "is" ).c_str() ); } else if (guild_mgr.IsGuildLeader(client->GuildID(), client->CharacterID())) { @@ -530,17 +515,17 @@ void command_guild(Client *c, const Seperator *sep) fmt::format( "{} {} the leader of {}.", c->GetTargetDescription(client, TargetDescriptionType::UCYou), - c == target ? "are" : "is", + c == t ? "are" : "is", guild_mgr.GetGuildNameByID(client->GuildID()) ).c_str() ); } else { - c->Message( + c->Message( Chat::White, fmt::format( "{} {} a(n) {} of {}.", c->GetTargetDescription(client, TargetDescriptionType::UCYou), - c == target ? "are" : "is", + c == t ? "are" : "is", guild_mgr.GetRankName(client->GuildID(), client->GuildRank()), guild_mgr.GetGuildNameByID(client->GuildID()) ).c_str() @@ -549,3 +534,18 @@ void command_guild(Client *c, const Seperator *sep) } } } + +void SendGuildSubCommands(Client *c) +{ + c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]"); + c->Message(Chat::White, "#guild delete [Guild ID]"); + c->Message(Chat::White, "#guild help"); + c->Message(Chat::White, "#guild info [Guild ID]"); + c->Message(Chat::White, "#guild list"); + c->Message(Chat::White, "#guild rename [Guild ID] [New Name]"); + c->Message(Chat::White, "#guild search [Search Criteria]"); + c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)"); + c->Message(Chat::White, "#guild setleader [Guild ID] [Character ID|Character Name]"); + c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]"); + c->Message(Chat::White, "#guild status [Character ID|Character Name]"); +} diff --git a/zone/guild_mgr.cpp b/zone/guild_mgr.cpp index 07275f078..e778647e3 100644 --- a/zone/guild_mgr.cpp +++ b/zone/guild_mgr.cpp @@ -189,19 +189,70 @@ uint8 *ZoneGuildManager::MakeGuildMembers(uint32 guild_id, const char *prefix_na return(retbuffer); } -void ZoneGuildManager::ListGuilds(Client *c) const { +void ZoneGuildManager::ListGuilds(Client *c, uint32 guild_id) const { if (m_guilds.size()) { + const auto& g = m_guilds.find(guild_id); + if (g == m_guilds.end()) { + c->Message( + Chat::White, + fmt::format( + "Guild ID {} does not exist or is invalid.", + guild_id + ).c_str() + ); + return; + } + + const auto leader_name = database.GetCharNameByID(g->second->leader_char_id); c->Message( Chat::White, fmt::format( - "Listing {} Guild{}.", - m_guilds.size(), - m_guilds.size() != 1 ? "s" : "" + "Guild {} | {}Name: {}", + g->first, + ( + !leader_name.empty() ? + fmt::format( + "Leader: {} ({}) ", + leader_name, + g->second->leader_char_id + ) : + "" + ), + g->second->name ).c_str() ); + } else { + c->Message(Chat::White, "There are no Guilds to list."); + } +} + +void ZoneGuildManager::ListGuilds(Client *c, std::string search_criteria) const { + if (m_guilds.size()) { + if (search_criteria.empty()) { + c->Message( + Chat::White, + fmt::format( + "Listing {} Guild{}.", + m_guilds.size(), + m_guilds.size() != 1 ? "s" : "" + ).c_str() + ); + } + + auto found_count = 0; for (const auto& guild : m_guilds) { - auto leader_name = database.GetCharNameByID(guild.second->leader_char_id); + if ( + !search_criteria.empty() && + !Strings::Contains( + Strings::ToLower(guild.second->name), + Strings::ToLower(search_criteria) + ) + ) { + continue; + } + + const auto leader_name = database.GetCharNameByID(guild.second->leader_char_id); c->Message( Chat::White, fmt::format( @@ -219,7 +270,26 @@ void ZoneGuildManager::ListGuilds(Client *c) const { guild.second->name ).c_str() ); + + found_count++; } + + c->Message( + Chat::White, + fmt::format( + "Found {} Guild{}{}.", + found_count, + found_count != 1 ? "s" : "", + ( + !search_criteria.empty() ? + fmt::format( + " matching '{}'", + search_criteria + ) : + "" + ) + ).c_str() + ); } else { c->Message(Chat::White, "There are no Guilds to list."); } diff --git a/zone/guild_mgr.h b/zone/guild_mgr.h index 60f9ba98f..2e6a12de1 100644 --- a/zone/guild_mgr.h +++ b/zone/guild_mgr.h @@ -80,7 +80,8 @@ public: //called by worldserver when it receives a message from world. void ProcessWorldPacket(ServerPacket *pack); - void ListGuilds(Client *c) const; + void ListGuilds(Client *c, std::string search_criteria = std::string()) const; + void ListGuilds(Client *c, uint32 guild_id = 0) const; void DescribeGuild(Client *c, uint32 guild_id) const;