Last active
August 29, 2015 14:06
-
-
Save Mortos/738b9745e1ad06667d27 to your computer and use it in GitHub Desktop.
An attempt for an arena season reset command for TC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 38ea1a21f136e335f266888031afadb3d299d5ab Mon Sep 17 00:00:00 2001 | |
From: Mortos <[email protected]> | |
Date: Tue, 9 Sep 2014 15:20:29 -0600 | |
Subject: [PATCH] Scripts/Commands: Added .arena commands to handle season | |
start/end and reset | |
--- | |
sql/updates/world/2014_XX_XX_XX_trinity_string.sql | 4 + | |
src/server/game/Accounts/RBAC.h | 4 + | |
src/server/game/Miscellaneous/Language.h | 6 +- | |
src/server/game/World/World.cpp | 1 + | |
src/server/game/World/World.h | 1 + | |
src/server/scripts/Commands/cs_arena.cpp | 99 ++++++++++++++++++++++ | |
6 files changed, 114 insertions(+), 1 deletion(-) | |
create mode 100644 sql/updates/world/2014_XX_XX_XX_trinity_string.sql | |
diff --git a/sql/updates/world/2014_XX_XX_XX_trinity_string.sql b/sql/updates/world/2014_XX_XX_XX_trinity_string.sql | |
new file mode 100644 | |
index 0000000..c19b376 | |
--- /dev/null | |
+++ b/sql/updates/world/2014_XX_XX_XX_trinity_string.sql | |
@@ -0,0 +1,4 @@ | |
+DELETE FROM `trinity_string` WHERE `entry` IN (5057, 5058); | |
+INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES | |
+(5057, 'Arena Season %d already ended'), | |
+(5058, 'Arena Season %d already in progress'); | |
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h | |
index 020ed1a..3f124bc 100644 | |
--- a/src/server/game/Accounts/RBAC.h | |
+++ b/src/server/game/Accounts/RBAC.h | |
@@ -100,6 +100,10 @@ enum RBACPermissions | |
RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48, | |
RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49, | |
RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50, | |
+ RBAC_PERM_COMMAND_ARENA_SEASON = 51, | |
+ RBAC_PERM_COMMAND_ARENA_SEASON_RESET = 52, | |
+ RBAC_PERM_COMMAND_ARENA_SEASON_START = 53, | |
+ RBAC_PERM_COMMAND_ARENA_SEASON_END = 54, | |
// Free space for core permissions (till 149) | |
// Roles (Permissions with delegated permissions) use 199 and descending | |
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h | |
index eceb0a8..0dfe260 100644 | |
--- a/src/server/game/Miscellaneous/Language.h | |
+++ b/src/server/game/Miscellaneous/Language.h | |
@@ -1109,7 +1109,11 @@ enum TrinityStrings | |
LANG_NOT_DUNGEON = 5055, // Map is not a dungeon. | |
LANG_NO_INSTANCE_DATA = 5056, // Map has no instance data. | |
- // Room for more Trinity strings 5057-9999 | |
+ // For the arena season command | |
+ LANG_ARENA_ERROR_SEASON_ENDED = 5057, | |
+ LANG_ARENA_ERROR_SEASON_STARTED = 5058, | |
+ | |
+ // Room for more Trinity strings 5059-9999 | |
// Level requirement notifications | |
LANG_SAY_REQ = 6604, | |
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp | |
index 5c65055..d8c0211 100644 | |
--- a/src/server/game/World/World.cpp | |
+++ b/src/server/game/World/World.cpp | |
@@ -1035,6 +1035,7 @@ void World::LoadConfigSettings(bool reload) | |
m_bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetBoolDefault("Arena.QueueAnnouncer.Enable", false); | |
m_bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetBoolDefault("Arena.QueueAnnouncer.PlayerOnly", false); | |
m_int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetIntDefault ("Arena.ArenaSeason.ID", 1); | |
+ m_int_configs[CONFIG_ARENA_SEASON_ENTRY] = sConfigMgr->GetIntDefault ("Arena.ArenaSeason.Entry", 60); | |
m_int_configs[CONFIG_ARENA_START_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartRating", 0); | |
m_int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartPersonalRating", 1000); | |
m_int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartMatchmakerRating", 1500); | |
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h | |
index 05bfcc2..7537ed5 100644 | |
--- a/src/server/game/World/World.h | |
+++ b/src/server/game/World/World.h | |
@@ -278,6 +278,7 @@ enum WorldIntConfigs | |
CONFIG_ARENA_RATED_UPDATE_TIMER, | |
CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS, | |
CONFIG_ARENA_SEASON_ID, | |
+ CONFIG_ARENA_SEASON_ENTRY, | |
CONFIG_ARENA_START_RATING, | |
CONFIG_ARENA_START_PERSONAL_RATING, | |
CONFIG_ARENA_START_MATCHMAKER_RATING, | |
diff --git a/src/server/scripts/Commands/cs_arena.cpp b/src/server/scripts/Commands/cs_arena.cpp | |
index 5658701..9a05577 100644 | |
--- a/src/server/scripts/Commands/cs_arena.cpp | |
+++ b/src/server/scripts/Commands/cs_arena.cpp | |
@@ -36,6 +36,13 @@ public: | |
ChatCommand* GetCommands() const override | |
{ | |
+ static ChatCommand seasonCommandTable[] = | |
+ { | |
+ { "start", rbac::RBAC_PERM_COMMAND_ARENA_SEASON_START, true, &HandleArenaSeasonStartCommand, "", NULL }, | |
+ { "end", rbac::RBAC_PERM_COMMAND_ARENA_SEASON_END, true, &HandleArenaSeasonEndCommand, "", NULL }, | |
+ { "reset", rbac::RBAC_PERM_COMMAND_ARENA_SEASON_RESET, true, &HandleArenaSeasonResetCommand, "", NULL }, | |
+ { NULL, 0, false, NULL, "", NULL } | |
+ }; | |
static ChatCommand arenaCommandTable[] = | |
{ | |
{ "create", rbac::RBAC_PERM_COMMAND_ARENA_CREATE, true, &HandleArenaCreateCommand, "", NULL }, | |
@@ -44,6 +51,7 @@ public: | |
{ "captain", rbac::RBAC_PERM_COMMAND_ARENA_CAPTAIN, false, &HandleArenaCaptainCommand, "", NULL }, | |
{ "info", rbac::RBAC_PERM_COMMAND_ARENA_INFO, true, &HandleArenaInfoCommand, "", NULL }, | |
{ "lookup", rbac::RBAC_PERM_COMMAND_ARENA_LOOKUP, false, &HandleArenaLookupCommand, "", NULL }, | |
+ { "season", rbac::RBAC_PERM_COMMAND_ARENA_SEASON, true, NULL, "", seasonCommandTable }, | |
{ NULL, 0, false, NULL, "", NULL } | |
}; | |
static ChatCommand commandTable[] = | |
@@ -353,6 +361,97 @@ public: | |
return true; | |
} | |
+ | |
+ static bool HandleArenaSeasonEndCommand(ChatHandler* handler, char const* /*args*/) | |
+ { | |
+ uint8 season = sWorld->getIntConfig(CONFIG_ARENA_SEASON_ENTRY); | |
+ GameEventMgr::ActiveEvents const& activeEvents = sGameEventMgr->GetActiveEventList(); | |
+ if (activeEvents.find(season) == activeEvents.end()) | |
+ { | |
+ handler->PSendSysMessage(LANG_ARENA_ERROR_SEASON_ENDED, sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID)); | |
+ handler->SetSentErrorMessage(true); | |
+ return false; | |
+ } | |
+ | |
+ ArenaTeamMgr::ArenaTeamContainer::const_iterator i = sArenaTeamMgr->GetArenaTeamMapBegin(); | |
+ for (; i != sArenaTeamMgr->GetArenaTeamMapEnd(); ++i) | |
+ { | |
+ ArenaTeam* team = i->second; | |
+ if (team->IsFighting()) | |
+ team->FinishGame(0); | |
+ } | |
+ sGameEventMgr->StopEvent(season, true); | |
+ return true; | |
+ } | |
+ | |
+ static bool HandleArenaSeasonStartCommand(ChatHandler* handler, char const* /*args*/) | |
+ { | |
+ uint8 season = sWorld->getIntConfig(CONFIG_ARENA_SEASON_ENTRY); | |
+ GameEventMgr::ActiveEvents const& activeEvents = sGameEventMgr->GetActiveEventList(); | |
+ if (activeEvents.find(season) != activeEvents.end()) | |
+ { | |
+ handler->PSendSysMessage(LANG_ARENA_ERROR_SEASON_STARTED, sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID)); | |
+ handler->SetSentErrorMessage(true); | |
+ return false; | |
+ } | |
+ | |
+ sGameEventMgr->StartEvent(season, true); | |
+ return true; | |
+ } | |
+ | |
+ static bool HandleArenaSeasonResetCommand(ChatHandler* handler, char const* args) | |
+ { | |
+ uint8 season = sWorld->getIntConfig(CONFIG_ARENA_SEASON_ENTRY); | |
+ // disable the arena season event so players can't queue during the reset | |
+ GameEventMgr::ActiveEvents const& activeEvents = sGameEventMgr->GetActiveEventList(); | |
+ if (activeEvents.find(season) != activeEvents.end()) | |
+ { | |
+ sGameEventMgr->StopEvent(season, true); | |
+ } | |
+ | |
+ // stop all fights, disband all teams (optional) and reset MMR | |
+ ArenaTeamMgr::ArenaTeamContainer::const_iterator i = sArenaTeamMgr->GetArenaTeamMapBegin(); | |
+ // is this iterating over all the brackets? | |
+ for (; i != sArenaTeamMgr->GetArenaTeamMapEnd(); ++i) | |
+ { | |
+ ArenaTeam* team = i->second; | |
+ ArenaTeam::MemberList::iterator member = team->m_membersBegin; | |
+ | |
+ if (team->IsFighting()) | |
+ team->FinishGame(0); | |
+ | |
+ if (!team->Empty()) | |
+ // how can we handle the MMR of players without a team? | |
+ for (; member != team->m_membersEnd(); ++member) | |
+ { | |
+ member->ModifyMatchmakerRating(0, 0); | |
+ member->ModifyMatchmakerRating(0, 1); | |
+ member->ModifyMatchmakerRating(0, 2); | |
+ } | |
+ | |
+ team->SaveToDB(); | |
+ | |
+ if (strncmp(args, "delteam", 8) == 0) | |
+ { | |
+ team->Disband(); | |
+ delete(team); | |
+ } | |
+ } | |
+ | |
+ // get all players and erase all arena points | |
+ SessionMap sessions = sWorld->GetAllSessions(); | |
+ SessionMap::iterator itr; | |
+ for (itr = sessions.begin(); itr != sessions.end(); ++itr) | |
+ { | |
+ Player* player = itr->second->GetPlayer(); | |
+ player->SetArenaPoints(0); | |
+ player->SaveToDB(); | |
+ } | |
+ | |
+ // restart the season | |
+ sGameEventMgr->StartEvent(season, true); | |
+ return true; | |
+ } | |
}; | |
void AddSC_arena_commandscript() | |
-- | |
1.8.3.msysgit.0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for taking the time Nay, I will include this changes