TrinityCore
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
BattlegroundEY.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 "BattlegroundEY.h"
19#include "BattlegroundMgr.h"
20#include "BattlegroundPackets.h"
21#include "Creature.h"
22#include "DBCStores.h"
23#include "GameObject.h"
24#include "Log.h"
25#include "Map.h"
26#include "ObjectAccessor.h"
27#include "Player.h"
28#include "Random.h"
29#include "Util.h"
30#include "WorldStatePackets.h"
31
32// these variables aren't used outside of this file, so declare them only here
34{
35 260, // normal honor
36 160 // holiday
37};
38
40{
41 playerData.Stats = { FlagCaptures };
42}
43
45{
46 m_BuffChange = true;
61 m_FlagsTimer = 0;
64 m_HonorTics = 0;
65
66 for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
67 {
71 }
72
73 for (uint8 i = 0; i < 2 * EY_POINTS_MAX; ++i)
75}
76
78
80{
82 {
83 m_PointAddingTimer -= diff;
84 if (m_PointAddingTimer <= 0)
85 {
91 }
92
94 {
95 m_FlagsTimer -= diff;
96
97 if (m_FlagsTimer < 0)
98 {
99 m_FlagsTimer = 0;
101 RespawnFlag(true);
102 else
104 }
105 }
106
107 m_TowerCapCheckTimer -= diff;
108 if (m_TowerCapCheckTimer <= 0)
109 {
110 //check if player joined point
111 /*I used this order of calls, because although we will check if one player is in gameobject's distance 2 times
112 but we can count of players on current point in CheckSomeoneLeftPoint
113 */
115 //check if player left point
119 }
120 }
121}
122
124{
127
130}
131
133{
136
139 for (uint32 i = 0; i < EY_POINTS_MAX; ++i)
140 {
141 //randomly spawn buff
142 uint8 buff = urand(0, 2);
144 }
145
146 // Achievement: Flurry
148}
149
151{
152 TeamId team_index = GetTeamIndexByTeamId(Team);
153 m_TeamScores[team_index] += Points;
154 m_HonorScoreTics[team_index] += Points;
155 if (m_HonorScoreTics[team_index] >= m_HonorTics)
156 {
158 m_HonorScoreTics[team_index] -= m_HonorTics;
159 }
160 UpdateTeamScore(team_index);
161}
162
164{
165 GameObject* obj = nullptr;
166 for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
167 {
169
170 if (obj)
171 {
172 uint8 j = 0;
173 while (j < m_PlayersNearPoint[EY_POINTS_MAX].size())
174 {
176 if (!player)
177 {
178 TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player ({}) could not be found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString());
179 ++j;
180 continue;
181 }
182 if (player->CanCaptureTowerPoint() && player->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
183 {
184 //player joined point!
185 //show progress bar
189 //add player to point
191 //remove player from "free space"
193 }
194 else
195 ++j;
196 }
197 }
198 }
199}
200
202{
203 //reset current point counts
204 for (uint8 i = 0; i < 2*EY_POINTS_MAX; ++i)
206 GameObject* obj = nullptr;
207 for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
208 {
210
211 if (obj)
212 {
213 uint8 j = 0;
214 while (j < m_PlayersNearPoint[i].size())
215 {
217 if (!player)
218 {
219 TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player ({}) could not be found!", m_PlayersNearPoint[i][j].ToString());
220 //move non-existing players to "free space" - this will cause many errors showing in log, but it is a very important bug
222 m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j);
223 continue;
224 }
225 if (!player->CanCaptureTowerPoint() || !player->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
226 //move player out of point (add him to players that are out of points
227 {
229 m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j);
231 }
232 else
233 {
234 //player is neat flag, so update count:
236 ++j;
237 }
238 }
239 }
240 }
241}
242
244{
245 for (uint8 point = 0; point < EY_POINTS_MAX; ++point)
246 {
247 if (m_PlayersNearPoint[point].empty())
248 continue;
249 //count new point bar status:
251
253 //point is fully alliance's
256 //point is fully horde's
258
259 uint32 pointOwnerTeamId = 0;
260 //find which team should own this point
262 pointOwnerTeamId = HORDE;
264 pointOwnerTeamId = ALLIANCE;
265 else
266 pointOwnerTeamId = EY_POINT_NO_OWNER;
267
268 for (uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i)
269 {
271 if (player)
272 {
274 //if point owner changed we must evoke event!
275 if (pointOwnerTeamId != m_PointOwnedByTeam[point])
276 {
277 //point was uncontrolled and player is from team which captured point
278 if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && player->GetTeam() == pointOwnerTeamId)
279 EventTeamCapturedPoint(player, point);
280
281 //point was under control and player isn't from team which controlled it
282 if (m_PointState[point] == EY_POINT_UNDER_CONTROL && player->GetTeam() != m_PointOwnedByTeam[point])
283 EventTeamLostPoint(player, point);
284 }
285
287 if (point == FEL_REAVER && m_PointOwnedByTeam[point] == player->GetTeam())
288 if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
289 if (player->GetDistance(2044.0f, 1729.729f, 1190.03f) < 3.0f)
291 }
292 }
293 }
294}
295
297{
298 uint32 score = GetTeamScore(Team);
299
300 if (score >= BG_EY_MAX_TEAM_SCORE)
301 {
302 score = BG_EY_MAX_TEAM_SCORE;
303 if (Team == TEAM_ALLIANCE)
305 else
307 }
308
309 if (Team == TEAM_ALLIANCE)
311 else
313}
314
316{
317 // Win reward
318 if (winner == ALLIANCE)
320 if (winner == HORDE)
322 // Complete map reward
325
327}
328
330{
331 if (Team == ALLIANCE)
333 else
335}
336
338{
339 //we MUST firstly send 0, after that we can send 1!!!
341 {
342 UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 0);
343 if (Team == ALLIANCE)
344 UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 1);
345 else
346 UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 1);
347 }
348 else
349 {
350 if (Team == ALLIANCE)
351 UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 0);
352 else
353 UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 0);
354 UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 1);
355 }
356}
357
359{
360 bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
362 if (!isInBattleground)
363 PlayerScores[player->GetGUID().GetCounter()] = new BattlegroundEYScore(player->GetGUID());
364
365 m_PlayersNearPoint[EY_POINTS_MAX].push_back(player->GetGUID());
366}
367
369{
370 // sometimes flag aura not removed :(
371 for (int j = EY_POINTS_MAX; j >= 0; --j)
372 {
373 for (size_t i = 0; i < m_PlayersNearPoint[j].size(); ++i)
374 if (m_PlayersNearPoint[j][i] == guid)
375 m_PlayersNearPoint[j].erase(m_PlayersNearPoint[j].begin() + i);
376 }
377 if (IsFlagPickedup())
378 {
379 if (m_FlagKeeper == guid)
380 {
381 if (player)
383 else
384 {
386 RespawnFlag(true);
387 }
388 }
389 }
390}
391
393{
395 return;
396
397 if (!player->IsAlive()) //hack code, must be removed later
398 return;
399
400 switch (trigger)
401 {
404 if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
406 break;
409 if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
411 break;
414 if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
416 break;
419 if (m_FlagState && GetFlagPickerGUID() == player->GetGUID())
421 break;
422 case 4512:
423 case 4515:
424 case 4517:
425 case 4519:
426 case 4530:
427 case 4531:
428 case 4568:
429 case 4569:
430 case 4570:
431 case 4571:
432 case 5866:
433 break;
434 default:
435 Battleground::HandleAreaTrigger(player, trigger);
436 break;
437 }
438}
439
441{
442 // doors
443 if (!AddObject(BG_EY_OBJECT_DOOR_A, BG_OBJECT_A_DOOR_EY_ENTRY, 2527.6f, 1596.91f, 1262.13f, -3.12414f, -0.173642f, -0.001515f, 0.98477f, -0.008594f, RESPAWN_IMMEDIATELY)
444 || !AddObject(BG_EY_OBJECT_DOOR_H, BG_OBJECT_H_DOOR_EY_ENTRY, 1803.21f, 1539.49f, 1261.09f, 3.14159f, 0.173648f, 0, 0.984808f, 0, RESPAWN_IMMEDIATELY)
445 // banners (alliance)
446 || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY)
447 || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY)
448 || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY)
449 || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY)
450 || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY)
451 || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY)
452 || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY)
453 || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY)
454 || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY)
455 || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY)
456 || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY)
457 || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY)
458 // banners (horde)
459 || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY)
460 || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY)
461 || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY)
462 || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY)
463 || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY)
464 || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY)
465 || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY)
466 || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY)
467 || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY)
468 || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY)
469 || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY)
470 || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY)
471 // banners (natural)
472 || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY)
473 || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY)
474 || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY)
475 || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY)
476 || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY)
477 || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY)
478 || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY)
479 || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY)
480 || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY)
481 || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY)
482 || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY)
483 || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY)
484 // flags
485 || !AddObject(BG_EY_OBJECT_FLAG_NETHERSTORM, BG_OBJECT_FLAG2_EY_ENTRY, 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f, 0, 0, 0.662620f, -0.748956f, RESPAWN_ONE_DAY)
486 || !AddObject(BG_EY_OBJECT_FLAG_FEL_REAVER, BG_OBJECT_FLAG1_EY_ENTRY, 2044.28f, 1729.68f, 1189.96f, -0.017453f, 0, 0, 0.008727f, -0.999962f, RESPAWN_ONE_DAY)
487 || !AddObject(BG_EY_OBJECT_FLAG_BLOOD_ELF, BG_OBJECT_FLAG1_EY_ENTRY, 2048.83f, 1393.65f, 1194.49f, 0.20944f, 0, 0, 0.104528f, 0.994522f, RESPAWN_ONE_DAY)
488 || !AddObject(BG_EY_OBJECT_FLAG_DRAENEI_RUINS, BG_OBJECT_FLAG1_EY_ENTRY, 2286.56f, 1402.36f, 1197.11f, 3.72381f, 0, 0, 0.957926f, -0.287016f, RESPAWN_ONE_DAY)
489 || !AddObject(BG_EY_OBJECT_FLAG_MAGE_TOWER, BG_OBJECT_FLAG1_EY_ENTRY, 2284.48f, 1731.23f, 1189.99f, 2.89725f, 0, 0, 0.992546f, 0.121869f, RESPAWN_ONE_DAY)
490 // tower cap
491 || !AddObject(BG_EY_OBJECT_TOWER_CAP_FEL_REAVER, BG_OBJECT_FR_TOWER_CAP_EY_ENTRY, 2024.600708f, 1742.819580f, 1195.157715f, 2.443461f, 0, 0, 0.939693f, 0.342020f, RESPAWN_ONE_DAY)
492 || !AddObject(BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF, BG_OBJECT_BE_TOWER_CAP_EY_ENTRY, 2050.493164f, 1372.235962f, 1194.563477f, 1.710423f, 0, 0, 0.754710f, 0.656059f, RESPAWN_ONE_DAY)
493 || !AddObject(BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS, BG_OBJECT_DR_TOWER_CAP_EY_ENTRY, 2301.010498f, 1386.931641f, 1197.183472f, 1.570796f, 0, 0, 0.707107f, 0.707107f, RESPAWN_ONE_DAY)
494 || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY)
495)
496 {
497 TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some objects. The battleground was not created.");
498 return false;
499 }
500
501 //buffs
502 for (int i = 0; i < EY_POINTS_MAX; ++i)
503 {
504 AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(m_Points_Trigger[i]);
505 if (!at)
506 {
507 TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown trigger: {}", m_Points_Trigger[i]);
508 continue;
509 }
510 if (!AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3, Buff_Entries[0], at->Pos.X, at->Pos.Y, at->Pos.Z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY)
511 || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 1, Buff_Entries[1], at->Pos.X, at->Pos.Y, at->Pos.Z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY)
512 || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 2, Buff_Entries[2], at->Pos.X, at->Pos.Y, at->Pos.Z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY)
513)
514 TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Could not spawn Speedbuff Fel Reaver.");
515 }
516
518 if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.124139f, TEAM_ALLIANCE))
519 {
520 TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created.");
521 return false;
522 }
523
525 if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.193953f, TEAM_HORDE))
526 {
527 TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created.");
528 return false;
529 }
530
531 return true;
532}
533
535{
536 //call parent's class reset
538
551 bool isBGWeekend = sBattlegroundMgr->IsBGWeekend(GetTypeID());
553
554 for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
555 {
559 m_PlayersNearPoint[i].clear();
560 m_PlayersNearPoint[i].reserve(15); //tip size
561 }
564}
565
566void BattlegroundEY::RespawnFlag(bool send_message)
567{
570
574
575 if (send_message)
576 {
578 PlaySoundToAll(BG_EY_SOUND_FLAG_RESET); // flags respawned sound...
579 }
580
582}
583
585{
586 RespawnFlag(true);
587
589
590 if (obj)
591 obj->Delete();
592 else
593 TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown dropped flag ({}).", GetDroppedFlagGUID().ToString());
594
596}
597
599{
601 return;
602
603 Battleground::HandleKillPlayer(player, killer);
605}
606
608{
610 {
611 // if not running, do not cast things at the dropper player, neither send unnecessary messages
612 // just take off the aura
613 if (IsFlagPickedup() && GetFlagPickerGUID() == player->GetGUID())
614 {
617 }
618 return;
619 }
620
621 if (!IsFlagPickedup())
622 return;
623
624 if (GetFlagPickerGUID() != player->GetGUID())
625 return;
626
631 player->CastSpell(player, SPELL_RECENTLY_DROPPED_FLAG, true);
632 player->CastSpell(player, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);
633 //this does not work correctly :((it should remove flag carrier name)
636
637 if (player->GetTeam() == ALLIANCE)
639 else
641}
642
644{
645 if (GetStatus() != STATUS_IN_PROGRESS || IsFlagPickedup() || !player->IsWithinDistInMap(target_obj, 10))
646 return;
647
648 if (player->GetTeam() == ALLIANCE)
649 {
652 }
653 else
654 {
657 }
658
662
664 SetFlagPicker(player->GetGUID());
665 //get flag aura on player
666 player->CastSpell(player, BG_EY_NETHERSTORM_FLAG_SPELL, true);
668
669 if (player->GetTeam() == ALLIANCE)
671 else
673}
674
676{
678 return;
679
680 //Natural point
682
683 if (!Team)
684 return;
685
686 if (Team == ALLIANCE)
687 {
689 SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance, RESPAWN_ONE_DAY);
690 SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + 1, RESPAWN_ONE_DAY);
691 SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + 2, RESPAWN_ONE_DAY);
692 }
693 else
694 {
696 SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde, RESPAWN_ONE_DAY);
697 SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + 1, RESPAWN_ONE_DAY);
698 SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + 2, RESPAWN_ONE_DAY);
699 }
700
701 SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType, RESPAWN_IMMEDIATELY);
702 SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + 1, RESPAWN_IMMEDIATELY);
703 SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + 2, RESPAWN_IMMEDIATELY);
704
705 //buff isn't despawned
706
709
710 if (Team == ALLIANCE)
711 SendBroadcastText(m_LosingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
712 else
713 SendBroadcastText(m_LosingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, player);
714
715 UpdatePointsIcons(Team, Point);
717
718 //remove bonus honor aura trigger creature when node is lost
719 DelCreature(Point + 6);//NULL checks are in DelCreature! 0-5 spirit guides
720}
721
723{
725 return;
726
727 uint32 Team = player->GetTeam();
728
729 SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);
730 SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY);
731 SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY);
732
733 if (Team == ALLIANCE)
734 {
736 SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY);
737 SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY);
738 SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY);
739 }
740 else
741 {
743 SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY);
744 SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY);
745 SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY);
746 }
747
748 //buff isn't respawned
749
750 m_PointOwnedByTeam[Point] = Team;
752
753 if (Team == ALLIANCE)
755 else
757
758 if (BgCreatures[Point])
759 DelCreature(Point);
760
761 WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveyardId);
762 if (!sg || !AddSpiritGuide(Point, sg->Loc.X, sg->Loc.Y, sg->Loc.Z, 3.124139f, GetTeamIndexByTeamId(Team)))
763 TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide. point: {}, team: {}, graveyard_id: {}",
764 Point, Team, m_CapturingPointTypes[Point].GraveyardId);
765
766// SpawnBGCreature(Point, RESPAWN_IMMEDIATELY);
767
768 UpdatePointsIcons(Team, Point);
770
771 Creature* trigger = GetBGCreature(Point + 6, false);//0-5 spirit guides
772 if (!trigger)
774
775 //add bonus honor aura trigger creature when node is accupied
776 //cast bonus aura (+50% honor in 25yards)
777 //aura should only apply to players who have accupied the node, set correct faction for trigger
778 if (trigger)
779 {
781 trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false);
782 }
783}
784
786{
787 if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != player->GetGUID())
788 return;
789
793
795
796 if (player->GetTeam() == ALLIANCE)
797 {
800 }
801 else
802 {
805 }
806
807 SpawnBGObject(BgObjectType, RESPAWN_IMMEDIATELY);
808
810 m_FlagCapturedBgObjectType = BgObjectType;
811
812 uint8 team_id = player->GetTeam() == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE;
813 if (m_TeamPointsCount[team_id] > 0)
814 AddPoints(player->GetTeam(), BG_EY_FlagPoints[m_TeamPointsCount[team_id] - 1]);
815
817}
818
819bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
820{
821 if (!Battleground::UpdatePlayerScore(player, type, value, doAddHonor))
822 return false;
823
824 switch (type)
825 {
828 break;
829 default:
830 break;
831 }
832 return true;
833}
834
836{
839 packet.Worldstates.emplace_back(2742, 0); // Mage Tower - Horde conflict
840 packet.Worldstates.emplace_back(2741, 0); // Mage Tower - Alliance conflict
841 packet.Worldstates.emplace_back(2740, 0); // Fel Reaver - Horde conflict
842 packet.Worldstates.emplace_back(2739, 0); // Fel Reaver - Alliance conflict
843 packet.Worldstates.emplace_back(2738, 0); // Draenei - Alliance conflict
844 packet.Worldstates.emplace_back(2737, 0); // Draenei - Horde conflict
845 packet.Worldstates.emplace_back(2736, 0); // unk (0 at start)
846 packet.Worldstates.emplace_back(2735, 0); // unk (0 at start)
847
860 packet.Worldstates.emplace_back(NETHERSTORM_FLAG, (m_FlagState == BG_EY_FLAG_STATE_ON_BASE) ? 1 : 0);
861
862 packet.Worldstates.emplace_back(2770, 1); // Horde top-stats (1 - show, 0 - hide) // 02 -> horde picked up the flag
863 packet.Worldstates.emplace_back(2769, 1); // Alliance top-stats (1 - show, 0 - hide) // 02 -> alliance picked up the flag
864 packet.Worldstates.emplace_back(2750, GetTeamScore(TEAM_HORDE)); // Horde resources
865 packet.Worldstates.emplace_back(2749, GetTeamScore(TEAM_ALLIANCE)); // Alliance resources
866 packet.Worldstates.emplace_back(2565, 142); // unk, constant?
867 packet.Worldstates.emplace_back(2720, 0); // Capturing progress-bar (100 -> empty (only grey), 0 -> blue|red (no grey), default 0)
868 packet.Worldstates.emplace_back(2719, 0); // Capturing progress-bar (0 - left, 100 - right)
869 packet.Worldstates.emplace_back(2718, 0); // Capturing progress-bar (1 - show, 0 - hide)
870 packet.Worldstates.emplace_back(3085, 379); // unk, constant?
871}
872
874{
875 uint32 g_id = 0;
876
877 switch (player->GetTeam())
878 {
879 case ALLIANCE: g_id = EY_GRAVEYARD_MAIN_ALLIANCE; break;
880 case HORDE: g_id = EY_GRAVEYARD_MAIN_HORDE; break;
881 default: return nullptr;
882 }
883
884 float distance, nearestDistance;
885
886 WorldSafeLocsEntry const* entry = nullptr;
887 WorldSafeLocsEntry const* nearestEntry = nullptr;
888 entry = sWorldSafeLocsStore.LookupEntry(g_id);
889 nearestEntry = entry;
890
891 if (!entry)
892 {
893 TC_LOG_ERROR("bg.battleground", "BattlegroundEY: The main team graveyard could not be found. The graveyard system will not be operational!");
894 return nullptr;
895 }
896
897 float plr_x = player->GetPositionX();
898 float plr_y = player->GetPositionY();
899 float plr_z = player->GetPositionZ();
900
901 distance = (entry->Loc.X - plr_x)*(entry->Loc.X - plr_x) + (entry->Loc.Y - plr_y)*(entry->Loc.Y - plr_y) + (entry->Loc.Z - plr_z)*(entry->Loc.Z - plr_z);
902 nearestDistance = distance;
903
904 for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
905 {
907 {
908 entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveyardId);
909 if (!entry)
910 TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Graveyard {} could not be found.", m_CapturingPointTypes[i].GraveyardId);
911 else
912 {
913 distance = (entry->Loc.X - plr_x)*(entry->Loc.X - plr_x) + (entry->Loc.Y - plr_y)*(entry->Loc.Y - plr_y) + (entry->Loc.Z - plr_z)*(entry->Loc.Z - plr_z);
914 if (distance < nearestDistance)
915 {
916 nearestDistance = distance;
917 nearestEntry = entry;
918 }
919 }
920 }
921 }
922
923 return nearestEntry;
924}
925
927{
928 uint32 count = 0;
929 for (int i = 0; i < EY_POINTS_MAX; ++i)
931 ++count;
932
933 return count == EY_POINTS_MAX;
934}
935
937{
939 return ALLIANCE;
941 return HORDE;
942
944}
uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM]
@ BG_EY_FLAG_STATE_ON_PLAYER
@ BG_EY_FLAG_STATE_ON_BASE
@ BG_EY_FLAG_STATE_ON_GROUND
@ BG_EY_FLAG_STATE_WAIT_RESPAWN
@ BG_EY_PROGRESS_BAR_NEUTRAL_HIGH
@ BG_EY_PROGRESS_BAR_NEUTRAL_LOW
@ BG_EY_PROGRESS_BAR_DONT_SHOW
@ BG_EY_PROGRESS_BAR_STATE_MIDDLE
@ BG_EY_PROGRESS_BAR_ALI_CONTROLLED
@ BG_EY_PROGRESS_BAR_HORDE_CONTROLLED
@ BG_EY_POINT_MAX_CAPTURERS_COUNT
@ BG_EY_PROGRESS_BAR_PERCENT_GREY
@ BG_EY_POINT_RADIUS
@ BG_EY_PROGRESS_BAR_SHOW
@ BG_EY_MAX_TEAM_SCORE
@ EY_GRAVEYARD_MAIN_ALLIANCE
@ EY_GRAVEYARD_MAIN_HORDE
@ BLOOD_ELF_HORDE_CONTROL
@ NETHERSTORM_FLAG_STATE_ALLIANCE
@ BLOOD_ELF_UNCONTROL
@ FEL_REAVER_UNCONTROL
@ EY_HORDE_RESOURCES
@ MAGE_TOWER_ALLIANCE_CONTROL
@ PROGRESS_BAR_SHOW
@ NETHERSTORM_FLAG
@ EY_ALLIANCE_BASE
@ FEL_REAVER_ALLIANCE_CONTROL
@ DRAENEI_RUINS_UNCONTROL
@ NETHERSTORM_FLAG_STATE_HORDE
@ DRAENEI_RUINS_ALLIANCE_CONTROL
@ EY_ALLIANCE_RESOURCES
@ BLOOD_ELF_ALLIANCE_CONTROL
@ DRAENEI_RUINS_HORDE_CONTROL
@ EY_HORDE_BASE
@ MAGE_TOWER_HORDE_CONTROL
@ PROGRESS_BAR_PERCENT_GREY
@ MAGE_TOWER_UNCONTROL
@ PROGRESS_BAR_STATUS
@ FEL_REAVER_HORDE_CONTROL
const BattlegroundEYLosingPointStruct m_LosingPointTypes[EY_POINTS_MAX]
@ DRAENEI_RUINS
@ BLOOD_ELF
@ MAGE_TOWER
@ EY_PLAYERS_OUT_OF_POINTS
@ EY_POINTS_MAX
@ FEL_REAVER
#define BG_EY_NotEYWeekendHonorTicks
const uint8 BG_EY_TickPoints[EY_POINTS_MAX]
const BattlegroundEYCapturingPointStruct m_CapturingPointTypes[EY_POINTS_MAX]
@ EY_OBJECTIVE_CAPTURE_FLAG
@ BG_EY_TEXT_TAKEN_FLAG
@ BG_EY_TEXT_FLAG_RESET
@ BG_EY_TEXT_ALLIANCE_CAPTURED_FLAG
@ BG_EY_TEXT_FLAG_DROPPED
@ BG_EY_TEXT_HORDE_CAPTURED_FLAG
const uint32 BG_EY_FlagPoints[EY_POINTS_MAX]
@ BG_EY_FPOINTS_TICK_TIME
@ BG_EY_EVENT_START_BATTLE
@ BG_EY_FLAG_RESPAWN_TIME
@ BG_EY_OBJECT_DOOR_H
@ BG_EY_OBJECT_FLAG_BLOOD_ELF
@ BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT
@ BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT
@ BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER
@ BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT
@ BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT
@ BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF
@ BG_EY_OBJECT_TOWER_CAP_FEL_REAVER
@ BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER
@ BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS
@ BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT
@ BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER
@ BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT
@ BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER
@ BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER
@ BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER
@ BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT
@ BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT
@ BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER
@ BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT
@ BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER
@ BG_EY_OBJECT_DOOR_A
@ BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT
@ BG_EY_OBJECT_MAX
@ BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT
@ BG_EY_OBJECT_FLAG_FEL_REAVER
@ BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER
@ BG_EY_OBJECT_FLAG_MAGE_TOWER
@ BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT
@ BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT
@ BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT
@ BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT
@ BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT
@ BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT
@ BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT
@ BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER
@ BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT
@ BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT
@ BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER
@ BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER
@ BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT
@ BG_EY_OBJECT_FLAG_DRAENEI_RUINS
@ BG_EY_OBJECT_FLAG_NETHERSTORM
@ BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER
@ BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER
@ BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT
@ BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT
@ BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT
@ BG_OBJECT_HU_TOWER_CAP_EY_ENTRY
@ BG_OBJECT_BE_TOWER_CAP_EY_ENTRY
@ BG_OBJECT_H_BANNER_EY_ENTRY
@ BG_OBJECT_FLAG2_EY_ENTRY
@ BG_OBJECT_FR_TOWER_CAP_EY_ENTRY
@ BG_OBJECT_A_DOOR_EY_ENTRY
@ BG_OBJECT_H_DOOR_EY_ENTRY
@ BG_OBJECT_FLAG1_EY_ENTRY
@ BG_OBJECT_A_BANNER_EY_ENTRY
@ BG_OBJECT_N_BANNER_EY_ENTRY
@ BG_OBJECT_DR_TOWER_CAP_EY_ENTRY
@ EY_SPIRIT_MAIN_HORDE
@ EY_SPIRIT_MAIN_ALLIANCE
@ BG_EY_CREATURES_MAX
@ TR_DRAENEI_RUINS_BUFF
@ TR_BLOOD_ELF_POINT
@ TR_BLOOD_ELF_BUFF
@ TR_FEL_REAVER_BUFF
@ TR_DRAENEI_RUINS_POINT
@ TR_MAGE_TOWER_POINT
@ TR_FEL_REAVER_POINT
@ TR_MAGE_TOWER_BUFF
@ EY_POINT_UNDER_CONTROL
@ EY_POINT_NO_OWNER
@ EY_POINT_STATE_UNCONTROLLED
#define BG_EY_EYWeekendHonorTicks
@ BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE
@ BG_EY_SOUND_FLAG_CAPTURED_HORDE
@ BG_EY_SOUND_FLAG_PICKED_UP_HORDE
@ BG_EY_SOUND_FLAG_RESET
@ BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE
@ BG_EY_NETHERSTORM_FLAG_SPELL
@ BG_EY_PLAYER_DROPPED_FLAG_SPELL
const BattlegroundEYPointIconsStruct m_PointsIconStruct[EY_POINTS_MAX]
Position const BG_EY_TriggerPositions[EY_POINTS_MAX]
#define sBattlegroundMgr
@ SCORE_FLAG_CAPTURES
@ RESPAWN_IMMEDIATELY
Definition: Battleground.h:160
@ RESPAWN_ONE_DAY
Definition: Battleground.h:159
const uint32 Buff_Entries[3]
Definition: Battleground.h:180
@ BG_HONOR_MODE_NUM
Definition: Battleground.h:235
@ SPELL_RECENTLY_DROPPED_FLAG
Definition: Battleground.h:144
@ SPELL_HONORABLE_DEFENDER_25Y
Definition: Battleground.h:146
@ STATUS_IN_PROGRESS
Definition: Battleground.h:187
@ ACHIEVEMENT_TIMED_TYPE_EVENT
Definition: DBCEnums.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
Definition: DBCEnums.h:156
DBCStorage< WorldSafeLocsEntry > sWorldSafeLocsStore(WorldSafeLocsEntryfmt)
DBCStorage< AreaTriggerEntry > sAreaTriggerStore(AreaTriggerEntryfmt)
uint8_t uint8
Definition: Define.h:135
uint32_t uint32
Definition: Define.h:133
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
TeamId
@ TEAM_ALLIANCE
@ TEAM_HORDE
Team
@ ALLIANCE
@ HORDE
@ CHAT_MSG_BG_SYSTEM_ALLIANCE
@ CHAT_MSG_BG_SYSTEM_HORDE
@ CHAT_MSG_BG_SYSTEM_NEUTRAL
@ FACTION_ALLIANCE_GENERIC
@ FACTION_HORDE_GENERIC
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition: SpellDefines.h:85
#define WORLD_TRIGGER
Definition: Unit.h:35
void SetFlagPicker(ObjectGuid guid)
void EventTeamCapturedPoint(Player *Source, uint32 Point)
uint32 m_FlagCapturedBgObjectType
uint8 m_PointState[EY_POINTS_MAX]
int32 m_PointBarStatus[EY_POINTS_MAX]
WorldSafeLocsEntry const * GetClosestGraveyard(Player *player) override
void AddPoints(uint32 Team, uint32 Points)
void CheckSomeoneJoinedPoint()
ObjectGuid m_DroppedFlagGUID
void HandleKillPlayer(Player *player, Player *killer) override
void UpdatePointsCount(uint32 Team)
void UpdatePointsIcons(uint32 Team, uint32 Point)
bool IsFlagPickedup() const
bool SetupBattleground() override
int32 m_TowerCapCheckTimer
uint8 m_CurrentPointPlayersCount[2 *EY_POINTS_MAX]
void RemovePlayer(Player *player, ObjectGuid guid, uint32 team) override
void StartingEventOpenDoors() override
bool IsAllNodesControlledByTeam(uint32 team) const override
uint32 m_Points_Trigger[EY_POINTS_MAX]
uint32 m_TeamPointsCount[2]
void RespawnFlagAfterDrop()
void CheckSomeoneLeftPoint()
GuidVector m_PlayersNearPoint[EY_POINTS_MAX+1]
void StartingEventCloseDoors() override
int32 m_PointAddingTimer
ObjectGuid GetFlagPickerGUID(int32=-1) const override
uint32 m_PointOwnedByTeam[EY_POINTS_MAX]
uint32 m_HonorScoreTics[2]
void EventTeamLostPoint(Player *Source, uint32 Point)
bool UpdatePlayerScore(Player *player, uint32 type, uint32 value, bool doAddHonor=true) override
void UpdatePointStatuses()
ObjectGuid m_FlagKeeper
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
void EventPlayerClickedOnFlag(Player *Source, GameObject *target_obj) override
void UpdateTeamScore(uint32 Team)
void PostUpdateImpl(uint32 diff) override
Post-update hook.
void HandleAreaTrigger(Player *Source, uint32 Trigger) override
void Reset() override
ObjectGuid GetDroppedFlagGUID() const
void AddPlayer(Player *player) override
void RespawnFlag(bool send_message)
uint32 GetPrematureWinner() override
void EndBattleground(uint32 winner) override
void EventPlayerDroppedFlag(Player *Source) override
void SetDroppedFlagGUID(ObjectGuid guid, int32=-1) override
void EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType)
virtual void AddPlayer(Player *player)
BattlegroundTypeId GetTypeID(bool GetRandom=false) const
Definition: Battleground.h:275
virtual void EndBattleground(uint32 winner)
virtual Creature * AddCreature(uint32 entry, uint32 type, float x, float y, float z, float o, TeamId teamId=TEAM_NEUTRAL, uint32 respawntime=0, Transport *transport=nullptr)
virtual void HandleKillPlayer(Player *player, Player *killer)
static TeamId GetTeamIndexByTeamId(uint32 Team)
Definition: Battleground.h:410
bool DelCreature(uint32 type)
void SpawnBGObject(uint32 type, uint32 respawntime)
virtual void Reset()
virtual bool AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime=0, GOState goState=GO_STATE_READY)
GuidVector BgObjects
Definition: Battleground.h:463
Creature * GetBGCreature(uint32 type, bool logError=true)
BattlegroundMap * GetBgMap() const
Definition: Battleground.h:368
virtual bool AddSpiritGuide(uint32 type, float x, float y, float z, float o, TeamId teamId=TEAM_NEUTRAL)
int32 m_TeamScores[PVP_TEAMS_COUNT]
Definition: Battleground.h:554
GuidVector BgCreatures
Definition: Battleground.h:464
bool IsPlayerInBattleground(ObjectGuid guid) const
void SendBroadcastText(uint32 id, ChatMsg msgType, WorldObject const *target=nullptr)
BattlegroundScoreMap PlayerScores
Definition: Battleground.h:535
void RewardHonorToTeam(uint32 Honor, uint32 TeamID)
BattlegroundStatus GetStatus() const
Definition: Battleground.h:278
virtual bool UpdatePlayerScore(Player *player, uint32 type, uint32 value, bool doAddHonor=true)
virtual void HandleAreaTrigger(Player *, uint32)
uint32 GetTeamScore(uint32 TeamID) const
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void UpdateWorldState(uint32 variable, uint32 value)
uint32 GetBonusHonorFromKill(uint32 kills) const
void PlaySoundToAll(uint32 soundID)
virtual uint32 GetPrematureWinner()
void Delete()
Definition: GameObject.cpp:955
GameObject * GetGameObject(ObjectGuid const &guid)
Definition: Map.cpp:4428
LowType GetCounter() const
Definition: ObjectGuid.h:158
static ObjectGuid const Empty
Definition: ObjectGuid.h:132
void Clear()
Definition: ObjectGuid.h:151
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:77
Definition: Player.h:915
uint32 GetTeam() const
Definition: Player.h:1811
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition: Player.cpp:8634
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
Definition: Player.cpp:25092
bool CanCaptureTowerPoint() const
Definition: Player.cpp:24358
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0)
Definition: Unit.cpp:4018
void SetFaction(uint32 faction) override
Definition: Unit.h:972
bool IsAlive() const
Definition: Unit.h:1234
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3780
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2831
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1185
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1116
std::vector< WorldStateInfo > Worldstates
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
std::string ToString(Type &&val, Params &&... params)
DBCPosition3D Pos
Definition: DBCStructure.h:248
void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player &playerData) override
float GetPositionZ() const
Definition: Position.h:81
float GetPositionX() const
Definition: Position.h:79
float GetPositionY() const
Definition: Position.h:80
DBCPosition3D Loc