2 * Copyright (C) 2005-2013 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef __BATTLEGROUNDEY_H
20 #define __BATTLEGROUNDEY_H
26 #define EY_FLAG_RESPAWN_TIME (10 * IN_MILLISECONDS) //10 seconds
27 #define EY_RESOURCES_UPDATE_TIME (2 * IN_MILLISECONDS) //2 seconds
31 WORLD_STATE_EY_RESOURCES_ALLIANCE
= 2749,
32 WORLD_STATE_EY_RESOURCES_HORDE
= 2750,
33 WORLD_STATE_EY_TOWER_COUNT_ALLIANCE
= 2752,
34 WORLD_STATE_EY_TOWER_COUNT_HORDE
= 2753,
36 WORLD_STATE_EY_BLOOD_ELF_TOWER_ALLIANCE
= 2723,
37 WORLD_STATE_EY_BLOOD_ELF_TOWER_HORDE
= 2724,
38 WORLD_STATE_EY_BLOOD_ELF_TOWER_NEUTRAL
= 2722,
39 //WORLD_STATE_EY_BLOOD_ELF_TOWER_ALLIANCE_CONFLICT = 2735, // unused on retail
40 //WORLD_STATE_EY_BLOOD_ELF_TOWER_HORDE_CONFLICT = 2736, // unused on retail
42 WORLD_STATE_EY_FEL_REAVER_RUINS_ALLIANCE
= 2726,
43 WORLD_STATE_EY_FEL_REAVER_RUINS_HORDE
= 2727,
44 WORLD_STATE_EY_FEL_REAVER_RUINS_NEUTRAL
= 2725,
45 //WORLD_STATE_EY_FEL_REAVER_RUINS_ALLIANCE_CONFLICT = 2739, // unused on retail
46 //WORLD_STATE_EY_FEL_REAVER_RUINS_HORDE_CONFLICT = 2740, // unused on retail
48 WORLD_STATE_EY_MAGE_TOWER_ALLIANCE
= 2730,
49 WORLD_STATE_EY_MAGE_TOWER_HORDE
= 2729,
50 WORLD_STATE_EY_MAGE_TOWER_NEUTRAL
= 2728,
51 //WORLD_STATE_EY_MAGE_TOWER_ALLIANCE_CONFLICT = 2741, // unused on retail
52 //WORLD_STATE_EY_MAGE_TOWER_HORDE_CONFLICT = 2742, // unused on retail
54 WORLD_STATE_EY_DRAENEI_RUINS_ALLIANCE
= 2732,
55 WORLD_STATE_EY_DRAENEI_RUINS_HORDE
= 2733,
56 WORLD_STATE_EY_DRAENEI_RUINS_NEUTRAL
= 2731,
57 //WORLD_STATE_EY_DRAENEI_RUINS_ALLIANCE_CONFLICT = 2738, // unused on retail
58 //WORLD_STATE_EY_DRAENEI_RUINS_HORDE_CONFLICT = 2737, // unused on retail
60 WORLD_STATE_EY_NETHERSTORM_FLAG_READY
= 2757,
61 WORLD_STATE_EY_NETHERSTORM_FLAG_STATE_ALLIANCE
= 2769,
62 WORLD_STATE_EY_NETHERSTORM_FLAG_STATE_HORDE
= 2770,
64 WORLD_STATE_EY_CAPTURE_POINT_SLIDER_DISPLAY
= 2718
69 GO_CAPTURE_POINT_BLOOD_ELF_TOWER
= 184080,
70 GO_CAPTURE_POINT_FEL_REAVER_RUINS
= 184081,
71 GO_CAPTURE_POINT_MAGE_TOWER
= 184082,
72 GO_CAPTURE_POINT_DRAENEI_RUINS
= 184083
77 //EVENT_BLOOD_ELF_TOWER_WIN_ALLIANCE = 12965,
78 //EVENT_BLOOD_ELF_TOWER_WIN_HORDE = 12964,
79 EVENT_BLOOD_ELF_TOWER_PROGRESS_ALLIANCE
= 12905,
80 EVENT_BLOOD_ELF_TOWER_PROGRESS_HORDE
= 12904,
81 EVENT_BLOOD_ELF_TOWER_NEUTRAL_ALLIANCE
= 12957,
82 EVENT_BLOOD_ELF_TOWER_NEUTRAL_HORDE
= 12956,
84 //EVENT_FEL_REAVER_RUINS_WIN_ALLIANCE = 12969,
85 //EVENT_FEL_REAVER_RUINS_WIN_HORDE = 12968,
86 EVENT_FEL_REAVER_RUINS_PROGRESS_ALLIANCE
= 12911,
87 EVENT_FEL_REAVER_RUINS_PROGRESS_HORDE
= 12910,
88 EVENT_FEL_REAVER_RUINS_NEUTRAL_ALLIANCE
= 12960,
89 EVENT_FEL_REAVER_RUINS_NEUTRAL_HORDE
= 12961,
91 //EVENT_MAGE_TOWER_WIN_ALLIANCE = 12971,
92 //EVENT_MAGE_TOWER_WIN_HORDE = 12970,
93 EVENT_MAGE_TOWER_PROGRESS_ALLIANCE
= 12909,
94 EVENT_MAGE_TOWER_PROGRESS_HORDE
= 12908,
95 EVENT_MAGE_TOWER_NEUTRAL_ALLIANCE
= 12962,
96 EVENT_MAGE_TOWER_NEUTRAL_HORDE
= 12963,
98 //EVENT_DRAENEI_RUINS_WIN_ALLIANCE = 12967,
99 //EVENT_DRAENEI_RUINS_WIN_HORDE = 12966,
100 EVENT_DRAENEI_RUINS_PROGRESS_ALLIANCE
= 12907,
101 EVENT_DRAENEI_RUINS_PROGRESS_HORDE
= 12906,
102 EVENT_DRAENEI_RUINS_NEUTRAL_ALLIANCE
= 12958,
103 EVENT_DRAENEI_RUINS_NEUTRAL_HORDE
= 12959
108 EY_SOUND_FLAG_PICKED_UP_ALLIANCE
= 8212,
109 EY_SOUND_FLAG_CAPTURED_HORDE
= 8213,
110 EY_SOUND_FLAG_PICKED_UP_HORDE
= 8174,
111 EY_SOUND_FLAG_CAPTURED_ALLIANCE
= 8173,
112 EY_SOUND_FLAG_RESET
= 8192
117 EY_NETHERSTORM_FLAG_SPELL
= 34976,
118 EY_PLAYER_DROPPED_FLAG_SPELL
= 34991
123 AREATRIGGER_BLOOD_ELF_TOWER_POINT
= 4476, // also 4512
124 AREATRIGGER_FEL_REAVER_RUINS_POINT
= 4514, // also 4515
125 AREATRIGGER_MAGE_TOWER_POINT
= 4516, // also 4517
126 AREATRIGGER_DRAENEI_RUINS_POINT
= 4518, // also 4519
128 AREATRIGGER_BLOOD_ELF_TOWER_BUFF
= 4568,
129 AREATRIGGER_FEL_REAVER_RUINS_BUFF
= 4569,
130 //AREATRIGGER_FEL_REAVER_RUINS_BUFF_2 = 5866,
131 AREATRIGGER_MAGE_TOWER_BUFF
= 4570,
132 AREATRIGGER_DRAENEI_RUINS_BUFF
= 4571
134 //AREATRIGGER_EY_HORDE_START = 4530,
135 //AREATRIGGER_EY_ALLIANCE_START = 4531
140 GRAVEYARD_EY_MAIN_ALLIANCE
= 1103,
141 GRAVEYARD_EY_MAIN_HORDE
= 1104,
142 GRAVEYARD_FEL_REAVER_RUINS
= 1105,
143 GRAVEYARD_BLOOD_ELF_TOWER
= 1106,
144 GRAVEYARD_DRAENEI_RUINS
= 1107,
145 GRAVEYARD_MAGE_TOWER
= 1108
150 // TODO: Re-change order after we drop battleground_event and associated tables
151 NODE_BLOOD_ELF_TOWER
= 1,
152 NODE_FEL_REAVER_RUINS
= 0,
154 NODE_DRAENEI_RUINS
= 2
157 #define EY_NODES_MAX 4
159 // node-events work like this: event1:nodeid, event2:state (0alliance,1horde,2neutral)
160 #define EY_NEUTRAL_TEAM 2
161 #define EY_EVENT_CAPTURE_FLAG 4 // event1=4, event2=nodeid or 4 for the default center spawn
162 #define EY_EVENT2_FLAG_CENTER 4 // maximum node is 3 so 4 for center is ok
163 // all other event2 are just nodeids, i won't define something here
168 EY_OBJECT_SPEEDBUFF_FEL_REAVER_RUINS
= 1,
169 EY_OBJECT_REGENBUFF_FEL_REAVER_RUINS
= 2,
170 EY_OBJECT_BERSERKBUFF_FEL_REAVER_RUINS
= 3,
171 EY_OBJECT_SPEEDBUFF_BLOOD_ELF_TOWER
= 4,
172 EY_OBJECT_REGENBUFF_BLOOD_ELF_TOWER
= 5,
173 EY_OBJECT_BERSERKBUFF_BLOOD_ELF_TOWER
= 6,
174 EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS
= 7,
175 EY_OBJECT_REGENBUFF_DRAENEI_RUINS
= 8,
176 EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS
= 9,
177 EY_OBJECT_SPEEDBUFF_MAGE_TOWER
= 10,
178 EY_OBJECT_REGENBUFF_MAGE_TOWER
= 11,
179 EY_OBJECT_BERSERKBUFF_MAGE_TOWER
= 12,
183 #define EY_NORMAL_HONOR_INTERVAL 260
184 #define EY_WEEKEND_HONOR_INTERVAL 160
185 #define EY_EVENT_START_BATTLE 13180
189 EY_WARNING_NEAR_VICTORY_SCORE
= 1400,
190 EY_MAX_TEAM_SCORE
= 1600
195 EY_FLAG_STATE_ON_BASE
= 0,
196 EY_FLAG_STATE_WAIT_RESPAWN
= 1,
197 EY_FLAG_STATE_ON_ALLIANCE_PLAYER
= 2,
198 EY_FLAG_STATE_ON_HORDE_PLAYER
= 3,
199 EY_FLAG_STATE_ON_GROUND
= 4
202 static const uint8 eyTickPoints
[EY_NODES_MAX
] = {1, 2, 5, 10};
203 static const uint32 eyFlagPoints
[EY_NODES_MAX
] = {75, 85, 100, 500};
205 static const uint32 eyGraveyards
[EY_NODES_MAX
] = {GRAVEYARD_FEL_REAVER_RUINS
, GRAVEYARD_BLOOD_ELF_TOWER
, GRAVEYARD_DRAENEI_RUINS
, GRAVEYARD_MAGE_TOWER
};
206 static const uint32 eyTriggers
[EY_NODES_MAX
] = {AREATRIGGER_FEL_REAVER_RUINS_BUFF
, AREATRIGGER_BLOOD_ELF_TOWER_BUFF
, AREATRIGGER_DRAENEI_RUINS_BUFF
, AREATRIGGER_MAGE_TOWER_BUFF
};
216 static const EYTowerEvent eyTowerEvents
[EY_NODES_MAX
][4] =
219 {EVENT_FEL_REAVER_RUINS_PROGRESS_ALLIANCE
, ALLIANCE
, LANG_BG_EY_HAS_TAKEN_A_B_TOWER
, WORLD_STATE_EY_FEL_REAVER_RUINS_ALLIANCE
},
220 {EVENT_FEL_REAVER_RUINS_PROGRESS_HORDE
, HORDE
, LANG_BG_EY_HAS_TAKEN_H_F_RUINS
, WORLD_STATE_EY_FEL_REAVER_RUINS_HORDE
},
221 {EVENT_FEL_REAVER_RUINS_NEUTRAL_HORDE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_A_F_RUINS
, WORLD_STATE_EY_FEL_REAVER_RUINS_NEUTRAL
},
222 {EVENT_FEL_REAVER_RUINS_NEUTRAL_ALLIANCE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_H_F_RUINS
, WORLD_STATE_EY_FEL_REAVER_RUINS_NEUTRAL
},
225 {EVENT_BLOOD_ELF_TOWER_PROGRESS_ALLIANCE
, ALLIANCE
, LANG_BG_EY_HAS_TAKEN_A_B_TOWER
, WORLD_STATE_EY_BLOOD_ELF_TOWER_ALLIANCE
},
226 {EVENT_BLOOD_ELF_TOWER_PROGRESS_HORDE
, HORDE
, LANG_BG_EY_HAS_TAKEN_H_B_TOWER
, WORLD_STATE_EY_BLOOD_ELF_TOWER_HORDE
},
227 {EVENT_BLOOD_ELF_TOWER_NEUTRAL_HORDE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_A_B_TOWER
, WORLD_STATE_EY_BLOOD_ELF_TOWER_NEUTRAL
},
228 {EVENT_BLOOD_ELF_TOWER_NEUTRAL_ALLIANCE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_H_B_TOWER
, WORLD_STATE_EY_BLOOD_ELF_TOWER_NEUTRAL
},
231 {EVENT_DRAENEI_RUINS_PROGRESS_ALLIANCE
, ALLIANCE
, LANG_BG_EY_HAS_TAKEN_A_D_RUINS
, WORLD_STATE_EY_DRAENEI_RUINS_ALLIANCE
},
232 {EVENT_DRAENEI_RUINS_PROGRESS_HORDE
, HORDE
, LANG_BG_EY_HAS_TAKEN_H_D_RUINS
, WORLD_STATE_EY_DRAENEI_RUINS_HORDE
},
233 {EVENT_DRAENEI_RUINS_NEUTRAL_HORDE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_A_D_RUINS
, WORLD_STATE_EY_DRAENEI_RUINS_NEUTRAL
},
234 {EVENT_DRAENEI_RUINS_NEUTRAL_ALLIANCE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_H_D_RUINS
, WORLD_STATE_EY_DRAENEI_RUINS_NEUTRAL
},
237 {EVENT_MAGE_TOWER_PROGRESS_ALLIANCE
, ALLIANCE
, LANG_BG_EY_HAS_TAKEN_A_M_TOWER
, WORLD_STATE_EY_MAGE_TOWER_ALLIANCE
},
238 {EVENT_MAGE_TOWER_PROGRESS_HORDE
, HORDE
, LANG_BG_EY_HAS_TAKEN_H_M_TOWER
, WORLD_STATE_EY_MAGE_TOWER_HORDE
},
239 {EVENT_MAGE_TOWER_NEUTRAL_HORDE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_A_M_TOWER
, WORLD_STATE_EY_MAGE_TOWER_NEUTRAL
},
240 {EVENT_MAGE_TOWER_NEUTRAL_ALLIANCE
, TEAM_NONE
, LANG_BG_EY_HAS_LOST_H_M_TOWER
, WORLD_STATE_EY_MAGE_TOWER_NEUTRAL
},
244 static const uint32 eyTowers
[EY_NODES_MAX
] = {GO_CAPTURE_POINT_FEL_REAVER_RUINS
, GO_CAPTURE_POINT_BLOOD_ELF_TOWER
, GO_CAPTURE_POINT_DRAENEI_RUINS
, GO_CAPTURE_POINT_MAGE_TOWER
};
246 class BattleGroundEYScore
: public BattleGroundScore
249 BattleGroundEYScore() : FlagCaptures(0) {};
250 virtual ~BattleGroundEYScore() {};
254 class BattleGroundEY
: public BattleGround
256 friend class BattleGroundMgr
;
261 void Update(uint32 diff
) override
;
263 /* inherited from BattlegroundClass */
264 virtual void AddPlayer(Player
* plr
) override
;
265 virtual void StartingEventCloseDoors() override
;
266 virtual void StartingEventOpenDoors() override
;
269 ObjectGuid
const& GetFlagCarrierGuid() const { return m_flagCarrier
; }
270 void SetFlagCarrier(ObjectGuid guid
) { m_flagCarrier
= guid
; }
271 void ClearFlagCarrier() { m_flagCarrier
.Clear(); }
272 bool IsFlagPickedUp() const { return !m_flagCarrier
.IsEmpty(); }
273 uint8
GetFlagState() const { return m_flagState
; }
275 void RespawnDroppedFlag();
277 void RemovePlayer(Player
* plr
, ObjectGuid guid
) override
;
278 bool HandleEvent(uint32 eventId
, GameObject
* go
) override
;
279 void HandleGameObjectCreate(GameObject
* go
) override
;
280 void HandleAreaTrigger(Player
* source
, uint32 trigger
) override
;
281 void HandleKillPlayer(Player
* player
, Player
* killer
) override
;
283 virtual WorldSafeLocsEntry
const* GetClosestGraveYard(Player
* player
) override
;
284 virtual bool SetupBattleGround() override
;
285 virtual void Reset() override
;
286 void UpdateTeamScore(Team team
);
287 void EndBattleGround(Team winner
) override
;
288 void UpdatePlayerScore(Player
* source
, uint32 type
, uint32 value
) override
;
289 virtual void FillInitialWorldStates(WorldPacket
& data
, uint32
& count
) override
;
290 void SetDroppedFlagGuid(ObjectGuid guid
) { m_DroppedFlagGuid
= guid
;}
291 void ClearDroppedFlagGuid() { m_DroppedFlagGuid
.Clear();}
292 ObjectGuid
const& GetDroppedFlagGuid() const { return m_DroppedFlagGuid
;}
294 /* Battleground Events */
295 virtual void EventPlayerClickedOnFlag(Player
* source
, GameObject
* target_obj
) override
;
296 virtual void EventPlayerDroppedFlag(Player
* source
) override
;
298 /* achievement req. */
299 bool IsAllNodesControlledByTeam(Team team
) const override
;
302 // process capture events
303 void ProcessCaptureEvent(GameObject
* go
, uint32 towerId
, Team team
, uint32 newWorldState
, uint32 message
);
304 void EventPlayerCapturedFlag(Player
* source
, EYNodes node
); // NOTE: virtual BattleGround::EventPlayerCapturedFlag has different parameters list
305 void UpdateResources();
308 void AddPoints(Team team
, uint32 points
);
310 EYFlagState m_flagState
;
311 ObjectGuid m_flagCarrier
;
312 ObjectGuid m_DroppedFlagGuid
;
314 uint8 m_towersAlliance
;
317 uint32 m_towerWorldState
[EY_NODES_MAX
];
319 Team m_towerOwner
[EY_NODES_MAX
];
320 ObjectGuid m_towers
[EY_NODES_MAX
];
323 uint32 m_honorScoreTicks
[BG_TEAMS_COUNT
];
325 uint32 m_flagRespawnTimer
;
326 uint32 m_resourceUpdateTimer
;