TrinityCore
BattlefieldWG.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
21
22#include "BattlefieldWG.h"
23#include "AchievementMgr.h"
24#include "BattlefieldMgr.h"
25#include "Battleground.h"
26#include "CreatureTextMgr.h"
27#include "DB2Stores.h"
28#include "GameObject.h"
29#include "GameTime.h"
30#include "Log.h"
31#include "ObjectAccessor.h"
32#include "Player.h"
33#include "Random.h"
34#include "ScriptedCreature.h"
35#include "ScriptMgr.h"
36#include "SpellAuras.h"
37#include "TemporarySummon.h"
38#include "World.h"
39#include "WorldSession.h"
40#include "WorldStateMgr.h"
41
43{
46 uint32 TextID; // for gossip menu
48};
49
50// 7 in sql, 7 in header
52{
53 { { 5104.750f, 2300.940f, 368.579f, 0.733038f }, 1329, BATTLEFIELD_WG_GOSSIPTEXT_GY_NE, TEAM_NEUTRAL },
54 { { 5099.120f, 3466.036f, 368.484f, 5.317802f }, 1330, BATTLEFIELD_WG_GOSSIPTEXT_GY_NW, TEAM_NEUTRAL },
55 { { 4314.648f, 2408.522f, 392.642f, 6.268125f }, 1333, BATTLEFIELD_WG_GOSSIPTEXT_GY_SE, TEAM_NEUTRAL },
56 { { 4331.716f, 3235.695f, 390.251f, 0.008500f }, 1334, BATTLEFIELD_WG_GOSSIPTEXT_GY_SW, TEAM_NEUTRAL },
57 { { 5537.986f, 2897.493f, 517.057f, 4.819249f }, 1285, BATTLEFIELD_WG_GOSSIPTEXT_GY_KEEP, TEAM_NEUTRAL },
58 { { 5032.454f, 3711.382f, 372.468f, 3.971623f }, 1331, BATTLEFIELD_WG_GOSSIPTEXT_GY_HORDE, TEAM_HORDE },
59 { { 5140.790f, 2179.120f, 390.950f, 1.972220f }, 1332, BATTLEFIELD_WG_GOSSIPTEXT_GY_ALLIANCE, TEAM_ALLIANCE },
60};
61
64
65Position const WintergraspStalkerPos = { 4948.985f, 2937.789f, 550.5172f, 1.815142f };
66
67Position const WintergraspRelicPos = { 5440.379f, 2840.493f, 430.2816f, -1.832595f };
68QuaternionData const WintergraspRelicRot = { 0.f, 0.f, -0.7933531f, 0.6087617f };
69
70uint8 const WG_MAX_OBJ = 32;
75
76// *****************************************************
77// ************ Destructible (Wall, Tower..) ***********
78// *****************************************************
79
81{
87};
88
90{
91 // Wall (Not spawned in db)
92 // Entry WS X Y Z O rX rY rZ rW Type
93 { 190219, 3749, { 5371.457f, 3047.472f, 407.5710f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.00000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
94 { 190220, 3750, { 5331.264f, 3047.105f, 407.9228f, 0.05235888f }, { 0.f, 0.f, 0.026176450f, 0.99965730f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
95 { 191795, 3764, { 5385.841f, 2909.490f, 409.7127f, 0.00872424f }, { 0.f, 0.f, 0.004362106f, 0.99999050f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
96 { 191796, 3772, { 5384.452f, 2771.835f, 410.2704f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.00000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
97 { 191799, 3762, { 5371.436f, 2630.610f, 408.8163f, 3.13285800f }, { 0.f, 0.f, 0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
98 { 191800, 3766, { 5301.838f, 2909.089f, 409.8661f, 0.00872424f }, { 0.f, 0.f, 0.004362106f, 0.99999050f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
99 { 191801, 3770, { 5301.063f, 2771.411f, 409.9014f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.00000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
100 { 191802, 3751, { 5280.197f, 2995.583f, 408.8249f, 1.61442800f }, { 0.f, 0.f, 0.722363500f, 0.69151360f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
101 { 191803, 3752, { 5279.136f, 2956.023f, 408.6041f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.70710690f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
102 { 191804, 3767, { 5278.685f, 2882.513f, 409.5388f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.70710690f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
103 { 191806, 3769, { 5279.502f, 2798.945f, 409.9983f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.70710690f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
104 { 191807, 3759, { 5279.937f, 2724.766f, 409.9452f, 1.56207000f }, { 0.f, 0.f, 0.704014800f, 0.71018530f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
105 { 191808, 3760, { 5279.601f, 2683.786f, 409.8488f, 1.55334100f }, { 0.f, 0.f, 0.700908700f, 0.71325110f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
106 { 191809, 3761, { 5330.955f, 2630.777f, 409.2826f, 3.13285800f }, { 0.f, 0.f, 0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
107 { 190369, 3753, { 5256.085f, 2933.963f, 409.3571f, 3.13285800f }, { 0.f, 0.f, 0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
108 { 190370, 3758, { 5257.463f, 2747.327f, 409.7427f, -3.13285800f }, { 0.f, 0.f, -0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
109 { 190371, 3754, { 5214.960f, 2934.089f, 409.1905f, -0.00872424f }, { 0.f, 0.f, -0.004362106f, 0.99999050f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
110 { 190372, 3757, { 5215.821f, 2747.566f, 409.1884f, -3.13285800f }, { 0.f, 0.f, -0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
111 { 190374, 3755, { 5162.273f, 2883.043f, 410.2556f, 1.57952200f }, { 0.f, 0.f, 0.710185100f, 0.70401500f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
112 { 190376, 3756, { 5163.724f, 2799.838f, 409.2270f, 1.57952200f }, { 0.f, 0.f, 0.710185100f, 0.70401500f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
113
114 // Tower of keep (Not spawned in db)
115 { 190221, 3711, { 5281.154f, 3044.588f, 407.8434f, 3.115388f }, { 0.f, 0.f, 0.9999142f, 0.013101960f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // NW
116 { 190373, 3713, { 5163.757f, 2932.228f, 409.1904f, 3.124123f }, { 0.f, 0.f, 0.9999619f, 0.008734641f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // SW
117 { 190377, 3714, { 5166.397f, 2748.368f, 409.1884f, -1.570796f }, { 0.f, 0.f, -0.7071066f, 0.707106900f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // SE
118 { 190378, 3712, { 5281.192f, 2632.479f, 409.0985f, -1.588246f }, { 0.f, 0.f, -0.7132492f, 0.700910500f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // NE
119
120 // Wall (with passage) (Not spawned in db)
121 { 191797, 3765, { 5343.290f, 2908.860f, 409.5757f, 0.00872424f }, { 0.f, 0.f, 0.004362106f, 0.9999905f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
122 { 191798, 3771, { 5342.719f, 2771.386f, 409.6249f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.0000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
123 { 191805, 3768, { 5279.126f, 2840.797f, 409.7826f, 1.57952200f }, { 0.f, 0.f, 0.710185100f, 0.7040150f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
124
125 // South tower (Not spawned in db)
126 { 190356, 3704, { 4557.173f, 3623.943f, 395.8828f, 1.675516f }, { 0.f, 0.f, 0.7431450f, 0.669130400f }, BATTLEFIELD_WG_OBJECTTYPE_TOWER }, // W
127 { 190357, 3705, { 4398.172f, 2822.497f, 405.6270f, -3.124123f }, { 0.f, 0.f, -0.9999619f, 0.008734641f }, BATTLEFIELD_WG_OBJECTTYPE_TOWER }, // S
128 { 190358, 3706, { 4459.105f, 1944.326f, 434.9912f, -2.002762f }, { 0.f, 0.f, -0.8422165f, 0.539139500f }, BATTLEFIELD_WG_OBJECTTYPE_TOWER }, // E
129
130 // Door of forteress (Not spawned in db)
131 { GO_WINTERGRASP_FORTRESS_GATE, 3763, { 5162.991f, 2841.232f, 410.1892f, -3.132858f }, { 0.f, 0.f, -0.9999905f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_DOOR },
132
133 // Last door (Not spawned in db)
134 { GO_WINTERGRASP_VAULT_GATE, 3773, { 5397.108f, 2841.54f, 425.9014f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, BATTLEFIELD_WG_OBJECTTYPE_DOOR_LAST },
135};
136
138{
140
141 struct
142 {
146};
147
149{
157};
158
160{
161 { 5391.19f, 3060.8f, 419.616f, 1.69557f },
162 { 5266.75f, 2976.5f, 421.067f, 3.20354f },
163 { 5234.86f, 2948.8f, 420.88f, 1.61311f },
164 { 5323.05f, 2923.7f, 421.645f, 1.5817f },
165 { 5363.82f, 2923.87f, 421.709f, 1.60527f },
166 { 5264.04f, 2861.34f, 421.587f, 3.21142f },
167 { 5264.68f, 2819.78f, 421.656f, 3.15645f },
168 { 5322.16f, 2756.69f, 421.646f, 4.69978f },
169 { 5363.78f, 2756.77f, 421.629f, 4.78226f },
170 { 5236.2f, 2732.68f, 421.649f, 4.72336f },
171 { 5265.02f, 2704.63f, 421.7f, 3.12507f },
172 { 5350.87f, 2616.03f, 421.243f, 4.72729f },
173 { 5390.95f, 2615.5f, 421.126f, 4.6409f },
174 { 5148.8f, 2820.24f, 421.621f, 3.16043f },
175 { 5147.98f, 2861.93f, 421.63f, 3.18792f },
176};
177
179{
183};
184
186{
191};
192
194{
195 // Player teleporter
196 { { 5153.408f, 2901.349f, 409.1913f, -0.06981169f }, { 0.f, 0.f, -0.03489876f, 0.9993908f }, 190763, 191575 },
197 { { 5268.698f, 2666.421f, 409.0985f, -0.71558490f }, { 0.f, 0.f, -0.35020730f, 0.9366722f }, 190763, 191575 },
198 { { 5197.050f, 2944.814f, 409.1913f, 2.33874000f }, { 0.f, 0.f, 0.92050460f, 0.3907318f }, 190763, 191575 },
199 { { 5196.671f, 2737.345f, 409.1892f, -2.93213900f }, { 0.f, 0.f, -0.99452110f, 0.1045355f }, 190763, 191575 },
200 { { 5314.580f, 3055.852f, 408.8620f, 0.54105060f }, { 0.f, 0.f, 0.26723770f, 0.9636307f }, 190763, 191575 },
201 { { 5391.277f, 2828.094f, 418.6752f, -2.16420600f }, { 0.f, 0.f, -0.88294700f, 0.4694727f }, 190763, 191575 },
202 { { 5153.931f, 2781.671f, 409.2455f, 1.65806200f }, { 0.f, 0.f, 0.73727700f, 0.6755905f }, 190763, 191575 },
203 { { 5311.445f, 2618.931f, 409.0916f, -2.37364400f }, { 0.f, 0.f, -0.92718320f, 0.3746083f }, 190763, 191575 },
204 { { 5269.208f, 3013.838f, 408.8276f, -1.76278200f }, { 0.f, 0.f, -0.77162460f, 0.6360782f }, 190763, 191575 },
205
206 { { 5401.634f, 2853.667f, 418.6748f, 2.63544400f }, { 0.f, 0.f, 0.96814730f, 0.2503814f }, 192819, 192819 }, // return portal inside fortress, neutral
207 // Vehicle teleporter
208 { { 5314.515f, 2703.687f, 408.5502f, -0.89011660f }, { 0.f, 0.f, -0.43051050f, 0.9025856f }, 192951, 192951 },
209 { { 5316.252f, 2977.042f, 408.5385f, -0.82030330f }, { 0.f, 0.f, -0.39874840f, 0.9170604f }, 192951, 192951 }
210};
211
212// *********************************************************
213// **********Tower Element(GameObject, Creature)************
214// *********************************************************
215
217{
218 uint32 towerEntry; // Gameobject id of tower
219 std::vector<WintergraspGameObjectData> GameObject; // Gameobject position and entry (Horde/Alliance)
220
221 // Creature: Turrets and Guard /// @todo: Killed on Tower destruction ? Tower damage ? Requires confirming
222 std::vector<WintergraspObjectPositionData> CreatureBottom;
223};
224
226// 192414 : 0 in sql, 1 in header
227// 192278 : 0 in sql, 3 in header
229{
230 // West tower
231 {
232 190356,
233 {
234 { { 4559.113f, 3606.216f, 419.9992f, 4.799657f }, { 0.f, 0.f, -0.67558960f, 0.73727790f }, 192488, 192501 }, // Flag on tower
235 { { 4539.420f, 3622.490f, 420.0342f, 3.211419f }, { 0.f, 0.f, -0.99939060f, 0.03490613f }, 192488, 192501 }, // Flag on tower
236 { { 4555.258f, 3641.648f, 419.9740f, 1.675514f }, { 0.f, 0.f, 0.74314400f, 0.66913150f }, 192488, 192501 }, // Flag on tower
237 { { 4574.872f, 3625.911f, 420.0792f, 0.087266f }, { 0.f, 0.f, 0.04361916f, 0.99904820f }, 192488, 192501 }, // Flag on tower
238 { { 4433.899f, 3534.142f, 360.2750f, 4.433136f }, { 0.f, 0.f, -0.79863550f, 0.60181500f }, 192269, 192278 }, // Flag near workshop
239 { { 4572.933f, 3475.519f, 363.0090f, 1.422443f }, { 0.f, 0.f, 0.65275960f, 0.75756520f }, 192269, 192277 } // Flag near bridge
240 },
241 {
242 { { 4418.688477f, 3506.251709f, 358.975494f, 4.293305f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A } // Roaming Guard
243 }
244 },
245 // South Tower
246 {
247 190357,
248 {
249 { { 4416.004f, 2822.666f, 429.8512f, 6.2657330f }, { 0.f, 0.f, -0.00872612f, 0.99996190f }, 192488, 192501 }, // Flag on tower
250 { { 4398.819f, 2804.698f, 429.7920f, 4.6949370f }, { 0.f, 0.f, -0.71325020f, 0.70090960f }, 192488, 192501 }, // Flag on tower
251 { { 4387.622f, 2719.566f, 389.9351f, 4.7385700f }, { 0.f, 0.f, -0.69779010f, 0.71630230f }, 192366, 192414 }, // Flag near tower
252 { { 4464.124f, 2855.453f, 406.1106f, 0.8290324f }, { 0.f, 0.f, 0.40274720f, 0.91531130f }, 192366, 192429 }, // Flag near tower
253 { { 4526.457f, 2810.181f, 391.1997f, 3.2899610f }, { 0.f, 0.f, -0.99724960f, 0.07411628f }, 192269, 192278 } // Flag near bridge
254 },
255 {
256 { { 4452.859863f, 2808.870117f, 402.604004f, 6.056290f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
257 { { 4455.899902f, 2835.958008f, 401.122559f, 0.034907f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
258 { { 4412.649414f, 2953.792236f, 374.799957f, 0.980838f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Roaming Guard
259 { { 4362.089844f, 2811.510010f, 407.337006f, 3.193950f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
260 { { 4412.290039f, 2753.790039f, 401.015015f, 5.829400f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
261 { { 4421.939941f, 2773.189941f, 400.894989f, 5.707230f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A } // Standing Guard
262 }
263 },
264 // East Tower
265 {
266 190358,
267 {
268 { { 4466.793f, 1960.418f, 459.1437f, 1.151916f }, { 0.f, 0.f, 0.5446386f, 0.8386708f }, 192488, 192501 }, // Flag on tower
269 { { 4475.351f, 1937.031f, 459.0702f, 5.846854f }, { 0.f, 0.f, -0.2164392f, 0.9762961f }, 192488, 192501 }, // Flag on tower
270 { { 4451.758f, 1928.104f, 459.0759f, 4.276057f }, { 0.f, 0.f, -0.8433914f, 0.5372996f }, 192488, 192501 }, // Flag on tower
271 { { 4442.987f, 1951.898f, 459.0930f, 2.740162f }, { 0.f, 0.f, 0.9799242f, 0.1993704f }, 192488, 192501 } // Flag on tower
272 },
273 {
274 { { 4501.060059f, 1990.280029f, 431.157013f, 1.029740f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
275 { { 4463.830078f, 2015.180054f, 430.299988f, 1.431170f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
276 { { 4494.580078f, 1943.760010f, 435.627014f, 6.195920f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
277 { { 4450.149902f, 1897.579956f, 435.045013f, 4.398230f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
278 { { 4428.870117f, 1906.869995f, 432.648010f, 3.996800f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A } // Standing Guard
279 }
280 }
281};
282
284{
286 std::vector<Position> TowerCannonBottom;
287 std::vector<Position> TurretTop;
288};
289
291
293{
294 {
295 190221,
296 {
297 // no cannons at bottom
298 },
299 {
300 { 5255.88f, 3047.63f, 438.499f, 3.13677f },
301 { 5280.90f, 3071.32f, 438.499f, 1.62879f }
302 }
303 },
304 {
305 190373,
306 {
307 // no cannons at bottom
308 },
309 {
310 { 5138.59f, 2935.16f, 439.845f, 3.11723f },
311 { 5163.06f, 2959.52f, 439.846f, 1.47258f }
312 }
313 },
314 {
315 190377,
316 {
317 // no cannons at bottom
318 },
319 {
320 { 5163.84f, 2723.74f, 439.844f, 1.39940f },
321 { 5139.69f, 2747.40f, 439.844f, 3.17221f }
322 }
323 },
324 {
325 190378,
326 {
327 // no cannons at bottom
328 },
329 {
330 { 5278.21f, 2607.23f, 439.755f, 4.71944f },
331 { 5255.01f, 2631.98f, 439.755f, 3.15257f }
332 }
333 },
334 {
335 190356,
336 {
337 { 4537.380371f, 3599.531738f, 402.886993f, 3.998462f },
338 { 4581.497559f, 3604.087158f, 402.886963f, 5.651723f }
339 },
340 {
341 { 4469.448242f, 1966.623779f, 465.647217f, 1.153573f },
342 { 4581.895996f, 3626.438477f, 426.539062f, 0.117806f }
343 }
344 },
345 {
346 190357,
347 {
348 { 4421.640137f, 2799.935791f, 412.630920f, 5.459298f },
349 { 4420.263184f, 2845.340332f, 412.630951f, 0.742197f }
350 },
351 {
352 { 4423.430664f, 2822.762939f, 436.283142f, 6.223487f },
353 { 4397.825684f, 2847.629639f, 436.283325f, 1.579430f },
354 { 4398.814941f, 2797.266357f, 436.283051f, 4.703747f }
355 }
356 },
357 {
358 190358,
359 {
360 { 4448.138184f, 1974.998779f, 441.995911f, 1.967238f },
361 { 4448.713379f, 1955.148682f, 441.995178f, 0.380733f }
362 },
363 {
364 { 4469.448242f, 1966.623779f, 465.647217f, 1.153573f },
365 { 4481.996582f, 1933.658325f, 465.647186f, 5.873029f }
366 }
367 }
368};
369
370// *********************************************************
371// *****************WorkShop Data & Element*****************
372// *********************************************************
373
375{
378
379 struct
380 {
386};
387
389{
394 // KEEP WORKSHOPS - It can't be taken, so it doesn't have a textids
397};
398
400{
401 for (WintergraspWorkshop* workshop : Workshops)
402 delete workshop;
403
405 delete building;
406}
407
409{
410 m_TypeId = BATTLEFIELD_WG; // See enum BattlefieldTypes
413
415
423
426 m_StartGrouping = false;
427
429 m_tenacityStack = 0;
430
431 KickPosition.Relocate(5728.117f, 2714.346f, 697.733f, 0);
433
435
437
438 // Init Graveyards
440
441 // Load from db
444 {
445 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0, false, m_Map);
446 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_DEFENDER, urand(0, 1), false, m_Map);
448 }
449
452
454 if (m_isActive)
455 {
456 m_isActive = false;
458 }
459
462
463 for (uint8 i = 0; i < BATTLEFIELD_WG_GRAVEYARD_MAX; i++)
464 {
465 BfGraveyardWG* graveyard = new BfGraveyardWG(this);
466
467 // When between games, the graveyard is controlled by the defending team
468 if (WGGraveyard[i].StartControl == TEAM_NEUTRAL)
469 graveyard->Initialize(m_DefenderTeam, WGGraveyard[i].GraveyardID);
470 else
471 graveyard->Initialize(WGGraveyard[i].StartControl, WGGraveyard[i].GraveyardID);
472
473 graveyard->SetTextId(WGGraveyard[i].TextID);
474 m_GraveyardList[i] = graveyard;
475 }
476
478 // Spawn workshop creatures and gameobjects
479 for (uint8 i = 0; i < WG_MAX_WORKSHOP; i++)
480 {
481 WintergraspWorkshop* workshop = new WintergraspWorkshop(this, i);
483 workshop->GiveControlTo(GetAttackerTeam(), true);
484 else
485 workshop->GiveControlTo(GetDefenderTeam(), true);
486
487 // Note: Capture point is added once the gameobject is created.
488 Workshops[i] = workshop;
489 }
490
491 // Spawn turrets and hide them per default
492 for (uint8 i = 0; i < WG_MAX_TURRET; i++)
493 {
494 Position towerCannonPos = WGTurret[i].GetPosition();
495 if (Creature* creature = SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos))
496 {
497 CanonList.push_back(creature->GetGUID());
498 HideNpc(creature);
499 }
500 }
501
503 // Spawn all gameobjects
504 for (uint8 i = 0; i < WG_MAX_OBJ; i++)
505 {
507 {
509 b->Init(go);
510 if (!IsEnabled() && go->GetEntry() == GO_WINTERGRASP_VAULT_GATE)
511 go->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
512
513 BuildingsInZone[i] = b;
514 }
515 }
516
517 // Spawning portal defender
518 for (uint8 i = 0; i < WG_MAX_TELEPORTER; ++i)
519 {
520 WintergraspGameObjectData const& teleporter = WGPortalDefenderData[i];
521 if (GameObject* go = SpawnGameObject(teleporter.AllianceEntry, teleporter.Pos, teleporter.Rot))
522 {
523 DefenderPortalList[TEAM_ALLIANCE].push_back(go->GetGUID());
525 }
526
527 if (GameObject* go = SpawnGameObject(teleporter.HordeEntry, teleporter.Pos, teleporter.Rot))
528 {
529 DefenderPortalList[TEAM_HORDE].push_back(go->GetGUID());
531 }
532 }
533
535 return true;
536}
537
539{
540 // Spawn titan relic
542 {
543 // Update faction of relic, only attacker can click on
544 relic->SetFaction(WintergraspFaction[GetAttackerTeam()]);
545 // Set in use (not allow to click on before last door is broken)
546 relic->SetFlag(GO_FLAG_IN_USE | GO_FLAG_NOT_SELECTABLE);
547 m_titansRelicGUID = relic->GetGUID();
548 }
549 else
550 TC_LOG_ERROR("bg.battlefield", "WG: Failed to spawn titan relic.");
551
553 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam(), false, m_Map);
554 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 0, false, m_Map);
557
558 // Update tower visibility and update faction
559 for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
560 {
561 if (Creature* creature = GetCreature(*itr))
562 {
563 ShowNpc(creature, true);
564 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
565 }
566 }
567
568 // Rebuild all wall
570 {
571 building->Rebuild();
572 building->UpdateTurretAttack(false);
573 }
574
579
580 // Update graveyard (in no war time all graveyard is to deffender, in war time, depend of base)
581 for (WintergraspWorkshop* workshop : Workshops)
582 workshop->UpdateGraveyardAndWorkshop();
583
584 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
585 {
586 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
587 {
588 // Kick player in orb room, TODO: offline player ?
589 if (Player* player = ObjectAccessor::FindPlayer(*itr))
590 {
591 float x, y, z;
592 player->GetPosition(x, y, z);
593 if (5500 > x && x > 5392 && y < 2880 && y > 2800 && z < 480)
594 player->TeleportTo(571, 5349.8686f, 2838.481f, 409.240f, 0.046328f);
595 }
596 }
597 }
598
599 // Initialize vehicle counter
601 // Send start warning to all players
603}
604
606{
607 if (init)
608 {
611 }
614
615 for (WintergraspWorkshop* workshop : Workshops)
616 {
617 if (workshop->GetTeamControl() == TEAM_ALLIANCE)
619 else if (workshop->GetTeamControl() == TEAM_HORDE)
621 }
622
624}
625
626void BattlefieldWG::OnBattleEnd(bool endByTimer)
627{
628 // Remove relic
631 relic->RemoveFromWorld();
633
634 // change collision wall state closed
636 {
637 building->RebuildGate();
638 }
639
640 // update win statistics
641 {
642 int32 worldStateId;
643 // successful defense
644 if (endByTimer)
646 // successful attack (note that teams have already been swapped, so defender team is the one who won)
647 else
649
650 sWorldStateMgr->SetValueAndSaveInDb(worldStateId, sWorldStateMgr->GetValue(worldStateId, m_Map) + 1, false, m_Map);
651 }
652
653 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_DEFENDER, GetDefenderTeam(), false, m_Map);
654 sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE, 1, false, m_Map);
657
658 // Remove turret
659 for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
660 {
661 if (Creature* creature = GetCreature(*itr))
662 {
663 if (!endByTimer)
664 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
665 HideNpc(creature);
666 }
667 }
668
669 // Update all graveyard, control is to defender when no wartime
670 for (uint8 i = 0; i < BATTLEFIELD_WG_GY_HORDE; i++)
671 if (BfGraveyard* graveyard = GetGraveyardById(i))
672 graveyard->GiveControlTo(GetDefenderTeam());
673
674 // Update portals
675 for (auto itr = DefenderPortalList[GetDefenderTeam()].begin(); itr != DefenderPortalList[GetDefenderTeam()].end(); ++itr)
676 if (GameObject* portal = GetGameObject(*itr))
677 portal->SetRespawnTime(RESPAWN_IMMEDIATELY);
678
679 for (auto itr = DefenderPortalList[GetAttackerTeam()].begin(); itr != DefenderPortalList[GetAttackerTeam()].end(); ++itr)
680 if (GameObject* portal = GetGameObject(*itr))
681 portal->SetRespawnTime(RESPAWN_ONE_DAY);
682
683 for (auto itr = m_PlayersInWar[GetDefenderTeam()].begin(); itr != m_PlayersInWar[GetDefenderTeam()].end(); ++itr)
684 {
685 if (Player* player = ObjectAccessor::FindPlayer(*itr))
686 {
687 player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
688 player->CastSpell(player, SPELL_VICTORY_REWARD, true);
689 // Complete victory quests
690 player->AreaExploredOrEventHappens(QUEST_VICTORY_WINTERGRASP_A);
691 player->AreaExploredOrEventHappens(QUEST_VICTORY_WINTERGRASP_H);
692 // Send Wintergrasp victory achievement
694 // Award achievement for succeeding in Wintergrasp in 10 minutes or less
695 if (!endByTimer && GetTimer() <= 10000)
697 }
698 }
699
700 for (auto itr = m_PlayersInWar[GetAttackerTeam()].begin(); itr != m_PlayersInWar[GetAttackerTeam()].end(); ++itr)
701 if (Player* player = ObjectAccessor::FindPlayer(*itr))
702 player->CastSpell(player, SPELL_DEFEAT_REWARD, true);
703
704 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
705 {
706 for (auto itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr)
707 if (Player* player = ObjectAccessor::FindPlayer(*itr))
708 RemoveAurasFromPlayer(player);
709
710 m_PlayersInWar[team].clear();
711
712 for (auto itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
713 if (Creature* creature = GetCreature(*itr))
714 if (creature->IsVehicle())
715 creature->DespawnOrUnsummon();
716
717 m_vehicles[team].clear();
718 }
719
720 if (!endByTimer)
721 {
722 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
723 {
724 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
725 {
726 if (Player* player = ObjectAccessor::FindPlayer(*itr))
727 {
728 player->RemoveAurasDueToSpell(m_DefenderTeam == TEAM_ALLIANCE ? SPELL_HORDE_CONTROL_PHASE_SHIFT : SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, player->GetGUID());
730 }
731 }
732 }
733 }
734
735 if (!endByTimer) // win alli/horde
737 else // defend alli/horde
739}
740
741// *******************************************************
742// ******************* Reward System *********************
743// *******************************************************
744void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 /*incrementNumber*/)
745{
746 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievement);
747
748 if (!achievementEntry)
749 return;
750
751 switch (achievement)
752 {
754 {
755 // player->UpdateCriteria();
756 break;
757 }
758 default:
759 {
760 if (player)
761 player->CompletedAchievement(achievementEntry);
762 break;
763 }
764 }
765
766}
767
769{
771}
772
774{
775 switch (areaId)
776 {
787 case AREA_WINTERGRASP:
791 default:
792 TC_LOG_ERROR("bg.battlefield", "BattlefieldWG::GetSpiritGraveyardId: Unexpected Area Id {}", areaId);
793 break;
794 }
795
796 return 0;
797}
798
800{
801 // Accessing to db spawned creatures
802 switch (creature->GetEntry())
803 {
806 {
808 uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId());
809 if (m_GraveyardList[graveyardId])
810 m_GraveyardList[graveyardId]->SetSpirit(creature, teamId);
811 break;
812 }
813 }
814
815 // untested code - not sure if it is valid.
816 if (IsWarTime())
817 {
818 switch (creature->GetEntry())
819 {
824 {
825 if (!creature->ToTempSummon() || !creature->ToTempSummon()->GetSummonerGUID() || !ObjectAccessor::FindPlayer(creature->ToTempSummon()->GetSummonerGUID()))
826 {
827 creature->DespawnOrUnsummon();
828 return;
829 }
830
832 TeamId team = creator->GetTeamId();
833
834 if (team == TEAM_HORDE)
835 {
837 {
839 creature->AddAura(SPELL_HORDE_FLAG, creature);
840 m_vehicles[team].insert(creature->GetGUID());
842 }
843 else
844 {
845 creature->DespawnOrUnsummon();
846 return;
847 }
848 }
849 else
850 {
852 {
854 creature->AddAura(SPELL_ALLIANCE_FLAG, creature);
855 m_vehicles[team].insert(creature->GetGUID());
857 }
858 else
859 {
860 creature->DespawnOrUnsummon();
861 return;
862 }
863 }
864
865 creature->CastSpell(creator, SPELL_GRAB_PASSENGER, true);
866 break;
867 }
868 }
869 }
870}
871
873{
874/* possibly can be used later
875 if (IsWarTime())
876 {
877 switch (creature->GetEntry())
878 {
879 case NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE:
880 case NPC_WINTERGRASP_SIEGE_ENGINE_HORDE:
881 case NPC_WINTERGRASP_CATAPULT:
882 case NPC_WINTERGRASP_DEMOLISHER:
883 {
884 uint8 team;
885 if (creature->GetFaction() == WintergraspFaction[TEAM_ALLIANCE])
886 team = TEAM_ALLIANCE;
887 else if (creature->GetFaction() == WintergraspFaction[TEAM_HORDE])
888 team = TEAM_HORDE;
889 else
890 return;
891
892 m_vehicles[team].erase(creature->GetGUID());
893 if (team == TEAM_HORDE)
894 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_H, -1);
895 else
896 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_A, -1);
897 UpdateVehicleCountWG();
898
899 break;
900 }
901 }
902 }*/
903}
904
906{
907 uint8 workshopId = 0;
908
909 switch (go->GetEntry())
910 {
912 workshopId = BATTLEFIELD_WG_WORKSHOP_NE;
913 break;
915 workshopId = BATTLEFIELD_WG_WORKSHOP_NW;
916 break;
918 workshopId = BATTLEFIELD_WG_WORKSHOP_SE;
919 break;
921 workshopId = BATTLEFIELD_WG_WORKSHOP_SW;
922 break;
923 default:
924 return;
925 }
926
927 for (WintergraspWorkshop* workshop : Workshops)
928 {
929 if (workshop->GetId() == workshopId)
930 {
931 ControlZoneHandlers[go->GetEntry()] = std::make_unique<WintergraspCapturePoint>(this, workshop);
933 {
934 //go->SetGoArtKit(); // todo set art kit
936 }
937 else if (GetAttackerTeam() == TEAM_HORDE)
938 {
939 //go->SetGoArtKit(); // todo set art kit
941 }
942
943 break;
944 }
945 }
946}
947
948// Called when player kill a unit in wg zone
950{
951 if (killer == victim)
952 return;
953
954 if (victim->GetTypeId() == TYPEID_PLAYER)
955 {
956 HandlePromotion(killer, victim);
957
958 // Allow to Skin non-released corpse
960 }
961
963}
964
966{
967 for (uint32 team = 0; team < PVP_TEAMS_COUNT; ++team)
968 {
969 auto itr = m_vehicles[team].find(vehicle->GetGUID());
970 if (itr != m_vehicles[team].end())
971 {
972 m_vehicles[team].erase(itr);
973
974 if (team == TEAM_HORDE)
976 else
978 return true;
979 }
980 }
981
982 return false;
983}
984
986{
987 if (IsWarTime())
988 if (unit->IsVehicle())
991}
992
993void BattlefieldWG::HandlePromotion(Player* playerKiller, Unit* unitKilled)
994{
995 uint32 teamId = playerKiller->GetTeamId();
996
997 for (auto iter = m_PlayersInWar[teamId].begin(); iter != m_PlayersInWar[teamId].end(); ++iter)
998 if (Player* player = ObjectAccessor::FindPlayer(*iter))
999 if (player->GetDistance2d(unitKilled) < 40.0f)
1000 PromotePlayer(player);
1001}
1002
1003// Update rank for player
1005{
1006 if (!m_isActive)
1007 return;
1008 // Updating rank of player
1009 if (Aura* auraRecruit = killer->GetAura(SPELL_RECRUIT))
1010 {
1011 if (auraRecruit->GetStackAmount() >= 5)
1012 {
1013 killer->RemoveAura(SPELL_RECRUIT);
1014 killer->CastSpell(killer, SPELL_CORPORAL, true);
1015 if (Creature* stalker = GetCreature(StalkerGuid))
1017 }
1018 else
1019 killer->CastSpell(killer, SPELL_RECRUIT, true);
1020 }
1021 else if (Aura* auraCorporal = killer->GetAura(SPELL_CORPORAL))
1022 {
1023 if (auraCorporal->GetStackAmount() >= 5)
1024 {
1025 killer->RemoveAura(SPELL_CORPORAL);
1026 killer->CastSpell(killer, SPELL_LIEUTENANT, true);
1027 if (Creature* stalker = GetCreature(StalkerGuid))
1029 }
1030 else
1031 killer->CastSpell(killer, SPELL_CORPORAL, true);
1032 }
1033}
1034
1036{
1045}
1046
1048{
1049 RemoveAurasFromPlayer(player);
1050
1051 player->CastSpell(player, SPELL_RECRUIT, true);
1052
1053 if (player->GetZoneId() != m_ZoneId)
1054 {
1055 if (player->GetTeamId() == GetDefenderTeam())
1056 player->TeleportTo(571, 5345, 2842, 410, 3.14f);
1057 else
1058 {
1059 if (player->GetTeamId() == TEAM_HORDE)
1060 player->TeleportTo(571, 5025.857422f, 3674.628906f, 362.737122f, 4.135169f);
1061 else
1062 player->TeleportTo(571, 5101.284f, 2186.564f, 373.549f, 3.812f);
1063 }
1064 }
1065
1067
1068 if (player->GetTeamId() == GetAttackerTeam())
1069 {
1072 }
1073 else
1074 {
1077 }
1078}
1079
1081{
1082 // 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
1083 if (!player->GetSession()->PlayerLogout())
1084 {
1085 if (Creature* vehicle = player->GetVehicleCreatureBase()) // Remove vehicle of player if he go out.
1086 vehicle->DespawnOrUnsummon();
1087
1088 RemoveAurasFromPlayer(player);
1089 }
1090
1096}
1097
1099{
1100 if (!m_isActive)
1101 RemoveAurasFromPlayer(player);
1102
1107}
1108
1110{
1111 if (!m_isActive)
1112 RemoveAurasFromPlayer(player);
1113
1115}
1116
1118{
1119 switch (data)
1120 {
1121 // Used to determine when the phasing spells must be cast
1122 // See: SpellArea::IsFitToRequirements
1127 // Graveyards and Workshops are controlled by the same team.
1128 if (BfGraveyard const* graveyard = GetGraveyardById(GetSpiritGraveyardId(data)))
1129 return graveyard->GetControlTeamId();
1130 break;
1131 default:
1132 break;
1133 }
1134
1135 return Battlefield::GetData(data);
1136}
1137
1139{
1140 if (team == GetDefenderTeam())
1141 {
1142 for (auto itr = m_PlayersInWar[GetAttackerTeam()].begin(); itr != m_PlayersInWar[GetAttackerTeam()].end(); ++itr)
1143 {
1144 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1145 if (player->GetDistance2d(ASSERT_NOTNULL(GetGameObject(building->GetGUID()))) < 50.0f)
1146 player->KilledMonsterCredit(QUEST_CREDIT_DEFEND_SIEGE);
1147 }
1148 }
1149}
1150
1151// Called when a tower is broke
1153{
1154 // Southern tower
1155 if (team == GetAttackerTeam())
1156 {
1157 // Update counter
1160
1161 // Remove buff stack on attackers
1162 for (auto itr = m_PlayersInWar[GetAttackerTeam()].begin(); itr != m_PlayersInWar[GetAttackerTeam()].end(); ++itr)
1163 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1164 player->RemoveAuraFromStack(SPELL_TOWER_CONTROL);
1165
1166 // Add buff stack to defenders and give achievement/quest credit
1167 for (auto itr = m_PlayersInWar[GetDefenderTeam()].begin(); itr != m_PlayersInWar[GetDefenderTeam()].end(); ++itr)
1168 {
1169 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1170 {
1171 player->CastSpell(player, SPELL_TOWER_CONTROL, true);
1172 player->KilledMonsterCredit(QUEST_CREDIT_TOWERS_DESTROYED);
1174 }
1175 }
1176
1177 // If all three south towers are destroyed (ie. all attack towers), remove ten minutes from battle time
1179 {
1180 if (int32(m_Timer - 600000) < 0)
1181 m_Timer = 0;
1182 else
1183 m_Timer -= 600000;
1184
1186 }
1187 }
1188 else // Keep tower
1189 {
1192 }
1193}
1194
1196{
1197 Battlefield::ProcessEvent(obj, eventId, invoker);
1198 if (!obj || !IsWarTime())
1199 return;
1200
1201 // We handle only gameobjects here
1202 GameObject* go = obj->ToGameObject();
1203 if (!go)
1204 return;
1205
1206 // On click on titan relic
1208 {
1210 EndBattle(false);
1211 else if (GameObject* relic = GetRelic())
1212 relic->SetRespawnTime(RESPAWN_IMMEDIATELY);
1213 }
1214
1215 // if destroy or damage event, search the wall/tower and update worldstate/send warning message
1216 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1217 {
1218 if (go->GetGUID() == building->GetGUID())
1219 {
1220 if (GameObject* buildingGo = GetGameObject(building->GetGUID()))
1221 {
1222 if (buildingGo->GetGOInfo()->destructibleBuilding.DamagedEvent == eventId)
1223 building->Damaged();
1224 else if (buildingGo->GetGOInfo()->destructibleBuilding.DestroyedEvent == eventId)
1225 building->Destroyed();
1226 break;
1227 }
1228 }
1229 }
1230}
1231
1232// Called when a tower is damaged, used for honor reward calcul
1234{
1235 if (team == GetAttackerTeam())
1237 else
1239}
1240
1241// Update vehicle count WorldState to player
1243{
1248}
1249
1251{
1252 uint32 alliancePlayers = m_PlayersInWar[TEAM_ALLIANCE].size();
1253 uint32 hordePlayers = m_PlayersInWar[TEAM_HORDE].size();
1254 int32 newStack = 0;
1255
1256 if (alliancePlayers && hordePlayers)
1257 {
1258 if (alliancePlayers < hordePlayers)
1259 newStack = int32((float(hordePlayers / alliancePlayers) - 1) * 4); // positive, should cast on alliance
1260 else if (alliancePlayers > hordePlayers)
1261 newStack = int32((1 - float(alliancePlayers / hordePlayers)) * 4); // negative, should cast on horde
1262 }
1263
1264 if (newStack == int32(m_tenacityStack))
1265 return;
1266
1267 m_tenacityStack = newStack;
1268 // Remove old buff
1270 {
1271 for (auto itr = m_players[m_tenacityTeam].begin(); itr != m_players[m_tenacityTeam].end(); ++itr)
1272 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1273 if (player->GetLevel() >= m_MinLevel)
1274 player->RemoveAurasDueToSpell(SPELL_TENACITY);
1275
1276 for (auto itr = m_vehicles[m_tenacityTeam].begin(); itr != m_vehicles[m_tenacityTeam].end(); ++itr)
1277 if (Creature* creature = GetCreature(*itr))
1278 creature->RemoveAurasDueToSpell(SPELL_TENACITY_VEHICLE);
1279 }
1280
1281 // Apply new buff
1282 if (newStack)
1283 {
1284 m_tenacityTeam = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE;
1285
1286 if (newStack < 0)
1287 newStack = -newStack;
1288 if (newStack > 20)
1289 newStack = 20;
1290
1291 uint32 buff_honor = SPELL_GREATEST_HONOR;
1292 if (newStack < 15)
1293 buff_honor = SPELL_GREATER_HONOR;
1294 if (newStack < 10)
1295 buff_honor = SPELL_GREAT_HONOR;
1296 if (newStack < 5)
1297 buff_honor = 0;
1298
1299 for (auto itr = m_PlayersInWar[m_tenacityTeam].begin(); itr != m_PlayersInWar[m_tenacityTeam].end(); ++itr)
1300 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1301 player->SetAuraStack(SPELL_TENACITY, player, newStack);
1302
1303 for (auto itr = m_vehicles[m_tenacityTeam].begin(); itr != m_vehicles[m_tenacityTeam].end(); ++itr)
1304 if (Creature* creature = GetCreature(*itr))
1305 creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, newStack);
1306
1307 if (buff_honor != 0)
1308 {
1309 for (auto itr = m_PlayersInWar[m_tenacityTeam].begin(); itr != m_PlayersInWar[m_tenacityTeam].end(); ++itr)
1310 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1311 player->CastSpell(player, buff_honor, true);
1312
1313 for (auto itr = m_vehicles[m_tenacityTeam].begin(); itr != m_vehicles[m_tenacityTeam].end(); ++itr)
1314 if (Creature* creature = GetCreature(*itr))
1315 creature->CastSpell(creature, buff_honor, true);
1316 }
1317 }
1318 else
1320}
1321
1323{
1324}
1325
1327{
1331}
1332
1334{
1338}
1339
1341{
1344}
1345
1347{
1350}
1351
1353{
1354 m_Bf = battlefield;
1355 m_GossipTextId = 0;
1356}
1357
1359{
1360 ASSERT(wg);
1361
1362 _wg = wg;
1364 _type = type;
1365 _worldState = worldState;
1367 _staticTowerInfo = nullptr;
1368}
1369
1371{
1372 switch (_type)
1373 {
1378 _teamControl = _wg->GetDefenderTeam(); // Objects that are part of the keep should be the defender's
1379 break;
1381 _teamControl = _wg->GetAttackerTeam(); // The towers in the south should be the attacker's
1382 break;
1383 default:
1385 break;
1386 }
1387
1388 if (GameObject* build = _wg->GetGameObject(_buildGUID))
1389 {
1390 // Rebuild gameobject
1391 if (build->IsDestructibleBuilding())
1392 {
1393 build->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, nullptr, true);
1394 if (build->GetEntry() == GO_WINTERGRASP_VAULT_GATE)
1396 go->SetGoState(GO_STATE_ACTIVE);
1397
1398 // Update worldstate
1400 sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
1401 }
1403 build->SetFaction(WintergraspFaction[_teamControl]);
1404 }
1405}
1406
1408{
1409 if (GameObject* build = _wg->GetGameObject(_buildGUID))
1410 {
1411 if (build->IsDestructibleBuilding() && build->GetEntry() == GO_WINTERGRASP_VAULT_GATE)
1412 {
1414 go->SetGoState(GO_STATE_READY); //not GO_STATE_ACTIVE
1415 }
1416 }
1417}
1418
1420{
1421 // Update worldstate
1423 sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
1424
1425 // Send warning message
1426 if (_staticTowerInfo)
1428
1430 if (Creature* creature = _wg->GetCreature(guid))
1431 _wg->HideNpc(creature);
1432
1433 for (ObjectGuid guid : m_TurretTopList)
1434 if (Creature* creature = _wg->GetCreature(guid))
1435 _wg->HideNpc(creature);
1436
1441}
1442
1444{
1445 // Update worldstate
1447 sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
1448
1449 // Warn players
1450 if (_staticTowerInfo)
1452
1453 switch (_type)
1454 {
1455 // Inform the global wintergrasp script of the destruction of this object
1459 break;
1461 if (GameObject* build = _wg->GetGameObject(_buildGUID))
1463 go->SetGoState(GO_STATE_ACTIVE);
1465 if (_wg->GetRelic())
1467 else
1468 TC_LOG_ERROR("bg.battlefield.wg", "Titan Relic not found.");
1469 break;
1470 default:
1471 break;
1472 }
1473
1475}
1476
1478{
1479 if (!go)
1480 return;
1481
1482 // GameObject associated to object
1483 _buildGUID = go->GetGUID();
1484
1485 switch (_type)
1486 {
1491 _teamControl = _wg->GetDefenderTeam(); // Objects that are part of the keep should be the defender's
1492 break;
1494 _teamControl = _wg->GetAttackerTeam(); // The towers in the south should be the attacker's
1495 break;
1496 default:
1498 break;
1499 }
1500
1503 {
1504 // set to default state based on type
1505 switch (_teamControl)
1506 {
1507 case TEAM_ALLIANCE:
1509 break;
1510 case TEAM_HORDE:
1512 break;
1513 case TEAM_NEUTRAL:
1515 break;
1516 default:
1517 break;
1518 }
1519 sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
1520 }
1521
1522 switch (_state)
1523 {
1528 break;
1533 break;
1538 break;
1539 default:
1540 break;
1541 }
1542
1543 int32 towerId = -1;
1544 switch (go->GetEntry())
1545 {
1548 break;
1551 break;
1554 break;
1557 break;
1560 break;
1563 break;
1566 break;
1567 }
1568
1569 if (towerId >= BATTLEFIELD_WG_TOWER_SHADOWSIGHT) // Attacker towers
1570 {
1571 // Spawn associate gameobjects
1572 for (WintergraspGameObjectData const& gobData : AttackTowers[towerId - 4].GameObject)
1573 {
1574 if (GameObject* goHorde = _wg->SpawnGameObject(gobData.HordeEntry, gobData.Pos, gobData.Rot))
1575 m_GameObjectList[TEAM_HORDE].push_back(goHorde->GetGUID());
1576
1577 if (GameObject* goAlliance = _wg->SpawnGameObject(gobData.AllianceEntry, gobData.Pos, gobData.Rot))
1578 m_GameObjectList[TEAM_ALLIANCE].push_back(goAlliance->GetGUID());
1579 }
1580
1581 // Spawn associate npc bottom
1582 for (WintergraspObjectPositionData const& creatureData : AttackTowers[towerId - 4].CreatureBottom)
1583 {
1584 if (Creature* creature = _wg->SpawnCreature(creatureData.HordeEntry, creatureData.Pos))
1585 m_CreatureBottomList[TEAM_HORDE].push_back(creature->GetGUID());
1586
1587 if (Creature* creature = _wg->SpawnCreature(creatureData.AllianceEntry, creatureData.Pos))
1588 m_CreatureBottomList[TEAM_ALLIANCE].push_back(creature->GetGUID());
1589 }
1590 }
1591
1592 if (towerId >= 0)
1593 {
1594 ASSERT(towerId < WG_MAX_TOWER);
1595 _staticTowerInfo = &TowerData[towerId];
1596
1597 // Spawn Turret bottom
1598 for (Position const& turretPos : TowerCannon[towerId].TowerCannonBottom)
1599 {
1600 if (Creature* turret = _wg->SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, turretPos))
1601 {
1602 m_TowerCannonBottomList.push_back(turret->GetGUID());
1603 switch (go->GetEntry())
1604 {
1609 turret->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1610 break;
1614 turret->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1615 break;
1616 }
1617
1618 _wg->HideNpc(turret);
1619 }
1620 }
1621
1622 // Spawn Turret top
1623 for (Position const& towerCannonPos : TowerCannon[towerId].TurretTop)
1624 {
1625 if (Creature* turret = _wg->SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos))
1626 {
1627 m_TurretTopList.push_back(turret->GetGUID());
1628 switch (go->GetEntry())
1629 {
1634 turret->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1635 break;
1639 turret->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1640 break;
1641 }
1642 _wg->HideNpc(turret);
1643 }
1644 }
1646 }
1647}
1648
1650{
1652 if (Creature* creature = _wg->GetCreature(guid))
1653 _wg->HideNpc(creature);
1654
1656 if (Creature* creature = _wg->GetCreature(guid))
1657 _wg->ShowNpc(creature, true);
1658
1660 if (Creature* creature = _wg->GetCreature(guid))
1661 _wg->HideNpc(creature);
1662
1664 if (Creature* creature = _wg->GetCreature(guid))
1665 _wg->ShowNpc(creature, true);
1666
1668 if (GameObject* go = _wg->GetGameObject(guid))
1669 go->SetRespawnTime(RESPAWN_ONE_DAY);
1670
1672 if (GameObject* go = _wg->GetGameObject(guid))
1673 go->SetRespawnTime(RESPAWN_IMMEDIATELY);
1674}
1675
1677{
1679 {
1680 if (Creature* creature = _wg->GetCreature(guid))
1681 {
1682 if (disable)
1683 _wg->HideNpc(creature);
1684 else
1685 _wg->ShowNpc(creature, true);
1686
1687 switch (_buildGUID.GetEntry())
1688 {
1693 {
1694 creature->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1695 break;
1696 }
1700 {
1701 creature->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1702 break;
1703 }
1704 }
1705 }
1706 }
1707
1708 for (ObjectGuid guid : m_TurretTopList)
1709 {
1710 if (Creature* creature = _wg->GetCreature(guid))
1711 {
1712 if (disable)
1713 _wg->HideNpc(creature);
1714 else
1715 _wg->ShowNpc(creature, true);
1716
1717 switch (_buildGUID.GetEntry())
1718 {
1723 {
1724 creature->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1725 break;
1726 }
1730 {
1731 creature->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1732 break;
1733 }
1734 }
1735 }
1736 }
1737}
1738
1740{
1741 ASSERT(wg && type < WG_MAX_WORKSHOP);
1742
1743 _wg = wg;
1746 _staticInfo = &WorkshopData[type];
1747}
1748
1750{
1751 return _staticInfo->WorkshopId;
1752}
1753
1754void WintergraspWorkshop::GiveControlTo(TeamId teamId, bool init /*= false*/)
1755{
1756 switch (teamId)
1757 {
1758 case TEAM_NEUTRAL:
1759 {
1760 // Send warning message to all player for inform a faction attack a workshop
1761 // alliance / horde attacking workshop
1763 break;
1764 }
1765 case TEAM_ALLIANCE:
1766 {
1767 // Updating worldstate
1769 sWorldStateMgr->SetValueAndSaveInDb(_staticInfo->WorldStateId, _state, false, _wg->GetMap());
1770
1771 // Warning message
1772 if (!init)
1773 _wg->SendWarning(_staticInfo->TextIds.AllianceCapture); // workshop taken - alliance
1774
1775 // Found associate graveyard and update it
1778 gy->GiveControlTo(TEAM_ALLIANCE);
1779
1780 _teamControl = teamId;
1781 break;
1782 }
1783 case TEAM_HORDE:
1784 {
1785 // Update worldstate
1787 sWorldStateMgr->SetValueAndSaveInDb(_staticInfo->WorldStateId, _state, false, _wg->GetMap());
1788
1789 // Warning message
1790 if (!init)
1791 _wg->SendWarning(_staticInfo->TextIds.HordeCapture); // workshop taken - horde
1792
1793 // Update graveyard control
1796 gy->GiveControlTo(TEAM_HORDE);
1797
1798 _teamControl = teamId;
1799 break;
1800 }
1801 }
1802 if (!init)
1803 _wg->UpdateCounterVehicle(false);
1804}
1805
1807{
1810 else
1812}
1813
1815{
1816public:
1818
1819 Battlefield* GetBattlefield(Map* map) const override
1820 {
1821 return new BattlefieldWG(map);
1822 }
1823};
1824
1826{
1827public:
1828 npc_wg_give_promotion_credit() : CreatureScript("npc_wg_give_promotion_credit") { }
1829
1831 {
1833
1834 void JustDied(Unit* killer) override
1835 {
1836 if (!killer || killer->GetTypeId() != TYPEID_PLAYER)
1837 return;
1838
1839 BattlefieldWG* wintergrasp = static_cast<BattlefieldWG*>(sBattlefieldMgr->GetBattlefieldByBattleId(killer->GetMap(), BATTLEFIELD_BATTLEID_WG));
1840 if (!wintergrasp)
1841 return;
1842
1843 wintergrasp->HandlePromotion(killer->ToPlayer(), me);
1844 }
1845 };
1846
1847 CreatureAI* GetAI(Creature* creature) const override
1848 {
1849 return new npc_wg_give_promotion_creditAI(creature);
1850 }
1851};
1852
1854{
1857}
#define sBattlefieldMgr
void AddSC_BF_wintergrasp()
uint8 const WG_MAX_TOWER
WintergraspGameObjectData const WGPortalDefenderData[WG_MAX_TELEPORTER]
WintergraspTowerData const AttackTowers[WG_MAX_ATTACKTOWERS]
Position const WintergraspStalkerPos
Position const WintergraspRelicPos
WintergraspTowerCannonData const TowerCannon[WG_MAX_TOWER_CANNON]
QuaternionData const WintergraspRelicRot
uint8 const WG_MAX_TURRET
StaticWintergraspTowerInfo const TowerData[WG_MAX_TOWER]
uint32 const ClockWorldState[]
uint32 const WintergraspFaction[]
uint8 const WG_MAX_ATTACKTOWERS
uint8 const WG_MAX_TOWER_CANNON
uint8 const WG_MAX_OBJ
uint8 const WG_MAX_TELEPORTER
BfWGCoordGY const WGGraveyard[BATTLEFIELD_WG_GRAVEYARD_MAX]
Position const WGTurret[WG_MAX_TURRET]
uint8 const WG_MAX_WORKSHOP
StaticWintergraspWorkshopInfo const WorkshopData[WG_MAX_WORKSHOP]
WintergraspBuildingSpawnData const WGGameObjectBuilding[WG_MAX_OBJ]
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_HORDE
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_SW
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_SE
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_NE
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_NW
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_ALLIANCE
@ BATTLEFIELD_WG_GOSSIPTEXT_GY_KEEP
WintergraspGameObjectBuildingType
@ BATTLEFIELD_WG_OBJECTTYPE_DOOR
@ BATTLEFIELD_WG_OBJECTTYPE_TOWER
@ BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER
@ BATTLEFIELD_WG_OBJECTTYPE_WALL
@ BATTLEFIELD_WG_OBJECTTYPE_DOOR_LAST
@ NPC_WINTERGRASP_SIEGE_ENGINE_HORDE
@ NPC_WINTERGRASP_CATAPULT
@ NPC_WINTERGRASP_DEMOLISHER
@ NPC_WINTERGRASP_TOWER_CANNON
@ BATTLEFIELD_WG_NPC_GUARD_H
@ NPC_DWARVEN_SPIRIT_GUIDE
@ NPC_TAUNKA_SPIRIT_GUIDE
@ BATTLEFIELD_WG_NPC_STALKER
@ BATTLEFIELD_WG_NPC_GUARD_A
@ NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE
@ BATTLEFIELD_WG_TOWER_WINTER_S_EDGE
@ BATTLEFIELD_WG_TOWER_SHADOWSIGHT
@ BATTLEFIELD_WG_TOWER_FORTRESS_SE
@ BATTLEFIELD_WG_TOWER_FORTRESS_NW
@ BATTLEFIELD_WG_TOWER_FLAMEWATCH
@ BATTLEFIELD_WG_TOWER_FORTRESS_NE
@ BATTLEFIELD_WG_TOWER_FORTRESS_SW
@ SPELL_HORDE_FLAG
Definition: BattlefieldWG.h:50
@ SPELL_GREATEST_HONOR
Definition: BattlefieldWG.h:48
@ SPELL_ESSENCE_OF_WINTERGRASP
Definition: BattlefieldWG.h:69
@ SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA
Definition: BattlefieldWG.h:70
@ SPELL_RECRUIT
Definition: BattlefieldWG.h:39
@ SPELL_TENACITY
Definition: BattlefieldWG.h:42
@ SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT
Definition: BattlefieldWG.h:74
@ SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT
Definition: BattlefieldWG.h:73
@ SPELL_GRAB_PASSENGER
Definition: BattlefieldWG.h:51
@ SPELL_VICTORY_REWARD
Definition: BattlefieldWG.h:54
@ SPELL_CORPORAL
Definition: BattlefieldWG.h:40
@ SPELL_GREATER_HONOR
Definition: BattlefieldWG.h:47
@ SPELL_GREAT_HONOR
Definition: BattlefieldWG.h:46
@ SPELL_SPIRITUAL_IMMUNITY
Definition: BattlefieldWG.h:45
@ SPELL_ALLIANCE_FLAG
Definition: BattlefieldWG.h:49
@ SPELL_DEFEAT_REWARD
Definition: BattlefieldWG.h:55
@ SPELL_TENACITY_VEHICLE
Definition: BattlefieldWG.h:43
@ SPELL_LIEUTENANT
Definition: BattlefieldWG.h:41
@ SPELL_TOWER_CONTROL
Definition: BattlefieldWG.h:44
@ QUEST_CREDIT_TOWERS_DESTROYED
@ QUEST_VICTORY_WINTERGRASP_A
@ QUEST_CREDIT_DEFEND_SIEGE
@ QUEST_VICTORY_WINTERGRASP_H
@ GO_WINTERGRASP_FACTORY_BANNER_SW
@ GO_WINTERGRASP_FORTRESS_TOWER_3
@ GO_WINTERGRASP_FORTRESS_TOWER_2
@ GO_WINTERGRASP_FLAMEWATCH_TOWER
@ GO_WINTERGRASP_FORTRESS_TOWER_4
@ GO_WINTERGRASP_SHADOWSIGHT_TOWER
@ GO_WINTERGRASP_FACTORY_BANNER_NW
@ GO_WINTERGRASP_FACTORY_BANNER_NE
@ GO_WINTERGRASP_TITAN_S_RELIC
@ GO_WINTERGRASP_FORTRESS_TOWER_1
@ GO_WINTERGRASP_FACTORY_BANNER_SE
@ GO_WINTERGRASP_FORTRESS_GATE
@ GO_WINTERGRASP_WINTER_S_EDGE_TOWER
@ GO_WINTERGRASP_VAULT_GATE
@ GO_WINTERGRASP_KEEP_COLLISION_WALL
@ BATTLEFIELD_WG_GY_WORKSHOP_NE
@ BATTLEFIELD_WG_GY_KEEP
@ BATTLEFIELD_WG_GRAVEYARD_MAX
@ BATTLEFIELD_WG_GY_WORKSHOP_SW
@ BATTLEFIELD_WG_GY_WORKSHOP_SE
@ BATTLEFIELD_WG_GY_HORDE
@ BATTLEFIELD_WG_GY_WORKSHOP_NW
@ BATTLEFIELD_WG_GY_ALLIANCE
@ ACHIEVEMENTS_WIN_WG
Definition: BattlefieldWG.h:97
@ ACHIEVEMENTS_WIN_WG_TIMER_10
@ ACHIEVEMENTS_WIN_WG_100
Definition: BattlefieldWG.h:98
@ ACHIEVEMENTS_WG_TOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_WESTSPARK_ATTACK_HORDE
@ BATTLEFIELD_WG_TEXT_WESTSPARK_CAPTURE_HORDE
@ BATTLEFIELD_WG_TEXT_FORTRESS_DEFEND_HORDE
@ BATTLEFIELD_WG_TEXT_RANK_CORPORAL
@ BATTLEFIELD_WG_TEXT_SUNKEN_RING_CAPTURE_ALLIANCE
@ BATTLEFIELD_WG_TEXT_SUNKEN_RING_ATTACK_HORDE
@ BATTLEFIELD_WG_TEXT_EASTSPARK_CAPTURE_HORDE
@ BATTLEFIELD_WG_TEXT_WESTSPARK_ATTACK_ALLIANCE
@ BATTLEFIELD_WG_TEXT_EASTERN_TOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_ATTACK_ALLIANCE
@ BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_CAPTURE_ALLIANCE
@ BATTLEFIELD_WG_TEXT_WESTERN_TOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_START_BATTLE
@ BATTLEFIELD_WG_TEXT_EASTSPARK_ATTACK_HORDE
@ BATTLEFIELD_WG_TEXT_EASTSPARK_CAPTURE_ALLIANCE
@ BATTLEFIELD_WG_TEXT_RANK_FIRST_LIEUTENANT
@ BATTLEFIELD_WG_TEXT_NE_KEEPTOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_CAPTURE_HORDE
@ BATTLEFIELD_WG_TEXT_FORTRESS_CAPTURE_ALLIANCE
@ BATTLEFIELD_WG_TEXT_SE_KEEPTOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_EASTERN_TOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_SE_KEEPTOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_NW_KEEPTOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_START_GROUPING
@ BATTLEFIELD_WG_TEXT_SUNKEN_RING_ATTACK_ALLIANCE
@ BATTLEFIELD_WG_TEXT_SW_KEEPTOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_SUNKEN_RING_CAPTURE_HORDE
@ BATTLEFIELD_WG_TEXT_WESTSPARK_CAPTURE_ALLIANCE
@ BATTLEFIELD_WG_TEXT_EASTSPARK_ATTACK_ALLIANCE
@ BATTLEFIELD_WG_TEXT_NE_KEEPTOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_FORTRESS_DEFEND_ALLIANCE
@ BATTLEFIELD_WG_TEXT_SOUTHERN_TOWER_DESTROY
@ BATTLEFIELD_WG_TEXT_NW_KEEPTOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_FORTRESS_CAPTURE_HORDE
@ BATTLEFIELD_WG_TEXT_SW_KEEPTOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_ATTACK_HORDE
@ BATTLEFIELD_WG_TEXT_SOUTHERN_TOWER_DAMAGE
@ BATTLEFIELD_WG_TEXT_WESTERN_TOWER_DESTROY
@ BATTLEFIELD_WG_DATA_VEHICLE_A
Definition: BattlefieldWG.h:88
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_A
Definition: BattlefieldWG.h:86
@ BATTLEFIELD_WG_DATA_MAX
Definition: BattlefieldWG.h:90
@ BATTLEFIELD_WG_DATA_DAMAGED_TOWER_DEF
Definition: BattlefieldWG.h:82
@ BATTLEFIELD_WG_DATA_VEHICLE_H
Definition: BattlefieldWG.h:89
@ BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT
Definition: BattlefieldWG.h:85
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_H
Definition: BattlefieldWG.h:87
@ BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT
Definition: BattlefieldWG.h:84
@ BATTLEFIELD_WG_DATA_BROKEN_TOWER_DEF
Definition: BattlefieldWG.h:83
WintergraspGameObjectState
@ BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DAMAGE
@ BATTLEFIELD_WG_OBJECTSTATE_NONE
@ BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DESTROY
@ BATTLEFIELD_WG_OBJECTSTATE_HORDE_DESTROY
@ BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_DESTROY
@ BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_INTACT
@ BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT
@ BATTLEFIELD_WG_OBJECTSTATE_HORDE_INTACT
@ BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_DAMAGE
@ BATTLEFIELD_WG_OBJECTSTATE_HORDE_DAMAGE
@ BATTLEFIELD_WG_WORKSHOP_SE
@ BATTLEFIELD_WG_WORKSHOP_KEEP_WEST
@ BATTLEFIELD_WG_WORKSHOP_KEEP_EAST
@ BATTLEFIELD_WG_WORKSHOP_NW
@ BATTLEFIELD_WG_WORKSHOP_SW
@ BATTLEFIELD_WG_WORKSHOP_NE
@ BATTLEFIELD_WG
Definition: Battlefield.h:29
@ BATTLEFIELD_BATTLEID_WG
Definition: Battlefield.h:36
@ SPELL_HORDE_CONTROL_PHASE_SHIFT
@ SPELL_ALLIANCE_CONTROL_PHASE_SHIFT
@ RESPAWN_IMMEDIATELY
Definition: Battleground.h:137
@ RESPAWN_ONE_DAY
Definition: Battleground.h:136
@ IN_MILLISECONDS
Definition: Common.h:35
@ MINUTE
Definition: Common.h:29
#define sCreatureTextMgr
@ TEXT_RANGE_NORMAL
DB2Storage< AchievementEntry > sAchievementStore("Achievement.db2", &AchievementLoadInfo::Instance)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
#define ASSERT_NOTNULL(pointer)
Definition: Errors.h:84
#define ASSERT
Definition: Errors.h:68
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
@ LANG_ADDON
TeamId
@ TEAM_NEUTRAL
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ GO_DESTRUCTIBLE_DESTROYED
@ GO_DESTRUCTIBLE_REBUILDING
@ GO_DESTRUCTIBLE_DAMAGED
uint8 constexpr PVP_TEAMS_COUNT
@ TEAM_OTHER
@ GO_FLAG_NOT_SELECTABLE
@ GO_FLAG_IN_USE
@ FACTION_ALLIANCE_GENERIC_WG
@ FACTION_FRIENDLY
@ FACTION_HORDE_GENERIC_WG
@ AREA_THE_SUNKEN_RING
@ AREA_WINTERGRASP_FORTRESS
@ AREA_EASTPARK_WORKSHOP
@ AREA_THE_BROKEN_TEMPLATE
@ AREA_WINTERGRASP
@ AREA_WESTPARK_WORKSHOP
@ AREA_THE_CHILLED_QUAGMIRE
@ CHAT_MSG_ADDON
WorldState
@ WS_BATTLEFIELD_WG_WORKSHOP_NE
@ WS_BATTLEFIELD_WG_VEHICLE_H
@ WS_BATTLEFIELD_WG_MAX_VEHICLE_H
@ WS_BATTLEFIELD_WG_TIME_BATTLE_END
@ WS_BATTLEFIELD_WG_WORKSHOP_K_E
@ WS_BATTLEFIELD_WG_WORKSHOP_SW
@ WS_BATTLEFIELD_WG_DEFENDED_H
@ WS_BATTLEFIELD_WG_SHOW_TIME_NEXT_BATTLE
@ WS_BATTLEFIELD_WG_DEFENDER
@ WS_BATTLEFIELD_WG_SHOW_TIME_BATTLE_END
@ WS_BATTLEFIELD_WG_ATTACKER
@ WS_BATTLEFIELD_WG_VEHICLE_A
@ WS_BATTLEFIELD_WG_WORKSHOP_K_W
@ WS_BATTLEFIELD_WG_ATTACKED_A
@ WS_BATTLEFIELD_WG_TIME_NEXT_BATTLE
@ WS_BATTLEFIELD_WG_MAX_VEHICLE_A
@ WS_BATTLEFIELD_WG_WORKSHOP_SE
@ WS_BATTLEFIELD_WG_WORKSHOP_NW
@ WS_BATTLEFIELD_WG_ATTACKED_H
@ WS_BATTLEFIELD_WG_DEFENDED_A
@ GO_STATE_READY
@ GO_STATE_ACTIVE
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:170
#define sWorldStateMgr
Definition: WorldStateMgr.h:50
ObjectGuid m_titansRelicGUID
uint32 m_tenacityStack
void OnPlayerLeaveZone(Player *player) override
Called when player left the WG zone.
void OnUnitDeath(Unit *unit) override
GuidVector DefenderPortalList[PVP_TEAMS_COUNT]
void RemoveAurasFromPlayer(Player *player)
void UpdateCounterVehicle(bool init)
void OnBattleEnd(bool endByTimer) override
Called when battle end.
void OnStartGrouping() override
Called when grouping starts (15 minutes before battlestart)
GameObject * GetRelic()
Return pointer to relic object.
WorkshopVect Workshops
void ProcessEvent(WorldObject *obj, uint32 eventId, WorldObject *invoker) override
void PromotePlayer(Player *killer)
void OnPlayerLeaveWar(Player *player) override
Called when player left the battle.
void UpdateVehicleCountWG()
void SetRelicInteractible(bool allow)
Define if player can interact with the relic.
bool SetupBattlefield() override
Called when battlefield is setup, at server start.
void UpdatedDestroyedTowerCount(TeamId team)
Called when tower is broken.
void BrokenWallOrTower(TeamId team, BfWGGameObjectBuilding *building)
Called when a wall/tower is broken.
void OnBattleStart() override
Called when the battle start.
GuidUnorderedSet m_vehicles[PVP_TEAMS_COUNT]
void OnPlayerEnterZone(Player *player) override
Called when player enters in WG zone.
bool CanInteractWithRelic()
Check if players can interact with the relic (Only if the last door has been broken)
void UpdateDamagedTowerCount(TeamId team)
Called when a tower is damaged.
GameObjectBuildingVect BuildingsInZone
void OnCreatureRemove(Creature *creature) override
Called when a creature is removed.
void OnPlayerJoinWar(Player *player) override
Called when player accept invite to join battle.
void OnCreatureCreate(Creature *creature) override
Called when a creature is created.
bool FindAndRemoveVehicleFromList(Unit *vehicle)
uint8 GetSpiritGraveyardId(uint32 areaId) const
void HandleKill(Player *killer, Unit *victim) override
Called when a Unit is kill in battlefield zone.
void OnGameObjectCreate(GameObject *go) override
Called when a gameobject is created.
uint32 GetData(uint32 data) const override
void DoCompleteOrIncrementAchievement(uint32 achievement, Player *player, uint8 incrementNumber=1) override
GuidVector CanonList
void HandlePromotion(Player *killer, Unit *killed)
TeamId m_tenacityTeam
Battlefield * GetBattlefield(Map *map) const override
uint32 m_Timer
Definition: Battlefield.h:300
Map * GetMap() const
Definition: Battlefield.h:183
uint32 m_MapId
Definition: Battlefield.h:319
GameObject * SpawnGameObject(uint32 entry, Position const &pos, QuaternionData const &rot)
void ProcessEvent(WorldObject *target, uint32 eventId, WorldObject *invoker) override
GraveyardVect m_GraveyardList
Definition: Battlefield.h:334
GameObject * GetGameObject(ObjectGuid guid)
void ShowNpc(Creature *creature, bool aggressive)
Creature * GetCreature(ObjectGuid guid)
uint32 m_MaxPlayer
Definition: Battlefield.h:321
std::vector< uint32 > m_Data32
Definition: Battlefield.h:342
ObjectGuid StalkerGuid
Definition: Battlefield.h:299
Creature * SpawnCreature(uint32 entry, Position const &pos)
uint32 m_NoWarBattleTime
Definition: Battlefield.h:325
void EndBattle(bool endByTimer)
virtual void SetData(uint32 dataId, uint32 value) override
Definition: Battlefield.h:215
uint32 m_BattleTime
Definition: Battlefield.h:324
bool IsWarTime() const
Return true if battle is start, false if battle is not started.
Definition: Battlefield.h:189
uint32 m_ZoneId
Definition: Battlefield.h:318
void InitStalker(uint32 entry, Position const &pos)
virtual void UpdateData(uint32 index, int32 pad)
Definition: Battlefield.h:216
uint32 m_TypeId
Definition: Battlefield.h:316
uint32 m_BattleId
Definition: Battlefield.h:317
uint32 m_StartGroupingTimer
Definition: Battlefield.h:336
void RegisterZone(uint32 zoneid)
TeamId m_DefenderTeam
Definition: Battlefield.h:303
void SendWarning(uint8 id, WorldObject const *target=nullptr)
uint32 m_TimeForAcceptInvite
Definition: Battlefield.h:327
BfGraveyard * GetGraveyardById(uint32 id) const
GuidUnorderedSet m_PlayersInWar[PVP_TEAMS_COUNT]
Definition: Battlefield.h:311
void HideNpc(Creature *creature)
uint32 m_RestartAfterCrash
Definition: Battlefield.h:326
TeamId GetAttackerTeam() const
Definition: Battlefield.h:220
uint32 m_MinLevel
Definition: Battlefield.h:323
TeamId GetDefenderTeam() const
Definition: Battlefield.h:219
uint32 m_MinPlayer
Definition: Battlefield.h:322
uint32 GetTimer() const
Definition: Battlefield.h:287
virtual uint32 GetData(uint32 dataId) const override
Definition: Battlefield.h:214
bool m_IsEnabled
Definition: Battlefield.h:301
ControlZoneHandlerMap ControlZoneHandlers
Definition: Battlefield.h:306
bool m_StartGrouping
Definition: Battlefield.h:337
WorldLocation KickPosition
Definition: Battlefield.h:329
void SetGraveyardNumber(uint32 number)
Definition: Battlefield.h:239
bool m_isActive
Definition: Battlefield.h:302
bool IsEnabled() const
Return if battlefield is enable.
Definition: Battlefield.h:196
GuidUnorderedSet m_players[PVP_TEAMS_COUNT]
Definition: Battlefield.h:309
BfGraveyardWG(BattlefieldWG *Bf)
void SetTextId(uint32 textId)
uint32 m_GossipTextId
Battlefield * m_Bf
Definition: Battlefield.h:137
void Initialize(TeamId startcontrol, uint32 gy)
virtual void HandleContestedEventAlliance(GameObject *controlZone)
Definition: ZoneScript.h:50
virtual void HandleContestedEventHorde(GameObject *controlZone)
Definition: ZoneScript.h:49
Creature *const me
Definition: CreatureAI.h:61
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
void RemoveFlag(GameObjectFlags flags)
Definition: GameObject.h:275
void SetDestructibleState(GameObjectDestructibleState state, WorldObject *attackerOrHealer=nullptr, bool setHealth=false)
void HandleCustomTypeCommand(GameObjectTypeBase::CustomCommand const &command) const
Definition: Map.h:189
bool IsEmpty() const
Definition: ObjectGuid.h:319
uint32 GetEntry() const
Definition: ObjectGuid.h:291
void Clear()
Definition: ObjectGuid.h:286
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
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
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
Definition: Player.cpp:1250
void CompletedAchievement(AchievementEntry const *entry)
Definition: Player.cpp:26784
WorldSession * GetSession() const
Definition: Player.h:2101
TeamId GetTeamId() const
Definition: Player.h:2236
ObjectGuid GetSummonerGUID() const
Definition: Unit.h:627
bool IsVehicle() const
Definition: Unit.h:743
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3685
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:11501
void SetAuraStack(uint32 spellId, Unit *target, uint32 stack)
Definition: Unit.cpp:11665
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:11618
TempSummon * ToTempSummon()
Definition: Unit.h:1756
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
void HandleContestedEventAlliance(GameObject *controlZone) override
void HandleProgressEventHorde(GameObject *controlZone) override
WintergraspWorkshop * m_Workshop
void HandleProgressEventAlliance(GameObject *controlZone) override
void HandleContestedEventHorde(GameObject *controlZone) override
WintergraspCapturePoint(BattlefieldWG *battlefield, WintergraspWorkshop *workshop)
uint32 m_mapId
Definition: Position.h:203
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition: Object.cpp:2170
Map * GetMap() const
Definition: Object.h:624
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
bool PlayerLogout() const
Definition: WorldSession.h:970
CreatureAI * GetAI(Creature *creature) const override
#define sWorld
Definition: World.h:931
@ CONFIG_WINTERGRASP_PLR_MIN_LVL
Definition: World.h:393
@ CONFIG_WINTERGRASP_BATTLETIME
Definition: World.h:394
@ CONFIG_WINTERGRASP_NOBATTLETIME
Definition: World.h:395
@ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH
Definition: World.h:396
@ CONFIG_WINTERGRASP_PLR_MAX
Definition: World.h:391
@ CONFIG_WINTERGRASP_PLR_MIN
Definition: World.h:392
@ CONFIG_WINTERGRASP_ENABLE
Definition: World.h:169
ObjectData const creatureData[]
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TeamId StartControl
Position Pos
uint32 GraveyardID
GuidVector m_CreatureBottomList[PVP_TEAMS_COUNT]
StaticWintergraspTowerInfo const * _staticTowerInfo
void UpdateTurretAttack(bool disable)
BfWGGameObjectBuilding(BattlefieldWG *wg, WintergraspGameObjectBuildingType type, uint32 worldState)
void Init(GameObject *go)
WintergraspGameObjectState _state
ObjectGuid const & GetGUID() const
WintergraspGameObjectBuildingType _type
GuidVector m_TowerCannonBottomList
GuidVector m_CreatureTopList[PVP_TEAMS_COUNT]
BattlefieldWG * _wg
GuidVector m_GameObjectList[PVP_TEAMS_COUNT]
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr void Relocate(float x, float y)
Definition: Position.h:63
struct StaticWintergraspTowerInfo::@342 TextIds
struct StaticWintergraspWorkshopInfo::@343 TextIds
WintergraspGameObjectBuildingType type
std::vector< Position > TurretTop
std::vector< Position > TowerCannonBottom
std::vector< WintergraspGameObjectData > GameObject
std::vector< WintergraspObjectPositionData > CreatureBottom
BattlefieldWG * _wg
WintergraspGameObjectState _state
void GiveControlTo(TeamId teamId, bool init=false)
StaticWintergraspWorkshopInfo const * _staticInfo
WintergraspWorkshop(BattlefieldWG *wg, uint8 type)