AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
BattlefieldWG Class Reference

#include "BattlefieldWG.h"

Inheritance diagram for BattlefieldWG:
Battlefield ZoneScript

Public Member Functions

 ~BattlefieldWG () override
 
void OnBattleStart () override
 Called when the battle start.
 
void OnBattleEnd (bool endByTimer) override
 Called when battle end.
 
void OnStartGrouping () override
 Called when grouping starts (15 minutes before battlestart)
 
void OnPlayerJoinWar (Player *player) override
 Called when player accept invite to join battle.
 
void OnPlayerLeaveWar (Player *player) override
 Called when player left the battle.
 
void OnPlayerLeaveZone (Player *player) override
 Called when player left the WG zone.
 
void OnPlayerEnterZone (Player *player) override
 Called when player enters in WG zone.
 
bool Update (uint32 diff) override
 Called for update battlefield data.
 
void OnCreatureCreate (Creature *creature) override
 Called when a creature is created.
 
void OnCreatureRemove (Creature *creature) override
 Called when a creature is removed.
 
void OnGameObjectCreate (GameObject *go) override
 Called when a gameobject is created.
 
void BrokenWallOrTower (TeamId team)
 Called when a wall/tower is broken.
 
void UpdateDamagedTowerCount (TeamId team)
 Called when a tower is damaged.
 
void UpdatedDestroyedTowerCount (TeamId team, GameObject *go)
 Called when tower is broken.
 
void RemoveAurasFromPlayer (Player *player)
 
bool SetupBattlefield () override
 Called when battlefield is setup, at server start.
 
GameObject * GetRelic ()
 Return pointer to relic object.
 
bool CanInteractWithRelic ()
 Define relic object.
 
void SetRelicInteractible (bool allow)
 Define if player can interact with the relic.
 
void UpdateCounterVehicle (bool init)
 Vehicle world states update.
 
void UpdateVehicleCountWG ()
 
void CapturePointTaken (uint32 areaId)
 
void SendInitWorldStatesTo (Player *player)
 
void SendInitWorldStatesToAll () override
 Send all worldstate data to all players in zone.
 
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
 Called when a Unit is killed in battlefield zone.
 
void OnUnitDeath (Unit *unit) override
 
void PromotePlayer (Player *killer)
 
uint32 GetHonorBuff (int32 stack) const
 
void UpdateTenacity ()
 
void AddUpdateTenacity (Player *player)
 
void RemoveUpdateTenacity (Player *player)
 
void ProcessEvent (WorldObject *obj, uint32 eventId) override
 
bool FindAndRemoveVehicleFromList (Unit *vehicle)
 
uint8 GetSpiritGraveyardId (uint32 areaId) const
 
uint32 GetAreaByGraveyardId (uint8 gId) const
 
void RelocateDeadPlayers (uint8 graveyardId, TeamId losingTeam)
 
uint32 GetData (uint32 data) const override
 
bool IsLastBattleAttackerVictory () const
 
bool IsKeepNpc (uint32 entry)
 
- Public Member Functions inherited from Battlefield
 Battlefield ()
 Constructor.
 
 ~Battlefield () override
 Destructor.
 
void SendUpdateWorldState (uint32 field, uint32 value)
 Update data of a worldstate to all players present in zone.
 
void InvitePlayersInZoneToQueue ()
 Invite all players in zone to join the queue, called x minutes before battle start in Update()
 
void InvitePlayersInQueueToWar ()
 Invite all players in queue to join battle on battle start.
 
void InvitePlayersInZoneToWar ()
 Invite all players in zone to join battle on battle start.
 
uint32 GetTypeId () const
 
uint32 GetZoneId () const
 
void TeamApplyBuff (TeamId team, uint32 spellId, uint32 spellId2=0)
 
bool IsWarTime () const
 Return true if battle is started, false if battle is not started.
 
void ToggleBattlefield (bool enable)
 Enable or Disable battlefield.
 
bool IsEnabled () const
 Return if battlefield is enabled.
 
void KickPlayerFromBattlefield (ObjectGuid guid)
 Kick player from battlefield and teleport him to kick-point location.
 
void HandlePlayerEnterZone (Player *player, uint32 zone)
 Called when player (player) enters the zone.
 
void HandlePlayerLeaveZone (Player *player, uint32 zone)
 Called when player (player) leaves the zone.
 
uint64 GetData64 (uint32 dataId) const override
 
void SetData64 (uint32 dataId, uint64 value) override
 
void SetData (uint32 dataId, uint32 value) override
 
virtual void UpdateData (uint32 index, int32 pad)
 
TeamId GetDefenderTeam () const
 
TeamId GetAttackerTeam () const
 
TeamId GetOtherTeam (TeamId team) const
 
void SetDefenderTeam (TeamId team)
 
Group * GetFreeBfRaid (TeamId teamId)
 Find a not full battlefield group, if there is no, create one.
 
Group * GetGroupPlayer (ObjectGuid guid, TeamId teamId)
 Return battlefield group where player is.
 
bool AddOrSetPlayerToCorrectBfGroup (Player *player)
 Force player to join a battlefield group.
 
void TryRejoinAfterLogout (Player *player)
 
GraveyardStruct const * GetClosestGraveyard (Player *player)
 
virtual void AddPlayerToResurrectQueue (ObjectGuid npcGuid, ObjectGuid playerGuid)
 
void RemovePlayerFromResurrectQueue (ObjectGuid playerGuid)
 
void SetGraveyardNumber (uint32 number)
 
BfGraveyard * GetGraveyardById (uint32 id) const
 
Creature * SpawnCreature (uint32 entry, float x, float y, float z, float o, TeamId teamId)
 
Creature * SpawnCreature (uint32 entry, Position pos, TeamId teamId)
 
GameObject * SpawnGameObject (uint32 entry, float x, float y, float z, float o)
 
Creature * GetCreature (ObjectGuid const &guid)
 
GameObject * GetGameObject (ObjectGuid const &guid)
 
void SendWarning (uint8 id, WorldObject const *target=nullptr)
 
void PlayerAcceptInviteToQueue (Player *player)
 
void PlayerAcceptInviteToWar (Player *player)
 
uint32 GetBattleId () const
 
void AskToLeaveQueue (Player *player)
 
void PlayerAskToLeave (Player *player)
 
bool CanFlyIn () const
 Return if we can use mount in battlefield.
 
void SendAreaSpiritHealerQueryOpcode (Player *player, ObjectGuid const &guid)
 
void StartBattle ()
 
void EndBattle (bool endByTimer)
 
void HideNpc (Creature *creature)
 
void ShowNpc (Creature *creature, bool aggressive)
 
GraveyardVect const & GetGraveyardVector () const
 
uint32 GetTimer () const
 
void SetTimer (uint32 timer)
 
uint32 GetPlayersInWarCount (TeamId teamId) const
 
uint32 GetPlayersInZoneCount (TeamId teamId) const
 
uint32 GetMaxPlayersPerTeam () const
 
bool HasWarVacancy (TeamId teamId) const
 Returns true if there is still room for another player on the given team in the active war.
 
GuidUnorderedSet const & GetPlayersQueueSet (TeamId teamId) const
 Returns the set of players waiting in the pre-battle queue (per team, read-only).
 
PlayerTimerMap const & GetInvitedPlayersMap (TeamId teamId) const
 
GuidUnorderedSet const & GetPlayersInWarSet (TeamId teamId) const
 Returns the set of players actively fighting in the war (per team, read-only).
 
bool IsPlayerInBattlefield (ObjectGuid guid) const
 
void DoPlaySoundToAll (uint32 soundId)
 
void InvitePlayerToQueue (Player *player)
 
void InvitePlayerToWar (Player *player)
 
void InitStalker (uint32 entry, float x, float y, float z, float o)
 
- Public Member Functions inherited from ZoneScript
 ZoneScript ()
 
virtual ~ZoneScript ()
 
virtual uint32 GetCreatureEntry (ObjectGuid::LowType, CreatureData const *data)
 
virtual uint32 GetGameObjectEntry (ObjectGuid::LowType, uint32 entry)
 
virtual void OnGameObjectRemove (GameObject *)
 
virtual void OnCreatureEvade (Creature *)
 
virtual ObjectGuid GetGuidData (uint32) const
 
virtual void SetGuidData (uint32, ObjectGuid)
 

Protected Attributes

bool IsRelicInteractible
 
Workshop WorkshopsList
 
GameObjectSet DefenderPortalList
 
GameObjectSet KeepGameObject [2]
 
GameObjectBuilding BuildingsInZone
 
GuidUnorderedSet Vehicles [2]
 
GuidUnorderedSet CanonList
 
GuidUnorderedSet KeepCreature [2]
 
GuidUnorderedSet OutsideCreature [2]
 
GuidUnorderedSet UpdateTenacityList
 
int32 TenacityStack
 
ObjectGuid TitansRelic
 
bool LastBattleAttackerVictory {false}
 
- Protected Attributes inherited from Battlefield
ObjectGuid StalkerGuid
 
uint32 Timer
 
bool Enabled
 
bool Active
 
TeamId DefenderTeam
 
BfCapturePointVector CapturePoints
 
GuidUnorderedSet Players [PVP_TEAMS_COUNT]
 
GuidUnorderedSet PlayersInQueue [PVP_TEAMS_COUNT]
 
GuidUnorderedSet PlayersInWar [PVP_TEAMS_COUNT]
 
PlayerTimerMap InvitedPlayers [PVP_TEAMS_COUNT]
 
PlayerTimerMap PlayersWillBeKick [PVP_TEAMS_COUNT]
 
PlayerTimerMap LogoutGracePlayers [PVP_TEAMS_COUNT]
 
uint32 TypeId
 
uint32 BattleId
 
uint32 ZoneId
 
uint32 MapId
 
Map * BfMap
 
uint32 MaxPlayer
 
uint32 MinPlayer
 
uint32 MinLevel
 
uint32 BattleTime
 
uint32 NoWarBattleTime
 
uint32 RestartAfterCrash
 
uint32 TimeForAcceptInvite
 
WorldLocation KickPosition
 
GraveyardVect GraveyardList
 
uint32 StartGroupingTimer
 
bool StartGrouping
 
TaskScheduler _scheduler
 
GuidUnorderedSet Groups [PVP_TEAMS_COUNT]
 
std::vector< uint64 > Data64
 
std::vector< uint32 > Data32
 

Additional Inherited Members

- Public Types inherited from Battlefield
using BfCapturePointVector = std::vector< BfCapturePoint * >
 Vector of capture points belonging to this battlefield.
 
- Protected Member Functions inherited from Battlefield
void KickAfkPlayers ()
 
virtual void SendRemoveWorldStates (Player *)
 
void BroadcastPacketToZone (WorldPacket const *data) const
 
void BroadcastPacketToQueue (WorldPacket const *data) const
 
void BroadcastPacketToWar (WorldPacket const *data) const
 
void AddCapturePoint (BfCapturePoint *cp)
 
void RegisterZone (uint32 zoneId)
 
bool HasPlayer (Player *player) const
 
void TeamCastSpell (TeamId team, int32 spellId)
 
bool IsPlayerInWarOrInvited (Player *player) const
 Returns true if the player is already tracked as actively in the war or invited to join it.
 
void RemovePlayerFromTracking (ObjectGuid playerGuid, bool removeFromQueue=true)
 
template<typename Func >
void ForEachPlayerInZone (Func &&fn) const
 
template<typename Func >
void ForEachPlayerInQueue (Func &&fn) const
 
template<typename Func >
void ForEachPlayerInWar (Func &&fn) const
 
template<typename Func >
void ForEachPlayerInWar (TeamId team, Func &&fn) const
 
- Static Protected Attributes inherited from Battlefield
static constexpr uint32 LOGOUT_GRACE_SECONDS = 120
 

Detailed Description

Constructor & Destructor Documentation

◆ ~BattlefieldWG()

BattlefieldWG::~BattlefieldWG ( )
override
Todo:

: Implement proper support for vehicle+player teleportation

: Use spell victory/defeat in wg instead of RewardMarkOfHonor() && RewardHonor

: Add proper implement of achievement

40{
41 for (WGWorkshop* workshop : WorkshopsList)
42 delete workshop;
43
45 delete building;
46}
Workshop WorkshopsList
Definition BattlefieldWG.h:444
GameObjectBuilding BuildingsInZone
Definition BattlefieldWG.h:448
Definition BattlefieldWG.h:1057
Definition BattlefieldWG.h:1405

References BuildingsInZone, and WorkshopsList.

Member Function Documentation

◆ AddUpdateTenacity()

void BattlefieldWG::AddUpdateTenacity ( Player *  player)
1218{
1219 UpdateTenacityList.insert(player->GetGUID());
1220}
GuidUnorderedSet UpdateTenacityList
Definition BattlefieldWG.h:454
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:120

References Object::GetGUID(), and UpdateTenacityList.

Referenced by OnPlayerJoinWar().

◆ BrokenWallOrTower()

void BattlefieldWG::BrokenWallOrTower ( TeamId  team)

Called when a wall/tower is broken.

  • Update quest
1092{
1093 // might be some use for this in the future. old code commented out below. KL
1094 /* if (team == GetDefenderTeam())
1095 {
1096 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1097 {
1098 if (Player* player = ObjectAccessor::FindPlayer(guid))
1099 IncrementQuest(player, WGQuest[player->GetTeamId()][2], true);
1100 }
1101 }*/
1102}

Referenced by BfWGGameObjectBuilding::Destroyed().

◆ CanInteractWithRelic()

bool BattlefieldWG::CanInteractWithRelic ( )
inline

Define relic object.

Check if players can interact with the relic (Only if the last door has been broken)

371{ return IsRelicInteractible; }
bool IsRelicInteractible
Definition BattlefieldWG.h:442

References IsRelicInteractible.

Referenced by ProcessEvent().

◆ CapturePointTaken()

void BattlefieldWG::CapturePointTaken ( uint32  areaId)
360{
361 for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
362 for (ObjectGuid const& guid : Players[i])
363 if (Player* player = ObjectAccessor::FindPlayer(guid))
364 if (player->GetAreaId() == areaId)
365 player->UpdateAreaDependentAuras(areaId);
366}
std::uint8_t uint8
Definition Define.h:109
uint8 constexpr PVP_TEAMS_COUNT
Definition SharedDefines.h:3701
GuidUnorderedSet Players[PVP_TEAMS_COUNT]
Definition Battlefield.h:389
Definition ObjectGuid.h:121
Definition Player.h:1086
Definition ObjectAccessor.h:61
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:269

References ObjectAccessor::FindPlayer(), Battlefield::Players, and PVP_TEAMS_COUNT.

Referenced by WGWorkshop::GiveControlTo().

◆ FillInitialWorldStates()

void BattlefieldWG::FillInitialWorldStates ( WorldPackets::WorldState::InitWorldStates &  packet)
overridevirtual

Implements Battlefield.

1009{
1010 uint32 timer = GetTimer() / 1000;
1011 bool iconActive = timer < 15 * MINUTE || IsWarTime();
1012
1013 packet.Worldstates.reserve(4+4+WG_MAX_OBJ+WG_MAX_WORKSHOP);
1016
1017 // Note: cleanup these two, their names look awkward
1018 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_ACTIVE, IsWarTime() ? 0 : 1);
1019 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_SHOW, IsWarTime() ? 1 : 0);
1020 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_CONTROL, DefenderTeam == TEAM_ALLIANCE ? 2 : 1); // Alliance 2, Hord 1
1021 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_ICON_ACTIVE, iconActive ? 1 : 0);
1022
1023 for (uint32 i = 0; i < 2; ++i)
1024 packet.Worldstates.emplace_back(ClockWorldState[i], GameTime::GetGameTime().count() + timer);
1025
1030
1035
1036 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1037 packet.Worldstates.emplace_back(building->m_WorldState, building->m_State);
1038
1039 for (WGWorkshop* workshop : WorkshopsList)
1040 if (workshop)
1041 packet.Worldstates.emplace_back(WorkshopsData[workshop->workshopId].worldstate, workshop->state);
1042}
WGWorkshopData const WorkshopsData[WG_MAX_WORKSHOP]
Definition BattlefieldWG.h:1037
uint8 const WG_MAX_OBJ
Definition BattlefieldWG.h:463
uint8 const WG_MAX_WORKSHOP
Definition BattlefieldWG.h:1025
uint32 const ClockWorldState[2]
Definition BattlefieldWG.h:42
@ BATTLEFIELD_WG_DATA_VEHICLE_A
Definition BattlefieldWG.h:98
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_A
Definition BattlefieldWG.h:96
@ BATTLEFIELD_WG_DATA_VEHICLE_H
Definition BattlefieldWG.h:99
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_H
Definition BattlefieldWG.h:97
constexpr auto MINUTE
Definition Common.h:47
std::uint32_t uint32
Definition Define.h:107
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ WORLD_STATE_BATTLEFIELD_WG_HORDE_KEEP_DEFENDED
Definition WorldStateDefines.h:82
@ WORLD_STATE_BATTLEFIELD_WG_ACTIVE
Definition WorldStateDefines.h:76
@ WORLD_STATE_BATTLEFIELD_WG_VEHICLE_H
Definition WorldStateDefines.h:64
@ WORLD_STATE_BATTLEFIELD_WG_DEFENDER
Definition WorldStateDefines.h:77
@ WORLD_STATE_BATTLEFIELD_WG_VEHICLE_A
Definition WorldStateDefines.h:66
@ WORLD_STATE_BATTLEFIELD_WG_ALLIANCE_KEEP_DEFENDED
Definition WorldStateDefines.h:83
@ WORLD_STATE_BATTLEFIELD_WG_MAX_VEHICLE_H
Definition WorldStateDefines.h:65
@ WORLD_STATE_BATTLEFIELD_WG_ATTACKER
Definition WorldStateDefines.h:78
@ WORLD_STATE_BATTLEFIELD_WG_MAX_VEHICLE_A
Definition WorldStateDefines.h:67
@ WORLD_STATE_BATTLEFIELD_WG_HORDE_KEEP_CAPTURED
Definition WorldStateDefines.h:80
@ WORLD_STATE_BATTLEFIELD_WG_ALLIANCE_KEEP_CAPTURED
Definition WorldStateDefines.h:81
@ WORLD_STATE_BATTLEFIELD_WG_CONTROL
Definition WorldStateDefines.h:79
@ WORLD_STATE_BATTLEFIELD_WG_SHOW
Definition WorldStateDefines.h:74
@ WORLD_STATE_BATTLEFIELD_WG_ICON_ACTIVE
Definition WorldStateDefines.h:85
#define sWorldState
Definition WorldState.h:377
uint32 GetData(uint32 data) const override
Definition BattlefieldWG.cpp:985
TeamId DefenderTeam
Definition Battlefield.h:383
bool IsWarTime() const
Return true if battle is started, false if battle is not started.
Definition Battlefield.h:239
TeamId GetAttackerTeam() const
Definition Battlefield.h:268
TeamId GetDefenderTeam() const
Definition Battlefield.h:267
uint32 GetTimer() const
Definition Battlefield.h:348
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46
Seconds GetGameTime()
Definition GameTime.cpp:38

References BATTLEFIELD_WG_DATA_MAX_VEHICLE_A, BATTLEFIELD_WG_DATA_MAX_VEHICLE_H, BATTLEFIELD_WG_DATA_VEHICLE_A, BATTLEFIELD_WG_DATA_VEHICLE_H, BuildingsInZone, ClockWorldState, Battlefield::DefenderTeam, Battlefield::GetAttackerTeam(), GetData(), Battlefield::GetDefenderTeam(), GameTime::GetGameTime(), Battlefield::GetTimer(), Battlefield::IsWarTime(), MINUTE, sWorldState, TEAM_ALLIANCE, WG_MAX_OBJ, WG_MAX_WORKSHOP, WorkshopsData, WorkshopsList, WORLD_STATE_BATTLEFIELD_WG_ACTIVE, WORLD_STATE_BATTLEFIELD_WG_ALLIANCE_KEEP_CAPTURED, WORLD_STATE_BATTLEFIELD_WG_ALLIANCE_KEEP_DEFENDED, WORLD_STATE_BATTLEFIELD_WG_ATTACKER, WORLD_STATE_BATTLEFIELD_WG_CONTROL, WORLD_STATE_BATTLEFIELD_WG_DEFENDER, WORLD_STATE_BATTLEFIELD_WG_HORDE_KEEP_CAPTURED, WORLD_STATE_BATTLEFIELD_WG_HORDE_KEEP_DEFENDED, WORLD_STATE_BATTLEFIELD_WG_ICON_ACTIVE, WORLD_STATE_BATTLEFIELD_WG_MAX_VEHICLE_A, WORLD_STATE_BATTLEFIELD_WG_MAX_VEHICLE_H, WORLD_STATE_BATTLEFIELD_WG_SHOW, WORLD_STATE_BATTLEFIELD_WG_VEHICLE_A, WORLD_STATE_BATTLEFIELD_WG_VEHICLE_H, WGWorkshopData::worldstate, and WorldPackets::WorldState::InitWorldStates::Worldstates.

Referenced by SendInitWorldStatesTo().

◆ FindAndRemoveVehicleFromList()

bool BattlefieldWG::FindAndRemoveVehicleFromList ( Unit *  vehicle)
846{
847 for (uint32 i = 0; i < 2; ++i)
848 {
849 if (Vehicles[i].find(vehicle->GetGUID()) != Vehicles[i].end())
850 {
851 //Vehicles[i].erase(vehicle->GetGUID());
852 if (i == TEAM_HORDE)
854 else
856 return true;
857 }
858 }
859 return false;
860}
@ TEAM_HORDE
Definition SharedDefines.h:749
GuidUnorderedSet Vehicles[2]
Definition BattlefieldWG.h:450
Definition UpdateData.h:52

References BATTLEFIELD_WG_DATA_VEHICLE_A, BATTLEFIELD_WG_DATA_VEHICLE_H, Object::GetGUID(), TEAM_HORDE, and Vehicles.

Referenced by OnUnitDeath().

◆ GetAreaByGraveyardId()

uint32 BattlefieldWG::GetAreaByGraveyardId ( uint8  gId) const
568{
569 switch (gId)
570 {
579 }
580
581 return 0;
582}
@ AREA_THE_SUNKEN_RING
Definition AreaDefines.h:155
@ AREA_EASTSPARK_WORKSHOP
Definition AreaDefines.h:161
@ AREA_THE_BROKEN_TEMPLE
Definition AreaDefines.h:156
@ AREA_WESTSPARK_WORKSHOP
Definition AreaDefines.h:160
@ BATTLEFIELD_WG_GY_WORKSHOP_NE
Definition BattlefieldWG.h:120
@ BATTLEFIELD_WG_GY_WORKSHOP_SW
Definition BattlefieldWG.h:123
@ BATTLEFIELD_WG_GY_WORKSHOP_SE
Definition BattlefieldWG.h:122
@ BATTLEFIELD_WG_GY_WORKSHOP_NW
Definition BattlefieldWG.h:121

References AREA_EASTSPARK_WORKSHOP, AREA_THE_BROKEN_TEMPLE, AREA_THE_SUNKEN_RING, AREA_WESTSPARK_WORKSHOP, BATTLEFIELD_WG_GY_WORKSHOP_NE, BATTLEFIELD_WG_GY_WORKSHOP_NW, BATTLEFIELD_WG_GY_WORKSHOP_SE, and BATTLEFIELD_WG_GY_WORKSHOP_SW.

Referenced by WGWorkshop::GiveControlTo().

◆ GetData()

uint32 BattlefieldWG::GetData ( uint32  data) const
overridevirtual

Reimplemented from Battlefield.

986{
987 // xinef: little hack, same area for default horde graveyard
988 // this graveyard is the one of broken temple!
989 if (data == AREA_THE_CHILLED_QUAGMIRE)
991
992 switch (data)
993 {
994 // Used to determine when the phasing spells must be casted
995 // See: SpellArea::IsFitToRequirements
1000 // Graveyards and Workshops are controlled by the same team.
1001 if (BfGraveyard const* graveyard = GetGraveyardById(GetSpiritGraveyardId(data)))
1002 return graveyard->GetControlTeamId();
1003 }
1004
1005 return Battlefield::GetData(data);
1006}
@ AREA_THE_CHILLED_QUAGMIRE
Definition AreaDefines.h:159
uint8 GetSpiritGraveyardId(uint32 areaId) const
Definition BattlefieldWG.cpp:541
uint32 GetData(uint32 dataId) const override
Definition Battlefield.h:262
BfGraveyard * GetGraveyardById(uint32 id) const
Definition Battlefield.cpp:671
Definition Battlefield.h:156

References AREA_EASTSPARK_WORKSHOP, AREA_THE_BROKEN_TEMPLE, AREA_THE_CHILLED_QUAGMIRE, AREA_THE_SUNKEN_RING, AREA_WESTSPARK_WORKSHOP, Battlefield::GetData(), Battlefield::GetGraveyardById(), and GetSpiritGraveyardId().

Referenced by FillInitialWorldStates(), OnBattleEnd(), OnCreatureCreate(), OnPlayerJoinWar(), UpdatedDestroyedTowerCount(), and UpdateVehicleCountWG().

◆ GetHonorBuff()

uint32 BattlefieldWG::GetHonorBuff ( int32  stack) const
1207{
1208 if (stack < 5)
1209 return 0;
1210 if (stack < 10)
1211 return SPELL_GREAT_HONOR;
1212 if (stack < 15)
1213 return SPELL_GREATER_HONOR;
1214 return SPELL_GREATEST_HONOR;
1215}
@ SPELL_GREATEST_HONOR
Definition BattlefieldWG.h:58
@ SPELL_GREATER_HONOR
Definition BattlefieldWG.h:57
@ SPELL_GREAT_HONOR
Definition BattlefieldWG.h:56

References SPELL_GREAT_HONOR, SPELL_GREATER_HONOR, and SPELL_GREATEST_HONOR.

Referenced by UpdateTenacity().

◆ GetRelic()

GameObject * BattlefieldWG::GetRelic ( )
inline

Return pointer to relic object.

365{ return GetGameObject(TitansRelic); }
ObjectGuid TitansRelic
Definition BattlefieldWG.h:458
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Battlefield.cpp:853

References Battlefield::GetGameObject(), and TitansRelic.

Referenced by BfWGGameObjectBuilding::Destroyed(), OnBattleEnd(), and ProcessEvent().

◆ GetSpiritGraveyardId()

uint8 BattlefieldWG::GetSpiritGraveyardId ( uint32  areaId) const
542{
543 switch (areaId)
544 {
555 case AREA_WINTERGRASP:
559 default:
560 LOG_ERROR("bg.battlefield", "BattlefieldWG::GetSpiritGraveyardId: Unexpected Area Id {}", areaId);
561 break;
562 }
563
564 return 0;
565}
@ AREA_WINTERGRASP_FORTRESS
Definition AreaDefines.h:158
@ AREA_WINTERGRASP
Definition AreaDefines.h:145
@ BATTLEFIELD_WG_GY_KEEP
Definition BattlefieldWG.h:124
@ BATTLEFIELD_WG_GY_HORDE
Definition BattlefieldWG.h:125
@ BATTLEFIELD_WG_GY_ALLIANCE
Definition BattlefieldWG.h:126
#define LOG_ERROR(filterType__,...)
Definition Log.h:145

References AREA_EASTSPARK_WORKSHOP, AREA_THE_BROKEN_TEMPLE, AREA_THE_CHILLED_QUAGMIRE, AREA_THE_SUNKEN_RING, AREA_WESTSPARK_WORKSHOP, AREA_WINTERGRASP, AREA_WINTERGRASP_FORTRESS, BATTLEFIELD_WG_GY_ALLIANCE, BATTLEFIELD_WG_GY_HORDE, BATTLEFIELD_WG_GY_KEEP, BATTLEFIELD_WG_GY_WORKSHOP_NE, BATTLEFIELD_WG_GY_WORKSHOP_NW, BATTLEFIELD_WG_GY_WORKSHOP_SE, BATTLEFIELD_WG_GY_WORKSHOP_SW, and LOG_ERROR.

Referenced by GetData(), and OnCreatureCreate().

◆ HandleKill()

void BattlefieldWG::HandleKill ( Player *  ,
Unit *   
)
overridevirtual

Called when a Unit is killed in battlefield zone.

Reimplemented from Battlefield.

783{
784 if (killer == victim)
785 {
786 return;
787 }
788
789 TeamId killerTeam = killer->GetTeamId();
790
791 // xinef: tower cannons also grant rank
792 if (victim->IsPlayer() || IsKeepNpc(victim->GetEntry()) || victim->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON)
793 {
794 if (Player* victimPlayer = victim->ToPlayer())
795 {
796 sScriptMgr->OnBattlefieldPlayerKill(this, killer, victimPlayer);
797
798 if (victimPlayer->HasAura(SPELL_LIEUTENANT))
799 {
800 // Quest - Wintergrasp - PvP Kill - Horde/Alliance
801 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
802 {
803 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
804 {
805 if (player->GetDistance2d(killer) < 40)
806 player->KilledMonsterCredit(killerTeam == TEAM_HORDE ? NPC_QUEST_PVP_KILL_ALLIANCE : NPC_QUEST_PVP_KILL_HORDE);
807 }
808 }
809 }
810 }
811
812 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
813 {
814 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
815 {
816 if (player->GetDistance2d(killer) < 40)
817 {
818 PromotePlayer(player);
819 }
820 }
821 }
822
823 // Xinef: Allow to Skin non-released corpse
824 if (victim->IsPlayer())
825 {
826 victim->SetUnitFlag(UNIT_FLAG_SKINNABLE);
827 }
828 }
829 else if (victim->IsVehicle() && !killer->IsFriendlyTo(victim))
830 {
831 // Quest - Wintergrasp - PvP Kill - Vehicle
832 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
833 {
834 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
835 {
836 if (player->GetDistance2d(killer) < 40)
837 {
838 player->KilledMonsterCredit(NPC_QUEST_PVP_KILL_VEHICLE);
839 }
840 }
841 }
842 }
843}
@ NPC_QUEST_PVP_KILL_VEHICLE
Definition BattlefieldWG.h:194
@ NPC_QUEST_PVP_KILL_ALLIANCE
Definition BattlefieldWG.h:196
@ NPC_WINTERGRASP_TOWER_CANNON
Definition BattlefieldWG.h:190
@ NPC_QUEST_PVP_KILL_HORDE
Definition BattlefieldWG.h:195
@ SPELL_LIEUTENANT
Definition BattlefieldWG.h:51
#define sScriptMgr
Definition ScriptMgr.h:766
TeamId
Definition SharedDefines.h:747
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:283
void PromotePlayer(Player *killer)
Definition BattlefieldWG.cpp:871
bool IsKeepNpc(uint32 entry)
Definition BattlefieldWG.h:411
GuidUnorderedSet PlayersInWar[PVP_TEAMS_COUNT]
Definition Battlefield.h:391
Player * ToPlayer()
Definition Object.h:208

References ObjectAccessor::FindPlayer(), Object::GetEntry(), Player::GetTeamId(), Unit::IsFriendlyTo(), IsKeepNpc(), Object::IsPlayer(), Unit::IsVehicle(), NPC_QUEST_PVP_KILL_ALLIANCE, NPC_QUEST_PVP_KILL_HORDE, NPC_QUEST_PVP_KILL_VEHICLE, NPC_WINTERGRASP_TOWER_CANNON, Battlefield::PlayersInWar, PromotePlayer(), Unit::SetUnitFlag(), SPELL_LIEUTENANT, sScriptMgr, TEAM_HORDE, Object::ToPlayer(), and UNIT_FLAG_SKINNABLE.

◆ IsKeepNpc()

bool BattlefieldWG::IsKeepNpc ( uint32  entry)
inline
412 {
413 switch (entry)
414 {
437 return true;
438 }
439 return false;
440 }
@ BATTLEFIELD_WG_NPC_BRIGADIER_GENERAL
Definition BattlefieldWG.h:158
@ BATTLEFIELD_WG_NPC_SIEGE_MASTER_STOUTHANDLE
Definition BattlefieldWG.h:177
@ BATTLEFIELD_WG_NPC_TACTICAL_OFFICER_KILRATH
Definition BattlefieldWG.h:153
@ BATTLEFIELD_WG_NPC_HORDE_WARBRINGER
Definition BattlefieldWG.h:157
@ BATTLEFIELD_WG_NPC_COMMANDER_DARDOSH
Definition BattlefieldWG.h:152
@ BATTLEFIELD_WG_NPC_LIEUTENANT_MURP
Definition BattlefieldWG.h:156
@ BATTLEFIELD_WG_NPC_COMMANDER_ZANNETH
Definition BattlefieldWG.h:175
@ BATTLEFIELD_WG_NPC_ANCHORITE_TESSA
Definition BattlefieldWG.h:178
@ BATTLEFIELD_WG_NPC_BOWYER_RANDOLPH
Definition BattlefieldWG.h:171
@ BATTLEFIELD_WG_NPC_SIEGESMITH_STRONGHOOF
Definition BattlefieldWG.h:154
@ BATTLEFIELD_WG_NPC_KNIGHT_DAMERON
Definition BattlefieldWG.h:172
@ BATTLEFIELD_WG_NPC_GUARD_H
Definition BattlefieldWG.h:144
@ BATTLEFIELD_WG_NPC_VIERON_BLAZEFEATHER
Definition BattlefieldWG.h:148
@ BATTLEFIELD_WG_NPC_PRIMALIST_MULFORT
Definition BattlefieldWG.h:155
@ BATTLEFIELD_WG_NPC_STONE_GUARD_MUKAR
Definition BattlefieldWG.h:149
@ BATTLEFIELD_WG_NPC_GUARD_A
Definition BattlefieldWG.h:145
@ BATTLEFIELD_WG_NPC_CHAMPION_ROS_SLAI
Definition BattlefieldWG.h:151
@ BATTLEFIELD_WG_NPC_SORCERESS_KAYLANA
Definition BattlefieldWG.h:173
@ BATTLEFIELD_WG_NPC_SENIOR_DEMOLITIONIST_LEGOSO
Definition BattlefieldWG.h:179
@ BATTLEFIELD_WG_NPC_HOODOO_MASTER_FU_JIN
Definition BattlefieldWG.h:150
@ BATTLEFIELD_WG_NPC_TACTICAL_OFFICER_AHBRAMIS
Definition BattlefieldWG.h:176
@ BATTLEFIELD_WG_NPC_MARSHAL_MAGRUDER
Definition BattlefieldWG.h:174

References BATTLEFIELD_WG_NPC_ANCHORITE_TESSA, BATTLEFIELD_WG_NPC_BOWYER_RANDOLPH, BATTLEFIELD_WG_NPC_BRIGADIER_GENERAL, BATTLEFIELD_WG_NPC_CHAMPION_ROS_SLAI, BATTLEFIELD_WG_NPC_COMMANDER_DARDOSH, BATTLEFIELD_WG_NPC_COMMANDER_ZANNETH, BATTLEFIELD_WG_NPC_GUARD_A, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_HOODOO_MASTER_FU_JIN, BATTLEFIELD_WG_NPC_HORDE_WARBRINGER, BATTLEFIELD_WG_NPC_KNIGHT_DAMERON, BATTLEFIELD_WG_NPC_LIEUTENANT_MURP, BATTLEFIELD_WG_NPC_MARSHAL_MAGRUDER, BATTLEFIELD_WG_NPC_PRIMALIST_MULFORT, BATTLEFIELD_WG_NPC_SENIOR_DEMOLITIONIST_LEGOSO, BATTLEFIELD_WG_NPC_SIEGE_MASTER_STOUTHANDLE, BATTLEFIELD_WG_NPC_SIEGESMITH_STRONGHOOF, BATTLEFIELD_WG_NPC_SORCERESS_KAYLANA, BATTLEFIELD_WG_NPC_STONE_GUARD_MUKAR, BATTLEFIELD_WG_NPC_TACTICAL_OFFICER_AHBRAMIS, BATTLEFIELD_WG_NPC_TACTICAL_OFFICER_KILRATH, and BATTLEFIELD_WG_NPC_VIERON_BLAZEFEATHER.

Referenced by HandleKill().

◆ IsLastBattleAttackerVictory()

bool BattlefieldWG::IsLastBattleAttackerVictory ( ) const
inline
bool LastBattleAttackerVictory
Definition BattlefieldWG.h:460

References LastBattleAttackerVictory.

◆ OnBattleEnd()

void BattlefieldWG::OnBattleEnd ( bool  endByTimer)
overridevirtual

Called when battle end.

  • Remove relic and turret
  • Change banner/npc in keep if it needed
  • Saving battlestate
  • Reward honor/mark to player
  • Remove vehicle
    Parameters
    endByTimer: true if battle ended when timer is at 00:00, false if battle ended by clicking on relic

Reimplemented from Battlefield.

369{
370 // Must be set before SPELL_VICTORY_REWARD so the 1755 criterion can gate on it.
371 LastBattleAttackerVictory = !endByTimer;
372
373 // Remove relic
374 if (GameObject* go = GetRelic())
375 go->RemoveFromWorld();
376
378
379 // Remove turret
380 for (ObjectGuid const& guid : CanonList)
381 {
382 if (Creature* creature = GetCreature(guid))
383 {
384 if (!endByTimer)
385 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
386 HideNpc(creature);
387 }
388 }
389
390 // Change all npc in keep
391 for (ObjectGuid const& guid : KeepCreature[GetAttackerTeam()])
392 if (Creature* creature = GetCreature(guid))
393 HideNpc(creature);
394
395 for (ObjectGuid const& guid : KeepCreature[GetDefenderTeam()])
396 if (Creature* creature = GetCreature(guid))
397 ShowNpc(creature, true);
398
399 // Change all npc out of keep
400 for (ObjectGuid const& guid : OutsideCreature[GetDefenderTeam()])
401 if (Creature* creature = GetCreature(guid))
402 HideNpc(creature);
403
404 for (ObjectGuid const& guid : OutsideCreature[GetAttackerTeam()])
405 if (Creature* creature = GetCreature(guid))
406 ShowNpc(creature, true);
407
408 // Update all graveyard, control is to defender when no wartime
409 for (uint8 i = 0; i < BATTLEFIELD_WG_GY_HORDE; i++)
410 if (BfGraveyard* graveyard = GetGraveyardById(i))
412
414 go->SetRespawnTime(RESPAWN_IMMEDIATELY);
415
417 go->SetRespawnTime(RESPAWN_ONE_DAY);
418
419 // Update portal defender faction
422
423 // Saving data
425 {
426 building->Rebuild();
427 building->Save();
428 building->UpdateTurretAttack(true);
429 }
430
431 for (WGWorkshop* workshop : WorkshopsList)
432 {
433 workshop->GiveControlTo(workshop->workshopId == BATTLEFIELD_WG_WORKSHOP_SE || workshop->workshopId == BATTLEFIELD_WG_WORKSHOP_SW ? GetAttackerTeam() : GetDefenderTeam(), true);
434 workshop->Save();
435 }
436
437 for (uint8 team = 0; team < 2; ++team)
438 {
439 for (ObjectGuid const& guid : Vehicles[team])
440 if (Creature* creature = GetCreature(guid))
441 creature->DespawnOrUnsummon(1ms);
442
443 Vehicles[team].clear();
444 }
445
450 uint32 spellDamagedDef = SPELL_DAMAGED_TOWER;
451 uint32 spellFullDef = SPELL_DESTROYED_TOWER;
452 uint32 spellDamagedAtt = SPELL_DAMAGED_BUILDING;
453 uint32 spellFullAtt = SPELL_INTACT_BUILDING;
454
455 if (!endByTimer)
456 {
459 spellDamagedDef = SPELL_DAMAGED_BUILDING;
460 spellFullDef = SPELL_INTACT_BUILDING;
461 spellDamagedAtt = SPELL_DAMAGED_TOWER;
462 spellFullAtt = SPELL_DESTROYED_TOWER;
463 }
464
465 for (ObjectGuid const& guid : PlayersInWar[GetDefenderTeam()])
466 {
467 if (Player* player = ObjectAccessor::FindPlayer(guid))
468 {
469 // Victory in Wintergrasp
470 player->AreaExploredOrEventHappens(GetDefenderTeam() ? 13183 : 13181); // HORDE / ALLY win wg quest id
471
472 player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
473 player->CastSpell(player, SPELL_VICTORY_REWARD, true);
474 RemoveAurasFromPlayer(player);
475
476 for (uint8 i = 0; i < damagedTowersDef; ++i)
477 player->CastSpell(player, spellDamagedDef, true);
478 for (uint8 i = 0; i < brokenTowersDef; ++i)
479 player->CastSpell(player, spellFullDef, true);
480 }
481 }
482
483 bool const grantEssenceToAttackers = sWorld->getBoolConfig(CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS);
484
485 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
486 if (Player* player = ObjectAccessor::FindPlayer(guid))
487 {
488 player->CastSpell(player, SPELL_DEFEAT_REWARD, true);
489 RemoveAurasFromPlayer(player);
490
491 if (grantEssenceToAttackers)
492 player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
493
494 for (uint8 i = 0; i < damagedTowersAtt; ++i)
495 player->CastSpell(player, spellDamagedAtt, true);
496 for (uint8 i = 0; i < brokenTowersAtt; ++i)
497 player->CastSpell(player, spellFullAtt, true);
498 }
499
500 if (!endByTimer)
501 {
502 for (uint8 team = 0; team < 2; ++team)
503 {
504 for (ObjectGuid const& guid : Players[team])
505 {
506 if (Player* player = ObjectAccessor::FindPlayer(guid))
507 {
508 player->RemoveAurasDueToSpell(DefenderTeam == TEAM_ALLIANCE ? SPELL_HORDE_CONTROL_PHASE_SHIFT : SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, player->GetGUID());
510 }
511 }
512 }
513 }
514
515 // Clear players in war list at the end.
517 PlayersInWar[TEAM_HORDE].clear();
518
519 if (!endByTimer) // win alli/horde
520 {
522 sWorldState->setWorldState(worldStateId, sWorldState->getWorldState(worldStateId) + 1);
523
525 }
526 else // defend alli/horde
527 {
529 sWorldState->setWorldState(worldStateId, sWorldState->getWorldState(worldStateId) + 1);
530
532 }
533}
@ SPELL_ESSENCE_OF_WINTERGRASP
Definition BattlefieldWG.h:79
@ SPELL_HORDE_CONTROL_PHASE_SHIFT
Definition BattlefieldWG.h:87
@ SPELL_VICTORY_REWARD
Definition BattlefieldWG.h:64
@ SPELL_DAMAGED_BUILDING
Definition BattlefieldWG.h:68
@ SPELL_ALLIANCE_CONTROL_PHASE_SHIFT
Definition BattlefieldWG.h:88
@ SPELL_INTACT_BUILDING
Definition BattlefieldWG.h:69
@ SPELL_DESTROYED_TOWER
Definition BattlefieldWG.h:67
@ SPELL_DEFEAT_REWARD
Definition BattlefieldWG.h:65
@ SPELL_DAMAGED_TOWER
Definition BattlefieldWG.h:66
@ BATTLEFIELD_WG_TEXT_WIN_KEEP
Definition BattlefieldWG.h:517
@ BATTLEFIELD_WG_TEXT_DEFEND_KEEP
Definition BattlefieldWG.h:516
uint32 const WintergraspFaction[3]
Definition BattlefieldWG.h:43
@ BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT
Definition BattlefieldWG.h:93
@ BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT
Definition BattlefieldWG.h:95
@ BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT
Definition BattlefieldWG.h:94
@ BATTLEFIELD_WG_WORKSHOP_SE
Definition BattlefieldWG.h:498
@ BATTLEFIELD_WG_WORKSHOP_SW
Definition BattlefieldWG.h:499
@ RESPAWN_IMMEDIATELY
Definition Battleground.h:160
@ RESPAWN_ONE_DAY
Definition Battleground.h:159
@ GAMEOBJECT_FACTION
Definition UpdateFields.h:402
@ CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS
Definition WorldConfig.h:341
void RemoveAurasFromPlayer(Player *player)
Definition BattlefieldWG.cpp:904
GameObject * GetRelic()
Return pointer to relic object.
Definition BattlefieldWG.h:365
GuidUnorderedSet CanonList
Definition BattlefieldWG.h:451
GameObjectSet KeepGameObject[2]
Definition BattlefieldWG.h:447
GuidUnorderedSet KeepCreature[2]
Definition BattlefieldWG.h:452
GuidUnorderedSet OutsideCreature[2]
Definition BattlefieldWG.h:453
GameObjectSet DefenderPortalList
Definition BattlefieldWG.h:446
void ShowNpc(Creature *creature, bool aggressive)
Definition Battlefield.cpp:569
Creature * GetCreature(ObjectGuid const &guid)
Definition Battlefield.cpp:845
void SendWarning(uint8 id, WorldObject const *target=nullptr)
Definition Battlefield.cpp:543
void HideNpc(Creature *creature)
Definition Battlefield.cpp:559
Definition Creature.h:47
Definition GameObject.h:120
void Clear()
Definition ObjectGuid.h:141
#define sWorld
Definition World.h:318

References BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT, BATTLEFIELD_WG_GY_HORDE, BATTLEFIELD_WG_GY_WORKSHOP_SE, BATTLEFIELD_WG_GY_WORKSHOP_SW, BATTLEFIELD_WG_TEXT_DEFEND_KEEP, BATTLEFIELD_WG_TEXT_WIN_KEEP, BATTLEFIELD_WG_WORKSHOP_SE, BATTLEFIELD_WG_WORKSHOP_SW, BuildingsInZone, CanonList, ObjectGuid::Clear(), CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS, DefenderPortalList, Battlefield::DefenderTeam, ObjectAccessor::FindPlayer(), GAMEOBJECT_FACTION, Battlefield::GetAttackerTeam(), Battlefield::GetCreature(), GetData(), Battlefield::GetDefenderTeam(), Battlefield::GetGraveyardById(), GetRelic(), Battlefield::HideNpc(), KeepCreature, KeepGameObject, LastBattleAttackerVictory, OutsideCreature, Battlefield::Players, Battlefield::PlayersInWar, RemoveAurasFromPlayer(), RESPAWN_IMMEDIATELY, RESPAWN_ONE_DAY, Battlefield::SendWarning(), Battlefield::ShowNpc(), SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, SPELL_DAMAGED_BUILDING, SPELL_DAMAGED_TOWER, SPELL_DEFEAT_REWARD, SPELL_DESTROYED_TOWER, SPELL_ESSENCE_OF_WINTERGRASP, SPELL_HORDE_CONTROL_PHASE_SHIFT, SPELL_INTACT_BUILDING, SPELL_VICTORY_REWARD, sWorld, sWorldState, TEAM_ALLIANCE, TEAM_HORDE, TitansRelic, Vehicles, WintergraspFaction, WorkshopsList, WORLD_STATE_BATTLEFIELD_WG_ALLIANCE_KEEP_CAPTURED, WORLD_STATE_BATTLEFIELD_WG_ALLIANCE_KEEP_DEFENDED, WORLD_STATE_BATTLEFIELD_WG_HORDE_KEEP_CAPTURED, and WORLD_STATE_BATTLEFIELD_WG_HORDE_KEEP_DEFENDED.

◆ OnBattleStart()

void BattlefieldWG::OnBattleStart ( )
overridevirtual

Called when the battle start.

  • Spawn relic and turret
  • Rebuild tower and wall
  • Invite player to war

Reimplemented from Battlefield.

250{
251 // Spawn titan relic
252 GameObject* go = SpawnGameObject(GO_WINTERGRASP_TITAN_S_RELIC, 5440.37890625f, 2840.493408203125f, 430.2816162109375, 4.45059061050415039f); // VerifiedBuild 51943
253 if (go)
254 {
255 // Update faction of relic, only attacker can click on
257 // Set in use (not allow to click on before last door is broken)
259
260 // save guid
261 TitansRelic = go->GetGUID();
262 }
263 else
264 LOG_ERROR("bg.battlefield", "WG: Failed to spawn titan relic.");
265
266 // Update tower visibility and update faction
267 for (ObjectGuid const& guid : CanonList)
268 {
269 if (Creature* creature = GetCreature(guid))
270 {
271 ShowNpc(creature, true);
272 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
273 }
274 }
275
276 // Rebuild all wall
278 {
279 if (building)
280 {
281 building->Rebuild();
282 building->UpdateTurretAttack(false);
283 }
284 }
285
289
290 // Update graveyard (in no war time all graveyard is to deffender, in war time, depend of base)
291 for (WGWorkshop* workshop : WorkshopsList)
292 if (workshop)
293 workshop->UpdateGraveyardAndWorkshop();
294
295 // Set Sliders capture points data to his owners when battle start
296 for (BfCapturePoint* capturePoint : CapturePoints)
297 capturePoint->SetCapturePointData(capturePoint->GetCapturePointGo(),
298 capturePoint->GetCapturePointGo()->GetEntry() == GO_WINTERGRASP_FACTORY_BANNER_SE || capturePoint->GetCapturePointGo()->GetEntry() == GO_WINTERGRASP_FACTORY_BANNER_SW ? GetAttackerTeam() : GetDefenderTeam());
299
301 // Initialize vehicle counter
303 // Send start warning to all players
305
306 // Xinef: reset tenacity counter
307 TenacityStack = 0;
308
310 {
311 if (!UpdateTenacityList.empty())
313 UpdateTenacityList.clear();
314 context.Repeat(10s);
315 });
316
319}
@ BATTLEFIELD_WG_WORLD_START_MESSAGE
Definition BattlefieldWG.h:139
uint8 const WG_MAX_ATTACKTOWERS
Definition BattlefieldWG.h:767
@ GO_WINTERGRASP_FACTORY_BANNER_SW
Definition BattlefieldWG.h:542
@ GO_WINTERGRASP_TITAN_S_RELIC
Definition BattlefieldWG.h:544
@ GO_WINTERGRASP_FACTORY_BANNER_SE
Definition BattlefieldWG.h:541
@ BATTLEFIELD_WG_TEXT_START
Definition BattlefieldWG.h:507
@ BATTLEFIELD_TIMER_GROUP_WAR
Definition Battlefield.h:62
@ GO_FLAG_NOT_SELECTABLE
Definition SharedDefines.h:1611
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
Definition WorldConfig.h:69
void UpdateCounterVehicle(bool init)
Vehicle world states update.
Definition BattlefieldWG.cpp:321
void SendInitWorldStatesToAll() override
Send all worldstate data to all players in zone.
Definition BattlefieldWG.cpp:1055
void UpdateTenacity()
Definition BattlefieldWG.cpp:1228
int32 TenacityStack
Definition BattlefieldWG.h:456
BfCapturePointVector CapturePoints
Definition Battlefield.h:386
void SetData(uint32 dataId, uint32 value) override
Definition Battlefield.h:263
TaskScheduler _scheduler
Definition Battlefield.h:420
GameObject * SpawnGameObject(uint32 entry, float x, float y, float z, float o)
Definition Battlefield.cpp:823
Definition Battlefield.h:86
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:139
void SetGameObjectFlag(GameObjectFlags flags)
Definition GameObject.h:219
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:648
Definition TaskScheduler.h:422
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
Definition TaskScheduler.h:494
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
Definition TaskScheduler.h:233

References Battlefield::_scheduler, BATTLEFIELD_TIMER_GROUP_WAR, BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT, BATTLEFIELD_WG_TEXT_START, BATTLEFIELD_WG_WORLD_START_MESSAGE, BuildingsInZone, CanonList, Battlefield::CapturePoints, CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE, GAMEOBJECT_FACTION, Battlefield::GetAttackerTeam(), Battlefield::GetCreature(), Battlefield::GetDefenderTeam(), Object::GetGUID(), GO_FLAG_NOT_SELECTABLE, GO_WINTERGRASP_FACTORY_BANNER_SE, GO_WINTERGRASP_FACTORY_BANNER_SW, GO_WINTERGRASP_TITAN_S_RELIC, LOG_ERROR, TaskContext::Repeat(), TaskScheduler::Schedule(), SendInitWorldStatesToAll(), Battlefield::SendWarning(), ChatHandler::SendWorldText(), Battlefield::SetData(), GameObject::SetGameObjectFlag(), Object::SetUInt32Value(), Battlefield::ShowNpc(), Battlefield::SpawnGameObject(), sWorld, TenacityStack, TitansRelic, UpdateCounterVehicle(), UpdateTenacity(), UpdateTenacityList, WG_MAX_ATTACKTOWERS, WintergraspFaction, and WorkshopsList.

◆ OnCreatureCreate()

void BattlefieldWG::OnCreatureCreate ( Creature *  creature)
overridevirtual

Called when a creature is created.

  • Update vehicle count

Reimplemented from ZoneScript.

626{
627 // Accessing to db spawned creatures
628 switch (creature->GetEntry())
629 {
632 {
634 uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId());
635 // xinef: little workaround, there are 2 spirit guides in same area
636 if (creature->IsWithinDist2d(5103.0f, 3461.5f, 5.0f))
637 graveyardId = BATTLEFIELD_WG_GY_WORKSHOP_NW;
638
639 if (GraveyardList[graveyardId])
640 GraveyardList[graveyardId]->SetSpirit(creature, teamId);
641 break;
642 }
643 }
644
645 // untested code - not sure if it is valid.
646 if (IsWarTime())
647 {
648 switch (creature->GetEntry())
649 {
654 {
655 if (!creature->IsSummon() || !creature->ToTempSummon()->GetSummonerGUID())
656 return;
657
659 if (!creator)
660 return;
661 TeamId team = creator->GetTeamId();
662
663 if (team == TEAM_HORDE)
664 {
666 {
668 creature->CastSpell(creature, SPELL_HORDE_FLAG, true);
669 Vehicles[team].insert(creature->GetGUID());
671 }
672 else
673 {
674 creature->DespawnOrUnsummon();
675 return;
676 }
677 }
678 else
679 {
681 {
683 creature->CastSpell(creature, SPELL_ALLIANCE_FLAG, true);
684 Vehicles[team].insert(creature->GetGUID());
686 }
687 else
688 {
689 creature->DespawnOrUnsummon();
690 return;
691 }
692 }
693 break;
694 }
697 {
698 if (!creature->IsSummon() || !creature->ToTempSummon()->GetSummonerGUID())
699 return;
700
701 if (Unit* owner = creature->ToTempSummon()->GetSummonerUnit())
702 creature->SetFaction(owner->GetFaction());
703 break;
704 }
705 }
706 }
707}
@ NPC_WINTERGRASP_SIEGE_ENGINE_HORDE
Definition BattlefieldWG.h:187
@ NPC_WINTERGRASP_CATAPULT
Definition BattlefieldWG.h:188
@ NPC_WINTERGRASP_DEMOLISHER
Definition BattlefieldWG.h:189
@ NPC_DWARVEN_SPIRIT_GUIDE
Definition BattlefieldWG.h:182
@ NPC_WINTERGRASP_SIEGE_ENGINE_TURRET_HORDE
Definition BattlefieldWG.h:185
@ NPC_WINTERGRASP_SIEGE_ENGINE_TURRET_ALLIANCE
Definition BattlefieldWG.h:184
@ NPC_TAUNKA_SPIRIT_GUIDE
Definition BattlefieldWG.h:181
@ NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE
Definition BattlefieldWG.h:186
@ SPELL_HORDE_FLAG
Definition BattlefieldWG.h:60
@ SPELL_ALLIANCE_FLAG
Definition BattlefieldWG.h:59
void UpdateVehicleCountWG()
Definition BattlefieldWG.cpp:346
GraveyardVect GraveyardList
Definition Battlefield.h:415
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2216
uint32 GetEntry() const
Definition Object.h:123
TeamId GetTeamId(bool original=false) const
Definition Player.h:2139
ObjectGuid GetSummonerGUID() const
Definition TemporarySummon.h:66
Unit * GetSummonerUnit() const
Definition TemporarySummon.cpp:44
Definition Unit.h:665
void SetFaction(uint32 faction)
Definition Unit.cpp:6850
TempSummon * ToTempSummon()
Definition Unit.h:732
bool IsSummon() const
Definition Unit.h:795
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1372
bool IsWithinDist2d(float x, float y, float dist) const
Definition Object.cpp:1364
uint32 GetAreaId() const
Definition Object.cpp:3179

References BATTLEFIELD_WG_DATA_MAX_VEHICLE_A, BATTLEFIELD_WG_DATA_MAX_VEHICLE_H, BATTLEFIELD_WG_DATA_VEHICLE_A, BATTLEFIELD_WG_DATA_VEHICLE_H, BATTLEFIELD_WG_GY_WORKSHOP_NW, Unit::CastSpell(), Creature::DespawnOrUnsummon(), ObjectAccessor::FindPlayer(), WorldObject::GetAreaId(), GetData(), Object::GetEntry(), Object::GetGUID(), GetSpiritGraveyardId(), TempSummon::GetSummonerGUID(), TempSummon::GetSummonerUnit(), Player::GetTeamId(), Battlefield::GraveyardList, Unit::IsSummon(), Battlefield::IsWarTime(), WorldObject::IsWithinDist2d(), NPC_DWARVEN_SPIRIT_GUIDE, NPC_TAUNKA_SPIRIT_GUIDE, NPC_WINTERGRASP_CATAPULT, NPC_WINTERGRASP_DEMOLISHER, NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE, NPC_WINTERGRASP_SIEGE_ENGINE_HORDE, NPC_WINTERGRASP_SIEGE_ENGINE_TURRET_ALLIANCE, NPC_WINTERGRASP_SIEGE_ENGINE_TURRET_HORDE, Unit::SetFaction(), SPELL_ALLIANCE_FLAG, SPELL_HORDE_FLAG, TEAM_ALLIANCE, TEAM_HORDE, Unit::ToTempSummon(), UpdateVehicleCountWG(), and Vehicles.

◆ OnCreatureRemove()

void BattlefieldWG::OnCreatureRemove ( Creature *  creature)
overridevirtual

Called when a creature is removed.

  • Update vehicle count

Reimplemented from ZoneScript.

710{
711 /* possibly can be used later
712 if (IsWarTime())
713 {
714 switch (creature->GetEntry())
715 {
716 case NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE:
717 case NPC_WINTERGRASP_SIEGE_ENGINE_HORDE:
718 case NPC_WINTERGRASP_CATAPULT:
719 case NPC_WINTERGRASP_DEMOLISHER:
720 {
721 uint8 team;
722 if (creature->GetFaction() == WintergraspFaction[TEAM_ALLIANCE])
723 team = TEAM_ALLIANCE;
724 else if (creature->GetFaction() == WintergraspFaction[TEAM_HORDE])
725 team = TEAM_HORDE;
726 else
727 return;
728
729 Vehicles[team].erase(creature->GetGUID());
730 if (team == TEAM_HORDE)
731 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_H, -1);
732 else
733 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_A, -1);
734 UpdateVehicleCountWG();
735
736 break;
737 }
738 }
739 }*/
740}

◆ OnGameObjectCreate()

void BattlefieldWG::OnGameObjectCreate ( GameObject *  go)
overridevirtual

Called when a gameobject is created.

Reimplemented from ZoneScript.

743{
744 uint8 workshopId = 0;
745
746 switch (go->GetEntry())
747 {
749 workshopId = BATTLEFIELD_WG_WORKSHOP_NE;
750 break;
752 workshopId = BATTLEFIELD_WG_WORKSHOP_NW;
753 break;
755 workshopId = BATTLEFIELD_WG_WORKSHOP_SE;
756 break;
758 workshopId = BATTLEFIELD_WG_WORKSHOP_SW;
759 break;
760 default:
761 return;
762 }
763
764 for (WGWorkshop* workshop : WorkshopsList)
765 {
766 if (workshop)
767 {
768 if (workshop->workshopId == workshopId)
769 {
770 WintergraspCapturePoint* capturePoint = new WintergraspCapturePoint(this, workshop->teamControl);
771 //Sending neutral team at start to set normal capture points by workshop->teamControl, TEAM_NEUTRAL is ignored at first call
772 capturePoint->SetCapturePointData(go, TEAM_NEUTRAL);
773 capturePoint->LinkToWorkshop(workshop);
774 AddCapturePoint(capturePoint);
775 break;
776 }
777 }
778 }
779}
@ GO_WINTERGRASP_FACTORY_BANNER_NW
Definition BattlefieldWG.h:540
@ GO_WINTERGRASP_FACTORY_BANNER_NE
Definition BattlefieldWG.h:539
@ BATTLEFIELD_WG_WORKSHOP_NW
Definition BattlefieldWG.h:497
@ BATTLEFIELD_WG_WORKSHOP_NE
Definition BattlefieldWG.h:496
@ TEAM_NEUTRAL
Definition SharedDefines.h:750
void AddCapturePoint(BfCapturePoint *cp)
Definition Battlefield.h:438
bool SetCapturePointData(GameObject *capturePoint, TeamId team)
Definition Battlefield.cpp:917
Definition BattlefieldWG.h:234
void LinkToWorkshop(WGWorkshop *workshop)
Definition BattlefieldWG.h:238

References Battlefield::AddCapturePoint(), BATTLEFIELD_WG_WORKSHOP_NE, BATTLEFIELD_WG_WORKSHOP_NW, BATTLEFIELD_WG_WORKSHOP_SE, BATTLEFIELD_WG_WORKSHOP_SW, Object::GetEntry(), GO_WINTERGRASP_FACTORY_BANNER_NE, GO_WINTERGRASP_FACTORY_BANNER_NW, GO_WINTERGRASP_FACTORY_BANNER_SE, GO_WINTERGRASP_FACTORY_BANNER_SW, WintergraspCapturePoint::LinkToWorkshop(), BfCapturePoint::SetCapturePointData(), TEAM_NEUTRAL, and WorkshopsList.

◆ OnPlayerEnterZone()

void BattlefieldWG::OnPlayerEnterZone ( Player *  player)
overridevirtual

Called when player enters in WG zone.

  • Update aura
  • Update worldstate
    Parameters
    player: Player who enters the zone

Reimplemented from Battlefield.

971{
972 if (!Active)
973 RemoveAurasFromPlayer(player);
974
976 // Send worldstate to player
977 SendInitWorldStatesTo(player);
978
979 // xinef: Attacker, if hidden in relic room kick him out (only during wartime)
980 if (IsWarTime() && player->GetTeamId() == GetAttackerTeam())
981 if (player->GetPositionX() > 5400.0f && player->GetPositionX() < 5490.0f && player->GetPositionY() > 2803.0f && player->GetPositionY() < 2878.0f)
983}
void SendInitWorldStatesTo(Player *player)
Definition BattlefieldWG.cpp:1044
bool Active
Definition Battlefield.h:382
void KickPlayerFromBattlefield(ObjectGuid guid)
Kick player from battlefield and teleport him to kick-point location.
Definition Battlefield.cpp:333
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:14747
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References Battlefield::Active, Unit::AddAura(), Battlefield::DefenderTeam, Battlefield::GetAttackerTeam(), Object::GetGUID(), Position::GetPositionX(), Position::GetPositionY(), Player::GetTeamId(), Battlefield::IsWarTime(), Battlefield::KickPlayerFromBattlefield(), RemoveAurasFromPlayer(), SendInitWorldStatesTo(), SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, SPELL_HORDE_CONTROL_PHASE_SHIFT, and TEAM_HORDE.

◆ OnPlayerJoinWar()

void BattlefieldWG::OnPlayerJoinWar ( Player *  player)
overridevirtual

Called when player accept invite to join battle.

  • Update aura
  • Teleport if it needed
  • Update worldstate
  • Update tenacity
    Parameters
    playerPlayer who accepted invite

Reimplemented from Battlefield.

917{
918 RemoveAurasFromPlayer(player);
919
920 player->CastSpell(player, SPELL_RECRUIT, true);
921 AddUpdateTenacity(player);
922
923 if (player->GetTeamId() == GetDefenderTeam())
924 player->TeleportTo(MAP_NORTHREND, 5345, 2842, 410, 3.14f);
925 else
926 {
927 if (player->GetTeamId() == TEAM_HORDE)
928 player->TeleportTo(MAP_NORTHREND, 5025.857422f, 3674.628906f, 362.737122f, 4.135169f);
929 else
930 player->TeleportTo(MAP_NORTHREND, 5101.284f, 2186.564f, 365.549f, 3.812f);
931 }
932
933 if (player->GetTeamId() == GetAttackerTeam())
934 {
937 }
938 else
939 {
942 }
943 SendInitWorldStatesTo(player);
944}
@ MAP_NORTHREND
Definition AreaDefines.h:246
@ SPELL_RECRUIT
Definition BattlefieldWG.h:49
@ SPELL_TOWER_CONTROL
Definition BattlefieldWG.h:54
void AddUpdateTenacity(Player *player)
Definition BattlefieldWG.cpp:1217
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1401
void SetAuraStack(uint32 spellId, Unit *target, uint32 stack)
Definition Unit.cpp:14786

References AddUpdateTenacity(), BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, Unit::CastSpell(), Battlefield::GetAttackerTeam(), GetData(), Battlefield::GetDefenderTeam(), Player::GetTeamId(), MAP_NORTHREND, RemoveAurasFromPlayer(), SendInitWorldStatesTo(), Unit::SetAuraStack(), SPELL_RECRUIT, SPELL_TOWER_CONTROL, TEAM_HORDE, and Player::TeleportTo().

◆ OnPlayerLeaveWar()

void BattlefieldWG::OnPlayerLeaveWar ( Player *  player)
overridevirtual

Called when player left the battle.

  • Update player aura
    Parameters
    player: Player who left the battle

Reimplemented from Battlefield.

947{
948 // Remove all aura from WG /// @todo: false we can go out of this zone on retail and keep Rank buff, remove on end of WG
949 if (!player->GetSession()->PlayerLogout())
950 {
951 if (player->GetVehicle()) // Remove vehicle of player if he go out.
952 player->GetVehicle()->Dismiss();
953 RemoveAurasFromPlayer(player);
954 }
955
956 RemoveUpdateTenacity(player);
957}
void RemoveUpdateTenacity(Player *player)
Definition BattlefieldWG.cpp:1222
WorldSession * GetSession() const
Definition Player.h:2031
Vehicle * GetVehicle() const
Definition Unit.h:1932
void Dismiss()
Definition Vehicle.cpp:571
bool PlayerLogout() const
Definition WorldSession.h:451

References Vehicle::Dismiss(), Player::GetSession(), Unit::GetVehicle(), WorldSession::PlayerLogout(), RemoveAurasFromPlayer(), and RemoveUpdateTenacity().

◆ OnPlayerLeaveZone()

void BattlefieldWG::OnPlayerLeaveZone ( Player *  player)
overridevirtual

Called when player left the WG zone.

Parameters
player: Player who left the zone

Reimplemented from Battlefield.

960{
961 if (!Active)
962 RemoveAurasFromPlayer(player);
963
968}
@ SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT
Definition BattlefieldWG.h:85
@ SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT
Definition BattlefieldWG.h:84
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4936

References Battlefield::Active, Unit::RemoveAurasDueToSpell(), RemoveAurasFromPlayer(), SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT, SPELL_HORDE_CONTROL_PHASE_SHIFT, and SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT.

◆ OnStartGrouping()

void BattlefieldWG::OnStartGrouping ( )
overridevirtual

Called when grouping starts (15 minutes before battlestart)

  • Invite all player in zone to join queue

Reimplemented from Battlefield.

536{
537 if (!IsWarTime())
539}
@ BATTLEFIELD_WG_TEXT_WILL_START
Definition BattlefieldWG.h:518

References BATTLEFIELD_WG_TEXT_WILL_START, Battlefield::IsWarTime(), and Battlefield::SendWarning().

◆ OnUnitDeath()

void BattlefieldWG::OnUnitDeath ( Unit *  unit)
overridevirtual

Reimplemented from ZoneScript.

863{
864 if (IsWarTime())
865 if (unit->IsVehicle())
868}
bool FindAndRemoveVehicleFromList(Unit *vehicle)
Definition BattlefieldWG.cpp:845
bool IsVehicle() const
Definition Unit.h:801

References FindAndRemoveVehicleFromList(), Unit::IsVehicle(), Battlefield::IsWarTime(), and UpdateVehicleCountWG().

◆ ProcessEvent()

void BattlefieldWG::ProcessEvent ( WorldObject *  obj,
uint32  eventId 
)
overridevirtual

Reimplemented from ZoneScript.

1155{
1156 if (!obj || !IsWarTime())
1157 return;
1158
1159 // We handle only gameobjects here
1160 GameObject* go = obj->ToGameObject();
1161 if (!go)
1162 return;
1163
1164 // On click on titan relic
1166 {
1168 {
1169 EndBattle(false);
1170 }
1171 else if (GameObject* relic = GetRelic())
1172 {
1173 relic->SetRespawnTime(RESPAWN_IMMEDIATELY);
1174 }
1175 }
1176
1177 // if destroy or damage event, search the wall/tower and update worldstate/send warning message
1178 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1179 {
1180 if (GameObject* build = ObjectAccessor::GetGameObject(*obj, building->m_Build))
1181 {
1182 if (go->GetEntry() == build->GetEntry())
1183 {
1184 if (build->GetGOInfo()->building.damagedEvent == eventId)
1185 building->Damaged();
1186
1187 if (build->GetGOInfo()->building.destroyedEvent == eventId)
1188 building->Destroyed();
1189
1190 break;
1191 }
1192 }
1193 }
1194}
bool CanInteractWithRelic()
Define relic object.
Definition BattlefieldWG.h:371
void EndBattle(bool endByTimer)
Definition Battlefield.cpp:411
GameObject * ToGameObject()
Definition Object.h:220
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:208

References BuildingsInZone, CanInteractWithRelic(), Battlefield::EndBattle(), Object::GetEntry(), ObjectAccessor::GetGameObject(), GetRelic(), GO_WINTERGRASP_TITAN_S_RELIC, Battlefield::IsWarTime(), RESPAWN_IMMEDIATELY, and Object::ToGameObject().

◆ PromotePlayer()

void BattlefieldWG::PromotePlayer ( Player *  killer)
872{
873 if (!Active)
874 return;
875 // Updating rank of player
876 if (Aura* recruitAura = killer->GetAura(SPELL_RECRUIT))
877 {
878 if (recruitAura->GetStackAmount() >= 5)
879 {
880 killer->RemoveAura(SPELL_RECRUIT);
881 killer->CastSpell(killer, SPELL_CORPORAL, true);
883 }
884 else
885 {
886 killer->CastSpell(killer, SPELL_RECRUIT, true);
887 }
888 }
889 else if (Aura* corporalAura = killer->GetAura(SPELL_CORPORAL))
890 {
891 if (corporalAura->GetStackAmount() >= 5)
892 {
893 killer->RemoveAura(SPELL_CORPORAL);
894 killer->CastSpell(killer, SPELL_LIEUTENANT, true);
896 }
897 else
898 {
899 killer->CastSpell(killer, SPELL_CORPORAL, true);
900 }
901 }
902}
@ SPELL_CORPORAL
Definition BattlefieldWG.h:50
@ BATTLEFIELD_WG_TEXT_SECONDRANK
Definition BattlefieldWG.h:520
@ BATTLEFIELD_WG_TEXT_FIRSTRANK
Definition BattlefieldWG.h:519
Definition SpellAuras.h:88
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5624
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4797

References Battlefield::Active, BATTLEFIELD_WG_TEXT_FIRSTRANK, BATTLEFIELD_WG_TEXT_SECONDRANK, Unit::CastSpell(), Unit::GetAura(), Unit::RemoveAura(), Battlefield::SendWarning(), SPELL_CORPORAL, SPELL_LIEUTENANT, and SPELL_RECRUIT.

Referenced by HandleKill().

◆ RelocateDeadPlayers()

void BattlefieldWG::RelocateDeadPlayers ( uint8  graveyardId,
TeamId  losingTeam 
)
585{
586 // Nobody could use the graveyard before the change, so nobody is left waiting on it.
587 if (losingTeam == TEAM_NEUTRAL)
588 return;
589
590 BfGraveyard const* graveyard = GetGraveyardById(graveyardId);
591 if (!graveyard)
592 return;
593
594 GraveyardStruct const* capturedLoc = sGraveyard->GetGraveyard(graveyard->GetGraveyardId());
595 if (!capturedLoc)
596 return;
597
598 ForEachPlayerInZone([this, capturedLoc, losingTeam](Player* player)
599 {
600 // Only the team that just lost it. The other team could never have released here, since
601 // RepopAtGraveyard picks a graveyard their own team holds, so they are passers-by.
602 if (player->GetTeamId() != losingTeam)
603 return;
604
605 // Ghosts only. Skips the living, and corpses that RepopAtGraveyard will send to a
606 // graveyard their team holds once they release.
607 if (!player->HasPlayerFlag(PLAYER_FLAGS_GHOST))
608 return;
609
610 // Only ghosts waiting at this graveyard, not elsewhere in the zone.
611 if (player->GetDistance2d(capturedLoc->x, capturedLoc->y) > 50.0f)
612 return;
613
614 GraveyardStruct const* safeLoc = GetClosestGraveyard(player);
615 if (!safeLoc)
616 return;
617
618 player->TeleportTo(safeLoc->Map, safeLoc->x, safeLoc->y, safeLoc->z, player->GetOrientation());
619
620 // The spirit guides here are phased out for them now, so they can't queue themselves.
622 });
623}
#define sGraveyard
Definition GameGraveyard.h:76
@ PLAYER_FLAGS_GHOST
Definition Player.h:463
void ForEachPlayerInZone(Func &&fn) const
Definition Battlefield.h:452
virtual void AddPlayerToResurrectQueue(ObjectGuid npcGuid, ObjectGuid playerGuid)
Definition Battlefield.cpp:712
GraveyardStruct const * GetClosestGraveyard(Player *player)
Definition Battlefield.cpp:686
uint32 GetGraveyardId() const
Definition Battlefield.h:186
static ObjectGuid const Empty
Definition ObjectGuid.h:123
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1125
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1322
Definition GameGraveyard.h:27
float z
Definition GameGraveyard.h:32
float x
Definition GameGraveyard.h:30
float y
Definition GameGraveyard.h:31
uint32 Map
Definition GameGraveyard.h:29
float GetOrientation() const
Definition Position.h:124

References Battlefield::AddPlayerToResurrectQueue(), ObjectGuid::Empty, Battlefield::ForEachPlayerInZone(), Battlefield::GetClosestGraveyard(), WorldObject::GetDistance2d(), Battlefield::GetGraveyardById(), BfGraveyard::GetGraveyardId(), Object::GetGUID(), Position::GetOrientation(), Player::GetTeamId(), Player::HasPlayerFlag(), GraveyardStruct::Map, PLAYER_FLAGS_GHOST, sGraveyard, TEAM_NEUTRAL, Player::TeleportTo(), GraveyardStruct::x, GraveyardStruct::y, and GraveyardStruct::z.

Referenced by WGWorkshop::GiveControlTo().

◆ RemoveAurasFromPlayer()

◆ RemoveUpdateTenacity()

void BattlefieldWG::RemoveUpdateTenacity ( Player *  player)
1223{
1224 UpdateTenacityList.erase(player->GetGUID());
1226}

References ObjectGuid::Empty, Object::GetGUID(), and UpdateTenacityList.

Referenced by OnPlayerLeaveWar().

◆ SendInitWorldStatesTo()

void BattlefieldWG::SendInitWorldStatesTo ( Player *  player)
1045{
1047 packet.MapID = MapId;
1048 packet.ZoneID = ZoneId;
1049 packet.AreaID = player->GetAreaId();
1050 FillInitialWorldStates(packet);
1051
1052 player->SendDirectMessage(packet.Write());
1053}
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
Definition BattlefieldWG.cpp:1008
uint32 MapId
Definition Battlefield.h:403
uint32 ZoneId
Definition Battlefield.h:402
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5864
Definition WorldStatePackets.h:28
int32 MapID
Definition WorldStatePackets.h:42
int32 AreaID
Definition WorldStatePackets.h:44
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:22
int32 ZoneID
Definition WorldStatePackets.h:43

References WorldPackets::WorldState::InitWorldStates::AreaID, FillInitialWorldStates(), WorldObject::GetAreaId(), Battlefield::MapId, WorldPackets::WorldState::InitWorldStates::MapID, Player::SendDirectMessage(), WorldPackets::WorldState::InitWorldStates::Write(), Battlefield::ZoneId, and WorldPackets::WorldState::InitWorldStates::ZoneID.

Referenced by OnPlayerEnterZone(), OnPlayerJoinWar(), and SendInitWorldStatesToAll().

◆ SendInitWorldStatesToAll()

void BattlefieldWG::SendInitWorldStatesToAll ( )
overridevirtual

Send all worldstate data to all players in zone.

Implements Battlefield.

1056{
1057 for (uint8 team = 0; team < 2; team++)
1058 for (ObjectGuid const& guid : Players[team])
1059 if (Player* player = ObjectAccessor::FindPlayer(guid))
1060 SendInitWorldStatesTo(player);
1061}

References ObjectAccessor::FindPlayer(), Battlefield::Players, and SendInitWorldStatesTo().

Referenced by OnBattleStart(), and UpdatedDestroyedTowerCount().

◆ SendUpdateWorldStateMessage()

void BattlefieldWG::SendUpdateWorldStateMessage ( uint32  variable,
uint32  value,
Player *  player = nullptr 
)
1080{
1082 worldState.VariableID = variable;
1083 worldState.Value = value;
1084
1085 if (player)
1086 player->SendDirectMessage(worldState.Write());
1087 else
1088 sWorldSessionMgr->SendGlobalMessage(worldState.Write());
1089}
#define sWorldSessionMgr
Definition WorldSessionMgr.h:118
Definition WorldStatePackets.h:50
int32 Value
Definition WorldStatePackets.h:57
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:40
int32 VariableID
Definition WorldStatePackets.h:56

References Player::SendDirectMessage(), sWorldSessionMgr, WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by SendUpdateWorldStates().

◆ SendUpdateWorldStates()

void BattlefieldWG::SendUpdateWorldStates ( Player *  player = nullptr)
overridevirtual

Implements Battlefield.

1064{
1065 uint32 timer = GetTimer() / 1000;
1066 bool iconActive = timer < 15 * MINUTE || IsWarTime();
1067
1074
1075 for (uint32 i = 0; i < 2; ++i)
1077}
void SendUpdateWorldStateMessage(uint32 variable, uint32 value, Player *player=nullptr)
Definition BattlefieldWG.cpp:1079

References ClockWorldState, Battlefield::GetAttackerTeam(), Battlefield::GetDefenderTeam(), GameTime::GetGameTime(), Battlefield::GetTimer(), Battlefield::IsWarTime(), MINUTE, SendUpdateWorldStateMessage(), TEAM_ALLIANCE, WORLD_STATE_BATTLEFIELD_WG_ACTIVE, WORLD_STATE_BATTLEFIELD_WG_ATTACKER, WORLD_STATE_BATTLEFIELD_WG_CONTROL, WORLD_STATE_BATTLEFIELD_WG_DEFENDER, WORLD_STATE_BATTLEFIELD_WG_ICON_ACTIVE, and WORLD_STATE_BATTLEFIELD_WG_SHOW.

◆ SetRelicInteractible()

void BattlefieldWG::SetRelicInteractible ( bool  allow)
inline

Define if player can interact with the relic.

374{ IsRelicInteractible = allow; }

References IsRelicInteractible.

Referenced by BfWGGameObjectBuilding::Destroyed().

◆ SetupBattlefield()

bool BattlefieldWG::SetupBattlefield ( )
overridevirtual

Called when battlefield is setup, at server start.

Reimplemented from Battlefield.

49{
50 TypeId = BATTLEFIELD_WG; // See enum BattlefieldTypes
54 BfMap = sMapMgr->FindMap(MapId, 0);
55
56 // init stalker AFTER setting map id... we spawn it at map=random memory value?...
58
60 Enabled = sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1;
66
69 StartGrouping = false;
70
71 TenacityStack = 0;
73 IsRelicInteractible = false;
74
75 KickPosition.Relocate(5728.117f, 2714.346f, 697.733f, 0);
77
79
81
82 // Init Graveyards
84
85 // Load from db
88 !sWorldState->getWorldState(ClockWorldState[0]))
89 {
93 }
94
97
98 Timer = sWorldState->getWorldState(ClockWorldState[0]);
99 if (Active)
100 {
101 Active = false;
103 }
104
105 for (uint8 i = 0; i < BATTLEFIELD_WG_GRAVEYARD_MAX; i++)
106 {
107 BfGraveyardWG* graveyard = new BfGraveyardWG(this);
108
109 // When between games, the graveyard is controlled by the defending team
110 if (WGGraveyard[i].startcontrol == TEAM_NEUTRAL)
112 else
113 graveyard->Initialize(WGGraveyard[i].startcontrol, WGGraveyard[i].gyid);
114
115 graveyard->SetTextId(WGGraveyard[i].textid);
116 GraveyardList[i] = graveyard;
117 }
118
119 // Spawn workshop creatures and gameobjects
120 for (uint8 i = 0; i < WG_MAX_WORKSHOP; i++)
121 {
122 WGWorkshop* workshop = new WGWorkshop(this, i);
124 workshop->GiveControlTo(GetAttackerTeam(), true);
125 else
126 workshop->GiveControlTo(GetDefenderTeam(), true);
127
128 // Note: Capture point is added once the gameobject is created.
129 WorkshopsList.insert(workshop);
130 }
131
132 // Spawn NPCs in the defender's keep, both Horde and Alliance
133 for (uint8 i = 0; i < WG_MAX_KEEP_NPC; i++)
134 {
135 // Horde npc
136 if (Creature* creature = SpawnCreature(WGKeepNPC[i].entryHorde, WGKeepNPC[i].x, WGKeepNPC[i].y, WGKeepNPC[i].z, WGKeepNPC[i].o, TEAM_HORDE))
137 KeepCreature[TEAM_HORDE].insert(creature->GetGUID());
138 // Alliance npc
139 if (Creature* creature = SpawnCreature(WGKeepNPC[i].entryAlliance, WGKeepNPC[i].x, WGKeepNPC[i].y, WGKeepNPC[i].z, WGKeepNPC[i].o, TEAM_ALLIANCE))
140 KeepCreature[TEAM_ALLIANCE].insert(creature->GetGUID());
141 }
142
143 // Hide NPCs from the Attacker's team in the keep
144 for (ObjectGuid const& guid : KeepCreature[GetAttackerTeam()])
145 if (Creature* creature = GetCreature(guid))
146 HideNpc(creature);
147
148 // Spawn Horde NPCs outside the keep
149 for (uint8 i = 0; i < WG_OUTSIDE_ALLIANCE_NPC; i++)
150 if (Creature* creature = SpawnCreature(WGOutsideNPC[i].entryHorde, WGOutsideNPC[i].x, WGOutsideNPC[i].y, WGOutsideNPC[i].z, WGOutsideNPC[i].o, TEAM_HORDE))
151 OutsideCreature[TEAM_HORDE].insert(creature->GetGUID());
152
153 // Spawn Alliance NPCs outside the keep
155 if (Creature* creature = SpawnCreature(WGOutsideNPC[i].entryAlliance, WGOutsideNPC[i].x, WGOutsideNPC[i].y, WGOutsideNPC[i].z, WGOutsideNPC[i].o, TEAM_ALLIANCE))
156 OutsideCreature[TEAM_ALLIANCE].insert(creature->GetGUID());
157
158 // Hide units outside the keep that are defenders
159 for (ObjectGuid const& guid : OutsideCreature[GetDefenderTeam()])
160 if (Creature* creature = GetCreature(guid))
161 HideNpc(creature);
162
163 // Spawn turrets and hide them per default
164 for (uint8 i = 0; i < WG_MAX_TURRET; i++)
165 {
166 Position towerCannonPos = WGTurret[i].GetPosition();
167 if (Creature* creature = SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos, TEAM_ALLIANCE))
168 {
169 CanonList.insert(creature->GetGUID());
170 HideNpc(creature);
171 }
172 }
173
174 // Spawn all gameobjects
175 for (uint8 i = 0; i < WG_MAX_OBJ; i++)
176 {
180 BuildingsInZone.insert(b);
181 }
182
183 // Spawning portal defender
184 for (uint8 i = 0; i < WG_MAX_TELEPORTER; i++)
185 {
187 DefenderPortalList.insert(go);
189 }
190
192
193 // Schedule always-running periodic timers
196 {
197 ForEachPlayerInZone([this](Player* player)
198 {
200 return;
201
202 TeamId team = player->GetTeamId();
203 Unit* closestSpirit = nullptr;
204 float closestDist = -1.0f;
205 for (BfGraveyard* gy : GraveyardList)
206 {
207 if (!gy)
208 continue;
209 Unit* spirit = ObjectAccessor::GetCreature(*player, gy->GetSpiritGuide(team));
210 if (!spirit)
211 continue;
212 float dist = player->GetDistance(spirit);
213 if (closestDist < 0.0f || dist < closestDist)
214 {
215 closestDist = dist;
216 closestSpirit = spirit;
217 }
218 }
219
220 if (closestSpirit)
221 closestSpirit->CastSpell(closestSpirit, SPELL_SPIRIT_HEAL, true);
222
223 player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true);
224 player->ResurrectPlayer(1.0f);
225 player->CastSpell(player, 6962, true);
226 player->CastSpell(player, SPELL_SPIRIT_HEAL_MANA, true);
227 player->SpawnCorpseBones(false);
229 });
230 context.Repeat();
231 });
232
234 {
237 sWorldState->setWorldState(ClockWorldState[0], Timer);
238 context.Repeat();
239 });
240
241 return true;
242}
uint8 const WG_OUTSIDE_ALLIANCE_NPC
Definition BattlefieldWG.h:467
uint8 const WG_MAX_KEEP_NPC
Definition BattlefieldWG.h:465
uint8 const WG_MAX_TURRET
Definition BattlefieldWG.h:464
@ BATTLEFIELD_WG_NPC_STALKER
Definition BattlefieldWG.h:146
WintergraspObjectPositionData const WGKeepNPC[WG_MAX_KEEP_NPC]
Definition BattlefieldWG.h:649
WintergraspTeleporterData const WGPortalDefenderData[WG_MAX_TELEPORTER]
Definition BattlefieldWG.h:735
uint8 const WG_MAX_OUTSIDE_NPC
Definition BattlefieldWG.h:466
@ BATTLEFIELD_WG_GRAVEYARD_MAX
Definition BattlefieldWG.h:127
uint8 const WG_MAX_TELEPORTER
Definition BattlefieldWG.h:468
WintergraspObjectPositionData const WGOutsideNPC[WG_MAX_OUTSIDE_NPC]
Definition BattlefieldWG.h:708
BfWGCoordGY const WGGraveyard[BATTLEFIELD_WG_GRAVEYARD_MAX]
Definition BattlefieldWG.h:218
Position const WGTurret[WG_MAX_TURRET]
Definition BattlefieldWG.h:628
@ BATTLEFIELD_WG_DATA_MAX
Definition BattlefieldWG.h:100
WintergraspBuildingSpawnData const WGGameObjectBuilding[WG_MAX_OBJ]
Definition BattlefieldWG.h:580
float const WintergraspStalkerPos[4]
Definition BattlefieldWG.h:44
@ BATTLEFIELD_WG
Definition Battlefield.h:30
@ BATTLEFIELD_TIMER_GROUP_RESURRECT
Definition Battlefield.h:61
@ BATTLEFIELD_TIMER_GROUP_SAVE
Definition Battlefield.h:63
@ BATTLEFIELD_BATTLEID_WG
Definition Battlefield.h:36
@ SPELL_SPIRIT_HEAL
Definition Battleground.h:130
@ SPELL_SPIRIT_HEAL_MANA
Definition Battleground.h:134
@ SPELL_RESURRECTION_VISUAL
Definition Battleground.h:131
@ SPELL_WAITING_FOR_RESURRECT
Definition Battleground.h:128
#define RESURRECTION_INTERVAL
Definition Battleground.h:163
constexpr auto IN_MILLISECONDS
Definition Common.h:53
std::uint64_t uint64
Definition Define.h:106
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:27
#define sMapMgr
Definition MapMgr.h:220
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ CONFIG_WINTERGRASP_PLR_MIN_LVL
Definition WorldConfig.h:335
@ CONFIG_WINTERGRASP_BATTLETIME
Definition WorldConfig.h:336
@ CONFIG_WINTERGRASP_NOBATTLETIME
Definition WorldConfig.h:337
@ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH
Definition WorldConfig.h:338
@ CONFIG_WINTERGRASP_ENABLE
Definition WorldConfig.h:291
@ CONFIG_WINTERGRASP_PLR_MAX
Definition WorldConfig.h:333
@ CONFIG_WINTERGRASP_PLR_MIN
Definition WorldConfig.h:334
Timer
Definition boss_solakar_flamewreath.cpp:29
uint32 BattleTime
Definition Battlefield.h:408
uint32 MaxPlayer
Definition Battlefield.h:405
bool StartGrouping
Definition Battlefield.h:418
uint32 BattleId
Definition Battlefield.h:401
Creature * SpawnCreature(uint32 entry, float x, float y, float z, float o, TeamId teamId)
Definition Battlefield.cpp:783
uint32 MinPlayer
Definition Battlefield.h:406
void RegisterZone(uint32 zoneId)
Definition Battlefield.cpp:554
uint32 NoWarBattleTime
Definition Battlefield.h:409
void InitStalker(uint32 entry, float x, float y, float z, float o)
Definition Battlefield.cpp:296
uint32 MinLevel
Definition Battlefield.h:407
uint32 RestartAfterCrash
Definition Battlefield.h:410
uint32 StartGroupingTimer
Definition Battlefield.h:417
std::vector< uint32 > Data32
Definition Battlefield.h:425
Map * BfMap
Definition Battlefield.h:404
WorldLocation KickPosition
Definition Battlefield.h:412
uint32 TimeForAcceptInvite
Definition Battlefield.h:411
void SetGraveyardNumber(uint32 number)
Definition Battlefield.h:294
bool Enabled
Definition Battlefield.h:381
uint32 TypeId
Definition Battlefield.h:400
Definition BattlefieldWG.h:108
void SetTextId(uint32 textid)
Definition BattlefieldWG.h:112
void Initialize(TeamId startControl, uint32 graveyardId)
Definition Battlefield.cpp:749
void SpawnCorpseBones(bool triggerSave=true)
Definition Player.cpp:4774
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition Player.cpp:4556
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5764
uint32 m_mapId
Definition Position.h:324
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1304
Definition WorldState.h:284
Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:234
void Init(GameObject *gobj, uint32 type, uint32 worldstate, uint8 damageText, uint8 destroyText)
Definition BattlefieldWG.h:1189
Definition Position.h:27
void GetPosition(float &x, float &y) const
Definition Position.h:126
void Relocate(float x, float y)
Definition Position.h:77
void GiveControlTo(TeamId team, bool init)
Definition BattlefieldWG.h:1428

References Battlefield::_scheduler, Battlefield::Active, AREA_WINTERGRASP, BATTLEFIELD_BATTLEID_WG, BATTLEFIELD_TIMER_GROUP_RESURRECT, BATTLEFIELD_TIMER_GROUP_SAVE, BATTLEFIELD_WG, BATTLEFIELD_WG_DATA_MAX, BATTLEFIELD_WG_GRAVEYARD_MAX, BATTLEFIELD_WG_GY_WORKSHOP_SE, BATTLEFIELD_WG_GY_WORKSHOP_SW, BATTLEFIELD_WG_NPC_STALKER, BATTLEFIELD_WG_WORKSHOP_SE, BATTLEFIELD_WG_WORKSHOP_SW, Battlefield::BattleId, Battlefield::BattleTime, Battlefield::BfMap, BuildingsInZone, CanonList, Unit::CastSpell(), ObjectGuid::Clear(), ClockWorldState, CONFIG_WINTERGRASP_BATTLETIME, CONFIG_WINTERGRASP_ENABLE, CONFIG_WINTERGRASP_NOBATTLETIME, CONFIG_WINTERGRASP_PLR_MAX, CONFIG_WINTERGRASP_PLR_MIN, CONFIG_WINTERGRASP_PLR_MIN_LVL, CONFIG_WINTERGRASP_RESTART_AFTER_CRASH, Battlefield::Data32, DefenderPortalList, Battlefield::DefenderTeam, Battlefield::Enabled, Battlefield::ForEachPlayerInZone(), GAMEOBJECT_FACTION, Battlefield::GetAttackerTeam(), Battlefield::GetCreature(), ObjectAccessor::GetCreature(), Battlefield::GetDefenderTeam(), WorldObject::GetDistance(), Position::GetPosition(), Player::GetTeamId(), WGWorkshop::GiveControlTo(), Battlefield::GraveyardList, BfWGCoordGY::gyid, Unit::HasAura(), Battlefield::HideNpc(), IN_MILLISECONDS, BfWGGameObjectBuilding::Init(), BfGraveyard::Initialize(), Battlefield::InitStalker(), IsRelicInteractible, KeepCreature, Battlefield::KickPosition, WorldLocation::m_mapId, MAP_NORTHREND, Battlefield::MapId, Battlefield::MaxPlayer, Battlefield::MinLevel, Battlefield::MinPlayer, MINUTE, Battlefield::NoWarBattleTime, NPC_WINTERGRASP_TOWER_CANNON, OutsideCreature, Battlefield::RegisterZone(), Position::Relocate(), Unit::RemoveAurasDueToSpell(), TaskContext::Repeat(), Battlefield::RestartAfterCrash, RESURRECTION_INTERVAL, Player::ResurrectPlayer(), TaskScheduler::Schedule(), Battlefield::SetGraveyardNumber(), BfGraveyardWG::SetTextId(), Object::SetUInt32Value(), sMapMgr, Player::SpawnCorpseBones(), Battlefield::SpawnCreature(), Battlefield::SpawnGameObject(), SPELL_RESURRECTION_VISUAL, SPELL_SPIRIT_HEAL, SPELL_SPIRIT_HEAL_MANA, SPELL_WAITING_FOR_RESURRECT, Battlefield::StartGrouping, Battlefield::StartGroupingTimer, sWorld, sWorldState, TEAM_ALLIANCE, TEAM_HORDE, TEAM_NEUTRAL, TenacityStack, Battlefield::TimeForAcceptInvite, TitansRelic, Battlefield::TypeId, UpdateCounterVehicle(), urand(), WG_MAX_KEEP_NPC, WG_MAX_OBJ, WG_MAX_OUTSIDE_NPC, WG_MAX_TELEPORTER, WG_MAX_TURRET, WG_MAX_WORKSHOP, WG_OUTSIDE_ALLIANCE_NPC, WGGameObjectBuilding, WGGraveyard, WGKeepNPC, WGOutsideNPC, WGPortalDefenderData, WGTurret, WintergraspFaction, WintergraspStalkerPos, WorkshopsList, WORLD_STATE_BATTLEFIELD_WG_ACTIVE, WORLD_STATE_BATTLEFIELD_WG_DEFENDER, and Battlefield::ZoneId.

◆ Update()

bool BattlefieldWG::Update ( uint32  diff)
overridevirtual

Called for update battlefield data.

  • Save battle timer in database every minutes
  • Update imunity aura from graveyard
    Parameters
    diff: time elapsed since the last call (in ms)

Reimplemented from Battlefield.

245{
246 return Battlefield::Update(diff);
247}
virtual bool Update(uint32 diff)
Called every time for update bf data and time.
Definition Battlefield.cpp:163

References Battlefield::Update().

Referenced by BattlefieldMgr::Update().

◆ UpdateCounterVehicle()

void BattlefieldWG::UpdateCounterVehicle ( bool  init)

◆ UpdateDamagedTowerCount()

void BattlefieldWG::UpdateDamagedTowerCount ( TeamId  team)

Called when a tower is damaged.

  • Update tower count (for reward calcul)
1198{
1199 if (team == GetAttackerTeam())
1200 {
1203 }
1204}

References BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT, and Battlefield::GetAttackerTeam().

Referenced by BfWGGameObjectBuilding::Damaged().

◆ UpdatedDestroyedTowerCount()

void BattlefieldWG::UpdatedDestroyedTowerCount ( TeamId  team,
GameObject *  go 
)

Called when tower is broken.

  • Update tower buff
  • check if three south tower is down for remove 10 minutes to wg
1106{
1107 // Destroy an attack tower
1108 if (team == GetAttackerTeam())
1109 {
1110 // Update counter
1113
1114 // Remove buff stack on attackers
1115 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1116 if (Player* player = ObjectAccessor::FindPlayer(guid))
1117 player->RemoveAuraFromStack(SPELL_TOWER_CONTROL);
1118
1119 // Add buff stack to defenders
1120 for (ObjectGuid const& guid : PlayersInWar[GetDefenderTeam()])
1121 if (Player* player = ObjectAccessor::FindPlayer(guid))
1122 {
1123 // Quest - Wintergrasp - Southern Tower Kill
1124 if (go && player->GetDistance2d(go) < 200.0f)
1125 player->KilledMonsterCredit(NPC_QUEST_SOUTHERN_TOWER_KILL);
1126
1127 player->CastSpell(player, SPELL_TOWER_CONTROL, true);
1128 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_LEANING_TOWER_ACHIEVEMENT, 0, 0);
1129 }
1130
1131 // If all three south towers are destroyed (ie. all attack towers), remove ten minutes from battle time
1133 {
1134 if (int32(Timer - 600000) < 0)
1135 Timer = 0;
1136 else
1137 Timer -= 600000;
1139 }
1140 }
1141 else
1142 {
1143 // Xinef: rest of structures, quest credit
1144 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1145 if (Player* player = ObjectAccessor::FindPlayer(guid))
1146 {
1147 // Quest - Wintergrasp - Vehicle Protected
1148 if (go && player->GetDistance2d(go) < 100.0f)
1149 player->KilledMonsterCredit(NPC_QUEST_VEHICLE_PROTECTED);
1150 }
1151 }
1152}
@ NPC_QUEST_VEHICLE_PROTECTED
Definition BattlefieldWG.h:193
@ NPC_QUEST_SOUTHERN_TOWER_KILL
Definition BattlefieldWG.h:192
@ SPELL_LEANING_TOWER_ACHIEVEMENT
Definition BattlefieldWG.h:81
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET
Definition DBCEnums.h:142
std::int32_t int32
Definition Define.h:103

References ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, ObjectAccessor::FindPlayer(), Battlefield::GetAttackerTeam(), GetData(), Battlefield::GetDefenderTeam(), WorldObject::GetDistance2d(), NPC_QUEST_SOUTHERN_TOWER_KILL, NPC_QUEST_VEHICLE_PROTECTED, Battlefield::PlayersInWar, SendInitWorldStatesToAll(), SPELL_LEANING_TOWER_ACHIEVEMENT, and SPELL_TOWER_CONTROL.

Referenced by BfWGGameObjectBuilding::Destroyed().

◆ UpdateTenacity()

void BattlefieldWG::UpdateTenacity ( )
1229{
1230 TeamId team = TEAM_NEUTRAL;
1231 uint32 alliancePlayers = PlayersInWar[TEAM_ALLIANCE].size();
1232 uint32 hordePlayers = PlayersInWar[TEAM_HORDE].size();
1233 int32 newStack = 0;
1234
1235 if (alliancePlayers && hordePlayers)
1236 {
1237 if (alliancePlayers < hordePlayers)
1238 newStack = int32((((float)hordePlayers / alliancePlayers) - 1.0f) * 4.0f); // positive, should cast on alliance
1239 else if (alliancePlayers > hordePlayers)
1240 newStack = int32((1.0f - ((float)alliancePlayers / hordePlayers)) * 4.0f); // negative, should cast on horde
1241 }
1242
1243 // Return if no change in stack and apply tenacity to new player
1244 if (newStack == TenacityStack)
1245 {
1246 for (ObjectGuid const& guid : UpdateTenacityList)
1247 if (Player* newPlayer = ObjectAccessor::FindPlayer(guid))
1248 if ((newPlayer->GetTeamId() == TEAM_ALLIANCE && TenacityStack > 0) || (newPlayer->GetTeamId() == TEAM_HORDE && TenacityStack < 0))
1249 {
1250 newStack = std::min(std::abs(newStack), 20);
1251 uint32 buff_honor = GetHonorBuff(newStack);
1252 newPlayer->SetAuraStack(SPELL_TENACITY, newPlayer, newStack);
1253 if (buff_honor)
1254 newPlayer->CastSpell(newPlayer, buff_honor, true);
1255 }
1256 return;
1257 }
1258
1259 if (TenacityStack != 0)
1260 {
1261 if (TenacityStack > 0 && newStack <= 0) // old buff was on alliance
1262 team = TEAM_ALLIANCE;
1263 else if (TenacityStack < 0 && newStack >= 0) // old buff was on horde
1264 team = TEAM_HORDE;
1265 }
1266
1267 TenacityStack = newStack;
1268 // Remove old buff
1269 if (team != TEAM_NEUTRAL)
1270 {
1271 for (ObjectGuid const& guid : PlayersInWar[team])
1272 if (Player* player = ObjectAccessor::FindPlayer(guid))
1273 player->RemoveAurasDueToSpell(SPELL_TENACITY);
1274
1275 for (ObjectGuid const& guid : Vehicles[team])
1276 if (Creature* creature = GetCreature(guid))
1277 creature->RemoveAurasDueToSpell(SPELL_TENACITY_VEHICLE);
1278 }
1279
1280 // Apply new buff
1281 if (newStack)
1282 {
1283 team = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE;
1284 newStack = std::min(std::abs(newStack), 20);
1285 uint32 buff_honor = GetHonorBuff(newStack);
1286
1287 for (ObjectGuid const& guid : PlayersInWar[team])
1288 if (Player* player = ObjectAccessor::FindPlayer(guid))
1289 {
1290 player->SetAuraStack(SPELL_TENACITY, player, newStack);
1291 if (buff_honor)
1292 player->CastSpell(player, buff_honor, true);
1293 }
1294
1295 for (ObjectGuid const& guid : Vehicles[team])
1296 if (Creature* creature = GetCreature(guid))
1297 {
1298 creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, newStack);
1299 if (buff_honor)
1300 creature->CastSpell(creature, buff_honor, true);
1301 }
1302 }
1303}
@ SPELL_TENACITY_VEHICLE
Definition BattlefieldWG.h:53
TeamId GetTeamId(PvPTeamId teamId)
Definition SharedDefines.h:3718
uint32 GetHonorBuff(int32 stack) const
Definition BattlefieldWG.cpp:1206

References ObjectAccessor::FindPlayer(), Battlefield::GetCreature(), GetHonorBuff(), Battlefield::PlayersInWar, SPELL_TENACITY, SPELL_TENACITY_VEHICLE, TEAM_ALLIANCE, TEAM_HORDE, TEAM_NEUTRAL, TenacityStack, UpdateTenacityList, and Vehicles.

Referenced by OnBattleStart().

◆ UpdateVehicleCountWG()

Member Data Documentation

◆ BuildingsInZone

◆ CanonList

GuidUnorderedSet BattlefieldWG::CanonList
protected

◆ DefenderPortalList

GameObjectSet BattlefieldWG::DefenderPortalList
protected

Referenced by OnBattleEnd(), and SetupBattlefield().

◆ IsRelicInteractible

bool BattlefieldWG::IsRelicInteractible
protected

◆ KeepCreature

GuidUnorderedSet BattlefieldWG::KeepCreature[2]
protected

Referenced by OnBattleEnd(), and SetupBattlefield().

◆ KeepGameObject

GameObjectSet BattlefieldWG::KeepGameObject[2]
protected

Referenced by OnBattleEnd().

◆ LastBattleAttackerVictory

bool BattlefieldWG::LastBattleAttackerVictory {false}
protected
460{false};

Referenced by IsLastBattleAttackerVictory(), and OnBattleEnd().

◆ OutsideCreature

GuidUnorderedSet BattlefieldWG::OutsideCreature[2]
protected

Referenced by OnBattleEnd(), and SetupBattlefield().

◆ TenacityStack

int32 BattlefieldWG::TenacityStack
protected

◆ TitansRelic

ObjectGuid BattlefieldWG::TitansRelic
protected

◆ UpdateTenacityList

GuidUnorderedSet BattlefieldWG::UpdateTenacityList
protected

◆ Vehicles

GuidUnorderedSet BattlefieldWG::Vehicles[2]
protected

◆ WorkshopsList


The documentation for this class was generated from the following files: