Merge branch 'master' into Playerbot
This commit is contained in:
@@ -633,6 +633,7 @@ void BossAI::_Reset()
|
||||
me->ResetLootMode();
|
||||
events.Reset();
|
||||
scheduler.CancelAll();
|
||||
me->m_Events.KillAllEvents(false);
|
||||
summons.DespawnAll();
|
||||
ClearUniqueTimedEventsDone();
|
||||
_healthCheckEvents.clear();
|
||||
@@ -787,6 +788,20 @@ void BossAI::ScheduleHealthCheckEvent(std::initializer_list<uint8> healthPct, st
|
||||
_nextHealthCheck = _healthCheckEvents.front();
|
||||
}
|
||||
|
||||
void BossAI::ScheduleEnrageTimer(uint32 spellId, Milliseconds timer, uint8 textId /*= 0*/)
|
||||
{
|
||||
me->m_Events.AddEventAtOffset([this, spellId, textId]
|
||||
{
|
||||
if (!me->IsAlive())
|
||||
return;
|
||||
|
||||
if (textId)
|
||||
Talk(textId);
|
||||
|
||||
DoCastSelf(spellId, true);
|
||||
}, timer);
|
||||
}
|
||||
|
||||
// WorldBossAI - for non-instanced bosses
|
||||
|
||||
WorldBossAI::WorldBossAI(Creature* creature) :
|
||||
|
||||
@@ -485,6 +485,12 @@ public:
|
||||
void ScheduleHealthCheckEvent(uint32 healthPct, std::function<void()> exec);
|
||||
void ScheduleHealthCheckEvent(std::initializer_list<uint8> healthPct, std::function<void()> exec);
|
||||
|
||||
// @brief Casts the spell after the fixed time and says the text id if provided. Timer will run even if the creature is casting or out of combat.
|
||||
// @param spellId The spell to cast.
|
||||
// @param timer The time to wait before casting the spell.
|
||||
// @param textId The text id to say.
|
||||
void ScheduleEnrageTimer(uint32 spellId, Milliseconds timer, uint8 textId = 0);
|
||||
|
||||
// Hook used to execute events scheduled into EventMap without the need
|
||||
// to override UpdateAI
|
||||
// note: You must re-schedule the event within this method if the event
|
||||
|
||||
@@ -168,6 +168,7 @@ bool Battlefield::Update(uint32 diff)
|
||||
m_StartGrouping = true;
|
||||
InvitePlayersInZoneToQueue();
|
||||
OnStartGrouping();
|
||||
SendUpdateWorldStates();
|
||||
}
|
||||
|
||||
bool objective_changed = false;
|
||||
@@ -353,6 +354,8 @@ void Battlefield::StartBattle()
|
||||
DoPlaySoundToAll(BF_START);
|
||||
|
||||
OnBattleStart();
|
||||
|
||||
SendUpdateWorldStates();
|
||||
}
|
||||
|
||||
void Battlefield::EndBattle(bool endByTimer)
|
||||
@@ -377,6 +380,7 @@ void Battlefield::EndBattle(bool endByTimer)
|
||||
// Reset battlefield timer
|
||||
m_Timer = m_NoWarBattleTime;
|
||||
SendInitWorldStatesToAll();
|
||||
SendUpdateWorldStates();
|
||||
}
|
||||
|
||||
void Battlefield::DoPlaySoundToAll(uint32 SoundID)
|
||||
@@ -403,13 +407,15 @@ void Battlefield::AskToLeaveQueue(Player* player)
|
||||
{
|
||||
// Remove player from queue
|
||||
m_PlayersInQueue[player->GetTeamId()].erase(player->GetGUID());
|
||||
// Send notification
|
||||
player->GetSession()->SendBfLeaveMessage(m_BattleId, BF_LEAVE_REASON_CLOSE);
|
||||
}
|
||||
|
||||
// Called in WorldSession::HandleHearthAndResurrect
|
||||
void Battlefield::PlayerAskToLeave(Player* player)
|
||||
{
|
||||
// Player leaving Wintergrasp, trigger Hearthstone spell.
|
||||
player->CastSpell(player, 8690, true);
|
||||
// Player leaving Wintergrasp, teleport to homebind possition.
|
||||
player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation());
|
||||
}
|
||||
|
||||
// Called in WorldSession::HandleBfEntryInviteResponse
|
||||
|
||||
@@ -335,6 +335,7 @@ public:
|
||||
/// Send all worldstate data to all player in zone.
|
||||
virtual void SendInitWorldStatesToAll() = 0;
|
||||
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& /*packet*/) = 0;
|
||||
virtual void SendUpdateWorldStates(Player* player = nullptr) = 0;
|
||||
|
||||
/// Return if we can use mount in battlefield
|
||||
bool CanFlyIn() { return !m_isActive; }
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "TemporarySummon.h"
|
||||
#include "Vehicle.h"
|
||||
#include "WorldSession.h"
|
||||
#include "WorldSessionMgr.h"
|
||||
#include "WorldStatePackets.h"
|
||||
|
||||
BattlefieldWG::~BattlefieldWG()
|
||||
@@ -936,16 +937,21 @@ uint32 BattlefieldWG::GetData(uint32 data) const
|
||||
|
||||
void BattlefieldWG::FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet)
|
||||
{
|
||||
packet.Worldstates.reserve(4+2+WG_MAX_OBJ+WG_MAX_WORKSHOP);
|
||||
uint32 timer = GetTimer() / 1000;
|
||||
bool iconActive = timer < 15 * MINUTE || IsWarTime();
|
||||
|
||||
packet.Worldstates.reserve(4+4+WG_MAX_OBJ+WG_MAX_WORKSHOP);
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_ATTACKER, GetAttackerTeam());
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_DEFENDER, GetDefenderTeam());
|
||||
|
||||
// Note: cleanup these two, their names look awkward
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, IsWarTime() ? 0 : 1);
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE, IsWarTime() ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_CONTROL, m_DefenderTeam == TEAM_ALLIANCE ? 2 : 1); // Alliance 2, Hord 1
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_ICON_ACTIVE, iconActive ? 1 : 0);
|
||||
|
||||
for (uint32 i = 0; i < 2; ++i)
|
||||
packet.Worldstates.emplace_back(ClockWorldState[i], GameTime::GetGameTime().count() + (m_Timer / 1000));
|
||||
packet.Worldstates.emplace_back(ClockWorldState[i], GameTime::GetGameTime().count() + timer);
|
||||
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
|
||||
packet.Worldstates.emplace_back(BATTLEFIELD_WG_WORLD_STATE_MAX_VEHICLE_H, GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H));
|
||||
@@ -984,6 +990,34 @@ void BattlefieldWG::SendInitWorldStatesToAll()
|
||||
SendInitWorldStatesTo(player);
|
||||
}
|
||||
|
||||
void BattlefieldWG::SendUpdateWorldStates(Player* player)
|
||||
{
|
||||
uint32 timer = GetTimer() / 1000;
|
||||
bool iconActive = timer < 15 * MINUTE || IsWarTime();
|
||||
|
||||
SendUpdateWorldStateMessage(BATTLEFIELD_WG_WORLD_STATE_ATTACKER, GetAttackerTeam(), player);
|
||||
SendUpdateWorldStateMessage(BATTLEFIELD_WG_WORLD_STATE_DEFENDER, GetDefenderTeam(), player);
|
||||
SendUpdateWorldStateMessage(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, IsWarTime() ? 0 : 1, player);
|
||||
SendUpdateWorldStateMessage(BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE, IsWarTime() ? 1 : 0, player);
|
||||
SendUpdateWorldStateMessage(BATTLEFIELD_WG_WORLD_STATE_CONTROL, GetDefenderTeam() == TEAM_ALLIANCE ? 2 : 1, player);
|
||||
SendUpdateWorldStateMessage(BATTLEFIELD_WG_WORLD_STATE_ICON_ACTIVE, iconActive ? 1 : 0, player);
|
||||
|
||||
for (uint32 i = 0; i < 2; ++i)
|
||||
SendUpdateWorldStateMessage(ClockWorldState[i], uint32(GameTime::GetGameTime().count() + timer), player);
|
||||
}
|
||||
|
||||
void BattlefieldWG::SendUpdateWorldStateMessage(uint32 variable, uint32 value, Player* player)
|
||||
{
|
||||
WorldPackets::WorldState::UpdateWorldState worldState;
|
||||
worldState.VariableID = variable;
|
||||
worldState.Value = value;
|
||||
|
||||
if (player)
|
||||
player->SendDirectMessage(worldState.Write());
|
||||
else
|
||||
sWorldSessionMgr->SendGlobalMessage(worldState.Write());
|
||||
}
|
||||
|
||||
void BattlefieldWG::BrokenWallOrTower(TeamId /*team*/)
|
||||
{
|
||||
// might be some use for this in the future. old code commented out below. KL
|
||||
|
||||
@@ -109,6 +109,8 @@ enum WintergraspWorldStates
|
||||
BATTLEFIELD_WG_WORLD_STATE_DEFENDER = 3802,
|
||||
BATTLEFIELD_WG_WORLD_STATE_ATTACKER = 3803,
|
||||
BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE = 3710,
|
||||
BATTLEFIELD_WG_WORLD_STATE_CONTROL = 3804, // Shows on the map who controls WG
|
||||
BATTLEFIELD_WG_WORLD_STATE_ICON_ACTIVE = 4375, // Activates "ice" icon
|
||||
};
|
||||
|
||||
enum WintergraspAreaIds
|
||||
@@ -405,6 +407,8 @@ public:
|
||||
void SendInitWorldStatesTo(Player* player);
|
||||
void SendInitWorldStatesToAll() override;
|
||||
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override;
|
||||
void SendUpdateWorldStates(Player* player = nullptr) override;
|
||||
void SendUpdateWorldStateMessage(uint32 variable, uint32 value, Player* player = nullptr);
|
||||
|
||||
void HandleKill(Player* killer, Unit* victim) override;
|
||||
void OnUnitDeath(Unit* unit) override;
|
||||
|
||||
@@ -108,8 +108,8 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff)
|
||||
auto reputationRewards = uint8(m_TeamScores[teamId] / _reputationTics);
|
||||
auto information = uint8(m_TeamScores[teamId] / BG_AB_WARNING_NEAR_VICTORY_SCORE);
|
||||
m_TeamScores[teamId] += BG_AB_TickPoints[controlledPoints];
|
||||
if (m_TeamScores[teamId] > BG_AB_MAX_TEAM_SCORE)
|
||||
m_TeamScores[teamId] = BG_AB_MAX_TEAM_SCORE;
|
||||
if (m_TeamScores[teamId] > static_cast<int32>(_configurableMaxTeamScore))
|
||||
m_TeamScores[teamId] = _configurableMaxTeamScore;
|
||||
|
||||
if (honorRewards < uint8(m_TeamScores[teamId] / _honorTics))
|
||||
RewardHonorToTeam(GetBonusHonorFromKill(1), teamId);
|
||||
@@ -132,7 +132,7 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff)
|
||||
UpdateWorldState(teamId == TEAM_ALLIANCE ? BG_AB_OP_RESOURCES_ALLY : BG_AB_OP_RESOURCES_HORDE, m_TeamScores[teamId]);
|
||||
if (m_TeamScores[teamId] > m_TeamScores[GetOtherTeamId(teamId)] + 500)
|
||||
_teamScores500Disadvantage[GetOtherTeamId(teamId)] = true;
|
||||
if (m_TeamScores[teamId] >= BG_AB_MAX_TEAM_SCORE)
|
||||
if (m_TeamScores[teamId] >= static_cast<int32>(_configurableMaxTeamScore))
|
||||
EndBattleground(teamId);
|
||||
|
||||
_bgEvents.ScheduleEvent(eventId, BG_AB_TickIntervals[controlledPoints]);
|
||||
@@ -245,12 +245,11 @@ void BattlegroundAB::FillInitialWorldStates(WorldPackets::WorldState::InitWorldS
|
||||
|
||||
for (uint8 i = BG_AB_NODE_STATE_ALLY_OCCUPIED; i <= BG_AB_NODE_STATE_HORDE_CONTESTED; ++i)
|
||||
packet.Worldstates.emplace_back(node._iconCapture + i - 1, node._state == i ? 1 : 0);
|
||||
|
||||
}
|
||||
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_OCCUPIED_BASES_ALLY, _controlledPoints[TEAM_ALLIANCE]);
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_OCCUPIED_BASES_HORDE, _controlledPoints[TEAM_HORDE]);
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_RESOURCES_MAX, BG_AB_MAX_TEAM_SCORE);
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_RESOURCES_MAX, _configurableMaxTeamScore);
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_RESOURCES_WARNING, BG_AB_WARNING_NEAR_VICTORY_SCORE);
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[TEAM_ALLIANCE]);
|
||||
packet.Worldstates.emplace_back(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[TEAM_HORDE]);
|
||||
@@ -481,6 +480,11 @@ void BattlegroundAB::Init()
|
||||
_capturePointInfo[BG_AB_NODE_BLACKSMITH]._iconCapture = BG_AB_OP_BLACKSMITH_STATE_ALIENCE;
|
||||
_capturePointInfo[BG_AB_NODE_LUMBER_MILL]._iconCapture = BG_AB_OP_LUMBERMILL_STATE_ALIENCE;
|
||||
_capturePointInfo[BG_AB_NODE_GOLD_MINE]._iconCapture = BG_AB_OP_GOLDMINE_STATE_ALIENCE;
|
||||
|
||||
uint32 bgArathiCapturePointsConfig = sWorld->getIntConfig(CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS);
|
||||
_configurableMaxTeamScore = bgArathiCapturePointsConfig > 0
|
||||
? bgArathiCapturePointsConfig
|
||||
: static_cast<uint32>(BG_AB_MAX_TEAM_SCORE);
|
||||
}
|
||||
|
||||
void BattlegroundAB::EndBattleground(TeamId winnerTeamId)
|
||||
|
||||
@@ -342,5 +342,6 @@ private:
|
||||
uint32 _reputationTics;
|
||||
uint8 _controlledPoints[PVP_TEAMS_COUNT] {};
|
||||
bool _teamScores500Disadvantage[PVP_TEAMS_COUNT] {};
|
||||
uint32 _configurableMaxTeamScore;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -266,6 +266,9 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player)
|
||||
|
||||
void BattlegroundAV::UpdateScore(TeamId teamId, int16 points)
|
||||
{
|
||||
if (BG_AV_SCORE_INITIAL_POINTS == 0)
|
||||
return; // don't update teamscores if reinforcements are disabled
|
||||
|
||||
//note: to remove reinforcementpoints points must be negative, for adding reinforcements points must be positive
|
||||
m_Team_Scores[teamId] += points;
|
||||
|
||||
@@ -475,8 +478,11 @@ void BattlegroundAV::StartingEventOpenDoors()
|
||||
for (uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; mine++) //mine population
|
||||
ChangeMineOwner(mine, TEAM_NEUTRAL, true);
|
||||
|
||||
UpdateWorldState(AV_SHOW_H_SCORE, 1);
|
||||
UpdateWorldState(AV_SHOW_A_SCORE, 1);
|
||||
if (BG_AV_SCORE_INITIAL_POINTS > 0) // display teamscores on top only if reinforcements are enabled
|
||||
{
|
||||
UpdateWorldState(AV_SHOW_H_SCORE, 1);
|
||||
UpdateWorldState(AV_SHOW_A_SCORE, 1);
|
||||
}
|
||||
|
||||
DoorOpen(BG_AV_OBJECT_DOOR_H);
|
||||
DoorOpen(BG_AV_OBJECT_DOOR_A);
|
||||
@@ -1114,11 +1120,12 @@ void BattlegroundAV::FillInitialWorldStates(WorldPackets::WorldState::InitWorldS
|
||||
{
|
||||
packet.Worldstates.emplace_back(AV_SNOWFALL_N, 1);
|
||||
}
|
||||
|
||||
packet.Worldstates.emplace_back(AV_Alliance_Score, m_Team_Scores[0]);
|
||||
packet.Worldstates.emplace_back(AV_Horde_Score, m_Team_Scores[1]);
|
||||
|
||||
packet.Worldstates.emplace_back(AV_SHOW_A_SCORE, GetStatus() == STATUS_IN_PROGRESS ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(AV_SHOW_H_SCORE, GetStatus() == STATUS_IN_PROGRESS ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(AV_SHOW_A_SCORE, GetStatus() == STATUS_IN_PROGRESS && BG_AV_SCORE_INITIAL_POINTS > 0 ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(AV_SHOW_H_SCORE, GetStatus() == STATUS_IN_PROGRESS && BG_AV_SCORE_INITIAL_POINTS > 0 ? 1 : 0);
|
||||
|
||||
SendMineWorldStates(AV_NORTH_MINE);
|
||||
SendMineWorldStates(AV_SOUTH_MINE);
|
||||
|
||||
@@ -21,14 +21,14 @@
|
||||
#include "Battleground.h"
|
||||
#include "BattlegroundScore.h"
|
||||
|
||||
#define BG_AV_CAPTIME 240000 //4:00
|
||||
#define BG_AV_SNOWFALL_FIRSTCAP 300000 //5:00 but i also have seen 4:05
|
||||
#define BG_AV_CAPTIME 240000 //4:00
|
||||
#define BG_AV_SNOWFALL_FIRSTCAP 300000 //5:00 but i also have seen 4:05
|
||||
|
||||
#define BG_AV_SCORE_INITIAL_POINTS 600
|
||||
#define SEND_MSG_NEAR_LOSE 120
|
||||
#define BG_AV_SCORE_INITIAL_POINTS (sWorld->getIntConfig(CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS)) // Blizzlike default is 600
|
||||
#define SEND_MSG_NEAR_LOSE 120
|
||||
|
||||
#define BG_AV_KILL_BOSS 4
|
||||
#define BG_AV_REP_BOSS 350
|
||||
#define BG_AV_REP_BOSS (sWorld->getIntConfig(CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH)) // Blizzlike default is 350
|
||||
|
||||
#define BG_AV_KILL_CAPTAIN 3
|
||||
#define BG_AV_REP_CAPTAIN 125
|
||||
@@ -38,7 +38,7 @@
|
||||
#define BG_AV_REP_TOWER 12
|
||||
#define BG_AV_RES_TOWER 75
|
||||
|
||||
#define BG_AV_GET_COMMANDER 1 //for a safely returned wingcommander
|
||||
#define BG_AV_GET_COMMANDER 1 //for a safely returned wingcommander
|
||||
//bonushonor at the end
|
||||
#define BG_AV_KILL_SURVIVING_TOWER 2
|
||||
#define BG_AV_REP_SURVIVING_TOWER 12
|
||||
|
||||
@@ -114,14 +114,14 @@ void BattlegroundEY::AddPoints(TeamId teamId, uint32 points)
|
||||
{
|
||||
uint8 honorRewards = uint8(m_TeamScores[teamId] / _honorTics);
|
||||
m_TeamScores[teamId] += points;
|
||||
if (m_TeamScores[teamId] > BG_EY_MAX_TEAM_SCORE)
|
||||
m_TeamScores[teamId] = BG_EY_MAX_TEAM_SCORE;
|
||||
if (m_TeamScores[teamId] > static_cast<int32>(_configurableMaxTeamScore))
|
||||
m_TeamScores[teamId] = _configurableMaxTeamScore;
|
||||
|
||||
for (; honorRewards < uint8(m_TeamScores[teamId] / _honorTics); ++honorRewards)
|
||||
RewardHonorToTeam(GetBonusHonorFromKill(1), teamId);
|
||||
|
||||
UpdateWorldState(teamId == TEAM_ALLIANCE ? EY_ALLIANCE_RESOURCES : EY_HORDE_RESOURCES, std::min<uint32>(m_TeamScores[teamId], BG_EY_MAX_TEAM_SCORE));
|
||||
if (m_TeamScores[teamId] >= BG_EY_MAX_TEAM_SCORE)
|
||||
UpdateWorldState(teamId == TEAM_ALLIANCE ? EY_ALLIANCE_RESOURCES : EY_HORDE_RESOURCES, std::min<uint32>(m_TeamScores[teamId], _configurableMaxTeamScore));
|
||||
if (m_TeamScores[teamId] >= static_cast<int32>(_configurableMaxTeamScore))
|
||||
EndBattleground(teamId);
|
||||
}
|
||||
|
||||
@@ -362,6 +362,11 @@ void BattlegroundEY::Init()
|
||||
_droppedFlagGUID.Clear();
|
||||
_flagState = BG_EY_FLAG_STATE_ON_BASE;
|
||||
_flagCapturedObject = 0;
|
||||
|
||||
uint32 bgEyCapturePointsConfig = sWorld->getIntConfig(CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS);
|
||||
_configurableMaxTeamScore = bgEyCapturePointsConfig > 0
|
||||
? bgEyCapturePointsConfig
|
||||
: static_cast<uint32>(BG_EY_MAX_TEAM_SCORE);
|
||||
}
|
||||
|
||||
void BattlegroundEY::RespawnFlag()
|
||||
|
||||
@@ -458,5 +458,6 @@ private:
|
||||
ObjectGuid _droppedFlagGUID;
|
||||
uint8 _flagState;
|
||||
uint32 _flagCapturedObject;
|
||||
uint32 _configurableMaxTeamScore;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -222,10 +222,10 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player)
|
||||
|
||||
RewardHonorToTeam(GetBonusHonorFromKill(2), player->GetTeamId());
|
||||
|
||||
if (GetTeamScore(TEAM_ALLIANCE) == BG_WS_MAX_TEAM_SCORE || GetTeamScore(TEAM_HORDE) == BG_WS_MAX_TEAM_SCORE)
|
||||
if (GetTeamScore(TEAM_ALLIANCE) == _configurableMaxTeamScore || GetTeamScore(TEAM_HORDE) == _configurableMaxTeamScore)
|
||||
{
|
||||
UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 0);
|
||||
EndBattleground(GetTeamScore(TEAM_HORDE) == BG_WS_MAX_TEAM_SCORE ? TEAM_HORDE : TEAM_ALLIANCE);
|
||||
EndBattleground(GetTeamScore(TEAM_HORDE) == _configurableMaxTeamScore ? TEAM_HORDE : TEAM_ALLIANCE);
|
||||
}
|
||||
else
|
||||
_bgEvents.ScheduleEvent(BG_WS_EVENT_RESPAWN_BOTH_FLAGS, BG_WS_FLAG_RESPAWN_TIME);
|
||||
@@ -497,6 +497,11 @@ void BattlegroundWS::Init()
|
||||
_honorWinKills = 1;
|
||||
_honorEndKills = 2;
|
||||
}
|
||||
|
||||
uint32 bgWarsongFlagsConfig = sWorld->getIntConfig(CONFIG_BATTLEGROUND_WARSONG_FLAGS);
|
||||
_configurableMaxTeamScore = bgWarsongFlagsConfig > 0
|
||||
? bgWarsongFlagsConfig
|
||||
: static_cast<uint32>(BG_WS_MAX_TEAM_SCORE);
|
||||
}
|
||||
|
||||
void BattlegroundWS::EndBattleground(TeamId winnerTeamId)
|
||||
@@ -551,7 +556,7 @@ void BattlegroundWS::FillInitialWorldStates(WorldPackets::WorldState::InitWorldS
|
||||
packet.Worldstates.reserve(7);
|
||||
packet.Worldstates.emplace_back(BG_WS_FLAG_CAPTURES_ALLIANCE, GetTeamScore(TEAM_ALLIANCE));
|
||||
packet.Worldstates.emplace_back(BG_WS_FLAG_CAPTURES_HORDE, GetTeamScore(TEAM_HORDE));
|
||||
packet.Worldstates.emplace_back(BG_WS_FLAG_CAPTURES_MAX, BG_WS_MAX_TEAM_SCORE);
|
||||
packet.Worldstates.emplace_back(BG_WS_FLAG_CAPTURES_MAX, _configurableMaxTeamScore);
|
||||
|
||||
packet.Worldstates.emplace_back(BG_WS_STATE_TIMER_ACTIVE, GetStatus() == STATUS_IN_PROGRESS ? 1 : 0);
|
||||
packet.Worldstates.emplace_back(BG_WS_STATE_TIMER, GetMatchTime());
|
||||
|
||||
@@ -272,6 +272,7 @@ private:
|
||||
uint32 _reputationCapture;
|
||||
uint32 _honorWinKills;
|
||||
uint32 _honorEndKills;
|
||||
uint32 _configurableMaxTeamScore;
|
||||
|
||||
void PostUpdateImpl(uint32 diff) override;
|
||||
};
|
||||
|
||||
@@ -8920,13 +8920,7 @@ void Player::SendBattlefieldWorldStates()
|
||||
{
|
||||
if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
|
||||
{
|
||||
SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ATTACKER, wg->GetAttackerTeam());
|
||||
SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_DEFENDER, wg->GetDefenderTeam());
|
||||
SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); // Note: cleanup these two, their names look awkward
|
||||
SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE, wg->IsWarTime() ? 1 : 0);
|
||||
|
||||
for (uint32 i = 0; i < 2; ++i)
|
||||
SendUpdateWorldState(ClockWorldState[i], uint32(GameTime::GetGameTime().count() + (wg->GetTimer() / 1000)));
|
||||
wg->SendUpdateWorldStates(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8412,37 +8412,17 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
|
||||
if (!procSpell || !IsPlayer() || !victim)
|
||||
return false;
|
||||
|
||||
uint32 spell = procSpell->SpellFamilyFlags[0] & 0x2 ? 45297 : 45284;
|
||||
|
||||
if (procEx & PROC_EX_CRITICAL_HIT)
|
||||
damage /= 2;
|
||||
|
||||
// do not proc off from itself
|
||||
if (procSpell->Id == 45297 || procSpell->Id == 45284)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// do not reduce damage-spells have correct basepoints
|
||||
damage /= 2;
|
||||
int32 dmg = damage;
|
||||
|
||||
do
|
||||
{
|
||||
uint32 spell = 0;
|
||||
|
||||
if (procSpell->SpellFamilyFlags[0] & 0x2)
|
||||
{
|
||||
// 1/3 of 33% if 11%
|
||||
if (!roll_chance_i(33))
|
||||
return false;
|
||||
|
||||
spell = 45297;
|
||||
}
|
||||
else
|
||||
spell = 45284;
|
||||
|
||||
// do not reduce damage-spells have correct basepoints
|
||||
damage /= 2;
|
||||
int32 dmg = damage;
|
||||
|
||||
// Cast
|
||||
CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
|
||||
} while (roll_chance_i(33));
|
||||
// Cast
|
||||
CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
|
||||
return true;
|
||||
}
|
||||
// Static Shock
|
||||
|
||||
@@ -2362,7 +2362,7 @@ void ObjectMgr::RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData co
|
||||
}
|
||||
}
|
||||
|
||||
uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay, float rotation0, float rotation1, float rotation2, float rotation3)
|
||||
ObjectGuid::LowType ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay, float rotation0, float rotation1, float rotation2, float rotation3)
|
||||
{
|
||||
GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
|
||||
if (!goinfo)
|
||||
@@ -2413,7 +2413,7 @@ uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float
|
||||
return spawnId;
|
||||
}
|
||||
|
||||
uint32 ObjectMgr::AddCreData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay)
|
||||
ObjectGuid::LowType ObjectMgr::AddCreData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay)
|
||||
{
|
||||
CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
|
||||
if (!cInfo)
|
||||
@@ -2454,7 +2454,7 @@ uint32 ObjectMgr::AddCreData(uint32 entry, uint32 mapId, float x, float y, float
|
||||
AddCreatureToGrid(spawnId, &data);
|
||||
|
||||
// Spawn if necessary (loaded grids only)
|
||||
if (!map->Instanceable() && !map->IsGridCreated(x, y))
|
||||
if (!map->Instanceable() && map->IsGridLoaded(x, y))
|
||||
{
|
||||
Creature* creature = new Creature();
|
||||
if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
|
||||
@@ -5848,7 +5848,11 @@ void ObjectMgr::LoadPageTextLocales()
|
||||
QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
|
||||
LOG_INFO("server.loading", " ");
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
@@ -5876,7 +5880,7 @@ void ObjectMgr::LoadInstanceTemplate()
|
||||
|
||||
if (!result)
|
||||
{
|
||||
LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `page_text` is empty!");
|
||||
LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `instance_template` is empty!");
|
||||
LOG_INFO("server.loading", " ");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ struct PlayerLevelInfo;
|
||||
struct PageText
|
||||
{
|
||||
std::string Text;
|
||||
uint16 NextPage;
|
||||
uint32 NextPage;
|
||||
};
|
||||
|
||||
/// Key for storing temp summon data in TempSummonDataContainer
|
||||
@@ -1325,8 +1325,8 @@ public:
|
||||
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const* data);
|
||||
void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const* data);
|
||||
void RemoveGameobjectFromGrid(ObjectGuid::LowType guid, GameObjectData const* data);
|
||||
uint32 AddGOData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0, float rotation0 = 0, float rotation1 = 0, float rotation2 = 0, float rotation3 = 0);
|
||||
uint32 AddCreData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0);
|
||||
ObjectGuid::LowType AddGOData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0, float rotation0 = 0, float rotation1 = 0, float rotation2 = 0, float rotation3 = 0);
|
||||
ObjectGuid::LowType AddCreData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0);
|
||||
|
||||
// reserved names
|
||||
void LoadReservedPlayerNamesDB();
|
||||
|
||||
@@ -393,7 +393,7 @@ void WorldSession::HandlePageTextQueryOpcode(WorldPacket& recvData)
|
||||
ObjectMgr::GetLocaleString(player->Text, loc_idx, Text);
|
||||
|
||||
data << Text;
|
||||
data << uint32(pageText->NextPage);
|
||||
data << pageText->NextPage;
|
||||
pageID = pageText->NextPage;
|
||||
}
|
||||
SendPacket(&data);
|
||||
|
||||
@@ -588,16 +588,20 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
if (t_diff)
|
||||
_dynamicTree.update(t_diff);
|
||||
|
||||
/// update worldsessions for existing players
|
||||
// Update world sessions and players
|
||||
for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter)
|
||||
{
|
||||
Player* player = m_mapRefIter->GetSource();
|
||||
if (player && player->IsInWorld())
|
||||
{
|
||||
//player->Update(t_diff);
|
||||
// Update session
|
||||
WorldSession* session = player->GetSession();
|
||||
MapSessionFilter updater(session);
|
||||
session->Update(s_diff, updater);
|
||||
|
||||
// update players at tick
|
||||
if (!t_diff)
|
||||
player->Update(s_diff);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -605,17 +609,6 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
|
||||
if (!t_diff)
|
||||
{
|
||||
for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter)
|
||||
{
|
||||
Player* player = m_mapRefIter->GetSource();
|
||||
|
||||
if (!player || !player->IsInWorld())
|
||||
continue;
|
||||
|
||||
// update players at tick
|
||||
player->Update(s_diff);
|
||||
}
|
||||
|
||||
HandleDelayedVisibility();
|
||||
return;
|
||||
}
|
||||
@@ -624,36 +617,35 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
resetMarkedCells();
|
||||
resetMarkedCellsLarge();
|
||||
|
||||
// Prepare object updaters
|
||||
Acore::ObjectUpdater updater(t_diff, false);
|
||||
|
||||
// for creature
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, GridTypeMapContainer > grid_object_update(updater);
|
||||
// for pets
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, WorldTypeMapContainer > world_object_update(updater);
|
||||
// For creature
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, GridTypeMapContainer> grid_object_update(updater);
|
||||
|
||||
// for large creatures
|
||||
// For pets
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, WorldTypeMapContainer> world_object_update(updater);
|
||||
|
||||
// For large creatures
|
||||
Acore::ObjectUpdater largeObjectUpdater(t_diff, true);
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, GridTypeMapContainer > grid_large_object_update(largeObjectUpdater);
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, WorldTypeMapContainer > world_large_object_update(largeObjectUpdater);
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, GridTypeMapContainer> grid_large_object_update(largeObjectUpdater);
|
||||
TypeContainerVisitor<Acore::ObjectUpdater, WorldTypeMapContainer> world_large_object_update(largeObjectUpdater);
|
||||
|
||||
// pussywizard: container for far creatures in combat with players
|
||||
std::vector<Creature*> updateList;
|
||||
updateList.reserve(10);
|
||||
|
||||
// non-player active objects, increasing iterator in the loop in case of object removal
|
||||
// Update non-player active objects
|
||||
for (m_activeNonPlayersIter = m_activeNonPlayers.begin(); m_activeNonPlayersIter != m_activeNonPlayers.end();)
|
||||
{
|
||||
WorldObject* obj = *m_activeNonPlayersIter;
|
||||
++m_activeNonPlayersIter;
|
||||
|
||||
if (!obj || !obj->IsInWorld())
|
||||
continue;
|
||||
|
||||
VisitNearbyCellsOf(obj, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
|
||||
if (obj && obj->IsInWorld())
|
||||
VisitNearbyCellsOf(obj, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
|
||||
}
|
||||
|
||||
// the player iterator is stored in the map object
|
||||
// to make sure calls to Map::Remove don't invalidate it
|
||||
// Update players and their associated objects
|
||||
for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter)
|
||||
{
|
||||
Player* player = m_mapRefIter->GetSource();
|
||||
@@ -661,12 +653,10 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
if (!player || !player->IsInWorld())
|
||||
continue;
|
||||
|
||||
// update players at tick
|
||||
player->Update(s_diff);
|
||||
|
||||
VisitNearbyCellsOfPlayer(player, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
|
||||
|
||||
// If player is using far sight, visit that object too
|
||||
// If player is using far sight, update viewpoint
|
||||
if (WorldObject* viewPoint = player->GetViewpoint())
|
||||
{
|
||||
if (Creature* viewCreature = viewPoint->ToCreature())
|
||||
@@ -684,7 +674,8 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
{
|
||||
updateList.clear();
|
||||
float rangeSq = player->GetGridActivationRange() - 1.0f;
|
||||
rangeSq = rangeSq * rangeSq;
|
||||
rangeSq *= rangeSq;
|
||||
|
||||
HostileReference* ref = player->getHostileRefMgr().getFirst();
|
||||
while (ref)
|
||||
{
|
||||
@@ -694,20 +685,20 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
updateList.push_back(cre);
|
||||
ref = ref->next();
|
||||
}
|
||||
for (std::vector<Creature*>::const_iterator itr = updateList.begin(); itr != updateList.end(); ++itr)
|
||||
VisitNearbyCellsOf(*itr, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
|
||||
|
||||
for (Creature* cre : updateList)
|
||||
VisitNearbyCellsOf(cre, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
|
||||
}
|
||||
}
|
||||
|
||||
for (_transportsUpdateIter = _transports.begin(); _transportsUpdateIter != _transports.end();) // pussywizard: transports updated after VisitNearbyCellsOf, grids around are loaded, everything ok
|
||||
// Update transports - pussywizard: transports updated after VisitNearbyCellsOf, grids around are loaded, everything ok
|
||||
for (_transportsUpdateIter = _transports.begin(); _transportsUpdateIter != _transports.end();)
|
||||
{
|
||||
MotionTransport* transport = *_transportsUpdateIter;
|
||||
++_transportsUpdateIter;
|
||||
|
||||
if (!transport->IsInWorld())
|
||||
continue;
|
||||
|
||||
transport->Update(t_diff);
|
||||
if (transport->IsInWorld())
|
||||
transport->Update(t_diff);
|
||||
}
|
||||
|
||||
SendObjectUpdates();
|
||||
@@ -1674,14 +1665,16 @@ bool Map::IsUnderWater(uint32 phaseMask, float x, float y, float z, float collis
|
||||
|
||||
bool Map::HasEnoughWater(WorldObject const* searcher, float x, float y, float z) const
|
||||
{
|
||||
LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(searcher->GetPhaseMask(), x, y, z, searcher->GetCollisionHeight(), MAP_ALL_LIQUIDS);
|
||||
return (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) != 0 && HasEnoughWater(searcher, liquidData);
|
||||
}
|
||||
LiquidData const& liquidData = const_cast<Map*>(this)->GetLiquidData(
|
||||
searcher->GetPhaseMask(), x, y, z, searcher->GetCollisionHeight(), MAP_ALL_LIQUIDS);
|
||||
|
||||
if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) == 0)
|
||||
return false;
|
||||
|
||||
bool Map::HasEnoughWater(WorldObject const* searcher, LiquidData const& liquidData) const
|
||||
{
|
||||
float minHeightInWater = searcher->GetMinHeightInWater();
|
||||
return liquidData.Level > INVALID_HEIGHT && liquidData.Level > liquidData.DepthLevel && liquidData.Level - liquidData.DepthLevel >= minHeightInWater;
|
||||
return liquidData.Level > INVALID_HEIGHT &&
|
||||
liquidData.Level > liquidData.DepthLevel &&
|
||||
liquidData.Level - liquidData.DepthLevel >= minHeightInWater;
|
||||
}
|
||||
|
||||
char const* Map::GetMapName() const
|
||||
@@ -2841,7 +2834,7 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia /*=
|
||||
// ignore bones creating option in case insignia
|
||||
if ((insignia ||
|
||||
(IsBattlegroundOrArena() ? sWorld->getBoolConfig(CONFIG_DEATH_BONES_BG_OR_ARENA) : sWorld->getBoolConfig(CONFIG_DEATH_BONES_WORLD))) &&
|
||||
!IsGridCreated(corpse->GetPositionX(), corpse->GetPositionY()))
|
||||
IsGridLoaded(corpse->GetPositionX(), corpse->GetPositionY()))
|
||||
{
|
||||
// Create bones, don't change Corpse
|
||||
bones = new Corpse();
|
||||
|
||||
@@ -375,8 +375,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
|
||||
//! the client to be in world yet. We will re-add the packets to the bottom of the queue and process them later.
|
||||
if (!m_playerRecentlyLogout)
|
||||
{
|
||||
requeuePackets.push_back(packet);
|
||||
deletePacket = false;
|
||||
//requeuePackets.push_back(packet);
|
||||
//deletePacket = false;
|
||||
|
||||
LOG_DEBUG("network", "Delaying processing of message with status STATUS_LOGGEDIN: No players in the world for account id {}", GetAccountId());
|
||||
}
|
||||
|
||||
@@ -3342,6 +3342,7 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
{
|
||||
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd
|
||||
spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd
|
||||
spellInfo->Effects[EFFECT_2].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_20_YARDS); // 20yd
|
||||
});
|
||||
|
||||
// Rallying Shout
|
||||
@@ -4891,6 +4892,12 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
spellInfo->AttributesEx2 &= ~SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;
|
||||
});
|
||||
|
||||
// Swoop (Moth hunter pet) root effect fix
|
||||
ApplySpellFix({ 52825 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->Effects[EFFECT_2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY);
|
||||
});
|
||||
|
||||
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
||||
{
|
||||
SpellInfo* spellInfo = mSpellInfoMap[i];
|
||||
|
||||
@@ -319,6 +319,11 @@ enum WorldIntConfigs
|
||||
CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN,
|
||||
CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_LEVEL,
|
||||
CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_LIMIT_MIN_PLAYERS,
|
||||
CONFIG_BATTLEGROUND_WARSONG_FLAGS,
|
||||
CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS,
|
||||
CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS,
|
||||
CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH,
|
||||
CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS,
|
||||
CONFIG_WINTERGRASP_ENABLE,
|
||||
CONFIG_ARENA_MAX_RATING_DIFFERENCE,
|
||||
CONFIG_ARENA_RATING_DISCARD_TIMER,
|
||||
|
||||
@@ -173,10 +173,10 @@ void World::LoadConfigSettings(bool reload)
|
||||
LOG_ERROR("server.loading", "World settings reload fail: can't read settings.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sLog->LoadFromConfig();
|
||||
sMetric->LoadFromConfigs();
|
||||
sLog->LoadFromConfig();
|
||||
sMetric->LoadFromConfigs();
|
||||
}
|
||||
|
||||
// Set realm id and enable db logging
|
||||
sLog->SetRealmId(realm.Id.Realm);
|
||||
@@ -928,6 +928,12 @@ void World::LoadConfigSettings(bool reload)
|
||||
_int_configs[CONFIG_BATTLEGROUND_SPEED_BUFF_RESPAWN] = 150;
|
||||
}
|
||||
|
||||
_int_configs[CONFIG_BATTLEGROUND_WARSONG_FLAGS] = sConfigMgr->GetOption<uint32>("Battleground.Warsong.Flags", 3);
|
||||
_int_configs[CONFIG_BATTLEGROUND_ARATHI_CAPTUREPOINTS] = sConfigMgr->GetOption<uint32>("Battleground.Arathi.CapturePoints", 1600);
|
||||
_int_configs[CONFIG_BATTLEGROUND_ALTERAC_REINFORCEMENTS] = sConfigMgr->GetOption<uint32>("Battleground.Alterac.Reinforcements", 600);
|
||||
_int_configs[CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH] = sConfigMgr->GetOption<uint32>("Battleground.Alterac.ReputationOnBossDeath", 350);
|
||||
_int_configs[CONFIG_BATTLEGROUND_EYEOFTHESTORM_CAPTUREPOINTS] = sConfigMgr->GetOption<uint32>("Battleground.EyeOfTheStorm.CapturePoints", 1600);
|
||||
|
||||
_int_configs[CONFIG_ARENA_MAX_RATING_DIFFERENCE] = sConfigMgr->GetOption<uint32>("Arena.MaxRatingDifference", 150);
|
||||
_int_configs[CONFIG_ARENA_RATING_DISCARD_TIMER] = sConfigMgr->GetOption<uint32>("Arena.RatingDiscardTimer", 10 * MINUTE * IN_MILLISECONDS);
|
||||
_int_configs[CONFIG_ARENA_PREV_OPPONENTS_DISCARD_TIMER] = sConfigMgr->GetOption<uint32>("Arena.PreviousOpponentsDiscardTimer", 2 * MINUTE * IN_MILLISECONDS);
|
||||
|
||||
Reference in New Issue
Block a user