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
 
void RelocateDeadPlayers (uint8 graveyardId, TeamId newOwner)
 
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

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)
1203{
1204 UpdateTenacityList.insert(player->GetGUID());
1205}
GuidUnorderedSet UpdateTenacityList
Definition BattlefieldWG.h:454
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
1077{
1078 // might be some use for this in the future. old code commented out below. KL
1079 /* if (team == GetDefenderTeam())
1080 {
1081 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1082 {
1083 if (Player* player = ObjectAccessor::FindPlayer(guid))
1084 IncrementQuest(player, WGQuest[player->GetTeamId()][2], true);
1085 }
1086 }*/
1087}

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.

994{
995 uint32 timer = GetTimer() / 1000;
996 bool iconActive = timer < 15 * MINUTE || IsWarTime();
997
998 packet.Worldstates.reserve(4+4+WG_MAX_OBJ+WG_MAX_WORKSHOP);
1001
1002 // Note: cleanup these two, their names look awkward
1003 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_ACTIVE, IsWarTime() ? 0 : 1);
1004 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_SHOW, IsWarTime() ? 1 : 0);
1005 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_CONTROL, DefenderTeam == TEAM_ALLIANCE ? 2 : 1); // Alliance 2, Hord 1
1006 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEFIELD_WG_ICON_ACTIVE, iconActive ? 1 : 0);
1007
1008 for (uint32 i = 0; i < 2; ++i)
1009 packet.Worldstates.emplace_back(ClockWorldState[i], GameTime::GetGameTime().count() + timer);
1010
1015
1020
1021 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1022 packet.Worldstates.emplace_back(building->m_WorldState, building->m_State);
1023
1024 for (WGWorkshop* workshop : WorkshopsList)
1025 if (workshop)
1026 packet.Worldstates.emplace_back(WorkshopsData[workshop->workshopId].worldstate, workshop->state);
1027}
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:970
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)
831{
832 for (uint32 i = 0; i < 2; ++i)
833 {
834 if (Vehicles[i].find(vehicle->GetGUID()) != Vehicles[i].end())
835 {
836 //Vehicles[i].erase(vehicle->GetGUID());
837 if (i == TEAM_HORDE)
839 else
841 return true;
842 }
843 }
844 return false;
845}
@ 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.

971{
972 // xinef: little hack, same area for default horde graveyard
973 // this graveyard is the one of broken temple!
974 if (data == AREA_THE_CHILLED_QUAGMIRE)
976
977 switch (data)
978 {
979 // Used to determine when the phasing spells must be casted
980 // See: SpellArea::IsFitToRequirements
985 // Graveyards and Workshops are controlled by the same team.
986 if (BfGraveyard const* graveyard = GetGraveyardById(GetSpiritGraveyardId(data)))
987 return graveyard->GetControlTeamId();
988 }
989
990 return Battlefield::GetData(data);
991}
@ 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
1192{
1193 if (stack < 5)
1194 return 0;
1195 if (stack < 10)
1196 return SPELL_GREAT_HONOR;
1197 if (stack < 15)
1198 return SPELL_GREATER_HONOR;
1199 return SPELL_GREATEST_HONOR;
1200}
@ 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.

768{
769 if (killer == victim)
770 {
771 return;
772 }
773
774 TeamId killerTeam = killer->GetTeamId();
775
776 // xinef: tower cannons also grant rank
777 if (victim->IsPlayer() || IsKeepNpc(victim->GetEntry()) || victim->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON)
778 {
779 if (Player* victimPlayer = victim->ToPlayer())
780 {
781 sScriptMgr->OnBattlefieldPlayerKill(this, killer, victimPlayer);
782
783 if (victimPlayer->HasAura(SPELL_LIEUTENANT))
784 {
785 // Quest - Wintergrasp - PvP Kill - Horde/Alliance
786 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
787 {
788 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
789 {
790 if (player->GetDistance2d(killer) < 40)
791 player->KilledMonsterCredit(killerTeam == TEAM_HORDE ? NPC_QUEST_PVP_KILL_ALLIANCE : NPC_QUEST_PVP_KILL_HORDE);
792 }
793 }
794 }
795 }
796
797 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
798 {
799 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
800 {
801 if (player->GetDistance2d(killer) < 40)
802 {
803 PromotePlayer(player);
804 }
805 }
806 }
807
808 // Xinef: Allow to Skin non-released corpse
809 if (victim->IsPlayer())
810 {
811 victim->SetUnitFlag(UNIT_FLAG_SKINNABLE);
812 }
813 }
814 else if (victim->IsVehicle() && !killer->IsFriendlyTo(victim))
815 {
816 // Quest - Wintergrasp - PvP Kill - Vehicle
817 for (ObjectGuid const& playerGuid : PlayersInWar[killerTeam])
818 {
819 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
820 {
821 if (player->GetDistance2d(killer) < 40)
822 {
823 player->KilledMonsterCredit(NPC_QUEST_PVP_KILL_VEHICLE);
824 }
825 }
826 }
827 }
828}
@ 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:743
TeamId
Definition SharedDefines.h:747
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:283
void PromotePlayer(Player *killer)
Definition BattlefieldWG.cpp:856
bool IsKeepNpc(uint32 entry)
Definition BattlefieldWG.h:411
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
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:342
void RemoveAurasFromPlayer(Player *player)
Definition BattlefieldWG.cpp:889
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:68
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:1040
void UpdateTenacity()
Definition BattlefieldWG.cpp:1213
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:218
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:643
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.

611{
612 // Accessing to db spawned creatures
613 switch (creature->GetEntry())
614 {
617 {
619 uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId());
620 // xinef: little workaround, there are 2 spirit guides in same area
621 if (creature->IsWithinDist2d(5103.0f, 3461.5f, 5.0f))
622 graveyardId = BATTLEFIELD_WG_GY_WORKSHOP_NW;
623
624 if (GraveyardList[graveyardId])
625 GraveyardList[graveyardId]->SetSpirit(creature, teamId);
626 break;
627 }
628 }
629
630 // untested code - not sure if it is valid.
631 if (IsWarTime())
632 {
633 switch (creature->GetEntry())
634 {
639 {
640 if (!creature->IsSummon() || !creature->ToTempSummon()->GetSummonerGUID())
641 return;
642
644 if (!creator)
645 return;
646 TeamId team = creator->GetTeamId();
647
648 if (team == TEAM_HORDE)
649 {
651 {
653 creature->CastSpell(creature, SPELL_HORDE_FLAG, true);
654 Vehicles[team].insert(creature->GetGUID());
656 }
657 else
658 {
659 creature->DespawnOrUnsummon();
660 return;
661 }
662 }
663 else
664 {
666 {
668 creature->CastSpell(creature, SPELL_ALLIANCE_FLAG, true);
669 Vehicles[team].insert(creature->GetGUID());
671 }
672 else
673 {
674 creature->DespawnOrUnsummon();
675 return;
676 }
677 }
678 break;
679 }
682 {
683 if (!creature->IsSummon() || !creature->ToTempSummon()->GetSummonerGUID())
684 return;
685
686 if (Unit* owner = creature->ToTempSummon()->GetSummonerUnit())
687 creature->SetFaction(owner->GetFaction());
688 break;
689 }
690 }
691 }
692}
@ 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:2199
uint32 GetEntry() const
Definition Object.h:117
TeamId GetTeamId(bool original=false) const
Definition Player.h:2138
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:7117
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:1361
bool IsWithinDist2d(float x, float y, float dist) const
Definition Object.cpp:1359
uint32 GetAreaId() const
Definition Object.cpp:3174

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.

695{
696 /* possibly can be used later
697 if (IsWarTime())
698 {
699 switch (creature->GetEntry())
700 {
701 case NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE:
702 case NPC_WINTERGRASP_SIEGE_ENGINE_HORDE:
703 case NPC_WINTERGRASP_CATAPULT:
704 case NPC_WINTERGRASP_DEMOLISHER:
705 {
706 uint8 team;
707 if (creature->GetFaction() == WintergraspFaction[TEAM_ALLIANCE])
708 team = TEAM_ALLIANCE;
709 else if (creature->GetFaction() == WintergraspFaction[TEAM_HORDE])
710 team = TEAM_HORDE;
711 else
712 return;
713
714 Vehicles[team].erase(creature->GetGUID());
715 if (team == TEAM_HORDE)
716 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_H, -1);
717 else
718 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_A, -1);
719 UpdateVehicleCountWG();
720
721 break;
722 }
723 }
724 }*/
725}

◆ OnGameObjectCreate()

void BattlefieldWG::OnGameObjectCreate ( GameObject go)
overridevirtual

Called when a gameobject is created.

Reimplemented from ZoneScript.

728{
729 uint8 workshopId = 0;
730
731 switch (go->GetEntry())
732 {
734 workshopId = BATTLEFIELD_WG_WORKSHOP_NE;
735 break;
737 workshopId = BATTLEFIELD_WG_WORKSHOP_NW;
738 break;
740 workshopId = BATTLEFIELD_WG_WORKSHOP_SE;
741 break;
743 workshopId = BATTLEFIELD_WG_WORKSHOP_SW;
744 break;
745 default:
746 return;
747 }
748
749 for (WGWorkshop* workshop : WorkshopsList)
750 {
751 if (workshop)
752 {
753 if (workshop->workshopId == workshopId)
754 {
755 WintergraspCapturePoint* capturePoint = new WintergraspCapturePoint(this, workshop->teamControl);
756 //Sending neutral team at start to set normal capture points by workshop->teamControl, TEAM_NEUTRAL is ignored at first call
757 capturePoint->SetCapturePointData(go, TEAM_NEUTRAL);
758 capturePoint->LinkToWorkshop(workshop);
759 AddCapturePoint(capturePoint);
760 break;
761 }
762 }
763 }
764}
@ 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.

956{
957 if (!Active)
958 RemoveAurasFromPlayer(player);
959
961 // Send worldstate to player
962 SendInitWorldStatesTo(player);
963
964 // xinef: Attacker, if hidden in relic room kick him out (only during wartime)
965 if (IsWarTime() && player->GetTeamId() == GetAttackerTeam())
966 if (player->GetPositionX() > 5400.0f && player->GetPositionX() < 5490.0f && player->GetPositionY() > 2803.0f && player->GetPositionY() < 2878.0f)
968}
void SendInitWorldStatesTo(Player *player)
Definition BattlefieldWG.cpp:1029
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:15137
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.

902{
903 RemoveAurasFromPlayer(player);
904
905 player->CastSpell(player, SPELL_RECRUIT, true);
906 AddUpdateTenacity(player);
907
908 if (player->GetTeamId() == GetDefenderTeam())
909 player->TeleportTo(MAP_NORTHREND, 5345, 2842, 410, 3.14f);
910 else
911 {
912 if (player->GetTeamId() == TEAM_HORDE)
913 player->TeleportTo(MAP_NORTHREND, 5025.857422f, 3674.628906f, 362.737122f, 4.135169f);
914 else
915 player->TeleportTo(MAP_NORTHREND, 5101.284f, 2186.564f, 365.549f, 3.812f);
916 }
917
918 if (player->GetTeamId() == GetAttackerTeam())
919 {
922 }
923 else
924 {
927 }
928 SendInitWorldStatesTo(player);
929}
@ MAP_NORTHREND
Definition AreaDefines.h:244
@ SPELL_RECRUIT
Definition BattlefieldWG.h:49
@ SPELL_TOWER_CONTROL
Definition BattlefieldWG.h:54
void AddUpdateTenacity(Player *player)
Definition BattlefieldWG.cpp:1202
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1399
void SetAuraStack(uint32 spellId, Unit *target, uint32 stack)
Definition Unit.cpp:15176

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.

932{
933 // 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
934 if (!player->GetSession()->PlayerLogout())
935 {
936 if (player->GetVehicle()) // Remove vehicle of player if he go out.
937 player->GetVehicle()->Dismiss();
938 RemoveAurasFromPlayer(player);
939 }
940
941 RemoveUpdateTenacity(player);
942}
void RemoveUpdateTenacity(Player *player)
Definition BattlefieldWG.cpp:1207
WorldSession * GetSession() const
Definition Player.h:2030
Vehicle * GetVehicle() const
Definition Unit.h:1926
void Dismiss()
Definition Vehicle.cpp:557
bool PlayerLogout() const
Definition WorldSession.h:428

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.

945{
946 if (!Active)
947 RemoveAurasFromPlayer(player);
948
953}
@ 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.

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.

848{
849 if (IsWarTime())
850 if (unit->IsVehicle())
853}
bool FindAndRemoveVehicleFromList(Unit *vehicle)
Definition BattlefieldWG.cpp:830
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.

1140{
1141 if (!obj || !IsWarTime())
1142 return;
1143
1144 // We handle only gameobjects here
1145 GameObject* go = obj->ToGameObject();
1146 if (!go)
1147 return;
1148
1149 // On click on titan relic
1151 {
1153 {
1154 EndBattle(false);
1155 }
1156 else if (GameObject* relic = GetRelic())
1157 {
1158 relic->SetRespawnTime(RESPAWN_IMMEDIATELY);
1159 }
1160 }
1161
1162 // if destroy or damage event, search the wall/tower and update worldstate/send warning message
1163 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1164 {
1165 if (GameObject* build = ObjectAccessor::GetGameObject(*obj, building->m_Build))
1166 {
1167 if (go->GetEntry() == build->GetEntry())
1168 {
1169 if (build->GetGOInfo()->building.damagedEvent == eventId)
1170 building->Damaged();
1171
1172 if (build->GetGOInfo()->building.destroyedEvent == eventId)
1173 building->Destroyed();
1174
1175 break;
1176 }
1177 }
1178 }
1179}
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: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)
857{
858 if (!Active)
859 return;
860 // Updating rank of player
861 if (Aura* recruitAura = killer->GetAura(SPELL_RECRUIT))
862 {
863 if (recruitAura->GetStackAmount() >= 5)
864 {
865 killer->RemoveAura(SPELL_RECRUIT);
866 killer->CastSpell(killer, SPELL_CORPORAL, true);
868 }
869 else
870 {
871 killer->CastSpell(killer, SPELL_RECRUIT, true);
872 }
873 }
874 else if (Aura* corporalAura = killer->GetAura(SPELL_CORPORAL))
875 {
876 if (corporalAura->GetStackAmount() >= 5)
877 {
878 killer->RemoveAura(SPELL_CORPORAL);
879 killer->CastSpell(killer, SPELL_LIEUTENANT, true);
881 }
882 else
883 {
884 killer->CastSpell(killer, SPELL_CORPORAL, true);
885 }
886 }
887}
@ 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: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:5050

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  newOwner 
)
585{
586 BfGraveyard const* graveyard = GetGraveyardById(graveyardId);
587 if (!graveyard)
588 return;
589
590 GraveyardStruct const* capturedLoc = sGraveyard->GetGraveyard(graveyard->GetGraveyardId());
591 if (!capturedLoc)
592 return;
593
594 ForEachPlayerInZone([this, capturedLoc, newOwner](Player* player)
595 {
596 // Only players of the losing team waiting to resurrect; they would otherwise be
597 // revived in place on the now-inaccessible captured platform.
598 if (player->GetTeamId() == newOwner || !player->HasAura(SPELL_WAITING_FOR_RESURRECT))
599 return;
600
601 // Restrict to ghosts actually waiting at the captured graveyard, not elsewhere in the zone.
602 if (player->GetDistance2d(capturedLoc->x, capturedLoc->y) > 50.0f)
603 return;
604
605 if (GraveyardStruct const* safeLoc = GetClosestGraveyard(player))
606 player->TeleportTo(safeLoc->Map, safeLoc->x, safeLoc->y, safeLoc->z, player->GetOrientation());
607 });
608}
@ SPELL_WAITING_FOR_RESURRECT
Definition Battleground.h:128
#define sGraveyard
Definition GameGraveyard.h:74
void ForEachPlayerInZone(Func &&fn) const
Definition Battlefield.h:452
GraveyardStruct const * GetClosestGraveyard(Player *player)
Definition Battlefield.cpp:686
uint32 GetGraveyardId() const
Definition Battlefield.h:186
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:6017
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1317
Definition GameGraveyard.h:27
float x
Definition GameGraveyard.h:30
float y
Definition GameGraveyard.h:31
float GetOrientation() const
Definition Position.h:124

References Battlefield::ForEachPlayerInZone(), Battlefield::GetClosestGraveyard(), WorldObject::GetDistance2d(), Battlefield::GetGraveyardById(), BfGraveyard::GetGraveyardId(), Position::GetOrientation(), Player::GetTeamId(), Unit::HasAura(), sGraveyard, SPELL_WAITING_FOR_RESURRECT, Player::TeleportTo(), GraveyardStruct::x, and GraveyardStruct::y.

Referenced by WGWorkshop::GiveControlTo().

◆ RemoveAurasFromPlayer()

◆ RemoveUpdateTenacity()

void BattlefieldWG::RemoveUpdateTenacity ( Player player)
1208{
1209 UpdateTenacityList.erase(player->GetGUID());
1211}
static ObjectGuid const Empty
Definition ObjectGuid.h:123

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

Referenced by OnPlayerLeaveWar().

◆ SendInitWorldStatesTo()

void BattlefieldWG::SendInitWorldStatesTo ( Player player)
1030{
1032 packet.MapID = MapId;
1033 packet.ZoneID = ZoneId;
1034 packet.AreaID = player->GetAreaId();
1035 FillInitialWorldStates(packet);
1036
1037 player->SendDirectMessage(packet.Write());
1038}
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
Definition BattlefieldWG.cpp:993
uint32 MapId
Definition Battlefield.h:403
uint32 ZoneId
Definition Battlefield.h:402
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5852
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.

1041{
1042 for (uint8 team = 0; team < 2; team++)
1043 for (ObjectGuid const& guid : Players[team])
1044 if (Player* player = ObjectAccessor::FindPlayer(guid))
1045 SendInitWorldStatesTo(player);
1046}

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

Referenced by OnBattleStart(), and UpdatedDestroyedTowerCount().

◆ SendUpdateWorldStateMessage()

void BattlefieldWG::SendUpdateWorldStateMessage ( uint32  variable,
uint32  value,
Player player = nullptr 
)
1065{
1067 worldState.VariableID = variable;
1068 worldState.Value = value;
1069
1070 if (player)
1071 player->SendDirectMessage(worldState.Write());
1072 else
1073 sWorldSessionMgr->SendGlobalMessage(worldState.Write());
1074}
#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.

1049{
1050 uint32 timer = GetTimer() / 1000;
1051 bool iconActive = timer < 15 * MINUTE || IsWarTime();
1052
1059
1060 for (uint32 i = 0; i < 2; ++i)
1062}
void SendUpdateWorldStateMessage(uint32 variable, uint32 value, Player *player=nullptr)
Definition BattlefieldWG.cpp:1064

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
#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:336
@ CONFIG_WINTERGRASP_BATTLETIME
Definition WorldConfig.h:337
@ CONFIG_WINTERGRASP_NOBATTLETIME
Definition WorldConfig.h:338
@ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH
Definition WorldConfig.h:339
@ CONFIG_WINTERGRASP_ENABLE
Definition WorldConfig.h:292
@ CONFIG_WINTERGRASP_PLR_MAX
Definition WorldConfig.h:334
@ CONFIG_WINTERGRASP_PLR_MIN
Definition WorldConfig.h:335
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:4762
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition Player.cpp:4544
uint32 m_mapId
Definition Position.h:324
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1299
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)
1183{
1184 if (team == GetAttackerTeam())
1185 {
1188 }
1189}

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
1091{
1092 // Destroy an attack tower
1093 if (team == GetAttackerTeam())
1094 {
1095 // Update counter
1098
1099 // Remove buff stack on attackers
1100 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1101 if (Player* player = ObjectAccessor::FindPlayer(guid))
1102 player->RemoveAuraFromStack(SPELL_TOWER_CONTROL);
1103
1104 // Add buff stack to defenders
1105 for (ObjectGuid const& guid : PlayersInWar[GetDefenderTeam()])
1106 if (Player* player = ObjectAccessor::FindPlayer(guid))
1107 {
1108 // Quest - Wintergrasp - Southern Tower Kill
1109 if (go && player->GetDistance2d(go) < 200.0f)
1110 player->KilledMonsterCredit(NPC_QUEST_SOUTHERN_TOWER_KILL);
1111
1112 player->CastSpell(player, SPELL_TOWER_CONTROL, true);
1113 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_LEANING_TOWER_ACHIEVEMENT, 0, 0);
1114 }
1115
1116 // If all three south towers are destroyed (ie. all attack towers), remove ten minutes from battle time
1118 {
1119 if (int32(Timer - 600000) < 0)
1120 Timer = 0;
1121 else
1122 Timer -= 600000;
1124 }
1125 }
1126 else
1127 {
1128 // Xinef: rest of structures, quest credit
1129 for (ObjectGuid const& guid : PlayersInWar[GetAttackerTeam()])
1130 if (Player* player = ObjectAccessor::FindPlayer(guid))
1131 {
1132 // Quest - Wintergrasp - Vehicle Protected
1133 if (go && player->GetDistance2d(go) < 100.0f)
1134 player->KilledMonsterCredit(NPC_QUEST_VEHICLE_PROTECTED);
1135 }
1136 }
1137}
@ 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 ( )
1214{
1215 TeamId team = TEAM_NEUTRAL;
1216 uint32 alliancePlayers = PlayersInWar[TEAM_ALLIANCE].size();
1217 uint32 hordePlayers = PlayersInWar[TEAM_HORDE].size();
1218 int32 newStack = 0;
1219
1220 if (alliancePlayers && hordePlayers)
1221 {
1222 if (alliancePlayers < hordePlayers)
1223 newStack = int32((((float)hordePlayers / alliancePlayers) - 1.0f) * 4.0f); // positive, should cast on alliance
1224 else if (alliancePlayers > hordePlayers)
1225 newStack = int32((1.0f - ((float)alliancePlayers / hordePlayers)) * 4.0f); // negative, should cast on horde
1226 }
1227
1228 // Return if no change in stack and apply tenacity to new player
1229 if (newStack == TenacityStack)
1230 {
1231 for (ObjectGuid const& guid : UpdateTenacityList)
1232 if (Player* newPlayer = ObjectAccessor::FindPlayer(guid))
1233 if ((newPlayer->GetTeamId() == TEAM_ALLIANCE && TenacityStack > 0) || (newPlayer->GetTeamId() == TEAM_HORDE && TenacityStack < 0))
1234 {
1235 newStack = std::min(std::abs(newStack), 20);
1236 uint32 buff_honor = GetHonorBuff(newStack);
1237 newPlayer->SetAuraStack(SPELL_TENACITY, newPlayer, newStack);
1238 if (buff_honor)
1239 newPlayer->CastSpell(newPlayer, buff_honor, true);
1240 }
1241 return;
1242 }
1243
1244 if (TenacityStack != 0)
1245 {
1246 if (TenacityStack > 0 && newStack <= 0) // old buff was on alliance
1247 team = TEAM_ALLIANCE;
1248 else if (TenacityStack < 0 && newStack >= 0) // old buff was on horde
1249 team = TEAM_HORDE;
1250 }
1251
1252 TenacityStack = newStack;
1253 // Remove old buff
1254 if (team != TEAM_NEUTRAL)
1255 {
1256 for (ObjectGuid const& guid : PlayersInWar[team])
1257 if (Player* player = ObjectAccessor::FindPlayer(guid))
1258 player->RemoveAurasDueToSpell(SPELL_TENACITY);
1259
1260 for (ObjectGuid const& guid : Vehicles[team])
1261 if (Creature* creature = GetCreature(guid))
1262 creature->RemoveAurasDueToSpell(SPELL_TENACITY_VEHICLE);
1263 }
1264
1265 // Apply new buff
1266 if (newStack)
1267 {
1268 team = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE;
1269 newStack = std::min(std::abs(newStack), 20);
1270 uint32 buff_honor = GetHonorBuff(newStack);
1271
1272 for (ObjectGuid const& guid : PlayersInWar[team])
1273 if (Player* player = ObjectAccessor::FindPlayer(guid))
1274 {
1275 player->SetAuraStack(SPELL_TENACITY, player, newStack);
1276 if (buff_honor)
1277 player->CastSpell(player, buff_honor, true);
1278 }
1279
1280 for (ObjectGuid const& guid : Vehicles[team])
1281 if (Creature* creature = GetCreature(guid))
1282 {
1283 creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, newStack);
1284 if (buff_honor)
1285 creature->CastSpell(creature, buff_honor, true);
1286 }
1287 }
1288}
@ SPELL_TENACITY_VEHICLE
Definition BattlefieldWG.h:53
TeamId GetTeamId(PvPTeamId teamId)
Definition SharedDefines.h:3718
uint32 GetHonorBuff(int32 stack) const
Definition BattlefieldWG.cpp:1191

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: