TrinityCore
Loading...
Searching...
No Matches
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 "DBCStores.h"
28#include "GameObject.h"
29#include "GameTime.h"
30#include "Log.h"
31#include "MapManager.h"
32#include "ObjectAccessor.h"
33#include "ObjectMgr.h"
34#include "Opcodes.h"
35#include "Player.h"
36#include "Random.h"
37#include "ScriptedCreature.h"
38#include "ScriptMgr.h"
39#include "SpellAuras.h"
40#include "TemporarySummon.h"
41#include "World.h"
42#include "WorldSession.h"
43#include "WorldStatePackets.h"
44
52
53// 7 in sql, 7 in header
55{
56 { { 5104.750f, 2300.940f, 368.579f, 0.733038f }, 1329, BATTLEFIELD_WG_GOSSIPTEXT_GY_NE, TEAM_NEUTRAL },
57 { { 5099.120f, 3466.036f, 368.484f, 5.317802f }, 1330, BATTLEFIELD_WG_GOSSIPTEXT_GY_NW, TEAM_NEUTRAL },
58 { { 4314.648f, 2408.522f, 392.642f, 6.268125f }, 1333, BATTLEFIELD_WG_GOSSIPTEXT_GY_SE, TEAM_NEUTRAL },
59 { { 4331.716f, 3235.695f, 390.251f, 0.008500f }, 1334, BATTLEFIELD_WG_GOSSIPTEXT_GY_SW, TEAM_NEUTRAL },
60 { { 5537.986f, 2897.493f, 517.057f, 4.819249f }, 1285, BATTLEFIELD_WG_GOSSIPTEXT_GY_KEEP, TEAM_NEUTRAL },
61 { { 5032.454f, 3711.382f, 372.468f, 3.971623f }, 1331, BATTLEFIELD_WG_GOSSIPTEXT_GY_HORDE, TEAM_HORDE },
62 { { 5140.790f, 2179.120f, 390.950f, 1.972220f }, 1332, BATTLEFIELD_WG_GOSSIPTEXT_GY_ALLIANCE, TEAM_ALLIANCE },
63};
64
65uint32 const ClockWorldState[] = { 3781, 4354 };
67
68Position const WintergraspStalkerPos = { 4948.985f, 2937.789f, 550.5172f, 1.815142f };
69
70Position const WintergraspRelicPos = { 5440.379f, 2840.493f, 430.2816f, -1.832595f };
71QuaternionData const WintergraspRelicRot = { 0.f, 0.f, -0.7933531f, 0.6087617f };
72
73uint8 const WG_MAX_OBJ = 32;
78
79// *****************************************************
80// ************ Destructible (Wall, Tower..) ***********
81// *****************************************************
82
91
93{
94 // Wall (Not spawned in db)
95 // Entry WS X Y Z O rX rY rZ rW Type
96 { 190219, 3749, { 5371.457f, 3047.472f, 407.5710f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.00000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
97 { 190220, 3750, { 5331.264f, 3047.105f, 407.9228f, 0.05235888f }, { 0.f, 0.f, 0.026176450f, 0.99965730f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
98 { 191795, 3764, { 5385.841f, 2909.490f, 409.7127f, 0.00872424f }, { 0.f, 0.f, 0.004362106f, 0.99999050f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
99 { 191796, 3772, { 5384.452f, 2771.835f, 410.2704f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.00000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
100 { 191799, 3762, { 5371.436f, 2630.610f, 408.8163f, 3.13285800f }, { 0.f, 0.f, 0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
101 { 191800, 3766, { 5301.838f, 2909.089f, 409.8661f, 0.00872424f }, { 0.f, 0.f, 0.004362106f, 0.99999050f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
102 { 191801, 3770, { 5301.063f, 2771.411f, 409.9014f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.00000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
103 { 191802, 3751, { 5280.197f, 2995.583f, 408.8249f, 1.61442800f }, { 0.f, 0.f, 0.722363500f, 0.69151360f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
104 { 191803, 3752, { 5279.136f, 2956.023f, 408.6041f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.70710690f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
105 { 191804, 3767, { 5278.685f, 2882.513f, 409.5388f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.70710690f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
106 { 191806, 3769, { 5279.502f, 2798.945f, 409.9983f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.70710690f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
107 { 191807, 3759, { 5279.937f, 2724.766f, 409.9452f, 1.56207000f }, { 0.f, 0.f, 0.704014800f, 0.71018530f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
108 { 191808, 3760, { 5279.601f, 2683.786f, 409.8488f, 1.55334100f }, { 0.f, 0.f, 0.700908700f, 0.71325110f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
109 { 191809, 3761, { 5330.955f, 2630.777f, 409.2826f, 3.13285800f }, { 0.f, 0.f, 0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
110 { 190369, 3753, { 5256.085f, 2933.963f, 409.3571f, 3.13285800f }, { 0.f, 0.f, 0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
111 { 190370, 3758, { 5257.463f, 2747.327f, 409.7427f, -3.13285800f }, { 0.f, 0.f, -0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
112 { 190371, 3754, { 5214.960f, 2934.089f, 409.1905f, -0.00872424f }, { 0.f, 0.f, -0.004362106f, 0.99999050f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
113 { 190372, 3757, { 5215.821f, 2747.566f, 409.1884f, -3.13285800f }, { 0.f, 0.f, -0.999990500f, 0.00436732f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
114 { 190374, 3755, { 5162.273f, 2883.043f, 410.2556f, 1.57952200f }, { 0.f, 0.f, 0.710185100f, 0.70401500f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
115 { 190376, 3756, { 5163.724f, 2799.838f, 409.2270f, 1.57952200f }, { 0.f, 0.f, 0.710185100f, 0.70401500f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
116
117 // Tower of keep (Not spawned in db)
118 { 190221, 3711, { 5281.154f, 3044.588f, 407.8434f, 3.115388f }, { 0.f, 0.f, 0.9999142f, 0.013101960f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // NW
119 { 190373, 3713, { 5163.757f, 2932.228f, 409.1904f, 3.124123f }, { 0.f, 0.f, 0.9999619f, 0.008734641f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // SW
120 { 190377, 3714, { 5166.397f, 2748.368f, 409.1884f, -1.570796f }, { 0.f, 0.f, -0.7071066f, 0.707106900f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // SE
121 { 190378, 3712, { 5281.192f, 2632.479f, 409.0985f, -1.588246f }, { 0.f, 0.f, -0.7132492f, 0.700910500f }, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER }, // NE
122
123 // Wall (with passage) (Not spawned in db)
124 { 191797, 3765, { 5343.290f, 2908.860f, 409.5757f, 0.00872424f }, { 0.f, 0.f, 0.004362106f, 0.9999905f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
125 { 191798, 3771, { 5342.719f, 2771.386f, 409.6249f, 3.14159300f }, { 0.f, 0.f, -1.000000000f, 0.0000000f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
126 { 191805, 3768, { 5279.126f, 2840.797f, 409.7826f, 1.57952200f }, { 0.f, 0.f, 0.710185100f, 0.7040150f }, BATTLEFIELD_WG_OBJECTTYPE_WALL },
127
128 // South tower (Not spawned in db)
129 { 190356, 3704, { 4557.173f, 3623.943f, 395.8828f, 1.675516f }, { 0.f, 0.f, 0.7431450f, 0.669130400f }, BATTLEFIELD_WG_OBJECTTYPE_TOWER }, // W
130 { 190357, 3705, { 4398.172f, 2822.497f, 405.6270f, -3.124123f }, { 0.f, 0.f, -0.9999619f, 0.008734641f }, BATTLEFIELD_WG_OBJECTTYPE_TOWER }, // S
131 { 190358, 3706, { 4459.105f, 1944.326f, 434.9912f, -2.002762f }, { 0.f, 0.f, -0.8422165f, 0.539139500f }, BATTLEFIELD_WG_OBJECTTYPE_TOWER }, // E
132
133 // Door of forteress (Not spawned in db)
134 { 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 },
135
136 // Last door (Not spawned in db)
137 { 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 },
138};
139
150
161
163{
164 { 5391.19f, 3060.8f, 419.616f, 1.69557f },
165 { 5266.75f, 2976.5f, 421.067f, 3.20354f },
166 { 5234.86f, 2948.8f, 420.88f, 1.61311f },
167 { 5323.05f, 2923.7f, 421.645f, 1.5817f },
168 { 5363.82f, 2923.87f, 421.709f, 1.60527f },
169 { 5264.04f, 2861.34f, 421.587f, 3.21142f },
170 { 5264.68f, 2819.78f, 421.656f, 3.15645f },
171 { 5322.16f, 2756.69f, 421.646f, 4.69978f },
172 { 5363.78f, 2756.77f, 421.629f, 4.78226f },
173 { 5236.2f, 2732.68f, 421.649f, 4.72336f },
174 { 5265.02f, 2704.63f, 421.7f, 3.12507f },
175 { 5350.87f, 2616.03f, 421.243f, 4.72729f },
176 { 5390.95f, 2615.5f, 421.126f, 4.6409f },
177 { 5148.8f, 2820.24f, 421.621f, 3.16043f },
178 { 5147.98f, 2861.93f, 421.63f, 3.18792f },
179};
180
187
195
197{
198 // Player teleporter
199 { { 5153.408f, 2901.349f, 409.1913f, -0.06981169f }, { 0.f, 0.f, -0.03489876f, 0.9993908f }, 190763, 191575 },
200 { { 5268.698f, 2666.421f, 409.0985f, -0.71558490f }, { 0.f, 0.f, -0.35020730f, 0.9366722f }, 190763, 191575 },
201 { { 5197.050f, 2944.814f, 409.1913f, 2.33874000f }, { 0.f, 0.f, 0.92050460f, 0.3907318f }, 190763, 191575 },
202 { { 5196.671f, 2737.345f, 409.1892f, -2.93213900f }, { 0.f, 0.f, -0.99452110f, 0.1045355f }, 190763, 191575 },
203 { { 5314.580f, 3055.852f, 408.8620f, 0.54105060f }, { 0.f, 0.f, 0.26723770f, 0.9636307f }, 190763, 191575 },
204 { { 5391.277f, 2828.094f, 418.6752f, -2.16420600f }, { 0.f, 0.f, -0.88294700f, 0.4694727f }, 190763, 191575 },
205 { { 5153.931f, 2781.671f, 409.2455f, 1.65806200f }, { 0.f, 0.f, 0.73727700f, 0.6755905f }, 190763, 191575 },
206 { { 5311.445f, 2618.931f, 409.0916f, -2.37364400f }, { 0.f, 0.f, -0.92718320f, 0.3746083f }, 190763, 191575 },
207 { { 5269.208f, 3013.838f, 408.8276f, -1.76278200f }, { 0.f, 0.f, -0.77162460f, 0.6360782f }, 190763, 191575 },
208
209 { { 5401.634f, 2853.667f, 418.6748f, 2.63544400f }, { 0.f, 0.f, 0.96814730f, 0.2503814f }, 192819, 192819 }, // return portal inside fortress, neutral
210 // Vehicle teleporter
211 { { 5314.515f, 2703.687f, 408.5502f, -0.89011660f }, { 0.f, 0.f, -0.43051050f, 0.9025856f }, 192951, 192951 },
212 { { 5316.252f, 2977.042f, 408.5385f, -0.82030330f }, { 0.f, 0.f, -0.39874840f, 0.9170604f }, 192951, 192951 }
213};
214
215// *********************************************************
216// **********Tower Element(GameObject, Creature)************
217// *********************************************************
218
220{
221 uint32 towerEntry; // Gameobject id of tower
222 std::vector<WintergraspGameObjectData> GameObject; // Gameobject position and entry (Horde/Alliance)
223
224 // Creature: Turrets and Guard /// @todo: Killed on Tower destruction ? Tower damage ? Requires confirming
225 std::vector<WintergraspObjectPositionData> CreatureBottom;
226};
227
229// 192414 : 0 in sql, 1 in header
230// 192278 : 0 in sql, 3 in header
232{
233 // West tower
234 {
235 190356,
236 {
237 { { 4559.113f, 3606.216f, 419.9992f, 4.799657f }, { 0.f, 0.f, -0.67558960f, 0.73727790f }, 192488, 192501 }, // Flag on tower
238 { { 4539.420f, 3622.490f, 420.0342f, 3.211419f }, { 0.f, 0.f, -0.99939060f, 0.03490613f }, 192488, 192501 }, // Flag on tower
239 { { 4555.258f, 3641.648f, 419.9740f, 1.675514f }, { 0.f, 0.f, 0.74314400f, 0.66913150f }, 192488, 192501 }, // Flag on tower
240 { { 4574.872f, 3625.911f, 420.0792f, 0.087266f }, { 0.f, 0.f, 0.04361916f, 0.99904820f }, 192488, 192501 }, // Flag on tower
241 { { 4433.899f, 3534.142f, 360.2750f, 4.433136f }, { 0.f, 0.f, -0.79863550f, 0.60181500f }, 192269, 192278 }, // Flag near workshop
242 { { 4572.933f, 3475.519f, 363.0090f, 1.422443f }, { 0.f, 0.f, 0.65275960f, 0.75756520f }, 192269, 192277 } // Flag near bridge
243 },
244 {
245 { { 4418.688477f, 3506.251709f, 358.975494f, 4.293305f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A } // Roaming Guard
246 }
247 },
248 // South Tower
249 {
250 190357,
251 {
252 { { 4416.004f, 2822.666f, 429.8512f, 6.2657330f }, { 0.f, 0.f, -0.00872612f, 0.99996190f }, 192488, 192501 }, // Flag on tower
253 { { 4398.819f, 2804.698f, 429.7920f, 4.6949370f }, { 0.f, 0.f, -0.71325020f, 0.70090960f }, 192488, 192501 }, // Flag on tower
254 { { 4387.622f, 2719.566f, 389.9351f, 4.7385700f }, { 0.f, 0.f, -0.69779010f, 0.71630230f }, 192366, 192414 }, // Flag near tower
255 { { 4464.124f, 2855.453f, 406.1106f, 0.8290324f }, { 0.f, 0.f, 0.40274720f, 0.91531130f }, 192366, 192429 }, // Flag near tower
256 { { 4526.457f, 2810.181f, 391.1997f, 3.2899610f }, { 0.f, 0.f, -0.99724960f, 0.07411628f }, 192269, 192278 } // Flag near bridge
257 },
258 {
259 { { 4452.859863f, 2808.870117f, 402.604004f, 6.056290f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
260 { { 4455.899902f, 2835.958008f, 401.122559f, 0.034907f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
261 { { 4412.649414f, 2953.792236f, 374.799957f, 0.980838f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Roaming Guard
262 { { 4362.089844f, 2811.510010f, 407.337006f, 3.193950f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
263 { { 4412.290039f, 2753.790039f, 401.015015f, 5.829400f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
264 { { 4421.939941f, 2773.189941f, 400.894989f, 5.707230f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A } // Standing Guard
265 }
266 },
267 // East Tower
268 {
269 190358,
270 {
271 { { 4466.793f, 1960.418f, 459.1437f, 1.151916f }, { 0.f, 0.f, 0.5446386f, 0.8386708f }, 192488, 192501 }, // Flag on tower
272 { { 4475.351f, 1937.031f, 459.0702f, 5.846854f }, { 0.f, 0.f, -0.2164392f, 0.9762961f }, 192488, 192501 }, // Flag on tower
273 { { 4451.758f, 1928.104f, 459.0759f, 4.276057f }, { 0.f, 0.f, -0.8433914f, 0.5372996f }, 192488, 192501 }, // Flag on tower
274 { { 4442.987f, 1951.898f, 459.0930f, 2.740162f }, { 0.f, 0.f, 0.9799242f, 0.1993704f }, 192488, 192501 } // Flag on tower
275 },
276 {
277 { { 4501.060059f, 1990.280029f, 431.157013f, 1.029740f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
278 { { 4463.830078f, 2015.180054f, 430.299988f, 1.431170f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
279 { { 4494.580078f, 1943.760010f, 435.627014f, 6.195920f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
280 { { 4450.149902f, 1897.579956f, 435.045013f, 4.398230f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, // Standing Guard
281 { { 4428.870117f, 1906.869995f, 432.648010f, 3.996800f }, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A } // Standing Guard
282 }
283 }
284};
285
287{
289 std::vector<Position> TowerCannonBottom;
290 std::vector<Position> TurretTop;
291};
292
294
296{
297 {
298 190221,
299 {
300 // no cannons at bottom
301 },
302 {
303 { 5255.88f, 3047.63f, 438.499f, 3.13677f },
304 { 5280.90f, 3071.32f, 438.499f, 1.62879f }
305 }
306 },
307 {
308 190373,
309 {
310 // no cannons at bottom
311 },
312 {
313 { 5138.59f, 2935.16f, 439.845f, 3.11723f },
314 { 5163.06f, 2959.52f, 439.846f, 1.47258f }
315 }
316 },
317 {
318 190377,
319 {
320 // no cannons at bottom
321 },
322 {
323 { 5163.84f, 2723.74f, 439.844f, 1.39940f },
324 { 5139.69f, 2747.40f, 439.844f, 3.17221f }
325 }
326 },
327 {
328 190378,
329 {
330 // no cannons at bottom
331 },
332 {
333 { 5278.21f, 2607.23f, 439.755f, 4.71944f },
334 { 5255.01f, 2631.98f, 439.755f, 3.15257f }
335 }
336 },
337 {
338 190356,
339 {
340 { 4537.380371f, 3599.531738f, 402.886993f, 3.998462f },
341 { 4581.497559f, 3604.087158f, 402.886963f, 5.651723f }
342 },
343 {
344 { 4469.448242f, 1966.623779f, 465.647217f, 1.153573f },
345 { 4581.895996f, 3626.438477f, 426.539062f, 0.117806f }
346 }
347 },
348 {
349 190357,
350 {
351 { 4421.640137f, 2799.935791f, 412.630920f, 5.459298f },
352 { 4420.263184f, 2845.340332f, 412.630951f, 0.742197f }
353 },
354 {
355 { 4423.430664f, 2822.762939f, 436.283142f, 6.223487f },
356 { 4397.825684f, 2847.629639f, 436.283325f, 1.579430f },
357 { 4398.814941f, 2797.266357f, 436.283051f, 4.703747f }
358 }
359 },
360 {
361 190358,
362 {
363 { 4448.138184f, 1974.998779f, 441.995911f, 1.967238f },
364 { 4448.713379f, 1955.148682f, 441.995178f, 0.380733f }
365 },
366 {
367 { 4469.448242f, 1966.623779f, 465.647217f, 1.153573f },
368 { 4481.996582f, 1933.658325f, 465.647186f, 5.873029f }
369 }
370 }
371};
372
373// *********************************************************
374// *****************WorkShop Data & Element*****************
375// *********************************************************
376
390
401
403{
404 for (WintergraspWorkshop* workshop : Workshops)
405 delete workshop;
406
408 delete building;
409}
410
412{
413 m_TypeId = BATTLEFIELD_WG; // See enum BattlefieldTypes
417 m_Map = sMapMgr->FindMap(m_MapId, 0);
418
420
428
431 m_StartGrouping = false;
432
434 m_tenacityStack = 0;
435
436 KickPosition.Relocate(5728.117f, 2714.346f, 697.733f, 0);
438
440
442
443 m_saveTimer = 60000;
444
445 // Init Graveyards
447
448 // Load from db
449 if ((sWorld->getWorldState(WS_BATTLEFIELD_WG_ACTIVE) == 0) && (sWorld->getWorldState(WS_BATTLEFIELD_WG_DEFENDER) == 0)
450 && (sWorld->getWorldState(ClockWorldState[0]) == 0))
451 {
452 sWorld->setWorldState(WS_BATTLEFIELD_WG_ACTIVE, uint64(false));
453 sWorld->setWorldState(WS_BATTLEFIELD_WG_DEFENDER, uint64(urand(0, 1)));
454 sWorld->setWorldState(ClockWorldState[0], uint64(m_NoWarBattleTime));
455 }
456
457 m_isActive = sWorld->getWorldState(WS_BATTLEFIELD_WG_ACTIVE) != 0;
459
460 m_Timer = sWorld->getWorldState(ClockWorldState[0]);
461 if (m_isActive)
462 {
463 m_isActive = false;
465 }
466
471
472 for (uint8 i = 0; i < BATTLEFIELD_WG_GRAVEYARD_MAX; i++)
473 {
474 BfGraveyardWG* graveyard = new BfGraveyardWG(this);
475
476 // When between games, the graveyard is controlled by the defending team
477 if (WGGraveyard[i].StartControl == TEAM_NEUTRAL)
478 graveyard->Initialize(m_DefenderTeam, WGGraveyard[i].GraveyardID);
479 else
480 graveyard->Initialize(WGGraveyard[i].StartControl, WGGraveyard[i].GraveyardID);
481
482 graveyard->SetTextId(WGGraveyard[i].TextID);
483 m_GraveyardList[i] = graveyard;
484 }
485
487 // Spawn workshop creatures and gameobjects
488 for (uint8 i = 0; i < WG_MAX_WORKSHOP; i++)
489 {
490 WintergraspWorkshop* workshop = new WintergraspWorkshop(this, i);
492 workshop->GiveControlTo(GetAttackerTeam(), true);
493 else
494 workshop->GiveControlTo(GetDefenderTeam(), true);
495
496 // Note: Capture point is added once the gameobject is created.
497 Workshops[i] = workshop;
498 }
499
500 // Spawn turrets and hide them per default
501 for (uint8 i = 0; i < WG_MAX_TURRET; i++)
502 {
503 Position towerCannonPos = WGTurret[i].GetPosition();
504 if (Creature* creature = SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos))
505 {
506 CanonList.push_back(creature->GetGUID());
507 HideNpc(creature);
508 }
509 }
510
512 // Spawn all gameobjects
513 for (uint8 i = 0; i < WG_MAX_OBJ; i++)
514 {
516 {
518 b->Init(go);
519 if (!IsEnabled() && go->GetEntry() == GO_WINTERGRASP_VAULT_GATE)
520 go->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
521
522 BuildingsInZone[i] = b;
523 }
524 }
525
526 // Spawning portal defender
527 for (uint8 i = 0; i < WG_MAX_TELEPORTER; ++i)
528 {
529 WintergraspGameObjectData const& teleporter = WGPortalDefenderData[i];
530 if (GameObject* go = SpawnGameObject(teleporter.AllianceEntry, teleporter.Pos, teleporter.Rot))
531 {
532 DefenderPortalList[TEAM_ALLIANCE].push_back(go->GetGUID());
534 }
535
536 if (GameObject* go = SpawnGameObject(teleporter.HordeEntry, teleporter.Pos, teleporter.Rot))
537 {
538 DefenderPortalList[TEAM_HORDE].push_back(go->GetGUID());
540 }
541 }
542
544 return true;
545}
546
548{
549 bool m_return = Battlefield::Update(diff);
550 if (m_saveTimer <= diff)
551 {
554 sWorld->setWorldState(ClockWorldState[0], m_Timer);
560 }
561 else
562 m_saveTimer -= diff;
563
564 return m_return;
565}
566
568{
569 // Spawn titan relic
571 {
572 // Update faction of relic, only attacker can click on
573 relic->SetFaction(WintergraspFaction[GetAttackerTeam()]);
574 // Set in use (not allow to click on before last door is broken)
575 relic->SetFlag(GO_FLAG_IN_USE | GO_FLAG_NOT_SELECTABLE);
576 m_titansRelicGUID = relic->GetGUID();
577 }
578 else
579 TC_LOG_ERROR("bg.battlefield", "WG: Failed to spawn titan relic.");
580
581 // Update tower visibility and update faction
582 for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
583 {
584 if (Creature* creature = GetCreature(*itr))
585 {
586 ShowNpc(creature, true);
587 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
588 }
589 }
590
591 // Rebuild all wall
593 {
594 building->Rebuild();
595 building->UpdateTurretAttack(false);
596 }
597
602
603 // Update graveyard (in no war time all graveyard is to deffender, in war time, depend of base)
604 for (WintergraspWorkshop* workshop : Workshops)
605 workshop->UpdateGraveyardAndWorkshop();
606
607 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
608 {
609 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
610 {
611 // Kick player in orb room, TODO: offline player ?
612 if (Player* player = ObjectAccessor::FindPlayer(*itr))
613 {
614 float x, y, z;
615 player->GetPosition(x, y, z);
616 if (5500 > x && x > 5392 && y < 2880 && y > 2800 && z < 480)
617 player->TeleportTo(571, 5349.8686f, 2838.481f, 409.240f, 0.046328f);
618 SendInitWorldStatesTo(player);
619 }
620 }
621 }
622
623 // Initialize vehicle counter
625 // Send start warning to all players
627}
628
630{
631 if (init)
632 {
635 }
638
639 for (WintergraspWorkshop* workshop : Workshops)
640 {
641 if (workshop->GetTeamControl() == TEAM_ALLIANCE)
643 else if (workshop->GetTeamControl() == TEAM_HORDE)
645 }
646
648}
649
650void BattlefieldWG::OnBattleEnd(bool endByTimer)
651{
652 // Remove relic
655 relic->RemoveFromWorld();
657
658 // change collision wall state closed
660 {
661 building->RebuildGate();
662 }
663
664 // successful defense
665 if (endByTimer)
667 // successful attack (note that teams have already been swapped, so defender team is the one who won)
668 else
670
671 // Remove turret
672 for (auto itr = CanonList.begin(); itr != CanonList.end(); ++itr)
673 {
674 if (Creature* creature = GetCreature(*itr))
675 {
676 if (!endByTimer)
677 creature->SetFaction(WintergraspFaction[GetDefenderTeam()]);
678 HideNpc(creature);
679 }
680 }
681
682 // Update all graveyard, control is to defender when no wartime
683 for (uint8 i = 0; i < BATTLEFIELD_WG_GY_HORDE; i++)
684 if (BfGraveyard* graveyard = GetGraveyardById(i))
685 graveyard->GiveControlTo(GetDefenderTeam());
686
687 // Update portals
688 for (auto itr = DefenderPortalList[GetDefenderTeam()].begin(); itr != DefenderPortalList[GetDefenderTeam()].end(); ++itr)
689 if (GameObject* portal = GetGameObject(*itr))
690 portal->SetRespawnTime(RESPAWN_IMMEDIATELY);
691
692 for (auto itr = DefenderPortalList[GetAttackerTeam()].begin(); itr != DefenderPortalList[GetAttackerTeam()].end(); ++itr)
693 if (GameObject* portal = GetGameObject(*itr))
694 portal->SetRespawnTime(RESPAWN_ONE_DAY);
695
696 // Saving data
698 building->Save();
699
700 for (WintergraspWorkshop* workshop : Workshops)
701 workshop->Save();
702
703 for (auto itr = m_PlayersInWar[GetDefenderTeam()].begin(); itr != m_PlayersInWar[GetDefenderTeam()].end(); ++itr)
704 {
705 if (Player* player = ObjectAccessor::FindPlayer(*itr))
706 {
707 player->CastSpell(player, SPELL_ESSENCE_OF_WINTERGRASP, true);
708 player->CastSpell(player, SPELL_VICTORY_REWARD, true);
709 // Complete victory quests
710 player->AreaExploredOrEventHappens(QUEST_VICTORY_WINTERGRASP_A);
711 player->AreaExploredOrEventHappens(QUEST_VICTORY_WINTERGRASP_H);
712 // Send Wintergrasp victory achievement
714 // Award achievement for succeeding in Wintergrasp in 10 minutes or less
715 if (!endByTimer && GetTimer() <= 10000)
717 }
718 }
719
720 for (auto itr = m_PlayersInWar[GetAttackerTeam()].begin(); itr != m_PlayersInWar[GetAttackerTeam()].end(); ++itr)
721 if (Player* player = ObjectAccessor::FindPlayer(*itr))
722 player->CastSpell(player, SPELL_DEFEAT_REWARD, true);
723
724 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
725 {
726 for (auto itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr)
727 if (Player* player = ObjectAccessor::FindPlayer(*itr))
728 RemoveAurasFromPlayer(player);
729
730 m_PlayersInWar[team].clear();
731
732 for (auto itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
733 if (Creature* creature = GetCreature(*itr))
734 if (creature->IsVehicle())
735 creature->DespawnOrUnsummon();
736
737 m_vehicles[team].clear();
738 }
739
740 if (!endByTimer)
741 {
742 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
743 {
744 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
745 {
746 if (Player* player = ObjectAccessor::FindPlayer(*itr))
747 {
748 player->RemoveAurasDueToSpell(m_DefenderTeam == TEAM_ALLIANCE ? SPELL_HORDE_CONTROL_PHASE_SHIFT : SPELL_ALLIANCE_CONTROL_PHASE_SHIFT, player->GetGUID());
750 }
751 }
752 }
753 }
754
755 if (!endByTimer) // win alli/horde
757 else // defend alli/horde
759}
760
761// *******************************************************
762// ******************* Reward System *********************
763// *******************************************************
764void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 /*incrementNumber*/)
765{
766 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievement);
767
768 if (!achievementEntry)
769 return;
770
771 switch (achievement)
772 {
774 {
775 // player->UpdateAchievementCriteria();
776 break;
777 }
778 default:
779 {
780 if (player)
781 player->CompletedAchievement(achievementEntry);
782 break;
783 }
784 }
785
786}
787
792
794{
795 switch (areaId)
796 {
807 case AREA_WINTERGRASP:
811 default:
812 TC_LOG_ERROR("bg.battlefield", "BattlefieldWG::GetSpiritGraveyardId: Unexpected Area Id {}", areaId);
813 break;
814 }
815
816 return 0;
817}
818
820{
821 // Accessing to db spawned creatures
822 switch (creature->GetEntry())
823 {
826 {
828 uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId());
829 if (m_GraveyardList[graveyardId])
830 m_GraveyardList[graveyardId]->SetSpirit(creature, teamId);
831 break;
832 }
833 }
834
835 // untested code - not sure if it is valid.
836 if (IsWarTime())
837 {
838 switch (creature->GetEntry())
839 {
844 {
845 if (!creature->ToTempSummon() || !creature->ToTempSummon()->GetSummonerGUID() || !ObjectAccessor::FindPlayer(creature->ToTempSummon()->GetSummonerGUID()))
846 {
847 creature->DespawnOrUnsummon();
848 return;
849 }
850
852 TeamId team = creator->GetTeamId();
853
854 if (team == TEAM_HORDE)
855 {
857 {
859 creature->AddAura(SPELL_HORDE_FLAG, creature);
860 m_vehicles[team].insert(creature->GetGUID());
862 }
863 else
864 {
865 creature->DespawnOrUnsummon();
866 return;
867 }
868 }
869 else
870 {
872 {
874 creature->AddAura(SPELL_ALLIANCE_FLAG, creature);
875 m_vehicles[team].insert(creature->GetGUID());
877 }
878 else
879 {
880 creature->DespawnOrUnsummon();
881 return;
882 }
883 }
884
885 creature->CastSpell(creator, SPELL_GRAB_PASSENGER, true);
886 break;
887 }
888 }
889 }
890}
891
893{
894/* possibly can be used later
895 if (IsWarTime())
896 {
897 switch (creature->GetEntry())
898 {
899 case NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE:
900 case NPC_WINTERGRASP_SIEGE_ENGINE_HORDE:
901 case NPC_WINTERGRASP_CATAPULT:
902 case NPC_WINTERGRASP_DEMOLISHER:
903 {
904 uint8 team;
905 if (creature->GetFaction() == WintergraspFaction[TEAM_ALLIANCE])
906 team = TEAM_ALLIANCE;
907 else if (creature->GetFaction() == WintergraspFaction[TEAM_HORDE])
908 team = TEAM_HORDE;
909 else
910 return;
911
912 m_vehicles[team].erase(creature->GetGUID());
913 if (team == TEAM_HORDE)
914 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_H, -1);
915 else
916 UpdateData(BATTLEFIELD_WG_DATA_VEHICLE_A, -1);
917 UpdateVehicleCountWG();
918
919 break;
920 }
921 }
922 }*/
923}
924
926{
927 uint8 workshopId = 0;
928
929 switch (go->GetEntry())
930 {
932 workshopId = BATTLEFIELD_WG_WORKSHOP_NE;
933 break;
935 workshopId = BATTLEFIELD_WG_WORKSHOP_NW;
936 break;
938 workshopId = BATTLEFIELD_WG_WORKSHOP_SE;
939 break;
941 workshopId = BATTLEFIELD_WG_WORKSHOP_SW;
942 break;
943 default:
944 return;
945 }
946
947 for (WintergraspWorkshop* workshop : Workshops)
948 {
949 if (workshop->GetId() == workshopId)
950 {
952
953 capturePoint->SetCapturePointData(go);
954 capturePoint->LinkToWorkshop(workshop);
955 AddCapturePoint(capturePoint);
956 break;
957 }
958 }
959}
960
961// Called when player kill a unit in wg zone
963{
964 if (killer == victim)
965 return;
966
967 if (victim->GetTypeId() == TYPEID_PLAYER)
968 {
969 HandlePromotion(killer, victim);
970
971 // Allow to Skin non-released corpse
973 }
974
976}
977
979{
980 for (uint32 team = 0; team < PVP_TEAMS_COUNT; ++team)
981 {
982 auto itr = m_vehicles[team].find(vehicle->GetGUID());
983 if (itr != m_vehicles[team].end())
984 {
985 m_vehicles[team].erase(itr);
986
987 if (team == TEAM_HORDE)
989 else
991 return true;
992 }
993 }
994
995 return false;
996}
997
999{
1000 if (IsWarTime())
1001 if (unit->IsVehicle())
1004}
1005
1006void BattlefieldWG::HandlePromotion(Player* playerKiller, Unit* unitKilled)
1007{
1008 uint32 teamId = playerKiller->GetTeamId();
1009
1010 for (auto iter = m_PlayersInWar[teamId].begin(); iter != m_PlayersInWar[teamId].end(); ++iter)
1011 if (Player* player = ObjectAccessor::FindPlayer(*iter))
1012 if (player->GetDistance2d(unitKilled) < 40.0f)
1013 PromotePlayer(player);
1014}
1015
1016// Update rank for player
1018{
1019 if (!m_isActive)
1020 return;
1021 // Updating rank of player
1022 if (Aura* auraRecruit = killer->GetAura(SPELL_RECRUIT))
1023 {
1024 if (auraRecruit->GetStackAmount() >= 5)
1025 {
1026 killer->RemoveAura(SPELL_RECRUIT);
1027 killer->CastSpell(killer, SPELL_CORPORAL, true);
1028 if (Creature* stalker = GetCreature(StalkerGuid))
1030 }
1031 else
1032 killer->CastSpell(killer, SPELL_RECRUIT, true);
1033 }
1034 else if (Aura* auraCorporal = killer->GetAura(SPELL_CORPORAL))
1035 {
1036 if (auraCorporal->GetStackAmount() >= 5)
1037 {
1038 killer->RemoveAura(SPELL_CORPORAL);
1039 killer->CastSpell(killer, SPELL_LIEUTENANT, true);
1040 if (Creature* stalker = GetCreature(StalkerGuid))
1042 }
1043 else
1044 killer->CastSpell(killer, SPELL_CORPORAL, true);
1045 }
1046}
1047
1059
1061{
1062 RemoveAurasFromPlayer(player);
1063
1064 player->CastSpell(player, SPELL_RECRUIT, true);
1065
1066 if (player->GetZoneId() != m_ZoneId)
1067 {
1068 if (player->GetTeamId() == GetDefenderTeam())
1069 player->TeleportTo(571, 5345, 2842, 410, 3.14f);
1070 else
1071 {
1072 if (player->GetTeamId() == TEAM_HORDE)
1073 player->TeleportTo(571, 5025.857422f, 3674.628906f, 362.737122f, 4.135169f);
1074 else
1075 player->TeleportTo(571, 5101.284f, 2186.564f, 373.549f, 3.812f);
1076 }
1077 }
1078
1080
1081 if (player->GetTeamId() == GetAttackerTeam())
1082 {
1085 }
1086 else
1087 {
1090 }
1091 SendInitWorldStatesTo(player);
1092}
1093
1095{
1096 // 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
1097 if (!player->GetSession()->PlayerLogout())
1098 {
1099 if (Creature* vehicle = player->GetVehicleCreatureBase()) // Remove vehicle of player if he go out.
1100 vehicle->DespawnOrUnsummon();
1101
1102 RemoveAurasFromPlayer(player);
1103 }
1104
1110}
1111
1122
1124{
1125 if (!m_isActive)
1126 RemoveAurasFromPlayer(player);
1127
1129 // Send worldstate to player
1130 SendInitWorldStatesTo(player);
1131}
1132
1134{
1135 switch (data)
1136 {
1137 // Used to determine when the phasing spells must be cast
1138 // See: SpellArea::IsFitToRequirements
1143 // Graveyards and Workshops are controlled by the same team.
1144 if (BfGraveyard const* graveyard = GetGraveyardById(GetSpiritGraveyardId(data)))
1145 return graveyard->GetControlTeamId();
1146 break;
1147 default:
1148 break;
1149 }
1150
1151 return Battlefield::GetData(data);
1152}
1153
1155{
1162
1163 // Note: cleanup these two, their names look awkward
1164 packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_ACTIVE, IsWarTime() ? 0 : 1);
1165 packet.Worldstates.emplace_back(WS_BATTLEFIELD_WG_SHOW_WORLDSTATE, IsWarTime() ? 1 : 0);
1166
1167 for (uint32 itr = 0; itr < 2; ++itr)
1168 packet.Worldstates.emplace_back(ClockWorldState[itr], int32(GameTime::GetGameTime()) + int32(m_Timer) / int32(1000));
1169
1174
1175 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1176 building->FillInitialWorldStates(packet);
1177
1178 for (WintergraspWorkshop* workshop : Workshops)
1179 workshop->FillInitialWorldStates(packet);
1180}
1181
1183{
1184 for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
1185 for (auto itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
1186 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1187 SendInitWorldStatesTo(player);
1188}
1189
1191{
1192 if (team == GetDefenderTeam())
1193 {
1194 for (auto itr = m_PlayersInWar[GetAttackerTeam()].begin(); itr != m_PlayersInWar[GetAttackerTeam()].end(); ++itr)
1195 {
1196 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1197 if (player->GetDistance2d(ASSERT_NOTNULL(GetGameObject(building->GetGUID()))) < 50.0f)
1198 player->KilledMonsterCredit(QUEST_CREDIT_DEFEND_SIEGE);
1199 }
1200 }
1201}
1202
1203// Called when a tower is broke
1205{
1206 // Southern tower
1207 if (team == GetAttackerTeam())
1208 {
1209 // Update counter
1212
1213 // Remove buff stack on attackers
1214 for (auto itr = m_PlayersInWar[GetAttackerTeam()].begin(); itr != m_PlayersInWar[GetAttackerTeam()].end(); ++itr)
1215 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1216 player->RemoveAuraFromStack(SPELL_TOWER_CONTROL);
1217
1218 // Add buff stack to defenders and give achievement/quest credit
1219 for (auto itr = m_PlayersInWar[GetDefenderTeam()].begin(); itr != m_PlayersInWar[GetDefenderTeam()].end(); ++itr)
1220 {
1221 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1222 {
1223 player->CastSpell(player, SPELL_TOWER_CONTROL, true);
1224 player->KilledMonsterCredit(QUEST_CREDIT_TOWERS_DESTROYED);
1226 }
1227 }
1228
1229 // If all three south towers are destroyed (ie. all attack towers), remove ten minutes from battle time
1231 {
1232 if (int32(m_Timer - 600000) < 0)
1233 m_Timer = 0;
1234 else
1235 m_Timer -= 600000;
1237 }
1238 }
1239 else // Keep tower
1240 {
1243 }
1244}
1245
1247{
1248 if (!obj || !IsWarTime())
1249 return;
1250
1251 // We handle only gameobjects here
1252 GameObject* go = obj->ToGameObject();
1253 if (!go)
1254 return;
1255
1256 // On click on titan relic
1258 {
1260 EndBattle(false);
1261 else if (GameObject* relic = GetRelic())
1262 relic->SetRespawnTime(RESPAWN_IMMEDIATELY);
1263 }
1264
1265 // if destroy or damage event, search the wall/tower and update worldstate/send warning message
1266 for (BfWGGameObjectBuilding* building : BuildingsInZone)
1267 {
1268 if (go->GetGUID() == building->GetGUID())
1269 {
1270 if (GameObject* buildingGo = GetGameObject(building->GetGUID()))
1271 {
1272 if (buildingGo->GetGOInfo()->building.damagedEvent == eventId)
1273 building->Damaged();
1274 else if (buildingGo->GetGOInfo()->building.destroyedEvent == eventId)
1275 building->Destroyed();
1276 break;
1277 }
1278 }
1279 }
1280}
1281
1282// Called when a tower is damaged, used for honor reward calcul
1290
1291// Update vehicle count WorldState to player
1299
1301{
1302 uint32 alliancePlayers = m_PlayersInWar[TEAM_ALLIANCE].size();
1303 uint32 hordePlayers = m_PlayersInWar[TEAM_HORDE].size();
1304 int32 newStack = 0;
1305
1306 if (alliancePlayers && hordePlayers)
1307 {
1308 if (alliancePlayers < hordePlayers)
1309 newStack = int32((float(hordePlayers / alliancePlayers) - 1) * 4); // positive, should cast on alliance
1310 else if (alliancePlayers > hordePlayers)
1311 newStack = int32((1 - float(alliancePlayers / hordePlayers)) * 4); // negative, should cast on horde
1312 }
1313
1314 if (newStack == int32(m_tenacityStack))
1315 return;
1316
1317 m_tenacityStack = newStack;
1318 // Remove old buff
1320 {
1321 for (auto itr = m_players[m_tenacityTeam].begin(); itr != m_players[m_tenacityTeam].end(); ++itr)
1322 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1323 if (player->GetLevel() >= m_MinLevel)
1324 player->RemoveAurasDueToSpell(SPELL_TENACITY);
1325
1326 for (auto itr = m_vehicles[m_tenacityTeam].begin(); itr != m_vehicles[m_tenacityTeam].end(); ++itr)
1327 if (Creature* creature = GetCreature(*itr))
1328 creature->RemoveAurasDueToSpell(SPELL_TENACITY_VEHICLE);
1329 }
1330
1331 // Apply new buff
1332 if (newStack)
1333 {
1334 m_tenacityTeam = newStack > 0 ? TEAM_ALLIANCE : TEAM_HORDE;
1335
1336 if (newStack < 0)
1337 newStack = -newStack;
1338 if (newStack > 20)
1339 newStack = 20;
1340
1341 uint32 buff_honor = SPELL_GREATEST_HONOR;
1342 if (newStack < 15)
1343 buff_honor = SPELL_GREATER_HONOR;
1344 if (newStack < 10)
1345 buff_honor = SPELL_GREAT_HONOR;
1346 if (newStack < 5)
1347 buff_honor = 0;
1348
1349 for (auto itr = m_PlayersInWar[m_tenacityTeam].begin(); itr != m_PlayersInWar[m_tenacityTeam].end(); ++itr)
1350 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1351 player->SetAuraStack(SPELL_TENACITY, player, newStack);
1352
1353 for (auto itr = m_vehicles[m_tenacityTeam].begin(); itr != m_vehicles[m_tenacityTeam].end(); ++itr)
1354 if (Creature* creature = GetCreature(*itr))
1355 creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, newStack);
1356
1357 if (buff_honor != 0)
1358 {
1359 for (auto itr = m_PlayersInWar[m_tenacityTeam].begin(); itr != m_PlayersInWar[m_tenacityTeam].end(); ++itr)
1360 if (Player* player = ObjectAccessor::FindPlayer(*itr))
1361 player->CastSpell(player, buff_honor, true);
1362
1363 for (auto itr = m_vehicles[m_tenacityTeam].begin(); itr != m_vehicles[m_tenacityTeam].end(); ++itr)
1364 if (Creature* creature = GetCreature(*itr))
1365 creature->CastSpell(creature, buff_honor, true);
1366 }
1367 }
1368 else
1370}
1371
1373{
1374 m_Bf = battlefield;
1375 m_team = teamInControl;
1376 m_Workshop = nullptr;
1377}
1378
1384
1386{
1387 m_Bf = battlefield;
1388 m_GossipTextId = 0;
1389}
1390
1392{
1393 ASSERT(wg);
1394
1395 _wg = wg;
1397 _type = type;
1398 _worldState = worldState;
1400 _staticTowerInfo = nullptr;
1401}
1402
1404{
1405 switch (_type)
1406 {
1411 _teamControl = _wg->GetDefenderTeam(); // Objects that are part of the keep should be the defender's
1412 break;
1414 _teamControl = _wg->GetAttackerTeam(); // The towers in the south should be the attacker's
1415 break;
1416 default:
1418 break;
1419 }
1420
1421 if (GameObject* build = _wg->GetGameObject(_buildGUID))
1422 {
1423 // Rebuild gameobject
1424 if (build->IsDestructibleBuilding())
1425 {
1426 build->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, nullptr, true);
1427 if (build->GetEntry() == GO_WINTERGRASP_VAULT_GATE)
1429 go->SetGoState(GO_STATE_ACTIVE);
1430
1431 // Update worldstate
1434 }
1436 build->SetFaction(WintergraspFaction[_teamControl]);
1437 }
1438}
1439
1441{
1442 if (GameObject* build = _wg->GetGameObject(_buildGUID))
1443 {
1444 if (build->IsDestructibleBuilding() && build->GetEntry() == GO_WINTERGRASP_VAULT_GATE)
1445 {
1447 go->SetGoState(GO_STATE_READY); //not GO_STATE_ACTIVE
1448 }
1449 }
1450}
1451
1453{
1454 // Update worldstate
1457
1458 // Send warning message
1459 if (_staticTowerInfo)
1461
1463 if (Creature* creature = _wg->GetCreature(guid))
1464 _wg->HideNpc(creature);
1465
1466 for (ObjectGuid guid : m_TurretTopList)
1467 if (Creature* creature = _wg->GetCreature(guid))
1468 _wg->HideNpc(creature);
1469
1474}
1475
1477{
1478 // Update worldstate
1481
1482 // Warn players
1483 if (_staticTowerInfo)
1485
1486 switch (_type)
1487 {
1488 // Inform the global wintergrasp script of the destruction of this object
1492 break;
1494 if (GameObject* build = _wg->GetGameObject(_buildGUID))
1496 go->SetGoState(GO_STATE_ACTIVE);
1498 if (_wg->GetRelic())
1500 else
1501 TC_LOG_ERROR("bg.battlefield.wg", "Titan Relic not found.");
1502 break;
1503 default:
1504 break;
1505 }
1506
1508}
1509
1511{
1512 if (!go)
1513 return;
1514
1515 // GameObject associated to object
1516 _buildGUID = go->GetGUID();
1517
1518 switch (_type)
1519 {
1524 _teamControl = _wg->GetDefenderTeam(); // Objects that are part of the keep should be the defender's
1525 break;
1527 _teamControl = _wg->GetAttackerTeam(); // The towers in the south should be the attacker's
1528 break;
1529 default:
1531 break;
1532 }
1533
1535 switch (_state)
1536 {
1541 break;
1546 break;
1551 break;
1552 default:
1553 break;
1554 }
1555
1556 int32 towerId = -1;
1557 switch (go->GetEntry())
1558 {
1561 break;
1564 break;
1567 break;
1570 break;
1573 break;
1576 break;
1579 break;
1580 }
1581
1582 if (towerId >= BATTLEFIELD_WG_TOWER_SHADOWSIGHT) // Attacker towers
1583 {
1584 // Spawn associate gameobjects
1585 for (WintergraspGameObjectData const& gobData : AttackTowers[towerId - 4].GameObject)
1586 {
1587 if (GameObject* goHorde = _wg->SpawnGameObject(gobData.HordeEntry, gobData.Pos, gobData.Rot))
1588 m_GameObjectList[TEAM_HORDE].push_back(goHorde->GetGUID());
1589
1590 if (GameObject* goAlliance = _wg->SpawnGameObject(gobData.AllianceEntry, gobData.Pos, gobData.Rot))
1591 m_GameObjectList[TEAM_ALLIANCE].push_back(goAlliance->GetGUID());
1592 }
1593
1594 // Spawn associate npc bottom
1596 {
1597 if (Creature* creature = _wg->SpawnCreature(creatureData.HordeEntry, creatureData.Pos))
1598 m_CreatureBottomList[TEAM_HORDE].push_back(creature->GetGUID());
1599
1600 if (Creature* creature = _wg->SpawnCreature(creatureData.AllianceEntry, creatureData.Pos))
1601 m_CreatureBottomList[TEAM_ALLIANCE].push_back(creature->GetGUID());
1602 }
1603 }
1604
1605 if (towerId >= 0)
1606 {
1607 ASSERT(towerId < WG_MAX_TOWER);
1608 _staticTowerInfo = &TowerData[towerId];
1609
1610 // Spawn Turret bottom
1611 for (Position const& turretPos : TowerCannon[towerId].TowerCannonBottom)
1612 {
1613 if (Creature* turret = _wg->SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, turretPos))
1614 {
1615 m_TowerCannonBottomList.push_back(turret->GetGUID());
1616 switch (go->GetEntry())
1617 {
1622 turret->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1623 break;
1627 turret->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1628 break;
1629 }
1630
1631 _wg->HideNpc(turret);
1632 }
1633 }
1634
1635 // Spawn Turret top
1636 for (Position const& towerCannonPos : TowerCannon[towerId].TurretTop)
1637 {
1638 if (Creature* turret = _wg->SpawnCreature(NPC_WINTERGRASP_TOWER_CANNON, towerCannonPos))
1639 {
1640 m_TurretTopList.push_back(turret->GetGUID());
1641 switch (go->GetEntry())
1642 {
1647 turret->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1648 break;
1652 turret->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1653 break;
1654 }
1655 _wg->HideNpc(turret);
1656 }
1657 }
1659 }
1660}
1661
1663{
1665 if (Creature* creature = _wg->GetCreature(guid))
1666 _wg->HideNpc(creature);
1667
1669 if (Creature* creature = _wg->GetCreature(guid))
1670 _wg->ShowNpc(creature, true);
1671
1673 if (Creature* creature = _wg->GetCreature(guid))
1674 _wg->HideNpc(creature);
1675
1677 if (Creature* creature = _wg->GetCreature(guid))
1678 _wg->ShowNpc(creature, true);
1679
1681 if (GameObject* go = _wg->GetGameObject(guid))
1682 go->SetRespawnTime(RESPAWN_ONE_DAY);
1683
1685 if (GameObject* go = _wg->GetGameObject(guid))
1686 go->SetRespawnTime(RESPAWN_IMMEDIATELY);
1687}
1688
1690{
1692 {
1693 if (Creature* creature = _wg->GetCreature(guid))
1694 {
1695 if (disable)
1696 _wg->HideNpc(creature);
1697 else
1698 _wg->ShowNpc(creature, true);
1699
1700 switch (_buildGUID.GetEntry())
1701 {
1706 {
1707 creature->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1708 break;
1709 }
1713 {
1714 creature->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1715 break;
1716 }
1717 }
1718 }
1719 }
1720
1721 for (ObjectGuid guid : m_TurretTopList)
1722 {
1723 if (Creature* creature = _wg->GetCreature(guid))
1724 {
1725 if (disable)
1726 _wg->HideNpc(creature);
1727 else
1728 _wg->ShowNpc(creature, true);
1729
1730 switch (_buildGUID.GetEntry())
1731 {
1736 {
1737 creature->SetFaction(WintergraspFaction[_wg->GetDefenderTeam()]);
1738 break;
1739 }
1743 {
1744 creature->SetFaction(WintergraspFaction[_wg->GetAttackerTeam()]);
1745 break;
1746 }
1747 }
1748 }
1749 }
1750}
1751
1756
1758{
1759 sWorld->setWorldState(_worldState, _state);
1760}
1761
1771
1773{
1774 return _staticInfo->WorkshopId;
1775}
1776
1777void WintergraspWorkshop::GiveControlTo(TeamId teamId, bool init /*= false*/)
1778{
1779 switch (teamId)
1780 {
1781 case TEAM_NEUTRAL:
1782 {
1783 // Send warning message to all player for inform a faction attack a workshop
1784 // alliance / horde attacking workshop
1786 break;
1787 }
1788 case TEAM_ALLIANCE:
1789 {
1790 // Updating worldstate
1793
1794 // Warning message
1795 if (!init)
1796 _wg->SendWarning(_staticInfo->TextIds.AllianceCapture); // workshop taken - alliance
1797
1798 // Found associate graveyard and update it
1801 gy->GiveControlTo(TEAM_ALLIANCE);
1802
1803 _teamControl = teamId;
1804 break;
1805 }
1806 case TEAM_HORDE:
1807 {
1808 // Update worldstate
1811
1812 // Warning message
1813 if (!init)
1814 _wg->SendWarning(_staticInfo->TextIds.HordeCapture); // workshop taken - horde
1815
1816 // Update graveyard control
1819 gy->GiveControlTo(TEAM_HORDE);
1820
1821 _teamControl = teamId;
1822 break;
1823 }
1824 }
1825 if (!init)
1826 _wg->UpdateCounterVehicle(false);
1827}
1828
1836
1841
1843{
1844 sWorld->setWorldState(_staticInfo->WorldStateId, _state);
1845}
1846
1848{
1849public:
1851
1852 Battlefield* GetBattlefield() const override
1853 {
1854 return new BattlefieldWG();
1855 }
1856};
1857
1859{
1860public:
1861 npc_wg_give_promotion_credit() : CreatureScript("npc_wg_give_promotion_credit") { }
1862
1864 {
1866
1867 void JustDied(Unit* killer) override
1868 {
1869 if (!killer || killer->GetTypeId() != TYPEID_PLAYER)
1870 return;
1871
1872 BattlefieldWG* wintergrasp = static_cast<BattlefieldWG*>(sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG));
1873 if (!wintergrasp)
1874 return;
1875
1876 wintergrasp->HandlePromotion(killer->ToPlayer(), me);
1877 }
1878 };
1879
1880 CreatureAI* GetAI(Creature* creature) const override
1881 {
1882 return new npc_wg_give_promotion_creditAI(creature);
1883 }
1884};
1885
#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
@ SPELL_GREATEST_HONOR
@ SPELL_ESSENCE_OF_WINTERGRASP
@ SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA
@ SPELL_RECRUIT
@ SPELL_TENACITY
@ SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT
@ SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT
@ SPELL_GRAB_PASSENGER
@ SPELL_HORDE_CONTROL_PHASE_SHIFT
@ SPELL_VICTORY_REWARD
@ SPELL_CORPORAL
@ SPELL_GREATER_HONOR
@ SPELL_GREAT_HONOR
@ SPELL_ALLIANCE_CONTROL_PHASE_SHIFT
@ SPELL_SPIRITUAL_IMMUNITY
@ SPELL_ALLIANCE_FLAG
@ SPELL_DEFEAT_REWARD
@ SPELL_TENACITY_VEHICLE
@ SPELL_LIEUTENANT
@ SPELL_TOWER_CONTROL
@ 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
@ ACHIEVEMENTS_WIN_WG_TIMER_10
@ ACHIEVEMENTS_WIN_WG_100
@ 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_WON_H
@ BATTLEFIELD_WG_MAPID
@ BATTLEFIELD_WG_DATA_VEHICLE_A
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_A
@ BATTLEFIELD_WG_DATA_MAX
@ BATTLEFIELD_WG_DATA_DAMAGED_TOWER_DEF
@ BATTLEFIELD_WG_DATA_DEF_A
@ BATTLEFIELD_WG_DATA_VEHICLE_H
@ BATTLEFIELD_WG_DATA_DEF_H
@ BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT
@ BATTLEFIELD_WG_DATA_MAX_VEHICLE_H
@ BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT
@ BATTLEFIELD_WG_DATA_BROKEN_TOWER_DEF
@ BATTLEFIELD_WG_DATA_WON_A
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:28
@ BATTLEFIELD_BATTLEID_WG
Definition Battlefield.h:34
@ RESPAWN_IMMEDIATELY
@ RESPAWN_ONE_DAY
@ IN_MILLISECONDS
Definition Common.h:35
@ MINUTE
Definition Common.h:29
#define sCreatureTextMgr
@ TEXT_RANGE_NORMAL
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint32_t uint32
Definition Define.h:133
#define ASSERT_NOTNULL(pointer)
Definition Errors.h:84
#define ASSERT
Definition Errors.h:68
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
#define sMapMgr
Definition MapManager.h:211
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
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
@ CHAT_MSG_ADDON
@ 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
WorldState
@ WS_BATTLEFIELD_WG_WORKSHOP_NE
@ WS_BATTLEFIELD_WG_VEHICLE_H
@ WS_BATTLEFIELD_WG_MAX_VEHICLE_H
@ WS_BATTLEFIELD_WG_SHOW_WORLDSTATE
@ WS_BATTLEFIELD_WG_WORKSHOP_K_E
@ WS_BATTLEFIELD_WG_WORKSHOP_SW
@ WS_BATTLEFIELD_WG_DEFENDED_H
@ WS_BATTLEFIELD_WG_DEFENDER
@ WS_BATTLEFIELD_WG_ATTACKER
@ WS_BATTLEFIELD_WG_ACTIVE
@ WS_BATTLEFIELD_WG_VEHICLE_A
@ WS_BATTLEFIELD_WG_WORKSHOP_K_W
@ WS_BATTLEFIELD_WG_ATTACKED_A
@ 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
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 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.
void SendInitWorldStatesToAll() override
Send all worldstate data to all player in 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
bool Update(uint32 diff) override
Called for update battlefield data.
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
void ProcessEvent(WorldObject *obj, uint32 eventId) override
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet) override
GuidVector CanonList
void HandlePromotion(Player *killer, Unit *killed)
TeamId m_tenacityTeam
Battlefield * GetBattlefield() const override
uint32 m_Timer
uint32 m_MapId
GameObject * SpawnGameObject(uint32 entry, Position const &pos, QuaternionData const &rot)
GraveyardVect m_GraveyardList
GameObject * GetGameObject(ObjectGuid guid)
void ShowNpc(Creature *creature, bool aggressive)
Creature * GetCreature(ObjectGuid guid)
void AddCapturePoint(BfCapturePoint *cp)
uint32 m_MaxPlayer
std::vector< uint32 > m_Data32
ObjectGuid StalkerGuid
Creature * SpawnCreature(uint32 entry, Position const &pos)
uint32 m_NoWarBattleTime
void EndBattle(bool endByTimer)
virtual void SetData(uint32 dataId, uint32 value) override
uint32 m_BattleTime
bool IsWarTime() const
Return true if battle is start, false if battle is not started.
uint32 m_ZoneId
void InitStalker(uint32 entry, Position const &pos)
uint32 m_TypeId
uint32 m_BattleId
uint32 m_StartGroupingTimer
virtual bool Update(uint32 diff)
Called every time for update bf data and time.
void RegisterZone(uint32 zoneid)
TeamId m_DefenderTeam
void SendWarning(uint8 id, WorldObject const *target=nullptr)
uint32 m_TimeForAcceptInvite
BfGraveyard * GetGraveyardById(uint32 id) const
GuidUnorderedSet m_PlayersInWar[PVP_TEAMS_COUNT]
void HideNpc(Creature *creature)
uint32 m_RestartAfterCrash
void SendUpdateWorldState(uint32 variable, uint32 value)
Update data of a worldstate to all players present in zone.
TeamId GetAttackerTeam() const
uint32 m_MinLevel
void SendInitWorldStatesTo(Player *player)
TeamId GetDefenderTeam() const
uint32 m_MinPlayer
uint32 GetTimer() const
virtual uint32 GetData(uint32 dataId) const override
bool m_StartGrouping
WorldLocation KickPosition
void SetGraveyardNumber(uint32 number)
bool IsEnabled() const
Return if battlefield is enable.
GuidUnorderedSet m_players[PVP_TEAMS_COUNT]
Battlefield * m_Bf
bool SetCapturePointData(GameObject *capturePoint)
BfGraveyardWG(BattlefieldWG *Bf)
void SetTextId(uint32 textId)
uint32 m_GossipTextId
Battlefield * m_Bf
void Initialize(TeamId startcontrol, uint32 gy)
Creature *const me
Definition CreatureAI.h:82
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void RemoveFlag(GameObjectFlags flags)
Definition GameObject.h:172
void SetDestructibleState(GameObjectDestructibleState state, WorldObject *attackerOrHealer=nullptr, bool setHealth=false)
bool IsEmpty() const
Definition ObjectGuid.h:172
uint32 GetEntry() const
Definition ObjectGuid.h:155
void Clear()
Definition ObjectGuid.h:150
static GameObject * ToGameObject(Object *o)
Definition Object.h:198
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
static Player * ToPlayer(Object *o)
Definition Object.h:180
void CompletedAchievement(AchievementEntry const *entry)
Definition Player.cpp:24945
WorldSession * GetSession() const
Definition Player.h:1719
TeamId GetTeamId() const
Definition Player.h:1833
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0)
Definition Player.cpp:1524
ObjectGuid GetSummonerGUID() const
Definition Unit.h:769
bool IsVehicle() const
Definition Unit.h:887
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4439
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3638
Creature * GetVehicleCreatureBase() const
Definition Unit.cpp:11847
void SetAuraStack(uint32 spellId, Unit *target, uint32 stack)
Definition Unit.cpp:12010
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:11964
TempSummon * ToTempSummon()
Definition Unit.h:1794
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
WintergraspCapturePoint(BattlefieldWG *battlefield, TeamId teamInControl)
void ChangeTeam(TeamId oldteam) override
WintergraspWorkshop * m_Workshop
void LinkToWorkshop(WintergraspWorkshop *workshop)
uint32 m_mapId
Definition Position.h:195
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition Object.cpp:2121
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
uint32 GetAreaId() const
Definition Object.h:374
uint32 GetZoneId() const
Definition Object.h:373
std::vector< WorldStateInfo > Worldstates
bool PlayerLogout() const
CreatureAI * GetAI(Creature *creature) const override
#define sWorld
Definition World.h:900
@ CONFIG_WINTERGRASP_PLR_MIN_LVL
Definition World.h:367
@ CONFIG_WINTERGRASP_BATTLETIME
Definition World.h:368
@ CONFIG_WINTERGRASP_NOBATTLETIME
Definition World.h:369
@ CONFIG_WINTERGRASP_RESTART_AFTER_CRASH
Definition World.h:370
@ CONFIG_WINTERGRASP_PLR_MAX
Definition World.h:365
@ CONFIG_WINTERGRASP_PLR_MIN
Definition World.h:366
@ CONFIG_WINTERGRASP_ENABLE
Definition World.h:157
ObjectData const creatureData[]
time_t GetGameTime()
Definition GameTime.cpp:42
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TeamId StartControl
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]
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet)
GuidVector m_GameObjectList[PVP_TEAMS_COUNT]
void GetPosition(float &x, float &y) const
Definition Position.h:84
void Relocate(float x, float y)
Definition Position.h:66
struct StaticWintergraspTowerInfo::@271 TextIds
struct StaticWintergraspWorkshopInfo::@272 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)
void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &packet)