aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2025_08_25_02_world.sql16
-rw-r--r--src/server/game/Guilds/GuildMgr.h5
-rw-r--r--src/server/game/Miscellaneous/Language.h8
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp33
4 files changed, 60 insertions, 2 deletions
diff --git a/sql/updates/world/master/2025_08_25_02_world.sql b/sql/updates/world/master/2025_08_25_02_world.sql
new file mode 100644
index 00000000000..04618e9ce48
--- /dev/null
+++ b/sql/updates/world/master/2025_08_25_02_world.sql
@@ -0,0 +1,16 @@
+--
+DELETE FROM `command` WHERE `name`='guild list';
+INSERT INTO `command` (`name`, `help`) VALUES
+('guild list','Syntax: .guild list. Lists every guild: ID | Name | Leader | Creation date | Members | Bank gold');
+
+-- Strings for .guild list output
+DELETE FROM `trinity_string` WHERE `entry` BETWEEN 1219 AND 1222;
+INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES
+-- Title
+(1219,'%s=== Guild list ===%s'),
+-- Header (6 string args for labels)
+(1220,'%s ID | Name | Leader | Creation date | Members | Bank gold%s'),
+-- Row (id, name, gm, created, members, bankGold)
+(1221,'%6u | %-24.24s | %-16.16s | %-19s | %7u | %10u'),
+-- Total
+(1222,'%sTotal guilds: %u%s');
diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h
index 787d8da8c16..97d82caa4f0 100644
--- a/src/server/game/Guilds/GuildMgr.h
+++ b/src/server/game/Guilds/GuildMgr.h
@@ -34,6 +34,8 @@ private:
~GuildMgr();
public:
+ typedef std::unordered_map<ObjectGuid::LowType, Trinity::unique_trackable_ptr<Guild>> GuildContainer;
+
GuildMgr(GuildMgr const&) = delete;
GuildMgr(GuildMgr&&) = delete;
GuildMgr& operator=(GuildMgr const&) = delete;
@@ -47,6 +49,8 @@ public:
Guild* GetGuildByName(std::string_view guildName) const;
std::string GetGuildNameById(ObjectGuid::LowType guildId) const;
+ GuildContainer const& GetGuildStore() const { return GuildStore; }
+
void LoadGuildRewards();
void LoadGuilds();
@@ -64,7 +68,6 @@ public:
void ResetTimes(bool week);
protected:
- typedef std::unordered_map<ObjectGuid::LowType, Trinity::unique_trackable_ptr<Guild>> GuildContainer;
ObjectGuid::LowType NextGuildId;
GuildContainer GuildStore;
std::vector<GuildReward> GuildRewards;
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 389b5930b99..5b17f33b7fd 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -995,7 +995,13 @@ enum TrinityStrings
LANG_ACCOUNT_BNET_UNLINKED = 1216,
LANG_ACCOUNT_BNET_NOT_LINKED = 1217,
LANG_DISALLOW_TICKETS_CONFIG = 1218,
- // 1219-1499 - free
+
+ // Guild list (.guild list)
+ LANG_GUILD_LIST_TITLE = 1219,
+ LANG_GUILD_LIST_HEADER = 1220,
+ LANG_GUILD_LIST_ROW = 1221,
+ LANG_GUILD_LIST_TOTAL = 1222,
+ // 1223-1499 - free
// Command argument parsers
LANG_CMDPARSER_EITHER = 1500,
diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp
index 1518d0b5422..08fbaf49c23 100644
--- a/src/server/scripts/Commands/cs_guild.cpp
+++ b/src/server/scripts/Commands/cs_guild.cpp
@@ -33,6 +33,7 @@ EndScriptData */
#include "ObjectMgr.h"
#include "Player.h"
#include "RBAC.h"
+#include "Util.h"
#include <iomanip>
#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
@@ -56,6 +57,7 @@ public:
{ "rank", rbac::RBAC_PERM_COMMAND_GUILD_RANK, true, &HandleGuildRankCommand, "" },
{ "rename", rbac::RBAC_PERM_COMMAND_GUILD_RENAME, true, &HandleGuildRenameCommand, "" },
{ "info", rbac::RBAC_PERM_COMMAND_GUILD_INFO, true, &HandleGuildInfoCommand, "" },
+ { "list", rbac::RBAC_PERM_COMMAND_GUILD_INFO, true, &HandleGuildListCommand, "" },
};
static std::vector<ChatCommand> commandTable =
{
@@ -299,6 +301,37 @@ public:
handler->PSendSysMessage(LANG_GUILD_INFO_EXTRA_INFO, guild->GetInfo().c_str()); // Extra Information
return true;
}
+
+ static bool HandleGuildListCommand(ChatHandler* handler)
+ {
+ std::string_view titleAndSummaryColor = handler->IsConsole() ? ""sv : "|cff00ff00"sv;
+ std::string_view tableHeaderColor = handler->IsConsole() ? ""sv : "|cff00ffff"sv;
+ std::string_view resetColor = handler->IsConsole() ? ""sv : "|r"sv;
+
+ handler->PSendSysMessage(LANG_GUILD_LIST_TITLE, titleAndSummaryColor, resetColor);
+ handler->PSendSysMessage(LANG_GUILD_LIST_HEADER, tableHeaderColor, resetColor);
+
+ GuildMgr::GuildContainer const& guildStore = sGuildMgr->GetGuildStore();
+
+ for (auto const& [id, g] : guildStore)
+ {
+ std::string gmName;
+ if (!sCharacterCache->GetCharacterNameByGuid(g->GetLeaderGUID(), gmName))
+ gmName = "---";
+
+ handler->PSendSysMessage(LANG_GUILD_LIST_ROW,
+ id,
+ g->GetName().c_str(),
+ gmName.c_str(),
+ TimeToTimestampStr(g->GetCreatedDate()).c_str(),
+ g->GetMembersCount(),
+ g->GetBankMoney() / GOLD
+ );
+ }
+
+ handler->PSendSysMessage(LANG_GUILD_LIST_TOTAL, titleAndSummaryColor, guildStore.size(), resetColor);
+ return true;
+ }
};
void AddSC_guild_commandscript()