Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Mortos/738b9745e1ad06667d27 to your computer and use it in GitHub Desktop.
Save Mortos/738b9745e1ad06667d27 to your computer and use it in GitHub Desktop.
An attempt for an arena season reset command for TC
From 38ea1a21f136e335f266888031afadb3d299d5ab Mon Sep 17 00:00:00 2001
From: Mortos <dss_mortos@outlook.com>
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
@DDuarte
Copy link

DDuarte commented Sep 7, 2014

  • I think that teams do not get disbanded at the end of the season; maybe that could be an optional argument in the command
  • The value 60 should be defined somewhere in worldserver.conf.
  • The way you did is better than executing queries directly because that could make the DB and the core have different values.

@Mortos
Copy link
Author

Mortos commented Sep 9, 2014

Thanks for taking the time Nay, I will include this changes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment