TrinityCore
OutdoorPvPZM.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "OutdoorPvPZM.h"
19#include "Creature.h"
20#include "GameObject.h"
21#include "GossipDef.h"
22#include "ObjectAccessor.h"
23#include "ObjectMgr.h"
24#include "Player.h"
25#include "ScriptedCreature.h"
26#include "ScriptedGossip.h"
27#include "ScriptMgr.h"
28#include "WorldSession.h"
29#include "WorldStatePackets.h"
30
32
33// the buff is cast in these zones
34uint32 const OutdoorPvPZMBuffZones[OutdoorPvPZMBuffZonesNum] = { 3521, 3607, 3717, 3715, 3716 };
35
36// linked when the central tower is controlled
38
39ZMControlZoneHandler::ZMControlZoneHandler(OutdoorPvPZM* pvp, uint32 textBeaconTakenHorde, uint32 textBeaconTakenAlliance, uint32 worldstateNeutralUi, uint32 worldstateNeutralMap, uint32 worldstateHordeUi, uint32 worldstateHordeMap, uint32 worldstateAllianceUi, uint32 worldstateAllianceMap)
40 : OutdoorPvPControlZoneHandler(pvp), _textBeaconTakenHorde(textBeaconTakenHorde), _textBeaconTakenAlliance(textBeaconTakenAlliance), _worldstateNeutralUi(worldstateNeutralUi), _worldstateNeutralMap(worldstateNeutralMap),
41 _worldstateHordeUi(worldstateHordeUi), _worldstateHordeMap(worldstateHordeMap), _worldstateAllianceUi(worldstateAllianceUi), _worldstateAllianceMap(worldstateAllianceMap)
42{
43}
44
46{
48 GetOutdoorPvpZM()->SetHordeTowersControlled(GetOutdoorPvpZM()->GetHordeTowersControlled() + 1);
50
57}
58
60{
62 GetOutdoorPvpZM()->SetAllianceTowersControlled(GetOutdoorPvpZM()->GetAllianceTowersControlled() + 1);
64
71}
72
74{
75 GetOutdoorPvpZM()->SetHordeTowersControlled(GetOutdoorPvpZM()->GetHordeTowersControlled() - 1);
76
78}
79
81{
82 GetOutdoorPvpZM()->SetAllianceTowersControlled(GetOutdoorPvpZM()->GetAllianceTowersControlled() - 1);
83
85}
86
88{
90
97}
98
100{
102}
103
105{
106 OutdoorPvP::Update(diff);
111 else
113}
114
116{
117 if (player->GetTeam() == ALLIANCE)
118 {
120 player->CastSpell(player, ZM_CAPTURE_BUFF, true);
121 }
122 else
123 {
125 player->CastSpell(player, ZM_CAPTURE_BUFF, true);
126 }
128}
129
131{
132 // remove buffs
134 // remove flag
138}
139
141{
143 m_Graveyard = nullptr;
146
147 ControlZoneHandlers[ZM_GO_ENTRY_BEACON_EAST] = std::make_unique<ZMControlZoneHandler>(
148 this,
157 );
158
159 ControlZoneHandlers[ZM_GO_ENTRY_BEACON_WEST] = std::make_unique<ZMControlZoneHandler>(
160 this,
169 );
170}
171
173{
176
177 // add the zones affected by the pvp buff
178 for (uint8 i = 0; i < OutdoorPvPZMBuffZonesNum; ++i)
180
182
183 return true;
184}
185
187{
188 if (killed->GetTypeId() != TYPEID_PLAYER)
189 return;
190
191 if (player->GetTeam() == ALLIANCE && killed->ToPlayer()->GetTeam() != ALLIANCE)
192 player->CastSpell(player, ZM_AlliancePlayerKillReward, true);
193 else if (player->GetTeam() == HORDE && killed->ToPlayer()->GetTeam() != HORDE)
194 player->CastSpell(player, ZM_HordePlayerKillReward, true);
195}
196
198{
200}
201
203{
204 switch (go->GetEntry())
205 {
206 case 182529:
207 case 182527:
208 case 182528:
210 {
215 }
217 {
222 }
224 return 0;
225 default:
226 return OPvPCapturePoint::HandleOpenGo(player, go);
227 }
228}
229
231{
235}
236
238{
242
243 bool allianceFlagReady = m_BothControllingFaction == ALLIANCE && m_GraveyardState != ZM_GRAVEYARD_A;
246
247 bool hordeFlagReady = m_BothControllingFaction == HORDE && m_GraveyardState != ZM_GRAVEYARD_H;
250}
251
253{
254 // nothing to do here
255 if (m_BothControllingFaction == controlling_faction)
256 return;
257 m_BothControllingFaction = controlling_faction;
258
259 switch (controlling_faction)
260 {
261 case ALLIANCE:
262 // if ally already controls the gy and taken back both beacons, return, nothing to do for us
264 return;
265 // ally doesn't control the gy, but controls the side beacons -> add gossip option, add neutral banner
266 break;
267 case HORDE:
268 // if horde already controls the gy and taken back both beacons, return, nothing to do for us
270 return;
271 // horde doesn't control the gy, but controls the side beacons -> add gossip option, add neutral banner
272 break;
273 default:
274 // if the graveyard is not neutral, then leave it that way
275 // if the graveyard is neutral, then we have to dispel the buff from the flag carrier
277 {
278 // gy was neutral, thus neutral banner was spawned, it is possible that someone was taking the flag to the gy
280 {
281 // remove flag from carrier, reset flag carrier guid
283 if (p)
284 {
287 }
289 }
290 }
291 break;
292 }
293 // send worldstateupdate
295}
296
298{
299 switch (spellId)
300 {
304 return true;
305 default:
306 break;
307 }
308 return false;
309}
310
312{
313 return m_GraveyardState;
314}
315
317{
319}
320
322{
324}
325
327{
329}
330
332{
334}
335
337{
339 initWorldStates.MapID = player->GetMapId();
340 initWorldStates.AreaID = player->GetZoneId();
341 initWorldStates.SubareaID = player->GetAreaId();
342
343 for (auto& itr : ControlZoneHandlers)
344 {
345 ZMControlZoneHandler* handler = static_cast<ZMControlZoneHandler*>(itr.second.get());
346 initWorldStates.Worldstates.emplace_back(handler->GetWorldStateNeutralUI(), 0);
347 initWorldStates.Worldstates.emplace_back(handler->GetWorldStateNeutralMap(), 0);
348 initWorldStates.Worldstates.emplace_back(handler->GetWorldStateHordeUI(), 0);
349 initWorldStates.Worldstates.emplace_back(handler->GetWorldStateHordeMap(), 0);
350 initWorldStates.Worldstates.emplace_back(handler->GetWorldStateAllianceUI(), 0);
351 initWorldStates.Worldstates.emplace_back(handler->GetWorldStateAllianceMap(), 0);
352 }
353 initWorldStates.Worldstates.emplace_back(ZM_MAP_GRAVEYARD_H, 0);
354 initWorldStates.Worldstates.emplace_back(ZM_MAP_GRAVEYARD_A, 0);
355 initWorldStates.Worldstates.emplace_back(ZM_MAP_GRAVEYARD_N, 0);
356 initWorldStates.Worldstates.emplace_back(ZM_MAP_HORDE_FLAG_READY, 0);
357 initWorldStates.Worldstates.emplace_back(ZM_MAP_HORDE_FLAG_NOT_READY, 0);
358 initWorldStates.Worldstates.emplace_back(ZM_MAP_ALLIANCE_FLAG_NOT_READY, 0);
359 initWorldStates.Worldstates.emplace_back(ZM_MAP_ALLIANCE_FLAG_READY, 0);
360 player->SendDirectMessage(initWorldStates.Write());
361}
362
364{
365 public:
367
368 OutdoorPvP* GetOutdoorPvP(Map* map) const override
369 {
370 return new OutdoorPvPZM(map);
371 }
372};
373
375{
378
381};
382
383// 18581 - Alliance Field Scout
384// 18564 - Horde Field Scout
386{
387 npc_zm_field_scout(Creature* creature) : ScriptedAI(creature) { }
388
390 {
391 OutdoorPvP* pvp = player->GetOutdoorPvP();
392 if (!pvp)
393 return false;
394
395 OutdoorPvPZM* zmPvp = reinterpret_cast<OutdoorPvPZM*>(pvp);
396 if (!zmPvp)
397 return false;
398
400 if (!gy)
401 return false;
402
403 if (!gy->GetFlagCarrierGUID().IsEmpty())
404 return false;
405
406 switch (me->GetEntry())
407 {
409 return player->GetTeam() == ALLIANCE && pvp->GetWorldState(ZM_MAP_ALLIANCE_FLAG_READY);
411 return player->GetTeam() == HORDE && pvp->GetWorldState(ZM_MAP_HORDE_FLAG_READY);
412 default:
413 break;
414 }
415 return true;
416 }
417
418 bool OnGossipHello(Player* player) override
419 {
423
424 InitGossipMenuFor(player, gossipMenuId);
425 if (CanObtainBanner(player))
427
429 SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
430 return true;
431 }
432
433 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
434 {
435 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
436 switch (action)
437 {
439 {
440 player->PlayerTalkClass->SendCloseGossip();
441
442 OutdoorPvP* pvp = player->GetOutdoorPvP();
443 if (!pvp)
444 return true;
445
446 OutdoorPvPZM* zmPvp = reinterpret_cast<OutdoorPvPZM*>(pvp);
447 if (!zmPvp)
448 return true;
449
451 if (!gy)
452 return true;
453
454 // if the flag is already taken, then return
455 if (!gy->GetFlagCarrierGUID().IsEmpty())
456 return true;
457
458 uint32 battleStandardSpell = ZM_BATTLE_STANDARD_H;
460 battleStandardSpell = ZM_BATTLE_STANDARD_A;
461
462 me->CastSpell(player, battleStandardSpell, true);
463 gy->SetFlagCarrierGUID(player->GetGUID());
464 gy->UpdateTowerState();
465 break;
466 }
468 player->GetSession()->SendListInventory(me->GetGUID());
469 break;
470 default:
471 break;
472 }
473 return true;
474 }
475};
476
478{
481}
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
uint8 const OutdoorPvPZMBuffZonesNum
void AddSC_outdoorpvp_zm()
uint32 const OutdoorPvPZMBuffZones[OutdoorPvPZMBuffZonesNum]
uint32 const ZM_GRAVEYARD_ZONE
ZMFieldScoutMisc
@ GOSSIP_OPTION_FIELD_SCOUT_VENDOR
@ GOSSIP_MENU_FIELD_SCOUT_HORDE
@ GOSSIP_OPTION_FIELD_SCOUT_BATTLE_STANDARD
@ GOSSIP_MENU_FIELD_SCOUT_ALLIANCE
@ ZM_GO_ENTRY_BEACON_WEST
Definition: OutdoorPvPZM.h:118
@ ZM_GO_ENTRY_BEACON_EAST
Definition: OutdoorPvPZM.h:119
@ ZM_NUM_BEACONS
Definition: OutdoorPvPZM.h:61
@ TEXT_EAST_BEACON_TAKEN_ALLIANCE
Definition: OutdoorPvPZM.h:27
@ TEXT_TWIN_SPIRE_RUINS_TAKEN_ALLIANCE
Definition: OutdoorPvPZM.h:29
@ TEXT_WEST_BEACON_TAKEN_ALLIANCE
Definition: OutdoorPvPZM.h:25
@ TEXT_EAST_BEACON_TAKEN_HORDE
Definition: OutdoorPvPZM.h:28
@ TEXT_TWIN_SPIRE_RUINS_TAKEN_HORDE
Definition: OutdoorPvPZM.h:30
@ TEXT_WEST_BEACON_TAKEN_HORDE
Definition: OutdoorPvPZM.h:26
@ ZM_HORDE_FIELD_SCOUT
Definition: OutdoorPvPZM.h:54
@ ZM_ALLIANCE_FIELD_SCOUT
Definition: OutdoorPvPZM.h:53
@ ZM_GRAVEYARD_H
Definition: OutdoorPvPZM.h:113
@ ZM_GRAVEYARD_N
Definition: OutdoorPvPZM.h:111
@ ZM_GRAVEYARD_A
Definition: OutdoorPvPZM.h:112
@ ZM_BATTLE_STANDARD_H
Definition: OutdoorPvPZM.h:44
@ ZM_BATTLE_STANDARD_A
Definition: OutdoorPvPZM.h:42
@ ZM_CAPTURE_BUFF
Definition: OutdoorPvPZM.h:40
@ ZM_AlliancePlayerKillReward
Definition: OutdoorPvPZM.h:46
@ ZM_HordePlayerKillReward
Definition: OutdoorPvPZM.h:48
@ ZM_MAP_TOWER_EAST_A
Definition: OutdoorPvPZM.h:75
@ ZM_MAP_HORDE_FLAG_NOT_READY
Definition: OutdoorPvPZM.h:84
@ ZM_UI_TOWER_WEST_N
Definition: OutdoorPvPZM.h:69
@ ZM_UI_TOWER_WEST_A
Definition: OutdoorPvPZM.h:71
@ ZM_MAP_ALLIANCE_FLAG_READY
Definition: OutdoorPvPZM.h:86
@ ZM_MAP_GRAVEYARD_A
Definition: OutdoorPvPZM.h:77
@ ZM_MAP_TOWER_WEST_N
Definition: OutdoorPvPZM.h:79
@ ZM_MAP_TOWER_WEST_A
Definition: OutdoorPvPZM.h:81
@ ZM_MAP_GRAVEYARD_N
Definition: OutdoorPvPZM.h:78
@ ZM_MAP_GRAVEYARD_H
Definition: OutdoorPvPZM.h:76
@ ZM_UI_TOWER_EAST_H
Definition: OutdoorPvPZM.h:67
@ ZM_MAP_TOWER_EAST_N
Definition: OutdoorPvPZM.h:73
@ ZM_UI_TOWER_WEST_H
Definition: OutdoorPvPZM.h:70
@ ZM_MAP_TOWER_WEST_H
Definition: OutdoorPvPZM.h:80
@ ZM_MAP_HORDE_FLAG_READY
Definition: OutdoorPvPZM.h:83
@ ZM_MAP_ALLIANCE_FLAG_NOT_READY
Definition: OutdoorPvPZM.h:85
@ ZM_UI_TOWER_EAST_A
Definition: OutdoorPvPZM.h:68
@ ZM_UI_TOWER_EAST_N
Definition: OutdoorPvPZM.h:66
@ ZM_MAP_TOWER_EAST_H
Definition: OutdoorPvPZM.h:74
@ OUTDOOR_PVP_ZM
Definition: OutdoorPvP.h:33
#define RegisterCreatureAI(ai_name)
Definition: ScriptMgr.h:1380
void AddGossipItemFor(Player *player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void InitGossipMenuFor(Player *player, uint32 menuId)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_TRADE
@ GOSSIP_ACTION_INFO_DEF
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ ALLIANCE
@ HORDE
virtual void HandleNeutralEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:53
virtual void HandleProgressEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:52
virtual void HandleNeutralEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:54
virtual void HandleProgressEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:51
virtual void HandleNeutralEvent(GameObject *controlZone)
Definition: ZoneScript.h:55
Creature *const me
Definition: CreatureAI.h:61
Definition: Map.h:189
void Update(uint32 diff) override
void SetFlagCarrierGUID(ObjectGuid guid)
Definition: OutdoorPvPZM.h:170
OPvPCapturePointZM_Graveyard(OutdoorPvP *pvp)
bool HandleDropFlag(Player *player, uint32 spellId) override
void SetBeaconState(uint32 controlling_team)
int32 HandleOpenGo(Player *player, GameObject *go) override
ObjectGuid GetFlagCarrierGUID() const
Definition: OutdoorPvPZM.h:169
ObjectiveStates m_OldState
Definition: OutdoorPvP.h:108
OutdoorPvP * m_PvP
Definition: OutdoorPvP.h:112
ObjectiveStates m_State
Definition: OutdoorPvP.h:109
virtual int32 HandleOpenGo(Player *player, GameObject *go)
Definition: OutdoorPvP.cpp:159
bool IsEmpty() const
Definition: ObjectGuid.h:319
void Clear()
Definition: ObjectGuid.h:286
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
OutdoorPvP * GetOutdoorPvP() const
Definition: OutdoorPvP.h:121
void Update(uint32 diff) override
OPvPCapturePointZM_Graveyard * GetGraveyard()
Definition: OutdoorPvPZM.h:196
void SetHordeTowersControlled(uint32 count)
uint32 GetAllianceTowersControlled() const
void HandleKillImpl(Player *player, Unit *killed) override
bool SetupOutdoorPvP() override
void HandlePlayerEnterZone(Player *player, uint32 zone) override
void HandlePlayerLeaveZone(Player *player, uint32 zone) override
OPvPCapturePointZM_Graveyard * m_Graveyard
Definition: OutdoorPvPZM.h:199
uint32 GetHordeTowersControlled() const
void SetAllianceTowersControlled(uint32 count)
void SendRemoveWorldStates(Player *player) override
uint32 m_HordeTowersControlled
Definition: OutdoorPvPZM.h:201
OutdoorPvPZM(Map *map)
uint32 m_AllianceTowersControlled
Definition: OutdoorPvPZM.h:200
OutdoorPvP * GetOutdoorPvP(Map *map) const override
virtual void HandlePlayerEnterZone(Player *player, uint32 zone)
Definition: OutdoorPvP.cpp:64
uint32 m_TypeId
Definition: OutdoorPvP.h:208
virtual void Update(uint32 diff)
Definition: OutdoorPvP.cpp:80
int32 GetWorldState(int32 worldStateId) const
Definition: OutdoorPvP.cpp:86
void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2=0)
Definition: OutdoorPvP.cpp:200
void RegisterZone(uint32 zoneid)
Definition: OutdoorPvP.cpp:173
void SetWorldState(int32 worldStateId, int32 value)
Definition: OutdoorPvP.cpp:91
virtual void HandlePlayerLeaveZone(Player *player, uint32 zone)
Definition: OutdoorPvP.cpp:69
ControlZoneHandlerMap ControlZoneHandlers
Definition: OutdoorPvP.h:204
void SendDefenseMessage(uint32 zoneId, uint32 id)
Definition: OutdoorPvP.cpp:206
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
WorldSession * GetSession() const
Definition: Player.h:2101
OutdoorPvP * GetOutdoorPvP() const
Definition: Player.cpp:25439
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition: Player.cpp:14367
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition: Player.h:2380
Team GetTeam() const
Definition: Player.h:2235
Definition: Unit.h:627
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
constexpr uint32 GetMapId() const
Definition: Position.h:201
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
uint32 GetAreaId() const
Definition: Object.h:546
uint32 GetZoneId() const
Definition: Object.h:545
std::vector< WorldStateInfo > Worldstates
WorldPacket const * Write() override
void SendListInventory(ObjectGuid guid)
void HandleProgressEventAlliance(GameObject *controlZone) override
uint32 GetWorldStateNeutralUI()
Definition: OutdoorPvPZM.h:135
OutdoorPvPZM * GetOutdoorPvpZM()
uint32 GetWorldStateHordeMap()
Definition: OutdoorPvPZM.h:138
void HandleNeutralEventAlliance(GameObject *controlZone) override
uint32 _textBeaconTakenAlliance
Definition: OutdoorPvPZM.h:146
void HandleNeutralEvent(GameObject *controlZone) override
uint32 GetWorldStateAllianceUI()
Definition: OutdoorPvPZM.h:139
uint32 GetWorldStateAllianceMap()
Definition: OutdoorPvPZM.h:140
ZMControlZoneHandler(OutdoorPvPZM *pvp, uint32 textBeaconTakenHorde, uint32 textBeaconTakenAlliance, uint32 worldstateNeutralUi, uint32 worldstateNeutralMap, uint32 worldstateHordeUi, uint32 worldstateHordeMap, uint32 worldstateAllianceUi, uint32 worldstateAllianceMap)
uint32 GetWorldStateHordeUI()
Definition: OutdoorPvPZM.h:137
void HandleNeutralEventHorde(GameObject *controlZone) override
uint32 GetWorldStateNeutralMap()
Definition: OutdoorPvPZM.h:136
void HandleProgressEventHorde(GameObject *controlZone) override
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
npc_zm_field_scout(Creature *creature)
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
bool CanObtainBanner(Player *player)
bool OnGossipHello(Player *player) override