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.
 
GameObjectGetRelic ()
 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
 
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)
 
GroupGetFreeBfRaid (TeamId teamId)
 Find a not full battlefield group, if there is no, create one.
 
GroupGetGroupPlayer (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)
 
BfGraveyardGetGraveyardById (uint32 id) const
 
CreatureSpawnCreature (uint32 entry, float x, float y, float z, float o, TeamId teamId)
 
CreatureSpawnCreature (uint32 entry, Position pos, TeamId teamId)
 
GameObjectSpawnGameObject (uint32 entry, float x, float y, float z, float o)
 
CreatureGetCreature (ObjectGuid const &guid)
 
GameObjectGetGameObject (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
 
MapBfMap
 
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< uint64Data64
 
std::vector< uint32Data32
 

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

39{
40 for (WGWorkshop* workshop : WorkshopsList)
41 delete workshop;
42
44 delete building;
45}
Workshop WorkshopsList
Definition BattlefieldWG.h:441
GameObjectBuilding BuildingsInZone
Definition BattlefieldWG.h:445
Definition BattlefieldWG.h:1054
Definition BattlefieldWG.h:1402

References BuildingsInZone, and WorkshopsList.

Member Function Documentation

◆ AddUpdateTenacity()

void BattlefieldWG::AddUpdateTenacity ( Player player)
1176{
1177 UpdateTenacityList.insert(player->GetGUID());
1178}
GuidUnorderedSet UpdateTenacityList
Definition BattlefieldWG.h:451
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114

References Object::GetGUID(), and UpdateTenacityList.

Referenced by OnPlayerJoinWar().

◆ BrokenWallOrTower()

void BattlefieldWG::BrokenWallOrTower ( TeamId  team)

Called when a wall/tower is broken.

  • Update quest
1050{
1051 // might be some use for this in the future. old code commented out below. KL
1052 /* if (team == GetDefenderTeam())
1053 {
1054 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1055 {
1056 if (Player* player = ObjectAccessor::FindPlayer(guid))
1057 IncrementQuest(player, WGQuest[player->GetTeamId()][2], true);
1058 }
1059 }*/
1060}

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:439

References IsRelicInteractible.

Referenced by ProcessEvent().

◆ CapturePointTaken()

void BattlefieldWG::CapturePointTaken ( uint32  areaId)
359{
360 for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
361 for (ObjectGuid const& guid : Players[i])
362 if (Player* player = ObjectAccessor::FindPlayer(guid))
363 if (player->GetAreaId() == areaId)
364 player->UpdateAreaDependentAuras(areaId);
365}
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:118
Definition Player.h:1084
Definition ObjectAccessor.h:61
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

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

Referenced by WGWorkshop::GiveControlTo().

◆ FillInitialWorldStates()

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

Implements Battlefield.

967{
968 uint32 timer = GetTimer() / 1000;
969 bool iconActive = timer < 15 * MINUTE || IsWarTime();
970
971 packet.Worldstates.reserve(4+4+WG_MAX_OBJ+WG_MAX_WORKSHOP);
974
975 // Note: cleanup these two, their names look awkward
976 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_ACTIVE, IsWarTime() ? 0 : 1);
977 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_SHOW, IsWarTime() ? 1 : 0);
978 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_CONTROL, DefenderTeam == TEAM_ALLIANCE ? 2 : 1); // Alliance 2, Hord 1
979 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_ICON_ACTIVE, iconActive ? 1 : 0);
980
981 for (uint32 i = 0; i < 2; ++i)
982 packet.Worldstates.emplace_back(ClockWorldState[i], GameTime::GetGameTime().count() + timer);
983
988
993
995 packet.Worldstates.emplace_back(building->m_WorldState, building->m_State);
996
997 for (WGWorkshop* workshop : WorkshopsList)
998 if (workshop)
999 packet.Worldstates.emplace_back(WorkshopsData[workshop->workshopId].worldstate, workshop->state);
1000}
WGWorkshopData const WorkshopsData[WG_MAX_WORKSHOP]
Definition BattlefieldWG.h:1034
uint8 const WG_MAX_OBJ
Definition BattlefieldWG.h:460
uint8 const WG_MAX_WORKSHOP
Definition BattlefieldWG.h:1022
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:943
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)
804{
805 for (uint32 i = 0; i < 2; ++i)
806 {
807 if (Vehicles[i].find(vehicle->GetGUID()) != Vehicles[i].end())
808 {
809 //Vehicles[i].erase(vehicle->GetGUID());
810 if (i == TEAM_HORDE)
812 else
814 return true;
815 }
816 }
817 return false;
818}
@ TEAM_HORDE
Definition SharedDefines.h:749
GuidUnorderedSet Vehicles[2]
Definition BattlefieldWG.h:447
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
567{
568 switch (gId)
569 {
578 }
579
580 return 0;
581}
@ 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.

944{
945 // xinef: little hack, same area for default horde graveyard
946 // this graveyard is the one of broken temple!
947 if (data == AREA_THE_CHILLED_QUAGMIRE)
949
950 switch (data)
951 {
952 // Used to determine when the phasing spells must be casted
953 // See: SpellArea::IsFitToRequirements
958 // Graveyards and Workshops are controlled by the same team.
959 if (BfGraveyard const* graveyard = GetGraveyardById(GetSpiritGraveyardId(data)))
960 return graveyard->GetControlTeamId();
961 }
962
963 return Battlefield::GetData(data);
964}
@ AREA_THE_CHILLED_QUAGMIRE
Definition AreaDefines.h:159
uint8 GetSpiritGraveyardId(uint32 areaId) const
Definition BattlefieldWG.cpp:540
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
1165{
1166 if (stack < 5)
1167 return 0;
1168 if (stack < 10)
1169 return SPELL_GREAT_HONOR;
1170 if (stack < 15)
1171 return SPELL_GREATER_HONOR;
1172 return SPELL_GREATEST_HONOR;
1173}
@ 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:455
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
541{
542 switch (areaId)
543 {
554 case AREA_WINTERGRASP:
558 default:
559 LOG_ERROR("bg.battlefield", "BattlefieldWG::GetSpiritGraveyardId: Unexpected Area Id {}", areaId);
560 break;
561 }
562
563 return 0;
564}
@ 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.

741{
742 if (killer == victim)
743 {
744 return;
745 }
746
747 TeamId killerTeam = killer->GetTeamId();
748
749 // xinef: tower cannons also grant rank
750 if (victim->IsPlayer() || IsKeepNpc(victim->GetEntry()) || victim->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON)
751 {
752 if (Player* victimPlayer = victim->ToPlayer())
753 {
754 sScriptMgr->OnBattlefieldPlayerKill(this, killer, victimPlayer);
755
756 if (victimPlayer->HasAura(SPELL_LIEUTENANT))
757 {
758 // Quest - Wintergrasp - PvP Kill - Horde/Alliance
759 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
760 {
761 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
762 {
763 if (player->GetDistance2d(killer) < 40)
764 player->KilledMonsterCredit(killerTeam == TEAM_HORDE ? NPC_QUEST_PVP_KILL_ALLIANCE : NPC_QUEST_PVP_KILL_HORDE);
765 }
766 }
767 }
768 }
769
770 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
771 {
772 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
773 {
774 if (player->GetDistance2d(killer) < 40)
775 {
776 PromotePlayer(player);
777 }
778 }
779 }
780
781 // Xinef: Allow to Skin non-released corpse
782 if (victim->IsPlayer())
783 {
784 victim->SetUnitFlag(UNIT_FLAG_SKINNABLE);
785 }
786 }
787 else if (victim->IsVehicle() && !killer->IsFriendlyTo(victim))
788 {
789 // Quest - Wintergrasp - PvP Kill - Vehicle
790 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
791 {
792 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
793 {
794 if (player->GetDistance2d(killer) < 40)
795 {
796 player->KilledMonsterCredit(NPC_QUEST_PVP_KILL_VEHICLE);
797 }
798 }
799 }
800 }
801}
@ 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:740
TeamId
Definition SharedDefines.h:747
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:283
void PromotePlayer(Player *killer)
Definition BattlefieldWG.cpp:829
bool IsKeepNpc(uint32 entry)
Definition BattlefieldWG.h:408
GuidUnorderedSet PlayersInWar[PVP_TEAMS_COUNT]
Definition Battlefield.h:391
Player * ToPlayer()
Definition Object.h:202

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
409 {
410 switch (entry)
411 {
434 return true;
435 }
436 return false;
437 }
@ 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:457

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.

368{
369 // Must be set before SPELL_VICTORY_REWARD so the 1755 criterion can gate on it.
370 LastBattleAttackerVictory = !endByTimer;
371
372 // Remove relic
373 if (GameObject* go = GetRelic())
374 go->RemoveFromWorld();
375
377
378 // Remove turret
379 for (ObjectGuid const& guid : CanonList)
380 {
381 if (Creature* creature = GetCreature(guid))
382 {
383 if (!endByTimer)
384 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
385 HideNpc(creature);
386 }
387 }
388
389 // Change all npc in keep
390 for (ObjectGuid const& guid : KeepCreature[GetAttackerTeam()])
391 if (Creature* creature = GetCreature(guid))
392 HideNpc(creature);
393
394 for (ObjectGuid const& guid : KeepCreature[GetDefenderTeam()])
395 if (Creature* creature = GetCreature(guid))
396 ShowNpc(creature, true);
397
398 // Change all npc out of keep
399 for (ObjectGuid const& guid : OutsideCreature[GetDefenderTeam()])
400 if (Creature* creature = GetCreature(guid))
401 HideNpc(creature);
402
403 for (ObjectGuid const& guid : OutsideCreature[GetAttackerTeam()])
404 if (Creature* creature = GetCreature(guid))
405 ShowNpc(creature, true);
406
407 // Update all graveyard, control is to defender when no wartime
408 for (uint8 i = 0; i < BATTLEFIELD_WG_GY_HORDE; i++)
409 if (BfGraveyard* graveyard = GetGraveyardById(i))
411
413 go->SetRespawnTime(RESPAWN_IMMEDIATELY);
414
416 go->SetRespawnTime(RESPAWN_ONE_DAY);
417
418 // Update portal defender faction
421
422 // Saving data
424 {
425 building->Rebuild();
426 building->Save();
427 building->UpdateTurretAttack(true);
428 }
429
430 for (WGWorkshop* workshop : WorkshopsList)
431 {
432 workshop->GiveControlTo(workshop->workshopId == BATTLEFIELD_WG_WORKSHOP_SE || workshop->workshopId == BATTLEFIELD_WG_WORKSHOP_SW ? GetAttackerTeam() : GetDefenderTeam(), true);
433 workshop->Save();
434 }
435
436 for (uint8 team = 0; team < 2; ++team)
437 {
438 for (ObjectGuid const& guid : Vehicles[team])
439 if (Creature* creature = GetCreature(guid))
440 creature->DespawnOrUnsummon(1ms);
441
442 Vehicles[team].clear();
443 }
444
449 uint32 spellDamagedDef = SPELL_DAMAGED_TOWER;
450 uint32 spellFullDef = SPELL_DESTROYED_TOWER;
451 uint32 spellDamagedAtt = SPELL_DAMAGED_BUILDING;
452 uint32 spellFullAtt = SPELL_INTACT_BUILDING;
453
454 if (!endByTimer)
455 {
458 spellDamagedDef = SPELL_DAMAGED_BUILDING;
459 spellFullDef = SPELL_INTACT_BUILDING;
460 spellDamagedAtt = SPELL_DAMAGED_TOWER;
461 spellFullAtt = SPELL_DESTROYED_TOWER;
462 }
463
464 for (ObjectGuid const& guid : PlayersInWar[GetDefenderTeam()])
465 {
466 if (Player* player = ObjectAccessor::FindPlayer(guid))
467 {
468 // Victory in Wintergrasp
469 player->AreaExploredOrEventHappens(GetDefenderTeam() ? 13183 : 13181); // HORDE / ALLY win wg quest id
470
471 player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
472 player->CastSpell(player, SPELL_VICTORY_REWARD, true);
473 RemoveAurasFromPlayer(player);
474
475 for (uint8 i = 0; i < damagedTowersDef; ++i)
476 player->CastSpell(player, spellDamagedDef, true);
477 for (uint8 i = 0; i < brokenTowersDef; ++i)
478 player->CastSpell(player, spellFullDef, true);
479 }
480 }
481
482 bool const grantEssenceToAttackers = sWorld->getBoolConfig(CONFIG_WINTERGRASP_ESSENCE_BOTH_FACTIONS);
483
484 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
485 if (Player* player = ObjectAccessor::FindPlayer(guid))
486 {
487 player->CastSpell(player, SPELL_DEFEAT_REWARD, true);
488 RemoveAurasFromPlayer(player);
489
490 if (grantEssenceToAttackers)
491 player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
492
493 for (uint8 i = 0; i < damagedTowersAtt; ++i)
494 player->CastSpell(player, spellDamagedAtt, true);
495 for (uint8 i = 0; i < brokenTowersAtt; ++i)
496 player->CastSpell(player, spellFullAtt, true);
497 }
498
499 if (!endByTimer)
500 {
501 for (uint8 team = 0; team < 2; ++team)
502 {
503 for (ObjectGuid const& guid : Players[team])
504 {
505 if (Player* player = ObjectAccessor::FindPlayer(guid))
506 {
507 player->RemoveAurasDueToSpell(DefenderTeam == TEAM_ALLIANCE ? SPELL_HORDE_CONTROL_PHASE_SHIFT : SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, player->GetGUID());
509 }
510 }
511 }
512 }
513
514 // Clear players in war list at the end.
516 PlayersInWar[TEAM_HORDE].clear();
517
518 if (!endByTimer) // win alli/horde
519 {
521 sWorldState->setWorldState(worldStateId, sWorldState->getWorldState(worldStateId) + 1);
522
524 }
525 else // defend alli/horde
526 {
528 sWorldState->setWorldState(worldStateId, sWorldState->getWorldState(worldStateId) + 1);
529
531 }
532}
@ 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:514
@ BATTLEFIELD_WG_TEXT_DEFEND_KEEP
Definition BattlefieldWG.h:513
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:495
@ BATTLEFIELD_WG_WORKSHOP_SW
Definition BattlefieldWG.h:496
@ 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:334
void RemoveAurasFromPlayer(Player *player)
Definition BattlefieldWG.cpp:862
GameObject * GetRelic()
Return pointer to relic object.
Definition BattlefieldWG.h:365
GuidUnorderedSet CanonList
Definition BattlefieldWG.h:448
GameObjectSet KeepGameObject[2]
Definition BattlefieldWG.h:444
GuidUnorderedSet KeepCreature[2]
Definition BattlefieldWG.h:449
GuidUnorderedSet OutsideCreature[2]
Definition BattlefieldWG.h:450
GameObjectSet DefenderPortalList
Definition BattlefieldWG.h:443
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:138
#define sWorld
Definition World.h:317

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.

249{
250 // Spawn titan relic
251 GameObject* go = SpawnGameObject(GO_WINTERGRASP_TITAN_S_RELIC, 5440.37890625f, 2840.493408203125f, 430.2816162109375, 4.45059061050415039f); // VerifiedBuild 51943
252 if (go)
253 {
254 // Update faction of relic, only attacker can click on
256 // Set in use (not allow to click on before last door is broken)
258
259 // save guid
260 TitansRelic = go->GetGUID();
261 }
262 else
263 LOG_ERROR("bg.battlefield", "WG: Failed to spawn titan relic.");
264
265 // Update tower visibility and update faction
266 for (ObjectGuid const& guid : CanonList)
267 {
268 if (Creature* creature = GetCreature(guid))
269 {
270 ShowNpc(creature, true);
271 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
272 }
273 }
274
275 // Rebuild all wall
277 {
278 if (building)
279 {
280 building->Rebuild();
281 building->UpdateTurretAttack(false);
282 }
283 }
284
288
289 // Update graveyard (in no war time all graveyard is to deffender, in war time, depend of base)
290 for (WGWorkshop* workshop : WorkshopsList)
291 if (workshop)
292 workshop->UpdateGraveyardAndWorkshop();
293
294 // Set Sliders capture points data to his owners when battle start
295 for (BfCapturePoint* capturePoint : CapturePoints)
296 capturePoint->SetCapturePointData(capturePoint->GetCapturePointGo(),
297 capturePoint->GetCapturePointGo()->GetEntry() == GO_WINTERGRASP_FACTORY_BANNER_SE || capturePoint->GetCapturePointGo()->GetEntry() == GO_WINTERGRASP_FACTORY_BANNER_SW ? GetAttackerTeam() : GetDefenderTeam());
298
300 // Initialize vehicle counter
302 // Send start warning to all players
304
305 // Xinef: reset tenacity counter
306 TenacityStack = 0;
307
309 {
310 if (!UpdateTenacityList.empty())
312 UpdateTenacityList.clear();
313 context.Repeat(10s);
314 });
315
318}
@ BATTLEFIELD_WG_WORLD_START_MESSAGE
Definition BattlefieldWG.h:139
uint8 const WG_MAX_ATTACKTOWERS
Definition BattlefieldWG.h:764
@ GO_WINTERGRASP_FACTORY_BANNER_SW
Definition BattlefieldWG.h:539
@ GO_WINTERGRASP_TITAN_S_RELIC
Definition BattlefieldWG.h:541
@ GO_WINTERGRASP_FACTORY_BANNER_SE
Definition BattlefieldWG.h:538
@ BATTLEFIELD_WG_TEXT_START
Definition BattlefieldWG.h:504
@ BATTLEFIELD_TIMER_GROUP_WAR
Definition Battlefield.h:62
@ GO_FLAG_NOT_SELECTABLE
Definition SharedDefines.h:1611
@ CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE
Definition WorldConfig.h:67
void UpdateCounterVehicle(bool init)
Vehicle world states update.
Definition BattlefieldWG.cpp:320
void SendInitWorldStatesToAll() override
Send all worldstate data to all players in zone.
Definition BattlefieldWG.cpp:1013
void UpdateTenacity()
Definition BattlefieldWG.cpp:1186
int32 TenacityStack
Definition BattlefieldWG.h:453
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:218
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
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.

584{
585 // Accessing to db spawned creatures
586 switch (creature->GetEntry())
587 {
590 {
592 uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId());
593 // xinef: little workaround, there are 2 spirit guides in same area
594 if (creature->IsWithinDist2d(5103.0f, 3461.5f, 5.0f))
595 graveyardId = BATTLEFIELD_WG_GY_WORKSHOP_NW;
596
597 if (GraveyardList[graveyardId])
598 GraveyardList[graveyardId]->SetSpirit(creature, teamId);
599 break;
600 }
601 }
602
603 // untested code - not sure if it is valid.
604 if (IsWarTime())
605 {
606 switch (creature->GetEntry())
607 {
612 {
613 if (!creature->IsSummon() || !creature->ToTempSummon()->GetSummonerGUID())
614 return;
615
617 if (!creator)
618 return;
619 TeamId team = creator->GetTeamId();
620
621 if (team == TEAM_HORDE)
622 {
624 {
626 creature->CastSpell(creature, SPELL_HORDE_FLAG, true);
627 Vehicles[team].insert(creature->GetGUID());
629 }
630 else
631 {
632 creature->DespawnOrUnsummon();
633 return;
634 }
635 }
636 else
637 {
639 {
641 creature->CastSpell(creature, SPELL_ALLIANCE_FLAG, true);
642 Vehicles[team].insert(creature->GetGUID());
644 }
645 else
646 {
647 creature->DespawnOrUnsummon();
648 return;
649 }
650 }
651 break;
652 }
655 {
656 if (!creature->IsSummon() || !creature->ToTempSummon()->GetSummonerGUID())
657 return;
658
659 if (Unit* owner = creature->ToTempSummon()->GetSummonerUnit())
660 creature->SetFaction(owner->GetFaction());
661 break;
662 }
663 }
664 }
665}
@ 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:345
GraveyardVect GraveyardList
Definition Battlefield.h:415
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2188
uint32 GetEntry() const
Definition Object.h:117
TeamId GetTeamId(bool original=false) const
Definition Player.h:2131
ObjectGuid GetSummonerGUID() const
Definition TemporarySummon.h:66
Unit * GetSummonerUnit() const
Definition TemporarySummon.cpp:44
Definition Unit.h:664
void SetFaction(uint32 faction)
Definition Unit.cpp:7091
TempSummon * ToTempSummon()
Definition Unit.h:731
bool IsSummon() const
Definition Unit.h:794
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:1389
bool IsWithinDist2d(float x, float y, float dist) const
Definition Object.cpp:1355
uint32 GetAreaId() const
Definition Object.cpp:3119

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.

668{
669 /* possibly can be used later
670 if (IsWarTime())
671 {
672 switch (creature->GetEntry())
673 {
674 case NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE:
675 case NPC_WINTERGRASP_SIEGE_ENGINE_HORDE:
676 case NPC_WINTERGRASP_CATAPULT:
677 case NPC_WINTERGRASP_DEMOLISHER:
678 {
679 uint8 team;
680 if (creature->GetFaction() == WintergraspFaction[TEAM_ALLIANCE])
681 team = TEAM_ALLIANCE;
682 else if (creature->GetFaction() == WintergraspFaction[TEAM_HORDE])
683 team = TEAM_HORDE;
684 else
685 return;
686
687 Vehicles[team].erase(creature->GetGUID());
688 if (team == TEAM_HORDE)
689 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_H, -1);
690 else
691 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_A, -1);
692 UpdateVehicleCountWG();
693
694 break;
695 }
696 }
697 }*/
698}

◆ OnGameObjectCreate()

void BattlefieldWG::OnGameObjectCreate ( GameObject go)
overridevirtual

Called when a gameobject is created.

Reimplemented from ZoneScript.

701{
702 uint8 workshopId = 0;
703
704 switch (go->GetEntry())
705 {
707 workshopId = BATTLEFIELD_WG_WORKSHOP_NE;
708 break;
710 workshopId = BATTLEFIELD_WG_WORKSHOP_NW;
711 break;
713 workshopId = BATTLEFIELD_WG_WORKSHOP_SE;
714 break;
716 workshopId = BATTLEFIELD_WG_WORKSHOP_SW;
717 break;
718 default:
719 return;
720 }
721
722 for (WGWorkshop* workshop : WorkshopsList)
723 {
724 if (workshop)
725 {
726 if (workshop->workshopId == workshopId)
727 {
728 WintergraspCapturePoint* capturePoint = new WintergraspCapturePoint(this, workshop->teamControl);
729 //Sending neutral team at start to set normal capture points by workshop->teamControl, TEAM_NEUTRAL is ignored at first call
730 capturePoint->SetCapturePointData(go, TEAM_NEUTRAL);
731 capturePoint->LinkToWorkshop(workshop);
732 AddCapturePoint(capturePoint);
733 break;
734 }
735 }
736 }
737}
@ GO_WINTERGRASP_FACTORY_BANNER_NW
Definition BattlefieldWG.h:537
@ GO_WINTERGRASP_FACTORY_BANNER_NE
Definition BattlefieldWG.h:536
@ BATTLEFIELD_WG_WORKSHOP_NW
Definition BattlefieldWG.h:494
@ BATTLEFIELD_WG_WORKSHOP_NE
Definition BattlefieldWG.h:493
@ 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.

929{
930 if (!Active)
931 RemoveAurasFromPlayer(player);
932
934 // Send worldstate to player
935 SendInitWorldStatesTo(player);
936
937 // xinef: Attacker, if hidden in relic room kick him out (only during wartime)
938 if (IsWarTime() && player->GetTeamId() == GetAttackerTeam())
939 if (player->GetPositionX() > 5400.0f && player->GetPositionX() < 5490.0f && player->GetPositionY() > 2803.0f && player->GetPositionY() < 2878.0f)
941}
void SendInitWorldStatesTo(Player *player)
Definition BattlefieldWG.cpp:1002
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:15159
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.

875{
876 RemoveAurasFromPlayer(player);
877
878 player->CastSpell(player, SPELL_RECRUIT, true);
879 AddUpdateTenacity(player);
880
881 if (player->GetTeamId() == GetDefenderTeam())
882 player->TeleportTo(MAP_NORTHREND, 5345, 2842, 410, 3.14f);
883 else
884 {
885 if (player->GetTeamId() == TEAM_HORDE)
886 player->TeleportTo(MAP_NORTHREND, 5025.857422f, 3674.628906f, 362.737122f, 4.135169f);
887 else
888 player->TeleportTo(MAP_NORTHREND, 5101.284f, 2186.564f, 365.549f, 3.812f);
889 }
890
891 if (player->GetTeamId() == GetAttackerTeam())
892 {
895 }
896 else
897 {
900 }
901 SendInitWorldStatesTo(player);
902}
@ MAP_NORTHREND
Definition AreaDefines.h:243
@ SPELL_RECRUIT
Definition BattlefieldWG.h:49
@ SPELL_TOWER_CONTROL
Definition BattlefieldWG.h:54
void AddUpdateTenacity(Player *player)
Definition BattlefieldWG.cpp:1175
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1353
void SetAuraStack(uint32 spellId, Unit *target, uint32 stack)
Definition Unit.cpp:15198

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.

905{
906 // 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
907 if (!player->GetSession()->PlayerLogout())
908 {
909 if (player->GetVehicle()) // Remove vehicle of player if he go out.
910 player->GetVehicle()->Dismiss();
911 RemoveAurasFromPlayer(player);
912 }
913
914 RemoveUpdateTenacity(player);
915}
void RemoveUpdateTenacity(Player *player)
Definition BattlefieldWG.cpp:1180
WorldSession * GetSession() const
Definition Player.h:2023
Vehicle * GetVehicle() const
Definition Unit.h:1930
void Dismiss()
Definition Vehicle.cpp:557
bool PlayerLogout() const
Definition WorldSession.h:412

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.

918{
919 if (!Active)
920 RemoveAurasFromPlayer(player);
921
926}
@ 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:5189

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.

535{
536 if (!IsWarTime())
538}
@ BATTLEFIELD_WG_TEXT_WILL_START
Definition BattlefieldWG.h:515

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

◆ OnUnitDeath()

void BattlefieldWG::OnUnitDeath ( Unit unit)
overridevirtual

Reimplemented from ZoneScript.

821{
822 if (IsWarTime())
823 if (unit->IsVehicle())
826}
bool FindAndRemoveVehicleFromList(Unit *vehicle)
Definition BattlefieldWG.cpp:803
bool IsVehicle() const
Definition Unit.h:800

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

◆ ProcessEvent()

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

Reimplemented from ZoneScript.

1113{
1114 if (!obj || !IsWarTime())
1115 return;
1116
1117 // We handle only gameobjects here
1118 GameObject* go = obj->ToGameObject();
1119 if (!go)
1120 return;
1121
1122 // On click on titan relic
1124 {
1126 {
1127 EndBattle(false);
1128 }
1129 else if (GameObject* relic = GetRelic())
1130 {
1131 relic->SetRespawnTime(RESPAWN_IMMEDIATELY);
1132 }
1133 }
1134
1135 // if destroy or damage event, search the wall/tower and update worldstate/send warning message
1136 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1137 {
1138 if (GameObject* build = ObjectAccessor::GetGameObject(*obj, building->m_Build))
1139 {
1140 if (go->GetEntry() == build->GetEntry())
1141 {
1142 if (build->GetGOInfo()->building.damagedEvent == eventId)
1143 building->Damaged();
1144
1145 if (build->GetGOInfo()->building.destroyedEvent == eventId)
1146 building->Destroyed();
1147
1148 break;
1149 }
1150 }
1151 }
1152}
bool CanInteractWithRelic()
Define relic object.
Definition BattlefieldWG.h:371
void EndBattle(bool endByTimer)
Definition Battlefield.cpp:411
GameObject * ToGameObject()
Definition Object.h:214
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:184

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)
830{
831 if (!Active)
832 return;
833 // Updating rank of player
834 if (Aura* recruitAura = killer->GetAura(SPELL_RECRUIT))
835 {
836 if (recruitAura->GetStackAmount() >= 5)
837 {
838 killer->RemoveAura(SPELL_RECRUIT);
839 killer->CastSpell(killer, SPELL_CORPORAL, true);
841 }
842 else
843 {
844 killer->CastSpell(killer, SPELL_RECRUIT, true);
845 }
846 }
847 else if (Aura* corporalAura = killer->GetAura(SPELL_CORPORAL))
848 {
849 if (corporalAura->GetStackAmount() >= 5)
850 {
851 killer->RemoveAura(SPELL_CORPORAL);
852 killer->CastSpell(killer, SPELL_LIEUTENANT, true);
854 }
855 else
856 {
857 killer->CastSpell(killer, SPELL_CORPORAL, true);
858 }
859 }
860}
@ SPELL_CORPORAL
Definition BattlefieldWG.h:50
@ BATTLEFIELD_WG_TEXT_SECONDRANK
Definition BattlefieldWG.h:517
@ BATTLEFIELD_WG_TEXT_FIRSTRANK
Definition BattlefieldWG.h:516
Definition SpellAuras.h:87
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5877
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:5056

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().

◆ RemoveAurasFromPlayer()

◆ RemoveUpdateTenacity()

void BattlefieldWG::RemoveUpdateTenacity ( Player player)
1181{
1182 UpdateTenacityList.erase(player->GetGUID());
1184}
static ObjectGuid const Empty
Definition ObjectGuid.h:120

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

Referenced by OnPlayerLeaveWar().

◆ SendInitWorldStatesTo()

void BattlefieldWG::SendInitWorldStatesTo ( Player player)
1003{
1005 packet.MapID = MapId;
1006 packet.ZoneID = ZoneId;
1007 packet.AreaID = player->GetAreaId();
1008 FillInitialWorldStates(packet);
1009
1010 player->SendDirectMessage(packet.Write());
1011}
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
Definition BattlefieldWG.cpp:966
uint32 MapId
Definition Battlefield.h:403
uint32 ZoneId
Definition Battlefield.h:402
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5701
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.

1014{
1015 for (uint8 team = 0; team < 2; team++)
1016 for (ObjectGuid const& guid : Players[team])
1017 if (Player* player = ObjectAccessor::FindPlayer(guid))
1018 SendInitWorldStatesTo(player);
1019}

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

Referenced by OnBattleStart(), and UpdatedDestroyedTowerCount().

◆ SendUpdateWorldStateMessage()

void BattlefieldWG::SendUpdateWorldStateMessage ( uint32  variable,
uint32  value,
Player player = nullptr 
)
1038{
1040 worldState.VariableID = variable;
1041 worldState.Value = value;
1042
1043 if (player)
1044 player->SendDirectMessage(worldState.Write());
1045 else
1046 sWorldSessionMgr->SendGlobalMessage(worldState.Write());
1047}
#define sWorldSessionMgr
Definition WorldSessionMgr.h:108
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.

1022{
1023 uint32 timer = GetTimer() / 1000;
1024 bool iconActive = timer < 15 * MINUTE || IsWarTime();
1025
1032
1033 for (uint32 i = 0; i < 2; ++i)
1035}
void SendUpdateWorldStateMessage(uint32 variable, uint32 value, Player *player=nullptr)
Definition BattlefieldWG.cpp:1037

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.

48{
49 TypeId = BATTLEFIELD_WG; // See enum BattlefieldTypes
53 BfMap = sMapMgr->FindMap(MapId, 0);
54
55 // init stalker AFTER setting map id... we spawn it at map=random memory value?...
57
59 Enabled = sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1;
65
68 StartGrouping = false;
69
70 TenacityStack = 0;
72 IsRelicInteractible = false;
73
74 KickPosition.Relocate(5728.117f, 2714.346f, 697.733f, 0);
76
78
80
81 // Init Graveyards
83
84 // Load from db
87 !sWorldState->getWorldState(ClockWorldState[0]))
88 {
92 }
93
96
97 Timer = sWorldState->getWorldState(ClockWorldState[0]);
98 if (Active)
99 {
100 Active = false;
102 }
103
104 for (uint8 i = 0; i < BATTLEFIELD_WG_GRAVEYARD_MAX; i++)
105 {
106 BfGraveyardWG* graveyard = new BfGraveyardWG(this);
107
108 // When between games, the graveyard is controlled by the defending team
109 if (WGGraveyard[i].startcontrol == TEAM_NEUTRAL)
111 else
112 graveyard->Initialize(WGGraveyard[i].startcontrol, WGGraveyard[i].gyid);
113
114 graveyard->SetTextId(WGGraveyard[i].textid);
115 GraveyardList[i] = graveyard;
116 }
117
118 // Spawn workshop creatures and gameobjects
119 for (uint8 i = 0; i < WG_MAX_WORKSHOP; i++)
120 {
121 WGWorkshop* workshop = new WGWorkshop(this, i);
123 workshop->GiveControlTo(GetAttackerTeam(), true);
124 else
125 workshop->GiveControlTo(GetDefenderTeam(), true);
126
127 // Note: Capture point is added once the gameobject is created.
128 WorkshopsList.insert(workshop);
129 }
130
131 // Spawn NPCs in the defender's keep, both Horde and Alliance
132 for (uint8 i = 0; i < WG_MAX_KEEP_NPC; i++)
133 {
134 // Horde npc
135 if (Creature* creature = SpawnCreature(WGKeepNPC[i].entryHorde, WGKeepNPC[i].x, WGKeepNPC[i].y, WGKeepNPC[i].z, WGKeepNPC[i].o, TEAM_HORDE))
136 KeepCreature[TEAM_HORDE].insert(creature->GetGUID());
137 // Alliance npc
138 if (Creature* creature = SpawnCreature(WGKeepNPC[i].entryAlliance, WGKeepNPC[i].x, WGKeepNPC[i].y, WGKeepNPC[i].z, WGKeepNPC[i].o, TEAM_ALLIANCE))
139 KeepCreature[TEAM_ALLIANCE].insert(creature->GetGUID());
140 }
141
142 // Hide NPCs from the Attacker's team in the keep
143 for (ObjectGuid const& guid : KeepCreature[GetAttackerTeam()])
144 if (Creature* creature = GetCreature(guid))
145 HideNpc(creature);
146
147 // Spawn Horde NPCs outside the keep
148 for (uint8 i = 0; i < WG_OUTSIDE_ALLIANCE_NPC; i++)
149 if (Creature* creature = SpawnCreature(WGOutsideNPC[i].entryHorde, WGOutsideNPC[i].x, WGOutsideNPC[i].y, WGOutsideNPC[i].z, WGOutsideNPC[i].o, TEAM_HORDE))
150 OutsideCreature[TEAM_HORDE].insert(creature->GetGUID());
151
152 // Spawn Alliance NPCs outside the keep
154 if (Creature* creature = SpawnCreature(WGOutsideNPC[i].entryAlliance, WGOutsideNPC[i].x, WGOutsideNPC[i].y, WGOutsideNPC[i].z, WGOutsideNPC[i].o, TEAM_ALLIANCE))
155 OutsideCreature[TEAM_ALLIANCE].insert(creature->GetGUID());
156
157 // Hide units outside the keep that are defenders
158 for (ObjectGuid const& guid : OutsideCreature[GetDefenderTeam()])
159 if (Creature* creature = GetCreature(guid))
160 HideNpc(creature);
161
162 // Spawn turrets and hide them per default
163 for (uint8 i = 0; i < WG_MAX_TURRET; i++)
164 {
165 Position towerCannonPos = WGTurret[i].GetPosition();
166 if (Creature* creature = SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos, TEAM_ALLIANCE))
167 {
168 CanonList.insert(creature->GetGUID());
169 HideNpc(creature);
170 }
171 }
172
173 // Spawn all gameobjects
174 for (uint8 i = 0; i < WG_MAX_OBJ; i++)
175 {
179 BuildingsInZone.insert(b);
180 }
181
182 // Spawning portal defender
183 for (uint8 i = 0; i < WG_MAX_TELEPORTER; i++)
184 {
186 DefenderPortalList.insert(go);
188 }
189
191
192 // Schedule always-running periodic timers
195 {
196 ForEachPlayerInZone([this](Player* player)
197 {
199 return;
200
201 TeamId team = player->GetTeamId();
202 Unit* closestSpirit = nullptr;
203 float closestDist = -1.0f;
204 for (BfGraveyard* gy : GraveyardList)
205 {
206 if (!gy)
207 continue;
208 Unit* spirit = ObjectAccessor::GetCreature(*player, gy->GetSpiritGuide(team));
209 if (!spirit)
210 continue;
211 float dist = player->GetDistance(spirit);
212 if (closestDist < 0.0f || dist < closestDist)
213 {
214 closestDist = dist;
215 closestSpirit = spirit;
216 }
217 }
218
219 if (closestSpirit)
220 closestSpirit->CastSpell(closestSpirit, SPELL_SPIRIT_HEAL, true);
221
222 player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true);
223 player->ResurrectPlayer(1.0f);
224 player->CastSpell(player, 6962, true);
225 player->CastSpell(player, SPELL_SPIRIT_HEAL_MANA, true);
226 player->SpawnCorpseBones(false);
228 });
229 context.Repeat();
230 });
231
233 {
236 sWorldState->setWorldState(ClockWorldState[0], Timer);
237 context.Repeat();
238 });
239
240 return true;
241}
uint8 const WG_OUTSIDE_ALLIANCE_NPC
Definition BattlefieldWG.h:464
uint8 const WG_MAX_KEEP_NPC
Definition BattlefieldWG.h:462
uint8 const WG_MAX_TURRET
Definition BattlefieldWG.h:461
@ BATTLEFIELD_WG_NPC_STALKER
Definition BattlefieldWG.h:146
WintergraspObjectPositionData const WGKeepNPC[WG_MAX_KEEP_NPC]
Definition BattlefieldWG.h:646
WintergraspTeleporterData const WGPortalDefenderData[WG_MAX_TELEPORTER]
Definition BattlefieldWG.h:732
uint8 const WG_MAX_OUTSIDE_NPC
Definition BattlefieldWG.h:463
@ BATTLEFIELD_WG_GRAVEYARD_MAX
Definition BattlefieldWG.h:127
uint8 const WG_MAX_TELEPORTER
Definition BattlefieldWG.h:465
WintergraspObjectPositionData const WGOutsideNPC[WG_MAX_OUTSIDE_NPC]
Definition BattlefieldWG.h:705
BfWGCoordGY const WGGraveyard[BATTLEFIELD_WG_GRAVEYARD_MAX]
Definition BattlefieldWG.h:218
Position const WGTurret[WG_MAX_TURRET]
Definition BattlefieldWG.h:625
@ BATTLEFIELD_WG_DATA_MAX
Definition BattlefieldWG.h:100
WintergraspBuildingSpawnData const WGGameObjectBuilding[WG_MAX_OBJ]
Definition BattlefieldWG.h:577
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:328
@ CONFIG_WINTERGRASP_BATTLETIME
Definition WorldConfig.h:329
@ CONFIG_WINTERGRASP_NOBATTLETIME
Definition WorldConfig.h:330
@ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH
Definition WorldConfig.h:331
@ CONFIG_WINTERGRASP_ENABLE
Definition WorldConfig.h:284
@ CONFIG_WINTERGRASP_PLR_MAX
Definition WorldConfig.h:326
@ CONFIG_WINTERGRASP_PLR_MIN
Definition WorldConfig.h:327
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
void ForEachPlayerInZone(Func &&fn) const
Definition Battlefield.h:452
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:4611
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition Player.cpp:4393
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:6017
uint32 m_mapId
Definition Position.h:324
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1295
Definition WorldState.h:284
Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:210
void Init(GameObject *gobj, uint32 type, uint32 worldstate, uint8 damageText, uint8 destroyText)
Definition BattlefieldWG.h:1186
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:1425

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.

244{
245 return Battlefield::Update(diff);
246}
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)
1156{
1157 if (team == GetAttackerTeam())
1158 {
1161 }
1162}

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
1064{
1065 // Destroy an attack tower
1066 if (team == GetAttackerTeam())
1067 {
1068 // Update counter
1071
1072 // Remove buff stack on attackers
1073 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1074 if (Player* player = ObjectAccessor::FindPlayer(guid))
1075 player->RemoveAuraFromStack(SPELL_TOWER_CONTROL);
1076
1077 // Add buff stack to defenders
1078 for (ObjectGuid const& guid : PlayersInWar[GetDefenderTeam()])
1079 if (Player* player = ObjectAccessor::FindPlayer(guid))
1080 {
1081 // Quest - Wintergrasp - Southern Tower Kill
1082 if (go && player->GetDistance2d(go) < 200.0f)
1083 player->KilledMonsterCredit(NPC_QUEST_SOUTHERN_TOWER_KILL);
1084
1085 player->CastSpell(player, SPELL_TOWER_CONTROL, true);
1086 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_LEANING_TOWER_ACHIEVEMENT, 0, 0);
1087 }
1088
1089 // If all three south towers are destroyed (ie. all attack towers), remove ten minutes from battle time
1091 {
1092 if (int32(Timer - 600000) < 0)
1093 Timer = 0;
1094 else
1095 Timer -= 600000;
1097 }
1098 }
1099 else
1100 {
1101 // Xinef: rest of structures, quest credit
1102 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1103 if (Player* player = ObjectAccessor::FindPlayer(guid))
1104 {
1105 // Quest - Wintergrasp - Vehicle Protected
1106 if (go && player->GetDistance2d(go) < 100.0f)
1107 player->KilledMonsterCredit(NPC_QUEST_VEHICLE_PROTECTED);
1108 }
1109 }
1110}
@ 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 ( )
1187{
1188 TeamId team = TEAM_NEUTRAL;
1189 uint32 alliancePlayers = PlayersInWar[TEAM_ALLIANCE].size();
1190 uint32 hordePlayers = PlayersInWar[TEAM_HORDE].size();
1191 int32 newStack = 0;
1192
1193 if (alliancePlayers && hordePlayers)
1194 {
1195 if (alliancePlayers < hordePlayers)
1196 newStack = int32((((float)hordePlayers / alliancePlayers) - 1.0f) * 4.0f); // positive, should cast on alliance
1197 else if (alliancePlayers > hordePlayers)
1198 newStack = int32((1.0f - ((float)alliancePlayers / hordePlayers)) * 4.0f); // negative, should cast on horde
1199 }
1200
1201 // Return if no change in stack and apply tenacity to new player
1202 if (newStack == TenacityStack)
1203 {
1204 for (ObjectGuid const& guid : UpdateTenacityList)
1205 if (Player* newPlayer = ObjectAccessor::FindPlayer(guid))
1206 if ((newPlayer->GetTeamId() == TEAM_ALLIANCE && TenacityStack > 0) || (newPlayer->GetTeamId() == TEAM_HORDE && TenacityStack < 0))
1207 {
1208 newStack = std::min(std::abs(newStack), 20);
1209 uint32 buff_honor = GetHonorBuff(newStack);
1210 newPlayer->SetAuraStack(SPELL_TENACITY, newPlayer, newStack);
1211 if (buff_honor)
1212 newPlayer->CastSpell(newPlayer, buff_honor, true);
1213 }
1214 return;
1215 }
1216
1217 if (TenacityStack != 0)
1218 {
1219 if (TenacityStack > 0 && newStack <= 0) // old buff was on alliance
1220 team = TEAM_ALLIANCE;
1221 else if (TenacityStack < 0 && newStack >= 0) // old buff was on horde
1222 team = TEAM_HORDE;
1223 }
1224
1225 TenacityStack = newStack;
1226 // Remove old buff
1227 if (team != TEAM_NEUTRAL)
1228 {
1229 for (ObjectGuid const& guid : PlayersInWar[team])
1230 if (Player* player = ObjectAccessor::FindPlayer(guid))
1231 player->RemoveAurasDueToSpell(SPELL_TENACITY);
1232
1233 for (ObjectGuid const& guid : Vehicles[team])
1234 if (Creature* creature = GetCreature(guid))
1235 creature->RemoveAurasDueToSpell(SPELL_TENACITY_VEHICLE);
1236 }
1237
1238 // Apply new buff
1239 if (newStack)
1240 {
1241 team = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE;
1242 newStack = std::min(std::abs(newStack), 20);
1243 uint32 buff_honor = GetHonorBuff(newStack);
1244
1245 for (ObjectGuid const& guid : PlayersInWar[team])
1246 if (Player* player = ObjectAccessor::FindPlayer(guid))
1247 {
1248 player->SetAuraStack(SPELL_TENACITY, player, newStack);
1249 if (buff_honor)
1250 player->CastSpell(player, buff_honor, true);
1251 }
1252
1253 for (ObjectGuid const& guid : Vehicles[team])
1254 if (Creature* creature = GetCreature(guid))
1255 {
1256 creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, newStack);
1257 if (buff_honor)
1258 creature->CastSpell(creature, buff_honor, true);
1259 }
1260 }
1261}
@ SPELL_TENACITY_VEHICLE
Definition BattlefieldWG.h:53
TeamId GetTeamId(PvPTeamId teamId)
Definition SharedDefines.h:3718
uint32 GetHonorBuff(int32 stack) const
Definition BattlefieldWG.cpp:1164

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
457{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: