diff --git a/data/sql/updates/pending_db_world/rev_1696722553687617600.sql b/data/sql/updates/pending_db_world/rev_1696722553687617600.sql new file mode 100644 index 000000000..e2ea5134c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1696722553687617600.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `command` WHERE `name`='commentator'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES ('commentator', 2, 'Syntax: .commentator [on/off]\r\n\r\nEnable or Disable in game Commentator tag or show current state if on/off not provided.'); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a4d64daf1..4d885098c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1294,6 +1294,8 @@ uint8 Player::GetChatTag() const tag |= CHAT_TAG_DND; if (isAFK()) tag |= CHAT_TAG_AFK; + if (IsCommentator()) + tag |= CHAT_TAG_COM; if (IsDeveloper()) tag |= CHAT_TAG_DEV; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index d74825f26..bb4b0585c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -839,7 +839,7 @@ enum PlayerChatTag CHAT_TAG_AFK = 0x01, CHAT_TAG_DND = 0x02, CHAT_TAG_GM = 0x04, - CHAT_TAG_COM = 0x08, // Commentator + CHAT_TAG_COM = 0x08, // Commentator tag. Do not exist in clean client CHAT_TAG_DEV = 0x10, }; @@ -1139,6 +1139,8 @@ public: void SendTaxiNodeStatusMultiple(); // mount_id can be used in scripting calls + [[nodiscard]] bool IsCommentator() const { return HasPlayerFlag(PLAYER_FLAGS_COMMENTATOR2); } + void SetCommentator(bool on) { ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_COMMENTATOR2, on); } [[nodiscard]] bool IsDeveloper() const { return HasPlayerFlag(PLAYER_FLAGS_DEVELOPER); } void SetDeveloper(bool on) { ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER, on); } [[nodiscard]] bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 080393da7..5fc4714fb 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -88,6 +88,7 @@ public: { static ChatCommandTable commandTable = { + { "commentator", HandleCommentatorCommand, SEC_MODERATOR, Console::No }, { "dev", HandleDevCommand, SEC_ADMINISTRATOR, Console::No }, { "gps", HandleGPSCommand, SEC_MODERATOR, Console::No }, { "aura", HandleAuraCommand, SEC_GAMEMASTER, Console::No }, @@ -451,6 +452,51 @@ public: return true; } + static bool HandleCommentatorCommand(ChatHandler* handler, Optional enableArg) + { + WorldSession* session = handler->GetSession(); + + if (!session) + { + return false; + } + + auto SetCommentatorMod = [&](bool enable) + { + session->SendNotification(enable ? "Commentator mode on" : "Commentator mode off"); + session->GetPlayer()->SetCommentator(enable); + }; + + if (!enableArg) + { + if (!AccountMgr::IsPlayerAccount(session->GetSecurity()) && session->GetPlayer()->IsCommentator()) + { + SetCommentatorMod(true); + } + else + { + SetCommentatorMod(false); + } + + return true; + } + + if (*enableArg) + { + SetCommentatorMod(true); + return true; + } + else + { + SetCommentatorMod(false); + return true; + } + + handler->SendSysMessage(LANG_USE_BOL); + handler->SetSentErrorMessage(true); + return false; + } + static bool HandleDevCommand(ChatHandler* handler, Optional enableArg) { WorldSession* session = handler->GetSession(); @@ -467,32 +513,29 @@ public: sScriptMgr->OnHandleDevCommand(handler->GetSession()->GetPlayer(), enable); }; - if (WorldSession* session = handler->GetSession()) + if (!enableArg) { - if (!enableArg) - { - if (!AccountMgr::IsPlayerAccount(session->GetSecurity()) && session->GetPlayer()->IsDeveloper()) - { - SetDevMod(true); - } - else - { - SetDevMod(false); - } - - return true; - } - - if (*enableArg) + if (!AccountMgr::IsPlayerAccount(session->GetSecurity()) && session->GetPlayer()->IsDeveloper()) { SetDevMod(true); - return true; } else { SetDevMod(false); - return true; } + + return true; + } + + if (*enableArg) + { + SetDevMod(true); + return true; + } + else + { + SetDevMod(false); + return true; } handler->SendSysMessage(LANG_USE_BOL);