aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Battlegrounds/BattlegroundMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Battlegrounds/BattlegroundMgr.cpp')
-rwxr-xr-xsrc/server/game/Battlegrounds/BattlegroundMgr.cpp163
1 files changed, 76 insertions, 87 deletions
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index 2772b5de258..b9a92f0cb44 100755
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -104,7 +104,7 @@ void BattlegroundMgr::Update(uint32 diff)
itr->second->Update(diff);
// use the SetDeleteThis variable
// direct deletion caused crashes
- if (itr->second->m_SetDeleteThis)
+ if (itr->second->ToBeDeleted())
{
Battleground* bg = itr->second;
m_Battlegrounds[i].erase(itr);
@@ -239,20 +239,20 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket *data, Battleground *bg)
// it seems this must be according to BG_WINNER_A/H and _NOT_ BG_TEAM_A/H
for (int8 i = 1; i >= 0; --i)
{
- uint32 pointsLost = bg->m_ArenaTeamRatingChanges[i] < 0 ? abs(bg->m_ArenaTeamRatingChanges[i]) : 0;
- uint32 pointsGained = bg->m_ArenaTeamRatingChanges[i] > 0 ? bg->m_ArenaTeamRatingChanges[i] : 0;
- uint32 MatchmakerRating = bg->m_ArenaTeamMMR[i];
+ int32 rating_change = bg->GetArenaTeamRatingChangeByIndex(i);
+
+ uint32 pointsLost = rating_change < 0 ? -rating_change : 0;
+ uint32 pointsGained = rating_change > 0 ? rating_change : 0;
+ uint32 MatchmakerRating = bg->GetArenaMatchmakerRatingByIndex(i);
*data << uint32(pointsLost); // Rating Lost
*data << uint32(pointsGained); // Rating gained
*data << uint32(MatchmakerRating); // Matchmaking Value
- sLog->outDebug(LOG_FILTER_BATTLEGROUND, "rating change: %d", bg->m_ArenaTeamRatingChanges[i]);
+ sLog->outDebug(LOG_FILTER_BATTLEGROUND, "rating change: %d", rating_change);
}
for (int8 i = 1; i >= 0; --i)
{
- uint32 at_id = bg->m_ArenaTeamIds[i];
- ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(at_id);
- if (at)
+ if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(bg->GetArenaTeamIdByIndex(i)))
*data << at->GetName();
else
*data << uint8(0);
@@ -417,7 +417,7 @@ void BattlegroundMgr::BuildPlaySoundPacket(WorldPacket *data, uint32 soundid)
*data << uint32(soundid);
}
-void BattlegroundMgr::BuildPlayerLeftBattlegroundPacket(WorldPacket *data, const uint64 guid)
+void BattlegroundMgr::BuildPlayerLeftBattlegroundPacket(WorldPacket *data, uint64 guid)
{
data->Initialize(SMSG_BATTLEGROUND_PLAYER_LEFT, 8);
*data << uint64(guid);
@@ -604,10 +604,7 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId bgTypeId
bg->SetBracket(bracketEntry);
// generate a new instance id
- uint32 instanceId = sMapMgr->GenerateInstanceId();
- // set instance id
- bg->SetInstanceID(instanceId);
-
+ bg->SetInstanceID(sMapMgr->GenerateInstanceId()); // set instance id
bg->SetClientInstanceID(CreateClientVisibleInstanceId(isRandom ? BATTLEGROUND_RB : bgTypeId, bracketEntry->GetBracketId()));
// reset the new bg (set status to status_wait_queue from status_none)
@@ -625,11 +622,11 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId bgTypeId
}
// used to create the BG templates
-uint32 BattlegroundMgr::CreateBattleground(BattlegroundTypeId bgTypeId, bool IsArena, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam, uint32 LevelMin, uint32 LevelMax, char* BattlegroundName, uint32 MapID, float Team1StartLocX, float Team1StartLocY, float Team1StartLocZ, float Team1StartLocO, float Team2StartLocX, float Team2StartLocY, float Team2StartLocZ, float Team2StartLocO, uint32 scriptId)
+uint32 BattlegroundMgr::CreateBattleground(CreateBattlegroundData& data)
{
// Create the BG
Battleground *bg = NULL;
- switch(bgTypeId)
+ switch (data.bgTypeId)
{
case BATTLEGROUND_AV: bg = new BattlegroundAV; break;
case BATTLEGROUND_WS: bg = new BattlegroundWS; break;
@@ -649,41 +646,35 @@ uint32 BattlegroundMgr::CreateBattleground(BattlegroundTypeId bgTypeId, bool IsA
break;
}
- bg->SetMapId(MapID);
- bg->SetTypeID(bgTypeId);
+ bg->SetMapId(data.MapID);
+ bg->SetTypeID(data.bgTypeId);
bg->SetInstanceID(0);
- bg->SetArenaorBGType(IsArena);
- bg->SetMinPlayersPerTeam(MinPlayersPerTeam);
- bg->SetMaxPlayersPerTeam(MaxPlayersPerTeam);
- bg->SetMinPlayers(MinPlayersPerTeam * 2);
- bg->SetMaxPlayers(MaxPlayersPerTeam * 2);
- bg->SetName(BattlegroundName);
- bg->SetTeamStartLoc(ALLIANCE, Team1StartLocX, Team1StartLocY, Team1StartLocZ, Team1StartLocO);
- bg->SetTeamStartLoc(HORDE, Team2StartLocX, Team2StartLocY, Team2StartLocZ, Team2StartLocO);
- bg->SetLevelRange(LevelMin, LevelMax);
- bg->SetScriptId(scriptId);
+ bg->SetArenaorBGType(data.IsArena);
+ bg->SetMinPlayersPerTeam(data.MinPlayersPerTeam);
+ bg->SetMaxPlayersPerTeam(data.MaxPlayersPerTeam);
+ bg->SetMinPlayers(data.MinPlayersPerTeam * 2);
+ bg->SetMaxPlayers(data.MaxPlayersPerTeam * 2);
+ bg->SetName(data.BattlegroundName);
+ bg->SetTeamStartLoc(ALLIANCE, data.Team1StartLocX, data.Team1StartLocY, data.Team1StartLocZ, data.Team1StartLocO);
+ bg->SetTeamStartLoc(HORDE, data.Team2StartLocX, data.Team2StartLocY, data.Team2StartLocZ, data.Team2StartLocO);
+ bg->SetLevelRange(data.LevelMin, data.LevelMax);
+ bg->SetScriptId(data.scriptId);
// add bg to update list
AddBattleground(bg->GetInstanceID(), bg->GetTypeID(), bg);
// return some not-null value, bgTypeId is good enough for me
- return bgTypeId;
+ return data.bgTypeId;
}
void BattlegroundMgr::CreateInitialBattlegrounds()
{
uint32 oldMSTime = getMSTime();
- float AStartLoc[4];
- float HStartLoc[4];
- uint32 MaxPlayersPerTeam, MinPlayersPerTeam, MinLvl, MaxLvl, start1, start2;
uint8 selectionWeight;
BattlemasterListEntry const *bl;
- WorldSafeLocsEntry const *start;
- bool IsArena;
- uint32 scriptId = 0;
- // 0 1 2 3 4 5 6 7 8 9 10
+ // 0 1 2 3 4 5 6 7 8 9 10
QueryResult result = WorldDatabase.Query("SELECT id, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, AllianceStartLoc, AllianceStartO, HordeStartLoc, HordeStartO, Weight, ScriptName FROM battleground_template");
if (!result)
@@ -693,7 +684,7 @@ void BattlegroundMgr::CreateInitialBattlegrounds()
return;
}
- uint32 count = 0;
+ uint32 count = 0, startId;
do
{
@@ -711,85 +702,83 @@ void BattlegroundMgr::CreateInitialBattlegrounds()
continue;
}
- BattlegroundTypeId bgTypeID = BattlegroundTypeId(bgTypeID_);
-
- IsArena = (bl->type == TYPE_ARENA);
- MinPlayersPerTeam = fields[1].GetUInt32();
- MaxPlayersPerTeam = fields[2].GetUInt32();
- MinLvl = fields[3].GetUInt32();
- MaxLvl = fields[4].GetUInt32();
+ CreateBattlegroundData data;
+ data.bgTypeId = BattlegroundTypeId(bgTypeID_);
+ data.IsArena = (bl->type == TYPE_ARENA);
+ data.MinPlayersPerTeam = fields[1].GetUInt32();
+ data.MaxPlayersPerTeam = fields[2].GetUInt32();
+ data.LevelMin = fields[3].GetUInt32();
+ data.LevelMax = fields[4].GetUInt32();
//check values from DB
- if (MaxPlayersPerTeam == 0 || MinPlayersPerTeam == 0 || MinPlayersPerTeam > MaxPlayersPerTeam)
+ if (data.MaxPlayersPerTeam == 0 || data.MinPlayersPerTeam == 0 || data.MinPlayersPerTeam > data.MaxPlayersPerTeam)
{
- MinPlayersPerTeam = 0; // by default now expected strong full bg requirement
- MaxPlayersPerTeam = 40;
+ data.MinPlayersPerTeam = 0; // by default now expected strong full bg requirement
+ data.MaxPlayersPerTeam = 40;
}
- if (MinLvl == 0 || MaxLvl == 0 || MinLvl > MaxLvl)
+ if (data.LevelMin == 0 || data.LevelMax == 0 || data.LevelMin > data.LevelMax)
{
//TO-DO: FIX ME
- MinLvl = 0;//bl->minlvl;
- MaxLvl = 80;//bl->maxlvl;
+ data.LevelMin = 0;//bl->minlvl;
+ data.LevelMax = 80;//bl->maxlvl;
}
- start1 = fields[5].GetUInt32();
-
- start = sWorldSafeLocsStore.LookupEntry(start1);
- if (start)
+ startId = fields[5].GetUInt32();
+ if (WorldSafeLocsEntry const* start = sWorldSafeLocsStore.LookupEntry(startId))
{
- AStartLoc[0] = start->x;
- AStartLoc[1] = start->y;
- AStartLoc[2] = start->z;
- AStartLoc[3] = fields[6].GetFloat();
+ data.Team1StartLocX = start->x;
+ data.Team1StartLocY = start->y;
+ data.Team1StartLocZ = start->z;
+ data.Team1StartLocO = fields[6].GetFloat();
}
- else if (bgTypeID == BATTLEGROUND_AA || bgTypeID == BATTLEGROUND_RB)
+ else if (data.bgTypeId == BATTLEGROUND_AA || data.bgTypeId == BATTLEGROUND_RB)
{
- AStartLoc[0] = 0;
- AStartLoc[1] = 0;
- AStartLoc[2] = 0;
- AStartLoc[3] = fields[6].GetFloat();
+ data.Team1StartLocX = 0;
+ data.Team1StartLocY = 0;
+ data.Team1StartLocZ = 0;
+ data.Team1StartLocO = fields[6].GetFloat();
}
else
{
- sLog->outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", bgTypeID, start1);
+ sLog->outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", data.bgTypeId, startId);
continue;
}
- start2 = fields[7].GetUInt32();
-
- start = sWorldSafeLocsStore.LookupEntry(start2);
- if (start)
+ startId = fields[7].GetUInt32();
+ if (WorldSafeLocsEntry const* start = sWorldSafeLocsStore.LookupEntry(startId))
{
- HStartLoc[0] = start->x;
- HStartLoc[1] = start->y;
- HStartLoc[2] = start->z;
- HStartLoc[3] = fields[8].GetFloat();
+ data.Team2StartLocX = start->x;
+ data.Team2StartLocY = start->y;
+ data.Team2StartLocZ = start->z;
+ data.Team2StartLocO = fields[8].GetFloat();
}
- else if (bgTypeID == BATTLEGROUND_AA || bgTypeID == BATTLEGROUND_RB)
+ else if (data.bgTypeId == BATTLEGROUND_AA || data.bgTypeId == BATTLEGROUND_RB)
{
- HStartLoc[0] = 0;
- HStartLoc[1] = 0;
- HStartLoc[2] = 0;
- HStartLoc[3] = fields[8].GetFloat();
+ data.Team2StartLocX = 0;
+ data.Team2StartLocY = 0;
+ data.Team2StartLocZ = 0;
+ data.Team2StartLocO = fields[8].GetFloat();
}
else
{
- sLog->outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", bgTypeID, start2);
+ sLog->outErrorDb("Table `battleground_template` for id %u have non-existed WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", data.bgTypeId, startId);
continue;
}
selectionWeight = fields[9].GetUInt8();
- scriptId = sObjectMgr->GetScriptId(fields[10].GetCString());
- //sLog->outDetail("Creating battleground %s, %u-%u", bl->name[sWorld->GetDBClang()], MinLvl, MaxLvl);
- if (!CreateBattleground(bgTypeID, IsArena, MinPlayersPerTeam, MaxPlayersPerTeam, MinLvl, MaxLvl, bl->name[sWorld->GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3], scriptId))
+ data.scriptId = sObjectMgr->GetScriptId(fields[10].GetCString());
+ data.BattlegroundName = bl->name[sWorld->GetDefaultDbcLocale()];
+ data.MapID = bl->mapid[0];
+
+ if (!CreateBattleground(data))
continue;
- if (IsArena)
+ if (data.IsArena)
{
- if (bgTypeID != BATTLEGROUND_AA)
- m_ArenaSelectionWeights[bgTypeID] = selectionWeight;
+ if (data.bgTypeId != BATTLEGROUND_AA)
+ m_ArenaSelectionWeights[data.bgTypeId] = selectionWeight;
}
- else if (bgTypeID != BATTLEGROUND_RB)
- m_BGSelectionWeights[bgTypeID] = selectionWeight;
+ else if (data.bgTypeId != BATTLEGROUND_RB)
+ m_BGSelectionWeights[data.bgTypeId] = selectionWeight;
++count;
}
while (result->NextRow());
@@ -816,7 +805,7 @@ void BattlegroundMgr::InitAutomaticArenaPointDistribution()
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Automatic Arena Point Distribution initialized.");
}
-void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket *data, const uint64 guid, Player* plr, BattlegroundTypeId bgTypeId, uint8 fromWhere)
+void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket *data, uint64 guid, Player* plr, BattlegroundTypeId bgTypeId, uint8 fromWhere)
{
if (!plr)
return;
@@ -901,7 +890,7 @@ void BattlegroundMgr::SendToBattleground(Player *pl, uint32 instanceId, Battlegr
}
}
-void BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(Player *pl, Battleground *bg, const uint64 guid)
+void BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(Player *pl, Battleground *bg, uint64 guid)
{
WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12);
uint32 time_ = 30000 - bg->GetLastResurrectTime(); // resurrect every 30 seconds