diff --git a/sql/updates/world/3.3.5/2016_MM_DD_NN_world_335.sql b/sql/updates/world/3.3.5/2016_MM_DD_NN_world_335.sql new file mode 100644 index 0000000000000..7010b803cf2ef --- /dev/null +++ b/sql/updates/world/3.3.5/2016_MM_DD_NN_world_335.sql @@ -0,0 +1,342 @@ +SET @OGUID := 90670; -- 252 free guids +SET @CGUID := 145656; -- 56 free guids + +-- ALTERAC VALLEY +DELETE FROM `gameobject` WHERE `map`=30; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(@OGUID+ 0, 3832, 30, 0, 0, 15, 1, -1235.571, -241.4781, 73.43774, 1.483528, 0, 0, 0.6755896, 0.7372779, 7200, 255, 1, 11159), +(@OGUID+ 1, 3833, 30, 0, 0, 15, 1, -1248.852, -254.0604, 73.43774, 1.483528, 0, 0, 0.6755896, 0.7372779, 7200, 255, 1, 11159), +(@OGUID+ 2, 3834, 30, 0, 0, 15, 1, -1248.149, -245.5994, 73.43774, -0.05235888, 0, 0, -0.02617645, 0.9996573, 7200, 255, 1, 11159), +(@OGUID+ 3, 3835, 30, 0, 0, 15, 1, -1237.206, -260.1676, 73.43774, 1.483528, 0, 0, 0.6755896, 0.7372779, 7200, 255, 1, 11159), +(@OGUID+ 4, 3836, 30, 0, 0, 15, 1, -1260.366, -248.767, 77.9454, 1.483528, 0, 0, 0.6755896, 0.7372779, 7200, 255, 1, 11159), +(@OGUID+ 5, 3837, 30, 0, 0, 15, 1, -1249.315, -244.9075, 92.33715, 0.4014249, 0, 0, 0.1993675, 0.9799248, 7200, 255, 1, 11159), +(@OGUID+ 6, 3838, 30, 0, 0, 15, 1, -1250.092, -254.6036, 92.30151, 0.1483523, 0, 0, 0.07410812, 0.9972502, 7200, 255, 1, 11159), +(@OGUID+ 7, 22205, 30, 0, 0, 15, 1, 50.64006, -421.1664, 44.73254, -0.008752518, -0.008586407, 0.001552582, -0.00436306, 0.9999524, 7200, 255, 1, 11159), +(@OGUID+ 8, 22207, 30, 0, 0, 15, 1, 30.41684, -428.8528, 41.52804, -2.591811, 0, 0, -0.9624548, 0.271442, 7200, 255, 1, 11159), +(@OGUID+ 9, 22208, 30, 0, 0, 15, 1, 31.22163, -428.0805, 41.52804, 0.5497769, 0, 0, 0.2714396, 0.9624555, 7200, 255, 1, 11159), +(@OGUID+ 10, 28048, 30, 0, 0, 15, 1, 41.16716, -426.8661, 44.68276, 2.783795, 0, 0, 0.9840403, 0.177946, 7200, 255, 1, 11159), +(@OGUID+ 11, 28049, 30, 0, 0, 15, 1, 39.09879, -425.7462, 44.68799, -0.6195911, 0, 0, -0.3048639, 0.9523959, 7200, 255, 1, 11159), +(@OGUID+ 12, 28605, 30, 0, 0, 15, 1, 25.24818, -433.1045, 47.63694, 2.382372, 0, 0, 0.9288092, 0.3705584, 7200, 255, 1, 11159), +(@OGUID+ 13, 28606, 30, 0, 0, 15, 1, 25.75797, -425.8373, 47.63694, -1.980947, 0, 0, -0.8362856, 0.5482941, 7200, 255, 1, 11159), +(@OGUID+ 14, 28607, 30, 0, 0, 15, 1, 27.67865, -427.6901, 47.63694, -2.67908, 0, 0, -0.9733791, 0.2292009, 7200, 255, 1, 11159), +(@OGUID+ 15, 29784, 30, 0, 0, 15, 1, -769.7254, -361.5641, 90.89486, 1.207512, 0, 0, 0.5677385, 0.8232089, 7200, 255, 1, 11159), +(@OGUID+ 16, 32571, 30, 0, 0, 15, 1, -100.0708, -583.5117, 41.73163, 0.00872424, 0, 0, 0.004362106, 0.9999905, 7200, 255, 1, 15595), +(@OGUID+ 17, 32572, 30, 0, 0, 15, 1, -102.7332, -588.7753, 41.73163, 5.244716, 0, 0, -0.4962158, 0.8681992, 7200, 255, 1, 15595), +(@OGUID+ 18, 32573, 30, 0, 0, 15, 1, -100.9658, -586.958, 41.73163, -0.5148712, 0, 0, -0.2546015, 0.9670461, 7200, 255, 1, 12340), +(@OGUID+ 19, 32574, 30, 0, 0, 15, 1, -106.1718, -589.7208, 41.73163, 4.721118, 0, 0, -0.7040138, 0.7101862, 7200, 255, 1, 15595), +(@OGUID+ 20, 34571, 30, 0, 0, 15, 1, -105.4234, -584.3517, 42.01492, 2.364918, 0, 0, 0.92554, 0.3786499, 7200, 255, 1, 15595), +(@OGUID+ 21, 50984, 30, 0, 0, 15, 1, -1250.393, -310.1914, 61.18503, -1.108282, 0.02402067, 0.005655289, -0.5263119, 0.8499334, 7200, 255, 1, 11159), +(@OGUID+ 22, 51704, 30, 0, 0, 15, 1, -1245.201, -307.0587, 63.31994, 3.079595, -0.007111549, -0.02363014, 0.9992199, 0.03083236, 7200, 255, 1, 11159), +(@OGUID+ 23, 51705, 30, 0, 0, 15, 1, -1258.226, -310.9775, 63.20155, 0.8629053, 0.01797438, -0.01690865, 0.4182558, 0.907994, 7200, 255, 1, 11159), +(@OGUID+ 24, 161487, 30, 0, 0, 15, 1, 361.0979, -531.6929, 71.18977, -2.155478, 0, 0, -0.8808899, 0.4733212, 7200, 255, 1, 11159), +(@OGUID+ 25, 161488, 30, 0, 0, 15, 1, 360.9155, -497.0985, 71.33891, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 11159), +(@OGUID+ 26, 161489, 30, 0, 0, 15, 1, 360.38, -527.5487, 71.12045, -2.050761, 0, 0, -0.8549118, 0.5187734, 7200, 255, 1, 11159), +(@OGUID+ 27, 177261, 30, 0, 0, 15, 1, -1290.274, -172.4705, 72.18534, 3.06302, 0.008719921, -0.000342369, 0.9991903, 0.03927478, 7200, 255, 1, 11159), +(@OGUID+ 28, 177262, 30, 0, 0, 15, 1, -1286.249, -184.4801, 71.8334, -2.05076, -0.007330894, -0.02995968, -0.8542576, 0.5189341, 7200, 255, 1, 11159), +(@OGUID+ 29, 177262, 30, 0, 0, 15, 1, -1286.248, -184.4809, 71.8334, 4.232426, -0.007330894, -0.02995968, -0.8542576, 0.5189341, 7200, 255, 1, 18414), +(@OGUID+ 30, 177263, 30, 0, 0, 15, 1, -1280.174, -220.5372, 72.26861, 1.623153, 0, 0, 0.7253733, 0.6883557, 7200, 255, 1, 11159), +(@OGUID+ 31, 177263, 30, 0, 0, 15, 1, -1280.174, -220.5365, 72.26861, 1.623153, 0, 0, 0.7253733, 0.6883557, 7200, 255, 1, 18414), +(@OGUID+ 32, 177292, 30, 0, 0, 15, 1, -1099.208, -266.231, 57.88491, 3.996807, 0, 0, -0.9099607, 0.4146944, 7200, 255, 1, 15595), +(@OGUID+ 33, 177292, 30, 0, 0, 15, 1, -1099.208, -266.2309, 57.88491, 3.996807, 0, 0, -0.9099607, 0.4146944, 7200, 255, 1, 18414), +(@OGUID+ 34, 177293, 30, 0, 0, 15, 1, -1082.602, -266.6807, 57.85752, 2.408554, 0, 0, 0.9335804, 0.358368, 7200, 255, 1, 15595), +(@OGUID+ 35, 177293, 30, 0, 0, 15, 1, -1082.602, -266.6806, 57.85752, 2.408549, 0, 0, 0.9335794, 0.3583705, 7200, 255, 1, 18414), +(@OGUID+ 36, 177324, 30, 0, 0, 15, 1, -375.0174, -523.7101, 84.07706, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 18414), +(@OGUID+ 37, 177325, 30, 0, 0, 15, 1, -413.5104, -521.4132, 84.07706, 2.059484, 0, 0, 0.8571663, 0.5150397, 7200, 255, 1, 18414), +(@OGUID+ 38, 177326, 30, 0, 0, 15, 1, -487.401, -526.4861, 82.57085, 5.471609, 0, 0, -0.394743, 0.9187916, 7200, 255, 1, 18414), +(@OGUID+ 39, 177327, 30, 0, 0, 15, 1, -251.556, -562.0612, 68.17248, -0.165805, 0, 0, -0.08280754, 0.9965656, 7200, 255, 1, 12340), +(@OGUID+ 40, 177396, 30, 0, 0, 15, 1, 12.82465, -120.2101, 41.66688, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 18414), +(@OGUID+ 41, 177405, 30, 0, 0, 15, 1, -1140.816, -343.3924, 50.90771, 3.49939, 0, 0, -0.9840403, 0.177946, 7200, 255, 1, 15595), +(@OGUID+ 42, 177406, 30, 0, 0, 15, 1, -1139.682, -356.2882, 51.26402, 5.576327, 0, 0, -0.346117, 0.9381914, 7200, 255, 1, 15595), +(@OGUID+ 43, 177408, 30, 0, 0, 15, 1, -743.4271, -398.2413, 76.42656, 0.8726641, 0.01739359, -0.00633049, 0.4227009, 0.9060802, 7200, 255, 1, 18414), +(@OGUID+ 44, 177408, 30, 0, 0, 15, 1, -743.4266, -398.242, 76.42656, 0.8726641, 0.01739359, -0.00633049, 0.4227009, 0.9060802, 7200, 255, 1, 15595), +(@OGUID+ 45, 177409, 30, 0, 0, 15, 1, -1215.592, -371.9459, 56.5293, 0.3577918, 0, 0, 0.1779432, 0.9840407, 7200, 255, 1, 11159), +(@OGUID+ 46, 177409, 30, 0, 0, 15, 1, -1215.592, -371.9462, 56.5293, 0.3577918, 0, 0, 0.1779432, 0.9840407, 7200, 255, 1, 18414), +(@OGUID+ 47, 177410, 30, 0, 0, 15, 1, -1241.247, -345.115, 59.68674, 0.3577918, 0, 0, 0.1779432, 0.9840407, 7200, 255, 1, 11159), +(@OGUID+ 48, 177410, 30, 0, 0, 15, 1, -1241.247, -345.1146, 59.68674, 0.3577918, 0, 0, 0.1779432, 0.9840407, 7200, 255, 1, 18414), +(@OGUID+ 49, 177411, 30, 0, 0, 15, 1, -1202.806, -271.599, 72.58054, 0.3577918, 0, 0, 0.1779432, 0.9840407, 7200, 255, 1, 18414), +(@OGUID+ 50, 177411, 30, 0, 0, 15, 1, -1202.805, -271.5985, 72.58054, 0.3577918, 0, 0, 0.1779432, 0.9840407, 7200, 255, 1, 11159), +(@OGUID+ 51, 177412, 30, 0, 0, 15, 1, -1282.208, -284.0833, 87.25603, -0.0610847, 0, 0, -0.03053761, 0.9995336, 7200, 255, 1, 11159), +(@OGUID+ 52, 177413, 30, 0, 0, 15, 1, -1256.554, -280.2778, 73.94735, -0.0610847, 0, 0, -0.03053761, 0.9995336, 7200, 255, 1, 11159), +(@OGUID+ 53, 177425, 30, 0, 0, 15, 1, -353.1182, 37.0957, 65.89037, 3.141593, 0, 0, -1, 0, 7200, 255, 1, 18414), +(@OGUID+ 54, 178442, 30, 0, 0, 15, 1, -1260.266, -316.1721, 64.10173, 3.804818, 0, 0, -0.9455185, 0.3255684, 7200, 255, 1, 15354), +(@OGUID+ 55, 178442, 30, 0, 0, 15, 1, -1260.188, -316.3151, 62.78687, 4.101525, 0, 0, -0.8870106, 0.4617491, 7200, 255, 1, 15354), +(@OGUID+ 56, 178443, 30, 0, 0, 15, 1, 649.3871, -59.03125, 43.17221, 5.201083, 0, 0, -0.5150375, 0.8571676, 7200, 255, 1, 15595), +(@OGUID+ 57, 178646, 30, 0, 0, 15, 1, 639.2078, -60.17426, 41.65714, 0, 0, 0, 0, 1, 7200, 255, 1, 15595), +(@OGUID+ 58, 178646, 30, 0, 0, 15, 1, 639.2851, -60.16748, 42.2613, 0, 0, 0, 0, 1, 7200, 255, 1, 15595), +(@OGUID+ 59, 178646, 30, 0, 0, 15, 1, 639.3954, -58.69206, 41.65714, 6.248279, 0, 0, -0.01745224, 0.9998477, 7200, 255, 1, 15595), +(@OGUID+ 60, 178646, 30, 0, 0, 15, 1, 639.4116, -58.71392, 42.24741, 6.265733, 0, 0, -0.00872612, 0.9999619, 7200, 255, 1, 15595), +(@OGUID+ 61, 178646, 30, 0, 0, 15, 1, 639.7105, -57.21251, 41.65714, -1.64061, 0, 0, -0.7313538, 0.6819983, 7200, 255, 1, 11159), +(@OGUID+ 62, 178646, 30, 0, 0, 15, 1, 639.7322, -57.26042, 42.27519, -1.605702, 0, 0, -0.7193394, 0.6946588, 7200, 255, 1, 11159), +(@OGUID+ 63, 178646, 30, 0, 0, 15, 1, 640.8292, -55.81939, 41.79124, 1.151916, 0, 0, 0.5446386, 0.8386708, 7200, 255, 1, 11159), +(@OGUID+ 64, 178646, 30, 0, 0, 15, 1, 640.8867, -55.83501, 42.37793, -1.832595, 0, 0, -0.7933531, 0.6087617, 7200, 255, 1, 11159), +(@OGUID+ 65, 178684, 30, 0, 0, 15, 1, 649.2648, -59.11024, 41.54757, -2.687807, 0, 0, -0.97437, 0.2249513, 7200, 255, 1, 11159), +(@OGUID+ 66, 178685, 30, 0, 0, 15, 1, 646.2073, -57.24284, 41.65868, -0.157079, 0, 0, -0.07845879, 0.9969174, 7200, 255, 1, 11159), +(@OGUID+ 67, 179004, 30, 0, 0, 15, 1, -1389.342, -225.4537, 99.37102, 0.6632232, 0, 0, 0.3255672, 0.9455189, 7200, 255, 1, 11159), +(@OGUID+ 68, 179004, 30, 0, 0, 15, 1, -1384.01, -212.3744, 99.37101, -2.687807, 0, 0, -0.97437, 0.2249513, 7200, 255, 1, 11159), +(@OGUID+ 69, 179004, 30, 0, 0, 15, 1, -1371.358, -216.9606, 99.37109, -0.03490625, 0, 0, -0.01745224, 0.9998477, 7200, 255, 1, 12340), +(@OGUID+ 70, 179004, 30, 0, 0, 15, 1, -1370.873, -205.3521, 99.37126, 0.2094394, 0, 0, 0.1045284, 0.9945219, 7200, 255, 1, 12340), +(@OGUID+ 71, 179004, 30, 0, 0, 15, 1, -1367.185, -240.3469, 99.37103, 0.157079, 0, 0, 0.07845879, 0.9969174, 7200, 255, 1, 11159), +(@OGUID+ 72, 179004, 30, 0, 0, 15, 1, -1361.594, -207.9366, 99.37007, 3.211419, 0, 0, -0.9993906, 0.03490613, 7200, 255, 1, 15211), +(@OGUID+ 73, 179005, 30, 0, 0, 15, 1, -1389.554, -230.8881, 99.37132, -0.8901166, 0, 0, -0.4305105, 0.9025856, 7200, 255, 1, 11159), +(@OGUID+ 74, 179005, 30, 0, 0, 15, 1, -1384.01, -212.3744, 99.37101, 3.595379, 0, 0, -0.97437, 0.2249513, 7200, 255, 1, 15211), +(@OGUID+ 75, 179005, 30, 0, 0, 15, 1, -1377.055, -210.8183, 99.3698, -0.01745246, 0, 0, -0.00872612, 0.9999619, 7200, 255, 1, 11159), +(@OGUID+ 76, 179005, 30, 0, 0, 15, 1, -1373.279, -220.9129, 98.42658, 2.44346, 0, 0, 0.9396925, 0.3420205, 7200, 255, 1, 15211), +(@OGUID+ 77, 179005, 30, 0, 0, 15, 1, -1371.358, -216.9606, 99.37109, 6.248279, 0, 0, -0.01745224, 0.9998477, 7200, 255, 1, 15211), +(@OGUID+ 78, 179005, 30, 0, 0, 15, 1, -1370.873, -205.3521, 99.37126, 0.2094394, 0, 0, 0.1045284, 0.9945219, 7200, 255, 1, 11159), +(@OGUID+ 79, 179005, 30, 0, 0, 15, 1, -1368.373, -218.8868, 98.42658, -0.2443456, 0, 0, -0.1218691, 0.9925462, 7200, 255, 1, 12340), +(@OGUID+ 80, 179005, 30, 0, 0, 15, 1, -1361.594, -207.9366, 99.37007, -3.071766, 0, 0, -0.9993906, 0.03490613, 7200, 255, 1, 11159), +(@OGUID+ 81, 179006, 30, 0, 0, 15, 1, 715.3495, 2.809136, 50.6213, 4.450591, 0, 0, -0.7933531, 0.6087617, 7200, 255, 1, 16357), +(@OGUID+ 82, 179006, 30, 0, 0, 15, 1, 717.6694, 1.327962, 50.6213, 2.513274, 0, 0, 0.9510565, 0.3090171, 7200, 255, 1, 16357), +(@OGUID+ 83, 179006, 30, 0, 0, 15, 1, 717.8631, 4.872233, 50.6213, 1.745327, 0, 0, 0.7660437, 0.6427886, 7200, 255, 1, 16357), +(@OGUID+ 84, 179006, 30, 0, 0, 15, 1, 718.0543, 3.516113, 50.6213, 4.206246, 0, 0, -0.8616285, 0.5075394, 7200, 255, 1, 15595), +(@OGUID+ 85, 179006, 30, 0, 0, 15, 1, 721.5579, 1.249674, 50.6213, 1.954769, 0, 0, 0.8290377, 0.5591928, 7200, 255, 1, 16357), +(@OGUID+ 86, 179006, 30, 0, 0, 15, 1, 724.2276, -28.85346, 50.6213, 0.5410506, 0, 0, 0.2672377, 0.9636307, 7200, 255, 1, 15595), +(@OGUID+ 87, 179006, 30, 0, 0, 15, 1, 725.657, -27.43962, 50.6213, 0.6283169, 0, 0, 0.3090162, 0.9510568, 7200, 255, 1, 15595), +(@OGUID+ 88, 179006, 30, 0, 0, 15, 1, 727.4426, -27.4203, 50.6213, 1.343901, 0, 0, 0.6225138, 0.7826088, 7200, 255, 1, 16357), +(@OGUID+ 89, 179007, 30, 0, 0, 15, 1, 715.3495, 2.809136, 50.6213, 4.450591, 0, 0, -0.7933531, 0.6087617, 7200, 255, 1, 15595), +(@OGUID+ 90, 179007, 30, 0, 0, 15, 1, 717.8631, 4.872233, 50.6213, 1.745327, 0, 0, 0.7660437, 0.6427886, 7200, 255, 1, 16357), +(@OGUID+ 91, 179007, 30, 0, 0, 15, 1, 718.0543, 3.516113, 50.6213, 4.206246, 0, 0, -0.8616285, 0.5075394, 7200, 255, 1, 15595), +(@OGUID+ 92, 179007, 30, 0, 0, 15, 1, 724.2276, -28.85346, 50.6213, 0.5410506, 0, 0, 0.2672377, 0.9636307, 7200, 255, 1, 15595), +(@OGUID+ 93, 179007, 30, 0, 0, 15, 1, 725.657, -27.43962, 50.6213, 0.6283169, 0, 0, 0.3090162, 0.9510568, 7200, 255, 1, 16357), +(@OGUID+ 94, 179007, 30, 0, 0, 15, 1, 727.1169, -28.92573, 50.6213, 2.775069, 0, 0, 0.9832544, 0.182238, 7200, 255, 1, 16357), +(@OGUID+ 95, 179007, 30, 0, 0, 15, 1, 727.4426, -27.4203, 50.6213, 1.343901, 0, 0, 0.6225138, 0.7826088, 7200, 255, 1, 15595), +(@OGUID+ 96, 179008, 30, 0, 0, 15, 1, 717.6694, 1.327962, 50.6213, 2.513274, 0, 0, 0.9510565, 0.3090171, 7200, 255, 1, 15595), +(@OGUID+ 97, 179008, 30, 0, 0, 15, 1, 721.5579, 1.249674, 50.6213, 1.954769, 0, 0, 0.8290377, 0.5591928, 7200, 255, 1, 15595), +(@OGUID+ 98, 179008, 30, 0, 0, 15, 1, 722.9255, -31.23557, 50.6213, 4.625124, 0, 0, -0.737277, 0.6755905, 7200, 255, 1, 15595), +(@OGUID+ 99, 179008, 30, 0, 0, 15, 1, 725.657, -27.43962, 50.6213, 0.6283169, 0, 0, 0.3090162, 0.9510568, 7200, 255, 1, 15595), +(@OGUID+100, 179008, 30, 0, 0, 15, 1, 726.8529, -22.96859, 50.6213, 1.623156, 0, 0, 0.7253742, 0.6883547, 7200, 255, 1, 15595), +(@OGUID+101, 179008, 30, 0, 0, 15, 1, 727.1169, -28.92573, 50.6213, 2.775069, 0, 0, 0.9832544, 0.182238, 7200, 255, 1, 16357), +(@OGUID+102, 179008, 30, 0, 0, 15, 1, 727.4426, -27.4203, 50.6213, 1.343901, 0, 0, 0.6225138, 0.7826088, 7200, 255, 1, 15595), +(@OGUID+103, 179024, 30, 0, 0, 15, 1, 63.27116, 5.837619, -4.096218, 2.216565, 0, 0, 0.8949337, 0.4461992, 7200, 255, 1, 18414), +(@OGUID+104, 179025, 30, 0, 0, 15, 1, -1551.88, -364.1875, 65.59335, -1.954766, 0, 0, -0.8290367, 0.5591941, 7200, 255, 1, 11159), +(@OGUID+105, 179384, 30, 0, 0, 15, 1, -145.3414, -444.8457, 26.4163, -0.05235888, 0, 0, -0.02617645, 0.9996573, 7200, 255, 1, 11159), +(@OGUID+106, 179384, 30, 0, 0, 15, 1, -145.3414, -444.8457, 26.41626, 6.230826, 0, 0, -0.02617645, 0.9996573, 7200, 255, 1, 15595), +(@OGUID+107, 179384, 30, 0, 0, 15, 1, 560.8342, -75.42657, 37.9558, 0.7853968, 0, 0, 0.3826828, 0.9238798, 7200, 255, 1, 11159), +(@OGUID+108, 179384, 30, 0, 0, 15, 1, 560.8342, -75.42658, 37.9558, 0.7853968, 0, 0, 0.3826828, 0.9238798, 7200, 255, 1, 15595), +(@OGUID+109, 179385, 30, 0, 0, 15, 1, -155.4047, -440.2401, 33.2862, 2.347469, 0, 0, 0.9222012, 0.3867105, 7200, 255, 1, 11159), +(@OGUID+110, 179385, 30, 0, 0, 15, 1, -155.4047, -440.2401, 33.28616, 2.347469, 0, 0, 0.9222012, 0.3867105, 7200, 255, 1, 15595), +(@OGUID+111, 179385, 30, 0, 0, 15, 1, 550.678, -79.82339, 44.8257, -3.097919, 0, 0, -0.9997616, 0.02183524, 7200, 255, 1, 11159), +(@OGUID+112, 179385, 30, 0, 0, 15, 1, 550.678, -79.8234, 44.8257, 3.185267, 0, 0, -0.9997616, 0.02183524, 7200, 255, 1, 15595), +(@OGUID+113, 179386, 30, 0, 0, 15, 1, -150.7866, -459.8294, 26.4163, 0.5585039, 0, 0, 0.2756367, 0.9612619, 7200, 255, 1, 11159), +(@OGUID+114, 179386, 30, 0, 0, 15, 1, -150.7866, -459.8294, 26.41626, 0.5585039, 0, 0, 0.2756367, 0.9612619, 7200, 255, 1, 15595), +(@OGUID+115, 179386, 30, 0, 0, 15, 1, 568.3257, -89.49924, 37.9558, 1.396262, 0, 0, 0.642787, 0.766045, 7200, 255, 1, 11159), +(@OGUID+116, 179387, 30, 0, 0, 15, 1, -153.7484, -438.6393, 33.2862, -2.888511, 0, 0, -0.9920044, 0.1262032, 7200, 255, 1, 11159), +(@OGUID+117, 179387, 30, 0, 0, 15, 1, -153.7484, -438.6393, 33.28616, 3.394674, 0, 0, -0.9920044, 0.1262032, 7200, 255, 1, 15595), +(@OGUID+118, 179387, 30, 0, 0, 15, 1, 550.5966, -77.52127, 44.8257, -2.050761, 0, 0, -0.8549118, 0.5187734, 7200, 255, 1, 11159), +(@OGUID+119, 179387, 30, 0, 0, 15, 1, 550.5966, -77.52128, 44.8257, 4.232424, 0, 0, -0.8549118, 0.5187734, 7200, 255, 1, 15595), +(@OGUID+120, 179388, 30, 0, 0, 15, 1, -149.0568, -461.0892, 26.4163, 1.387538, 0, 0, 0.6394396, 0.7688413, 7200, 255, 1, 11159), +(@OGUID+121, 179388, 30, 0, 0, 15, 1, -149.0568, -461.0892, 26.41626, 1.387538, 0, 0, 0.6394396, 0.7688413, 7200, 255, 1, 15595), +(@OGUID+122, 179388, 30, 0, 0, 15, 1, 570.4194, -89.05669, 37.9558, 2.225294, 0, 0, 0.8968725, 0.4422892, 7200, 255, 1, 11159), +(@OGUID+123, 179389, 30, 0, 0, 15, 1, -168.3424, -458.4003, 33.2862, -0.4450589, 0, 0, -0.2206974, 0.9753423, 7200, 255, 1, 11159), +(@OGUID+124, 179389, 30, 0, 0, 15, 1, -168.3424, -458.4003, 33.28616, 5.838127, 0, 0, -0.2206974, 0.9753423, 7200, 255, 1, 15595), +(@OGUID+125, 179389, 30, 0, 0, 15, 1, 555.5166, -101.5895, 44.8257, 0.3926971, 0, 0, 0.1950893, 0.9807855, 7200, 255, 1, 11159), +(@OGUID+126, 179390, 30, 0, 0, 15, 1, -142.968, -444.0764, 26.4163, -2.234018, 0, 0, -0.8987932, 0.4383728, 7200, 255, 1, 11159), +(@OGUID+127, 179390, 30, 0, 0, 15, 1, -142.968, -444.0764, 26.41626, 4.049168, 0, 0, -0.8987932, 0.4383728, 7200, 255, 1, 15595), +(@OGUID+128, 179390, 30, 0, 0, 15, 1, 561.8506, -73.14806, 37.9558, -1.396262, 0, 0, -0.642787, 0.766045, 7200, 255, 1, 11159), +(@OGUID+129, 179390, 30, 0, 0, 15, 1, 561.8506, -73.14807, 37.9558, 4.886924, 0, 0, -0.642787, 0.766045, 7200, 255, 1, 15595), +(@OGUID+130, 179391, 30, 0, 0, 15, 1, -172.363, -452.8242, 33.27962, 0.6283189, 0, 0, 0.3090172, 0.9510564, 7200, 255, 1, 11159), +(@OGUID+131, 179391, 30, 0, 0, 15, 1, -172.363, -452.8242, 33.27958, 0.6283189, 0, 0, 0.3090172, 0.9510564, 7200, 255, 1, 15595), +(@OGUID+132, 179391, 30, 0, 0, 15, 1, 548.6824, -100.8462, 44.81912, 1.466076, 0, 0, 0.6691303, 0.743145, 7200, 255, 1, 11159), +(@OGUID+133, 179392, 30, 0, 0, 15, 1, -171.2817, -456.8917, 33.27962, 1.631882, 0, 0, 0.7283707, 0.6851833, 7200, 255, 1, 11159), +(@OGUID+134, 179392, 30, 0, 0, 15, 1, -171.2817, -456.8917, 33.27958, 1.631882, 0, 0, 0.7283707, 0.6851833, 7200, 255, 1, 15595), +(@OGUID+135, 179392, 30, 0, 0, 15, 1, 552.4286, -102.7644, 44.81912, 2.46964, 0, 0, 0.9440889, 0.3296909, 7200, 255, 1, 11159), +(@OGUID+136, 179393, 30, 0, 0, 15, 1, -172.3556, -453.8802, 33.27962, 0.3228844, 0, 0, 0.1607418, 0.9869965, 7200, 255, 1, 11159), +(@OGUID+137, 179393, 30, 0, 0, 15, 1, -172.3556, -453.8802, 33.27958, 0.3228844, 0, 0, 0.1607418, 0.9869965, 7200, 255, 1, 15595), +(@OGUID+138, 179393, 30, 0, 0, 15, 1, 549.4721, -101.5473, 44.81912, 1.160644, 0, 0, 0.5482931, 0.8362862, 7200, 255, 1, 11159), +(@OGUID+139, 179393, 30, 0, 0, 15, 1, 549.4722, -101.5473, 44.81912, 1.160644, 0, 0, 0.5482931, 0.8362862, 7200, 255, 1, 15595), +(@OGUID+140, 179394, 30, 0, 0, 15, 1, -171.8822, -454.6318, 33.27962, 0.7592169, 0, 0, 0.3705568, 0.9288098, 7200, 255, 1, 11159), +(@OGUID+141, 179394, 30, 0, 0, 15, 1, -171.8822, -454.6318, 33.27958, 0.7592169, 0, 0, 0.3705568, 0.9288098, 7200, 255, 1, 15595), +(@OGUID+142, 179394, 30, 0, 0, 15, 1, 550.3475, -101.6985, 44.81912, 1.596976, 0, 0, 0.7163019, 0.6977904, 7200, 255, 1, 11159), +(@OGUID+143, 179395, 30, 0, 0, 15, 1, -171.6559, -455.6713, 33.27962, 0.0610847, 0, 0, 0.03053761, 0.9995336, 7200, 255, 1, 11159), +(@OGUID+144, 179395, 30, 0, 0, 15, 1, -171.6559, -455.6713, 33.27958, 0.06108471, 0, 0, 0.03053761, 0.9995336, 7200, 255, 1, 15595), +(@OGUID+145, 179395, 30, 0, 0, 15, 1, 551.2714, -102.2258, 44.81912, 0.8988428, 0, 0, 0.4344444, 0.9006986, 7200, 255, 1, 11159), +(@OGUID+146, 179396, 30, 0, 0, 15, 1, -170.6989, -458.4096, 33.27962, -1.029743, 0, 0, -0.4924231, 0.870356, 7200, 255, 1, 11159), +(@OGUID+147, 179396, 30, 0, 0, 15, 1, -170.6989, -458.4096, 33.27958, 5.253442, 0, 0, -0.4924231, 0.870356, 7200, 255, 1, 15595), +(@OGUID+148, 179396, 30, 0, 0, 15, 1, 553.9467, -103.347, 44.81912, -0.1919852, 0, 0, -0.09584522, 0.9953963, 7200, 255, 1, 11159), +(@OGUID+149, 179397, 30, 0, 0, 15, 1, -170.1404, -457.6088, 33.27962, -0.6806767, 0, 0, -0.333806, 0.9426418, 7200, 255, 1, 11159), +(@OGUID+150, 179397, 30, 0, 0, 15, 1, -170.1404, -457.6088, 33.27958, 5.602509, 0, 0, -0.333806, 0.9426418, 7200, 255, 1, 15595), +(@OGUID+151, 179397, 30, 0, 0, 15, 1, 553.7253, -102.396, 44.81912, 0.157079, 0, 0, 0.07845879, 0.9969174, 7200, 255, 1, 11159), +(@OGUID+152, 179419, 30, 0, 0, 15, 1, -1423.161, -318.4358, 89.11356, 2.35619, 0, 0, 0.9238787, 0.3826855, 7200, 255, 1, 11159), +(@OGUID+153, 179437, 30, 0, 0, 15, 1, 618.7482, -52.11258, 42.11218, -0.06981169, 0, 0, -0.03489876, 0.9993908, 7200, 255, 1, 11159), +(@OGUID+154, 179438, 30, 0, 0, 15, 1, -1181.1, -370.7472, 53.62457, 2.687807, 0, 0, 0.97437, 0.2249513, 7200, 255, 1, 11159), +(@OGUID+155, 179909, 30, 0, 0, 15, 1, -914.0135, -520.3479, 57.22959, 1.535889, 0.05784559, -0.04110336, 0.6935635, 0.716892, 7200, 255, 1, 15595), +(@OGUID+156, 179945, 30, 0, 0, 15, 1, -1070.533, -617.908, 51.32492, 5.838127, 0, 0, -0.2206974, 0.9753423, 7200, 255, 1, 18414), +(@OGUID+157, 185879, 30, 0, 0, 15, 1, -751.6971, -339.2593, 67.57365, 2.754646, 0, 0, 0.9813423, 0.1922688, 7200, 255, 1, 12340), +(@OGUID+158, 185879, 30, 0, 0, 15, 1, -124.6438, -462.7103, 26.44648, -2.293355, 0, 0, -0.9114017, 0.4115178, 7200, 255, 1, 12340), +(@OGUID+159, 185879, 30, 0, 0, 15, 1, 74.81524, -451.9174, 48.40816, 1.597865, 0, 0, 0.7166119, 0.6974722, 7200, 255, 1, 12340), +(@OGUID+160, 185879, 30, 0, 0, 15, 1, 127.0966, -384.6134, 42.70638, 0.5549749, 0, 0, 0.2739401, 0.9617468, 7200, 255, 1, 12340), +(@OGUID+161, 185879, 30, 0, 0, 15, 1, 188.1767, -401.6822, 43.23127, -1.06268, 0, 0, -0.5066891, 0.8621289, 7200, 255, 1, 12340), +(@OGUID+162, 185879, 30, 0, 0, 15, 1, 220.5669, -359.072, 42.36721, -2.176526, 0, 0, -0.8858223, 0.4640246, 7200, 255, 1, 12340), +(@OGUID+163, 185879, 30, 0, 0, 15, 1, 629.0695, -249.8658, -5.387252, 0.8845921, 0, 0, 0.4280157, 0.9037713, 7200, 255, 1, 12340), +(@OGUID+164, 185879, 30, 0, 0, 15, 1, 643.9022, -27.38831, 47.00415, -2.003382, 0, 0, -0.8423834, 0.5388787, 7200, 255, 1, 12340), +(@OGUID+165, 185879, 30, 0, 0, 15, 1, 796.1685, -493.4308, 99.73721, 3.030851, 0, 0, 0.9984674, 0.05534243, 7200, 255, 1, 11159), +-- Game event spawns +(@OGUID+166, 181014, 30, 0, 0, 15, 1, -1385.917, -273.4583, 100.0546, 5.305802, 0, 0, -0.469471, 0.8829479, 7200, 255, 1, 15211), +(@OGUID+167, 181014, 30, 0, 0, 15, 1, -1320.606, -250.0729, 100.2059, 4.939284, 0, 0, -0.6225138, 0.7826088, 7200, 255, 1, 15211), +(@OGUID+168, 181014, 30, 0, 0, 15, 1, -5.713542, -296.0278, 33.4701, 6.073746, 0, 0, -0.1045284, 0.9945219, 7200, 255, 1, 15211), +(@OGUID+169, 181014, 30, 0, 0, 15, 1, 678.0972, -23.3559, 67.62869, 3.438303, 0, 0, -0.9890156, 0.1478114, 7200, 255, 1, 15211), +(@OGUID+170, 181016, 30, 0, 0, 15, 1, -1419.295, -324.6059, 89.13244, 1.012289, 0, 0, 0.4848089, 0.8746201, 7200, 255, 1, 15211), +(@OGUID+171, 181016, 30, 0, 0, 15, 1, -1357.979, -282.941, 95.79088, 5.078908, 0, 0, -0.5664063, 0.8241262, 7200, 255, 1, 15211), +(@OGUID+172, 181016, 30, 0, 0, 15, 1, -1343.589, -279.0174, 95.82193, 4.904376, 0, 0, -0.6360779, 0.7716249, 7200, 255, 1, 15211), +(@OGUID+173, 181016, 30, 0, 0, 15, 1, -1317.726, -303.967, 91.37949, 1.815142, 0, 0, 0.7880106, 0.6156617, 7200, 255, 1, 15211), +(@OGUID+174, 181016, 30, 0, 0, 15, 1, -1305.703, -297.7396, 91.32271, 2.757613, 0, 0, 0.9816265, 0.1908124, 7200, 255, 1, 15211), +(@OGUID+175, 181016, 30, 0, 0, 15, 1, -1291.833, -360.0347, 62.97437, 0.122173, 0, 0, 0.06104851, 0.9981348, 7200, 255, 1, 15211), +(@OGUID+176, 181016, 30, 0, 0, 15, 1, -1280.51, -343.0816, 62.16397, 5.864307, 0, 0, -0.2079115, 0.9781476, 7200, 255, 1, 15211), +(@OGUID+177, 181016, 30, 0, 0, 15, 1, -1240.542, -261.8246, 73.32625, 1.675514, 0, 0, 0.743144, 0.6691315, 7200, 255, 1, 15211), +(@OGUID+178, 181016, 30, 0, 0, 15, 1, -1238.405, -239.6372, 73.32625, 4.415683, 0, 0, -0.8038568, 0.5948228, 7200, 255, 1, 15211), +(@OGUID+179, 181016, 30, 0, 0, 15, 1, -1228.575, -373.533, 58.02542, 0.5061446, 0, 0, 0.2503796, 0.9681478, 7200, 255, 1, 15211), +(@OGUID+180, 181016, 30, 0, 0, 15, 1, -1210.611, -259.3854, 72.93218, 0.06981169, 0, 0, 0.03489876, 0.9993908, 7200, 255, 1, 15211), +(@OGUID+181, 181016, 30, 0, 0, 15, 1, -1208.639, -247.2379, 73.19709, 5.916668, 0, 0, -0.1822348, 0.983255, 7200, 255, 1, 15211), +(@OGUID+182, 181016, 30, 0, 0, 15, 1, -1139.229, -342.6788, 51.15957, 0.2443456, 0, 0, 0.1218691, 0.9925462, 7200, 255, 1, 15211), +(@OGUID+183, 181016, 30, 0, 0, 15, 1, -1138.28, -356.1233, 51.49231, 6.230826, 0, 0, -0.02617645, 0.9996573, 7200, 255, 1, 15211), +(@OGUID+184, 181016, 30, 0, 0, 15, 1, -768.6563, -344.2222, 67.87716, 0.6283169, 0, 0, 0.3090162, 0.9510568, 7200, 255, 1, 15211), +(@OGUID+185, 181016, 30, 0, 0, 15, 1, -756.1511, -350.2865, 67.52712, 1.06465, 0, 0, 0.5075378, 0.8616294, 7200, 255, 1, 15211), +(@OGUID+186, 181016, 30, 0, 0, 15, 1, -502.132, -190.0868, 57.48323, 6.230826, 0, 0, -0.02617645, 0.9996573, 7200, 255, 1, 15211), +(@OGUID+187, 181016, 30, 0, 0, 15, 1, -496.5972, -177.2986, 57.47906, 5.602507, 0, 0, -0.333807, 0.9426414, 7200, 255, 1, 15211), +(@OGUID+188, 181016, 30, 0, 0, 15, 1, -136.2448, -472.7778, 27.93033, 4.97419, 0, 0, -0.6087608, 0.7933538, 7200, 255, 1, 15211), +(@OGUID+189, 181016, 30, 0, 0, 15, 1, -119.5747, -457.4063, 29.78961, 4.24115, 0, 0, -0.8526402, 0.5224986, 7200, 255, 1, 15211), +(@OGUID+190, 181016, 30, 0, 0, 15, 1, -112.5486, -562.8316, 46.03414, 1.413715, 0, 0, 0.6494474, 0.7604064, 7200, 255, 1, 15211), +(@OGUID+191, 181016, 30, 0, 0, 15, 1, -8.701389, -426.625, 45.39448, 1.832595, 0, 0, 0.7933531, 0.6087617, 7200, 255, 1, 15211), +(@OGUID+192, 181016, 30, 0, 0, 15, 1, -1.876736, -425.2552, 45.38257, 1.518436, 0, 0, 0.6883545, 0.7253745, 7200, 255, 1, 15211), +(@OGUID+193, 181016, 30, 0, 0, 15, 1, 6.380208, -308.5434, 17.66296, 6.056293, 0, 0, -0.113203, 0.9935719, 7200, 255, 1, 15211), +(@OGUID+194, 181016, 30, 0, 0, 15, 1, 9.708333, -287.6736, 17.66296, 6.108654, 0, 0, -0.08715534, 0.9961947, 7200, 255, 1, 15211), +(@OGUID+195, 181016, 30, 0, 0, 15, 1, 13.07465, -421.8281, 45.15092, 2.042035, 0, 0, 0.8526402, 0.5224986, 7200, 255, 1, 15211), +(@OGUID+196, 181016, 30, 0, 0, 15, 1, 30.80556, -400.849, 45.69608, 2.722713, 0, 0, 0.9781475, 0.2079121, 7200, 255, 1, 15211), +(@OGUID+197, 181016, 30, 0, 0, 15, 1, 37.55208, -397.6701, 46.12936, 1.640607, 0, 0, 0.7313528, 0.6819993, 7200, 255, 1, 15211), +(@OGUID+198, 181016, 30, 0, 0, 15, 1, 232.8264, -338.9254, 45.77461, 4.694937, 0, 0, -0.7132502, 0.7009096, 7200, 255, 1, 15211), +(@OGUID+199, 181016, 30, 0, 0, 15, 1, 465.6302, -496.8802, 66.4395, 2.740162, 0, 0, 0.9799242, 0.1993704, 7200, 255, 1, 15211), +(@OGUID+200, 181016, 30, 0, 0, 15, 1, 480.2587, -488.3108, 66.23663, 1.658062, 0, 0, 0.737277, 0.6755905, 7200, 255, 1, 15211), +(@OGUID+201, 181016, 30, 0, 0, 15, 1, 587.434, -64.60764, 41.32988, 5.235988, 0, 0, -0.5, 0.8660254, 7200, 255, 1, 15211), +(@OGUID+202, 181016, 30, 0, 0, 15, 1, 609.3055, -156.4323, 42.63509, 4.782203, 0, 0, -0.6819983, 0.7313538, 7200, 255, 1, 15211), +(@OGUID+203, 181016, 30, 0, 0, 15, 1, 615.1458, -191.8594, 41.7019, 0.1745321, 0, 0, 0.08715534, 0.9961947, 7200, 255, 1, 15211), +(@OGUID+204, 181016, 30, 0, 0, 15, 1, 621.2257, -233.158, 40.49475, 0.122173, 0, 0, 0.06104851, 0.9981348, 7200, 255, 1, 15211), +(@OGUID+205, 181016, 30, 0, 0, 15, 1, 625.8021, -268.4496, 39.2206, 5.113817, 0, 0, -0.5519361, 0.8338864, 7200, 255, 1, 15211), +(@OGUID+206, 181016, 30, 0, 0, 15, 1, 630.0382, -153.4271, 42.63228, 4.869471, 0, 0, -0.6494474, 0.7604064, 7200, 255, 1, 15211), +(@OGUID+207, 181016, 30, 0, 0, 15, 1, 634.4879, -189.1007, 41.6967, 3.246347, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 15211), +(@OGUID+208, 181016, 30, 0, 0, 15, 1, 640.3698, -230.276, 40.40659, 3.246347, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 15211), +(@OGUID+209, 181016, 30, 0, 0, 15, 1, 644.625, -121.276, 53.05956, 0.8552105, 0, 0, 0.4146929, 0.9099615, 7200, 255, 1, 15211), +(@OGUID+210, 181016, 30, 0, 0, 15, 1, 646.9202, -265.3958, 39.21756, 4.71239, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1, 15211), +(@OGUID+211, 181016, 30, 0, 0, 15, 1, 654.0174, -19.97049, 49.18946, 3.246347, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 15211), +(@OGUID+212, 181016, 30, 0, 0, 15, 1, 660.2778, -40.80903, 49.58253, 3.246347, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 15211), +(@OGUID+213, 181017, 30, 0, 0, 15, 1, -134.1649, -459.2309, 31.76964, 5.969027, 0, 0, -0.1564341, 0.9876884, 7200, 255, 1, 15211), +(@OGUID+214, 181017, 30, 0, 0, 15, 1, 227.6528, -352.8385, 47.67496, 0.6632232, 0, 0, 0.3255672, 0.9455189, 7200, 255, 1, 15211), +(@OGUID+215, 181017, 30, 0, 0, 15, 1, 579.0555, -76.72916, 43.08036, 0.4886912, 0, 0, 0.2419214, 0.9702958, 7200, 255, 1, 15211), +(@OGUID+216, 181017, 30, 0, 0, 15, 1, 659.132, -122.5104, 54.9667, 2.565632, 0, 0, 0.9588194, 0.2840165, 7200, 255, 1, 15211), +(@OGUID+217, 181025, 30, 0, 0, 15, 1, -503.9774, -198.3576, 61.65232, 5.916668, 0, 0, -0.1822348, 0.983255, 7200, 255, 1, 15211), +(@OGUID+218, 181025, 30, 0, 0, 15, 1, -492.5365, -170.6563, 62.04059, 5.916668, 0, 0, -0.1822348, 0.983255, 7200, 255, 1, 15211), +(@OGUID+219, 181055, 30, 0, 0, 15, 1, -1312.043, -270.5104, 98.13059, 3.403396, 0, 0, -0.9914446, 0.1305283, 7200, 255, 1, 15211), +(@OGUID+220, 181055, 30, 0, 0, 15, 1, -1309.556, -303.6181, 97.73186, 2.042035, 0, 0, 0.8526402, 0.5224986, 7200, 255, 1, 15211), +(@OGUID+221, 181055, 30, 0, 0, 15, 1, -762.1788, -349.632, 74.37909, 1.169369, 0, 0, 0.5519361, 0.8338864, 7200, 255, 1, 15211), +(@OGUID+222, 181055, 30, 0, 0, 15, 1, -561.5712, -272.6076, 58.86695, 5.515242, 0, 0, -0.3746061, 0.927184, 7200, 255, 1, 15211), +(@OGUID+223, 181055, 30, 0, 0, 15, 1, -2.847222, -296.3246, 27.41542, 6.126106, 0, 0, -0.07845879, 0.9969174, 7200, 255, 1, 15211), +(@OGUID+224, 181355, 30, 0, 0, 15, 1, -136.2448, -472.7778, 27.93033, -1.308995, 0, 0, -0.6087608, 0.7933538, 7200, 255, 1, 12340), +(@OGUID+225, 181355, 30, 0, 0, 15, 1, -119.5747, -457.4063, 29.78961, -2.042035, 0, 0, -0.8526402, 0.5224986, 7200, 255, 1, 12340), +(@OGUID+226, 181355, 30, 0, 0, 15, 1, -112.5486, -562.8316, 46.03414, 1.413715, 0, 0, 0.6494474, 0.7604064, 7200, 255, 1, 12340), +(@OGUID+227, 181355, 30, 0, 0, 15, 1, -8.701389, -426.625, 45.39448, 1.832595, 0, 0, 0.7933531, 0.6087617, 7200, 255, 1, 12340), +(@OGUID+228, 181355, 30, 0, 0, 15, 1, -1.876736, -425.2552, 45.38257, 1.518436, 0, 0, 0.6883545, 0.7253745, 7200, 255, 1, 12340), +(@OGUID+229, 181355, 30, 0, 0, 15, 1, 13.07465, -421.8281, 45.15092, 2.042035, 0, 0, 0.8526402, 0.5224986, 7200, 255, 1, 12340), +(@OGUID+230, 181355, 30, 0, 0, 15, 1, 30.80556, -400.849, 45.69608, 2.722713, 0, 0, 0.9781475, 0.2079121, 7200, 255, 1, 12340), +(@OGUID+231, 181355, 30, 0, 0, 15, 1, 37.55208, -397.6701, 46.12936, 1.640607, 0, 0, 0.7313528, 0.6819993, 7200, 255, 1, 12340), +(@OGUID+232, 181355, 30, 0, 0, 15, 1, 232.8264, -338.9254, 45.77461, -1.588249, 0, 0, -0.7132502, 0.7009096, 7200, 255, 1, 12340), +(@OGUID+233, 181355, 30, 0, 0, 15, 1, 465.6302, -496.8802, 66.4395, 2.740162, 0, 0, 0.9799242, 0.1993704, 7200, 255, 1, 12340), +(@OGUID+234, 181355, 30, 0, 0, 15, 1, 480.2587, -488.3108, 66.23663, 1.658062, 0, 0, 0.737277, 0.6755905, 7200, 255, 1, 12340), +(@OGUID+235, 181355, 30, 0, 0, 15, 1, 587.434, -64.60764, 41.32988, -1.047198, 0, 0, -0.5, 0.8660254, 7200, 255, 1, 12340), +(@OGUID+236, 181355, 30, 0, 0, 15, 1, 609.3055, -156.4323, 42.63509, -1.500983, 0, 0, -0.6819983, 0.7313538, 7200, 255, 1, 12340), +(@OGUID+237, 181355, 30, 0, 0, 15, 1, 615.1458, -191.8594, 41.7019, 0.1745321, 0, 0, 0.08715534, 0.9961947, 7200, 255, 1, 12340), +(@OGUID+238, 181355, 30, 0, 0, 15, 1, 621.2257, -233.158, 40.49475, 0.122173, 0, 0, 0.06104851, 0.9981348, 7200, 255, 1, 12340), +(@OGUID+239, 181355, 30, 0, 0, 15, 1, 625.8021, -268.4496, 39.2206, -1.169369, 0, 0, -0.5519361, 0.8338864, 7200, 255, 1, 12340), +(@OGUID+240, 181355, 30, 0, 0, 15, 1, 630.0382, -153.4271, 42.63228, -1.413715, 0, 0, -0.6494474, 0.7604064, 7200, 255, 1, 12340), +(@OGUID+241, 181355, 30, 0, 0, 15, 1, 634.4879, -189.1007, 41.6967, -3.036838, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 12340), +(@OGUID+242, 181355, 30, 0, 0, 15, 1, 640.3698, -230.276, 40.40659, -3.036838, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 12340), +(@OGUID+243, 181355, 30, 0, 0, 15, 1, 644.625, -121.276, 53.05956, 0.8552105, 0, 0, 0.4146929, 0.9099615, 7200, 255, 1, 12340), +(@OGUID+244, 181355, 30, 0, 0, 15, 1, 646.9202, -265.3958, 39.21756, -1.570796, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1, 12340), +(@OGUID+245, 181355, 30, 0, 0, 15, 1, 654.0174, -19.97049, 49.18946, -3.036838, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 12340), +(@OGUID+246, 181355, 30, 0, 0, 15, 1, 660.2778, -40.80903, 49.58253, -3.036838, 0, 0, -0.9986286, 0.05235322, 7200, 255, 1, 12340), +(@OGUID+247, 181358, 30, 0, 0, 15, 1, 678.0972, -23.3559, 67.62869, -2.844883, 0, 0, -0.9890156, 0.1478114, 7200, 255, 1, 12340), +(@OGUID+248, 181392, 30, 0, 0, 15, 1, -134.1649, -459.2309, 31.76964, -0.3141584, 0, 0, -0.1564341, 0.9876884, 7200, 255, 1, 12340), +(@OGUID+249, 181392, 30, 0, 0, 15, 1, 227.6528, -352.8385, 47.67496, 0.6632232, 0, 0, 0.3255672, 0.9455189, 7200, 255, 1, 12340), +(@OGUID+250, 181392, 30, 0, 0, 15, 1, 579.0555, -76.72916, 43.08036, 0.4886912, 0, 0, 0.2419214, 0.9702958, 7200, 255, 1, 12340), +(@OGUID+251, 181392, 30, 0, 0, 15, 1, 659.132, -122.5104, 54.9667, 2.565632, 0, 0, 0.9588194, 0.2840165, 7200, 255, 1, 12340); + +-- game_event_gameobject table +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+166 AND @OGUID+251; +INSERT INTO `game_event_gameobject` (`guid`, `eventEntry`) SELECT `guid`, 8 FROM `gameobject` WHERE `guid` BETWEEN @OGUID+166 AND @OGUID+223; +INSERT INTO `game_event_gameobject` (`guid`, `eventEntry`) SELECT `guid`, 1 FROM `gameobject` WHERE `guid` BETWEEN @OGUID+224 AND @OGUID+251; + +-- STRAND OF THE ANCIENTS +UPDATE `gameobject_template` SET `flags`=32 WHERE `entry`=194086; +DELETE FROM `creature` WHERE `map`=607 AND `id` IN (29,23472,24637); +-- NOTE: THESE SPAWNS ARE WIP AND NEED CLEANUP +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+ 0, 24637, 607, 0, 0, 3, 193, 1753.176, -150.1995, -7.539963, 1.278332, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 15595), +(@CGUID+ 1, 24637, 607, 0, 0, 3, 193, 1778.929, -150.8464, -7.539963, 3.121354, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 15595), +(@CGUID+ 2, 24637, 607, 0, 0, 3, 193, 1779.075, -158.6777, -7.488863, 4.126631, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 15595), +(@CGUID+ 3, 24637, 607, 0, 0, 3, 193, 1784.385, -150.6736, -7.456629, 3.281219, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 14545), +(@CGUID+ 4, 24637, 607, 0, 0, 3, 193, 1785.706, -162.1927, -7.539963, 4.680709, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+ 5, 24637, 607, 0, 0, 3, 193, 1786.031, -174.0209, -7.539963, 1.569665, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+ 6, 24637, 607, 0, 0, 3, 193, 1786.055, -160.159, -7.476509, 4.88658, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+ 7, 24637, 607, 0, 0, 3, 193, 1786.071, -160.1638, -7.475922, 4.888181, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+ 8, 24637, 607, 0, 0, 3, 193, 1786.164, -160.1306, -7.514813, 4.898291, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+ 9, 24637, 607, 0, 0, 3, 193, 1786.497, -151.4466, -7.539963, 5.932336, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+10, 24637, 607, 0, 0, 3, 193, 1788.435, -180.7085, -7.539963, 0.1775536, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+11, 24637, 607, 0, 0, 3, 193, 1788.697, -182.2178, -7.539963, 6.226356, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+12, 24637, 607, 0, 0, 3, 193, 1789.064, -163.1961, -7.539963, 1.854801, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+13, 24637, 607, 0, 0, 3, 193, 1789.489, -171.4356, -7.539963, 1.687564, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+14, 24637, 607, 0, 0, 3, 193, 1792.558, -186.4628, -7.539963, 5.673553, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+15, 24637, 607, 0, 0, 3, 193, 1795.287, -191.6723, -7.539963, 4.972266, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+16, 24637, 607, 0, 0, 3, 193, 1815.856, 322.5347, 0, 3.331311, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+17, 24637, 607, 0, 0, 3, 193, 1817.542, 315.9639, 0, 2.26122, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+18, 24637, 607, 0, 0, 3, 193, 1821.937, 314.6914, 0, 0.4190046, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+19, 24637, 607, 0, 0, 3, 193, 1832.698, 325.9043, 0, 3.48964, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+20, 24637, 607, 0, 0, 3, 193, 1841.758, 329.1915, 6.29403, 1.239184, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 15050), +(@CGUID+21, 24637, 607, 0, 0, 3, 193, 1842.933, 332.8056, 0, 0.591558, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+22, 24637, 607, 0, 0, 3, 193, 1843.133, 325.0808, 0, 5.035128, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+23, 24637, 607, 0, 0, 3, 193, 1847.208, 328.175, 0, 6.098793, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+24, 24637, 607, 0, 0, 3, 193, 1862.638, 339.064, 0, 0.7512648, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+25, 24637, 607, 0, 0, 3, 193, 1869.658, 285.821, -32.06818, 0.07541098, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+26, 24637, 607, 0, 0, 3, 193, 1887.261, 308.2831, -32.76948, 5.142525, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+27, 24637, 607, 0, 0, 3, 193, 1888.678, 282.9527, -33.20912, 3.705595, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+28, 24637, 607, 0, 0, 3, 193, 1890.562, 280.5502, -33.20908, 4.618548, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+29, 24637, 607, 0, 0, 3, 193, 1892.343, 292.3173, -33.20912, 2.389435, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+30, 24637, 607, 0, 0, 3, 193, 1893.935, 278.9221, -33.20908, 4.406706, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+31, 24637, 607, 0, 0, 3, 193, 1895.102, 278.6319, -33.20912, 4.531545, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 15050), +(@CGUID+32, 24637, 607, 0, 0, 3, 193, 1896.189, 294.6083, -33.20914, 5.977503, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+33, 24637, 607, 0, 0, 3, 193, 1896.496, 282.8867, -33.20912, 4.647526, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+34, 24637, 607, 0, 0, 3, 193, 1896.79, 287.675, -33.20912, 4.607172, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+35, 24637, 607, 0, 0, 3, 193, 1913.874, -395.7415, -3.62981, 1.498881, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+36, 24637, 607, 0, 0, 3, 193, 1916.667, 283.334, -33, 6.054278, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+37, 24637, 607, 0, 0, 3, 193, 1927.475, -413.0363, -2.580681, 2.522612, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+38, 24637, 607, 0, 0, 3, 193, 1961.126, -243.4721, 0, 3.672174, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+39, 24637, 607, 0, 0, 3, 193, 1969.425, -238.6031, 11.73275, 1.605703, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 14545), +(@CGUID+40, 24637, 607, 0, 0, 3, 193, 1972.498, -247.7406, 0, 5.036801, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+41, 24637, 607, 0, 0, 3, 193, 1976.003, -245.6359, 0, 5.464355, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+42, 24637, 607, 0, 0, 3, 193, 1978.28, -239.4737, 0, 2.293787, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+43, 24637, 607, 0, 0, 3, 193, 1978.468, -241.9796, 0, 5.925828, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+44, 24637, 607, 0, 0, 3, 193, 1989.338, -243.0246, 0, 5.379546, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+45, 24637, 607, 0, 0, 3, 193, 1994.642, -252.7422, 0, 5.77223, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+46, 24637, 607, 0, 0, 3, 193, 2003.064, -263.3599, 0, 5.648743, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 11723), +(@CGUID+47, 24637, 607, 0, 0, 3, 193, 2004.263, -254.2065, 0, 6.221172, 7200, 10, 0, 0, 0, 1, 0, 0, 0, 12340), +(@CGUID+48, 24637, 607, 0, 0, 3, 193, 2023.208, 399.7959, -0.318641, 3.038004, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 12340), +(@CGUID+49, 24637, 607, 0, 0, 3, 193, 2127.115, 667.3826, -0.4426683, 2.062388, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 11723), +(@CGUID+50, 24637, 607, 0, 0, 3, 193, 2138.119, 654.6674, -0.318641, 2.271314, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 11723), +(@CGUID+51, 24637, 607, 0, 0, 3, 193, 2206.115, 482.6348, -0.318641, 3.903402, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 11723), +(@CGUID+52, 24637, 607, 0, 0, 3, 193, 2283.868, 753.8455, -0.318641, 0.06396021, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 11723), +(@CGUID+53, 24637, 607, 0, 0, 3, 193, 2293.629, 753.9861, -0.318641, 6.242798, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 12340), +(@CGUID+54, 24637, 607, 0, 0, 3, 193, 2331.52, 744.8007, -0.318641, 5.910295, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 11723), +(@CGUID+55, 24637, 607, 0, 0, 3, 193, 2382.777, 716.7998, -0.318641, 5.652711, 7200, 0, 0, 0, 0, 0, 0, 0, 0, 12340); + +-- ISLE OF CONQUEST +UPDATE `gameobject_template` SET `faction`=84, `flags`=32 WHERE `entry`=195394; +UPDATE `gameobject_template` SET `flags`=32 WHERE `entry` IN (195393,195396,195313,195314,195315,195316); +-- avoid 'the the' when 'the alliance/horde' has taken 'the the alliance/horde keep' +UPDATE `trinity_string` SET `content_default`='alliance keep' WHERE `entry`=1209; +UPDATE `trinity_string` SET `content_default`='horde keep' WHERE `entry`=1210; +UPDATE `trinity_string` SET `content_default`='The west gate of the %s is destroyed!' WHERE `entry`=1212; +UPDATE `trinity_string` SET `content_default`='The east gate of the %s is destroyed!' WHERE `entry`=1213; +UPDATE `trinity_string` SET `content_default`='The south gate of the %s is destroyed!' WHERE `entry`=1214; +UPDATE `trinity_string` SET `content_default`='The north gate of the %s is destroyed!' WHERE `entry`=1215; +UPDATE `creature_template_addon` SET `auras`='67323 ' WHERE `entry` IN (34776,35069); -- add aura to siege engine +DELETE FROM `creature_template_addon` WHERE `entry` IN (35431,35433); -- add missing difficulty entries to creature_template_addon +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES +(35431, 0, 0, 0, 1, 0, '67323 '), -- damaged aura, not sure if putting it here or through script, also missing spellscript +(35433, 0, 0, 0, 1, 0, '67323 '); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 2e66c587e1598..34329a6a53a2f 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -40,7 +40,7 @@ namespace Trinity class BattlegroundChatBuilder { public: - BattlegroundChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, va_list* args = NULL) + BattlegroundChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, va_list* args = nullptr) : _msgtype(msgtype), _textId(textId), _source(source), _args(args) { } void operator()(WorldPacket& data, LocaleConstant loc_idx) @@ -143,18 +143,20 @@ Battleground::Battleground() m_MinPlayers = 0; m_MapId = 0; - m_Map = NULL; + m_Map = nullptr; m_StartMaxDist = 0.0f; ScriptId = 0; + m_BuffEntries = nullptr; + m_ArenaTeamIds[TEAM_ALLIANCE] = 0; m_ArenaTeamIds[TEAM_HORDE] = 0; m_ArenaTeamMMR[TEAM_ALLIANCE] = 0; m_ArenaTeamMMR[TEAM_HORDE] = 0; - m_BgRaids[TEAM_ALLIANCE] = NULL; - m_BgRaids[TEAM_HORDE] = NULL; + m_BgRaids[TEAM_ALLIANCE] = nullptr; + m_BgRaids[TEAM_HORDE] = nullptr; m_PlayersCount[TEAM_ALLIANCE] = 0; m_PlayersCount[TEAM_HORDE] = 0; @@ -196,8 +198,8 @@ Battleground::~Battleground() { m_Map->SetUnload(); //unlink to prevent crash, always unlink all pointer reference before destruction - m_Map->SetBG(NULL); - m_Map = NULL; + m_Map->SetBG(nullptr); + m_Map = nullptr; } // remove from bg free slot queue RemoveFromBGFreeSlotQueue(); @@ -341,7 +343,7 @@ inline void Battleground::_ProcessResurrect(uint32 diff) { for (std::map::iterator itr = m_ReviveQueue.begin(); itr != m_ReviveQueue.end(); ++itr) { - Creature* sh = NULL; + Creature* sh = nullptr; for (GuidVector::const_iterator itr2 = (itr->second).begin(); itr2 != (itr->second).end(); ++itr2) { Player* player = ObjectAccessor::FindPlayer(*itr2); @@ -387,6 +389,22 @@ inline void Battleground::_ProcessResurrect(uint32 diff) } } +void Battleground::SetCreaturesNumber(size_t count) +{ + BgCreatures.resize(count); +} + +void Battleground::SetGameObjectsNumber(size_t count) +{ + BgObjects.resize(count); +} + +void Battleground::SetChangeBuffs(bool change, std::vector const* buffEntries) +{ + m_BuffChange = change; + m_BuffEntries = buffEntries; +} + uint32 Battleground::GetPrematureWinner() { uint32 winner = 0; @@ -422,13 +440,13 @@ inline void Battleground::_ProcessProgress(uint32 diff) if (newtime > (MINUTE * IN_MILLISECONDS)) { if (newtime / (MINUTE * IN_MILLISECONDS) != m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS)) - PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS))); + PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, CHAT_MSG_SYSTEM, nullptr, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS))); } else { //announce every 15 seconds if (newtime / (15 * IN_MILLISECONDS) != m_PrematureCountDownTimer / (15 * IN_MILLISECONDS)) - PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / IN_MILLISECONDS)); + PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, CHAT_MSG_SYSTEM, nullptr, (uint32)(m_PrematureCountDownTimer / IN_MILLISECONDS)); } m_PrematureCountDownTimer = newtime; } @@ -574,7 +592,7 @@ inline void Battleground::_ProcessLeave(uint32 diff) Player* Battleground::_GetPlayer(ObjectGuid guid, bool offlineRemove, char const* context) const { - Player* player = NULL; + Player* player = nullptr; if (!offlineRemove) { // should this be ObjectAccessor::FindConnectedPlayer() to return players teleporting ? @@ -595,7 +613,7 @@ Player* Battleground::_GetPlayerForTeam(uint32 teamId, BattlegroundPlayerMap::co if (!team) team = player->GetTeam(); if (team != teamId) - player = NULL; + player = nullptr; } return player; } @@ -631,7 +649,7 @@ void Battleground::SendPacketToTeam(uint32 TeamID, WorldPacket* packet, Player* } } -void Battleground::SendChatMessage(Creature* source, uint8 textId, WorldObject* target /*= NULL*/) +void Battleground::SendChatMessage(Creature* source, uint8 textId, WorldObject* target /*= nullptr*/) { sCreatureTextMgr->SendChat(source, textId, target); } @@ -926,7 +944,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen bgTypeId = BATTLEGROUND_AA; // set the bg type to all arenas (it will be used for queue refreshing) // unsummon current and summon old pet if there was one and there isn't a current pet - player->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT); + player->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT); player->ResummonPetTemporaryUnSummonedIfAny(); } @@ -945,7 +963,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen if (Group* group = GetBgRaid(team)) { if (!group->RemoveMember(guid)) // group was disbanded - SetBgRaid(team, NULL); + SetBgRaid(team, nullptr); } DecreaseInvitedCount(team); //we should update battleground queue, but only if bg isn't ending @@ -1284,7 +1302,7 @@ bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, return false; if (type == SCORE_BONUS_HONOR && doAddHonor && isBattleground()) - player->RewardHonor(NULL, 1, value); // RewardHonor calls UpdatePlayerScore with doAddHonor = false + player->RewardHonor(nullptr, 1, value); // RewardHonor calls UpdatePlayerScore with doAddHonor = false else itr->second->UpdateScore(type, value); @@ -1322,10 +1340,14 @@ void Battleground::RemovePlayerFromResurrectQueue(ObjectGuid player_guid) void Battleground::RelocateDeadPlayers(ObjectGuid guideGuid) { // Those who are waiting to resurrect at this node are taken to the closest own node's graveyard - GuidVector& ghostList = m_ReviveQueue[guideGuid]; + auto itr = m_ReviveQueue.find(guideGuid); + if (itr == m_ReviveQueue.end()) + return; + + GuidVector& ghostList = itr->second; if (!ghostList.empty()) { - WorldSafeLocsEntry const* closestGrave = NULL; + WorldSafeLocsEntry const* closestGrave = nullptr; for (GuidVector::const_iterator itr = ghostList.begin(); itr != ghostList.end(); ++itr) { Player* player = ObjectAccessor::FindPlayer(*itr); @@ -1338,75 +1360,44 @@ void Battleground::RelocateDeadPlayers(ObjectGuid guideGuid) if (closestGrave) player->TeleportTo(GetMapId(), closestGrave->x, closestGrave->y, closestGrave->z, player->GetOrientation()); } + ghostList.clear(); } } -bool Battleground::AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 /*respawnTime*/, GOState goState) +GameObject* Battleground::AddObject(uint32 type, uint32 entry, Position const& pos, G3D::Quat const& rot, uint32 respawnTime /*= 0*/, GOState goState /*= GO_STATE_READY*/) { // If the assert is called, means that BgObjects must be resized! ASSERT(type < BgObjects.size()); Map* map = FindBgMap(); if (!map) - return false; - - G3D::Quat rot(rotation0, rotation1, rotation2, rotation3); - // Temporally add safety check for bad spawns and send log (object rotations need to be rechecked in sniff) - if (!rotation0 && !rotation1 && !rotation2 && !rotation3) - { - TC_LOG_DEBUG("bg.battleground", "Battleground::AddObject: gameoobject [entry: %u, object type: %u] for BG (map: %u) has zeroed rotation fields, " - "orientation used temporally, but please fix the spawn", entry, type, m_MapId); - - rot = G3D::Matrix3::fromEulerAnglesZYX(o, 0.f, 0.f); - } + return nullptr; // Must be created this way, adding to godatamap would add it to the base map of the instance // and when loading it (in go::LoadFromDB()), a new guid would be assigned to the object, and a new object would be created // So we must create it specific for this instance - GameObject* go = new GameObject; - if (!go->Create(GetBgMap()->GenerateLowGuid(), entry, GetBgMap(), PHASEMASK_NORMAL, Position(x, y, z, o), rot, 255, goState)) + GameObject* go = new GameObject(); + if (!go->Create(map->GenerateLowGuid(), entry, map, PHASEMASK_NORMAL, pos, rot, 255, goState)) { TC_LOG_ERROR("bg.battleground", "Battleground::AddObject: cannot create gameobject (entry: %u) for BG (map: %u, instance id: %u)!", entry, m_MapId, m_InstanceID); delete go; - return false; + return nullptr; } -/* - uint32 guid = go->GetGUID().GetCounter(); - - // without this, UseButtonOrDoor caused the crash, since it tried to get go info from godata - // iirc that was changed, so adding to go data map is no longer required if that was the only function using godata from GameObject without checking if it existed - GameObjectData& data = sObjectMgr->NewGOData(guid); - - data.id = entry; - data.mapid = GetMapId(); - data.posX = x; - data.posY = y; - data.posZ = z; - data.orientation = o; - data.rotation0 = rotation0; - data.rotation1 = rotation1; - data.rotation2 = rotation2; - data.rotation3 = rotation3; - data.spawntimesecs = respawnTime; - data.spawnMask = 1; - data.animprogress = 100; - data.go_state = 1; -*/ + // Add to world, so it can be later looked up from HashMapHolder if (!map->AddToMap(go)) { delete go; - return false; + return nullptr; } - BgObjects[type] = go->GetGUID(); - return true; -} -bool Battleground::AddObject(uint32 type, uint32 entry, Position const& pos, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime /*= 0*/, GOState goState /*= GO_STATE_READY*/) -{ - return AddObject(type, entry, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), rotation0, rotation1, rotation2, rotation3, respawnTime, goState); + if (respawnTime) + go->SetRespawnTime(respawnTime); + + BgObjects[type] = go->GetGUID(); + return go; } // Some doors aren't despawned so we cannot handle their closing in gameobject::update() @@ -1472,6 +1463,7 @@ Creature* Battleground::GetBGCreature(uint32 type, bool logError) void Battleground::SpawnBGObject(uint32 type, uint32 respawntime) { if (Map* map = FindBgMap()) + { if (GameObject* obj = map->GetGameObject(BgObjects[type])) { if (respawntime) @@ -1483,53 +1475,46 @@ void Battleground::SpawnBGObject(uint32 type, uint32 respawntime) obj->SetRespawnTime(respawntime); map->AddToMap(obj); } + } } -Creature* Battleground::AddCreature(uint32 entry, uint32 type, float x, float y, float z, float o, TeamId /*teamId = TEAM_NEUTRAL*/, uint32 respawntime /*= 0*/, Transport* transport) +Creature* Battleground::AddCreature(uint32 entry, uint32 type, Position const& pos, uint32 respawntime /*= 0*/, Transport* transport /*= nullptr*/) { // If the assert is called, means that BgCreatures must be resized! ASSERT(type < BgCreatures.size()); Map* map = FindBgMap(); if (!map) - return NULL; + return nullptr; if (transport) { - if (Creature* creature = transport->SummonPassenger(entry, { x, y, z, o }, TEMPSUMMON_MANUAL_DESPAWN)) + if (Creature* creature = transport->SummonPassenger(entry, pos, TEMPSUMMON_MANUAL_DESPAWN)) { BgCreatures[type] = creature->GetGUID(); return creature; } - return NULL; + return nullptr; } + float x, y, z, o; + pos.GetPosition(x, y, z, o); Creature* creature = new Creature(); - if (!creature->Create(map->GenerateLowGuid(), map, PHASEMASK_NORMAL, entry, x, y, z, o)) { TC_LOG_ERROR("bg.battleground", "Battleground::AddCreature: cannot create creature (entry: %u) for BG (map: %u, instance id: %u)!", entry, m_MapId, m_InstanceID); delete creature; - return NULL; + return nullptr; } creature->SetHomePosition(x, y, z, o); - CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(entry); - if (!cinfo) - { - TC_LOG_ERROR("bg.battleground", "Battleground::AddCreature: creature template (entry: %u) does not exist for BG (map: %u, instance id: %u)!", - entry, m_MapId, m_InstanceID); - delete creature; - return NULL; - } - if (!map->AddToMap(creature)) { delete creature; - return NULL; + return nullptr; } BgCreatures[type] = creature->GetGUID(); @@ -1540,11 +1525,6 @@ Creature* Battleground::AddCreature(uint32 entry, uint32 type, float x, float y, return creature; } -Creature* Battleground::AddCreature(uint32 entry, uint32 type, Position const& pos, TeamId teamId /*= TEAM_NEUTRAL*/, uint32 respawntime /*= 0*/, Transport* transport) -{ - return AddCreature(entry, type, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teamId, respawntime, transport); -} - bool Battleground::DelCreature(uint32 type) { if (!BgCreatures[type]) @@ -1581,11 +1561,11 @@ bool Battleground::DelObject(uint32 type) return false; } -bool Battleground::AddSpiritGuide(uint32 type, float x, float y, float z, float o, TeamId teamId /*= TEAM_NEUTRAL*/) +bool Battleground::AddSpiritGuide(uint32 type, Position const& pos, TeamId teamId /*= TEAM_NEUTRAL*/) { uint32 entry = (teamId == TEAM_ALLIANCE) ? BG_CREATURE_ENTRY_A_SPIRITGUIDE : BG_CREATURE_ENTRY_H_SPIRITGUIDE; - if (Creature* creature = AddCreature(entry, type, x, y, z, o, teamId)) + if (Creature* creature = AddCreature(entry, type, pos)) { creature->setDeathState(DEAD); creature->SetChannelObjectGuid(creature->GetGUID()); @@ -1605,11 +1585,6 @@ bool Battleground::AddSpiritGuide(uint32 type, float x, float y, float z, float return false; } -bool Battleground::AddSpiritGuide(uint32 type, Position const& pos, TeamId teamId /*= TEAM_NEUTRAL*/) -{ - return AddSpiritGuide(type, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teamId); -} - void Battleground::SendMessageToAll(uint32 entry, ChatMsg type, Player const* source) { if (!entry) @@ -1654,7 +1629,7 @@ void Battleground::SendWarningToAll(uint32 entry, ...) vsnprintf(str, 1024, format, ap); va_end(ap); - ChatHandler::BuildChatPacket(localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()], CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, NULL, NULL, str); + ChatHandler::BuildChatPacket(localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()], CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, nullptr, nullptr, str); } player->SendDirectMessage(&localizedPackets[player->GetSession()->GetSessionDbLocaleIndex()]); @@ -1687,7 +1662,8 @@ void Battleground::HandleTriggerBuff(ObjectGuid go_guid) // Change buff type, when buff is used: int32 index = BgObjects.size() - 1; while (index >= 0 && BgObjects[index] != go_guid) - index--; + --index; + if (index < 0) { TC_LOG_ERROR("bg.battleground", "Battleground::HandleTriggerBuff: cannot find buff gameobject (%s, entry: %u, type: %u) in internal data for BG (map: %u, instance id: %u)!", @@ -1696,19 +1672,32 @@ void Battleground::HandleTriggerBuff(ObjectGuid go_guid) } // Randomly select new buff - uint8 buff = urand(0, 2); - uint32 entry = obj->GetEntry(); - if (m_BuffChange && entry != Buff_Entries[buff]) - { - // Despawn current buff - SpawnBGObject(index, RESPAWN_ONE_DAY); - // Set index for new one - for (uint8 currBuffTypeIndex = 0; currBuffTypeIndex < 3; ++currBuffTypeIndex) - if (entry == Buff_Entries[currBuffTypeIndex]) - { - index -= currBuffTypeIndex; - index += buff; - } + if (m_BuffChange) + { + ASSERT(m_BuffEntries); + + uint32 entry = obj->GetEntry(); + uint8 currBuffTypeIndex = 0; + auto buffItr = std::find_if(m_BuffEntries->cbegin(), m_BuffEntries->cend(), [entry, &currBuffTypeIndex](BattlegroundBuffEntries const& entries) -> bool + { + for (currBuffTypeIndex = 0; currBuffTypeIndex < BG_MAX_BUFFS; ++currBuffTypeIndex) + if (entries._buffEntry[currBuffTypeIndex] == entry) + return true; + + return false; + }); + + ASSERT(buffItr != m_BuffEntries->cend()); + + uint8 buff = urand(0, 2); + if (currBuffTypeIndex != buff) + { + // Despawn current buff + SpawnBGObject(index, RESPAWN_ONE_DAY); + // Set index for new one + index -= currBuffTypeIndex; + index += buff; + } } SpawnBGObject(index, BUFF_RESPAWN_TIME); @@ -1814,8 +1803,8 @@ int32 Battleground::GetObjectType(ObjectGuid guid) for (uint32 i = 0; i < BgObjects.size(); ++i) if (BgObjects[i] == guid) return i; - TC_LOG_ERROR("bg.battleground", "Battleground::GetObjectType: player used gameobject (%s) which is not in internal data for BG (map: %u, instance id: %u), cheating?", - guid.ToString().c_str(), m_MapId, m_InstanceID); + + TC_LOG_ERROR("bg.battleground", "Battleground::GetObjectType: player used gameobject (%s) which is not in internal data for BG (map: %u, instance id: %u), cheating?", guid.ToString().c_str(), m_MapId, m_InstanceID); return -1; } @@ -1823,7 +1812,7 @@ void Battleground::SetBgRaid(uint32 TeamID, Group* bg_raid) { Group*& old_raid = TeamID == ALLIANCE ? m_BgRaids[TEAM_ALLIANCE] : m_BgRaids[TEAM_HORDE]; if (old_raid) - old_raid->SetBattlegroundGroup(NULL); + old_raid->SetBattlegroundGroup(nullptr); if (bg_raid) bg_raid->SetBattlegroundGroup(this); old_raid = bg_raid; diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index bb6ae36053693..e272be9021f49 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -28,6 +28,7 @@ #include "GameObject.h" #include "EventMap.h" +class Battleground; class Creature; class GameObject; class Group; @@ -146,15 +147,6 @@ enum BattlegroundStartTimeIntervals BG_START_DELAY_NONE = 0 // ms }; -enum BattlegroundBuffObjects -{ - BG_OBJECTID_SPEEDBUFF_ENTRY = 179871, - BG_OBJECTID_REGENBUFF_ENTRY = 179904, - BG_OBJECTID_BERSERKERBUFF_ENTRY = 179905 -}; - -const uint32 Buff_Entries[3] = { BG_OBJECTID_SPEEDBUFF_ENTRY, BG_OBJECTID_REGENBUFF_ENTRY, BG_OBJECTID_BERSERKERBUFF_ENTRY }; - enum BattlegroundStatus { STATUS_NONE = 0, // first status, should mean bg is not instance @@ -172,7 +164,7 @@ struct BattlegroundPlayer struct BattlegroundObjectInfo { - BattlegroundObjectInfo() : object(NULL), timer(0), spellid(0) { } + BattlegroundObjectInfo() : object(nullptr), timer(0), spellid(0) { } GameObject *object; int32 timer; @@ -202,7 +194,6 @@ enum BattlegroundStartingEventsIds BG_STARTING_EVENT_THIRD = 2, BG_STARTING_EVENT_FOURTH = 3 }; -#define BG_STARTING_EVENT_COUNT 4 enum BGHonorMode { @@ -211,8 +202,48 @@ enum BGHonorMode BG_HONOR_MODE_NUM }; -#define BG_AWARD_ARENA_POINTS_MIN_LEVEL 71 -#define ARENA_TIMELIMIT_POINTS_LOSS -16 +enum BattlegroudMisc +{ + BG_MAX_BUFFS = 3, + + BG_STARTING_EVENT_COUNT = 4, + + BG_AWARD_ARENA_POINTS_MIN_LEVEL = 71, + + ARENA_TIMELIMIT_POINTS_LOSS = -16 +}; + +// because hardcoding values is bad +struct BattlegroundBuffEntries +{ + friend class Battleground; + + BattlegroundBuffEntries(uint32 SpeedBuffEntry, uint32 RegenBuffEntry, uint32 BerserkBuffEntry) + { + _buffEntry[0] = SpeedBuffEntry; + _buffEntry[1] = RegenBuffEntry; + _buffEntry[2] = BerserkBuffEntry; + } + + private: + uint32 _buffEntry[BG_MAX_BUFFS]; +}; + +// data helpers +struct BattlegroundSpawnPoint +{ + uint32 Entry; + Position Pos; + uint32 SpawnTime; +}; + +struct BattlegroundGOSpawnPoint +{ + uint32 Entry; + Position Pos; + G3D::Quat Rot; + uint32 SpawnTime; +}; /* This class is used to: @@ -243,7 +274,7 @@ class TC_GAME_API Battleground /* achievement req. */ virtual bool IsAllNodesControlledByTeam(uint32 /*team*/) const { return false; } void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); - virtual bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); + virtual bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = nullptr, uint32 /*miscvalue1*/ = 0); /* Battleground */ // Get methods: @@ -352,10 +383,10 @@ class TC_GAME_API Battleground // Packet Transfer // method that should fill worldpacket with actual world states (not yet implemented for all battlegrounds!) virtual void FillInitialWorldStates(WorldPacket& /*data*/) { } - void SendPacketToTeam(uint32 TeamID, WorldPacket* packet, Player* sender = NULL, bool self = true); + void SendPacketToTeam(uint32 TeamID, WorldPacket* packet, Player* sender = nullptr, bool self = true); void SendPacketToAll(WorldPacket* packet); - void SendChatMessage(Creature* source, uint8 textId, WorldObject* target = NULL); + void SendChatMessage(Creature* source, uint8 textId, WorldObject* target = nullptr); template void BroadcastWorker(Do& _do); @@ -372,7 +403,7 @@ class TC_GAME_API Battleground void BlockMovement(Player* player); void SendWarningToAll(uint32 entry, ...); - void SendMessageToAll(uint32 entry, ChatMsg type, Player const* source = NULL); + void SendMessageToAll(uint32 entry, ChatMsg type, Player const* source = nullptr); void PSendMessageToAll(uint32 entry, ChatMsg type, Player const* source, ...); // specialized version with 2 string id args @@ -417,7 +448,7 @@ class TC_GAME_API Battleground virtual void EventPlayerClickedOnFlag(Player* /*player*/, GameObject* /*target_obj*/) { } void EventPlayerLoggedIn(Player* player); void EventPlayerLoggedOut(Player* player); - virtual void ProcessEvent(WorldObject* /*obj*/, uint32 /*eventId*/, WorldObject* /*invoker*/ = NULL) { } + virtual void ProcessEvent(WorldObject* /*obj*/, uint32 /*eventId*/, WorldObject* /*invoker*/ = nullptr) { } // this function can be used by spell to interact with the BG map virtual void DoAction(uint32 /*action*/, ObjectGuid /*var*/) { } @@ -437,17 +468,11 @@ class TC_GAME_API Battleground void HandleTriggerBuff(ObjectGuid go_guid); void SetHoliday(bool is_holiday); - /// @todo make this protected: - GuidVector BgObjects; - GuidVector BgCreatures; void SpawnBGObject(uint32 type, uint32 respawntime); - virtual bool AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime = 0, GOState goState = GO_STATE_READY); - bool AddObject(uint32 type, uint32 entry, Position const& pos, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime = 0, GOState goState = GO_STATE_READY); - virtual Creature* AddCreature(uint32 entry, uint32 type, float x, float y, float z, float o, TeamId teamId = TEAM_NEUTRAL, uint32 respawntime = 0, Transport* transport = NULL); - Creature* AddCreature(uint32 entry, uint32 type, Position const& pos, TeamId teamId = TEAM_NEUTRAL, uint32 respawntime = 0, Transport* transport = NULL); + GameObject* AddObject(uint32 type, uint32 entry, Position const& pos, G3D::Quat const& rot, uint32 respawnTime = 0, GOState goState = GO_STATE_READY); + Creature* AddCreature(uint32 entry, uint32 type, Position const& pos, uint32 respawntime = 0, Transport* transport = nullptr); bool DelCreature(uint32 type); bool DelObject(uint32 type); - virtual bool AddSpiritGuide(uint32 type, float x, float y, float z, float o, TeamId teamId = TEAM_NEUTRAL); bool AddSpiritGuide(uint32 type, Position const& pos, TeamId teamId = TEAM_NEUTRAL); int32 GetObjectType(ObjectGuid guid); @@ -480,6 +505,10 @@ class TC_GAME_API Battleground uint8 GetUniqueBracketId() const; protected: + void SetCreaturesNumber(size_t count); + void SetGameObjectsNumber(size_t count); + void SetChangeBuffs(bool change, std::vector const* buffEntries); + // this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground void EndNow(); void PlayerAddedToBGCheckIfBGIsRunning(Player* player); @@ -512,7 +541,6 @@ class TC_GAME_API Battleground // this must be filled in constructors! uint32 StartMessageIds[BG_STARTING_EVENT_COUNT]; - bool m_BuffChange; bool m_IsRandom; BGHonorMode m_HonorMode; @@ -543,6 +571,7 @@ class TC_GAME_API Battleground bool m_PrematureCountDown; uint32 m_PrematureCountDownTimer; std::string m_Name; + bool m_BuffChange; /* Pre- and post-update hooks */ @@ -574,10 +603,14 @@ class TC_GAME_API Battleground */ virtual void PostUpdateImpl(uint32 /* diff */) { } - // Player lists + // Player containers GuidVector m_ResurrectQueue; // Player GUID GuidDeque m_OfflineQueue; // Player GUID + // Spawn containers + GuidVector BgObjects; + GuidVector BgCreatures; + // Invited counters are useful for player invitation to BG - do not allow, if BG is started to one faction to have 2 more players than another faction // Invited counters will be changed only when removing already invited player from queue, removing player from battleground and inviting player to BG // Invited players counters @@ -609,5 +642,7 @@ class TC_GAME_API Battleground Position StartPosition[BG_TEAMS_COUNT]; float m_StartMaxDist; uint32 ScriptId; + + std::vector const* m_BuffEntries; }; #endif diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 753d0f92ef3bb..18bd5170bde76 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -116,7 +116,7 @@ void BattlegroundMgr::Update(uint32 diff) } // update events timer - for (int qtype = BATTLEGROUND_QUEUE_NONE; qtype < MAX_BATTLEGROUND_QUEUE_TYPES; ++qtype) + for (uint32 qtype = BATTLEGROUND_QUEUE_NONE; qtype < MAX_BATTLEGROUND_QUEUE_TYPES; ++qtype) m_BattlegroundQueues[qtype].UpdateEvents(diff); // update scheduled queues @@ -125,7 +125,7 @@ void BattlegroundMgr::Update(uint32 diff) std::vector scheduled; std::swap(scheduled, m_QueueUpdateScheduler); - for (uint8 i = 0; i < scheduled.size(); i++) + for (uint32 i = 0; i < scheduled.size(); ++i) { uint32 arenaMMRating = scheduled[i] >> 32; uint8 arenaType = scheduled[i] >> 24 & 255; @@ -160,7 +160,7 @@ void BattlegroundMgr::Update(uint32 diff) { if (m_AutoDistributionTimeChecker < diff) { - if (time(NULL) > m_NextAutoDistributionTime) + if (time(nullptr) > m_NextAutoDistributionTime) { sArenaTeamMgr->DistributeArenaPoints(); m_NextAutoDistributionTime = m_NextAutoDistributionTime + BATTLEGROUND_ARENA_POINT_DISTRIBUTION_DAY * sWorld->getIntConfig(CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS); @@ -265,14 +265,14 @@ Battleground* BattlegroundMgr::GetBattlegroundThroughClientInstance(uint32 insta //SMSG_BATTLEFIELD_LIST we need to find the battleground with this clientinstance-id Battleground* bg = GetBattlegroundTemplate(bgTypeId); if (!bg) - return NULL; + return nullptr; if (bg->isArena()) return GetBattleground(instanceId, bgTypeId); BattlegroundDataContainer::const_iterator it = bgDataStore.find(bgTypeId); if (it == bgDataStore.end()) - return NULL; + return nullptr; for (BattlegroundContainer::const_iterator itr = it->second.m_Battlegrounds.begin(); itr != it->second.m_Battlegrounds.end(); ++itr) { @@ -280,13 +280,13 @@ Battleground* BattlegroundMgr::GetBattlegroundThroughClientInstance(uint32 insta return itr->second; } - return NULL; + return nullptr; } Battleground* BattlegroundMgr::GetBattleground(uint32 instanceId, BattlegroundTypeId bgTypeId) { if (!instanceId) - return NULL; + return nullptr; BattlegroundDataContainer::const_iterator begin, end; @@ -299,7 +299,7 @@ Battleground* BattlegroundMgr::GetBattleground(uint32 instanceId, BattlegroundTy { end = bgDataStore.find(bgTypeId); if (end == bgDataStore.end()) - return NULL; + return nullptr; begin = end++; } @@ -311,18 +311,18 @@ Battleground* BattlegroundMgr::GetBattleground(uint32 instanceId, BattlegroundTy return itr->second; } - return NULL; + return nullptr; } Battleground* BattlegroundMgr::GetBattlegroundTemplate(BattlegroundTypeId bgTypeId) { BattlegroundDataContainer::const_iterator itr = bgDataStore.find(bgTypeId); if (itr == bgDataStore.end()) - return NULL; + return nullptr; BattlegroundContainer const& bgs = itr->second.m_Battlegrounds; //map is sorted and we can be sure that lowest instance id has only BG template - return bgs.empty() ? NULL : bgs.begin()->second; + return bgs.empty() ? nullptr : bgs.begin()->second; } uint32 BattlegroundMgr::CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id) @@ -361,10 +361,10 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId original if (!bg_template) { TC_LOG_ERROR("bg.battleground", "Battleground: CreateNewBattleground - bg template not found for %u", bgTypeId); - return NULL; + return nullptr; } - Battleground* bg = NULL; + Battleground* bg = nullptr; // create a copy of the BG template switch (bgTypeId) { @@ -404,7 +404,7 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId original case BATTLEGROUND_RB: case BATTLEGROUND_AA: default: - return NULL; + return nullptr; } bool isRandom = bgTypeId != originalBgTypeId && !bg->isArena(); @@ -541,7 +541,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() BattlegroundTypeId bgTypeId = BattlegroundTypeId(fields[0].GetUInt32()); - if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, bgTypeId, NULL)) + if (DisableMgr::IsDisabledFor(DISABLE_TYPE_BATTLEGROUND, bgTypeId, nullptr)) continue; // can be overwrite by values from DB @@ -624,7 +624,7 @@ void BattlegroundMgr::InitAutomaticArenaPointDistribution() return; time_t wstime = time_t(sWorld->getWorldState(WS_ARENA_DISTRIBUTION_TIME)); - time_t curtime = time(NULL); + time_t curtime = time(nullptr); TC_LOG_DEBUG("bg.battleground", "Initializing Automatic Arena Point Distribution"); if (wstime < curtime) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 834151108a4f7..636049425f90b 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -25,12 +25,89 @@ #include "Util.h" #include "WorldSession.h" +uint32 const BG_AB_OP_NODESTATES[5] = { 1767, 1782, 1772, 1792, 1787 }; +uint32 const BG_AB_OP_NODEICONS[5] = { 1842, 1846, 1845, 1844, 1843 }; + +uint32 const BG_AB_NotABBGWeekendHonorTicks = 260; +uint32 const BG_AB_ABBGWeekendHonorTicks = 160; +uint32 const BG_AB_NotABBGWeekendReputationTicks = 160; +uint32 const BG_AB_ABBGWeekendReputationTicks = 120; + +uint32 const AB_EVENT_START_BATTLE = 9158; // Achievement: Let's Get This Done + +uint32 const BG_AB_NodeGameObject[BG_AB_DYNAMIC_NODE_GO_COUNT] = +{ + BG_AB_OBJECTID_NODE_BANNER_0, + BG_AB_OBJECTID_BANNER_CONT_A, + BG_AB_OBJECTID_BANNER_CONT_H, + BG_AB_OBJECTID_BANNER_A, + BG_AB_OBJECTID_BANNER_H, + BG_AB_OBJECTID_AURA_A, + BG_AB_OBJECTID_AURA_H, + BG_AB_OBJECTID_AURA_C +}; + +BattlegroundGOSpawnPoint const BG_AB_NodePositions[BG_AB_DYNAMIC_NODES_COUNT] = +{ + { 0, { 1166.785f, 1200.132f, -56.70859f, 0.9075713f }, { 0.f, 0.f, 0.4383707f, 0.8987942f }, RESPAWN_ONE_DAY }, // stables + { 0, { 977.0799f, 1046.542f, -44.83030f, -2.6179890f }, { 0.f, 0.f, -0.9659252f, 0.2588213f }, RESPAWN_ONE_DAY }, // blacksmith + { 0, { 806.1821f, 874.2723f, -55.99371f, -2.3038310f }, { 0.f, 0.f, -0.9135447f, 0.4067384f }, RESPAWN_ONE_DAY }, // farm + { 0, { 856.1419f, 1148.902f, 11.18469f, -2.3038310f }, { 0.f, 0.f, -0.9135447f, 0.4067384f }, RESPAWN_ONE_DAY }, // lumber mill + { 0, { 1146.922f, 848.1899f, -110.9200f, 2.4260080f }, { 0.f, 0.f, 0.9366722f, 0.3502074f }, RESPAWN_ONE_DAY } // gold mine +}; + +BattlegroundGOSpawnPoint const BattlegroundABDoors[BG_TEAMS_COUNT] = +{ + { BG_AB_OBJECTID_GATE_A, { 1284.597f, 1281.167f, -15.97792f, 0.7068594f }, { 0.012957f, -0.060288f, 0.344959f, 0.936590f }, RESPAWN_IMMEDIATELY }, + { BG_AB_OBJECTID_GATE_H, { 708.0903f, 708.4479f, -17.83420f, -2.3910990f }, { 0.050291f, 0.015127f, 0.929217f, -0.365784f }, RESPAWN_IMMEDIATELY } +}; + +uint32 const BG_AB_BuffEntries[BG_MAX_BUFFS] = +{ + BG_AB_FOOD_BUFF, + BG_AB_BERSERK_BUFF, + BG_AB_SPEED_BUFF +}; + +std::vector const buffEntries = +{ + { BG_AB_SPEED_BUFF, BG_AB_FOOD_BUFF, BG_AB_BERSERK_BUFF } +}; + +BattlegroundGOSpawnPoint const BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT] = +{ + { 0, { 1185.566f, 1184.629f, -56.36329f, 2.3038310f }, { 0.f, 0.f, 0.9135447f, 0.40673840f }, RESPAWN_ONE_DAY }, // stables + { 0, { 990.1131f, 1008.730f, -42.60328f, 0.8203033f }, { 0.f, 0.f, 0.3987484f, 0.91706040f }, RESPAWN_ONE_DAY }, // blacksmith + { 0, { 818.0089f, 842.3543f, -56.54062f, -3.1066520f }, { 0.f, 0.f, -0.9998474f, 0.01746928f }, RESPAWN_ONE_DAY }, // farm + { 0, { 808.8463f, 1185.417f, 11.92161f, -0.6632232f }, { 0.f, 0.f, -0.3255672f, 0.94551890f }, RESPAWN_ONE_DAY }, // lumber mill + { 0, { 1147.091f, 816.8362f, -98.39896f, -0.2268925f }, { 0.f, 0.f, -0.1132030f, 0.99357190f }, RESPAWN_ONE_DAY } // gold mine +}; + +// Tick intervals and given points: case 0, 1, 2, 3, 4, 5 captured nodes +uint32 const BG_AB_TickIntervals[6] = { 0, 12000, 9000, 6000, 3000, 1000 }; +uint32 const BG_AB_TickPoints[6] = { 0, 10, 10, 10, 10, 30 }; + +// WorldSafeLocs ids for 5 nodes, and for ally, and horde starting location +uint32 const BG_AB_GraveyardIds[BG_AB_ALL_NODES_COUNT] = { 895, 894, 893, 897, 896, 898, 899 }; + +Position const BG_AB_SpiritGuidePos[BG_AB_ALL_NODES_COUNT] = +{ + { 1200.03f, 1171.09f, -56.47f, 5.15f }, // stables + { 1017.43f, 960.610f, -42.95f, 4.88f }, // blacksmith + { 833.000f, 793.000f, -57.25f, 5.27f }, // farm + { 775.170f, 1206.40f, 15.79f, 1.90f }, // lumber mill + { 1207.48f, 787.000f, -83.36f, 5.51f }, // gold mine + { 1354.05f, 1275.48f, -11.30f, 4.77f }, // alliance starting base + { 714.610f, 646.150f, -10.87f, 4.34f } // horde starting base +}; + BattlegroundAB::BattlegroundAB() { m_IsInformedNearVictory = false; - m_BuffChange = true; - BgObjects.resize(BG_AB_OBJECT_MAX); - BgCreatures.resize(BG_AB_ALL_NODES_COUNT + 5);//+5 for aura triggers + SetChangeBuffs(true, &buffEntries); + + SetGameObjectsNumber(BG_AB_OBJECT_MAX); + SetCreaturesNumber(BG_AB_ALL_NODES_COUNT + 5);//+5 for aura triggers for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { @@ -65,9 +142,9 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff) { if (GetStatus() == STATUS_IN_PROGRESS) { - int team_points[BG_TEAMS_COUNT] = { 0, 0 }; + uint32 team_points[BG_TEAMS_COUNT] = { 0, 0 }; - for (int node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) + for (uint8 node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[node].timer) @@ -104,27 +181,27 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff) if (teamIndex == 0) { // FIXME: team and node names not localized - SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node)); + SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, nullptr, LANG_BG_AB_ALLY, _GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); } else { // FIXME: team and node names not localized - SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_AB_HORDE, _GetNodeNameId(node)); + SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, nullptr, LANG_BG_AB_HORDE, _GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); } } } - for (int team = 0; team < BG_TEAMS_COUNT; ++team) + for (uint8 team = 0; team < BG_TEAMS_COUNT; ++team) if (m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED) ++team_points[team]; } // Accumulate points - for (int team = 0; team < BG_TEAMS_COUNT; ++team) + for (uint8 team = 0; team < BG_TEAMS_COUNT; ++team) { - int points = team_points[team]; + uint32 points = team_points[team]; if (!points) continue; @@ -185,16 +262,17 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff) void BattlegroundAB::StartingEventCloseDoors() { // despawn banners, auras and buffs - for (int obj = BG_AB_OBJECT_BANNER_NEUTRAL; obj < BG_AB_DYNAMIC_NODES_COUNT * 8; ++obj) + for (uint32 obj = BG_AB_OBJECT_BANNER_NEUTRAL; obj < BG_AB_DYNAMIC_NODES_COUNT * BG_AB_DYNAMIC_NODE_GO_COUNT; ++obj) SpawnBGObject(obj, RESPAWN_ONE_DAY); - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * 3; ++i) + for (uint32 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * BG_MAX_BUFFS; ++i) SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + i, RESPAWN_ONE_DAY); // Starting doors - DoorClose(BG_AB_OBJECT_GATE_A); - DoorClose(BG_AB_OBJECT_GATE_H); - SpawnBGObject(BG_AB_OBJECT_GATE_A, RESPAWN_IMMEDIATELY); - SpawnBGObject(BG_AB_OBJECT_GATE_H, RESPAWN_IMMEDIATELY); + for (uint32 door = BG_AB_OBJECT_GATE_A; door <= BG_AB_OBJECT_GATE_H; ++door) + { + DoorClose(door); + SpawnBGObject(door, RESPAWN_IMMEDIATELY); + } // Starting base spirit guides _NodeOccupied(BG_AB_SPIRIT_ALIANCE, ALLIANCE); @@ -204,16 +282,17 @@ void BattlegroundAB::StartingEventCloseDoors() void BattlegroundAB::StartingEventOpenDoors() { // spawn neutral banners - for (int banner = BG_AB_OBJECT_BANNER_NEUTRAL, i = 0; i < 5; banner += 8, ++i) + for (uint32 banner = BG_AB_OBJECT_BANNER_NEUTRAL, i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; banner += BG_AB_DYNAMIC_NODE_GO_COUNT, ++i) SpawnBGObject(banner, RESPAWN_IMMEDIATELY); - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint32 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { //randomly select buff to spawn - uint8 buff = urand(0, 2); - SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + buff + i * 3, RESPAWN_IMMEDIATELY); + uint8 buff = urand(0, BG_MAX_BUFFS - 1); + SpawnBGObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + buff + i * BG_MAX_BUFFS, RESPAWN_IMMEDIATELY); } - DoorOpen(BG_AB_OBJECT_GATE_A); - DoorOpen(BG_AB_OBJECT_GATE_H); + + for (uint32 door = BG_AB_OBJECT_GATE_A; door <= BG_AB_OBJECT_GATE_H; ++door) + DoorOpen(door); // Achievement: Let's Get This Done StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, AB_EVENT_START_BATTLE); @@ -385,14 +464,14 @@ void BattlegroundAB::_NodeOccupied(uint8 node, Team team) if (m_Nodes[i] == GetTeamIndexByTeamId(team) + BG_AB_NODE_TYPE_OCCUPIED && !m_NodeTimers[i]) ++capturedNodes; - if (capturedNodes >= 5) + if (capturedNodes >= BG_AB_DYNAMIC_NODES_COUNT) CastSpellOnTeam(SPELL_AB_QUEST_REWARD_5_BASES, team); if (capturedNodes >= 4) CastSpellOnTeam(SPELL_AB_QUEST_REWARD_4_BASES, team); - Creature* trigger = !BgCreatures[node + 7] ? GetBGCreature(node + 7) : NULL; // 0-6 spirit guides + Creature* trigger = GetBGCreature(node + 7); // 0-6 spirit guides if (!trigger) - trigger = AddCreature(WORLD_TRIGGER, node+7, BG_AB_NodePositions[node], GetTeamIndexByTeamId(team)); + trigger = AddCreature(WORLD_TRIGGER, node + 7, BG_AB_NodePositions[node].Pos); //add bonus honor aura trigger creature when node is accupied //cast bonus aura (+50% honor in 25yards) @@ -410,10 +489,11 @@ void BattlegroundAB::_NodeDeOccupied(uint8 node) return; //remove bonus honor aura trigger creature when node is lost - if (node < BG_AB_DYNAMIC_NODES_COUNT)//only dynamic nodes, no start points - DelCreature(node+7);//NULL checks are in DelCreature! 0-6 spirit guides + if (node < BG_AB_DYNAMIC_NODES_COUNT) //only dynamic nodes, no start points + DelCreature(node + 7); //NULL checks are in DelCreature! 0-6 spirit guides - RelocateDeadPlayers(BgCreatures[node]); + if (Creature* spiritGuide = GetBGCreature(node)) + RelocateDeadPlayers(spiritGuide->GetGUID()); DelCreature(node); @@ -427,11 +507,11 @@ void BattlegroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* /*targ return; uint8 node = BG_AB_NODE_STABLES; - GameObject* obj = GetBgMap()->GetGameObject(BgObjects[node*8+7]); - while ((node < BG_AB_DYNAMIC_NODES_COUNT) && ((!obj) || (!source->IsWithinDistInMap(obj, 10)))) + GameObject* obj = GetBGObject(node * 8 + 7); + while ((node < BG_AB_DYNAMIC_NODES_COUNT) && ((!obj) || (!source->IsWithinDistInMap(obj, 10.f)))) { ++node; - obj = GetBgMap()->GetGameObject(BgObjects[node*8+BG_AB_OBJECT_AURA_CONTESTED]); + obj = GetBGObject(node * 8 + BG_AB_OBJECT_AURA_CONTESTED); } if (node == BG_AB_DYNAMIC_NODES_COUNT) @@ -541,9 +621,9 @@ void BattlegroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* /*targ { // FIXME: team and node names not localized if (teamIndex == TEAM_ALLIANCE) - SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node)); + SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, nullptr, LANG_BG_AB_ALLY, _GetNodeNameId(node)); else - SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_AB_HORDE, _GetNodeNameId(node)); + SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, nullptr, LANG_BG_AB_HORDE, _GetNodeNameId(node)); } PlaySoundToAll(sound); } @@ -569,36 +649,47 @@ uint32 BattlegroundAB::GetPrematureWinner() bool BattlegroundAB::SetupBattleground() { - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint32 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * BG_AB_DYNAMIC_NODE_GO_COUNT; ++i) { - if (!AddObject(BG_AB_OBJECT_BANNER_NEUTRAL + 8*i, BG_AB_OBJECTID_NODE_BANNER_0 + i, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_CONT_A + 8*i, BG_AB_OBJECTID_BANNER_CONT_A, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_CONT_H + 8*i, BG_AB_OBJECTID_BANNER_CONT_H, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_ALLY + 8*i, BG_AB_OBJECTID_BANNER_A, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_HORDE + 8*i, BG_AB_OBJECTID_BANNER_H, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_AURA_ALLY + 8*i, BG_AB_OBJECTID_AURA_A, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_AURA_HORDE + 8*i, BG_AB_OBJECTID_AURA_H, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_AURA_CONTESTED + 8*i, BG_AB_OBJECTID_AURA_C, BG_AB_NodePositions[i], 0, 0, std::sin(BG_AB_NodePositions[i].GetOrientation()/2), std::cos(BG_AB_NodePositions[i].GetOrientation()/2), RESPAWN_ONE_DAY)) + uint32 const nodeID = i / BG_AB_DYNAMIC_NODE_GO_COUNT; + uint32 const objID = i % BG_AB_DYNAMIC_NODE_GO_COUNT; + + uint32 entry = BG_AB_NodeGameObject[objID]; + if (objID == 0) // new node + entry += nodeID; + + BattlegroundGOSpawnPoint const& nodeSpawn = BG_AB_NodePositions[nodeID]; + if (!AddObject(BG_AB_OBJECT_FIRST + i, entry, nodeSpawn.Pos, nodeSpawn.Rot, nodeSpawn.SpawnTime)) { - TC_LOG_ERROR("sql.sql", "BatteGroundAB: Failed to spawn some object Battleground not created!"); + TC_LOG_ERROR("bg.battleground", "BattleGroundAB: Failed to spawn GameObject! (Entry: %u)", entry); return false; } } - if (!AddObject(BG_AB_OBJECT_GATE_A, BG_AB_OBJECTID_GATE_A, BG_AB_DoorPositions[0][0], BG_AB_DoorPositions[0][1], BG_AB_DoorPositions[0][2], BG_AB_DoorPositions[0][3], BG_AB_DoorPositions[0][4], BG_AB_DoorPositions[0][5], BG_AB_DoorPositions[0][6], BG_AB_DoorPositions[0][7], RESPAWN_IMMEDIATELY) - || !AddObject(BG_AB_OBJECT_GATE_H, BG_AB_OBJECTID_GATE_H, BG_AB_DoorPositions[1][0], BG_AB_DoorPositions[1][1], BG_AB_DoorPositions[1][2], BG_AB_DoorPositions[1][3], BG_AB_DoorPositions[1][4], BG_AB_DoorPositions[1][5], BG_AB_DoorPositions[1][6], BG_AB_DoorPositions[1][7], RESPAWN_IMMEDIATELY)) + for (uint32 i = 0; i < BG_TEAMS_COUNT; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundAB: Failed to spawn door object Battleground not created!"); - return false; + BattlegroundGOSpawnPoint const& door = BattlegroundABDoors[i]; + if (!AddObject(BG_AB_OBJECT_GATE_A + i, door.Entry, door.Pos, door.Rot, door.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundAB: Failed to spawn door object (Entry: %u). Battleground not created!", door.Entry); + return false; + } } //buffs - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint32 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * BG_MAX_BUFFS; ++i) { - if (!AddObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + 3 * i, Buff_Entries[0], BG_AB_BuffPositions[i][0], BG_AB_BuffPositions[i][1], BG_AB_BuffPositions[i][2], BG_AB_BuffPositions[i][3], 0, 0, std::sin(BG_AB_BuffPositions[i][3]/2), std::cos(BG_AB_BuffPositions[i][3]/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + 3 * i + 1, Buff_Entries[1], BG_AB_BuffPositions[i][0], BG_AB_BuffPositions[i][1], BG_AB_BuffPositions[i][2], BG_AB_BuffPositions[i][3], 0, 0, std::sin(BG_AB_BuffPositions[i][3]/2), std::cos(BG_AB_BuffPositions[i][3]/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + 3 * i + 2, Buff_Entries[2], BG_AB_BuffPositions[i][0], BG_AB_BuffPositions[i][1], BG_AB_BuffPositions[i][2], BG_AB_BuffPositions[i][3], 0, 0, std::sin(BG_AB_BuffPositions[i][3]/2), std::cos(BG_AB_BuffPositions[i][3]/2), RESPAWN_ONE_DAY)) - TC_LOG_ERROR("sql.sql", "BatteGroundAB: Failed to spawn buff object!"); + uint32 const nodeID = i / BG_MAX_BUFFS; + uint32 const objId = i % BG_MAX_BUFFS; + + uint32 entry = BG_AB_BuffEntries[objId]; + + BattlegroundGOSpawnPoint const& nodeBuff = BG_AB_BuffPositions[nodeID]; + if (!AddObject(BG_AB_OBJECT_BUFF_FIRST + i, entry, nodeBuff.Pos, nodeBuff.Rot, nodeBuff.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundAB: Failed to spawn buff object (Entry: %u). Battleground not created!", entry); + return false; + } } return true; @@ -609,20 +700,10 @@ void BattlegroundAB::Reset() //call parent's class reset Battleground::Reset(); - m_TeamScores[TEAM_ALLIANCE] = 0; - m_TeamScores[TEAM_HORDE] = 0; - m_lastTick[TEAM_ALLIANCE] = 0; - m_lastTick[TEAM_HORDE] = 0; - m_HonorScoreTics[TEAM_ALLIANCE] = 0; - m_HonorScoreTics[TEAM_HORDE] = 0; - m_ReputationScoreTics[TEAM_ALLIANCE] = 0; - m_ReputationScoreTics[TEAM_HORDE] = 0; m_IsInformedNearVictory = false; bool isBGWeekend = sBattlegroundMgr->IsBGWeekend(GetTypeID()); m_HonorTics = (isBGWeekend) ? BG_AB_ABBGWeekendHonorTicks : BG_AB_NotABBGWeekendHonorTicks; m_ReputationTics = (isBGWeekend) ? BG_AB_ABBGWeekendReputationTicks : BG_AB_NotABBGWeekendReputationTicks; - m_TeamScores500Disadvantage[TEAM_ALLIANCE] = false; - m_TeamScores500Disadvantage[TEAM_HORDE] = false; for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { @@ -632,9 +713,17 @@ void BattlegroundAB::Reset() m_BannerTimers[i].timer = 0; } - for (uint8 i = 0; i < BG_AB_ALL_NODES_COUNT + 5; ++i)//+5 for aura triggers - if (BgCreatures[i]) - DelCreature(i); + for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) + { + m_TeamScores[i] = 0; + m_lastTick[i] = 0; + m_HonorScoreTics[i] = 0; + m_ReputationScoreTics[i] = 0; + m_TeamScores500Disadvantage[i] = false; + } + + for (uint8 i = 0; i < BG_AB_ALL_NODES_COUNT + 5; ++i) // +5 for aura triggers + DelCreature(i); } void BattlegroundAB::EndBattleground(uint32 winner) @@ -661,7 +750,7 @@ WorldSafeLocsEntry const* BattlegroundAB::GetClosestGraveYard(Player* player) if (m_Nodes[i] == teamIndex + 3) nodes.push_back(i); - WorldSafeLocsEntry const* good_entry = NULL; + WorldSafeLocsEntry const* good_entry = nullptr; // If so, select the closest node to place ghost on if (!nodes.empty()) { @@ -712,7 +801,7 @@ bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value bool BattlegroundAB::IsAllNodesControlledByTeam(uint32 team) const { uint32 count = 0; - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) if ((team == ALLIANCE && m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED) || (team == HORDE && m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED)) ++count; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index 328eb79d210eb..2089fbbf0e67e 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -61,10 +61,6 @@ enum BG_AB_WorldStates */ }; -const uint32 BG_AB_OP_NODESTATES[5] = {1767, 1782, 1772, 1792, 1787}; - -const uint32 BG_AB_OP_NODEICONS[5] = {1842, 1846, 1845, 1844, 1843}; - /* Note: code uses that these IDs follow each other */ enum BG_AB_NodeObjectId { @@ -78,6 +74,7 @@ enum BG_AB_NodeObjectId enum BG_AB_ObjectType { // for all 5 node points 8*5=40 objects + BG_AB_OBJECT_FIRST = 0, BG_AB_OBJECT_BANNER_NEUTRAL = 0, BG_AB_OBJECT_BANNER_CONT_A = 1, BG_AB_OBJECT_BANNER_CONT_H = 2, @@ -90,6 +87,7 @@ enum BG_AB_ObjectType BG_AB_OBJECT_GATE_A = 40, BG_AB_OBJECT_GATE_H = 41, //buffs + BG_AB_OBJECT_BUFF_FIRST = 42, BG_AB_OBJECT_SPEEDBUFF_STABLES = 42, BG_AB_OBJECT_REGENBUFF_STABLES = 43, BG_AB_OBJECT_BERSERKBUFF_STABLES = 44, @@ -124,6 +122,13 @@ enum BG_AB_ObjectTypes BG_AB_OBJECTID_GATE_H = 180256 }; +enum BG_AB_BuffObjects +{ + BG_AB_FOOD_BUFF = 180144, + BG_AB_BERSERK_BUFF = 180382, + BG_AB_SPEED_BUFF = 180384 +}; + enum BG_AB_Timers { BG_AB_FLAG_CAPTURING_TIME = 60000 @@ -145,6 +150,7 @@ enum BG_AB_BattlegroundNodes BG_AB_NODE_GOLD_MINE = 4, BG_AB_DYNAMIC_NODES_COUNT = 5, // dynamic nodes that can be captured + BG_AB_DYNAMIC_NODE_GO_COUNT = 8, // how many GOs are spawned in each dynamic node BG_AB_SPIRIT_ALIANCE = 5, BG_AB_SPIRIT_HORDE = 6, @@ -179,57 +185,6 @@ enum BG_AB_Objectives AB_OBJECTIVE_DEFEND_BASE = 123 }; -#define BG_AB_NotABBGWeekendHonorTicks 260 -#define BG_AB_ABBGWeekendHonorTicks 160 -#define BG_AB_NotABBGWeekendReputationTicks 160 -#define BG_AB_ABBGWeekendReputationTicks 120 - -#define AB_EVENT_START_BATTLE 9158 // Achievement: Let's Get This Done - -Position const BG_AB_NodePositions[BG_AB_DYNAMIC_NODES_COUNT] = -{ - {1166.785f, 1200.132f, -56.70859f, 0.9075713f}, // stables - {977.0156f, 1046.616f, -44.80923f, -2.600541f}, // blacksmith - {806.1821f, 874.2723f, -55.99371f, -2.303835f}, // farm - {856.1419f, 1148.902f, 11.18469f, -2.303835f}, // lumber mill - {1146.923f, 848.1782f, -110.917f, -0.7330382f} // gold mine -}; - -// x, y, z, o, rot0, rot1, rot2, rot3 -const float BG_AB_DoorPositions[2][8] = -{ - {1284.597f, 1281.167f, -15.97792f, 0.7068594f, 0.012957f, -0.060288f, 0.344959f, 0.93659f}, - {708.0903f, 708.4479f, -17.8342f, -2.391099f, 0.050291f, 0.015127f, 0.929217f, -0.365784f} -}; - -// Tick intervals and given points: case 0, 1, 2, 3, 4, 5 captured nodes -const uint32 BG_AB_TickIntervals[6] = {0, 12000, 9000, 6000, 3000, 1000}; -const uint32 BG_AB_TickPoints[6] = {0, 10, 10, 10, 10, 30}; - -// WorldSafeLocs ids for 5 nodes, and for ally, and horde starting location -const uint32 BG_AB_GraveyardIds[BG_AB_ALL_NODES_COUNT] = {895, 894, 893, 897, 896, 898, 899}; - -// x, y, z, o -const float BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT][4] = -{ - {1185.71f, 1185.24f, -56.36f, 2.56f}, // stables - {990.75f, 1008.18f, -42.60f, 2.43f}, // blacksmith - {817.66f, 843.34f, -56.54f, 3.01f}, // farm - {807.46f, 1189.16f, 11.92f, 5.44f}, // lumber mill - {1146.62f, 816.94f, -98.49f, 6.14f} // gold mine -}; - -Position const BG_AB_SpiritGuidePos[BG_AB_ALL_NODES_COUNT] = -{ - {1200.03f, 1171.09f, -56.47f, 5.15f}, // stables - {1017.43f, 960.61f, -42.95f, 4.88f}, // blacksmith - {833.00f, 793.00f, -57.25f, 5.27f}, // farm - {775.17f, 1206.40f, 15.79f, 1.90f}, // lumber mill - {1207.48f, 787.00f, -83.36f, 5.51f}, // gold mine - {1354.05f, 1275.48f, -11.30f, 4.77f}, // alliance starting base - {714.61f, 646.15f, -10.87f, 4.34f} // horde starting base -}; - struct BG_AB_BannerTimer { uint32 timer; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index f7ee5c7f16b2d..0ca41b97a43f7 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -27,19 +27,929 @@ #include "ScriptedCreature.h" #include "WorldSession.h" +BattlegroundGOSpawnPoint const BG_AV_GameObjects[BG_AV_OBJECT_MAX] = +{ + { BG_AV_OBJECTID_GATE, { 794.6431f, -493.4745f, 99.77789f, 6.16101300f }, { 0.f, 0.f, -0.06104851f, 0.998134800f }, RESPAWN_IMMEDIATELY }, + { BG_AV_OBJECTID_GATE, { -1382.057f, -545.9169f, 54.90467f, 0.76794390f }, { 0.f, 0.f, 0.37460610f, 0.927184000f }, RESPAWN_IMMEDIATELY }, + { BG_AV_GHOST_GATE, { 794.6349f, -493.6433f, 98.60200f, 3.03683800f }, { 0.f, 0.f, 0.99862860f, 0.052353220f }, RESPAWN_IMMEDIATELY }, + { BG_AV_GHOST_GATE, { -1382.432f, -545.4144f, 54.83085f, 3.90954100f }, { 0.f, 0.f, -0.92718320f, 0.374608300f }, RESPAWN_IMMEDIATELY }, + + { BG_AV_OBJECTID_BANNER_A_AID_STATION, { 638.5921f, -32.42204f, 46.06084f, -1.62315600f }, { 0.f, 0.f, -0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, // aid station + { BG_AV_OBJECTID_BANNER_A_STORMPIKE, { 669.0073f, -294.0783f, 30.29091f, 2.77506900f }, { 0.f, 0.f, 0.98325440f, 0.182238000f }, RESPAWN_ONE_DAY }, // stormpike + { BG_AV_OBJECTID_BANNER_A_STONEHEARTH_GRAVE, { 77.50445f, -404.5873f, 46.78254f, 2.28637900f }, { 0.f, 0.f, 0.90996070f, 0.414694400f }, RESPAWN_ONE_DAY }, // stonehearth grave + { BG_AV_OBJECTID_BANNER_A_SNOWFALL_GRAVE, { -202.2778f, -113.2084f, 78.47941f, 5.02654900f }, { 0.f, 0.f, -0.58778480f, 0.809017400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_BANNER_A_ICEBLOOD_GRAVE, { -612.9139f, -396.8383f, 60.85839f, 3.10665200f }, { 0.f, 0.f, 0.99984740f, 0.017469280f }, RESPAWN_ONE_DAY }, // iceblood grave + { BG_AV_OBJECTID_BANNER_A_FROSTWOLF_GRAVE, { -1082.428f, -346.7917f, 54.92648f, -1.51843600f }, { 0.f, 0.f, -0.68835450f, 0.725374500f }, RESPAWN_ONE_DAY }, // frostwolf grave + { BG_AV_OBJECTID_BANNER_A_FROSTWOLF_HUT, { -1402.210f, -307.4312f, 89.44242f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut + { BG_AV_OBJECTID_BANNER_A_DUN_BALDAR_S, { 553.7794f, -78.65658f, 51.93779f, -1.22172900f }, { 0.f, 0.f, -0.57357600f, 0.819152400f }, RESPAWN_ONE_DAY }, // dun baldar south + { BG_AV_OBJECTID_BANNER_A_DUN_BALDAR_N, { 674.0006f, -143.1251f, 63.66151f, 0.99483720f }, { 0.f, 0.f, 0.47715850f, 0.878817300f }, RESPAWN_ONE_DAY }, // dun baldar north + { BG_AV_OBJECTID_BANNER_A_ICEWING_BUNKER, { 203.2385f, -360.2642f, 56.38615f, -0.87266390f }, { 0.f, 0.f, -0.42261790f, 0.906307900f }, RESPAWN_ONE_DAY }, // icewing bunker + { BG_AV_OBJECTID_BANNER_A_STONEHEARTH_BUNKER, { -152.4339f, -441.6148f, 40.39709f, -1.93731600f }, { 0.f, 0.f, -0.82412620f, 0.566406100f }, RESPAWN_ONE_DAY }, // stonehearth bunker + + { BG_AV_OBJECTID_BANNER_CONT_A_AID_STATION, { 638.4788f, -31.21739f, 46.24166f, 1.62315600f }, { 0.f, 0.f, 0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, // aid station + { BG_AV_OBJECTID_BANNER_CONT_A_STORMPIKE, { 669.0321f, -294.0603f, 30.29091f, 2.77506900f }, { 0.f, 0.f, 0.98325440f, 0.182238000f }, RESPAWN_ONE_DAY }, // stormpike + { BG_AV_OBJECTID_BANNER_CONT_A_STONEHEARTH_GRAVE, { 78.38553f, -405.4505f, 46.60544f, -0.85521050f }, { 0.f, 0.f, -0.41469290f, 0.909961500f }, RESPAWN_ONE_DAY }, // stonehearth grave + { BG_AV_OBJECTID_BANNER_CONT_A_SNOWFALL, { -202.5808f, -112.7303f, 78.48758f, -0.71558490f }, { 0.f, 0.f, -0.35020730f, 0.936672200f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_BANNER_CONT_A_ICEBLOOD_GRAVE, { -611.5228f, -396.8190f, 60.85839f, 6.24827900f }, { 0.f, 0.f, -0.01745224f, 0.999847700f }, RESPAWN_ONE_DAY }, // iceblood grave + { BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_GRAVE, { -1082.448f, -346.8234f, 54.92188f, -1.53589000f }, { 0.f, 0.f, -0.69465830f, 0.719339800f }, RESPAWN_ONE_DAY }, // frostwolf grave + { BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_HUT, { -1402.278f, -307.3798f, 89.44196f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut + { BG_AV_OBJECTID_BANNER_CONT_A_ICEBLOOD_GARRISON, { -571.8568f, -262.7909f, 75.00867f, -0.78539680f }, { 0.f, 0.f, -0.38268280f, 0.923879800f }, RESPAWN_ONE_DAY }, // iceblood garrison + { BG_AV_OBJECTID_BANNER_CONT_A_TOWER_POINT, { -768.0753f, -362.6295f, 90.89486f, 1.15191600f }, { 0.f, 0.f, 0.54463860f, 0.838670800f }, RESPAWN_ONE_DAY }, // tower point + { BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_E, { -1302.900f, -316.9811f, 113.8671f, 2.00712800f }, { 0.f, 0.f, 0.84339140f, 0.537299600f }, RESPAWN_ONE_DAY }, // frostwolf etower + { BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_W, { -1297.695f, -266.7301f, 114.1512f, -2.93213900f }, { 0.f, 0.f, -0.99452110f, 0.104535500f }, RESPAWN_ONE_DAY }, // frostwolf wtower + + { BG_AV_OBJECTID_BANNER_CONT_H_AID_STATION, { 638.6570f, -32.22944f, 46.09035f, 4.66003000f }, { 0.f, 0.f, -0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, // aid station + { BG_AV_OBJECTID_BANNER_CONT_H_STORMPIKE, { 669.2953f, -294.0375f, 30.28969f, 5.91666800f }, { 0.f, 0.f, -0.18223480f, 0.983255000f }, RESPAWN_ONE_DAY }, // stormpike + { BG_AV_OBJECTID_BANNER_CONT_H_STONEHEARTH_GRAVE, { 77.80132f, -404.6999f, 46.75493f, -0.87266390f }, { 0.f, 0.f, -0.42261790f, 0.906307900f }, RESPAWN_ONE_DAY }, // stonehearth grave + { BG_AV_OBJECTID_BANNER_CONT_H_SNOWFALL, { -202.6516f, -112.8073f, 78.48706f, -1.09955600f }, { 0.f, 0.f, -0.52249810f, 0.852640500f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_BANNER_CONT_H_ICEBLOOD_GRAVE, { -612.6615f, -396.6992f, 60.85839f, 6.24827900f }, { 0.f, 0.f, -0.01745224f, 0.999847700f }, RESPAWN_ONE_DAY }, // iceblood grave + { BG_AV_OBJECTID_BANNER_CONT_H_FROSTWOLF_GRAVE, { -1082.536f, -346.5672f, 54.97722f, 4.72984400f }, { 0.f, 0.f, -0.70090870f, 0.713251100f }, RESPAWN_ONE_DAY }, // frostwolf grave + { BG_AV_OBJECTID_BANNER_CONT_H_FROSTWOLF_HUT, { -1402.176f, -307.3057f, 89.44698f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut + { BG_AV_OBJECTID_BANNER_CONT_H_DUN_BALDAR_S, { 553.8216f, -78.76752f, 51.93868f, 5.21853600f }, { 0.f, 0.f, -0.50753780f, 0.861629400f }, RESPAWN_ONE_DAY }, // dun baldar south + { BG_AV_OBJECTID_BANNER_CONT_H_DUN_BALDAR_N, { 674.0469f, -143.1559f, 63.66140f, 0.99483720f }, { 0.f, 0.f, 0.47715850f, 0.878817300f }, RESPAWN_ONE_DAY }, // dun baldar north + { BG_AV_OBJECTID_BANNER_CONT_H_ICEWING_BUNKER, { 203.2809f, -360.3663f, 56.38691f, 5.35816200f }, { 0.f, 0.f, -0.44619750f, 0.894934500f }, RESPAWN_ONE_DAY }, // icewing bunker + { BG_AV_OBJECTID_BANNER_CONT_H_STONEHEARTH_BUNKER, { -152.4373f, -441.7582f, 40.39823f, -1.95476600f }, { 0.f, 0.f, -0.82903670f, 0.559194100f }, RESPAWN_ONE_DAY }, // stonehearth bunker + + { BG_AV_OBJECTID_BANNER_H_AID_STATION, { 638.6057f, -32.15061f, 46.09934f, 4.67748400f }, { 0.f, 0.f, -0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, // aid station + { BG_AV_OBJECTID_BANNER_H_STORMPIKE, { 669.3167f, -294.0553f, 30.28967f, -0.36651760f }, { 0.f, 0.f, -0.18223480f, 0.983255000f }, RESPAWN_ONE_DAY }, // stormpike + { BG_AV_OBJECTID_BANNER_H_STONEHEARTH_GRAVE, { 77.79785f, -404.6955f, 46.91283f, 5.42797500f }, { 0.f, 0.f, -0.41469290f, 0.909961500f }, RESPAWN_ONE_DAY }, // stonehearth grave + { BG_AV_OBJECTID_BANNER_H_SNOWFALL, { -202.6227f, -112.5515f, 78.49015f, -1.25663600f }, { 0.f, 0.f, -0.58778480f, 0.809017400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_BANNER_H_ICEBLOOD_GRAVE, { -612.6716f, -396.6933f, 60.85839f, 3.08918300f }, { 0.f, 0.f, 0.99965670f, 0.026201650f }, RESPAWN_ONE_DAY }, // iceblood grave + { BG_AV_OBJECTID_BANNER_H_FROSTWOLF_GRAVE, { -1082.529f, -346.5670f, 54.97712f, 4.72984400f }, { 0.f, 0.f, -0.70090870f, 0.713251100f }, RESPAWN_ONE_DAY }, // frostwolf grave + { BG_AV_OBJECTID_BANNER_H_FROSTWOLF_HUT, { -1402.192f, -307.4671f, 89.44189f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut + { BG_AV_OBJECTID_BANNER_H_ICEBLOOD_GARRISON, { -571.8796f, -262.7768f, 75.00867f, -0.80285090f }, { 0.f, 0.f, -0.39073090f, 0.920505000f }, RESPAWN_ONE_DAY }, // iceblood garrison + { BG_AV_OBJECTID_BANNER_H_TOWER_POINT, { -768.0873f, -362.6661f, 90.89486f, 1.11700900f }, { 0.f, 0.f, 0.52991870f, 0.848048400f }, RESPAWN_ONE_DAY }, // tower point + { BG_AV_OBJECTID_BANNER_H_FROSTWOLF_E, { -1302.868f, -316.9684f, 113.8671f, 2.00712800f }, { 0.f, 0.f, 0.84339140f, 0.537299600f }, RESPAWN_ONE_DAY }, // frostwolf etower + { BG_AV_OBJECTID_BANNER_H_FROSTWOLF_W, { -1297.715f, -266.7415f, 114.1512f, -2.96704100f }, { 0.f, 0.f, -0.99619390f, 0.087165040f }, RESPAWN_ONE_DAY }, // frostwolf wtower + + { BG_AV_OBJECTID_BANNER_SNOWFALL_N, { -202.6107f, -112.7780f, 78.48716f, 5.13126900f }, { 0.f, 0.f, -0.54463860f, 0.838670800f }, RESPAWN_ONE_DAY }, // snowfall (duh) + + { BG_AV_OBJECTID_AURA_N_S, { 638.4788f, -31.21739f, 46.24166f, 1.62315600f }, { 0.f, 0.f, 0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, // aid station (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { 638.6570f, -32.22944f, 46.09035f, 4.66003000f }, { 0.f, 0.f, -0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, // aid station (Horde contested) + { BG_AV_OBJECTID_AURA_N_S, { 669.0321f, -294.0603f, 30.29091f, 2.77506900f }, { 0.f, 0.f, 0.98325440f, 0.182238000f }, RESPAWN_ONE_DAY }, // stormpike (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { 669.2953f, -294.0375f, 30.28969f, 5.91666800f }, { 0.f, 0.f, -0.18223480f, 0.983255000f }, RESPAWN_ONE_DAY }, // stormpike (Horde contested) + { BG_AV_OBJECTID_AURA_N_S, { 78.38553f, -405.4505f, 46.60544f, -0.85521050f }, { 0.f, 0.f, -0.41469290f, 0.909961500f }, RESPAWN_ONE_DAY }, // stonehearth grave (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { 77.80132f, -404.6999f, 46.75493f, -0.87266390f }, { 0.f, 0.f, -0.42261790f, 0.906307900f }, RESPAWN_ONE_DAY }, // stonehearth grave (Horde contested) + { BG_AV_OBJECTID_AURA_N_S, { -202.5808f, -112.7303f, 78.48758f, -0.71558490f }, { 0.f, 0.f, -0.35020730f, 0.936672200f }, RESPAWN_ONE_DAY }, // snowfall (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { -202.6516f, -112.8073f, 78.48706f, -1.09955600f }, { 0.f, 0.f, -0.52249810f, 0.852640500f }, RESPAWN_ONE_DAY }, // snowfall (Horde contested) + { BG_AV_OBJECTID_AURA_N_S, { -611.5228f, -396.8190f, 60.85839f, -0.03490625f }, { 0.f, 0.f, -0.01745224f, 0.999847700f }, RESPAWN_ONE_DAY }, // iceblood grave (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { -612.6615f, -396.6992f, 60.85839f, 6.24827900f }, { 0.f, 0.f, -0.01745224f, 0.999847700f }, RESPAWN_ONE_DAY }, // iceblood grave (Horde contested) + { BG_AV_OBJECTID_AURA_N_S, { -1082.448f, -346.8234f, 54.92188f, -1.53589000f }, { 0.f, 0.f, -0.69465830f, 0.719339800f }, RESPAWN_ONE_DAY }, // frostwolf grave (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { -1082.536f, -346.5672f, 54.97722f, -1.55334100f }, { 0.f, 0.f, -0.70090870f, 0.713251100f }, RESPAWN_ONE_DAY }, // frostwolf grave (Horde contested) + { BG_AV_OBJECTID_AURA_N_S, { -1402.278f, -307.3798f, 89.44196f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut (Alliance contested) + { BG_AV_OBJECTID_AURA_N_S, { -1402.176f, -307.3057f, 89.44698f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut (Horde contested) + + { BG_AV_OBJECTID_AURA_N_S, { -202.3944f, -113.0329f, 78.48245f, 5.02654900f }, { 0.f, 0.f, -0.58778480f, 0.809017400f }, RESPAWN_ONE_DAY }, // snowfall (Initial) + + { BG_AV_OBJECTID_AURA_A_S, { 638.5921f, -32.42204f, 46.06084f, -1.62315600f }, { 0.f, 0.f, -0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, // aid station + { BG_AV_OBJECTID_AURA_A_S, { 669.0073f, -294.0783f, 30.29091f, 2.77506900f }, { 0.f, 0.f, 0.98325440f, 0.182238000f }, RESPAWN_ONE_DAY }, // stormpike + { BG_AV_OBJECTID_AURA_A_S, { 77.50445f, -404.5873f, 46.78254f, 2.28637900f }, { 0.f, 0.f, 0.90996070f, 0.414694400f }, RESPAWN_ONE_DAY }, // stonehearth grave + { BG_AV_OBJECTID_AURA_A_S, { -202.2778f, -113.2084f, 78.47941f, 5.02654900f }, { 0.f, 0.f, -0.58778480f, 0.809017400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_AURA_A_S, { -612.9139f, -396.8383f, 60.85839f, 3.10665200f }, { 0.f, 0.f, 0.99984740f, 0.017469280f }, RESPAWN_ONE_DAY }, // iceblood grave + { BG_AV_OBJECTID_AURA_A_S, { -1082.428f, -346.7917f, 54.92648f, -1.51843600f }, { 0.f, 0.f, -0.68835450f, 0.725374500f }, RESPAWN_ONE_DAY }, // frostwolf grave + { BG_AV_OBJECTID_AURA_A_S, { -1402.210f, -307.4312f, 89.44242f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut + + { BG_AV_OBJECTID_AURA_H_S, { 638.6057f, -32.15061f, 46.09934f, 4.67748400f }, { 0.f, 0.f, -0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, // aid station + { BG_AV_OBJECTID_AURA_H_S, { 669.3167f, -294.0553f, 30.28967f, 5.91666800f }, { 0.f, 0.f, -0.18223480f, 0.983255000f }, RESPAWN_ONE_DAY }, // stormpike + { BG_AV_OBJECTID_AURA_H_S, { 77.79785f, -404.6955f, 46.91283f, 5.42797500f }, { 0.f, 0.f, -0.41469290f, 0.909961500f }, RESPAWN_ONE_DAY }, // stonehearth grave + { BG_AV_OBJECTID_AURA_H_S, { -202.6227f, -112.5515f, 78.49015f, -1.25663600f }, { 0.f, 0.f, -0.58778480f, 0.809017400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_AURA_H_S, { -612.6716f, -396.6933f, 60.85839f, 3.08918300f }, { 0.f, 0.f, 0.99965670f, 0.026201650f }, RESPAWN_ONE_DAY }, // iceblood grave + { BG_AV_OBJECTID_AURA_H_S, { -1082.529f, -346.5670f, 54.97712f, 4.72984400f }, { 0.f, 0.f, -0.70090870f, 0.713251100f }, RESPAWN_ONE_DAY }, // frostwolf grave + { BG_AV_OBJECTID_AURA_H_S, { -1402.192f, -307.4671f, 89.44189f, 0.19198520f }, { 0.f, 0.f, 0.09584522f, 0.995396300f }, RESPAWN_ONE_DAY }, // frostwolf hut + + { BG_AV_OBJECTID_TOWER_BANNER_A, { 557.2267f, -86.85205f, 62.17670f, -0.24434560f }, { 0.f, 0.f, -0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, // dun baldar south + { BG_AV_OBJECTID_TOWER_BANNER_A_B, { 679.3392f, -136.4678f, 73.96262f, -2.16420600f }, { 0.f, 0.f, -0.88294700f, 0.469472700f }, RESPAWN_ONE_DAY }, // dun baldar north + { BG_AV_OBJECTID_TOWER_BANNER_A_C, { 208.9728f, -365.9713f, 66.74092f, -0.24434560f }, { 0.f, 0.f, -0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, // icewing bunker + { BG_AV_OBJECTID_TOWER_BANNER_A_D, { -156.4697f, -449.9531f, 50.66824f, -0.24434560f }, { 0.f, 0.f, -0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, // stonehearth bunker + + { BG_AV_OBJECTID_TOWER_BANNER_H_D, { -572.3289f, -262.4763f, 88.64957f, -0.57595730f }, { 0.f, 0.f, -0.28401470f, 0.958819900f }, RESPAWN_ONE_DAY }, // iceblood tower + { BG_AV_OBJECTID_TOWER_BANNER_H_C, { -768.1990f, -363.1053f, 104.5372f, 0.10471930f }, { 0.f, 0.f, 0.05233574f, 0.998629600f }, RESPAWN_ONE_DAY }, // tower point + { BG_AV_OBJECTID_TOWER_BANNER_H_B, { -1302.735f, -316.6303f, 127.5032f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, // frostwolf etower + { BG_AV_OBJECTID_TOWER_BANNER_H, { -1297.786f, -266.7428f, 127.7904f, 0.06981169f }, { 0.f, 0.f, 0.03489876f, 0.999390800f }, RESPAWN_ONE_DAY }, // frostwolf wtower + + { BG_AV_OBJECTID_TOWER_BANNER_PH, { 555.8476f, -84.41515f, 64.43967f, 3.12412300f }, { 0.f, 0.f, 0.99996190f, 0.008734641f }, RESPAWN_ONE_DAY }, // dun baldar south + { BG_AV_OBJECTID_TOWER_BANNER_PH_B, { 677.5917f, -139.0343f, 76.21964f, -1.98967200f }, { 0.f, 0.f, -0.83866980f, 0.544640200f }, RESPAWN_ONE_DAY }, // dun baldar north + { BG_AV_OBJECTID_TOWER_BANNER_PH_C, { 202.5412f, -361.8576f, 67.73707f, 0.61086350f }, { 0.f, 0.f, 0.30070500f, 0.953717200f }, RESPAWN_ONE_DAY }, // icewing bunker + { BG_AV_OBJECTID_TOWER_BANNER_PH_D, { -155.8325f, -449.4009f, 52.73059f, 0.61086350f }, { 0.f, 0.f, 0.30070500f, 0.953717200f }, RESPAWN_ONE_DAY }, // stonehearth bunker + + { BG_AV_OBJECTID_TOWER_BANNER_PA_D, { -572.2054f, -262.4762f, 88.66471f, -0.59341200f }, { 0.f, 0.f, -0.29237170f, 0.956304700f }, RESPAWN_ONE_DAY }, // iceblood tower + { BG_AV_OBJECTID_TOWER_BANNER_PA_C, { -768.1541f, -363.1023f, 104.5346f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, // tower point + { BG_AV_OBJECTID_TOWER_BANNER_PA, { -1297.869f, -266.7623f, 127.7958f, 0.06981169f }, { 0.f, 0.f, 0.03489876f, 0.999390800f }, RESPAWN_ONE_DAY }, // frostwolf wtower + { BG_AV_OBJECTID_TOWER_BANNER_PA_B, { -1302.835f, -316.5819f, 127.5164f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, // frostwolf etower + + { BG_AV_OBJECTID_AURA_A, { 557.2267f, -86.85205f, 62.17670f, -0.24434560f }, { 0.f, 0.f, -0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, // dun baldar south + { BG_AV_OBJECTID_AURA_A, { 679.3392f, -136.4678f, 73.96262f, -2.16420600f }, { 0.f, 0.f, -0.88294700f, 0.469472700f }, RESPAWN_ONE_DAY }, // dun baldar north + { BG_AV_OBJECTID_AURA_A, { 208.9728f, -365.9713f, 66.74092f, -0.24434560f }, { 0.f, 0.f, -0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, // icewing bunker + { BG_AV_OBJECTID_AURA_A, { -156.4697f, -449.9531f, 50.66824f, -0.24434560f }, { 0.f, 0.f, -0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, // stonehearth bunker + + { BG_AV_OBJECTID_AURA_H, { -572.3289f, -262.4763f, 88.64957f, -0.57595730f }, { 0.f, 0.f, -0.28401470f, 0.958819900f }, RESPAWN_ONE_DAY }, // iceblood tower + { BG_AV_OBJECTID_AURA_H, { -768.1990f, -363.1053f, 104.5372f, 0.10471930f }, { 0.f, 0.f, 0.05233574f, 0.998629600f }, RESPAWN_ONE_DAY }, // tower point + { BG_AV_OBJECTID_AURA_H, { -1302.735f, -316.6303f, 127.5032f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, // frostwolf etower + { BG_AV_OBJECTID_AURA_H, { -1297.786f, -266.7428f, 127.7904f, 0.06981169f }, { 0.f, 0.f, 0.03489876f, 0.999390800f }, RESPAWN_ONE_DAY }, // frostwolf wtower + + { BG_AV_OBJECTID_AURA_N, { 555.8476f, -84.41515f, 64.43967f, 3.12412300f }, { 0.f, 0.f, 0.99996190f, 0.008734641f }, RESPAWN_ONE_DAY }, // dun baldar south + { BG_AV_OBJECTID_AURA_N, { 677.5917f, -139.0343f, 76.21964f, -1.98967200f }, { 0.f, 0.f, -0.83866980f, 0.544640200f }, RESPAWN_ONE_DAY }, // dun baldar north + { BG_AV_OBJECTID_AURA_N, { 202.5412f, -361.8576f, 67.73707f, 0.61086350f }, { 0.f, 0.f, 0.30070500f, 0.953717200f }, RESPAWN_ONE_DAY }, // icewing bunker + { BG_AV_OBJECTID_AURA_N, { -155.8325f, -449.4009f, 52.73059f, 0.61086350f }, { 0.f, 0.f, 0.30070500f, 0.953717200f }, RESPAWN_ONE_DAY }, // stonehearth bunker + + { BG_AV_OBJECTID_AURA_N, { -572.2054f, -262.4762f, 88.66471f, -0.59341200f }, { 0.f, 0.f, -0.29237170f, 0.956304700f }, RESPAWN_ONE_DAY }, // iceblood tower + { BG_AV_OBJECTID_AURA_N, { -768.1541f, -363.1023f, 104.5346f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, // tower point + { BG_AV_OBJECTID_AURA_N, { -1302.835f, -316.5819f, 127.5164f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, // frostwolf etower + { BG_AV_OBJECTID_AURA_N, { -1297.869f, -266.7623f, 127.7958f, 0.06981169f }, { 0.f, 0.f, 0.03489876f, 0.999390800f }, RESPAWN_ONE_DAY }, // frostwolf wtower + + //duns + { BG_AV_OBJECTID_FIRE, { 562.6321f, -88.18148f, 61.99303f, 0.38397100f }, { 0.f, 0.f, 0.19080830f, 0.981627300f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 562.5229f, -74.50277f, 37.94744f, 6.23082600f }, { 0.f, 0.f, -0.02617645f, 0.999657300f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 558.0970f, -70.98416f, 52.48756f, 0.82030330f }, { 0.f, 0.f, 0.39874840f, 0.917060400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 578.1671f, -71.81907f, 38.15139f, 2.72271300f }, { 0.f, 0.f, 0.97814750f, 0.207912100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 556.0278f, -94.92421f, 44.81911f, 3.05432700f }, { 0.f, 0.f, 0.99904820f, 0.043619260f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 572.4509f, -94.36546f, 37.94425f, 4.55531100f }, { 0.f, 0.f, -0.76040550f, 0.649448500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 549.2629f, -79.36453f, 44.81911f, 0.43633160f }, { 0.f, 0.f, 0.21643920f, 0.976296100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 543.5127f, -94.40055f, 52.48191f, 0.03490625f }, { 0.f, 0.f, 0.01745224f, 0.999847700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 572.1493f, -93.78619f, 52.57261f, 0.54105060f }, { 0.f, 0.f, 0.26723770f, 0.963630700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 582.1619f, -81.23753f, 37.92165f, 0.08726600f }, { 0.f, 0.f, 0.04361916f, 0.999048200f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 584.4066f, -40.02517f, 38.67543f, 3.21141900f }, { 0.f, 0.f, -0.99939060f, 0.034906130f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 601.4236f, -8.087348f, 41.99544f, 5.95157500f }, { 0.f, 0.f, -0.16504670f, 0.986285700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 619.4541f, -31.87424f, 45.79620f, 0.75049080f }, { 0.f, 0.f, 0.36650090f, 0.930417700f }, RESPAWN_ONE_DAY }, + //dunn + { BG_AV_OBJECTID_FIRE, { 618.9584f, -91.44927f, 46.20158f, -0.55850390f }, { 0.f, 0.f, -0.27563670f, 0.961261900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 629.0031f, -137.6802f, 39.66906f, 2.12930100f }, { 0.f, 0.f, 0.87461950f, 0.484810100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 637.6774f, -22.12961f, 45.83825f, 5.41052200f }, { 0.f, 0.f, -0.42261790f, 0.906307900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 649.8859f, -60.90945f, 41.65714f, 5.82940100f }, { 0.f, 0.f, -0.22495080f, 0.974370100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 664.7972f, -143.6502f, 64.17843f, 5.82940100f }, { 0.f, 0.f, -0.22495080f, 0.974370100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 664.5048f, -139.4516f, 49.66956f, 6.24827900f }, { 0.f, 0.f, -0.01745224f, 0.999847700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 676.0670f, -124.3193f, 49.67263f, 5.27089600f }, { 0.f, 0.f, -0.48480890f, 0.874620100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 693.0043f, -144.0251f, 64.17549f, 2.44346000f }, { 0.f, 0.f, 0.93969250f, 0.342020500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 661.1747f, -117.6908f, 49.64495f, 1.91986200f }, { 0.f, 0.f, 0.81915190f, 0.573576700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 684.4229f, -146.5821f, 63.66625f, 0.99483720f }, { 0.f, 0.f, 0.47715850f, 0.878817300f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 682.7908f, -127.7686f, 62.41549f, 1.09955600f }, { 0.f, 0.f, 0.52249810f, 0.852640500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 674.5763f, -147.1012f, 56.54253f, 4.67748400f }, { 0.f, 0.f, -0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 655.7191f, -126.6733f, 49.81384f, 2.80997500f }, { 0.f, 0.f, 0.98628520f, 0.165049900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 680.2628f, -118.5916f, 64.33633f, 2.54817900f }, { 0.f, 0.f, 0.95630460f, 0.292372300f }, RESPAWN_ONE_DAY }, + //icew + { BG_AV_OBJECTID_FIRE, { 231.5031f, -356.6881f, 42.37038f, 0.29670520f }, { 0.f, 0.f, 0.14780900f, 0.989015900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 224.9886f, -348.1752f, 42.56070f, 1.50098300f }, { 0.f, 0.f, 0.68199830f, 0.731353800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 205.7818f, -351.3352f, 56.89980f, 1.01228900f }, { 0.f, 0.f, 0.48480890f, 0.874620100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 196.6049f, -369.1871f, 56.39142f, 2.46091300f }, { 0.f, 0.f, 0.94264130f, 0.333807600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 210.6188f, -376.9375f, 49.26771f, 2.86233500f }, { 0.f, 0.f, 0.99026780f, 0.139175400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 209.6469f, -352.6320f, 42.39587f, -0.69813150f }, { 0.f, 0.f, -0.34202000f, 0.939692700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 220.6500f, -368.1324f, 42.39781f, -0.26179820f }, { 0.f, 0.f, -0.13052560f, 0.991444900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 224.6821f, -374.0315f, 57.06791f, 0.54105060f }, { 0.f, 0.f, 0.26723770f, 0.963630700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 200.2596f, -359.9676f, 49.26771f, 3.38594000f }, { 0.f, 0.f, -0.99254610f, 0.121870000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { 196.6188f, -378.0163f, 56.91305f, 1.01228900f }, { 0.f, 0.f, 0.48480890f, 0.874620100f }, RESPAWN_ONE_DAY }, + //stone + { BG_AV_OBJECTID_FIRE, { -155.4875f, -437.3559f, 33.27962f, 2.60053500f }, { 0.f, 0.f, 0.96362970f, 0.267241000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -163.4411f, -454.1876f, 33.27962f, 1.93731200f }, { 0.f, 0.f, 0.82412530f, 0.566407600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -143.9772f, -445.1482f, 26.40972f, -1.86750200f }, { 0.f, 0.f, -0.80385680f, 0.594822800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -135.7640f, -464.7083f, 26.38227f, 2.25147300f }, { 0.f, 0.f, 0.90258500f, 0.430511700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -154.0755f, -466.9290f, 41.06355f, -1.86750200f }, { 0.f, 0.f, -0.80385680f, 0.594822800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -149.9082f, -460.3317f, 26.40835f, -2.09439300f }, { 0.f, 0.f, -0.86602500f, 0.500000800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -151.6378f, -439.5213f, 40.37969f, 0.43633160f }, { 0.f, 0.f, 0.21643920f, 0.976296100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -131.3010f, -454.9045f, 26.57706f, 2.93213900f }, { 0.f, 0.f, 0.99452110f, 0.104535500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -171.2910f, -444.6835f, 40.92113f, 2.30383100f }, { 0.f, 0.f, 0.91354470f, 0.406738400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -143.5915f, -439.7497f, 40.92749f, -1.72787500f }, { 0.f, 0.f, -0.76040550f, 0.649448500f }, RESPAWN_ONE_DAY }, + //iceblood + { BG_AV_OBJECTID_FIRE, { -572.6668f, -267.9235f, 56.85421f, 2.35619500f }, { 0.f, 0.f, 0.92387960f, 0.382683200f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -561.0214f, -262.6891f, 68.45891f, 1.37880900f }, { 0.f, 0.f, 0.63607790f, 0.771624900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -572.5383f, -262.6493f, 88.61970f, 1.83259500f }, { 0.f, 0.f, 0.79335310f, 0.608761700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -574.7702f, -251.4500f, 74.94216f, -1.18682300f }, { 0.f, 0.f, -0.55919270f, 0.829037700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -578.6250f, -267.5710f, 68.46957f, 0.50614460f }, { 0.f, 0.f, 0.25037960f, 0.968147800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -571.4759f, -257.2344f, 63.32225f, 3.10665200f }, { 0.f, 0.f, 0.99984740f, 0.017469280f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -566.0350f, -273.9073f, 52.95818f, -0.89011660f }, { 0.f, 0.f, -0.43051050f, 0.902585600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -580.9479f, -259.7702f, 68.46957f, 1.46607600f }, { 0.f, 0.f, 0.66913030f, 0.743145000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -568.3178f, -267.0998f, 75.00077f, 1.01228900f }, { 0.f, 0.f, 0.48480890f, 0.874620100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -559.6212f, -268.5967f, 52.89864f, 0.05235888f }, { 0.f, 0.f, 0.02617645f, 0.999657300f }, RESPAWN_ONE_DAY }, + //towerp + { BG_AV_OBJECTID_FIRE, { -776.0723f, -368.0464f, 84.35575f, 2.63544400f }, { 0.f, 0.f, 0.96814730f, 0.250381400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -777.5636f, -368.5211f, 90.67014f, 1.72787500f }, { 0.f, 0.f, 0.76040550f, 0.649448500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -765.4605f, -357.7114f, 90.88798f, 0.31415840f }, { 0.f, 0.f, 0.15643410f, 0.987688400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -768.7630f, -362.7349f, 104.6117f, 1.81514200f }, { 0.f, 0.f, 0.78801060f, 0.615661700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -760.3559f, -358.8957f, 84.35575f, 2.12930100f }, { 0.f, 0.f, 0.87461950f, 0.484810100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -771.9675f, -352.8380f, 84.34844f, 1.74532700f }, { 0.f, 0.f, 0.76604370f, 0.642788600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -773.3331f, -364.6527f, 79.23515f, -1.64061000f }, { 0.f, 0.f, -0.73135380f, 0.681998300f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -764.1089f, -366.0693f, 70.09341f, 0.38397100f }, { 0.f, 0.f, 0.19080830f, 0.981627300f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -767.1028f, -350.7370f, 68.79333f, 2.80997500f }, { 0.f, 0.f, 0.98628520f, 0.165049900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -760.1155f, -353.8446f, 68.86332f, 1.79768900f }, { 0.f, 0.f, 0.78260800f, 0.622514800f }, RESPAWN_ONE_DAY }, + //roste + { BG_AV_OBJECTID_FIRE, { -1304.866f, -304.5249f, 91.83665f, -0.68067870f }, { 0.f, 0.f, -0.33380700f, 0.942641400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1301.774f, -310.9737f, 95.82520f, 0.90757020f }, { 0.f, 0.f, 0.43837070f, 0.898794200f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1305.578f, -320.6247f, 102.1660f, -0.55850390f }, { 0.f, 0.f, -0.27563670f, 0.961261900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1294.266f, -323.4676f, 113.8926f, -1.67551400f }, { 0.f, 0.f, -0.74314400f, 0.669131500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1302.655f, -317.1923f, 127.4872f, 2.30383100f }, { 0.f, 0.f, 0.91354470f, 0.406738400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1293.895f, -313.4777f, 107.3280f, 1.60570200f }, { 0.f, 0.f, 0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1312.407f, -312.9988f, 107.3280f, 1.57079600f }, { 0.f, 0.f, 0.70710660f, 0.707106900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1311.567f, -308.0797f, 91.76656f, -1.85004900f }, { 0.f, 0.f, -0.79863550f, 0.601815000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1314.703f, -322.1310f, 107.3602f, 0.64577170f }, { 0.f, 0.f, 0.31730460f, 0.948323700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1304.598f, -310.7538f, 113.8587f, -0.40142490f }, { 0.f, 0.f, -0.19936750f, 0.979924800f }, RESPAWN_ONE_DAY }, + //rostw + { BG_AV_OBJECTID_FIRE, { -1308.240f, -273.2603f, 92.05140f, -0.13962450f }, { 0.f, 0.f, -0.06975555f, 0.997564100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1302.255f, -262.8577f, 95.92690f, 0.41887860f }, { 0.f, 0.f, 0.20791150f, 0.978147600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1297.277f, -267.7726f, 126.7559f, 2.23401800f }, { 0.f, 0.f, 0.89879320f, 0.438372800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1299.078f, -256.8899f, 114.1078f, -2.44346000f }, { 0.f, 0.f, -0.93969250f, 0.342020500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1303.405f, -268.2369f, 114.1512f, -1.23918300f }, { 0.f, 0.f, -0.58070280f, 0.814115600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1304.434f, -273.6819f, 107.6121f, 0.24434560f }, { 0.f, 0.f, 0.12186910f, 0.992546200f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1309.534f, -265.9505f, 92.14181f, -2.49581800f }, { 0.f, 0.f, -0.94832320f, 0.317305900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1295.553f, -263.8651f, 105.0332f, 0.92502390f }, { 0.f, 0.f, 0.44619750f, 0.894934500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1294.712f, -281.4657f, 107.6638f, -1.50098300f }, { 0.f, 0.f, -0.68199830f, 0.731353800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -1289.693f, -259.5211f, 107.6121f, -2.19911500f }, { 0.f, 0.f, -0.89100650f, 0.453990600f }, RESPAWN_ONE_DAY }, + //the two buildings of the captains + //alliance + { BG_AV_OBJECTID_SMOKE, { -64.49870f, -289.3301f, 33.46157f, -2.82743000f }, { 0.f, 0.f, -0.98768810f, 0.156436200f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -5.980252f, -326.1439f, 38.85382f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -2.678928f, -306.9978f, 33.41654f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -60.25000f, -309.2321f, 50.24081f, -1.46607600f }, { 0.f, 0.f, -0.66913030f, 0.743145000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -48.79406f, -266.5331f, 47.79163f, 2.44346000f }, { 0.f, 0.f, 0.93969250f, 0.342020500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -3.409288f, -306.2875f, 33.33995f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -48.61903f, -266.9165f, 47.81679f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -62.94738f, -286.2120f, 66.72883f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -5.051324f, -325.3230f, 38.85361f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -64.26768f, -289.4115f, 33.46896f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + //horde + { BG_AV_OBJECTID_SMOKE, { -524.2758f, -199.6001f, 82.87331f, -1.46607600f }, { 0.f, 0.f, -0.66913030f, 0.743145000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -518.1959f, -173.0849f, 102.4304f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -500.7317f, -145.3579f, 88.53374f, 2.44346000f }, { 0.f, 0.f, 0.93969250f, 0.342020500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -501.0836f, -150.7837f, 80.85061f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_SMOKE, { -518.3091f, -163.9635f, 102.5210f, 2.96704100f }, { 0.f, 0.f, 0.99619390f, 0.087165040f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -517.0532f, -200.4287f, 80.75904f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -514.3606f, -163.8640f, 104.1627f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -568.0396f, -188.7069f, 81.54996f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -501.7748f, -151.5809f, 81.20268f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_FIRE, { -509.9745f, -191.6520f, 83.29779f, 0.00000000f }, { 0.f, 0.f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + + { BG_AV_OBJECTID_SNOWFALL_CANDY_A, { -201.2841f, -134.5703f, 78.84847f, 5.46288200f }, { 0.f, 0.f, -0.39874840f, 0.917060400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_A, { -216.2120f, -90.70644f, 79.80706f, 1.16936900f }, { 0.f, 0.f, 0.55193610f, 0.833886400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_A, { -200.4646f, -96.41797f, 79.75871f, 1.36135600f }, { 0.f, 0.f, 0.62932010f, 0.777146200f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_A, { -191.0167f, -129.9633f, 78.86423f, 5.23598800f }, { 0.f, 0.f, -0.50000000f, 0.866025400f }, RESPAWN_ONE_DAY }, // snowfall + + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -200.7387f, -96.67969f, 79.78001f, -2.00712800f }, { 0.f, 0.f, -0.84339140f, 0.537299600f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -201.2817f, -134.3188f, 78.67534f, -0.94247660f }, { 0.f, 0.f, -0.45399000f, 0.891006800f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -191.1531f, -129.8684f, 78.55949f, -1.25663600f }, { 0.f, 0.f, -0.58778480f, 0.809017400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -215.9809f, -91.41010f, 80.87022f, -1.74532700f }, { 0.f, 0.f, -0.76604370f, 0.642788600f }, RESPAWN_ONE_DAY }, // snowfall + + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -200.6661f, -96.65804f, 79.77298f, 1.34390100f }, { 0.f, 0.f, 0.62251380f, 0.782608800f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -215.9373f, -91.30605f, 80.23534f, 1.16936900f }, { 0.f, 0.f, 0.55193610f, 0.833886400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -201.4963f, -134.6260f, 78.95821f, 5.48033400f }, { 0.f, 0.f, -0.39073090f, 0.920505000f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PA, { -191.1726f, -130.1024f, 78.74232f, 5.23598800f }, { 0.f, 0.f, -0.50000000f, 0.866025400f }, RESPAWN_ONE_DAY }, // snowfall + + { BG_AV_OBJECTID_SNOWFALL_CANDY_H, { -215.7410f, -90.99729f, 80.08942f, 1.16936900f }, { 0.f, 0.f, 0.55193610f, 0.833886400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_H, { -200.4294f, -96.50825f, 79.75236f, 1.34390100f }, { 0.f, 0.f, 0.62251380f, 0.782608800f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_H, { -190.9410f, -129.8694f, 78.93259f, -1.06465000f }, { 0.f, 0.f, -0.50753780f, 0.861629400f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_H, { -201.4437f, -134.4444f, 78.93211f, -0.85521050f }, { 0.f, 0.f, -0.41469290f, 0.909961500f }, RESPAWN_ONE_DAY }, // snowfall + + { BG_AV_OBJECTID_SNOWFALL_CANDY_PH, { -201.1786f, -134.2669f, 78.67773f, -0.99483720f }, { 0.f, 0.f, -0.47715850f, 0.878817300f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PH, { -191.1758f, -129.9295f, 78.67520f, -1.20427700f }, { 0.f, 0.f, -0.56640630f, 0.824126200f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PH, { -200.6963f, -96.61768f, 79.70095f, -2.09439300f }, { 0.f, 0.f, -0.86602500f, 0.500000800f }, RESPAWN_ONE_DAY }, // snowfall + { BG_AV_OBJECTID_SNOWFALL_CANDY_PH, { -216.1583f, -91.62186f, 80.86039f, -1.72787500f }, { 0.f, 0.f, -0.76040550f, 0.649448500f }, RESPAWN_ONE_DAY }, // snowfall + + { BG_AV_OBJECTID_MINE_N, { 817.5092f, -457.3312f, 48.46665f, 2.07693900f }, { 0.f, 0.f, 0.86162850f, 0.507539400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 837.1170f, -452.5559f, 47.23311f, -3.12412300f }, { 0.f, 0.f, -0.99996190f, 0.008734641f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 854.4492f, -442.2549f, 50.65888f, 0.40142490f }, { 0.f, 0.f, 0.19936750f, 0.979924800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 857.2037f, -371.4503f, 47.59510f, 1.27408800f }, { 0.f, 0.f, 0.59482190f, 0.803857400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 869.7550f, -448.8668f, 52.54475f, -0.85521050f }, { 0.f, 0.f, -0.41469290f, 0.909961500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 886.6847f, -442.3580f, 54.69622f, -1.22172900f }, { 0.f, 0.f, -0.57357600f, 0.819152400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 900.3499f, -479.0240f, 58.35533f, 0.12217300f }, { 0.f, 0.f, 0.06104851f, 0.998134800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 946.5957f, -390.4882f, 63.11241f, 3.97935500f }, { 0.f, 0.f, -0.91354470f, 0.406738400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 949.8772f, -458.1977f, 56.48738f, 0.31415840f }, { 0.f, 0.f, 0.15643410f, 0.987688400f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_N, { 964.2702f, -441.8705f, 56.02847f, 1.79768900f }, { 0.f, 0.f, 0.78260800f, 0.622514800f }, RESPAWN_ONE_DAY }, + + { BG_AV_OBJECTID_MINE_S, { -975.8557f, -82.54964f, 80.48984f, 5.55014700f }, { 0.f, 0.f, -0.35836790f, 0.933580500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -975.8557f, -82.54964f, 80.48984f, -0.73303820f }, { 0.f, 0.f, -0.35836790f, 0.933580500f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -951.3943f, -193.6948f, 67.63397f, 0.80285090f }, { 0.f, 0.f, 0.39073090f, 0.920505000f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -947.6424f, -208.8073f, 77.01006f, 1.36135600f }, { 0.f, 0.f, 0.62932010f, 0.777146200f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -934.2118f, -57.35167f, 80.27698f, -0.01745246f }, { 0.f, 0.f, -0.00872612f, 0.999961900f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -925.8670f, -127.2934f, 61.32328f, 5.49778900f }, { 0.f, 0.f, -0.38268280f, 0.923879800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -902.7300f, -103.8680f, 75.43777f, 4.69493700f }, { 0.f, 0.f, -0.71325020f, 0.700909600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -862.8824f, -0.353299f, 72.15256f, 3.76991200f }, { 0.f, 0.f, -0.95105650f, 0.309017100f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -854.9325f, -85.91835f, 68.60560f, 4.24115000f }, { 0.f, 0.f, -0.85264020f, 0.522498600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -854.9325f, -85.91835f, 68.60560f, -2.04203500f }, { 0.f, 0.f, -0.85264020f, 0.522498600f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -851.8329f, -118.9587f, 63.86718f, 6.21337400f }, { 0.f, 0.f, -0.03489876f, 0.999390800f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -849.8320f, -20.84207f, 70.46720f, 4.46804300f }, { 0.f, 0.f, -0.78801060f, 0.615661700f }, RESPAWN_ONE_DAY }, + { BG_AV_OBJECTID_MINE_S, { -831.7468f, -154.6468f, 62.59975f, 1.44862200f }, { 0.f, 0.f, 0.66261960f, 0.748956100f }, RESPAWN_ONE_DAY } +}; + +// used for iterating, because not all nodes have 10 GO each +uint32 const BG_AV_FlameIndices[BG_AV_DESTRUCTIBLE_MAX + 1] = +{ + BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH, + BG_AV_OBJECT_BURN_DUNBALDAR_NORTH, + BG_AV_OBJECT_BURN_ICEWING_BUNKER, + BG_AV_OBJECT_BURN_STONEHEART_BUNKER, + BG_AV_OBJECT_BURN_ICEBLOOD_TOWER, + BG_AV_OBJECT_BURN_TOWER_POINT, + BG_AV_OBJECT_BURN_FROSTWOLF_ETOWER, + BG_AV_OBJECT_BURN_FROSTWOLF_WTOWER, + BG_AV_OBJECT_BURN_BUILDING_ALLIANCE, + BG_AV_OBJECT_BURN_BUILDING_HORDE, + + BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + BG_AV_FIRE_SMOKE_COUNT +}; + +Position const BG_AV_CreaturePos[AV_CPLACE_MAX] = +{ + //spiritguides + {643.000000f, 44.000000f, 69.740196f, -0.001854f}, + {676.000000f, -374.000000f, 30.000000f, -0.001854f}, + {73.417755f, -496.433105f, 48.731918f, -0.001854f}, + {-157.409195f, 31.206272f, 77.050598f, -0.001854f}, + {-531.217834f, -405.231384f, 49.551376f, -0.001854f}, + {-1090.476807f, -253.308670f, 57.672371f, -0.001854f}, + {-1496.065063f, -333.338409f, 101.134804f, -0.001854f}, + {873.001770f, -491.283630f, 96.541931f, -0.001854f}, + {-1437.670044f, -610.088989f, 51.161900f, -0.001854f}, + //grave + //aid + {635.17f, -29.5594f, 46.5056f, 4.81711f}, + {642.488f, -32.9437f, 46.365f, 4.67748f}, + {642.326f, -27.9442f, 46.9211f, 4.59022f}, + {635.945f, -33.6171f, 45.7164f, 4.97419f}, + //stormpike + {669.272f, -297.304f, 30.291f, 4.66604f}, + {674.08f, -292.328f, 30.4817f, 0.0918785f}, + {667.01f, -288.532f, 29.8809f, 1.81583f}, + {664.153f, -294.042f, 30.2851f, 3.28531f}, + //stone + {81.7027f, -406.135f, 47.7843f, 0.598464f}, + {78.1431f, -409.215f, 48.0401f, 5.05953f}, + {73.4135f, -407.035f, 46.7527f, 3.34736f}, + {78.2258f, -401.859f, 46.4202f, 2.05852f}, + //snowfall + {-207.412f, -110.616f, 78.7959f, 2.43251f}, + {-197.95f, -112.205f, 78.5686f, 6.22441f}, + {-202.709f, -116.829f, 78.4358f, 5.13742f}, + {-202.059f, -108.314f, 78.5783f, 5.91968f}, + //ice + {-615.501f, -393.802f, 60.4299f, 3.06147f}, + {-608.513f, -392.717f, 62.5724f, 2.06323f}, + {-609.769f, -400.072f, 60.7174f, 5.22367f}, + {-616.093f, -398.293f, 60.5628f, 3.73613f}, + //frost + {-1077.7f, -340.21f, 55.4682f, 6.25569f}, + {-1082.74f, -333.821f, 54.7962f, 2.05459f}, + {-1090.66f, -341.267f, 54.6768f, 3.27746f}, + {-1081.58f, -344.63f, 55.256f, 4.75636f}, + //frost hut + {-1408.95f, -311.69f, 89.2536f, 4.49954f}, + {-1407.15f, -305.323f, 89.1993f, 2.86827f}, + {-1400.64f, -304.3f, 89.7008f, 1.0595f}, + {-1400.4f, -311.35f, 89.3028f, 4.99434f}, + //towers + //dun south - OK + {569.395f, -101.064f, 52.8296f, 2.34974f}, + {574.85f, -92.9842f, 52.5869f, 3.09325f}, + {575.411f, -83.597f, 52.3626f, 6.26573f}, + {571.352f, -75.6582f, 52.479f, 0.523599f}, + //dun north - OK + {668.60f, -122.53f, 64.12f, 2.34f}, /// @todo: To be confirm - Not completely okay + {662.253f, -129.105f, 64.1794f, 2.77507f}, + {661.209f, -138.877f, 64.2251f, 3.38594f}, + {665.481f, -146.857f, 64.1271f, 3.75246f}, + //icewing - OK + {225.228f, -368.909f, 56.9983f, 6.23806f}, + {191.36f, -369.899f, 57.1524f, 3.24631f}, + {215.518f, -384.019f, 56.9889f, 5.09636f}, + {199.625f, -382.177f, 56.8691f, 4.08407f}, + //stone + {-172.851f, -452.366f, 40.8725f, 3.31829f}, + {-147.147f, -435.053f, 40.8022f, 0.599238f}, + {-169.456f, -440.325f, 40.985f, 2.59101f}, + {-163.494f, -434.904f, 41.0725f, 1.84174f}, + //ice - OK + {-573.522f, -271.854f, 75.0078f, 3.9619f}, + {-565.616f, -269.051f, 74.9952f, 5.02655f}, + {-562.825f, -261.087f, 74.9898f, 5.95157f}, + {-569.176f, -254.446f, 74.8771f, 0.820305f}, + //towerpoint + {-763.04f, -371.032f, 90.7933f, 5.25979f}, + {-759.764f, -358.264f, 90.8681f, 0.289795f}, + {-768.808f, -353.056f, 90.8811f, 1.52601f}, + {-775.944f, -362.639f, 90.8949f, 2.59573f}, + //frost etower + {-1294.13f, -313.045f, 107.328f, 0.270162f}, + {-1306.5f, -308.105f, 113.767f, 1.78755f}, + {-1294.78f, -319.966f, 113.79f, 5.94545f}, + {-1294.83f, -312.241f, 113.799f, 0.295293f}, + //frost wtower + {-1300.96f, -275.111f, 114.058f, 4.12804f}, + {-1302.41f, -259.256f, 114.065f, 1.67602f}, + {-1287.97f, -262.087f, 114.165f, 6.18264f}, + {-1291.59f, -271.166f, 114.151f, 5.28257f}, + + //alliance marshall + {721.104f, -7.64155f, 50.7046f, 3.45575f}, // south + {723.058f, -14.1548f, 50.7046f, 3.40339f}, // north + {715.691f, -4.72233f, 50.2187f, 3.47321f}, // icewing + {720.046f, -19.9413f, 50.2187f, 3.36849f}, // stone +/// horde @todo: Confirm positions + {-1363.99f, -221.99f, 98.4053f, 4.93012f}, + {-1370.96f, -223.532f, 98.4266f, 4.93012f}, + {-1378.37f, -228.614f, 99.3546f, 5.38565f}, + {-1358.02f, -228.998f, 98.868f, 3.87768f}, + + //irondeep mine + //Irondeep Trogg + {971.671f, -442.657f, 57.6951f, 3.1765f}, + {969.979f, -457.148f, 58.1119f, 4.5204f}, + {958.692f, -333.477f, 63.2276f, 5.77704f}, + {957.113f, -325.92f, 61.7589f, 1.13446f}, + {948.25f, -448.268f, 56.9009f, 5.60251f}, + {934.727f, -385.802f, 63.0344f, 3.75246f}, + {931.751f, -403.458f, 59.6737f, 5.63741f}, + {931.146f, -359.666f, 66.0294f, 3.9619f}, + {929.702f, -412.401f, 56.8776f, 5.89921f}, + {926.849f, -379.074f, 63.5286f, 2.0944f}, + {921.972f, -358.597f, 66.4313f, 2.93215f}, + {921.449f, -341.981f, 67.1264f, 3.4383f}, + {921.1f, -395.812f, 60.4615f, 2.71695f}, + {919.274f, -394.986f, 60.3478f, 2.71696f}, + {916.852f, -393.891f, 60.1726f, 2.71695f}, + {914.568f, -326.21f, 66.1733f, 2.25147f}, + {913.064f, -395.773f, 60.1364f, 4.41568f}, + {909.246f, -474.576f, 58.2067f, 0.226893f}, + {909.246f, -474.576f, 58.2901f, 0.226893f}, + {907.209f, -428.267f, 59.8065f, 1.8675f}, + {905.973f, -459.528f, 58.7594f, 1.37189f}, + {905.067f, -396.074f, 60.2085f, 5.07891f}, + {901.809f, -457.709f, 59.0116f, 3.52557f}, + {900.962f, -427.44f, 59.0842f, 1.50098f}, + {897.929f, -471.742f, 59.7729f, 2.54818f}, + {893.376f, -343.171f, 68.1499f, 5.35816f}, + {890.584f, -406.049f, 61.1925f, 5.67232f}, + {888.208f, -332.564f, 68.148f, 1.93732f}, + {887.647f, -391.537f, 61.8734f, 1.37881f}, + {885.109f, -343.338f, 67.0867f, 3.78979f}, + {881.618f, -419.948f, 53.5228f, 0.593412f}, + {878.675f, -345.36f, 66.1052f, 3.45651f}, + {877.127f, -351.8f, 66.5296f, 5.74213f}, + {876.778f, -345.97f, 65.7724f, 3.45262f}, + {874.577f, -414.786f, 52.7817f, 1.67552f}, + {868.247f, -343.136f, 64.9894f, 1.6057f}, + {859.03f, -367.231f, 47.4655f, 0.0174533f}, + {857.513f, -351.817f, 65.1867f, 4.39823f}, + {852.632f, -372.416f, 48.1657f, 3.66519f}, + {849.86f, -340.944f, 66.2447f, 0.401426f}, + {847.99f, -386.287f, 60.9277f, 2.32374f}, + {847.601f, -423.072f, 50.0852f, 4.57276f}, + {847.135f, -411.307f, 50.2106f, 1.5708f}, + {835.077f, -379.418f, 48.2755f, 5.93412f}, + {834.87f, -453.304f, 47.9075f, 0.226893f}, + {834.634f, -365.981f, 62.8801f, 1.32645f}, + {834.354f, -355.526f, 48.1491f, 6.07375f}, + {833.702f, -327.506f, 65.0439f, 0.331613f}, + {833.151f, -374.228f, 63.0938f, 3.66519f}, + {831.711f, -346.785f, 47.2975f, 0.226893f}, + {827.874f, -413.624f, 48.5818f, 1.49241f}, + {827.728f, -415.483f, 48.5593f, 1.49238f}, + {827.016f, -424.543f, 48.2856f, 1.49236f}, + {823.222f, -334.283f, 65.6306f, 4.88692f}, + {821.892f, -464.723f, 48.9451f, 4.66003f}, + {821.006f, -387.635f, 49.0728f, 3.15905f}, + {817.26f, -447.432f, 49.4308f, 2.18166f}, + {805.399f, -320.146f, 52.7712f, 0.296706f}, + {801.405f, -328.055f, 53.0195f, 4.31096f}, + //irondeep skullthumber irondeep shaman + {955.812f, -440.302f, 55.3411f, 3.19395f}, + {937.378f, -377.816f, 65.3919f, 3.56047f}, + {925.059f, -331.347f, 65.7564f, 3.66519f}, + {922.918f, -396.634f, 60.3942f, 2.71695f}, + {909.99f, -462.154f, 59.0811f, 3.7001f}, + {907.893f, -388.787f, 61.7923f, 5.74213f}, + {898.801f, -437.105f, 58.5266f, 0.959931f}, + {884.237f, -407.597f, 61.566f, 0.820305f}, + {880.744f, -344.683f, 66.4086f, 3.4644f}, + {876.047f, -341.857f, 65.8743f, 4.45059f}, + {874.674f, -402.077f, 61.7573f, 0.26341f}, + {871.914f, -404.209f, 62.1269f, 6.06163f}, + {871.606f, -403.665f, 62.0795f, 0.765774f}, + {871.561f, -404.114f, 62.1297f, 0.00981727f}, + {871.528f, -404.248f, 62.1455f, 0.498032f}, + {871.493f, -404.122f, 62.1331f, 5.65727f}, + {871.282f, -403.843f, 62.1108f, 0.788382f}, + {868.294f, -392.395f, 61.4772f, 4.38685f}, + {868.256f, -392.363f, 61.4803f, 0.732738f}, + {867.804f, -392.51f, 61.5089f, 2.30167f}, + {867.612f, -392.371f, 61.524f, 2.86149f}, + {858.593f, -439.614f, 50.2184f, 0.872665f}, + {851.471f, -362.52f, 47.314f, 4.06662f}, + {846.939f, -347.279f, 66.2876f, 0.942478f}, + {842.08f, -421.775f, 48.2659f, 1.0821f}, + {838.358f, -371.212f, 63.3299f, 4.04916f}, + {827.57f, -417.483f, 48.4538f, 1.49237f}, + {827.012f, -457.397f, 48.9331f, 2.35619f}, + {825.535f, -322.373f, 63.9357f, 4.76475f}, + {867.635f, -443.605f, 51.3347f, 1.38626f}, + {957.293f, -455.039f, 56.7395f, 5.79449f}, + {950.077f, -326.672f, 61.6552f, 5.48033f}, + {936.692f, -356.78f, 65.9835f, 2.75762f}, + {926.475f, -419.345f, 56.1833f, 2.0944f}, + {924.729f, -397.453f, 60.213f, 2.71695f}, + {902.195f, -475.891f, 58.312f, 1.39626f}, + {897.464f, -338.758f, 68.1715f, 2.94961f}, + {884.237f, -407.597f, 61.566f, 0.820305f}, + {882.517f, -344.111f, 66.7887f, 3.46962f}, + {881.437f, -400.254f, 61.2028f, 0.263427f}, + {880.156f, -400.678f, 61.3113f, 3.41373f}, + {877.989f, -418.051f, 52.9753f, 4.46804f}, + {871.212f, -404.12f, 62.1433f, 3.6554f}, + {871.036f, -404.119f, 62.2237f, 4.50295f}, + {857.396f, -395.766f, 61.263f, 4.78684f}, + {857.276f, -395.395f, 61.2418f, 0.0845553f}, + {857.231f, -394.577f, 61.2174f, 1.96817f}, + {857.108f, -395.682f, 61.2317f, 4.87022f}, + {856.709f, -395.28f, 61.1814f, 2.54913f}, + {850.922f, -390.399f, 60.8771f, 2.85405f}, + {847.556f, -388.228f, 60.9438f, 2.56872f}, + {842.031f, -384.663f, 61.6028f, 2.56871f}, + {832.035f, -389.301f, 47.5567f, 2.11185f}, + {827.415f, -419.468f, 48.3322f, 1.49232f}, + {826.402f, -349.454f, 47.2722f, 1.51844f}, + {817.83f, -455.715f, 48.4207f, 0.925025f}, + {808.953f, -325.964f, 52.4043f, 3.01942f}, + // Morloch + {865.554f, -438.735f, 50.7333f, 2.12431f}, + //coldtooth mine + //miner/digger + {-917.648f, -46.8922f, 77.0872f, 5.27089f}, + {-912.689f, -45.4494f, 76.2277f, 4.60767f}, + {-905.455f, -84.5179f, 75.3642f, 3.29867f}, + {-904.332f, -111.509f, 75.5925f, 2.47837f}, + {-904.27f, -160.419f, 61.9876f, 3.61192f}, + {-904.023f, -90.4558f, 75.3706f, 3.40339f}, + {-978.678f, -37.3136f, 75.8364f, 2.84489f}, + {-973.076f, -36.5013f, 77.5047f, 1.0821f}, + {-963.951f, -87.734f, 81.5555f, 0.575959f}, + {-961.941f, -90.7252f, 81.6629f, 0.820305f}, + {-957.623f, -186.582f, 66.6021f, 1.95477f}, + {-952.476f, -179.778f, 78.6771f, 4.5204f}, + {-950.427f, -115.007f, 79.6127f, 3.68264f}, + {-950.25f, -151.95f, 79.4598f, -1.81423f}, + {-950.169f, -188.099f, 66.6184f, 5.55015f}, + {-949.944f, -142.977f, 80.5382f, 2.70526f}, + {-947.854f, -170.5f, 79.7618f, 0.942478f}, + {-946.738f, -139.567f, 80.0904f, 2.3911f}, + {-945.503f, -65.0654f, 79.7907f, 5.02655f}, + {-943.678f, -110.986f, 80.2557f, 0.959931f}, + {-942.993f, -56.9881f, 79.8915f, 5.65487f}, + {-938.197f, -155.838f, 61.3111f, 1.65806f}, + {-930.488f, -214.524f, 72.1431f, 2.1236f}, + {-929.947f, -154.449f, 61.5084f, 1.67552f}, + {-927.412f, -135.313f, 61.1987f, 3.29867f}, + {-920.677f, -156.859f, 62.8033f, 3.15306f}, + {-916.75f, -136.094f, 62.2357f, 0.0698132f}, + {-915.319f, -132.718f, 62.562f, 1.16984f}, + {-913.589f, -146.794f, 76.9366f, 1.8675f}, + {-907.572f, -148.937f, 76.6898f, 4.76475f}, + {-902.02f, -64.6174f, 73.9707f, 1.19169f}, + {-899.489f, -61.7252f, 73.2498f, 5.09636f}, + {-894.792f, -127.141f, 75.3834f, 6.14356f}, + {-892.408f, -162.525f, 64.1212f, 2.69884f}, + {-892.326f, -123.158f, 76.0318f, 5.5676f}, + {-888.468f, -148.462f, 61.8012f, 1.65806f}, + {-883.268f, -159.738f, 63.5311f, 5.20108f}, + {-877.76f, -118.07f, 65.215f, 2.94961f}, + {-876.792f, -128.646f, 64.1045f, 3.40339f}, + {-874.901f, -36.6579f, 69.4246f, 2.00713f}, + {-874.856f, -151.351f, 62.7537f, 3.57875f}, + {-872.135f, -150.08f, 62.7513f, 3.57201f}, + {-870.288f, -149.217f, 62.5413f, 3.56624f}, + {-870.03f, -6.27443f, 70.3867f, 2.3911f}, + {-869.023f, -82.2118f, 69.5848f, 3.22886f}, + {-866.354f, -40.2455f, 70.842f, 0.0698132f}, + {-865.305f, -152.302f, 63.5044f, 4.86947f}, + {-861.926f, -79.0519f, 71.4178f, 0.20944f}, + {-857.292f, -152.277f, 63.2114f, 4.18879f}, + {-853.357f, -0.696194f, 72.0655f, 0.994838f}, + {-850.685f, -14.2596f, 70.2298f, 0.20944f}, + {-839.987f, -67.7695f, 72.7916f, 4.93928f}, + {-839.199f, -57.0558f, 73.4891f, 1.67552f}, + {-836.963f, -153.224f, 63.3821f, 4.46804f}, + {-832.721f, -67.7555f, 72.9062f, 4.99164f}, + {-821.496f, -143.095f, 63.1292f, 0.541052f}, + {-818.829f, -153.004f, 62.1757f, 6.12611f}, + //special + {-954.622f, -110.958f, 80.7911f, 6.24828f}, + {-951.477f, -53.9647f, 80.0235f, 5.32325f}, + {-946.812f, -126.04f, 78.8601f, 5.15265f}, + {-940.689f, -140.707f, 79.9225f, 2.79253f}, + {-933.954f, -159.632f, 60.778f, 2.56563f}, + {-922.537f, -130.291f, 61.3756f, 4.95674f}, + {-915.862f, -151.74f, 76.9427f, 0.942478f}, + {-888.321f, -159.831f, 62.5303f, 1.20428f}, + {-874.361f, -42.4751f, 69.4316f, 0.785398f}, + {-873.19f, -50.4899f, 70.0568f, -2.41288f}, + {-868.511f, -148.386f, 62.3547f, 3.57875f}, + {-868.44f, -121.649f, 64.5056f, 3.33358f}, + {-868.324f, -77.7196f, 71.4768f, 5.41052f}, + {-859.846f, -19.6549f, 70.7304f, 1.97222f}, + {-828.05f, -150.508f, 62.2019f, 2.14675f}, + {-826.254f, -58.6911f, 72.0041f, 3.68264f}, + {-976.086f, -44.1775f, 76.029f, 1.46608f}, + {-971.864f, -87.4223f, 81.4954f, 5.8294f}, + {-966.551f, -74.1111f, 80.0243f, 4.2129f}, + {-958.509f, -173.652f, 77.9013f, 6.24828f}, + {-951.511f, -181.242f, 65.529f, 4.39823f}, + {-940.967f, -186.243f, 77.698f, 1.28164f}, + {-930.004f, -65.0898f, 79.077f, 0.0581657f}, + {-920.864f, -40.2009f, 78.256f, 5.16617f}, + {-919.089f, -148.021f, 62.0317f, 2.59327f}, + {-901.516f, -116.329f, 75.6876f, 0.471239f}, + {-897.864f, -84.4348f, 74.083f, 3.00197f}, + {-897.617f, -52.0457f, 71.9503f, 4.36332f}, + {-894.891f, -153.951f, 61.6827f, 3.23569f}, + {-893.933f, -111.625f, 75.6591f, 4.22536f}, + {-883.265f, -152.854f, 61.8384f, 0.0941087f}, + {-868.293f, -147.243f, 62.1097f, 3.2056f}, + {-867.501f, -11.8709f, 70.018f, 6.14356f}, + {-866.699f, -147.54f, 62.1646f, 3.57878f}, + {-866.566f, -91.1916f, 67.4414f, 4.56707f}, + {-857.272f, -141.142f, 61.7356f, 4.17134f}, + {-847.446f, -98.0061f, 68.5131f, 3.24631f}, + {-837.026f, -140.729f, 62.5141f, 5.51524f}, + {-824.204f, -65.053f, 72.3381f, 3.01942f}, + //vermin (s.th special for this mine) + {-951.955f, -197.5f, 77.212f, 5.63741f}, + {-944.837f, -199.608f, 77.0737f, 4.97419f}, + {-933.494f, -209.063f, 73.7803f, 5.88176f}, + {-929.666f, -201.308f, 73.7032f, 5.02655f}, + {-978.997f, -249.356f, 65.4345f, 5.05464f}, + {-974.565f, -224.828f, 69.5858f, 4.88846f}, + {-946.514f, -259.239f, 66.0874f, 3.78132f}, + {-918.402f, -250.439f, 69.5271f, 2.21352f}, + {-910.14f, -229.959f, 72.9279f, 0.27677f}, + {-851.563f, -88.6527f, 68.5983f, 3.61896f}, + //boss + {-848.902f, -92.931f, 68.6325f, 3.33350f}, + //herald + {-48.459f, -288.802f, 55.47f, 1.0f}, + //triggers + {637.083f, -32.6603f, 45.9715f, 1.14353f}, //aid_station + {669.007f, -294.078f, 30.2909f, 2.77507f}, //stormpike_grave + {77.8013f, -404.7f, 46.7549f, -0.872665f}, //stoneheart_grave + {-202.581f, -112.73f, 78.4876f, -0.715585f}, //snowfall_grave + {-611.962f, -396.17f, 60.8351f, 2.53682f}, //iceblood_grave + {-1082.45f, -346.823f, 54.9219f, -1.53589f}, //frostwolf_grave + {-1402.21f, -307.431f, 89.4424f, 0.191986f}, //frostwolf_hut + {553.779f, -78.6566f, 51.9378f, -1.22173f}, //dunbaldar_south + {674.001f, -143.125f, 63.6615f, 0.994838f}, //dunbaldar_north + {203.281f, -360.366f, 56.3869f, -0.925024f}, //icewing_bunker + {-152.437f, -441.758f, 40.3982f, -1.95477f}, //stoneheart_bunker + {-571.88f, -262.777f, 75.0087f, -0.802851f}, //iceblood_tower + {-768.907f, -363.71f, 90.8949f, 1.07991f}, //tower_point + {-1302.9f, -316.981f, 113.867f, 2.00713f}, //frostwolf_etower + {-1297.5f, -266.767f, 114.15f, 3.31044f}, //frostwolf_wtower + {-57.7891f, -286.597f, 15.6479f, 6.02139f}, //AV_NPC_A_CAPTAIN balinda + {722.43f, -10.9982f, 50.7046f, 3.42085f}, //AV_NPC_A_BOSS vanndar + {-545.23f, -165.35f, 57.7886f, 3.01145f}, //AV_NPC_H_CAPTAIN galvangar + {-1370.9f, -219.793f, 98.4258f, 5.04381f} //AV_NPC_H_BOSS drek thar +}; + +//entry, team, minlevel, maxlevel +/// @todo: this array should be removed, the only needed things are the entrys (for spawning(?) and handlekillunit) +uint32 const BG_AV_CreatureInfo[AV_NPC_INFO_MAX] = +{ + 13358, // Stormpike Bowman /// @todo: Confirm if this is correct. Author assumpted 60, 61 & 69, 70, but wouldn't work here + 12050, // Stormpike Defender + 13326, // Seasoned Defender + 13331, // Veteran Defender + 13422, // Champion Defender + 11949, // Captain Balinda Stonehearth: spawned with BG_AB_Creatures + 11948, // Vanndar Stormpike: spawned with BG_AB_Creatures + + 13359, // Frostwolf Bowman + 12053, // Frostwolf Guardian + 13328, // Seasoned Guardian + 13332, // Veteran Guardian + 13421, // Champion Guardian + 11947, // Captain Galvangar: spawned with BG_AB_Creatures + 11946, // Drek'Thar: spawned with BG_AB_Creatures + + 14763, // Dun Baldar South Marshal + 14762, // Dun Baldar North Marshal + 14764, // Icewing Marshal + 14765, // Stonehearth Marshal + + 14773, // Iceblood Warmaster + 14776, // Tower Point Warmaster + 14772, // East Frostwolf Warmaster + 14777, // West Frostwolf Warmaster + + 10987, // Irondeep Trogg + 11600, // Irondeep Shaman + 11602, // Irondeep Skullthumper + 11657, // Morloch + + 13396, // irondeep alliance /// @todo: Correct and give correct ids + 13080, + 13098, + 13078, + + 13397, // irondeep horde + 13099, + 13081, + 13079, + + 11603, // south mine neutral + 11604, + 11605, + 11677, + 10982, // vermin + + 13317, // alliance + 13096, // explorer + 13087, // invader + 13086, + + 13316, // horde + 13097, // surveypr + 13089, // guard + 13088, + + 14848 // Herald +}; + +BattlegroundSpawnPoint const BG_AV_Creatures[AV_STATICCPLACE_MAX] = +{ + { 2225, { -1235.31f, -340.777f, 60.50880f, 3.316130f }, RESPAWN_IMMEDIATELY }, // 2225 - Zora Guthrek + { 3343, { -1244.02f, -323.795f, 61.04850f, 5.218530f }, RESPAWN_IMMEDIATELY }, // 3343 - Grelkor + { 3625, { -1235.16f, -332.302f, 60.29850f, 2.967060f }, RESPAWN_IMMEDIATELY }, // 3625 - Rarck + { 4255, { 587.303f, -42.8257f, 37.56150f, 5.235990f }, RESPAWN_IMMEDIATELY }, // 4255 - Brogus Thunderbrew + { 4257, { 643.635f, -58.3987f, 41.74050f, 4.729840f }, RESPAWN_IMMEDIATELY }, // 4257 - Lana Thunderbrew + { 5134, { 591.464f, -44.4520f, 37.61660f, 5.654870f }, RESPAWN_IMMEDIATELY }, // 5134 - Jonivera Farmountain + { 5135, { 608.515f, -33.3935f, 42.00030f, 5.410520f }, RESPAWN_IMMEDIATELY }, // 5135 - Svalbrad Farmountain + { 5139, { 617.656f, -32.0701f, 42.71680f, 4.066620f }, RESPAWN_IMMEDIATELY }, // 5139 - Kurdrum Barleybeard + { 10364, { -1183.76f, -268.295f, 72.82330f, 3.281220f }, RESPAWN_IMMEDIATELY }, // 10364 - Yaelika Farclaw + { 10367, { -1187.86f, -275.310f, 73.04810f, 3.630280f }, RESPAWN_IMMEDIATELY }, // 10367 - Shrye Ragefist + { 10981, { -1008.42f, -368.006f, 55.34260f, 5.956470f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10981, { -1091.92f, -424.280f, 53.01390f, 2.939580f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10981, { -558.455f, -198.768f, 58.17550f, 4.979460f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10981, { -861.247f, -312.510f, 55.14270f, 3.353820f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10981, { -1003.81f, -395.913f, 50.47360f, 2.856310f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10981, { -904.500f, -289.815f, 65.12220f, 5.784700f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10981, { -1064.41f, -438.839f, 51.36140f, 1.888570f }, RESPAWN_IMMEDIATELY }, // 10981 - Frostwolf + { 10986, { 258.814f, 76.2017f, 18.64680f, 6.190520f }, RESPAWN_IMMEDIATELY }, // 10986 - Snowblind Harpy + { 10986, { 265.838f, -315.846f, -16.54290f, 3.159170f }, RESPAWN_IMMEDIATELY }, // 10986 - Snowblind Harpy + { 10986, { 426.485f, -51.1927f, -5.662860f, 1.603470f }, RESPAWN_IMMEDIATELY }, // 10986 - Snowblind Harpy + { 10986, { 452.044f, -33.9594f, -0.044651f, 2.728150f }, RESPAWN_IMMEDIATELY }, // 10986 - Snowblind Harpy + { 10986, { 266.032f, -315.639f, -16.54290f, 4.679620f }, RESPAWN_IMMEDIATELY }, // 10986 - Snowblind Harpy + { 10986, { 532.640f, -54.5863f, 20.70240f, 2.932150f }, RESPAWN_IMMEDIATELY }, // 10986 - Snowblind Harpy + { 10990, { 295.183f, -299.908f, -34.61230f, 0.135851f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 421.080f, -225.006f, -23.73000f, 0.166754f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { -55.7766f, -192.498f, 20.43520f, 6.122210f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 527.887f, -477.223f, 62.35590f, 0.170935f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 389.144f, -346.508f, -30.33400f, 4.141170f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 108.121f, -322.248f, 37.56550f, 4.467880f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 507.479f, -67.9403f, 10.35710f, 3.263040f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 329.071f, -185.016f, -29.15420f, 0.356943f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 252.449f, -422.313f, 35.14040f, 4.537710f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 358.882f, -118.061f, -24.91190f, 2.292570f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 487.151f, -174.229f, 14.75580f, 4.731920f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 449.652f, -123.561f, 6.142730f, 6.120290f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 272.419f, -261.802f, -41.88350f, 3.665590f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 359.021f, -210.954f, -29.34830f, 4.313390f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 450.598f, -318.048f, -37.75480f, 0.655219f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 509.333f, -218.200f, 3.054390f, 3.662920f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 485.771f, -223.613f, -1.530000f, 2.048620f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 486.636f, -452.172f, 39.65920f, 2.334100f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 702.783f, -257.494f, 25.97770f, 1.683290f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 460.942f, -199.263f, -6.014900f, 0.380506f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 483.108f, -115.307f, 10.10560f, 3.697010f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 471.601f, -154.174f, 14.07020f, 5.580700f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 213.938f, -420.793f, 41.25490f, 5.713940f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 289.387f, -294.685f, -33.90730f, 0.555494f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 155.649f, -402.891f, 43.39150f, 5.948380f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 517.184f, -295.105f, -9.781950f, 6.056680f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 102.334f, -332.165f, 38.98120f, 3.314450f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 10990, { 320.244f, -107.793f, -42.63570f, -1.003110f }, RESPAWN_IMMEDIATELY }, // 10990 - Alterac Ram + { 11675, { 217.976f, 110.774f, 15.76030f, 4.567930f }, RESPAWN_IMMEDIATELY }, // 11675 - Snowblind Windcaller + { 11675, { 269.872f, 6.66684f, 20.75920f, 0.381212f }, RESPAWN_IMMEDIATELY }, // 11675 - Snowblind Windcaller + { 11675, { 313.528f, -319.041f, -27.23730f, 0.554098f }, RESPAWN_IMMEDIATELY }, // 11675 - Snowblind Windcaller + { 11675, { 435.441f, -39.9289f, -0.169651f, 0.549454f }, RESPAWN_IMMEDIATELY }, // 11675 - Snowblind Windcaller + { 11675, { 315.115f, -317.620f, -29.11230f, 0.901110f }, RESPAWN_IMMEDIATELY }, // 11675 - Snowblind Windcaller + { 11678, { 428.091f, -122.731f, 3.403320f, 6.059010f }, RESPAWN_IMMEDIATELY }, // 11678 - Snowblind Ambusher + { 11678, { 235.050f, 85.5705f, 18.30790f, -0.914255f }, RESPAWN_IMMEDIATELY }, // 11678 - Snowblind Ambusher + { 11839, { -1553.04f, -344.342f, 64.41630f, 6.099330f }, RESPAWN_IMMEDIATELY }, // 11839 - Wildpaw Brute + { 11947, { -545.230f, -165.350f, 57.78860f, 3.011450f }, RESPAWN_IMMEDIATELY }, // 11947 - Captain Galvangar + { 11948, { 722.430f, -10.9982f, 50.70460f, 3.420850f }, RESPAWN_IMMEDIATELY }, // 11948 - Vanndar Stormpike + { 11949, { -57.7891f, -286.597f, 15.64790f, 6.021390f }, RESPAWN_IMMEDIATELY }, // 11949 - Captain Balinda Stonehearth + { 11997, { 930.498f, -520.755f, 93.73340f, 1.832600f }, RESPAWN_IMMEDIATELY }, // 11997 - Stormpike Herald + { 12051, { -776.092f, -345.161f, 67.40920f, 1.892570f }, RESPAWN_IMMEDIATELY }, // 12051 - Frostwolf Legionnaire + { 12051, { -1224.63f, -308.144f, 65.00870f, 4.011390f }, RESPAWN_IMMEDIATELY }, // 12051 - Frostwolf Legionnaire + { 12051, { -713.039f, -442.515f, 82.86380f, 0.687240f }, RESPAWN_IMMEDIATELY }, // 12051 - Frostwolf Legionnaire + { 12051, { -711.783f, -444.061f, 82.70390f, 0.683494f }, RESPAWN_IMMEDIATELY }, // 12051 - Frostwolf Legionnaire + { 12096, { 587.633f, -45.9816f, 37.54380f, 5.811950f }, RESPAWN_IMMEDIATELY }, // 12096 - Stormpike Quartermaster + { 12097, { -1293.79f, -194.407f, 72.43980f, 5.846850f }, RESPAWN_IMMEDIATELY }, // 12097 - Frostwolf Quartermaster + { 12127, { 446.163f, -377.119f, -1.127250f, 0.209526f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 549.348f, -399.254f, 53.35370f, 3.247290f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 549.801f, -401.217f, 53.83050f, 3.247290f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 192.704f, -406.874f, 42.91830f, 6.106960f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 441.305f, -435.765f, 28.23850f, 2.144720f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 192.982f, -404.891f, 43.01320f, 6.106100f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 355.342f, -391.989f, -0.486707f, 3.006430f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 446.035f, -375.104f, -1.127250f, 0.210330f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 697.864f, -433.238f, 62.79140f, 1.657760f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 610.740f, -331.585f, 30.80210f, 5.142530f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 609.815f, -329.775f, 30.92710f, -2.388290f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 695.874f, -433.434f, 62.85430f, 1.657760f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 12127, { 443.337f, -435.283f, 28.68420f, 2.137680f }, RESPAWN_IMMEDIATELY }, // 12127 - Stormpike Guardsman + { 13176, { -1251.50f, -316.327f, 62.65650f, 5.026550f }, RESPAWN_IMMEDIATELY }, // 13176 - Smith Regzar + { 13179, { -1332.00f, -331.243f, 91.26310f, 1.500980f }, RESPAWN_IMMEDIATELY }, // 13179 - Wing Commander Guse + { 13216, { 569.983f, -94.9992f, 38.03250f, 1.396260f }, RESPAWN_IMMEDIATELY }, // 13216 - Gaelden Hammersmith + { 13218, { -1244.92f, -308.916f, 63.25250f, 1.623160f }, RESPAWN_IMMEDIATELY }, // 13218 - Grunnda Wolfheart + { 13236, { -1319.56f, -342.675f, 60.34040f, 1.204280f }, RESPAWN_IMMEDIATELY }, // 13236 - Primalist Thurloga + { 13257, { 647.610f, -61.1548f, 41.74050f, 4.241150f }, RESPAWN_IMMEDIATELY }, // 13257 - Murgot Deepforge + { 13284, { -1321.64f, -343.730f, 60.48330f, 1.012290f }, RESPAWN_IMMEDIATELY }, // 13284 - Frostwolf Shaman + { 13284, { -1317.61f, -342.853f, 60.37260f, 2.478370f }, RESPAWN_IMMEDIATELY }, // 13284 - Frostwolf Shaman + { 13284, { -1319.31f, -344.475f, 60.38250f, 1.727880f }, RESPAWN_IMMEDIATELY }, // 13284 - Frostwolf Shaman + { 13438, { 569.963f, -42.0218f, 37.75810f, 4.276060f }, RESPAWN_IMMEDIATELY }, // 13438 - Wing Commander Slidore + { 13442, { 729.200f, -78.8120f, 51.63350f, 3.979350f }, RESPAWN_IMMEDIATELY }, // 13442 - Arch Druid Renferal + { 13443, { 729.118f, -82.8713f, 51.63350f, 2.530730f }, RESPAWN_IMMEDIATELY }, // 13443 - Druid of the Grove + { 13443, { 725.554f, -79.4973f, 51.63350f, 5.270890f }, RESPAWN_IMMEDIATELY }, // 13443 - Druid of the Grove + { 13443, { 724.768f, -84.1642f, 51.63350f, 0.733038f }, RESPAWN_IMMEDIATELY }, // 13443 - Druid of the Grove + { 13447, { 596.680f, -83.0633f, 39.00510f, 6.248280f }, RESPAWN_IMMEDIATELY }, // 13447 - Corporal Noreg Stormpike + { 13577, { 600.032f, -2.92475f, 42.07880f, 5.009090f }, RESPAWN_IMMEDIATELY }, // 13577 - Stormpike Ram Rider Commander + { 13617, { 610.239f, -21.8454f, 43.27200f, 4.904380f }, RESPAWN_IMMEDIATELY }, // 13617 - Stormpike Stable Master + { 13797, { 613.422f, -150.764f, 33.45170f, 5.550150f }, RESPAWN_IMMEDIATELY }, // 13797 - Mountaineer Boombellow + { 13798, { -1213.91f, -370.619f, 56.44550f, 0.837758f }, RESPAWN_IMMEDIATELY }, // 13798 - Jotek + { 13816, { 704.350f, -22.9071f, 50.21870f, 0.785398f }, RESPAWN_IMMEDIATELY }, // 13816 - Prospector Stonehewer + { 14185, { -1271.24f, -335.766f, 62.39710f, 5.759590f }, RESPAWN_IMMEDIATELY }, // 14185 - Najak Hexxen + { 14186, { -1268.64f, -332.688f, 62.61710f, 5.288350f }, RESPAWN_IMMEDIATELY }, // 14186 - Ravak Grimtotem + { 14187, { 648.363f, -65.2233f, 41.74050f, 3.124140f }, RESPAWN_IMMEDIATELY }, // 14187 - Athramanis + { 14188, { 648.238f, -67.8931f, 41.74050f, 2.600540f }, RESPAWN_IMMEDIATELY }, // 14188 - Dirk Swindle + { 14282, { -1223.44f, -309.833f, 64.93310f, 4.013100f }, RESPAWN_IMMEDIATELY }, // 14282 - Frostwolf Bloodhound + { 14282, { -1226.40f, -307.136f, 64.97060f, 4.014500f }, RESPAWN_IMMEDIATELY }, // 14282 - Frostwolf Bloodhound + { 14283, { 356.001f, -389.969f, -0.438796f, 3.033400f }, RESPAWN_IMMEDIATELY }, // 14283 - Stormpike Owl + { 14283, { 355.835f, -394.005f, -0.601490f, 3.024980f }, RESPAWN_IMMEDIATELY }, // 14283 - Stormpike Owl + { 14283, { 882.266f, -496.378f, 96.77070f, 4.832480f }, RESPAWN_IMMEDIATELY }, // 14283 - Stormpike Owl + { 14283, { 878.649f, -495.917f, 96.61710f, 4.676930f }, RESPAWN_IMMEDIATELY }, // 14283 - Stormpike Owl + { 14283, { 932.851f, -511.017f, 93.67480f, 3.610040f }, RESPAWN_IMMEDIATELY }, // 14283 - Stormpike Owl + { 14283, { 935.806f, -513.983f, 93.74360f, 3.617880f }, RESPAWN_IMMEDIATELY }, // 14283 - Stormpike Owl + { 14284, { 947.412f, -509.982f, 95.10980f, 2.827430f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 934.557f, -512.395f, 93.66200f, 3.610040f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 939.420f, -502.777f, 94.58870f, 5.148720f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 854.276f, -494.241f, 96.80170f, 5.445430f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 776.621f, -487.775f, 99.40490f, 3.508110f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 880.169f, -495.699f, 96.62040f, 4.832500f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 773.651f, -497.482f, 99.04080f, 2.111850f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 14284, { 949.100f, -506.913f, 95.42370f, 3.316130f }, RESPAWN_IMMEDIATELY }, // 14284 - Stormpike Battleguard + { 11946, { -1370.90f, -219.793f, 98.42580f, 5.043810f }, RESPAWN_IMMEDIATELY } // 11946 - Drek'Thar +}; + +//alliance_control neutral_control horde_control +uint32 const BG_AV_MineWorldStates[2][3] = +{ + { 1358, 1360, 1359 }, + { 1355, 1357, 1356 } +}; + +uint32 const BG_AV_GraveyardIds[9] = +{ + AV_GRAVE_STORM_AID, + AV_GRAVE_STORM_GRAVE, + AV_GRAVE_STONE_GRAVE, + AV_GRAVE_SNOWFALL, + AV_GRAVE_ICE_GRAVE, + AV_GRAVE_FROSTWOLF, + AV_GRAVE_FROST_HUT, + AV_GRAVE_MAIN_ALLIANCE, + AV_GRAVE_MAIN_HORDE +}; + +StaticNodeInfo const BG_AV_NodeInfo[BG_AV_NODES_MAX] = +{ + { { 47, 48, 45, 46 }, { 1325, 1326, 1327, 1328 } }, // Stormpike First Aid Station + { { 1, 2, 3, 4 }, { 1333, 1335, 1334, 1336 } }, // Stormpike Graveyard + { { 55, 56, 53, 54 }, { 1302, 1304, 1301, 1303 } }, // Stoneheart Graveyard + { { 5, 6, 7, 8 }, { 1341, 1343, 1342, 1344 } }, // Snowfall Graveyard + { { 59, 60, 57, 58 }, { 1346, 1348, 1347, 1349 } }, // Iceblood Graveyard + { { 9, 10, 11, 12 }, { 1337, 1339, 1338, 1340 } }, // Frostwolf Graveyard + { { 51, 52, 49, 50 }, { 1329, 1331, 1330, 1332 } }, // Frostwolf Hut + { { 16, 15, 14, 13 }, { 1361, 1375, 1370, 1378 } }, // Dunbaldar South Bunker + { { 20, 19, 18, 17 }, { 1362, 1374, 1371, 1379 } }, // Dunbaldar North Bunker + { { 24, 23, 22, 21 }, { 1363, 1376, 1372, 1380 } }, // Icewing Bunker + { { 28, 27, 26, 25 }, { 1364, 1377, 1373, 1381 } }, // Stoneheart Bunker + { { 44, 43, 42, 41 }, { 1368, 1390, 1385, 1395 } }, // Iceblood Tower + { { 40, 39, 38, 37 }, { 1367, 1389, 1384, 1394 } }, // Tower Point + { { 36, 35, 34, 33 }, { 1366, 1388, 1383, 1393 } }, // Frostwolf East Tower + { { 32, 31, 30, 29 }, { 1365, 1387, 1382, 1392 } } // Frostwolf West Tower +}; + BattlegroundAV::BattlegroundAV() { - BgObjects.resize(BG_AV_OBJECT_MAX); - BgCreatures.resize(AV_CPLACE_MAX+AV_STATICCPLACE_MAX); + SetGameObjectsNumber(BG_AV_OBJECT_MAX); + SetCreaturesNumber(AV_CPLACE_MAX + AV_STATICCPLACE_MAX); - for (uint8 i = 0; i < 2; i++) + for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) { for (uint8 j = 0; j < 9; j++) m_Team_QuestStatus[i][j] = 0; + m_Team_Scores[i] = 0; m_IsInformedNearVictory[i] = false; m_CaptainAlive[i] = true; m_CaptainBuffTimer[i] = 0; + } + + for (uint8 i = 0; i < 2; ++i) + { m_Mine_Owner[i] = 0; m_Mine_PrevOwner[i] = 0; m_Mine_Reclaim_Timer[i] = 0; @@ -47,7 +957,7 @@ BattlegroundAV::BattlegroundAV() m_Mine_Timer = 0; - for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) + for (BG_AV_Nodes i = BG_AV_NODES_AID_STATION; i < BG_AV_NODES_MAX; ++i) InitNode(i, 0, false); StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_AV_START_TWO_MINUTES; @@ -73,17 +983,7 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer) if (GetStatus() != STATUS_IN_PROGRESS) return; uint32 entry = unit->GetEntry(); - /* - uint32 triggerSpawnID = 0; - if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0]) - triggerSpawnID = AV_CPLACE_TRIGGER16; - else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS][0]) - triggerSpawnID = AV_CPLACE_TRIGGER17; - else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0]) - triggerSpawnID = AV_CPLACE_TRIGGER18; - else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS][0]) - triggerSpawnID = AV_CPLACE_TRIGGER19; - */ + if (entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS]) { CastSpellOnTeam(23658, HORDE); //this is a spell which finishes a quest where a player has to kill the boss @@ -102,41 +1002,51 @@ void BattlegroundAV::HandleKillUnit(Creature* unit, Player* killer) } else if (entry == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN]) { - if (!m_CaptainAlive[0]) + if (!m_CaptainAlive[TEAM_ALLIANCE]) { TC_LOG_ERROR("bg.battleground", "Killed a Captain twice, please report this bug, if you haven't done \".respawn\""); return; } - m_CaptainAlive[0]=false; + m_CaptainAlive[TEAM_ALLIANCE] = false; RewardReputationToTeam(729, BG_AV_REP_CAPTAIN, HORDE); RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), HORDE); UpdateScore(ALLIANCE, (-1)*BG_AV_RES_CAPTAIN); + //spawn destroyed aura - for (uint8 i=0; i <= 9; i++) - SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+i, RESPAWN_IMMEDIATELY); + uint32 const lowerBound = BG_AV_FlameIndices[BG_AV_DESTRUCTIBLE_BUILDING_ALLIANCE]; + uint32 const upperBound = BG_AV_FlameIndices[BG_AV_DESTRUCTIBLE_BUILDING_ALLIANCE + 1]; + + for (uint32 i = lowerBound; i < upperBound; ++i) + SpawnBGObject(i, RESPAWN_IMMEDIATELY); + DelCreature(AV_CPLACE_TRIGGER16); - if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD)) - herold->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD); + if (Creature* herald = GetBGCreature(AV_CPLACE_HERALD)) + herald->AI()->Talk(TEXT_STORMPIKE_GENERAL_DEAD); } else if (entry == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN]) { - if (!m_CaptainAlive[1]) + if (!m_CaptainAlive[TEAM_HORDE]) { TC_LOG_ERROR("bg.battleground", "Killed a Captain twice, please report this bug, if you haven't done \".respawn\""); return; } - m_CaptainAlive[1]=false; + m_CaptainAlive[TEAM_HORDE] = false; RewardReputationToTeam(730, BG_AV_REP_CAPTAIN, ALLIANCE); RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), ALLIANCE); UpdateScore(HORDE, (-1)*BG_AV_RES_CAPTAIN); + //spawn destroyed aura - for (uint8 i=0; i <= 9; i++) - SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_HORDE+i, RESPAWN_IMMEDIATELY); + uint32 const lowerBound = BG_AV_FlameIndices[BG_AV_DESTRUCTIBLE_BUILDING_HORDE]; + uint32 const upperBound = BG_AV_FlameIndices[BG_AV_DESTRUCTIBLE_BUILDING_HORDE + 1]; + + for (uint32 i = lowerBound; i < upperBound; ++i) + SpawnBGObject(i, RESPAWN_IMMEDIATELY); + DelCreature(AV_CPLACE_TRIGGER18); - if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD)) - herold->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD); + if (Creature* herald = GetBGCreature(AV_CPLACE_HERALD)) + herald->AI()->Talk(TEXT_FROSTWOLF_GENERAL_DEAD); } else if (entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_N_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_A_4] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_H_4]) ChangeMineOwner(AV_NORTH_MINE, killer->GetTeam()); @@ -161,7 +1071,7 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player) if (m_Team_QuestStatus[team][0] == 500 || m_Team_QuestStatus[team][0] == 1000 || m_Team_QuestStatus[team][0] == 1500) //25, 50, 75 turn ins { TC_LOG_DEBUG("bg.battleground", "BG_AV Quest %i completed starting with unit upgrading..", questid); - for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) + for (BG_AV_Nodes i = BG_AV_NODES_AID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) if (m_Nodes[i].Owner == player->GetTeam() && m_Nodes[i].State == POINT_CONTROLED) { DePopulateNode(i); @@ -247,23 +1157,24 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player) } } +//note: to remove reinforcements points must be negative, for adding reinforcements points must be positive void BattlegroundAV::UpdateScore(uint16 team, int16 points) -{ //note: to remove reinforcementpoints points must be negative, for adding reinforcements points must be positive +{ ASSERT(team == ALLIANCE || team == HORDE); uint8 teamindex = GetTeamIndexByTeamId(team); //0=ally 1=horde m_Team_Scores[teamindex] += points; - UpdateWorldState(((teamindex == TEAM_HORDE)?AV_Horde_Score:AV_Alliance_Score), m_Team_Scores[teamindex]); + UpdateWorldState(((teamindex == TEAM_HORDE) ? AV_Horde_Score : AV_Alliance_Score), m_Team_Scores[teamindex]); if (points < 0) { if (m_Team_Scores[teamindex] < 1) { - m_Team_Scores[teamindex]=0; - EndBattleground(((teamindex == TEAM_HORDE)?ALLIANCE:HORDE)); + m_Team_Scores[teamindex] = 0; + EndBattleground(((teamindex == TEAM_HORDE) ? ALLIANCE : HORDE)); } else if (!m_IsInformedNearVictory[teamindex] && m_Team_Scores[teamindex] < SEND_MSG_NEAR_LOSE) { - SendMessageToAll(teamindex == TEAM_HORDE?LANG_BG_AV_H_NEAR_LOSE:LANG_BG_AV_A_NEAR_LOSE, teamindex == TEAM_HORDE ? CHAT_MSG_BG_SYSTEM_HORDE : CHAT_MSG_BG_SYSTEM_ALLIANCE); + SendMessageToAll(teamindex == TEAM_HORDE ? LANG_BG_AV_H_NEAR_LOSE : LANG_BG_AV_A_NEAR_LOSE, teamindex == TEAM_HORDE ? CHAT_MSG_BG_SYSTEM_HORDE : CHAT_MSG_BG_SYSTEM_ALLIANCE); PlaySoundToAll(AV_SOUND_NEAR_VICTORY); m_IsInformedNearVictory[teamindex] = true; } @@ -273,27 +1184,21 @@ void BattlegroundAV::UpdateScore(uint16 team, int16 points) Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type) { bool isStatic = false; - Creature* creature = NULL; + Creature* creature = nullptr; ASSERT(type <= AV_CPLACE_MAX + AV_STATICCPLACE_MAX); if (type >= AV_CPLACE_MAX) //static { - type -= AV_CPLACE_MAX; - cinfoid = uint16(BG_AV_StaticCreaturePos[type][4]); - creature = AddCreature(BG_AV_StaticCreatureInfo[cinfoid], - type + AV_CPLACE_MAX, - BG_AV_StaticCreaturePos[type][0], - BG_AV_StaticCreaturePos[type][1], - BG_AV_StaticCreaturePos[type][2], - BG_AV_StaticCreaturePos[type][3]); + BattlegroundSpawnPoint const& spawnPoint = BG_AV_Creatures[type - AV_CPLACE_MAX]; + creature = AddCreature(spawnPoint.Entry, type, spawnPoint.Pos, spawnPoint.SpawnTime); isStatic = true; } else - { creature = AddCreature(BG_AV_CreatureInfo[cinfoid], type, BG_AV_CreaturePos[type]); - } + if (!creature) - return NULL; - if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN] || creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN]) + return nullptr; + + if (cinfoid == AV_NPC_A_CAPTAIN || cinfoid == AV_NPC_H_CAPTAIN) creature->SetRespawnDelay(RESPAWN_ONE_DAY); /// @todo look if this can be done by database + also add this for the wingcommanders if ((isStatic && cinfoid >= 10 && cinfoid <= 14) || (!isStatic && ((cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid <= AV_NPC_A_GRAVEDEFENSE3) || @@ -301,41 +1206,40 @@ Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type) { if (!isStatic && ((cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid <= AV_NPC_A_GRAVEDEFENSE3) || (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3))) - { - CreatureData &data = sObjectMgr->NewOrExistCreatureData(creature->GetSpawnId()); - data.spawndist = 5; - } - //else spawndist will be 15, so creatures move maximum=10 - //creature->SetDefaultMovementType(RANDOM_MOTION_TYPE); + creature->SetRespawnRadius(5.f); + else + creature->SetRespawnRadius(15.f); + + /// @todo find a way to add a motionmaster without killing the creature + creature->SetDefaultMovementType(RANDOM_MOTION_TYPE); creature->GetMotionMaster()->Initialize(); - creature->setDeathState(JUST_DIED); - creature->Respawn(); - /// @todo find a way to add a motionmaster without killing the creature (i - //just copied this code from a gm-command + creature->Respawn(true); } uint32 triggerSpawnID = 0; uint32 newFaction = 0; - if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN]) + switch (cinfoid) { - triggerSpawnID = AV_CPLACE_TRIGGER16; - newFaction = 84; - } - else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_BOSS]) - { - triggerSpawnID = AV_CPLACE_TRIGGER17; - newFaction = 84; - } - else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN]) - { - triggerSpawnID = AV_CPLACE_TRIGGER18; - newFaction = 83; - } - else if (creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_BOSS]) - { - triggerSpawnID = AV_CPLACE_TRIGGER19; - newFaction = 83; + case AV_NPC_A_CAPTAIN: + triggerSpawnID = AV_CPLACE_TRIGGER16; + newFaction = 84; + break; + case AV_NPC_A_BOSS: + triggerSpawnID = AV_CPLACE_TRIGGER17; + newFaction = 84; + break; + case AV_NPC_H_CAPTAIN: + triggerSpawnID = AV_CPLACE_TRIGGER18; + newFaction = 83; + break; + case AV_NPC_H_BOSS: + triggerSpawnID = AV_CPLACE_TRIGGER19; + newFaction = 83; + break; + default: + break; } + if (triggerSpawnID && newFaction) { if (Creature* trigger = AddCreature(WORLD_TRIGGER, triggerSpawnID, BG_AV_CreaturePos[triggerSpawnID])) @@ -352,15 +1256,16 @@ void BattlegroundAV::PostUpdateImpl(uint32 diff) { if (GetStatus() == STATUS_IN_PROGRESS) { - for (uint8 i=0; i <= 1; i++)//0=alliance, 1=horde + for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i)//0=alliance, 1=horde { if (!m_CaptainAlive[i]) continue; + if (m_CaptainBuffTimer[i] > diff) m_CaptainBuffTimer[i] -= diff; else { - if (i == 0) + if (i == TEAM_ALLIANCE) { CastSpellOnTeam(AV_BUFF_A_CAPTAIN, ALLIANCE); if (Creature* creature = GetBGCreature(AV_CPLACE_MAX + 61)) @@ -372,61 +1277,74 @@ void BattlegroundAV::PostUpdateImpl(uint32 diff) if (Creature* creature = GetBGCreature(AV_CPLACE_MAX + 59)) creature->AI()->DoAction(ACTION_BUFF_YELL); } - m_CaptainBuffTimer[i] = 120000 + urand(0, 4)* 60000; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes @todo get the right times + + m_CaptainBuffTimer[i] = urand(2, 6) * MINUTE * IN_MILLISECONDS; // as far as i could see, the buff is random so i make 2 minutes (that's the duration of the buff itself) + 0-4 minutes @todo get the right times } } - //add points from mine owning, and look if he neutral team wanrts to reclaim the mine - m_Mine_Timer -=diff; - for (uint8 mine=0; mine <2; mine++) + + //add points from mine owning, and look if the neutral team wants to reclaim the mine + m_Mine_Timer -= diff; + for (uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; ++mine) { if (m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE) { if (m_Mine_Timer <= 0) UpdateScore(m_Mine_Owner[mine], 1); - if (m_Mine_Reclaim_Timer[mine] > diff) - m_Mine_Reclaim_Timer[mine] -= diff; - else{ //we don't need to set this timer to 0 cause this codepart wont get called when this thing is 0 - ChangeMineOwner(mine, AV_NEUTRAL_TEAM); + if (m_Mine_Reclaim_Timer[mine]) + { + if (m_Mine_Reclaim_Timer[mine] <= diff) + ChangeMineOwner(mine, AV_NEUTRAL_TEAM); + else + m_Mine_Reclaim_Timer[mine] -= diff; } } } + if (m_Mine_Timer <= 0) - m_Mine_Timer=AV_MINE_TICK_TIMER; //this is at the end, cause we need to update both mines + m_Mine_Timer = AV_MINE_TICK_TIMER; //this is at the end, cause we need to update both mines //looks for all timers of the nodes and destroy the building (for graveyards the building wont get destroyed, it goes just to the other team - for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) + for (BG_AV_Nodes i = BG_AV_NODES_AID_STATION; i < BG_AV_NODES_MAX; ++i) + { if (m_Nodes[i].State == POINT_ASSAULTED) //maybe remove this { if (m_Nodes[i].Timer > diff) m_Nodes[i].Timer -= diff; else - EventPlayerDestroyedPoint(i); + EventPlayerDestroyedPoint(i); } + } } } void BattlegroundAV::StartingEventCloseDoors() { - DoorClose(BG_AV_OBJECT_DOOR_A); - DoorClose(BG_AV_OBJECT_DOOR_H); + for (uint32 i = BG_AV_OBJECT_DOOR_A; i <= BG_AV_GHOST_GATE_H; ++i) + { + DoorClose(i); + SpawnBGObject(i, BG_AV_GameObjects[i].SpawnTime); + } } void BattlegroundAV::StartingEventOpenDoors() { TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning mine stuff"); - for (uint16 i= BG_AV_OBJECT_MINE_SUPPLY_N_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_N_MAX; i++) + for (uint32 i = BG_AV_OBJECT_MINE_SUPPLY_N_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_N_MAX; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); - for (uint16 i= BG_AV_OBJECT_MINE_SUPPLY_S_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_S_MAX; i++) + for (uint32 i = BG_AV_OBJECT_MINE_SUPPLY_S_MIN; i <= BG_AV_OBJECT_MINE_SUPPLY_S_MAX; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); - for (uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; mine++) //mine population + for (uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; ++mine) //mine population ChangeMineOwner(mine, AV_NEUTRAL_TEAM, true); UpdateWorldState(AV_SHOW_H_SCORE, 1); UpdateWorldState(AV_SHOW_A_SCORE, 1); - DoorOpen(BG_AV_OBJECT_DOOR_H); - DoorOpen(BG_AV_OBJECT_DOOR_A); + for (uint32 i = BG_AV_OBJECT_DOOR_A; i <= BG_AV_GHOST_GATE_H; ++i) + DoorOpen(i); + + for (uint32 i = BG_AV_GHOST_GATE_A; i <= BG_AV_GHOST_GATE_H; ++i) + SpawnBGObject(i, RESPAWN_ONE_DAY); // Achievement: The Alterac Blitz StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_AV_EVENT_START_BATTLE); @@ -446,30 +1364,32 @@ void BattlegroundAV::EndBattleground(uint32 winner) uint8 rep[2] = {0, 0}; // 0 = Alliance 1 = Horde for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) { - if (m_Nodes[i].State == POINT_CONTROLED) + if (m_Nodes[i].State == POINT_CONTROLED) + { + if (m_Nodes[i].Owner == ALLIANCE) { - if (m_Nodes[i].Owner == ALLIANCE) - { - rep[0] += BG_AV_REP_SURVIVING_TOWER; - kills[0] += BG_AV_KILL_SURVIVING_TOWER; - } - else - { - rep[0] += BG_AV_KILL_SURVIVING_TOWER; - kills[1] += BG_AV_KILL_SURVIVING_TOWER; - } + rep[0] += BG_AV_REP_SURVIVING_TOWER; + kills[0] += BG_AV_KILL_SURVIVING_TOWER; } + else + { + rep[0] += BG_AV_KILL_SURVIVING_TOWER; + kills[1] += BG_AV_KILL_SURVIVING_TOWER; + } + } } - for (int i = TEAM_ALLIANCE; i <= TEAM_HORDE; ++i) + for (uint8 i = 0; i <= BG_TEAMS_COUNT; ++i) { if (m_CaptainAlive[i]) { kills[i] += BG_AV_KILL_SURVIVING_CAPTAIN; rep[i] += BG_AV_REP_SURVIVING_CAPTAIN; } + if (rep[i] != 0) RewardReputationToTeam(i == 0 ? 730 : 729, rep[i], i == 0 ? ALLIANCE : HORDE); + if (kills[i] != 0) RewardHonorToTeam(GetBonusHonorFromKill(kills[i]), i == 0 ? ALLIANCE : HORDE); } @@ -485,6 +1405,7 @@ void BattlegroundAV::RemovePlayer(Player* player, ObjectGuid /*guid*/, uint32 /* TC_LOG_ERROR("bg.battleground", "bg_AV no player at remove"); return; } + /// @todo search more buffs player->RemoveAurasDueToSpell(AV_BUFF_ARMOR); player->RemoveAurasDueToSpell(AV_BUFF_A_CAPTAIN); @@ -563,45 +1484,53 @@ void BattlegroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node) uint32 owner = m_Nodes[node].Owner; if (IsTower(node)) { - uint8 tmp = node-BG_AV_NODES_DUNBALDAR_SOUTH; + uint8 tmp = node - BG_AV_NODES_DUNBALDAR_SOUTH; //despawn marshal - if (BgCreatures[AV_CPLACE_A_MARSHAL_SOUTH + tmp]) - DelCreature(AV_CPLACE_A_MARSHAL_SOUTH + tmp); - else + if (!GetBGCreature(AV_CPLACE_A_MARSHAL_SOUTH + tmp, false)) TC_LOG_ERROR("bg.battleground", "BG_AV: playerdestroyedpoint: marshal %i doesn't exist", AV_CPLACE_A_MARSHAL_SOUTH + tmp); - //spawn destroyed aura - for (uint8 i=0; i <= 9; i++) - SpawnBGObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + i + (tmp * 10), RESPAWN_IMMEDIATELY); + else + DelCreature(AV_CPLACE_A_MARSHAL_SOUTH + tmp); + + uint32 const lowerBound = BG_AV_FlameIndices[tmp]; + uint32 const upperBound = BG_AV_FlameIndices[tmp + 1]; + + // spawn destroyed aura + for (uint32 i = lowerBound; i < upperBound; ++i) + SpawnBGObject(i, RESPAWN_IMMEDIATELY); UpdateScore((owner == ALLIANCE) ? HORDE : ALLIANCE, -1 * BG_AV_RES_TOWER); RewardReputationToTeam(owner == ALLIANCE ? 730 : 729, BG_AV_REP_TOWER, owner); RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_TOWER), owner); - SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp), RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp), RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + tmp, RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH + tmp, RESPAWN_ONE_DAY); } else { + uint32 const hordeDelta = BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT - BG_AV_OBJECT_AURA_A_AID_STATION + 1; + if (owner == ALLIANCE) - SpawnBGObject(object-11, RESPAWN_IMMEDIATELY); + SpawnBGObject(object + BG_AV_OBJECT_FLAG_A_AID_STATION - BG_AV_OBJECT_FLAG_C_A_AID_STATION, RESPAWN_IMMEDIATELY); // contested by alliance, spawn alliance banner else - SpawnBGObject(object+11, RESPAWN_IMMEDIATELY); - SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(owner)+3*node, RESPAWN_IMMEDIATELY); + SpawnBGObject(object + BG_AV_OBJECT_FLAG_H_AID_STATION - BG_AV_OBJECT_FLAG_C_H_AID_STATION, RESPAWN_IMMEDIATELY); // contested by horde, spawn horde banner + + SpawnBGObject(BG_AV_OBJECT_AURA_N_AID_STATION_CONT_A + BG_TEAMS_COUNT * node + GetTeamIndexByTeamId(owner), RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_AURA_A_AID_STATION + GetTeamIndexByTeamId(owner) * hordeDelta + node, RESPAWN_IMMEDIATELY); PopulateNode(node); + if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy { - for (uint8 i = 0; i < 4; i++) + for (uint8 i = 0; i < 4; ++i) { - SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY); - SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY); + SpawnBGObject((owner == ALLIANCE ? BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH) + i, RESPAWN_ONE_DAY); + SpawnBGObject((owner == ALLIANCE ? BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H) + i, RESPAWN_IMMEDIATELY); } } } if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node)) - if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD)) - herold->AI()->Talk(owner == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture); + if (Creature* herald = GetBGCreature(AV_CPLACE_HERALD)) + herald->AI()->Talk(owner == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture); } void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial) @@ -615,6 +1544,7 @@ void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial) if (m_Mine_Owner[mine] == team && !initial) return; + m_Mine_PrevOwner[mine] = m_Mine_Owner[mine]; m_Mine_Owner[mine] = team; @@ -622,13 +1552,13 @@ void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial) { TC_LOG_DEBUG("bg.battleground", "bg_av depopulating mine %i (0=north, 1=south)", mine); if (mine == AV_SOUTH_MINE) - for (uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++) - if (BgCreatures[i]) - DelCreature(i); /// @todo just set the respawntime to 999999 - for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3); i++) - if (BgCreatures[i]) - DelCreature(i); /// @todo here also + for (uint16 i = AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; ++i) + DelCreature(i); /// @todo just set the respawntime to 999999 + + for (uint16 i = ((mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_1_MIN : AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_3 : AV_CPLACE_MINE_S_3); ++i) + DelCreature(i); /// @todo here also } + SendMineWorldStates(mine); TC_LOG_DEBUG("bg.battleground", "bg_av populating mine %i (0=north, 1=south)", mine); @@ -652,7 +1582,8 @@ void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial) miner = AV_NPC_S_MINE_H_1; else miner = AV_NPC_S_MINE_N_1; - //vermin + + //vermin TC_LOG_DEBUG("bg.battleground", "spawning vermin"); if (team == ALLIANCE) cinfo = AV_NPC_S_MINE_A_3; @@ -660,37 +1591,42 @@ void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial) cinfo = AV_NPC_S_MINE_H_3; else cinfo = AV_NPC_S_MINE_N_S; - for (uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++) + + for (uint16 i = AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; ++i) AddAVCreature(cinfo, i); } - for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MAX:AV_CPLACE_MINE_S_1_MAX); i++) + for (uint16 i = ((mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_1_MIN : AV_CPLACE_MINE_S_1_MIN); i <= ((mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_1_MAX : AV_CPLACE_MINE_S_1_MAX); ++i) AddAVCreature(miner, i); + //the next chooses randomly between 2 cretures - for (uint16 i=((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MIN:AV_CPLACE_MINE_S_2_MIN); i <= ((mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MAX:AV_CPLACE_MINE_S_2_MAX); i++) - AddAVCreature(miner+(urand(1, 2)), i); - AddAVCreature(miner+3, (mine == AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3); + for (uint16 i = ((mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_2_MIN : AV_CPLACE_MINE_S_2_MIN); i <= ((mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_2_MAX : AV_CPLACE_MINE_S_2_MAX); ++i) + AddAVCreature(miner + (urand(1, 2)), i); + + AddAVCreature(miner + 3, (mine == AV_NORTH_MINE) ? AV_CPLACE_MINE_N_3 : AV_CPLACE_MINE_S_3); if (team == ALLIANCE || team == HORDE) { - m_Mine_Reclaim_Timer[mine]=AV_MINE_RECLAIM_TIMER; + m_Mine_Reclaim_Timer[mine] = AV_MINE_RECLAIM_TIMER; - if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD)) + if (Creature* herald = GetBGCreature(AV_CPLACE_HERALD)) { if (mine == AV_NORTH_MINE) - herold->AI()->Talk(team == ALLIANCE ? TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN : TEXT_IRONDEEP_MINE_HORDE_TAKEN); + herald->AI()->Talk(team == ALLIANCE ? TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN : TEXT_IRONDEEP_MINE_HORDE_TAKEN); else if (mine == AV_SOUTH_MINE) - herold->AI()->Talk(team == ALLIANCE ? TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN : TEXT_COLDTOOTH_MINE_HORDE_TAKEN); + herald->AI()->Talk(team == ALLIANCE ? TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN : TEXT_COLDTOOTH_MINE_HORDE_TAKEN); } } else { - if (mine == AV_SOUTH_MINE) //i think this gets called all the time + // disable timer + m_Mine_Reclaim_Timer[mine] = 0; + + if (mine == AV_SOUTH_MINE) { if (Creature* creature = GetBGCreature(AV_CPLACE_MINE_S_3)) creature->AI()->Talk(TEXT_SNIVVLE_RANDOM); } } - return; } bool BattlegroundAV::CanActivateGO(int32 GOId, uint32 team) const @@ -699,7 +1635,7 @@ bool BattlegroundAV::CanActivateGO(int32 GOId, uint32 team) const return (m_Mine_Owner[AV_NORTH_MINE] == team); if (GOId == BG_AV_OBJECTID_MINE_S) return (m_Mine_Owner[AV_SOUTH_MINE] == team); - return true; //cause it's no mine'object it is ok if this is true + return true; // cause it's no mine'object it is ok if this is true } void BattlegroundAV::PopulateNode(BG_AV_Nodes node) @@ -710,150 +1646,197 @@ void BattlegroundAV::PopulateNode(BG_AV_Nodes node) uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + (4 * node); uint32 creatureid; if (IsTower(node)) - creatureid=(owner == ALLIANCE)?AV_NPC_A_TOWERDEFENSE:AV_NPC_H_TOWERDEFENSE; + creatureid = (owner == ALLIANCE) ? AV_NPC_A_TOWERDEFENSE : AV_NPC_H_TOWERDEFENSE; else { - uint8 team2 = GetTeamIndexByTeamId(owner); - if (m_Team_QuestStatus[team2][0] < 500) - creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE0 : AV_NPC_H_GRAVEDEFENSE0; - else if (m_Team_QuestStatus[team2][0] < 1000) - creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE1 : AV_NPC_H_GRAVEDEFENSE1; - else if (m_Team_QuestStatus[team2][0] < 1500) - creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE2 : AV_NPC_H_GRAVEDEFENSE2; + uint8 team = GetTeamIndexByTeamId(owner); + if (m_Team_QuestStatus[team][0] < 500) + creatureid = (owner == ALLIANCE) ? AV_NPC_A_GRAVEDEFENSE0 : AV_NPC_H_GRAVEDEFENSE0; + else if (m_Team_QuestStatus[team][0] < 1000) + creatureid = (owner == ALLIANCE) ? AV_NPC_A_GRAVEDEFENSE1 : AV_NPC_H_GRAVEDEFENSE1; + else if (m_Team_QuestStatus[team][0] < 1500) + creatureid = (owner == ALLIANCE) ? AV_NPC_A_GRAVEDEFENSE2 : AV_NPC_H_GRAVEDEFENSE2; else - creatureid = (owner == ALLIANCE)? AV_NPC_A_GRAVEDEFENSE3 : AV_NPC_H_GRAVEDEFENSE3; - //spiritguide - if (BgCreatures[node]) + creatureid = (owner == ALLIANCE) ? AV_NPC_A_GRAVEDEFENSE3 : AV_NPC_H_GRAVEDEFENSE3; + + // spiritguide + if (node <= BG_AV_NODES_FROSTWOLF_HUT) + { DelCreature(node); - if (!AddSpiritGuide(node, BG_AV_CreaturePos[node], GetTeamIndexByTeamId(owner))) - TC_LOG_ERROR("bg.battleground", "AV: couldn't spawn spiritguide at node %i", node); + if (!AddSpiritGuide(node, BG_AV_CreaturePos[node], GetTeamIndexByTeamId(owner))) + TC_LOG_ERROR("bg.battleground", "AV: couldn't spawn spiritguide at node %i", node); + } } - for (uint8 i=0; i<4; i++) - AddAVCreature(creatureid, c_place+i); - if (node >= BG_AV_NODES_MAX)//fail safe + for (uint32 i = 0; i < 4; ++i) + AddAVCreature(creatureid, c_place + i); + + if (node >= BG_AV_NODES_MAX) // fail safe return; - Creature* trigger = GetBGCreature(node + 302, false);//0-302 other creatures + + Creature* trigger = GetBGCreature(node + AV_CPLACE_TRIGGER01, false); // 0-302 other creatures if (!trigger) - { - trigger = AddCreature(WORLD_TRIGGER, - node + 302, - BG_AV_CreaturePos[node + 302], - GetTeamIndexByTeamId(owner)); - } + trigger = AddCreature(WORLD_TRIGGER, node + AV_CPLACE_TRIGGER01, BG_AV_CreaturePos[node + AV_CPLACE_TRIGGER01]); - //add bonus honor aura trigger creature when node is accupied - //cast bonus aura (+50% honor in 25yards) - //aura should only apply to players who have accupied the node, set correct faction for trigger + // add bonus honor aura trigger creature when node is accupied + // cast bonus aura (+50% honor in 25yards) + // aura should only apply to players who have accupied the node, set correct faction for trigger if (trigger) { - if (owner != ALLIANCE && owner != HORDE)//node can be neutral, remove trigger + if (owner != ALLIANCE && owner != HORDE) // node can be neutral, remove trigger { - DelCreature(node + 302); + DelCreature(node + AV_CPLACE_TRIGGER01); return; } + trigger->setFaction(owner == ALLIANCE ? 84 : 83); trigger->CastSpell(trigger, SPELL_HONORABLE_DEFENDER_25Y, false); } } + void BattlegroundAV::DePopulateNode(BG_AV_Nodes node) { uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + (4 * node); - for (uint8 i=0; i<4; i++) - if (BgCreatures[c_place+i]) - DelCreature(c_place+i); - //spiritguide - if (!IsTower(node) && BgCreatures[node]) + for (uint32 i = 0; i < 4; ++i) + DelCreature(c_place + i); + + // spirit guide + if (!IsTower(node) && node <= BG_AV_NODES_FROSTWOLF_HUT) DelCreature(node); - //remove bonus honor aura trigger creature when node is lost - if (node < BG_AV_NODES_MAX)//fail safe - DelCreature(node + 302);//NULL checks are in DelCreature! 0-302 spirit guides + // remove bonus honor aura trigger creature when node is lost + if (node < BG_AV_NODES_MAX) //fail safe + DelCreature(node + AV_CPLACE_TRIGGER01); // NULL checks are in DelCreature! 0-302 spirit guides } BG_AV_Nodes BattlegroundAV::GetNodeThroughObject(uint32 object) { TC_LOG_DEBUG("bg.battleground", "bg_AV getnodethroughobject %i", object); + if (object < BG_AV_OBJECT_FLAG_A_AID_STATION) + { + TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object (%u) :(", object); + ABORT(); + return BG_AV_Nodes(0); + } if (object <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER) - return BG_AV_Nodes(object); + return BG_AV_Nodes(object - BG_AV_OBJECT_FLAG_A_AID_STATION); if (object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT) - return BG_AV_Nodes(object - 11); + return BG_AV_Nodes(object - BG_AV_OBJECT_FLAG_C_A_AID_STATION); if (object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER) - return BG_AV_Nodes(object - 7); + return BG_AV_Nodes(object + BG_AV_NODES_ICEBLOOD_TOWER - BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_TOWER); if (object <= BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER) - return BG_AV_Nodes(object -22); + return BG_AV_Nodes(object - BG_AV_OBJECT_FLAG_C_H_AID_STATION); if (object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT) - return BG_AV_Nodes(object - 33); + return BG_AV_Nodes(object - BG_AV_OBJECT_FLAG_H_AID_STATION); if (object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER) - return BG_AV_Nodes(object - 29); + return BG_AV_Nodes(object + BG_AV_NODES_ICEBLOOD_TOWER - BG_AV_OBJECT_FLAG_H_ICEBLOOD_TOWER); if (object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE) return BG_AV_NODES_SNOWFALL_GRAVE; - TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object :("); + TC_LOG_ERROR("bg.battleground", "BattlegroundAV: ERROR! GetPlace got a wrong object (%u) :(", object); ABORT(); return BG_AV_Nodes(0); } +// this function is the counterpart to GetNodeThroughObject() uint32 BattlegroundAV::GetObjectThroughNode(BG_AV_Nodes node) -{ //this function is the counterpart to GetNodeThroughObject() - TC_LOG_DEBUG("bg.battleground", "bg_AV GetObjectThroughNode %i", node); +{ + TC_LOG_DEBUG("bg.battleground", "bg_AV GetObjectThroughNode %u", node); if (m_Nodes[node].Owner == ALLIANCE) { if (m_Nodes[node].State == POINT_ASSAULTED) { if (node <= BG_AV_NODES_FROSTWOLF_HUT) - return node+11; + return node + BG_AV_OBJECT_FLAG_C_A_AID_STATION; if (node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER) - return node+7; + return node + BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_TOWER - BG_AV_NODES_ICEBLOOD_TOWER; } else if (m_Nodes[node].State == POINT_CONTROLED) if (node <= BG_AV_NODES_STONEHEART_BUNKER) - return node; + return node + BG_AV_OBJECT_FLAG_A_AID_STATION; } else if (m_Nodes[node].Owner == HORDE) { if (m_Nodes[node].State == POINT_ASSAULTED) { if (node <= BG_AV_NODES_STONEHEART_BUNKER) - return node+22; + return node + BG_AV_OBJECT_FLAG_C_H_AID_STATION; } else if (m_Nodes[node].State == POINT_CONTROLED) { if (node <= BG_AV_NODES_FROSTWOLF_HUT) - return node+33; + return node + BG_AV_OBJECT_FLAG_H_AID_STATION; if (node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER) - return node+29; + return node + BG_AV_OBJECT_FLAG_H_ICEBLOOD_TOWER - BG_AV_NODES_ICEBLOOD_TOWER; } } else if (m_Nodes[node].Owner == AV_NEUTRAL_TEAM) return BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; - TC_LOG_ERROR("bg.battleground", "BattlegroundAV: Error! GetPlaceNode couldn't resolve node %i", node); + + TC_LOG_ERROR("bg.battleground", "BattlegroundAV: Error! GetPlaceNode couldn't resolve node %u", node); ABORT(); return 0; } //called when using banner - void BattlegroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; + int32 object = GetObjectType(target_obj->GetGUID()); TC_LOG_DEBUG("bg.battleground", "BG_AV using gameobject %i with type %i", target_obj->GetEntry(), object); if (object < 0) return; + switch (target_obj->GetEntry()) { - case BG_AV_OBJECTID_BANNER_A: - case BG_AV_OBJECTID_BANNER_A_B: - case BG_AV_OBJECTID_BANNER_H: - case BG_AV_OBJECTID_BANNER_H_B: + case BG_AV_OBJECTID_BANNER_A_AID_STATION: + case BG_AV_OBJECTID_BANNER_A_STORMPIKE: + case BG_AV_OBJECTID_BANNER_A_STONEHEARTH_GRAVE: + case BG_AV_OBJECTID_BANNER_A_SNOWFALL_GRAVE: + case BG_AV_OBJECTID_BANNER_A_ICEBLOOD_GRAVE: + case BG_AV_OBJECTID_BANNER_A_FROSTWOLF_GRAVE: + case BG_AV_OBJECTID_BANNER_A_FROSTWOLF_HUT: + case BG_AV_OBJECTID_BANNER_A_DUN_BALDAR_S: + case BG_AV_OBJECTID_BANNER_A_DUN_BALDAR_N: + case BG_AV_OBJECTID_BANNER_A_ICEWING_BUNKER: + case BG_AV_OBJECTID_BANNER_A_STONEHEARTH_BUNKER: + case BG_AV_OBJECTID_BANNER_H_AID_STATION: + case BG_AV_OBJECTID_BANNER_H_STORMPIKE: + case BG_AV_OBJECTID_BANNER_H_STONEHEARTH_GRAVE: + case BG_AV_OBJECTID_BANNER_H_SNOWFALL: + case BG_AV_OBJECTID_BANNER_H_ICEBLOOD_GRAVE: + case BG_AV_OBJECTID_BANNER_H_FROSTWOLF_GRAVE: + case BG_AV_OBJECTID_BANNER_H_FROSTWOLF_HUT: + case BG_AV_OBJECTID_BANNER_H_ICEBLOOD_GARRISON: + case BG_AV_OBJECTID_BANNER_H_TOWER_POINT: + case BG_AV_OBJECTID_BANNER_H_FROSTWOLF_E: + case BG_AV_OBJECTID_BANNER_H_FROSTWOLF_W: case BG_AV_OBJECTID_BANNER_SNOWFALL_N: EventPlayerAssaultsPoint(source, object); break; - case BG_AV_OBJECTID_BANNER_CONT_A: - case BG_AV_OBJECTID_BANNER_CONT_A_B: - case BG_AV_OBJECTID_BANNER_CONT_H: - case BG_AV_OBJECTID_BANNER_CONT_H_B: + case BG_AV_OBJECTID_BANNER_CONT_A_AID_STATION: + case BG_AV_OBJECTID_BANNER_CONT_A_STORMPIKE: + case BG_AV_OBJECTID_BANNER_CONT_A_STONEHEARTH_GRAVE: + case BG_AV_OBJECTID_BANNER_CONT_A_SNOWFALL: + case BG_AV_OBJECTID_BANNER_CONT_A_ICEBLOOD_GRAVE: + case BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_GRAVE: + case BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_HUT: + case BG_AV_OBJECTID_BANNER_CONT_A_ICEBLOOD_GARRISON: + case BG_AV_OBJECTID_BANNER_CONT_A_TOWER_POINT: + case BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_E: + case BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_W: + case BG_AV_OBJECTID_BANNER_CONT_H_AID_STATION: + case BG_AV_OBJECTID_BANNER_CONT_H_STORMPIKE: + case BG_AV_OBJECTID_BANNER_CONT_H_STONEHEARTH_GRAVE: + case BG_AV_OBJECTID_BANNER_CONT_H_SNOWFALL: + case BG_AV_OBJECTID_BANNER_CONT_H_ICEBLOOD_GRAVE: + case BG_AV_OBJECTID_BANNER_CONT_H_FROSTWOLF_GRAVE: + case BG_AV_OBJECTID_BANNER_CONT_H_FROSTWOLF_HUT: + case BG_AV_OBJECTID_BANNER_CONT_H_DUN_BALDAR_S: + case BG_AV_OBJECTID_BANNER_CONT_H_DUN_BALDAR_N: + case BG_AV_OBJECTID_BANNER_CONT_H_ICEWING_BUNKER: + case BG_AV_OBJECTID_BANNER_CONT_H_STONEHEARTH_BUNKER: EventPlayerDefendsPoint(source, object); break; default: @@ -871,12 +1854,15 @@ void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object) if (owner == player->GetTeam() || m_Nodes[node].State != POINT_ASSAULTED) return; + + //until snowfall doesn't belong to anyone it is better handled in assault-code if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) - { //until snowfall doesn't belong to anyone it is better handled in assault-code + { ASSERT(node == BG_AV_NODES_SNOWFALL_GRAVE); //currently the only neutral grave EventPlayerAssaultsPoint(player, object); return; } + TC_LOG_DEBUG("bg.battleground", "player defends point object: %i node: %i", object, node); if (m_Nodes[node].PrevOwner != team) { @@ -884,18 +1870,25 @@ void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object) return; } - //spawn new go :) + //spawn new go :) if (m_Nodes[node].Owner == ALLIANCE) - SpawnBGObject(object+22, RESPAWN_IMMEDIATELY); //spawn horde banner + SpawnBGObject(object + BG_AV_OBJECT_FLAG_H_AID_STATION - BG_AV_OBJECT_FLAG_C_A_AID_STATION, RESPAWN_IMMEDIATELY); // flag is contested alliance, spawn horde banner else - SpawnBGObject(object-22, RESPAWN_IMMEDIATELY); //spawn alliance banner + SpawnBGObject(object + BG_AV_OBJECT_FLAG_A_AID_STATION - BG_AV_OBJECT_FLAG_C_H_AID_STATION, RESPAWN_IMMEDIATELY); // flag is contested horde, spawn alliance banner if (!IsTower(node)) { - SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(team)+3*node, RESPAWN_IMMEDIATELY); + // how much we have to offset in case team == horde + uint32 const hordeDelta = BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT - BG_AV_OBJECT_AURA_A_AID_STATION + 1; + + // remove contested ("neutral") aura, it will correspond to attacker team + SpawnBGObject(BG_AV_OBJECT_AURA_N_AID_STATION_CONT_A + BG_TEAMS_COUNT * node + GetTeamIndexByTeamId(GetOtherTeam(team)), RESPAWN_ONE_DAY); + // note: snowfall initial neutral aura is handled in EventPlayerAssaultsPoint, as it'll only appear before first assault. + + // now make corresponding aura visible + SpawnBGObject(BG_AV_OBJECT_AURA_A_AID_STATION + GetTeamIndexByTeamId(team) * hordeDelta + node, RESPAWN_IMMEDIATELY); } - // despawn old go + // despawn old go SpawnBGObject(object, RESPAWN_ONE_DAY); DefendNode(node, team); @@ -904,24 +1897,26 @@ void BattlegroundAV::EventPlayerDefendsPoint(Player* player, uint32 object) if (IsTower(node)) { - //spawn big flag+aura on top of tower - SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + //spawn big flag + aura on top of tower + SpawnBGObject(BG_AV_OBJECT_TAURA_N_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_IMMEDIATELY); + + SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_IMMEDIATELY); + } else if (node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy { - for (uint8 i = 0; i < 4; i++) + for (uint32 i = 0; i < 4; ++i) { - SpawnBGObject(((owner == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i, RESPAWN_ONE_DAY); - SpawnBGObject(((team == ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i, RESPAWN_IMMEDIATELY); + SpawnBGObject((team == ALLIANCE ? BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_PA) + i, RESPAWN_ONE_DAY); + SpawnBGObject((team == ALLIANCE ? BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H) + i, RESPAWN_IMMEDIATELY); } } if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node)) - if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD)) - herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture); + if (Creature* herald = GetBGCreature(AV_CPLACE_HERALD)) + herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceCapture : nodeInfo->TextIds.HordeCapture); // update the statistic for the defending player UpdatePlayerScore(player, IsTower(node) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1); @@ -933,7 +1928,7 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object) BG_AV_Nodes node = GetNodeThroughObject(object); uint32 owner = m_Nodes[node].Owner; //maybe name it prevowner - uint32 team = player->GetTeam(); + uint32 team = player->GetTeam(); TC_LOG_DEBUG("bg.battleground", "bg_av: player assaults point object %i node %i", object, node); if (owner == team || team == m_Nodes[node].TotalOwner) return; //surely a gm used this object @@ -945,74 +1940,97 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object) if (!(owner == AV_NEUTRAL_TEAM && m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM)) return; - if (team == ALLIANCE) - SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY); - else - SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY); - SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_IMMEDIATELY); //neutral aura spawn + // despawn initial neutral aura + SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_N, RESPAWN_ONE_DAY); + + // spawn capping team banner + aura + SpawnBGObject(team == ALLIANCE ? BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE : BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY); + SpawnBGObject(team == ALLIANCE ? BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_CONT_A : BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_CONT_H, RESPAWN_IMMEDIATELY); } - else if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) //recapping, when no team owns this node realy + else if (m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) // recapping, when no team owns this node really { if (!(m_Nodes[node].State != POINT_CONTROLED)) return; - if (team == ALLIANCE) - SpawnBGObject(object-11, RESPAWN_IMMEDIATELY); - else - SpawnBGObject(object+11, RESPAWN_IMMEDIATELY); - } - //eyecandy - uint32 spawn, despawn; - if (team == ALLIANCE) - { - despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H; - spawn = BG_AV_OBJECT_SNOW_EYECANDY_PA; + // swap banner + SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, team == ALLIANCE ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, team == ALLIANCE ? RESPAWN_ONE_DAY : RESPAWN_IMMEDIATELY); + + // swap aura + SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_CONT_A, team == ALLIANCE ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_CONT_H, team == ALLIANCE ? RESPAWN_ONE_DAY : RESPAWN_IMMEDIATELY); } - else + + // eyecandy + uint32 despawnId; + switch (team) { - despawn = (m_Nodes[node].State == POINT_ASSAULTED)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A; - spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH; + case ALLIANCE: + despawnId = m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].State == POINT_ASSAULTED ? BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H; + break; + case HORDE: + despawnId = m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].State == POINT_ASSAULTED ? BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A; + break; + default: + ABORT(); + break; } - for (uint8 i = 0; i < 4; i++) + + uint32 spawnId = team == ALLIANCE ? BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH; + for (uint32 i = 0; i < 4; ++i) { - SpawnBGObject(despawn+i, RESPAWN_ONE_DAY); - SpawnBGObject(spawn+i, RESPAWN_IMMEDIATELY); + SpawnBGObject(despawnId + i, RESPAWN_ONE_DAY); + SpawnBGObject(spawnId + i, RESPAWN_IMMEDIATELY); } } //if snowfall gots capped it can be handled like all other graveyards if (m_Nodes[node].TotalOwner != AV_NEUTRAL_TEAM) { - ASSERT(m_Nodes[node].Owner != AV_NEUTRAL_TEAM); + ASSERT(owner != AV_NEUTRAL_TEAM); if (team == ALLIANCE) - SpawnBGObject(object-22, RESPAWN_IMMEDIATELY); + SpawnBGObject(object + BG_AV_OBJECT_FLAG_C_A_AID_STATION - BG_AV_OBJECT_FLAG_H_AID_STATION, RESPAWN_IMMEDIATELY); // banner is horde, spawn contested alliance flag else - SpawnBGObject(object+22, RESPAWN_IMMEDIATELY); + SpawnBGObject(object + BG_AV_OBJECT_FLAG_C_H_AID_STATION - BG_AV_OBJECT_FLAG_A_AID_STATION, RESPAWN_IMMEDIATELY); // banner is alliance, spawn contested horde flag + + // spawning/despawning of big flag + aura if (IsTower(node)) - { //spawning/despawning of bigflag+aura - SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); - SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)), (team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + { + //spawn big flag + aura on top of tower + SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_TAURA_N_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_IMMEDIATELY); + + SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_ONE_DAY); + SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH + node - BG_AV_NODES_DUNBALDAR_SOUTH, RESPAWN_IMMEDIATELY); } else { - //spawning/despawning of aura - SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node, RESPAWN_IMMEDIATELY); //neutral aura spawn - SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(owner)+3*node, RESPAWN_ONE_DAY); //teeamaura despawn + // spawning / despawning of aura + // how much we have to offset in case team == horde + uint32 const hordeDelta = BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT - BG_AV_OBJECT_AURA_A_AID_STATION + 1; + + // team aura despawn + SpawnBGObject(BG_AV_OBJECT_AURA_A_AID_STATION + GetTeamIndexByTeamId(owner) * hordeDelta + node, RESPAWN_ONE_DAY); - RelocateDeadPlayers(BgCreatures[node]); + // neutral aura spawn + SpawnBGObject(BG_AV_OBJECT_AURA_N_AID_STATION_CONT_A + BG_TEAMS_COUNT * node + GetTeamIndexByTeamId(team), RESPAWN_IMMEDIATELY); + + // relocate ghosts + if (Creature* spiritGuide = GetBGCreature(node)) + RelocateDeadPlayers(spiritGuide->GetGUID()); } + DePopulateNode(node); } - SpawnBGObject(object, RESPAWN_ONE_DAY); //delete old banner + // delete old banner + SpawnBGObject(object, RESPAWN_ONE_DAY); AssaultNode(node, team); UpdateNodeWorldState(node); if (StaticNodeInfo const* nodeInfo = GetStaticNodeInfo(node)) - if (Creature* herold = GetBGCreature(AV_CPLACE_HERALD)) - herold->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack); + if (Creature* herald = GetBGCreature(AV_CPLACE_HERALD)) + herald->AI()->Talk(team == ALLIANCE ? nodeInfo->TextIds.AllianceAttack : nodeInfo->TextIds.HordeAttack); // update the statistic for the assaulting player UpdatePlayerScore(player, (IsTower(node)) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1); @@ -1020,22 +2038,22 @@ void BattlegroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object) void BattlegroundAV::FillInitialWorldStates(WorldPacket& data) { - for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) + for (uint32 i = BG_AV_NODES_AID_STATION; i < BG_AV_NODES_MAX; ++i) { uint16 owner = m_Nodes[i].Owner; BG_AV_States state = m_Nodes[i].State; - data << uint32(BGAVNodeInfo[i].WorldStateIds.AllianceAssault) << uint32(owner == ALLIANCE && state == POINT_ASSAULTED); - data << uint32(BGAVNodeInfo[i].WorldStateIds.AllianceControl) << uint32(owner == ALLIANCE && state >= POINT_DESTROYED); - data << uint32(BGAVNodeInfo[i].WorldStateIds.HordeAssault) << uint32(owner == HORDE && state == POINT_ASSAULTED); - data << uint32(BGAVNodeInfo[i].WorldStateIds.HordeControl) << uint32(owner == HORDE && state >= POINT_DESTROYED); + data << uint32(BG_AV_NodeInfo[i].WorldStateIds.AllianceAssault) << uint32(owner == ALLIANCE && state == POINT_ASSAULTED); + data << uint32(BG_AV_NodeInfo[i].WorldStateIds.AllianceControl) << uint32(owner == ALLIANCE && state >= POINT_DESTROYED); + data << uint32(BG_AV_NodeInfo[i].WorldStateIds.HordeAssault) << uint32(owner == HORDE && state == POINT_ASSAULTED); + data << uint32(BG_AV_NodeInfo[i].WorldStateIds.HordeControl) << uint32(owner == HORDE && state >= POINT_DESTROYED); } data << uint32(AV_SNOWFALL_N) << uint32(m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].Owner == AV_NEUTRAL_TEAM); - data << uint32(AV_Alliance_Score) << uint32(m_Team_Scores[0]); + data << uint32(AV_Alliance_Score) << uint32(m_Team_Scores[0]); data << uint32(AV_Horde_Score) << uint32(m_Team_Scores[1]); - if (GetStatus() == STATUS_IN_PROGRESS){ //only if game started the teamscores are displayed + if (GetStatus() == STATUS_IN_PROGRESS) { //only if game started the teamscores are displayed data << uint32(AV_SHOW_A_SCORE) << uint32(1); data << uint32(AV_SHOW_H_SCORE) << uint32(1); } @@ -1044,6 +2062,7 @@ void BattlegroundAV::FillInitialWorldStates(WorldPacket& data) data << uint32(AV_SHOW_A_SCORE) << uint32(0); data << uint32(AV_SHOW_H_SCORE) << uint32(0); } + SendMineWorldStates(AV_NORTH_MINE); SendMineWorldStates(AV_SOUTH_MINE); } @@ -1068,12 +2087,12 @@ void BattlegroundAV::UpdateNodeWorldState(BG_AV_Nodes node) void BattlegroundAV::SendMineWorldStates(uint32 mine) { ASSERT(mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE); -// currently i'm sure, that this works (: -// ASSERT(m_Mine_PrevOwner[mine] == ALLIANCE || m_Mine_PrevOwner[mine] == HORDE || m_Mine_PrevOwner[mine] == AV_NEUTRAL_TEAM); -// ASSERT(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE || m_Mine_Owner[mine] == AV_NEUTRAL_TEAM); + // currently i'm sure, that this works (: + // ASSERT(m_Mine_PrevOwner[mine] == ALLIANCE || m_Mine_PrevOwner[mine] == HORDE || m_Mine_PrevOwner[mine] == AV_NEUTRAL_TEAM); + // ASSERT(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE || m_Mine_Owner[mine] == AV_NEUTRAL_TEAM); uint8 owner, prevowner, mine2; //those variables are needed to access the right worldstate in the BG_AV_MineWorldStates array - mine2 = (mine == AV_NORTH_MINE)?0:1; + mine2 = (mine == AV_NORTH_MINE) ? 0 : 1; if (m_Mine_PrevOwner[mine] == ALLIANCE) prevowner = 0; else if (m_Mine_PrevOwner[mine] == HORDE) @@ -1094,24 +2113,25 @@ void BattlegroundAV::SendMineWorldStates(uint32 mine) WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveYard(Player* player) { - WorldSafeLocsEntry const* pGraveyard = NULL; - WorldSafeLocsEntry const* entry = NULL; + WorldSafeLocsEntry const* pGraveyard = nullptr; + WorldSafeLocsEntry const* entry = nullptr; float dist = 0; float minDist = 0; float x, y; player->GetPosition(x, y); - pGraveyard = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[GetTeamIndexByTeamId(player->GetTeam())+7]); - minDist = (pGraveyard->x - x)*(pGraveyard->x - x)+(pGraveyard->y - y)*(pGraveyard->y - y); + pGraveyard = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[AV_CPLACE_SPIRIT_MAIN_ALLIANCE + GetTeamIndexByTeamId(player->GetTeam())]); + minDist = (pGraveyard->x - x) * (pGraveyard->x - x) + (pGraveyard->y - y) * (pGraveyard->y - y); - for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) + for (uint32 i = BG_AV_NODES_AID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) + { if (m_Nodes[i].Owner == player->GetTeam() && m_Nodes[i].State == POINT_CONTROLED) { entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[i]); if (entry) { - dist = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y); + dist = (entry->x - x) * (entry->x - x) + (entry->y - y) * (entry->y - y); if (dist < minDist) { minDist = dist; @@ -1119,280 +2139,87 @@ WorldSafeLocsEntry const* BattlegroundAV::GetClosestGraveYard(Player* player) } } } + } + return pGraveyard; } bool BattlegroundAV::SetupBattleground() { // Create starting objects - if (// alliance gates - !AddObject(BG_AV_OBJECT_DOOR_A, BG_AV_OBJECTID_GATE_A, BG_AV_DoorPositons[0], 0, 0, std::sin(BG_AV_DoorPositons[0].GetOrientation()/2), std::cos(BG_AV_DoorPositons[0].GetOrientation()/2), RESPAWN_IMMEDIATELY) - // horde gates - || !AddObject(BG_AV_OBJECT_DOOR_H, BG_AV_OBJECTID_GATE_H, BG_AV_DoorPositons[1], 0, 0, std::sin(BG_AV_DoorPositons[1].GetOrientation()/2), std::cos(BG_AV_DoorPositons[1].GetOrientation()/2), RESPAWN_IMMEDIATELY)) + for (uint32 i = 0; i < BG_AV_OBJECT_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundAV: Failed to spawn some object Battleground not created!1"); - return false; - } - - //spawn node-objects - for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) - { - if (i <= BG_AV_NODES_FROSTWOLF_HUT) - { - if (!AddObject(i, BG_AV_OBJECTID_BANNER_A_B, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(i+11, BG_AV_OBJECTID_BANNER_CONT_A_B, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(i+33, BG_AV_OBJECTID_BANNER_H_B, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(i+22, BG_AV_OBJECTID_BANNER_CONT_H_B, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - //aura - || !AddObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_N, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_A, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+i*3, BG_AV_OBJECTID_AURA_H, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!2"); - return false; - } - } - else //towers + BattlegroundGOSpawnPoint const& object = BG_AV_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) { - if (i <= BG_AV_NODES_STONEHEART_BUNKER) //alliance towers - { - if (!AddObject(i, BG_AV_OBJECTID_BANNER_A, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(i+22, BG_AV_OBJECTID_BANNER_CONT_H, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_A, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_N, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_A, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_PH, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!3"); - return false; - } - } - else //horde towers - { - if (!AddObject(i+7, BG_AV_OBJECTID_BANNER_CONT_A, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(i+29, BG_AV_OBJECTID_BANNER_H, - BG_AV_ObjectPos[i], - 0, 0, std::sin(BG_AV_ObjectPos[i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_N, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_AURA_H, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_PA, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)), BG_AV_OBJECTID_TOWER_BANNER_H, - BG_AV_ObjectPos[i+8], - 0, 0, std::sin(BG_AV_ObjectPos[i+8].GetOrientation()/2), std::cos(BG_AV_ObjectPos[i+8].GetOrientation()/2), RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!4"); - return false; - } - } - for (uint8 j=0; j <= 9; j++) //burning aura - { - if (!AddObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j, - BG_AV_OBJECTID_FIRE, - BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j], - 0, - 0, - std::sin(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j].GetOrientation()/2), - std::cos(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j].GetOrientation()/2), - RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!5.%i", i); - return false; - } - } - } - } - for (uint8 i=0; i<2; i++) //burning aura for buildings - { - for (uint8 j=0; j <= 9; j++) - { - if (j<5) - { - if (!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j, - BG_AV_OBJECTID_SMOKE, - BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j], - 0, - 0, - std::sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2), - std::cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2), - RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!6.%i", i); - return false; - } - } - else - { - if (!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j, - BG_AV_OBJECTID_FIRE, - BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j], - 0, - 0, - std::sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2), - std::cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j].GetOrientation()/2), - RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!7.%i", i); - return false; - } - } - } - } - for (uint16 i= 0; i <= (BG_AV_OBJECT_MINE_SUPPLY_N_MAX-BG_AV_OBJECT_MINE_SUPPLY_N_MIN); i++) - { - if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_N_MIN+i, - BG_AV_OBJECTID_MINE_N, - BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i], - 0, - 0, - std::sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i].GetOrientation()/2), - std::cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i].GetOrientation()/2), - RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.5.%i", i); - return false; - } - } - for (uint16 i= 0; i <= (BG_AV_OBJECT_MINE_SUPPLY_S_MAX-BG_AV_OBJECT_MINE_SUPPLY_S_MIN); i++) - { - if (!AddObject(BG_AV_OBJECT_MINE_SUPPLY_S_MIN+i, - BG_AV_OBJECTID_MINE_S, - BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i], - 0, - 0, - std::sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i].GetOrientation()/2), - std::cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i].GetOrientation()/2), - RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some mine supplies Battleground not created!7.6.%i", i); - return false; - } - } - - if (!AddObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE, - BG_AV_OBJECTID_BANNER_SNOWFALL_N, - BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE], - 0, - 0, - std::sin(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE].GetOrientation()/2), - std::cos(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE].GetOrientation()/2), - RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!8"); - return false; - } - for (uint8 i = 0; i < 4; i++) - { - if (!AddObject(BG_AV_OBJECT_SNOW_EYECANDY_A+i, BG_AV_OBJECTID_SNOWFALL_CANDY_A, - BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i], - 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PA+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PA, - BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i], - 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_H+i, BG_AV_OBJECTID_SNOWFALL_CANDY_H, - BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i], - 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY) - || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PH+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PH, - BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i], - 0, 0, std::sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), std::cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i].GetOrientation()/2), RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "BatteGroundAV: Failed to spawn some object Battleground not created!9.%i", i); + TC_LOG_ERROR("bg.battleground", "BattleGroundAV: Failed to spawn GameObject (Entry: %u). Battleground not created!", object.Entry); return false; } } - uint16 i; TC_LOG_DEBUG("bg.battleground", "Alterac Valley: entering state STATUS_WAIT_JOIN ..."); // Initial Nodes - for (i = 0; i < BG_AV_OBJECT_MAX; i++) + for (uint32 i = 0; i < BG_AV_OBJECT_MAX; ++i) SpawnBGObject(i, RESPAWN_ONE_DAY); - for (i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE; i++) + for (uint32 i = BG_AV_OBJECT_FLAG_A_AID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE; ++i) { - SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+3*i, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_AURA_A_AID_STATION + GetNodeThroughObject(i), RESPAWN_IMMEDIATELY); SpawnBGObject(i, RESPAWN_IMMEDIATELY); } - for (i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER; i++) + for (uint32 i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); - for (i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER; i++) + for (uint32 i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER; ++i) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); if (i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT) - SpawnBGObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+3*GetNodeThroughObject(i), RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_AURA_H_AID_STATION + GetNodeThroughObject(i), RESPAWN_IMMEDIATELY); } - for (i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; i+=2) + for (uint32 i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; ++i) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag - SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura + SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH + (i - BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH), RESPAWN_IMMEDIATELY); //aura } - for (i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; i+=2) + for (uint32 i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; ++i) { SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag - SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura + SpawnBGObject(BG_AV_OBJECT_TAURA_H_ICEBLOOD_TOWER + (i - BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER), RESPAWN_IMMEDIATELY); //aura } //snowfall and the doors - for (i = BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; i <= BG_AV_OBJECT_DOOR_A; i++) - SpawnBGObject(i, RESPAWN_IMMEDIATELY); - - SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_N, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_DOOR_A, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_AV_OBJECT_DOOR_H, RESPAWN_IMMEDIATELY); + //creatures TC_LOG_DEBUG("bg.battleground", "BG_AV start poputlating nodes"); - for (BG_AV_Nodes n = BG_AV_NODES_FIRSTAID_STATION; n < BG_AV_NODES_MAX; ++n) + for (BG_AV_Nodes n = BG_AV_NODES_AID_STATION; n < BG_AV_NODES_MAX; ++n) { if (m_Nodes[n].Owner) PopulateNode(n); } + //all creatures which don't get despawned through the script are static TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning static creatures"); - for (i = 0; i < AV_STATICCPLACE_MAX; i++) + for (uint32 i = 0; i < AV_STATICCPLACE_MAX; ++i) AddAVCreature(0, i + AV_CPLACE_MAX); + //mainspiritguides: TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning spiritguides creatures"); - AddSpiritGuide(7, BG_AV_CreaturePos[7], TEAM_ALLIANCE); - AddSpiritGuide(8, BG_AV_CreaturePos[8], TEAM_HORDE); + AddSpiritGuide(AV_CPLACE_SPIRIT_MAIN_ALLIANCE, BG_AV_CreaturePos[AV_CPLACE_SPIRIT_MAIN_ALLIANCE], TEAM_ALLIANCE); + AddSpiritGuide(AV_CPLACE_SPIRIT_MAIN_HORDE, BG_AV_CreaturePos[AV_CPLACE_SPIRIT_MAIN_HORDE], TEAM_HORDE); + //spawn the marshals (those who get deleted, if a tower gets destroyed) TC_LOG_DEBUG("bg.battleground", "BG_AV: start spawning marshal creatures"); - for (i = AV_NPC_A_MARSHAL_SOUTH; i <= AV_NPC_H_MARSHAL_WTOWER; i++) + for (uint32 i = AV_NPC_A_MARSHAL_SOUTH; i <= AV_NPC_H_MARSHAL_WTOWER; ++i) AddAVCreature(i, AV_CPLACE_A_MARSHAL_SOUTH + (i - AV_NPC_A_MARSHAL_SOUTH)); + AddAVCreature(AV_NPC_HERALD, AV_CPLACE_HERALD); return true; } @@ -1419,8 +2246,11 @@ void BattlegroundAV::AssaultNode(BG_AV_Nodes node, uint16 team) TC_LOG_FATAL("bg.battleground", "Assault on an not assaulted node with total owner"); ABORT(); } - //the timer gets another time, if the previous owner was 0 == Neutral - m_Nodes[node].Timer = (m_Nodes[node].PrevOwner)? BG_AV_CAPTIME : BG_AV_SNOWFALL_FIRSTCAP; + + // the timer gets another time, if the previous owner was 0 == Neutral + // no longer true since Patch 2.3.0: + /// The time required for the first capture of Snowfall graveyard has been reduced from five minutes to four. + m_Nodes[node].Timer = BG_AV_CAPTIME; m_Nodes[node].PrevOwner = m_Nodes[node].Owner; m_Nodes[node].Owner = team; m_Nodes[node].PrevState = m_Nodes[node].State; @@ -1434,7 +2264,7 @@ void BattlegroundAV::DestroyNode(BG_AV_Nodes node) m_Nodes[node].TotalOwner = m_Nodes[node].Owner; m_Nodes[node].PrevOwner = m_Nodes[node].Owner; m_Nodes[node].PrevState = m_Nodes[node].State; - m_Nodes[node].State = (m_Nodes[node].Tower)? POINT_DESTROYED : POINT_CONTROLED; + m_Nodes[node].State = (m_Nodes[node].Tower) ? POINT_DESTROYED : POINT_CONTROLED; m_Nodes[node].Timer = 0; } @@ -1464,32 +2294,36 @@ void BattlegroundAV::DefendNode(BG_AV_Nodes node, uint16 team) void BattlegroundAV::ResetBGSubclass() { - for (uint8 i=0; i<2; i++) //forloop for both teams (it just make 0 == alliance and 1 == horde also for both mines 0=north 1=south + for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) //forloop for both teams (it just make 0 == alliance and 1 == horde also for both mines 0=north 1=south { - for (uint8 j=0; j<9; j++) - m_Team_QuestStatus[i][j]=0; - m_Team_Scores[i]=BG_AV_SCORE_INITIAL_POINTS; - m_IsInformedNearVictory[i]=false; + for (uint8 j = 0; j < 9; ++j) + m_Team_QuestStatus[i][j] = 0; + + m_Team_Scores[i] = BG_AV_SCORE_INITIAL_POINTS; + m_IsInformedNearVictory[i] = false; m_CaptainAlive[i] = true; - m_CaptainBuffTimer[i] = 120000 + urand(0, 4)* 60; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes @todo get the right times + m_CaptainBuffTimer[i] = urand(2, 6) * MINUTE * IN_MILLISECONDS; // as far as i could see, the buff is random so i make 2 minutes (that's the duration of the buff itself) + 0-4 minutes @todo get the right times m_Mine_Owner[i] = AV_NEUTRAL_TEAM; m_Mine_PrevOwner[i] = m_Mine_Owner[i]; } - for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves + for (BG_AV_Nodes i = BG_AV_NODES_AID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves InitNode(i, ALLIANCE, false); + for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers InitNode(i, ALLIANCE, true); + for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves InitNode(i, HORDE, false); + for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) //horde towers InitNode(i, HORDE, true); + InitNode(BG_AV_NODES_SNOWFALL_GRAVE, AV_NEUTRAL_TEAM, false); //give snowfall neutral owner - m_Mine_Timer=AV_MINE_TICK_TIMER; - for (uint16 i = 0; i < AV_CPLACE_MAX+AV_STATICCPLACE_MAX; i++) - if (BgCreatures[i]) - DelCreature(i); + m_Mine_Timer = AV_MINE_TICK_TIMER; + for (uint16 i = 0; i < AV_CPLACE_MAX + AV_STATICCPLACE_MAX; ++i) + DelCreature(i); } bool BattlegroundAV::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue) @@ -1498,7 +2332,7 @@ bool BattlegroundAV::CheckAchievementCriteriaMeet(uint32 criteriaId, Player cons switch (criteriaId) { case BG_CRITERIA_CHECK_EVERYTHING_COUNTS: - for (uint8 mine = 0; mine < 2; mine++) + for (uint8 mine = 0; mine < 2; ++mine) if (m_Mine_Owner[mine] != team) return false; @@ -1567,3 +2401,11 @@ uint32 BattlegroundAV::GetPrematureWinner() return Battleground::GetPrematureWinner(); } + +StaticNodeInfo const* BattlegroundAV::GetStaticNodeInfo(uint8 node) +{ + if (node >= BG_AV_NODES_MAX) + return nullptr; + + return &BG_AV_NodeInfo[node]; +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index 7967ae06718f3..edb50d6a27d52 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -21,34 +21,6 @@ #include "Battleground.h" #include "BattlegroundScore.h" -#include "Object.h" - -#define BG_AV_CAPTIME 240000 //4:00 -#define BG_AV_SNOWFALL_FIRSTCAP 300000 //5:00 but i also have seen 4:05 - -#define BG_AV_SCORE_INITIAL_POINTS 600 -#define SEND_MSG_NEAR_LOSE 120 - -#define BG_AV_KILL_BOSS 4 -#define BG_AV_REP_BOSS 350 - -#define BG_AV_KILL_CAPTAIN 3 -#define BG_AV_REP_CAPTAIN 125 -#define BG_AV_RES_CAPTAIN 100 - -#define BG_AV_KILL_TOWER 3 -#define BG_AV_REP_TOWER 12 -#define BG_AV_RES_TOWER 75 - -#define BG_AV_GET_COMMANDER 1 //for a safely returned wingcommander -//bonushonor at the end -#define BG_AV_KILL_SURVIVING_TOWER 2 -#define BG_AV_REP_SURVIVING_TOWER 12 - -#define BG_AV_KILL_SURVIVING_CAPTAIN 2 -#define BG_AV_REP_SURVIVING_CAPTAIN 125 - -#define BG_AV_EVENT_START_BATTLE 9166 // Achievement: The Alterac Blitz enum SharedActions { @@ -103,63 +75,158 @@ enum BG_AV_Sounds enum BG_AV_OTHER_VALUES { - AV_STATICCPLACE_MAX = 123, - AV_NORTH_MINE = 0, - AV_SOUTH_MINE = 1, - AV_MINE_TICK_TIMER = 45000, - AV_MINE_RECLAIM_TIMER = 1200000, /// @todo: get the right value.. this is currently 20 minutes - AV_NEUTRAL_TEAM = 0 //this is the neutral owner of snowfall + BG_AV_CAPTIME = 4 * MINUTE * IN_MILLISECONDS, + + BG_AV_SCORE_INITIAL_POINTS = 600, + SEND_MSG_NEAR_LOSE = 120, + + BG_AV_KILL_BOSS = 4, + BG_AV_REP_BOSS = 350, + + BG_AV_KILL_CAPTAIN = 3, + BG_AV_REP_CAPTAIN = 125, + BG_AV_RES_CAPTAIN = 100, + + BG_AV_KILL_TOWER = 3, + BG_AV_REP_TOWER = 12, + BG_AV_RES_TOWER = 75, + + BG_AV_GET_COMMANDER = 1, //for a safely returned wingcommander + + //bonus honor at the end + BG_AV_KILL_SURVIVING_TOWER = 2, + BG_AV_REP_SURVIVING_TOWER = 12, + + BG_AV_KILL_SURVIVING_CAPTAIN = 2, + BG_AV_REP_SURVIVING_CAPTAIN = 125, + + BG_AV_EVENT_START_BATTLE = 9166, // Achievement: The Alterac Blitz + + AV_STATICCPLACE_MAX = 123, + AV_NORTH_MINE = 0, + AV_SOUTH_MINE = 1, + AV_MINE_TICK_TIMER = 45000, + AV_MINE_RECLAIM_TIMER = 20 * MINUTE * IN_MILLISECONDS, /// @todo: get the right value + AV_NEUTRAL_TEAM = 0 //this is the neutral owner of snowfall }; + enum BG_AV_ObjectIds { - //cause the mangos-system is a bit different, we don't use the right go-ids for every node.. if we want to be 100% like another big server, we must take one object for every node - //snowfall 4flags as eyecandy 179424 (alliance neutral) - //Banners - stolen from battleground_AB.h ;-) - BG_AV_OBJECTID_BANNER_A = 178925, // can only be used by horde - BG_AV_OBJECTID_BANNER_H = 178943, // can only be used by alliance - BG_AV_OBJECTID_BANNER_CONT_A = 178940, // can only be used by horde - BG_AV_OBJECTID_BANNER_CONT_H = 179435, // can only be used by alliance - - BG_AV_OBJECTID_BANNER_A_B = 178365, - BG_AV_OBJECTID_BANNER_H_B = 178364, - BG_AV_OBJECTID_BANNER_CONT_A_B = 179286, - BG_AV_OBJECTID_BANNER_CONT_H_B = 179287, - BG_AV_OBJECTID_BANNER_SNOWFALL_N = 180418, + BG_AV_OBJECTID_BANNER_A_AID_STATION = 179465, // can only be used by horde + BG_AV_OBJECTID_BANNER_A_STORMPIKE = 178389, + BG_AV_OBJECTID_BANNER_A_STONEHEARTH_GRAVE = 179284, + BG_AV_OBJECTID_BANNER_A_SNOWFALL_GRAVE = 178365, + BG_AV_OBJECTID_BANNER_A_ICEBLOOD_GRAVE = 179481, + BG_AV_OBJECTID_BANNER_A_FROSTWOLF_GRAVE = 178394, + BG_AV_OBJECTID_BANNER_A_FROSTWOLF_HUT = 179470, + BG_AV_OBJECTID_BANNER_A_DUN_BALDAR_S = 178925, + BG_AV_OBJECTID_BANNER_A_DUN_BALDAR_N = 178929, + BG_AV_OBJECTID_BANNER_A_ICEWING_BUNKER = 178935, + BG_AV_OBJECTID_BANNER_A_STONEHEARTH_BUNKER = 178936, + + BG_AV_OBJECTID_BANNER_H_AID_STATION = 179467, // can only be used by alliance + BG_AV_OBJECTID_BANNER_H_STORMPIKE = 178388, + BG_AV_OBJECTID_BANNER_H_STONEHEARTH_GRAVE = 179285, + BG_AV_OBJECTID_BANNER_H_SNOWFALL = 178364, + BG_AV_OBJECTID_BANNER_H_ICEBLOOD_GRAVE = 179483, + BG_AV_OBJECTID_BANNER_H_FROSTWOLF_GRAVE = 178393, + BG_AV_OBJECTID_BANNER_H_FROSTWOLF_HUT = 179472, + BG_AV_OBJECTID_BANNER_H_ICEBLOOD_GARRISON = 178946, + BG_AV_OBJECTID_BANNER_H_TOWER_POINT = 178945, + BG_AV_OBJECTID_BANNER_H_FROSTWOLF_E = 178944, + BG_AV_OBJECTID_BANNER_H_FROSTWOLF_W = 178943, + + BG_AV_OBJECTID_BANNER_CONT_A_AID_STATION = 179466, // can only be used by horde + BG_AV_OBJECTID_BANNER_CONT_A_STORMPIKE = 179286, + BG_AV_OBJECTID_BANNER_CONT_A_STONEHEARTH_GRAVE = 179308, + BG_AV_OBJECTID_BANNER_CONT_A_SNOWFALL = 180419, + BG_AV_OBJECTID_BANNER_CONT_A_ICEBLOOD_GRAVE = 179482, + BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_GRAVE = 179304, + BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_HUT = 179471, + BG_AV_OBJECTID_BANNER_CONT_A_ICEBLOOD_GARRISON = 178940, + BG_AV_OBJECTID_BANNER_CONT_A_TOWER_POINT = 179453, + BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_E = 179449, + BG_AV_OBJECTID_BANNER_CONT_A_FROSTWOLF_W = 179445, + + BG_AV_OBJECTID_BANNER_CONT_H_AID_STATION = 179468, // can only be used by alliance + BG_AV_OBJECTID_BANNER_CONT_H_STORMPIKE = 179287, + BG_AV_OBJECTID_BANNER_CONT_H_STONEHEARTH_GRAVE = 179310, + BG_AV_OBJECTID_BANNER_CONT_H_SNOWFALL = 180420, + BG_AV_OBJECTID_BANNER_CONT_H_ICEBLOOD_GRAVE = 179484, + BG_AV_OBJECTID_BANNER_CONT_H_FROSTWOLF_GRAVE = 179305, + BG_AV_OBJECTID_BANNER_CONT_H_FROSTWOLF_HUT = 179473, + BG_AV_OBJECTID_BANNER_CONT_H_DUN_BALDAR_S = 179435, + BG_AV_OBJECTID_BANNER_CONT_H_DUN_BALDAR_N = 179439, + BG_AV_OBJECTID_BANNER_CONT_H_ICEWING_BUNKER = 179441, + BG_AV_OBJECTID_BANNER_CONT_H_STONEHEARTH_BUNKER = 179443, + + BG_AV_OBJECTID_BANNER_SNOWFALL_N = 180418, //snowfall eyecandy banner: - BG_AV_OBJECTID_SNOWFALL_CANDY_A = 179044, - BG_AV_OBJECTID_SNOWFALL_CANDY_PA = 179424, - BG_AV_OBJECTID_SNOWFALL_CANDY_H = 179064, - BG_AV_OBJECTID_SNOWFALL_CANDY_PH = 179425, + BG_AV_OBJECTID_SNOWFALL_CANDY_A = 179044, + BG_AV_OBJECTID_SNOWFALL_CANDY_PA = 179424, + BG_AV_OBJECTID_SNOWFALL_CANDY_H = 179064, + BG_AV_OBJECTID_SNOWFALL_CANDY_PH = 179425, //banners on top of towers: - BG_AV_OBJECTID_TOWER_BANNER_A = 178927, //[PH] Alliance A1 Tower Banner BIG - BG_AV_OBJECTID_TOWER_BANNER_H = 178955, //[PH] Horde H1 Tower Banner BIG - BG_AV_OBJECTID_TOWER_BANNER_PA = 179446, //[PH] Alliance H1 Tower Pre-Banner BIG - BG_AV_OBJECTID_TOWER_BANNER_PH = 179436, //[PH] Horde A1 Tower Pre-Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_A = 178927, // [PH] Alliance A1 Tower Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_A_B = 178932, // [PH] Alliance A2 Tower Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_A_C = 178947, // [PH] Alliance A3 Tower Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_A_D = 178948, // [PH] Alliance A4 Tower Banner BIG + + BG_AV_OBJECTID_TOWER_BANNER_H = 178955, // [PH] Horde H1 Tower Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_H_B = 178956, // [PH] Horde H2 Tower Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_H_C = 178957, // [PH] Horde H3 Tower Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_H_D = 178958, // [PH] Horde H4 Tower Banner BIG + + BG_AV_OBJECTID_TOWER_BANNER_PA = 179446, // [PH] Alliance H1 Tower Pre - Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_PA_B = 179450, // [PH] Alliance H2 Tower Pre - Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_PA_C = 179454, // [PH] Alliance H3 Tower Pre - Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_PA_D = 179458, // [PH] Alliance H4 Tower Pre - Banner BIG + + BG_AV_OBJECTID_TOWER_BANNER_PH = 179436, // [PH] Horde A1 Tower Pre - Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_PH_B = 179440, // [PH] Horde A2 Tower Pre - Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_PH_C = 179442, // [PH] Horde A3 Tower Pre - Banner BIG + BG_AV_OBJECTID_TOWER_BANNER_PH_D = 179444, // [PH] Horde A4 Tower Pre - Banner BIG //Auras - BG_AV_OBJECTID_AURA_A = 180421, - BG_AV_OBJECTID_AURA_H = 180422, - BG_AV_OBJECTID_AURA_N = 180423, - BG_AV_OBJECTID_AURA_A_S = 180100, - BG_AV_OBJECTID_AURA_H_S = 180101, - BG_AV_OBJECTID_AURA_N_S = 180102, + BG_AV_OBJECTID_AURA_A = 180421, + BG_AV_OBJECTID_AURA_H = 180422, + BG_AV_OBJECTID_AURA_N = 180423, + BG_AV_OBJECTID_AURA_A_S = 180100, + BG_AV_OBJECTID_AURA_H_S = 180101, + BG_AV_OBJECTID_AURA_N_S = 180102, - BG_AV_OBJECTID_GATE_A = 180424, - BG_AV_OBJECTID_GATE_H = 180424, + BG_AV_OBJECTID_GATE = 180424, + BG_AV_GHOST_GATE = 180322, //mine supplies - BG_AV_OBJECTID_MINE_N = 178785, - BG_AV_OBJECTID_MINE_S = 178784, + BG_AV_OBJECTID_MINE_N = 178785, + BG_AV_OBJECTID_MINE_S = 178784, - BG_AV_OBJECTID_FIRE = 179065, - BG_AV_OBJECTID_SMOKE = 179066 + BG_AV_OBJECTID_FIRE = 179065, + BG_AV_OBJECTID_SMOKE = 179066 +}; + +enum BG_AV_Destructible_Buildings +{ + BG_AV_DESTRUCTIBLE_DUNBALDAR_SOUTH = 0, + BG_AV_DESTRUCTIBLE_DUNBALDAR_NORTH = 1, + BG_AV_DESTRUCTIBLE_ICEWING_BUNKER = 2, + BG_AV_DESTRUCTIBLE_STONEHEART_BUNKER = 3, + BG_AV_DESTRUCTIBLE_ICEBLOOD_TOWER = 4, + BG_AV_DESTRUCTIBLE_TOWER_POINT = 5, + BG_AV_DESTRUCTIBLE_FROSTWOLF_ETOWER = 6, + BG_AV_DESTRUCTIBLE_FROSTWOLF_WTOWER = 7, + BG_AV_DESTRUCTIBLE_BUILDING_ALLIANCE = 8, + BG_AV_DESTRUCTIBLE_BUILDING_HORDE = 9, + + BG_AV_DESTRUCTIBLE_MAX = 10 }; enum BG_AV_Nodes { - BG_AV_NODES_FIRSTAID_STATION = 0, + BG_AV_NODES_AID_STATION = 0, BG_AV_NODES_STORMPIKE_GRAVE = 1, BG_AV_NODES_STONEHEART_GRAVE = 2, BG_AV_NODES_SNOWFALL_GRAVE = 3, @@ -180,361 +247,159 @@ enum BG_AV_Nodes enum BG_AV_ObjectTypes { - BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION = 0, - BG_AV_OBJECT_FLAG_A_STORMPIKE_GRAVE = 1, - BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE = 2, - BG_AV_OBJECT_FLAG_A_SNOWFALL_GRAVE = 3, - BG_AV_OBJECT_FLAG_A_ICEBLOOD_GRAVE = 4, - BG_AV_OBJECT_FLAG_A_FROSTWOLF_GRAVE = 5, - BG_AV_OBJECT_FLAG_A_FROSTWOLF_HUT = 6, - BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH = 7, - BG_AV_OBJECT_FLAG_A_DUNBALDAR_NORTH = 8, - BG_AV_OBJECT_FLAG_A_ICEWING_BUNKER = 9, - BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER = 10, - - BG_AV_OBJECT_FLAG_C_A_FIRSTAID_STATION = 11, - BG_AV_OBJECT_FLAG_C_A_STORMPIKE_GRAVE = 12, - BG_AV_OBJECT_FLAG_C_A_STONEHEART_GRAVE = 13, - BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE = 14, - BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_GRAVE = 15, - BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_GRAVE = 16, - BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT = 17, - BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_TOWER = 18, - BG_AV_OBJECT_FLAG_C_A_TOWER_POINT = 19, - BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_ETOWER = 20, - BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER = 21, - - BG_AV_OBJECT_FLAG_C_H_FIRSTAID_STATION = 22, - BG_AV_OBJECT_FLAG_C_H_STORMPIKE_GRAVE = 23, - BG_AV_OBJECT_FLAG_C_H_STONEHEART_GRAVE = 24, - BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE = 25, - BG_AV_OBJECT_FLAG_C_H_ICEBLOOD_GRAVE = 26, - BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_GRAVE = 27, - BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_HUT = 28, - BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_SOUTH = 29, - BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_NORTH = 30, - BG_AV_OBJECT_FLAG_C_H_ICEWING_BUNKER = 31, - BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER = 32, - - BG_AV_OBJECT_FLAG_H_FIRSTAID_STATION = 33, - BG_AV_OBJECT_FLAG_H_STORMPIKE_GRAVE = 34, - BG_AV_OBJECT_FLAG_H_STONEHEART_GRAVE = 35, - BG_AV_OBJECT_FLAG_H_SNOWFALL_GRAVE = 36, - BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE = 37, - BG_AV_OBJECT_FLAG_H_FROSTWOLF_GRAVE = 38, - BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT = 39, - BG_AV_OBJECT_FLAG_H_ICEBLOOD_TOWER = 40, - BG_AV_OBJECT_FLAG_H_TOWER_POINT = 41, - BG_AV_OBJECT_FLAG_H_FROSTWOLF_ETOWER = 42, - BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER = 43, - - BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE = 44, - - BG_AV_OBJECT_DOOR_H = 45, - BG_AV_OBJECT_DOOR_A = 46, -//auras for graveyards (3auras per graveyard neutral, alliance, horde) - BG_AV_OBJECT_AURA_N_FIRSTAID_STATION = 47, - BG_AV_OBJECT_AURA_A_FIRSTAID_STATION = 48, - BG_AV_OBJECT_AURA_H_FIRSTAID_STATION = 49, - BG_AV_OBJECT_AURA_N_STORMPIKE_GRAVE = 50, - BG_AV_OBJECT_AURA_A_STORMPIKE_GRAVE = 51, - BG_AV_OBJECT_AURA_H_STORMPIKE_GRAVE = 52, - BG_AV_OBJECT_AURA_N_STONEHEART_GRAVE = 53, - BG_AV_OBJECT_AURA_A_STONEHEART_GRAVE = 54, - BG_AV_OBJECT_AURA_H_STONEHEART_GRAVE = 55, - BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE = 56, - BG_AV_OBJECT_AURA_A_SNOWFALL_GRAVE = 57, - BG_AV_OBJECT_AURA_H_SNOWFALL_GRAVE = 58, - BG_AV_OBJECT_AURA_N_ICEBLOOD_GRAVE = 59, - BG_AV_OBJECT_AURA_A_ICEBLOOD_GRAVE = 60, - BG_AV_OBJECT_AURA_H_ICEBLOOD_GRAVE = 61, - BG_AV_OBJECT_AURA_N_FROSTWOLF_GRAVE = 62, - BG_AV_OBJECT_AURA_A_FROSTWOLF_GRAVE = 63, - BG_AV_OBJECT_AURA_H_FROSTWOLF_GRAVE = 64, - BG_AV_OBJECT_AURA_N_FROSTWOLF_HUT = 65, - BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT = 66, - BG_AV_OBJECT_AURA_H_FROSTWOLF_HUT = 67, - - //big flags on top of towers 2 flags on each (contested, (alliance | horde)) + 2 auras - BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH = 67, - BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH = 68, - BG_AV_OBJECT_TFLAG_A_DUNBALDAR_NORTH = 69, - BG_AV_OBJECT_TFLAG_H_DUNBALDAR_NORTH = 70, - BG_AV_OBJECT_TFLAG_A_ICEWING_BUNKER = 71, - BG_AV_OBJECT_TFLAG_H_ICEWING_BUNKER = 72, - BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER = 73, - BG_AV_OBJECT_TFLAG_H_STONEHEART_BUNKER = 74, - BG_AV_OBJECT_TFLAG_A_ICEBLOOD_TOWER = 75, - BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER = 76, - BG_AV_OBJECT_TFLAG_A_TOWER_POINT = 77, - BG_AV_OBJECT_TFLAG_H_TOWER_POINT = 78, - BG_AV_OBJECT_TFLAG_A_FROSTWOLF_ETOWER = 79, - BG_AV_OBJECT_TFLAG_H_FROSTWOLF_ETOWER = 80, - BG_AV_OBJECT_TFLAG_A_FROSTWOLF_WTOWER = 81, - BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER = 82, - BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH = 83, - BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH = 84, - BG_AV_OBJECT_TAURA_A_DUNBALDAR_NORTH = 85, - BG_AV_OBJECT_TAURA_H_DUNBALDAR_NORTH = 86, - BG_AV_OBJECT_TAURA_A_ICEWING_BUNKER = 87, - BG_AV_OBJECT_TAURA_H_ICEWING_BUNKER = 88, - BG_AV_OBJECT_TAURA_A_STONEHEART_BUNKER = 89, - BG_AV_OBJECT_TAURA_H_STONEHEART_BUNKER = 90, - BG_AV_OBJECT_TAURA_A_ICEBLOOD_TOWER = 91, - BG_AV_OBJECT_TAURA_H_ICEBLOOD_TOWER = 92, - BG_AV_OBJECT_TAURA_A_TOWER_POINT = 93, - BG_AV_OBJECT_TAURA_H_TOWER_POINT = 94, - BG_AV_OBJECT_TAURA_A_FROSTWOLF_ETOWER = 95, - BG_AV_OBJECT_TAURA_H_FROSTWOLF_ETOWER = 96, - BG_AV_OBJECT_TAURA_A_FROSTWOLF_WTOWER = 97, - BG_AV_OBJECT_TAURA_H_FROSTWOLF_WTOWER = 98, - - BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH = 99, - BG_AV_OBJECT_BURN_DUNBALDAR_NORTH = 109, - BG_AV_OBJECT_BURN_ICEWING_BUNKER = 119, - BG_AV_OBJECT_BURN_STONEHEART_BUNKER = 129, - BG_AV_OBJECT_BURN_ICEBLOOD_TOWER = 139, - BG_AV_OBJECT_BURN_TOWER_POINT = 149, - BG_AV_OBJECT_BURN_FROSTWOLF_ETWOER = 159, - BG_AV_OBJECT_BURN_FROSTWOLF_WTOWER = 169, - BG_AV_OBJECT_BURN_BUILDING_ALLIANCE = 179, - BG_AV_OBJECT_BURN_BUILDING_HORDE = 189, - BG_AV_OBJECT_SNOW_EYECANDY_A = 199, - BG_AV_OBJECT_SNOW_EYECANDY_PA = 203, - BG_AV_OBJECT_SNOW_EYECANDY_H = 207, - BG_AV_OBJECT_SNOW_EYECANDY_PH = 211, - BG_AV_OBJECT_MINE_SUPPLY_N_MIN = 215, - BG_AV_OBJECT_MINE_SUPPLY_N_MAX = 224, - BG_AV_OBJECT_MINE_SUPPLY_S_MIN = 225, - BG_AV_OBJECT_MINE_SUPPLY_S_MAX = 236, - - BG_AV_OBJECT_MAX = 237 -}; - -enum BG_AV_OBJECTS -{ - AV_OPLACE_FIRSTAID_STATION = 0, - AV_OPLACE_STORMPIKE_GRAVE = 1, - AV_OPLACE_STONEHEART_GRAVE = 2, - AV_OPLACE_SNOWFALL_GRAVE = 3, - AV_OPLACE_ICEBLOOD_GRAVE = 4, - AV_OPLACE_FROSTWOLF_GRAVE = 5, - AV_OPLACE_FROSTWOLF_HUT = 6, - AV_OPLACE_DUNBALDAR_SOUTH = 7, - AV_OPLACE_DUNBALDAR_NORTH = 8, - AV_OPLACE_ICEWING_BUNKER = 9, - AV_OPLACE_STONEHEART_BUNKER = 10, - AV_OPLACE_ICEBLOOD_TOWER = 11, - AV_OPLACE_TOWER_POINT = 12, - AV_OPLACE_FROSTWOLF_ETOWER = 13, - AV_OPLACE_FROSTWOLF_WTOWER = 14, - AV_OPLACE_BIGBANNER_DUNBALDAR_SOUTH = 15, - AV_OPLACE_BIGBANNER_DUNBALDAR_NORTH = 16, - AV_OPLACE_BIGBANNER_ICEWING_BUNKER = 17, - AV_OPLACE_BIGBANNER_STONEHEART_BUNKER = 18, - AV_OPLACE_BIGBANNER_ICEBLOOD_TOWER = 19, - AV_OPLACE_BIGBANNER_TOWER_POINT = 20, - AV_OPLACE_BIGBANNER_FROSTWOLF_ETOWER = 21, - AV_OPLACE_BIGBANNER_FROSTWOLF_WTOWER = 22, - - AV_OPLACE_BURN_DUNBALDAR_SOUTH = 23, - AV_OPLACE_BURN_DUNBALDAR_NORTH = 33, - AV_OPLACE_BURN_ICEWING_BUNKER = 43, - AV_OPLACE_BURN_STONEHEART_BUNKER = 53, - AV_OPLACE_BURN_ICEBLOOD_TOWER = 63, - AV_OPLACE_BURN_TOWER_POINT = 73, - AV_OPLACE_BURN_FROSTWOLF_ETOWER = 83, - AV_OPLACE_BURN_FROSTWOLF_WTOWER = 93, - AV_OPLACE_BURN_BUILDING_A = 103, - AV_OPLACE_BURN_BUILDING_H = 113, - AV_OPLACE_SNOW_1 = 123, - AV_OPLACE_SNOW_2 = 124, - AV_OPLACE_SNOW_3 = 125, - AV_OPLACE_SNOW_4 = 126, - AV_OPLACE_MINE_SUPPLY_N_MIN = 127, - AV_OPLACE_MINE_SUPPLY_N_MAX = 136, - AV_OPLACE_MINE_SUPPLY_S_MIN = 137, - AV_OPLACE_MINE_SUPPLY_S_MAX = 148, - - AV_OPLACE_MAX = 149 -}; + BG_AV_OBJECT_DOOR_A = 0, + BG_AV_OBJECT_DOOR_H = 1, + BG_AV_GHOST_GATE_A = 2, + BG_AV_GHOST_GATE_H = 3, + + BG_AV_OBJECT_FLAG_A_AID_STATION = 4, + BG_AV_OBJECT_FLAG_A_STORMPIKE_GRAVE = 5, + BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE = 6, + BG_AV_OBJECT_FLAG_A_SNOWFALL_GRAVE = 7, + BG_AV_OBJECT_FLAG_A_ICEBLOOD_GRAVE = 8, + BG_AV_OBJECT_FLAG_A_FROSTWOLF_GRAVE = 9, + BG_AV_OBJECT_FLAG_A_FROSTWOLF_HUT = 10, + BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH = 11, + BG_AV_OBJECT_FLAG_A_DUNBALDAR_NORTH = 12, + BG_AV_OBJECT_FLAG_A_ICEWING_BUNKER = 13, + BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER = 14, + + BG_AV_OBJECT_FLAG_C_A_AID_STATION = 15, + BG_AV_OBJECT_FLAG_C_A_STORMPIKE_GRAVE = 16, + BG_AV_OBJECT_FLAG_C_A_STONEHEART_GRAVE = 17, + BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE = 18, + BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_GRAVE = 19, + BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_GRAVE = 20, + BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT = 21, + BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_TOWER = 22, + BG_AV_OBJECT_FLAG_C_A_TOWER_POINT = 23, + BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_ETOWER = 24, + BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER = 25, + + BG_AV_OBJECT_FLAG_C_H_AID_STATION = 26, + BG_AV_OBJECT_FLAG_C_H_STORMPIKE_GRAVE = 27, + BG_AV_OBJECT_FLAG_C_H_STONEHEART_GRAVE = 28, + BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE = 29, + BG_AV_OBJECT_FLAG_C_H_ICEBLOOD_GRAVE = 30, + BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_GRAVE = 31, + BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_HUT = 32, + BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_SOUTH = 33, + BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_NORTH = 34, + BG_AV_OBJECT_FLAG_C_H_ICEWING_BUNKER = 35, + BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER = 36, + + BG_AV_OBJECT_FLAG_H_AID_STATION = 37, + BG_AV_OBJECT_FLAG_H_STORMPIKE_GRAVE = 38, + BG_AV_OBJECT_FLAG_H_STONEHEART_GRAVE = 39, + BG_AV_OBJECT_FLAG_H_SNOWFALL_GRAVE = 40, + BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE = 41, + BG_AV_OBJECT_FLAG_H_FROSTWOLF_GRAVE = 42, + BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT = 43, + BG_AV_OBJECT_FLAG_H_ICEBLOOD_TOWER = 44, + BG_AV_OBJECT_FLAG_H_TOWER_POINT = 45, + BG_AV_OBJECT_FLAG_H_FROSTWOLF_ETOWER = 46, + BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER = 47, + + BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE = 48, -Position const BG_AV_ObjectPos[AV_OPLACE_MAX] = -{ - {638.592f, -32.422f, 46.0608f, -1.62316f }, //firstaid station - {669.007f, -294.078f, 30.2909f, 2.77507f }, //stormpike - {77.8013f, -404.7f, 46.7549f, -0.872665f }, //stone grave - {-202.581f, -112.73f, 78.4876f, -0.715585f }, //snowfall - {-611.962f, -396.17f, 60.8351f, 2.53682f}, //iceblood grave - {-1082.45f, -346.823f, 54.9219f, -1.53589f }, //frostwolf grave - {-1402.21f, -307.431f, 89.4424f, 0.191986f }, //frostwolf hut - {553.779f, -78.6566f, 51.9378f, -1.22173f }, //dunnbaldar south - {674.001f, -143.125f, 63.6615f, 0.994838f }, //dunbaldar north - {203.281f, -360.366f, 56.3869f, -0.925024f }, //icew - {-152.437f, -441.758f, 40.3982f, -1.95477f }, //stone - {-571.88f, -262.777f, 75.0087f, -0.802851f }, //ice tower - {-768.907f, -363.71f, 90.8949f, 1.07991f}, //tower point - {-1302.9f, -316.981f, 113.867f, 2.00713f }, //frostwolf etower - {-1297.5f, -266.767f, 114.15f, 3.31044f}, //frostwolf wtower - //bigbanner: - {555.848f, -84.4151f, 64.4397f, 3.12414f }, //duns - {679.339f, -136.468f, 73.9626f, -2.16421f }, //dunn - {208.973f, -365.971f, 66.7409f, -0.244346f }, //icew - {-155.832f, -449.401f, 52.7306f, 0.610865f }, //stone - {-572.329f, -262.476f, 88.6496f, -0.575959f }, //icetower - {-768.199f, -363.105f, 104.537f, 0.10472f }, //towerp - {-1302.84f, -316.582f, 127.516f, 0.122173f }, //etower - {-1297.87f, -266.762f, 127.796f, 0.0698132f }, //wtower - //burning auras towers have 9*179065 captain-buildings have 5*179066+5*179065 - //dunns - {562.632f, -88.1815f, 61.993f, 0.383972f }, - {562.523f, -74.5028f, 37.9474f, -0.0523599f }, - {558.097f, -70.9842f, 52.4876f, 0.820305f }, - {578.167f, -71.8191f, 38.1514f, 2.72271f }, - {556.028f, -94.9242f, 44.8191f, 3.05433f }, - {572.451f, -94.3655f, 37.9443f, -1.72788f }, - {549.263f, -79.3645f, 44.8191f, 0.436332f }, - {543.513f, -94.4006f, 52.4819f, 0.0349066f }, - {572.149f, -93.7862f, 52.5726f, 0.541052f }, - {582.162f, -81.2375f, 37.9216f, 0.0872665f }, - //dunn - {664.797f, -143.65f, 64.1784f, -0.453786f}, - {664.505f, -139.452f, 49.6696f, -0.0349067f}, - {676.067f, -124.319f, 49.6726f, -1.01229f}, - {693.004f, -144.025f, 64.1755f, 2.44346f}, - {661.175f, -117.691f, 49.645f, 1.91986f}, - {684.423f, -146.582f, 63.6662f, 0.994838f}, - {682.791f, -127.769f, 62.4155f, 1.09956f}, - {674.576f, -147.101f, 56.5425f, -1.6057f}, - {655.719f, -126.673f, 49.8138f, 2.80998f}, - {0, 0, 0, 0}, - //icew - {231.503f, -356.688f, 42.3704f, 0.296706f}, - {224.989f, -348.175f, 42.5607f, 1.50098f}, - {205.782f, -351.335f, 56.8998f, 1.01229f}, - {196.605f, -369.187f, 56.3914f, 2.46091f}, - {210.619f, -376.938f, 49.2677f, 2.86234f}, - {209.647f, -352.632f, 42.3959f, -0.698132f}, - {220.65f, -368.132f, 42.3978f, -0.2618f}, - {224.682f, -374.031f, 57.0679f, 0.541052f}, - {200.26f, -359.968f, 49.2677f, -2.89725f}, - {196.619f, -378.016f, 56.9131f, 1.01229f}, - //stone - {-155.488f, -437.356f, 33.2796f, 2.60054f}, - {-163.441f, -454.188f, 33.2796f, 1.93732f}, - {-143.977f, -445.148f, 26.4097f, -1.8675f}, - {-135.764f, -464.708f, 26.3823f, 2.25147f}, - {-154.076f, -466.929f, 41.0636f, -1.8675f}, - {-149.908f, -460.332f, 26.4083f, -2.09439f}, - {-151.638f, -439.521f, 40.3797f, 0.436332f}, - {-131.301f, -454.905f, 26.5771f, 2.93215f}, - {-171.291f, -444.684f, 40.9211f, 2.30383f}, - {-143.591f, -439.75f, 40.9275f, -1.72788f}, - //iceblood - {-572.667f, -267.923f, 56.8542f, 2.35619f}, - {-561.021f, -262.689f, 68.4589f, 1.37881f}, - {-572.538f, -262.649f, 88.6197f, 1.8326f}, - {-574.77f, -251.45f, 74.9422f, -1.18682f}, - {-578.625f, -267.571f, 68.4696f, 0.506145f}, - {-571.476f, -257.234f, 63.3223f, 3.10669f}, - {-566.035f, -273.907f, 52.9582f, -0.890118f}, - {-580.948f, -259.77f, 68.4696f, 1.46608f}, - {-568.318f, -267.1f, 75.0008f, 1.01229f}, - {-559.621f, -268.597f, 52.8986f, 0.0523599f}, - //towerp - {-776.072f, -368.046f, 84.3558f, 2.63545f}, - {-777.564f, -368.521f, 90.6701f, 1.72788f}, - {-765.461f, -357.711f, 90.888f, 0.314159f}, - {-768.763f, -362.735f, 104.612f, 1.81514f}, - {-760.356f, -358.896f, 84.3558f, 2.1293f}, - {-771.967f, -352.838f, 84.3484f, 1.74533f}, - {-773.333f, -364.653f, 79.2351f, -1.64061f}, - {-764.109f, -366.069f, 70.0934f, 0.383972f}, - {-767.103f, -350.737f, 68.7933f, 2.80998f}, - {-760.115f, -353.845f, 68.8633f, 1.79769f}, - //froste - {-1304.87f, -304.525f, 91.8366f, -0.680679f}, - {-1301.77f, -310.974f, 95.8252f, 0.907571f}, - {-1305.58f, -320.625f, 102.166f, -0.558505f}, - {-1294.27f, -323.468f, 113.893f, -1.67552f}, - {-1302.65f, -317.192f, 127.487f, 2.30383f}, - {-1293.89f, -313.478f, 107.328f, 1.6057f}, - {-1312.41f, -312.999f, 107.328f, 1.5708f}, - {-1311.57f, -308.08f, 91.7666f, -1.85005f}, - {-1314.7f, -322.131f, 107.36f, 0.645772f}, - {-1304.6f, -310.754f, 113.859f, -0.401426f}, - //frostw - {-1308.24f, -273.26f, 92.0514f, -0.139626f}, - {-1302.26f, -262.858f, 95.9269f, 0.418879f}, - {-1297.28f, -267.773f, 126.756f, 2.23402f}, - {-1299.08f, -256.89f, 114.108f, -2.44346f}, - {-1303.41f, -268.237f, 114.151f, -1.23918f}, - {-1304.43f, -273.682f, 107.612f, 0.244346f}, - {-1309.53f, -265.951f, 92.1418f, -2.49582f}, - {-1295.55f, -263.865f, 105.033f, 0.925024f}, - {-1294.71f, -281.466f, 107.664f, -1.50098f}, - {-1289.69f, -259.521f, 107.612f, -2.19912f}, - - //the two buildings of the captains - //alliance - {-64.4987f, -289.33f, 33.4616f, -2.82743f}, - {-5.98025f, -326.144f, 38.8538f, 0}, - {-2.67893f, -306.998f, 33.4165f, 0}, - {-60.25f, -309.232f, 50.2408f, -1.46608f}, - {-48.7941f, -266.533f, 47.7916f, 2.44346f}, - {-3.40929f, -306.288f, 33.34f, 0}, - {-48.619f, -266.917f, 47.8168f, 0}, - {-62.9474f, -286.212f, 66.7288f, 0}, - {-5.05132f, -325.323f, 38.8536f, 0}, - {-64.2677f, -289.412f, 33.469f, 0}, -//horde - {-524.276f, -199.6f, 82.8733f, -1.46608f}, - {-518.196f, -173.085f, 102.43f, 0}, - {-500.732f, -145.358f, 88.5337f, 2.44346f}, - {-501.084f, -150.784f, 80.8506f, 0}, - {-518.309f, -163.963f, 102.521f, 2.96706f}, - {-517.053f, -200.429f, 80.759f, 0}, - {-514.361f, -163.864f, 104.163f, 0}, - {-568.04f, -188.707f, 81.55f, 0}, - {-501.775f, -151.581f, 81.2027f, 0}, - {-509.975f, -191.652f, 83.2978f, 0}, - -//snowfall eyecandy - {-191.153f, -129.868f, 78.5595f, -1.25664f }, - {-201.282f, -134.319f, 78.6753f, -0.942478f }, - {-215.981f, -91.4101f, 80.8702f, -1.74533f }, - {-200.465f, -96.418f, 79.7587f, 1.36136f }, - //mine supplies - //irondeep - {870.899f, -388.434f, 61.6406f, -1.22173f}, - {825.214f, -320.174f, 63.712f, -2.82743f}, - {837.117f, -452.556f, 47.2331f, -3.12414f}, - {869.755f, -448.867f, 52.5448f, -0.855212f}, - {949.877f, -458.198f, 56.4874f, 0.314159f}, - {900.35f, -479.024f, 58.3553f, 0.122173f}, - {854.449f, -442.255f, 50.6589f, 0.401426f}, - {886.685f, -442.358f, 54.6962f, -1.22173f}, - {817.509f, -457.331f, 48.4666f, 2.07694f}, - {793.411f, -326.281f, 63.1117f, -2.79253f}, - //coldtooth - {-934.212f, -57.3517f, 80.277f, -0.0174535f}, - {-916.281f, -36.8579f, 77.0227f, 0.122173f}, - {-902.73f, -103.868f, 75.4378f, -1.58825f}, - {-900.514f, -143.527f, 75.9686f, 1.8675f}, - {-862.882f, -0.353299f, 72.1526f, -2.51327f}, - {-854.932f, -85.9184f, 68.6056f, -2.04204f}, - {-851.833f, -118.959f, 63.8672f, -0.0698131f}, - {-849.832f, -20.8421f, 70.4672f, -1.81514f}, - {-844.25f, -60.0374f, 72.1031f, -2.19912f}, - {-820.644f, -136.043f, 63.1977f, 2.40855f}, - {-947.642f, -208.807f, 77.0101f, 1.36136f}, - {-951.394f, -193.695f, 67.634f, 0.802851f} -}; - -Position const BG_AV_DoorPositons[2] = -{ - {780.487f, -493.024f, 99.9553f, 3.0976f}, //alliance - {-1375.193f, -538.981f, 55.2824f, 0.72178f} //horde +//auras for graveyards (3auras per graveyard neutral, alliance, horde) + BG_AV_OBJECT_AURA_N_AID_STATION_CONT_A = 49, + BG_AV_OBJECT_AURA_N_AID_STATION_CONT_H = 50, + BG_AV_OBJECT_AURA_N_STORMPIKE_GRAVE_CONT_A = 51, + BG_AV_OBJECT_AURA_N_STORMPIKE_GRAVE_CONT_H = 52, + BG_AV_OBJECT_AURA_N_STONEHEART_GRAVE_CONT_A = 53, + BG_AV_OBJECT_AURA_N_STONEHEART_GRAVE_CONT_H = 54, + BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_CONT_A = 55, + BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_CONT_H = 56, + BG_AV_OBJECT_AURA_N_ICEBLOOD_GRAVE_CONT_A = 57, + BG_AV_OBJECT_AURA_N_ICEBLOOD_GRAVE_CONT_H = 58, + BG_AV_OBJECT_AURA_N_FROSTWOLF_GRAVE_CONT_A = 59, + BG_AV_OBJECT_AURA_N_FROSTWOLF_GRAVE_CONT_H = 60, + BG_AV_OBJECT_AURA_N_FROSTWOLF_HUT_CONT_A = 61, + BG_AV_OBJECT_AURA_N_FROSTWOLF_HUT_CONT_H = 62, + + BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE_N = 63, + + BG_AV_OBJECT_AURA_A_AID_STATION = 64, + BG_AV_OBJECT_AURA_A_STORMPIKE_GRAVE = 65, + BG_AV_OBJECT_AURA_A_STONEHEART_GRAVE = 66, + BG_AV_OBJECT_AURA_A_SNOWFALL_GRAVE = 67, + BG_AV_OBJECT_AURA_A_ICEBLOOD_GRAVE = 68, + BG_AV_OBJECT_AURA_A_FROSTWOLF_GRAVE = 69, + BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT = 70, + + BG_AV_OBJECT_AURA_H_AID_STATION = 71, + BG_AV_OBJECT_AURA_H_STORMPIKE_GRAVE = 72, + BG_AV_OBJECT_AURA_H_STONEHEART_GRAVE = 73, + BG_AV_OBJECT_AURA_H_SNOWFALL_GRAVE = 74, + BG_AV_OBJECT_AURA_H_ICEBLOOD_GRAVE = 75, + BG_AV_OBJECT_AURA_H_FROSTWOLF_GRAVE = 76, + BG_AV_OBJECT_AURA_H_FROSTWOLF_HUT = 77, + +//big flags on top of towers 2 flags on each (contested, (alliance | horde)) + 2 auras + BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH = 78, + BG_AV_OBJECT_TFLAG_A_DUNBALDAR_NORTH = 79, + BG_AV_OBJECT_TFLAG_A_ICEWING_BUNKER = 80, + BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER = 81, + + BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER = 82, + BG_AV_OBJECT_TFLAG_H_TOWER_POINT = 83, + BG_AV_OBJECT_TFLAG_H_FROSTWOLF_ETOWER = 84, + BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER = 85, + + BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH = 86, + BG_AV_OBJECT_TFLAG_H_DUNBALDAR_NORTH = 87, + BG_AV_OBJECT_TFLAG_H_ICEWING_BUNKER = 88, + BG_AV_OBJECT_TFLAG_H_STONEHEART_BUNKER = 89, + + BG_AV_OBJECT_TFLAG_A_ICEBLOOD_TOWER = 90, + BG_AV_OBJECT_TFLAG_A_TOWER_POINT = 91, + BG_AV_OBJECT_TFLAG_A_FROSTWOLF_ETOWER = 92, + BG_AV_OBJECT_TFLAG_A_FROSTWOLF_WTOWER = 93, + + BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH = 94, + BG_AV_OBJECT_TAURA_A_DUNBALDAR_NORTH = 95, + BG_AV_OBJECT_TAURA_A_ICEWING_BUNKER = 96, + BG_AV_OBJECT_TAURA_A_STONEHEART_BUNKER = 97, + + BG_AV_OBJECT_TAURA_H_ICEBLOOD_TOWER = 98, + BG_AV_OBJECT_TAURA_H_TOWER_POINT = 99, + BG_AV_OBJECT_TAURA_H_FROSTWOLF_ETOWER = 100, + BG_AV_OBJECT_TAURA_H_FROSTWOLF_WTOWER = 101, + + BG_AV_OBJECT_TAURA_N_DUNBALDAR_SOUTH = 102, + BG_AV_OBJECT_TAURA_N_DUNBALDAR_NORTH = 103, + BG_AV_OBJECT_TAURA_N_ICEWING_BUNKER = 104, + BG_AV_OBJECT_TAURA_N_STONEHEART_BUNKER = 105, + BG_AV_OBJECT_TAURA_N_ICEBLOOD_TOWER = 106, + BG_AV_OBJECT_TAURA_N_TOWER_POINT = 107, + BG_AV_OBJECT_TAURA_N_FROSTWOLF_ETOWER = 108, + BG_AV_OBJECT_TAURA_N_FROSTWOLF_WTOWER = 109, + + BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH = 110, // 13 GOBs + BG_AV_OBJECT_BURN_DUNBALDAR_NORTH = 123, // 14 GOBs + BG_AV_OBJECT_BURN_ICEWING_BUNKER = 137, + BG_AV_OBJECT_BURN_STONEHEART_BUNKER = 147, + BG_AV_OBJECT_BURN_ICEBLOOD_TOWER = 157, + BG_AV_OBJECT_BURN_TOWER_POINT = 167, + BG_AV_OBJECT_BURN_FROSTWOLF_ETOWER = 177, + BG_AV_OBJECT_BURN_FROSTWOLF_WTOWER = 187, + BG_AV_OBJECT_BURN_BUILDING_ALLIANCE = 197, + BG_AV_OBJECT_BURN_BUILDING_HORDE = 207, + + BG_AV_OBJECT_SNOW_EYECANDY_A = 217, + BG_AV_OBJECT_SNOW_EYECANDY_PA = 221, // on sniffs there are 8 of them spawned, and 4 of the others, purpose of the "extra" pair unknown + BG_AV_OBJECT_SNOW_EYECANDY_H = 229, + BG_AV_OBJECT_SNOW_EYECANDY_PH = 233, + + BG_AV_OBJECT_MINE_SUPPLY_N_MIN = 237, // 10 GOBs + BG_AV_OBJECT_MINE_SUPPLY_N_MAX = 246, + BG_AV_OBJECT_MINE_SUPPLY_S_MIN = 247, // 13 GOBs + BG_AV_OBJECT_MINE_SUPPLY_S_MAX = 259, + + BG_AV_OBJECT_MAX = 260, + + BG_AV_FIRE_SMOKE_COUNT = BG_AV_OBJECT_SNOW_EYECANDY_A - BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH }; //creaturestuff starts here @@ -551,22 +416,21 @@ enum BG_AV_CreaturePlace AV_CPLACE_SPIRIT_MAIN_ALLIANCE = 7, AV_CPLACE_SPIRIT_MAIN_HORDE = 8, //I don't add a variable for all 4 positions... I think one is enough to compute the rest - AV_CPLACE_DEFENSE_STORM_AID = 9, - AV_CPLACE_DEFEMSE_STORM_GRAVE = 13, - AV_CPLACE_DEFENSE_STONE_GRAVE = 17, - AV_CPLACE_DEFENSE_SNOWFALL = 21, - AV_CPLACE_DEFENSE_FROSTWOLF = 25, - AV_CPLACE_DEFENSE_ICE_GRAVE = 29, - AV_CPLACE_DEFENSE_FROST_HUT = 33, - - AV_CPLACE_DEFENSE_DUN_S = 37, - AV_CPLACE_DEFENSE_DUN_N = 41, - AV_CPLACE_DEFENSE_ICEWING = 45, - AV_CPLACE_DEFENSE_STONE_TOWER = 49, - AV_CPLACE_DEFENSE_ICE_TOWER = 53, - AV_CPLACE_DEFENSE_TOWERPOINT = 57, - AV_CPLACE_DEFENSE_FROST_E = 61, - AV_CPLACE_DEFENSE_FROST_t = 65, + AV_CPLACE_DEFENSE_STORM_AID = 9, + AV_CPLACE_DEFEMSE_STORM_GRAVE = 13, + AV_CPLACE_DEFENSE_STONE_GRAVE = 17, + AV_CPLACE_DEFENSE_SNOWFALL = 21, + AV_CPLACE_DEFENSE_ICE_GRAVE = 25, + AV_CPLACE_DEFENSE_FROSTWOLF = 29, + AV_CPLACE_DEFENSE_FROST_HUT = 33, + AV_CPLACE_DEFENSE_DUN_S = 37, + AV_CPLACE_DEFENSE_DUN_N = 41, + AV_CPLACE_DEFENSE_ICEWING = 45, + AV_CPLACE_DEFENSE_STONE_TOWER = 49, + AV_CPLACE_DEFENSE_ICE_TOWER = 53, + AV_CPLACE_DEFENSE_TOWERPOINT = 57, + AV_CPLACE_DEFENSE_FROST_E = 61, + AV_CPLACE_DEFENSE_FROST_W = 65, AV_CPLACE_A_MARSHAL_SOUTH = 69, AV_CPLACE_A_MARSHAL_NORTH = 70, @@ -578,413 +442,56 @@ enum BG_AV_CreaturePlace AV_CPLACE_H_MARSHAL_WTOWER = 76, //irondeep //miner: - AV_CPLACE_MINE_N_1_MIN = 77, - AV_CPLACE_MINE_N_1_MAX = 136, + AV_CPLACE_MINE_N_1_MIN = 77, + AV_CPLACE_MINE_N_1_MAX = 136, //special types - AV_CPLACE_MINE_N_2_MIN = 137, - AV_CPLACE_MINE_N_2_MAX = 192, + AV_CPLACE_MINE_N_2_MIN = 137, + AV_CPLACE_MINE_N_2_MAX = 192, //boss - AV_CPLACE_MINE_N_3 = 193, + AV_CPLACE_MINE_N_3 = 193, //coldtooth //miner: - AV_CPLACE_MINE_S_1_MIN = 194, - AV_CPLACE_MINE_S_1_MAX = 250, + AV_CPLACE_MINE_S_1_MIN = 194, + AV_CPLACE_MINE_S_1_MAX = 250, //special types - AV_CPLACE_MINE_S_2_MIN = 251, - AV_CPLACE_MINE_S_2_MAX = 289, + AV_CPLACE_MINE_S_2_MIN = 251, + AV_CPLACE_MINE_S_2_MAX = 289, //vermin - AV_CPLACE_MINE_S_S_MIN = 290, - AV_CPLACE_MINE_S_S_MAX = 299, + AV_CPLACE_MINE_S_S_MIN = 290, + AV_CPLACE_MINE_S_S_MAX = 299, //boss - AV_CPLACE_MINE_S_3 = 300, + AV_CPLACE_MINE_S_3 = 300, //herald - AV_CPLACE_HERALD = 301, + AV_CPLACE_HERALD = 301, //node aura triggers - AV_CPLACE_TRIGGER01 = 302, - AV_CPLACE_TRIGGER02 = 303, - AV_CPLACE_TRIGGER03 = 304, - AV_CPLACE_TRIGGER04 = 305, - AV_CPLACE_TRIGGER05 = 306, - AV_CPLACE_TRIGGER06 = 307, - AV_CPLACE_TRIGGER07 = 308, - AV_CPLACE_TRIGGER08 = 309, - AV_CPLACE_TRIGGER09 = 310, - AV_CPLACE_TRIGGER10 = 311, - AV_CPLACE_TRIGGER11 = 312, - AV_CPLACE_TRIGGER12 = 313, - AV_CPLACE_TRIGGER13 = 314, - AV_CPLACE_TRIGGER14 = 315, - AV_CPLACE_TRIGGER15 = 316, + AV_CPLACE_TRIGGER01 = 302, + AV_CPLACE_TRIGGER02 = 303, + AV_CPLACE_TRIGGER03 = 304, + AV_CPLACE_TRIGGER04 = 305, + AV_CPLACE_TRIGGER05 = 306, + AV_CPLACE_TRIGGER06 = 307, + AV_CPLACE_TRIGGER07 = 308, + AV_CPLACE_TRIGGER08 = 309, + AV_CPLACE_TRIGGER09 = 310, + AV_CPLACE_TRIGGER10 = 311, + AV_CPLACE_TRIGGER11 = 312, + AV_CPLACE_TRIGGER12 = 313, + AV_CPLACE_TRIGGER13 = 314, + AV_CPLACE_TRIGGER14 = 315, + AV_CPLACE_TRIGGER15 = 316, //boss, captain triggers - AV_CPLACE_TRIGGER16 = 317, - AV_CPLACE_TRIGGER17 = 318, - AV_CPLACE_TRIGGER18 = 319, - AV_CPLACE_TRIGGER19 = 320, - - AV_CPLACE_MAX = 321 -}; + AV_CPLACE_TRIGGER16 = 317, + AV_CPLACE_TRIGGER17 = 318, + AV_CPLACE_TRIGGER18 = 319, + AV_CPLACE_TRIGGER19 = 320, -Position const BG_AV_CreaturePos[AV_CPLACE_MAX] = -{ - //spiritguides - {643.000000f, 44.000000f, 69.740196f, -0.001854f}, - {676.000000f, -374.000000f, 30.000000f, -0.001854f}, - {73.417755f, -496.433105f, 48.731918f, -0.001854f}, - {-157.409195f, 31.206272f, 77.050598f, -0.001854f}, - {-531.217834f, -405.231384f, 49.551376f, -0.001854f}, - {-1090.476807f, -253.308670f, 57.672371f, -0.001854f}, - {-1496.065063f, -333.338409f, 101.134804f, -0.001854f}, - {873.001770f, -491.283630f, 96.541931f, -0.001854f}, - {-1437.670044f, -610.088989f, 51.161900f, -0.001854f}, - //grave - //firstaid - {635.17f, -29.5594f, 46.5056f, 4.81711f}, - {642.488f, -32.9437f, 46.365f, 4.67748f}, - {642.326f, -27.9442f, 46.9211f, 4.59022f}, - {635.945f, -33.6171f, 45.7164f, 4.97419f}, - //stormpike - {669.272f, -297.304f, 30.291f, 4.66604f}, - {674.08f, -292.328f, 30.4817f, 0.0918785f}, - {667.01f, -288.532f, 29.8809f, 1.81583f}, - {664.153f, -294.042f, 30.2851f, 3.28531f}, - //stone - {81.7027f, -406.135f, 47.7843f, 0.598464f}, - {78.1431f, -409.215f, 48.0401f, 5.05953f}, - {73.4135f, -407.035f, 46.7527f, 3.34736f}, - {78.2258f, -401.859f, 46.4202f, 2.05852f}, - //snowfall - {-207.412f, -110.616f, 78.7959f, 2.43251f}, - {-197.95f, -112.205f, 78.5686f, 6.22441f}, - {-202.709f, -116.829f, 78.4358f, 5.13742f}, - {-202.059f, -108.314f, 78.5783f, 5.91968f}, - //ice - {-615.501f, -393.802f, 60.4299f, 3.06147f}, - {-608.513f, -392.717f, 62.5724f, 2.06323f}, - {-609.769f, -400.072f, 60.7174f, 5.22367f}, - {-616.093f, -398.293f, 60.5628f, 3.73613f}, - //frost - {-1077.7f, -340.21f, 55.4682f, 6.25569f}, - {-1082.74f, -333.821f, 54.7962f, 2.05459f}, - {-1090.66f, -341.267f, 54.6768f, 3.27746f}, - {-1081.58f, -344.63f, 55.256f, 4.75636f}, - //frost hut - {-1408.95f, -311.69f, 89.2536f, 4.49954f}, - {-1407.15f, -305.323f, 89.1993f, 2.86827f}, - {-1400.64f, -304.3f, 89.7008f, 1.0595f}, - {-1400.4f, -311.35f, 89.3028f, 4.99434f}, - //towers - //dun south - OK - {569.395f, -101.064f, 52.8296f, 2.34974f}, - {574.85f, -92.9842f, 52.5869f, 3.09325f}, - {575.411f, -83.597f, 52.3626f, 6.26573f}, - {571.352f, -75.6582f, 52.479f, 0.523599f}, - //dun north - OK - {668.60f, -122.53f, 64.12f, 2.34f}, /// @todo: To be confirm - Not completely okay - {662.253f, -129.105f, 64.1794f, 2.77507f}, - {661.209f, -138.877f, 64.2251f, 3.38594f}, - {665.481f, -146.857f, 64.1271f, 3.75246f}, - //icewing - OK - {225.228f, -368.909f, 56.9983f, 6.23806f}, - {191.36f, -369.899f, 57.1524f, 3.24631f}, - {215.518f, -384.019f, 56.9889f, 5.09636f}, - {199.625f, -382.177f, 56.8691f, 4.08407f}, - //stone - {-172.851f, -452.366f, 40.8725f, 3.31829f}, - {-147.147f, -435.053f, 40.8022f, 0.599238f}, - {-169.456f, -440.325f, 40.985f, 2.59101f}, - {-163.494f, -434.904f, 41.0725f, 1.84174f}, - //ice - OK - {-573.522f, -271.854f, 75.0078f, 3.9619f}, - {-565.616f, -269.051f, 74.9952f, 5.02655f}, - {-562.825f, -261.087f, 74.9898f, 5.95157f}, - {-569.176f, -254.446f, 74.8771f, 0.820305f}, - //towerpoint - {-763.04f, -371.032f, 90.7933f, 5.25979f}, - {-759.764f, -358.264f, 90.8681f, 0.289795f}, - {-768.808f, -353.056f, 90.8811f, 1.52601f}, - {-775.944f, -362.639f, 90.8949f, 2.59573f}, - //frost etower - {-1294.13f, -313.045f, 107.328f, 0.270162f}, - {-1306.5f, -308.105f, 113.767f, 1.78755f}, - {-1294.78f, -319.966f, 113.79f, 5.94545f}, - {-1294.83f, -312.241f, 113.799f, 0.295293f}, - //frost wtower - {-1300.96f, -275.111f, 114.058f, 4.12804f}, - {-1302.41f, -259.256f, 114.065f, 1.67602f}, - {-1287.97f, -262.087f, 114.165f, 6.18264f}, - {-1291.59f, -271.166f, 114.151f, 5.28257f}, - - //alliance marshall - {721.104f, -7.64155f, 50.7046f, 3.45575f}, // south - {723.058f, -14.1548f, 50.7046f, 3.40339f}, // north - {715.691f, -4.72233f, 50.2187f, 3.47321f}, // icewing - {720.046f, -19.9413f, 50.2187f, 3.36849f}, // stone -/// horde @todo: Confirm positions - {-1363.99f, -221.99f, 98.4053f, 4.93012f}, - {-1370.96f, -223.532f, 98.4266f, 4.93012f}, - {-1378.37f, -228.614f, 99.3546f, 5.38565f}, - {-1358.02f, -228.998f, 98.868f, 3.87768f}, - - //irondeep mine - //Irondeep Trogg - {971.671f, -442.657f, 57.6951f, 3.1765f}, - {969.979f, -457.148f, 58.1119f, 4.5204f}, - {958.692f, -333.477f, 63.2276f, 5.77704f}, - {957.113f, -325.92f, 61.7589f, 1.13446f}, - {948.25f, -448.268f, 56.9009f, 5.60251f}, - {934.727f, -385.802f, 63.0344f, 3.75246f}, - {931.751f, -403.458f, 59.6737f, 5.63741f}, - {931.146f, -359.666f, 66.0294f, 3.9619f}, - {929.702f, -412.401f, 56.8776f, 5.89921f}, - {926.849f, -379.074f, 63.5286f, 2.0944f}, - {921.972f, -358.597f, 66.4313f, 2.93215f}, - {921.449f, -341.981f, 67.1264f, 3.4383f}, - {921.1f, -395.812f, 60.4615f, 2.71695f}, - {919.274f, -394.986f, 60.3478f, 2.71696f}, - {916.852f, -393.891f, 60.1726f, 2.71695f}, - {914.568f, -326.21f, 66.1733f, 2.25147f}, - {913.064f, -395.773f, 60.1364f, 4.41568f}, - {909.246f, -474.576f, 58.2067f, 0.226893f}, - {909.246f, -474.576f, 58.2901f, 0.226893f}, - {907.209f, -428.267f, 59.8065f, 1.8675f}, - {905.973f, -459.528f, 58.7594f, 1.37189f}, - {905.067f, -396.074f, 60.2085f, 5.07891f}, - {901.809f, -457.709f, 59.0116f, 3.52557f}, - {900.962f, -427.44f, 59.0842f, 1.50098f}, - {897.929f, -471.742f, 59.7729f, 2.54818f}, - {893.376f, -343.171f, 68.1499f, 5.35816f}, - {890.584f, -406.049f, 61.1925f, 5.67232f}, - {888.208f, -332.564f, 68.148f, 1.93732f}, - {887.647f, -391.537f, 61.8734f, 1.37881f}, - {885.109f, -343.338f, 67.0867f, 3.78979f}, - {881.618f, -419.948f, 53.5228f, 0.593412f}, - {878.675f, -345.36f, 66.1052f, 3.45651f}, - {877.127f, -351.8f, 66.5296f, 5.74213f}, - {876.778f, -345.97f, 65.7724f, 3.45262f}, - {874.577f, -414.786f, 52.7817f, 1.67552f}, - {868.247f, -343.136f, 64.9894f, 1.6057f}, - {859.03f, -367.231f, 47.4655f, 0.0174533f}, - {857.513f, -351.817f, 65.1867f, 4.39823f}, - {852.632f, -372.416f, 48.1657f, 3.66519f}, - {849.86f, -340.944f, 66.2447f, 0.401426f}, - {847.99f, -386.287f, 60.9277f, 2.32374f}, - {847.601f, -423.072f, 50.0852f, 4.57276f}, - {847.135f, -411.307f, 50.2106f, 1.5708f}, - {835.077f, -379.418f, 48.2755f, 5.93412f}, - {834.87f, -453.304f, 47.9075f, 0.226893f}, - {834.634f, -365.981f, 62.8801f, 1.32645f}, - {834.354f, -355.526f, 48.1491f, 6.07375f}, - {833.702f, -327.506f, 65.0439f, 0.331613f}, - {833.151f, -374.228f, 63.0938f, 3.66519f}, - {831.711f, -346.785f, 47.2975f, 0.226893f}, - {827.874f, -413.624f, 48.5818f, 1.49241f}, - {827.728f, -415.483f, 48.5593f, 1.49238f}, - {827.016f, -424.543f, 48.2856f, 1.49236f}, - {823.222f, -334.283f, 65.6306f, 4.88692f}, - {821.892f, -464.723f, 48.9451f, 4.66003f}, - {821.006f, -387.635f, 49.0728f, 3.15905f}, - {817.26f, -447.432f, 49.4308f, 2.18166f}, - {805.399f, -320.146f, 52.7712f, 0.296706f}, - {801.405f, -328.055f, 53.0195f, 4.31096f}, - //irondeep skullthumber irondeep shaman - {955.812f, -440.302f, 55.3411f, 3.19395f}, - {937.378f, -377.816f, 65.3919f, 3.56047f}, - {925.059f, -331.347f, 65.7564f, 3.66519f}, - {922.918f, -396.634f, 60.3942f, 2.71695f}, - {909.99f, -462.154f, 59.0811f, 3.7001f}, - {907.893f, -388.787f, 61.7923f, 5.74213f}, - {898.801f, -437.105f, 58.5266f, 0.959931f}, - {884.237f, -407.597f, 61.566f, 0.820305f}, - {880.744f, -344.683f, 66.4086f, 3.4644f}, - {876.047f, -341.857f, 65.8743f, 4.45059f}, - {874.674f, -402.077f, 61.7573f, 0.26341f}, - {871.914f, -404.209f, 62.1269f, 6.06163f}, - {871.606f, -403.665f, 62.0795f, 0.765774f}, - {871.561f, -404.114f, 62.1297f, 0.00981727f}, - {871.528f, -404.248f, 62.1455f, 0.498032f}, - {871.493f, -404.122f, 62.1331f, 5.65727f}, - {871.282f, -403.843f, 62.1108f, 0.788382f}, - {868.294f, -392.395f, 61.4772f, 4.38685f}, - {868.256f, -392.363f, 61.4803f, 0.732738f}, - {867.804f, -392.51f, 61.5089f, 2.30167f}, - {867.612f, -392.371f, 61.524f, 2.86149f}, - {858.593f, -439.614f, 50.2184f, 0.872665f}, - {851.471f, -362.52f, 47.314f, 4.06662f}, - {846.939f, -347.279f, 66.2876f, 0.942478f}, - {842.08f, -421.775f, 48.2659f, 1.0821f}, - {838.358f, -371.212f, 63.3299f, 4.04916f}, - {827.57f, -417.483f, 48.4538f, 1.49237f}, - {827.012f, -457.397f, 48.9331f, 2.35619f}, - {825.535f, -322.373f, 63.9357f, 4.76475f}, - {867.635f, -443.605f, 51.3347f, 1.38626f}, - {957.293f, -455.039f, 56.7395f, 5.79449f}, - {950.077f, -326.672f, 61.6552f, 5.48033f}, - {936.692f, -356.78f, 65.9835f, 2.75762f}, - {926.475f, -419.345f, 56.1833f, 2.0944f}, - {924.729f, -397.453f, 60.213f, 2.71695f}, - {902.195f, -475.891f, 58.312f, 1.39626f}, - {897.464f, -338.758f, 68.1715f, 2.94961f}, - {884.237f, -407.597f, 61.566f, 0.820305f}, - {882.517f, -344.111f, 66.7887f, 3.46962f}, - {881.437f, -400.254f, 61.2028f, 0.263427f}, - {880.156f, -400.678f, 61.3113f, 3.41373f}, - {877.989f, -418.051f, 52.9753f, 4.46804f}, - {871.212f, -404.12f, 62.1433f, 3.6554f}, - {871.036f, -404.119f, 62.2237f, 4.50295f}, - {857.396f, -395.766f, 61.263f, 4.78684f}, - {857.276f, -395.395f, 61.2418f, 0.0845553f}, - {857.231f, -394.577f, 61.2174f, 1.96817f}, - {857.108f, -395.682f, 61.2317f, 4.87022f}, - {856.709f, -395.28f, 61.1814f, 2.54913f}, - {850.922f, -390.399f, 60.8771f, 2.85405f}, - {847.556f, -388.228f, 60.9438f, 2.56872f}, - {842.031f, -384.663f, 61.6028f, 2.56871f}, - {832.035f, -389.301f, 47.5567f, 2.11185f}, - {827.415f, -419.468f, 48.3322f, 1.49232f}, - {826.402f, -349.454f, 47.2722f, 1.51844f}, - {817.83f, -455.715f, 48.4207f, 0.925025f}, - {808.953f, -325.964f, 52.4043f, 3.01942f}, - // Morloch - {865.554f, -438.735f, 50.7333f, 2.12431f}, - //coldtooth mine - //miner/digger - {-917.648f, -46.8922f, 77.0872f, 5.27089f}, - {-912.689f, -45.4494f, 76.2277f, 4.60767f}, - {-905.455f, -84.5179f, 75.3642f, 3.29867f}, - {-904.332f, -111.509f, 75.5925f, 2.47837f}, - {-904.27f, -160.419f, 61.9876f, 3.61192f}, - {-904.023f, -90.4558f, 75.3706f, 3.40339f}, - {-978.678f, -37.3136f, 75.8364f, 2.84489f}, - {-973.076f, -36.5013f, 77.5047f, 1.0821f}, - {-963.951f, -87.734f, 81.5555f, 0.575959f}, - {-961.941f, -90.7252f, 81.6629f, 0.820305f}, - {-957.623f, -186.582f, 66.6021f, 1.95477f}, - {-952.476f, -179.778f, 78.6771f, 4.5204f}, - {-950.427f, -115.007f, 79.6127f, 3.68264f}, - {-950.25f, -151.95f, 79.4598f, -1.81423f}, - {-950.169f, -188.099f, 66.6184f, 5.55015f}, - {-949.944f, -142.977f, 80.5382f, 2.70526f}, - {-947.854f, -170.5f, 79.7618f, 0.942478f}, - {-946.738f, -139.567f, 80.0904f, 2.3911f}, - {-945.503f, -65.0654f, 79.7907f, 5.02655f}, - {-943.678f, -110.986f, 80.2557f, 0.959931f}, - {-942.993f, -56.9881f, 79.8915f, 5.65487f}, - {-938.197f, -155.838f, 61.3111f, 1.65806f}, - {-930.488f, -214.524f, 72.1431f, 2.1236f}, - {-929.947f, -154.449f, 61.5084f, 1.67552f}, - {-927.412f, -135.313f, 61.1987f, 3.29867f}, - {-920.677f, -156.859f, 62.8033f, 3.15306f}, - {-916.75f, -136.094f, 62.2357f, 0.0698132f}, - {-915.319f, -132.718f, 62.562f, 1.16984f}, - {-913.589f, -146.794f, 76.9366f, 1.8675f}, - {-907.572f, -148.937f, 76.6898f, 4.76475f}, - {-902.02f, -64.6174f, 73.9707f, 1.19169f}, - {-899.489f, -61.7252f, 73.2498f, 5.09636f}, - {-894.792f, -127.141f, 75.3834f, 6.14356f}, - {-892.408f, -162.525f, 64.1212f, 2.69884f}, - {-892.326f, -123.158f, 76.0318f, 5.5676f}, - {-888.468f, -148.462f, 61.8012f, 1.65806f}, - {-883.268f, -159.738f, 63.5311f, 5.20108f}, - {-877.76f, -118.07f, 65.215f, 2.94961f}, - {-876.792f, -128.646f, 64.1045f, 3.40339f}, - {-874.901f, -36.6579f, 69.4246f, 2.00713f}, - {-874.856f, -151.351f, 62.7537f, 3.57875f}, - {-872.135f, -150.08f, 62.7513f, 3.57201f}, - {-870.288f, -149.217f, 62.5413f, 3.56624f}, - {-870.03f, -6.27443f, 70.3867f, 2.3911f}, - {-869.023f, -82.2118f, 69.5848f, 3.22886f}, - {-866.354f, -40.2455f, 70.842f, 0.0698132f}, - {-865.305f, -152.302f, 63.5044f, 4.86947f}, - {-861.926f, -79.0519f, 71.4178f, 0.20944f}, - {-857.292f, -152.277f, 63.2114f, 4.18879f}, - {-853.357f, -0.696194f, 72.0655f, 0.994838f}, - {-850.685f, -14.2596f, 70.2298f, 0.20944f}, - {-839.987f, -67.7695f, 72.7916f, 4.93928f}, - {-839.199f, -57.0558f, 73.4891f, 1.67552f}, - {-836.963f, -153.224f, 63.3821f, 4.46804f}, - {-832.721f, -67.7555f, 72.9062f, 4.99164f}, - {-821.496f, -143.095f, 63.1292f, 0.541052f}, - {-818.829f, -153.004f, 62.1757f, 6.12611f}, - //special - {-954.622f, -110.958f, 80.7911f, 6.24828f}, - {-951.477f, -53.9647f, 80.0235f, 5.32325f}, - {-946.812f, -126.04f, 78.8601f, 5.15265f}, - {-940.689f, -140.707f, 79.9225f, 2.79253f}, - {-933.954f, -159.632f, 60.778f, 2.56563f}, - {-922.537f, -130.291f, 61.3756f, 4.95674f}, - {-915.862f, -151.74f, 76.9427f, 0.942478f}, - {-888.321f, -159.831f, 62.5303f, 1.20428f}, - {-874.361f, -42.4751f, 69.4316f, 0.785398f}, - {-873.19f, -50.4899f, 70.0568f, -2.41288f}, - {-868.511f, -148.386f, 62.3547f, 3.57875f}, - {-868.44f, -121.649f, 64.5056f, 3.33358f}, - {-868.324f, -77.7196f, 71.4768f, 5.41052f}, - {-859.846f, -19.6549f, 70.7304f, 1.97222f}, - {-828.05f, -150.508f, 62.2019f, 2.14675f}, - {-826.254f, -58.6911f, 72.0041f, 3.68264f}, - {-976.086f, -44.1775f, 76.029f, 1.46608f}, - {-971.864f, -87.4223f, 81.4954f, 5.8294f}, - {-966.551f, -74.1111f, 80.0243f, 4.2129f}, - {-958.509f, -173.652f, 77.9013f, 6.24828f}, - {-951.511f, -181.242f, 65.529f, 4.39823f}, - {-940.967f, -186.243f, 77.698f, 1.28164f}, - {-930.004f, -65.0898f, 79.077f, 0.0581657f}, - {-920.864f, -40.2009f, 78.256f, 5.16617f}, - {-919.089f, -148.021f, 62.0317f, 2.59327f}, - {-901.516f, -116.329f, 75.6876f, 0.471239f}, - {-897.864f, -84.4348f, 74.083f, 3.00197f}, - {-897.617f, -52.0457f, 71.9503f, 4.36332f}, - {-894.891f, -153.951f, 61.6827f, 3.23569f}, - {-893.933f, -111.625f, 75.6591f, 4.22536f}, - {-883.265f, -152.854f, 61.8384f, 0.0941087f}, - {-868.293f, -147.243f, 62.1097f, 3.2056f}, - {-867.501f, -11.8709f, 70.018f, 6.14356f}, - {-866.699f, -147.54f, 62.1646f, 3.57878f}, - {-866.566f, -91.1916f, 67.4414f, 4.56707f}, - {-857.272f, -141.142f, 61.7356f, 4.17134f}, - {-847.446f, -98.0061f, 68.5131f, 3.24631f}, - {-837.026f, -140.729f, 62.5141f, 5.51524f}, - {-824.204f, -65.053f, 72.3381f, 3.01942f}, - //vermin (s.th special for this mine) - {-951.955f, -197.5f, 77.212f, 5.63741f}, - {-944.837f, -199.608f, 77.0737f, 4.97419f}, - {-933.494f, -209.063f, 73.7803f, 5.88176f}, - {-929.666f, -201.308f, 73.7032f, 5.02655f}, - {-978.997f, -249.356f, 65.4345f, 5.05464f}, - {-974.565f, -224.828f, 69.5858f, 4.88846f}, - {-946.514f, -259.239f, 66.0874f, 3.78132f}, - {-918.402f, -250.439f, 69.5271f, 2.21352f}, - {-910.14f, -229.959f, 72.9279f, 0.27677f}, - {-851.563f, -88.6527f, 68.5983f, 3.61896f}, - //boss - {-848.902f, -92.931f, 68.6325f, 3.33350f}, - //herald - {-48.459f, -288.802f, 55.47f, 1.0f}, - //triggers - {637.083f, -32.6603f, 45.9715f, 1.14353f}, //firstaid_station - {669.007f, -294.078f, 30.2909f, 2.77507f}, //stormpike_grave - {77.8013f, -404.7f, 46.7549f, -0.872665f}, //stoneheart_grave - {-202.581f, -112.73f, 78.4876f, -0.715585f}, //snowfall_grave - {-611.962f, -396.17f, 60.8351f, 2.53682f}, //iceblood_grave - {-1082.45f, -346.823f, 54.9219f, -1.53589f}, //frostwolf_grave - {-1402.21f, -307.431f, 89.4424f, 0.191986f}, //frostwolf_hut - {553.779f, -78.6566f, 51.9378f, -1.22173f}, //dunbaldar_south - {674.001f, -143.125f, 63.6615f, 0.994838f}, //dunbaldar_north - {203.281f, -360.366f, 56.3869f, -0.925024f}, //icewing_bunker - {-152.437f, -441.758f, 40.3982f, -1.95477f}, //stoneheart_bunker - {-571.88f, -262.777f, 75.0087f, -0.802851f}, //iceblood_tower - {-768.907f, -363.71f, 90.8949f, 1.07991f}, //tower_point - {-1302.9f, -316.981f, 113.867f, 2.00713f}, //frostwolf_etower - {-1297.5f, -266.767f, 114.15f, 3.31044f}, //frostwolf_wtower - {-57.7891f, -286.597f, 15.6479f, 6.02139f}, //AV_NPC_A_CAPTAIN balinda - {722.43f, -10.9982f, 50.7046f, 3.42085f}, //AV_NPC_A_BOSS vanndar - {-545.23f, -165.35f, 57.7886f, 3.01145f}, //AV_NPC_H_CAPTAIN galvangar - {-1370.9f, -219.793f, 98.4258f, 5.04381f} //AV_NPC_H_BOSS drek thar + AV_CPLACE_MAX = 321 }; +// related to BG_AV_CreatureInfo enum BG_AV_CreatureIds { AV_NPC_A_TOWERDEFENSE = 0, // stormpike bowman @@ -1007,284 +514,47 @@ enum BG_AV_CreatureIds AV_NPC_MARSHAL_NORTH = 15, AV_NPC_A_MARSHAL_ICE = 16, AV_NPC_A_MARSHAL_STONE = 17, + AV_NPC_H_MARSHAL_ICE = 18, AV_NPC_H_MARSHAL_TOWER = 19, AV_NPC_MARSHAL_ETOWER = 20, AV_NPC_H_MARSHAL_WTOWER= 21, + AV_NPC_N_MINE_N_1 = 22, AV_NPC_N_MINE_N_2 = 23, AV_NPC_N_MINE_N_3 = 24, AV_NPC_N_MINE_N_4 = 25, + AV_NPC_N_MINE_A_1 = 26, AV_NPC_N_MINE_A_2 = 27, AV_NPC_N_MINE_A_3 = 28, AV_NPC_N_MINE_A_4 = 29, + AV_NPC_N_MINE_H_1 = 30, AV_NPC_N_MINE_H_2 = 31, AV_NPC_N_MINE_H_3 = 32, AV_NPC_N_MINE_H_4 = 33, + AV_NPC_S_MINE_N_1 = 34, AV_NPC_S_MINE_N_2 = 35, AV_NPC_S_MINE_N_3 = 36, AV_NPC_S_MINE_N_4 = 37, AV_NPC_S_MINE_N_S = 38, + AV_NPC_S_MINE_A_1 = 39, AV_NPC_S_MINE_A_2 = 40, AV_NPC_S_MINE_A_3 = 41, AV_NPC_S_MINE_A_4 = 42, + AV_NPC_S_MINE_H_1 = 43, AV_NPC_S_MINE_H_2 = 44, AV_NPC_S_MINE_H_3 = 45, AV_NPC_S_MINE_H_4 = 46, + AV_NPC_HERALD = 47, AV_NPC_INFO_MAX = 48 }; -//entry, team, minlevel, maxlevel -/// @todo: this array should be removed, the only needed things are the entrys (for spawning(?) and handlekillunit) -const uint32 BG_AV_CreatureInfo[AV_NPC_INFO_MAX] = -{ - 12050, // Stormpike Defender - 13326, // Seasoned Defender - 13331, // Veteran Defender - 13422, // Champion Defender - 13358, // Stormpike Bowman /// @todo: Confirm if this is correct. Author assumpted 60, 61 & 69, 70, but wouldn't work here - 11949, // not spawned with this data, but used for handlekillunit - 11948, // not spawned with this data, but used for handlekillunit - 12053, // Frostwolf Guardian - 13328, // Seasoned Guardian - 13332, // Veteran Guardian - 13421, // Champion Guardian - 13359, // Frostwolf Bowman - 11947, // not spawned with this data, but used for handlekillunit - 11946, // not spawned with this data, but used for handlekillunit - 14763, // Dun Baldar South Marshal - 14762, // Dun Baldar North Marshal - 14764, // Icewing Marshal - 14765, // Stonehearth Marshal - - 14773, // Iceblood Warmaster - 14776, // Tower Point Warmaster - 14772, // East Frostwolf Warmaster - 14777, // West Frostwolf Warmaster - - 10987, // Irondeep Trogg - 11600, // Irondeep Shaman - 11602, // Irondeep Skullthumper - 11657, // Morloch - - 13396, // irondeep alliance /// @todo: Correct and give correct ids - 13080, - 13098, - 13078, - - 13397, // irondeep horde - 13099, - 13081, - 13079, - - 11603, // south mine neutral - 11604, - 11605, - 11677, - 10982, // vermin - - 13317, // alliance - 13096, // explorer - 13087, // invader - 13086, - - 13316, // horde - 13097, // surveypr - 13089, // guard - 13088, - 14848 // Herald -}; - -//x, y, z, o, static_creature_info-id -const float BG_AV_StaticCreaturePos[AV_STATICCPLACE_MAX][5] = -{ - //static creatures - {-1235.31f, -340.777f, 60.5088f, 3.31613f, 0 }, //2225 - Zora Guthrek - {-1244.02f, -323.795f, 61.0485f, 5.21853f, 1 }, //3343 - Grelkor - {-1235.16f, -332.302f, 60.2985f, 2.96706f, 2 }, //3625 - Rarck - {587.303f, -42.8257f, 37.5615f, 5.23599f, 3 }, //4255 - Brogus Thunderbrew - {643.635f, -58.3987f, 41.7405f, 4.72984f, 4 }, //4257 - Lana Thunderbrew - {591.464f, -44.452f, 37.6166f, 5.65487f, 5 }, //5134 - Jonivera Farmountain - {608.515f, -33.3935f, 42.0003f, 5.41052f, 6 }, //5135 - Svalbrad Farmountain - {617.656f, -32.0701f, 42.7168f, 4.06662f, 7 }, //5139 - Kurdrum Barleybeard - {-1183.76f, -268.295f, 72.8233f, 3.28122f, 8 }, //10364 - Yaelika Farclaw - {-1187.86f, -275.31f, 73.0481f, 3.63028f, 9 }, //10367 - Shrye Ragefist - {-1008.42f, -368.006f, 55.3426f, 5.95647f, 10 }, //10981 - Frostwolf - {-1091.92f, -424.28f, 53.0139f, 2.93958f, 10 }, //10981 - Frostwolf - {-558.455f, -198.768f, 58.1755f, 4.97946f, 10 }, //10981 - Frostwolf - {-861.247f, -312.51f, 55.1427f, 3.35382f, 10 }, //10981 - Frostwolf - {-1003.81f, -395.913f, 50.4736f, 2.85631f, 10 }, //10981 - Frostwolf - {-904.5f, -289.815f, 65.1222f, 5.7847f, 10 }, //10981 - Frostwolf - {-1064.41f, -438.839f, 51.3614f, 1.88857f, 10 }, //10981 - Frostwolf - {258.814f, 76.2017f, 18.6468f, 6.19052f, 11 }, //10986 - Snowblind Harpy - {265.838f, -315.846f, -16.5429f, 3.15917f, 11 }, //10986 - Snowblind Harpy - {426.485f, -51.1927f, -5.66286f, 1.60347f, 11 }, //10986 - Snowblind Harpy - {452.044f, -33.9594f, -0.044651f, 2.72815f, 11 }, //10986 - Snowblind Harpy - {266.032f, -315.639f, -16.5429f, 4.67962f, 11 }, //10986 - Snowblind Harpy - {532.64f, -54.5863f, 20.7024f, 2.93215f, 11 }, //10986 - Snowblind Harpy - {295.183f, -299.908f, -34.6123f, 0.135851f, 12 }, //10990 - Alterac Ram - {421.08f, -225.006f, -23.73f, 0.166754f, 12 }, //10990 - Alterac Ram - {-55.7766f, -192.498f, 20.4352f, 6.12221f, 12 }, //10990 - Alterac Ram - {527.887f, -477.223f, 62.3559f, 0.170935f, 12 }, //10990 - Alterac Ram - {389.144f, -346.508f, -30.334f, 4.14117f, 12 }, //10990 - Alterac Ram - {108.121f, -322.248f, 37.5655f, 4.46788f, 12 }, //10990 - Alterac Ram - {507.479f, -67.9403f, 10.3571f, 3.26304f, 12 }, //10990 - Alterac Ram - {329.071f, -185.016f, -29.1542f, 0.356943f, 12 }, //10990 - Alterac Ram - {252.449f, -422.313f, 35.1404f, 4.53771f, 12 }, //10990 - Alterac Ram - {358.882f, -118.061f, -24.9119f, 2.29257f, 12 }, //10990 - Alterac Ram - {487.151f, -174.229f, 14.7558f, 4.73192f, 12 }, //10990 - Alterac Ram - {449.652f, -123.561f, 6.14273f, 6.12029f, 12 }, //10990 - Alterac Ram - {272.419f, -261.802f, -41.8835f, 3.66559f, 12 }, //10990 - Alterac Ram - {359.021f, -210.954f, -29.3483f, 4.31339f, 12 }, //10990 - Alterac Ram - {450.598f, -318.048f, -37.7548f, 0.655219f, 12 }, //10990 - Alterac Ram - {509.333f, -218.2f, 3.05439f, 3.66292f, 12 }, //10990 - Alterac Ram - {485.771f, -223.613f, -1.53f, 2.04862f, 12 }, //10990 - Alterac Ram - {486.636f, -452.172f, 39.6592f, 2.3341f, 12 }, //10990 - Alterac Ram - {702.783f, -257.494f, 25.9777f, 1.68329f, 12 }, //10990 - Alterac Ram - {460.942f, -199.263f, -6.0149f, 0.380506f, 12 }, //10990 - Alterac Ram - {483.108f, -115.307f, 10.1056f, 3.69701f, 12 }, //10990 - Alterac Ram - {471.601f, -154.174f, 14.0702f, 5.5807f, 12 }, //10990 - Alterac Ram - {213.938f, -420.793f, 41.2549f, 5.71394f, 12 }, //10990 - Alterac Ram - {289.387f, -294.685f, -33.9073f, 0.555494f, 12 }, //10990 - Alterac Ram - {155.649f, -402.891f, 43.3915f, 5.94838f, 12 }, //10990 - Alterac Ram - {517.184f, -295.105f, -9.78195f, 6.05668f, 12 }, //10990 - Alterac Ram - {102.334f, -332.165f, 38.9812f, 3.31445f, 12 }, //10990 - Alterac Ram - {320.244f, -107.793f, -42.6357f, -1.00311f, 12 }, //10990 - Alterac Ram - {217.976f, 110.774f, 15.7603f, 4.56793f, 13 }, //11675 - Snowblind Windcaller - {269.872f, 6.66684f, 20.7592f, 0.381212f, 13 }, //11675 - Snowblind Windcaller - {313.528f, -319.041f, -27.2373f, 0.554098f, 13 }, //11675 - Snowblind Windcaller - {435.441f, -39.9289f, -0.169651f, 0.549454f, 13 }, //11675 - Snowblind Windcaller - {315.115f, -317.62f, -29.1123f, 0.90111f, 13 }, //11675 - Snowblind Windcaller - {428.091f, -122.731f, 3.40332f, 6.05901f, 14 }, //11678 - Snowblind Ambusher - {235.05f, 85.5705f, 18.3079f, -0.914255f, 14 }, //11678 - Snowblind Ambusher - {-1553.04f, -344.342f, 64.4163f, 6.09933f, 15 }, //11839 - Wildpaw Brute - {-545.23f, -165.35f, 57.7886f, 3.01145f, 16 }, //11947 - Captain Galvangar - {722.43f, -10.9982f, 50.7046f, 3.42085f, 17 }, //11948 - Vanndar Stormpike - {-57.7891f, -286.597f, 15.6479f, 6.02139f, 18 }, //11949 - Captain Balinda Stonehearth - {930.498f, -520.755f, 93.7334f, 1.8326f, 19 }, //11997 - Stormpike Herald - {-776.092f, -345.161f, 67.4092f, 1.89257f, 20 }, //12051 - Frostwolf Legionnaire - {-1224.63f, -308.144f, 65.0087f, 4.01139f, 20 }, //12051 - Frostwolf Legionnaire - {-713.039f, -442.515f, 82.8638f, 0.68724f, 20 }, //12051 - Frostwolf Legionnaire - {-711.783f, -444.061f, 82.7039f, 0.683494f, 20 }, //12051 - Frostwolf Legionnaire - {587.633f, -45.9816f, 37.5438f, 5.81195f, 21 }, //12096 - Stormpike Quartermaster - {-1293.79f, -194.407f, 72.4398f, 5.84685f, 22 }, //12097 - Frostwolf Quartermaster - {446.163f, -377.119f, -1.12725f, 0.209526f, 23 }, //12127 - Stormpike Guardsman - {549.348f, -399.254f, 53.3537f, 3.24729f, 23 }, //12127 - Stormpike Guardsman - {549.801f, -401.217f, 53.8305f, 3.24729f, 23 }, //12127 - Stormpike Guardsman - {192.704f, -406.874f, 42.9183f, 6.10696f, 23 }, //12127 - Stormpike Guardsman - {441.305f, -435.765f, 28.2385f, 2.14472f, 23 }, //12127 - Stormpike Guardsman - {192.982f, -404.891f, 43.0132f, 6.1061f, 23 }, //12127 - Stormpike Guardsman - {355.342f, -391.989f, -0.486707f, 3.00643f, 23 }, //12127 - Stormpike Guardsman - {446.035f, -375.104f, -1.12725f, 0.21033f, 23 }, //12127 - Stormpike Guardsman - {697.864f, -433.238f, 62.7914f, 1.65776f, 23 }, //12127 - Stormpike Guardsman - {610.74f, -331.585f, 30.8021f, 5.14253f, 23 }, //12127 - Stormpike Guardsman - {609.815f, -329.775f, 30.9271f, -2.38829f, 23 }, //12127 - Stormpike Guardsman - {695.874f, -433.434f, 62.8543f, 1.65776f, 23 }, //12127 - Stormpike Guardsman - {443.337f, -435.283f, 28.6842f, 2.13768f, 23 }, //12127 - Stormpike Guardsman - {-1251.5f, -316.327f, 62.6565f, 5.02655f, 24 }, //13176 - Smith Regzar - {-1332.0f, -331.243f, 91.2631f, 1.50098f, 25 }, //13179 - Wing Commander Guse - {569.983f, -94.9992f, 38.0325f, 1.39626f, 26 }, //13216 - Gaelden Hammersmith - {-1244.92f, -308.916f, 63.2525f, 1.62316f, 27 }, //13218 - Grunnda Wolfheart - {-1319.56f, -342.675f, 60.3404f, 1.20428f, 28 }, //13236 - Primalist Thurloga - {647.61f, -61.1548f, 41.7405f, 4.24115f, 29 }, //13257 - Murgot Deepforge - {-1321.64f, -343.73f, 60.4833f, 1.01229f, 30 }, //13284 - Frostwolf Shaman - {-1317.61f, -342.853f, 60.3726f, 2.47837f, 30 }, //13284 - Frostwolf Shaman - {-1319.31f, -344.475f, 60.3825f, 1.72788f, 30 }, //13284 - Frostwolf Shaman - {569.963f, -42.0218f, 37.7581f, 4.27606f, 31 }, //13438 - Wing Commander Slidore - {729.2f, -78.812f, 51.6335f, 3.97935f, 32 }, //13442 - Arch Druid Renferal - {729.118f, -82.8713f, 51.6335f, 2.53073f, 33 }, //13443 - Druid of the Grove - {725.554f, -79.4973f, 51.6335f, 5.27089f, 33 }, //13443 - Druid of the Grove - {724.768f, -84.1642f, 51.6335f, 0.733038f, 33 }, //13443 - Druid of the Grove - {596.68f, -83.0633f, 39.0051f, 6.24828f, 34 }, //13447 - Corporal Noreg Stormpike - {600.032f, -2.92475f, 42.0788f, 5.00909f, 35 }, //13577 - Stormpike Ram Rider Commander - {610.239f, -21.8454f, 43.272f, 4.90438f, 36 }, //13617 - Stormpike Stable Master - {613.422f, -150.764f, 33.4517f, 5.55015f, 37 }, //13797 - Mountaineer Boombellow - {-1213.91f, -370.619f, 56.4455f, 0.837758f, 38 }, //13798 - Jotek - {704.35f, -22.9071f, 50.2187f, 0.785398f, 39 }, //13816 - Prospector Stonehewer - {-1271.24f, -335.766f, 62.3971f, 5.75959f, 40 }, //14185 - Najak Hexxen - {-1268.64f, -332.688f, 62.6171f, 5.28835f, 41 }, //14186 - Ravak Grimtotem - {648.363f, -65.2233f, 41.7405f, 3.12414f, 42 }, //14187 - Athramanis - {648.238f, -67.8931f, 41.7405f, 2.60054f, 43 }, //14188 - Dirk Swindle - {-1223.44f, -309.833f, 64.9331f, 4.0131f, 44 }, //14282 - Frostwolf Bloodhound - {-1226.4f, -307.136f, 64.9706f, 4.0145f, 44 }, //14282 - Frostwolf Bloodhound - {356.001f, -389.969f, -0.438796f, 3.0334f, 45 }, //14283 - Stormpike Owl - {355.835f, -394.005f, -0.60149f, 3.02498f, 45 }, //14283 - Stormpike Owl - {882.266f, -496.378f, 96.7707f, 4.83248f, 45 }, //14283 - Stormpike Owl - {878.649f, -495.917f, 96.6171f, 4.67693f, 45 }, //14283 - Stormpike Owl - {932.851f, -511.017f, 93.6748f, 3.61004f, 45 }, //14283 - Stormpike Owl - {935.806f, -513.983f, 93.7436f, 3.61788f, 45 }, //14283 - Stormpike Owl - {947.412f, -509.982f, 95.1098f, 2.82743f, 46 }, //14284 - Stormpike Battleguard - {934.557f, -512.395f, 93.662f, 3.61004f, 46 }, //14284 - Stormpike Battleguard - {939.42f, -502.777f, 94.5887f, 5.14872f, 46 }, //14284 - Stormpike Battleguard - {854.276f, -494.241f, 96.8017f, 5.44543f, 46 }, //14284 - Stormpike Battleguard - {776.621f, -487.775f, 99.4049f, 3.50811f, 46 }, //14284 - Stormpike Battleguard - {880.169f, -495.699f, 96.6204f, 4.8325f, 46 }, //14284 - Stormpike Battleguard - {773.651f, -497.482f, 99.0408f, 2.11185f, 46 }, //14284 - Stormpike Battleguard - {949.1f, -506.913f, 95.4237f, 3.31613f, 46 }, //14284 - Stormpike Battleguard - {-1370.9f, -219.793f, 98.4258f, 5.04381f, 47}, //drek thar -}; - -const uint32 BG_AV_StaticCreatureInfo[51] = -{ - 2225, // Zora Guthrek - 3343, // Grelkor - 3625, // Rarck - 4255, // Brogus Thunderbrew - 4257, // Lana Thunderbrew - 5134, // Jonivera Farmountain - 5135, // Svalbrad Farmountain - 5139, // Kurdrum Barleybeard - 10364, // Yaelika Farclaw - 10367, // Shrye Ragefist - 10981, // Frostwolf - 10986, // Snowblind Harpy - 10990, // Alterac Ram - 11675, // Snowblind Windcaller - 11678, // Snowblind Ambusher - 11839, // Wildpaw Brute - 11947, // Captain Galvangar - 11948, // Vanndar Stormpike - 11949, // Captain Balinda Stonehearth - 11997, // Stormpike Herald - 12051, // Frostwolf Legionnaire - 12096, // Stormpike Quartermaster - 12097, // Frostwolf Quartermaster - 12127, // Stormpike Guardsman - 13176, // Smith Regzar - 13179, // Wing Commander Guse - 13216, // Gaelden Hammersmith - 13218, // Grunnda Wolfheart - 13236, // Primalist Thurloga - 13257, // Murgot Deepforge - 13284, // Frostwolf Shaman - 13438, // Wing Commander Slidore - 13442, // Arch Druid Renferal - 13443, // Druid of the Grove - 13447, // Corporal Noreg Stormpike - 13577, // Stormpike Ram Rider Commander - 13617, // Stormpike Stable Master - 13797, // Mountaineer Boombellow - 13798, // Jotek - 13816, // Prospector Stonehewer - 14185, // Najak Hexxen - 14186, // Ravak Grimtotem - 14187, // Athramanis - 14188, // Dirk Swindle - 14282, // Frostwolf Bloodhound - 14283, // Stormpike Owl - 14284, // Stormpike Battleguard - 11946, // Drek'Thar - 11948, // Vanndar Stormpike - 11947, // Captain Galvangar - 11949, // Captain Balinda Stonehearth -}; - enum BG_AV_Graveyards { AV_GRAVE_STORM_AID = 751, @@ -1298,19 +568,6 @@ enum BG_AV_Graveyards AV_GRAVE_MAIN_HORDE = 610 }; -const uint32 BG_AV_GraveyardIds[9]= -{ - AV_GRAVE_STORM_AID, - AV_GRAVE_STORM_GRAVE, - AV_GRAVE_STONE_GRAVE, - AV_GRAVE_SNOWFALL, - AV_GRAVE_ICE_GRAVE, - AV_GRAVE_FROSTWOLF, - AV_GRAVE_FROST_HUT, - AV_GRAVE_MAIN_ALLIANCE, - AV_GRAVE_MAIN_HORDE -}; - enum BG_AV_BUFF { /// @todo: Add all other buffs here AV_BUFF_ARMOR = 21163, @@ -1438,13 +695,6 @@ enum BG_AV_WorldStates */ }; -//alliance_control neutral_control horde_control -const uint32 BG_AV_MineWorldStates[2][3] = -{ - {1358, 1360, 1359}, - {1355, 1357, 1356} -}; - enum BG_AV_QuestIds { AV_QUEST_A_SCRAPS1 = 7223, @@ -1479,10 +729,25 @@ enum BG_AV_Objectives AV_OBJECTIVE_DEFEND_GRAVEYARD = 65 }; -struct StaticNodeInfo +enum Texts { - BG_AV_Nodes NodeId; + // Herold + // Towers/Graveyards = 1 - 60 + TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN = 61, + TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN = 62, + TEXT_COLDTOOTH_MINE_HORDE_TAKEN = 63, + TEXT_IRONDEEP_MINE_HORDE_TAKEN = 64, + TEXT_FROSTWOLF_GENERAL_DEAD = 65, /// @todo: sound is missing + TEXT_STORMPIKE_GENERAL_DEAD = 66, /// @todo: sound is missing + TEXT_ALLIANCE_WINS = 67, // NYI /// @todo: sound is missing + TEXT_HORDE_WINS = 68, // NYI /// @todo: sound is missing + // Taskmaster Snivvle + TEXT_SNIVVLE_RANDOM = 0 +}; + +struct StaticNodeInfo +{ struct { uint8 AllianceCapture; @@ -1500,43 +765,7 @@ struct StaticNodeInfo } WorldStateIds; }; -static StaticNodeInfo const BGAVNodeInfo[] = -{ - { BG_AV_NODES_FIRSTAID_STATION, { 47, 48, 45, 46 }, { 1325, 1326, 1327, 1328 } }, // Stormpike First Aid Station - { BG_AV_NODES_STORMPIKE_GRAVE, { 1, 2, 3, 4 }, { 1333, 1335, 1334, 1336 } }, // Stormpike Graveyard - { BG_AV_NODES_STONEHEART_GRAVE, { 55, 56, 53, 54 }, { 1302, 1304, 1301, 1303 } }, // Stoneheart Graveyard - { BG_AV_NODES_SNOWFALL_GRAVE, { 5, 6, 7, 8 }, { 1341, 1343, 1342, 1344 } }, // Snowfall Graveyard - { BG_AV_NODES_ICEBLOOD_GRAVE, { 59, 60, 57, 58 }, { 1346, 1348, 1347, 1349 } }, // Iceblood Graveyard - { BG_AV_NODES_FROSTWOLF_GRAVE, { 9, 10, 11, 12 }, { 1337, 1339, 1338, 1340 } }, // Frostwolf Graveyard - { BG_AV_NODES_FROSTWOLF_HUT, { 51, 52, 49, 50 }, { 1329, 1331, 1330, 1332 } }, // Frostwolf Hut - { BG_AV_NODES_DUNBALDAR_SOUTH, { 16, 15, 14, 13 }, { 1361, 1375, 1370, 1378 } }, // Dunbaldar South Bunker - { BG_AV_NODES_DUNBALDAR_NORTH, { 20, 19, 18, 17 }, { 1362, 1374, 1371, 1379 } }, // Dunbaldar North Bunker - { BG_AV_NODES_ICEWING_BUNKER, { 24, 23, 22, 21 }, { 1363, 1376, 1372, 1380 } }, // Icewing Bunker - { BG_AV_NODES_STONEHEART_BUNKER, { 28, 27, 26, 25 }, { 1364, 1377, 1373, 1381 } }, // Stoneheart Bunker - { BG_AV_NODES_ICEBLOOD_TOWER, { 44, 43, 42, 41 }, { 1368, 1390, 1385, 1395 } }, // Iceblood Tower - { BG_AV_NODES_TOWER_POINT, { 40, 39, 38, 37 }, { 1367, 1389, 1384, 1394 } }, // Tower Point - { BG_AV_NODES_FROSTWOLF_ETOWER, { 36, 35, 34, 33 }, { 1366, 1388, 1383, 1393 } }, // Frostwolf East Tower - { BG_AV_NODES_FROSTWOLF_WTOWER, { 32, 31, 30, 29 }, { 1365, 1387, 1382, 1392 } }, // Frostwolf West Tower -}; - -enum Texts -{ - // Herold - // Towers/Graveyards = 1 - 60 - TEXT_COLDTOOTH_MINE_ALLIANCE_TAKEN = 61, - TEXT_IRONDEEP_MINE_ALLIANCE_TAKEN = 62, - TEXT_COLDTOOTH_MINE_HORDE_TAKEN = 63, - TEXT_IRONDEEP_MINE_HORDE_TAKEN = 64, - TEXT_FROSTWOLF_GENERAL_DEAD = 65, /// @todo: sound is missing - TEXT_STORMPIKE_GENERAL_DEAD = 66, /// @todo: sound is missing - TEXT_ALLIANCE_WINS = 67, // NYI /// @todo: sound is missing - TEXT_HORDE_WINS = 68, // NYI /// @todo: sound is missing - - // Taskmaster Snivvle - TEXT_SNIVVLE_RANDOM = 0 -}; - -struct BG_AV_NodeInfo +struct NodeInfo { BG_AV_States State; BG_AV_States PrevState; @@ -1656,13 +885,7 @@ class BattlegroundAV : public Battleground void PopulateNode(BG_AV_Nodes node); void DePopulateNode(BG_AV_Nodes node); - StaticNodeInfo const* GetStaticNodeInfo(BG_AV_Nodes node) const - { - for (uint8 i = 0; i < BG_AV_NODES_MAX; ++i) - if (BGAVNodeInfo[i].NodeId == node) - return &BGAVNodeInfo[i]; - return nullptr; - } + static StaticNodeInfo const* GetStaticNodeInfo(uint8 node); BG_AV_Nodes GetNodeThroughObject(uint32 object); uint32 GetObjectThroughNode(BG_AV_Nodes node); @@ -1680,19 +903,19 @@ class BattlegroundAV : public Battleground Creature* AddAVCreature(uint16 cinfoid, uint16 type); /*variables */ - int32 m_Team_Scores[2]; - uint32 m_Team_QuestStatus[2][9]; //[x][y] x=team y=questcounter + int32 m_Team_Scores[BG_TEAMS_COUNT]; + uint32 m_Team_QuestStatus[BG_TEAMS_COUNT][9]; //[x][y] x=team y=questcounter - BG_AV_NodeInfo m_Nodes[BG_AV_NODES_MAX]; + NodeInfo m_Nodes[BG_AV_NODES_MAX]; uint32 m_Mine_Owner[2]; uint32 m_Mine_PrevOwner[2]; //only for worldstates needed int32 m_Mine_Timer; //ticks for both teams uint32 m_Mine_Reclaim_Timer[2]; - uint32 m_CaptainBuffTimer[2]; - bool m_CaptainAlive[2]; + uint32 m_CaptainBuffTimer[BG_TEAMS_COUNT]; + bool m_CaptainAlive[BG_TEAMS_COUNT]; - bool m_IsInformedNearVictory[2]; + bool m_IsInformedNearVictory[BG_TEAMS_COUNT]; }; #endif diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp index 6e85e5bcfdfc0..34a8b35ceb8c2 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp @@ -20,9 +20,21 @@ #include "Player.h" #include "WorldPacket.h" +BattlegroundGOSpawnPoint const BG_BE_GameObjects[BG_BE_OBJECT_MAX] = +{ + // gates + { BG_BE_OBJECT_TYPE_DOOR_1, { 6287.277f, 282.1877f, 3.810925f, -2.26019700f }, { 0.f, 0.f, -0.90445420f, 0.4265707f }, RESPAWN_IMMEDIATELY }, + { BG_BE_OBJECT_TYPE_DOOR_2, { 6189.546f, 241.7099f, 3.101481f, 0.88139170f }, { 0.f, 0.f, 0.42656890f, 0.9044551f }, RESPAWN_IMMEDIATELY }, + { BG_BE_OBJECT_TYPE_DOOR_3, { 6299.116f, 296.5494f, 3.308032f, 0.88139180f }, { 0.f, 0.f, 0.42656900f, 0.9044550f }, RESPAWN_IMMEDIATELY }, + { BG_BE_OBJECT_TYPE_DOOR_4, { 6177.708f, 227.3481f, 3.604374f, -2.26019700f }, { 0.f, 0.f, -0.90445420f, 0.4265707f }, RESPAWN_IMMEDIATELY }, + // buffs + { BG_BE_OBJECT_TYPE_BUFF_1, { 6249.042f, 275.3239f, 11.22033f, -1.44862200f }, { 0.f, 0.f, -0.66261960f, 0.7489561f }, 2 * MINUTE }, + { BG_BE_OBJECT_TYPE_BUFF_2, { 6228.260f, 249.5660f, 11.21812f, -0.06981307f }, { 0.f, 0.f, -0.03489876f, 0.9993908f }, 2 * MINUTE } +}; + BattlegroundBE::BattlegroundBE() { - BgObjects.resize(BG_BE_OBJECT_MAX); + SetGameObjectsNumber(BG_BE_OBJECT_MAX); } void BattlegroundBE::StartingEventCloseDoors() @@ -67,17 +79,14 @@ void BattlegroundBE::FillInitialWorldStates(WorldPacket& data) bool BattlegroundBE::SetupBattleground() { - // gates - if (!AddObject(BG_BE_OBJECT_DOOR_1, BG_BE_OBJECT_TYPE_DOOR_1, 6287.277f, 282.1877f, 3.810925f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_BE_OBJECT_DOOR_2, BG_BE_OBJECT_TYPE_DOOR_2, 6189.546f, 241.7099f, 3.101481f, 0.8813917f, 0, 0, 0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_BE_OBJECT_DOOR_3, BG_BE_OBJECT_TYPE_DOOR_3, 6299.116f, 296.5494f, 3.308032f, 0.8813917f, 0, 0, 0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_BE_OBJECT_DOOR_4, BG_BE_OBJECT_TYPE_DOOR_4, 6177.708f, 227.3481f, 3.604374f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_BE_OBJECT_BUFF_1, BG_BE_OBJECT_TYPE_BUFF_1, 6249.042f, 275.3239f, 11.22033f, -1.448624f, 0, 0, 0.6626201f, -0.7489557f, 120) - || !AddObject(BG_BE_OBJECT_BUFF_2, BG_BE_OBJECT_TYPE_BUFF_2, 6228.26f, 249.566f, 11.21812f, -0.06981307f, 0, 0, 0.03489945f, -0.9993908f, 120)) + for (uint32 i = 0; i < BG_BE_OBJECT_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundBE: Failed to spawn some object!"); - return false; + BattlegroundGOSpawnPoint const& object = BG_BE_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundBE: Failed to spawn some object (Entry %u). Battleground not created!", object.Entry); + return false; + } } return true; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp index 22e229a161561..9c16d467ca6be 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp @@ -21,10 +21,27 @@ #include "Player.h" #include "WorldPacket.h" +BattlegroundSpawnPoint const BG_DS_Creatures[BG_DS_NPC_MAX] = +{ + { BG_DS_NPC_TYPE_WATER_SPOUT, { 1292.587f, 790.2205f, 7.197960f, 3.054326f }, RESPAWN_IMMEDIATELY }, + { BG_DS_NPC_TYPE_WATER_SPOUT, { 1369.977f, 817.2882f, 16.08718f, 3.106686f }, RESPAWN_IMMEDIATELY }, + { BG_DS_NPC_TYPE_WATER_SPOUT, { 1212.833f, 765.3871f, 16.09484f, 0.000000f }, RESPAWN_IMMEDIATELY } +}; + +BattlegroundGOSpawnPoint const BG_DS_GameObjects[BG_DS_OBJECT_MAX] = +{ + { BG_DS_OBJECT_TYPE_DOOR_1, { 1350.95f, 817.200f, 20.8096f, 3.15000f }, { 0.f, 0.f, 0.9962700f, 0.0862864f }, RESPAWN_IMMEDIATELY }, + { BG_DS_OBJECT_TYPE_DOOR_2, { 1232.65f, 764.913f, 20.0729f, 6.30000f }, { 0.f, 0.f, 0.0310211f, -0.9995190f }, RESPAWN_IMMEDIATELY }, + { BG_DS_OBJECT_TYPE_WATER_1, { 1291.56f, 790.837f, 7.10000f, 3.14238f }, { 0.f, 0.f, 0.6942150f, -0.7197680f }, 2 * MINUTE }, + { BG_DS_OBJECT_TYPE_WATER_2, { 1291.56f, 790.837f, 7.10000f, 3.14238f }, { 0.f, 0.f, 0.6942150f, -0.7197680f }, 2 * MINUTE }, + { BG_DS_OBJECT_TYPE_BUFF_1, { 1291.70f, 813.424f, 7.11472f, 4.64562f }, { 0.f, 0.f, 0.7303140f, -0.6831110f }, 2 * MINUTE }, + { BG_DS_OBJECT_TYPE_BUFF_2, { 1291.70f, 768.911f, 7.11472f, 1.55194f }, { 0.f, 0.f, 0.7004090f, 0.7137420f }, 2 * MINUTE } +}; + BattlegroundDS::BattlegroundDS() { - BgObjects.resize(BG_DS_OBJECT_MAX); - BgCreatures.resize(BG_DS_NPC_MAX); + SetGameObjectsNumber(BG_DS_OBJECT_MAX); + SetCreaturesNumber(BG_DS_NPC_MAX); _pipeKnockBackTimer = 0; _pipeKnockBackCount = 0; @@ -152,22 +169,24 @@ void BattlegroundDS::FillInitialWorldStates(WorldPacket& data) bool BattlegroundDS::SetupBattleground() { - // gates - if (!AddObject(BG_DS_OBJECT_DOOR_1, BG_DS_OBJECT_TYPE_DOOR_1, 1350.95f, 817.2f, 20.8096f, 3.15f, 0, 0, 0.99627f, 0.0862864f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_DS_OBJECT_DOOR_2, BG_DS_OBJECT_TYPE_DOOR_2, 1232.65f, 764.913f, 20.0729f, 6.3f, 0, 0, 0.0310211f, -0.999519f, RESPAWN_IMMEDIATELY) - // water - || !AddObject(BG_DS_OBJECT_WATER_1, BG_DS_OBJECT_TYPE_WATER_1, 1291.56f, 790.837f, 7.1f, 3.14238f, 0, 0, 0.694215f, -0.719768f, 120) - || !AddObject(BG_DS_OBJECT_WATER_2, BG_DS_OBJECT_TYPE_WATER_2, 1291.56f, 790.837f, 7.1f, 3.14238f, 0, 0, 0.694215f, -0.719768f, 120) - // buffs - || !AddObject(BG_DS_OBJECT_BUFF_1, BG_DS_OBJECT_TYPE_BUFF_1, 1291.7f, 813.424f, 7.11472f, 4.64562f, 0, 0, 0.730314f, -0.683111f, 120) - || !AddObject(BG_DS_OBJECT_BUFF_2, BG_DS_OBJECT_TYPE_BUFF_2, 1291.7f, 768.911f, 7.11472f, 1.55194f, 0, 0, 0.700409f, 0.713742f, 120) - // knockback creatures - || !AddCreature(BG_DS_NPC_TYPE_WATER_SPOUT, BG_DS_NPC_WATERFALL_KNOCKBACK, 1292.587f, 790.2205f, 7.19796f, 3.054326f, TEAM_NEUTRAL, RESPAWN_IMMEDIATELY) - || !AddCreature(BG_DS_NPC_TYPE_WATER_SPOUT, BG_DS_NPC_PIPE_KNOCKBACK_1, 1369.977f, 817.2882f, 16.08718f, 3.106686f, TEAM_NEUTRAL, RESPAWN_IMMEDIATELY) - || !AddCreature(BG_DS_NPC_TYPE_WATER_SPOUT, BG_DS_NPC_PIPE_KNOCKBACK_2, 1212.833f, 765.3871f, 16.09484f, 0.0f, TEAM_NEUTRAL, RESPAWN_IMMEDIATELY)) + for (uint32 i = 0; i < BG_DS_NPC_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundDS: Failed to spawn some object!"); - return false; + BattlegroundSpawnPoint const& creature = BG_DS_Creatures[i]; + if (!AddCreature(creature.Entry, i, creature.Pos, creature.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundDS: Failed to spawn Creature! (Entry: %u). Battleground not created!", creature.Entry); + return false; + } + } + + for (uint32 i = 0; i < BG_DS_OBJECT_MAX; ++i) + { + BattlegroundGOSpawnPoint const& object = BG_DS_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundDS: Failed to spawn GameObject! (Entry: %u). Battleground not created!", object.Entry); + return false; + } } return true; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index e52106a8efe51..f0c65e6ff2c0f 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -25,6 +25,84 @@ #include "Util.h" #include "ObjectAccessor.h" +BattlegroundGOSpawnPoint const BG_EY_GameObjects[BG_EY_OBJECT_MAX] = +{ + // doors + { BG_OBJECT_A_DOOR_EY_ENTRY, { 2527.600000f, 1596.910000f, 1262.130000f, -3.124140f }, { -0.173642f, -0.001515f, 0.9847700f, -0.008594f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_H_DOOR_EY_ENTRY, { 1803.210000f, 1539.490000f, 1261.090000f, 3.141590f }, { 0.173648f, 0.000000f, 0.9848080f, 0.000000f }, RESPAWN_IMMEDIATELY }, + // banners (alliance) + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2057.460000f, 1735.070000f, 1187.910000f, -0.925024f }, { 0.000000f, 0.000000f, 0.4461980f, -0.894934f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2032.250000f, 1729.530000f, 1190.330000f, 1.867500f }, { 0.000000f, 0.000000f, 0.8038570f, 0.594823f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2092.350000f, 1775.460000f, 1187.080000f, -0.401426f }, { 0.000000f, 0.000000f, 0.1993680f, -0.979925f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2047.190000f, 1349.190000f, 1189.000000f, -1.623160f }, { 0.000000f, 0.000000f, 0.7253740f, -0.688354f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2074.320000f, 1385.780000f, 1194.720000f, 0.488692f }, { 0.000000f, 0.000000f, 0.2419220f, 0.970296f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2025.130000f, 1386.120000f, 1192.740000f, 2.391100f }, { 0.000000f, 0.000000f, 0.9304180f, 0.366501f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2276.800000f, 1400.410000f, 1196.330000f, 2.443460f }, { 0.000000f, 0.000000f, 0.9396930f, 0.342020f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2305.780000f, 1404.560000f, 1199.380000f, 1.745330f }, { 0.000000f, 0.000000f, 0.7660440f, 0.642788f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2245.400000f, 1366.410000f, 1195.280000f, 2.216570f }, { 0.000000f, 0.000000f, 0.8949340f, 0.446198f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2270.840000f, 1784.080000f, 1186.760000f, 2.426010f }, { 0.000000f, 0.000000f, 0.9366720f, 0.350207f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2269.130000f, 1737.700000f, 1186.660000f, 0.994838f }, { 0.000000f, 0.000000f, 0.4771590f, 0.878817f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_A_BANNER_EY_ENTRY, { 2300.860000f, 1741.250000f, 1187.700000f, -0.785398f }, { 0.000000f, 0.000000f, 0.3826830f, -0.923880f }, RESPAWN_ONE_DAY }, + // banners (horde) + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2057.460000f, 1735.070000f, 1187.910000f, -0.925024f }, { 0.000000f, 0.000000f, 0.4461980f, -0.894934f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2032.250000f, 1729.530000f, 1190.330000f, 1.867500f }, { 0.000000f, 0.000000f, 0.8038570f, 0.594823f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2092.350000f, 1775.460000f, 1187.080000f, -0.401426f }, { 0.000000f, 0.000000f, 0.1993680f, -0.979925f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2047.190000f, 1349.190000f, 1189.000000f, -1.623160f }, { 0.000000f, 0.000000f, 0.7253740f, -0.688354f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2074.320000f, 1385.780000f, 1194.720000f, 0.488692f }, { 0.000000f, 0.000000f, 0.2419220f, 0.970296f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2025.130000f, 1386.120000f, 1192.740000f, 2.391100f }, { 0.000000f, 0.000000f, 0.9304180f, 0.366501f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2276.800000f, 1400.410000f, 1196.330000f, 2.443460f }, { 0.000000f, 0.000000f, 0.9396930f, 0.342020f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2305.780000f, 1404.560000f, 1199.380000f, 1.745330f }, { 0.000000f, 0.000000f, 0.7660440f, 0.642788f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2245.400000f, 1366.410000f, 1195.280000f, 2.216570f }, { 0.000000f, 0.000000f, 0.8949340f, 0.446198f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2270.840000f, 1784.080000f, 1186.760000f, 2.426010f }, { 0.000000f, 0.000000f, 0.9366720f, 0.350207f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2269.130000f, 1737.700000f, 1186.660000f, 0.994838f }, { 0.000000f, 0.000000f, 0.4771590f, 0.878817f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_H_BANNER_EY_ENTRY, { 2300.860000f, 1741.250000f, 1187.700000f, -0.785398f }, { 0.000000f, 0.000000f, 0.3826830f, -0.923880f }, RESPAWN_ONE_DAY }, + // banners (natural) + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2057.460000f, 1735.070000f, 1187.910000f, -0.925024f }, { 0.000000f, 0.000000f, 0.4461980f, -0.894934f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2032.250000f, 1729.530000f, 1190.330000f, 1.867500f }, { 0.000000f, 0.000000f, 0.8038570f, 0.594823f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2092.350000f, 1775.460000f, 1187.080000f, -0.401426f }, { 0.000000f, 0.000000f, 0.1993680f, -0.979925f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2047.190000f, 1349.190000f, 1189.000000f, -1.623160f }, { 0.000000f, 0.000000f, 0.7253740f, -0.688354f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2074.320000f, 1385.780000f, 1194.720000f, 0.488692f }, { 0.000000f, 0.000000f, 0.2419220f, 0.970296f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2025.130000f, 1386.120000f, 1192.740000f, 2.391100f }, { 0.000000f, 0.000000f, 0.9304180f, 0.366501f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2276.800000f, 1400.410000f, 1196.330000f, 2.443460f }, { 0.000000f, 0.000000f, 0.9396930f, 0.342020f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2305.780000f, 1404.560000f, 1199.380000f, 1.745330f }, { 0.000000f, 0.000000f, 0.7660440f, 0.642788f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2245.400000f, 1366.410000f, 1195.280000f, 2.216570f }, { 0.000000f, 0.000000f, 0.8949340f, 0.446198f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2270.840000f, 1784.080000f, 1186.760000f, 2.426010f }, { 0.000000f, 0.000000f, 0.9366720f, 0.350207f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2269.130000f, 1737.700000f, 1186.660000f, 0.994838f }, { 0.000000f, 0.000000f, 0.4771590f, 0.878817f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_N_BANNER_EY_ENTRY, { 2300.860000f, 1741.250000f, 1187.700000f, -0.785398f }, { 0.000000f, 0.000000f, 0.3826830f, -0.923880f }, RESPAWN_ONE_DAY }, + // tower cap + { BG_OBJECT_FR_TOWER_CAP_EY_ENTRY, { 2024.600708f, 1742.819580f, 1195.157715f, 2.443461f }, { 0.000000f, 0.000000f, 0.9396930f, 0.342020f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_BE_TOWER_CAP_EY_ENTRY, { 2050.493164f, 1372.235962f, 1194.563477f, 1.710423f }, { 0.000000f, 0.000000f, 0.7547100f, 0.656059f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_DR_TOWER_CAP_EY_ENTRY, { 2301.010498f, 1386.931641f, 1197.183472f, 1.570796f }, { 0.000000f, 0.000000f, 0.7071070f, 0.707107f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, { 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f }, { 0.000000f, 0.000000f, 0.8191520f, 0.573576f }, RESPAWN_ONE_DAY }, + // flags + { BG_OBJECT_FLAG2_EY_ENTRY, { 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f }, { 0.000000f, 0.000000f, 0.6626200f, -0.748956f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_FLAG1_EY_ENTRY, { 2044.280000f, 1729.680000f, 1189.960000f, -0.017453f }, { 0.000000f, 0.000000f, 0.0087270f, -0.999962f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_FLAG1_EY_ENTRY, { 2048.830000f, 1393.650000f, 1194.490000f, 0.209440f }, { 0.000000f, 0.000000f, 0.1045280f, 0.994522f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_FLAG1_EY_ENTRY, { 2286.560000f, 1402.360000f, 1197.110000f, 3.723810f }, { 0.000000f, 0.000000f, 0.9579260f, -0.287016f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_FLAG1_EY_ENTRY, { 2284.480000f, 1731.230000f, 1189.990000f, 2.897250f }, { 0.000000f, 0.000000f, 0.9925460f, 0.121869f }, RESPAWN_ONE_DAY }, + // buffs + { BG_OBJECT_SPEED_BUFF_BLOOD_ELF, { 2050.468000f, 1372.202000f, 1194.563000f, 1.675514f }, { 0.000000f, 0.000000f, 0.7431440f, 0.6691315f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_RESTORATION_BLOOD_ELF, { 2050.468000f, 1372.202000f, 1194.563000f, 1.675514f }, { 0.000000f, 0.000000f, 0.7431440f, 0.6691315f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_BERSERK_BLOOD_ELF, { 2050.468000f, 1372.202000f, 1194.563000f, 1.675514f }, { 0.000000f, 0.000000f, 0.7431440f, 0.6691315f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_SPEED_BUFF_FEL_REAVER, { 2046.463000f, 1749.167000f, 1190.010000f, 5.410522f }, { 0.000000f, 0.000000f, -0.4226179f, 0.9063079f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_RESTORATION_FEL_REAVER, { 2046.463000f, 1749.167000f, 1190.010000f, 5.410522f }, { 0.000000f, 0.000000f, -0.4226179f, 0.9063079f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_BERSERK_FEL_REAVER, { 2046.463000f, 1749.167000f, 1190.010000f, 5.410522f }, { 0.000000f, 0.000000f, -0.4226179f, 0.9063079f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_SPEED_BUFF_MAGE_TOWER, { 2283.710000f, 1748.870000f, 1189.707000f, -1.500983f }, { 0.000000f, 0.000000f, -0.6819983f, 0.7313538f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_RESTORATION_MAGE_TOWER, { 2283.710000f, 1748.870000f, 1189.707000f, -1.500983f }, { 0.000000f, 0.000000f, -0.6819983f, 0.7313538f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_BERSERK_MAGE_TOWER, { 2283.710000f, 1748.870000f, 1189.707000f, -1.500983f }, { 0.000000f, 0.000000f, -0.6819983f, 0.7313538f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_SPEED_BUFF_DRAENEI_RUINS, { 2302.477000f, 1391.245000f, 1197.736000f, 1.762782f }, { 0.000000f, 0.000000f, 0.7716246f, 0.6360782f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_RESTORATION_DRAENEI_RUINS, { 2302.477000f, 1391.245000f, 1197.736000f, 1.762782f }, { 0.000000f, 0.000000f, 0.7716246f, 0.6360782f }, RESPAWN_ONE_DAY }, + { BG_OBJECT_BERSERK_DRAENEI_RUINS, { 2302.477000f, 1391.245000f, 1197.736000f, 1.762782f }, { 0.000000f, 0.000000f, 0.7716246f, 0.6360782f }, RESPAWN_ONE_DAY } +}; + +std::vector const buffEntries = +{ + { BG_OBJECT_SPEED_BUFF_BLOOD_ELF, BG_OBJECT_RESTORATION_BLOOD_ELF, BG_OBJECT_BERSERK_BLOOD_ELF }, + { BG_OBJECT_SPEED_BUFF_FEL_REAVER, BG_OBJECT_RESTORATION_FEL_REAVER, BG_OBJECT_BERSERK_FEL_REAVER }, + { BG_OBJECT_SPEED_BUFF_MAGE_TOWER, BG_OBJECT_RESTORATION_MAGE_TOWER, BG_OBJECT_BERSERK_MAGE_TOWER }, + { BG_OBJECT_SPEED_BUFF_DRAENEI_RUINS, BG_OBJECT_RESTORATION_DRAENEI_RUINS, BG_OBJECT_BERSERK_DRAENEI_RUINS } +}; + // these variables aren't used outside of this file, so declare them only here uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] = { @@ -32,11 +110,49 @@ uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] = 160 // holiday }; +Position const BG_EY_TriggerPositions[EY_POINTS_MAX] = +{ + { 2044.28f, 1729.68f, 1189.96f, 0.017453f }, // FEL_REAVER center + { 2048.83f, 1393.65f, 1194.49f, 0.20944f }, // BLOOD_ELF center + { 2286.56f, 1402.36f, 1197.11f, 3.72381f }, // DRAENEI_RUINS center + { 2284.48f, 1731.23f, 1189.99f, 2.89725f } // MAGE_TOWER center +}; + +uint8 const BG_EY_TickPoints[EY_POINTS_MAX] = { 1, 2, 5, 10 }; +uint32 const BG_EY_FlagPoints[EY_POINTS_MAX] = { 75, 85, 100, 500 }; + +//constant arrays: +BattlegroundEYPointIconsStruct const m_PointsIconStruct[EY_POINTS_MAX] = +{ + { FEL_REAVER_UNCONTROL, FEL_REAVER_ALLIANCE_CONTROL, FEL_REAVER_HORDE_CONTROL }, + { BLOOD_ELF_UNCONTROL, BLOOD_ELF_ALLIANCE_CONTROL, BLOOD_ELF_HORDE_CONTROL }, + { DRAENEI_RUINS_UNCONTROL, DRAENEI_RUINS_ALLIANCE_CONTROL, DRAENEI_RUINS_HORDE_CONTROL }, + { MAGE_TOWER_UNCONTROL, MAGE_TOWER_ALLIANCE_CONTROL, MAGE_TOWER_HORDE_CONTROL } +}; + +BattlegroundEYLosingPointStruct const m_LosingPointTypes[EY_POINTS_MAX] = +{ + { BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_LOST_A_F_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_LOST_H_F_RUINS }, + { BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_LOST_A_B_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_LOST_H_B_TOWER }, + { BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_LOST_A_D_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_LOST_H_D_RUINS }, + { BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_LOST_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_LOST_H_M_TOWER } +}; + +BattlegroundEYCapturingPointStruct const m_CapturingPointTypes[EY_POINTS_MAX] = +{ + { BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_TAKEN_A_F_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_TAKEN_H_F_RUINS, EY_GRAVEYARD_FEL_REAVER }, + { BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_TAKEN_A_B_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_TAKEN_H_B_TOWER, EY_GRAVEYARD_BLOOD_ELF }, + { BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_TAKEN_A_D_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_TAKEN_H_D_RUINS, EY_GRAVEYARD_DRAENEI_RUINS }, + { BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_H_M_TOWER, EY_GRAVEYARD_MAGE_TOWER } +}; + BattlegroundEY::BattlegroundEY() { - m_BuffChange = true; - BgObjects.resize(BG_EY_OBJECT_MAX); - BgCreatures.resize(BG_EY_CREATURES_MAX); + SetChangeBuffs(true, &buffEntries); + + SetGameObjectsNumber(BG_EY_OBJECT_MAX); + SetCreaturesNumber(BG_EY_CREATURES_MAX); + m_Points_Trigger[FEL_REAVER] = TR_FEL_REAVER_BUFF; m_Points_Trigger[BLOOD_ELF] = TR_BLOOD_ELF_BUFF; m_Points_Trigger[DRAENEI_RUINS] = TR_DRAENEI_RUINS_BUFF; @@ -61,7 +177,7 @@ BattlegroundEY::BattlegroundEY() m_PointBarStatus[i] = BG_EY_PROGRESS_BAR_STATE_MIDDLE; } - for (uint8 i = 0; i < 2 * EY_POINTS_MAX; ++i) + for (uint8 i = 0; i < BG_TEAMS_COUNT * EY_POINTS_MAX; ++i) m_CurrentPointPlayersCount[i] = 0; StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_EY_START_TWO_MINUTES; @@ -107,10 +223,10 @@ void BattlegroundEY::PostUpdateImpl(uint32 diff) /*I used this order of calls, because although we will check if one player is in gameobject's distance 2 times but we can count of players on current point in CheckSomeoneLeftPoint */ - this->CheckSomeoneJoinedPoint(); + CheckSomeoneJoinedPoint(); //check if player left point - this->CheckSomeoneLeftPoint(); - this->UpdatePointStatuses(); + CheckSomeoneLeftPoint(); + UpdatePointStatuses(); m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME; } } @@ -132,11 +248,12 @@ void BattlegroundEY::StartingEventOpenDoors() for (uint32 i = BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER; i <= BG_EY_OBJECT_FLAG_NETHERSTORM; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); + for (uint32 i = 0; i < EY_POINTS_MAX; ++i) { //randomly spawn buff - uint8 buff = urand(0, 2); - SpawnBGObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + buff + i * 3, RESPAWN_IMMEDIATELY); + uint8 buff = urand(0, BG_MAX_BUFFS - 1); + SpawnBGObject(BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF + i * BG_MAX_BUFFS + buff, RESPAWN_IMMEDIATELY); } // Achievement: Flurry @@ -158,20 +275,17 @@ void BattlegroundEY::AddPoints(uint32 Team, uint32 Points) void BattlegroundEY::CheckSomeoneJoinedPoint() { - GameObject* obj = NULL; for (uint8 i = 0; i < EY_POINTS_MAX; ++i) { - obj = GetBgMap()->GetGameObject(BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REAVER + i]); - - if (obj) + if (GameObject* obj = GetBGObject(BG_EY_OBJECT_TOWER_CAP_FEL_REAVER + i)) { uint8 j = 0; - while (j < m_PlayersNearPoint[EY_POINTS_MAX].size()) + while (j < m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].size()) { - Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]); + Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS][j]); if (!player) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) could not be found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString().c_str()); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) could not be found!", m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS][j].ToString().c_str()); ++j; continue; } @@ -183,9 +297,9 @@ void BattlegroundEY::CheckSomeoneJoinedPoint() UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[i], player); UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW, player); //add player to point - m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[EY_POINTS_MAX][j]); + m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS][j]); //remove player from "free space" - m_PlayersNearPoint[EY_POINTS_MAX].erase(m_PlayersNearPoint[EY_POINTS_MAX].begin() + j); + m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].erase(m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].begin() + j); } else ++j; @@ -197,14 +311,12 @@ void BattlegroundEY::CheckSomeoneJoinedPoint() void BattlegroundEY::CheckSomeoneLeftPoint() { //reset current point counts - for (uint8 i = 0; i < 2*EY_POINTS_MAX; ++i) + for (uint8 i = 0; i < BG_TEAMS_COUNT * EY_POINTS_MAX; ++i) m_CurrentPointPlayersCount[i] = 0; - GameObject* obj = NULL; + for (uint8 i = 0; i < EY_POINTS_MAX; ++i) { - obj = GetBgMap()->GetGameObject(BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REAVER + i]); - - if (obj) + if (GameObject* obj = GetBGObject(BG_EY_OBJECT_TOWER_CAP_FEL_REAVER + i)) { uint8 j = 0; while (j < m_PlayersNearPoint[i].size()) @@ -212,23 +324,24 @@ void BattlegroundEY::CheckSomeoneLeftPoint() Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[i][j]); if (!player) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) could not be found!", m_PlayersNearPoint[i][j].ToString().c_str()); //move non-existing players to "free space" - this will cause many errors showing in log, but it is a very important bug - m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) could not be found!", m_PlayersNearPoint[i][j].ToString().c_str()); + m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].push_back(m_PlayersNearPoint[i][j]); m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); continue; } + if (!player->CanCaptureTowerPoint() || !player->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS)) - //move player out of point (add him to players that are out of points { - m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); + //move player out of point (add him to players that are out of points + m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].push_back(m_PlayersNearPoint[i][j]); m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); - this->UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW, player); + UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW, player); } else { - //player is neat flag, so update count: - m_CurrentPointPlayersCount[2 * i + GetTeamIndexByTeamId(player->GetTeam())]++; + //player is near flag, so update count + ++m_CurrentPointPlayersCount[BG_TEAMS_COUNT * i + GetTeamIndexByTeamId(player->GetTeam())]; ++j; } } @@ -242,8 +355,12 @@ void BattlegroundEY::UpdatePointStatuses() { if (m_PlayersNearPoint[point].empty()) continue; + + int32 allianceCount = m_CurrentPointPlayersCount[BG_TEAMS_COUNT * point + TEAM_ALLIANCE]; + int32 hordeCount = m_CurrentPointPlayersCount[BG_TEAMS_COUNT * point + TEAM_HORDE]; + //count new point bar status: - m_PointBarStatus[point] += (m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] < BG_EY_POINT_MAX_CAPTURERS_COUNT) ? m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] : BG_EY_POINT_MAX_CAPTURERS_COUNT; + m_PointBarStatus[point] += std::min(allianceCount - hordeCount, BG_EY_POINT_MAX_CAPTURERS_COUNT); if (m_PointBarStatus[point] > BG_EY_PROGRESS_BAR_ALI_CONTROLLED) //point is fully alliance's @@ -266,17 +383,17 @@ void BattlegroundEY::UpdatePointStatuses() Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[point][i]); if (player) { - this->UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[point], player); + UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[point], player); //if point owner changed we must evoke event! if (pointOwnerTeamId != m_PointOwnedByTeam[point]) { //point was uncontrolled and player is from team which captured point if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && player->GetTeam() == pointOwnerTeamId) - this->EventTeamCapturedPoint(player, point); + EventTeamCapturedPoint(player, EYBattlegroundPoints(point)); //point was under control and player isn't from team which controlled it if (m_PointState[point] == EY_POINT_UNDER_CONTROL && player->GetTeam() != m_PointOwnedByTeam[point]) - this->EventTeamLostPoint(player, point); + EventTeamLostPoint(player, EYBattlegroundPoints(point)); } /// @workaround The original AreaTrigger is covered by a bigger one and not triggered on client side. @@ -340,7 +457,7 @@ void BattlegroundEY::UpdatePointsCount(uint32 Team) UpdateWorldState(EY_HORDE_BASE, m_TeamPointsCount[TEAM_HORDE]); } -void BattlegroundEY::UpdatePointsIcons(uint32 Team, uint32 Point) +void BattlegroundEY::UpdatePointsIcons(uint32 Team, EYBattlegroundPoints Point) { //we MUST firstly send 0, after that we can send 1!!! if (m_PointState[Point] == EY_POINT_UNDER_CONTROL) @@ -366,18 +483,19 @@ void BattlegroundEY::AddPlayer(Player* player) Battleground::AddPlayer(player); PlayerScores[player->GetGUID().GetCounter()] = new BattlegroundEYScore(player->GetGUID()); - m_PlayersNearPoint[EY_POINTS_MAX].push_back(player->GetGUID()); + m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].push_back(player->GetGUID()); } void BattlegroundEY::RemovePlayer(Player* player, ObjectGuid guid, uint32 /*team*/) { // sometimes flag aura not removed :( - for (int j = EY_POINTS_MAX; j >= 0; --j) + for (int32 j = EY_PLAYERS_OUT_OF_POINTS; j >= 0; --j) { for (size_t i = 0; i < m_PlayersNearPoint[j].size(); ++i) if (m_PlayersNearPoint[j][i] == guid) m_PlayersNearPoint[j].erase(m_PlayersNearPoint[j].begin() + i); } + if (IsFlagPickedup()) { if (m_FlagKeeper == guid) @@ -443,91 +561,26 @@ void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger) bool BattlegroundEY::SetupBattleground() { - // doors - if (!AddObject(BG_EY_OBJECT_DOOR_A, BG_OBJECT_A_DOOR_EY_ENTRY, 2527.6f, 1596.91f, 1262.13f, -3.12414f, -0.173642f, -0.001515f, 0.98477f, -0.008594f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_EY_OBJECT_DOOR_H, BG_OBJECT_H_DOOR_EY_ENTRY, 1803.21f, 1539.49f, 1261.09f, 3.14159f, 0.173648f, 0, 0.984808f, 0, RESPAWN_IMMEDIATELY) - // banners (alliance) - || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY) - // banners (horde) - || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY) - // banners (natural) - || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY) - // flags - || !AddObject(BG_EY_OBJECT_FLAG_NETHERSTORM, BG_OBJECT_FLAG2_EY_ENTRY, 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f, 0, 0, 0.662620f, -0.748956f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_FEL_REAVER, BG_OBJECT_FLAG1_EY_ENTRY, 2044.28f, 1729.68f, 1189.96f, -0.017453f, 0, 0, 0.008727f, -0.999962f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_BLOOD_ELF, BG_OBJECT_FLAG1_EY_ENTRY, 2048.83f, 1393.65f, 1194.49f, 0.20944f, 0, 0, 0.104528f, 0.994522f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_DRAENEI_RUINS, BG_OBJECT_FLAG1_EY_ENTRY, 2286.56f, 1402.36f, 1197.11f, 3.72381f, 0, 0, 0.957926f, -0.287016f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_MAGE_TOWER, BG_OBJECT_FLAG1_EY_ENTRY, 2284.48f, 1731.23f, 1189.99f, 2.89725f, 0, 0, 0.992546f, 0.121869f, RESPAWN_ONE_DAY) - // tower cap - || !AddObject(BG_EY_OBJECT_TOWER_CAP_FEL_REAVER, BG_OBJECT_FR_TOWER_CAP_EY_ENTRY, 2024.600708f, 1742.819580f, 1195.157715f, 2.443461f, 0, 0, 0.939693f, 0.342020f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF, BG_OBJECT_BE_TOWER_CAP_EY_ENTRY, 2050.493164f, 1372.235962f, 1194.563477f, 1.710423f, 0, 0, 0.754710f, 0.656059f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS, BG_OBJECT_DR_TOWER_CAP_EY_ENTRY, 2301.010498f, 1386.931641f, 1197.183472f, 1.570796f, 0, 0, 0.707107f, 0.707107f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY) -) - { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some objects. The battleground was not created."); - return false; - } - - //buffs - for (int i = 0; i < EY_POINTS_MAX; ++i) + for (uint32 i = 0; i < BG_EY_OBJECT_MAX; ++i) { - AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(m_Points_Trigger[i]); - if (!at) + BattlegroundGOSpawnPoint const& object = BG_EY_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown trigger: %u", m_Points_Trigger[i]); - continue; + TC_LOG_ERROR("bg.battleground", "BattleGroundEY: Failed to spawn GameObject! (Entry: %u). Battleground not created!", object.Entry); + return false; } - if (!AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3, Buff_Entries[0], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 1, Buff_Entries[1], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 2, Buff_Entries[2], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) -) - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Could not spawn Speedbuff Fel Reaver."); } - WorldSafeLocsEntry const* sg = NULL; + WorldSafeLocsEntry const* sg = nullptr; sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_ALLIANCE); - if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, TEAM_ALLIANCE)) + if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, Position(sg->x, sg->y, sg->z, 3.124139f), TEAM_ALLIANCE)) { TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; } sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_HORDE); - if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, TEAM_HORDE)) + if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, Position(sg->x, sg->y, sg->z, 3.193953f), TEAM_HORDE)) { TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; @@ -640,9 +693,9 @@ void BattlegroundEY::EventPlayerDroppedFlag(Player* player) UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_WAIT_RESPAWN); if (player->GetTeam() == ALLIANCE) - SendMessageToAll(LANG_BG_EY_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL); + SendMessageToAll(LANG_BG_EY_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, nullptr); else - SendMessageToAll(LANG_BG_EY_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, NULL); + SendMessageToAll(LANG_BG_EY_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, nullptr); } void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj) @@ -672,12 +725,12 @@ void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* target player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); if (player->GetTeam() == ALLIANCE) - PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, player->GetName().c_str()); + PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, nullptr, player->GetName().c_str()); else - PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, NULL, player->GetName().c_str()); + PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, nullptr, player->GetName().c_str()); } -void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 Point) +void BattlegroundEY::EventTeamLostPoint(Player* player, EYBattlegroundPoints Point) { if (GetStatus() != STATUS_IN_PROGRESS) return; @@ -690,22 +743,19 @@ void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 Point) if (Team == ALLIANCE) { - m_TeamPointsCount[TEAM_ALLIANCE]--; - SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance, RESPAWN_ONE_DAY); - SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + 1, RESPAWN_ONE_DAY); - SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + 2, RESPAWN_ONE_DAY); + --m_TeamPointsCount[TEAM_ALLIANCE]; + for (uint32 i = 0; i < BG_EY_POINT_BANNERS; ++i) + SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeAlliance + i, RESPAWN_ONE_DAY); } else { - m_TeamPointsCount[TEAM_HORDE]--; - SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde, RESPAWN_ONE_DAY); - SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + 1, RESPAWN_ONE_DAY); - SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + 2, RESPAWN_ONE_DAY); + --m_TeamPointsCount[TEAM_HORDE]; + for (uint32 i = 0; i < BG_EY_POINT_BANNERS; ++i) + SpawnBGObject(m_LosingPointTypes[Point].DespawnObjectTypeHorde + i, RESPAWN_ONE_DAY); } - SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType, RESPAWN_IMMEDIATELY); - SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + 1, RESPAWN_IMMEDIATELY); - SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + 2, RESPAWN_IMMEDIATELY); + for (uint32 i = 0; i < BG_EY_POINT_BANNERS; ++i) + SpawnBGObject(m_LosingPointTypes[Point].SpawnNeutralObjectType + i, RESPAWN_IMMEDIATELY); //buff isn't despawned @@ -722,33 +772,33 @@ void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 Point) //remove bonus honor aura trigger creature when node is lost if (Point < EY_POINTS_MAX) - DelCreature(Point + 6);//NULL checks are in DelCreature! 0-5 spirit guides + DelCreature(Point + 6); //NULL checks are in DelCreature! 0-5 spirit guides } -void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point) +void BattlegroundEY::EventTeamCapturedPoint(Player* player, EYBattlegroundPoints Point) { if (GetStatus() != STATUS_IN_PROGRESS) return; + if (Point >= EY_POINTS_MAX) + return; + uint32 Team = player->GetTeam(); - SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType, RESPAWN_ONE_DAY); - SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY); - SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY); + for (uint32 i = 0; i < BG_EY_POINT_BANNERS; ++i) + SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + i, RESPAWN_ONE_DAY); if (Team == ALLIANCE) { - m_TeamPointsCount[TEAM_ALLIANCE]++; - SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY); - SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY); - SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY); + ++m_TeamPointsCount[TEAM_ALLIANCE]; + for (uint32 i = 0; i < BG_EY_POINT_BANNERS; ++i) + SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + i, RESPAWN_IMMEDIATELY); } else { - m_TeamPointsCount[TEAM_HORDE]++; - SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY); - SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY); - SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY); + ++m_TeamPointsCount[TEAM_HORDE]; + for (uint32 i = 0; i < BG_EY_POINT_BANNERS; ++i) + SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + i, RESPAWN_IMMEDIATELY); } //buff isn't respawned @@ -761,26 +811,22 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point) else SendMessageToAll(m_CapturingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, player); - if (BgCreatures[Point]) - DelCreature(Point); + DelCreature(Point); - WorldSafeLocsEntry const* sg = NULL; + WorldSafeLocsEntry const* sg = nullptr; sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId); - if (!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, GetTeamIndexByTeamId(Team))) + if (!sg || !AddSpiritGuide(Point, Position(sg->x, sg->y, sg->z, 3.124139f), GetTeamIndexByTeamId(Team))) TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide. point: %u, team: %u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId); -// SpawnBGCreature(Point, RESPAWN_IMMEDIATELY); + // SpawnBGCreature(Point, RESPAWN_IMMEDIATELY); UpdatePointsIcons(Team, Point); UpdatePointsCount(Team); - if (Point >= EY_POINTS_MAX) - return; - - Creature* trigger = GetBGCreature(Point + 6, false);//0-5 spirit guides + Creature* trigger = GetBGCreature(Point - EY_SPIRIT_FEL_REAVER + EY_TRIGGER_FEL_REAVER, false); if (!trigger) - trigger = AddCreature(WORLD_TRIGGER, Point+6, BG_EY_TriggerPositions[Point], GetTeamIndexByTeamId(Team)); + trigger = AddCreature(WORLD_TRIGGER, Point - EY_SPIRIT_FEL_REAVER + EY_TRIGGER_FEL_REAVER, BG_EY_TriggerPositions[Point]); //add bonus honor aura trigger creature when node is accupied //cast bonus aura (+50% honor in 25yards) @@ -905,20 +951,20 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) { case ALLIANCE: g_id = EY_GRAVEYARD_MAIN_ALLIANCE; break; case HORDE: g_id = EY_GRAVEYARD_MAIN_HORDE; break; - default: return NULL; + default: return nullptr; } float distance, nearestDistance; - WorldSafeLocsEntry const* entry = NULL; - WorldSafeLocsEntry const* nearestEntry = NULL; + WorldSafeLocsEntry const* entry = nullptr; + WorldSafeLocsEntry const* nearestEntry = nullptr; entry = sWorldSafeLocsStore.LookupEntry(g_id); nearestEntry = entry; if (!entry) { TC_LOG_ERROR("bg.battleground", "BattlegroundEY: The main team graveyard could not be found. The graveyard system will not be operational!"); - return NULL; + return nullptr; } float plr_x = player->GetPositionX(); @@ -953,7 +999,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) bool BattlegroundEY::IsAllNodesControlledByTeam(uint32 team) const { uint32 count = 0; - for (int i = 0; i < EY_POINTS_MAX; ++i) + for (uint32 i = 0; i < EY_POINTS_MAX; ++i) if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EY_POINT_UNDER_CONTROL) ++count; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index ccd14a2f3bce0..ab38cc337bc0b 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -27,8 +27,11 @@ enum BG_EY_Misc { BG_EY_EVENT_START_BATTLE = 13180, // Achievement: Flurry - BG_EY_FLAG_RESPAWN_TIME = (8*IN_MILLISECONDS), - BG_EY_FPOINTS_TICK_TIME = (2*IN_MILLISECONDS) + BG_EY_FLAG_RESPAWN_TIME = 8 * IN_MILLISECONDS, + BG_EY_FPOINTS_TICK_TIME = 2 * IN_MILLISECONDS, + + BG_EY_NotEYWeekendHonorTicks = 260, + BG_EY_EYWeekendHonorTicks = 160 }; enum BG_EY_WorldStates @@ -101,7 +104,19 @@ enum EYBattlegroundObjectEntry BG_OBJECT_BE_TOWER_CAP_EY_ENTRY = 184080, //BE Tower Cap Pt BG_OBJECT_FR_TOWER_CAP_EY_ENTRY = 184081, //Fel Reaver Cap Pt BG_OBJECT_HU_TOWER_CAP_EY_ENTRY = 184082, //Human Tower Cap Pt - BG_OBJECT_DR_TOWER_CAP_EY_ENTRY = 184083 //Draenei Tower Cap Pt + BG_OBJECT_DR_TOWER_CAP_EY_ENTRY = 184083, //Draenei Tower Cap Pt + BG_OBJECT_SPEED_BUFF_BLOOD_ELF = 184964, + BG_OBJECT_RESTORATION_BLOOD_ELF = 184965, + BG_OBJECT_BERSERK_BLOOD_ELF = 184966, + BG_OBJECT_SPEED_BUFF_FEL_REAVER = 184970, + BG_OBJECT_RESTORATION_FEL_REAVER = 184971, + BG_OBJECT_BERSERK_FEL_REAVER = 184972, + BG_OBJECT_SPEED_BUFF_MAGE_TOWER = 184973, + BG_OBJECT_RESTORATION_MAGE_TOWER = 184974, + BG_OBJECT_BERSERK_MAGE_TOWER = 184975, + BG_OBJECT_SPEED_BUFF_DRAENEI_RUINS = 184976, + BG_OBJECT_RESTORATION_DRAENEI_RUINS = 184977, + BG_OBJECT_BERSERK_DRAENEI_RUINS = 184978 }; enum EYBattlegroundPointsTrigger @@ -118,49 +133,49 @@ enum EYBattlegroundPointsTrigger enum EYBattlegroundGaveyards { - EY_GRAVEYARD_MAIN_ALLIANCE = 1103, - EY_GRAVEYARD_MAIN_HORDE = 1104, - EY_GRAVEYARD_FEL_REAVER = 1105, - EY_GRAVEYARD_BLOOD_ELF = 1106, - EY_GRAVEYARD_DRAENEI_RUINS = 1107, - EY_GRAVEYARD_MAGE_TOWER = 1108 + EY_GRAVEYARD_MAIN_ALLIANCE = 1103, + EY_GRAVEYARD_MAIN_HORDE = 1104, + EY_GRAVEYARD_FEL_REAVER = 1105, + EY_GRAVEYARD_BLOOD_ELF = 1106, + EY_GRAVEYARD_DRAENEI_RUINS = 1107, + EY_GRAVEYARD_MAGE_TOWER = 1108 }; enum EYBattlegroundPoints { - FEL_REAVER = 0, - BLOOD_ELF = 1, - DRAENEI_RUINS = 2, - MAGE_TOWER = 3, + FEL_REAVER = 0, + BLOOD_ELF = 1, + DRAENEI_RUINS = 2, + MAGE_TOWER = 3, - EY_PLAYERS_OUT_OF_POINTS = 4, - EY_POINTS_MAX = 4 + EY_PLAYERS_OUT_OF_POINTS = 4, + EY_POINTS_MAX = 4 }; enum EYBattlegroundCreaturesTypes { - EY_SPIRIT_FEL_REAVER = 0, - EY_SPIRIT_BLOOD_ELF = 1, - EY_SPIRIT_DRAENEI_RUINS = 2, - EY_SPIRIT_MAGE_TOWER = 3, - EY_SPIRIT_MAIN_ALLIANCE = 4, - EY_SPIRIT_MAIN_HORDE = 5, - - EY_TRIGGER_FEL_REAVER = 6, + EY_SPIRIT_FEL_REAVER = 0, + EY_SPIRIT_BLOOD_ELF = 1, + EY_SPIRIT_DRAENEI_RUINS = 2, + EY_SPIRIT_MAGE_TOWER = 3, + EY_SPIRIT_MAIN_ALLIANCE = 4, + EY_SPIRIT_MAIN_HORDE = 5, + + EY_TRIGGER_FEL_REAVER = 6, EY_TRIGGER_BLOOD_ELF = 7, EY_TRIGGER_DRAENEI_RUINS = 8, EY_TRIGGER_MAGE_TOWER = 9, - BG_EY_CREATURES_MAX = 10 + BG_EY_CREATURES_MAX = 10 }; enum EYBattlegroundObjectTypes { BG_EY_OBJECT_DOOR_A = 0, BG_EY_OBJECT_DOOR_H = 1, - BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER = 2, - BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT = 3, - BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT = 4, + BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER = 2, + BG_EY_OBJECT_A_BANNER_FEL_REAVER_LEFT = 3, + BG_EY_OBJECT_A_BANNER_FEL_REAVER_RIGHT = 4, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER = 5, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT = 6, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT = 7, @@ -170,9 +185,9 @@ enum EYBattlegroundObjectTypes BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER = 11, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT = 12, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT = 13, - BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER = 14, - BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT = 15, - BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT = 16, + BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER = 14, + BG_EY_OBJECT_H_BANNER_FEL_REAVER_LEFT = 15, + BG_EY_OBJECT_H_BANNER_FEL_REAVER_RIGHT = 16, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER = 17, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT = 18, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT = 19, @@ -182,9 +197,9 @@ enum EYBattlegroundObjectTypes BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER = 23, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT = 24, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT = 25, - BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER = 26, - BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT = 27, - BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT = 28, + BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER = 26, + BG_EY_OBJECT_N_BANNER_FEL_REAVER_LEFT = 27, + BG_EY_OBJECT_N_BANNER_FEL_REAVER_RIGHT = 28, BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER = 29, BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT = 30, BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT = 31, @@ -194,34 +209,34 @@ enum EYBattlegroundObjectTypes BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER = 35, BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT = 36, BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT = 37, - BG_EY_OBJECT_TOWER_CAP_FEL_REAVER = 38, + BG_EY_OBJECT_TOWER_CAP_FEL_REAVER = 38, BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF = 39, BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS = 40, BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER = 41, BG_EY_OBJECT_FLAG_NETHERSTORM = 42, - BG_EY_OBJECT_FLAG_FEL_REAVER = 43, + BG_EY_OBJECT_FLAG_FEL_REAVER = 43, BG_EY_OBJECT_FLAG_BLOOD_ELF = 44, BG_EY_OBJECT_FLAG_DRAENEI_RUINS = 45, BG_EY_OBJECT_FLAG_MAGE_TOWER = 46, //buffs - BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER = 47, - BG_EY_OBJECT_REGENBUFF_FEL_REAVER = 48, - BG_EY_OBJECT_BERSERKBUFF_FEL_REAVER = 49, - BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF = 50, - BG_EY_OBJECT_REGENBUFF_BLOOD_ELF = 51, - BG_EY_OBJECT_BERSERKBUFF_BLOOD_ELF = 52, - BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS = 53, - BG_EY_OBJECT_REGENBUFF_DRAENEI_RUINS = 54, - BG_EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS = 55, - BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER = 56, - BG_EY_OBJECT_REGENBUFF_MAGE_TOWER = 57, - BG_EY_OBJECT_BERSERKBUFF_MAGE_TOWER = 58, - BG_EY_OBJECT_MAX = 59 + BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF = 47, + BG_EY_OBJECT_REGENBUFF_BLOOD_ELF = 48, + BG_EY_OBJECT_BERSERKBUFF_BLOOD_ELF = 49, + BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER = 50, + BG_EY_OBJECT_REGENBUFF_FEL_REAVER = 51, + BG_EY_OBJECT_BERSERKBUFF_FEL_REAVER = 52, + BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER = 53, + BG_EY_OBJECT_REGENBUFF_MAGE_TOWER = 54, + BG_EY_OBJECT_BERSERKBUFF_MAGE_TOWER = 55, + BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS = 56, + BG_EY_OBJECT_REGENBUFF_DRAENEI_RUINS = 57, + BG_EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS = 58, + + BG_EY_OBJECT_MAX = 59, + + BG_EY_POINT_BANNERS = 3 }; -#define BG_EY_NotEYWeekendHonorTicks 260 -#define BG_EY_EYWeekendHonorTicks 160 - enum BG_EY_Score { BG_EY_WARNING_NEAR_VICTORY_SCORE = 1400, @@ -250,29 +265,13 @@ enum BG_EY_Objectives struct BattlegroundEYPointIconsStruct { - BattlegroundEYPointIconsStruct(uint32 _WorldStateControlIndex, uint32 _WorldStateAllianceControlledIndex, uint32 _WorldStateHordeControlledIndex) - : WorldStateControlIndex(_WorldStateControlIndex), WorldStateAllianceControlledIndex(_WorldStateAllianceControlledIndex), WorldStateHordeControlledIndex(_WorldStateHordeControlledIndex) { } uint32 WorldStateControlIndex; uint32 WorldStateAllianceControlledIndex; uint32 WorldStateHordeControlledIndex; }; -Position const BG_EY_TriggerPositions[EY_POINTS_MAX] = -{ - {2044.28f, 1729.68f, 1189.96f, 0.017453f}, // FEL_REAVER center - {2048.83f, 1393.65f, 1194.49f, 0.20944f}, // BLOOD_ELF center - {2286.56f, 1402.36f, 1197.11f, 3.72381f}, // DRAENEI_RUINS center - {2284.48f, 1731.23f, 1189.99f, 2.89725f} // MAGE_TOWER center -}; - struct BattlegroundEYLosingPointStruct { - BattlegroundEYLosingPointStruct(uint32 _SpawnNeutralObjectType, uint32 _DespawnObjectTypeAlliance, uint32 _MessageIdAlliance, uint32 _DespawnObjectTypeHorde, uint32 _MessageIdHorde) - : SpawnNeutralObjectType(_SpawnNeutralObjectType), - DespawnObjectTypeAlliance(_DespawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance), - DespawnObjectTypeHorde(_DespawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde) - { } - uint32 SpawnNeutralObjectType; uint32 DespawnObjectTypeAlliance; uint32 MessageIdAlliance; @@ -282,13 +281,6 @@ struct BattlegroundEYLosingPointStruct struct BattlegroundEYCapturingPointStruct { - BattlegroundEYCapturingPointStruct(uint32 _DespawnNeutralObjectType, uint32 _SpawnObjectTypeAlliance, uint32 _MessageIdAlliance, uint32 _SpawnObjectTypeHorde, uint32 _MessageIdHorde, uint32 _GraveYardId) - : DespawnNeutralObjectType(_DespawnNeutralObjectType), - SpawnObjectTypeAlliance(_SpawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance), - SpawnObjectTypeHorde(_SpawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde), - GraveYardId(_GraveYardId) - { } - uint32 DespawnNeutralObjectType; uint32 SpawnObjectTypeAlliance; uint32 MessageIdAlliance; @@ -297,32 +289,6 @@ struct BattlegroundEYCapturingPointStruct uint32 GraveYardId; }; -const uint8 BG_EY_TickPoints[EY_POINTS_MAX] = {1, 2, 5, 10}; -const uint32 BG_EY_FlagPoints[EY_POINTS_MAX] = {75, 85, 100, 500}; - -//constant arrays: -const BattlegroundEYPointIconsStruct m_PointsIconStruct[EY_POINTS_MAX] = -{ - BattlegroundEYPointIconsStruct(FEL_REAVER_UNCONTROL, FEL_REAVER_ALLIANCE_CONTROL, FEL_REAVER_HORDE_CONTROL), - BattlegroundEYPointIconsStruct(BLOOD_ELF_UNCONTROL, BLOOD_ELF_ALLIANCE_CONTROL, BLOOD_ELF_HORDE_CONTROL), - BattlegroundEYPointIconsStruct(DRAENEI_RUINS_UNCONTROL, DRAENEI_RUINS_ALLIANCE_CONTROL, DRAENEI_RUINS_HORDE_CONTROL), - BattlegroundEYPointIconsStruct(MAGE_TOWER_UNCONTROL, MAGE_TOWER_ALLIANCE_CONTROL, MAGE_TOWER_HORDE_CONTROL) -}; -const BattlegroundEYLosingPointStruct m_LosingPointTypes[EY_POINTS_MAX] = -{ - BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_LOST_A_F_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_LOST_H_F_RUINS), - BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_LOST_A_B_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_LOST_H_B_TOWER), - BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_LOST_A_D_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_LOST_H_D_RUINS), - BattlegroundEYLosingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_LOST_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_LOST_H_M_TOWER) -}; -const BattlegroundEYCapturingPointStruct m_CapturingPointTypes[EY_POINTS_MAX] = -{ - BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_FEL_REAVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_TAKEN_A_F_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REAVER_CENTER, LANG_BG_EY_HAS_TAKEN_H_F_RUINS, EY_GRAVEYARD_FEL_REAVER), - BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_TAKEN_A_B_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_TAKEN_H_B_TOWER, EY_GRAVEYARD_BLOOD_ELF), - BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_TAKEN_A_D_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_TAKEN_H_D_RUINS, EY_GRAVEYARD_DRAENEI_RUINS), - BattlegroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_H_M_TOWER, EY_GRAVEYARD_MAGE_TOWER) -}; - struct BattlegroundEYScore final : public BattlegroundScore { friend class BattlegroundEY; @@ -398,10 +364,10 @@ class BattlegroundEY : public Battleground void PostUpdateImpl(uint32 diff) override; void EventPlayerCapturedFlag(Player* Source, uint32 BgObjectType); - void EventTeamCapturedPoint(Player* Source, uint32 Point); - void EventTeamLostPoint(Player* Source, uint32 Point); + void EventTeamCapturedPoint(Player* Source, EYBattlegroundPoints Point); + void EventTeamLostPoint(Player* Source, EYBattlegroundPoints Point); void UpdatePointsCount(uint32 Team); - void UpdatePointsIcons(uint32 Team, uint32 Point); + void UpdatePointsIcons(uint32 Team, EYBattlegroundPoints Point); /* Point status updating procedures */ void CheckSomeoneLeftPoint(); @@ -414,8 +380,8 @@ class BattlegroundEY : public Battleground void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; } void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; } - uint32 m_HonorScoreTics[2]; - uint32 m_TeamPointsCount[2]; + uint32 m_HonorScoreTics[BG_TEAMS_COUNT]; + uint32 m_TeamPointsCount[BG_TEAMS_COUNT]; uint32 m_Points_Trigger[EY_POINTS_MAX]; @@ -430,7 +396,7 @@ class BattlegroundEY : public Battleground uint8 m_PointState[EY_POINTS_MAX]; int32 m_PointBarStatus[EY_POINTS_MAX]; GuidVector m_PlayersNearPoint[EY_POINTS_MAX + 1]; - uint8 m_CurrentPointPlayersCount[2*EY_POINTS_MAX]; + uint8 m_CurrentPointPlayersCount[BG_TEAMS_COUNT * EY_POINTS_MAX]; int32 m_PointAddingTimer; uint32 m_HonorTics; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp index 8c144cbc8be4b..05526fee4dd51 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp @@ -27,34 +27,312 @@ #include "Transport.h" #include "ScriptedCreature.h" +uint32 const BG_IC_Factions[BG_TEAMS_COUNT] = +{ + 1732, // Alliance + 1735 // Horde +}; + +uint32 const MAX_REINFORCEMENTS = 300; + +BattlegroundSpawnPoint const BG_IC_NpcSpawnlocs[MAX_NORMAL_NPCS_SPAWNS] = +{ + { NPC_OVERLORD_AGMAR, { 1295.44f, -765.733f, 70.0541f, 0.000000f }, RESPAWN_ONE_DAY }, //Overlord Agmar 1 + { NPC_HIGH_COMMANDER_HALFORD_WYRMBANE, { 224.983f, -831.573f, 60.9034f, 0.000000f }, RESPAWN_ONE_DAY }, //High Commander Halford Wyrmbane 2 + { NPC_KOR_KRON_GUARD, { 1296.01f, -773.256f, 69.9580f, 0.292168f }, RESPAWN_ONE_DAY }, // 3 + { NPC_KOR_KRON_GUARD, { 1295.94f, -757.756f, 69.9587f, 6.021650f }, RESPAWN_ONE_DAY }, // 4 + { NPC_KOR_KRON_GUARD, { 1295.09f, -760.927f, 69.9587f, 5.943110f }, RESPAWN_ONE_DAY }, // 5 + { NPC_KOR_KRON_GUARD, { 1295.13f, -769.700f, 69.9500f, 0.340000f }, RESPAWN_ONE_DAY }, // 6 + + { NPC_SEVEN_TH_LEGION_INFANTRY, { 223.969f, -822.958f, 60.8151f, 0.463370f }, RESPAWN_ONE_DAY }, // 7 + { NPC_SEVEN_TH_LEGION_INFANTRY, { 224.211f, -826.952f, 60.8188f, 6.259610f }, RESPAWN_ONE_DAY }, // 8 + { NPC_SEVEN_TH_LEGION_INFANTRY, { 223.119f, -838.386f, 60.8145f, 5.648570f }, RESPAWN_ONE_DAY }, // 9 + { NPC_SEVEN_TH_LEGION_INFANTRY, { 223.889f, -835.102f, 60.8201f, 6.216420f }, RESPAWN_ONE_DAY }, // 10 + + { NPC_KEEP_CANNON, { 415.825f, -754.634f, 87.7990f, 1.780240f }, RESPAWN_ONE_DAY }, // 11 + { NPC_KEEP_CANNON, { 410.142f, -755.332f, 87.7991f, 1.780240f }, RESPAWN_ONE_DAY }, // 12 + { NPC_KEEP_CANNON, { 424.330f, -879.352f, 88.0446f, 0.436332f }, RESPAWN_ONE_DAY }, // 13 + { NPC_KEEP_CANNON, { 425.602f, -786.646f, 87.7991f, 5.742130f }, RESPAWN_ONE_DAY }, // 14 + { NPC_KEEP_CANNON, { 426.743f, -884.939f, 87.9613f, 0.436332f }, RESPAWN_ONE_DAY }, // 15 + { NPC_KEEP_CANNON, { 404.736f, -755.495f, 87.7989f, 1.780240f }, RESPAWN_ONE_DAY }, // 16 + { NPC_KEEP_CANNON, { 428.375f, -780.797f, 87.7991f, 5.794490f }, RESPAWN_ONE_DAY }, // 17 + { NPC_KEEP_CANNON, { 429.175f, -890.436f, 88.0446f, 0.436332f }, RESPAWN_ONE_DAY }, // 18 + { NPC_KEEP_CANNON, { 430.872f, -775.278f, 87.7991f, 5.881760f }, RESPAWN_ONE_DAY }, // 19 + { NPC_KEEP_CANNON, { 408.056f, -911.283f, 88.0445f, 4.642580f }, RESPAWN_ONE_DAY }, // 20 + { NPC_KEEP_CANNON, { 413.609f, -911.566f, 88.0447f, 4.660030f }, RESPAWN_ONE_DAY }, // 21 + { NPC_KEEP_CANNON, { 402.554f, -910.557f, 88.0446f, 4.572760f }, RESPAWN_ONE_DAY }, // 22 + + { NPC_KEEP_CANNON, { 1158.91f, -660.144f, 87.9332f, 0.750492f }, RESPAWN_ONE_DAY }, // 23 + { NPC_KEEP_CANNON, { 1156.22f, -866.809f, 87.8754f, 5.270890f }, RESPAWN_ONE_DAY }, // 24 + { NPC_KEEP_CANNON, { 1163.74f, -663.670f, 88.3571f, 0.558505f }, RESPAWN_ONE_DAY }, // 25 + { NPC_KEEP_CANNON, { 1135.18f, -683.896f, 88.0409f, 3.961900f }, RESPAWN_ONE_DAY }, // 26 + { NPC_KEEP_CANNON, { 1138.91f, -836.359f, 88.3728f, 2.181660f }, RESPAWN_ONE_DAY }, // 27 + { NPC_KEEP_CANNON, { 1162.08f, -863.717f, 88.3580f, 5.480330f }, RESPAWN_ONE_DAY }, // 28 + { NPC_KEEP_CANNON, { 1167.13f, -669.212f, 87.9682f, 0.383972f }, RESPAWN_ONE_DAY }, // 29 + { NPC_KEEP_CANNON, { 1137.72f, -688.517f, 88.4023f, 3.961900f }, RESPAWN_ONE_DAY }, // 30 + { NPC_KEEP_CANNON, { 1135.29f, -840.878f, 88.0252f, 2.303830f }, RESPAWN_ONE_DAY }, // 31 + { NPC_KEEP_CANNON, { 1144.33f, -833.309f, 87.9268f, 2.146750f }, RESPAWN_ONE_DAY }, // 32 + { NPC_KEEP_CANNON, { 1142.59f, -691.946f, 87.9756f, 3.961900f }, RESPAWN_ONE_DAY }, // 33 + { NPC_KEEP_CANNON, { 1166.13f, -858.391f, 87.9653f, 5.637410f }, RESPAWN_ONE_DAY } // 34 +}; + +Position const BG_IC_WorkshopVehicles[5] = +{ + { 751.828100f, -852.732666f, 12.5250978f, 1.46607661f }, // Demolisher + { 761.809000f, -854.227400f, 12.5263243f, 1.46607661f }, // Demolisher + { 783.472200f, -853.960100f, 12.5477500f, 1.71042264f }, // Demolisher + { 793.055542f, -852.718750f, 12.5671329f, 1.71042264f }, // Demolisher + { 773.680542f, -884.092041f, 16.8090363f, 1.58824956f } // Siege Engine +}; + +Position const BG_IC_DocksVehiclesGlaives[2] = +{ + { 779.312500f, -342.972229f, 12.2104874f, 4.712389f }, // Glaive Throwers + { 790.029541f, -342.899323f, 12.2128582f, 4.712380f } // Glaive Throwers +}; + +Position const BG_IC_DocksVehiclesCatapults[4] = +{ + { 757.283000f, -341.779500f, 12.2113762f, 4.729842f }, // Catapults + { 766.947937f, -342.053833f, 12.2009945f, 4.694000f }, // Catapults + { 800.378500f, -342.607635f, 12.1669979f, 4.677400f }, // Catapults + { 810.725700f, -342.083344f, 12.1675768f, 4.660000f } // Catapults +}; + +Position const BG_IC_HangarTrigger[MAX_TRIGGER_SPAWNS_PER_FACTION * BG_TEAMS_COUNT] = +{ + { 11.69965f, 0.034146f, 20.62076f, 3.211406f }, + { 7.305609f, -0.095246f, 34.51022f, 3.159046f } +}; + +Position const BG_IC_HangarCaptains[MAX_CAPTAIN_SPAWNS_PER_FACTION * BG_TEAMS_COUNT] = +{ + { 825.6667f, -994.005200f, 134.3569f, 3.403392f }, + { 53.65112f, -0.11392210f, 30.09546f, 3.106686f }, + { 826.2205f, -994.402800f, 134.2812f, 3.351032f }, + { 10.89952f, 4.88029700f, 20.49038f, 4.840575f } +}; + +BattlegroundGOSpawnPoint const BG_IC_ObjSpawnlocs[BG_IC_GO_MAX] = +{ + { GO_ALLIANCE_GATE_1, { 351.6146f, -762.7500f, 48.91625f, 4.71239000f }, { 0.000000000f, 0.000000000f, -0.70710660f, 0.707106900f }, RESPAWN_IMMEDIATELY }, + { GO_ALLIANCE_GATE_2, { 413.4792f, -833.9496f, 48.52376f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_IMMEDIATELY }, + { GO_ALLIANCE_GATE_3, { 351.0243f, -903.3264f, 48.92472f, 1.57079600f }, { 0.000000000f, 0.000000000f, 0.70710660f, 0.707106900f }, RESPAWN_IMMEDIATELY }, + + { GO_HORDE_GATE_1, { 1150.903f, -762.6059f, 47.50768f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_IMMEDIATELY }, + { GO_HORDE_GATE_2, { 1218.743f, -851.1545f, 48.25328f, 4.71239000f }, { 0.000000000f, 0.000000000f, -0.70710660f, 0.707106900f }, RESPAWN_IMMEDIATELY }, + { GO_HORDE_GATE_3, { 1217.899f, -676.9479f, 47.63408f, 1.57079600f }, { 0.000000000f, 0.000000000f, 0.70710660f, 0.707106900f }, RESPAWN_IMMEDIATELY }, + + { GO_REFINERY_BANNER, { 1269.502f, -400.8090f, 37.62525f, 4.52040600f }, { 0.000000000f, 0.000000000f, -0.77162360f, 0.636079400f }, RESPAWN_IMMEDIATELY }, + { GO_QUARRY_BANNER, { 251.0156f, -1159.316f, 17.23760f, -2.25147300f }, { 0.000000000f, 0.000000000f, -0.90258500f, 0.430511700f }, RESPAWN_IMMEDIATELY }, + { GO_DOCKS_BANNER, { 726.3850f, -360.2050f, 17.81530f, 4.66003000f }, { 0.000000000f, 0.000000000f, -0.72537420f, 0.688354700f }, RESPAWN_IMMEDIATELY }, + { GO_HANGAR_BANNER, { 807.7800f, -1000.070f, 132.3810f, -1.93731600f }, { 0.000000000f, 0.000000000f, -0.82412620f, 0.566406100f }, RESPAWN_IMMEDIATELY }, + { GO_WORKSHOP_BANNER, { 776.2290f, -804.2830f, 6.450520f, 1.60570200f }, { 0.000000000f, 0.000000000f, 0.71933940f, 0.694658800f }, RESPAWN_IMMEDIATELY }, + + { GO_ALLIANCE_BANNER_REFINERY, { 1269.502f, -400.8090f, 37.62525f, 4.52040600f }, { 0.000000000f, 0.000000000f, -0.77162360f, 0.636079400f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_QUARRY, { 251.0156f, -1159.316f, 17.23760f, -2.25147300f }, { 0.000000000f, 0.000000000f, -0.90258500f, 0.430511700f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_DOCKS, { 726.3850f, -360.2050f, 17.81530f, -1.60570200f }, { 0.000000000f, 0.000000000f, -0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_HANGAR, { 807.7800f, -1000.070f, 132.3810f, -1.91986200f }, { 0.000000000f, 0.000000000f, -0.81915190f, 0.573576700f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_WORKSHOP, { 776.2290f, -804.2830f, 6.450520f, 1.60570200f }, { 0.000000000f, 0.000000000f, 0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_GRAVEYARD_A, { 299.1528f, -784.5886f, 48.91625f, -0.15707900f }, { 0.000000000f, 0.000000000f, -0.07845879f, 0.996917400f }, RESPAWN_IMMEDIATELY }, + { GO_ALLIANCE_BANNER_GRAVEYARD_H, { 1284.755f, -705.6684f, 48.91626f, 3.19400200f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_ONE_DAY }, + + { GO_ALLIANCE_BANNER_REFINERY_CONT, { 1269.502f, -400.8090f, 37.62525f, 4.52040600f }, { 0.000000000f, 0.000000000f, -0.77162360f, 0.636079400f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_QUARRY_CONT, { 251.0156f, -1159.316f, 17.23760f, 4.03171200f }, { 0.000000000f, 0.000000000f, -0.90258500f, 0.430511700f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_DOCKS_CONT, { 726.3850f, -360.2050f, 17.81530f, -1.60570200f }, { 0.000000000f, 0.000000000f, -0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_HANGAR_CONT, { 807.7800f, -1000.070f, 132.3810f, 4.36332400f }, { 0.000000000f, 0.000000000f, -0.81915190f, 0.573576700f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_WORKSHOP_CONT, { 776.2290f, -804.2830f, 6.450520f, 1.60570200f }, { 0.000000000f, 0.000000000f, 0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_GRAVEYARD_A_CONT, { 299.1528f, -784.5886f, 48.91625f, -0.15707900f }, { 0.000000000f, 0.000000000f, -0.07845879f, 0.996917400f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_GRAVEYARD_H_CONT, { 1284.755f, -705.6684f, 48.91626f, -3.08918300f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_ONE_DAY }, + + { GO_HORDE_BANNER_REFINERY_CONT, { 1269.502f, -400.8090f, 37.62525f, -1.76278200f }, { 0.000000000f, 0.000000000f, -0.77162460f, 0.636078200f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_QUARRY_CONT, { 251.0156f, -1159.316f, 17.23760f, -2.25147300f }, { 0.000000000f, 0.000000000f, -0.90258500f, 0.430511700f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_DOCKS_CONT, { 726.3850f, -360.2050f, 17.81530f, 4.66003000f }, { 0.000000000f, 0.000000000f, -0.72537420f, 0.688354700f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_HANGAR_CONT, { 807.7800f, -1000.070f, 132.3810f, 4.34587000f }, { 0.000000000f, 0.000000000f, -0.82412620f, 0.566406100f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_WORKSHOP_CONT, { 776.2290f, -804.2830f, 6.450520f, 1.60570200f }, { 0.000000000f, 0.000000000f, 0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_GRAVEYARD_A_CONT, { 299.1528f, -784.5886f, 48.91625f, -0.15707900f }, { 0.000000000f, 0.000000000f, -0.07845879f, 0.996917400f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_GRAVEYARD_H_CONT, { 1284.755f, -705.6684f, 48.91626f, 3.19400200f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_ONE_DAY }, + + { GO_HORDE_BANNER_REFINERY, { 1269.502f, -400.8090f, 37.62525f, 4.52040600f }, { 0.000000000f, 0.000000000f, -0.77162360f, 0.636079400f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_QUARRY, { 251.0156f, -1159.316f, 17.23760f, -2.25147300f }, { 0.000000000f, 0.000000000f, -0.90258500f, 0.430511700f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_DOCKS, { 726.3850f, -360.2050f, 17.81530f, -1.60570200f }, { 0.000000000f, 0.000000000f, -0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_HANGAR, { 807.7800f, -1000.070f, 132.3810f, -1.91986200f }, { 0.000000000f, 0.000000000f, -0.81915190f, 0.573576700f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_WORKSHOP, { 776.2290f, -804.2830f, 6.450520f, 1.60570200f }, { 0.000000000f, 0.000000000f, 0.71933940f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_GRAVEYARD_A, { 299.1528f, -784.5886f, 48.91625f, -0.15707900f }, { 0.000000000f, 0.000000000f, -0.07845879f, 0.996917400f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_GRAVEYARD_H, { 1284.755f, -705.6684f, 48.91626f, 3.19400200f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_IMMEDIATELY }, + + { GO_BENCH_1, { 834.2078f, -461.8256f, 22.30665f, 1.57079600f }, { -0.006171227f, -0.006170273f, 0.70707990f, 0.707079800f }, RESPAWN_IMMEDIATELY }, + { GO_BENCH_2, { 826.1529f, -461.9848f, 22.51492f, 1.57079600f }, { -0.006171227f, -0.006170273f, 0.70707990f, 0.707079800f }, RESPAWN_IMMEDIATELY }, + { GO_BENCH_3, { 817.4463f, -470.4697f, 25.37199f, -1.56206700f }, { 0.000000000f, 0.000000000f, -0.70401380f, 0.710186200f }, RESPAWN_IMMEDIATELY }, + { GO_BENCH_4, { 827.0010f, -474.4146f, 25.37199f, 1.57952200f }, { 0.000000000f, 0.000000000f, 0.71018510f, 0.704015000f }, RESPAWN_IMMEDIATELY }, + { GO_BENCH_5, { 819.2640f, -461.9612f, 22.76141f, 1.57952300f }, { -0.003044605f, -0.003125191f, 0.71017840f, 0.704008300f }, RESPAWN_IMMEDIATELY }, + + { GO_BONFIRE_1, { 1162.913f, -734.5781f, 48.89479f, 3.29868700f }, { 0.000000000f, 0.000000000f, -0.99691680f, 0.078466430f }, RESPAWN_IMMEDIATELY }, + { GO_BONFIRE_2, { 1282.342f, -799.7623f, 87.13571f, 3.15032700f }, { 0.000000000f, 0.000000000f, -0.99999050f, 0.004367320f }, RESPAWN_IMMEDIATELY }, + { GO_BONFIRE_3, { 1358.061f, -732.1784f, 87.16064f, -3.13283600f }, { -0.005615234f, -0.006516457f, -0.99995330f, 0.004414829f }, RESPAWN_IMMEDIATELY }, + { GO_BONFIRE_4, { 1281.758f, -732.8443f, 87.15739f, 3.15072700f }, { 0.012359140f, -0.012251850f, -0.99983880f, 0.004414829f }, RESPAWN_IMMEDIATELY }, + { GO_BONFIRE_5, { 1358.815f, -797.8987f, 87.29533f, 3.13312300f }, { 0.006790161f, -0.017461780f, 0.99981500f, 0.004353651f }, RESPAWN_IMMEDIATELY }, + { GO_BONFIRE_6, { 1162.210f, -790.5434f, 48.91625f, 2.27765400f }, { 0.000000000f, 0.000000000f, 0.90814300f, 0.418660000f }, RESPAWN_IMMEDIATELY }, + + { GO_BRAZIER_1, { 1262.208f, -751.3577f, 48.81328f, 2.26892500f }, { 0.000000000f, 0.000000000f, 0.90630720f, 0.422619500f }, RESPAWN_IMMEDIATELY }, + { GO_BRAZIER_2, { 1262.580f, -781.8611f, 48.81316f, 2.04203200f }, { 0.000000000f, 0.000000000f, 0.85263920f, 0.522500100f }, RESPAWN_IMMEDIATELY }, + { GO_BRAZIER_3, { 223.8184f, -839.3519f, 60.79163f, 1.09083000f }, { 0.000000000f, 0.000000000f, 0.51877310f, 0.854912000f }, RESPAWN_IMMEDIATELY }, + { GO_BRAZIER_4, { 224.2771f, -822.7701f, 60.79168f, 2.06821600f }, { 0.000000000f, 0.000000000f, 0.85940650f, 0.511292900f }, RESPAWN_IMMEDIATELY }, + + { GO_CHAIR_1, { 632.8761f, -282.4611f, 5.453642f, -0.85109360f }, { 0.000000000f, 0.000000000f, -0.41281890f, 0.910813200f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_2, { 635.7961f, -276.2948f, 5.486583f, 3.25045700f }, { 0.000000000f, 0.000000000f, -0.99851890f, 0.054405030f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_3, { 762.2447f, -444.7946f, 22.85257f, -1.98094700f }, { 0.000000000f, 0.000000000f, -0.83628560f, 0.548294100f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_4, { 632.1564f, -304.5027f, 5.487903f, 1.15603100f }, { 0.000000000f, 0.000000000f, 0.54636290f, 0.837548600f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_5, { 643.8600f, -270.2039f, 5.488976f, 2.36903400f }, { 0.000000000f, 0.000000000f, 0.92631720f, 0.376744500f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_6, { 902.2345f, -455.5080f, 18.39346f, -1.00356400f }, { 0.000000000f, 0.000000000f, -0.48098850f, 0.876726900f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_7, { 810.2365f, -461.2003f, 25.46266f, 1.57079600f }, { 0.000000000f, 0.000000000f, 0.70710660f, 0.707106900f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_3, { 1117.192f, -365.6744f, 18.84564f, 0.96865730f }, { 0.000000000f, 0.000000000f, 0.46561430f, 0.884987800f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_6, { 1066.187f, -337.2144f, 18.82252f, 0.45378500f }, { 0.000000000f, 0.000000000f, 0.22495080f, 0.974370100f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_8, { 798.3239f, -444.9509f, 22.56008f, -1.02101600f }, { 0.000000000f, 0.000000000f, -0.48862080f, 0.872496300f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_8, { 1081.805f, -358.6367f, 18.55315f, 1.92858800f }, { 0.000000000f, 0.000000000f, 0.82164670f, 0.569997100f }, RESPAWN_IMMEDIATELY }, + { GO_CHAIR_9, { 814.9309f, -470.8155f, 33.63731f, -3.12412300f }, { 0.000000000f, 0.000000000f, -0.99996190f, 0.008734641f }, RESPAWN_IMMEDIATELY }, + + { GO_DOODAD_HU_PORTCULLIS01, { 401.0240f, -780.7238f, 49.94827f, 3.75422300f }, { 0.000000000f, 0.000000000f, -0.95345120f, 0.301547500f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_HU_PORTCULLIS01, { 399.8019f, -885.2075f, 50.19387f, 2.51599600f }, { 0.000000000f, 0.000000000f, 0.95147610f, 0.307722700f }, RESPAWN_IMMEDIATELY }, + + { GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, { 413.4791f, -833.9496f, 48.52376f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, { 351.6146f, -762.7500f, 48.91625f, -1.57079300f }, { 0.000000000f, 0.000000000f, -0.70710560f, 0.707107900f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, { 351.0243f, -903.3264f, 48.92472f, 1.57079600f }, { 0.000000000f, 0.000000000f, 0.70710660f, 0.707106900f }, RESPAWN_IMMEDIATELY }, + + { GO_DOODAD_PORTCULLISACTIVE01, { 288.1597f, -832.5953f, 51.41085f, -0.02617911f }, { 0.000000000f, 0.000000000f, -0.01308918f, 0.999914300f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_PORTCULLISACTIVE02, { 273.0327f, -832.1992f, 51.41085f, -0.02617911f }, { 0.000000000f, 0.000000000f, -0.01308918f, 0.999914300f }, RESPAWN_IMMEDIATELY }, + + { GO_DOODAD_VR_PORTCULLIS01, { 1156.886f, -843.9983f, 48.63224f, 0.73293400f }, { 0.000000000f, 0.000000000f, 0.35831930f, 0.933599100f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_VR_PORTCULLIS01, { 1157.047f, -682.3604f, 48.63225f, -0.82913240f }, { 0.000000000f, 0.000000000f, -0.40279290f, 0.915291100f }, RESPAWN_IMMEDIATELY }, + + { GO_FLAGPOLE_1, { 1269.502f, -400.8090f, 37.62525f, -1.76278200f }, { 0.000000000f, 0.000000000f, -0.77162460f, 0.636078200f }, RESPAWN_IMMEDIATELY }, + { GO_FLAGPOLE_2, { 1284.755f, -705.6684f, 48.91626f, -3.08918300f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_IMMEDIATELY }, + { GO_FLAGPOLE_2, { 299.1528f, -784.5886f, 48.91625f, -0.15707900f }, { 0.000000000f, 0.000000000f, -0.07845879f, 0.996917400f }, RESPAWN_IMMEDIATELY }, + { GO_FLAGPOLE_1, { 726.3850f, -360.2050f, 17.81530f, -1.60570200f }, { 0.000000000f, 0.000000000f, -0.71933940f, 0.694658800f }, RESPAWN_IMMEDIATELY }, + { GO_FLAGPOLE_1, { 807.7795f, -1000.068f, 132.3814f, -1.91986200f }, { 0.000000000f, 0.000000000f, -0.81915190f, 0.573576700f }, RESPAWN_IMMEDIATELY }, + { GO_FLAGPOLE_1, { 776.2290f, -804.2830f, 6.450520f, 1.60570200f }, { 0.000000000f, 0.000000000f, 0.71933940f, 0.694658800f }, RESPAWN_IMMEDIATELY }, + { GO_FLAGPOLE_1, { 251.0156f, -1159.316f, 17.23760f, -2.25147300f }, { 0.000000000f, 0.000000000f, -0.90258500f, 0.430511700f }, RESPAWN_IMMEDIATELY }, + + { GO_HORDE_KEEP_PORTCULLIS, { 1283.046f, -765.8785f, 50.82972f, 3.15032700f }, { 0.000000000f, 0.000000000f, -0.99999050f, 0.004367320f }, RESPAWN_IMMEDIATELY }, + + { GO_STOVE_1, { 903.2907f, -457.3448f, 18.13562f, 2.23401800f }, { 0.000000000f, 0.000000000f, 0.89879320f, 0.438372800f }, RESPAWN_IMMEDIATELY }, + { GO_STOVE_2, { 761.4622f, -446.6838f, 22.56018f, 0.24434360f }, { 0.000000000f, 0.000000000f, 0.12186810f, 0.992546300f }, RESPAWN_IMMEDIATELY }, + { GO_STOVE_1, { 1068.131f, -336.3729f, 18.56468f, -2.59181100f }, { 0.000000000f, 0.000000000f, -0.96245480f, 0.271442000f }, RESPAWN_IMMEDIATELY }, + { GO_STOVE_2, { 1118.321f, -363.9691f, 18.55324f, -3.08918300f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_IMMEDIATELY }, + + { GO_HUGE_SEAFORIUM_BOMB_A, { 297.3212f, -851.3212f, 48.91627f, -0.94247660f }, { 0.000000000f, 0.000000000f, -0.45399000f, 0.891006800f }, RESPAWN_ONE_DAY }, + { GO_HUGE_SEAFORIUM_BOMB_A, { 298.1042f, -861.0261f, 48.91628f, -2.75761300f }, { 0.000000000f, 0.000000000f, -0.98162650f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_HUGE_SEAFORIUM_BOMB_A, { 300.3715f, -818.7327f, 48.91625f, 0.78539680f }, { 0.000000000f, 0.000000000f, 0.38268280f, 0.923879800f }, RESPAWN_ONE_DAY }, + { GO_HUGE_SEAFORIUM_BOMB_A, { 302.1354f, -810.7083f, 48.91625f, -1.04719800f }, { 0.000000000f, 0.000000000f, -0.50000000f, 0.866025400f }, RESPAWN_ONE_DAY }, + + { GO_HUGE_SEAFORIUM_BOMB_H, { 1268.309f, -745.7830f, 48.91878f, 0.78539680f }, { 0.000000000f, 0.000000000f, 0.38268280f, 0.923879800f }, RESPAWN_ONE_DAY }, + { GO_HUGE_SEAFORIUM_BOMB_H, { 1268.509f, -738.1215f, 48.91750f, -1.04719800f }, { 0.000000000f, 0.000000000f, -0.50000000f, 0.866025400f }, RESPAWN_ONE_DAY }, + { GO_HUGE_SEAFORIUM_BOMB_H, { 1273.066f, -786.5729f, 48.94192f, -0.94247660f }, { 0.000000000f, 0.000000000f, -0.45399000f, 0.891006800f }, RESPAWN_ONE_DAY }, + { GO_HUGE_SEAFORIUM_BOMB_H, { 1273.849f, -796.2778f, 48.93643f, -2.75761300f }, { 0.000000000f, 0.000000000f, -0.98162650f, 0.190812400f }, RESPAWN_ONE_DAY }, + + { GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, { 1150.903f, -762.6059f, 47.50768f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, { 1217.899f, -676.9479f, 47.63408f, 1.57079300f }, { 0.000000000f, 0.000000000f, 0.70710560f, 0.707107900f }, RESPAWN_IMMEDIATELY }, + { GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, { 1218.743f, -851.1545f, 48.25328f, -1.57079300f }, { 0.000000000f, 0.000000000f, -0.70710560f, 0.707107900f }, RESPAWN_IMMEDIATELY }, + + { GO_SEAFORIUM_BOMBS, { 750.6007f, -864.5972f, 13.47541f, 1.93731200f }, { 0.000000000f, 0.000000000f, 0.82412530f, 0.566407600f }, 10 }, + { GO_SEAFORIUM_BOMBS, { 785.5087f, -864.7153f, 13.39931f, 2.47836700f }, { 0.000000000f, 0.000000000f, 0.94551850f, 0.325568400f }, 10 }, + + { GO_ALLIANCE_GUNSHIP_PORTAL, { 827.9583f, -994.4670f, 134.0712f, 0.00000000f }, { 0.000000000f, 0.000000000f, 0.00000000f, 1.000000000f }, RESPAWN_ONE_DAY }, + { GO_HORDE_GUNSHIP_PORTAL, { 827.9219f, -993.3246f, 134.1972f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_GUNSHIP_PORTAL, { 738.6129f, -1106.583f, 134.7453f, 2.54817900f }, { 0.000000000f, 0.000000000f, 0.95630460f, 0.292372300f }, RESPAWN_ONE_DAY }, + { GO_HORDE_GUNSHIP_PORTAL, { 739.0226f, -1106.661f, 134.7551f, 2.42600800f }, { 0.000000000f, 0.000000000f, 0.93667220f, 0.350207400f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_GUNSHIP_PORTAL, { 672.2830f, -1156.995f, 133.7057f, 1.37880900f }, { 0.000000000f, 0.000000000f, 0.63607790f, 0.771624900f }, RESPAWN_ONE_DAY }, + { GO_HORDE_GUNSHIP_PORTAL, { 672.0799f, -1156.776f, 133.7057f, 1.83259500f }, { 0.000000000f, 0.000000000f, 0.79335310f, 0.608761700f }, RESPAWN_ONE_DAY }, + + { GO_ALLIANCE_GUNSHIP_PORTAL_EFFECTS, { 827.9618f, -994.4757f, 134.0703f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + { GO_HORDE_GUNSHIP_PORTAL_EFFECTS, { 827.9236f, -993.2986f, 134.2002f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_GUNSHIP_PORTAL_EFFECTS, { 738.7952f, -1106.747f, 134.7430f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + { GO_HORDE_GUNSHIP_PORTAL_EFFECTS, { 739.0139f, -1106.661f, 134.7548f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_GUNSHIP_PORTAL_EFFECTS, { 672.2639f, -1157.035f, 133.7057f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + { GO_HORDE_GUNSHIP_PORTAL_EFFECTS, { 672.0868f, -1156.786f, 133.7057f, 3.14159300f }, { 0.000000000f, 0.000000000f, -1.00000000f, 0.000000000f }, RESPAWN_ONE_DAY }, + + { GO_TELEPORTER_1, { 1143.250f, -779.5989f, 48.62896f, 1.64060700f }, { 0.000000000f, 0.000000000f, 0.73135280f, 0.681999300f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_1, { 1236.531f, -669.4149f, 48.27285f, 0.10471930f }, { 0.000000000f, 0.000000000f, 0.05233574f, 0.998629600f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_2, { 1233.273f, -844.5261f, 48.88242f, 6.26573300f }, { 0.000000000f, 0.000000000f, -0.00872612f, 0.999961900f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_3, { 311.9201f, -913.9722f, 48.81592f, 3.08918300f }, { 0.000000000f, 0.000000000f, 0.99965670f, 0.026201650f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_2, { 1235.528f, -683.8715f, 49.30397f, 3.19400200f }, { 0.000000000f, 0.000000000f, -0.99965670f, 0.026201650f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_4, { 397.0885f, -859.3820f, 48.89931f, 1.64060700f }, { 0.000000000f, 0.000000000f, 0.73135280f, 0.681999300f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_3, { 324.6354f, -749.1285f, 49.36018f, 0.01745246f }, { 0.000000000f, 0.000000000f, 0.00872612f, 0.999961900f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_3, { 425.6754f, -857.0903f, 48.51042f, 4.67748400f }, { 0.000000000f, 0.000000000f, -0.71933940f, 0.694658800f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_4, { 323.5399f, -888.3611f, 48.91973f, 0.03490625f }, { 0.000000000f, 0.000000000f, 0.01745224f, 0.999847700f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_4, { 326.2847f, -777.3663f, 49.02083f, 3.12412300f }, { 0.000000000f, 0.000000000f, 0.99996190f, 0.008734641f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_1, { 1235.087f, -857.8976f, 48.91626f, 3.07176600f }, { 0.000000000f, 0.000000000f, 0.99939060f, 0.034906130f }, RESPAWN_IMMEDIATELY }, + { GO_TELEPORTER_2, { 1158.762f, -746.1823f, 48.62768f, 4.76475000f }, { 0.000000000f, 0.000000000f, -0.68835450f, 0.725374500f }, RESPAWN_IMMEDIATELY }, + + { GO_TELEPORTER_EFFECTS_A, { 425.6858f, -857.0920f, 48.50996f, 4.66003000f }, { 0.000000000f, 0.000000000f, -0.72537420f, 0.688354700f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Alliance) + { GO_TELEPORTER_EFFECTS_A, { 324.6337f, -749.1476f, 49.35897f, 0.01745246f }, { 0.000000000f, 0.000000000f, 0.00872612f, 0.999961900f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Alliance) + { GO_TELEPORTER_EFFECTS_A, { 311.9115f, -913.9861f, 48.81566f, 3.08918300f }, { 0.000000000f, 0.000000000f, 0.99965670f, 0.026201650f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Alliance) + { GO_TELEPORTER_EFFECTS_A, { 326.2656f, -777.3472f, 49.02155f, 3.12412300f }, { 0.000000000f, 0.000000000f, 0.99996190f, 0.008734641f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Alliance) + { GO_TELEPORTER_EFFECTS_A, { 323.5504f, -888.3472f, 48.91979f, 0.01745246f }, { 0.000000000f, 0.000000000f, 0.00872612f, 0.999961900f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Alliance) + { GO_TELEPORTER_EFFECTS_A, { 397.1163f, -859.3785f, 48.89894f, 1.64060700f }, { 0.000000000f, 0.000000000f, 0.73135280f, 0.681999300f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Alliance) + + { GO_TELEPORTER_EFFECTS_H, { 1143.247f, -779.6233f, 48.62914f, 1.62315600f }, { 0.000000000f, 0.000000000f, 0.72537420f, 0.688354700f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Horde) + { GO_TELEPORTER_EFFECTS_H, { 1158.641f, -746.1476f, 48.62769f, 4.78220300f }, { 0.000000000f, 0.000000000f, -0.68199830f, 0.731353800f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Horde) + { GO_TELEPORTER_EFFECTS_H, { 1233.247f, -844.5729f, 48.88357f, 0.01745246f }, { 0.000000000f, 0.000000000f, 0.00872612f, 0.999961900f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Horde) + { GO_TELEPORTER_EFFECTS_H, { 1235.071f, -857.9566f, 48.91626f, 3.05432700f }, { 0.000000000f, 0.000000000f, 0.99904820f, 0.043619260f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Horde) + { GO_TELEPORTER_EFFECTS_H, { 1236.458f, -669.3438f, 48.26841f, 0.08726600f }, { 0.000000000f, 0.000000000f, 0.04361916f, 0.999048200f }, RESPAWN_IMMEDIATELY }, // Teleporter Effects (Horde) + { GO_TELEPORTER_EFFECTS_H, { 1235.595f, -683.8055f, 49.30275f, 3.21141900f }, { 0.000000000f, 0.000000000f, -0.99939060f, 0.034906130f }, RESPAWN_IMMEDIATELY } // Teleporter Effects (Horde) +}; + +uint32 const BG_IC_GraveyardIds[MAX_NODE_TYPES + BG_TEAMS_COUNT] = { 0, 0, 1480, 1481, 1482, 1485, 1486, 1483, 1484 }; + +Position const BG_IC_SpiritGuidePos[MAX_NODE_TYPES + BG_TEAMS_COUNT] = +{ + { 0.00000f, 0.00000f, 0.0000f, 0.00f }, // no grave + { 0.00000f, 0.00000f, 0.0000f, 0.00f }, // no grave + { 629.570f, -279.830f, 11.330f, 0.00f }, // dock + { 780.729f, -1103.08f, 135.51f, 2.27f }, // hangar + { 775.740f, -652.770f, 9.3100f, 4.27f }, // workshop + { 278.420f, -883.200f, 49.890f, 1.53f }, // alliance starting base + { 1300.91f, -834.040f, 48.910f, 1.69f }, // horde starting base + { 438.860f, -310.040f, 51.810f, 5.87f }, // last resort alliance + { 1148.65f, -1250.98f, 16.600f, 1.74f }, // last resort horde +}; + +ICNodePoint const nodePointInitial[MAX_NODE_TYPES] = +{ + //gameobjectId gameobject_entry faction nodeType bannerId0 (STATE_UNCONTROLLED) bannerId1 (STATE_CONFLICT_A) bannerId2 (STATE_CONFLICT_H) bannerId3 (STATE_CONTROLLED_A) bannerId4 (STATE_CONTROLLED_H) needChange timer last_entry worldState0 worldState1 worldState2 worldState3 worldState4 nodeState string + { BG_IC_GO_REFINERY_BANNER_N, GO_REFINERY_BANNER, TEAM_NEUTRAL, NODE_TYPE_REFINERY, { BG_IC_GO_REFINERY_BANNER_N, BG_IC_GO_REFINERY_BANNER_CONT_A, BG_IC_GO_REFINERY_BANNER_CONT_H, BG_IC_GO_REFINERY_BANNER_A, BG_IC_GO_REFINERY_BANNER_H }, false, 0, 0, { BG_IC_REFINERY_UNCONTROLLED, BG_IC_REFINERY_CONFLICT_A, BG_IC_REFINERY_CONFLICT_H, BG_IC_REFINERY_CONTROLLED_A, BG_IC_REFINERY_CONTROLLED_H }, NODE_STATE_UNCONTROLLED, LANG_BG_IC_REFINERY }, + { BG_IC_GO_QUARRY_BANNER_N, GO_QUARRY_BANNER, TEAM_NEUTRAL, NODE_TYPE_QUARRY, { BG_IC_GO_QUARRY_BANNER_N, BG_IC_GO_QUARRY_BANNER_CONT_A, BG_IC_GO_QUARRY_BANNER_CONT_H, BG_IC_GO_QUARRY_BANNER_A, BG_IC_GO_QUARRY_BANNER_H }, false, 0, 0, { BG_IC_QUARRY_UNCONTROLLED, BG_IC_QUARRY_CONFLICT_A, BG_IC_QUARRY_CONFLICT_H, BG_IC_QUARRY_CONTROLLED_A, BG_IC_QUARRY_CONTROLLED_H }, NODE_STATE_UNCONTROLLED, LANG_BG_IC_QUARRY }, + { BG_IC_GO_DOCKS_BANNER_N, GO_DOCKS_BANNER, TEAM_NEUTRAL, NODE_TYPE_DOCKS, { BG_IC_GO_DOCKS_BANNER_N, BG_IC_GO_DOCKS_BANNER_CONT_A, BG_IC_GO_DOCKS_BANNER_CONT_H, BG_IC_GO_DOCKS_BANNER_A, BG_IC_GO_DOCKS_BANNER_H }, false, 0, 0, { BG_IC_DOCKS_UNCONTROLLED, BG_IC_DOCKS_CONFLICT_A, BG_IC_DOCKS_CONFLICT_H, BG_IC_DOCKS_CONTROLLED_A, BG_IC_DOCKS_CONTROLLED_H }, NODE_STATE_UNCONTROLLED, LANG_BG_IC_DOCKS }, + { BG_IC_GO_HANGAR_BANNER_N, GO_HANGAR_BANNER, TEAM_NEUTRAL, NODE_TYPE_HANGAR, { BG_IC_GO_HANGAR_BANNER_N, BG_IC_GO_HANGAR_BANNER_CONT_A, BG_IC_GO_HANGAR_BANNER_CONT_H, BG_IC_GO_HANGAR_BANNER_A, BG_IC_GO_HANGAR_BANNER_H }, false, 0, 0, { BG_IC_HANGAR_UNCONTROLLED, BG_IC_HANGAR_CONFLICT_A, BG_IC_HANGAR_CONFLICT_H, BG_IC_HANGAR_CONTROLLED_A, BG_IC_HANGAR_CONTROLLED_H }, NODE_STATE_UNCONTROLLED, LANG_BG_IC_HANGAR }, + { BG_IC_GO_WORKSHOP_BANNER_N, GO_WORKSHOP_BANNER, TEAM_NEUTRAL, NODE_TYPE_WORKSHOP, { BG_IC_GO_WORKSHOP_BANNER_N, BG_IC_GO_WORKSHOP_BANNER_CONT_A, BG_IC_GO_WORKSHOP_BANNER_CONT_H, BG_IC_GO_WORKSHOP_BANNER_A, BG_IC_GO_WORKSHOP_BANNER_H }, false, 0, 0, { BG_IC_WORKSHOP_UNCONTROLLED, BG_IC_WORKSHOP_CONFLICT_A, BG_IC_WORKSHOP_CONFLICT_H, BG_IC_WORKSHOP_CONTROLLED_A, BG_IC_WORKSHOP_CONTROLLED_H }, NODE_STATE_UNCONTROLLED, LANG_BG_IC_WORKSHOP }, + { BG_IC_GO_ALLIANCE_GRAVEYARD_A, GO_ALLIANCE_BANNER_GRAVEYARD_A, TEAM_ALLIANCE, NODE_TYPE_GRAVEYARD_A, { 0, BG_IC_GO_ALLIANCE_GRAVEYARD_CONT_A, BG_IC_GO_ALLIANCE_GRAVEYARD_CONT_H, BG_IC_GO_ALLIANCE_GRAVEYARD_A, BG_IC_GO_ALLIANCE_GRAVEYARD_H }, false, 0, 0, { BG_IC_ALLIANCE_KEEP_UNCONTROLLED, BG_IC_ALLIANCE_KEEP_CONFLICT_A, BG_IC_ALLIANCE_KEEP_CONFLICT_H, BG_IC_ALLIANCE_KEEP_CONTROLLED_A, BG_IC_ALLIANCE_KEEP_CONTROLLED_H }, NODE_STATE_CONTROLLED_A, LANG_BG_IC_ALLIANCE_KEEP }, + { BG_IC_GO_HORDE_GRAVEYARD_H, GO_HORDE_BANNER_GRAVEYARD_H, TEAM_HORDE, NODE_TYPE_GRAVEYARD_H, { 0, BG_IC_GO_HORDE_GRAVEYARD_CONT_A, BG_IC_GO_HORDE_GRAVEYARD_CONT_H, BG_IC_GO_HORDE_GRAVEYARD_A, BG_IC_GO_HORDE_GRAVEYARD_H }, false, 0, 0, { BG_IC_HORDE_KEEP_UNCONTROLLED, BG_IC_HORDE_KEEP_CONFLICT_A, BG_IC_HORDE_KEEP_CONFLICT_H, BG_IC_HORDE_KEEP_CONTROLLED_A, BG_IC_HORDE_KEEP_CONTROLLED_H }, NODE_STATE_CONTROLLED_H, LANG_BG_IC_HORDE_KEEP } +}; + +enum Events +{ + EVENT_CLOSE_DOORS = 1, + EVENT_DESPAWN_FAKE_DOORS, + EVENT_RESPAWN_DOCK_VEHICLES, + EVENT_RESPAWN_WORKSHOP_VEHICLES, + EVENT_UPDATE_RESOURCES +}; + BattlegroundIC::BattlegroundIC() { - BgObjects.resize(MAX_NORMAL_GAMEOBJECTS_SPAWNS + MAX_AIRSHIPS_SPAWNS + MAX_HANGAR_TELEPORTERS_SPAWNS + MAX_FORTRESS_TELEPORTERS_SPAWNS + MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS + MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS); - BgCreatures.resize(MAX_NORMAL_NPCS_SPAWNS + MAX_WORKSHOP_SPAWNS + MAX_DOCKS_SPAWNS + MAX_SPIRIT_GUIDES_SPAWNS + MAX_HANGAR_NPCS_SPAWNS); + SetGameObjectsNumber(BG_IC_GO_MAX); + SetCreaturesNumber(BG_IC_NPC_MAX); StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_IC_START_TWO_MINUTES; StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_IC_START_ONE_MINUTE; StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_IC_START_HALF_MINUTE; StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_IC_HAS_BEGUN; - for (uint8 i = 0; i < 2; ++i) + for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) factionReinforcements[i] = MAX_REINFORCEMENTS; for (uint8 i = 0; i < BG_IC_MAXDOOR; ++i) GateStatus[i] = BG_IC_GATE_OK; - closeFortressDoorsTimer = CLOSE_DOORS_TIME; // the doors are closed again... in a special way - doorsClosed = false; - docksTimer = DOCKS_UPDATE_TIME; - resourceTimer = IC_RESOURCE_TIME; - for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; ++i) nodePoint[i] = nodePointInitial[i]; - - siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIME; - - gunshipHorde = NULL; - gunshipAlliance = NULL; } BattlegroundIC::~BattlegroundIC() { } @@ -73,41 +351,50 @@ void BattlegroundIC::PostUpdateImpl(uint32 diff) if (GetStatus() != STATUS_IN_PROGRESS) return; - if (!doorsClosed) + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) { - if (closeFortressDoorsTimer <= diff) + switch (eventId) { - GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01)->RemoveFromWorld(); - GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01)->RemoveFromWorld(); - GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR02)->RemoveFromWorld(); - GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR02)->RemoveFromWorld(); - GetBGObject(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03)->RemoveFromWorld(); - GetBGObject(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03)->RemoveFromWorld(); + case EVENT_CLOSE_DOORS: + for (uint32 i = BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01; i <= BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03; ++i) + DoorClose(i); - GetBGObject(BG_IC_GO_ALLIANCE_GATE_1)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); - GetBGObject(BG_IC_GO_HORDE_GATE_1)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); - GetBGObject(BG_IC_GO_ALLIANCE_GATE_2)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); - GetBGObject(BG_IC_GO_HORDE_GATE_2)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); - GetBGObject(BG_IC_GO_ALLIANCE_GATE_3)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); - GetBGObject(BG_IC_GO_HORDE_GATE_3)->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); + for (uint32 i = BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01; i <= BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03; ++i) + DoorClose(i); - doorsClosed = true; - } else closeFortressDoorsTimer -= diff; - } + _events.ScheduleEvent(EVENT_DESPAWN_FAKE_DOORS, DESPAWN_FAKE_DOORS_TIME); + break; + case EVENT_DESPAWN_FAKE_DOORS: + // [13] UpdateType: Values + // [13] GUID: Full: 0xF11002FC7300140C Type: GameObject Entry: 195699 Low: 5132 + // [13] GAMEOBJECT_DISPLAYID: 8997/1.260748E-41 + // [13] GAMEOBJECT_FLAGS: 544/7.623064E-43 + // [13] GAMEOBJECT_BYTES_1: 4278198529/-1.703125E+38 + for (uint32 i = BG_IC_GO_ALLIANCE_GATE_1; i < BG_IC_GO_ALLIANCE_GATE_1 + BG_IC_MAXDOOR; ++i) + { + DoorClose(i); + if (GameObject* gate = GetBGObject(i, false)) + gate->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); + } - for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; ++i) - { - if (nodePoint[i].nodeType == NODE_TYPE_DOCKS) - { - if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || - nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) + // sends SMSG_GAMEOBJECT_DESPAWN_ANIM + for (uint32 i = BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01; i <= BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03; ++i) + DelObject(i); + + for (uint32 i = BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01; i <= BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03; ++i) + DelObject(i); + break; + case EVENT_RESPAWN_DOCK_VEHICLES: { - if (docksTimer <= diff) + ICNodePoint* docks = nodePoint + NODE_TYPE_DOCKS; + if (docks->nodeState == NODE_STATE_CONTROLLED_A || docks->nodeState == NODE_STATE_CONTROLLED_H) { // we need to confirm this, i am not sure if this every 3 minutes - for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_A : BG_IC_NPC_CATAPULT_4_H); ++u) + for (uint8 u = (docks->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H); u <= (docks->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_A : BG_IC_NPC_CATAPULT_4_H); ++u) { - if (Creature* catapult = GetBGCreature(u)) + if (Creature* catapult = GetBGCreature(u, false)) { if (!catapult->IsAlive()) catapult->Respawn(true); @@ -115,36 +402,32 @@ void BattlegroundIC::PostUpdateImpl(uint32 diff) } // we need to confirm this is blizzlike, not sure if it is every 3 minutes - for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_A : BG_IC_NPC_GLAIVE_THROWER_2_H); ++u) + for (uint8 u = (docks->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H); u <= (docks->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_A : BG_IC_NPC_GLAIVE_THROWER_2_H); ++u) { - if (Creature* glaiveThrower = GetBGCreature(u)) + if (Creature* glaiveThrower = GetBGCreature(u, false)) { if (!glaiveThrower->IsAlive()) glaiveThrower->Respawn(true); } } - - docksTimer = DOCKS_UPDATE_TIME; - } else docksTimer -= diff; + } + _events.Repeat(DOCKS_UPDATE_TIME); + break; } - } - - if (nodePoint[i].nodeType == NODE_TYPE_WORKSHOP) - { - if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || - nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) + case EVENT_RESPAWN_WORKSHOP_VEHICLES: { - if (siegeEngineWorkshopTimer <= diff) + ICNodePoint* workshop = nodePoint + NODE_TYPE_WORKSHOP; + if (workshop->nodeState == NODE_STATE_CONTROLLED_A || workshop->nodeState == NODE_STATE_CONTROLLED_H) { - uint8 siegeType = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); + uint8 siegeType = (workshop->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); - if (Creature* siege = GetBGCreature(siegeType)) // this always should be true + if (Creature* siege = GetBGCreature(siegeType, false)) // this always should be true { if (siege->IsAlive()) { - if (siege->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_CANNOT_SWIM|UNIT_FLAG_IMMUNE_TO_PC)) + if (siege->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_CANNOT_SWIM | UNIT_FLAG_IMMUNE_TO_PC)) // following sniffs the vehicle always has UNIT_FLAG_CANNOT_SWIM - siege->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_IMMUNE_TO_PC); + siege->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); else siege->SetHealth(siege->GetMaxHealth()); } @@ -153,7 +436,7 @@ void BattlegroundIC::PostUpdateImpl(uint32 diff) } // we need to confirm if it is every 3 minutes - for (uint8 u = (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H); u < (nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_A : BG_IC_NPC_DEMOLISHER_4_H); ++u) + for (uint8 u = (workshop->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H); u <= (workshop->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_A : BG_IC_NPC_DEMOLISHER_4_H); ++u) { if (Creature* demolisher = GetBGCreature(u)) { @@ -161,85 +444,86 @@ void BattlegroundIC::PostUpdateImpl(uint32 diff) demolisher->Respawn(true); } } - siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIME; - } else siegeEngineWorkshopTimer -= diff; + } + _events.Repeat(WORKSHOP_UPDATE_TIME); + break; } + case EVENT_UPDATE_RESOURCES: + for (uint8 i = NODE_TYPE_REFINERY; i <= NODE_TYPE_QUARRY; ++i) + { + ICNodePoint* currentNode = nodePoint + i; + if (currentNode->nodeState == NODE_STATE_CONTROLLED_A || currentNode->nodeState == NODE_STATE_CONTROLLED_H) + { + ++factionReinforcements[currentNode->faction]; + RewardHonorToTeam(RESOURCE_HONOR_AMOUNT, currentNode->faction == TEAM_ALLIANCE ? ALLIANCE : HORDE); + UpdateWorldState((currentNode->faction == TEAM_ALLIANCE ? BG_IC_WS_ALLIANCE_REINFORCEMENTS : BG_IC_WS_HORDE_REINFORCEMENTS), factionReinforcements[currentNode->faction]); + } + } + _events.Repeat(IC_RESOURCE_TIME); + break; } + } - // the point is waiting for a change on its banner - if (nodePoint[i].needChange) + // now check if nodes need to change banner state + for (uint8 i = NODE_TYPE_REFINERY; i < MAX_NODE_TYPES; ++i) + { + ICNodePoint* currentNode = nodePoint + i; + if (currentNode->needChange) { - if (nodePoint[i].timer <= diff) + if (currentNode->timer <= diff) { - uint32 nextBanner = GetNextBanner(&nodePoint[i], nodePoint[i].faction, true); - - nodePoint[i].last_entry = nodePoint[i].gameobject_entry; - nodePoint[i].gameobject_entry = nextBanner; - // nodePoint[i].faction = the faction should be the same one... - - GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); - - if (!banner) // this should never happen - return; - - float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; - - DelObject(nodePoint[i].gameobject_type); - AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY); + uint32 nextBannerId = GetNextBanner(currentNode, currentNode->faction, true); + currentNode->last_entry = currentNode->gameobject_entry; - GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); + GameObject* nextBanner = GetBGObject(nextBannerId); + ASSERT(nextBanner); + currentNode->gameobject_entry = nextBanner->GetEntry(); - UpdateNodeWorldState(&nodePoint[i]); - HandleCapturedNodes(&nodePoint[i], false); + // now swap banners + SpawnBGObject(currentNode->gameobjectId, RESPAWN_ONE_DAY); + SpawnBGObject(nextBannerId, RESPAWN_IMMEDIATELY); + currentNode->gameobjectId = nextBannerId; - SendMessage2ToAll(LANG_BG_IC_TEAM_HAS_TAKEN_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (nodePoint[i].faction == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE), nodePoint[i].string); + UpdateNodeWorldState(currentNode); + HandleCapturedNodes(currentNode, false); - nodePoint[i].needChange = false; - nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; - } else nodePoint[i].timer -= diff; - } - } + SendMessage2ToAll(LANG_BG_IC_TEAM_HAS_TAKEN_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, nullptr, (currentNode->faction == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE), currentNode->string); - if (resourceTimer <= diff) - { - for (uint8 i = 0; i < NODE_TYPE_DOCKS; ++i) - { - if (nodePoint[i].nodeState == NODE_STATE_CONTROLLED_A || - nodePoint[i].nodeState == NODE_STATE_CONTROLLED_H) - { - factionReinforcements[nodePoint[i].faction] += 1; - RewardHonorToTeam(RESOURCE_HONOR_AMOUNT, nodePoint[i].faction == TEAM_ALLIANCE ? ALLIANCE : HORDE); - UpdateWorldState((nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_ALLIANCE_RENFORT : BG_IC_HORDE_RENFORT), factionReinforcements[nodePoint[i].faction]); + currentNode->timer = 0; + currentNode->needChange = false; } + else + currentNode->timer -= diff; } - resourceTimer = IC_RESOURCE_TIME; - } else resourceTimer -= diff; + } } -void BattlegroundIC::StartingEventCloseDoors() -{ -} +void BattlegroundIC::StartingEventCloseDoors() { } void BattlegroundIC::StartingEventOpenDoors() { - //after 20 seconds they should be despawned - DoorOpen(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01); - DoorOpen(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01); - DoorOpen(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR02); - DoorOpen(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR02); - DoorOpen(BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03); - DoorOpen(BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03); + for (uint8 i = BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01; i <= BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03; ++i) + DoorOpen(i); + + for (uint8 i = BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01; i <= BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03; ++i) + DoorOpen(i); + + for (uint8 i = BG_IC_GO_DOODAD_HU_PORTCULLIS01_1; i <= BG_IC_GO_DOODAD_HU_PORTCULLIS01_2; ++i) + DoorOpen(i); - DoorOpen(BG_IC_GO_DOODAD_HU_PORTCULLIS01_1); - DoorOpen(BG_IC_GO_DOODAD_HU_PORTCULLIS01_2); - DoorOpen(BG_IC_GO_DOODAD_VR_PORTCULLIS01_1); - DoorOpen(BG_IC_GO_DOODAD_VR_PORTCULLIS01_2); + for (uint8 i = BG_IC_GO_DOODAD_VR_PORTCULLIS01_1; i <= BG_IC_GO_DOODAD_VR_PORTCULLIS01_2; ++i) + DoorOpen(i); - for (uint8 i = 0; i < MAX_FORTRESS_TELEPORTERS_SPAWNS; ++i) - GetBGObject(BG_IC_Teleporters[i].type)->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + // schedule door close in 30 sec + _events.ScheduleEvent(EVENT_CLOSE_DOORS, CLOSE_DOORS_TIME); - for (uint8 i = 0; i < MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS; ++i) - GetBGObject(BG_IC_TeleporterEffects[i].type)->SetGoState(GO_STATE_ACTIVE); + for (uint8 i = BG_IC_GO_TELEPORTER_1_1; i < BG_IC_GO_TELEPORTER_1_1 + MAX_FORTRESS_TELEPORTERS_SPAWNS; ++i) + if (GameObject* teleporter = GetBGObject(i, false)) + teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + + for (uint8 i = BG_IC_GO_TELEPORTER_EFFECTS_A_1; i < BG_IC_GO_TELEPORTER_EFFECTS_A_1 + MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS; ++i) + if (GameObject* teleporterEffect = GetBGObject(i, false)) + teleporterEffect->SetGoState(GO_STATE_ACTIVE); } void BattlegroundIC::AddPlayer(Player* player) @@ -288,14 +572,15 @@ void BattlegroundIC::HandleAreaTrigger(Player* player, uint32 trigger) void BattlegroundIC::FillInitialWorldStates(WorldPacket& data) { - data << uint32(BG_IC_ALLIANCE_RENFORT_SET) << uint32(1); - data << uint32(BG_IC_HORDE_RENFORT_SET) << uint32(1); - data << uint32(BG_IC_ALLIANCE_RENFORT) << uint32(factionReinforcements[TEAM_ALLIANCE]); - data << uint32(BG_IC_HORDE_RENFORT) << uint32(factionReinforcements[TEAM_HORDE]); + data << uint32(BG_IC_WS_REINFORCEMENTS_SHOW_A) << uint32(1); + data << uint32(BG_IC_WS_REINFORCEMENTS_SHOW_H) << uint32(1); + data << uint32(BG_IC_WS_ALLIANCE_REINFORCEMENTS) << uint32(factionReinforcements[TEAM_ALLIANCE]); + data << uint32(BG_IC_WS_HORDE_REINFORCEMENTS) << uint32(factionReinforcements[TEAM_HORDE]); for (uint8 i = 0; i < MAX_FORTRESS_GATES_SPAWNS; ++i) { - uint32 uws = GetWorldStateFromGateEntry(BG_IC_ObjSpawnlocs[i].entry, (GateStatus[GetGateIDFromEntry(BG_IC_ObjSpawnlocs[i].entry)] == BG_IC_GATE_DESTROYED ? true : false)); + BattlegroundGOSpawnPoint const& door = BG_IC_ObjSpawnlocs[i]; + uint32 uws = GetWorldStateFromGateEntry(door.Entry, GateStatus[GetGateIDFromEntry(door.Entry)] == BG_IC_GATE_DESTROYED); data << uint32(uws) << uint32(1); } @@ -305,38 +590,65 @@ void BattlegroundIC::FillInitialWorldStates(WorldPacket& data) bool BattlegroundIC::SetupBattleground() { - for (uint8 i = 0; i < MAX_NORMAL_GAMEOBJECTS_SPAWNS; ++i) + for (uint8 i = 0; i <= BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03; ++i) + { + BattlegroundGOSpawnPoint const& object = BG_IC_ObjSpawnlocs[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning gameobject %u. Battleground not Created!", object.Entry); + return false; + } + } + + for (uint8 i = BG_IC_GO_TELEPORTER_1_1; i < BG_IC_GO_TELEPORTER_1_1 + MAX_FORTRESS_TELEPORTERS_SPAWNS; ++i) { - if (!AddObject(BG_IC_ObjSpawnlocs[i].type, BG_IC_ObjSpawnlocs[i].entry, BG_IC_ObjSpawnlocs[i].x, BG_IC_ObjSpawnlocs[i].y, BG_IC_ObjSpawnlocs[i].z, BG_IC_ObjSpawnlocs[i].o, 0, 0, 0, 0, RESPAWN_ONE_DAY)) + BattlegroundGOSpawnPoint const& teleportSpawn = BG_IC_ObjSpawnlocs[i]; + GameObject* teleporter = AddObject(i, teleportSpawn.Entry, teleportSpawn.Pos, teleportSpawn.Rot, teleportSpawn.SpawnTime); + if (!teleporter) { - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning gameobject %u", BG_IC_ObjSpawnlocs[i].entry); + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning gameobject %u. Battleground not Created!", teleportSpawn.Entry); return false; } + + teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } - for (uint8 i = 0; i < MAX_FORTRESS_TELEPORTERS_SPAWNS; ++i) + for (uint8 i = BG_IC_GO_TELEPORTER_EFFECTS_A_1; i < BG_IC_GO_TELEPORTER_EFFECTS_A_1 + MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS; ++i) { - if (!AddObject(BG_IC_Teleporters[i].type, BG_IC_Teleporters[i].entry, BG_IC_Teleporters[i].x, BG_IC_Teleporters[i].y, BG_IC_Teleporters[i].z, BG_IC_Teleporters[i].o, 0, 0, 0, 0, RESPAWN_ONE_DAY)) + BattlegroundGOSpawnPoint const& teleporterEffect = BG_IC_ObjSpawnlocs[i]; + if (!AddObject(i, teleporterEffect.Entry, teleporterEffect.Pos, teleporterEffect.Rot, teleporterEffect.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "Isle of Conquest | Starting Event Open Doors: There was an error spawning gameobject %u", BG_IC_Teleporters[i].entry); + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning gameobject %u. Battleground not Created!", teleporterEffect.Entry); return false; } } - for (uint8 i = 0; i < MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS; ++i) + for (uint8 i = BG_IC_GO_HANGAR_TELEPORTER_1_A; i < BG_IC_GO_HANGAR_TELEPORTER_1_A + MAX_HANGAR_TELEPORTERS_SPAWNS; ++i) { - if (!AddObject(BG_IC_TeleporterEffects[i].type, BG_IC_TeleporterEffects[i].entry, BG_IC_TeleporterEffects[i].x, BG_IC_TeleporterEffects[i].y, BG_IC_TeleporterEffects[i].z, BG_IC_TeleporterEffects[i].o, 0, 0, 0, 0, RESPAWN_ONE_DAY)) + BattlegroundGOSpawnPoint const& teleporter = BG_IC_ObjSpawnlocs[i]; + if (!AddObject(i, teleporter.Entry, teleporter.Pos, teleporter.Rot, teleporter.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "Isle of Conquest | Starting Event Open Doors: There was an error spawning gameobject %u", BG_IC_Teleporters[i].entry); + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning gameobject %u. Battleground not Created!", teleporter.Entry); return false; } } - for (uint8 i = 2; i < MAX_NORMAL_NPCS_SPAWNS; ++i) + for (uint8 i = BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A; i < BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A + MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS; ++i) { - if (!AddCreature(BG_IC_NpcSpawnlocs[i].entry, BG_IC_NpcSpawnlocs[i].type, BG_IC_NpcSpawnlocs[i].x, BG_IC_NpcSpawnlocs[i].y, BG_IC_NpcSpawnlocs[i].z, BG_IC_NpcSpawnlocs[i].o, BG_IC_NpcSpawnlocs[i].team, RESPAWN_ONE_DAY)) + BattlegroundGOSpawnPoint const& teleporterEffect = BG_IC_ObjSpawnlocs[i]; + if (!AddObject(i, teleporterEffect.Entry, teleporterEffect.Pos, teleporterEffect.Rot, teleporterEffect.SpawnTime, GO_STATE_ACTIVE)) { - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning creature %u", BG_IC_NpcSpawnlocs[i].entry); + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning gameobject %u. Battleground not Created!", teleporterEffect.Entry); + return false; + } + } + + for (uint8 i = BG_IC_NPC_KOR_KRON_GUARD_1; i <= BG_IC_NPC_KEEP_CANNON_24; ++i) + { + BattlegroundSpawnPoint const& creature = BG_IC_NpcSpawnlocs[i]; + if (!AddCreature(creature.Entry, i, creature.Pos, creature.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning creature %u", creature.Entry); return false; } } @@ -350,8 +662,8 @@ bool BattlegroundIC::SetupBattleground() return false; } - gunshipHorde = sTransportMgr->CreateTransport(GO_HORDE_GUNSHIP, 0, GetBgMap()); - gunshipAlliance = sTransportMgr->CreateTransport(GO_ALLIANCE_GUNSHIP, 0, GetBgMap()); + Transport* gunshipHorde = sTransportMgr->CreateTransport(GO_HORDE_GUNSHIP, 0, GetBgMap()); + Transport* gunshipAlliance = sTransportMgr->CreateTransport(GO_ALLIANCE_GUNSHIP, 0, GetBgMap()); if (!gunshipAlliance || !gunshipHorde) { @@ -359,19 +671,29 @@ bool BattlegroundIC::SetupBattleground() return false; } + gunshipHordeGUID = gunshipHorde->GetGUID(); + gunshipAllianceGUID = gunshipAlliance->GetGUID(); + gunshipHorde->EnableMovement(false); gunshipAlliance->EnableMovement(false); // setting correct factions for Keep Cannons for (uint8 i = BG_IC_NPC_KEEP_CANNON_1; i <= BG_IC_NPC_KEEP_CANNON_12; ++i) - GetBGCreature(i)->setFaction(BG_IC_Factions[0]); + if (Creature* allianceCannon = GetBGCreature(i, false)) + allianceCannon->setFaction(BG_IC_Factions[TEAM_ALLIANCE]); + for (uint8 i = BG_IC_NPC_KEEP_CANNON_13; i <= BG_IC_NPC_KEEP_CANNON_24; ++i) - GetBGCreature(i)->setFaction(BG_IC_Factions[1]); + if (Creature* hordeCannon = GetBGCreature(i, false)) + hordeCannon->setFaction(BG_IC_Factions[TEAM_HORDE]); // correcting spawn time for keeps bombs for (uint8 i = BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1; i < BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4; ++i) - GetBGObject(i)->SetRespawnTime(10); + if (GameObject* seaforiumBomb = GetBGObject(i, false)) + seaforiumBomb->SetRespawnTime(BG_IC_ObjSpawnlocs[i].SpawnTime); + _events.ScheduleEvent(EVENT_RESPAWN_DOCK_VEHICLES, DOCKS_UPDATE_TIME); + _events.ScheduleEvent(EVENT_RESPAWN_WORKSHOP_VEHICLES, WORKSHOP_UPDATE_TIME); + _events.ScheduleEvent(EVENT_UPDATE_RESOURCES, IC_RESOURCE_TIME); return true; } @@ -405,9 +727,9 @@ void BattlegroundIC::HandleKillPlayer(Player* player, Player* killer) Battleground::HandleKillPlayer(player, killer); - factionReinforcements[player->GetTeamId()] -= 1; + --factionReinforcements[player->GetTeamId()]; - UpdateWorldState((player->GetTeamId() == TEAM_ALLIANCE ? BG_IC_ALLIANCE_RENFORT : BG_IC_HORDE_RENFORT), factionReinforcements[player->GetTeamId()]); + UpdateWorldState((player->GetTeamId() == TEAM_ALLIANCE ? BG_IC_WS_ALLIANCE_REINFORCEMENTS : BG_IC_WS_HORDE_REINFORCEMENTS), factionReinforcements[player->GetTeamId()]); // we must end the battleground if (factionReinforcements[player->GetTeamId()] < 1) @@ -416,7 +738,7 @@ void BattlegroundIC::HandleKillPlayer(Player* player, Player* killer) void BattlegroundIC::EndBattleground(uint32 winner) { - SendMessage2ToAll(LANG_BG_IC_TEAM_WINS, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (winner == ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); + SendMessage2ToAll(LANG_BG_IC_TEAM_WINS, CHAT_MSG_BG_SYSTEM_NEUTRAL, nullptr, (winner == ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); Battleground::EndBattleground(winner); } @@ -426,137 +748,180 @@ void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target if (GetStatus() != STATUS_IN_PROGRESS) return; + ICNodePoint* currentNode = nullptr; // All the node points are iterated to find the clicked one for (uint8 i = 0; i < MAX_NODE_TYPES; ++i) { if (nodePoint[i].gameobject_entry == target_obj->GetEntry()) { - // THIS SHOULD NEEVEER HAPPEN - if (nodePoint[i].faction == player->GetTeamId()) - return; - - uint32 nextBanner = GetNextBanner(&nodePoint[i], player->GetTeamId(), false); - - // we set the new settings of the nodePoint - nodePoint[i].faction = player->GetTeamId(); - nodePoint[i].last_entry = nodePoint[i].gameobject_entry; - nodePoint[i].gameobject_entry = nextBanner; + currentNode = nodePoint + i; + break; + } + } - // this is just needed if the next banner is grey - if (nodePoint[i].banners[BANNER_A_CONTESTED] == nextBanner || nodePoint[i].banners[BANNER_H_CONTESTED] == nextBanner) - { - nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; // 1 minute for last change (real faction banner) - nodePoint[i].needChange = true; + if (!currentNode) + return; - RelocateDeadPlayers(BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1 + nodePoint[i].nodeType - 2]); + // THIS SHOULD NEEVEER HAPPEN + if (currentNode->faction == player->GetTeamId()) + return; - // if we are here means that the point has been lost, or it is the first capture + uint32 nextBannerId = GetNextBanner(currentNode, player->GetTeamId(), false); - if (nodePoint[i].nodeType != NODE_TYPE_REFINERY && nodePoint[i].nodeType != NODE_TYPE_QUARRY) - if (BgCreatures[BG_IC_NPC_SPIRIT_GUIDE_1+(nodePoint[i].nodeType)-2]) - DelCreature(BG_IC_NPC_SPIRIT_GUIDE_1+(nodePoint[i].nodeType)-2); + // we set the new settings of the nodePoint + currentNode->faction = player->GetTeamId(); + currentNode->last_entry = currentNode->gameobject_entry; - UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); + // this is just needed if the next banner is grey + if (nextBannerId == currentNode->bannerIds[NODE_STATE_CONFLICT_A] || nextBannerId == currentNode->bannerIds[NODE_STATE_CONFLICT_H]) + { + currentNode->timer = BANNER_STATE_CHANGE_TIME; // 1 minute for last change (real faction banner) + currentNode->needChange = true; - SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_1, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, nodePoint[i].string); - SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_2, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, nodePoint[i].string, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); - HandleContestedNodes(&nodePoint[i]); - } - else if (nextBanner == nodePoint[i].banners[BANNER_A_CONTROLLED] || nextBanner == nodePoint[i].banners[BANNER_H_CONTROLLED]) // if we are going to spawn the definitve faction banner, we dont need the timer anymore - { - nodePoint[i].timer = BANNER_STATE_CHANGE_TIME; - nodePoint[i].needChange = false; - SendMessage2ToAll(LANG_BG_IC_TEAM_DEFENDED_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, nodePoint[i].string); - HandleCapturedNodes(&nodePoint[i], true); - UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); - } + // if we are here means that the point has been lost, or it is the first capture + if (currentNode->nodeType > NODE_TYPE_QUARRY) + { + uint32 spiritGuideId = BG_IC_NPC_SPIRIT_GUIDE_1 + currentNode->nodeType - (NODE_TYPE_QUARRY + 1); + if (Creature* spiritGuide = GetBGCreature(spiritGuideId, false)) + RelocateDeadPlayers(spiritGuide->GetGUID()); - GameObject* banner = GetBGObject(nodePoint[i].gameobject_type); + DelCreature(spiritGuideId); + } - if (!banner) // this should never happen - return; + UpdatePlayerScore(player, SCORE_BASES_ASSAULTED, 1); - float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() }; + SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_1, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, currentNode->string); + SendMessage2ToAll(LANG_BG_IC_TEAM_ASSAULTED_NODE_2, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, currentNode->string, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_ALLIANCE : LANG_BG_IC_HORDE)); + HandleContestedNodes(currentNode); + } + else if (nextBannerId == currentNode->bannerIds[NODE_STATE_CONTROLLED_A] || nextBannerId == currentNode->bannerIds[NODE_STATE_CONTROLLED_H]) // if we are going to spawn the definitve faction banner, we dont need the timer anymore + { + currentNode->timer = 0; + currentNode->needChange = false; + SendMessage2ToAll(LANG_BG_IC_TEAM_DEFENDED_NODE, CHAT_MSG_BG_SYSTEM_NEUTRAL, player, currentNode->string); + HandleCapturedNodes(currentNode, true); + UpdatePlayerScore(player, SCORE_BASES_DEFENDED, 1); + } - DelObject(nodePoint[i].gameobject_type); - if (!AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a banner (type: %u, entry: %u). Isle of Conquest BG cancelled.", nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry); - EndBattleground(0); - } + GameObject* nextBanner = GetBGObject(nextBannerId); + ASSERT(nextBanner); + currentNode->gameobject_entry = nextBanner->GetEntry(); - GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]); + SpawnBGObject(currentNode->gameobjectId, RESPAWN_ONE_DAY); + SpawnBGObject(nextBannerId, RESPAWN_IMMEDIATELY); + currentNode->gameobjectId = nextBannerId; - UpdateNodeWorldState(&nodePoint[i]); - // we dont need iterating if we are here - // If the needChange bool was set true, we will handle the rest in the Update Map function. - return; - } - } + UpdateNodeWorldState(currentNode); } void BattlegroundIC::UpdateNodeWorldState(ICNodePoint* node) { //updating worldstate - if (node->gameobject_entry == node->banners[BANNER_A_CONTROLLED]) + if (node->gameobjectId == node->bannerIds[NODE_STATE_CONTROLLED_A]) node->nodeState = NODE_STATE_CONTROLLED_A; - else if (node->gameobject_entry == node->banners[BANNER_A_CONTESTED]) + else if (node->gameobjectId == node->bannerIds[NODE_STATE_CONFLICT_A]) node->nodeState = NODE_STATE_CONFLICT_A; - else if (node->gameobject_entry == node->banners[BANNER_H_CONTROLLED]) + else if (node->gameobjectId == node->bannerIds[NODE_STATE_CONTROLLED_H]) node->nodeState = NODE_STATE_CONTROLLED_H; - else if (node->gameobject_entry == node->banners[BANNER_H_CONTESTED]) + else if (node->gameobjectId == node->bannerIds[NODE_STATE_CONFLICT_H]) node->nodeState = NODE_STATE_CONFLICT_H; uint32 worldstate = node->worldStates[node->nodeState]; - // with this we are sure we dont bug the client - for (uint8 i = 0; i < 5; ++i) + for (uint8 i = 0; i < NODE_STATE_MAX; ++i) { if (node->worldStates[i] == worldstate) continue; + UpdateWorldState(node->worldStates[i], 0); } UpdateWorldState(worldstate, 1); } -uint32 BattlegroundIC::GetNextBanner(ICNodePoint* node, uint32 team, bool returnDefinitve) +uint32 BattlegroundIC::GetNextBanner(ICNodePoint const* node, TeamId team, bool returnDefinitve) { // this is only used in the update map function if (returnDefinitve) // here is a special case, here we must return the definitve faction banner after the grey banner was spawned 1 minute - return node->banners[(team == TEAM_ALLIANCE ? BANNER_A_CONTROLLED : BANNER_H_CONTROLLED)]; + return node->bannerIds[(team == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H)]; // there were no changes, this point has never been captured by any faction or at least clicked if (node->last_entry == 0) - // 1 returns the CONTESTED ALLIANCE BANNER, 3 returns the HORDE one - return node->banners[(team == TEAM_ALLIANCE ? BANNER_A_CONTESTED : BANNER_H_CONTESTED)]; + return node->bannerIds[(team == TEAM_ALLIANCE ? NODE_STATE_CONFLICT_A : NODE_STATE_CONFLICT_H)]; // If the actual banner is the definitive faction banner, we must return the grey banner of the player's faction - if (node->gameobject_entry == node->banners[BANNER_A_CONTROLLED] || node->gameobject_entry == node->banners[BANNER_H_CONTROLLED]) - return node->banners[(team == TEAM_ALLIANCE ? BANNER_A_CONTESTED : BANNER_H_CONTESTED)]; + if (node->gameobjectId == node->bannerIds[NODE_STATE_CONTROLLED_A] || node->gameobjectId == node->bannerIds[NODE_STATE_CONTROLLED_H]) + return node->bannerIds[(team == TEAM_ALLIANCE ? NODE_STATE_CONFLICT_A : NODE_STATE_CONFLICT_H)]; // If the actual banner is the grey faction banner, we must return the previous banner - if (node->gameobject_entry == node->banners[BANNER_A_CONTESTED] || node->banners[BANNER_H_CONTESTED]) + if (node->gameobjectId == node->bannerIds[NODE_STATE_CONFLICT_A] || node->gameobjectId == node->bannerIds[NODE_STATE_CONFLICT_H]) return node->last_entry; // we should never be here... - TC_LOG_ERROR("bg.battleground", "Isle Of Conquest: Unexpected return in GetNextBanner function"); + TC_LOG_ERROR("bg.battleground", "Isle Of Conquest: Unexpected return in GetNextBanner function (node %u)", node->gameobjectId); + return 0; +} + +uint32 BattlegroundIC::GetGateIDFromEntry(uint32 id) +{ + switch (id) + { + case GO_HORDE_GATE_1: + return BG_IC_H_FRONT; + case GO_HORDE_GATE_2: + return BG_IC_H_EAST; + case GO_HORDE_GATE_3: + return BG_IC_H_WEST; + case GO_ALLIANCE_GATE_1: + return BG_IC_A_WEST; + case GO_ALLIANCE_GATE_2: + return BG_IC_A_FRONT; + case GO_ALLIANCE_GATE_3: + return BG_IC_A_EAST; + default: + break; + } + + return 0; +} + +uint32 BattlegroundIC::GetWorldStateFromGateEntry(uint32 id, bool open) +{ + switch (id) + { + case GO_HORDE_GATE_1: + return (open ? BG_IC_GATE_FRONT_H_WS_OPEN : BG_IC_GATE_FRONT_H_WS_CLOSED); + case GO_HORDE_GATE_2: + return (open ? BG_IC_GATE_EAST_H_WS_OPEN : BG_IC_GATE_EAST_H_WS_CLOSED); + case GO_HORDE_GATE_3: + return (open ? BG_IC_GATE_WEST_H_WS_OPEN : BG_IC_GATE_WEST_H_WS_CLOSED); + case GO_ALLIANCE_GATE_1: + return (open ? BG_IC_GATE_WEST_A_WS_OPEN : BG_IC_GATE_WEST_A_WS_CLOSED); + case GO_ALLIANCE_GATE_2: + return (open ? BG_IC_GATE_FRONT_A_WS_OPEN : BG_IC_GATE_FRONT_A_WS_CLOSED); + case GO_ALLIANCE_GATE_3: + return (open ? BG_IC_GATE_EAST_A_WS_OPEN : BG_IC_GATE_EAST_A_WS_CLOSED); + } + return 0; } -void BattlegroundIC::HandleContestedNodes(ICNodePoint* node) +void BattlegroundIC::HandleContestedNodes(ICNodePoint const* node) { if (node->nodeType == NODE_TYPE_HANGAR) { + Transport* gunshipAlliance = HashMapHolder::Find(gunshipAllianceGUID); + Transport* gunshipHorde = HashMapHolder::Find(gunshipHordeGUID); + if (gunshipAlliance && gunshipHorde) (node->faction == TEAM_ALLIANCE ? gunshipHorde : gunshipAlliance)->EnableMovement(false); - for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_1; u <= BG_IC_GO_HANGAR_TELEPORTER_3; ++u) - DelObject(u); + for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_1_A; u < BG_IC_GO_HANGAR_TELEPORTER_1_A + MAX_HANGAR_TELEPORTERS_SPAWNS; ++u) + SpawnBGObject(u, RESPAWN_ONE_DAY); - for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1; u <= BG_IC_GO_HANGAR_TELEPORTER_EFFECT_3; ++u) - DelObject(u); + for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A; u < BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A + MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS; ++u) + SpawnBGObject(u, RESPAWN_ONE_DAY); DelCreature(BG_IC_NPC_WORLD_TRIGGER_NOT_FLOATING); @@ -585,83 +950,97 @@ void BattlegroundIC::HandleContestedNodes(ICNodePoint* node) } } -void BattlegroundIC::HandleCapturedNodes(ICNodePoint* node, bool recapture) +void BattlegroundIC::HandleCapturedNodes(ICNodePoint const* node, bool recapture) { - if (node->nodeType != NODE_TYPE_REFINERY && node->nodeType != NODE_TYPE_QUARRY) + if (node->nodeType > NODE_TYPE_QUARRY) { - if (!AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1+node->nodeType-2, BG_IC_SpiritGuidePos[node->nodeType], node->faction)) + if (!AddSpiritGuide(BG_IC_NPC_SPIRIT_GUIDE_1 + node->nodeType - (NODE_TYPE_QUARRY + 1), BG_IC_SpiritGuidePos[node->nodeType], node->faction)) TC_LOG_ERROR("bg.battleground", "Isle of Conquest: Failed to spawn spirit guide! point: %u, team: %u, ", node->nodeType, node->faction); } - switch (node->gameobject_type) + // We may get called from update or from EventPlayerClickedOnFlag in recapture case, in that case gameobjectId is not yet updated and we need to match against contested GO type + switch (node->gameobjectId) { - case BG_IC_GO_HANGAR_BANNER: - { - if (!gunshipAlliance || !gunshipHorde) - break; + case BG_IC_GO_HANGAR_BANNER_A: + case BG_IC_GO_HANGAR_BANNER_H: + case BG_IC_GO_HANGAR_BANNER_CONT_A: + case BG_IC_GO_HANGAR_BANNER_CONT_H: + { + Transport* gunshipAlliance = HashMapHolder::Find(gunshipAllianceGUID); + Transport* gunshipHorde = HashMapHolder::Find(gunshipHordeGUID); - std::list cannons; - if (node->faction == TEAM_ALLIANCE) - gunshipAlliance->GetCreatureListWithEntryInGrid(cannons, NPC_ALLIANCE_GUNSHIP_CANNON, 150.0f); - else - gunshipHorde->GetCreatureListWithEntryInGrid(cannons, NPC_HORDE_GUNSHIP_CANNON, 150.0f); + if (!gunshipAlliance || !gunshipHorde) + break; - for (Creature* cannon : cannons) - cannon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + std::list cannons; + if (node->faction == TEAM_ALLIANCE) + gunshipAlliance->GetCreatureListWithEntryInGrid(cannons, NPC_ALLIANCE_GUNSHIP_CANNON, 150.0f); + else + gunshipHorde->GetCreatureListWithEntryInGrid(cannons, NPC_HORDE_GUNSHIP_CANNON, 150.0f); - for (uint8 u = 0; u < MAX_HANGAR_TELEPORTERS_SPAWNS; ++u) - { - uint8 type = BG_IC_GO_HANGAR_TELEPORTER_1 + u; - if (!AddObject(type, (node->faction == TEAM_ALLIANCE ? GO_ALLIANCE_GUNSHIP_PORTAL : GO_HORDE_GUNSHIP_PORTAL), BG_IC_HangarTeleporters[u], 0, 0, 0, 0, RESPAWN_ONE_DAY)) - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a gunship portal. Type: %u", BG_IC_GO_HANGAR_TELEPORTER_1 + u); - } + for (Creature* cannon : cannons) + cannon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - for (uint8 u = 0; u < MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS; ++u) - { - uint8 type = BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1 + u; - if (!AddObject(type, (node->faction == TEAM_ALLIANCE ? GO_ALLIANCE_GUNSHIP_PORTAL_EFFECTS : GO_HORDE_GUNSHIP_PORTAL_EFFECTS), BG_IC_HangarTeleporterEffects[u], 0, 0, 0, 0, RESPAWN_ONE_DAY, GO_STATE_ACTIVE)) - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a gunship portal effects. Type: %u", BG_IC_GO_HANGAR_TELEPORTER_1 + u); - } + for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_1_A; u < BG_IC_GO_HANGAR_TELEPORTER_1_A + MAX_HANGAR_TELEPORTERS_SPAWNS; u += BG_TEAMS_COUNT) + { + SpawnBGObject(u + TEAM_ALLIANCE, node->faction == TEAM_ALLIANCE ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + SpawnBGObject(u + TEAM_HORDE, node->faction == TEAM_ALLIANCE ? RESPAWN_ONE_DAY : RESPAWN_IMMEDIATELY); + } - for (uint8 u = 0; u < MAX_TRIGGER_SPAWNS_PER_FACTION; ++u) - { - if (!AddCreature(NPC_WORLD_TRIGGER_NOT_FLOATING, BG_IC_NPC_WORLD_TRIGGER_NOT_FLOATING, BG_IC_HangarTrigger[node->faction], node->faction, RESPAWN_ONE_DAY, node->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)) - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a world trigger. Type: %u", BG_IC_NPC_WORLD_TRIGGER_NOT_FLOATING); - } + for (uint8 u = BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A; u < BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A + MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS; u += BG_TEAMS_COUNT) + { + SpawnBGObject(u + TEAM_ALLIANCE, node->faction == TEAM_ALLIANCE ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + SpawnBGObject(u + TEAM_HORDE, node->faction == TEAM_ALLIANCE ? RESPAWN_ONE_DAY : RESPAWN_IMMEDIATELY); + } - for (uint8 u = 0; u < MAX_CAPTAIN_SPAWNS_PER_FACTION; ++u) - { - uint8 type = BG_IC_NPC_GUNSHIP_CAPTAIN_1 + u; + for (uint8 u = 0; u < MAX_TRIGGER_SPAWNS_PER_FACTION; ++u) + { + DelCreature(BG_IC_NPC_WORLD_TRIGGER_NOT_FLOATING); + if (!AddCreature(NPC_WORLD_TRIGGER_NOT_FLOATING, BG_IC_NPC_WORLD_TRIGGER_NOT_FLOATING, BG_IC_HangarTrigger[node->faction], RESPAWN_ONE_DAY, node->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)) + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a world trigger. Type: %u", BG_IC_NPC_WORLD_TRIGGER_NOT_FLOATING); + } - if (type == BG_IC_NPC_GUNSHIP_CAPTAIN_1) - if (AddCreature(node->faction == TEAM_ALLIANCE ? NPC_ALLIANCE_GUNSHIP_CAPTAIN : NPC_HORDE_GUNSHIP_CAPTAIN, type, BG_IC_HangarCaptains[node->faction == TEAM_ALLIANCE ? 2 : 0], node->faction, RESPAWN_ONE_DAY)) - GetBGCreature(BG_IC_NPC_GUNSHIP_CAPTAIN_1)->GetAI()->DoAction(ACTION_GUNSHIP_READY); + for (uint8 u = 0; u < MAX_CAPTAIN_SPAWNS_PER_FACTION; ++u) + { + uint8 type = BG_IC_NPC_GUNSHIP_CAPTAIN_1 + u; + DelCreature(type); - if (type == BG_IC_NPC_GUNSHIP_CAPTAIN_2) - if (!AddCreature(node->faction == TEAM_ALLIANCE ? NPC_ALLIANCE_GUNSHIP_CAPTAIN : NPC_HORDE_GUNSHIP_CAPTAIN, type, BG_IC_HangarCaptains[node->faction == TEAM_ALLIANCE ? 3 : 1], node->faction, RESPAWN_ONE_DAY, node->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)) - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a world trigger. Type: %u", BG_IC_NPC_GUNSHIP_CAPTAIN_2); - } + if (type == BG_IC_NPC_GUNSHIP_CAPTAIN_1) + if (Creature* captain = AddCreature(node->faction == TEAM_ALLIANCE ? NPC_ALLIANCE_GUNSHIP_CAPTAIN : NPC_HORDE_GUNSHIP_CAPTAIN, type, BG_IC_HangarCaptains[node->faction == TEAM_ALLIANCE ? 2 : 0], RESPAWN_ONE_DAY)) + captain->AI()->DoAction(ACTION_GUNSHIP_READY); - (node->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)->EnableMovement(true); - break; + if (type == BG_IC_NPC_GUNSHIP_CAPTAIN_2) + if (!AddCreature(node->faction == TEAM_ALLIANCE ? NPC_ALLIANCE_GUNSHIP_CAPTAIN : NPC_HORDE_GUNSHIP_CAPTAIN, type, BG_IC_HangarCaptains[node->faction == TEAM_ALLIANCE ? 3 : 1], RESPAWN_ONE_DAY, node->faction == TEAM_ALLIANCE ? gunshipAlliance : gunshipHorde)) + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning a world trigger. Type: %u", BG_IC_NPC_GUNSHIP_CAPTAIN_2); } - case BG_IC_GO_QUARRY_BANNER: + + if (node->faction == TEAM_ALLIANCE) + gunshipAlliance->EnableMovement(true); + else + gunshipHorde->EnableMovement(true); + break; + } + case BG_IC_GO_QUARRY_BANNER_A: + case BG_IC_GO_QUARRY_BANNER_H: + case BG_IC_GO_QUARRY_BANNER_CONT_A: + case BG_IC_GO_QUARRY_BANNER_CONT_H: RemoveAuraOnTeam(SPELL_QUARRY, (node->faction == TEAM_ALLIANCE ? HORDE : ALLIANCE)); CastSpellOnTeam(SPELL_QUARRY, (node->faction == TEAM_ALLIANCE ? ALLIANCE : HORDE)); break; - case BG_IC_GO_REFINERY_BANNER: + case BG_IC_GO_REFINERY_BANNER_A: + case BG_IC_GO_REFINERY_BANNER_H: + case BG_IC_GO_REFINERY_BANNER_CONT_A: + case BG_IC_GO_REFINERY_BANNER_CONT_H: RemoveAuraOnTeam(SPELL_OIL_REFINERY, (node->faction == TEAM_ALLIANCE ? HORDE : ALLIANCE)); CastSpellOnTeam(SPELL_OIL_REFINERY, (node->faction == TEAM_ALLIANCE ? ALLIANCE : HORDE)); break; - case BG_IC_GO_DOCKS_BANNER: - if (recapture) - break; - - if (docksTimer < DOCKS_UPDATE_TIME) - docksTimer = DOCKS_UPDATE_TIME; + case BG_IC_GO_DOCKS_BANNER_A: + case BG_IC_GO_DOCKS_BANNER_H: + // no contested entries here because when that happens it's a recapture, and existing vehicle spawns shouldn't be affected + _events.RescheduleEvent(EVENT_RESPAWN_DOCK_VEHICLES, DOCKS_UPDATE_TIME); // we must del opposing faction vehicles when the node is captured (unused ones) - for (uint8 i = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_H : BG_IC_NPC_GLAIVE_THROWER_1_A); i < (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_H : BG_IC_NPC_GLAIVE_THROWER_2_A); ++i) + for (uint8 i = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_H : BG_IC_NPC_GLAIVE_THROWER_1_A); i <= (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_2_H : BG_IC_NPC_GLAIVE_THROWER_2_A); ++i) { if (Creature* glaiveThrower = GetBGCreature(i, false)) { @@ -673,7 +1052,7 @@ void BattlegroundIC::HandleCapturedNodes(ICNodePoint* node, bool recapture) } } - for (uint8 i = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_H : BG_IC_NPC_CATAPULT_1_A); i < (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_H : BG_IC_NPC_CATAPULT_4_A); ++i) + for (uint8 i = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_H : BG_IC_NPC_CATAPULT_1_A); i <= (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_4_H : BG_IC_NPC_CATAPULT_4_A); ++i) { if (Creature* catapult = GetBGCreature(i, false)) { @@ -688,101 +1067,93 @@ void BattlegroundIC::HandleCapturedNodes(ICNodePoint* node, bool recapture) // spawning glaive throwers for (uint8 i = 0; i < MAX_GLAIVE_THROWERS_SPAWNS_PER_FACTION; ++i) { - uint8 type = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H)+i; - - if (GetBGCreature(type, false) && GetBGCreature(type)->IsAlive()) - continue; + uint8 type = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_GLAIVE_THROWER_1_A : BG_IC_NPC_GLAIVE_THROWER_1_H) + i; + if (Creature* glaiveThrower = GetBGCreature(type, false)) + if (glaiveThrower->IsAlive()) + continue; - if (AddCreature(node->faction == TEAM_ALLIANCE ? NPC_GLAIVE_THROWER_A : NPC_GLAIVE_THROWER_H, type, BG_IC_DocksVehiclesGlaives[i], node->faction, RESPAWN_ONE_DAY)) - GetBGCreature(type)->setFaction(BG_IC_Factions[(node->faction == TEAM_ALLIANCE ? 0 : 1)]); + if (Creature* glaiveThrower = AddCreature(node->faction == TEAM_ALLIANCE ? NPC_GLAIVE_THROWER_A : NPC_GLAIVE_THROWER_H, type, BG_IC_DocksVehiclesGlaives[i], RESPAWN_ONE_DAY)) + glaiveThrower->setFaction(BG_IC_Factions[node->faction]); } // spawning catapults for (uint8 i = 0; i < MAX_CATAPULTS_SPAWNS_PER_FACTION; ++i) { - uint8 type = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H)+i; - - if (GetBGCreature(type, false) && GetBGCreature(type)->IsAlive()) - continue; + uint8 type = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_CATAPULT_1_A : BG_IC_NPC_CATAPULT_1_H) + i; + if (Creature* catapult = GetBGCreature(type, false)) + if (catapult->IsAlive()) + continue; - if (AddCreature(NPC_CATAPULT, type, BG_IC_DocksVehiclesCatapults[i], node->faction, RESPAWN_ONE_DAY)) - GetBGCreature(type)->setFaction(BG_IC_Factions[(node->faction == TEAM_ALLIANCE ? 0 : 1)]); + if (Creature* catapult = AddCreature(NPC_CATAPULT, type, BG_IC_DocksVehiclesCatapults[i], RESPAWN_ONE_DAY)) + catapult->setFaction(BG_IC_Factions[node->faction]); } break; - case BG_IC_GO_WORKSHOP_BANNER: - { - if (siegeEngineWorkshopTimer < WORKSHOP_UPDATE_TIME) - siegeEngineWorkshopTimer = WORKSHOP_UPDATE_TIME; + case BG_IC_GO_WORKSHOP_BANNER_A: + case BG_IC_GO_WORKSHOP_BANNER_H: + case BG_IC_GO_WORKSHOP_BANNER_CONT_A: + case BG_IC_GO_WORKSHOP_BANNER_CONT_H: + { + _events.RescheduleEvent(EVENT_RESPAWN_WORKSHOP_VEHICLES, WORKSHOP_UPDATE_TIME); - if (!recapture) + if (!recapture) + { + // we must del opposing faction vehicles when the node is captured (unused ones) + for (uint8 i = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_H : BG_IC_NPC_DEMOLISHER_1_A); i <= (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_H : BG_IC_NPC_DEMOLISHER_4_A); ++i) { - // we must del opposing faction vehicles when the node is captured (unused ones) - for (uint8 i = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_H : BG_IC_NPC_DEMOLISHER_1_A); i < (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_4_H : BG_IC_NPC_DEMOLISHER_4_A); ++i) + if (Creature* demolisher = GetBGCreature(i, false)) { - if (Creature* demolisher = GetBGCreature(i, false)) + if (Vehicle* vehicleDemolisher = demolisher->GetVehicleKit()) { - if (Vehicle* vehicleDemolisher = demolisher->GetVehicleKit()) - { - // is IsVehicleInUse working as expected? - if (!vehicleDemolisher->IsVehicleInUse()) - DelCreature(i); - } + // is IsVehicleInUse working as expected? + if (!vehicleDemolisher->IsVehicleInUse()) + DelCreature(i); } } + } - for (uint8 i = 0; i < MAX_DEMOLISHERS_SPAWNS_PER_FACTION; ++i) - { - uint8 type = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H)+i; - - if (GetBGCreature(type, false) && GetBGCreature(type)->IsAlive()) + for (uint8 i = 0; i < MAX_DEMOLISHERS_SPAWNS_PER_FACTION; ++i) + { + uint8 type = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_DEMOLISHER_1_A : BG_IC_NPC_DEMOLISHER_1_H) + i; + if (Creature* demolisher = GetBGCreature(type, false)) + if (demolisher->IsAlive()) continue; - if (AddCreature(NPC_DEMOLISHER, type, BG_IC_WorkshopVehicles[i], node->faction, RESPAWN_ONE_DAY)) - GetBGCreature(type)->setFaction(BG_IC_Factions[(node->faction == TEAM_ALLIANCE ? 0 : 1)]); - } - - // we check if the opossing siege engine is in use - int8 enemySiege = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_H : BG_IC_NPC_SIEGE_ENGINE_A); - - if (Creature* siegeEngine = GetBGCreature(enemySiege, false)) - { - if (Vehicle* vehicleSiege = siegeEngine->GetVehicleKit()) - { - // is VehicleInUse working as expected ? - if (!vehicleSiege->IsVehicleInUse()) - DelCreature(enemySiege); - } - } + if (Creature* demolisher = AddCreature(NPC_DEMOLISHER, type, BG_IC_WorkshopVehicles[i], RESPAWN_ONE_DAY)) + demolisher->setFaction(BG_IC_Factions[(node->faction == TEAM_ALLIANCE ? 0 : 1)]); + } - uint8 siegeType = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); - if (!GetBGCreature(siegeType, false) || !GetBGCreature(siegeType)->IsAlive()) + // we check if the opossing siege engine is in use + uint8 enemySiege = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_H : BG_IC_NPC_SIEGE_ENGINE_A); + if (Creature* siegeEngine = GetBGCreature(enemySiege, false)) + { + if (Vehicle* vehicleSiege = siegeEngine->GetVehicleKit()) { - AddCreature((node->faction == TEAM_ALLIANCE ? NPC_SIEGE_ENGINE_A : NPC_SIEGE_ENGINE_H), siegeType, - BG_IC_WorkshopVehicles[4], node->faction, RESPAWN_ONE_DAY); - - if (Creature* siegeEngine = GetBGCreature(siegeType)) - { - siegeEngine->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_CANNOT_SWIM|UNIT_FLAG_IMMUNE_TO_PC); - siegeEngine->setFaction(BG_IC_Factions[(node->faction == TEAM_ALLIANCE ? 0 : 1)]); - } + // is VehicleInUse working as expected ? + if (!vehicleSiege->IsVehicleInUse()) + DelCreature(enemySiege); } } - for (uint8 i = 0; i < MAX_WORKSHOP_BOMBS_SPAWNS_PER_FACTION; ++i) + uint8 siegeType = (node->faction == TEAM_ALLIANCE ? BG_IC_NPC_SIEGE_ENGINE_A : BG_IC_NPC_SIEGE_ENGINE_H); + Creature* siege = GetBGCreature(siegeType, false); + if (!siege || !siege->IsAlive()) { - AddObject(BG_IC_GO_SEAFORIUM_BOMBS_1+i, GO_SEAFORIUM_BOMBS, - workshopBombs[i].GetPositionX(), workshopBombs[i].GetPositionY(), - workshopBombs[i].GetPositionZ(), workshopBombs[i].GetOrientation(), - 0, 0, 0, 0, 10); - - if (GameObject* seaforiumBombs = GetBGObject(BG_IC_GO_SEAFORIUM_BOMBS_1+i)) + if (Creature* siegeEngine = AddCreature((node->faction == TEAM_ALLIANCE ? NPC_SIEGE_ENGINE_A : NPC_SIEGE_ENGINE_H), siegeType, BG_IC_WorkshopVehicles[4], RESPAWN_ONE_DAY)) { - seaforiumBombs->SetRespawnTime(10); - seaforiumBombs->SetFaction(BG_IC_Factions[(node->faction == TEAM_ALLIANCE ? 0 : 1)]); + siegeEngine->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_CANNOT_SWIM | UNIT_FLAG_IMMUNE_TO_PC); + siegeEngine->setFaction(BG_IC_Factions[node->faction]); } } - break; } + + for (uint8 i = BG_IC_GO_SEAFORIUM_BOMBS_1; i < BG_IC_GO_SEAFORIUM_BOMBS_1 + MAX_WORKSHOP_BOMBS_SPAWNS_PER_FACTION; ++i) + { + BattlegroundGOSpawnPoint const& bomb = BG_IC_ObjSpawnlocs[i]; + if (GameObject* seaforiumBomb = AddObject(i, bomb.Entry, bomb.Pos, bomb.Rot, bomb.SpawnTime)) + seaforiumBomb->SetFaction(BG_IC_Factions[node->faction]); + } + break; + } default: break; } @@ -801,48 +1172,64 @@ void BattlegroundIC::DestroyGate(Player* player, GameObject* go) if (player->GetTeamId() == TEAM_ALLIANCE) { DoorOpen(BG_IC_GO_HORDE_KEEP_PORTCULLIS); - GetBGObject(BG_IC_GO_HORDE_BANNER)->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + if (GameObject* hordeBanner = GetBGObject(BG_IC_GO_HORDE_GRAVEYARD_H, false)) + hordeBanner->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } else { DoorOpen(BG_IC_GO_DOODAD_PORTCULLISACTIVE02); - GetBGObject(BG_IC_GO_ALLIANCE_BANNER)->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + if (GameObject* allianceBanner = GetBGObject(BG_IC_GO_ALLIANCE_GRAVEYARD_A, false)) + allianceBanner->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); } uint32 lang_entry = 0; - switch (go->GetEntry()) { case GO_HORDE_GATE_1: lang_entry = LANG_BG_IC_NORTH_GATE_DESTROYED; break; case GO_HORDE_GATE_2: + case GO_ALLIANCE_GATE_3: + lang_entry = LANG_BG_IC_EAST_GATE_DESTROYED; + break; + case GO_HORDE_GATE_3: case GO_ALLIANCE_GATE_1: lang_entry = LANG_BG_IC_WEST_GATE_DESTROYED; break; - case GO_HORDE_GATE_3: case GO_ALLIANCE_GATE_2: - lang_entry = LANG_BG_IC_EAST_GATE_DESTROYED; - break; - case GO_ALLIANCE_GATE_3: lang_entry = LANG_BG_IC_SOUTH_GATE_DESTROYED; break; default: break; } - if (go->GetEntry() == GO_HORDE_GATE_1 || go->GetEntry() == GO_HORDE_GATE_2 || go->GetEntry() == GO_HORDE_GATE_3) - { - if (!GetBgMap()->GetCreature(BgCreatures[BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].type]) && !AddCreature(BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].entry, BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].type, BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].x, BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].y, BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].z, BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].o, BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].team, RESPAWN_ONE_DAY)) - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning creature %u", BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR].entry); - } - else if (go->GetEntry() == GO_ALLIANCE_GATE_1 || go->GetEntry() == GO_ALLIANCE_GATE_2 || go->GetEntry() == GO_ALLIANCE_GATE_3) + switch (go->GetEntry()) { - if (!GetBgMap()->GetCreature(BgCreatures[BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].type]) && !AddCreature(BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].entry, BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].type, BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].x, BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].y, BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].z, BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].o, BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].team, RESPAWN_ONE_DAY)) - TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning creature %u", BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE].entry); + case GO_HORDE_GATE_1: + case GO_HORDE_GATE_2: + case GO_HORDE_GATE_3: + if (!GetBGCreature(BG_IC_NPC_OVERLORD_AGMAR, false)) + { + BattlegroundSpawnPoint const& agmar = BG_IC_NpcSpawnlocs[BG_IC_NPC_OVERLORD_AGMAR]; + if (!AddCreature(agmar.Entry, BG_IC_NPC_OVERLORD_AGMAR, agmar.Pos, agmar.SpawnTime)) + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning creature %u", agmar.Entry); + } + break; + case GO_ALLIANCE_GATE_1: + case GO_ALLIANCE_GATE_2: + case GO_ALLIANCE_GATE_3: + if (!GetBGCreature(BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE, false)) + { + BattlegroundSpawnPoint const& halford = BG_IC_NpcSpawnlocs[BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE]; + if (!AddCreature(halford.Entry, BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE, halford.Pos, halford.SpawnTime)) + TC_LOG_ERROR("bg.battleground", "Isle of Conquest: There was an error spawning creature %u", halford.Entry); + } + break; + default: + break; } - SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP)); + SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, nullptr, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP)); } WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) @@ -855,7 +1242,7 @@ WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player) if (nodePoint[i].faction == player->GetTeamId()) nodes.push_back(i); - WorldSafeLocsEntry const* good_entry = NULL; + WorldSafeLocsEntry const* good_entry = nullptr; // If so, select the closest node to place ghost on if (!nodes.empty()) { @@ -888,7 +1275,7 @@ bool BattlegroundIC::IsAllNodesControlledByTeam(uint32 team) const { uint32 count = 0; ICNodeState controlledState = team == ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H; - for (int i = 0; i < NODE_TYPE_WORKSHOP; ++i) + for (uint8 i = 0; i < NODE_TYPE_WORKSHOP; ++i) { if (nodePoint[i].nodeState == controlledState) ++count; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index 44666819feb53..5495ac0564d7a 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -21,15 +21,10 @@ #include "Battleground.h" #include "BattlegroundScore.h" +#include "EventMap.h" #include "Language.h" #include "Object.h" -const uint32 BG_IC_Factions[2] = -{ - 1732, // Alliance - 1735 // Horde -}; - enum creaturesIC { NPC_HIGH_COMMANDER_HALFORD_WYRMBANE = 34924, // Alliance Boss @@ -54,8 +49,6 @@ enum creaturesIC enum gameobjectsIC { - GO_ALLIANCE_BANNER = 195396, - GO_ALLIANCE_GATE_1 = 195699, GO_ALLIANCE_GATE_2 = 195698, GO_ALLIANCE_GATE_3 = 195700, @@ -77,18 +70,14 @@ enum gameobjectsIC GO_BONFIRE_5 = 195209, GO_BONFIRE_6 = 195377, - GO_DOCKS_BANNER = 195157, - GO_DOODAD_HU_PORTCULLIS01 = 195436, + GO_DOODAD_VR_PORTCULLIS01 = 195437, GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01 = 195703, GO_DOODAD_PORTCULLISACTIVE01 = 195451, - GO_DOODAD_PORTCULLISACTIVE02 = 195452, - GO_DOODAD_VR_PORTCULLIS01 = 195437, - GO_CHAIR_1 = 195410, GO_CHAIR_2 = 195414, GO_CHAIR_3 = 160415, @@ -102,13 +91,6 @@ enum gameobjectsIC GO_FLAGPOLE_1 = 195131, GO_FLAGPOLE_2 = 195439, - GO_GUNSHIP_PORTAL_1 = 195371, - GO_GUNSHIP_PORTAL_2 = 196413, - - GO_HANGAR_BANNER = 195158, - - GO_HORDE_BANNER = 195393, - GO_HORDE_GATE_1 = 195494, GO_HORDE_GATE_2 = 195496, GO_HORDE_GATE_3 = 195495, @@ -121,9 +103,6 @@ enum gameobjectsIC GO_HUGE_SEAFORIUM_BOMB_A = 195332, GO_HUGE_SEAFORIUM_BOMB_H = 195333, - - GO_QUARRY_BANNER = 195338, - GO_REFRESHMENT_PORTAL = 186811, GO_SEAFORIUM_BOMBS = 195237, GO_STOVE_1 = 174863, @@ -138,41 +117,42 @@ enum gameobjectsIC GO_TELEPORTER_EFFECTS_A = 195701, GO_TELEPORTER_EFFECTS_H = 195702, - GO_WORKSHOP_BANNER = 195133, - GO_BRAZIER_1 = 195402, GO_BRAZIER_2 = 195403, GO_BRAZIER_3 = 195425, GO_BRAZIER_4 = 195424, - GO_REFINERY_BANNER = 195343, - GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01 = 195491, - GO_ALLIANCE_BANNER_DOCK = 195153, - GO_ALLIANCE_BANNER_DOCK_CONT = 195154, - GO_HORDE_BANNER_DOCK = 195155, - GO_HORDE_BANNER_DOCK_CONT = 195156, + GO_HANGAR_BANNER = 195158, + GO_ALLIANCE_BANNER_HANGAR = 195153, + GO_ALLIANCE_BANNER_HANGAR_CONT = 195154, + GO_HORDE_BANNER_HANGAR = 195155, + GO_HORDE_BANNER_HANGAR_CONT = 195156, - GO_HORDE_BANNER_HANGAR = 195130, - GO_HORDE_BANNER_HANGAR_CONT = 195145, - GO_ALLIANCE_BANNER_HANGAR = 195132, - GO_ALLIANCE_BANNER_HANGAR_CONT = 195144, + GO_WORKSHOP_BANNER = 195133, + GO_ALLIANCE_BANNER_WORKSHOP = 195132, + GO_ALLIANCE_BANNER_WORKSHOP_CONT = 195144, + GO_HORDE_BANNER_WORKSHOP = 195130, + GO_HORDE_BANNER_WORKSHOP_CONT = 195145, + GO_QUARRY_BANNER = 195338, GO_ALLIANCE_BANNER_QUARRY = 195334, GO_ALLIANCE_BANNER_QUARRY_CONT = 195335, GO_HORDE_BANNER_QUARRY = 195336, GO_HORDE_BANNER_QUARRY_CONT = 195337, + GO_REFINERY_BANNER = 195343, GO_ALLIANCE_BANNER_REFINERY = 195339, GO_ALLIANCE_BANNER_REFINERY_CONT = 195340, GO_HORDE_BANNER_REFINERY = 195341, GO_HORDE_BANNER_REFINERY_CONT = 195342, - GO_ALLIANCE_BANNER_WORKSHOP = 195149, - GO_ALLIANCE_BANNER_WORKSHOP_CONT = 195150, - GO_HORDE_BANNER_WORKSHOP = 195151, - GO_HORDE_BANNER_WORKSHOP_CONT = 195152, + GO_DOCKS_BANNER = 195157, + GO_ALLIANCE_BANNER_DOCKS = 195149, + GO_ALLIANCE_BANNER_DOCKS_CONT = 195150, + GO_HORDE_BANNER_DOCKS = 195151, + GO_HORDE_BANNER_DOCKS_CONT = 195152, GO_ALLIANCE_BANNER_GRAVEYARD_A = 195396, GO_ALLIANCE_BANNER_GRAVEYARD_A_CONT = 195397, @@ -188,16 +168,15 @@ enum gameobjectsIC GO_ALLIANCE_GUNSHIP = 195121 }; -#define MAX_REINFORCEMENTS 300 - enum Times { - WORKSHOP_UPDATE_TIME = 180000, // 3 minutes - DOCKS_UPDATE_TIME = 180000, // not sure if it is 3 minutes - IC_RESOURCE_TIME = 45000, // not sure, need more research - CLOSE_DOORS_TIME = 20000, - BANNER_STATE_CHANGE_TIME = 60000, - TRANSPORT_PERIOD_TIME = 120000 + WORKSHOP_UPDATE_TIME = 3 * MINUTE * IN_MILLISECONDS, // 3 minutes + DOCKS_UPDATE_TIME = 3 * MINUTE * IN_MILLISECONDS, // not sure if it is 3 minutes + IC_RESOURCE_TIME = 45 * IN_MILLISECONDS, // not sure, need more research + CLOSE_DOORS_TIME = 30 * IN_MILLISECONDS, + DESPAWN_FAKE_DOORS_TIME = 6 * IN_MILLISECONDS, + BANNER_STATE_CHANGE_TIME = 1 * MINUTE * IN_MILLISECONDS, + TRANSPORT_PERIOD_TIME = 2 * MINUTE * IN_MILLISECONDS }; enum Actions @@ -205,25 +184,54 @@ enum Actions ACTION_GUNSHIP_READY = 1 }; -struct ICNpc -{ - uint32 type; - uint32 entry; - TeamId team; - float x; - float y; - float z; - float o; -}; - enum BG_IC_GOs { - BG_IC_GO_ALLIANCE_BANNER = 0, - - BG_IC_GO_ALLIANCE_GATE_1, + BG_IC_GO_ALLIANCE_GATE_1 = 0, BG_IC_GO_ALLIANCE_GATE_2, BG_IC_GO_ALLIANCE_GATE_3, + BG_IC_GO_HORDE_GATE_1, + BG_IC_GO_HORDE_GATE_2, + BG_IC_GO_HORDE_GATE_3, + + BG_IC_GO_REFINERY_BANNER_N, + BG_IC_GO_QUARRY_BANNER_N, + BG_IC_GO_DOCKS_BANNER_N, + BG_IC_GO_HANGAR_BANNER_N, + BG_IC_GO_WORKSHOP_BANNER_N, + + BG_IC_GO_REFINERY_BANNER_A, + BG_IC_GO_QUARRY_BANNER_A, + BG_IC_GO_DOCKS_BANNER_A, + BG_IC_GO_HANGAR_BANNER_A, + BG_IC_GO_WORKSHOP_BANNER_A, + BG_IC_GO_ALLIANCE_GRAVEYARD_A, + BG_IC_GO_HORDE_GRAVEYARD_A, + + BG_IC_GO_REFINERY_BANNER_CONT_A, + BG_IC_GO_QUARRY_BANNER_CONT_A, + BG_IC_GO_DOCKS_BANNER_CONT_A, + BG_IC_GO_HANGAR_BANNER_CONT_A, + BG_IC_GO_WORKSHOP_BANNER_CONT_A, + BG_IC_GO_ALLIANCE_GRAVEYARD_CONT_A, + BG_IC_GO_HORDE_GRAVEYARD_CONT_A, + + BG_IC_GO_REFINERY_BANNER_CONT_H, + BG_IC_GO_QUARRY_BANNER_CONT_H, + BG_IC_GO_DOCKS_BANNER_CONT_H, + BG_IC_GO_HANGAR_BANNER_CONT_H, + BG_IC_GO_WORKSHOP_BANNER_CONT_H, + BG_IC_GO_ALLIANCE_GRAVEYARD_CONT_H, + BG_IC_GO_HORDE_GRAVEYARD_CONT_H, + + BG_IC_GO_REFINERY_BANNER_H, + BG_IC_GO_QUARRY_BANNER_H, + BG_IC_GO_DOCKS_BANNER_H, + BG_IC_GO_HANGAR_BANNER_H, + BG_IC_GO_WORKSHOP_BANNER_H, + BG_IC_GO_ALLIANCE_GRAVEYARD_H, + BG_IC_GO_HORDE_GRAVEYARD_H, + BG_IC_GO_BENCH_1, BG_IC_GO_BENCH_2, BG_IC_GO_BENCH_3, @@ -255,8 +263,6 @@ enum BG_IC_GOs BG_IC_GO_CHAIR_8_2, BG_IC_GO_CHAIR_9, - BG_IC_GO_DOCKS_BANNER, - BG_IC_GO_DOODAD_HU_PORTCULLIS01_1, BG_IC_GO_DOODAD_HU_PORTCULLIS01_2, @@ -265,7 +271,6 @@ enum BG_IC_GOs BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03, BG_IC_GO_DOODAD_PORTCULLISACTIVE01, - BG_IC_GO_DOODAD_PORTCULLISACTIVE02, BG_IC_GO_DOODAD_VR_PORTCULLIS01_1, @@ -278,29 +283,14 @@ enum BG_IC_GOs BG_IC_GO_FLAGPOLE_1_3, BG_IC_GO_FLAGPOLE_1_4, BG_IC_GO_FLAGPOLE_1_5, - BG_IC_GO_FLAGPOLE_1_6, - - BG_IC_GO_HANGAR_BANNER, - - BG_IC_GO_HORDE_BANNER, - - BG_IC_GO_HORDE_GATE_1, - BG_IC_GO_HORDE_GATE_2, - BG_IC_GO_HORDE_GATE_3, BG_IC_GO_HORDE_KEEP_PORTCULLIS, - BG_IC_GO_QUARRY_BANNER, - BG_IC_GO_STOVE_1_1, BG_IC_GO_STOVE_2_1, BG_IC_GO_STOVE_1_2, BG_IC_GO_STOVE_2_2, - BG_IC_GO_WORKSHOP_BANNER, - - BG_IC_GO_REFINERY_BANNER, - BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1, BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_2, BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_3, @@ -318,13 +308,19 @@ enum BG_IC_GOs BG_IC_GO_SEAFORIUM_BOMBS_1, BG_IC_GO_SEAFORIUM_BOMBS_2, - BG_IC_GO_HANGAR_TELEPORTER_1, - BG_IC_GO_HANGAR_TELEPORTER_2, - BG_IC_GO_HANGAR_TELEPORTER_3, + BG_IC_GO_HANGAR_TELEPORTER_1_A, + BG_IC_GO_HANGAR_TELEPORTER_1_H, + BG_IC_GO_HANGAR_TELEPORTER_2_A, + BG_IC_GO_HANGAR_TELEPORTER_2_H, + BG_IC_GO_HANGAR_TELEPORTER_3_A, + BG_IC_GO_HANGAR_TELEPORTER_3_H, - BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1, - BG_IC_GO_HANGAR_TELEPORTER_EFFECT_2, - BG_IC_GO_HANGAR_TELEPORTER_EFFECT_3, + BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_A, + BG_IC_GO_HANGAR_TELEPORTER_EFFECT_1_H, + BG_IC_GO_HANGAR_TELEPORTER_EFFECT_2_A, + BG_IC_GO_HANGAR_TELEPORTER_EFFECT_2_H, + BG_IC_GO_HANGAR_TELEPORTER_EFFECT_3_A, + BG_IC_GO_HANGAR_TELEPORTER_EFFECT_3_H, BG_IC_GO_TELEPORTER_1_1, BG_IC_GO_TELEPORTER_1_2, @@ -351,7 +347,9 @@ enum BG_IC_GOs BG_IC_GO_TELEPORTER_EFFECTS_H_3, BG_IC_GO_TELEPORTER_EFFECTS_H_4, BG_IC_GO_TELEPORTER_EFFECTS_H_5, - BG_IC_GO_TELEPORTER_EFFECTS_H_6 + BG_IC_GO_TELEPORTER_EFFECTS_H_6, + + BG_IC_GO_MAX }; enum BG_IC_NPCs @@ -429,26 +427,19 @@ enum BG_IC_NPCs BG_IC_NPC_SPIRIT_GUIDE_4, BG_IC_NPC_SPIRIT_GUIDE_5, BG_IC_NPC_SPIRIT_GUIDE_6, - BG_IC_NPC_SPIRIT_GUIDE_7 -}; + BG_IC_NPC_SPIRIT_GUIDE_7, -enum BannersTypes -{ - BANNER_A_CONTROLLED, - BANNER_A_CONTESTED, - BANNER_H_CONTROLLED, - BANNER_H_CONTESTED + BG_IC_NPC_MAX }; enum BG_IC_MaxSpawns { - MAX_NORMAL_GAMEOBJECTS_SPAWNS = BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03+1, - MAX_NORMAL_NPCS_SPAWNS = BG_IC_NPC_KEEP_CANNON_24+1, + MAX_NORMAL_NPCS_SPAWNS = BG_IC_NPC_KEEP_CANNON_24 + 1, MAX_WORKSHOP_SPAWNS = 10, MAX_DOCKS_SPAWNS = 12, MAX_SPIRIT_GUIDES_SPAWNS = 7, - MAX_HANGAR_TELEPORTERS_SPAWNS = 3, - MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS = 3, + MAX_HANGAR_TELEPORTERS_SPAWNS = 6, + MAX_HANGAR_TELEPORTER_EFFECTS_SPAWNS = 6, MAX_AIRSHIPS_SPAWNS = 2, MAX_FORTRESS_GATES_SPAWNS = 6, MAX_FORTRESS_TELEPORTERS_SPAWNS = 12, @@ -468,242 +459,6 @@ enum BG_IC_MaxSpawns MAX_CAPTAIN_SPAWNS_PER_FACTION = 2, }; -const ICNpc BG_IC_NpcSpawnlocs[MAX_NORMAL_NPCS_SPAWNS] = -{ - {BG_IC_NPC_OVERLORD_AGMAR, NPC_OVERLORD_AGMAR, TEAM_HORDE, 1295.44f, -765.733f, 70.0541f, 0.0f}, //Overlord Agmar 1 - {BG_IC_NPC_HIGH_COMMANDER_HALFORD_WYRMBANE, NPC_HIGH_COMMANDER_HALFORD_WYRMBANE, TEAM_ALLIANCE, 224.983f, -831.573f, 60.9034f, 0.0f}, //High Commander Halford Wyrmbane 2 - {BG_IC_NPC_KOR_KRON_GUARD_1, NPC_KOR_KRON_GUARD, TEAM_HORDE, 1296.01f, -773.256f, 69.958f, 0.292168f}, // 3 - {BG_IC_NPC_KOR_KRON_GUARD_2, NPC_KOR_KRON_GUARD, TEAM_HORDE, 1295.94f, -757.756f, 69.9587f, 6.02165f}, // 4 - {BG_IC_NPC_KOR_KRON_GUARD_3, NPC_KOR_KRON_GUARD, TEAM_HORDE, 1295.09f, -760.927f, 69.9587f, 5.94311f}, // 5 - {BG_IC_NPC_KOR_KRON_GUARD_4, NPC_KOR_KRON_GUARD, TEAM_HORDE, 1295.13f, -769.7f, 69.95f, 0.34f}, // 6 - - {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_1, NPC_SEVEN_TH_LEGION_INFANTRY, TEAM_ALLIANCE, 223.969f, -822.958f, 60.8151f, 0.46337f}, // 7 - {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_2, NPC_SEVEN_TH_LEGION_INFANTRY, TEAM_ALLIANCE, 224.211f, -826.952f, 60.8188f, 6.25961f}, // 8 - {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_3, NPC_SEVEN_TH_LEGION_INFANTRY, TEAM_ALLIANCE, 223.119f, -838.386f, 60.8145f, 5.64857f}, // 9 - {BG_IC_NPC_SEVEN_TH_LEGION_INFANTRY_4, NPC_SEVEN_TH_LEGION_INFANTRY, TEAM_ALLIANCE, 223.889f, -835.102f, 60.8201f, 6.21642f}, // 10 - - {BG_IC_NPC_KEEP_CANNON_1, NPC_KEEP_CANNON, TEAM_ALLIANCE, 415.825f, -754.634f, 87.799f, 1.78024f}, // 11 - {BG_IC_NPC_KEEP_CANNON_2, NPC_KEEP_CANNON, TEAM_ALLIANCE, 410.142f, -755.332f, 87.7991f, 1.78024f}, // 12 - {BG_IC_NPC_KEEP_CANNON_3, NPC_KEEP_CANNON, TEAM_ALLIANCE, 424.33f, -879.352f, 88.0446f, 0.436332f}, // 13 - {BG_IC_NPC_KEEP_CANNON_4, NPC_KEEP_CANNON, TEAM_ALLIANCE, 425.602f, -786.646f, 87.7991f, 5.74213f}, // 14 - {BG_IC_NPC_KEEP_CANNON_5, NPC_KEEP_CANNON, TEAM_ALLIANCE, 426.743f, -884.939f, 87.9613f, 0.436332f}, // 15 - {BG_IC_NPC_KEEP_CANNON_6, NPC_KEEP_CANNON, TEAM_ALLIANCE, 404.736f, -755.495f, 87.7989f, 1.78024f}, // 16 - {BG_IC_NPC_KEEP_CANNON_7, NPC_KEEP_CANNON, TEAM_ALLIANCE, 428.375f, -780.797f, 87.7991f, 5.79449f}, // 17 - {BG_IC_NPC_KEEP_CANNON_8, NPC_KEEP_CANNON, TEAM_ALLIANCE, 429.175f, -890.436f, 88.0446f, 0.436332f}, // 18 - {BG_IC_NPC_KEEP_CANNON_9, NPC_KEEP_CANNON, TEAM_ALLIANCE, 430.872f, -775.278f, 87.7991f, 5.88176f}, // 19 - {BG_IC_NPC_KEEP_CANNON_10, NPC_KEEP_CANNON, TEAM_ALLIANCE, 408.056f, -911.283f, 88.0445f, 4.64258f}, // 20 - {BG_IC_NPC_KEEP_CANNON_11, NPC_KEEP_CANNON, TEAM_ALLIANCE, 413.609f, -911.566f, 88.0447f, 4.66003f}, // 21 - {BG_IC_NPC_KEEP_CANNON_12, NPC_KEEP_CANNON, TEAM_ALLIANCE, 402.554f, -910.557f, 88.0446f, 4.57276f}, // 22 - - {BG_IC_NPC_KEEP_CANNON_13, NPC_KEEP_CANNON, TEAM_HORDE, 1158.91f, -660.144f, 87.9332f, 0.750492f}, // 23 - {BG_IC_NPC_KEEP_CANNON_14, NPC_KEEP_CANNON, TEAM_HORDE, 1156.22f, -866.809f, 87.8754f, 5.27089f}, // 24 - {BG_IC_NPC_KEEP_CANNON_15, NPC_KEEP_CANNON, TEAM_HORDE, 1163.74f, -663.67f, 88.3571f, 0.558505f}, // 25 - {BG_IC_NPC_KEEP_CANNON_16, NPC_KEEP_CANNON, TEAM_HORDE, 1135.18f, -683.896f, 88.0409f, 3.9619f}, // 26 - {BG_IC_NPC_KEEP_CANNON_17, NPC_KEEP_CANNON, TEAM_HORDE, 1138.91f, -836.359f, 88.3728f, 2.18166f}, // 27 - {BG_IC_NPC_KEEP_CANNON_18, NPC_KEEP_CANNON, TEAM_HORDE, 1162.08f, -863.717f, 88.358f, 5.48033f}, // 28 - {BG_IC_NPC_KEEP_CANNON_19, NPC_KEEP_CANNON, TEAM_HORDE, 1167.13f, -669.212f, 87.9682f, 0.383972f}, // 29 - {BG_IC_NPC_KEEP_CANNON_20, NPC_KEEP_CANNON, TEAM_HORDE, 1137.72f, -688.517f, 88.4023f, 3.9619f}, // 30 - {BG_IC_NPC_KEEP_CANNON_21, NPC_KEEP_CANNON, TEAM_HORDE, 1135.29f, -840.878f, 88.0252f, 2.30383f}, // 31 - {BG_IC_NPC_KEEP_CANNON_22, NPC_KEEP_CANNON, TEAM_HORDE, 1144.33f, -833.309f, 87.9268f, 2.14675f}, // 32 - {BG_IC_NPC_KEEP_CANNON_23, NPC_KEEP_CANNON, TEAM_HORDE, 1142.59f, -691.946f, 87.9756f, 3.9619f}, // 33 - {BG_IC_NPC_KEEP_CANNON_24, NPC_KEEP_CANNON, TEAM_HORDE, 1166.13f, -858.391f, 87.9653f, 5.63741f} // 34 -}; - -const Position BG_IC_WorkshopVehicles[5] = -{ - {751.8281f, -852.732666f, 12.5250978f, 1.46607661f}, // Demolisher - {761.809f, -854.2274f, 12.5263243f, 1.46607661f}, // Demolisher - {783.4722f, -853.9601f, 12.54775f, 1.71042264f}, // Demolisher - {793.055542f, -852.71875f, 12.5671329f, 1.71042264f}, // Demolisher - {773.680542f, -884.092041f, 16.8090363f, 1.58824956f} // Siege Engine -}; - -const Position BG_IC_DocksVehiclesGlaives[2] = -{ - {779.3125f, -342.972229f, 12.2104874f, 4.712389f}, // Glaive Throwers - {790.029541f, -342.899323f, 12.2128582f, 4.71238f} // Glaive Throwers -}; - -const Position BG_IC_DocksVehiclesCatapults[4] = -{ - {757.283f, -341.7795f, 12.2113762f, 4.729842f}, // Catapults - {766.947937f, -342.053833f, 12.2009945f, 4.694f}, // Catapults - {800.3785f, -342.607635f, 12.1669979f, 4.6774f}, // Catapults - {810.7257f, -342.083344f, 12.1675768f, 4.6600f} // Catapults -}; - -const Position BG_IC_HangarTeleporters[3] = -{ - {827.9219f, -993.3249f, 134.1972f, 3.141593f}, // Gunship Portal - {739.0226f, -1106.661f, 134.7551f, 2.426008f}, // Gunship Portal - {672.0799f, -1156.776f, 133.7057f, 1.832595f} // Gunship Portal -}; - -const Position BG_IC_HangarTeleporterEffects[3] = -{ - {827.9236f, -993.2986f, 134.2002f, 3.141593f}, // Gunship Portal Effect - {739.0139f, -1106.661f, 134.7548f, 3.141593f}, // Gunship Portal Effect - {672.0868f, -1156.786f, 133.7057f, 3.141593f} // Gunship Portal Effect -}; - -const Position BG_IC_HangarTrigger[2] = -{ - {11.69965f, 0.034146f, 20.62076f, 3.211406f}, - {7.305609f, -0.095246f, 34.51022f, 3.159046f} -}; - -const Position BG_IC_HangarCaptains[4] = -{ - {825.6667f, -994.00520f, 134.3569f, 3.403392f}, - {53.65112f, -0.1139221f, 30.09546f, 3.106686f}, - {826.2205f, -994.40280f, 134.2812f, 3.351032f}, - {10.89952f, 4.88029700f, 20.49038f, 4.840575f} -}; - -struct ICGo -{ - uint32 type; - uint32 entry; - float x; - float y; - float z; - float o; -}; - -const ICGo BG_IC_Teleporters[MAX_FORTRESS_TELEPORTERS_SPAWNS] = -{ - {BG_IC_GO_TELEPORTER_1_1, GO_TELEPORTER_1, 1143.25f, -779.599f, 48.629f, 1.64061f}, // Teleporter - {BG_IC_GO_TELEPORTER_1_2, GO_TELEPORTER_1, 1236.53f, -669.415f, 48.2729f, 0.104719f}, // Teleporter - {BG_IC_GO_TELEPORTER_2_1, GO_TELEPORTER_2, 1233.27f, -844.526f, 48.8824f, -0.0174525f}, // Teleporter - {BG_IC_GO_TELEPORTER_3_1, GO_TELEPORTER_3, 311.92f, -913.972f, 48.8159f, 3.08918f}, // Teleporter - {BG_IC_GO_TELEPORTER_2_2, GO_TELEPORTER_2, 1235.53f, -683.872f, 49.304f, -3.08918f}, // Teleporter - {BG_IC_GO_TELEPORTER_4_1, GO_TELEPORTER_4, 397.089f, -859.382f, 48.8993f, 1.64061f}, // Teleporter - {BG_IC_GO_TELEPORTER_3_2, GO_TELEPORTER_3, 324.635f, -749.128f, 49.3602f, 0.0174525f}, // Teleporter - {BG_IC_GO_TELEPORTER_3_3, GO_TELEPORTER_3, 425.675f, -857.09f, 48.5104f, -1.6057f}, // Teleporter - {BG_IC_GO_TELEPORTER_4_2, GO_TELEPORTER_4, 323.54f, -888.361f, 48.9197f, 0.0349063f}, // Teleporter - {BG_IC_GO_TELEPORTER_4_3, GO_TELEPORTER_4, 326.285f, -777.366f, 49.0208f, 3.12412f}, // Teleporter - {BG_IC_GO_TELEPORTER_1_3, GO_TELEPORTER_1, 1235.09f, -857.898f, 48.9163f, 3.07177f}, // Teleporter - {BG_IC_GO_TELEPORTER_2_3, GO_TELEPORTER_2, 1158.76f, -746.182f, 48.6277f, -1.51844f} // Teleporter -}; - -const ICGo BG_IC_TeleporterEffects[MAX_FORTRESS_TELEPORTER_EFFECTS_SPAWNS] = -{ - {BG_IC_GO_TELEPORTER_EFFECTS_A_1, GO_TELEPORTER_EFFECTS_A, 425.686f, -857.092f, 48.51f, -1.62316f}, // Teleporter Effects (Alliance) - {BG_IC_GO_TELEPORTER_EFFECTS_A_2, GO_TELEPORTER_EFFECTS_A, 324.634f, -749.148f, 49.359f, 0.0174525f}, // Teleporter Effects (Alliance) - {BG_IC_GO_TELEPORTER_EFFECTS_A_3, GO_TELEPORTER_EFFECTS_A, 311.911f, -913.986f, 48.8157f, 3.08918f}, // Teleporter Effects (Alliance) - {BG_IC_GO_TELEPORTER_EFFECTS_A_4, GO_TELEPORTER_EFFECTS_A, 326.266f, -777.347f, 49.0215f, 3.12412f}, // Teleporter Effects (Alliance) - {BG_IC_GO_TELEPORTER_EFFECTS_A_5, GO_TELEPORTER_EFFECTS_A, 323.55f, -888.347f, 48.9198f, 0.0174525f}, // Teleporter Effects (Alliance) - {BG_IC_GO_TELEPORTER_EFFECTS_A_6, GO_TELEPORTER_EFFECTS_A, 397.116f, -859.378f, 48.8989f, 1.64061f}, // Teleporter Effects (Alliance) - - {BG_IC_GO_TELEPORTER_EFFECTS_H_1, GO_TELEPORTER_EFFECTS_H, 1143.25f, -779.623f, 48.6291f, 1.62316f}, // Teleporter Effects (Horde) - {BG_IC_GO_TELEPORTER_EFFECTS_H_2, GO_TELEPORTER_EFFECTS_H, 1158.64f, -746.148f, 48.6277f, -1.50098f}, // Teleporter Effects (Horde) - {BG_IC_GO_TELEPORTER_EFFECTS_H_3, GO_TELEPORTER_EFFECTS_H, 1233.25f, -844.573f, 48.8836f, 0.0174525f}, // Teleporter Effects (Horde) - {BG_IC_GO_TELEPORTER_EFFECTS_H_4, GO_TELEPORTER_EFFECTS_H, 1235.07f, -857.957f, 48.9163f, 3.05433f}, // Teleporter Effects (Horde) - {BG_IC_GO_TELEPORTER_EFFECTS_H_5, GO_TELEPORTER_EFFECTS_H, 1236.46f, -669.344f, 48.2684f, 0.087266f}, // Teleporter Effects (Horde) - {BG_IC_GO_TELEPORTER_EFFECTS_H_6, GO_TELEPORTER_EFFECTS_H, 1235.6f, -683.806f, 49.3028f, -3.07177f} // Teleporter Effects (Horde) -}; - -const ICGo BG_IC_ObjSpawnlocs[MAX_NORMAL_GAMEOBJECTS_SPAWNS] = -{ - {BG_IC_GO_ALLIANCE_GATE_1, GO_ALLIANCE_GATE_1, 351.615f, -762.75f, 48.9162f, -1.5708f}, // Alliance Gate || Left - {BG_IC_GO_ALLIANCE_GATE_2, GO_ALLIANCE_GATE_2, 351.024f, -903.326f, 48.9247f, 1.5708f}, // Alliance Gate || Right - {BG_IC_GO_ALLIANCE_GATE_3, GO_ALLIANCE_GATE_3, 413.479f, -833.95f, 48.5238f, 3.14159f}, // Alliance Gate || Front - - {BG_IC_GO_HORDE_GATE_1, GO_HORDE_GATE_1, 1150.9f, -762.606f, 47.5077f, 3.14159f}, // Horde Gate || Front - {BG_IC_GO_HORDE_GATE_2, GO_HORDE_GATE_2, 1218.74f, -851.155f, 48.2533f, -1.5708f}, // Horde Gate || Left - {BG_IC_GO_HORDE_GATE_3, GO_HORDE_GATE_3, 1217.9f, -676.948f, 47.6341f, 1.5708f}, // Horde Gate || Right - - {BG_IC_GO_HORDE_BANNER, GO_HORDE_BANNER, 1284.76f, -705.668f, 48.9163f, -3.08918f}, // Horde Banner - {BG_IC_GO_ALLIANCE_BANNER, GO_ALLIANCE_BANNER, 299.153f, -784.589f, 48.9162f, -0.157079f}, // Alliance Banner - - {BG_IC_GO_WORKSHOP_BANNER, GO_WORKSHOP_BANNER, 776.229f, -804.283f, 6.45052f, 1.6057f}, // Workshop Banner - {BG_IC_GO_DOCKS_BANNER, GO_DOCKS_BANNER, 726.385f, -360.205f, 17.8153f, -1.62316f}, // Docks Banner - {BG_IC_GO_HANGAR_BANNER, GO_HANGAR_BANNER, 807.78f, -1000.07f, 132.381f, -1.93732f}, // Hangar Banner - {BG_IC_GO_QUARRY_BANNER, GO_QUARRY_BANNER, 251.016f, -1159.32f, 17.2376f, -2.25147f}, // Quarry Banner - {BG_IC_GO_REFINERY_BANNER, GO_REFINERY_BANNER, 1269.5f, -400.809f, 37.6253f, -1.76278f}, // Refinery Banner - - {BG_IC_GO_BENCH_1, GO_BENCH_1, 834.208f, -461.826f, 22.3067f, 1.5708f}, // Bench - {BG_IC_GO_BENCH_2, GO_BENCH_2, 826.153f, -461.985f, 22.5149f, 1.5708f}, // Bench - {BG_IC_GO_BENCH_3, GO_BENCH_3, 817.446f, -470.47f, 25.372f, -1.56207f}, // Bench - {BG_IC_GO_BENCH_4, GO_BENCH_4, 827.001f, -474.415f, 25.372f, 1.57952f}, // Bench - {BG_IC_GO_BENCH_5, GO_BENCH_5, 819.264f, -461.961f, 22.7614f, 1.57952f}, // Bench - - {BG_IC_GO_BONFIRE_1, GO_BONFIRE_1, 1162.91f, -734.578f, 48.8948f, -2.9845f}, // Bonfire - {BG_IC_GO_BONFIRE_2, GO_BONFIRE_2, 1282.34f, -799.762f, 87.1357f, -3.13286f}, // Bonfire - {BG_IC_GO_BONFIRE_3, GO_BONFIRE_3, 1358.06f, -732.178f, 87.1606f, -3.13284f}, // Bonfire - {BG_IC_GO_BONFIRE_4, GO_BONFIRE_4, 1281.76f, -732.844f, 87.1574f, -3.13246f}, // Bonfire - {BG_IC_GO_BONFIRE_5, GO_BONFIRE_5, 1358.81f, -797.899f, 87.2953f, 3.13312f}, // Bonfire - {BG_IC_GO_BONFIRE_6, GO_BONFIRE_6, 1162.21f, -790.543f, 48.9162f, 2.27765f}, // Bonfire - - {BG_IC_GO_BRAZIER_1, GO_BRAZIER_1, 1262.21f, -751.358f, 48.8133f, 2.26893f}, // Brazier - {BG_IC_GO_BRAZIER_2, GO_BRAZIER_2, 1262.58f, -781.861f, 48.8132f, 2.04203f}, // Brazier - {BG_IC_GO_BRAZIER_3, GO_BRAZIER_3, 223.818f, -839.352f, 60.7917f, 1.09083f}, // Brazier - {BG_IC_GO_BRAZIER_4, GO_BRAZIER_4, 224.277f, -822.77f, 60.7917f, 2.06822f}, // Brazier - - {BG_IC_GO_CHAIR_1, GO_CHAIR_1, 632.876f, -282.461f, 5.45364f, -0.851094f}, // Chair - {BG_IC_GO_CHAIR_2, GO_CHAIR_2, 635.796f, -276.295f, 5.48659f, -3.03273f}, // Chair - {BG_IC_GO_CHAIR_3_1, GO_CHAIR_3, 762.245f, -444.795f, 22.8526f, -1.98095f}, // Chair - {BG_IC_GO_CHAIR_4, GO_CHAIR_4, 632.156f, -304.503f, 5.4879f, 1.15603f}, // Chair - {BG_IC_GO_CHAIR_5, GO_CHAIR_5, 643.86f, -270.204f, 5.48898f, 2.36903f}, // Chair - {BG_IC_GO_CHAIR_6_1, GO_CHAIR_6, 902.234f, -455.508f, 18.3935f, -1.00356f}, // Chair - {BG_IC_GO_CHAIR_7, GO_CHAIR_7, 810.237f, -461.2f, 25.4627f, 1.5708f}, // Chair - {BG_IC_GO_CHAIR_3_2, GO_CHAIR_3, 1117.19f, -365.674f, 18.8456f, 0.968657f}, // Chair - {BG_IC_GO_CHAIR_6_2, GO_CHAIR_6, 1066.19f, -337.214f, 18.8225f, 0.453785f}, // Chair - {BG_IC_GO_CHAIR_8_1, GO_CHAIR_8, 798.324f, -444.951f, 22.5601f, -1.02102f}, // Chair - {BG_IC_GO_CHAIR_8_2, GO_CHAIR_8, 1081.81f, -358.637f, 18.5531f, 1.92859f}, // Chair - {BG_IC_GO_CHAIR_9, GO_CHAIR_9, 814.931f, -470.816f, 33.6373f, -3.12412f}, // Chair - - {BG_IC_GO_DOODAD_HU_PORTCULLIS01_1, GO_DOODAD_HU_PORTCULLIS01, 401.024f, -780.724f, 49.9482f, -2.52896f}, // Doodad_HU_Portcullis01 - {BG_IC_GO_DOODAD_HU_PORTCULLIS01_2, GO_DOODAD_HU_PORTCULLIS01, 399.802f, -885.208f, 50.1939f, 2.516f}, // Doodad_HU_Portcullis01 - - {BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, 413.479f, -833.95f, 48.5238f, 3.14159f}, // Doodad_ND_Human_Gate_ClosedFX_Door01 - {BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR02, GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, 351.615f, -762.75f, 48.91625f, 4.71292f}, // Doodad_ND_Human_Gate_ClosedFX_Door01 - {BG_IC_GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR03, GO_DOODAD_ND_HUMAN_GATE_CLOSEDFX_DOOR01, 351.024f, -903.33f, 48.92472f, 1.570796f}, // Doodad_ND_Human_Gate_ClosedFX_Door01 - - {BG_IC_GO_DOODAD_PORTCULLISACTIVE01, GO_DOODAD_PORTCULLISACTIVE01, -832.595f, 51.4109f, -0.0261791f, 0.0f}, // Doodad_PortcullisActive01 - - {BG_IC_GO_DOODAD_PORTCULLISACTIVE02, GO_DOODAD_PORTCULLISACTIVE02, 273.033f, -832.199f, 51.4109f, -0.0261791f}, // Doodad_PortcullisActive02 - - {BG_IC_GO_DOODAD_VR_PORTCULLIS01_1, GO_DOODAD_VR_PORTCULLIS01, 1156.89f, -843.998f, 48.6322f, 0.732934f}, // Doodad_VR_Portcullis01 - {BG_IC_GO_DOODAD_VR_PORTCULLIS01_2, GO_DOODAD_VR_PORTCULLIS01, 1157.05f, -682.36f, 48.6322f, -0.829132f}, // Doodad_VR_Portcullis01 - - {BG_IC_GO_FLAGPOLE_1_1, GO_FLAGPOLE_1, -400.809f, 37.6253f, -1.76278f, 0.0f}, // Flagpole - {BG_IC_GO_FLAGPOLE_2_1, GO_FLAGPOLE_2, 1284.76f, -705.668f, 48.9163f, -3.08918f}, // Flagpole - {BG_IC_GO_FLAGPOLE_2_2, GO_FLAGPOLE_2, 299.153f, -784.589f, 48.9162f, -0.157079f}, // Flagpole - {BG_IC_GO_FLAGPOLE_1_2, GO_FLAGPOLE_1, 726.385f, -360.205f, 17.8153f, -1.6057f}, // Flagpole - {BG_IC_GO_FLAGPOLE_1_3, GO_FLAGPOLE_1, 807.78f, -1000.07f, 132.381f, -1.91986f}, // Flagpole - {BG_IC_GO_FLAGPOLE_1_4, GO_FLAGPOLE_1, 776.229f, -804.283f, 6.45052f, 1.6057f}, // Flagpole - {BG_IC_GO_FLAGPOLE_1_5, GO_FLAGPOLE_1, 251.016f, -1159.32f, 17.2376f, -2.25147f}, // Flagpole - {BG_IC_GO_FLAGPOLE_1_6, GO_FLAGPOLE_1, 1269.502f, -400.809f, 37.62525f, -1.762782f}, // Flagpole - - {BG_IC_GO_HORDE_KEEP_PORTCULLIS, GO_HORDE_KEEP_PORTCULLIS, 1283.05f, -765.878f, 50.8297f, -3.13286f}, // Horde Keep Portcullis - - {BG_IC_GO_STOVE_1_1, GO_STOVE_1, 903.291f, -457.345f, 18.1356f, 2.23402f}, // Stove - {BG_IC_GO_STOVE_2_1, GO_STOVE_2, 761.462f, -446.684f, 22.5602f, 0.244344f}, // Stove - {BG_IC_GO_STOVE_1_2, GO_STOVE_1, 11068.13f, -336.373f, 18.5647f, -2.59181f}, // Stove - {BG_IC_GO_STOVE_2_2, GO_STOVE_2, 1118.32f, -363.969f, 18.5532f, -3.08918f}, // Stove - - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_1, GO_HUGE_SEAFORIUM_BOMB_A, 297.3212f, -851.321167f, 48.91627f, -0.94247663f}, - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_2, GO_HUGE_SEAFORIUM_BOMB_A, 298.104156f, -861.026062f, 48.916275f, -2.75761318f}, - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_3, GO_HUGE_SEAFORIUM_BOMB_A, 300.371521f, -818.732666f, 48.91625f, 0.785396755f}, - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_A_4, GO_HUGE_SEAFORIUM_BOMB_A, 302.1354f, -810.7083f, 48.91625f, -1.04719758f}, - - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_1, GO_HUGE_SEAFORIUM_BOMB_H, 1268.30908f, -745.783f, 48.9187775f, 0.785396755f}, - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_2, GO_HUGE_SEAFORIUM_BOMB_H, 1268.50867f, -738.1215f, 48.9175f, -1.04719758f}, - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_3, GO_HUGE_SEAFORIUM_BOMB_H, 1273.066f, -786.572937f, 48.9419174f, -0.94247663f}, - {BG_IC_GO_HUGE_SEAFORIUM_BOMBS_H_4, GO_HUGE_SEAFORIUM_BOMB_H, 1273.849f, -796.2778f, 48.9364281f, -2.75761318f}, - - {BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, 1150.903f, -762.6059f, 47.50768f, 3.141593f}, - {BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR02, GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, 1217.899f, -676.9479f, 47.63408f, 1.570796f}, - {BG_IC_GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR03, GO_DOODAD_ND_WINTERORC_WALL_GATEFX_DOOR01, 1218.743f, -851.1545f, 48.25328f, 4.712392f} -}; - -const Position workshopBombs[2] = -{ - {750.601f, -864.597f, 13.4754f, 1.93731f}, - {785.509f, -864.715f, 13.3993f, 2.47837f} -}; - enum Spells { SPELL_OIL_REFINERY = 68719, @@ -730,10 +485,10 @@ enum BG_IC_Objectives enum ICWorldStates { - BG_IC_ALLIANCE_RENFORT_SET = 4221, - BG_IC_HORDE_RENFORT_SET = 4222, - BG_IC_ALLIANCE_RENFORT = 4226, - BG_IC_HORDE_RENFORT = 4227, + BG_IC_WS_REINFORCEMENTS_SHOW_A = 4221, + BG_IC_WS_REINFORCEMENTS_SHOW_H = 4222, + BG_IC_WS_ALLIANCE_REINFORCEMENTS = 4226, + BG_IC_WS_HORDE_REINFORCEMENTS = 4227, BG_IC_GATE_FRONT_H_WS_CLOSED = 4317, BG_IC_GATE_WEST_H_WS_CLOSED = 4318, BG_IC_GATE_EAST_H_WS_CLOSED = 4319, @@ -799,12 +554,12 @@ enum BG_IC_GateState enum ICDoorList { - BG_IC_H_FRONT, - BG_IC_H_WEST, - BG_IC_H_EAST, BG_IC_A_FRONT, - BG_IC_A_WEST, BG_IC_A_EAST, + BG_IC_A_WEST, + BG_IC_H_WEST, + BG_IC_H_FRONT, + BG_IC_H_EAST, BG_IC_MAXDOOR }; @@ -823,55 +578,31 @@ enum ICNodePointType MAX_NODE_TYPES }; -enum ICNodeState +enum ICNodeState : uint8 { NODE_STATE_UNCONTROLLED = 0, NODE_STATE_CONFLICT_A, NODE_STATE_CONFLICT_H, NODE_STATE_CONTROLLED_A, - NODE_STATE_CONTROLLED_H -}; + NODE_STATE_CONTROLLED_H, -const uint32 BG_IC_GraveyardIds[MAX_NODE_TYPES+2] = {0, 0, 1480, 1481, 1482, 1485, 1486, 1483, 1484}; - -Position const BG_IC_SpiritGuidePos[MAX_NODE_TYPES+2] = -{ - {0.0f, 0.0f, 0.0f, 0.0f}, // no grave - {0.0f, 0.0f, 0.0f, 0.0f}, // no grave - {629.57f, -279.83f, 11.33f, 0.0f}, // dock - {780.729f, -1103.08f, 135.51f, 2.27f}, // hangar - {775.74f, -652.77f, 9.31f, 4.27f}, // workshop - {278.42f, -883.20f, 49.89f, 1.53f}, // alliance starting base - {1300.91f, -834.04f, 48.91f, 1.69f}, // horde starting base - {438.86f, -310.04f, 51.81f, 5.87f}, // last resort alliance - {1148.65f, -1250.98f, 16.60f, 1.74f}, // last resort horde + NODE_STATE_MAX }; // I.E: Hangar, Quarry, Graveyards .. etc struct ICNodePoint { - uint32 gameobject_type; // with this we will get the GameObject of that point - uint32 gameobject_entry; // what gameobject entry is active here. - TeamId faction; // who has this node - ICNodePointType nodeType; // here we can specify if it is graveyards, hangar etc... - uint32 banners[4]; // the banners that have this point - bool needChange; // this is used for the 1 minute time period after the point is captured - uint32 timer; // the same use for needChange - uint32 last_entry; // the last gameobject_entry - uint32 worldStates[5]; // the worldstates that represent the node in the map + uint32 gameobjectId; // what gameobject type is active here. + uint32 gameobject_entry; // what gameobject entry is active here. + TeamId faction; // who has this node + ICNodePointType nodeType; // here we can specify if it is graveyards, hangar etc... + uint32 bannerIds[NODE_STATE_MAX]; // the banners that have this point + bool needChange; // this is used for the 1 minute time period after the point is captured + uint32 timer; // the same use for needChange + uint32 last_entry; // the last gameobject_entry + uint32 worldStates[NODE_STATE_MAX]; // the worldstates that represent the node in the map ICNodeState nodeState; - uint32 string; -}; - -const ICNodePoint nodePointInitial[7] = -{ - {BG_IC_GO_REFINERY_BANNER, GO_REFINERY_BANNER, TEAM_NEUTRAL, NODE_TYPE_REFINERY, {GO_ALLIANCE_BANNER_REFINERY, GO_ALLIANCE_BANNER_REFINERY_CONT, GO_HORDE_BANNER_REFINERY, GO_HORDE_BANNER_REFINERY_CONT}, false, 0, 0, {BG_IC_REFINERY_UNCONTROLLED, BG_IC_REFINERY_CONFLICT_A, BG_IC_REFINERY_CONFLICT_H, BG_IC_REFINERY_CONTROLLED_A, BG_IC_REFINERY_CONTROLLED_H}, NODE_STATE_UNCONTROLLED, LANG_BG_IC_REFINERY}, - {BG_IC_GO_QUARRY_BANNER, GO_QUARRY_BANNER, TEAM_NEUTRAL, NODE_TYPE_QUARRY, {GO_ALLIANCE_BANNER_QUARRY, GO_ALLIANCE_BANNER_QUARRY_CONT, GO_HORDE_BANNER_QUARRY, GO_HORDE_BANNER_QUARRY_CONT}, false, 0, 0, {BG_IC_QUARRY_UNCONTROLLED, BG_IC_QUARRY_CONFLICT_A, BG_IC_QUARRY_CONFLICT_H, BG_IC_QUARRY_CONTROLLED_A, BG_IC_QUARRY_CONTROLLED_H}, NODE_STATE_UNCONTROLLED, LANG_BG_IC_QUARRY}, - {BG_IC_GO_DOCKS_BANNER, GO_DOCKS_BANNER, TEAM_NEUTRAL, NODE_TYPE_DOCKS, {GO_ALLIANCE_BANNER_DOCK, GO_ALLIANCE_BANNER_DOCK_CONT, GO_HORDE_BANNER_DOCK, GO_HORDE_BANNER_DOCK_CONT}, false, 0, 0, {BG_IC_DOCKS_UNCONTROLLED, BG_IC_DOCKS_CONFLICT_A, BG_IC_DOCKS_CONFLICT_H, BG_IC_DOCKS_CONTROLLED_A, BG_IC_DOCKS_CONTROLLED_H}, NODE_STATE_UNCONTROLLED, LANG_BG_IC_DOCKS}, - {BG_IC_GO_HANGAR_BANNER, GO_HANGAR_BANNER, TEAM_NEUTRAL, NODE_TYPE_HANGAR, {GO_ALLIANCE_BANNER_HANGAR, GO_ALLIANCE_BANNER_HANGAR_CONT, GO_HORDE_BANNER_HANGAR, GO_HORDE_BANNER_HANGAR_CONT}, false, 0, 0, {BG_IC_HANGAR_UNCONTROLLED, BG_IC_HANGAR_CONFLICT_A, BG_IC_HANGAR_CONFLICT_H, BG_IC_HANGAR_CONTROLLED_A, BG_IC_HANGAR_CONTROLLED_H}, NODE_STATE_UNCONTROLLED, LANG_BG_IC_HANGAR}, - {BG_IC_GO_WORKSHOP_BANNER, GO_WORKSHOP_BANNER, TEAM_NEUTRAL, NODE_TYPE_WORKSHOP, {GO_ALLIANCE_BANNER_WORKSHOP, GO_ALLIANCE_BANNER_WORKSHOP_CONT, GO_HORDE_BANNER_WORKSHOP, GO_HORDE_BANNER_WORKSHOP_CONT}, false, 0, 0, {BG_IC_WORKSHOP_UNCONTROLLED, BG_IC_WORKSHOP_CONFLICT_A, BG_IC_WORKSHOP_CONFLICT_H, BG_IC_WORKSHOP_CONTROLLED_A, BG_IC_WORKSHOP_CONTROLLED_H}, NODE_STATE_UNCONTROLLED, LANG_BG_IC_WORKSHOP}, - {BG_IC_GO_ALLIANCE_BANNER, GO_ALLIANCE_BANNER, TEAM_ALLIANCE, NODE_TYPE_GRAVEYARD_A, {GO_ALLIANCE_BANNER_GRAVEYARD_A, GO_ALLIANCE_BANNER_GRAVEYARD_A_CONT, GO_HORDE_BANNER_GRAVEYARD_A, GO_HORDE_BANNER_GRAVEYARD_A_CONT}, false, 0, 0, {BG_IC_ALLIANCE_KEEP_UNCONTROLLED, BG_IC_ALLIANCE_KEEP_CONFLICT_A, BG_IC_ALLIANCE_KEEP_CONFLICT_H, BG_IC_ALLIANCE_KEEP_CONTROLLED_A, BG_IC_ALLIANCE_KEEP_CONTROLLED_H}, NODE_STATE_CONTROLLED_A, LANG_BG_IC_ALLIANCE_KEEP}, - {BG_IC_GO_HORDE_BANNER, GO_HORDE_BANNER, TEAM_HORDE, NODE_TYPE_GRAVEYARD_H, {GO_ALLIANCE_BANNER_GRAVEYARD_H, GO_ALLIANCE_BANNER_GRAVEYARD_H_CONT, GO_HORDE_BANNER_GRAVEYARD_H, GO_HORDE_BANNER_GRAVEYARD_H_CONT}, false, 0, 0, {BG_IC_HORDE_KEEP_UNCONTROLLED, BG_IC_HORDE_KEEP_CONFLICT_A, BG_IC_HORDE_KEEP_CONFLICT_H, BG_IC_HORDE_KEEP_CONTROLLED_A, BG_IC_HORDE_KEEP_CONTROLLED_H}, NODE_STATE_CONTROLLED_H, LANG_BG_IC_HORDE_KEEP} + TrinityStrings string; }; enum HonorRewards @@ -932,7 +663,6 @@ class BattlegroundIC : public Battleground void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override; void HandleAreaTrigger(Player* player, uint32 trigger) override; bool SetupBattleground() override; - void SpawnLeader(uint32 teamid); void HandleKillUnit(Creature* unit, Player* killer) override; void HandleKillPlayer(Player* player, Player* killer) override; void EndBattleground(uint32 winner) override; @@ -947,73 +677,29 @@ class BattlegroundIC : public Battleground void HandlePlayerResurrect(Player* player) override; - uint32 GetNodeState(uint8 nodeType) const { return (uint8)nodePoint[nodeType].nodeState; } + uint32 GetNodeState(uint8 nodeType) const { return nodePoint[nodeType].nodeState; } bool IsAllNodesControlledByTeam(uint32 team) const override; bool IsSpellAllowed(uint32 spellId, Player const* player) const override; private: - uint32 closeFortressDoorsTimer; - bool doorsClosed; - uint32 docksTimer; - uint32 resourceTimer; - uint32 siegeEngineWorkshopTimer; - uint16 factionReinforcements[2]; - BG_IC_GateState GateStatus[6]; - ICNodePoint nodePoint[7]; + EventMap _events; - Transport* gunshipAlliance; - Transport* gunshipHorde; + uint16 factionReinforcements[BG_TEAMS_COUNT]; + BG_IC_GateState GateStatus[BG_IC_MAXDOOR]; + ICNodePoint nodePoint[MAX_NODE_TYPES]; - uint32 GetNextBanner(ICNodePoint* node, uint32 team, bool returnDefinitve); + ObjectGuid gunshipAllianceGUID; + ObjectGuid gunshipHordeGUID; - uint32 GetGateIDFromEntry(uint32 id) - { - uint32 i = 0; - switch (id) - { - case GO_HORDE_GATE_1: i = BG_IC_H_FRONT ;break; - case GO_HORDE_GATE_2: i = BG_IC_H_WEST ;break; - case GO_HORDE_GATE_3: i = BG_IC_H_EAST ;break; - case GO_ALLIANCE_GATE_3: i = BG_IC_A_FRONT ;break; - case GO_ALLIANCE_GATE_1: i = BG_IC_A_WEST ;break; - case GO_ALLIANCE_GATE_2: i = BG_IC_A_EAST ;break; - } - return i; - } - - uint32 GetWorldStateFromGateEntry(uint32 id, bool open) - { - uint32 uws = 0; - - switch (id) - { - case GO_HORDE_GATE_1: - uws = (open ? BG_IC_GATE_FRONT_H_WS_OPEN : BG_IC_GATE_FRONT_H_WS_CLOSED); - break; - case GO_HORDE_GATE_2: - uws = (open ? BG_IC_GATE_WEST_H_WS_OPEN : BG_IC_GATE_WEST_H_WS_CLOSED); - break; - case GO_HORDE_GATE_3: - uws = (open ? BG_IC_GATE_EAST_H_WS_OPEN : BG_IC_GATE_EAST_H_WS_CLOSED); - break; - case GO_ALLIANCE_GATE_3: - uws = (open ? BG_IC_GATE_FRONT_A_WS_OPEN : BG_IC_GATE_FRONT_A_WS_CLOSED); - break; - case GO_ALLIANCE_GATE_1: - uws = (open ? BG_IC_GATE_WEST_A_WS_OPEN : BG_IC_GATE_WEST_A_WS_CLOSED); - break; - case GO_ALLIANCE_GATE_2: - uws = (open ? BG_IC_GATE_EAST_A_WS_OPEN : BG_IC_GATE_EAST_A_WS_CLOSED); - break; - } - return uws; - } + static uint32 GetNextBanner(ICNodePoint const* node, TeamId team, bool returnDefinitve); + static uint32 GetGateIDFromEntry(uint32 id); + static uint32 GetWorldStateFromGateEntry(uint32 id, bool open); void UpdateNodeWorldState(ICNodePoint* node); - void HandleCapturedNodes(ICNodePoint* node, bool recapture); - void HandleContestedNodes(ICNodePoint* node); + void HandleCapturedNodes(ICNodePoint const* node, bool recapture); + void HandleContestedNodes(ICNodePoint const* node); }; #endif diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp index 95fef007564be..6d9b780222ff2 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp @@ -20,9 +20,21 @@ #include "Player.h" #include "WorldPacket.h" +BattlegroundGOSpawnPoint const BG_NA_GameObjects[BG_NA_OBJECT_MAX] = +{ + // gates + { BG_NA_OBJECT_TYPE_DOOR_1, { 4031.854000f, 2966.833000f, 12.646200f, -2.64878800f }, { 0.f, 0.f, 0.96979620f, -0.2439165f }, RESPAWN_IMMEDIATELY }, + { BG_NA_OBJECT_TYPE_DOOR_2, { 4081.179000f, 2874.970000f, 12.391710f, 0.49280450f }, { 0.f, 0.f, 0.24391650f, 0.9697962f }, RESPAWN_IMMEDIATELY }, + { BG_NA_OBJECT_TYPE_DOOR_3, { 4023.709000f, 2981.777000f, 10.701170f, -2.64878800f }, { 0.f, 0.f, 0.96979620f, -0.2439165f }, RESPAWN_IMMEDIATELY }, + { BG_NA_OBJECT_TYPE_DOOR_4, { 4090.064000f, 2858.438000f, 10.236310f, 0.49280450f }, { 0.f, 0.f, 0.24391650f, 0.9697962f }, RESPAWN_IMMEDIATELY }, + // buffs + { BG_NA_OBJECT_TYPE_BUFF_1, { 4009.189941f, 2895.250000f, 13.052700f, -1.44862400f }, { 0.f, 0.f, 0.66262010f, -0.7489557f }, 2 * MINUTE }, + { BG_NA_OBJECT_TYPE_BUFF_2, { 4103.330078f, 2946.350098f, 13.051300f, -0.06981307f }, { 0.f, 0.f, 0.03489945f, -0.9993908f }, 2 * MINUTE } +}; + BattlegroundNA::BattlegroundNA() { - BgObjects.resize(BG_NA_OBJECT_MAX); + SetGameObjectsNumber(BG_NA_OBJECT_MAX); } void BattlegroundNA::StartingEventCloseDoors() @@ -64,17 +76,14 @@ void BattlegroundNA::FillInitialWorldStates(WorldPacket& data) bool BattlegroundNA::SetupBattleground() { - // gates - if (!AddObject(BG_NA_OBJECT_DOOR_1, BG_NA_OBJECT_TYPE_DOOR_1, 4031.854f, 2966.833f, 12.6462f, -2.648788f, 0, 0, 0.9697962f, -0.2439165f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_NA_OBJECT_DOOR_2, BG_NA_OBJECT_TYPE_DOOR_2, 4081.179f, 2874.97f, 12.39171f, 0.4928045f, 0, 0, 0.2439165f, 0.9697962f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_NA_OBJECT_DOOR_3, BG_NA_OBJECT_TYPE_DOOR_3, 4023.709f, 2981.777f, 10.70117f, -2.648788f, 0, 0, 0.9697962f, -0.2439165f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_NA_OBJECT_DOOR_4, BG_NA_OBJECT_TYPE_DOOR_4, 4090.064f, 2858.438f, 10.23631f, 0.4928045f, 0, 0, 0.2439165f, 0.9697962f, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_NA_OBJECT_BUFF_1, BG_NA_OBJECT_TYPE_BUFF_1, 4009.189941f, 2895.250000f, 13.052700f, -1.448624f, 0, 0, 0.6626201f, -0.7489557f, 120) - || !AddObject(BG_NA_OBJECT_BUFF_2, BG_NA_OBJECT_TYPE_BUFF_2, 4103.330078f, 2946.350098f, 13.051300f, -0.06981307f, 0, 0, 0.03489945f, -0.9993908f, 120)) + for (uint32 i = 0; i < BG_NA_OBJECT_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundNA: Failed to spawn some object!"); - return false; + BattlegroundGOSpawnPoint const& object = BG_NA_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundNA: Failed to spawn GameObject! (Entry: %u). Battleground not created!", object.Entry); + return false; + } } return true; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp index a55f437ca6a35..0d8c99d1996af 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp @@ -20,9 +20,18 @@ #include "Player.h" #include "WorldPacket.h" +BattlegroundGOSpawnPoint const BG_RL_GameObjects[BG_RL_OBJECT_MAX] = +{ + { BG_RL_OBJECT_TYPE_DOOR_1, { 1293.561000f, 1601.938000f, 31.605570f, -1.45734900f }, { 0.f, 0.f, -0.66588130f, 0.7460576f }, RESPAWN_IMMEDIATELY }, + { BG_RL_OBJECT_TYPE_DOOR_2, { 1278.648000f, 1730.557000f, 31.605570f, 1.68424500f }, { 0.f, 0.f, 0.74605820f, 0.6658807f }, RESPAWN_IMMEDIATELY }, + + { BG_RL_OBJECT_TYPE_BUFF_1, { 1328.719971f, 1632.719971f, 36.730400f, -1.44862400f }, { 0.f, 0.f, 0.66262010f, -0.7489557f }, 2 * MINUTE }, + { BG_RL_OBJECT_TYPE_BUFF_2, { 1243.300049f, 1699.170044f, 34.872601f, -0.06981307f }, { 0.f, 0.f, 0.03489945f, -0.9993908f }, 2 * MINUTE } +}; + BattlegroundRL::BattlegroundRL() { - BgObjects.resize(BG_RL_OBJECT_MAX); + SetGameObjectsNumber(BG_RL_OBJECT_MAX); } void BattlegroundRL::StartingEventCloseDoors() @@ -64,15 +73,14 @@ void BattlegroundRL::FillInitialWorldStates(WorldPacket& data) bool BattlegroundRL::SetupBattleground() { - // gates - if (!AddObject(BG_RL_OBJECT_DOOR_1, BG_RL_OBJECT_TYPE_DOOR_1, 1293.561f, 1601.938f, 31.60557f, -1.457349f, 0, 0, -0.6658813f, 0.7460576f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RL_OBJECT_DOOR_2, BG_RL_OBJECT_TYPE_DOOR_2, 1278.648f, 1730.557f, 31.60557f, 1.684245f, 0, 0, 0.7460582f, 0.6658807f, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_RL_OBJECT_BUFF_1, BG_RL_OBJECT_TYPE_BUFF_1, 1328.719971f, 1632.719971f, 36.730400f, -1.448624f, 0, 0, 0.6626201f, -0.7489557f, 120) - || !AddObject(BG_RL_OBJECT_BUFF_2, BG_RL_OBJECT_TYPE_BUFF_2, 1243.300049f, 1699.170044f, 34.872601f, -0.06981307f, 0, 0, 0.03489945f, -0.9993908f, 120)) + for (uint32 i = 0; i < BG_RL_OBJECT_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundRL: Failed to spawn some object!"); - return false; + BattlegroundGOSpawnPoint const& object = BG_RL_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundRL: Failed to spawn GameObject! (Entry: %u). Battleground not created!", object.Entry); + return false; + } } return true; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp index f4a03e85cad2b..0b44501c47aa4 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp @@ -22,9 +22,46 @@ #include "Player.h" #include "WorldPacket.h" +/* +192392 618 0 0 3 1 0 763,4324 -294,4195 28,27668 3,141593 0 0 -1 0 +192391 618 0 0 3 1 0 763,4324 -274,0582 28,2767 3,141593 0 0 -1 0 +194577 618 0 0 3 1 0 763,579 -306,1461 26,66522 3,141593 0 0 -1 0 +194576 618 0 0 3 1 0 763,6646 -261,873 26,68659 0 0 0 0 1 +*/ + +BattlegroundGOSpawnPoint const BG_RV_GameObjects[BG_RV_OBJECT_MAX] = +{ + { BG_RV_OBJECT_TYPE_BUFF_1, { 735.551819f, -284.794678f, 28.276682f, 0.034906f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_BUFF_2, { 791.224487f, -284.794464f, 28.276682f, 2.600535f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + + { BG_RV_OBJECT_TYPE_FIRE_1, { 743.543457f, -283.799469f, 28.286655f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_FIRE_2, { 782.971802f, -283.799469f, 28.286655f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + + { BG_RV_OBJECT_TYPE_FIREDOOR_1, { 743.711060f, -284.099609f, 27.542587f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_FIREDOOR_2, { 783.221252f, -284.133362f, 27.535686f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + + { BG_RV_OBJECT_TYPE_PILAR_1, { 763.632385f, -306.162384f, 25.909504f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PILAR_3, { 763.611145f, -261.856750f, 25.909504f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_GEAR_1, { 763.664551f, -261.872986f, 26.686588f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_GEAR_2, { 763.578979f, -306.146149f, 26.665222f, 3.141593f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + + { BG_RV_OBJECT_TYPE_PILAR_2, { 723.644287f, -284.493256f, 24.648525f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PILAR_4, { 802.211609f, -284.493256f, 24.648525f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PULLEY_1, { 700.722290f, -283.990662f, 39.517582f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PULLEY_2, { 826.303833f, -283.996429f, 39.517582f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + + { BG_RV_OBJECT_TYPE_PILAR_COLLISION_1, { 763.632385f, -306.162384f, 30.639660f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PILAR_COLLISION_2, { 723.644287f, -284.493256f, 32.382710f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PILAR_COLLISION_3, { 763.611145f, -261.856750f, 30.639660f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_PILAR_COLLISION_4, { 802.211609f, -284.493256f, 32.382710f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + + { BG_RV_OBJECT_TYPE_ELEVATOR_1, { 763.536377f, -294.535767f, 0.5053830f, 3.141593f }, { 0.f, 0.f, -1.f, 0.f }, RESPAWN_IMMEDIATELY }, + { BG_RV_OBJECT_TYPE_ELEVATOR_2, { 763.506348f, -273.873352f, 0.5053830f, 0.000000f }, { 0.f, 0.f, 0.f, 1.f }, RESPAWN_IMMEDIATELY } +}; + BattlegroundRV::BattlegroundRV() { - BgObjects.resize(BG_RV_OBJECT_MAX); + SetGameObjectsNumber(BG_RV_OBJECT_MAX); _timer = 0; _state = 0; @@ -108,38 +145,16 @@ void BattlegroundRV::FillInitialWorldStates(WorldPacket& data) bool BattlegroundRV::SetupBattleground() { - // elevators - if (!AddObject(BG_RV_OBJECT_ELEVATOR_1, BG_RV_OBJECT_TYPE_ELEVATOR_1, 763.536377f, -294.535767f, 0.505383f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_ELEVATOR_2, BG_RV_OBJECT_TYPE_ELEVATOR_2, 763.506348f, -273.873352f, 0.505383f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_RV_OBJECT_BUFF_1, BG_RV_OBJECT_TYPE_BUFF_1, 735.551819f, -284.794678f, 28.276682f, 0.034906f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_BUFF_2, BG_RV_OBJECT_TYPE_BUFF_2, 791.224487f, -284.794464f, 28.276682f, 2.600535f, 0, 0, 0, RESPAWN_IMMEDIATELY) - // fire - || !AddObject(BG_RV_OBJECT_FIRE_1, BG_RV_OBJECT_TYPE_FIRE_1, 743.543457f, -283.799469f, 28.286655f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_FIRE_2, BG_RV_OBJECT_TYPE_FIRE_2, 782.971802f, -283.799469f, 28.286655f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_FIREDOOR_1, BG_RV_OBJECT_TYPE_FIREDOOR_1, 743.711060f, -284.099609f, 27.542587f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_FIREDOOR_2, BG_RV_OBJECT_TYPE_FIREDOOR_2, 783.221252f, -284.133362f, 27.535686f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - // Gear - || !AddObject(BG_RV_OBJECT_GEAR_1, BG_RV_OBJECT_TYPE_GEAR_1, 763.664551f, -261.872986f, 26.686588f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_GEAR_2, BG_RV_OBJECT_TYPE_GEAR_2, 763.578979f, -306.146149f, 26.665222f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - // Pulley - || !AddObject(BG_RV_OBJECT_PULLEY_1, BG_RV_OBJECT_TYPE_PULLEY_1, 700.722290f, -283.990662f, 39.517582f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PULLEY_2, BG_RV_OBJECT_TYPE_PULLEY_2, 826.303833f, -283.996429f, 39.517582f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - // Pilars - || !AddObject(BG_RV_OBJECT_PILAR_1, BG_RV_OBJECT_TYPE_PILAR_1, 763.632385f, -306.162384f, 25.909504f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PILAR_2, BG_RV_OBJECT_TYPE_PILAR_2, 723.644287f, -284.493256f, 24.648525f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PILAR_3, BG_RV_OBJECT_TYPE_PILAR_3, 763.611145f, -261.856750f, 25.909504f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PILAR_4, BG_RV_OBJECT_TYPE_PILAR_4, 802.211609f, -284.493256f, 24.648525f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - - // Pilars Collision - || !AddObject(BG_RV_OBJECT_PILAR_COLLISION_1, BG_RV_OBJECT_TYPE_PILAR_COLLISION_1, 763.632385f, -306.162384f, 30.639660f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PILAR_COLLISION_2, BG_RV_OBJECT_TYPE_PILAR_COLLISION_2, 723.644287f, -284.493256f, 32.382710f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PILAR_COLLISION_3, BG_RV_OBJECT_TYPE_PILAR_COLLISION_3, 763.611145f, -261.856750f, 30.639660f, 0.000000f, 0, 0, 0, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RV_OBJECT_PILAR_COLLISION_4, BG_RV_OBJECT_TYPE_PILAR_COLLISION_4, 802.211609f, -284.493256f, 32.382710f, 3.141593f, 0, 0, 0, RESPAWN_IMMEDIATELY)) + for (uint32 i = 0; i < BG_RV_OBJECT_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundRV: Failed to spawn some object!"); - return false; + BattlegroundGOSpawnPoint const& object = BG_RV_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattleGroundRV: Failed to spawn GameObject! (Entry: %u). Battleground not created!", object.Entry); + return false; + } } + return true; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h index 57347ec0c7509..0f06566d53985 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h @@ -24,8 +24,10 @@ enum BattlegroundRVObjectTypes { BG_RV_OBJECT_BUFF_1, BG_RV_OBJECT_BUFF_2, + BG_RV_OBJECT_FIRE_1, BG_RV_OBJECT_FIRE_2, + BG_RV_OBJECT_FIREDOOR_1, BG_RV_OBJECT_FIREDOOR_2, @@ -46,6 +48,7 @@ enum BattlegroundRVObjectTypes BG_RV_OBJECT_ELEVATOR_1, BG_RV_OBJECT_ELEVATOR_2, + BG_RV_OBJECT_MAX }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 450f5cd9144ef..96c6adfab2435 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -24,6 +24,315 @@ #include "ScriptedCreature.h" #include "WorldPacket.h" +BattlegroundSpawnPoint const BG_SA_Creatures[BG_SA_MAXNPC] = +{ + // Cannons + { NPC_ANTI_PERSONNAL_CANNON, { 1436.583000f, 109.784700f, 41.490560f, 5.42797400f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1405.057000f, 84.7270000f, 41.183140f, 0.06825211f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1067.822000f, -86.9250300f, 93.889440f, 6.24827900f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1068.805000f, -127.429300f, 96.449520f, 0.01467853f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1422.189000f, -196.463500f, 42.265410f, 0.97738440f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1454.793000f, -220.333300f, 42.039560f, 1.02974400f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1232.283000f, -187.527000f, 67.027970f, 0.50614550f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1249.647000f, -223.979300f, 66.803440f, 0.55850540f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1236.290000f, 92.2478000f, 65.047800f, 5.72468000f }, 10 * MINUTE }, + { NPC_ANTI_PERSONNAL_CANNON, { 1215.151000f, 57.7534700f, 64.821950f, 5.77704000f }, 10 * MINUTE }, + // 4 beach demolishers + { NPC_DEMOLISHER_SA, { 1611.597656f, -117.270073f, 8.7193550f, 2.51327400f }, 10 * MINUTE }, + { NPC_DEMOLISHER_SA, { 1575.562500f, -158.421875f, 5.0244500f, 2.12930200f }, 10 * MINUTE }, + { NPC_DEMOLISHER_SA, { 1618.047729f, 61.4246410f, 7.2482100f, 3.97935100f }, 10 * MINUTE }, + { NPC_DEMOLISHER_SA, { 1575.103149f, 98.8733440f, 2.8303600f, 3.75245800f }, 10 * MINUTE }, + // 4 factory demolishers + { NPC_DEMOLISHER_SA, { 1371.055786f, -317.071136f, 35.007359f, 1.94746000f }, 10 * MINUTE }, + { NPC_DEMOLISHER_SA, { 1424.034912f, -260.195190f, 31.084425f, 2.82001300f }, 10 * MINUTE }, + { NPC_DEMOLISHER_SA, { 1353.139893f, 223.745438f, 35.265411f, 4.34368400f }, 10 * MINUTE }, + { NPC_DEMOLISHER_SA, { 1404.809570f, 197.027237f, 32.046032f, 3.60540100f }, 10 * MINUTE }, + // Used Demolisher Salesman + { NPC_RIGGER_SPARKLIGHT, { 1348.644165f, -298.786469f, 31.080130f, 1.71042300f }, RESPAWN_IMMEDIATELY }, + { NPC_GORGRIL_RIGSPARK, { 1358.191040f, 195.527786f, 31.018187f, 4.17133700f }, RESPAWN_IMMEDIATELY }, + // Kanrethad + { NPC_KANRETHAD, { 841.9210000f, -134.194000f, 196.83800f, 6.23082000f }, RESPAWN_IMMEDIATELY }, + // teleport triggers (used as teleport spell target, despawned when associated gate is destroyed, except for yellow) + { NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, { 1389.060000f, 102.940900f, 34.574170f, 2.16420800f }, RESPAWN_IMMEDIATELY }, // green + { NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, { 1043.523000f, -87.8506900f, 87.196950f, 2.96706000f }, RESPAWN_IMMEDIATELY }, // yellow + { NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, { 1441.079000f, -240.593900f, 35.347150f, 4.03171100f }, RESPAWN_IMMEDIATELY }, // blue + { NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, { 1227.886000f, -235.457500f, 60.111160f, 3.40339200f }, RESPAWN_IMMEDIATELY }, // red + { NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, { 1193.757000f, 69.9405400f, 58.129500f, 2.49582100f }, RESPAWN_IMMEDIATELY } // purple +}; + +// common to all ships +// [0] GAMEOBJECT_PARENTROTATION + 2: 1065353216/1 +// [0] GAMEOBJECT_PARENTROTATION + 3: 3007036718/-4.371139E-08 +G3D::Quat const shipParentRotation = { 0.f, 0.f, 1.f, -4.371139e-08f }; + +BattlegroundGOSpawnPoint const BG_SA_Ships[BG_SA_MAX_SHIPS_PER_TEAM * BG_TEAMS_COUNT] = +{ + { BG_SA_BOAT_ONE_A, { 2679.697f, -826.8912f, 3.7128600f, -0.56376610f }, { 0.f, 0.f, -0.278164900f, 0.960533300f }, RESPAWN_ONE_DAY }, + { BG_SA_BOAT_TWO_H, { 2578.895f, 986.3294f, -0.6852722f, 0.80769580f }, { 0.f, 0.f, 0.392959600f, 0.919555700f }, RESPAWN_ONE_DAY }, + + { BG_SA_BOAT_ONE_H, { 2686.109f, -831.1955f, 0.4520569f, -0.56376610f }, { 0.f, 0.f, -0.278164900f, 0.960533300f }, RESPAWN_ONE_DAY }, + { BG_SA_BOAT_TWO_A, { 2574.004f, 981.2615f, 2.6034240f, 0.80769580f }, { 0.f, 0.f, 0.392959600f, 0.919555700f }, RESPAWN_ONE_DAY }, +}; + +BattlegroundGOSpawnPoint const BG_SA_Objects[BG_SA_MAXOBJ] = +{ + // gates + { GO_GATE_OF_THE_GREEN_EMERALD, { 1412.743f, 106.9931f, 29.877970f, -0.84648480f }, { 0.f, 0.f, -0.410718900f, 0.911762000f }, RESPAWN_ONE_DAY }, + { GO_GATE_OF_THE_YELLOW_MOON, { 1055.899f, -107.6285f, 83.427470f, 0.06108661f }, { 0.f, 0.f, 0.030538560f, 0.999533600f }, RESPAWN_ONE_DAY }, + { GO_GATE_OF_THE_BLUE_SAPPHIRE, { 1431.134f, -218.6840f, 32.104790f, 0.98610960f }, { 0.f, 0.f, 0.473319100f, 0.880891100f }, RESPAWN_ONE_DAY }, + { GO_GATE_OF_THE_RED_SUN, { 1229.667f, -211.3004f, 56.435990f, 0.48869120f }, { 0.f, 0.f, 0.241921400f, 0.970295800f }, RESPAWN_ONE_DAY }, + { GO_GATE_OF_THE_PURPLE_AMETHYST, { 1214.778f, 81.56077f, 54.582140f, -0.50614460f }, { 0.f, 0.f, -0.250379600f, 0.968147800f }, RESPAWN_ONE_DAY }, + { GO_CHAMBER_OF_ANCIENT_RELICS, { 878.0330f, -108.1910f, 117.83220f, 0.01059919f }, { 0.f, 0.f, 0.005299568f, 0.999985900f }, RESPAWN_ONE_DAY }, + // relics + { GO_TITAN_RELIC_A, { 837.0653f, -107.5367f, 127.02480f, -1.81514200f }, { 0.f, 0.f, -0.788010600f, 0.615661700f }, RESPAWN_ONE_DAY }, + { GO_TITAN_RELIC_H, { 837.0653f, -107.5367f, 127.02480f, -1.81514200f }, { 0.f, 0.f, -0.788010600f, 0.615661700f }, RESPAWN_ONE_DAY }, + // defender portals + { GO_DEFENDER_PORTAL_A, { 1467.955f, -225.8299f, 30.969550f, -2.40855400f }, { 0.f, 0.f, -0.933580400f, 0.358368000f }, RESPAWN_ONE_DAY }, //blue + { GO_DEFENDER_PORTAL_H, { 1467.955f, -225.8299f, 30.969550f, -2.40855400f }, { 0.f, 0.f, -0.933580400f, 0.358368000f }, RESPAWN_ONE_DAY }, + { GO_DEFENDER_PORTAL_A, { 1394.237f, 72.10178f, 31.105790f, -0.55850390f }, { 0.f, 0.f, -0.275636700f, 0.961261900f }, RESPAWN_ONE_DAY }, //green + { GO_DEFENDER_PORTAL_H, { 1394.237f, 72.10178f, 31.105790f, -0.55850390f }, { 0.f, 0.f, -0.275636700f, 0.961261900f }, RESPAWN_ONE_DAY }, + { GO_DEFENDER_PORTAL_A, { 1065.241f, -89.75342f, 81.002980f, 2.25147300f }, { 0.f, 0.f, 0.902585000f, 0.430511700f }, RESPAWN_ONE_DAY }, //yellow + { GO_DEFENDER_PORTAL_H, { 1065.241f, -89.75342f, 81.002980f, 2.25147300f }, { 0.f, 0.f, 0.902585000f, 0.430511700f }, RESPAWN_ONE_DAY }, + { GO_DEFENDER_PORTAL_A, { 1216.063f, 47.54688f, 54.343650f, -1.83259500f }, { 0.f, 0.f, -0.793353100f, 0.608761700f }, RESPAWN_ONE_DAY }, //purple + { GO_DEFENDER_PORTAL_H, { 1216.063f, 47.54688f, 54.343650f, -1.83259500f }, { 0.f, 0.f, -0.793353100f, 0.608761700f }, RESPAWN_ONE_DAY }, + { GO_DEFENDER_PORTAL_A, { 1255.875f, -233.7240f, 56.496810f, -0.47123850f }, { 0.f, 0.f, -0.233445200f, 0.972370000f }, RESPAWN_ONE_DAY }, //red + { GO_DEFENDER_PORTAL_H, { 1255.875f, -233.7240f, 56.496810f, -0.47123850f }, { 0.f, 0.f, -0.233445200f, 0.972370000f }, RESPAWN_ONE_DAY }, + // Sigils + { GO_GREEN_MOON_SIGIL, { 1415.539f, 103.8301f, 42.198830f, -0.73303820f }, { 0.f, 0.f, -0.358367900f, 0.933580500f }, RESPAWN_ONE_DAY }, + { GO_YELLOW_MOON_SIGIL, { 1060.423f, -107.4036f, 95.745000f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_BLUE_MOON_SIGIL, { 1433.349f, -215.6073f, 44.422310f, 1.60570200f }, { 0.f, 0.f, 0.719339400f, 0.694658800f }, RESPAWN_ONE_DAY }, + { GO_RED_MOON_SIGIL, { 1233.884f, -209.2753f, 69.084210f, 0.55850390f }, { 0.f, 0.f, 0.275636700f, 0.961261900f }, RESPAWN_ONE_DAY }, + { GO_PURPLE_MOON_SIGIL, { 1218.457f, 80.10538f, 66.954330f, -0.19198520f }, { 0.f, 0.f, -0.095845220f, 0.995396300f }, RESPAWN_ONE_DAY }, + // Flagpoles + { GO_FLAGPOLE, { 1215.114f, -65.71186f, 70.084270f, -3.12412300f }, { 0.f, 0.f, -0.999961900f, 0.008734641f }, RESPAWN_ONE_DAY }, + { GO_FLAGPOLE, { 1338.864f, -153.3365f, 30.895120f, -2.53072300f }, { 0.f, 0.f, -0.953716300f, 0.300707900f }, RESPAWN_ONE_DAY }, + { GO_FLAGPOLE, { 1309.124f, 9.410645f, 30.893400f, -1.62315600f }, { 0.f, 0.f, -0.725374200f, 0.688354700f }, RESPAWN_ONE_DAY }, + // Flags + { GO_ALLIANCE_BANNER_CENTER, { 1215.108f, -65.71577f, 70.084270f, -3.12412300f }, { 0.f, 0.f, -0.999961900f, 0.008734641f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_CENTER, { 1215.108f, -65.71577f, 70.084270f, -3.12412300f }, { 0.f, 0.f, -0.999961900f, 0.008734641f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_RIGHT, { 1338.859f, -153.3273f, 30.895080f, -2.53072300f }, { 0.f, 0.f, -0.953716300f, 0.300707900f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_RIGHT, { 1338.859f, -153.3273f, 30.895080f, -2.53072300f }, { 0.f, 0.f, -0.953716300f, 0.300707900f }, RESPAWN_ONE_DAY }, + { GO_ALLIANCE_BANNER_LEFT, { 1309.192f, 9.416233f, 30.893400f, 1.51843600f }, { 0.f, 0.f, 0.688354500f, 0.725374500f }, RESPAWN_ONE_DAY }, + { GO_HORDE_BANNER_LEFT, { 1309.192f, 9.416233f, 30.893400f, 1.51843600f }, { 0.f, 0.f, 0.688354500f, 0.725374500f }, RESPAWN_ONE_DAY }, + // Bombs + { GO_SEAFORIUM_BOMB_A, { 1598.511f, 36.18088f, 7.3779360f, -1.48352800f }, { 0.f, 0.f, -0.675589600f, 0.737277900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1598.511f, 36.18088f, 7.3779360f, -1.48352800f }, { 0.f, 0.f, -0.675589600f, 0.737277900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1598.365f, 37.42188f, 7.3969860f, -0.31415840f }, { 0.f, 0.f, -0.156434100f, 0.987688400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1598.365f, 37.42188f, 7.3969860f, -0.31415840f }, { 0.f, 0.f, -0.156434100f, 0.987688400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1597.705f, 37.00347f, 7.8008180f, -1.71042200f }, { 0.f, 0.f, -0.754709200f, 0.656059400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1597.705f, 37.00347f, 7.8008180f, -1.71042200f }, { 0.f, 0.f, -0.754709200f, 0.656059400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1597.096f, 37.20964f, 7.3712910f, -2.12930100f }, { 0.f, 0.f, -0.874619500f, 0.484810100f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1597.096f, 37.20964f, 7.3712910f, -2.12930100f }, { 0.f, 0.f, -0.874619500f, 0.484810100f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1593.964f, -96.16873f, 8.7822530f, -1.13446300f }, { 0.f, 0.f, -0.537299200f, 0.843391700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1593.964f, -96.16873f, 8.7822530f, -1.13446300f }, { 0.f, 0.f, -0.537299200f, 0.843391700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1596.176f, 36.33398f, 7.3453340f, -2.51327400f }, { 0.f, 0.f, -0.951056500f, 0.309017100f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1596.176f, 36.33398f, 7.3453340f, -2.51327400f }, { 0.f, 0.f, -0.951056500f, 0.309017100f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1594.800f, 47.51574f, 7.5697730f, -1.76278200f }, { 0.f, 0.f, -0.771624600f, 0.636078200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1594.800f, 47.51574f, 7.5697730f, -1.76278200f }, { 0.f, 0.f, -0.771624600f, 0.636078200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1594.083f, 46.61654f, 7.4413290f, -1.71042200f }, { 0.f, 0.f, -0.754709200f, 0.656059400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1594.083f, 46.61654f, 7.4413290f, -1.71042200f }, { 0.f, 0.f, -0.754709200f, 0.656059400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1593.087f, 47.30523f, 7.4102940f, 2.75761300f }, { 0.f, 0.f, 0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1593.087f, 47.30523f, 7.4102940f, 2.75761300f }, { 0.f, 0.f, 0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1592.643f, 46.12370f, 7.4035310f, -2.32128700f }, { 0.f, 0.f, -0.917059900f, 0.398749500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1592.643f, 46.12370f, 7.4035310f, -2.32128700f }, { 0.f, 0.f, -0.917059900f, 0.398749500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1591.730f, 47.05100f, 7.3816770f, 2.86233500f }, { 0.f, 0.f, 0.990267800f, 0.139175400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1591.730f, 47.05100f, 7.3816770f, 2.86233500f }, { 0.f, 0.f, 0.990267800f, 0.139175400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1589.411f, 35.65158f, 7.3536520f, 0.40142490f }, { 0.f, 0.f, 0.199367500f, 0.979924800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1589.411f, 35.65158f, 7.3536520f, 0.40142490f }, { 0.f, 0.f, 0.199367500f, 0.979924800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1588.646f, 34.91233f, 7.4360210f, 0.66322320f }, { 0.f, 0.f, 0.325567200f, 0.945518900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1588.646f, 34.91233f, 7.4360210f, 0.66322320f }, { 0.f, 0.f, 0.325567200f, 0.945518900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1588.366f, 36.28743f, 7.3761040f, -1.23918300f }, { 0.f, 0.f, -0.580702800f, 0.814115600f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1588.366f, 36.28743f, 7.3761040f, -1.23918300f }, { 0.f, 0.f, -0.580702800f, 0.814115600f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1585.014f, -104.3277f, 8.6132050f, 0.40142490f }, { 0.f, 0.f, 0.199367500f, 0.979924800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1585.014f, -104.3277f, 8.6132050f, 0.40142490f }, { 0.f, 0.f, 0.199367500f, 0.979924800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1584.439f, -103.3369f, 8.5020380f, -3.12412300f }, { 0.f, 0.f, -0.999961900f, 0.008734641f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1584.439f, -103.3369f, 8.5020380f, -3.12412300f }, { 0.f, 0.f, -0.999961900f, 0.008734641f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1584.295f, -103.9167f, 9.0690790f, 2.96704100f }, { 0.f, 0.f, 0.996193900f, 0.087165040f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1584.295f, -103.9167f, 9.0690790f, 2.96704100f }, { 0.f, 0.f, 0.996193900f, 0.087165040f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1583.457f, -104.0751f, 8.4517500f, -1.65806200f }, { 0.f, 0.f, -0.737277000f, 0.675590500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1583.457f, -104.0751f, 8.4517500f, -1.65806200f }, { 0.f, 0.f, -0.737277000f, 0.675590500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1584.159f, -92.27148f, 8.3479280f, 2.86233500f }, { 0.f, 0.f, 0.990267800f, 0.139175400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1584.159f, -92.27148f, 8.3479280f, 2.86233500f }, { 0.f, 0.f, 0.990267800f, 0.139175400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1583.674f, -91.87500f, 8.8906830f, 2.98449800f }, { 0.f, 0.f, 0.996916800f, 0.078466430f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1583.674f, -91.87500f, 8.8906830f, 2.98449800f }, { 0.f, 0.f, 0.996916800f, 0.078466430f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1583.355f, -91.18110f, 8.3565370f, 1.67551400f }, { 0.f, 0.f, 0.743144000f, 0.669131500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1583.355f, -91.18110f, 8.3565370f, 1.67551400f }, { 0.f, 0.f, 0.743144000f, 0.669131500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1582.967f, -92.59061f, 8.3533370f, -1.27409100f }, { 0.f, 0.f, -0.594822900f, 0.803856800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1582.967f, -92.59061f, 8.3533370f, -1.27409100f }, { 0.f, 0.f, -0.594822900f, 0.803856800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1581.966f, -100.9250f, 8.3273970f, -0.94247660f }, { 0.f, 0.f, -0.453990000f, 0.891006800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1581.966f, -100.9250f, 8.3273970f, -0.94247660f }, { 0.f, 0.f, -0.453990000f, 0.891006800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1581.203f, -99.49620f, 8.3370030f, -0.71558490f }, { 0.f, 0.f, -0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1581.203f, -99.49620f, 8.3370030f, -0.71558490f }, { 0.f, 0.f, -0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1388.996f, -305.6311f, 32.007040f, 1.08210300f }, { 0.f, 0.f, 0.515037500f, 0.857167600f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1388.996f, -305.6311f, 32.007040f, 1.08210300f }, { 0.f, 0.f, 0.515037500f, 0.857167600f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1388.626f, -306.8471f, 31.929260f, -0.40142490f }, { 0.f, 0.f, -0.199367500f, 0.979924800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1388.626f, -306.8471f, 31.929260f, -0.40142490f }, { 0.f, 0.f, -0.199367500f, 0.979924800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1387.903f, -302.4415f, 32.010150f, -2.91469000f }, { 0.f, 0.f, -0.993571300f, 0.113208400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1387.903f, -302.4415f, 32.010150f, -2.91469000f }, { 0.f, 0.f, -0.993571300f, 0.113208400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1372.475f, -291.1497f, 31.170080f, 2.37364400f }, { 0.f, 0.f, 0.927183200f, 0.374608300f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1372.475f, -291.1497f, 31.170080f, 2.37364400f }, { 0.f, 0.f, 0.927183200f, 0.374608300f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1372.196f, -289.9348f, 31.152320f, -2.42600300f }, { 0.f, 0.f, -0.936671300f, 0.350209800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1372.196f, -289.9348f, 31.152320f, -2.42600300f }, { 0.f, 0.f, -0.936671300f, 0.350209800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1371.920f, -290.8368f, 31.530460f, 2.75761300f }, { 0.f, 0.f, 0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1371.920f, -290.8368f, 31.530460f, 2.75761300f }, { 0.f, 0.f, 0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1371.326f, -291.3288f, 31.135190f, 2.93213900f }, { 0.f, 0.f, 0.994521100f, 0.104535500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1371.326f, -291.3288f, 31.135190f, 2.93213900f }, { 0.f, 0.f, 0.994521100f, 0.104535500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1371.176f, -290.0876f, 31.121620f, -1.39626200f }, { 0.f, 0.f, -0.642787000f, 0.766045000f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1371.176f, -290.0876f, 31.121620f, -1.39626200f }, { 0.f, 0.f, -0.642787000f, 0.766045000f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1382.045f, 200.5125f, 32.033390f, 1.79768900f }, { 0.f, 0.f, 0.782608000f, 0.622514800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1382.045f, 200.5125f, 32.033390f, 1.79768900f }, { 0.f, 0.f, 0.782608000f, 0.622514800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1381.306f, 199.4538f, 32.034190f, 0.69813150f }, { 0.f, 0.f, 0.342020000f, 0.939692700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1381.306f, 199.4538f, 32.034190f, 0.69813150f }, { 0.f, 0.f, 0.342020000f, 0.939692700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1353.159f, -302.8067f, 30.930050f, -2.51327400f }, { 0.f, 0.f, -0.951056500f, 0.309017100f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1353.159f, -302.8067f, 30.930050f, -2.51327400f }, { 0.f, 0.f, -0.951056500f, 0.309017100f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1352.843f, -301.2199f, 30.915410f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1352.843f, -301.2199f, 30.915410f, 1.57079600f }, { 0.f, 0.f, 0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1371.751f, 193.4837f, 31.720350f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1371.751f, 193.4837f, 31.720350f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1352.459f, -299.6279f, 30.915560f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1352.459f, -299.6279f, 30.915560f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1351.841f, -302.0706f, 30.931220f, 1.76278200f }, { 0.f, 0.f, 0.771624600f, 0.636078200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1351.841f, -302.0706f, 30.931220f, 1.76278200f }, { 0.f, 0.f, 0.771624600f, 0.636078200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1351.704f, -300.4751f, 30.932540f, 2.91469000f }, { 0.f, 0.f, 0.993571300f, 0.113208400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1351.704f, -300.4751f, 30.932540f, 2.91469000f }, { 0.f, 0.f, 0.993571300f, 0.113208400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1370.981f, 192.5591f, 31.799300f, 0.29670520f }, { 0.f, 0.f, 0.147809000f, 0.989015900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1370.981f, 192.5591f, 31.799300f, 0.29670520f }, { 0.f, 0.f, 0.147809000f, 0.989015900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1370.006f, 195.1427f, 31.143620f, -2.75761300f }, { 0.f, 0.f, -0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1370.006f, 195.1427f, 31.143620f, -2.75761300f }, { 0.f, 0.f, -0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1369.612f, 196.4409f, 30.935980f, 1.30899500f }, { 0.f, 0.f, 0.608760800f, 0.793353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1369.612f, 196.4409f, 30.935980f, 1.30899500f }, { 0.f, 0.f, 0.608760800f, 0.793353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1369.476f, 195.7031f, 31.492370f, -1.09955600f }, { 0.f, 0.f, -0.522498100f, 0.852640500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1369.476f, 195.7031f, 31.492370f, -1.09955600f }, { 0.f, 0.f, -0.522498100f, 0.852640500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1369.083f, 195.1528f, 31.142340f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1369.083f, 195.1528f, 31.142340f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1368.804f, 196.1701f, 30.938080f, 0.71558490f }, { 0.f, 0.f, 0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1368.804f, 196.1701f, 30.938080f, 0.71558490f }, { 0.f, 0.f, 0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1340.334f, -304.7630f, 30.942910f, 1.83259500f }, { 0.f, 0.f, 0.793353100f, 0.608761700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1340.334f, -304.7630f, 30.942910f, 1.83259500f }, { 0.f, 0.f, 0.793353100f, 0.608761700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1339.189f, -303.4526f, 30.907960f, 1.11700900f }, { 0.f, 0.f, 0.529918700f, 0.848048400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1339.189f, -303.4526f, 30.907960f, 1.11700900f }, { 0.f, 0.f, 0.529918700f, 0.848048400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1338.510f, -301.9457f, 30.927130f, 0.90757020f }, { 0.f, 0.f, 0.438370700f, 0.898794200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1338.510f, -301.9457f, 30.927130f, 0.90757020f }, { 0.f, 0.f, 0.438370700f, 0.898794200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1334.250f, 208.2742f, 31.053120f, -3.07176600f }, { 0.f, 0.f, -0.999390600f, 0.034906130f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1334.250f, 208.2742f, 31.053120f, -3.07176600f }, { 0.f, 0.f, -0.999390600f, 0.034906130f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1334.229f, 207.2549f, 31.053120f, 0.22689250f }, { 0.f, 0.f, 0.113203000f, 0.993571900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1334.229f, 207.2549f, 31.053120f, 0.22689250f }, { 0.f, 0.f, 0.113203000f, 0.993571900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1333.595f, 207.9688f, 31.458410f, -0.64577170f }, { 0.f, 0.f, -0.317304600f, 0.948323700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1333.595f, 207.9688f, 31.458410f, -0.64577170f }, { 0.f, 0.f, -0.317304600f, 0.948323700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1333.193f, 208.6858f, 31.053120f, 1.13446300f }, { 0.f, 0.f, 0.537299200f, 0.843391700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1333.193f, 208.6858f, 31.053120f, 1.13446300f }, { 0.f, 0.f, 0.537299200f, 0.843391700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1332.903f, 207.6994f, 31.053120f, 0.89011660f }, { 0.f, 0.f, 0.430510500f, 0.902585600f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1332.903f, 207.6994f, 31.053120f, 0.89011660f }, { 0.f, 0.f, 0.430510500f, 0.902585600f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1100.564f, -7.964518f, 70.838610f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1100.564f, -7.964518f, 70.838610f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1099.795f, -8.889866f, 70.961130f, 0.29670520f }, { 0.f, 0.f, 0.147809000f, 0.989015900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1099.795f, -8.889866f, 70.961130f, 0.29670520f }, { 0.f, 0.f, 0.147809000f, 0.989015900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1099.309f, -8.017903f, 70.861790f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1099.309f, -8.017903f, 70.861790f, -1.34390100f }, { 0.f, 0.f, -0.622513800f, 0.782608800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1098.540f, -8.943251f, 70.929660f, 0.29670520f }, { 0.f, 0.f, 0.147809000f, 0.989015900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1098.540f, -8.943251f, 70.929660f, 0.29670520f }, { 0.f, 0.f, 0.147809000f, 0.989015900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1097.939f, -0.858181f, 70.290220f, -2.75761300f }, { 0.f, 0.f, -0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1097.939f, -0.858181f, 70.290220f, -2.75761300f }, { 0.f, 0.f, -0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1097.564f, -6.359918f, 70.726010f, -2.75761300f }, { 0.f, 0.f, -0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1097.564f, -6.359918f, 70.726010f, -2.75761300f }, { 0.f, 0.f, -0.981626500f, 0.190812400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1097.547f, 0.440430f, 70.551630f, 1.30899500f }, { 0.f, 0.f, 0.608760800f, 0.793353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1097.547f, 0.440430f, 70.551630f, 1.30899500f }, { 0.f, 0.f, 0.608760800f, 0.793353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1097.410f, -0.296875f, 70.756130f, -1.09955600f }, { 0.f, 0.f, -0.522498100f, 0.852640500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1097.410f, -0.296875f, 70.756130f, -1.09955600f }, { 0.f, 0.f, -0.522498100f, 0.852640500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1097.172f, -5.061306f, 70.657330f, 1.30899500f }, { 0.f, 0.f, 0.608760800f, 0.793353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1097.172f, -5.061306f, 70.657330f, 1.30899500f }, { 0.f, 0.f, 0.608760800f, 0.793353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1097.035f, -5.798611f, 71.164210f, -1.09955600f }, { 0.f, 0.f, -0.522498100f, 0.852640500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1097.035f, -5.798611f, 71.164210f, -1.09955600f }, { 0.f, 0.f, -0.522498100f, 0.852640500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1096.616f, -0.741862f, 70.329960f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1096.616f, -0.741862f, 70.329960f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1096.241f, -6.243598f, 70.740530f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1096.241f, -6.243598f, 70.740530f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1096.040f, 0.777235f, 70.260410f, 0.71558490f }, { 0.f, 0.f, 0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1096.040f, 0.777235f, 70.260410f, 0.71558490f }, { 0.f, 0.f, 0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 1095.665f, -4.724501f, 70.682970f, 0.71558490f }, { 0.f, 0.f, 0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 1095.665f, -4.724501f, 70.682970f, 0.71558490f }, { 0.f, 0.f, 0.350207300f, 0.936672200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 984.1200f, 7.510851f, 86.884260f, -1.32644800f }, { 0.f, 0.f, -0.615660700f, 0.788011400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 984.1200f, 7.510851f, 86.884260f, -1.32644800f }, { 0.f, 0.f, -0.615660700f, 0.788011400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 983.7570f, 6.909722f, 86.871500f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 983.7570f, 6.909722f, 86.871500f, -1.57079600f }, { 0.f, 0.f, -0.707106600f, 0.707106900f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 983.1875f, 7.192708f, 87.170010f, 1.98967200f }, { 0.f, 0.f, 0.838669800f, 0.544640200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 983.1875f, 7.192708f, 87.170010f, 1.98967200f }, { 0.f, 0.f, 0.838669800f, 0.544640200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 983.1600f, 8.073622f, 86.890840f, -0.92502390f }, { 0.f, 0.f, -0.446197500f, 0.894934500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 983.1600f, 8.073622f, 86.890840f, -0.92502390f }, { 0.f, 0.f, -0.446197500f, 0.894934500f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 983.1038f, 6.336968f, 86.857640f, -1.50098300f }, { 0.f, 0.f, -0.681998300f, 0.731353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 983.1038f, 6.336968f, 86.857640f, -1.50098300f }, { 0.f, 0.f, -0.681998300f, 0.731353800f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 982.3564f, 7.541721f, 86.876340f, -2.63544400f }, { 0.f, 0.f, -0.968147300f, 0.250381400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 982.3564f, 7.541721f, 86.876340f, -2.63544400f }, { 0.f, 0.f, -0.968147300f, 0.250381400f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 980.4064f, 3.431749f, 86.792310f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 980.4064f, 3.431749f, 86.792310f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 979.5364f, 4.822917f, 86.814440f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 979.5364f, 4.822917f, 86.814440f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 979.0226f, 3.528320f, 86.790890f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 979.0226f, 3.528320f, 86.790890f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 978.9601f, 4.175347f, 87.132060f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 978.9601f, 4.175347f, 87.132060f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 978.5243f, 4.972222f, 86.818240f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 978.5243f, 4.972222f, 86.818240f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 978.3871f, 3.937500f, 86.801080f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 978.3871f, 3.937500f, 86.801080f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 973.1193f, 5.394423f, 86.890010f, -3.10665200f }, { 0.f, 0.f, -0.999847400f, 0.017469280f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 973.1193f, 5.394423f, 86.890010f, -3.10665200f }, { 0.f, 0.f, -0.999847400f, 0.017469280f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 972.6932f, 3.933757f, 86.871550f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 972.6932f, 3.933757f, 86.871550f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 971.8299f, 5.217014f, 86.916530f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 971.8299f, 5.217014f, 86.916530f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 971.6641f, 2.423177f, 86.873140f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 971.6641f, 2.423177f, 86.873140f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 971.2458f, 4.677463f, 86.919960f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 971.2458f, 4.677463f, 86.919960f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 969.7603f, 1.590603f, 86.928840f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 969.7603f, 1.590603f, 86.928840f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 969.6072f, 4.697157f, 87.010640f, -3.10665200f }, { 0.f, 0.f, -0.999847400f, 0.017469280f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 969.6072f, 4.697157f, 87.010640f, -3.10665200f }, { 0.f, 0.f, -0.999847400f, 0.017469280f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 969.0047f, 3.825195f, 87.013220f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 969.0047f, 3.825195f, 87.013220f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 968.8577f, 4.553820f, 87.482830f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 968.8577f, 4.553820f, 87.482830f, -0.54105060f }, { 0.f, 0.f, -0.267237700f, 0.963630700f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 968.3743f, 5.152669f, 87.101040f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 968.3743f, 5.152669f, 87.101040f, -0.27925160f }, { 0.f, 0.f, -0.139172600f, 0.990268200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_A, { 967.7339f, 3.980143f, 87.090860f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY }, + { GO_SEAFORIUM_BOMB_H, { 967.7339f, 3.980143f, 87.090860f, 0.24434560f }, { 0.f, 0.f, 0.121869100f, 0.992546200f }, RESPAWN_ONE_DAY } +}; + +uint32 const BG_SA_Factions[BG_TEAMS_COUNT] = +{ + 1732, + 1735, +}; + +uint32 const BG_SA_GYEntries[BG_SA_MAX_GY] = +{ + 1350, + 1349, + 1347, + 1346, + 1348, +}; + +float const BG_SA_GYOrientation[BG_SA_MAX_GY] = +{ + 6.202f, + 1.926f, // right capturable GY + 3.917f, // left capturable GY + 3.104f, // center, capturable + 6.148f, // defender last GY +}; + +GateInfo const BG_SA_GateInfo[BG_SA_MAX_GATES] = +{ + { BG_SA_GREEN_GATE, BG_SA_BLUE_GATE, GO_GATE_OF_THE_GREEN_EMERALD, BG_SA_GREEN_GATEWS, TEXT_GREEN_GATE_UNDER_ATTACK, TEXT_GREEN_GATE_DESTROYED }, + { BG_SA_YELLOW_GATE, 0, GO_GATE_OF_THE_YELLOW_MOON, BG_SA_YELLOW_GATEWS, TEXT_YELLOW_GATE_UNDER_ATTACK, TEXT_YELLOW_GATE_DESTROYED }, + { BG_SA_BLUE_GATE, BG_SA_GREEN_GATE, GO_GATE_OF_THE_BLUE_SAPPHIRE, BG_SA_BLUE_GATEWS, TEXT_BLUE_GATE_UNDER_ATTACK, TEXT_BLUE_GATE_DESTROYED }, + { BG_SA_RED_GATE, BG_SA_PURPLE_GATE, GO_GATE_OF_THE_RED_SUN, BG_SA_RED_GATEWS, TEXT_RED_GATE_UNDER_ATTACK, TEXT_RED_GATE_DESTROYED }, + { BG_SA_PURPLE_GATE, BG_SA_RED_GATE, GO_GATE_OF_THE_PURPLE_AMETHYST, BG_SA_PURPLE_GATEWS, TEXT_PURPLE_GATE_UNDER_ATTACK, TEXT_PURPLE_GATE_DESTROYED }, + { BG_SA_ANCIENT_GATE, 0, GO_CHAMBER_OF_ANCIENT_RELICS, BG_SA_ANCIENT_GATEWS, TEXT_ANCIENT_GATE_UNDER_ATTACK, TEXT_ANCIENT_GATE_DESTROYED } +}; + BattlegroundSA::BattlegroundSA() { StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_SA_START_TWO_MINUTES; @@ -31,8 +340,9 @@ BattlegroundSA::BattlegroundSA() StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_SA_START_HALF_MINUTE; StartMessageIds[BG_STARTING_EVENT_FOURTH] = 0; - BgObjects.resize(BG_SA_MAXOBJ); - BgCreatures.resize(BG_SA_MAXNPC + BG_SA_MAX_GY); + SetGameObjectsNumber(BG_SA_MAXOBJ + BG_SA_MAX_SHIPS_PER_TEAM); + SetCreaturesNumber(BG_SA_MAXNPC + BG_SA_MAX_GY); + TimerEnabled = false; UpdateWaitTimer = 0; SignaledRoundTwo = false; @@ -45,20 +355,21 @@ BattlegroundSA::BattlegroundSA() ShipsStarted = false; Status = BG_SA_NOT_STARTED; - for (uint8 i = 0; i < MAX_GATES; ++i) + for (uint8 i = 0; i < BG_SA_MAX_GATES; ++i) GateStatus[i] = BG_SA_GATE_OK; - for (uint8 i = 0; i < 2; i++) + for (uint8 i = 0; i < 2; ++i) { RoundScores[i].winner = TEAM_ALLIANCE; RoundScores[i].time = 0; _allVehiclesAlive[i] = true; } - //! This is here to prevent an uninitialised variable warning - //! The warning only occurs when SetUpBattleGround fails though. - //! In the future this function should be called BEFORE sending initial worldstates. - memset(&GraveyardStatus, 0, sizeof(GraveyardStatus)); + for (uint32 i = 0; i < BG_SA_DEMOLISHER_AMOUNT; ++i) + DemolisherRespawnTimes[i] = 0; + + for (uint32 i = 0; i < BG_SA_MAX_GY; ++i) + GraveyardStatus[i] = TEAM_ALLIANCE; } BattlegroundSA::~BattlegroundSA() { } @@ -87,105 +398,145 @@ bool BattlegroundSA::ResetObjs() if (Player* player = ObjectAccessor::FindPlayer(itr->first)) SendTransportsRemove(player); - uint32 atF = BG_SA_Factions[Attackers]; - uint32 defF = BG_SA_Factions[Attackers ? TEAM_ALLIANCE : TEAM_HORDE]; + TeamId Defenders = Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE; + + for (uint32 i = 0; i < BG_SA_MAXOBJ; ++i) + SpawnBGObject(i, RESPAWN_ONE_DAY); - for (uint8 i = 0; i < BG_SA_MAXOBJ; i++) + for (uint32 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; ++i) DelObject(i); - for (uint8 i = 0; i < BG_SA_MAXNPC; i++) - DelCreature(i); + for (uint32 i = 0; i < BG_SA_MAXNPC + BG_SA_MAX_GY; ++i) + { + // Demos at the workshops do not despawn when the second offensive team attacks, + // allowing the second team to grab extra demos before attempting to cap either the East or West graveyards. + if (i >= BG_SA_DEMOLISHER_5 && i <= BG_SA_DEMOLISHER_8) + { + if (Creature* demo = GetBGCreature(i, false)) + { + demo->setFaction(BG_SA_Factions[Attackers]); + demo->Relocate(BG_SA_Creatures[i].Pos); + demo->Respawn(true); + } + continue; + } - for (uint8 i = BG_SA_MAXNPC; i < BG_SA_MAXNPC + BG_SA_MAX_GY; i++) DelCreature(i); + } - for (uint8 i = 0; i < MAX_GATES; ++i) + for (uint32 i = 0; i < BG_SA_MAX_GATES; ++i) + { GateStatus[i] = BG_SA_GATE_OK; + if (GameObject* gate = GetBGObject(i, false)) + gate->SetDestructibleState(GO_DESTRUCTIBLE_INTACT, nullptr, true); + } - if (!AddCreature(BG_SA_NpcEntries[BG_SA_NPC_KANRETHAD], BG_SA_NPC_KANRETHAD, BG_SA_NpcSpawnlocs[BG_SA_NPC_KANRETHAD])) + BattlegroundSpawnPoint const& kanrethad = BG_SA_Creatures[BG_SA_NPC_KANRETHAD]; + if (!AddCreature(kanrethad.Entry, BG_SA_NPC_KANRETHAD, kanrethad.Pos, kanrethad.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Kanrethad, aborted. Entry: %u", BG_SA_NpcEntries[BG_SA_NPC_KANRETHAD]); + TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Kanrethad, aborted. Entry: %u", kanrethad.Entry); return false; } - for (uint8 i = 0; i <= BG_SA_PORTAL_DEFFENDER_RED; i++) + for (uint32 i = 0; i < BG_SA_MAXOBJ; ++i) { - if (!AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) + BattlegroundGOSpawnPoint const& object = BG_SA_Objects[i]; + if (GetBGObject(i, false)) + SpawnBGObject(i, object.SpawnTime); + else if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn BG_SA_PORTAL_DEFFENDER_RED, Entry: %u", BG_SA_ObjEntries[i]); - continue; + TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn GameObject! (Entry: %u). Aborted.", object.Entry); + return false; } } - for (uint8 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) + for (uint32 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; ++i) { - uint32 boatid = 0; + uint32 boatId = 0; switch (i) { case BG_SA_BOAT_ONE: - boatid = Attackers ? BG_SA_BOAT_ONE_H : BG_SA_BOAT_ONE_A; + boatId = Attackers == TEAM_HORDE ? BG_SA_BOAT_ONE_H : BG_SA_BOAT_ONE_A; break; case BG_SA_BOAT_TWO: - boatid = Attackers ? BG_SA_BOAT_TWO_H : BG_SA_BOAT_TWO_A; + boatId = Attackers == TEAM_HORDE ? BG_SA_BOAT_TWO_H : BG_SA_BOAT_TWO_A; break; default: break; } - if (!AddObject(i, boatid, BG_SA_ObjSpawnlocs[i].GetPositionX(), - BG_SA_ObjSpawnlocs[i].GetPositionY(), - BG_SA_ObjSpawnlocs[i].GetPositionZ() + (Attackers ? -3.750f: 0), - BG_SA_ObjSpawnlocs[i].GetOrientation(), 0, 0, 0, 0, RESPAWN_ONE_DAY)) + + BattlegroundGOSpawnPoint const& boat = BG_SA_Ships[boatId - BG_SA_BOAT_ONE_A]; + GameObject* ship = AddObject(i, boat.Entry, boat.Pos, boat.Rot, boat.SpawnTime); + if (!ship) { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn one of the BG_SA_BOAT, Entry: %u", boatid); - continue; + TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn ship! (Entry: %u). Aborted.", boatId); + return false; } + + ship->SetParentRotation(shipParentRotation); + SpawnBGObject(i, RESPAWN_IMMEDIATELY); } - for (uint8 i = BG_SA_SIGIL_1; i <= BG_SA_LEFT_FLAGPOLE; i++) + // Cannons and demolishers - NPCs are spawned + // By capturing GYs. + for (uint32 i = 0; i <= BG_SA_DEMOLISHER_4; ++i) { - if (!AddObject(i, BG_SA_ObjEntries[i], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) + BattlegroundSpawnPoint const& creature = BG_SA_Creatures[i]; + if (!AddCreature(creature.Entry, i, creature.Pos, creature.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Sigil, Entry: %u", BG_SA_ObjEntries[i]); - continue; + TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Cannon or demolisher! (Entry: %u, Attackers: %s). Aborted.", creature.Entry, Attackers == TEAM_ALLIANCE ? "Horde(1)" : "Alliance(0)"); + return false; } } - // MAD props for Kiper for discovering those values - 4 hours of his work. - GetBGObject(BG_SA_BOAT_ONE)->SetParentRotation(G3D::Quat(0.f, 0.f, 1.0f, 0.0002f)); - GetBGObject(BG_SA_BOAT_TWO)->SetParentRotation(G3D::Quat(0.f, 0.f, 1.0f, 0.00001f)); - SpawnBGObject(BG_SA_BOAT_ONE, RESPAWN_IMMEDIATELY); - SpawnBGObject(BG_SA_BOAT_TWO, RESPAWN_IMMEDIATELY); + OverrideGunFaction(); + DemolisherStartState(true); + + // spawn gates and sigils + for (uint32 i = BG_SA_GREEN_GATE; i <= BG_SA_ANCIENT_GATE; ++i) + SpawnBGObject(i, RESPAWN_IMMEDIATELY); + + for (uint32 i = BG_SA_GREEN_SIGIL; i <= BG_SA_PURPLE_SIGIL; ++i) + SpawnBGObject(i, RESPAWN_IMMEDIATELY); - //Cannons and demolishers - NPCs are spawned - //By capturing GYs. - for (uint8 i = 0; i < BG_SA_DEMOLISHER_5; i++) + for (uint32 i = BG_SA_TELEPORT_TRIGGER_GREEN; i <= BG_SA_TELEPORT_TRIGGER_PURPLE; ++i) { - if (!AddCreature(BG_SA_NpcEntries[i], i, BG_SA_NpcSpawnlocs[i], Attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE, 600)) + BattlegroundSpawnPoint const& trigger = BG_SA_Creatures[i]; + if (!AddCreature(trigger.Entry, i, trigger.Pos, trigger.SpawnTime)) { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Cannon or demolisher, Entry: %u, Attackers: %s", BG_SA_NpcEntries[i], Attackers == TEAM_ALLIANCE ? "Horde(1)" : "Alliance(0)"); - continue; + TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn trigger! (Entry: %u). Aborted.", trigger.Entry); + return false; } } - OverrideGunFaction(); - DemolisherStartState(true); + SpawnBGObject(BG_SA_TITAN_RELIC_A + Attackers, RESPAWN_IMMEDIATELY); // 0 alliance, 1 horde - for (uint8 i = 0; i <= BG_SA_PORTAL_DEFFENDER_RED; i++) - { + // spawn graveyard flags + for (uint32 i = BG_SA_CENTRAL_FLAGPOLE; i <= BG_SA_LEFT_FLAGPOLE; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); - GetBGObject(i)->SetFaction(defF); - } - GetBGObject(BG_SA_TITAN_RELIC)->SetFaction(atF); - GetBGObject(BG_SA_TITAN_RELIC)->Refresh(); + for (uint32 i = BG_SA_CENTRAL_FLAG_A; i <= BG_SA_LEFT_FLAG_A; i += BG_TEAMS_COUNT) + SpawnBGObject(i + Defenders, RESPAWN_IMMEDIATELY); + + // spawn defender team portals + for (uint32 i = BG_SA_PORTAL_DEFENDER_BLUE_A; i <= BG_SA_PORTAL_DEFENDER_RED_A; i += BG_TEAMS_COUNT) + SpawnBGObject(i + Defenders, RESPAWN_IMMEDIATELY); + + UpdateObjectInteractionFlags(); + + // spawn bombs + for (uint32 i = BG_SA_BOMB_A_1; i <= BG_SA_BOMB_A_91; i += BG_TEAMS_COUNT) + SpawnBGObject(i + Attackers, RESPAWN_IMMEDIATELY); + + UpdateBombInteractionFlags(); TotalTime = 0; ShipsStarted = false; //Graveyards - for (uint8 i = 0; i < BG_SA_MAX_GY; i++) + for (uint32 i = 0; i < BG_SA_MAX_GY; ++i) { - WorldSafeLocsEntry const* sg = NULL; + WorldSafeLocsEntry const* sg = nullptr; sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); if (!sg) @@ -194,40 +545,16 @@ bool BattlegroundSA::ResetObjs() return false; } + TeamId graveyardTeam = Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE; if (i == BG_SA_BEACH_GY) - { - GraveyardStatus[i] = Attackers; - AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], Attackers); - } - else - { - GraveyardStatus[i] = ((Attackers == TEAM_HORDE)? TEAM_ALLIANCE : TEAM_HORDE); - if (!AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE)) - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn GY: %u", i); - } - } + graveyardTeam = Attackers; - //GY capture points - for (uint8 i = BG_SA_CENTRAL_FLAG; i <= BG_SA_LEFT_FLAG; i++) - { - if (!AddObject(i, (BG_SA_ObjEntries[i] - (Attackers == TEAM_ALLIANCE ? 1 : 0)), BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) + GraveyardStatus[i] = graveyardTeam; + if (!AddSpiritGuide(i + BG_SA_MAXNPC, Position(sg->x, sg->y, sg->z, BG_SA_GYOrientation[i]), graveyardTeam)) { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn Central Flag Entry: %u", BG_SA_ObjEntries[i] - (Attackers == TEAM_ALLIANCE ? 1 : 0)); - continue; - } - GetBGObject(i)->SetFaction(atF); - } - - UpdateObjectInteractionFlags(); - - for (uint8 i = BG_SA_BOMB; i < BG_SA_MAXOBJ; i++) - { - if (!AddObject(i, BG_SA_ObjEntries[BG_SA_BOMB], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) - { - TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn SA Bomb Entry: %u", BG_SA_ObjEntries[BG_SA_BOMB] + i); - continue; + TC_LOG_ERROR("bg.battleground", "SOTA: couldn't spawn GY: %u", i); + return false; } - GetBGObject(i)->SetFaction(atF); } //Player may enter BEFORE we set up BG - lets update his worldstates anyway... @@ -273,7 +600,7 @@ bool BattlegroundSA::ResetObjs() UpdateWorldState(BG_SA_YELLOW_GATEWS, 1); UpdateWorldState(BG_SA_ANCIENT_GATEWS, 1); - for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) + for (uint32 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; ++i) for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(itr->first)) SendTransportInit(player); @@ -290,24 +617,34 @@ void BattlegroundSA::StartShips() if (ShipsStarted) return; + ShipsStarted = true; + DoorOpen(BG_SA_BOAT_ONE); DoorOpen(BG_SA_BOAT_TWO); - for (int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) + for (uint32 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; ++i) { - for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + if (GameObject* boat = GetBGObject(i, false)) { - if (Player* p = ObjectAccessor::FindPlayer(itr->first)) + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) { + Player* player = ObjectAccessor::FindPlayer(itr->first); + if (!player) + continue; + UpdateData data; + boat->BuildValuesUpdateBlockForPlayer(&data, player); + + // do not send if empty + if (!data.HasData()) + continue; + WorldPacket pkt; - GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, p); data.BuildPacket(&pkt); - p->SendDirectMessage(&pkt); + player->SendDirectMessage(&pkt); } } } - ShipsStarted = true; } void BattlegroundSA::PostUpdateImpl(uint32 diff) @@ -343,6 +680,7 @@ void BattlegroundSA::PostUpdateImpl(uint32 diff) ToggleTimer(); DemolisherStartState(false); Status = BG_SA_ROUND_ONE; + UpdateBombInteractionFlags(); StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702); } if (TotalTime >= BG_SA_BOAT_START) @@ -351,7 +689,7 @@ void BattlegroundSA::PostUpdateImpl(uint32 diff) } else if (Status == BG_SA_SECOND_WARMUP) { - if (RoundScores[0].timeTeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); } -void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker /*= NULL*/) +void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker /*= nullptr*/) { if (GameObject* go = obj->ToGameObject()) { @@ -573,8 +913,16 @@ void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* GateStatus[gate->GateId] = BG_SA_GATE_DESTROYED; _gateDestroyed = true; - if (gateId < 5) - DelObject(gateId + 14); + // hide sigil + if (gateId < BG_SA_ANCIENT_GATE) + SpawnBGObject(gateId - BG_SA_GREEN_GATE + BG_SA_GREEN_SIGIL, RESPAWN_ONE_DAY); + + // if this is not yellow (last) door destroy associated teleport triggers in this door "tier" + if (gateId != BG_SA_YELLOW_GATE) + { + DelCreature(gateId - BG_SA_GREEN_GATE + BG_SA_TELEPORT_TRIGGER_GREEN); + DelCreature(gate->LinkedGateId - BG_SA_GREEN_GATE + BG_SA_TELEPORT_TRIGGER_GREEN); + } if (Creature* c = obj->FindNearestCreature(NPC_WORLD_TRIGGER, 500.0f)) SendChatMessage(c, gate->DestroyedText, invoker); @@ -647,16 +995,16 @@ void BattlegroundSA::HandleKillUnit(Creature* creature, Player* killer) */ void BattlegroundSA::OverrideGunFaction() { - if (!BgCreatures[0]) + if (!GetBGCreature(BG_SA_GUN_1, false)) return; - for (uint8 i = BG_SA_GUN_1; i <= BG_SA_GUN_10; i++) + for (uint32 i = BG_SA_GUN_1; i <= BG_SA_GUN_10; ++i) { if (Creature* gun = GetBGCreature(i)) - gun->setFaction(BG_SA_Factions[Attackers ? TEAM_ALLIANCE : TEAM_HORDE]); + gun->setFaction(BG_SA_Factions[Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE]); } - for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; i++) + for (uint32 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; ++i) { if (Creature* dem = GetBGCreature(i)) dem->setFaction(BG_SA_Factions[Attackers]); @@ -665,11 +1013,11 @@ void BattlegroundSA::OverrideGunFaction() void BattlegroundSA::DemolisherStartState(bool start) { - if (!BgCreatures[0]) + if (!GetBGCreature(BG_SA_GUN_1, false)) return; // set flags only for the demolishers on the beach, factory ones dont need it - for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; i++) + for (uint32 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; ++i) { if (Creature* dem = GetBGCreature(i)) { @@ -681,9 +1029,7 @@ void BattlegroundSA::DemolisherStartState(bool start) } } -void BattlegroundSA::DestroyGate(Player* /*player*/, GameObject* /*go*/) -{ -} +void BattlegroundSA::DestroyGate(Player* /*player*/, GameObject* /*go*/) { } WorldSafeLocsEntry const* BattlegroundSA::GetClosestGraveYard(Player* player) { @@ -701,14 +1047,16 @@ WorldSafeLocsEntry const* BattlegroundSA::GetClosestGraveYard(Player* player) safeloc = BG_SA_GYEntries[BG_SA_DEFENDER_LAST_GY]; closest = sWorldSafeLocsStore.LookupEntry(safeloc); + ASSERT(closest); nearest = player->GetExactDistSq(closest->x, closest->y, closest->z); - for (uint8 i = BG_SA_RIGHT_CAPTURABLE_GY; i < BG_SA_MAX_GY; i++) + for (uint32 i = BG_SA_RIGHT_CAPTURABLE_GY; i < BG_SA_MAX_GY; ++i) { if (GraveyardStatus[i] != player->GetTeamId()) continue; ret = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + ASSERT(ret); dist = player->GetExactDistSq(ret->x, ret->y, ret->z); if (dist < nearest) { @@ -723,25 +1071,29 @@ WorldSafeLocsEntry const* BattlegroundSA::GetClosestGraveYard(Player* player) void BattlegroundSA::SendTime() { uint32 end_of_round = (EndRoundTimer - TotalTime); - UpdateWorldState(BG_SA_TIMER_MINS, end_of_round/60000); - UpdateWorldState(BG_SA_TIMER_SEC_TENS, (end_of_round%60000)/10000); - UpdateWorldState(BG_SA_TIMER_SEC_DECS, ((end_of_round%60000)%10000)/1000); + UpdateWorldState(BG_SA_TIMER_MINS, end_of_round / 60000); + UpdateWorldState(BG_SA_TIMER_SEC_TENS, (end_of_round % 60000) / 10000); + UpdateWorldState(BG_SA_TIMER_SEC_DECS, ((end_of_round % 60000) % 10000) / 1000); } bool BattlegroundSA::CanInteractWithObject(uint32 objectId) { switch (objectId) { - case BG_SA_TITAN_RELIC: + case BG_SA_TITAN_RELIC_A: + case BG_SA_TITAN_RELIC_H: if (GateStatus[BG_SA_ANCIENT_GATE] != BG_SA_GATE_DESTROYED || GateStatus[BG_SA_YELLOW_GATE] != BG_SA_GATE_DESTROYED) return false; // no break - case BG_SA_CENTRAL_FLAG: + case BG_SA_CENTRAL_FLAG_A: + case BG_SA_CENTRAL_FLAG_H: if (GateStatus[BG_SA_RED_GATE] != BG_SA_GATE_DESTROYED && GateStatus[BG_SA_PURPLE_GATE] != BG_SA_GATE_DESTROYED) return false; // no break - case BG_SA_LEFT_FLAG: - case BG_SA_RIGHT_FLAG: + case BG_SA_LEFT_FLAG_A: + case BG_SA_LEFT_FLAG_H: + case BG_SA_RIGHT_FLAG_A: + case BG_SA_RIGHT_FLAG_H: if (GateStatus[BG_SA_GREEN_GATE] != BG_SA_GATE_DESTROYED && GateStatus[BG_SA_BLUE_GATE] != BG_SA_GATE_DESTROYED) return false; break; @@ -757,6 +1109,23 @@ void BattlegroundSA::UpdateObjectInteractionFlags(uint32 objectId) { if (GameObject* go = GetBGObject(objectId)) { + if (objectId >= BG_SA_BOMB_A_1 && objectId <= BG_SA_BOMB_H_91) + { + switch (Status) + { + case BG_SA_NOT_STARTED: + case BG_SA_WARMUP: + case BG_SA_SECOND_WARMUP: + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + default: + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + } + + return; + } + if (CanInteractWithObject(objectId)) go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); else @@ -766,28 +1135,37 @@ void BattlegroundSA::UpdateObjectInteractionFlags(uint32 objectId) void BattlegroundSA::UpdateObjectInteractionFlags() { - for (uint8 i = BG_SA_CENTRAL_FLAG; i <= BG_SA_LEFT_FLAG; ++i) + TeamId Defenders = Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE; + for (uint32 i = BG_SA_CENTRAL_FLAG_A; i <= BG_SA_LEFT_FLAG_A; i += BG_TEAMS_COUNT) + UpdateObjectInteractionFlags(i + Defenders); + + UpdateObjectInteractionFlags(BG_SA_TITAN_RELIC_A + Attackers); +} + +void BattlegroundSA::UpdateBombInteractionFlags() +{ + for (uint32 i = BG_SA_BOMB_A_1; i <= BG_SA_BOMB_H_91; ++i) UpdateObjectInteractionFlags(i); - UpdateObjectInteractionFlags(BG_SA_TITAN_RELIC); } void BattlegroundSA::EventPlayerClickedOnFlag(Player* source, GameObject* go) { + TeamId Defenders = Attackers == TEAM_HORDE ? TEAM_ALLIANCE : TEAM_HORDE; switch (go->GetEntry()) { - case 191307: - case 191308: - if (CanInteractWithObject(BG_SA_LEFT_FLAG)) + case GO_ALLIANCE_BANNER_LEFT: + case GO_HORDE_BANNER_LEFT: + if (CanInteractWithObject(BG_SA_LEFT_FLAG_A + Defenders)) CaptureGraveyard(BG_SA_LEFT_CAPTURABLE_GY, source); break; - case 191305: - case 191306: - if (CanInteractWithObject(BG_SA_RIGHT_FLAG)) + case GO_ALLIANCE_BANNER_RIGHT: + case GO_HORDE_BANNER_RIGHT: + if (CanInteractWithObject(BG_SA_RIGHT_FLAG_A + Defenders)) CaptureGraveyard(BG_SA_RIGHT_CAPTURABLE_GY, source); break; - case 191310: - case 191309: - if (CanInteractWithObject(BG_SA_CENTRAL_FLAG)) + case GO_ALLIANCE_BANNER_CENTER: + case GO_HORDE_BANNER_CENTER: + if (CanInteractWithObject(BG_SA_CENTRAL_FLAG_A + Defenders)) CaptureGraveyard(BG_SA_CENTRAL_CAPTURABLE_GY, source); break; default: @@ -809,28 +1187,21 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) return; } - AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], GraveyardStatus[i]); + AddSpiritGuide(i + BG_SA_MAXNPC, Position(sg->x, sg->y, sg->z, BG_SA_GYOrientation[i]), GraveyardStatus[i]); uint32 npc = 0; uint32 flag = 0; switch (i) { case BG_SA_LEFT_CAPTURABLE_GY: - flag = BG_SA_LEFT_FLAG; - DelObject(flag); - AddObject(flag, (BG_SA_ObjEntries[flag] - (Source->GetTeamId() == TEAM_ALLIANCE ? 0 : 1)), - BG_SA_ObjSpawnlocs[flag], 0, 0, 0, 0, RESPAWN_ONE_DAY); - + flag = BG_SA_LEFT_FLAG_A; npc = BG_SA_NPC_RIGSPARK; - if (Creature* rigspark = AddCreature(BG_SA_NpcEntries[npc], npc, BG_SA_NpcSpawnlocs[npc], Attackers)) - rigspark->AI()->Talk(TEXT_SPARKLIGHT_RIGSPARK_SPAWN); - for (uint8 j = BG_SA_DEMOLISHER_7; j <= BG_SA_DEMOLISHER_8; j++) + for (uint32 j = BG_SA_DEMOLISHER_7; j <= BG_SA_DEMOLISHER_8; ++j) { - AddCreature(BG_SA_NpcEntries[j], j, BG_SA_NpcSpawnlocs[j], (Attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE), 600); - - if (Creature* dem = GetBGCreature(j)) - dem->setFaction(BG_SA_Factions[Attackers]); + BattlegroundSpawnPoint const& demolisher = BG_SA_Creatures[j]; + if (Creature* demo = AddCreature(demolisher.Entry, j, demolisher.Pos, demolisher.SpawnTime)) + demo->setFaction(BG_SA_Factions[Attackers]); } UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE, GraveyardStatus[i] == TEAM_ALLIANCE); @@ -841,21 +1212,14 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) break; case BG_SA_RIGHT_CAPTURABLE_GY: - flag = BG_SA_RIGHT_FLAG; - DelObject(flag); - AddObject(flag, (BG_SA_ObjEntries[flag] - (Source->GetTeamId() == TEAM_ALLIANCE ? 0 : 1)), - BG_SA_ObjSpawnlocs[flag], 0, 0, 0, 0, RESPAWN_ONE_DAY); - + flag = BG_SA_RIGHT_FLAG_A; npc = BG_SA_NPC_SPARKLIGHT; - if (Creature* sparklight = AddCreature(BG_SA_NpcEntries[npc], npc, BG_SA_NpcSpawnlocs[npc], Attackers)) - sparklight->AI()->Talk(TEXT_SPARKLIGHT_RIGSPARK_SPAWN); - for (uint8 j = BG_SA_DEMOLISHER_5; j <= BG_SA_DEMOLISHER_6; j++) + for (uint32 j = BG_SA_DEMOLISHER_5; j <= BG_SA_DEMOLISHER_6; ++j) { - AddCreature(BG_SA_NpcEntries[j], j, BG_SA_NpcSpawnlocs[j], Attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE, 600); - - if (Creature* dem = GetBGCreature(j)) - dem->setFaction(BG_SA_Factions[Attackers]); + BattlegroundSpawnPoint const& demolisher = BG_SA_Creatures[j]; + if (Creature* demo = AddCreature(demolisher.Entry, j, demolisher.Pos, demolisher.SpawnTime)) + demo->setFaction(BG_SA_Factions[Attackers]); } UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE, GraveyardStatus[i] == TEAM_ALLIANCE); @@ -866,10 +1230,7 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) break; case BG_SA_CENTRAL_CAPTURABLE_GY: - flag = BG_SA_CENTRAL_FLAG; - DelObject(flag); - AddObject(flag, (BG_SA_ObjEntries[flag] - (Source->GetTeamId() == TEAM_ALLIANCE ? 0 : 1)), - BG_SA_ObjSpawnlocs[flag], 0, 0, 0, 0, RESPAWN_ONE_DAY); + flag = BG_SA_CENTRAL_FLAG_A; UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE, GraveyardStatus[i] == TEAM_ALLIANCE); UpdateWorldState(BG_SA_CENTER_GY_HORDE, GraveyardStatus[i] == TEAM_HORDE); @@ -881,7 +1242,19 @@ void BattlegroundSA::CaptureGraveyard(BG_SA_Graveyards i, Player* Source) default: ABORT(); break; - }; + } + + // now swap banners + SpawnBGObject(flag, Source->GetTeamId() == TEAM_ALLIANCE ? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY); + SpawnBGObject(flag + 1, Source->GetTeamId() == TEAM_ALLIANCE ? RESPAWN_ONE_DAY : RESPAWN_IMMEDIATELY); + + // spawn creature if any + if (npc) + { + BattlegroundSpawnPoint const& spawnPoint = BG_SA_Creatures[npc]; + if (Creature* creature = AddCreature(spawnPoint.Entry, npc, spawnPoint.Pos, spawnPoint.SpawnTime)) + creature->AI()->Talk(TEXT_SPARKLIGHT_RIGSPARK_SPAWN); + } } void BattlegroundSA::TitanRelicActivated(Player* clicker) @@ -889,7 +1262,7 @@ void BattlegroundSA::TitanRelicActivated(Player* clicker) if (!clicker) return; - if (CanInteractWithObject(BG_SA_TITAN_RELIC)) + if (CanInteractWithObject(BG_SA_TITAN_RELIC_A + Attackers)) { if (clicker->GetTeamId() == Attackers) { @@ -907,7 +1280,7 @@ void BattlegroundSA::TitanRelicActivated(Player* clicker) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) if (player->GetTeamId() == Attackers) - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_STORM_THE_BEACH_CREDIT); } Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; @@ -937,7 +1310,7 @@ void BattlegroundSA::TitanRelicActivated(Player* clicker) { if (Player* player = ObjectAccessor::FindPlayer(itr->first)) if (player->GetTeamId() == Attackers && RoundScores[1].winner == Attackers) - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_STORM_THE_BEACH_CREDIT); } if (RoundScores[0].time == RoundScores[1].time) @@ -974,27 +1347,22 @@ void BattlegroundSA::EndBattleground(uint32 winner) void BattlegroundSA::UpdateDemolisherSpawns() { - for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_8; i++) + for (uint32 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_8; ++i) { - if (BgCreatures[i]) + if (Creature* Demolisher = GetBGCreature(i, false)) { - if (Creature* Demolisher = GetBGCreature(i)) + if (Demolisher->isDead()) { - if (Demolisher->isDead()) + // Demolisher is not in list + if (!DemolisherRespawnTimes[i]) + DemolisherRespawnTimes[i] = getMSTime() + 30 * IN_MILLISECONDS; + else { - // Demolisher is not in list - if (DemoliserRespawnList.find(i) == DemoliserRespawnList.end()) - { - DemoliserRespawnList[i] = getMSTime()+30000; - } - else + if (DemolisherRespawnTimes[i] < getMSTime()) { - if (DemoliserRespawnList[i] < getMSTime()) - { - Demolisher->Relocate(BG_SA_NpcSpawnlocs[i]); - Demolisher->Respawn(); - DemoliserRespawnList.erase(i); - } + Demolisher->Relocate(BG_SA_Creatures[i].Pos); + Demolisher->Respawn(); + DemolisherRespawnTimes[i] = 0; } } } @@ -1004,32 +1372,34 @@ void BattlegroundSA::UpdateDemolisherSpawns() void BattlegroundSA::SendTransportInit(Player* player) { - if (BgObjects[BG_SA_BOAT_ONE] || BgObjects[BG_SA_BOAT_TWO]) - { - UpdateData transData; - if (BgObjects[BG_SA_BOAT_ONE]) - GetBGObject(BG_SA_BOAT_ONE)->BuildCreateUpdateBlockForPlayer(&transData, player); - if (BgObjects[BG_SA_BOAT_TWO]) - GetBGObject(BG_SA_BOAT_TWO)->BuildCreateUpdateBlockForPlayer(&transData, player); - WorldPacket packet; - transData.BuildPacket(&packet); - player->SendDirectMessage(&packet); - } + UpdateData transData; + for (uint32 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; ++i) + if (GameObject* boat = GetBGObject(i, false)) + boat->BuildCreateUpdateBlockForPlayer(&transData, player); + + // do not send if empty + if (!transData.HasData()) + return; + + WorldPacket packet; + transData.BuildPacket(&packet); + player->SendDirectMessage(&packet); } void BattlegroundSA::SendTransportsRemove(Player* player) { - if (BgObjects[BG_SA_BOAT_ONE] || BgObjects[BG_SA_BOAT_TWO]) - { - UpdateData transData; - if (BgObjects[BG_SA_BOAT_ONE]) - GetBGObject(BG_SA_BOAT_ONE)->BuildOutOfRangeUpdateBlock(&transData); - if (BgObjects[BG_SA_BOAT_TWO]) - GetBGObject(BG_SA_BOAT_TWO)->BuildOutOfRangeUpdateBlock(&transData); - WorldPacket packet; - transData.BuildPacket(&packet); - player->SendDirectMessage(&packet); - } + UpdateData transData; + for (uint32 i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; ++i) + if (GameObject* boat = GetBGObject(i, false)) + boat->BuildOutOfRangeUpdateBlock(&transData); + + // do not send if empty + if (!transData.HasData()) + return; + + WorldPacket packet; + transData.BuildPacket(&packet); + player->SendDirectMessage(&packet); } bool BattlegroundSA::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue) @@ -1061,3 +1431,22 @@ bool BattlegroundSA::IsSpellAllowed(uint32 spellId, Player const* /*player*/) co return true; } + +GateInfo const* BattlegroundSA::GetGate(uint32 entry) +{ + GateInfo const* const begin = &BG_SA_GateInfo[0]; + GateInfo const* const end = &BG_SA_GateInfo[BG_SA_MAX_GATES]; + + GateInfo const* itr = std::find_if(begin, end, [entry](GateInfo const& gateInfo) -> bool + { + if (gateInfo.GameObjectId == entry) + return true; + + return false; + }); + + if (itr == end) + return nullptr; + + return itr; +} diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index b60e04e725ece..bfaf549b36031 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -23,9 +23,6 @@ #include "BattlegroundScore.h" #include "Object.h" -#define BG_SA_FLAG_AMOUNT 3 -#define BG_SA_DEMOLISHER_AMOUNT 4 - enum BG_SA_Status { BG_SA_NOT_STARTED = 0, @@ -63,7 +60,7 @@ enum BG_SA_EventIds BG_SA_EVENT_ANCIENT_GATE_DAMAGED = 19836, BG_SA_EVENT_ANCIENT_GATE_DESTROYED = 19837, - BG_SA_EVENT_TITAN_RELIC_ACTIVATED = 22097 + BG_SA_EVENT_TITAN_RELIC_ACTIVATED = 20572 }; enum SASpellIds @@ -73,7 +70,8 @@ enum SASpellIds SPELL_END_OF_ROUND = 52459, SPELL_REMOVE_SEAFORIUM = 59077, SPELL_ALLIANCE_CONTROL_PHASE_SHIFT = 60027, - SPELL_HORDE_CONTROL_PHASE_SHIFT = 60028 + SPELL_HORDE_CONTROL_PHASE_SHIFT = 60028, + SPELL_STORM_THE_BEACH_CREDIT = 65246 }; enum SACreatureIds @@ -97,6 +95,30 @@ enum SAGameObjectIds GO_GATE_OF_THE_RED_SUN = 190726, GO_GATE_OF_THE_YELLOW_MOON = 190727, GO_CHAMBER_OF_ANCIENT_RELICS = 192549, + + GO_TITAN_RELIC_A = 194083, + GO_TITAN_RELIC_H = 194082, + + GO_DEFENDER_PORTAL_A = 191575, + GO_DEFENDER_PORTAL_H = 190763, + + GO_GREEN_MOON_SIGIL = 192687, + GO_YELLOW_MOON_SIGIL = 192685, + GO_BLUE_MOON_SIGIL = 192689, + GO_RED_MOON_SIGIL = 192690, + GO_PURPLE_MOON_SIGIL = 192691, + + GO_FLAGPOLE = 191311, + + GO_ALLIANCE_BANNER_CENTER = 191310, + GO_HORDE_BANNER_CENTER = 191309, + GO_ALLIANCE_BANNER_RIGHT = 191306, + GO_HORDE_BANNER_RIGHT = 191305, + GO_ALLIANCE_BANNER_LEFT = 191308, + GO_HORDE_BANNER_LEFT = 191307, + + GO_SEAFORIUM_BOMB_A = 190753, + GO_SEAFORIUM_BOMB_H = 194086 }; enum BG_SA_Timers @@ -202,75 +224,25 @@ enum BG_SA_NPCs BG_SA_NPC_SPARKLIGHT, BG_SA_NPC_RIGSPARK, BG_SA_NPC_KANRETHAD, - BG_SA_MAXNPC + BG_SA_TELEPORT_TRIGGER_GREEN, + BG_SA_TELEPORT_TRIGGER_YELLOW, + BG_SA_TELEPORT_TRIGGER_BLUE, + BG_SA_TELEPORT_TRIGGER_RED, + BG_SA_TELEPORT_TRIGGER_PURPLE, + BG_SA_MAXNPC, + + BG_SA_DEMOLISHER_AMOUNT = BG_SA_DEMOLISHER_8 - BG_SA_DEMOLISHER_1 + 1 }; enum BG_SA_Boat { BG_SA_BOAT_ONE_A = 193182, BG_SA_BOAT_TWO_H = 193183, + BG_SA_BOAT_ONE_H = 193184, BG_SA_BOAT_TWO_A = 193185 }; -uint32 const BG_SA_NpcEntries[BG_SA_MAXNPC] = -{ - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - NPC_ANTI_PERSONNAL_CANNON, - // 4 beach demolishers - NPC_DEMOLISHER_SA, - NPC_DEMOLISHER_SA, - NPC_DEMOLISHER_SA, - NPC_DEMOLISHER_SA, - // 4 factory demolishers - NPC_DEMOLISHER_SA, - NPC_DEMOLISHER_SA, - NPC_DEMOLISHER_SA, - NPC_DEMOLISHER_SA, - // Used Demolisher Salesman - NPC_RIGGER_SPARKLIGHT, - NPC_GORGRIL_RIGSPARK, - // Kanrethad - NPC_KANRETHAD -}; - -Position const BG_SA_NpcSpawnlocs[BG_SA_MAXNPC] = -{ - // Cannons - { 1436.429f, 110.05f, 41.407f, 5.4f }, - { 1404.9023f, 84.758f, 41.183f, 5.46f }, - { 1068.693f, -86.951f, 93.81f, 0.02f }, - { 1068.83f, -127.56f, 96.45f, 0.0912f }, - { 1422.115f, -196.433f, 42.1825f, 1.0222f }, - { 1454.887f, -220.454f, 41.956f, 0.9627f }, - { 1232.345f, -187.517f, 66.945f, 0.45f }, - { 1249.634f, -224.189f, 66.72f, 0.635f }, - { 1236.213f, 92.287f, 64.965f, 5.751f }, - { 1215.11f, 57.772f, 64.739f, 5.78f }, - // Demolishers - { 1611.597656f, -117.270073f, 8.719355f, 2.513274f}, - { 1575.562500f, -158.421875f, 5.024450f, 2.129302f}, - { 1618.047729f, 61.424641f, 7.248210f, 3.979351f}, - { 1575.103149f, 98.873344f, 2.830360f, 3.752458f}, - // Demolishers 2 - { 1371.055786f, -317.071136f, 35.007359f, 1.947460f}, - { 1424.034912f, -260.195190f, 31.084425f, 2.820013f}, - { 1353.139893f, 223.745438f, 35.265411f, 4.343684f}, - { 1404.809570f, 197.027237f, 32.046032f, 3.605401f}, - // Npcs - { 1348.644165f, -298.786469f, 31.080130f, 1.710423f}, - { 1358.191040f, 195.527786f, 31.018187f, 4.171337f}, - { 841.921f, -134.194f, 196.838f, 6.23082f } -}; - enum BG_SA_Objects { BG_SA_GREEN_GATE = 0, @@ -279,179 +251,43 @@ enum BG_SA_Objects BG_SA_RED_GATE, BG_SA_PURPLE_GATE, BG_SA_ANCIENT_GATE, - BG_SA_TITAN_RELIC, - BG_SA_PORTAL_DEFFENDER_BLUE, - BG_SA_PORTAL_DEFFENDER_GREEN, - BG_SA_PORTAL_DEFFENDER_YELLOW, - BG_SA_PORTAL_DEFFENDER_PURPLE, - BG_SA_PORTAL_DEFFENDER_RED, - BG_SA_BOAT_ONE, - BG_SA_BOAT_TWO, - BG_SA_SIGIL_1, - BG_SA_SIGIL_2, - BG_SA_SIGIL_3, - BG_SA_SIGIL_4, - BG_SA_SIGIL_5, + BG_SA_TITAN_RELIC_A, + BG_SA_TITAN_RELIC_H, + BG_SA_PORTAL_DEFENDER_BLUE_A, + BG_SA_PORTAL_DEFENDER_BLUE_H, + BG_SA_PORTAL_DEFENDER_GREEN_A, + BG_SA_PORTAL_DEFENDER_GREEN_H, + BG_SA_PORTAL_DEFENDER_YELLOW_A, + BG_SA_PORTAL_DEFENDER_YELLOW_H, + BG_SA_PORTAL_DEFENDER_PURPLE_A, + BG_SA_PORTAL_DEFENDER_PURPLE_H, + BG_SA_PORTAL_DEFENDER_RED_A, + BG_SA_PORTAL_DEFENDER_RED_H, + BG_SA_GREEN_SIGIL, + BG_SA_YELLOW_SIGIL, + BG_SA_BLUE_SIGIL, + BG_SA_RED_SIGIL, + BG_SA_PURPLE_SIGIL, BG_SA_CENTRAL_FLAGPOLE, BG_SA_RIGHT_FLAGPOLE, BG_SA_LEFT_FLAGPOLE, - BG_SA_CENTRAL_FLAG, - BG_SA_RIGHT_FLAG, - BG_SA_LEFT_FLAG, - BG_SA_BOMB, - BG_SA_MAXOBJ = BG_SA_BOMB+68 -}; - -Position const BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ] = -{ - { 1411.57f, 108.163f, 28.692f, 5.441f }, - { 1055.452f, -108.1f, 82.134f, 0.034f }, - { 1431.3413f, -219.437f, 30.893f, 0.9736f }, - { 1227.667f, -212.555f, 55.372f, 0.5023f }, - { 1214.681f, 81.21f, 53.413f, 5.745f }, - { 878.555f, -108.2f, 117.845f, 0.0f }, - { 836.5f, -108.8f, 120.219f, 0.0f }, - // Portal - {1468.380005f, -225.798996f, 30.896200f, 0.0f}, //blue - {1394.270020f, 72.551399f, 31.054300f, 0.0f}, //green - {1065.260010f, -89.79501f, 81.073402f, 0.0f}, //yellow - {1216.069946f, 47.904301f, 54.278198f, 0.0f}, //purple - {1255.569946f, -233.548996f, 56.43699f, 0.0f}, //red - // Ships - { 2679.696777f, -826.891235f, 3.712860f, 5.78367f}, //rot2 1 rot3 0.0002f - { 2574.003662f, 981.261475f, 2.603424f, 0.807696f}, - // Sigils - { 1414.054f, 106.72f, 41.442f, 5.441f }, - { 1060.63f, -107.8f, 94.7f, 0.034f }, - { 1433.383f, -216.4f, 43.642f, 0.9736f }, - { 1230.75f, -210.724f, 67.611f, 0.5023f }, - { 1217.8f, 79.532f, 66.58f, 5.745f }, - // Flagpoles - { 1215.114258f, -65.711861f, 70.084267f, -3.124123f}, - {1338.863892f, -153.336533f, 30.895121f, -2.530723f}, - {1309.124268f, 9.410645f, 30.893402f, -1.623156f}, - // Flags - { 1215.108032f, -65.715767f, 70.084267f, -3.124123f}, - { 1338.859253f, -153.327316f, 30.895077f, -2.530723f}, - { 1309.192017f, 9.416233f, 30.893402f, 1.518436f}, - // Bombs - {1333.45f, 211.354f, 31.0538f, 5.03666f}, - {1334.29f, 209.582f, 31.0532f, 1.28088f}, - {1332.72f, 210.049f, 31.0532f, 1.28088f}, - {1334.28f, 210.78f, 31.0538f, 3.85856f}, - {1332.64f, 211.39f, 31.0532f, 1.29266f}, - {1371.41f, 194.028f, 31.5107f, 0.753095f}, - {1372.39f, 194.951f, 31.4679f, 0.753095f}, - {1371.58f, 196.942f, 30.9349f, 1.01777f}, - {1370.43f, 196.614f, 30.9349f, 0.957299f}, - {1369.46f, 196.877f, 30.9351f, 2.45348f}, - {1370.35f, 197.361f, 30.9349f, 1.08689f}, - {1369.47f, 197.941f, 30.9349f, 0.984787f}, - {1592.49f, 47.5969f, 7.52271f, 4.63218f}, - {1593.91f, 47.8036f, 7.65856f, 4.63218f}, - {1593.13f, 46.8106f, 7.54073f, 4.63218f}, - {1589.22f, 36.3616f, 7.45975f, 4.64396f}, - {1588.24f, 35.5842f, 7.55613f, 4.79564f}, - {1588.14f, 36.7611f, 7.49675f, 4.79564f}, - {1595.74f, 35.5278f, 7.46602f, 4.90246f}, - {1596, 36.6475f, 7.47991f, 4.90246f}, - {1597.03f, 36.2356f, 7.48631f, 4.90246f}, - {1597.93f, 37.1214f, 7.51725f, 4.90246f}, - {1598.16f, 35.888f, 7.50018f, 4.90246f}, - {1579.6f, -98.0917f, 8.48478f, 1.37996f}, - {1581.2f, -98.401f, 8.47483f, 1.37996f}, - {1580.38f, -98.9556f, 8.4772f, 1.38781f}, - {1585.68f, -104.966f, 8.88551f, 0.493246f}, - {1586.15f, -106.033f, 9.10616f, 0.493246f}, - {1584.88f, -105.394f, 8.82985f, 0.493246f}, - {1581.87f, -100.899f, 8.46164f, 0.929142f}, - {1581.48f, -99.4657f, 8.46926f, 0.929142f}, - {1583.2f, -91.2291f, 8.49227f, 1.40038f}, - {1581.94f, -91.0119f, 8.49977f, 1.40038f}, - {1582.33f, -91.951f, 8.49353f, 1.1844f}, - {1342.06f, -304.049f, 30.9532f, 5.59507f}, - {1340.96f, -304.536f, 30.9458f, 1.28323f}, - {1341.22f, -303.316f, 30.9413f, 0.486051f}, - {1342.22f, -302.939f, 30.986f, 4.87643f}, - {1382.16f, -287.466f, 32.3063f, 4.80968f}, - {1381, -287.58f, 32.2805f, 4.80968f}, - {1381.55f, -286.536f, 32.3929f, 2.84225f}, - {1382.75f, -286.354f, 32.4099f, 1.00442f}, - {1379.92f, -287.34f, 32.2872f, 3.81615f}, - {1100.52f, -2.41391f, 70.2984f, 0.131054f}, - {1099.35f, -2.13851f, 70.3375f, 4.4586f}, - {1099.59f, -1.00329f, 70.238f, 2.49903f}, - {1097.79f, 0.571316f, 70.159f, 4.00307f}, - {1098.74f, -7.23252f, 70.7972f, 4.1523f}, - {1098.46f, -5.91443f, 70.6715f, 4.1523f}, - {1097.53f, -7.39704f, 70.7959f, 4.1523f}, - {1097.32f, -6.64233f, 70.7424f, 4.1523f}, - {1096.45f, -5.96664f, 70.7242f, 4.1523f}, - {971.725f, 0.496763f, 86.8467f, 2.09233f}, - {973.589f, 0.119518f, 86.7985f, 3.17225f}, - {972.524f, 1.25333f, 86.8351f, 5.28497f}, - {971.993f, 2.05668f, 86.8584f, 5.28497f}, - {973.635f, 2.11805f, 86.8197f, 2.36722f}, - {974.791f, 1.74679f, 86.7942f, 1.5936f}, - {974.771f, 3.0445f, 86.8125f, 0.647199f}, - {979.554f, 3.6037f, 86.7923f, 1.69178f}, - {979.758f, 2.57519f, 86.7748f, 1.76639f}, - {980.769f, 3.48904f, 86.7939f, 1.76639f}, - {979.122f, 2.87109f, 86.7794f, 1.76639f}, - {986.167f, 4.85363f, 86.8439f, 1.5779f}, - {986.176f, 3.50367f, 86.8217f, 1.5779f}, - {987.33f, 4.67389f, 86.8486f, 1.5779f}, - {985.23f, 4.65898f, 86.8368f, 1.5779f}, - {984.556f, 3.54097f, 86.8137f, 1.5779f}, -}; - -/* Ships: - * 193182 - ally - * 193183 - horde - * 193184 - horde - * 193185 - ally - * Banners: - * 191308 - left one, - * 191306 - right one, - * 191310 - central, - * Ally ones, substract 1 - * to get horde ones. - */ - -uint32 const BG_SA_ObjEntries[BG_SA_MAXOBJ + BG_SA_FLAG_AMOUNT] = -{ - 190722, - 190727, - 190724, - 190726, - 190723, - 192549, - 192834, - 192819, - 192819, - 192819, - 192819, - 192819, - 0, // Boat - 0, // Boat - 192687, - 192685, - 192689, - 192690, - 192691, - 191311, - 191311, - 191311, - 191310, - 191306, - 191308, - 190753 -}; + BG_SA_CENTRAL_FLAG_A, + BG_SA_CENTRAL_FLAG_H, + BG_SA_RIGHT_FLAG_A, + BG_SA_RIGHT_FLAG_H, + BG_SA_LEFT_FLAG_A, + BG_SA_LEFT_FLAG_H, + BG_SA_BOMB_A_1, + BG_SA_BOMB_A_91 = BG_SA_BOMB_A_1 + 90 * BG_TEAMS_COUNT, + BG_SA_BOMB_H_91, + + BG_SA_MAXOBJ = BG_SA_BOMB_H_91 + 1, + + BG_SA_BOAT_ONE = BG_SA_MAXOBJ, + BG_SA_BOAT_TWO, -uint32 const BG_SA_Factions[2] = -{ - 1732, - 1735, + BG_SA_MAX_SHIPS_PER_TEAM = BG_SA_BOAT_TWO - BG_SA_BOAT_ONE + 1, + BG_SA_MAX_GATES = BG_SA_ANCIENT_GATE + 1 }; enum BG_SA_Graveyards @@ -464,44 +300,16 @@ enum BG_SA_Graveyards BG_SA_MAX_GY }; -const uint32 BG_SA_GYEntries[BG_SA_MAX_GY] = -{ - 1350, - 1349, - 1347, - 1346, - 1348, -}; - -float const BG_SA_GYOrientation[BG_SA_MAX_GY] = -{ - 6.202f, - 1.926f, // right capturable GY - 3.917f, // left capturable GY - 3.104f, // center, capturable - 6.148f, // defender last GY -}; - struct GateInfo { - uint8 GateId; + uint32 GateId; + uint32 LinkedGateId; uint32 GameObjectId; uint32 WorldState; uint8 DamagedText; uint8 DestroyedText; }; -#define MAX_GATES 6 -GateInfo const Gates[MAX_GATES] = -{ - { BG_SA_GREEN_GATE, GO_GATE_OF_THE_GREEN_EMERALD, BG_SA_GREEN_GATEWS, TEXT_GREEN_GATE_UNDER_ATTACK, TEXT_GREEN_GATE_DESTROYED }, - { BG_SA_YELLOW_GATE, GO_GATE_OF_THE_YELLOW_MOON, BG_SA_YELLOW_GATEWS, TEXT_YELLOW_GATE_UNDER_ATTACK, TEXT_YELLOW_GATE_DESTROYED }, - { BG_SA_BLUE_GATE, GO_GATE_OF_THE_BLUE_SAPPHIRE, BG_SA_BLUE_GATEWS, TEXT_BLUE_GATE_UNDER_ATTACK, TEXT_BLUE_GATE_DESTROYED }, - { BG_SA_RED_GATE, GO_GATE_OF_THE_RED_SUN, BG_SA_RED_GATEWS, TEXT_RED_GATE_UNDER_ATTACK, TEXT_RED_GATE_DESTROYED }, - { BG_SA_PURPLE_GATE, GO_GATE_OF_THE_PURPLE_AMETHYST, BG_SA_PURPLE_GATEWS, TEXT_PURPLE_GATE_UNDER_ATTACK, TEXT_PURPLE_GATE_DESTROYED }, - { BG_SA_ANCIENT_GATE, GO_CHAMBER_OF_ANCIENT_RELICS, BG_SA_ANCIENT_GATEWS, TEXT_ANCIENT_GATE_UNDER_ATTACK, TEXT_ANCIENT_GATE_DESTROYED } -}; - struct BG_SA_RoundScore { TeamId winner; @@ -575,20 +383,14 @@ class BattlegroundSA : public Battleground /// Return the nearest graveyard where player can respawn WorldSafeLocsEntry const* GetClosestGraveYard(Player* player) override; /// Called when someone activates an event - void ProcessEvent(WorldObject* /*obj*/, uint32 /*eventId*/, WorldObject* /*invoker*/ = NULL) override; + void ProcessEvent(WorldObject* /*obj*/, uint32 /*eventId*/, WorldObject* /*invoker*/ = nullptr) override; /// Called when a player click on flag (graveyard flag) void EventPlayerClickedOnFlag(Player* source, GameObject* go) override; /// Called when a player clicked on relic void TitanRelicActivated(Player* clicker); /// Return GateInfo, relative to bg data, according to gameobject entry - GateInfo const* GetGate(uint32 entry) - { - for (uint8 i = 0; i < MAX_GATES; ++i) - if (Gates[i].GameObjectId == entry) - return &Gates[i]; - return NULL; - } + static GateInfo const* GetGate(uint32 entry); /// Called on battleground ending void EndBattleground(uint32 winner) override; @@ -600,7 +402,7 @@ class BattlegroundSA : public Battleground /* Scorekeeping */ // Achievement: Not Even a Scratch - bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscValue = 0) override; + bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = nullptr, uint32 miscValue = 0) override; // Control Phase Shift bool IsSpellAllowed(uint32 spellId, Player const* player) const override; @@ -633,6 +435,7 @@ class BattlegroundSA : public Battleground /// Updates interaction flags of specific objects void UpdateObjectInteractionFlags(uint32 objectId); void UpdateObjectInteractionFlags(); + void UpdateBombInteractionFlags(); /** * \brief Called when a gate is destroy * -Give honor to player witch destroy it @@ -673,7 +476,7 @@ class BattlegroundSA : public Battleground /// For know if boats has start moving or not yet bool ShipsStarted; /// Status of each gate (Destroy/Damage/Intact) - BG_SA_GateState GateStatus[MAX_GATES]; + BG_SA_GateState GateStatus[BG_SA_MAX_GATES]; /// Statu of battle (Start or not, and what round) BG_SA_Status Status; /// Team witch conntrol each graveyard @@ -690,7 +493,8 @@ class BattlegroundSA : public Battleground bool SignaledRoundTwoHalfMin; /// for know if second round has been init bool InitSecondRound; - std::map DemoliserRespawnList; + + std::array DemolisherRespawnTimes; // Achievement: Defense of the Ancients bool _gateDestroyed; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index bc1ee3d44ea41..a9b7af9c2abbd 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -34,16 +34,54 @@ enum BG_WSG_Rewards BG_WSG_REWARD_NUM }; +enum BG_WSG_BuffEntries +{ + BG_WSG_SPEED_BUFF_1 = 179871, + BG_WSG_SPEED_BUFF_2 = 179899, + + BG_WSG_FOOD_BUFF_1 = 179904, + BG_WSG_FOOD_BUFF_2 = 179906, + + BG_WSG_BERSERK_BUFF_1 = 179905, + BG_WSG_BERSERK_BUFF_2 = 179907 +}; + uint32 BG_WSG_Honor[BG_HONOR_MODE_NUM][BG_WSG_REWARD_NUM] = { - {20, 40, 40}, // normal honor - {60, 40, 80} // holiday + { 20, 40, 40 }, // normal honor + { 60, 40, 80 } // holiday +}; + +BattlegroundGOSpawnPoint const BG_WSG_GameObjects[BG_WS_OBJECT_MAX] = +{ + // alliance gates + { BG_OBJECT_DOOR_A_1_WS_ENTRY, { 1503.336f, 1493.466f, 352.1888f, 3.11538800f }, { 0.00000000f, 0.000000000f, 0.999914200f, 0.01310196f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_A_2_WS_ENTRY, { 1492.479f, 1457.912f, 342.9689f, 3.11538800f }, { 0.00000000f, 0.000000000f, 0.999914200f, 0.01310196f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_A_3_WS_ENTRY, { 1468.504f, 1494.357f, 351.8618f, 3.11538800f }, { 0.00000000f, 0.000000000f, 0.999914200f, 0.01310196f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_A_4_WS_ENTRY, { 1471.556f, 1458.778f, 362.6332f, 3.11538800f }, { 0.00000000f, 0.000000000f, 0.999914200f, 0.01310196f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_A_5_WS_ENTRY, { 1492.347f, 1458.340f, 342.3712f, -0.03490669f }, { 0.00000000f, 0.000000000f, 0.017452460f, -0.99984770f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_A_6_WS_ENTRY, { 1503.466f, 1493.367f, 351.7352f, -0.03490669f }, { 0.00000000f, 0.000000000f, 0.017452460f, -0.99984770f }, RESPAWN_IMMEDIATELY }, + // horde gates + { BG_OBJECT_DOOR_H_1_WS_ENTRY, { 949.1663f, 1423.773f, 345.6241f, -0.57567980f }, { -0.01673365f, -0.004955292f, -0.283971800f, 0.95867380f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_H_2_WS_ENTRY, { 953.0507f, 1459.843f, 340.6526f, 4.28657000f }, { -0.19718220f, 0.157508900f, -0.823947900f, 0.50736580f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_H_3_WS_ENTRY, { 949.9523f, 1422.751f, 344.9273f, 0.00000000f }, { 0.00000000f, 0.000000000f, 0.000000000f, 1.00000000f }, RESPAWN_IMMEDIATELY }, + { BG_OBJECT_DOOR_H_4_WS_ENTRY, { 950.7952f, 1459.583f, 342.1523f, 0.05235888f }, { 0.00000000f, 0.000000000f, 0.026176450f, 0.99965730f }, RESPAWN_IMMEDIATELY }, + // flags + { BG_OBJECT_A_FLAG_WS_ENTRY, { 1540.423f, 1481.325f, 351.8284f, 3.08918300f }, { 0.00000000f, 0.000000000f, 0.999656700f, 0.02620165f }, BG_WS_FLAG_RESPAWN_TIME }, + { BG_OBJECT_H_FLAG_WS_ENTRY, { 916.5073f, 1433.826f, 346.3796f, 0.01745246f }, { 0.00000000f, 0.000000000f, 0.008726120f, 0.99996190f }, BG_WS_FLAG_RESPAWN_TIME }, + // buffs + { BG_WSG_SPEED_BUFF_1, { 1449.930f, 1470.710f, 342.6346f, -1.64061000f }, { 0.00000000f, 0.000000000f, -0.731353800f, 0.68199830f }, BUFF_RESPAWN_TIME }, + { BG_WSG_SPEED_BUFF_2, { 1005.105f, 1448.015f, 335.9118f, 1.60570200f }, { 0.00000000f, 0.000000000f, 0.719339400f, 0.69465880f }, BUFF_RESPAWN_TIME }, + { BG_WSG_FOOD_BUFF_1, { 1317.506f, 1550.851f, 313.2344f, -0.26179820f }, { 0.00000000f, 0.000000000f, -0.130525600f, 0.99144490f }, BUFF_RESPAWN_TIME }, + { BG_WSG_FOOD_BUFF_2, { 1110.451f, 1353.656f, 316.5181f, -0.68067870f }, { 0.00000000f, 0.000000000f, -0.333807000f, 0.94264140f }, BUFF_RESPAWN_TIME }, + { BG_WSG_BERSERK_BUFF_1, { 1320.094f, 1378.790f, 314.7532f, 1.18682300f }, { 0.00000000f, 0.000000000f, 0.559192700f, 0.82903770f }, BUFF_RESPAWN_TIME }, + { BG_WSG_BERSERK_BUFF_2, { 1139.688f, 1560.288f, 306.8432f, -2.44346000f }, { 0.00000000f, 0.000000000f, -0.939692500f, 0.34202050f }, BUFF_RESPAWN_TIME } }; BattlegroundWS::BattlegroundWS() { - BgObjects.resize(BG_WS_OBJECT_MAX); - BgCreatures.resize(BG_CREATURES_MAX_WS); + SetGameObjectsNumber(BG_WS_OBJECT_MAX); + SetCreaturesNumber(BG_CREATURES_MAX_WS); StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES; StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE; @@ -75,7 +113,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) { if (GetStatus() == STATUS_IN_PROGRESS) { - if (GetStartTime() >= 27*MINUTE*IN_MILLISECONDS) + if (GetStartTime() >= 27 * MINUTE * IN_MILLISECONDS) { if (GetTeamScore(TEAM_ALLIANCE) == 0) { @@ -94,7 +132,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) EndBattleground(ALLIANCE); } // first update needed after 1 minute of game already in progress - else if (GetStartTime() > uint32(_minutesElapsed * MINUTE * IN_MILLISECONDS) + 3 * MINUTE * IN_MILLISECONDS) + else if (GetStartTime() > uint32(_minutesElapsed * MINUTE * IN_MILLISECONDS) + 3 * MINUTE * IN_MILLISECONDS) { ++_minutesElapsed; UpdateWorldState(BG_WS_STATE_TIMER, 25 - _minutesElapsed); @@ -149,7 +187,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) if (_bothFlagsKept) { _flagSpellForceTimer += diff; - if (_flagDebuffState == 0 && _flagSpellForceTimer >= 10*MINUTE*IN_MILLISECONDS) //10 minutes + if (_flagDebuffState == 0 && _flagSpellForceTimer >= 10 * MINUTE * IN_MILLISECONDS) //10 minutes { if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[0])) player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true); @@ -157,7 +195,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true); _flagDebuffState = 1; } - else if (_flagDebuffState == 1 && _flagSpellForceTimer >= 15*MINUTE*IN_MILLISECONDS) //15 minutes + else if (_flagDebuffState == 1 && _flagSpellForceTimer >= 15 * MINUTE * IN_MILLISECONDS) //15 minutes { if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[0])) { @@ -196,8 +234,9 @@ void BattlegroundWS::StartingEventCloseDoors() for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i) { DoorClose(i); - SpawnBGObject(i, RESPAWN_IMMEDIATELY); + SpawnBGObject(i, BG_WSG_GameObjects[i].SpawnTime); } + for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) SpawnBGObject(i, RESPAWN_ONE_DAY); @@ -207,9 +246,7 @@ void BattlegroundWS::StartingEventCloseDoors() void BattlegroundWS::StartingEventOpenDoors() { - for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_6; ++i) - DoorOpen(i); - for (uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i) + for (uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i) DoorOpen(i); for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) @@ -365,9 +402,7 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player) EndBattleground(winner); } else - { - _flagsTimer[GetTeamIndexByTeamId(player->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME; - } + _flagsTimer[GetTeamIndexByTeamId(player->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME * IN_MILLISECONDS; } void BattlegroundWS::EventPlayerDroppedFlag(Player* player) @@ -467,41 +502,51 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* target ChatMsg type = CHAT_MSG_BG_SYSTEM_NEUTRAL; //alliance flag picked up from base - if (player->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE - && BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID()) + if (player->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE) { - message_id = LANG_BG_WS_PICKEDUP_AF; - type = CHAT_MSG_BG_SYSTEM_HORDE; - PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); - SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY); - SetAllianceFlagPicker(player->GetGUID()); - _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; - //update world state to show correct flag carrier - UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); - UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); - player->CastSpell(player, BG_WS_SPELL_SILVERWING_FLAG, true); - player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED); - if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER) - _bothFlagsKept = true; + if (GameObject* allianceFlag = GetBGObject(BG_WS_OBJECT_A_FLAG)) + { + if (target_obj == allianceFlag) + { + message_id = LANG_BG_WS_PICKEDUP_AF; + type = CHAT_MSG_BG_SYSTEM_HORDE; + PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); + SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY); + SetAllianceFlagPicker(player->GetGUID()); + _flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; + //update world state to show correct flag carrier + UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); + UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); + player->CastSpell(player, BG_WS_SPELL_SILVERWING_FLAG, true); + player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED); + if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER) + _bothFlagsKept = true; + } + } } //horde flag picked up from base - if (player->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE - && BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID()) + if (player->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE) { - message_id = LANG_BG_WS_PICKEDUP_HF; - type = CHAT_MSG_BG_SYSTEM_ALLIANCE; - PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); - SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY); - SetHordeFlagPicker(player->GetGUID()); - _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; - //update world state to show correct flag carrier - UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); - UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); - player->CastSpell(player, BG_WS_SPELL_WARSONG_FLAG, true); - player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED); - if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER) - _bothFlagsKept = true; + if (GameObject* hordeFlag = GetBGObject(BG_WS_OBJECT_H_FLAG)) + { + if (target_obj == hordeFlag) + { + message_id = LANG_BG_WS_PICKEDUP_HF; + type = CHAT_MSG_BG_SYSTEM_ALLIANCE; + PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); + SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY); + SetHordeFlagPicker(player->GetGUID()); + _flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; + //update world state to show correct flag carrier + UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); + UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); + player->CastSpell(player, BG_WS_SPELL_WARSONG_FLAG, true); + player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED); + if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER) + _bothFlagsKept = true; + } + } } //Alliance flag on ground(not in base) (returned or picked up again from ground!) @@ -670,57 +715,35 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger) Battleground::HandleAreaTrigger(player, trigger); break; } - - //if (buff_guid) - // HandleTriggerBuff(buff_guid, player); } bool BattlegroundWS::SetupBattleground() { - // flags - if (!AddObject(BG_WS_OBJECT_A_FLAG, BG_OBJECT_A_FLAG_WS_ENTRY, 1540.423f, 1481.325f, 351.8284f, 3.089233f, 0, 0, 0.9996573f, 0.02617699f, BG_WS_FLAG_RESPAWN_TIME/1000) - || !AddObject(BG_WS_OBJECT_H_FLAG, BG_OBJECT_H_FLAG_WS_ENTRY, 916.0226f, 1434.405f, 345.413f, 0.01745329f, 0, 0, 0.008726535f, 0.9999619f, BG_WS_FLAG_RESPAWN_TIME/1000) - // buffs - || !AddObject(BG_WS_OBJECT_SPEEDBUFF_1, BG_OBJECTID_SPEEDBUFF_ENTRY, 1449.93f, 1470.71f, 342.6346f, -1.64061f, 0, 0, 0.7313537f, -0.6819983f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_SPEEDBUFF_2, BG_OBJECTID_SPEEDBUFF_ENTRY, 1005.171f, 1447.946f, 335.9032f, 1.64061f, 0, 0, 0.7313537f, 0.6819984f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_REGENBUFF_1, BG_OBJECTID_REGENBUFF_ENTRY, 1317.506f, 1550.851f, 313.2344f, -0.2617996f, 0, 0, 0.1305263f, -0.9914448f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_REGENBUFF_2, BG_OBJECTID_REGENBUFF_ENTRY, 1110.451f, 1353.656f, 316.5181f, -0.6806787f, 0, 0, 0.333807f, -0.9426414f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_BERSERKBUFF_1, BG_OBJECTID_BERSERKERBUFF_ENTRY, 1320.09f, 1378.79f, 314.7532f, 1.186824f, 0, 0, 0.5591929f, 0.8290376f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_BERSERKBUFF_2, BG_OBJECTID_BERSERKERBUFF_ENTRY, 1139.688f, 1560.288f, 306.8432f, -2.443461f, 0, 0, 0.9396926f, -0.3420201f, BUFF_RESPAWN_TIME) - // alliance gates - || !AddObject(BG_WS_OBJECT_DOOR_A_1, BG_OBJECT_DOOR_A_1_WS_ENTRY, 1503.335f, 1493.466f, 352.1888f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_2, BG_OBJECT_DOOR_A_2_WS_ENTRY, 1492.478f, 1457.912f, 342.9689f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_3, BG_OBJECT_DOOR_A_3_WS_ENTRY, 1468.503f, 1494.357f, 351.8618f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_4, BG_OBJECT_DOOR_A_4_WS_ENTRY, 1471.555f, 1458.778f, 362.6332f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_5, BG_OBJECT_DOOR_A_5_WS_ENTRY, 1492.347f, 1458.34f, 342.3712f, -0.03490669f, 0, 0, 0.01745246f, -0.9998477f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_6, BG_OBJECT_DOOR_A_6_WS_ENTRY, 1503.466f, 1493.367f, 351.7352f, -0.03490669f, 0, 0, 0.01745246f, -0.9998477f, RESPAWN_IMMEDIATELY) - // horde gates - || !AddObject(BG_WS_OBJECT_DOOR_H_1, BG_OBJECT_DOOR_H_1_WS_ENTRY, 949.1663f, 1423.772f, 345.6241f, -0.5756807f, -0.01673368f, -0.004956111f, -0.2839723f, 0.9586737f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_H_2, BG_OBJECT_DOOR_H_2_WS_ENTRY, 953.0507f, 1459.842f, 340.6526f, -1.99662f, -0.1971825f, 0.1575096f, -0.8239487f, 0.5073641f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_H_3, BG_OBJECT_DOOR_H_3_WS_ENTRY, 949.9523f, 1422.751f, 344.9273f, 0.0f, 0, 0, 0, 1, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_H_4, BG_OBJECT_DOOR_H_4_WS_ENTRY, 950.7952f, 1459.583f, 342.1523f, 0.05235988f, 0, 0, 0.02617695f, 0.9996573f, RESPAWN_IMMEDIATELY) -) + for (uint32 i = 0; i < BG_WS_OBJECT_MAX; ++i) { - TC_LOG_ERROR("sql.sql", "BatteGroundWS: Failed to spawn some object Battleground not created!"); - return false; + BattlegroundGOSpawnPoint const& object = BG_WSG_GameObjects[i]; + if (!AddObject(i, object.Entry, object.Pos, object.Rot, object.SpawnTime)) + { + TC_LOG_ERROR("bg.battleground", "BattlegroundWS: Failed to spawn some object (Entry: %u). Battleground not created!", object.Entry); + return false; + } } WorldSafeLocsEntry const* sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE); - if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, TEAM_ALLIANCE)) + if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_ALLIANCE, Position(sg->x, sg->y, sg->z, 3.124139f), TEAM_ALLIANCE)) { - TC_LOG_ERROR("sql.sql", "BatteGroundWS: Failed to spawn Alliance spirit guide! Battleground not created!"); + TC_LOG_ERROR("bg.battleground", "BattlegroundWS: Failed to spawn Alliance spirit guide! Battleground not created!"); return false; } sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE); - if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, TEAM_HORDE)) + if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_HORDE, Position(sg->x, sg->y, sg->z, 3.193953f), TEAM_HORDE)) { - TC_LOG_ERROR("sql.sql", "BatteGroundWS: Failed to spawn Horde spirit guide! Battleground not created!"); + TC_LOG_ERROR("bg.battleground", "BattlegroundWS: Failed to spawn Horde spirit guide! Battleground not created!"); return false; } - TC_LOG_DEBUG("bg.battleground", "BatteGroundWS: BG objects and spirit guides spawned"); - + TC_LOG_DEBUG("bg.battleground", "BattlegroundWS: BG objects and spirit guides spawned"); return true; } @@ -856,12 +879,12 @@ void BattlegroundWS::FillInitialWorldStates(WorldPacket& data) else data << uint32(BG_WS_STATE_TIMER_ACTIVE) << uint32(0); - if (_flagState[TEAM_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER) + if (_flagState[TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER) data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(2); else data << uint32(BG_WS_FLAG_STATE_HORDE) << uint32(1); - if (_flagState[TEAM_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER) + if (_flagState[TEAM_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER) data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(2); else data << uint32(BG_WS_FLAG_STATE_ALLIANCE) << uint32(1); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index b7eb7025425df..adbdfef175403 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -25,7 +25,8 @@ enum BG_WS_TimerOrScore { BG_WS_MAX_TEAM_SCORE = 3, - BG_WS_FLAG_RESPAWN_TIME = 23000, + BG_WS_FLAG_RESPAWN_TIME = 23, // seconds! + BG_WS_FLAG_DROP_TIME = 10000, BG_WS_SPELL_FORCE_TIME = 600000, BG_WS_SPELL_BRUTAL_TIME = 900000 diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 9db3fc6a40219..8abf9a9e06714 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1709,22 +1709,8 @@ void GameObject::Use(Unit* user) // 179786 - Warsong Flag // EotS: // 184142 - Netherstorm Flag - GameObjectTemplate const* info = GetGOInfo(); - if (info) - { - switch (info->entry) - { - case 179785: // Silverwing Flag - case 179786: // Warsong Flag - if (bg->GetTypeID(true) == BATTLEGROUND_WS) - bg->EventPlayerClickedOnFlag(player, this); - break; - case 184142: // Netherstorm Flag - if (bg->GetTypeID(true) == BATTLEGROUND_EY) - bg->EventPlayerClickedOnFlag(player, this); - break; - } - } + bg->EventPlayerClickedOnFlag(player, this); + //this cause to call return, all flags must be deleted here!! spellId = 0; Delete();