feat(Core/Commands): Arena command (#1798)

* New arena command
This commit is contained in:
IntelligentQuantum
2019-05-13 10:46:57 +04:30
committed by Poszer
parent b7863dc4f1
commit 9a7084e42d
8 changed files with 384 additions and 4 deletions

View File

@@ -265,6 +265,19 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result)
return true;
}
bool ArenaTeam::SetName(std::string const& name)
{
if (TeamName == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
return false;
TeamName = name;
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ARENA_TEAM_NAME);
stmt->setString(0, TeamName);
stmt->setUInt32(1, GetId());
CharacterDatabase.Execute(stmt);
return true;
}
void ArenaTeam::SetCaptain(uint64 guid)
{
// Disable remove/promote buttons
@@ -353,6 +366,29 @@ void ArenaTeam::Disband(WorldSession* session)
sArenaTeamMgr->RemoveArenaTeam(TeamId);
}
void ArenaTeam::Disband()
{
// Remove all members from arena team
while (!Members.empty())
DelMember(Members.front().Guid, false);
// Update database
SQLTransaction trans = CharacterDatabase.BeginTransaction();
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ARENA_TEAM);
stmt->setUInt32(0, TeamId);
trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ARENA_TEAM_MEMBERS);
stmt->setUInt32(0, TeamId);
trans->Append(stmt);
CharacterDatabase.CommitTransaction(trans);
// Remove arena team from ObjectMgr
sArenaTeamMgr->RemoveArenaTeam(TeamId);
}
void ArenaTeam::Roster(WorldSession* session)
{
Player* player = NULL;
@@ -587,7 +623,7 @@ uint32 ArenaTeam::GetPoints(uint32 memberRating)
points *= 0.76f;
else if (Type == ARENA_TEAM_3v3)
points *= 0.88f;
points *= sWorld->getRate(RATE_ARENA_POINTS);
return (uint32) points;
@@ -671,7 +707,7 @@ int32 ArenaTeam::GetRatingMod(uint32 ownRating, uint32 opponentRating, bool won
if (ownRating < 1300)
{
float win_rating_modifier1 = sWorld->getFloatConfig(CONFIG_ARENA_WIN_RATING_MODIFIER_1);
if (ownRating < 1000)
mod = win_rating_modifier1 * (1.0f - chance);
else

View File

@@ -77,7 +77,7 @@ enum ArenaTeamTypes
struct ArenaTeamMember
{
uint64 Guid;
//std::string Name;
std::string Name;
uint8 Class;
uint16 WeekGames;
uint16 WeekWins;
@@ -111,6 +111,7 @@ class ArenaTeam
bool Create(uint64 captainGuid, uint8 type, std::string const& teamName, uint32 backgroundColor, uint8 emblemStyle, uint32 emblemColor, uint8 borderStyle, uint32 borderColor);
void Disband(WorldSession* session);
void Disband();
typedef std::list<ArenaTeamMember> MemberList;
@@ -126,6 +127,7 @@ class ArenaTeam
uint32 GetAverageMMR(Group* group) const;
void SetCaptain(uint64 guid);
bool SetName(std::string const& name);
bool AddMember(uint64 playerGuid);
// Shouldn't be uint64 ed, because than can reference guid from members on Disband