- Logging System is asyncronous to improve performance.
- Each msg and Logger has a Log Type and Log Level assigned. Each msg is assigned the Logger of same Log Type or "root" Logger is selected if there is no Logger configured for the given Log Type
- Loggers have a list of Appenders to send the msg to. The Msg in the Logger is not sent to Appenders if the msg LogLevel is lower than Logger LogLevel.
- There are three (at the moment) types of Appenders: Console, File or DB (this is WIP, not working ATM). Msg is not written to the resource if msg LogLevel is lower than Appender LogLevel.
- Appender and Console Log levels can be changed while server is active with command '.set loglevel (a/l) name level'
Explanation of use with Sample config:
Appender.Console.Type=1 (1 = Console)
Appender.Console.Level=2 (2 = Debug)
Appender.Server.Type=2 (2 = File)
Appender.Server.Level=3 (3 = Info)
Appender.Server.File=Server.log
Appender.SQL.Type=2 (2 = File)
Appender.SQL.Level=1 (1 = Trace)
Appender.SQL.File=sql.log
Appenders=Console Server (NOTE: SQL has not been included here... that will make core ignore the config for "SQL" as it's not in this list)
Logger.root.Type=0 (0 = Default - if it's not created by config, server will create it with LogLevel = DISABLED)
Logger.root.Level=5 (5 = Error)
Logger.root.Appenders=Console
Logger.SQL.Type=26 (26 = SQL)
Logger.SQL.Level=3 (2 = Debug)
Logger.SQL.Appenders=Console Server SQL
Logger.SomeRandomName.Type=24 (24 = Guild)
Logger.SomeRandomName.Level=5 (5 = Error)
Loggers=root SQL SomeRandomName
* At loading Appender SQL will be ignored, as it's not present on "Appenders"
* sLog->outDebug(LOG_FILTER_GUILD, "Some log msg related to Guilds")
- Msg is sent to Logger of Type LOG_FILTER_GUILD (24). Logger with name SomeRandomName is found but it's LogLevel = 5 and Msg LogLevel=2... Msg is not logged
* sLog->outError(LOG_FILTER_GUILD, "Some error log msg related to Guilds")
- Msg is sent to Logger of Type LOG_FILTER_GUILD (24). Logger with name SomeRandomeName is found with proper LogLevel but Logger does not have any Appenders assigned to that logger... Msg is not logged
* sLog->outDebug(LOG_FILTER_SQL, "Some msg related to SQLs")
- Msg is sent to Logger SQL (matches type), as it matches LogLevel the msg is sent to Appenders Console, Server and SQL
- Appender Console has lower Log Level: Msg is logged to Console
- Appender Server has higher Log Level: Msg is not logged to file
- Appender SQL has lower Log Level: Msg is logged to file sql.log
* sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Some msg related to Battelgrounds")
- Msg is sent to Logger root (Type 0) as no Logger was found with Type LOG_FILTER_BATTLEGROUND (13). As Logger has higher LogLevel msg is not sent to any appender
* sLog->outError(LOG_FILTER_BATTLEGROUND, "Some error msg related to Battelgrounds")
- Msg is sent to Logger root (Type 0) as no Logger was found with Type LOG_FILTER_BATTLEGROUND (13). Msg has lower LogLevel and is sent to Appender Console
- Appender Console has lower LogLevel: Msg is logged to Console
838 lines
34 KiB
C++
Executable File
838 lines
34 KiB
C++
Executable File
/*
|
|
* Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
|
|
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "Battleground.h"
|
|
#include "BattlegroundWS.h"
|
|
#include "Creature.h"
|
|
#include "GameObject.h"
|
|
#include "Language.h"
|
|
#include "Object.h"
|
|
#include "ObjectMgr.h"
|
|
#include "BattlegroundMgr.h"
|
|
#include "Player.h"
|
|
#include "World.h"
|
|
#include "WorldPacket.h"
|
|
|
|
// these variables aren't used outside of this file, so declare them only here
|
|
enum BG_WSG_Rewards
|
|
{
|
|
BG_WSG_WIN = 0,
|
|
BG_WSG_FLAG_CAP,
|
|
BG_WSG_MAP_COMPLETE,
|
|
BG_WSG_REWARD_NUM
|
|
};
|
|
|
|
uint32 BG_WSG_Honor[BG_HONOR_MODE_NUM][BG_WSG_REWARD_NUM] =
|
|
{
|
|
{20, 40, 40}, // normal honor
|
|
{60, 40, 80} // holiday
|
|
};
|
|
|
|
BattlegroundWS::BattlegroundWS()
|
|
{
|
|
BgObjects.resize(BG_WS_OBJECT_MAX);
|
|
BgCreatures.resize(BG_CREATURES_MAX_WS);
|
|
|
|
StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES;
|
|
StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE;
|
|
StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE;
|
|
StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN;
|
|
_flagDebuffState = 0;
|
|
}
|
|
|
|
BattlegroundWS::~BattlegroundWS()
|
|
{
|
|
}
|
|
|
|
void BattlegroundWS::PostUpdateImpl(uint32 diff)
|
|
{
|
|
if (GetStatus() == STATUS_IN_PROGRESS)
|
|
{
|
|
if (GetStartTime() >= 25*MINUTE*IN_MILLISECONDS)
|
|
{
|
|
if (GetTeamScore(ALLIANCE) == 0)
|
|
{
|
|
if (GetTeamScore(HORDE) == 0) // No one scored - result is tie
|
|
EndBattleground(0);
|
|
else // Horde has more points and thus wins
|
|
EndBattleground(HORDE);
|
|
}
|
|
else if (GetTeamScore(HORDE) == 0)
|
|
EndBattleground(ALLIANCE); // Alliance has > 0, Horde has 0, alliance wins
|
|
else if (GetTeamScore(HORDE) == GetTeamScore(ALLIANCE)) // Team score equal, winner is team that scored the last flag
|
|
EndBattleground(_lastFlagCaptureTeam);
|
|
else if (GetTeamScore(HORDE) > GetTeamScore(ALLIANCE)) // Last but not least, check who has the higher score
|
|
EndBattleground(HORDE);
|
|
else
|
|
EndBattleground(ALLIANCE);
|
|
}
|
|
else if (GetStartTime() > uint32(_minutesElapsed * MINUTE * IN_MILLISECONDS))
|
|
{
|
|
++_minutesElapsed;
|
|
UpdateWorldState(BG_WS_STATE_TIMER, 25 - _minutesElapsed);
|
|
}
|
|
|
|
if (_flagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_WAIT_RESPAWN)
|
|
{
|
|
_flagsTimer[BG_TEAM_ALLIANCE] -= diff;
|
|
|
|
if (_flagsTimer[BG_TEAM_ALLIANCE] < 0)
|
|
{
|
|
_flagsTimer[BG_TEAM_ALLIANCE] = 0;
|
|
RespawnFlag(ALLIANCE, true);
|
|
}
|
|
}
|
|
if (_flagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND)
|
|
{
|
|
_flagsDropTimer[BG_TEAM_ALLIANCE] -= diff;
|
|
|
|
if (_flagsDropTimer[BG_TEAM_ALLIANCE] < 0)
|
|
{
|
|
_flagsDropTimer[BG_TEAM_ALLIANCE] = 0;
|
|
RespawnFlagAfterDrop(ALLIANCE);
|
|
_bothFlagsKept = false;
|
|
}
|
|
}
|
|
if (_flagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_WAIT_RESPAWN)
|
|
{
|
|
_flagsTimer[BG_TEAM_HORDE] -= diff;
|
|
|
|
if (_flagsTimer[BG_TEAM_HORDE] < 0)
|
|
{
|
|
_flagsTimer[BG_TEAM_HORDE] = 0;
|
|
RespawnFlag(HORDE, true);
|
|
}
|
|
}
|
|
if (_flagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND)
|
|
{
|
|
_flagsDropTimer[BG_TEAM_HORDE] -= diff;
|
|
|
|
if (_flagsDropTimer[BG_TEAM_HORDE] < 0)
|
|
{
|
|
_flagsDropTimer[BG_TEAM_HORDE] = 0;
|
|
RespawnFlagAfterDrop(HORDE);
|
|
_bothFlagsKept = false;
|
|
}
|
|
}
|
|
if (_bothFlagsKept)
|
|
{
|
|
_flagSpellForceTimer += diff;
|
|
if (_flagDebuffState == 0 && _flagSpellForceTimer >= 10*MINUTE*IN_MILLISECONDS) //10 minutes
|
|
{
|
|
if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[0]))
|
|
player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true);
|
|
if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[1]))
|
|
player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true);
|
|
_flagDebuffState = 1;
|
|
}
|
|
else if (_flagDebuffState == 1 && _flagSpellForceTimer >= 900000) //15 minutes
|
|
{
|
|
if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[0]))
|
|
{
|
|
player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
|
|
player->CastSpell(player, WS_SPELL_BRUTAL_ASSAULT, true);
|
|
}
|
|
if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[1]))
|
|
{
|
|
player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
|
|
player->CastSpell(player, WS_SPELL_BRUTAL_ASSAULT, true);
|
|
}
|
|
_flagDebuffState = 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_flagSpellForceTimer = 0; //reset timer.
|
|
_flagDebuffState = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void BattlegroundWS::StartingEventCloseDoors()
|
|
{
|
|
for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i)
|
|
{
|
|
DoorClose(i);
|
|
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
|
|
}
|
|
for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i)
|
|
SpawnBGObject(i, RESPAWN_ONE_DAY);
|
|
|
|
UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 1);
|
|
UpdateWorldState(BG_WS_STATE_TIMER, 25);
|
|
}
|
|
|
|
void BattlegroundWS::StartingEventOpenDoors()
|
|
{
|
|
for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_6; ++i)
|
|
DoorOpen(i);
|
|
for (uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i)
|
|
DoorOpen(i);
|
|
|
|
for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i)
|
|
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
|
|
|
|
SpawnBGObject(BG_WS_OBJECT_DOOR_A_5, RESPAWN_ONE_DAY);
|
|
SpawnBGObject(BG_WS_OBJECT_DOOR_A_6, RESPAWN_ONE_DAY);
|
|
SpawnBGObject(BG_WS_OBJECT_DOOR_H_3, RESPAWN_ONE_DAY);
|
|
SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY);
|
|
|
|
// players joining later are not eligibles
|
|
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE);
|
|
}
|
|
|
|
void BattlegroundWS::AddPlayer(Player* player)
|
|
{
|
|
Battleground::AddPlayer(player);
|
|
//create score and add it to map, default values are set in constructor
|
|
BattlegroundWGScore* sc = new BattlegroundWGScore;
|
|
|
|
PlayerScores[player->GetGUID()] = sc;
|
|
}
|
|
|
|
void BattlegroundWS::RespawnFlag(uint32 Team, bool captured)
|
|
{
|
|
if (Team == ALLIANCE)
|
|
{
|
|
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Respawn Alliance flag");
|
|
_flagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_BASE;
|
|
}
|
|
else
|
|
{
|
|
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Respawn Horde flag");
|
|
_flagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_BASE;
|
|
}
|
|
|
|
if (captured)
|
|
{
|
|
//when map_update will be allowed for battlegrounds this code will be useless
|
|
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);
|
|
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);
|
|
SendMessageToAll(LANG_BG_WS_F_PLACED, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
PlaySoundToAll(BG_WS_SOUND_FLAGS_RESPAWNED); // flag respawned sound...
|
|
}
|
|
_bothFlagsKept = false;
|
|
}
|
|
|
|
void BattlegroundWS::RespawnFlagAfterDrop(uint32 team)
|
|
{
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
return;
|
|
|
|
RespawnFlag(team, false);
|
|
if (team == ALLIANCE)
|
|
{
|
|
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);
|
|
SendMessageToAll(LANG_BG_WS_ALLIANCE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
}
|
|
else
|
|
{
|
|
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);
|
|
SendMessageToAll(LANG_BG_WS_HORDE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL);
|
|
}
|
|
|
|
PlaySoundToAll(BG_WS_SOUND_FLAGS_RESPAWNED);
|
|
|
|
if (GameObject* obj = GetBgMap()->GetGameObject(GetDroppedFlagGUID(team)))
|
|
obj->Delete();
|
|
else
|
|
sLog->outError(LOG_FILTER_BATTLEGROUND, "unknown droped flag bg, guid: %u", GUID_LOPART(GetDroppedFlagGUID(team)));
|
|
|
|
SetDroppedFlagGUID(0, team);
|
|
_bothFlagsKept = false;
|
|
}
|
|
|
|
void BattlegroundWS::EventPlayerCapturedFlag(Player* Source)
|
|
{
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
return;
|
|
|
|
uint32 winner = 0;
|
|
|
|
Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
|
|
if (Source->GetTeam() == ALLIANCE)
|
|
{
|
|
if (!this->IsHordeFlagPickedup())
|
|
return;
|
|
SetHordeFlagPicker(0); // must be before aura remove to prevent 2 events (drop+capture) at the same time
|
|
// horde flag in base (but not respawned yet)
|
|
_flagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;
|
|
// Drop Horde Flag from Player
|
|
Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
|
|
if (_flagDebuffState == 1)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
|
|
if (_flagDebuffState == 2)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
|
|
if (GetTeamScore(ALLIANCE) < BG_WS_MAX_TEAM_SCORE)
|
|
AddPoint(ALLIANCE, 1);
|
|
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);
|
|
RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE);
|
|
}
|
|
else
|
|
{
|
|
if (!this->IsAllianceFlagPickedup())
|
|
return;
|
|
SetAllianceFlagPicker(0); // must be before aura remove to prevent 2 events (drop+capture) at the same time
|
|
// alliance flag in base (but not respawned yet)
|
|
_flagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;
|
|
// Drop Alliance Flag from Player
|
|
Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
|
|
if (_flagDebuffState == 1)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
|
|
if (_flagDebuffState == 2)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
|
|
if (GetTeamScore(HORDE) < BG_WS_MAX_TEAM_SCORE)
|
|
AddPoint(HORDE, 1);
|
|
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);
|
|
RewardReputationToTeam(889, m_ReputationCapture, HORDE);
|
|
}
|
|
//for flag capture is reward 2 honorable kills
|
|
RewardHonorToTeam(GetBonusHonorFromKill(2), Source->GetTeam());
|
|
|
|
SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME);
|
|
SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME);
|
|
|
|
if (Source->GetTeam() == ALLIANCE)
|
|
SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
|
|
else
|
|
SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, Source);
|
|
|
|
UpdateFlagState(Source->GetTeam(), 1); // flag state none
|
|
UpdateTeamScore(Source->GetTeam());
|
|
// only flag capture should be updated
|
|
UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1); // +1 flag captures
|
|
|
|
// update last flag capture to be used if teamscore is equal
|
|
SetLastFlagCapture(Source->GetTeam());
|
|
|
|
if (GetTeamScore(ALLIANCE) == BG_WS_MAX_TEAM_SCORE)
|
|
winner = ALLIANCE;
|
|
|
|
if (GetTeamScore(HORDE) == BG_WS_MAX_TEAM_SCORE)
|
|
winner = HORDE;
|
|
|
|
if (winner)
|
|
{
|
|
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 0);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 0);
|
|
UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, 1);
|
|
UpdateWorldState(BG_WS_FLAG_STATE_HORDE, 1);
|
|
UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 0);
|
|
|
|
RewardHonorToTeam(BG_WSG_Honor[m_HonorMode][BG_WSG_WIN], winner);
|
|
EndBattleground(winner);
|
|
}
|
|
else
|
|
{
|
|
_flagsTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME;
|
|
}
|
|
}
|
|
|
|
void BattlegroundWS::EventPlayerDroppedFlag(Player* Source)
|
|
{
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
{
|
|
// if not running, do not cast things at the dropper player (prevent spawning the "dropped" flag), neither send unnecessary messages
|
|
// just take off the aura
|
|
if (Source->GetTeam() == ALLIANCE)
|
|
{
|
|
if (!this->IsHordeFlagPickedup())
|
|
return;
|
|
if (GetFlagPickerGUID(BG_TEAM_HORDE) == Source->GetGUID())
|
|
{
|
|
SetHordeFlagPicker(0);
|
|
Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!this->IsAllianceFlagPickedup())
|
|
return;
|
|
if (GetFlagPickerGUID(BG_TEAM_ALLIANCE) == Source->GetGUID())
|
|
{
|
|
SetAllianceFlagPicker(0);
|
|
Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
bool set = false;
|
|
|
|
if (Source->GetTeam() == ALLIANCE)
|
|
{
|
|
if (!IsHordeFlagPickedup())
|
|
return;
|
|
if (GetFlagPickerGUID(BG_TEAM_HORDE) == Source->GetGUID())
|
|
{
|
|
SetHordeFlagPicker(0);
|
|
Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
|
|
if (_flagDebuffState == 1)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
|
|
if (_flagDebuffState == 2)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
|
|
_flagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_GROUND;
|
|
Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true);
|
|
set = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!IsAllianceFlagPickedup())
|
|
return;
|
|
if (GetFlagPickerGUID(BG_TEAM_ALLIANCE) == Source->GetGUID())
|
|
{
|
|
SetAllianceFlagPicker(0);
|
|
Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
|
|
if (_flagDebuffState == 1)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
|
|
if (_flagDebuffState == 2)
|
|
Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
|
|
_flagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_GROUND;
|
|
Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true);
|
|
set = true;
|
|
}
|
|
}
|
|
|
|
if (set)
|
|
{
|
|
Source->CastSpell(Source, SPELL_RECENTLY_DROPPED_FLAG, true);
|
|
UpdateFlagState(Source->GetTeam(), 1);
|
|
|
|
if (Source->GetTeam() == ALLIANCE)
|
|
{
|
|
SendMessageToAll(LANG_BG_WS_DROPPED_HF, CHAT_MSG_BG_SYSTEM_HORDE, Source);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, uint32(-1));
|
|
}
|
|
else
|
|
{
|
|
SendMessageToAll(LANG_BG_WS_DROPPED_AF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, uint32(-1));
|
|
}
|
|
|
|
_flagsDropTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_DROP_TIME;
|
|
}
|
|
}
|
|
|
|
void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj)
|
|
{
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
return;
|
|
|
|
int32 message_id = 0;
|
|
ChatMsg type = CHAT_MSG_BG_SYSTEM_NEUTRAL;
|
|
|
|
//alliance flag picked up from base
|
|
if (Source->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE
|
|
&& BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID())
|
|
{
|
|
message_id = LANG_BG_WS_PICKEDUP_AF;
|
|
type = CHAT_MSG_BG_SYSTEM_HORDE;
|
|
PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);
|
|
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);
|
|
SetAllianceFlagPicker(Source->GetGUID());
|
|
_flagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER;
|
|
//update world state to show correct flag carrier
|
|
UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);
|
|
Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true);
|
|
Source->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED);
|
|
if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER)
|
|
_bothFlagsKept = true;
|
|
}
|
|
|
|
//horde flag picked up from base
|
|
if (Source->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE
|
|
&& BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID())
|
|
{
|
|
message_id = LANG_BG_WS_PICKEDUP_HF;
|
|
type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
|
|
PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);
|
|
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);
|
|
SetHordeFlagPicker(Source->GetGUID());
|
|
_flagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER;
|
|
//update world state to show correct flag carrier
|
|
UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);
|
|
Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true);
|
|
Source->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED);
|
|
if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER)
|
|
_bothFlagsKept = true;
|
|
}
|
|
|
|
//Alliance flag on ground(not in base) (returned or picked up again from ground!)
|
|
if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY)
|
|
{
|
|
if (Source->GetTeam() == ALLIANCE)
|
|
{
|
|
message_id = LANG_BG_WS_RETURNED_AF;
|
|
type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
|
|
UpdateFlagState(HORDE, BG_WS_FLAG_STATE_WAIT_RESPAWN);
|
|
RespawnFlag(ALLIANCE, false);
|
|
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);
|
|
PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);
|
|
UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1);
|
|
_bothFlagsKept = false;
|
|
}
|
|
else
|
|
{
|
|
message_id = LANG_BG_WS_PICKEDUP_AF;
|
|
type = CHAT_MSG_BG_SYSTEM_HORDE;
|
|
PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);
|
|
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);
|
|
SetAllianceFlagPicker(Source->GetGUID());
|
|
Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true);
|
|
_flagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER;
|
|
UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);
|
|
if (_flagDebuffState == 1)
|
|
Source->CastSpell(Source, WS_SPELL_FOCUSED_ASSAULT, true);
|
|
if (_flagDebuffState == 2)
|
|
Source->CastSpell(Source, WS_SPELL_BRUTAL_ASSAULT, true);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);
|
|
}
|
|
//called in HandleGameObjectUseOpcode:
|
|
//target_obj->Delete();
|
|
}
|
|
|
|
//Horde flag on ground(not in base) (returned or picked up again)
|
|
if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10) && target_obj->GetGOInfo()->entry == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY)
|
|
{
|
|
if (Source->GetTeam() == HORDE)
|
|
{
|
|
message_id = LANG_BG_WS_RETURNED_HF;
|
|
type = CHAT_MSG_BG_SYSTEM_HORDE;
|
|
UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_WAIT_RESPAWN);
|
|
RespawnFlag(HORDE, false);
|
|
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);
|
|
PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);
|
|
UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1);
|
|
_bothFlagsKept = false;
|
|
}
|
|
else
|
|
{
|
|
message_id = LANG_BG_WS_PICKEDUP_HF;
|
|
type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
|
|
PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);
|
|
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);
|
|
SetHordeFlagPicker(Source->GetGUID());
|
|
Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true);
|
|
_flagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER;
|
|
UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);
|
|
if (_flagDebuffState == 1)
|
|
Source->CastSpell(Source, WS_SPELL_FOCUSED_ASSAULT, true);
|
|
if (_flagDebuffState == 2)
|
|
Source->CastSpell(Source, WS_SPELL_BRUTAL_ASSAULT, true);
|
|
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);
|
|
}
|
|
//called in HandleGameObjectUseOpcode:
|
|
//target_obj->Delete();
|
|
}
|
|
|
|
if (!message_id)
|
|
return;
|
|
|
|
SendMessageToAll(message_id, type, Source);
|
|
Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
|
|
}
|
|
|
|
void BattlegroundWS::RemovePlayer(Player* player, uint64 guid, uint32 /*team*/)
|
|
{
|
|
// sometimes flag aura not removed :(
|
|
if (IsAllianceFlagPickedup() && m_FlagKeepers[BG_TEAM_ALLIANCE] == guid)
|
|
{
|
|
if (!player)
|
|
{
|
|
sLog->outError(LOG_FILTER_BATTLEGROUND, "BattlegroundWS: Removing offline player who has the FLAG!!");
|
|
this->SetAllianceFlagPicker(0);
|
|
this->RespawnFlag(ALLIANCE, false);
|
|
}
|
|
else
|
|
this->EventPlayerDroppedFlag(player);
|
|
}
|
|
if (IsHordeFlagPickedup() && m_FlagKeepers[BG_TEAM_HORDE] == guid)
|
|
{
|
|
if (!player)
|
|
{
|
|
sLog->outError(LOG_FILTER_BATTLEGROUND, "BattlegroundWS: Removing offline player who has the FLAG!!");
|
|
this->SetHordeFlagPicker(0);
|
|
this->RespawnFlag(HORDE, false);
|
|
}
|
|
else
|
|
this->EventPlayerDroppedFlag(player);
|
|
}
|
|
}
|
|
|
|
void BattlegroundWS::UpdateFlagState(uint32 team, uint32 value)
|
|
{
|
|
if (team == ALLIANCE)
|
|
UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, value);
|
|
else
|
|
UpdateWorldState(BG_WS_FLAG_STATE_HORDE, value);
|
|
}
|
|
|
|
void BattlegroundWS::UpdateTeamScore(uint32 team)
|
|
{
|
|
if (team == ALLIANCE)
|
|
UpdateWorldState(BG_WS_FLAG_CAPTURES_ALLIANCE, GetTeamScore(team));
|
|
else
|
|
UpdateWorldState(BG_WS_FLAG_CAPTURES_HORDE, GetTeamScore(team));
|
|
}
|
|
|
|
void BattlegroundWS::HandleAreaTrigger(Player* Source, uint32 Trigger)
|
|
{
|
|
// this is wrong way to implement these things. On official it done by gameobject spell cast.
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
return;
|
|
|
|
//uint32 SpellId = 0;
|
|
//uint64 buff_guid = 0;
|
|
switch (Trigger)
|
|
{
|
|
case 3686: // Alliance elixir of speed spawn. Trigger not working, because located inside other areatrigger, can be replaced by IsWithinDist(object, dist) in Battleground::Update().
|
|
//buff_guid = BgObjects[BG_WS_OBJECT_SPEEDBUFF_1];
|
|
break;
|
|
case 3687: // Horde elixir of speed spawn. Trigger not working, because located inside other areatrigger, can be replaced by IsWithinDist(object, dist) in Battleground::Update().
|
|
//buff_guid = BgObjects[BG_WS_OBJECT_SPEEDBUFF_2];
|
|
break;
|
|
case 3706: // Alliance elixir of regeneration spawn
|
|
//buff_guid = BgObjects[BG_WS_OBJECT_REGENBUFF_1];
|
|
break;
|
|
case 3708: // Horde elixir of regeneration spawn
|
|
//buff_guid = BgObjects[BG_WS_OBJECT_REGENBUFF_2];
|
|
break;
|
|
case 3707: // Alliance elixir of berserk spawn
|
|
//buff_guid = BgObjects[BG_WS_OBJECT_BERSERKBUFF_1];
|
|
break;
|
|
case 3709: // Horde elixir of berserk spawn
|
|
//buff_guid = BgObjects[BG_WS_OBJECT_BERSERKBUFF_2];
|
|
break;
|
|
case 3646: // Alliance Flag spawn
|
|
if (_flagState[BG_TEAM_HORDE] && !_flagState[BG_TEAM_ALLIANCE])
|
|
if (GetFlagPickerGUID(BG_TEAM_HORDE) == Source->GetGUID())
|
|
EventPlayerCapturedFlag(Source);
|
|
break;
|
|
case 3647: // Horde Flag spawn
|
|
if (_flagState[BG_TEAM_ALLIANCE] && !_flagState[BG_TEAM_HORDE])
|
|
if (GetFlagPickerGUID(BG_TEAM_ALLIANCE) == Source->GetGUID())
|
|
EventPlayerCapturedFlag(Source);
|
|
break;
|
|
case 3649: // unk1
|
|
case 3688: // unk2
|
|
case 4628: // unk3
|
|
case 4629: // unk4
|
|
break;
|
|
default:
|
|
sLog->outError(LOG_FILTER_BATTLEGROUND, "WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger);
|
|
Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
|
|
break;
|
|
}
|
|
|
|
//if (buff_guid)
|
|
// HandleTriggerBuff(buff_guid, Source);
|
|
}
|
|
|
|
bool BattlegroundWS::SetupBattleground()
|
|
{
|
|
// flags
|
|
if (!AddObject(BG_WS_OBJECT_A_FLAG, BG_OBJECT_A_FLAG_WS_ENTRY, 1540.423f, 1481.325f, 351.8284f, 3.089233f, 0, 0, 0.9996573f, 0.02617699f, BG_WS_FLAG_RESPAWN_TIME/1000)
|
|
|| !AddObject(BG_WS_OBJECT_H_FLAG, BG_OBJECT_H_FLAG_WS_ENTRY, 916.0226f, 1434.405f, 345.413f, 0.01745329f, 0, 0, 0.008726535f, 0.9999619f, BG_WS_FLAG_RESPAWN_TIME/1000)
|
|
// buffs
|
|
|| !AddObject(BG_WS_OBJECT_SPEEDBUFF_1, BG_OBJECTID_SPEEDBUFF_ENTRY, 1449.93f, 1470.71f, 342.6346f, -1.64061f, 0, 0, 0.7313537f, -0.6819983f, BUFF_RESPAWN_TIME)
|
|
|| !AddObject(BG_WS_OBJECT_SPEEDBUFF_2, BG_OBJECTID_SPEEDBUFF_ENTRY, 1005.171f, 1447.946f, 335.9032f, 1.64061f, 0, 0, 0.7313537f, 0.6819984f, BUFF_RESPAWN_TIME)
|
|
|| !AddObject(BG_WS_OBJECT_REGENBUFF_1, BG_OBJECTID_REGENBUFF_ENTRY, 1317.506f, 1550.851f, 313.2344f, -0.2617996f, 0, 0, 0.1305263f, -0.9914448f, BUFF_RESPAWN_TIME)
|
|
|| !AddObject(BG_WS_OBJECT_REGENBUFF_2, BG_OBJECTID_REGENBUFF_ENTRY, 1110.451f, 1353.656f, 316.5181f, -0.6806787f, 0, 0, 0.333807f, -0.9426414f, BUFF_RESPAWN_TIME)
|
|
|| !AddObject(BG_WS_OBJECT_BERSERKBUFF_1, BG_OBJECTID_BERSERKERBUFF_ENTRY, 1320.09f, 1378.79f, 314.7532f, 1.186824f, 0, 0, 0.5591929f, 0.8290376f, BUFF_RESPAWN_TIME)
|
|
|| !AddObject(BG_WS_OBJECT_BERSERKBUFF_2, BG_OBJECTID_BERSERKERBUFF_ENTRY, 1139.688f, 1560.288f, 306.8432f, -2.443461f, 0, 0, 0.9396926f, -0.3420201f, BUFF_RESPAWN_TIME)
|
|
// alliance gates
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_A_1, BG_OBJECT_DOOR_A_1_WS_ENTRY, 1503.335f, 1493.466f, 352.1888f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_A_2, BG_OBJECT_DOOR_A_2_WS_ENTRY, 1492.478f, 1457.912f, 342.9689f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_A_3, BG_OBJECT_DOOR_A_3_WS_ENTRY, 1468.503f, 1494.357f, 351.8618f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_A_4, BG_OBJECT_DOOR_A_4_WS_ENTRY, 1471.555f, 1458.778f, 362.6332f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_A_5, BG_OBJECT_DOOR_A_5_WS_ENTRY, 1492.347f, 1458.34f, 342.3712f, -0.03490669f, 0, 0, 0.01745246f, -0.9998477f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_A_6, BG_OBJECT_DOOR_A_6_WS_ENTRY, 1503.466f, 1493.367f, 351.7352f, -0.03490669f, 0, 0, 0.01745246f, -0.9998477f, RESPAWN_IMMEDIATELY)
|
|
// horde gates
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_H_1, BG_OBJECT_DOOR_H_1_WS_ENTRY, 949.1663f, 1423.772f, 345.6241f, -0.5756807f, -0.01673368f, -0.004956111f, -0.2839723f, 0.9586737f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_H_2, BG_OBJECT_DOOR_H_2_WS_ENTRY, 953.0507f, 1459.842f, 340.6526f, -1.99662f, -0.1971825f, 0.1575096f, -0.8239487f, 0.5073641f, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_H_3, BG_OBJECT_DOOR_H_3_WS_ENTRY, 949.9523f, 1422.751f, 344.9273f, 0.0f, 0, 0, 0, 1, RESPAWN_IMMEDIATELY)
|
|
|| !AddObject(BG_WS_OBJECT_DOOR_H_4, BG_OBJECT_DOOR_H_4_WS_ENTRY, 950.7952f, 1459.583f, 342.1523f, 0.05235988f, 0, 0, 0.02617695f, 0.9996573f, RESPAWN_IMMEDIATELY)
|
|
)
|
|
{
|
|
sLog->outError(LOG_FILTER_SQL, "BatteGroundWS: Failed to spawn some object Battleground not created!");
|
|
return false;
|
|
}
|
|
|
|
WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE);
|
|
if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, ALLIANCE))
|
|
{
|
|
sLog->outError(LOG_FILTER_SQL, "BatteGroundWS: Failed to spawn Alliance spirit guide! Battleground not created!");
|
|
return false;
|
|
}
|
|
|
|
sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE);
|
|
if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, HORDE))
|
|
{
|
|
sLog->outError(LOG_FILTER_SQL, "BatteGroundWS: Failed to spawn Horde spirit guide! Battleground not created!");
|
|
return false;
|
|
}
|
|
|
|
sLog->outDebug(LOG_FILTER_BATTLEGROUND, "BatteGroundWS: BG objects and spirit guides spawned");
|
|
|
|
return true;
|
|
}
|
|
|
|
void BattlegroundWS::Reset()
|
|
{
|
|
//call parent's class reset
|
|
Battleground::Reset();
|
|
|
|
m_FlagKeepers[BG_TEAM_ALLIANCE] = 0;
|
|
m_FlagKeepers[BG_TEAM_HORDE] = 0;
|
|
m_DroppedFlagGUID[BG_TEAM_ALLIANCE] = 0;
|
|
m_DroppedFlagGUID[BG_TEAM_HORDE] = 0;
|
|
_flagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_BASE;
|
|
_flagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_BASE;
|
|
m_TeamScores[BG_TEAM_ALLIANCE] = 0;
|
|
m_TeamScores[BG_TEAM_HORDE] = 0;
|
|
bool isBGWeekend = sBattlegroundMgr->IsBGWeekend(GetTypeID());
|
|
m_ReputationCapture = (isBGWeekend) ? 45 : 35;
|
|
m_HonorWinKills = (isBGWeekend) ? 3 : 1;
|
|
m_HonorEndKills = (isBGWeekend) ? 4 : 2;
|
|
// For WorldState
|
|
_minutesElapsed = 0;
|
|
_lastFlagCaptureTeam = 0;
|
|
|
|
/* Spirit nodes is static at this BG and then not required deleting at BG reset.
|
|
if (BgCreatures[WS_SPIRIT_MAIN_ALLIANCE])
|
|
DelCreature(WS_SPIRIT_MAIN_ALLIANCE);
|
|
if (BgCreatures[WS_SPIRIT_MAIN_HORDE])
|
|
DelCreature(WS_SPIRIT_MAIN_HORDE);
|
|
*/
|
|
}
|
|
|
|
void BattlegroundWS::EndBattleground(uint32 winner)
|
|
{
|
|
//win reward
|
|
if (winner == ALLIANCE)
|
|
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorWinKills), ALLIANCE);
|
|
if (winner == HORDE)
|
|
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorWinKills), HORDE);
|
|
//complete map_end rewards (even if no team wins)
|
|
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorEndKills), ALLIANCE);
|
|
RewardHonorToTeam(GetBonusHonorFromKill(m_HonorEndKills), HORDE);
|
|
|
|
Battleground::EndBattleground(winner);
|
|
}
|
|
|
|
void BattlegroundWS::HandleKillPlayer(Player* player, Player* killer)
|
|
{
|
|
if (GetStatus() != STATUS_IN_PROGRESS)
|
|
return;
|
|
|
|
EventPlayerDroppedFlag(player);
|
|
|
|
Battleground::HandleKillPlayer(player, killer);
|
|
}
|
|
|
|
void BattlegroundWS::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
|
|
{
|
|
|
|
BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
|
|
if (itr == PlayerScores.end()) // player not found
|
|
return;
|
|
|
|
switch (type)
|
|
{
|
|
case SCORE_FLAG_CAPTURES: // flags captured
|
|
((BattlegroundWGScore*)itr->second)->FlagCaptures += value;
|
|
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
|
|
break;
|
|
case SCORE_FLAG_RETURNS: // flags returned
|
|
((BattlegroundWGScore*)itr->second)->FlagReturns += value;
|
|
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
|
|
break;
|
|
default:
|
|
Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
|
|
break;
|
|
}
|
|
}
|
|
|
|
WorldSafeLocsEntry const* BattlegroundWS::GetClosestGraveYard(Player* player)
|
|
{
|
|
//if status in progress, it returns main graveyards with spiritguides
|
|
//else it will return the graveyard in the flagroom - this is especially good
|
|
//if a player dies in preparation phase - then the player can't cheat
|
|
//and teleport to the graveyard outside the flagroom
|
|
//and start running around, while the doors are still closed
|
|
if (player->GetTeam() == ALLIANCE)
|
|
{
|
|
if (GetStatus() == STATUS_IN_PROGRESS)
|
|
return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE);
|
|
else
|
|
return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_ALLIANCE);
|
|
}
|
|
else
|
|
{
|
|
if (GetStatus() == STATUS_IN_PROGRESS)
|
|
return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE);
|
|
else
|
|
return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_HORDE);
|
|
}
|
|
}
|
|
|
|
void BattlegroundWS::FillInitialWorldStates(WorldPacket& data)
|
|
{
|
|
data << uint32(BG_WS_FLAG_CAPTURES_ALLIANCE) << uint32(GetTeamScore(ALLIANCE));
|
|
data << uint32(BG_WS_FLAG_CAPTURES_HORDE) << uint32(GetTeamScore(HORDE));
|
|
|
|
if (_flagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND)
|
|
data << uint32(BG_WS_FLAG_UNK_ALLIANCE) << uint32(-1);
|
|
else if (_flagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER)
|
|
data << uint32(BG_WS_FLAG_UNK_ALLIANCE) << uint32(1);
|
|
else
|
|
data << uint32(BG_WS_FLAG_UNK_ALLIANCE) << uint32(0);
|
|
|
|
if (_flagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_GROUND)
|
|
data << uint32(BG_WS_FLAG_UNK_HORDE) << uint32(-1);
|
|
else if (_flagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER)
|
|
data << uint32(BG_WS_FLAG_UNK_HORDE) << uint32(1);
|
|
else
|
|
data << uint32(BG_WS_FLAG_UNK_HORDE) << uint32(0);
|
|
|
|
data << uint32(BG_WS_FLAG_CAPTURES_MAX) << uint32(BG_WS_MAX_TEAM_SCORE);
|
|
|
|
if (GetStatus() == STATUS_IN_PROGRESS)
|
|
{
|
|
data << uint32(BG_WS_STATE_TIMER_ACTIVE) << uint32(1);
|
|
data << uint32(BG_WS_STATE_TIMER) << uint32(25-_minutesElapsed);
|
|
}
|
|
else
|
|
data << uint32(BG_WS_STATE_TIMER_ACTIVE) << uint32(0);
|
|
|
|
if (_flagState[BG_TEAM_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER)
|
|
data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(2);
|
|
else
|
|
data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(1);
|
|
|
|
if (_flagState[BG_TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER)
|
|
data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(2);
|
|
else
|
|
data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(1);
|
|
|
|
}
|
|
|