TrinityCore
Loading...
Searching...
No Matches
OutdoorPvPHP.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 "OutdoorPvPHP.h"
19#include "GameObject.h"
20#include "Map.h"
21#include "OutdoorPvPMgr.h"
22#include "Player.h"
23#include "ScriptMgr.h"
24#include "WorldStatePackets.h"
25
27uint32 const OutdoorPvPHPBuffZones[OutdoorPvPHPBuffZonesNum] = { 3483, 3563, 3562, 3713, 3714, 3836 }; // HP, citadel, ramparts, blood furnace, shattered halls, mag's lair
28uint32 const HP_CREDITMARKER[HP_TOWER_NUM] = { 19032, 19028, 19029 };
29//uint32 const HP_CapturePointEvent_Enter[HP_TOWER_NUM] = { 11404, 11396, 11388 };
30//uint32 const HP_CapturePointEvent_Leave[HP_TOWER_NUM] = { 11403, 11395, 11387 };
31uint32 const HP_MAP_N[HP_TOWER_NUM] = { 0x9b5, 0x9b2, 0x9a8 };
32uint32 const HP_MAP_A[HP_TOWER_NUM] = { 0x9b3, 0x9b0, 0x9a7 };
33uint32 const HP_MAP_H[HP_TOWER_NUM] = { 0x9b4, 0x9b1, 0x9a6 };
34uint32 const HP_TowerArtKit_A[HP_TOWER_NUM] = { 65, 62, 67 };
35uint32 const HP_TowerArtKit_H[HP_TOWER_NUM] = { 64, 61, 68 };
36uint32 const HP_TowerArtKit_N[HP_TOWER_NUM] = { 66, 63, 69 };
37
39{
40 { 182175, 530, { -471.462f, 3451.09f, 34.6432f, 0.174533f }, { 0.0f, 0.0f, 0.087156f, 0.996195f } }, // 0 - Broken Hill
41 { 182174, 530, { -184.889f, 3476.93f, 38.2050f, -0.017453f }, { 0.0f, 0.0f, 0.008727f, -0.999962f } }, // 1 - Overlook
42 { 182173, 530, { -290.016f, 3702.42f, 56.6729f, 0.034907f }, { 0.0f, 0.0f, 0.017452f, 0.999848f } } // 2 - Stadium
43};
44
46{
47 { 183514, 530, { -467.078f, 3528.17f, 64.7121f, 3.14159f }, { 0.0f, 0.0f, 1.000000f, 0.000000f } }, // 0 broken hill
48 { 182525, 530, { -187.887f, 3459.38f, 60.0403f, -3.12414f }, { 0.0f, 0.0f, 0.999962f, -0.008727f } }, // 1 overlook
49 { 183515, 530, { -289.610f, 3696.83f, 75.9447f, 3.12414f }, { 0.0f, 0.0f, 0.999962f, 0.008727f } } // 2 stadium
50};
51
54
56{
57 SetCapturePointData(HPCapturePoints[type].entry, HPCapturePoints[type].map, HPCapturePoints[type].pos, HPCapturePoints[type].rot);
58 AddObject(type, HPTowerFlags[type].entry, HPTowerFlags[type].map, HPTowerFlags[type].pos, HPTowerFlags[type].rot);
59}
67
69{
72 // add the zones affected by the pvp buff
73 for (uint32 i = 0; i < OutdoorPvPHPBuffZonesNum; ++i)
75
77
79
81
82 return true;
83}
84
86{
87 // add buffs
88 if (player->GetTeam() == ALLIANCE)
89 {
91 player->CastSpell(player, AllianceBuff, true);
92 }
93 else
94 {
96 player->CastSpell(player, HordeBuff, true);
97 }
99}
100
102{
103 // remove buffs
104 if (player->GetTeam() == ALLIANCE)
105 {
107 }
108 else
109 {
111 }
113}
114
134
136{
141
142 for (int i = 0; i < HP_TOWER_NUM; ++i)
143 {
144 player->SendUpdateWorldState(HP_MAP_N[i], 0);
145 player->SendUpdateWorldState(HP_MAP_A[i], 0);
146 player->SendUpdateWorldState(HP_MAP_H[i], 0);
147 }
148}
149
151{
152 packet.Worldstates.emplace_back(HP_UI_TOWER_DISPLAY_A, 1);
153 packet.Worldstates.emplace_back(HP_UI_TOWER_DISPLAY_H, 1);
156
157 for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
158 itr->second->FillInitialWorldStates(packet);
159}
160
162{
163 uint32 field = 0;
164 switch (m_OldState)
165 {
167 field = HP_MAP_N[m_TowerType];
168 break;
170 field = HP_MAP_A[m_TowerType];
171 if (uint32 alliance_towers = ((OutdoorPvPHP*)m_PvP)->GetAllianceTowersControlled())
172 ((OutdoorPvPHP*)m_PvP)->SetAllianceTowersControlled(--alliance_towers);
173 break;
175 field = HP_MAP_H[m_TowerType];
176 if (uint32 horde_towers = ((OutdoorPvPHP*)m_PvP)->GetHordeTowersControlled())
177 ((OutdoorPvPHP*)m_PvP)->SetHordeTowersControlled(--horde_towers);
178 break;
180 field = HP_MAP_N[m_TowerType];
181 break;
183 field = HP_MAP_N[m_TowerType];
184 break;
186 field = HP_MAP_A[m_TowerType];
187 break;
189 field = HP_MAP_H[m_TowerType];
190 break;
191 }
192
193 // send world state update
194 if (field)
195 {
196 m_PvP->SendUpdateWorldState(field, 0);
197 field = 0;
198 }
199 uint32 artkit = 21;
201 switch (m_State)
202 {
204 field = HP_MAP_N[m_TowerType];
205 break;
207 {
208 field = HP_MAP_A[m_TowerType];
209 artkit = 2;
210 artkit2 = HP_TowerArtKit_A[m_TowerType];
211 uint32 alliance_towers = ((OutdoorPvPHP*)m_PvP)->GetAllianceTowersControlled();
212 if (alliance_towers < 3)
213 ((OutdoorPvPHP*)m_PvP)->SetAllianceTowersControlled(++alliance_towers);
215 break;
216 }
218 {
219 field = HP_MAP_H[m_TowerType];
220 artkit = 1;
221 artkit2 = HP_TowerArtKit_H[m_TowerType];
222 uint32 horde_towers = ((OutdoorPvPHP*)m_PvP)->GetHordeTowersControlled();
223 if (horde_towers < 3)
224 ((OutdoorPvPHP*)m_PvP)->SetHordeTowersControlled(++horde_towers);
226 break;
227 }
229 field = HP_MAP_N[m_TowerType];
230 break;
232 field = HP_MAP_N[m_TowerType];
233 break;
235 field = HP_MAP_A[m_TowerType];
236 artkit = 2;
237 artkit2 = HP_TowerArtKit_A[m_TowerType];
238 break;
240 field = HP_MAP_H[m_TowerType];
241 artkit = 1;
242 artkit2 = HP_TowerArtKit_H[m_TowerType];
243 break;
244 }
245
246 Map* map = m_PvP->GetMap();
247 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(m_capturePointSpawnId);
248 for (auto itr = bounds.first; itr != bounds.second; ++itr)
249 itr->second->SetGoArtKit(artkit);
250
251 bounds = map->GetGameObjectBySpawnIdStore().equal_range(m_Objects[m_TowerType]);
252 for (auto itr = bounds.first; itr != bounds.second; ++itr)
253 itr->second->SetGoArtKit(artkit2);
254
255 // send world state update
256 if (field)
257 m_PvP->SendUpdateWorldState(field, 1);
258
259 // complete quest objective
262}
263
265{
266 switch (m_State)
267 {
270 packet.Worldstates.emplace_back(HP_MAP_N[m_TowerType], 0);
271 packet.Worldstates.emplace_back(HP_MAP_A[m_TowerType], 1);
272 packet.Worldstates.emplace_back(HP_MAP_H[m_TowerType], 0);
273 break;
276 packet.Worldstates.emplace_back(HP_MAP_N[m_TowerType], 0);
277 packet.Worldstates.emplace_back(HP_MAP_A[m_TowerType], 0);
278 packet.Worldstates.emplace_back(HP_MAP_H[m_TowerType], 1);
279 break;
283 default:
284 packet.Worldstates.emplace_back(HP_MAP_N[m_TowerType], 1);
285 packet.Worldstates.emplace_back(HP_MAP_A[m_TowerType], 0);
286 packet.Worldstates.emplace_back(HP_MAP_H[m_TowerType], 0);
287 break;
288 }
289}
290
292{
293 if (killed->GetTypeId() != TYPEID_PLAYER)
294 return;
295
296 if (player->GetTeam() == ALLIANCE && killed->ToPlayer()->GetTeam() != ALLIANCE)
297 player->CastSpell(player, AlliancePlayerKillReward, true);
298 else if (player->GetTeam() == HORDE && killed->ToPlayer()->GetTeam() != HORDE)
299 player->CastSpell(player, HordePlayerKillReward, true);
300}
301
306
311
316
321
323{
324 public:
326
327 OutdoorPvP* GetOutdoorPvP() const override
328 {
329 return new OutdoorPvPHP();
330 }
331};
332
uint32_t uint32
Definition Define.h:133
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
go_type const HPCapturePoints[HP_TOWER_NUM]
uint32 const HP_MAP_N[HP_TOWER_NUM]
uint32 const HP_MAP_H[HP_TOWER_NUM]
uint32 const HP_MAP_A[HP_TOWER_NUM]
uint32 const HP_LANG_CAPTURE_H[HP_TOWER_NUM]
void AddSC_outdoorpvp_hp()
uint32 const OutdoorPvPHPBuffZones[OutdoorPvPHPBuffZonesNum]
go_type const HPTowerFlags[HP_TOWER_NUM]
uint32 const HP_CREDITMARKER[HP_TOWER_NUM]
uint32 const HP_TowerArtKit_N[HP_TOWER_NUM]
uint32 const HP_TowerArtKit_H[HP_TOWER_NUM]
uint32 const OutdoorPvPHPBuffZonesNum
uint32 const HP_LANG_CAPTURE_A[HP_TOWER_NUM]
uint32 const HP_TowerArtKit_A[HP_TOWER_NUM]
@ AllianceBuff
@ HordePlayerKillReward
@ HordeBuff
@ AlliancePlayerKillReward
@ HP_UI_TOWER_COUNT_A
@ HP_UI_TOWER_DISPLAY_A
@ HP_UI_TOWER_DISPLAY_H
@ HP_UI_TOWER_COUNT_H
@ TEXT_OVERLOOK_TAKEN_ALLIANCE
@ TEXT_BROKEN_HILL_TAKEN_HORDE
@ TEXT_STADIUM_TAKEN_ALLIANCE
@ TEXT_STADIUM_TAKEN_HORDE
@ TEXT_OVERLOOK_TAKEN_HORDE
@ TEXT_BROKEN_HILL_TAKEN_ALLIANCE
OutdoorPvPHPTowerType
@ HP_TOWER_STADIUM
@ HP_TOWER_NUM
@ HP_TOWER_OVERLOOK
@ HP_TOWER_BROKEN_HILL
@ OUTDOOR_PVP_HP
Definition OutdoorPvP.h:29
@ OBJECTIVESTATE_HORDE
Definition OutdoorPvP.h:43
@ OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE
Definition OutdoorPvP.h:45
@ OBJECTIVESTATE_ALLIANCE
Definition OutdoorPvP.h:42
@ OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE
Definition OutdoorPvP.h:44
@ OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE
Definition OutdoorPvP.h:47
@ OBJECTIVESTATE_NEUTRAL
Definition OutdoorPvP.h:41
@ OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE
Definition OutdoorPvP.h:46
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ ALLIANCE
@ HORDE
Definition Map.h:281
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition Map.h:496
OutdoorPvPHPTowerType m_TowerType
OPvPCapturePointHP(OutdoorPvP *pvp, OutdoorPvPHPTowerType type)
void ChangeState() override
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
ObjectiveStates m_OldState
Definition OutdoorPvP.h:167
OutdoorPvP * m_PvP
Definition OutdoorPvP.h:174
ObjectiveStates m_State
Definition OutdoorPvP.h:168
std::map< uint32, ObjectGuid::LowType > m_Objects
Definition OutdoorPvP.h:178
void SendObjectiveComplete(uint32 id, ObjectGuid guid)
ObjectGuid::LowType m_capturePointSpawnId
Definition OutdoorPvP.h:130
bool SetCapturePointData(uint32 entry, uint32 map, Position const &pos, QuaternionData const &rot)
bool AddObject(uint32 type, uint32 entry, uint32 map, Position const &pos, QuaternionData const &rot)
static ObjectGuid const Empty
Definition ObjectGuid.h:140
TypeID GetTypeId() const
Definition Object.h:93
static Player * ToPlayer(Object *o)
Definition Object.h:180
void HandlePlayerEnterZone(Player *player, uint32 zone) override
void SetAllianceTowersControlled(uint32 count)
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
uint32 m_AllianceTowersControlled
uint32 GetHordeTowersControlled() const
void HandleKillImpl(Player *player, Unit *killed) override
void HandlePlayerLeaveZone(Player *player, uint32 zone) override
void SendRemoveWorldStates(Player *player) override
uint32 m_HordeTowersControlled
void SetHordeTowersControlled(uint32 count)
uint32 GetAllianceTowersControlled() const
bool SetupOutdoorPvP() override
bool Update(uint32 diff) override
OutdoorPvP * GetOutdoorPvP() const override
virtual void HandlePlayerEnterZone(Player *player, uint32 zone)
OPvPCapturePointMap m_capturePoints
Definition OutdoorPvP.h:269
uint32 m_TypeId
Definition OutdoorPvP.h:273
virtual bool Update(uint32 diff)
void TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2=0)
void RegisterZone(uint32 zoneid)
virtual void HandlePlayerLeaveZone(Player *player, uint32 zone)
Map * GetMap() const
Definition OutdoorPvP.h:264
void TeamCastSpell(TeamId team, int32 spellId)
void SendUpdateWorldState(uint32 field, uint32 value)
void SetMapFromZone(uint32 zone)
void SendDefenseMessage(uint32 zoneId, uint32 id)
void AddCapturePoint(OPvPCapturePoint *cp)
Definition OutdoorPvP.h:287
uint32 GetTeam() const
Definition Player.h:1832
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition Player.cpp:8493
Definition Unit.h:769
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
std::vector< WorldStateInfo > Worldstates