50 Commits
Author SHA1 Message Date
Céfiro_Caecias d2838f7162 DB/World: Kul Tiran Starting Zone 2026-09-10 17:36:59 -03:00
luis 82aec417ee enable opcodes client handle it 2026-09-10 17:19:03 -03:00
luis 5e75748eed more atal utek data 2026-09-10 17:12:56 -03:00
luis 0e9f168f18 sniff campaign 2026-09-10 17:05:51 -03:00
luis f68b6796fd enable playerhousing and bpet fix 2026-09-10 15:06:02 -03:00
luis b69cf5cd63 typo fix 2026-09-10 14:39:42 -03:00
luis 5220e640f1 add roomworld entity missing def 2026-09-10 14:38:06 -03:00
Céfiro_Caecias 4b1d0c4999 DB/World: Allied Races Adjusts 2026-09-10 13:50:08 -03:00
luis 124a41fa14 Disable 2026-09-10 12:27:01 -03:00
luis 4e202c78b0 catchup experience 2026-09-10 11:39:49 -03:00
luis 2b39caa8c3 to delete file 2026-09-10 11:29:19 -03:00
luis 119690680e enable playerhousing and update packet 2026-09-10 11:28:20 -03:00
luis e5d8d79dd1 all sql housing 2026-09-10 11:15:29 -03:00
luis 8e1c2d660a Playerhousing 2026-09-10 11:13:01 -03:00
Céfiro_Caecias 24fd8e95c2 DB/World: Door Translates 2026-09-10 10:38:02 -03:00
luis 23e87a3088 housing plot finder stage 3 2026-09-10 10:28:36 -03:00
Céfiro_Caecias 3d6ba0308d DB/World: Cell Door Translates 2026-09-10 10:28:19 -03:00
Céfiro_Caecias 91db5eb3d1 DB/World: Chair Translates 2026-09-10 10:16:47 -03:00
Céfiro_Caecias 362c7d053c DB/World: Bench Translates 2026-09-10 10:02:11 -03:00
Céfiro_Caecias bf19457b8b Update 2026_09_10_00_world_dberrors.sql 2026-09-10 09:44:49 -03:00
Céfiro_Caecias 378cef8b65 DB/World: DBErrors Fixes 2026-09-10 09:40:51 -03:00
luis 1fcd385645 unused 2026-09-09 20:03:36 -03:00
luis fa4eb9ae8b enum spell to script later 2026-09-09 20:03:12 -03:00
luis 1d4b9187de Cornerstones gob 2026-09-09 19:58:02 -03:00
luis 6a7f698c4e warning fix 2026-09-09 19:05:40 -03:00
luis a088e627e6 Core/Player: Fixed Warlock Hand of Gul'Dan and possibly others thanks celeby 2026-09-09 18:29:08 -03:00
Céfiro_Caecias 6cb7f9de54 Update 2026_09_09_02_characters_housing_dynamic_entities.sql 2026-09-09 18:23:09 -03:00
luis 28ae381630 char db 2026-09-09 17:12:17 -03:00
luis 400b071cac new playerhousing system 2026-09-09 17:10:41 -03:00
Céfiro_Caecias 213f4cf979 DB/World: Dark Iron Dwarf Starting Zone 2026-09-09 17:05:54 -03:00
luis 8fd13b5aa1 fix packets 2026-09-09 16:04:31 -03:00
luis 91b6de9300 Housing part 3 2026-09-09 16:00:01 -03:00
luis aca09eb57b Playerhousing part 2 2026-09-09 15:45:40 -03:00
luis dd4998a8e8 more midnight campaigns 2026-09-09 14:52:59 -03:00
luis db53bc4850 bad files 2026-09-09 12:57:08 -03:00
luis 377f0991c4 del 2026-09-09 12:55:31 -03:00
luis 1b4e8f85db typo 2026-09-09 12:53:44 -03:00
luis 0008217301 sniff and new at changes 2026-09-09 11:51:47 -03:00
luis 5c394a29fd Core/AreaTriggers: Add roll/pitch/yaw to areatrigger_create_properties db table and remove all deprecated flags 2026-09-09 11:51:18 -03:00
luis 195637d197 db world lcoales 2026-09-09 11:38:47 -03:00
luis 0f62627545 db locales 2026-09-09 11:34:03 -03:00
luis 205af79752 Scripts/FSB: apply some coding style and fix issue with no raid frame update when 1 player alone joins BG 2026-09-09 10:24:45 -03:00
luis 43ad7c0b92 Scripts/FSB: improve periodic update for party/raid frames 2026-09-09 10:22:43 -03:00
luis 466940ba71 lfg list fixes 2026-09-09 10:18:12 -03:00
luis a893920db2 bpet full update 2026-09-09 10:18:12 -03:00
Céfiro_Caecias cff05ba3ce Update README.md 2026-09-09 09:44:15 -03:00
Céfiro_Caecias 12553c36f7 DB/World: DBErrors Fixes 2026-09-09 09:41:09 -03:00
luis 009c475f18 adapt arena role 2026-09-09 09:36:24 -03:00
luis 996d876bbf pvp 2026-09-09 09:34:40 -03:00
luis 9fed5635ff try fix crash 2026-09-09 08:21:16 -03:00
121 changed files with 225493 additions and 18260 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ WowCommunity Project is a World of Warcraft blizzlike design based on TrinityCor
01c.- [Windows Desktop Runtime v.9.0.13 x64](https://dotnet.microsoft.com/es-es/download/dotnet/thank-you/runtime-desktop-9.0.13-windows-x64-installer)
02.- [Visual Studio Community 2022 v.17.14.38](https://www.junian.net/dev/visual-studio-community-download-links/)
02.- [Visual Studio Community 2022 v.17.14.40](https://www.junian.net/dev/visual-studio-community-download-links/)
03a.- [Python v.3.15.0a6 x64](https://www.python.org/downloads/)
@@ -0,0 +1,70 @@
-- Midnight 12.1 Housing Part 2: placed decor and idempotent deferred-decor redemption.
DROP TABLE IF EXISTS `housing_placed_decor`;
CREATE TABLE `housing_placed_decor` (
`DecorGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`OwnerGuid` bigint unsigned NOT NULL,
`PositionX` float NOT NULL,
`PositionY` float NOT NULL,
`PositionZ` float NOT NULL,
`RotationX` float NOT NULL,
`RotationY` float NOT NULL,
`RotationZ` float NOT NULL,
`Scale` float NOT NULL DEFAULT 1,
`AttachParentGuid` varchar(64) NOT NULL,
`RoomGuid` varchar(64) NOT NULL,
`ParentHouseFixtureGuid` varchar(64) NOT NULL,
`PlacedComponentID` int NOT NULL DEFAULT 0,
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`DecorGuid`),
KEY `idx_housing_placed_decor_house` (`HouseGuid`),
KEY `idx_housing_placed_decor_owner` (`OwnerGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `housing_deferred_decor_redemption`;
CREATE TABLE `housing_deferred_decor_redemption` (
`BattlenetAccountId` int unsigned NOT NULL,
`TransactionID` int unsigned NOT NULL,
`DecorID` int unsigned NOT NULL,
`DecorGuid` varchar(64) NOT NULL,
`RedeemedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`BattlenetAccountId`, `TransactionID`),
UNIQUE KEY `uq_housing_deferred_decor_guid` (`DecorGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Capture-backed static plot metadata. Account/character GUIDs are intentionally
-- excluded: the server binds a reserved plot to its owner at runtime.
DROP TABLE IF EXISTS `housing_plot_template`;
CREATE TABLE `housing_plot_template` (
`PlotID` smallint unsigned NOT NULL,
`ExteriorMapID` smallint unsigned NOT NULL,
`InteriorMapID` smallint unsigned NOT NULL,
`DestinationX` float NOT NULL,
`DestinationY` float NOT NULL,
`DestinationZ` float NOT NULL,
`DestinationO` float NOT NULL,
`CornerstoneEntry` int unsigned NOT NULL,
`VerifiedBuild` int NOT NULL DEFAULT 0,
PRIMARY KEY (`PlotID`, `ExteriorMapID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Plot 15 is the complete plot/Cornerstone/teleport tuple observed in the
-- 12.1.0.69587 Housing capture.
DELETE FROM `housing_plot_template` WHERE `PlotID` = 15 AND `ExteriorMapID` = 2735;
INSERT INTO `housing_plot_template`
(`PlotID`, `ExteriorMapID`, `InteriorMapID`, `DestinationX`, `DestinationY`,
`DestinationZ`, `DestinationO`, `CornerstoneEntry`, `VerifiedBuild`)
VALUES
(15, 2735, 2783, 2765.7249, 119.3435, 66.871, 1.11701298, 457142, 69587);
-- Midnight 12.1.0.69587 Housing: align Plot 15 teleport with its captured Cornerstone.
UPDATE `housing_plot_template`
SET `DestinationX` = 2765.7249,
`DestinationY` = 119.3435,
`DestinationZ` = 66.8710,
`DestinationO` = 1.11701298,
`CornerstoneEntry` = 457142,
`VerifiedBuild` = 69587
WHERE `PlotID` = 15 AND `ExteriorMapID` = 2735;
@@ -0,0 +1,86 @@
-- Midnight 12.1.0.69587 Housing dynamic entity persistence.
-- Rows are house-scoped because captured object GUIDs and attachment graphs are instance data.
DROP TABLE IF EXISTS `housing_room_entity`;
CREATE TABLE `housing_room_entity` (
`RoomGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`HouseRoomID` int NOT NULL,
`Flags` int NOT NULL DEFAULT 0,
`PositionX` float NOT NULL DEFAULT 0,
`PositionY` float NOT NULL DEFAULT 0,
`PositionZ` float NOT NULL DEFAULT 0,
`RotationX` float NOT NULL DEFAULT 0,
`RotationY` float NOT NULL DEFAULT 0,
`RotationZ` float NOT NULL DEFAULT 0,
`RotationW` float NOT NULL DEFAULT 1,
`Scale` float NOT NULL DEFAULT 1,
`AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3,
PRIMARY KEY (`RoomGuid`),
KEY `idx_housing_room_house` (`HouseGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `housing_room_component_entity`;
CREATE TABLE `housing_room_component_entity` (
`EntityGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`RoomGuid` varchar(64) NOT NULL,
`FileDataID` int unsigned NOT NULL,
`IsWMO` tinyint unsigned NOT NULL DEFAULT 1,
`IsRoom` tinyint unsigned NOT NULL DEFAULT 1,
`AttachParentGuid` varchar(64) NOT NULL,
`PositionX` float NOT NULL DEFAULT 0,
`PositionY` float NOT NULL DEFAULT 0,
`PositionZ` float NOT NULL DEFAULT 0,
`RotationX` float NOT NULL DEFAULT 0,
`RotationY` float NOT NULL DEFAULT 0,
`RotationZ` float NOT NULL DEFAULT 0,
`RotationW` float NOT NULL DEFAULT 1,
`Scale` float NOT NULL DEFAULT 1,
`AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3,
`RoomComponentOptionID` int NOT NULL DEFAULT 0,
`RoomComponentID` int NOT NULL DEFAULT 0,
`RoomComponentType` tinyint unsigned NOT NULL DEFAULT 0,
`HouseThemeID` int NOT NULL DEFAULT 0,
`RoomComponentTextureID` int NOT NULL DEFAULT 0,
`RoomComponentTypeParam` int NOT NULL DEFAULT 0,
PRIMARY KEY (`EntityGuid`),
KEY `idx_housing_room_component_house` (`HouseGuid`),
KEY `idx_housing_room_component_room` (`RoomGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `housing_fixture_entity`;
CREATE TABLE `housing_fixture_entity` (
`EntityGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`FileDataID` int unsigned NOT NULL,
`IsWMO` tinyint unsigned NOT NULL DEFAULT 1,
`IsRoom` tinyint unsigned NOT NULL DEFAULT 0,
`AttachParentGuid` varchar(64) NOT NULL,
`PositionX` float NOT NULL DEFAULT 0,
`PositionY` float NOT NULL DEFAULT 0,
`PositionZ` float NOT NULL DEFAULT 0,
`RotationX` float NOT NULL DEFAULT 0,
`RotationY` float NOT NULL DEFAULT 0,
`RotationZ` float NOT NULL DEFAULT 0,
`RotationW` float NOT NULL DEFAULT 1,
`Scale` float NOT NULL DEFAULT 1,
`AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3,
`ExteriorComponentID` int NOT NULL DEFAULT 0,
`HouseExteriorWmoDataID` int NOT NULL DEFAULT 0,
`ExteriorComponentHookID` int NOT NULL DEFAULT -1,
`ExteriorComponentType` tinyint unsigned NOT NULL DEFAULT 0,
`Size` tinyint unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`EntityGuid`),
KEY `idx_housing_fixture_house` (`HouseGuid`),
KEY `idx_housing_fixture_parent` (`AttachParentGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `housing_placed_decor`
ADD COLUMN `EntityGuid` varchar(64) NULL AFTER `DecorGuid`,
ADD COLUMN `FileDataID` int unsigned NOT NULL DEFAULT 0 AFTER `OwnerGuid`,
ADD COLUMN `RotationW` float NOT NULL DEFAULT 1 AFTER `RotationZ`,
ADD COLUMN `Flags` tinyint unsigned NOT NULL DEFAULT 0 AFTER `PlacedComponentID`,
ADD COLUMN `IsWMO` tinyint unsigned NOT NULL DEFAULT 0 AFTER `Flags`,
ADD COLUMN `IsRoom` tinyint unsigned NOT NULL DEFAULT 0 AFTER `IsWMO`,
ADD COLUMN `AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3 AFTER `IsRoom`;
@@ -0,0 +1,120 @@
-- Midnight 12.1.0.69587 Housing: data-driven Alliance and Horde plot catalogue.
-- Source: NeighborhoodMap.db2 and NeighborhoodPlot.db2 from build 69587.
-- NeighborhoodMap 1 = Alliance map 2735; NeighborhoodMap 2 = Horde map 2736.
DELETE FROM `housing_plot_template` WHERE `ExteriorMapID` IN (2735, 2736);
INSERT INTO `housing_plot_template`
(`PlotID`, `ExteriorMapID`, `InteriorMapID`, `DestinationX`, `DestinationY`,
`DestinationZ`, `DestinationO`, `CornerstoneEntry`, `VerifiedBuild`)
VALUES
(0, 2736, 2783, 1256.38977, 1088.05249, 55.6567001, 1.64061153, 475055, 69587),
(1, 2736, 2783, 774.483398, -474.99411, 11.7054996, 4.14515686, 475085, 69587),
(2, 2736, 2783, 1926.21155, 946.071411, 101.642197, 1.91113889, 475054, 69587),
(3, 2736, 2783, 794.223816, -207.5298, 15.6171999, 3.48193121, 475094, 69587),
(4, 2736, 2783, 1610.8241, -242.196106, 76.2837982, 3.38593888, 475067, 69587),
(5, 2736, 2783, 736.202026, -436.041199, 3.1479001, 2.46964121, 475106, 69587),
(6, 2736, 2783, 652.970093, 39.7509003, 4.17980003, 3.08050632, 475076, 69587),
(7, 2736, 2783, 576.01239, -318.849792, 6.82270002, 2.18166208, 569611, 69587),
(8, 2736, 2783, 1341.99158, -633.449585, 21.2838993, 5.3494339, 475072, 69587),
(9, 2736, 2783, 1666.97473, 1050.54932, 48.5917015, 1.07337832, 475057, 69587),
(10, 2736, 2783, 1267.80164, -168.746399, 73.0510025, 4.11025, 475095, 69587),
(11, 2736, 2783, 1104.66479, 883.886475, 6.83330011, 3.25503969, 475061, 69587),
(12, 2736, 2783, 547.151672, 638.714294, 154.810196, 2.60054159, 582082, 69587),
(13, 2736, 2783, 902.671082, -542.786316, 1.96220005, 4.59021568, 475091, 69587),
(14, 2736, 2783, 1179.80969, -640.692871, 5.58500004, 4.82583666, 475079, 69587),
(15, 2736, 2783, 2153.27197, -741.383484, 142.751694, 2.69653416, 475071, 69587),
(16, 2736, 2783, 1481.15002, -7.52926016, 78.217598, 5.6548667, 576758, 69587),
(17, 2736, 2783, 959.952881, 841.212402, 4.7887001, 2.23402309, 567160, 69587),
(18, 2736, 2783, 1528.53479, 998.123779, 35.6212997, 6.24828339, 475059, 69587),
(19, 2736, 2783, 383.664795, -107.684196, 6.49800014, 3.13286591, 569610, 69587),
(20, 2736, 2783, 1866.99902, -517.239807, 130.538696, 2.53072786, 475092, 69587),
(21, 2736, 2783, 1658.8584, -166.788193, 81.0233002, 4.56403685, 475096, 69587),
(22, 2736, 2783, 485.596985, 305.609894, 99.2686996, 5.6286869, 475086, 69587),
(23, 2736, 2783, 1922.68811, -706.482483, 133.981598, 6.03883934, 475080, 69587),
(24, 2736, 2783, 227.097504, 652.787415, 11.7489004, 3.28121901, 566793, 69587),
(25, 2736, 2783, 1841.39746, 663.865295, 88.3912964, 0.305432796, 475051, 69587),
(26, 2736, 2783, 1080.48035, 1021.32343, 3.69679999, 2.44346094, 475063, 69587),
(27, 2736, 2783, 1166.09485, 461.580292, 153.914307, 3.14159274, 475064, 69587),
(28, 2736, 2783, 1662.88965, 912.213074, 37.5280991, 1.43990111, 475062, 69587),
(29, 2736, 2783, 1167.75415, 159.078201, 34.9571991, 3.97062373, 475104, 69587),
(30, 2736, 2783, 955.514221, 474.296387, 108.533096, 2.53072786, 475060, 69587),
(31, 2736, 2783, 2076.98438, -272.490295, 138.3172, 6.16101313, 475098, 69587),
(32, 2736, 2783, 670.749878, 434.961212, 9.01790047, 4.26732969, 475081, 69587),
(33, 2736, 2783, 1127.10754, 768.396118, 17.6096992, 0.637045383, 475053, 69587),
(34, 2736, 2783, 1310.15015, -108.338898, 73.1512985, 1.71042502, 475073, 69587),
(35, 2736, 2783, 1789.92896, -948.381226, 92.4789963, 4.24987698, 475102, 69587),
(36, 2736, 2783, 1803.66797, 641.84259, 84.8967972, 4.20624399, 475066, 69587),
(37, 2736, 2783, 307.560699, 79.0978012, 23.3638992, 2.88852072, 569609, 69587),
(38, 2736, 2783, 1844.10413, -877.720581, 120.786003, 5.63741398, 475077, 69587),
(39, 2736, 2783, 2234.229, -868.239929, 160.227798, 5.06145668, 582083, 69587),
(40, 2736, 2783, 1026.59143, 165.963898, 31.0340996, 3.54301858, 475090, 69587),
(41, 2736, 2783, 1340.33936, 619.31427, 42.0043983, 4.56403589, 475058, 69587),
(42, 2736, 2783, 1760.35242, -864.990601, 116.558601, 3.28994608, 475100, 69587),
(43, 2736, 2783, 642.297485, 706.875488, 113.917702, 2.60054159, 582085, 69587),
(44, 2736, 2783, 1900.57751, -448.425995, 136.894302, 0.0436336994, 475068, 69587),
(45, 2736, 2783, 1883.48804, -340.904388, 129.694305, 1.57952571, 475097, 69587),
(46, 2736, 2783, 2266.896, -588.512085, 160.835297, 0.654502392, 475083, 69587),
(47, 2736, 2783, 1363.78406, 83.729599, 50.0439987, 0.506145716, 475093, 69587),
(48, 2736, 2783, 1213.9884, -12.2238998, 104.167999, 0.986114979, 475088, 69587),
(49, 2736, 2783, 403.947205, 195.331406, 109.733704, 4.5465827, 475087, 69587),
(50, 2736, 2783, 1033.56128, 698.043579, 9.05720043, 4.45058966, 475052, 69587),
(51, 2736, 2783, 640.64093, -114.141296, 2.6085, 3.26376581, 475105, 69587),
(52, 2736, 2783, 1668.2832, -676.47168, 99.8794022, 3.52556562, 475099, 69587),
(53, 2736, 2783, 1643.02209, -567.601013, 100.008598, 3.12413931, 475103, 69587),
(54, 2736, 2783, 748.523315, 840.075317, 7.98140001, 3.05432749, 582084, 69587),
(0, 2735, 2783, 2939.34375, -212.255402, 113.320999, 5.83812618, 527268, 69587),
(1, 2735, 2783, 2675.42505, 649.38031, 49.5349998, 5.27089405, 527310, 69587),
(2, 2735, 2783, 2516.89282, 161.045303, 60.2431984, 0.314159393, 527266, 69587),
(3, 2735, 2783, 3157.21509, -526.436829, 190.954803, 0.401426077, 527292, 69587),
(4, 2735, 2783, 3495.69702, 1403.7948, 4.9604001, 4.64257669, 571209, 69587),
(5, 2735, 2783, 2613.41748, 963.440186, 36.8871002, 0.523599386, 527286, 69587),
(6, 2735, 2783, 2663.64502, -444.185089, 121.045403, 0.130899906, 527260, 69587),
(7, 2735, 2783, 3569.28174, 268.887787, 102.098198, 4.93928146, 527282, 69587),
(8, 2735, 2783, 2358.58569, -3.76069999, 100.083702, 2.18166304, 527274, 69587),
(9, 2735, 2783, 3550.79004, 319.627991, 95.6286011, 2.32128859, 527294, 69587),
(10, 2735, 2783, 2456.32568, 284.006012, 49.6328011, 2.35619521, 527301, 69587),
(11, 2735, 2783, 2940.15527, 123.1642, 62.9803009, 3.14159274, 527302, 69587),
(12, 2735, 2783, 3341.06567, 1518.95337, 7.14669991, 1.85877991, 571211, 69587),
(13, 2735, 2783, 2818.31909, 886.295898, 30.5053997, 0.0785398483, 527311, 69587),
(14, 2735, 2783, 2726.41943, 1072.91638, 27.5897999, 5.46288013, 527265, 69587),
(15, 2735, 2783, 2765.72485, 119.343498, 66.8710022, 1.11701322, 527278, 69587),
(16, 2735, 2783, 2966.34058, 99.1072998, 64.9800034, 5.41924858, 527272, 69587),
(17, 2735, 2783, 2925.4436, -347.223694, 120.3004, 5.5065136, 527262, 69587),
(18, 2735, 2783, 2284.64014, -217.274994, 116.247002, 3.57792521, 527277, 69587),
(19, 2735, 2783, 3327.42847, 1099.90051, 13.0636997, 2.24275255, 527295, 69587),
(20, 2735, 2783, 2470.12524, -313.879486, 101.591797, 2.89724684, 527306, 69587),
(21, 2735, 2783, 2592.14624, -610.73053, 137.939896, 4.76474857, 527281, 69587),
(22, 2735, 2783, 3068.99902, -582.770874, 214.505096, 2.48709488, 527314, 69587),
(23, 2735, 2783, 3306.93481, -593.259888, 207.962799, 5.16617489, 527290, 69587),
(24, 2735, 2783, 3802.90234, 1153.36218, 8.78120041, 0.043633461, 527303, 69587),
(25, 2735, 2783, 3439.79419, 1462.99548, 8.06919956, 1.21300626, 571207, 69587),
(26, 2735, 2783, 2612.52954, 640.883423, 47.2089005, 4.97418833, 527264, 69587),
(27, 2735, 2783, 3639.57544, 260.099396, 104.364304, 5.31452799, 527261, 69587),
(28, 2735, 2783, 3637.177, 1360.49243, 33.8053017, 1.48353446, 571210, 69587),
(29, 2735, 2783, 3490.44482, 1174.66431, 2.34850001, 0.157079697, 527309, 69587),
(30, 2735, 2783, 2697.58203, 819.94751, 44.1293983, 3.14159274, 527275, 69587),
(31, 2735, 2783, 3366.71436, -401.5177, 186.404907, 2.68780756, 527279, 69587),
(32, 2735, 2783, 3131.57935, -650.777283, 226.326599, 5.68104696, 527283, 69587),
(33, 2735, 2783, 2479.93823, -87.535202, 95.2116013, 0.375246763, 527285, 69587),
(34, 2735, 2783, 3470.93481, 735.581787, 81.4804001, 2.35619521, 527313, 69587),
(35, 2735, 2783, 2440.76001, 929.116028, 35.1739998, 0.514872551, 527291, 69587),
(36, 2735, 2783, 2734.84351, 1141.5863, 24.9641991, 0.383973122, 527271, 69587),
(37, 2735, 2783, 2505.19775, 554.90918, 40.7759018, 3.99680424, 527269, 69587),
(38, 2735, 2783, 2581.07568, -334.281586, 106.215599, 2.26020288, 527308, 69587),
(39, 2735, 2783, 3601.63696, 640.029419, 83.4679031, 1.70169795, 527300, 69587),
(40, 2735, 2783, 3519.93555, 1456.10291, 9.42710018, 5.96029949, 571208, 69587),
(41, 2735, 2783, 2190.61084, -336.132385, 98.4821014, 3.13286591, 527297, 69587),
(42, 2735, 2783, 3589.02148, 510.005615, 89.3632965, 4.8432889, 527270, 69587),
(43, 2735, 2783, 3643.11548, 1204.49951, 37.2111015, 5.72467995, 527299, 69587),
(44, 2735, 2783, 3646.68457, 346.107086, 102.6371, 0.462513924, 527293, 69587),
(45, 2735, 2783, 3457.3501, 668.078979, 86.7388, 3.49065924, 527263, 69587),
(46, 2735, 2783, 3164.2666, 348.949188, 73.8582993, 0.0261843204, 527276, 69587),
(47, 2735, 2783, 3317.81323, 429.88031, 71.9238968, 4.38077641, 527288, 69587),
(48, 2735, 2783, 3048.70288, 824.377808, 74.6530991, 1.63188303, 527289, 69587),
(49, 2735, 2783, 3130.8457, 405.746613, 74.009201, 3.01069355, 527267, 69587),
(50, 2735, 2783, 3290.37061, 1000.69153, 22.6543007, 2.46964121, 527280, 69587),
(51, 2735, 2783, 3360.62622, 483.581207, 71.9281006, 1.77151132, 527298, 69587),
(52, 2735, 2783, 3362.92432, 1005.84589, 32.0760994, 5.68977356, 527304, 69587),
(53, 2735, 2783, 3009.36255, 794.764587, 74.5634003, 3.86590457, 527284, 69587),
(54, 2735, 2783, 3151.45947, 300.622101, 73.3356018, 4.75602245, 527305, 69587);
@@ -0,0 +1,130 @@
-- Complete NeighborhoodPlot transforms for dynamic Alliance and Horde housing entities.
ALTER TABLE `housing_plot_template`
ADD COLUMN `NeighborhoodMapID` int unsigned NOT NULL DEFAULT 0 AFTER `PlotID`,
ADD COLUMN `HousePositionX` float NOT NULL DEFAULT 0 AFTER `CornerstoneEntry`,
ADD COLUMN `HousePositionY` float NOT NULL DEFAULT 0 AFTER `HousePositionX`,
ADD COLUMN `HousePositionZ` float NOT NULL DEFAULT 0 AFTER `HousePositionY`,
ADD COLUMN `HouseRotationX` float NOT NULL DEFAULT 0 AFTER `HousePositionZ`,
ADD COLUMN `HouseRotationY` float NOT NULL DEFAULT 0 AFTER `HouseRotationX`,
ADD COLUMN `HouseRotationZ` float NOT NULL DEFAULT 0 AFTER `HouseRotationY`,
ADD COLUMN `CornerstonePositionX` float NOT NULL DEFAULT 0 AFTER `HouseRotationZ`,
ADD COLUMN `CornerstonePositionY` float NOT NULL DEFAULT 0 AFTER `CornerstonePositionX`,
ADD COLUMN `CornerstonePositionZ` float NOT NULL DEFAULT 0 AFTER `CornerstonePositionY`,
ADD COLUMN `CornerstoneRotationX` float NOT NULL DEFAULT 0 AFTER `CornerstonePositionZ`,
ADD COLUMN `CornerstoneRotationY` float NOT NULL DEFAULT 0 AFTER `CornerstoneRotationX`,
ADD COLUMN `CornerstoneRotationZ` float NOT NULL DEFAULT 0 AFTER `CornerstoneRotationY`,
ADD COLUMN `WorldStateID` int NOT NULL DEFAULT 0 AFTER `CornerstoneRotationZ`,
ADD COLUMN `PlotGameObjectID` int NOT NULL DEFAULT 0 AFTER `WorldStateID`,
ADD KEY `idx_housing_plot_neighborhood` (`NeighborhoodMapID`, `PlotID`);
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1289.82996, `HousePositionY`=1126.31995, `HousePositionZ`=57.0598984, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=4.04904175, `CornerstonePositionX`=1256.18054, `CornerstonePositionY`=1091.04517, `CornerstonePositionZ`=55.7604179, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.64061153, `WorldStateID`=29778, `PlotGameObjectID`=0 WHERE `PlotID`=0 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1239.09375, `HousePositionY`=-199.75, `HousePositionZ`=74.0639954, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=772.871521, `CornerstonePositionY`=-477.524323, `CornerstonePositionZ`=11.7048616, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.14515686, `WorldStateID`=29725, `PlotGameObjectID`=0 WHERE `PlotID`=1 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1236.40625, `HousePositionY`=-56.703125, `HousePositionZ`=76.3940125, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1925.21008, `CornerstonePositionY`=948.899292, `CornerstonePositionZ`=101.645851, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.91113889, `WorldStateID`=29736, `PlotGameObjectID`=0 WHERE `PlotID`=2 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1320.15283, `HousePositionY`=-73.6458359, `HousePositionZ`=74.2064514, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=791.395813, `CornerstonePositionY`=-208.53125, `CornerstonePositionZ`=15.6006947, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.48193121, `WorldStateID`=29745, `PlotGameObjectID`=0 WHERE `PlotID`=3 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1499.40454, `HousePositionY`=59.0815964, `HousePositionZ`=77.1372986, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1607.91321, `CornerstonePositionY`=-242.921875, `CornerstonePositionZ`=76.2829895, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.38593888, `WorldStateID`=29755, `PlotGameObjectID`=0 WHERE `PlotID`=4 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1675.29163, `HousePositionY`=-190.513885, `HousePositionZ`=78.3776474, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=733.854187, `CornerstonePositionY`=-434.173615, `CornerstonePositionZ`=2.39409733, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.46964121, `WorldStateID`=29763, `PlotGameObjectID`=0 WHERE `PlotID`=5 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1543.58679, `HousePositionY`=-33.640625, `HousePositionZ`=78.4231339, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=649.975708, `CornerstonePositionY`=39.9340286, `CornerstonePositionZ`=3.91840291, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.08050632, `WorldStateID`=29765, `PlotGameObjectID`=0 WHERE `PlotID`=6 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1149.98608, `HousePositionY`=-109.125, `HousePositionZ`=73.9778976, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=574.291687, `CornerstonePositionY`=-316.392365, `CornerstonePositionZ`=7.14350891, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.18166208, `WorldStateID`=29766, `PlotGameObjectID`=0 WHERE `PlotID`=7 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1621.55005, `HousePositionY`=-266.993011, `HousePositionZ`=74.520401, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1343.776, `CornerstonePositionY`=-635.861145, `CornerstonePositionZ`=21.166666, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.3494339, `WorldStateID`=29767, `PlotGameObjectID`=0 WHERE `PlotID`=8 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=798.484375, `HousePositionY`=-264.90451, `HousePositionZ`=33.8332672, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1668.40625, `CornerstonePositionY`=1053.18579, `CornerstonePositionZ`=48.4670143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.07337832, `WorldStateID`=29768, `PlotGameObjectID`=0 WHERE `PlotID`=9 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=988.774292, `HousePositionY`=154.793411, `HousePositionZ`=31.3477249, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1266.10242, `CornerstonePositionY`=-171.21875, `CornerstonePositionZ`=72.9337311, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.11025, `WorldStateID`=29726, `PlotGameObjectID`=0 WHERE `PlotID`=10 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=2104.53296, `HousePositionY`=-298.588531, `HousePositionZ`=136.801758, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1101.68408, `CornerstonePositionY`=883.546875, `CornerstonePositionZ`=6.83333349, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.25503969, `WorldStateID`=29727, `PlotGameObjectID`=0 WHERE `PlotID`=11 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=503.543396, `HousePositionY`=-81.2135391, `HousePositionZ`=1.46946418, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=519.734375, `CornerstonePositionY`=693.203125, `CornerstonePositionZ`=155.520828, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.60054159, `WorldStateID`=29728, `PlotGameObjectID`=0 WHERE `PlotID`=12 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=673.842041, `HousePositionY`=11.3559027, `HousePositionZ`=22.7558384, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=902.305542, `CornerstonePositionY`=-545.763916, `CornerstonePositionZ`=1.43055558, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.59021568, `WorldStateID`=29729, `PlotGameObjectID`=0 WHERE `PlotID`=13 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1883.17883, `HousePositionY`=-282.579865, `HousePositionZ`=130.343445, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1180.14929, `CornerstonePositionY`=-643.673645, `CornerstonePositionZ`=5.70659733, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.82583666, `WorldStateID`=29730, `PlotGameObjectID`=0 WHERE `PlotID`=14 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=632.673645, `HousePositionY`=-132.336807, `HousePositionZ`=3.62052846, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2150.56421, `CornerstonePositionY`=-740.092041, `CornerstonePositionZ`=141.666672, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.69653416, `WorldStateID`=29731, `PlotGameObjectID`=0 WHERE `PlotID`=15 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=416.888885, `HousePositionY`=-121.208344, `HousePositionZ`=4.27795506, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1493.41321, `CornerstonePositionY`=7.58159733, `CornerstonePositionZ`=78.328125, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.6548667, `WorldStateID`=29732, `PlotGameObjectID`=0 WHERE `PlotID`=16 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1368.724, `HousePositionY`=230.901047, `HousePositionZ`=44.7523727, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=958.105896, `CornerstonePositionY`=843.576416, `CornerstonePositionZ`=4.78819466, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.23402309, `WorldStateID`=29733, `PlotGameObjectID`=0 WHERE `PlotID`=17 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1728.65454, `HousePositionY`=-874.815979, `HousePositionZ`=116.490936, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1531.53296, `CornerstonePositionY`=998.019104, `CornerstonePositionZ`=36.2552071, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=6.24828339, `WorldStateID`=29734, `PlotGameObjectID`=0 WHERE `PlotID`=18 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1934.45483, `HousePositionY`=-541.807312, `HousePositionZ`=135.931961, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=380.664948, `CornerstonePositionY`=-107.65799, `CornerstonePositionZ`=6, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.13286591, `WorldStateID`=29735, `PlotGameObjectID`=0 WHERE `PlotID`=19 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1629.94971, `HousePositionY`=-688.880188, `HousePositionZ`=97.8434296, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1864.54163, `CornerstonePositionY`=-515.519104, `CornerstonePositionZ`=130.229172, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.53072786, `WorldStateID`=29737, `PlotGameObjectID`=0 WHERE `PlotID`=20 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=795.06427, `HousePositionY`=-388.598969, `HousePositionZ`=40.5091438, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1658.41492, `CornerstonePositionY`=-169.755203, `CornerstonePositionZ`=81.0329895, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.56403685, `WorldStateID`=29738, `PlotGameObjectID`=0 WHERE `PlotID`=21 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=964.855896, `HousePositionY`=-497.982635, `HousePositionZ`=37.9858513, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=488.315979, `CornerstonePositionY`=304.34201, `CornerstonePositionZ`=99.2083359, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.6286869, `WorldStateID`=29739, `PlotGameObjectID`=0 WHERE `PlotID`=22 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1960.09033, `HousePositionY`=-706.048645, `HousePositionZ`=133.20108, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1925.599, `CornerstonePositionY`=-707.208313, `CornerstonePositionZ`=134.03299, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=6.03883934, `WorldStateID`=29740, `PlotGameObjectID`=0 WHERE `PlotID`=23 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1102.02429, `HousePositionY`=148.515625, `HousePositionZ`=33.9286919, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=224.12674, `CornerstonePositionY`=652.369812, `CornerstonePositionZ`=12.1857643, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.28121901, `WorldStateID`=29741, `PlotGameObjectID`=0 WHERE `PlotID`=24 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1833.07642, `HousePositionY`=-491.034729, `HousePositionZ`=133.244431, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1844.25867, `CornerstonePositionY`=664.767395, `CornerstonePositionZ`=88.5257568, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.305432796, `WorldStateID`=29742, `PlotGameObjectID`=0 WHERE `PlotID`=25 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1274.19446, `HousePositionY`=-626.503479, `HousePositionZ`=37.310154, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1078.18225, `CornerstonePositionY`=1023.25177, `CornerstonePositionZ`=3.14756942, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.44346094, `WorldStateID`=29743, `PlotGameObjectID`=0 WHERE `PlotID`=26 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1955.74658, `HousePositionY`=-447.786469, `HousePositionZ`=137.591614, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1213.32983, `CornerstonePositionY`=462.809021, `CornerstonePositionZ`=154.020828, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.14159274, `WorldStateID`=29724, `PlotGameObjectID`=0 WHERE `PlotID`=27 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1384.30725, `HousePositionY`=119.887154, `HousePositionZ`=49.9795418, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1663.28125, `CornerstonePositionY`=915.1875, `CornerstonePositionZ`=37.6111145, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.43990111, `WorldStateID`=29744, `PlotGameObjectID`=0 WHERE `PlotID`=28 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1175.23792, `HousePositionY`=-600.18927, `HousePositionZ`=37.2994118, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1165.72742, `CornerstonePositionY`=156.866318, `CornerstonePositionZ`=34.9565964, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.97062373, `WorldStateID`=29718, `PlotGameObjectID`=0 WHERE `PlotID`=29 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1595.39929, `HousePositionY`=-601.147583, `HousePositionZ`=97.8911819, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=952.590271, `CornerstonePositionY`=483.579865, `CornerstonePositionZ`=108.670143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.53072786, `WorldStateID`=29747, `PlotGameObjectID`=0 WHERE `PlotID`=30 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1729.51221, `HousePositionY`=-541.550354, `HousePositionZ`=104.135048, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2079.96191, `CornerstonePositionY`=-272.855896, `CornerstonePositionZ`=138.317703, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=6.16101313, `WorldStateID`=29746, `PlotGameObjectID`=0 WHERE `PlotID`=31 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1771.22742, `HousePositionY`=-953.083313, `HousePositionZ`=116.490997, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=669.458313, `CornerstonePositionY`=432.253479, `CornerstonePositionZ`=9.00173664, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.26732969, `WorldStateID`=29748, `PlotGameObjectID`=0 WHERE `PlotID`=32 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1858.23438, `HousePositionY`=-873.920166, `HousePositionZ`=121.266853, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1129.51917, `CornerstonePositionY`=770.180542, `CornerstonePositionZ`=17.6215286, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.637045383, `WorldStateID`=29749, `PlotGameObjectID`=0 WHERE `PlotID`=33 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=2101.427, `HousePositionY`=-201.295135, `HousePositionZ`=136.801712, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1309.73267, `CornerstonePositionY`=-105.368057, `CornerstonePositionZ`=73.2638702, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.71042502, `WorldStateID`=29750, `PlotGameObjectID`=0 WHERE `PlotID`=34 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=599.267395, `HousePositionY`=-273.642365, `HousePositionZ`=4.28020573, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1788.59033, `CornerstonePositionY`=-951.065979, `CornerstonePositionZ`=92.3142395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.24987698, `WorldStateID`=29751, `PlotGameObjectID`=0 WHERE `PlotID`=35 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=875.524292, `HousePositionY`=-467.357635, `HousePositionZ`=40.5583839, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1802.2135, `CornerstonePositionY`=639.21875, `CornerstonePositionZ`=85.6006927, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.20624399, `WorldStateID`=29752, `PlotGameObjectID`=0 WHERE `PlotID`=36 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1188.10071, `HousePositionY`=479.788208, `HousePositionZ`=122.239571, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=304.65625, `CornerstonePositionY`=79.8489609, `CornerstonePositionZ`=24.3628483, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.88852072, `WorldStateID`=29753, `PlotGameObjectID`=0 WHERE `PlotID`=37 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1006.46008, `HousePositionY`=920.821167, `HousePositionZ`=7.8577795, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1846.5, `CornerstonePositionY`=-879.526062, `CornerstonePositionZ`=120.711807, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.63741398, `WorldStateID`=29754, `PlotGameObjectID`=0 WHERE `PlotID`=38 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=563.423645, `HousePositionY`=549.201416, `HousePositionZ`=83.2299805, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2235.25513, `CornerstonePositionY`=-871.059021, `CornerstonePositionZ`=160.227432, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.06145668, `WorldStateID`=29720, `PlotGameObjectID`=0 WHERE `PlotID`=39 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1032.36804, `HousePositionY`=660.536438, `HousePositionZ`=9.11426735, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1023.8299, `CornerstonePositionY`=164.791672, `CornerstonePositionZ`=31.1076393, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.54301858, `WorldStateID`=29757, `PlotGameObjectID`=0 WHERE `PlotID`=40 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1877.49658, `HousePositionY`=682.232666, `HousePositionZ`=94.3096695, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1339.89587, `CornerstonePositionY`=616.347229, `CornerstonePositionZ`=42.0034752, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.56403589, `WorldStateID`=29756, `PlotGameObjectID`=0 WHERE `PlotID`=41 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1345.19788, `HousePositionY`=577.53125, `HousePositionZ`=42.0378609, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1757.38538, `CornerstonePositionY`=-865.434021, `CornerstonePositionZ`=116.753471, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.28994608, `WorldStateID`=29722, `PlotGameObjectID`=0 WHERE `PlotID`=42 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1560.4375, `HousePositionY`=1002.44269, `HousePositionZ`=37.3808861, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=639.866333, `CornerstonePositionY`=692.515625, `CornerstonePositionZ`=113.904518, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.60054159, `WorldStateID`=29664, `PlotGameObjectID`=0 WHERE `PlotID`=43 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1100.03125, `HousePositionY`=965.151062, `HousePositionZ`=8.17554188, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1903.57471, `CornerstonePositionY`=-448.295135, `CornerstonePositionZ`=137.003479, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.0436336994, `WorldStateID`=29723, `PlotGameObjectID`=0 WHERE `PlotID`=44 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1676.151, `HousePositionY`=950.605896, `HousePositionZ`=37.4253616, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1883.46179, `CornerstonePositionY`=-337.90451, `CornerstonePositionZ`=129.980911, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.57952571, `WorldStateID`=29758, `PlotGameObjectID`=0 WHERE `PlotID`=45 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1667.92883, `HousePositionY`=1084.51733, `HousePositionZ`=45.9019852, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2269.27612, `CornerstonePositionY`=-586.685791, `CornerstonePositionZ`=161.475693, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.654502392, `WorldStateID`=29759, `PlotGameObjectID`=0 WHERE `PlotID`=46 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=861.373291, `HousePositionY`=478.059021, `HousePositionZ`=69.0119629, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1366.40796, `CornerstonePositionY`=85.1840286, `CornerstonePositionZ`=49.7309036, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.506145716, `WorldStateID`=29760, `PlotGameObjectID`=0 WHERE `PlotID`=47 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=689.965271, `HousePositionY`=445.487854, `HousePositionZ`=7.07972193, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1215.64417, `CornerstonePositionY`=-9.72222233, `CornerstonePositionZ`=104.463539, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.986114979, `WorldStateID`=29761, `PlotGameObjectID`=0 WHERE `PlotID`=48 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1159.89929, `HousePositionY`=787.769104, `HousePositionZ`=17.5986328, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=412.015625, `CornerstonePositionY`=194.885422, `CornerstonePositionZ`=109.75869, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.5465827, `WorldStateID`=29762, `PlotGameObjectID`=0 WHERE `PlotID`=49 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=997.088562, `HousePositionY`=738.880188, `HousePositionZ`=9.48407078, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1032.78479, `CornerstonePositionY`=695.145813, `CornerstonePositionZ`=9.00868034, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.45058966, `WorldStateID`=29719, `PlotGameObjectID`=0 WHERE `PlotID`=50 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=945.284729, `HousePositionY`=511.006958, `HousePositionZ`=69.5376663, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=637.663208, `CornerstonePositionY`=-114.506943, `CornerstonePositionZ`=2.94618058, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.26376581, `WorldStateID`=29769, `PlotGameObjectID`=0 WHERE `PlotID`=51 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=617.628479, `HousePositionY`=631.946167, `HousePositionZ`=81.6513214, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1665.50171, `CornerstonePositionY`=-677.59552, `CornerstonePositionZ`=99.7430573, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.52556562, `WorldStateID`=29770, `PlotGameObjectID`=0 WHERE `PlotID`=52 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=927.53302, `HousePositionY`=819.734375, `HousePositionZ`=7.1142664, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1640.02258, `CornerstonePositionY`=-567.548645, `CornerstonePositionZ`=99.9861145, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.12413931, `WorldStateID`=29771, `PlotGameObjectID`=0 WHERE `PlotID`=53 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1926.60242, `HousePositionY`=969.859375, `HousePositionZ`=93.4767151, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=745.534729, `CornerstonePositionY`=840.336792, `CornerstonePositionZ`=8.75347233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.05432749, `WorldStateID`=29772, `PlotGameObjectID`=0 WHERE `PlotID`=54 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2973.0791, `HousePositionY`=-245.322922, `HousePositionZ`=113.170952, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2942.7439, `CornerstonePositionY`=-214.265625, `CornerstonePositionZ`=113.112846, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.83812618, `WorldStateID`=29778, `PlotGameObjectID`=0 WHERE `PlotID`=0 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2706.0791, `HousePositionY`=646.427063, `HousePositionZ`=47.6890335, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2674.31763, `CornerstonePositionY`=651.84552, `CornerstonePositionZ`=49.2256966, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.27089405, `WorldStateID`=29725, `PlotGameObjectID`=0 WHERE `PlotID`=1 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3453.35254, `HousePositionY`=1058.71533, `HousePositionZ`=25.2093105, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2523.34546, `CornerstonePositionY`=171.178818, `CornerstonePositionZ`=60.4097214, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.314159393, `WorldStateID`=29736, `PlotGameObjectID`=0 WHERE `PlotID`=2 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3196.81958, `HousePositionY`=-501.583344, `HousePositionZ`=190.80069, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3166.54688, `CornerstonePositionY`=-525.715271, `CornerstonePositionZ`=190.651047, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.401426077, `WorldStateID`=29745, `PlotGameObjectID`=0 WHERE `PlotID`=3 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3491.65967, `HousePositionY`=1300.32288, `HousePositionZ`=17.0956974, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3495.48779, `CornerstonePositionY`=1400.80212, `CornerstonePositionZ`=4.28472233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.64257669, `WorldStateID`=29755, `PlotGameObjectID`=0 WHERE `PlotID`=4 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2636.1875, `HousePositionY`=996.355896, `HousePositionZ`=37.5333099, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2615.62939, `CornerstonePositionY`=965.467041, `CornerstonePositionZ`=36.890625, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.523599386, `WorldStateID`=29763, `PlotGameObjectID`=0 WHERE `PlotID`=5 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2710.43677, `HousePositionY`=-428.743073, `HousePositionZ`=122.509308, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2662.95312, `CornerstonePositionY`=-427.987854, `CornerstonePositionZ`=121.833344, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.130899906, `WorldStateID`=29765, `PlotGameObjectID`=0 WHERE `PlotID`=6 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3576.45044, `HousePositionY`=234.59549, `HousePositionZ`=102.395523, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3581.92798, `CornerstonePositionY`=265.006958, `CornerstonePositionZ`=102.315979, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.93928146, `WorldStateID`=29766, `PlotGameObjectID`=0 WHERE `PlotID`=7 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2329.74316, `HousePositionY`=34.2204857, `HousePositionZ`=100.206207, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2351.66138, `CornerstonePositionY`=-11.604167, `CornerstonePositionZ`=100.142349, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.18166304, `WorldStateID`=29767, `PlotGameObjectID`=0 WHERE `PlotID`=8 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3524.30469, `HousePositionY`=342.861115, `HousePositionZ`=95.553772, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3547.51489, `CornerstonePositionY`=322.270844, `CornerstonePositionZ`=95.7100677, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.32128859, `WorldStateID`=29768, `PlotGameObjectID`=0 WHERE `PlotID`=9 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2427.0105, `HousePositionY`=5.30902767, `HousePositionZ`=100.029457, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2450.05396, `CornerstonePositionY`=267.446198, `CornerstonePositionZ`=50.2309036, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.35619521, `WorldStateID`=29726, `PlotGameObjectID`=0 WHERE `PlotID`=10 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2915.75781, `HousePositionY`=84.8854141, `HousePositionZ`=63.0604248, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2937.3186, `CornerstonePositionY`=122.1875, `CornerstonePositionZ`=62.7777786, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.14159274, `WorldStateID`=29727, `PlotGameObjectID`=0 WHERE `PlotID`=11 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3326.53394, `HousePositionY`=1484.48096, `HousePositionZ`=12.5476723, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3340.21362, `CornerstonePositionY`=1521.82983, `CornerstonePositionZ`=7.50347233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.85877991, `WorldStateID`=29728, `PlotGameObjectID`=0 WHERE `PlotID`=12 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2844.91675, `HousePositionY`=910.201416, `HousePositionZ`=28.9181652, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2821.30981, `CornerstonePositionY`=886.53125, `CornerstonePositionZ`=30.583334, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.0785398483, `WorldStateID`=29729, `PlotGameObjectID`=0 WHERE `PlotID`=13 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2762.57202, `HousePositionY`=1066.36975, `HousePositionZ`=24.7555389, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2728.46533, `CornerstonePositionY`=1070.72229, `CornerstonePositionZ`=27.2881947, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.46288013, `WorldStateID`=29730, `PlotGameObjectID`=0 WHERE `PlotID`=14 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2771.04614, `HousePositionY`=163.815979, `HousePositionZ`=67.3829193, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2767.04004, `CornerstonePositionY`=122.039932, `CornerstonePositionZ`=66.8993073, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.11701322, `WorldStateID`=29731, `PlotGameObjectID`=0 WHERE `PlotID`=15 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3010.66235, `HousePositionY`=66.3003464, `HousePositionZ`=65.9751968, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2969.21704, `CornerstonePositionY`=98.2552109, `CornerstonePositionZ`=65.4270859, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.41924858, `WorldStateID`=29732, `PlotGameObjectID`=0 WHERE `PlotID`=16 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2948.99316, `HousePositionY`=-331.461823, `HousePositionZ`=118.099068, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2938.39502, `CornerstonePositionY`=-343.118073, `CornerstonePositionZ`=121.434029, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.5065136, `WorldStateID`=29733, `PlotGameObjectID`=0 WHERE `PlotID`=17 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2253.06763, `HousePositionY`=-232.050354, `HousePositionZ`=117.511841, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2287.10083, `CornerstonePositionY`=-228.611115, `CornerstonePositionZ`=116.527786, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.57792521, `WorldStateID`=29734, `PlotGameObjectID`=0 WHERE `PlotID`=18 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3334.87329, `HousePositionY`=1133.49133, `HousePositionZ`=19.1222744, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3325.56079, `CornerstonePositionY`=1102.24829, `CornerstonePositionZ`=13.0920143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.24275255, `WorldStateID`=29735, `PlotGameObjectID`=0 WHERE `PlotID`=19 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2507.8855, `HousePositionY`=-369.854156, `HousePositionZ`=105.629181, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2471.47583, `CornerstonePositionY`=-331.336823, `CornerstonePositionZ`=101.637154, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.89724684, `WorldStateID`=29737, `PlotGameObjectID`=0 WHERE `PlotID`=20 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2609.5, `HousePositionY`=-486.513885, `HousePositionZ`=122.46122, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2592.77002, `CornerstonePositionY`=-613.664917, `CornerstonePositionZ`=138.177094, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.76474857, `WorldStateID`=29738, `PlotGameObjectID`=0 WHERE `PlotID`=21 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3038.52783, `HousePositionY`=-566.713562, `HousePositionZ`=214.280579, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3065.125, `CornerstonePositionY`=-579.90802, `CornerstonePositionZ`=214.347229, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.48709488, `WorldStateID`=29739, `PlotGameObjectID`=0 WHERE `PlotID`=22 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3339.00879, `HousePositionY`=-607.729187, `HousePositionZ`=204.286819, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3309.42188, `CornerstonePositionY`=-594.9375, `CornerstonePositionZ`=208.557297, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.16617489, `WorldStateID`=29740, `PlotGameObjectID`=0 WHERE `PlotID`=23 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2856.7605, `HousePositionY`=-263.196198, `HousePositionZ`=114.781403, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3803.50171, `CornerstonePositionY`=1159.10596, `CornerstonePositionZ`=8.74826431, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.043633461, `WorldStateID`=29741, `PlotGameObjectID`=0 WHERE `PlotID`=24 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3432.10254, `HousePositionY`=1436.66492, `HousePositionZ`=8.47468376, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3440.84473, `CornerstonePositionY`=1465.80554, `CornerstonePositionZ`=8.31597233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.21300626, `WorldStateID`=29742, `PlotGameObjectID`=0 WHERE `PlotID`=25 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2599.97583, `HousePositionY`=608.112854, `HousePositionZ`=45.1348953, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2615.26392, `CornerstonePositionY`=633.758667, `CornerstonePositionZ`=47.7326393, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.97418833, `WorldStateID`=29743, `PlotGameObjectID`=0 WHERE `PlotID`=26 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3672.76831, `HousePositionY`=244.071182, `HousePositionZ`=104.399696, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3639.85596, `CornerstonePositionY`=259.371521, `CornerstonePositionZ`=104.381943, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.31452799, `WorldStateID`=29724, `PlotGameObjectID`=0 WHERE `PlotID`=27 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3628.06763, `HousePositionY`=1325.21533, `HousePositionZ`=29.6373196, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3637.43848, `CornerstonePositionY`=1363.48096, `CornerstonePositionZ`=33.6493073, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.48353446, `WorldStateID`=29744, `PlotGameObjectID`=0 WHERE `PlotID`=28 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3516.48169, `HousePositionY`=1185.64587, `HousePositionZ`=16.9397984, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3493.40796, `CornerstonePositionY`=1175.13367, `CornerstonePositionZ`=2.31597233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.157079697, `WorldStateID`=29718, `PlotGameObjectID`=0 WHERE `PlotID`=29 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2662.35669, `HousePositionY`=831.465271, `HousePositionZ`=44.1460228, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2686.68066, `CornerstonePositionY`=813.067688, `CornerstonePositionZ`=43.7934036, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.14159274, `WorldStateID`=29747, `PlotGameObjectID`=0 WHERE `PlotID`=30 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3352.42285, `HousePositionY`=-331.163208, `HousePositionZ`=182.655029, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3368.13721, `CornerstonePositionY`=-403.112854, `CornerstonePositionZ`=186.428818, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.68780756, `WorldStateID`=29746, `PlotGameObjectID`=0 WHERE `PlotID`=31 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3284.97925, `HousePositionY`=-376.534729, `HousePositionZ`=182.794388, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3136.13892, `CornerstonePositionY`=-650.277771, `CornerstonePositionZ`=226.342026, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.68104696, `WorldStateID`=29748, `PlotGameObjectID`=0 WHERE `PlotID`=32 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2510.07642, `HousePositionY`=-53.8263893, `HousePositionZ`=95.4554596, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2478.60938, `CornerstonePositionY`=-80.5520859, `CornerstonePositionZ`=95.2361145, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.375246763, `WorldStateID`=29749, `PlotGameObjectID`=0 WHERE `PlotID`=33 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3457.79004, `HousePositionY`=761.239563, `HousePositionZ`=81.5263519, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3461.76294, `CornerstonePositionY`=728.498291, `CornerstonePositionZ`=81.5017395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.35619521, `WorldStateID`=29750, `PlotGameObjectID`=0 WHERE `PlotID`=34 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2605.91235, `HousePositionY`=905.784729, `HousePositionZ`=39.1738815, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2440.56592, `CornerstonePositionY`=927.930542, `CornerstonePositionZ`=36.171875, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.514872551, `WorldStateID`=29751, `PlotGameObjectID`=0 WHERE `PlotID`=35 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2763.09204, `HousePositionY`=1170.68579, `HousePositionZ`=25.820612, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2737.625, `CornerstonePositionY`=1142.71008, `CornerstonePositionZ`=24.9652786, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.383973122, `WorldStateID`=29752, `PlotGameObjectID`=0 WHERE `PlotID`=36 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2477.74316, `HousePositionY`=514.446167, `HousePositionZ`=41.3817673, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2510.36035, `CornerstonePositionY`=542.6875, `CornerstonePositionZ`=41.1493073, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.99680424, `WorldStateID`=29753, `PlotGameObjectID`=0 WHERE `PlotID`=37 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2571.625, `HousePositionY`=-299.335083, `HousePositionZ`=105.492233, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2570.73096, `CornerstonePositionY`=-331.211823, `CornerstonePositionZ`=105.463539, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.26020288, `WorldStateID`=29754, `PlotGameObjectID`=0 WHERE `PlotID`=38 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3538.40894, `HousePositionY`=646.15802, `HousePositionZ`=82.6427765, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3602.28638, `CornerstonePositionY`=642.958313, `CornerstonePositionZ`=83.3819427, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.70169795, `WorldStateID`=29720, `PlotGameObjectID`=0 WHERE `PlotID`=39 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3558.43579, `HousePositionY`=1398.24829, `HousePositionZ`=13.0544977, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3522.78052, `CornerstonePositionY`=1455.151, `CornerstonePositionZ`=9.38541698, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.96029949, `WorldStateID`=29757, `PlotGameObjectID`=0 WHERE `PlotID`=40 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2157.54517, `HousePositionY`=-327.392365, `HousePositionZ`=98.6816559, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2190.29688, `CornerstonePositionY`=-337.149323, `CornerstonePositionZ`=98.519104, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.13286591, `WorldStateID`=29756, `PlotGameObjectID`=0 WHERE `PlotID`=41 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3579.25781, `HousePositionY`=470.298615, `HousePositionZ`=89.6702805, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3597.54175, `CornerstonePositionY`=501.835083, `CornerstonePositionZ`=89.5711823, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.8432889, `WorldStateID`=29722, `PlotGameObjectID`=0 WHERE `PlotID`=42 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3669.58765, `HousePositionY`=1187.625, `HousePositionZ`=37.6142006, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3645.65967, `CornerstonePositionY`=1202.90979, `CornerstonePositionZ`=37.5295143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.72467995, `WorldStateID`=29664, `PlotGameObjectID`=0 WHERE `PlotID`=43 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3618.14575, `HousePositionY`=361.4375, `HousePositionZ`=96.5879211, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3647.06177, `CornerstonePositionY`=353.182281, `CornerstonePositionZ`=102.725693, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.462513924, `WorldStateID`=29723, `PlotGameObjectID`=0 WHERE `PlotID`=44 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3429.68311, `HousePositionY`=654.460083, `HousePositionZ`=79.9497604, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3453.25439, `CornerstonePositionY`=669.918396, `CornerstonePositionZ`=86.5920181, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.49065924, `WorldStateID`=29758, `PlotGameObjectID`=0 WHERE `PlotID`=45 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3198.88989, `HousePositionY`=365.130219, `HousePositionZ`=65.7899551, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3167.93579, `CornerstonePositionY`=364.013885, `CornerstonePositionZ`=73.8836823, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.0261843204, `WorldStateID`=29759, `PlotGameObjectID`=0 WHERE `PlotID`=46 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3333.03906, `HousePositionY`=401.885406, `HousePositionZ`=69.8325729, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3315.51489, `CornerstonePositionY`=427.78125, `CornerstonePositionZ`=71.921875, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.38077641, `WorldStateID`=29760, `PlotGameObjectID`=0 WHERE `PlotID`=47 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3038.48608, `HousePositionY`=861.565979, `HousePositionZ`=74.8148575, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3047.40112, `CornerstonePositionY`=833.147583, `CornerstonePositionZ`=74.6770859, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.63188303, `WorldStateID`=29761, `PlotGameObjectID`=0 WHERE `PlotID`=48 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3092.35425, `HousePositionY`=407.09549, `HousePositionZ`=66.334671, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3119.01904, `CornerstonePositionY`=394.869781, `CornerstonePositionZ`=74.2621536, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.01069355, `WorldStateID`=29762, `PlotGameObjectID`=0 WHERE `PlotID`=49 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3268.73779, `HousePositionY`=1029.94788, `HousePositionZ`=20.3230076, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3288.02271, `CornerstonePositionY`=1002.55902, `CornerstonePositionZ`=22.7534733, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.46964121, `WorldStateID`=29719, `PlotGameObjectID`=0 WHERE `PlotID`=50 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3357.65356, `HousePositionY`=523.8125, `HousePositionZ`=71.9353561, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3348.19092, `CornerstonePositionY`=487.526031, `CornerstonePositionZ`=72.3767395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.77151132, `WorldStateID`=29769, `PlotGameObjectID`=0 WHERE `PlotID`=51 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3386.48877, `HousePositionY`=979.743042, `HousePositionZ`=29.0968018, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3365.41138, `CornerstonePositionY`=1004.1684, `CornerstonePositionZ`=32.8020821, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.68977356, `WorldStateID`=29770, `PlotGameObjectID`=0 WHERE `PlotID`=52 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2970.98608, `HousePositionY`=796.392395, `HousePositionZ`=74.7324066, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3003.05908, `CornerstonePositionY`=772.649292, `CornerstonePositionZ`=74.5642395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.86590457, `WorldStateID`=29771, `PlotGameObjectID`=0 WHERE `PlotID`=53 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3157.63208, `HousePositionY`=252.003479, `HousePositionZ`=69.2628174, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3151.59033, `CornerstonePositionY`=297.625, `CornerstonePositionZ`=73.4253464, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.75602245, `WorldStateID`=29772, `PlotGameObjectID`=0 WHERE `PlotID`=54 AND `ExteriorMapID`=2735;
@@ -0,0 +1,7 @@
-- Captured purchase cost used by the Cornerstone UI for both faction maps.
ALTER TABLE `housing_plot_template`
ADD COLUMN `Cost` bigint unsigned NOT NULL DEFAULT 10000000 AFTER `PlotGameObjectID`;
UPDATE `housing_plot_template`
SET `Cost` = 10000000
WHERE `ExteriorMapID` IN (2735, 2736) AND `VerifiedBuild` = 69587;
@@ -0,0 +1,17 @@
-- Housing plot purchase and relocation audit for both faction neighborhoods.
CREATE TABLE `housing_plot_transaction` (
`TransactionID` bigint unsigned NOT NULL AUTO_INCREMENT,
`OwnerGuid` bigint unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`NeighborhoodGuid` varchar(64) NOT NULL,
`OldPlotID` tinyint unsigned NOT NULL,
`NewPlotID` tinyint unsigned NOT NULL,
`ExteriorMapID` int unsigned NOT NULL,
`Cost` bigint unsigned NOT NULL DEFAULT 0,
`TransactionType` tinyint unsigned NOT NULL COMMENT '0=purchase, 1=move',
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`TransactionID`),
KEY `idx_housing_plot_transaction_owner` (`OwnerGuid`, `CreatedAt`),
KEY `idx_housing_plot_transaction_house` (`HouseGuid`),
KEY `idx_housing_plot_transaction_plot` (`NeighborhoodGuid`, `NewPlotID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,65 @@
-- Runtime lookup indexes for the Housing room, mesh, fixture and decor loaders.
-- These tables contain per-house entities reconstructed from UPDATE_OBJECT captures.
--
-- Keep every index creation idempotent. Character DB updates are applied statement by
-- statement, so a previous failed run may already have created some of these indexes.
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_room_entity'
AND `INDEX_NAME` = 'idx_housing_room_house_order'
),
'SELECT 1',
'ALTER TABLE `housing_room_entity` ADD KEY `idx_housing_room_house_order` (`HouseGuid`, `HouseRoomID`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_room_component_entity'
AND `INDEX_NAME` = 'idx_housing_component_house_room'
),
'SELECT 1',
'ALTER TABLE `housing_room_component_entity` ADD KEY `idx_housing_component_house_room` (`HouseGuid`, `RoomGuid`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_fixture_entity'
AND `INDEX_NAME` = 'idx_housing_fixture_house'
),
'SELECT 1',
'ALTER TABLE `housing_fixture_entity` ADD KEY `idx_housing_fixture_house` (`HouseGuid`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `INDEX_NAME` = 'idx_housing_decor_house_entity'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD KEY `idx_housing_decor_house_entity` (`HouseGuid`, `EntityGuid`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
@@ -0,0 +1,16 @@
-- Persists the exact exterior plot return point while a player is inside Map 2783.
-- This keeps Alliance and Horde exits data-driven and prevents cross-faction returns.
CREATE TABLE IF NOT EXISTS `character_housing_return_location` (
`OwnerGuid` bigint unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`ExteriorMapID` int unsigned NOT NULL,
`PlotID` tinyint unsigned NOT NULL,
`PositionX` float NOT NULL,
`PositionY` float NOT NULL,
`PositionZ` float NOT NULL,
`Orientation` float NOT NULL,
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`OwnerGuid`),
KEY `idx_housing_return_house` (`HouseGuid`),
KEY `idx_housing_return_plot` (`ExteriorMapID`, `PlotID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,21 @@
-- Data-driven exterior door configuration for every Midnight housing plot.
ALTER TABLE `character_housing`
ADD COLUMN `ExteriorMapID` int unsigned NOT NULL DEFAULT 0 AFTER `PlotID`,
ADD KEY `idx_character_housing_map_plot` (`ExteriorMapID`, `PlotID`);
ALTER TABLE `housing_plot_template`
ADD COLUMN `DoorEntry` int unsigned NOT NULL DEFAULT 0 AFTER `CornerstoneEntry`,
ADD KEY `idx_housing_plot_door` (`ExteriorMapID`, `PlotID`, `DoorEntry`);
-- Founder's Point (Alliance) front door.
UPDATE `housing_plot_template`
SET `DoorEntry` = 586576
WHERE `ExteriorMapID` = 2735;
-- Razorwind Shores (Horde) front door.
UPDATE `housing_plot_template`
SET `DoorEntry` = 602702
WHERE `ExteriorMapID` = 2736;
ALTER TABLE `character_housing`
ADD KEY `idx_character_housing_plot` (`PlotID`);
@@ -0,0 +1,17 @@
-- Midnight 12.1.0.69587 Housing persistent decor instances.
-- One row represents one licensed decor object exposed through FHousingStorage_C.
CREATE TABLE IF NOT EXISTS `housing_decor_instance` (
`BattlenetAccountId` int unsigned NOT NULL,
`DecorGuid` varchar(64) NOT NULL,
`DecorID` int unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL DEFAULT '',
`PlacementStatus` tinyint unsigned NOT NULL DEFAULT 0,
`SourceType` tinyint unsigned NOT NULL DEFAULT 0,
`SourceValue` varchar(255) NOT NULL DEFAULT '',
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`BattlenetAccountId`, `DecorGuid`),
UNIQUE KEY `uq_housing_decor_instance_guid` (`DecorGuid`),
KEY `idx_housing_decor_instance_type` (`BattlenetAccountId`, `DecorID`),
KEY `idx_housing_decor_instance_house` (`HouseGuid`, `PlacementStatus`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,12 @@
-- Housing dynamic entity payload quarantine.
-- Invalid captured rows remain available for analysis but are never serialized to the client.
CREATE TABLE IF NOT EXISTS `housing_entity_quarantine` (
`EntityType` varchar(32) NOT NULL,
`EntityGuid` varchar(64) NOT NULL,
`Reason` varchar(64) NOT NULL,
`HitCount` int unsigned NOT NULL DEFAULT 1,
`FirstSeenAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastSeenAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`EntityType`, `EntityGuid`),
KEY `idx_housing_quarantine_last_seen` (`LastSeenAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,34 @@
-- Housing blueprint persistence for Midnight 12.1.
-- Blueprint records are owned by a Battle.net account; item rows describe the
-- decor, dyes, rooms and fixtures required to reconstruct the saved layout.
CREATE TABLE IF NOT EXISTS `housing_blueprint` (
`ID` bigint unsigned NOT NULL AUTO_INCREMENT,
`BnetAccountID` int unsigned NOT NULL,
`UUID` varchar(64) NOT NULL,
`Name` varchar(127) NOT NULL DEFAULT '',
`Type` tinyint unsigned NOT NULL DEFAULT 0,
`DateCreated` bigint NOT NULL DEFAULT 0,
`DateDeleted` bigint NOT NULL DEFAULT 0,
`Flags` tinyint unsigned NOT NULL DEFAULT 0,
`DeleteReason` tinyint unsigned NOT NULL DEFAULT 0,
`RequiredFaction` tinyint NOT NULL DEFAULT -1,
`RequiredHouseType` int unsigned NOT NULL DEFAULT 0,
`RequiredHouseSize` tinyint unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`ID`),
UNIQUE KEY `uq_housing_blueprint_account_uuid` (`BnetAccountID`, `UUID`),
KEY `idx_housing_blueprint_account_deleted` (`BnetAccountID`, `DateDeleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Account-owned Housing blueprint metadata';
CREATE TABLE IF NOT EXISTS `housing_blueprint_item` (
`BlueprintID` bigint unsigned NOT NULL,
`ItemType` tinyint unsigned NOT NULL COMMENT '0 decor, 1 dye item, 2 room, 3 fixture',
`ItemID` int unsigned NOT NULL,
`Quantity` int unsigned NOT NULL DEFAULT 1,
PRIMARY KEY (`BlueprintID`, `ItemType`, `ItemID`),
CONSTRAINT `fk_housing_blueprint_item_blueprint`
FOREIGN KEY (`BlueprintID`) REFERENCES `housing_blueprint` (`ID`)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Items stored by a Housing blueprint';
@@ -0,0 +1,19 @@
-- Midnight 12.1 Housing decor lock persistence.
-- Idempotent for partially updated Character databases.
SET @housing_locked_exists := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'housing_placed_decor'
AND COLUMN_NAME = 'Locked'
);
SET @housing_locked_sql := IF(
@housing_locked_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `Locked` tinyint unsigned NOT NULL DEFAULT 0 AFTER `Flags`',
'SELECT 1'
);
PREPARE housing_locked_stmt FROM @housing_locked_sql;
EXECUTE housing_locked_stmt;
DEALLOCATE PREPARE housing_locked_stmt;
@@ -0,0 +1,35 @@
-- Midnight 12.1 Housing decor dye persistence.
-- Add each column independently so a partially applied update can be retried safely.
SET @housing_dye0_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'housing_placed_decor' AND COLUMN_NAME = 'DyeSlot0'
);
SET @housing_dye0_sql := IF(@housing_dye0_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `DyeSlot0` int unsigned NOT NULL DEFAULT 0 AFTER `Locked`',
'SELECT 1');
PREPARE housing_dye0_stmt FROM @housing_dye0_sql;
EXECUTE housing_dye0_stmt;
DEALLOCATE PREPARE housing_dye0_stmt;
SET @housing_dye1_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'housing_placed_decor' AND COLUMN_NAME = 'DyeSlot1'
);
SET @housing_dye1_sql := IF(@housing_dye1_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `DyeSlot1` int unsigned NOT NULL DEFAULT 0 AFTER `DyeSlot0`',
'SELECT 1');
PREPARE housing_dye1_stmt FROM @housing_dye1_sql;
EXECUTE housing_dye1_stmt;
DEALLOCATE PREPARE housing_dye1_stmt;
SET @housing_dye2_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'housing_placed_decor' AND COLUMN_NAME = 'DyeSlot2'
);
SET @housing_dye2_sql := IF(@housing_dye2_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `DyeSlot2` int unsigned NOT NULL DEFAULT 0 AFTER `DyeSlot1`',
'SELECT 1');
PREPARE housing_dye2_stmt FROM @housing_dye2_sql;
EXECUTE housing_dye2_stmt;
DEALLOCATE PREPARE housing_dye2_stmt;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,29 @@
-- DBErrors Fixes
UPDATE `gameobject_template` SET `Data1`=660768, `Data30`=0, `Data33`=0 WHERE `entry`=660768;
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 660768;
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 251285, 1.277792, 0, 1, 0, 3, 5, 'Petrified Root');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 256704, 0.10222337, 0, 1, 0, 1, 1, 'Design: Powerful Eversong Diamond');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 258839, 0.12777919, 0, 1, 0, 1, 1, 'Concealed Catalogue');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 270900, 0.025555842, 0, 1, 0, 1, 1, 'Pattern: Snakeskin Lining');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273773, 0.20444673, 0, 1, 0, 1, 1, 'Handwraps of Blasphemous Rites');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273774, 0.025555842, 0, 1, 0, 1, 1, 'Snakeskin Spaulders');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273776, 0.51111674, 0, 1, 0, 1, 1, 'Ancient General''s Obsidian Pillars');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273778, 0.48556095, 0, 1, 0, 1, 1, 'Polished Lightwood Channeler');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273779, 0.15333503, 0, 1, 0, 1, 1, 'Nocuous Focal Fang');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273781, 0.025555842, 0, 1, 0, 1, 1, 'Strand of Warding Fangs');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273784, 0.10222337, 0, 1, 0, 1, 1, 'Ancestral Amani Recurve');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273786, 0.025555842, 0, 1, 0, 1, 1, 'Leggings of Entwined Serpents');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273787, 0.051111683, 0, 1, 0, 1, 1, 'Aged Interwoven Scaleplate');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273789, 0.30667007, 0, 1, 0, 1, 1, 'Chestguard of Corroded Scales');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273791, 0.43444926, 0, 1, 0, 1, 1, 'Spare Speaker''s Hood');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273792, 0.7666752, 0, 1, 0, 1, 1, 'Band of the Amani Warlord');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273794, 0.025555842, 0, 1, 0, 1, 1, 'Knot of Writhing Serpents');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273795, 0.10222337, 0, 1, 0, 1, 1, 'Coiled Fangstone');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 273797, 0.40889347, 0, 1, 0, 1, 1, 'Tattered Amani War Banner');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 274581, 0.23000257, 0, 1, 0, 1, 1, 'Primessence of Shadow');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 275070, 0.051111683, 0, 1, 0, 1, 1, 'Sharpened Lightwood Slasher');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 276804, 0.792231, 0, 1, 0, 1, 1, 'The Writhing Brood');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 279211, 2.9389215, 0, 1, 0, 1, 1, 'Pillar of the Fanged Altar');
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (660768, 0, 279573, 2.4022489, 0, 1, 0, 15, 15, 'Fading Voidwhisper');
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,153 @@
DELETE FROM `conversation_actors` WHERE (`ConversationId`=31236 AND `Idx`=0);
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(31236, 109988, 0, 233063, 136650, 0, 0, 69587);
DELETE FROM `conversation_line_template` WHERE `Id`=85956;
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
(85956, 101, 0, 0, 0, 69587);
DELETE FROM `conversation_template` WHERE `Id`=31236;
INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
(31236, 85956, 0, 69587);
DELETE FROM `quest_poi` WHERE (`QuestID`=96801 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96801 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96446 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96446 AND `BlobIndex`=0 AND `Idx1`=0);
INSERT INTO `quest_poi` (`QuestID`, `BlobIndex`, `Idx1`, `ObjectiveIndex`, `QuestObjectiveID`, `QuestObjectID`, `MapID`, `UiMapID`, `Priority`, `Flags`, `WorldEffectID`, `PlayerConditionID`, `NavigationPlayerConditionID`, `SpawnTrackingID`, `AlwaysAllowMergingBlobs`, `VerifiedBuild`) VALUES
(96801, 0, 1, 32, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 69587), -- Calling All Combatants!
(96801, 0, 0, -1, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 2792927, 0, 69587), -- Calling All Combatants!
(96446, 0, 1, 32, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 69587), -- Spark of Tides
(96446, 0, 0, -1, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 2792942, 0, 69587); -- Spark of Tides
DELETE FROM `quest_poi_points` WHERE (`QuestID`=96801 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96801 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96446 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96446 AND `Idx1`=0 AND `Idx2`=0);
INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(96801, 1, 0, 8253, -4290, 11, 69587), -- Calling All Combatants!
(96801, 0, 0, 8253, -4290, 11, 69587), -- Calling All Combatants!
(96446, 1, 0, 8560, -4463, 19, 69587), -- Spark of Tides
(96446, 0, 0, 8560, -4463, 19, 69587); -- Spark of Tides
DELETE FROM `spawn_tracking_template` WHERE `SpawnTrackingId`=2792927;
INSERT INTO `spawn_tracking_template` (`SpawnTrackingId`, `MapId`, `PhaseId`, `PhaseGroup`, `PhaseUseFlags`, `VerifiedBuild`) VALUES
(2792927, 0, 0, 0, 0, 69587); -- Map: 0 (Eastern Kingdoms) - Phase: 0
DELETE FROM `gameobject_template` WHERE `entry` IN (584163 /*Root-Woven Window*/, 612070 /*Small Elegant Padded Chair*/, 576308 /*Earthen Etched Throne*/, 587755 /*Shadowforge Stone Chair*/, 574892 /*Admiralty's Upholstered Chair*/, 656579 /*[DNT] Eversong Canvas - Painting 03 - Easel*/, 656581 /*[DNT] Eversong Canvas - Painting 01 - Easel*/, 656582 /*[DNT] 12BE_BloodElf_Furniture_Easel07*/, 623305 /*Chair*/, 623304 /*Chair*/, 623301 /*Chair*/, 623306 /*Chair*/, 623303 /*Chair*/, 623302 /*Chair*/, 609894 /*Bench*/, 609892 /*Bench*/, 609890 /*Bench*/, 609889 /*Bench*/, 609879 /*Bench*/, 578991 /*Mechagon Jump Pad*/);
INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`, `Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`, `Data33`, `Data34`, `RequiredLevel`, `ContentTuningId`, `VerifiedBuild`) VALUES
(584163, 10, 114481, 'Root-Woven Window', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 69587), -- Root-Woven Window
(612070, 7, 116300, 'Small Elegant Padded Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Small Elegant Padded Chair
(576308, 7, 88777, 'Earthen Etched Throne', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Earthen Etched Throne
(587755, 7, 114798, 'Shadowforge Stone Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Shadowforge Stone Chair
(574892, 7, 47630, 'Admiralty\'s Upholstered Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Admiralty's Upholstered Chair
(656579, 5, 113997, '[DNT] Eversong Canvas - Painting 03 - Easel', '', '', '', 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Eversong Canvas - Painting 03 - Easel
(656581, 5, 126432, '[DNT] Eversong Canvas - Painting 01 - Easel', '', '', '', 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Eversong Canvas - Painting 01 - Easel
(656582, 5, 120231, '[DNT] 12BE_BloodElf_Furniture_Easel07', '', '', '', 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] 12BE_BloodElf_Furniture_Easel07
(623305, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623304, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623301, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623306, 7, 108712, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623303, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623302, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(609894, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(609892, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(609890, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(609889, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(609879, 7, 107831, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(578991, 10, 55174, 'Mechagon Jump Pad', '', '', '', 0.949999988079071044, 1634, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Mechagon Jump Pad
DELETE FROM `conversation_actors` WHERE (`ConversationId`=31233 AND `Idx`=0);
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(31233, 109988, 0, 233063, 136650, 0, 0, 69587);
DELETE FROM `conversation_line_template` WHERE `Id`=85931;
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
(85931, 101, 0, 0, 0, 69587);
DELETE FROM `conversation_template` WHERE `Id`=31233;
INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
(31233, 85931, 0, 69587);
DELETE FROM `quest_poi` WHERE (`QuestID`=96446 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96446 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=93505 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=93505 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=93502 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=93502 AND `BlobIndex`=0 AND `Idx1`=0);
INSERT INTO `quest_poi` (`QuestID`, `BlobIndex`, `Idx1`, `ObjectiveIndex`, `QuestObjectiveID`, `QuestObjectID`, `MapID`, `UiMapID`, `Priority`, `Flags`, `WorldEffectID`, `PlayerConditionID`, `NavigationPlayerConditionID`, `SpawnTrackingID`, `AlwaysAllowMergingBlobs`, `VerifiedBuild`) VALUES
(96446, 0, 1, 32, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 0, 0, 69587), -- Spark of Tides
(96446, 0, 0, -1, 0, 0, 0, 2393, 0, 0, 0, 0, 0, 2792942, 0, 69587), -- Spark of Tides
(93505, 0, 1, 32, 0, 0, 0, 2393, 0, 2, 0, 0, 0, 0, 0, 69587), -- Enshrouded in War
(93505, 0, 0, -1, 0, 0, 0, 2393, 0, 2, 0, 0, 0, 0, 0, 69587), -- Enshrouded in War
(93502, 0, 1, 32, 0, 0, 0, 2393, 0, 2, 0, 0, 0, 0, 0, 69587), -- Enshrouded Solo
(93502, 0, 0, -1, 0, 0, 0, 2393, 0, 2, 0, 0, 0, 0, 0, 69587); -- Enshrouded Solo
DELETE FROM `quest_poi_points` WHERE (`QuestID`=96446 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96446 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=93505 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=93502 AND `Idx1`=1 AND `Idx2`=0);
INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(96446, 1, 0, 8560, -4463, 19, 69587), -- Spark of Tides
(96446, 0, 0, 8560, -4463, 19, 69587), -- Spark of Tides
(93505, 1, 0, 8253, -4351, 0, 69587), -- Enshrouded in War
(93502, 1, 0, 8262, -4351, 0, 69587); -- Enshrouded Solo
UPDATE `quest_poi_points` SET `X`=8234 WHERE (`QuestID`=93505 AND `Idx1`=0 AND `Idx2`=0);
UPDATE `quest_poi_points` SET `X`=8245, `Y`=-4353 WHERE (`QuestID`=93502 AND `Idx1`=0 AND `Idx2`=0); -- Enshrouded Solo
DELETE FROM `creature_template_addon` WHERE `entry` IN (266527 /*266527 (Andustrasza) - Cosmetic - ZZZ above head*/, 263929 /*263929 (Riftblade Maella's Summons) - Manifest Ren'dorei Scroll*/);
INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(266527, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 5, '1233597'), -- 266527 (Andustrasza) - Cosmetic - ZZZ above head
(263929, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1291032'); -- 263929 (Riftblade Maella's Summons) - Manifest Ren'dorei Scroll
DELETE FROM `gameobject_template` WHERE `entry` IN (617936 /*Mechagon Magnet*/, 613692 /*Bench*/, 613693 /*Bench*/, 613691 /*Bench*/, 611109 /*Bench*/, 611106 /*Bench*/, 611108 /*Bench*/, 611099 /*Bench*/, 611104 /*Bench*/, 611100 /*Bench*/, 611107 /*Bench*/, 611102 /*Bench*/, 611105 /*Bench*/, 611103 /*Bench*/, 611101 /*Bench*/, 656581 /*[DNT] Eversong Canvas - Painting 01 - Easel*/, 656579 /*[DNT] Eversong Canvas - Painting 03 - Easel*/, 656582 /*[DNT] 12BE_BloodElf_Furniture_Easel07*/, 623305 /*Chair*/, 623304 /*Chair*/, 623301 /*Chair*/, 609892 /*Bench*/, 623302 /*Chair*/, 623303 /*Chair*/, 623306 /*Chair*/, 609889 /*Bench*/, 609894 /*Bench*/, 609890 /*Bench*/, 578991 /*Mechagon Jump Pad*/, 609879 /*Bench*/);
INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`, `Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`, `Data33`, `Data34`, `RequiredLevel`, `ContentTuningId`, `VerifiedBuild`) VALUES
(617936, 10, 77957, 'Mechagon Magnet', '', '', '', 0.5, 1852, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 1257217, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 149254, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 25, 5087, 69587), -- Mechagon Magnet
(613692, 7, 107831, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(613693, 7, 107831, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(613691, 7, 107831, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611109, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611106, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611108, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611099, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611104, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611100, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611107, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611102, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611105, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611103, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(611101, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(656581, 5, 126432, '[DNT] Eversong Canvas - Painting 01 - Easel', '', '', '', 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Eversong Canvas - Painting 01 - Easel
(656579, 5, 113997, '[DNT] Eversong Canvas - Painting 03 - Easel', '', '', '', 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Eversong Canvas - Painting 03 - Easel
(656582, 5, 120231, '[DNT] 12BE_BloodElf_Furniture_Easel07', '', '', '', 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] 12BE_BloodElf_Furniture_Easel07
(623305, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623304, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623301, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(609892, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(623302, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623303, 7, 104962, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(623306, 7, 108712, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(609889, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(609894, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(609890, 7, 107830, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Bench
(578991, 10, 55174, 'Mechagon Jump Pad', '', '', '', 0.949999988079071044, 1634, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Mechagon Jump Pad
(609879, 7, 107831, 'Bench', '', '', '', 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Bench
ALTER TABLE `areatrigger_create_properties` ADD `NewFlags` int unsigned NOT NULL DEFAULT 0 AFTER `Flags`;
UPDATE `areatrigger_create_properties` SET `NewFlags`=`NewFlags`|0x02 WHERE (`Flags`&0x0100)!=0;
UPDATE `areatrigger_create_properties` SET `NewFlags`=`NewFlags`|0x04 WHERE (`Flags`&0x0001)!=0;
UPDATE `areatrigger_create_properties` SET `NewFlags`=`NewFlags`|0x08 WHERE (`Flags`&0x0008)!=0;
UPDATE `areatrigger_create_properties` SET `NewFlags`=`NewFlags`|0x10 WHERE (`Flags`&0x0010)!=0;
UPDATE `areatrigger_create_properties` SET `NewFlags`=`NewFlags`|0x20 WHERE (`Flags`&0x0020)!=0;
ALTER TABLE `areatrigger_create_properties` DROP `Flags`;
ALTER TABLE `areatrigger_create_properties` CHANGE `NewFlags` `Flags` int unsigned NOT NULL DEFAULT 0 AFTER `IsAreatriggerCustom`;
ALTER TABLE `areatrigger_create_properties`
ADD `Roll` float NOT NULL DEFAULT 0 AFTER `ShapeData7`,
ADD `Pitch` float NOT NULL DEFAULT 0 AFTER `Roll`,
ADD `Yaw` float NOT NULL DEFAULT 0 AFTER `Pitch`,
ADD `TargetRoll` float NULL DEFAULT NULL AFTER `Yaw`,
ADD `TargetPitch` float NULL DEFAULT NULL AFTER `TargetRoll`,
ADD `TargetYaw` float NULL DEFAULT NULL AFTER `TargetPitch`;
@@ -0,0 +1,603 @@
DELETE FROM `creature_equip_template` WHERE (`CreatureID`=242643 AND `ID`=2);
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `AppearanceModID1`, `ItemVisual1`, `ItemID2`, `AppearanceModID2`, `ItemVisual2`, `ItemID3`, `AppearanceModID3`, `ItemVisual3`, `VerifiedBuild`) VALUES
(242643, 2, 190006, 0, 0, 230376, 0, 0, 0, 0, 0, 69587); -- You
DELETE FROM `areatrigger_template` WHERE (`IsCustom`=0 AND `Id` IN (40464,39286,40946,38792,38795));
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES
(40464, 0, 69587),
(39286, 0, 69587),
(40946, 0, 69587),
(38792, 0, 69587),
(38795, 0, 69587);
DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (38901,37453,39459));
INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `Roll`, `Pitch`, `Yaw`, `TargetRoll`, `TargetPitch`, `TargetYaw`, `VerifiedBuild`) VALUES
(38901, 0, 40464, 0, 0, 0, 0, 0, 0, -1, 0, 401, NULL, 4000, 20, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587), -- Spell: 1246983 (Void Slime)
(37453, 0, 39286, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 10000, 40.02567291259765625, 4, 5, 5, 20, 20, 10, 10, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587), -- Spell: 1231989 ([DNT] Alleria Directed Attack)
(39459, 0, 40946, 0, 0, 0, 0, 90998, 0, -1, 0, 521, NULL, 10000, 20, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587); -- Spell: 1252848 (Domineer)
UPDATE `areatrigger_create_properties` SET `Speed`=20.56327629089355468 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.56327629089355468 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.5494537353515625 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.55712127685546875 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.55712127685546875 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.54265785217285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.54265785217285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.53284263610839843 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.55095863342285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.55095863342285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.55095863342285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.55095863342285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.66637229919433593 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.59851455688476562 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.59621047973632812 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.58865928649902343 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.61154937744140625 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.61154937744140625 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.61154937744140625 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.54606056213378906 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.97316169738769531 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.97316169738769531 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.77691078186035156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.74009132385253906 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.63895034790039062 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.64518165588378906 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.64743614196777343 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=2999 WHERE (`Id`=26554 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.50213050842285156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=21.6240081787109375 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=21.6240081787109375 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.95000076293945312 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.56528091430664062 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.76415061950683593 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.76415061950683593 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.76415061950683593 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.56975746154785156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.56975746154785156 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=20.57698631286621093 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=20.57698631286621093 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=21.13361358642578125 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `Speed`=22.69633865356445312 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `Speed`=22.50508308410644531 WHERE (`Id`=6006 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 26573 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=0 WHERE (`Id`=4488 AND `IsCustom`=0); -- Spell: 382484 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=2999 WHERE (`Id`=26554 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=12000 WHERE (`Id`=32408 AND `IsCustom`=0); -- Spell: 414114 (Consecration)
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=2999 WHERE (`Id`=26554 AND `IsCustom`=0);
UPDATE `areatrigger_create_properties` SET `TimeToTargetScale`=2999 WHERE (`Id`=26554 AND `IsCustom`=0);
replace INTO `areatrigger_create_properties_spline_point` (`AreaTriggerCreatePropertiesId`, `IsCustom`, `Idx`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(37453, 0, 3, 22.6266937255859375, -14.9667873382568359, -0.68329620361328125, 69587), -- Spell: 1231989 ([DNT] Alleria Directed Attack)
(37453, 0, 2, 22.6266937255859375, -14.9667873382568359, -0.68329620361328125, 69587), -- Spell: 1231989 ([DNT] Alleria Directed Attack)
(37453, 0, 1, -0, -0, 0, 69587), -- Spell: 1231989 ([DNT] Alleria Directed Attack)
(37453, 0, 0, -0, -0, 0, 69587); -- Spell: 1231989 ([DNT] Alleria Directed Attack)
DELETE FROM `gameobject_template_addon` WHERE `entry` IN (620577 /*Greater Void Portal Frame*/, 578991 /*Mechagon Jump Pad*/, 617936 /*Mechagon Magnet*/);
INSERT INTO `gameobject_template_addon` (`entry`, `faction`, `flags`, `WorldEffectID`, `AIAnimKitID`) VALUES
(620577, 35, 0x20800000, 0, 0), -- Greater Void Portal Frame
(578991, 190, 0x10, 0, 0), -- Mechagon Jump Pad
(617936, 0, 0x842000, 0, 0); -- Mechagon Magnet
DELETE FROM `scene_template` WHERE `SceneId`=3887;
INSERT INTO `scene_template` (`SceneId`, `Flags`, `ScriptPackageID`, `Encrypted`) VALUES
(3887, 16, 4849, 0);
DELETE FROM `quest_offer_reward` WHERE `ID` IN (96446 /*Spark of Tides*/, 96245 /*You've Seen it All Before*/);
INSERT INTO `quest_offer_reward` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `RewardText`, `VerifiedBuild`) VALUES
(96446, 0, 0, 0, 0, 0, 0, 0, 0, 'This is a Spark of Tides.\n\nEvery week, one of these sparks will appear while on your adventures. In its current state, it\'s rather useless, but acquiring more will allow you to craft powerful items. Reagents like these are malleable, robust, and the prize for many crafters.\n\nThis is a unique crafting material that can help an item achieve expertise beyond that of mortal ability.', 69587), -- Spark of Tides
(96245, 1, 0, 0, 0, 0, 0, 0, 0, 'Ah, good to see you again. Or perhaps this is the first time we\'ve met? Sorry, timelines get rather tangled in times of crisis. Let me know if you\'d like me to sort yours out.', 69587); -- You've Seen it All Before
DELETE FROM `quest_poi` WHERE (`QuestID`=98218 AND `BlobIndex`=0 AND `Idx1`=0);
INSERT INTO `quest_poi` (`QuestID`, `BlobIndex`, `Idx1`, `ObjectiveIndex`, `QuestObjectiveID`, `QuestObjectID`, `MapID`, `UiMapID`, `Priority`, `Flags`, `WorldEffectID`, `PlayerConditionID`, `NavigationPlayerConditionID`, `SpawnTrackingID`, `AlwaysAllowMergingBlobs`, `VerifiedBuild`) VALUES
(98218, 0, 0, -1, 0, 0, 0, 2437, 0, 0, 0, 0, 0, 3235595, 0, 69587); -- Return to Amani'Zar
DELETE FROM `quest_poi_points` WHERE (`QuestID`=98218 AND `Idx1`=0 AND `Idx2`=0);
INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(98218, 0, 0, 4223, -7553, 168, 69587); -- Return to Amani'Zar
UPDATE `quest_poi_points` SET `Z`=-240 WHERE (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=11) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=10) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=9) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=8) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=7) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=6) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=5) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=4) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=3) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=2) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=1) OR (`QuestID`=86544 AND `Idx1`=3 AND `Idx2`=0);
DELETE FROM `quest_details` WHERE `ID` IN (86521 /*Nexus-Point Xenas: Eclipse*/, 86520 /*Hunt the Light*/, 86519 /*Abyssus, Abyssum*/, 86518 /*The Mantle of Predation*/, 86515 /*Hollow Hunger*/, 86517 /*Vanished in the Void*/, 86516 /*All Become Prey*/, 86514 /*Lady of the Pit*/, 86513 /*Face the Tide*/, 86512 /*The Harvest*/, 86511 /*Edge of the Abyss*/, 90571 /*The Lay of the Beast*/, 86510 /*Domus Penumbra*/, 86509 /*Friend or Fiend*/, 86545 /*The Light's Brand*/, 86544 /*Post-Mortem*/, 98218 /*Return to Amani'Zar*/);
INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES
(86521, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Nexus-Point Xenas: Eclipse
(86520, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Hunt the Light
(86519, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Abyssus, Abyssum
(86518, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- The Mantle of Predation
(86515, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Hollow Hunger
(86517, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vanished in the Void
(86516, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- All Become Prey
(86514, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Lady of the Pit
(86513, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Face the Tide
(86512, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- The Harvest
(86511, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Edge of the Abyss
(90571, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- The Lay of the Beast
(86510, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Domus Penumbra
(86509, 669, 0, 0, 0, 0, 0, 0, 0, 69587), -- Friend or Fiend
(86545, 5, 0, 0, 0, 0, 0, 0, 0, 69587), -- The Light's Brand
(86544, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Post-Mortem
(98218, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Return to Amani'Zar
DELETE FROM `ui_map_quest` WHERE (`UIMapId`=2393 AND `QuestId`=96004);
INSERT INTO `ui_map_quest` (`UIMapId`, `QuestId`, `VerifiedBuild`) VALUES
(2393, 96004, 69587); -- Prey: A Slithering Threat
DELETE FROM `creature_questender` WHERE (`id`=243229 AND `quest`=96446);
INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
(243229, 96446, 69587); -- Spark of Tides ended by Eldara Dawnrunner
DELETE FROM `world_quest_template` WHERE `QuestID` IN (50962 /*Cargo Reclamation*/, 51779 /*Grimscowl the Hairbrained*/, 48732 /*Sabuul*/, 57328 /*Trashin' the Camp*/, 50502 /*Jax'teb the Reanimated*/, 71225 /*Blown Through Wind: Rhuzast*/, 60231 /*State of Decay*/, 51397 /*Up In Your Drill*/, 51317 /*Grounding the Grimestone*/, 53867 /*Engineer Bolthold*/, 54650 /*Muk'luk*/, 53701 /*A Drust Cause*/, 54507 /*Fungal Infestation*/, 54143 /*Bird's-Eye View*/, 54449 /*Elemental Azerite*/);
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
(50962, 86400, 14994, 1), -- Cargo Reclamation
(51779, 86400, 15502, 1), -- Grimscowl the Hairbrained
(48732, 86400, 14182, 1), -- Sabuul
(57328, 86400, 19063, 1), -- Trashin' the Camp
(50502, 86400, 14798, 1), -- Jax'teb the Reanimated
(71225, 86400, 22647, 1), -- Blown Through Wind: Rhuzast
(60231, 21600, 19228, 1), -- State of Decay
(51397, 86400, 15445, 1), -- Up In Your Drill
(51317, 86400, 15765, 1), -- Grounding the Grimestone
(53867, 25200, 16290, 1), -- Engineer Bolthold
(54650, 25200, 16290, 1), -- Muk'luk
(53701, 25200, 16290, 1), -- A Drust Cause
(54507, 25200, 16290, 1), -- Fungal Infestation
(54143, 25200, 16290, 1), -- Bird's-Eye View
(54449, 25200, 16290, 1); -- Elemental Azerite
UPDATE `world_quest_template` SET `VariableID`=14245 WHERE `QuestID`=49091; -- Invasion Point: Val
UPDATE `world_quest_template` SET `VariableID`=14060 WHERE `QuestID`=49096; -- Invasion Point: Naigtal
DELETE FROM `spawn_tracking_template` WHERE `SpawnTrackingId` IN (2724007 /*Map: 2771 (Voidstorm) - Phase: 25736*/, 2703000 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2702999 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2783439 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2703422 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2703407 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2786829 /*Map: 2771 (Voidstorm) - Phase: 26380*/, 2741845 /*Map: 2771 (Voidstorm) - Phase: 0*/, 3091461 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725944 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725785 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725928 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2737793 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725941 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725942 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2737794 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725943 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725939 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2737791 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2737792 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725940 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2725620 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2781501 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2704399 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2781496 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2781498 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2727141 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2781503 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2781502 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2727137 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2727138 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2781500 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2727316 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2727133 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2727135 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2818011 /*Map: 2771 (Voidstorm) - Phase: 27137*/, 2736358 /*Map: 2771 (Voidstorm) - Phase: 25889*/, 2736357 /*Map: 2771 (Voidstorm) - Phase: 25888*/, 2736341 /*Map: 2771 (Voidstorm) - Phase: 25887*/, 3235595 /*Map: 0 (Eastern Kingdoms) - Phase: 0*/, 2795527 /*Map: 2771 (Voidstorm) - Phase: 26400*/, 2737048 /*Map: 2771 (Voidstorm) - Phase: 25806*/, 2702725 /*Map: 2771 (Voidstorm) - Phase: 25942*/, 2703778 /*Map: 2771 (Voidstorm) - Phase: 26445*/, 2702728 /*Map: 2771 (Voidstorm) - Phase: 26000*/, 2744391 /*Map: 2771 (Voidstorm) - Phase: 25978*/, 2744392 /*Map: 2771 (Voidstorm) - Phase: 25978*/, 2744275 /*Map: 2771 (Voidstorm) - Phase: 26531*/, 2736316 /*Map: 2771 (Voidstorm) - Phase: 26531*/, 2790793 /*Map: 2771 (Voidstorm) - Phase: 0*/, 0 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2790792 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2744375 /*Map: 2771 (Voidstorm) - Phase: 0*/);
INSERT INTO `spawn_tracking_template` (`SpawnTrackingId`, `MapId`, `PhaseId`, `PhaseGroup`, `PhaseUseFlags`, `VerifiedBuild`) VALUES
(2724007, 2771, 25736, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25736
(2703000, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2702999, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2783439, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2703422, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2703407, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2786829, 2771, 26380, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26380
(2741845, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(3091461, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725944, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725785, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725928, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2737793, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725941, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725942, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2737794, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725943, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725939, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2737791, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2737792, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725940, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2725620, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2781501, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2704399, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2781496, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2781498, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2727141, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2781503, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2781502, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2727137, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2727138, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2781500, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2727316, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2727133, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2727135, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2818011, 2771, 27137, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 27137
(2736358, 2771, 25889, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25889
(2736357, 2771, 25888, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25888
(2736341, 2771, 25887, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25887
(3235595, 0, 0, 0, 0, 69587), -- Map: 0 (Eastern Kingdoms) - Phase: 0
(2795527, 2771, 26400, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26400
(2737048, 2771, 25806, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25806
(2702725, 2771, 25942, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25942
(2703778, 2771, 26445, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26445
(2702728, 2771, 26000, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26000
(2744391, 2771, 25978, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25978
(2744392, 2771, 25978, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25978
(2744275, 2771, 26531, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26531
(2736316, 2771, 26531, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26531
(2790793, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(0, 2771, 0, 0, 1, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2790792, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2744375, 2771, 0, 0, 0, 69587); -- Map: 2771 (Voidstorm) - Phase: 0
UPDATE `spawn_tracking_template` SET `MapId`=2771, `PhaseId`=26473 WHERE `SpawnTrackingId`=2804252; -- Map: 2771 (Voidstorm) - Phase: 26473
UPDATE `spawn_tracking_template` SET `MapId`=2771, `PhaseId`=28234 WHERE `SpawnTrackingId`=2722980; -- Map: 2771 (Voidstorm) - Phase: 28234
UPDATE `spawn_tracking_template` SET `PhaseId`=0 WHERE `SpawnTrackingId` IN (2744158, 2704586, 3083193);
UPDATE `spawn_tracking_template` SET `PhaseId`=28609 WHERE `SpawnTrackingId`=2478335;
UPDATE `spawn_tracking_template` SET `PhaseId`=20340 WHERE `SpawnTrackingId`=2291865;
UPDATE `spawn_tracking_template` SET `PhaseId`=19932 WHERE `SpawnTrackingId`=2291871;
DELETE FROM `spawn_tracking_quest_objective` WHERE (`QuestObjectiveId`=457976 AND `SpawnTrackingId` IN (2703000,2702999)) OR (`QuestObjectiveId`=465515 AND `SpawnTrackingId` IN (2818011,2722980)) OR (`QuestObjectiveId`=465514 AND `SpawnTrackingId` IN (2804252,2722980)) OR (`QuestObjectiveId`=459580 AND `SpawnTrackingId`=2702725) OR (`QuestObjectiveId`=459484 AND `SpawnTrackingId`=2744391) OR (`QuestObjectiveId`=459485 AND `SpawnTrackingId`=2744392) OR (`QuestObjectiveId`=459483 AND `SpawnTrackingId`=2744275) OR (`QuestObjectiveId`=457367 AND `SpawnTrackingId`=2736316);
INSERT INTO `spawn_tracking_quest_objective` (`SpawnTrackingId`, `QuestObjectiveId`, `VerifiedBuild`) VALUES
(2703000, 457976, 69587), -- 2703000
(2702999, 457976, 69587), -- 2702999
(2818011, 465515, 69587), -- 2818011
(2722980, 465515, 69587), -- 2722980
(2804252, 465514, 69587), -- 2804252
(2722980, 465514, 69587), -- 2722980
(2702725, 459580, 69587), -- 2702725
(2744391, 459484, 69587), -- 2744391
(2744392, 459485, 69587), -- 2744392
(2744275, 459483, 69587), -- 2744275
(2736316, 457367, 69587); -- 2736316
DELETE FROM `spell_target_position` WHERE (`ID`=1223070 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1234911 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1223063 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1223051 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1234798 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1220783 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1233251 AND `EffectIndex`=1 AND `OrderIndex`=0) OR (`ID`=1223505 AND `EffectIndex`=4 AND `OrderIndex`=0) OR (`ID`=1229227 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1220377 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1229729 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1233176 AND `EffectIndex`=0 AND `OrderIndex`=0) OR (`ID`=1233166 AND `EffectIndex`=0 AND `OrderIndex`=0);
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `OrderIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES
(1223070, 0, 0, 2771, 498.720001220703125, -1300.760009765625, -101.839996337890625, 69587), -- Spell: 1223070 ([DNT] Phase Transition - OUT) Effect 0: 15 (SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL)
(1234911, 0, 0, 2771, 439.17999267578125, -1390.4000244140625, -115.720001220703125, 69587), -- Spell: 1234911 ([DNT] Phase Transition - Alleria - Jump Charge) Effect 0: 254 (SPELL_EFFECT_GIVE_HONOR)
(1223063, 0, 0, 2771, 472.739990234375, -1336.8800048828125, -114.54400634765625, 69587), -- Spell: 1223063 ([DNT] Phase Transition - Pt 04 - Knockback from Vehicle) Effect 0: 254 (SPELL_EFFECT_GIVE_HONOR)
(1223051, 0, 0, 2771, 446.6400146484375, -1375.6400146484375, -77.2300033569335937, 69587), -- Spell: 1223051 ([DNT] Phase Transition - Pt 03c - Vehicle Jump Charge) Effect 0: 254 (SPELL_EFFECT_GIVE_HONOR)
(1234798, 0, 0, 2771, 451.42999267578125, -1373.6099853515625, -107.779998779296875, 69587), -- Spell: 1234798 ([DNT] Phase Transition - Pt 02b - Teleport) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1220783, 0, 0, 2771, 479.3900146484375, -1331.4300537109375, -114.669998168945312, 69587), -- Spell: 1220783 ([DNT] Terminas Trap - Teleport + Credit) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1233251, 1, 0, 2771, 182.5399932861328125, -1732.4599609375, -31.2639636993408203, 69587), -- Spell: 1233251 ([DNT] Claim Mantle Cosmetic Explosion) Effect 1: 254 (SPELL_EFFECT_GIVE_HONOR)
(1223505, 4, 0, 2771, 1042.489990234375, -384.8599853515625, -133.759994506835937, 69587), -- Spell: 1223505 ([DNT] Cancel Scrying Auras + Teleport) Effect 4: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1229227, 0, 0, 2771, 1368.760009765625, 7.21999979019165039, -279.019989013671875, 69587), -- Spell: 1229227 ([DNT] Scrying Vehicle Departure Teleport) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1220377, 0, 0, 2771, 925.1099853515625, -361.829986572265625, -119.360000610351562, 69587), -- Spell: 1220377 (Distracting) Effect 0: 3 (SPELL_EFFECT_DUMMY)
(1229729, 0, 0, 2771, 940.8900146484375, -426.829986572265625, -117.980003356933593, 69587), -- Spell: 1229729 (Throw Bone) Effect 0: 3 (SPELL_EFFECT_DUMMY)
(1233176, 0, 0, 2771, 729.1199951171875, 616.69000244140625, -303.850006103515625, 69587), -- Spell: 1233176 ([DNT] Decimus Yanked) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1233166, 0, 0, 2771, 734.20001220703125, 634.57000732421875, -303.920013427734375, 69587); -- Spell: 1233166 ([DNT] Lothraxion Yanked) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
replace INTO `spell_target_position` (`ID`, `EffectIndex`, `OrderIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES
(1235581, 0, 0, 2771, 764.1961669921875, 625.34552001953125, -303.91522216796875, 69587), -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1235581, 0, 1, 2771, 758.4305419921875, 610.560791015625, -303.918670654296875, 69587), -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1235581, 0, 2, 2771, 735.7760009765625, 655.08001708984375, -304.131011962890625, 69587), -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1235581, 0, 3, 2771, 721.654541015625, 639.91668701171875, -303.94384765625, 69587), -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1235581, 0, 4, 2771, 737.092041015625, 604.42364501953125, -303.91510009765625, 69587), -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1235581, 0, 5, 2771, 761.63397216796875, 646.53302001953125, -303.912994384765625, 69587), -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
(1235581, 0, 6, 2771, 747.3038330078125, 621.2882080078125, -303.920013427734375, 69587); -- Spell: 1235581 (Dematerialize) Effect 0: 252 (SPELL_EFFECT_TELEPORT_UNITS)
UPDATE `creature_model_info` SET `BoundingRadius`=34.6687164306640625, `CombatReach`=8.333333015441894531 WHERE `DisplayID`=138659;
UPDATE `creature_model_info` SET `BoundingRadius`=1, `CombatReach`=1.5 WHERE `DisplayID`=119635;
UPDATE `creature_model_info` SET `BoundingRadius`=1.102844119071960449 WHERE `DisplayID`=136486;
UPDATE `creature_model_info` SET `BoundingRadius`=0.382999986410140991, `CombatReach`=1.5 WHERE `DisplayID`=28862;
UPDATE `creature_model_info` SET `BoundingRadius`=41.6024627685546875, `CombatReach`=10 WHERE `DisplayID`=138657;
UPDATE `creature_model_info` SET `BoundingRadius`=6.126912117004394531 WHERE `DisplayID`=128549;
UPDATE `creature_model_info` SET `BoundingRadius`=1.980034708976745605, `CombatReach`=3.20000004768371582 WHERE `DisplayID`=136106;
UPDATE `creature_model_info` SET `BoundingRadius`=0.158240109682083129, `CombatReach`=0.300000011920928955 WHERE `DisplayID`=120525;
DELETE FROM `creature_template_spell` WHERE (`CreatureID`=238287 AND `Index` IN (3,2,1,0));
INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES
(238287, 3, 1234735, 69587), -- Ciphus
(238287, 2, 1229229, 69587), -- Ciphus
(238287, 1, 1229175, 69587), -- Ciphus
(238287, 0, 1230351, 69587); -- Ciphus
DELETE FROM `creature_template_gossip` WHERE (`CreatureID`=235763 AND `MenuID`=38473) OR (`CreatureID`=235502 AND `MenuID`=38582) OR (`CreatureID`=235504 AND `MenuID`=40331) OR (`CreatureID`=238530 AND `MenuID`=38410) OR (`CreatureID`=241170 AND `MenuID`=38408) OR (`CreatureID`=238531 AND `MenuID`=38407) OR (`CreatureID`=254756 AND `MenuID`=41244) OR (`CreatureID`=236944 AND `MenuID`=39123) OR (`CreatureID`=235633 AND `MenuID`=39141) OR (`CreatureID`=239349 AND `MenuID`=38390) OR (`CreatureID`=235697 AND `MenuID`=39120) OR (`CreatureID`=235469 AND `MenuID`=38575) OR (`CreatureID`=235701 AND `MenuID`=38644) OR (`CreatureID`=248328 AND `MenuID`=42172) OR (`CreatureID`=257042 AND `MenuID`=41752) OR (`CreatureID`=240673 AND `MenuID`=39079) OR (`CreatureID`=235792 AND `MenuID`=39077) OR (`CreatureID`=235724 AND `MenuID`=38642) OR (`CreatureID`=235653 AND `MenuID`=38552) OR (`CreatureID`=235725 AND `MenuID`=38551) OR (`CreatureID`=240538 AND `MenuID`=38544) OR (`CreatureID`=239720 AND `MenuID`=39291) OR (`CreatureID`=235664 AND `MenuID`=38549) OR (`CreatureID`=239724 AND `MenuID`=38545);
INSERT INTO `creature_template_gossip` (`CreatureID`, `MenuID`, `VerifiedBuild`) VALUES
(235763, 38473, 69587), -- Alleria Windrunner
(235502, 38582, 69587), -- Alleria Windrunner
(235504, 40331, 69587), -- Lothraxion
(238530, 38410, 69587), -- Riftwalker Hieron
(241170, 38408, 69587), -- Lady Darkglen
(238531, 38407, 69587), -- Riftblade Maella
(254756, 41244, 69587), -- Forgotten Oubliette
(236944, 39123, 69587), -- Arator
(235633, 39141, 69587), -- Decimus
(239349, 38390, 69587), -- Riftblade Maella
(235697, 39120, 69587), -- Decimus
(235469, 38575, 69587), -- Arator
(235701, 38644, 69587), -- Hospitus
(248328, 42172, 69587), -- Void Researcher Anomander
(257042, 41752, 69587), -- Research Console
(240673, 39079, 69587), -- Lothraxion
(235792, 39077, 69587), -- Arator
(235724, 38642, 69587), -- Arator
(235653, 38552, 69587), -- Decimus
(235725, 38551, 69587), -- Lothraxion
(240538, 38544, 69587), -- Riftblade Maella
(239720, 39291, 69587), -- Lucia Nightbreaker
(235664, 38549, 69587), -- Alleria Windrunner
(239724, 38545, 69587); -- Riftwalker Hieron
DELETE FROM `npc_vendor` WHERE (`entry`=235701 AND `item`=260299 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260298 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260297 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260296 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260295 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260292 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260291 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260294 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260293 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260290 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=235701 AND `item`=260289 AND `ExtendedCost`=0 AND `type`=1) OR (`entry`=248328 AND `item`=260696 AND `ExtendedCost`=10960 AND `type`=1) OR (`entry`=248328 AND `item`=264337 AND `ExtendedCost`=10790 AND `type`=1) OR (`entry`=248328 AND `item`=264339 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=264341 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=257445 AND `ExtendedCost`=10959 AND `type`=1) OR (`entry`=248328 AND `item`=263244 AND `ExtendedCost`=10856 AND `type`=1) OR (`entry`=248328 AND `item`=266983 AND `ExtendedCost`=10954 AND `type`=1) OR (`entry`=248328 AND `item`=266980 AND `ExtendedCost`=10954 AND `type`=1) OR (`entry`=248328 AND `item`=263573 AND `ExtendedCost`=10954 AND `type`=1) OR (`entry`=248328 AND `item`=263492 AND `ExtendedCost`=10958 AND `type`=1) OR (`entry`=248328 AND `item`=262463 AND `ExtendedCost`=10788 AND `type`=1) OR (`entry`=248328 AND `item`=262609 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=264351 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=266982 AND `ExtendedCost`=10955 AND `type`=1) OR (`entry`=248328 AND `item`=266981 AND `ExtendedCost`=10955 AND `type`=1) OR (`entry`=248328 AND `item`=263572 AND `ExtendedCost`=10955 AND `type`=1) OR (`entry`=248328 AND `item`=262646 AND `ExtendedCost`=11133 AND `type`=1) OR (`entry`=248328 AND `item`=262644 AND `ExtendedCost`=11132 AND `type`=1) OR (`entry`=248328 AND `item`=262645 AND `ExtendedCost`=11131 AND `type`=1) OR (`entry`=248328 AND `item`=264344 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=262466 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=262462 AND `ExtendedCost`=10788 AND `type`=1) OR (`entry`=248328 AND `item`=265534 AND `ExtendedCost`=11312 AND `type`=1) OR (`entry`=248328 AND `item`=263445 AND `ExtendedCost`=11130 AND `type`=1) OR (`entry`=248328 AND `item`=258500 AND `ExtendedCost`=11130 AND `type`=1) OR (`entry`=248328 AND `item`=259459 AND `ExtendedCost`=11129 AND `type`=1) OR (`entry`=248328 AND `item`=258128 AND `ExtendedCost`=11128 AND `type`=1) OR (`entry`=248328 AND `item`=268044 AND `ExtendedCost`=11127 AND `type`=1) OR (`entry`=248328 AND `item`=256757 AND `ExtendedCost`=11127 AND `type`=1) OR (`entry`=248328 AND `item`=256758 AND `ExtendedCost`=11127 AND `type`=1) OR (`entry`=248328 AND `item`=263499 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=262473 AND `ExtendedCost`=10788 AND `type`=1) OR (`entry`=248328 AND `item`=266984 AND `ExtendedCost`=10858 AND `type`=1) OR (`entry`=248328 AND `item`=266979 AND `ExtendedCost`=10858 AND `type`=1) OR (`entry`=248328 AND `item`=263723 AND `ExtendedCost`=10858 AND `type`=1) OR (`entry`=248328 AND `item`=264509 AND `ExtendedCost`=10788 AND `type`=1) OR (`entry`=248328 AND `item`=248964 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=262607 AND `ExtendedCost`=10789 AND `type`=1) OR (`entry`=248328 AND `item`=267604 AND `ExtendedCost`=11385 AND `type`=1) OR (`entry`=248328 AND `item`=267605 AND `ExtendedCost`=11385 AND `type`=1) OR (`entry`=248328 AND `item`=267606 AND `ExtendedCost`=11385 AND `type`=1) OR (`entry`=248328 AND `item`=267607 AND `ExtendedCost`=11385 AND `type`=1);
INSERT INTO `npc_vendor` (`entry`, `slot`, `item`, `maxcount`, `ExtendedCost`, `type`, `PlayerConditionID`, `IgnoreFiltering`, `VerifiedBuild`) VALUES
(235701, 12, 260299, 0, 0, 1, 0, 0, 69587), -- Roasted Abyssal Eel
(235701, 11, 260298, 0, 0, 1, 0, 0, 69587), -- Astral Apple Pie
(235701, 10, 260297, 0, 0, 1, 0, 0, 69587), -- Voidfarer's Respite
(235701, 9, 260296, 0, 0, 1, 0, 0, 69587), -- Shadeleaf Tea
(235701, 8, 260295, 0, 0, 1, 0, 0, 69587), -- Purified Storm Water
(235701, 7, 260292, 0, 0, 1, 0, 0, 69587), -- Asteroid Soup
(235701, 6, 260291, 0, 0, 1, 0, 0, 69587), -- Stargazer Pudding
(235701, 5, 260294, 0, 0, 1, 0, 0, 69587), -- Voidwyrm Absinthe
(235701, 4, 260293, 0, 0, 1, 0, 0, 69587), -- Void Port
(235701, 3, 260290, 0, 0, 1, 0, 0, 69587), -- Quel'Thalas Cheese
(235701, 2, 260289, 0, 0, 1, 0, 0, 69587), -- Ren'dorei Rations
(248328, 42, 260696, 0, 10960, 1, 147664, 0, 69587), -- Voidbound Stormray
(248328, 41, 264337, 0, 10790, 1, 147663, 0, 69587), -- Cosmic Void Training Dummy
(248328, 40, 264339, 0, 10789, 1, 147663, 0, 69587), -- Cosmic Void Summoning Crystal
(248328, 39, 264341, 0, 10789, 1, 147663, 0, 69587), -- Cosmic Void Crate
(248328, 38, 257445, 0, 10959, 1, 147662, 0, 69587), -- Ravenous Shredclaw
(248328, 37, 263244, 0, 10856, 1, 147661, 0, 69587), -- Enigmatic Fountain
(248328, 36, 266983, 0, 10954, 1, 147660, 0, 69587), -- Pauldrons of the Nebulous Collapsed Star
(248328, 35, 266980, 0, 10954, 1, 147660, 0, 69587), -- Pauldrons of the Darkened Collapsed Star
(248328, 34, 263573, 0, 10954, 1, 147660, 0, 69587), -- Pauldrons of the Gilded Collapsed Star
(248328, 33, 263492, 0, 10958, 1, 147659, 0, 69587), -- Blitzcreek
(248328, 32, 262463, 0, 10788, 1, 147657, 0, 69587), -- Cosmic Void Ashwell
(248328, 31, 262609, 0, 10789, 1, 147657, 0, 69587), -- Void Elf Floating Lantern
(248328, 30, 264351, 0, 10789, 1, 147657, 0, 69587), -- Ornate Cosmic Banner
(248328, 29, 266982, 0, 10955, 1, 147655, 0, 69587), -- Tabard of the Nebulous Collapsed Star
(248328, 28, 266981, 0, 10955, 1, 147655, 0, 69587), -- Tabard of the Darkened Collapsed Star
(248328, 27, 263572, 0, 10955, 1, 147655, 0, 69587), -- Tabard of the Gilded Collapsed Star
(248328, 26, 262646, 0, 11133, 1, 155701, 0, 69587), -- Beyond the Event Horizon: Engineering
(248328, 25, 262644, 0, 11132, 1, 155699, 0, 69587), -- Beyond the Event Horizon: Blacksmithing
(248328, 24, 262645, 0, 11131, 1, 155698, 0, 69587), -- Beyond the Event Horizon: Alchemy
(248328, 23, 264344, 0, 10789, 1, 147653, 0, 69587), -- Cosmic Void Orb
(248328, 22, 262466, 0, 10789, 1, 147653, 0, 69587), -- Void Elf Table
(248328, 21, 262462, 0, 10788, 1, 147653, 0, 69587), -- Dark Void Inkwell
(248328, 20, 265534, 0, 11312, 1, 153409, 0, 69587), -- Plans: Ren'dorei Anvil
(248328, 19, 263445, 0, 11130, 1, 149113, 0, 69587), -- Technique: Contract: The Singularity
(248328, 18, 258500, 0, 11130, 1, 149113, 0, 69587), -- Technique: Floating Void-Touched Tome
(248328, 17, 259459, 0, 11129, 1, 149112, 0, 69587), -- Recipe: Potion of Recklessness
(248328, 16, 258128, 0, 11128, 1, 149111, 0, 69587), -- Pattern: Lush Telogrus Carpet
(248328, 15, 268044, 0, 11127, 1, 149110, 0, 69587), -- Formula: Endless Codex of the Voidtouched
(248328, 14, 256757, 0, 11127, 1, 149110, 0, 69587), -- Formula: Enchant Weapon - Acuity of the Ren'dorei
(248328, 13, 256758, 0, 11127, 1, 149110, 0, 69587), -- Formula: Enchant Tool - Ren'dorei Ingenuity
(248328, 12, 263499, 0, 10789, 1, 0, 0, 69587), -- Sturdy Void Elf Trunk
(248328, 11, 262473, 0, 10788, 1, 0, 0, 69587), -- Cosmic Chalice
(248328, 10, 266984, 0, 10858, 1, 0, 0, 69587), -- Shawl of the Nebulous Collapsed Star
(248328, 9, 266979, 0, 10858, 1, 0, 0, 69587), -- Shawl of the Darkened Collapsed Star
(248328, 8, 263723, 0, 10858, 1, 0, 0, 69587), -- Shawl of the Gilded Collapsed Star
(248328, 7, 264509, 0, 10788, 1, 0, 0, 69587), -- Void Elf Barrel
(248328, 6, 248964, 0, 10789, 1, 0, 0, 69587), -- Cosmic Void Table
(248328, 5, 262607, 0, 10789, 1, 0, 0, 69587), -- Void Elf Throne
(248328, 4, 267604, 0, 11385, 1, 0, 0, 69587), -- Clutches of the Colossal Behemoths
(248328, 3, 267605, 0, 11385, 1, 0, 0, 69587), -- Neverending Vortex Grasps
(248328, 2, 267606, 0, 11385, 1, 0, 0, 69587), -- Gloves of Infinite Gravity
(248328, 1, 267607, 0, 11385, 1, 0, 0, 69587); -- Hazy Penumbral Handwraps
UPDATE `npc_vendor` SET `slot`=160 WHERE (`entry`=254436 AND `item`=249366 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=156 WHERE (`entry`=254436 AND `item`=249362 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=152 WHERE (`entry`=254436 AND `item`=249358 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=148 WHERE (`entry`=254436 AND `item`=249354 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=144 WHERE (`entry`=254436 AND `item`=249350 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=140 WHERE (`entry`=254436 AND `item`=249366 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=136 WHERE (`entry`=254436 AND `item`=249362 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=132 WHERE (`entry`=254436 AND `item`=249358 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=128 WHERE (`entry`=254436 AND `item`=249354 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=124 WHERE (`entry`=254436 AND `item`=249350 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=120 WHERE (`entry`=254436 AND `item`=249366 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=116 WHERE (`entry`=254436 AND `item`=249362 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=112 WHERE (`entry`=254436 AND `item`=249358 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=108 WHERE (`entry`=254436 AND `item`=249354 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=104 WHERE (`entry`=254436 AND `item`=249350 AND `ExtendedCost`=10875 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=80 WHERE (`entry`=254436 AND `item`=270917 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=76 WHERE (`entry`=254436 AND `item`=270921 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=72 WHERE (`entry`=254436 AND `item`=270929 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=68 WHERE (`entry`=254436 AND `item`=270925 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=64 WHERE (`entry`=254436 AND `item`=270913 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=60 WHERE (`entry`=254436 AND `item`=270917 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=56 WHERE (`entry`=254436 AND `item`=270921 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=52 WHERE (`entry`=254436 AND `item`=270929 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=48 WHERE (`entry`=254436 AND `item`=270925 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=44 WHERE (`entry`=254436 AND `item`=270913 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=40 WHERE (`entry`=254436 AND `item`=270917 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=36 WHERE (`entry`=254436 AND `item`=270921 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=32 WHERE (`entry`=254436 AND `item`=270929 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=28 WHERE (`entry`=254436 AND `item`=270925 AND `ExtendedCost`=11523 AND `type`=1);
UPDATE `npc_vendor` SET `slot`=24 WHERE (`entry`=254436 AND `item`=270913 AND `ExtendedCost`=11523 AND `type`=1);
DELETE FROM `gossip_menu_option` WHERE (`OptionID`=1 AND `MenuID` IN (39141,39120,42172,38473,38644)) OR (`OptionID`=0 AND `MenuID` IN (38549,40331,38473,38545,38407,39077,38642,38552,42172,39079,38582,38575,38410,39120,38644,39141,38544,39123,38408,38390,38551));
INSERT INTO `gossip_menu_option` (`MenuID`, `GossipOptionID`, `OptionID`, `OptionNpc`, `OptionText`, `OptionBroadcastTextID`, `Language`, `Flags`, `ActionMenuID`, `ActionPoiID`, `GossipNpcOptionID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `SpellID`, `OverrideIconID`, `VerifiedBuild`) VALUES
(39141, 133664, 1, 0, '<Ask about Severum.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(39120, 137697, 1, 0, 'I am ready to begin!', 144040, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 144040 - 170474
(38549, 132755, 0, 0, '<Stay awhile and listen.>', 137786, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 137786 - 144263 - 160761 - 160763 - 160765 - 160768 - 167552 - 173473 - 176737 - 188459 - 202026 - 205118 - 205774
(40331, 135473, 0, 0, '<Stay awhile and listen.>', 137786, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 137786 - 144263 - 160761 - 160763 - 160765 - 160768 - 167552 - 173473 - 176737 - 188459 - 202026 - 205118 - 205774
(38473, 132672, 0, 0, '|cFF0000FF(Queue for follower dungeon)|r <Tell Alleria you\'re ready to enter Nexus-Point Xenas with assistance.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38545, 132751, 0, 0, '<Ask for his report on the wilds.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38407, 132554, 0, 0, 'Regroup with Alleria and Arator.', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(39077, 133892, 0, 0, '<Ask Arator for healing.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38642, 132867, 0, 0, 'What about you?', 76629, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38552, 132757, 0, 0, 'Explain yourself.', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42172, 138232, 0, 0, '<Inquire about Anomander\'s research.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42172, 138438, 1, 1, 'Can I see the Renown items you have for sale?', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(39079, 133599, 0, 0, '<Stay awhile and listen.>', 137786, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 137786 - 144263 - 160761 - 160763 - 160765 - 160768 - 167552 - 173473 - 176737 - 188459 - 202026 - 205118 - 205774
(38582, 132795, 0, 0, '<Tell Alleria you\'re ready to claim the Mantle.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38473, 135507, 1, 0, '<Stay awhile and listen.>', 137786, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 137786 - 144263 - 160761 - 160763 - 160765 - 160768 - 167552 - 173473 - 176737 - 188459 - 202026 - 205118 - 205774
(38575, 132787, 0, 0, '<Stay awhile and listen.>', 137786, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 137786 - 144263 - 160761 - 160763 - 160765 - 160768 - 167552 - 173473 - 176737 - 188459 - 202026 - 205118 - 205774
(38410, 132556, 0, 0, 'Darkglen and Maella are fine.', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(39120, 133633, 0, 0, '<Ask about the Mantle of Predation.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38644, 132869, 0, 5, 'Bind your hearthstone to this inn.', 2822, 0, 0, 0, 0, 58793, 0, 0, '', 0, NULL, NULL, 69587),
(39141, 133665, 0, 0, '<Ask about Torentia.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38544, 132752, 0, 0, '<Ask for her report on the wilds.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(39123, 133638, 0, 0, '<Inquire about the captives.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38408, 132555, 0, 0, 'I\'ll find Hieron. Regroup with the others.', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38390, 132535, 0, 0, '<Hear the scouting report.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38644, 135474, 1, 1, 'What do you have for sale?', 10182, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 10182 - 16129 - 16134 - 16135 - 16452 - 20994 - 53758 - 66614 - 117193 - 122305 - 122306
(38551, 132756, 0, 0, '<Ask how Lothraxion is doing.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587);
UPDATE `creature_template` SET `name`='Orweyna', `type`=7 WHERE `entry`=253640; -- 253640
UPDATE `creature_template` SET `name`='Magister\'s Missive', `unit_class`=2, `type`=10 WHERE `entry`=265903; -- 265903
UPDATE `creature_template_model` SET `CreatureDisplayID`=11686 WHERE (`Idx`=1 AND `CreatureID` IN (72587,257692)) OR (`Idx`=0 AND `CreatureID`=233124);
UPDATE `creature_template_model` SET `CreatureDisplayID`=64062 WHERE (`CreatureID`=72587 AND `Idx`=0);
UPDATE `creature_template_model` SET `CreatureDisplayID`=21072 WHERE (`CreatureID`=168670 AND `Idx`=1);
UPDATE `creature_template_model` SET `CreatureDisplayID`=27823 WHERE (`Idx`=1 AND `CreatureID` IN (242258,240016,242241,242036,240004,240005,254811,240370,240458,242370,242458,239740,248580,239739,248581,248582,248615,248579,242259,243360,257153,243289));
DELETE FROM `gameobject_questitem` WHERE (`GameObjectEntry`=433370 AND `Idx` IN (39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19));
INSERT INTO `gameobject_questitem` (`GameObjectEntry`, `Idx`, `ItemId`, `VerifiedBuild`) VALUES
(433370, 39, 264188, 69587), -- War Supply Chest
(433370, 38, 264189, 69587), -- War Supply Chest
(433370, 37, 275134, 69587), -- War Supply Chest
(433370, 36, 275134, 69587), -- War Supply Chest
(433370, 35, 219934, 69587), -- War Supply Chest
(433370, 34, 219934, 69587), -- War Supply Chest
(433370, 33, 219934, 69587), -- War Supply Chest
(433370, 32, 219934, 69587), -- War Supply Chest
(433370, 31, 219934, 69587), -- War Supply Chest
(433370, 30, 264188, 69587), -- War Supply Chest
(433370, 29, 264189, 69587), -- War Supply Chest
(433370, 28, 275134, 69587), -- War Supply Chest
(433370, 27, 275134, 69587), -- War Supply Chest
(433370, 26, 219934, 69587), -- War Supply Chest
(433370, 25, 219934, 69587), -- War Supply Chest
(433370, 24, 219934, 69587), -- War Supply Chest
(433370, 23, 219934, 69587), -- War Supply Chest
(433370, 22, 219934, 69587), -- War Supply Chest
(433370, 21, 264188, 69587), -- War Supply Chest
(433370, 20, 264189, 69587), -- War Supply Chest
(433370, 19, 275134, 69587); -- War Supply Chest
UPDATE `gameobject_questitem` SET `ItemId`=275134 WHERE (`GameObjectEntry`=433370 AND `Idx`=18);
UPDATE `gameobject_questitem` SET `ItemId`=219934 WHERE (`GameObjectEntry`=433370 AND `Idx`=17);
DELETE FROM `page_text` WHERE `ID` IN (10477 /*10477*/, 9945 /*9945*/);
INSERT INTO `page_text` (`ID`, `Text`, `NextPageID`, `PlayerConditionID`, `Flags`, `VerifiedBuild`) VALUES
(10477, '<This regal domanaar armor sits in a heavy silence. Despite its expert make, an aura of malice warps the breastplate\'s perfection. It is displayed alongside the following inscription.>\n\nVaras, whose greatest delight was martial prowess, raised Obscurion Citadel from nothing. He donned the impenetrable Lorica Umbra in battle. It turned away every blade or spell that sought to harm its wearer.\n\nWhen the Devouring Host demanded he surrender, Varas refused. With his armor, he could not be defeated.\n\nBut then, Xal\'atath came to Varas alone. She whispered words into his ear that are known only between them. After a pause, Varas removed the Lorica Umbra. Then, at Xal\'atath\'s command, he was killed.\n\nShe is the Void. Think to stand above her, this fate too shall be yours.\n\n-Lord Terminas\n\n<The Lorica Umbra has no chance of fitting you.>', 0, 0, 0, 69587), -- 10477
(9945, 'The rules of nature reign supreme upon this world. Every species we\'ve stumbled upon seems designed to fight and kill. Those that aren\'t purely carnivores feast instead on flows of Void energy. Perhaps we ren\'dorei aren\'t so unlike them.\n\nThis is no homeworld of Void from what we can tell. It seems instead a planet, like any other, that exists at the nexus of Void energies throughout the cosmos. I am reminded of Outland. I advise similar survival tactics to those used by our kin who called themselves Sunfury before embracing the Void. We might ask Leona Darkstrider what she learned from Adarus Duskblaze.\n\nExploring the wastes remains a high priority. Natural resources born of this world are sure to be potent in our fight against Xal\'atath.', 0, 0, 0, 69587); -- 9945
REPLACE INTO `npc_text` (`ID`, `Probability0`, `Probability1`, `Probability2`, `Probability3`, `Probability4`, `Probability5`, `Probability6`, `Probability7`, `BroadcastTextId0`, `BroadcastTextId1`, `BroadcastTextId2`, `BroadcastTextId3`, `BroadcastTextId4`, `BroadcastTextId5`, `BroadcastTextId6`, `BroadcastTextId7`, `VerifiedBuild`) VALUES
(235792, 1, 1, 0, 0, 0, 0, 0, 0, 289145, 290449, 0, 0, 0, 0, 0, 0, 69587), -- 235792 (Arator)
(240538, 1, 0, 0, 0, 0, 0, 0, 0, 285353, 0, 0, 0, 0, 0, 0, 0, 69587), -- 240538 (Riftblade Maella)
(239724, 1, 0, 0, 0, 0, 0, 0, 0, 285354, 0, 0, 0, 0, 0, 0, 0, 69587), -- 239724 (Riftwalker Hieron)
(240673, 1, 0, 0, 0, 0, 0, 0, 0, 289163, 0, 0, 0, 0, 0, 0, 0, 69587), -- 240673 (Lothraxion)
(257042, 1, 0, 0, 0, 0, 0, 0, 0, 305772, 0, 0, 0, 0, 0, 0, 0, 69587), -- 257042 (Research Console)
(235664, 1, 0, 0, 0, 0, 0, 0, 0, 285360, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235664 (Alleria Windrunner)
(235504, 1, 0, 0, 0, 0, 0, 0, 0, 297532, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235504 (Lothraxion)
(235725, 1, 0, 0, 0, 0, 0, 0, 0, 285367, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235725 (Lothraxion)
(235653, 1, 0, 0, 0, 0, 0, 0, 0, 285370, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235653 (Decimus)
(235724, 1, 0, 0, 0, 0, 0, 0, 0, 285955, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235724 (Arator)
(235701, 1, 0, 0, 0, 0, 0, 0, 0, 285979, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235701 (Hospitus)
(235763, 1, 0, 0, 0, 0, 0, 0, 0, 284066, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235763 (Alleria Windrunner)
(239349, 1, 0, 0, 0, 0, 0, 0, 0, 283404, 0, 0, 0, 0, 0, 0, 0, 69587), -- 239349 (Riftblade Maella)
(253640, 1, 0, 0, 0, 0, 0, 0, 0, 311350, 0, 0, 0, 0, 0, 0, 0, 69587), -- 253640
(254756, 1, 0, 0, 0, 0, 0, 0, 0, 303460, 0, 0, 0, 0, 0, 0, 0, 69587), -- 254756 (Forgotten Oubliette)
(235469, 1, 0, 0, 0, 0, 0, 0, 0, 285481, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235469 (Arator)
(239720, 1, 0, 0, 0, 0, 0, 0, 0, 290078, 0, 0, 0, 0, 0, 0, 0, 69587), -- 239720 (Lucia Nightbreaker)
(235502, 1, 0, 0, 0, 0, 0, 0, 0, 285505, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235502 (Alleria Windrunner)
(269987, 1, 0, 0, 0, 0, 0, 0, 0, 320315, 0, 0, 0, 0, 0, 0, 0, 69587), -- 269987 (Orin Straylight)
(238531, 1, 0, 0, 0, 0, 0, 0, 0, 283529, 0, 0, 0, 0, 0, 0, 0, 69587), -- 238531 (Riftblade Maella)
(241170, 1, 0, 0, 0, 0, 0, 0, 0, 283531, 0, 0, 0, 0, 0, 0, 0, 69587), -- 241170 (Lady Darkglen)
(235697, 1, 0, 0, 0, 0, 0, 0, 0, 289268, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235697 (Decimus)
(238530, 1, 0, 0, 0, 0, 0, 0, 0, 283549, 0, 0, 0, 0, 0, 0, 0, 69587), -- 238530 (Riftwalker Hieron)
(236944, 1, 0, 0, 0, 0, 0, 0, 0, 289272, 0, 0, 0, 0, 0, 0, 0, 69587), -- 236944 (Arator)
(235633, 1, 0, 0, 0, 0, 0, 0, 0, 289300, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235633 (Decimus)
(248328, 1, 0, 0, 0, 0, 0, 0, 0, 308034, 0, 0, 0, 0, 0, 0, 0, 69587); -- 248328 (Void Researcher Anomander)
REPLACE INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES
(39077, 235792, 69587), -- 235792 (Arator)
(38544, 240538, 69587), -- 240538 (Riftblade Maella)
(38545, 239724, 69587), -- 239724 (Riftwalker Hieron)
(39079, 240673, 69587), -- 240673 (Lothraxion)
(41752, 257042, 69587), -- 257042 (Research Console)
(38549, 235664, 69587), -- 235664 (Alleria Windrunner)
(40331, 235504, 69587), -- 235504 (Lothraxion)
(38551, 235725, 69587), -- 235725 (Lothraxion)
(38552, 235653, 69587), -- 235653 (Decimus)
(38642, 235724, 69587), -- 235724 (Arator)
(38644, 235701, 69587), -- 235701 (Hospitus)
(38473, 235763, 69587), -- 235763 (Alleria Windrunner)
(38390, 239349, 69587), -- 239349 (Riftblade Maella)
(42751, 253640, 69587), -- 253640
(41244, 254756, 69587), -- 254756 (Forgotten Oubliette)
(38575, 235469, 69587), -- 235469 (Arator)
(39291, 239720, 69587), -- 239720 (Lucia Nightbreaker)
(38582, 235502, 69587), -- 235502 (Alleria Windrunner)
(44102, 269987, 69587), -- 269987 (Orin Straylight)
(38407, 238531, 69587), -- 238531 (Riftblade Maella)
(38408, 241170, 69587), -- 241170 (Lady Darkglen)
(39120, 235697, 69587), -- 235697 (Decimus)
(38410, 238530, 69587), -- 238530 (Riftwalker Hieron)
(39123, 236944, 69587), -- 236944 (Arator)
(39141, 235633, 69587), -- 235633 (Decimus)
(42172, 248328, 69587); -- 248328 (Void Researcher Anomander)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,43 @@
-- Midnight 12.1.0.69587 Housing: bootstrap the captured Plot 15 Cornerstone.
-- This object is the in-world entry point used by the client to open the house creation UI.
DELETE FROM `gameobject_template_addon` WHERE `entry` = 457142;
INSERT INTO `gameobject_template_addon`
(`entry`, `faction`, `flags`, `WorldEffectID`, `AIAnimKitID`)
VALUES
(457142, 0, 0x20, 0, 0);
DELETE FROM `gameobject_template` WHERE `entry` = 457142;
INSERT INTO `gameobject_template`
(`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`,
`Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`,
`Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`,
`Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`,
`Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`,
`Data33`, `Data34`, `RequiredLevel`, `ContentTuningId`, `VerifiedBuild`)
VALUES
(457142, 48, 110660, 'Cornerstone', 'buy', '', '', 1,
4, 0, 1, 0, 10, 0, 0, 70, 1266097,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 69587);
-- The capture marks Cornerstones as dynamically controlled. Keep exactly the Plot 15
-- bootstrap object permanent until the housing entity runtime owns its lifecycle.
DELETE FROM `gameobject`
WHERE `id` = 457142 AND `map` = 2735
AND `position_x` BETWEEN 2766.0 AND 2768.0
AND `position_y` BETWEEN 121.0 AND 123.0;
SET @HOUSING_PLOT15_OGUID := (SELECT COALESCE(MAX(`guid`), 0) + 1 FROM `gameobject`);
INSERT INTO `gameobject`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`,
`rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`)
VALUES
(@HOUSING_PLOT15_OGUID, 457142, 2735, 16105, 16376, '0', '0', 0,
2767.0400390625, 122.03993225097656, 66.897705078125, 4.258606910705566,
0, 0, -0.8480472564697266, 0.5299205780029297, 7200, 255, 0, 69587);
@@ -0,0 +1,3 @@
-- DBErrors Fixes
UPDATE `creature_template` SET `npcflag`=128 WHERE `entry` IN (235701);
UPDATE `creature_template` SET `npcflag`=130 WHERE `entry` IN (248328);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,783 @@
DELETE FROM `gameobject_template_locale` WHERE `entry` IN (18934,18935,18936,170562,170563,170564,170565,170566,170567,170568,170569,208953,281508,287535,287536,287537,287538,287539,287540,287541,287542,287543,287544,287545,287546,287547,287548,287549,287550,287551,287552,301273,301274,301275,301276,301277,301278,301279,301280,311490,311493,311494,311495,311496,311497,311498,311500,349814,350068,351483,351484,352049,352050,352051,352052,352053,352054,352462,352463,352495,352498,352513,352517,353389,353390,353391,353392,353393,353394,353395,353396,353397,353398,353399,353400,353962,357171,357938);
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
(18934, 'deDE', 'Zellentür', '', NULL, 69587),
(18934, 'esES', 'Puerta de la celda', '', NULL, 69587),
(18934, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(18934, 'frFR', 'Porte de cellule', '', NULL, 69587),
(18934, 'itIT', 'Porta della Cella', '', NULL, 69587),
(18934, 'koKR', '석실 문', '', NULL, 69587),
(18934, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(18934, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(18934, 'zhCN', '牢门', '', NULL, 69587),
(18934, 'zhTW', '牢門', '', NULL, 69587),
(18935, 'deDE', 'Zellentür', '', NULL, 69587),
(18935, 'esES', 'Puerta de la celda', '', NULL, 69587),
(18935, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(18935, 'frFR', 'Porte de cellule', '', NULL, 69587),
(18935, 'itIT', 'Porta della Cella', '', NULL, 69587),
(18935, 'koKR', '석실 문', '', NULL, 69587),
(18935, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(18935, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(18935, 'zhCN', '牢门', '', NULL, 69587),
(18935, 'zhTW', '牢門', '', NULL, 69587),
(18936, 'deDE', 'Zellentür', '', NULL, 69587),
(18936, 'esES', 'Puerta de la celda', '', NULL, 69587),
(18936, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(18936, 'frFR', 'Porte de cellule', '', NULL, 69587),
(18936, 'itIT', 'Porta della Cella', '', NULL, 69587),
(18936, 'koKR', '석실 문', '', NULL, 69587),
(18936, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(18936, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(18936, 'zhCN', '牢门', '', NULL, 69587),
(18936, 'zhTW', '牢門', '', NULL, 69587),
(170562, 'deDE', 'Zellentür', '', NULL, 69587),
(170562, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170562, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170562, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170562, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170562, 'koKR', '석실 문', '', NULL, 69587),
(170562, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170562, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170562, 'zhCN', '牢门', '', NULL, 69587),
(170562, 'zhTW', '牢門', '', NULL, 69587),
(170563, 'deDE', 'Zellentür', '', NULL, 69587),
(170563, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170563, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170563, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170563, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170563, 'koKR', '석실 문', '', NULL, 69587),
(170563, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170563, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170563, 'zhCN', '牢门', '', NULL, 69587),
(170563, 'zhTW', '牢門', '', NULL, 69587),
(170564, 'deDE', 'Zellentür', '', NULL, 69587),
(170564, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170564, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170564, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170564, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170564, 'koKR', '석실 문', '', NULL, 69587),
(170564, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170564, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170564, 'zhCN', '牢门', '', NULL, 69587),
(170564, 'zhTW', '牢門', '', NULL, 69587),
(170565, 'deDE', 'Zellentür', '', NULL, 69587),
(170565, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170565, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170565, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170565, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170565, 'koKR', '석실 문', '', NULL, 69587),
(170565, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170565, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170565, 'zhCN', '牢门', '', NULL, 69587),
(170565, 'zhTW', '牢門', '', NULL, 69587),
(170566, 'deDE', 'Zellentür', '', NULL, 69587),
(170566, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170566, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170566, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170566, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170566, 'koKR', '석실 문', '', NULL, 69587),
(170566, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170566, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170566, 'zhCN', '牢门', '', NULL, 69587),
(170566, 'zhTW', '牢門', '', NULL, 69587),
(170567, 'deDE', 'Zellentür', '', NULL, 69587),
(170567, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170567, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170567, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170567, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170567, 'koKR', '석실 문', '', NULL, 69587),
(170567, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170567, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170567, 'zhCN', '牢门', '', NULL, 69587),
(170567, 'zhTW', '牢門', '', NULL, 69587),
(170568, 'deDE', 'Zellentür', '', NULL, 69587),
(170568, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170568, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170568, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170568, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170568, 'koKR', '석실 문', '', NULL, 69587),
(170568, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170568, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170568, 'zhCN', '牢门', '', NULL, 69587),
(170568, 'zhTW', '牢門', '', NULL, 69587),
(170569, 'deDE', 'Zellentür', '', NULL, 69587),
(170569, 'esES', 'Puerta de la celda', '', NULL, 69587),
(170569, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(170569, 'frFR', 'Porte de cellule', '', NULL, 69587),
(170569, 'itIT', 'Porta della Cella', '', NULL, 69587),
(170569, 'koKR', '석실 문', '', NULL, 69587),
(170569, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(170569, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(170569, 'zhCN', '牢门', '', NULL, 69587),
(170569, 'zhTW', '牢門', '', NULL, 69587),
(208953, 'deDE', 'Zellentür', '', NULL, 69587),
(208953, 'esES', 'Puerta de la celda', '', NULL, 69587),
(208953, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(208953, 'frFR', 'Porte de cellule', '', NULL, 69587),
(208953, 'itIT', 'Porta della Cella', '', NULL, 69587),
(208953, 'koKR', '석실 문', '', NULL, 69587),
(208953, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(208953, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(208953, 'zhCN', '牢门', '', NULL, 69587),
(208953, 'zhTW', '牢門', '', NULL, 69587),
(281508, 'deDE', 'Zellentür', '', NULL, 69587),
(281508, 'esES', 'Puerta de la celda', '', NULL, 69587),
(281508, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(281508, 'frFR', 'Porte de cellule', '', NULL, 69587),
(281508, 'itIT', 'Porta della Cella', '', NULL, 69587),
(281508, 'koKR', '석실 문', '', NULL, 69587),
(281508, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(281508, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(281508, 'zhCN', '牢门', '', NULL, 69587),
(281508, 'zhTW', '牢門', '', NULL, 69587),
(287535, 'deDE', 'Zellentür', '', NULL, 69587),
(287535, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287535, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287535, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287535, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287535, 'koKR', '석실 문', '', NULL, 69587),
(287535, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287535, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287535, 'zhCN', '牢门', '', NULL, 69587),
(287535, 'zhTW', '牢門', '', NULL, 69587),
(287536, 'deDE', 'Zellentür', '', NULL, 69587),
(287536, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287536, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287536, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287536, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287536, 'koKR', '석실 문', '', NULL, 69587),
(287536, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287536, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287536, 'zhCN', '牢门', '', NULL, 69587),
(287536, 'zhTW', '牢門', '', NULL, 69587),
(287537, 'deDE', 'Zellentür', '', NULL, 69587),
(287537, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287537, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287537, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287537, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287537, 'koKR', '석실 문', '', NULL, 69587),
(287537, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287537, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287537, 'zhCN', '牢门', '', NULL, 69587),
(287537, 'zhTW', '牢門', '', NULL, 69587),
(287538, 'deDE', 'Zellentür', '', NULL, 69587),
(287538, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287538, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287538, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287538, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287538, 'koKR', '석실 문', '', NULL, 69587),
(287538, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287538, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287538, 'zhCN', '牢门', '', NULL, 69587),
(287538, 'zhTW', '牢門', '', NULL, 69587),
(287539, 'deDE', 'Zellentür', '', NULL, 69587),
(287539, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287539, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287539, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287539, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287539, 'koKR', '석실 문', '', NULL, 69587),
(287539, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287539, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287539, 'zhCN', '牢门', '', NULL, 69587),
(287539, 'zhTW', '牢門', '', NULL, 69587),
(287540, 'deDE', 'Zellentür', '', NULL, 69587),
(287540, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287540, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287540, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287540, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287540, 'koKR', '석실 문', '', NULL, 69587),
(287540, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287540, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287540, 'zhCN', '牢门', '', NULL, 69587),
(287540, 'zhTW', '牢門', '', NULL, 69587),
(287541, 'deDE', 'Zellentür', '', NULL, 69587),
(287541, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287541, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287541, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287541, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287541, 'koKR', '석실 문', '', NULL, 69587),
(287541, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287541, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287541, 'zhCN', '牢门', '', NULL, 69587),
(287541, 'zhTW', '牢門', '', NULL, 69587),
(287542, 'deDE', 'Zellentür', '', NULL, 69587),
(287542, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287542, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287542, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287542, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287542, 'koKR', '석실 문', '', NULL, 69587),
(287542, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287542, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287542, 'zhCN', '牢门', '', NULL, 69587),
(287542, 'zhTW', '牢門', '', NULL, 69587),
(287543, 'deDE', 'Zellentür', '', NULL, 69587),
(287543, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287543, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287543, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287543, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287543, 'koKR', '석실 문', '', NULL, 69587),
(287543, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287543, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287543, 'zhCN', '牢门', '', NULL, 69587),
(287543, 'zhTW', '牢門', '', NULL, 69587),
(287544, 'deDE', 'Zellentür', '', NULL, 69587),
(287544, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287544, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287544, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287544, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287544, 'koKR', '석실 문', '', NULL, 69587),
(287544, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287544, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287544, 'zhCN', '牢门', '', NULL, 69587),
(287544, 'zhTW', '牢門', '', NULL, 69587),
(287545, 'deDE', 'Zellentür', '', NULL, 69587),
(287545, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287545, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287545, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287545, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287545, 'koKR', '석실 문', '', NULL, 69587),
(287545, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287545, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287545, 'zhCN', '牢门', '', NULL, 69587),
(287545, 'zhTW', '牢門', '', NULL, 69587),
(287546, 'deDE', 'Zellentür', '', NULL, 69587),
(287546, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287546, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287546, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287546, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287546, 'koKR', '석실 문', '', NULL, 69587),
(287546, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287546, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287546, 'zhCN', '牢门', '', NULL, 69587),
(287546, 'zhTW', '牢門', '', NULL, 69587),
(287547, 'deDE', 'Zellentür', '', NULL, 69587),
(287547, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287547, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287547, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287547, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287547, 'koKR', '석실 문', '', NULL, 69587),
(287547, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287547, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287547, 'zhCN', '牢门', '', NULL, 69587),
(287547, 'zhTW', '牢門', '', NULL, 69587),
(287548, 'deDE', 'Zellentür', '', NULL, 69587),
(287548, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287548, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287548, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287548, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287548, 'koKR', '석실 문', '', NULL, 69587),
(287548, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287548, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287548, 'zhCN', '牢门', '', NULL, 69587),
(287548, 'zhTW', '牢門', '', NULL, 69587),
(287549, 'deDE', 'Zellentür', '', NULL, 69587),
(287549, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287549, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287549, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287549, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287549, 'koKR', '석실 문', '', NULL, 69587),
(287549, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287549, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287549, 'zhCN', '牢门', '', NULL, 69587),
(287549, 'zhTW', '牢門', '', NULL, 69587),
(287550, 'deDE', 'Zellentür', '', NULL, 69587),
(287550, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287550, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287550, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287550, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287550, 'koKR', '석실 문', '', NULL, 69587),
(287550, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287550, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287550, 'zhCN', '牢门', '', NULL, 69587),
(287550, 'zhTW', '牢門', '', NULL, 69587),
(287551, 'deDE', 'Zellentür', '', NULL, 69587),
(287551, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287551, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287551, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287551, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287551, 'koKR', '석실 문', '', NULL, 69587),
(287551, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287551, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287551, 'zhCN', '牢门', '', NULL, 69587),
(287551, 'zhTW', '牢門', '', NULL, 69587),
(287552, 'deDE', 'Zellentür', '', NULL, 69587),
(287552, 'esES', 'Puerta de la celda', '', NULL, 69587),
(287552, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(287552, 'frFR', 'Porte de cellule', '', NULL, 69587),
(287552, 'itIT', 'Porta della Cella', '', NULL, 69587),
(287552, 'koKR', '석실 문', '', NULL, 69587),
(287552, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(287552, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(287552, 'zhCN', '牢门', '', NULL, 69587),
(287552, 'zhTW', '牢門', '', NULL, 69587),
(301273, 'deDE', 'Zellentür', '', NULL, 69587),
(301273, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301273, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301273, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301273, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301273, 'koKR', '석실 문', '', NULL, 69587),
(301273, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301273, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301273, 'zhCN', '牢门', '', NULL, 69587),
(301273, 'zhTW', '牢門', '', NULL, 69587),
(301274, 'deDE', 'Zellentür', '', NULL, 69587),
(301274, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301274, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301274, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301274, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301274, 'koKR', '석실 문', '', NULL, 69587),
(301274, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301274, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301274, 'zhCN', '牢门', '', NULL, 69587),
(301274, 'zhTW', '牢門', '', NULL, 69587),
(301275, 'deDE', 'Zellentür', '', NULL, 69587),
(301275, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301275, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301275, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301275, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301275, 'koKR', '석실 문', '', NULL, 69587),
(301275, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301275, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301275, 'zhCN', '牢门', '', NULL, 69587),
(301275, 'zhTW', '牢門', '', NULL, 69587),
(301276, 'deDE', 'Zellentür', '', NULL, 69587),
(301276, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301276, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301276, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301276, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301276, 'koKR', '석실 문', '', NULL, 69587),
(301276, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301276, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301276, 'zhCN', '牢门', '', NULL, 69587),
(301276, 'zhTW', '牢門', '', NULL, 69587),
(301277, 'deDE', 'Zellentür', '', NULL, 69587),
(301277, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301277, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301277, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301277, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301277, 'koKR', '석실 문', '', NULL, 69587),
(301277, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301277, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301277, 'zhCN', '牢门', '', NULL, 69587),
(301277, 'zhTW', '牢門', '', NULL, 69587),
(301278, 'deDE', 'Zellentür', '', NULL, 69587),
(301278, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301278, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301278, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301278, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301278, 'koKR', '석실 문', '', NULL, 69587),
(301278, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301278, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301278, 'zhCN', '牢门', '', NULL, 69587),
(301278, 'zhTW', '牢門', '', NULL, 69587),
(301279, 'deDE', 'Zellentür', '', NULL, 69587),
(301279, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301279, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301279, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301279, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301279, 'koKR', '석실 문', '', NULL, 69587),
(301279, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301279, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301279, 'zhCN', '牢门', '', NULL, 69587),
(301279, 'zhTW', '牢門', '', NULL, 69587),
(301280, 'deDE', 'Zellentür', '', NULL, 69587),
(301280, 'esES', 'Puerta de la celda', '', NULL, 69587),
(301280, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(301280, 'frFR', 'Porte de cellule', '', NULL, 69587),
(301280, 'itIT', 'Porta della Cella', '', NULL, 69587),
(301280, 'koKR', '석실 문', '', NULL, 69587),
(301280, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(301280, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(301280, 'zhCN', '牢门', '', NULL, 69587),
(301280, 'zhTW', '牢門', '', NULL, 69587),
(311490, 'deDE', 'Zellentür', '', NULL, 69587),
(311490, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311490, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311490, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311490, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311490, 'koKR', '석실 문', '', NULL, 69587),
(311490, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311490, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311490, 'zhCN', '牢门', '', NULL, 69587),
(311490, 'zhTW', '牢門', '', NULL, 69587),
(311493, 'deDE', 'Zellentür', '', NULL, 69587),
(311493, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311493, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311493, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311493, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311493, 'koKR', '석실 문', '', NULL, 69587),
(311493, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311493, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311493, 'zhCN', '牢门', '', NULL, 69587),
(311493, 'zhTW', '牢門', '', NULL, 69587),
(311494, 'deDE', 'Zellentür', '', NULL, 69587),
(311494, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311494, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311494, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311494, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311494, 'koKR', '석실 문', '', NULL, 69587),
(311494, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311494, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311494, 'zhCN', '牢门', '', NULL, 69587),
(311494, 'zhTW', '牢門', '', NULL, 69587),
(311495, 'deDE', 'Zellentür', '', NULL, 69587),
(311495, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311495, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311495, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311495, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311495, 'koKR', '석실 문', '', NULL, 69587),
(311495, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311495, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311495, 'zhCN', '牢门', '', NULL, 69587),
(311495, 'zhTW', '牢門', '', NULL, 69587),
(311496, 'deDE', 'Zellentür', '', NULL, 69587),
(311496, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311496, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311496, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311496, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311496, 'koKR', '석실 문', '', NULL, 69587),
(311496, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311496, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311496, 'zhCN', '牢门', '', NULL, 69587),
(311496, 'zhTW', '牢門', '', NULL, 69587),
(311497, 'deDE', 'Zellentür', '', NULL, 69587),
(311497, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311497, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311497, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311497, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311497, 'koKR', '석실 문', '', NULL, 69587),
(311497, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311497, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311497, 'zhCN', '牢门', '', NULL, 69587),
(311497, 'zhTW', '牢門', '', NULL, 69587),
(311498, 'deDE', 'Zellentür', '', NULL, 69587),
(311498, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311498, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311498, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311498, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311498, 'koKR', '석실 문', '', NULL, 69587),
(311498, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311498, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311498, 'zhCN', '牢门', '', NULL, 69587),
(311498, 'zhTW', '牢門', '', NULL, 69587),
(311500, 'deDE', 'Zellentür', '', NULL, 69587),
(311500, 'esES', 'Puerta de la celda', '', NULL, 69587),
(311500, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(311500, 'frFR', 'Porte de cellule', '', NULL, 69587),
(311500, 'itIT', 'Porta della Cella', '', NULL, 69587),
(311500, 'koKR', '석실 문', '', NULL, 69587),
(311500, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(311500, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(311500, 'zhCN', '牢门', '', NULL, 69587),
(311500, 'zhTW', '牢門', '', NULL, 69587),
(349814, 'deDE', 'Zellentür', '', NULL, 69587),
(349814, 'esES', 'Puerta de la celda', '', NULL, 69587),
(349814, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(349814, 'frFR', 'Porte de cellule', '', NULL, 69587),
(349814, 'itIT', 'Porta della Cella', '', NULL, 69587),
(349814, 'koKR', '석실 문', '', NULL, 69587),
(349814, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(349814, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(349814, 'zhCN', '牢门', '', NULL, 69587),
(349814, 'zhTW', '牢門', '', NULL, 69587),
(350068, 'deDE', 'Zellentür', '', NULL, 69587),
(350068, 'esES', 'Puerta de la celda', '', NULL, 69587),
(350068, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(350068, 'frFR', 'Porte de cellule', '', NULL, 69587),
(350068, 'itIT', 'Porta della Cella', '', NULL, 69587),
(350068, 'koKR', '석실 문', '', NULL, 69587),
(350068, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(350068, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(350068, 'zhCN', '牢门', '', NULL, 69587),
(350068, 'zhTW', '牢門', '', NULL, 69587),
(351483, 'deDE', 'Zellentür', '', NULL, 69587),
(351483, 'esES', 'Puerta de la celda', '', NULL, 69587),
(351483, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(351483, 'frFR', 'Porte de cellule', '', NULL, 69587),
(351483, 'itIT', 'Porta della Cella', '', NULL, 69587),
(351483, 'koKR', '석실 문', '', NULL, 69587),
(351483, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(351483, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(351483, 'zhCN', '牢门', '', NULL, 69587),
(351483, 'zhTW', '牢門', '', NULL, 69587),
(351484, 'deDE', 'Zellentür', '', NULL, 69587),
(351484, 'esES', 'Puerta de la celda', '', NULL, 69587),
(351484, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(351484, 'frFR', 'Porte de cellule', '', NULL, 69587),
(351484, 'itIT', 'Porta della Cella', '', NULL, 69587),
(351484, 'koKR', '석실 문', '', NULL, 69587),
(351484, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(351484, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(351484, 'zhCN', '牢门', '', NULL, 69587),
(351484, 'zhTW', '牢門', '', NULL, 69587),
(352049, 'deDE', 'Zellentür', '', NULL, 69587),
(352049, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352049, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352049, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352049, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352049, 'koKR', '석실 문', '', NULL, 69587),
(352049, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352049, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352049, 'zhCN', '牢门', '', NULL, 69587),
(352049, 'zhTW', '牢門', '', NULL, 69587),
(352050, 'deDE', 'Zellentür', '', NULL, 69587),
(352050, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352050, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352050, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352050, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352050, 'koKR', '석실 문', '', NULL, 69587),
(352050, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352050, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352050, 'zhCN', '牢门', '', NULL, 69587),
(352050, 'zhTW', '牢門', '', NULL, 69587),
(352051, 'deDE', 'Zellentür', '', NULL, 69587),
(352051, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352051, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352051, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352051, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352051, 'koKR', '석실 문', '', NULL, 69587),
(352051, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352051, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352051, 'zhCN', '牢门', '', NULL, 69587),
(352051, 'zhTW', '牢門', '', NULL, 69587),
(352052, 'deDE', 'Zellentür', '', NULL, 69587),
(352052, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352052, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352052, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352052, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352052, 'koKR', '석실 문', '', NULL, 69587),
(352052, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352052, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352052, 'zhCN', '牢门', '', NULL, 69587),
(352052, 'zhTW', '牢門', '', NULL, 69587),
(352053, 'deDE', 'Zellentür', '', NULL, 69587),
(352053, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352053, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352053, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352053, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352053, 'koKR', '석실 문', '', NULL, 69587),
(352053, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352053, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352053, 'zhCN', '牢门', '', NULL, 69587),
(352053, 'zhTW', '牢門', '', NULL, 69587),
(352054, 'deDE', 'Zellentür', '', NULL, 69587),
(352054, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352054, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352054, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352054, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352054, 'koKR', '석실 문', '', NULL, 69587),
(352054, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352054, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352054, 'zhCN', '牢门', '', NULL, 69587),
(352054, 'zhTW', '牢門', '', NULL, 69587),
(352462, 'deDE', 'Zellentür', '', NULL, 69587),
(352462, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352462, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352462, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352462, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352462, 'koKR', '석실 문', '', NULL, 69587),
(352462, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352462, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352462, 'zhCN', '牢门', '', NULL, 69587),
(352462, 'zhTW', '牢門', '', NULL, 69587),
(352463, 'deDE', 'Zellentür', '', NULL, 69587),
(352463, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352463, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352463, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352463, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352463, 'koKR', '석실 문', '', NULL, 69587),
(352463, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352463, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352463, 'zhCN', '牢门', '', NULL, 69587),
(352463, 'zhTW', '牢門', '', NULL, 69587),
(352495, 'deDE', 'Zellentür', '', NULL, 69587),
(352495, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352495, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352495, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352495, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352495, 'koKR', '석실 문', '', NULL, 69587),
(352495, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352495, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352495, 'zhCN', '牢门', '', NULL, 69587),
(352495, 'zhTW', '牢門', '', NULL, 69587),
(352498, 'deDE', 'Zellentür', '', NULL, 69587),
(352498, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352498, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352498, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352498, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352498, 'koKR', '석실 문', '', NULL, 69587),
(352498, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352498, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352498, 'zhCN', '牢门', '', NULL, 69587),
(352498, 'zhTW', '牢門', '', NULL, 69587),
(352513, 'deDE', 'Zellentür', '', NULL, 69587),
(352513, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352513, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352513, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352513, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352513, 'koKR', '석실 문', '', NULL, 69587),
(352513, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352513, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352513, 'zhCN', '牢门', '', NULL, 69587),
(352513, 'zhTW', '牢門', '', NULL, 69587),
(352517, 'deDE', 'Zellentür', '', NULL, 69587),
(352517, 'esES', 'Puerta de la celda', '', NULL, 69587),
(352517, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(352517, 'frFR', 'Porte de cellule', '', NULL, 69587),
(352517, 'itIT', 'Porta della Cella', '', NULL, 69587),
(352517, 'koKR', '석실 문', '', NULL, 69587),
(352517, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(352517, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(352517, 'zhCN', '牢门', '', NULL, 69587),
(352517, 'zhTW', '牢門', '', NULL, 69587),
(353389, 'deDE', 'Zellentür', '', NULL, 69587),
(353389, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353389, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353389, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353389, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353389, 'koKR', '석실 문', '', NULL, 69587),
(353389, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353389, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353389, 'zhCN', '牢门', '', NULL, 69587),
(353389, 'zhTW', '牢門', '', NULL, 69587),
(353390, 'deDE', 'Zellentür', '', NULL, 69587),
(353390, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353390, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353390, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353390, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353390, 'koKR', '석실 문', '', NULL, 69587),
(353390, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353390, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353390, 'zhCN', '牢门', '', NULL, 69587),
(353390, 'zhTW', '牢門', '', NULL, 69587),
(353391, 'deDE', 'Zellentür', '', NULL, 69587),
(353391, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353391, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353391, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353391, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353391, 'koKR', '석실 문', '', NULL, 69587),
(353391, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353391, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353391, 'zhCN', '牢门', '', NULL, 69587),
(353391, 'zhTW', '牢門', '', NULL, 69587),
(353392, 'deDE', 'Zellentür', '', NULL, 69587),
(353392, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353392, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353392, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353392, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353392, 'koKR', '석실 문', '', NULL, 69587),
(353392, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353392, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353392, 'zhCN', '牢门', '', NULL, 69587),
(353392, 'zhTW', '牢門', '', NULL, 69587),
(353393, 'deDE', 'Zellentür', '', NULL, 69587),
(353393, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353393, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353393, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353393, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353393, 'koKR', '석실 문', '', NULL, 69587),
(353393, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353393, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353393, 'zhCN', '牢门', '', NULL, 69587),
(353393, 'zhTW', '牢門', '', NULL, 69587),
(353394, 'deDE', 'Zellentür', '', NULL, 69587),
(353394, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353394, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353394, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353394, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353394, 'koKR', '석실 문', '', NULL, 69587),
(353394, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353394, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353394, 'zhCN', '牢门', '', NULL, 69587),
(353394, 'zhTW', '牢門', '', NULL, 69587),
(353395, 'deDE', 'Zellentür', '', NULL, 69587),
(353395, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353395, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353395, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353395, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353395, 'koKR', '석실 문', '', NULL, 69587),
(353395, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353395, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353395, 'zhCN', '牢门', '', NULL, 69587),
(353395, 'zhTW', '牢門', '', NULL, 69587),
(353396, 'deDE', 'Zellentür', '', NULL, 69587),
(353396, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353396, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353396, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353396, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353396, 'koKR', '석실 문', '', NULL, 69587),
(353396, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353396, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353396, 'zhCN', '牢门', '', NULL, 69587),
(353396, 'zhTW', '牢門', '', NULL, 69587),
(353397, 'deDE', 'Zellentür', '', NULL, 69587),
(353397, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353397, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353397, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353397, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353397, 'koKR', '석실 문', '', NULL, 69587),
(353397, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353397, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353397, 'zhCN', '牢门', '', NULL, 69587),
(353397, 'zhTW', '牢門', '', NULL, 69587),
(353398, 'deDE', 'Zellentür', '', NULL, 69587),
(353398, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353398, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353398, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353398, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353398, 'koKR', '석실 문', '', NULL, 69587),
(353398, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353398, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353398, 'zhCN', '牢门', '', NULL, 69587),
(353398, 'zhTW', '牢門', '', NULL, 69587),
(353399, 'deDE', 'Zellentür', '', NULL, 69587),
(353399, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353399, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353399, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353399, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353399, 'koKR', '석실 문', '', NULL, 69587),
(353399, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353399, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353399, 'zhCN', '牢门', '', NULL, 69587),
(353399, 'zhTW', '牢門', '', NULL, 69587),
(353400, 'deDE', 'Zellentür', '', NULL, 69587),
(353400, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353400, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353400, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353400, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353400, 'koKR', '석실 문', '', NULL, 69587),
(353400, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353400, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353400, 'zhCN', '牢门', '', NULL, 69587),
(353400, 'zhTW', '牢門', '', NULL, 69587),
(353962, 'deDE', 'Zellentür', '', NULL, 69587),
(353962, 'esES', 'Puerta de la celda', '', NULL, 69587),
(353962, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(353962, 'frFR', 'Porte de cellule', '', NULL, 69587),
(353962, 'itIT', 'Porta della Cella', '', NULL, 69587),
(353962, 'koKR', '석실 문', '', NULL, 69587),
(353962, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(353962, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(353962, 'zhCN', '牢门', '', NULL, 69587),
(353962, 'zhTW', '牢門', '', NULL, 69587),
(357171, 'deDE', 'Zellentür', '', NULL, 69587),
(357171, 'esES', 'Puerta de la celda', '', NULL, 69587),
(357171, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(357171, 'frFR', 'Porte de cellule', '', NULL, 69587),
(357171, 'itIT', 'Porta della Cella', '', NULL, 69587),
(357171, 'koKR', '석실 문', '', NULL, 69587),
(357171, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(357171, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(357171, 'zhCN', '牢门', '', NULL, 69587),
(357171, 'zhTW', '牢門', '', NULL, 69587),
(357938, 'deDE', 'Zellentür', '', NULL, 69587),
(357938, 'esES', 'Puerta de la celda', '', NULL, 69587),
(357938, 'esMX', 'Puerta de la celda', '', NULL, 69587),
(357938, 'frFR', 'Porte de cellule', '', NULL, 69587),
(357938, 'itIT', 'Porta della Cella', '', NULL, 69587),
(357938, 'koKR', '석실 문', '', NULL, 69587),
(357938, 'ptBR', 'Porta da Cela', '', NULL, 69587),
(357938, 'ruRU', 'Дверь камеры', '', NULL, 69587),
(357938, 'zhCN', '牢门', '', NULL, 69587),
(357938, 'zhTW', '牢門', '', NULL, 69587);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,77 @@
-- Midnight 12.1.0.69587 Housing: captured Plot 15 neighborhood population.
-- Source: playerhousingfull12.1.0.695875.pkt.
-- Spawns are guarded by creature_template so incomplete world databases do not
-- create invalid creatures or repeat the missing-model failure.
DELETE FROM `creature`
WHERE `map` = 2735 AND `areaId` = 16376
AND (
(`id` = 245042 AND `position_x` BETWEEN 2744.8 AND 2745.1 AND `position_y` BETWEEN 112.3 AND 112.6) OR
(`id` = 234993 AND `position_x` BETWEEN 2781.2 AND 2781.6 AND `position_y` BETWEEN 116.0 AND 116.3) OR
(`id` = 244166 AND `position_x` BETWEEN 2732.3 AND 2732.7 AND `position_y` BETWEEN 108.9 AND 109.3) OR
(`id` = 238584 AND `position_x` BETWEEN 2730.1 AND 2730.5 AND `position_y` BETWEEN 121.5 AND 121.9) OR
(`id` = 245087 AND `position_x` BETWEEN 2726.8 AND 2727.2 AND `position_y` BETWEEN 126.4 AND 126.8) OR
(`id` = 235021 AND `position_x` BETWEEN 2794.2 AND 2794.7 AND `position_y` BETWEEN 109.4 AND 109.8)
);
SET @HOUSING_PLOT15_CGUID := (SELECT COALESCE(MAX(`guid`), 0) + 1 FROM `creature`);
INSERT INTO `creature`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`,
`spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`,
`unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`)
SELECT @HOUSING_PLOT15_CGUID + 0, 245042, 2735, 16105, 16376, '0', 0, 0,
0, 0, 2744.958251953125, 112.44271087646484, 79.2891616821289, 3.497457981109619,
7200, 0, 0, 0, NULL, NULL, NULL, NULL, 69587
FROM `creature_template` WHERE `entry` = 245042 LIMIT 1;
INSERT INTO `creature`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`,
`spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`,
`unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`)
SELECT @HOUSING_PLOT15_CGUID + 1, 234993, 2735, 16105, 16376, '0', 0, 0,
0, 0, 2781.37841796875, 116.14930725097656, 67.00509643554688, 3.971698999404907,
7200, 0, 0, 0, NULL, NULL, NULL, NULL, 69587
FROM `creature_template` WHERE `entry` = 234993 LIMIT 1;
INSERT INTO `creature`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`,
`spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`,
`unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`)
SELECT @HOUSING_PLOT15_CGUID + 2, 244166, 2735, 16105, 16376, '0', 0, 0,
0, 0, 2732.484375, 109.078125, 70.69172668457031, 0.984040141105652,
7200, 0, 0, 0, NULL, NULL, NULL, NULL, 69587
FROM `creature_template` WHERE `entry` = 244166 LIMIT 1;
INSERT INTO `creature`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`,
`spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`,
`unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`)
SELECT @HOUSING_PLOT15_CGUID + 3, 238584, 2735, 16105, 16376, '0', 0, 0,
0, 0, 2730.252685546875, 121.7170181274414, 69.84736633300781, 1.883533358573914,
7200, 0, 0, 0, NULL, NULL, NULL, NULL, 69587
FROM `creature_template` WHERE `entry` = 238584 LIMIT 1;
INSERT INTO `creature`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`,
`spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`,
`unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`)
SELECT @HOUSING_PLOT15_CGUID + 4, 245087, 2735, 16105, 16376, '0', 0, 0,
0, 0, 2726.966064453125, 126.60069274902344, 69.42707824707031, 1.54562783241272,
7200, 0, 0, 0, NULL, NULL, NULL, NULL, 69587
FROM `creature_template` WHERE `entry` = 245087 LIMIT 1;
INSERT INTO `creature`
(`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`,
`modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`,
`spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`,
`unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`)
SELECT @HOUSING_PLOT15_CGUID + 5, 235021, 2735, 16105, 16376, '0', 0, 0,
0, 0, 2794.431884765625, 109.59060668945312, 68.33464813232422, 5.646081924438477,
7200, 0, 0, 0, NULL, NULL, NULL, NULL, 69587
FROM `creature_template` WHERE `entry` = 235021 LIMIT 1;
@@ -0,0 +1,8 @@
-- Housing neighborhood maps may be created with normal difficulty.
UPDATE `creature`
SET `spawnDifficulties` = '0,1'
WHERE `map` IN (2735, 2736) AND `spawnDifficulties` = '0';
UPDATE `gameobject`
SET `spawnDifficulties` = '0,1'
WHERE `map` IN (2735, 2736) AND `spawnDifficulties` = '0';
@@ -0,0 +1,153 @@
-- Data-driven Cornerstone templates for all Alliance and Horde plots.
-- Existing official templates are preserved; missing entries inherit the captured
-- type-48 Cornerstone layout from entry 457142.
CREATE TEMPORARY TABLE `housing_cornerstone_entry_tmp` (
`Entry` int unsigned NOT NULL,
PRIMARY KEY (`Entry`)
) ENGINE=MEMORY;
INSERT INTO `housing_cornerstone_entry_tmp` (`Entry`) VALUES
(475051),
(475052),
(475053),
(475054),
(475055),
(475057),
(475058),
(475059),
(475060),
(475061),
(475062),
(475063),
(475064),
(475066),
(475067),
(475068),
(475071),
(475072),
(475073),
(475076),
(475077),
(475079),
(475080),
(475081),
(475083),
(475085),
(475086),
(475087),
(475088),
(475090),
(475091),
(475092),
(475093),
(475094),
(475095),
(475096),
(475097),
(475098),
(475099),
(475100),
(475102),
(475103),
(475104),
(475105),
(475106),
(527260),
(527261),
(527262),
(527263),
(527264),
(527265),
(527266),
(527267),
(527268),
(527269),
(527270),
(527271),
(527272),
(527274),
(527275),
(527276),
(527277),
(527278),
(527279),
(527280),
(527281),
(527282),
(527283),
(527284),
(527285),
(527286),
(527288),
(527289),
(527290),
(527291),
(527292),
(527293),
(527294),
(527295),
(527297),
(527298),
(527299),
(527300),
(527301),
(527302),
(527303),
(527304),
(527305),
(527306),
(527308),
(527309),
(527310),
(527311),
(527313),
(527314),
(566793),
(567160),
(569609),
(569610),
(569611),
(571207),
(571208),
(571209),
(571210),
(571211),
(576758),
(582082),
(582083),
(582084),
(582085);
INSERT IGNORE INTO `gameobject_template`
(`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`,
`Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`,
`Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`,
`Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`,
`Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`,
`Data33`, `Data34`, `RequiredLevel`, `ContentTuningId`, `VerifiedBuild`)
SELECT e.`Entry`, t.`type`, t.`displayId`, CONCAT('Cornerstone - Plot ', e.`Entry`),
t.`IconName`, t.`castBarCaption`, t.`unk1`, t.`size`,
t.`Data0`, t.`Data1`, t.`Data2`, t.`Data3`, t.`Data4`, t.`Data5`, t.`Data6`,
t.`Data7`, t.`Data8`, t.`Data9`, t.`Data10`, t.`Data11`, t.`Data12`,
t.`Data13`, t.`Data14`, t.`Data15`, t.`Data16`, t.`Data17`, t.`Data18`,
t.`Data19`, t.`Data20`, t.`Data21`, t.`Data22`, t.`Data23`, t.`Data24`,
t.`Data25`, t.`Data26`, t.`Data27`, t.`Data28`, t.`Data29`, t.`Data30`,
t.`Data31`, t.`Data32`, t.`Data33`, t.`Data34`, t.`RequiredLevel`,
t.`ContentTuningId`, 69587
FROM `housing_cornerstone_entry_tmp` e
JOIN `gameobject_template` t ON t.`entry` = 457142;
INSERT IGNORE INTO `gameobject_template_addon`
(`entry`, `faction`, `flags`, `WorldEffectID`, `AIAnimKitID`)
SELECT e.`Entry`, a.`faction`, a.`flags`, a.`WorldEffectID`, a.`AIAnimKitID`
FROM `housing_cornerstone_entry_tmp` e
JOIN `gameobject_template_addon` a ON a.`entry` = 457142;
-- Remove the former permanent bootstrap and any imported permanent plot
-- Cornerstones. Their lifecycle is now owned by the map runtime.
DELETE FROM `gameobject`
WHERE `map` IN (2735, 2736) AND `id` IN (475051, 475052, 475053, 475054, 475055, 475057, 475058, 475059, 475060, 475061, 475062, 475063, 475064, 475066, 475067, 475068, 475071, 475072, 475073, 475076, 475077, 475079, 475080, 475081, 475083, 475085, 475086, 475087, 475088, 475090, 475091, 475092, 475093, 475094, 475095, 475096, 475097, 475098, 475099, 475100, 475102, 475103, 475104, 475105, 475106, 527260, 527261, 527262, 527263, 527264, 527265, 527266, 527267, 527268, 527269, 527270, 527271, 527272, 527274, 527275, 527276, 527277, 527278, 527279, 527280, 527281, 527282, 527283, 527284, 527285, 527286, 527288, 527289, 527290, 527291, 527292, 527293, 527294, 527295, 527297, 527298, 527299, 527300, 527301, 527302, 527303, 527304, 527305, 527306, 527308, 527309, 527310, 527311, 527313, 527314, 566793, 567160, 569609, 569610, 569611, 571207, 571208, 571209, 571210, 571211, 576758, 582082, 582083, 582084, 582085, 457142);
DROP TEMPORARY TABLE `housing_cornerstone_entry_tmp`;
@@ -0,0 +1,25 @@
-- Housing plot interaction and house door bindings for both faction neighborhoods.
DELETE FROM `areatrigger_template` WHERE `Id` = 37358 AND `IsCustom` = 0;
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`) VALUES
(37358, 0, 0, 0, 0);
DELETE FROM `areatrigger_create_properties` WHERE `Id` = 37358 AND `IsCustom` = 0;
INSERT INTO `areatrigger_create_properties`
(`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`,
`MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`,
`AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`,
`TimeToTargetScale`, `Speed`, `SpeedIsTime`,
`Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`,
`ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`)
VALUES
(37358, 0, 37358, 0, 0,
0, 0, 0, 0,
0, 0, 621, 1282351,
0, 1, 0,
1, 35, 30, 94, 35,
30, 94, 0, 0, 'at_housing_plot');
-- Alliance Founder's Point and Horde Razorwind Shores exterior doors.
UPDATE `gameobject_template`
SET `ScriptName` = 'go_housing_door'
WHERE `entry` IN (586576, 602702);
@@ -0,0 +1,276 @@
-- ======================
-- Void Elf Starting Zone
-- ======================
-- Misc: Graveyard Zone Calibration
DELETE FROM `world_safe_locs` WHERE `MapID`=1865;
INSERT INTO `world_safe_locs` (`ID`, `MapID`, `LocX`, `LocY`, `LocZ`, `Facing`, `TransportSpawnId`, `Comment`) VALUES
(6428, 1865, 2087.91, 3327.42, 56.405, 83.7774, NULL, 'Telogrus Rift (Void Elf Starting Zone)');
DELETE FROM `graveyard_zone` WHERE `GhostZone` IN (9415,9531,15382,15383);
INSERT INTO `graveyard_zone` (`ID`, `GhostZone`, `Comment`) VALUES
(6428, 9415, 'Telogrus Rift (Void Elf Starting Zone)');
-- NPC Umbral Ranger (132407)
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=132407;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (132407,-243523,-243525,-243542) AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132407, 0, 0, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Bow - Run Actionlist'),
(132407, 0, 1, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Chicken - Run Actionlist'),
(132407, 0, 2, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Kiss - Run Actionlist'),
(132407, 0, 3, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Rude - Run Actionlist'),
(132407, 0, 4, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Salute - Run Actionlist'),
(132407, 0, 5, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Shy - Run Actionlist'),
(132407, 0, 6, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Received Emote Wave - Run Actionlist'),
(132407, 0, 7, 0, '', 0, 0, 100, 0, 0, 0, 2300, 3900, 0, '', 11, 95826, 64, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - IC - Cast Shoot'),
(-243523, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Update - Set Emote State'),
(-243523, 0, 1, 0, '', 0, 0, 100, 0, 0, 0, 2300, 3900, 0, '', 11, 95826, 64, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - IC - Cast Shoot'),
(-243525, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Update - Set Emote State'),
(-243525, 0, 1, 0, '', 0, 0, 100, 0, 0, 0, 2300, 3900, 0, '', 11, 95826, 64, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - IC - Cast Shoot'),
(-243542, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - On Update - Set Emote State'),
(-243542, 0, 1, 0, '', 0, 0, 100, 0, 0, 0, 2300, 3900, 0, '', 11, 95826, 64, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Umbral Ranger - IC - Cast Shoot');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=132407 AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 5, 132407, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Umbral Ranger - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 5, 132407, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Umbral Ranger - Run Script if Target is Alliance'),
(22, 5, 132407, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Umbral Ranger - Run Script if Volunteer Guard Day Event is Active');
-- NPC Veiled Riftblade (132648)
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (132648,-243492,-243500,-243514) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13264800,13264801) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132648, 0, 0, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Bow - Run Actionlist'),
(132648, 0, 1, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Chicken - Run Actionlist'),
(132648, 0, 2, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Kiss - Run Actionlist'),
(132648, 0, 3, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Rude - Run Actionlist'),
(132648, 0, 4, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Salute - Run Actionlist'),
(132648, 0, 5, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Shy - Run Actionlist'),
(132648, 0, 6, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Wave - Run Actionlist'),
(132648, 0, 7, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(-243492, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13264800, 13264801, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Update - Run Random Actionlist'),
(-243492, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Bow - Run Actionlist'),
(-243492, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Chicken - Run Actionlist'),
(-243492, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Kiss - Run Actionlist'),
(-243492, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Rude - Run Actionlist'),
(-243492, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Salute - Run Actionlist'),
(-243492, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Shy - Run Actionlist'),
(-243492, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Wave - Run Actionlist'),
(-243492, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(-243500, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13264800, 13264801, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Update - Run Random Actionlist'),
(-243500, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Bow - Run Actionlist'),
(-243500, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Chicken - Run Actionlist'),
(-243500, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Kiss - Run Actionlist'),
(-243500, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Rude - Run Actionlist'),
(-243500, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Salute - Run Actionlist'),
(-243500, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Shy - Run Actionlist'),
(-243500, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Wave - Run Actionlist'),
(-243500, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(-243514, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Update - Set Emote State'),
(-243514, 0, 1, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(13264800, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 10, 1, 113, 29, 574, 71, 400, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - Play Random Emote'),
(13264801, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 10, 1, 5, 6, 29, 604, 661, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - Play Random Emote');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (132648,-243492,-243500) AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 5, 132648, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Veiled Riftblade - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 5, 132648, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Target is Alliance'),
(22, 5, 132648, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243492, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Veiled Riftblade - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243492, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Target is Alliance'),
(22, 6, -243492, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243500, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Veiled Riftblade - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243500, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Target is Alliance'),
(22, 6, -243500, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Volunteer Guard Day Event is Active');
-- NPC Veiled Riftblade (132659)
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (132659,-243490,-243494) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13265900,13265901) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132659, 0, 0, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Bow - Run Actionlist'),
(132659, 0, 1, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Chicken - Run Actionlist'),
(132659, 0, 2, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Kiss - Run Actionlist'),
(132659, 0, 3, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Rude - Run Actionlist'),
(132659, 0, 4, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Salute - Run Actionlist'),
(132659, 0, 5, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Shy - Run Actionlist'),
(132659, 0, 6, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Wave - Run Actionlist'),
(132659, 0, 7, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(-243490, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13265900, 13265901, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Update - Run Random Actionlist'),
(-243490, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Bow - Run Actionlist'),
(-243490, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Chicken - Run Actionlist'),
(-243490, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Kiss - Run Actionlist'),
(-243490, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Rude - Run Actionlist'),
(-243490, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Salute - Run Actionlist'),
(-243490, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Shy - Run Actionlist'),
(-243490, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Received Emote Wave - Run Actionlist'),
(-243490, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(-243494, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Update - Set Emote State'),
(-243494, 0, 1, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - On Range - Cast Cleave'),
(13265900, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 10, 1, 113, 29, 574, 71, 400, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - Play Random Emote'),
(13265901, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 10, 1, 5, 6, 29, 604, 661, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Veiled Riftblade - Play Random Emote');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (132659,-243490) AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 5, 132659, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Veiled Riftblade - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 5, 132659, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Target is Alliance'),
(22, 5, 132659, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243490, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Veiled Riftblade - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243490, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Target is Alliance'),
(22, 6, -243490, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Veiled Riftblade - Run Script if Volunteer Guard Day Event is Active');
-- =================================
-- Lightforged Draenei Starting Zone
-- =================================
-- Misc: Graveyard Zone Calibration
DELETE FROM `world_safe_locs` WHERE `ID`=6430;
INSERT INTO `world_safe_locs` (`ID`, `MapID`, `LocX`, `LocY`, `LocZ`, `Facing`, `TransportSpawnId`, `Comment`) VALUES
(6430, 1860, 452.174, 1456.320, 740.973, 2.331, NULL, 'The Vindicaar (Lightforged Draenei Starting Zone)');
DELETE FROM `graveyard_zone` WHERE `GhostZone`=9359;
INSERT INTO `graveyard_zone` (`ID`, `GhostZone`, `Comment`) VALUES
(6430, 9359, 'The Vindicaar (Lightforged Draenei Starting Zone)');
-- NPC Spirit Healer (6491)
DELETE FROM `creature` WHERE `guid`=11650;
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `phaseUseFlags`, `PhaseId`, `PhaseGroup`, `terrainSwapMap`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curHealthPct`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES
(11650, 6491, 1860, 9359, 9359, '0', 0, 0, 0, -1, 0, 0, 446.326, 1461.27, 741.891, 5.46656, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
-- NPC Lightforged Protector (132262)
DELETE FROM `smart_scripts` WHERE `entryorguid`=132262 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132262, 0, 0, 0, '', 60, 0, 100, 0, 1000, 1000, 300000, 300000, 0, '', 11, 79968, 1, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Protector - On Update - Cast Blessing of Kings'),
(132262, 0, 1, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Protector - On Received Emote Salute - Run Actionlist');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=132262 AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 2, 132262, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Protector - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 2, 132262, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Protector - Run Script if Target is Alliance'),
(22, 2, 132262, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Protector - Run Script if Volunteer Guard Day Event is Active');
-- NPC Lightforged Protector (132266)
DELETE FROM `smart_scripts` WHERE `entryorguid`=132266 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132266, 0, 0, 0, '', 60, 0, 100, 0, 1000, 1000, 300000, 300000, 0, '', 11, 79968, 1, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Protector - On Update - Cast Blessing of Kings'),
(132266, 0, 1, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Protector - On Received Emote Salute - Run Actionlist');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=132266 AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 2, 132266, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Protector - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 2, 132266, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Protector - Run Script if Target is Alliance'),
(22, 2, 132266, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Protector - Run Script if Volunteer Guard Day Event is Active');
-- NPC Lightforged Vindicator (132215)
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (132215,-243581,-243592,-243607,-243615,-243573,-243577) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13221500,13221501) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132215, 0, 0, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Bow - Run Actionlist'),
(132215, 0, 1, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Chicken - Run Actionlist'),
(132215, 0, 2, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Kiss - Run Actionlist'),
(132215, 0, 3, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Rude - Run Actionlist'),
(132215, 0, 4, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Salute - Run Actionlist'),
(132215, 0, 5, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Shy - Run Actionlist'),
(132215, 0, 6, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Wave - Run Actionlist'),
(132215, 0, 7, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Range - Cast Cleave'),
(-243581, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13221500, 13221501, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243581, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Bow - Run Actionlist'),
(-243581, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Chicken - Run Actionlist'),
(-243581, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Kiss - Run Actionlist'),
(-243581, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Rude - Run Actionlist'),
(-243581, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Salute - Run Actionlist'),
(-243581, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Shy - Run Actionlist'),
(-243581, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Wave - Run Actionlist'),
(-243581, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicatore - On Range - Cast Cleave'),
(-243592, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13221500, 13221501, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243592, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Bow - Run Actionlist'),
(-243592, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Chicken - Run Actionlist'),
(-243592, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Kiss - Run Actionlist'),
(-243592, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Rude - Run Actionlist'),
(-243592, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Salute - Run Actionlist'),
(-243592, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Shy - Run Actionlist'),
(-243592, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Wave - Run Actionlist'),
(-243592, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicatore - On Range - Cast Cleave'),
(-243607, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13221500, 13221501, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243607, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Bow - Run Actionlist'),
(-243607, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Chicken - Run Actionlist'),
(-243607, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Kiss - Run Actionlist'),
(-243607, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Rude - Run Actionlist'),
(-243607, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Salute - Run Actionlist'),
(-243607, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Shy - Run Actionlist'),
(-243607, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Wave - Run Actionlist'),
(-243607, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicatore - On Range - Cast Cleave'),
(-243615, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 10000, 15000, 0, '', 88, 13221500, 13221501, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243615, 0, 1, 0, '', 22, 0, 100, 512, 17, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Bow - Run Actionlist'),
(-243615, 0, 2, 0, '', 22, 0, 100, 512, 22, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Chicken - Run Actionlist'),
(-243615, 0, 3, 0, '', 22, 0, 100, 512, 58, 6000, 6000, 0, 0, '', 80, 329604, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Kiss - Run Actionlist'),
(-243615, 0, 4, 0, '', 22, 0, 100, 512, 77, 6000, 6000, 0, 0, '', 80, 329605, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Rude - Run Actionlist'),
(-243615, 0, 5, 0, '', 22, 0, 100, 512, 78, 6000, 6000, 0, 0, '', 80, 329609, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Salute - Run Actionlist'),
(-243615, 0, 6, 0, '', 22, 0, 100, 512, 84, 6000, 6000, 0, 0, '', 80, 329607, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Shy - Run Actionlist'),
(-243615, 0, 7, 0, '', 22, 0, 100, 512, 101, 6000, 6000, 0, 0, '', 80, 329608, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Received Emote Wave - Run Actionlist'),
(-243615, 0, 8, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicatore - On Range - Cast Cleave'),
(-243573, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Set Emote State'),
(-243573, 0, 1, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Range - Cast Cleave'),
(-243577, 0, 0, 0, '', 25, 0, 100, 1, 0, 0, 0, 0, 0, '', 17, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Set Emote State'),
(-243577, 0, 1, 0, '', 9, 0, 100, 0, 0, 5, 12000, 12500, 0, '', 11, 15284, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - On Range - Cast Cleave'),
(13221500, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 10, 1, 113, 29, 574, 71, 400, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - Play Random Emote'),
(13221501, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 10, 1, 5, 6, 29, 604, 661, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Vindicator - Play Random Emote');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (132215,-243581,-243592,-243607,-243615) AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 5, 132215, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Vindicator - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 5, 132215, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Target is Alliance'),
(22, 5, 132215, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243581, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Vindicator - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243581, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Target is Alliance'),
(22, 6, -243581, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243592, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Vindicator - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243592, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Target is Alliance'),
(22, 6, -243592, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243607, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Vindicator - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243607, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Target is Alliance'),
(22, 6, -243607, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Volunteer Guard Day Event is Active'),
(22, 6, -243615, 0, 0, 1, 0, 231193, 0, 0, 1, 0, '', 'Lightforged Vindicator - Run Script if Target Not Have Aura Volunteer City Guard'),
(22, 6, -243615, 0, 0, 6, 0, 469, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Target is Alliance'),
(22, 6, -243615, 0, 0, 12, 0, 74, 0, 0, 0, 0, '', 'Lightforged Vindicator - Run Script if Volunteer Guard Day Event is Active');
@@ -0,0 +1,610 @@
DELETE FROM `creature_equip_template` WHERE (`ID`=2 AND `CreatureID`=262680) OR (`ID`=1 AND `CreatureID` IN (262680,263309,263333,272277,272109,270762,266930,262880,264871,264690,262940,267063,262798,262879,261401,265066,264392,262765,272056,263534,263759,261380,261382,271016,271014,261395,261400,261381,261403,261386,267027,264964,271885,267031,261392,264228,263748,261404));
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `AppearanceModID1`, `ItemVisual1`, `ItemID2`, `AppearanceModID2`, `ItemVisual2`, `ItemID3`, `AppearanceModID3`, `ItemVisual3`, `VerifiedBuild`) VALUES
(262680, 2, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Zul'jarra's Spirit Scout
(262680, 1, 235241, 0, 0, 235245, 0, 0, 0, 0, 0, 69587), -- Zul'jarra's Spirit Scout
(263309, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Er'inye
(263333, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Er'inye
(272277, 1, 235232, 0, 0, 235231, 0, 0, 212399, 0, 0, 69587), -- Amani Guard
(272109, 1, 1906, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Hawkeye Socho
(270762, 1, 235232, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Eagletender Mal'Tiki
(266930, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Witherbark Scout
(262880, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Er'inye
(264871, 1, 235242, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Spirit Scout Mok'jib
(264690, 1, 235242, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Zul'jarra's Spirit Scout
(262940, 1, 0, 0, 0, 224874, 0, 0, 0, 0, 0, 69587), -- Xa'lake
(267063, 1, 235237, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Revantusk Warrior
(262798, 1, 235234, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Warleader Abdumati
(262879, 1, 235232, 0, 0, 235231, 0, 0, 212399, 0, 0, 69587), -- Amani Guard
(261401, 1, 279785, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Slithering Coilguard
(265066, 1, 255633, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Venomborn Twin
(264392, 1, 235237, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Shadowblade of Nek'zali
(262765, 1, 235237, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Nek'zali's Ensnared
(272056, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Er'inye
(263534, 1, 235235, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Restless Warrior
(263759, 1, 0, 0, 0, 264197, 0, 0, 0, 0, 0, 69587), -- Shield of the Second
(261380, 1, 279701, 0, 0, 279695, 0, 0, 0, 0, 0, 69587), -- Venombound Stalker
(261382, 1, 0, 0, 0, 0, 0, 0, 279683, 0, 0, 69587), -- Venombound Slayer
(271016, 1, 0, 0, 0, 0, 0, 0, 235240, 0, 0, 69587), -- Med'jai Hunter Spirit
(271014, 1, 265882, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Med'jai Warrior Spirit
(261395, 1, 235241, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Soulcoiler Seeker
(261400, 1, 279695, 0, 0, 279695, 0, 0, 0, 0, 0, 69587), -- Slithering Stalker
(261381, 1, 279755, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Venombound Coilguard
(261403, 1, 279767, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Slithering Serpent-Seer
(261386, 1, 279773, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Venombound Serpent-Seer
(267027, 1, 235233, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Shadowpine Flametender
(264964, 1, 235233, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Shadowpine Flamespeaker
(271885, 1, 235241, 0, 0, 235245, 0, 0, 0, 0, 0, 69587), -- Mok'sa the Stone
(267031, 1, 275852, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Amani Berserker
(261392, 1, 235241, 0, 0, 235245, 0, 0, 0, 0, 0, 69587), -- Soulcoiler Supplicant
(264228, 1, 235232, 0, 0, 235231, 0, 0, 212399, 0, 0, 69587), -- Amani Guard
(263748, 1, 235237, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Nek'zali's Ensnared
(261404, 1, 235235, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Risen Sycophant
DELETE FROM `areatrigger_template` WHERE (`IsCustom`=0 AND `Id` IN (42937,43009,44260,44128,44199,43497,42914));
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES
(42937, 0, 69587),
(43009, 0, 69587),
(44260, 0, 69587),
(44128, 0, 69587),
(44199, 0, 69587),
(43497, 0, 69587),
(42914, 0, 69587);
DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (42869,43600,43453,43532,42003));
INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `Roll`, `Pitch`, `Yaw`, `TargetRoll`, `TargetPitch`, `TargetYaw`, `VerifiedBuild`) VALUES
(42869, 0, 42937, 0, 0, 0, 103352, 0, 0, -1, 0, 22, NULL, 7000, 20, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587), -- Spell: 1294652 (Vile Drip)
(43600, 0, 44260, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 60000, 20, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587), -- Spell: 1302796 (Putrid Traps)
(43453, 0, 44128, 0, 0, 0, 105003, 0, 0, -1, 0, 935, NULL, 22500, 20, 0, 5.40000009536743164, 5.40000009536743164, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587), -- Spell: 1298610 (Forked Breath)
(43532, 0, 44199, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 6000, 20, 0, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587), -- Spell: 1298590 (Toxic Gust)
(42003, 0, 42914, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 8000, 20, 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 69587); -- Spell: 1287249 (Whirlpool)
DELETE FROM `gameobject_template_addon` WHERE `entry` IN (642089 /*Cache of Three*/, 668601 /*Funerary Inscription*/, 668596 /*Funerary Inscription*/, 645580 /*Congealed Bile*/, 645579 /*Congealed Bile*/, 649640 /*Soulcoiler's Cache*/, 649687 /*Soulcoiler's Trove*/, 668597 /*Funerary Inscription*/, 642691 /*Plaque*/, 668589 /*Funerary Inscription*/, 641800 /*Ancient Acolyte Scroll*/, 641565 /*Faintly Glowing Gem*/, 675629 /*Broken Urn*/, 649221 /*Burrow Exit*/, 652569 /*Forgotten Alchemy*/, 649218 /*Burrow Exit*/, 642727 /*Ooze*/, 668598 /*Funerary Inscription*/, 671517 /*[DNT] Bird Nest*/, 653846 /*Spiritwing Feather*/, 671498 /*Venom-Worn Coffer*/, 668590 /*Funerary Inscription*/, 625899 /*Barricade*/, 668593 /*Funerary Inscription*/, 652562 /*Bottled Spirits*/, 652705 /*Soulguide Charm*/, 652399 /*Venomous Salve*/, 649199 /*Burrow Exit*/, 642983 /*Door*/, 642984 /*Door*/, 642985 /*Vault Door*/, 673055 /*[DNT] Amani Barricade*/, 674736 /*Vault Door*/, 649212 /*Rock Wall*/, 650883 /*[DNT] Amani Banner*/, 656039 /*Venom-Clotted Bauble*/, 654991 /*Cracked Canopic Jar*/, 656001 /*Cursed Refulgent Copper*/, 625510 /*Quivering Egg*/, 670350 /*Cursed Oddity*/, 666685 /*Crypt Door*/, 670637 /*Door*/, 674735 /*Vault Door*/, 656044 /*Singing Shell*/, 674734 /*Vault Door*/);
INSERT INTO `gameobject_template_addon` (`entry`, `faction`, `flags`, `WorldEffectID`, `AIAnimKitID`) VALUES
(642089, 0, 0x10, 32679, 0), -- Cache of Three
(668601, 0, 0x40000, 0, 0), -- Funerary Inscription
(668596, 0, 0x40000, 0, 0), -- Funerary Inscription
(645580, 0, 0x44000, 0, 0), -- Congealed Bile
(645579, 0, 0x44000, 0, 0), -- Congealed Bile
(649640, 0, 0x44000, 30048, 0), -- Soulcoiler's Cache
(649687, 0, 0x44000, 30048, 0), -- Soulcoiler's Trove
(668597, 0, 0x40000, 0, 0), -- Funerary Inscription
(642691, 0, 0x40000, 0, 0), -- Plaque
(668589, 0, 0x40000, 0, 0), -- Funerary Inscription
(641800, 0, 0x0, 32662, 0), -- Ancient Acolyte Scroll
(641565, 0, 0x4, 0, 0), -- Faintly Glowing Gem
(675629, 0, 0x204004, 0, 0), -- Broken Urn
(649221, 0, 0x0, 2100, 0), -- Burrow Exit
(652569, 0, 0x40001, 2100, 0), -- Forgotten Alchemy
(649218, 0, 0x0, 2100, 0), -- Burrow Exit
(642727, 0, 0x10, 0, 0), -- Ooze
(668598, 0, 0x40000, 0, 0), -- Funerary Inscription
(671517, 0, 0x2000, 0, 0), -- [DNT] Bird Nest
(653846, 0, 0x20840000, 33480, 0), -- Spiritwing Feather
(671498, 0, 0x20A04002, 0, 20434), -- Venom-Worn Coffer
(668590, 0, 0x40000, 0, 0), -- Funerary Inscription
(625899, 0, 0x10, 0, 0), -- Barricade
(668593, 0, 0x40000, 0, 0), -- Funerary Inscription
(652562, 2028, 0x11808000, 2100, 0), -- Bottled Spirits
(652705, 2028, 0x11808000, 2100, 0), -- Soulguide Charm
(652399, 2028, 0x11808000, 2100, 0), -- Venomous Salve
(649199, 0, 0x0, 2100, 0), -- Burrow Exit
(642983, 0, 0x30, 0, 0), -- Door
(642984, 0, 0x30, 0, 0), -- Door
(642985, 0, 0x30, 0, 0), -- Vault Door
(673055, 0, 0x2000, 0, 0), -- [DNT] Amani Barricade
(674736, 0, 0x20, 0, 0), -- Vault Door
(649212, 0, 0x10, 0, 0), -- Rock Wall
(650883, 0, 0x2000, 0, 0), -- [DNT] Amani Banner
(656039, 0, 0x44000, 0, 0), -- Venom-Clotted Bauble
(654991, 0, 0x244000, 0, 0), -- Cracked Canopic Jar
(656001, 94, 0x44000, 0, 0), -- Cursed Refulgent Copper
(625510, 0, 0x4, 0, 0), -- Quivering Egg
(670350, 0, 0x0, 34134, 0), -- Cursed Oddity
(666685, 0, 0x20, 0, 0), -- Crypt Door
(670637, 0, 0x30, 0, 0), -- Door
(674735, 0, 0x20, 0, 0), -- Vault Door
(656044, 0, 0x44000, 0, 0), -- Singing Shell
(674734, 0, 0x20, 0, 0); -- Vault Door
DELETE FROM `quest_offer_reward` WHERE `ID` IN (98428 /*Vaults of Atal'Utek: The Altar of Corrosion*/, 97640 /*Vaults of Atal'Utek: One Coin Too Many*/, 98388 /*Into the Vaults of Atal'Utek*/);
INSERT INTO `quest_offer_reward` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `RewardText`, `VerifiedBuild`) VALUES
(98428, 1, 0, 0, 0, 0, 0, 0, 0, 'How does it feel? Unearthly? Decadent?\n\nI would give up much to be able to taste it again for the first time.', 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(97640, 1, 0, 0, 0, 0, 0, 0, 0, 'When de corrosive coins start to weigh you down, come to me.', 69587), -- Vaults of Atal'Utek: One Coin Too Many
(98388, 1, 0, 0, 0, 0, 0, 0, 0, 'Well... two outta three ain\'t bad, not for here.\n\nYou\'re lookin\' a bit green, though. Sure dat venom didn\'t get to ya?', 69587); -- Into the Vaults of Atal'Utek
DELETE FROM `quest_poi` WHERE (`QuestID`=95520 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=95520 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96642 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=96642 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96642 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=96643 AND `BlobIndex`=0 AND `Idx1`=5) OR (`QuestID`=96643 AND `BlobIndex`=3 AND `Idx1`=4) OR (`QuestID`=96643 AND `BlobIndex`=2 AND `Idx1`=3) OR (`QuestID`=96643 AND `BlobIndex`=1 AND `Idx1`=2) OR (`QuestID`=96643 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=96643 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=98428 AND `BlobIndex`=0 AND `Idx1`=3) OR (`QuestID`=98428 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=98428 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=98428 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=98515 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=98515 AND `BlobIndex`=0 AND `Idx1`=0) OR (`QuestID`=97640 AND `BlobIndex`=0 AND `Idx1`=2) OR (`QuestID`=97640 AND `BlobIndex`=0 AND `Idx1`=1) OR (`QuestID`=97640 AND `BlobIndex`=0 AND `Idx1`=0);
INSERT INTO `quest_poi` (`QuestID`, `BlobIndex`, `Idx1`, `ObjectiveIndex`, `QuestObjectiveID`, `QuestObjectID`, `MapID`, `UiMapID`, `Priority`, `Flags`, `WorldEffectID`, `PlayerConditionID`, `NavigationPlayerConditionID`, `SpawnTrackingID`, `AlwaysAllowMergingBlobs`, `VerifiedBuild`) VALUES
(95520, 0, 1, 32, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229143, 0, 69587), -- Purging the Vaults
(95520, 0, 0, -1, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229143, 0, 69587), -- Purging the Vaults
(96642, 0, 2, 32, 0, 0, 2916, 2509, 0, 2, 0, 0, 0, 0, 0, 69587), -- Decisive Incursions
(96642, 0, 1, 0, 473822, 261537, 2916, 2509, 0, 4098, 0, 0, 0, 0, 0, 69587), -- Decisive Incursions
(96642, 0, 0, -1, 0, 0, 2916, 2509, 0, 2, 0, 0, 0, 0, 0, 69587), -- Decisive Incursions
(96643, 0, 5, 32, 0, 0, 2916, 2509, 0, 2, 0, 0, 0, 0, 0, 69587), -- From Whence it Came
(96643, 3, 4, 0, 473823, 6440, 2916, 2509, 0, 2, 0, 160025, 0, 0, 0, 69587), -- From Whence it Came
(96643, 2, 3, 0, 473823, 6440, 2916, 2509, 0, 2, 0, 160026, 0, 0, 0, 69587), -- From Whence it Came
(96643, 1, 2, 0, 473823, 6440, 2916, 2509, 0, 4098, 0, 0, 0, 0, 0, 69587), -- From Whence it Came
(96643, 0, 1, 0, 473823, 6440, 2916, 2509, 0, 2, 0, 160024, 0, 0, 0, 69587), -- From Whence it Came
(96643, 0, 0, -1, 0, 0, 2916, 2509, 0, 2, 0, 0, 0, 0, 0, 69587), -- From Whence it Came
(98428, 0, 3, 32, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229827, 0, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98428, 0, 2, 1, 477637, 269630, 2916, 2509, 0, 0, 0, 0, 0, 3231004, 0, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98428, 0, 1, 0, 477631, 272185, 2916, 2509, 0, 0, 0, 0, 0, 3229827, 0, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98428, 0, 0, -1, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229827, 0, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98515, 0, 1, 32, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229143, 0, 69587), -- Vaults of Atal'Utek: A Toxic Tour
(98515, 0, 0, -1, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229143, 0, 69587), -- Vaults of Atal'Utek: A Toxic Tour
(97640, 0, 2, 32, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229143, 0, 69587), -- Vaults of Atal'Utek: One Coin Too Many
(97640, 0, 1, 0, 476248, 269617, 2916, 2509, 0, 0, 0, 0, 0, 3229827, 0, 69587), -- Vaults of Atal'Utek: One Coin Too Many
(97640, 0, 0, -1, 0, 0, 2916, 2509, 0, 0, 0, 0, 0, 3229827, 0, 69587); -- Vaults of Atal'Utek: One Coin Too Many
DELETE FROM `quest_poi_points` WHERE (`QuestID`=95520 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=95520 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96642 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=96642 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96642 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=96643 AND `Idx1`=5 AND `Idx2`=0) OR (`QuestID`=96643 AND `Idx1`=4 AND `Idx2`=0) OR (`QuestID`=96643 AND `Idx1`=3 AND `Idx2`=0) OR (`QuestID`=96643 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=96643 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=96643 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=98428 AND `Idx1`=3 AND `Idx2`=0) OR (`QuestID`=98428 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=98428 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=98428 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=98515 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=98515 AND `Idx1`=0 AND `Idx2`=0) OR (`QuestID`=97640 AND `Idx1`=2 AND `Idx2`=0) OR (`QuestID`=97640 AND `Idx1`=1 AND `Idx2`=0) OR (`QuestID`=97640 AND `Idx1`=0 AND `Idx2`=0);
INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(95520, 1, 0, 5057, -10400, 1, 69587), -- Purging the Vaults
(95520, 0, 0, 5057, -10400, 1, 69587), -- Purging the Vaults
(96642, 2, 0, 4967, -10399, -1, 69587), -- Decisive Incursions
(96642, 1, 0, 5463, -10406, -60, 69587), -- Decisive Incursions
(96642, 0, 0, 5057, -10400, 1, 69587), -- Decisive Incursions
(96643, 5, 0, 5016, -10513, 6, 69587), -- From Whence it Came
(96643, 4, 0, 5784, -10519, -99, 69587), -- From Whence it Came
(96643, 3, 0, 5603, -10414, -96, 69587), -- From Whence it Came
(96643, 2, 0, 5463, -10406, -60, 69587), -- From Whence it Came
(96643, 1, 0, 5813, -10289, -103, 69587), -- From Whence it Came
(96643, 0, 0, 5016, -10513, 6, 69587), -- From Whence it Came
(98428, 3, 0, 5016, -10513, 6, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98428, 2, 0, 5020, -10517, 6, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98428, 1, 0, 5016, -10513, 6, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98428, 0, 0, 5016, -10513, 6, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98515, 1, 0, 5057, -10400, 1, 69587), -- Vaults of Atal'Utek: A Toxic Tour
(98515, 0, 0, 5057, -10400, 1, 69587), -- Vaults of Atal'Utek: A Toxic Tour
(97640, 2, 0, 5055, -10400, 1, 69587), -- Vaults of Atal'Utek: One Coin Too Many
(97640, 1, 0, 5016, -10513, 6, 69587), -- Vaults of Atal'Utek: One Coin Too Many
(97640, 0, 0, 5016, -10513, 6, 69587); -- Vaults of Atal'Utek: One Coin Too Many
DELETE FROM `quest_details` WHERE `ID` IN (95520 /*Purging the Vaults*/, 96642 /*Decisive Incursions*/, 96643 /*From Whence it Came*/, 98428 /*Vaults of Atal'Utek: The Altar of Corrosion*/, 98515 /*Vaults of Atal'Utek: A Toxic Tour*/, 97640 /*Vaults of Atal'Utek: One Coin Too Many*/);
INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES
(95520, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Purging the Vaults
(96642, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Decisive Incursions
(96643, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- From Whence it Came
(98428, 378, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion
(98515, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vaults of Atal'Utek: A Toxic Tour
(97640, 5, 0, 0, 0, 0, 0, 0, 0, 69587); -- Vaults of Atal'Utek: One Coin Too Many
DELETE FROM `quest_request_items` WHERE `ID`=98388;
INSERT INTO `quest_request_items` (`ID`, `EmoteOnComplete`, `EmoteOnIncomplete`, `EmoteOnCompleteDelay`, `EmoteOnIncompleteDelay`, `CompletionText`, `VerifiedBuild`) VALUES
(98388, 1, 0, 0, 0, 'Don\'t make me send someone out to rescue you. I don\'t have de fighters for dat.', 0); -- Into the Vaults of Atal'Utek
DELETE FROM `ui_map_quest_line` WHERE (`UIMapId`=2509 AND `QuestLineId` IN (6232,6230,6227,6031,6352)) OR (`UIMapId`=2512 AND `QuestLineId` IN (6352,6329,6302,6277,6276,6274,6271,6264,6232,6231,6230,6229,6227,6224,6128,6123,6118,6115,6114,6090,6089,6087,6086,6055,6050,6045,6031,5999,5988,5981,5979,5975,5971,5939,5938,5905,5901,5778,5724,5723,5722));
INSERT INTO `ui_map_quest_line` (`UIMapId`, `QuestLineId`, `VerifiedBuild`) VALUES
(2509, 6232, 69587),
(2509, 6230, 69587),
(2509, 6227, 69587),
(2509, 6031, 69587),
(2509, 6352, 69587),
(2512, 6352, 69587),
(2512, 6329, 69587),
(2512, 6302, 69587),
(2512, 6277, 69587),
(2512, 6276, 69587),
(2512, 6274, 69587),
(2512, 6271, 69587),
(2512, 6264, 69587),
(2512, 6232, 69587),
(2512, 6231, 69587),
(2512, 6230, 69587),
(2512, 6229, 69587),
(2512, 6227, 69587),
(2512, 6224, 69587),
(2512, 6128, 69587),
(2512, 6123, 69587),
(2512, 6118, 69587),
(2512, 6115, 69587),
(2512, 6114, 69587),
(2512, 6090, 69587),
(2512, 6089, 69587),
(2512, 6087, 69587),
(2512, 6086, 69587),
(2512, 6055, 69587),
(2512, 6050, 69587),
(2512, 6045, 69587),
(2512, 6031, 69587),
(2512, 5999, 69587),
(2512, 5988, 69587),
(2512, 5981, 69587),
(2512, 5979, 69587),
(2512, 5975, 69587),
(2512, 5971, 69587),
(2512, 5939, 69587),
(2512, 5938, 69587),
(2512, 5905, 69587),
(2512, 5901, 69587),
(2512, 5778, 69587),
(2512, 5724, 69587),
(2512, 5723, 69587),
(2512, 5722, 69587);
DELETE FROM `ui_map_quest` WHERE (`UIMapId`=2512 AND `QuestId` IN (96004,93440,93051,93050,93049,93048,93047,91930)) OR (`UIMapId`=2437 AND `QuestId` IN (96004,92138));
INSERT INTO `ui_map_quest` (`UIMapId`, `QuestId`, `VerifiedBuild`) VALUES
(2512, 96004, 69587), -- Prey: A Slithering Threat
(2512, 93440, 69587), -- Personal History
(2512, 93051, 69587), -- The Final Exam
(2512, 93050, 69587), -- Altar History
(2512, 93049, 69587), -- Homework Support
(2512, 93048, 69587), -- Got No Rhythm
(2512, 93047, 69587), -- Butchery Basics
(2512, 91930, 69587), -- The Abundant Lands
(2437, 96004, 69587), -- Prey: A Slithering Threat
(2437, 92138, 69587); -- Mobilize! Enlist! Recruit!
DELETE FROM `creature_queststarter` WHERE (`id`=262798 AND `quest` IN (95520,98515,97640)) OR (`id`=272109 AND `quest`=96642) OR (`id`=262880 AND `quest` IN (96643,98428));
INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES
(262798, 95520, 69587), -- Purging the Vaults offered by Warleader Abdumati
(272109, 96642, 69587), -- Decisive Incursions offered by Hawkeye Socho
(262880, 96643, 69587), -- From Whence it Came offered by Er'inye
(262880, 98428, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion offered by Er'inye
(262798, 98515, 69587), -- Vaults of Atal'Utek: A Toxic Tour offered by Warleader Abdumati
(262798, 97640, 69587); -- Vaults of Atal'Utek: One Coin Too Many offered by Warleader Abdumati
DELETE FROM `creature_questender` WHERE (`id`=262880 AND `quest` IN (98428,97640)) OR (`id`=262798 AND `quest`=98388);
INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
(262880, 98428, 69587), -- Vaults of Atal'Utek: The Altar of Corrosion ended by Er'inye
(262880, 97640, 69587), -- Vaults of Atal'Utek: One Coin Too Many ended by Er'inye
(262798, 98388, 69587); -- Into the Vaults of Atal'Utek ended by Warleader Abdumati
DELETE FROM `world_quest_template` WHERE `QuestID` IN (75990 /*Star-Crossed Lovers*/, 54831 /*Glimmerspine*/, 73221 /*A Clear State of Mind*/, 77756 /*Flight of the Dragons*/, 56795 /*Work Order: Abyssal-Fried Rissole*/, 92086 /*A Taste of Accord*/, 54698 /*Shattering Spears*/, 96642 /*Decisive Incursions*/, 51027 /*Supplies Needed: Sea Stalk*/, 80323 /*Foggy Faceoff*/, 75346 /*Data Gathering*/, 51548 /*Nagative Feedback*/, 54820 /*Zim'kaga*/, 52047 /*Against the Storm*/, 75200 /*Deepflayer Slayer*/, 51450 /*Azerite Mining*/, 60623 /*AHHH! Real Monsters!*/, 59808 /*Muck It Up*/, 48285 /*Aerial Superiority*/, 51884 /*Haywire Golem*/, 61352 /*All Will Be Consumed*/, 96643 /*From Whence it Came*/, 50875 /*Darkspeaker Jo'la*/, 51895 /*Maison the Portable*/, 52299 /*Whiplash*/, 55830 /*Bounty: More Coral Ancients*/, 49047 /*Bucky*/, 55898 /*Tempest-Speaker Shalan'ali*/, 51890 /*Ranja the Last Chillpaw*/, 57429 /*Pyre of the Amalgamated One*/, 52471 /*That's a Big Carcass*/, 55821 /*Bounty: A Few Coral Ancients*/, 57445 /*Chin's Noodle Cart*/, 50507 /*Krubbs*/, 51453 /*Shrine of the Storm: Behold, Pure Water*/, 51919 /*Emily Mayville*/, 91970 /*WANTED: Gelatonius*/, 80208 /*Digging into Trouble*/, 91980 /*WANTED: Hellebora's Thorn*/, 58757 /*Testing the Untested*/, 92010 /*WANTED: Slewstalk's Stalks*/, 50503 /*Juba the Scarred*/, 52972 /*Favored Grandchild*/, 52328 /*Ice Sickle*/, 45924 /*Abyssal Monstrosity*/, 45925 /*Nez'val*/, 46265 /*The Fel and the Fawns*/, 46766 /*Ulgthax*/);
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
(75990, 86400, 23886, 1), -- Star-Crossed Lovers
(54831, 86400, 17026, 1), -- Glimmerspine
(73221, 259200, 23581, 1), -- A Clear State of Mind
(77756, 259200, 24724, 1), -- Flight of the Dragons
(56795, 86400, 17978, 3), -- Work Order: Abyssal-Fried Rissole
(92086, 302400, 29162, 1), -- A Taste of Accord
(54698, 86400, 17076, 1), -- Shattering Spears
(96642, 86400, 31555, 1), -- Decisive Incursions
(51027, 86400, 16091, 6), -- Supplies Needed: Sea Stalk
(80323, 86400, 25917, 1), -- Foggy Faceoff
(75346, 259200, 23580, 1), -- Data Gathering
(51548, 86400, 15605, 1), -- Nagative Feedback
(54820, 86400, 17014, 1), -- Zim'kaga
(52047, 86400, 15609, 3), -- Against the Storm
(75200, 259200, 23369, 1), -- Deepflayer Slayer
(51450, 86400, 15753, 1), -- Azerite Mining
(60623, 86400, 19408, 1), -- AHHH! Real Monsters!
(59808, 86400, 19104, 1), -- Muck It Up
(48285, 86400, 13621, 4), -- Aerial Superiority
(51884, 86400, 15556, 1), -- Haywire Golem
(61352, 86400, 19744, 1), -- All Will Be Consumed
(96643, 86400, 31556, 1), -- From Whence it Came
(50875, 86400, 14963, 1), -- Darkspeaker Jo'la
(51895, 86400, 15568, 1), -- Maison the Portable
(52299, 86400, 15507, 2), -- Whiplash
(55830, 86400, 17525, 1), -- Bounty: More Coral Ancients
(49047, 86400, 14313, 1), -- Bucky
(55898, 86400, 17581, 1), -- Tempest-Speaker Shalan'ali
(51890, 86400, 15563, 1), -- Ranja the Last Chillpaw
(57429, 86400, 18478, 1), -- Pyre of the Amalgamated One
(52471, 86400, 15767, 1), -- That's a Big Carcass
(55821, 86400, 17516, 1), -- Bounty: A Few Coral Ancients
(57445, 86400, 18511, 1), -- Chin's Noodle Cart
(50507, 86400, 14802, 1), -- Krubbs
(51453, 345600, 15234, 1), -- Shrine of the Storm: Behold, Pure Water
(51919, 86400, 15579, 1), -- Emily Mayville
(91970, 86400, 29476, 1), -- WANTED: Gelatonius
(80208, 86400, 25839, 1), -- Digging into Trouble
(91980, 86400, 29476, 1), -- WANTED: Hellebora's Thorn
(58757, 86400, 18541, 2), -- Testing the Untested
(92010, 86400, 29476, 1), -- WANTED: Slewstalk's Stalks
(50503, 86400, 14799, 1), -- Juba the Scarred
(52972, 86400, 16010, 1), -- Favored Grandchild
(52328, 86400, 15748, 1), -- Ice Sickle
(45924, 21600, 13016, 1), -- Abyssal Monstrosity
(45925, 21600, 13017, 1), -- Nez'val
(46265, 21600, 13004, 1), -- The Fel and the Fawns
(46766, 21600, 13319, 1); -- Ulgthax
UPDATE `world_quest_template` SET `VariableID`=14062 WHERE `QuestID`=49091; -- Invasion Point: Val
DELETE FROM `spawn_tracking_template` WHERE `SpawnTrackingId` IN (3229827 /*Map: 2916 (Vaults of Atal'Utek) - Phase: 0*/, 3231004 /*Map: 2916 (Vaults of Atal'Utek) - Phase: 0*/);
INSERT INTO `spawn_tracking_template` (`SpawnTrackingId`, `MapId`, `PhaseId`, `PhaseGroup`, `PhaseUseFlags`, `VerifiedBuild`) VALUES
(3229827, 2916, 0, 0, 0, 69587), -- Map: 2916 (Vaults of Atal'Utek) - Phase: 0
(3231004, 2916, 0, 0, 0, 69587); -- Map: 2916 (Vaults of Atal'Utek) - Phase: 0
DELETE FROM `spawn_tracking_quest_objective` WHERE (`SpawnTrackingId`=3231004 AND `QuestObjectiveId`=477637) OR (`SpawnTrackingId`=3229827 AND `QuestObjectiveId` IN (477631,476248));
INSERT INTO `spawn_tracking_quest_objective` (`SpawnTrackingId`, `QuestObjectiveId`, `VerifiedBuild`) VALUES
(3231004, 477637, 69587), -- 3231004
(3229827, 477631, 69587), -- 3229827
(3229827, 476248, 69587); -- 3229827
DELETE FROM `creature_template_addon` WHERE `entry` IN (262680 /*262680 (Zul'jarra's Spirit Scout) - Carry Torch*/, 262665 /*262665 (Tol'zenja the Spirit Caller)*/, 263309 /*263309 (Er'inye) - [DNT] Er'inye Spawn Spell, [DNT] Patrol Task Beacon, [DNT] Rune 01, [DNT] Rune 02, [DNT] Rune 03*/, 263333 /*263333 (Er'inye) - [DNT] Patrol Task Beacon*/, 263542 /*263542 ([DNT] Dummy Bunny)*/, 272277 /*272277 (Amani Guard)*/, 270762 /*270762 (Eagletender Mal'Tiki)*/, 267082 /*267082 (Insidious Snake) - Snake Stomp*/, 267063 /*267063 (Revantusk Warrior) - Read Amani Tablet*/, 260930 /*260930 (Tol'zenja the Spirit Caller)*/, 272751 /*272751 (Skull of Er'inye) - Ghostly Object [DNT]*/, 262880 /*262880 (Er'inye)*/, 264690 /*264690 (Zul'jarra's Spirit Scout) - Carry Fish Bowl*/, 262798 /*262798 (Warleader Abdumati)*/, 262879 /*262879 (Amani Guard) - Invisibility and Stealth Detection*/, 261401 /*261401 (Slithering Coilguard) - Conversation Aura: Talk Only [DNT]*/, 269485 /*269485 (Altar of Corrosion)*/, 273269 /*273269 (Spiritwing)*/, 261405 /*261405 (Risen Watcher) - Corrosive*/, 265066 /*265066 (Venomborn Twin)*/, 273338 /*273338 (Commander Gazba) - Corroded Spirit*/, 264392 /*264392 (Shadowblade of Nek'zali) - Fraying*/, 262765 /*262765 (Nek'zali's Ensnared) - Dual Wield, Fraying, Sparring Aura: Attack1H - Faster [DNT]*/, 271957 /*271957 (Commander Gazba) - Corroded Spirit*/, 272056 /*272056 (Er'inye)*/, 263759 /*263759 (Shield of the Second)*/, 264378 /*264378 (Volatile Venom) - Volatile Venom*/, 261381 /*261381 (Venombound Coilguard) - Corrosive*/, 261382 /*261382 (Venombound Slayer)*/, 261380 /*261380 (Venombound Stalker) - Ula'tek's Coating*/, 264230 /*264230 (Venombound Stalker)*/, 264231 /*264231 (Venombound Coilguard)*/, 261378 /*261378 (Gorged Skyfiend)*/, 261396 /*261396 (Prowling Skyfiend)*/, 265368 /*265368 (Poison Wave) - Poison Wave*/, 271016 /*271016 (Med'jai Hunter Spirit) - 12.1 Ula'tek - Warrior - Guardian - Thaze'ala - OnSpawn [DNT]*/, 271014 /*271014 (Med'jai Warrior Spirit) - 12.1 Ula'tek - Warrior - Guardian - Thaze'ala - OnSpawn [DNT]*/, 261395 /*261395 (Soulcoiler Seeker) - Dual Wield*/, 261389 /*261389 (Soulcoiler Hierophant) - Corrosive*/, 268977 /*268977 (Egg of Ula'tek) - Volatile*/, 268969 /*268969 (Egg of Ula'tek) - Volatile*/, 272201 /*272201 (Spiritwing)*/, 262226 /*262226 (Cursed Spawn) - Pet Sit or Sleep*/, 261386 /*261386 (Venombound Serpent-Seer) - [DNT] Small 09 Target, Vile Deluge*/, 261398 /*261398 (Writhing Coiler) - Sleeping*/, 261558 /*261558 ([DNT] Dummy Bunny)*/, 269806 /*269806 (Spiritwing Gust) - [DNT] Vertical Jump Charge Vis*/, 265390 /*265390 (Venomous Eruption) - Venomous Eruption*/, 273305 /*273305 (Slain Warrior)*/, 272025 /*272025 ([DNT] Dummy Bunny) - [DNT] Safe Zone*/, 272197 /*272197 (Amani Windcaller) - [DNT] Amani Windcaller Crouching*/, 257919 /*257919 (Egg of Ula'tek) - Volatile, Volatile*/, 267027 /*267027 (Shadowpine Flametender) - Channel: Fire [DNT]*/, 264964 /*264964 (Shadowpine Flamespeaker) - [DNT] Safe Zone*/, 267180 /*267180 (Writhing Coiler)*/, 267031 /*267031 (Amani Berserker) - 10 Percent Health*/, 264228 /*264228 (Amani Guard) - Invisibility and Stealth Detection*/, 263748 /*263748 (Nek'zali's Ensnared) - Fraying*/, 261404 /*261404 (Risen Sycophant) - Restless Remains*/, 264332 /*264332 (Shrine of the Honored Dead) - [DNT] Shrine Cosmetic*/, 261376 /*261376 (Soulcoiler Revenant) - Conversation Aura: Talk [DNT]*/, 263016 /*263016 (Susarikk)*/);
INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(262680, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '439821'), -- 262680 (Zul'jarra's Spirit Scout) - Carry Torch
(262665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''), -- 262665 (Tol'zenja the Spirit Caller)
(263309, 0, 0, 0, 0, 0, 1, 0, 0, 13804, 0, 0, 0, '1289498 1292084 1289383 1289389 1289391'), -- 263309 (Er'inye) - [DNT] Er'inye Spawn Spell, [DNT] Patrol Task Beacon, [DNT] Rune 01, [DNT] Rune 02, [DNT] Rune 03
(263333, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1292084'), -- 263333 (Er'inye) - [DNT] Patrol Task Beacon
(263542, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 263542 ([DNT] Dummy Bunny)
(272277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''), -- 272277 (Amani Guard)
(270762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''), -- 270762 (Eagletender Mal'Tiki)
(267082, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1305852'), -- 267082 (Insidious Snake) - Snake Stomp
(267063, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1298382'), -- 267063 (Revantusk Warrior) - Read Amani Tablet
(260930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''), -- 260930 (Tol'zenja the Spirit Caller)
(272751, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, '1311569'), -- 272751 (Skull of Er'inye) - Ghostly Object [DNT]
(262880, 0, 0, 0, 0, 0, 1, 0, 0, 36656, 0, 0, 0, ''), -- 262880 (Er'inye)
(264690, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1239605'), -- 264690 (Zul'jarra's Spirit Scout) - Carry Fish Bowl
(262798, 0, 0, 0, 0, 0, 1, 0, 0, 36705, 0, 0, 0, ''), -- 262798 (Warleader Abdumati)
(262879, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '18950'), -- 262879 (Amani Guard) - Invisibility and Stealth Detection
(261401, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '382759'), -- 261401 (Slithering Coilguard) - Conversation Aura: Talk Only [DNT]
(269485, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, ''), -- 269485 (Altar of Corrosion)
(273269, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 273269 (Spiritwing)
(261405, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1289611'), -- 261405 (Risen Watcher) - Corrosive
(265066, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, ''), -- 265066 (Venomborn Twin)
(273338, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1310494'), -- 273338 (Commander Gazba) - Corroded Spirit
(264392, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1269773'), -- 264392 (Shadowblade of Nek'zali) - Fraying
(262765, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '42459 1269773 1245047'), -- 262765 (Nek'zali's Ensnared) - Dual Wield, Fraying, Sparring Aura: Attack1H - Faster [DNT]
(271957, 0, 0, 8, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1310494'), -- 271957 (Commander Gazba) - Corroded Spirit
(272056, 0, 0, 0, 0, 0, 1, 0, 0, 36656, 0, 0, 0, ''), -- 272056 (Er'inye)
(263759, 0, 0, 0, 0, 0, 1, 0, 0, 36624, 0, 0, 0, ''), -- 263759 (Shield of the Second)
(264378, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, '1292157'), -- 264378 (Volatile Venom) - Volatile Venom
(261381, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1289611'), -- 261381 (Venombound Coilguard) - Corrosive
(261382, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 261382 (Venombound Slayer)
(261380, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1303581'), -- 261380 (Venombound Stalker) - Ula'tek's Coating
(264230, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, ''), -- 264230 (Venombound Stalker)
(264231, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, ''), -- 264231 (Venombound Coilguard)
(261378, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 261378 (Gorged Skyfiend)
(261396, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 261396 (Prowling Skyfiend)
(265368, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1294637'), -- 265368 (Poison Wave) - Poison Wave
(271016, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, '1293474'), -- 271016 (Med'jai Hunter Spirit) - 12.1 Ula'tek - Warrior - Guardian - Thaze'ala - OnSpawn [DNT]
(271014, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, '1293474'), -- 271014 (Med'jai Warrior Spirit) - 12.1 Ula'tek - Warrior - Guardian - Thaze'ala - OnSpawn [DNT]
(261395, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '42459'), -- 261395 (Soulcoiler Seeker) - Dual Wield
(261389, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1289611'), -- 261389 (Soulcoiler Hierophant) - Corrosive
(268977, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1303027'), -- 268977 (Egg of Ula'tek) - Volatile
(268969, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1303019'), -- 268969 (Egg of Ula'tek) - Volatile
(272201, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 272201 (Spiritwing)
(262226, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '96573'), -- 262226 (Cursed Spawn) - Pet Sit or Sleep
(261386, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1289347 1286461'), -- 261386 (Venombound Serpent-Seer) - [DNT] Small 09 Target, Vile Deluge
(261398, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1292086'), -- 261398 (Writhing Coiler) - Sleeping
(261558, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, ''), -- 261558 ([DNT] Dummy Bunny)
(269806, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1305636'), -- 269806 (Spiritwing Gust) - [DNT] Vertical Jump Charge Vis
(265390, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, '1294656'), -- 265390 (Venomous Eruption) - Venomous Eruption
(273305, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, ''), -- 273305 (Slain Warrior)
(272025, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1309832'), -- 272025 ([DNT] Dummy Bunny) - [DNT] Safe Zone
(272197, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1307472'), -- 272197 (Amani Windcaller) - [DNT] Amani Windcaller Crouching
(257919, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1273104 1273124'), -- 257919 (Egg of Ula'tek) - Volatile, Volatile
(267027, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1298177'), -- 267027 (Shadowpine Flametender) - Channel: Fire [DNT]
(264964, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1293535'), -- 264964 (Shadowpine Flamespeaker) - [DNT] Safe Zone
(267180, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, ''), -- 267180 (Writhing Coiler)
(267031, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1298115'), -- 267031 (Amani Berserker) - 10 Percent Health
(264228, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '18950'), -- 264228 (Amani Guard) - Invisibility and Stealth Detection
(263748, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1269773'), -- 263748 (Nek'zali's Ensnared) - Fraying
(261404, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1292085'), -- 261404 (Risen Sycophant) - Restless Remains
(264332, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, '1292103'), -- 264332 (Shrine of the Honored Dead) - [DNT] Shrine Cosmetic
(261376, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '372653'), -- 261376 (Soulcoiler Revenant) - Conversation Aura: Talk [DNT]
(263016, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, ''); -- 263016 (Susarikk)
UPDATE `creature_model_info` SET `BoundingRadius`=1.109998583793640136, `CombatReach`=1.20000004768371582 WHERE `DisplayID` IN (138223, 138193, 138192, 138220, 131162, 131160, 131163, 138209, 138199, 138222, 130968, 138191, 131161);
UPDATE `creature_model_info` SET `BoundingRadius`=0.675292491912841796, `CombatReach`=1.5 WHERE `DisplayID`=142995;
UPDATE `creature_model_info` SET `BoundingRadius`=0.561713874340057373, `CombatReach`=1.399999976158142089 WHERE `DisplayID` IN (138167, 131167, 131165, 138218, 138217, 138166, 138198, 138219, 138197, 138196);
UPDATE `creature_model_info` SET `BoundingRadius`=0.349999994039535522, `CombatReach`=0.5 WHERE `DisplayID` IN (142376, 142373, 143097);
UPDATE `creature_model_info` SET `BoundingRadius`=0.924998760223388671, `CombatReach`=1 WHERE `DisplayID` IN (142718, 142940, 143000, 143895);
UPDATE `creature_model_info` SET `BoundingRadius`=0.5, `CombatReach`=1 WHERE `DisplayID` IN (147155, 144225);
UPDATE `creature_model_info` SET `BoundingRadius`=0.607012927532196044, `CombatReach`=2 WHERE `DisplayID`=144238;
UPDATE `creature_model_info` SET `BoundingRadius`=0.601836323738098144, `CombatReach`=1.5 WHERE `DisplayID` IN (143440, 143118);
UPDATE `creature_model_info` SET `BoundingRadius`=1.202498316764831542, `CombatReach`=1.299999952316284179 WHERE `DisplayID` IN (143393, 143087, 143564);
UPDATE `creature_model_info` SET `BoundingRadius`=1.562881827354431152, `CombatReach`=2.039999961853027343 WHERE `DisplayID`=142343;
UPDATE `creature_model_info` SET `BoundingRadius`=4.527777671813964843, `CombatReach`=3 WHERE `DisplayID`=145957;
UPDATE `creature_model_info` SET `BoundingRadius`=2.9030609130859375, `CombatReach`=3 WHERE `DisplayID` IN (142384, 137234, 142383);
UPDATE `creature_model_info` SET `BoundingRadius`=1.017498612403869628, `CombatReach`=1.10000002384185791 WHERE `DisplayID` IN (138137, 138138, 138136);
UPDATE `creature_model_info` SET `BoundingRadius`=0.521591424942016601, `CombatReach`=1.299999952316284179 WHERE `DisplayID` IN (138133, 143501, 138134);
UPDATE `creature_model_info` SET `BoundingRadius`=0.591166257858276367, `CombatReach`=1.5 WHERE `DisplayID`=142996;
UPDATE `creature_model_info` SET `BoundingRadius`=1.522662878036499023 WHERE `DisplayID`=143733;
UPDATE `creature_model_info` SET `BoundingRadius`=0.440402060747146606 WHERE `DisplayID`=144123;
UPDATE `creature_model_info` SET `BoundingRadius`=1, `CombatReach`=1.25 WHERE `DisplayID` IN (142362, 104484, 104486);
UPDATE `creature_model_info` SET `BoundingRadius`=1.329694986343383789 WHERE `DisplayID` IN (142339, 137216, 137233, 142334, 137209, 142327);
UPDATE `creature_model_info` SET `BoundingRadius`=0.310000002384185791, `CombatReach`=1 WHERE `DisplayID`=143570;
UPDATE `creature_model_info` SET `BoundingRadius`=3.483673334121704101, `CombatReach`=3.60000014305114746 WHERE `DisplayID` IN (142386, 142385);
UPDATE `creature_model_info` SET `BoundingRadius`=3.381387233734130859 WHERE `DisplayID`=144297;
UPDATE `creature_model_info` SET `BoundingRadius`=2.099999904632568359, `CombatReach`=2.099999904632568359 WHERE `DisplayID`=137228;
UPDATE `creature_model_info` SET `BoundingRadius`=1.044760346412658691 WHERE `DisplayID` IN (142325, 142324, 137210);
UPDATE `creature_model_info` SET `BoundingRadius`=1.122080683708190917 WHERE `DisplayID`=145709;
UPDATE `creature_model_info` SET `BoundingRadius`=1.654816031455993652, `CombatReach`=2.160000085830688476 WHERE `DisplayID` IN (137211, 142345);
UPDATE `creature_model_info` SET `BoundingRadius`=0.424909055233001708, `CombatReach`=1.399999976158142089 WHERE `DisplayID`=143740;
UPDATE `creature_model_info` SET `BoundingRadius`=1.358234524726867675 WHERE `DisplayID`=137894;
UPDATE `creature_model_info` SET `BoundingRadius`=1.134604454040527343 WHERE `DisplayID`=145707;
UPDATE `creature_model_info` SET `BoundingRadius`=1.298428297042846679 WHERE `DisplayID`=145708;
UPDATE `creature_model_info` SET `BoundingRadius`=1.314084410667419433 WHERE `DisplayID`=142411;
UPDATE `creature_model_info` SET `BoundingRadius`=2.519999980926513671, `CombatReach`=2.519999980926513671 WHERE `DisplayID` IN (137231, 142379);
UPDATE `creature_model_info` SET `BoundingRadius`=2.61721038818359375, `CombatReach`=1.80000007152557373 WHERE `DisplayID`=141211;
UPDATE `creature_model_info` SET `BoundingRadius`=1.350584983825683593, `CombatReach`=3 WHERE `DisplayID`=138226;
UPDATE `creature_model_info` SET `BoundingRadius`=2.181008577346801757, `CombatReach`=1.5 WHERE `DisplayID`=140726;
UPDATE `creature_model_info` SET `BoundingRadius`=8.7091827392578125, `CombatReach`=9 WHERE `DisplayID`=143471;
UPDATE `creature_model_info` SET `BoundingRadius`=0.899999976158142089, `CombatReach`=1.799999952316284179 WHERE `DisplayID`=147384;
UPDATE `creature_model_info` SET `BoundingRadius`=0.800000011920928955, `CombatReach`=1 WHERE `DisplayID` IN (104491, 104495, 104490, 104494);
UPDATE `creature_model_info` SET `BoundingRadius`=0.122499994933605194, `CombatReach`=0.349999994039535522 WHERE `DisplayID`=59890;
UPDATE `creature_model_info` SET `BoundingRadius`=1.980034708976745605, `CombatReach`=3.20000004768371582 WHERE `DisplayID`=136108;
UPDATE `creature_model_info` SET `BoundingRadius`=1.53922438621520996, `CombatReach`=1.5 WHERE `DisplayID`=129981;
UPDATE `creature_model_info` SET `BoundingRadius`=0.987635195255279541, `CombatReach`=2.0625 WHERE `DisplayID` IN (131994, 131956, 131993);
DELETE FROM `creature_template_gossip` WHERE (`CreatureID`=272197 AND `MenuID` IN (44330,44328)) OR (`CreatureID`=264332 AND `MenuID`=43150) OR (`CreatureID`=262798 AND `MenuID`=42976) OR (`CreatureID`=262880 AND `MenuID`=42883) OR (`CreatureID`=264871 AND `MenuID`=43200) OR (`CreatureID`=269485 AND `MenuID`=43990) OR (`CreatureID`=272056 AND `MenuID`=44304);
INSERT INTO `creature_template_gossip` (`CreatureID`, `MenuID`, `VerifiedBuild`) VALUES
(272197, 44330, 69587), -- Amani Windcaller
(264332, 43150, 69587), -- Shrine of the Honored Dead
(262798, 42976, 69587), -- Warleader Abdumati
(262880, 42883, 69587), -- Er'inye
(264871, 43200, 69587), -- Spirit Scout Mok'jib
(269485, 43990, 69587), -- Altar of Corrosion
(272056, 44304, 69587), -- Er'inye
(272197, 44328, 69587); -- Amani Windcaller
REPLACE INTO `npc_text` (`ID`, `Probability0`, `Probability1`, `Probability2`, `Probability3`, `Probability4`, `Probability5`, `Probability6`, `Probability7`, `BroadcastTextId0`, `BroadcastTextId1`, `BroadcastTextId2`, `BroadcastTextId3`, `BroadcastTextId4`, `BroadcastTextId5`, `BroadcastTextId6`, `BroadcastTextId7`, `VerifiedBuild`) VALUES
(262880, 1, 0, 0, 0, 0, 0, 0, 0, 312691, 0, 0, 0, 0, 0, 0, 0, 69587), -- 262880 (Er'inye)
(272197, 1, 0, 0, 0, 0, 0, 0, 0, 321985, 0, 0, 0, 0, 0, 0, 0, 69587), -- 272197 (Amani Windcaller)
(2721970, 1, 0, 0, 0, 0, 0, 0, 0, 321985, 0, 0, 0, 0, 0, 0, 0, 69587), -- 272197 (Amani Windcaller)
(264332, 1, 0, 0, 0, 0, 0, 0, 0, 319518, 0, 0, 0, 0, 0, 0, 0, 69587), -- 264332 (Shrine of the Honored Dead)
(272056, 1, 0, 0, 0, 0, 0, 0, 0, 322033, 0, 0, 0, 0, 0, 0, 0, 69587), -- 272056 (Er'inye)
(2720560, 1, 0, 0, 0, 0, 0, 0, 0, 322035, 0, 0, 0, 0, 0, 0, 0, 69587), -- 272056 (Er'inye)
(262798, 1, 0, 0, 0, 0, 0, 0, 0, 313633, 0, 0, 0, 0, 0, 0, 0, 69587), -- 262798 (Warleader Abdumati)
(264871, 1, 0, 0, 0, 0, 0, 0, 0, 314766, 0, 0, 0, 0, 0, 0, 0, 69587), -- 264871 (Spirit Scout Mok'jib)
(269485, 1, 0, 0, 0, 0, 0, 0, 0, 319569, 0, 0, 0, 0, 0, 0, 0, 69587); -- 269485 (Altar of Corrosion)
REPLACE INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES
(42883, 262880, 69587), -- 262880 (Er'inye)
(44328, 272197, 69587), -- 272197 (Amani Windcaller)
(44330, 2721970, 69587), -- 272197 (Amani Windcaller)
(43150, 264332, 69587), -- 264332 (Shrine of the Honored Dead)
(44304, 272056, 69587), -- 272056 (Er'inye)
(44305, 2720560, 69587), -- 272056 (Er'inye)
(42976, 2627980, 69587), -- 262798 (Warleader Abdumati)
(43200, 264871, 69587), -- 264871 (Spirit Scout Mok'jib)
(43990, 269485, 69587); -- 269485 (Altar of Corrosion)
DELETE FROM `gossip_menu_option` WHERE (`MenuID`=44328 AND `OptionID` IN (2,0,5)) OR (`MenuID`=44330 AND `OptionID` IN (0,5,2,1)) OR (`MenuID`=44305 AND `OptionID`=0) OR (`MenuID`=42976 AND `OptionID` IN (6,3,2,5,4)) OR (`MenuID`=42883 AND `OptionID` IN (30,35,1,5)) OR (`MenuID`=43990 AND `OptionID`=1) OR (`MenuID`=44304 AND `OptionID`=0);
INSERT INTO `gossip_menu_option` (`MenuID`, `GossipOptionID`, `OptionID`, `OptionNpc`, `OptionText`, `OptionBroadcastTextID`, `Language`, `Flags`, `ActionMenuID`, `ActionPoiID`, `GossipNpcOptionID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `SpellID`, `OverrideIconID`, `VerifiedBuild`) VALUES
(44328, 141710, 2, 0, 'Fly me to the Northern Amani Bulwark.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44328, 141712, 0, 0, 'Fly me to the Amani Foothold.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44330, 141722, 0, 0, 'Fly me to the Amani Foothold.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44305, 141675, 0, 0, 'Nevermind.', 64614, 0, 0, 44304, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 64614 - 158302 - 169966
(42976, 141369, 6, 0, 'What do you know about Er\'inye?', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44330, 141718, 5, 0, 'I want the winds to hide me from sight.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42976, 140056, 3, 0, 'Tell me about Temple Strikes.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44328, 141708, 5, 0, 'I want the winds to hide me from sight.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42976, 140057, 2, 0, 'Tell me about Temple Patrols.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42883, 140085, 30, 1, 'Let me browse your goods.', 2823, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587), -- OptionBroadcastTextID: 2823 - 7509 - 8097
(44330, 141721, 2, 0, 'Fly me to the Eastern Amani Outpost.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42976, 140054, 5, 0, 'Tell me about Ancient Foes.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42976, 140055, 4, 0, 'Tell me about Temple Incursions.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42883, 141355, 35, 0, 'I\'d like to ask you some questions.', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(42883, 141688, 1, 0, 'Corrode Spirit |cFF0000FF[1000 Corrosive Coin]|r', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44330, 141760, 1, 0, 'Fly me to the Amani Foothold.', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(43990, 141208, 1, 51, '<Commune with the altar.>', 0, 0, 1, 0, 0, 61443, 0, 0, '', 0, NULL, NULL, 69587),
(42883, 139673, 5, 0, 'Corrode Spirit |cFFFF4040[Requires 1500 Corrosive Coin]|r', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(44304, 141674, 0, 0, 'Who are you?', 25092, 0, 0, 44305, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587); -- OptionBroadcastTextID: 25092 - 38470 - 47091 - 47632 - 62792 - 65124 - 79414 - 97339 - 153888 - 161428 - 166571 - 176081 - 185133 - 224837 - 263541 - 298152
UPDATE `creature_template` SET `name`='Disguised Decor Duel Vendor', `subname`='Housing Decor', `unit_class`=8, `type`=7 WHERE `entry`=264056; -- 264056
UPDATE `creature_template` SET `IconName`='questinteract' WHERE `entry`=271957;
DELETE FROM `gameobject_template` WHERE `entry` IN (641968 /*Plaque*/, 642089 /*Cache of Three*/, 668601 /*Funerary Inscription*/, 668596 /*Funerary Inscription*/, 645579 /*Congealed Bile*/, 645580 /*Congealed Bile*/, 660898 /*Meeting Stone*/, 649640 /*Soulcoiler's Cache*/, 649687 /*Soulcoiler's Trove*/, 660052 /*Altar*/, 656236 /*Chair*/, 656234 /*Chair*/, 670429 /*Mailbox*/, 656235 /*Anvil*/, 668597 /*Funerary Inscription*/, 674834 /*[DNT] Invisible Box*/, 652122 /*[DNT] Serpent Skull*/, 642691 /*Plaque*/, 642689 /*Statue Pedestal*/, 668589 /*Funerary Inscription*/, 645545 /*Brazier*/, 645544 /*Brazier*/, 641800 /*Ancient Acolyte Scroll*/, 641565 /*Faintly Glowing Gem*/, 641563 /*Troll Skeleton*/, 675629 /*Broken Urn*/, 649221 /*Burrow Exit*/, 652569 /*Forgotten Alchemy*/, 649218 /*Burrow Exit*/, 642727 /*Ooze*/, 668598 /*Funerary Inscription*/, 671517 /*[DNT] Bird Nest*/, 653846 /*Spiritwing Feather*/, 670351 /*Viscous Venom*/, 671498 /*Venom-Worn Coffer*/, 668590 /*Funerary Inscription*/, 651083 /*Shrine of the Honored Dead*/, 625899 /*Barricade*/, 652705 /*Soulguide Charm*/, 652399 /*Venomous Salve*/, 652562 /*Bottled Spirits*/, 668593 /*Funerary Inscription*/, 674736 /*Vault Door*/, 673055 /*[DNT] Amani Barricade*/, 650883 /*[DNT] Amani Banner*/, 649199 /*Burrow Exit*/, 649212 /*Rock Wall*/, 642985 /*Vault Door*/, 642984 /*Door*/, 642983 /*Door*/, 656039 /*Venom-Clotted Bauble*/, 654991 /*Cracked Canopic Jar*/, 670349 /*Vile Venom*/, 656001 /*Cursed Refulgent Copper*/, 625510 /*Quivering Egg*/, 655890 /*Bubbling Beryl*/, 670350 /*Cursed Oddity*/, 655891 /*Willow Sea*/, 656044 /*Singing Shell*/, 674735 /*Vault Door*/, 674734 /*Vault Door*/, 670637 /*Door*/, 666685 /*Crypt Door*/);
INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`, `Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`, `Data33`, `Data34`, `RequiredLevel`, `ContentTuningId`, `VerifiedBuild`) VALUES
(641968, 10, 13616, 'Plaque', 'inspect', '', '', 2, 0, 0, 0, 3000, 0, 0, 0, 10569, 0, 2, 1292346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Plaque
(642089, 10, 117507, 'Cache of Three', '', '', '', 2, 0, 0, 0, 300000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Cache of Three
(668601, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10857, 0, 2, 1306407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(668596, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10852, 0, 2, 1306402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(645579, 50, 124187, 'Congealed Bile', 'questinteract', '', '', 0.400000005960464477, 0, 140492, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 6146, 69587), -- Congealed Bile
(645580, 50, 124188, 'Congealed Bile', 'questinteract', '', '', 0.400000005960464477, 0, 140492, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 6146, 69587), -- Congealed Bile
(660898, 23, 92048, 'Meeting Stone', '', '', '', 1, 1, 60, 16865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 6666, 69587), -- Meeting Stone
(649640, 50, 124540, 'Soulcoiler\'s Cache', '', '', '', 0.75, 1690, 140644, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 1308115, 0, 0, 7654, 40, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Soulcoiler's Cache
(649687, 50, 117507, 'Soulcoiler\'s Trove', '', '', '', 0.75, 1690, 140648, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 1308115, 0, 0, 7655, 40, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Soulcoiler's Trove
(660052, 5, 124082, 'Altar', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Altar
(656236, 7, 110123, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(656234, 7, 110123, 'Chair', '', '', '', 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Chair
(670429, 19, 110102, 'Mailbox', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Mailbox
(656235, 8, 103829, 'Anvil', '', '', '', 1, 1, 10, 0, 0, 0, 0, 0, 0, 103828, 0, 30091, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Anvil
(668597, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10853, 0, 2, 1306403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(674834, 5, 7735, '[DNT] Invisible Box', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Invisible Box
(652122, 5, 46361, '[DNT] Serpent Skull', '', '', '', 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Serpent Skull
(642691, 10, 13616, 'Plaque', 'inspect', '', '', 2, 0, 0, 0, 3000, 0, 0, 0, 10576, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Plaque
(642689, 5, 123410, 'Statue Pedestal', '', '', '', 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Statue Pedestal
(668589, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10847, 0, 2, 1306397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(645545, 8, 110103, 'Brazier', '', '', '', 1, 4, 10, 195641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Brazier
(645544, 8, 110103, 'Brazier', '', '', '', 1, 4, 10, 195641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Brazier
(641800, 9, 43642, 'Ancient Acolyte Scroll', '', '', '', 0.200000002980232238, 10568, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Ancient Acolyte Scroll
(641565, 2, 92825, 'Faintly Glowing Gem', '', '', '', 0.5, 4403, 29628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Faintly Glowing Gem
(641563, 5, 123451, 'Troll Skeleton', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Troll Skeleton
(675629, 3, 118212, 'Broken Urn', 'questinteract', '', '', 0.699999988079071044, 3701, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143090, 0, 0, 0, 0, 90, 5381, 69587), -- Broken Urn
(649221, 22, 124373, 'Burrow Exit', 'questinteract', '', '', 1.5, 1289947, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Burrow Exit
(652569, 10, 80191, 'Forgotten Alchemy', '', '', '', 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1294172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Forgotten Alchemy
(649218, 22, 124373, 'Burrow Exit', 'questinteract', '', '', 1.5, 1289939, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Burrow Exit
(642727, 5, 123720, 'Ooze', '', '', '', 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Ooze
(668598, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10854, 0, 2, 1306404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(671517, 5, 74920, '[DNT] Bird Nest', '', '', '', 0.150000005960464477, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Bird Nest
(653846, 10, 38966, 'Spiritwing Feather', '', '', '', 0.800000011920928955, 3701, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 1295297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 161861, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Spiritwing Feather
(670351, 25, 18020, 'Viscous Venom', '', '', '', 1, 4, 143114, 3, 5, 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 3615, 69587), -- Viscous Venom
(671498, 3, 124548, 'Venom-Worn Coffer', '', '', '', 1, 4487, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142813, 0, 0, 0, 0, 90, 6146, 69587), -- Venom-Worn Coffer
(668590, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10848, 0, 2, 1306398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(651083, 5, 122675, 'Shrine of the Honored Dead', '', '', '', 0.75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Shrine of the Honored Dead
(625899, 5, 120833, 'Barricade', '', '', '', 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Barricade
(652705, 10, 115904, 'Soulguide Charm', '', '', '', 1.10000002384185791, 43, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1294287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Soulguide Charm
(652399, 10, 122938, 'Venomous Salve', '', '', '', 0.800000011920928955, 43, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1293925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Venomous Salve
(652562, 10, 46056, 'Bottled Spirits', '', '', '', 1.10000002384185791, 43, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1294123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Bottled Spirits
(668593, 10, 105786, 'Funerary Inscription', 'inspect', '', '', 0.75, 0, 0, 0, 1, 0, 0, 0, 10850, 0, 2, 1306400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 7875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Funerary Inscription
(674736, 0, 127060, 'Vault Door', '', '', '', 1.326140046119689941, 0, 0, 3000, 0, 0, 0, 0, 5703, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vault Door
(673055, 5, 118349, '[DNT] Amani Barricade', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Amani Barricade
(650883, 5, 106520, '[DNT] Amani Banner', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- [DNT] Amani Banner
(649199, 22, 124373, 'Burrow Exit', 'questinteract', '', '', 1.5, 1289903, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Burrow Exit
(649212, 0, 112305, 'Rock Wall', '', '', '', 1.75, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Rock Wall
(642985, 0, 113515, 'Vault Door', '', '', '', 1, 0, 0, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vault Door
(642984, 0, 113515, 'Door', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Door
(642983, 0, 113515, 'Door', '', '', '', 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Door
(656039, 50, 126232, 'Venom-Clotted Bauble', '', '', '', 0.5, 1690, 141429, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 1308115, 0, 0, 7712, 40, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Venom-Clotted Bauble
(654991, 50, 111235, 'Cracked Canopic Jar', '', '', '', 0.5, 1690, 141366, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 1308115, 0, 0, 7705, 40, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Cracked Canopic Jar
(670349, 25, 10993, 'Vile Venom', '', '', '', 1, 4, 143274, 3, 5, 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 3615, 69587), -- Vile Venom
(656001, 50, 109847, 'Cursed Refulgent Copper', '', '', '', 1, 4003, 131254, 0, 0, 60, 100, 30, 0, 0, 0, 0, 0, 0, 1, 1223154, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 25183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 3615, 69587), -- Cursed Refulgent Copper
(625510, 3, 120635, 'Quivering Egg', 'questinteract', 'Collecting', '', 1, 3701, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139037, 0, 0, 0, 0, 90, 5381, 69587), -- Quivering Egg
(655890, 25, 85928, 'Bubbling Beryl', '', '', '', 1, 4, 141418, 3, 5, 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 3615, 69587), -- Bubbling Beryl
(670350, 25, 11049, 'Cursed Oddity', '', '', '', 1, 4, 143190, 3, 5, 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 3615, 69587), -- Cursed Oddity
(655891, 25, 85928, 'Willow Sea', '', '', '', 1, 4, 142373, 3, 5, 1628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 3615, 69587), -- Willow Sea
(656044, 50, 56221, 'Singing Shell', '', '', '', 0.300000011920928955, 1690, 141430, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 1308115, 0, 0, 7713, 40, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 5381, 69587), -- Singing Shell
(674735, 0, 113515, 'Vault Door', '', '', '', 1.037870049476623535, 0, 0, 3000, 0, 0, 0, 0, 5703, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vault Door
(674734, 0, 127061, 'Vault Door', '', '', '', 0.750963985919952392, 0, 0, 3000, 0, 0, 0, 0, 5703, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Vault Door
(670637, 0, 125627, 'Door', '', '', '', 0.899999976158142089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587), -- Door
(666685, 0, 127061, 'Crypt Door', '', '', '', 0.388732224702835083, 0, 0, 3000, 0, 0, 0, 0, 5703, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Crypt Door
DELETE FROM `gameobject_questitem` WHERE (`Idx`=0 AND `GameObjectEntry` IN (675629,625510));
INSERT INTO `gameobject_questitem` (`GameObjectEntry`, `Idx`, `ItemId`, `VerifiedBuild`) VALUES
(675629, 0, 278472, 69587), -- Broken Urn
(625510, 0, 267045, 69587); -- Quivering Egg
DELETE FROM `scenario_poi` WHERE (`CriteriaTreeID`=225028 AND `BlobIndex`=0 AND `Idx1`=0) OR (`CriteriaTreeID`=225029 AND `BlobIndex`=0 AND `Idx1`=0) OR (`CriteriaTreeID`=225030 AND `BlobIndex`=0 AND `Idx1`=0) OR (`CriteriaTreeID`=225023 AND `BlobIndex`=0 AND `Idx1`=0);
INSERT INTO `scenario_poi` (`CriteriaTreeID`, `BlobIndex`, `Idx1`, `MapID`, `UiMapID`, `Priority`, `Flags`, `WorldEffectID`, `PlayerConditionID`, `NavigationPlayerConditionID`, `VerifiedBuild`) VALUES
(225028, 0, 0, 2916, 2613, 0, 2, 0, 0, 0, 69587),
(225029, 0, 0, 2916, 2613, 0, 2, 0, 0, 0, 69587),
(225030, 0, 0, 2916, 2613, 0, 2, 0, 0, 0, 69587),
(225023, 0, 0, 2916, 2613, 0, 2, 0, 0, 0, 69587);
DELETE FROM `scenario_poi_points` WHERE (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=6) OR (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=5) OR (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=4) OR (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=3) OR (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=2) OR (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=1) OR (`CriteriaTreeID`=225028 AND `Idx1`=0 AND `Idx2`=0) OR (`CriteriaTreeID`=225029 AND `Idx1`=0 AND `Idx2`=4) OR (`CriteriaTreeID`=225029 AND `Idx1`=0 AND `Idx2`=3) OR (`CriteriaTreeID`=225029 AND `Idx1`=0 AND `Idx2`=2) OR (`CriteriaTreeID`=225029 AND `Idx1`=0 AND `Idx2`=1) OR (`CriteriaTreeID`=225029 AND `Idx1`=0 AND `Idx2`=0) OR (`CriteriaTreeID`=225030 AND `Idx1`=0 AND `Idx2`=3) OR (`CriteriaTreeID`=225030 AND `Idx1`=0 AND `Idx2`=2) OR (`CriteriaTreeID`=225030 AND `Idx1`=0 AND `Idx2`=1) OR (`CriteriaTreeID`=225030 AND `Idx1`=0 AND `Idx2`=0) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=11) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=10) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=9) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=8) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=7) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=6) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=5) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=4) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=3) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=2) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=1) OR (`CriteriaTreeID`=225023 AND `Idx1`=0 AND `Idx2`=0);
INSERT INTO `scenario_poi_points` (`CriteriaTreeID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(225028, 0, 6, 6233, -10489, -112, 69587),
(225028, 0, 5, 6240, -10477, -112, 69587),
(225028, 0, 4, 6247, -10464, -112, 69587),
(225028, 0, 3, 6275, -10480, -112, 69587),
(225028, 0, 2, 6268, -10494, -112, 69587),
(225028, 0, 1, 6260, -10505, -112, 69587),
(225028, 0, 0, 6245, -10496, -112, 69587),
(225029, 0, 4, 6310, -10384, -112, 69587),
(225029, 0, 3, 6341, -10403, -112, 69587),
(225029, 0, 2, 6335, -10418, -112, 69587),
(225029, 0, 1, 6325, -10432, -112, 69587),
(225029, 0, 0, 6294, -10414, -112, 69587),
(225030, 0, 3, 6160, -10375, -113, 69587),
(225030, 0, 2, 6210, -10376, -113, 69587),
(225030, 0, 1, 6210, -10426, -113, 69587),
(225030, 0, 0, 6160, -10426, -113, 69587),
(225023, 0, 11, 6087, -10424, -111, 69587),
(225023, 0, 10, 6083, -10411, -111, 69587),
(225023, 0, 9, 6083, -10385, -111, 69587),
(225023, 0, 8, 6088, -10374, -111, 69587),
(225023, 0, 7, 6162, -10329, -111, 69587),
(225023, 0, 6, 6293, -10309, -111, 69587),
(225023, 0, 5, 6325, -10326, -111, 69587),
(225023, 0, 4, 6354, -10375, -111, 69587),
(225023, 0, 3, 6342, -10423, -111, 69587),
(225023, 0, 2, 6286, -10501, -111, 69587),
(225023, 0, 1, 6263, -10517, -111, 69587),
(225023, 0, 0, 6221, -10498, -111, 69587);
File diff suppressed because one or more lines are too long
@@ -0,0 +1,603 @@
/*==================================================================
-- Kul Tiran Starting Zone (Map 1643 - ZoneID 8717 - Boralus Harbor)
8717 - Boralus Harbor
8718 - Tradewinds Market
9801 - Snug Harbor Inn
9802 - Harbormaster's Office
10017 - Sanctum of the Sages
10018 - Tradewinds Counting House
==================================================================*/
-- =======================
-- Misc: Zone Calibrations
-- =======================
UPDATE `creature_template` SET `faction`=2992 WHERE `entry` IN (140589,141785);
UPDATE `creature` SET `PhaseId`=0 WHERE `guid`=248049;
UPDATE `creature_text` SET `Emote`=1 WHERE `CreatureID`=143978 AND `GroupID`=0 AND `ID`=0;
DELETE FROM `gameobject` WHERE `guid`=154486;
DELETE FROM `gameobject_addon` WHERE `guid`=154486;
-- ============================
-- Misc: Spell Area Calibration
-- ============================
DELETE FROM `spell_area` WHERE `area`=9802 AND `spell` IN (49416,49417);
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
(49416, 9802, 55142, 55142, 0, -1, 2147483648, 2, 3, 9, 66, 'Generic Quest Invisibility Detection 1 - Kul Tiran (Harbormaster\'s Office, Boralus Harbor)'),
(49417, 9802, 53722, 53722, 0, -1, 2147483648, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 2 - Kul Tiran (Harbormaster\'s Office, Boralus Harbor)');
DELETE FROM `spell_area` WHERE `area`=5150 AND `spell`=90161;
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
(90161, 5150, 55146, 55146, 0, -1, 2147483648, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 4 - Kul Tiran (Dwarven District, Stormwind City)');
-- =======================================
-- Quest For the Alliance (55142)
-- Quest Heritage of the Kul Tiran (53722)
-- =======================================
UPDATE `quest_template_addon` SET `ScriptName`='SmartQuest' WHERE `ID`=55142;
UPDATE `quest_objectives` SET `Type`=0, `ObjectID`=123564, `Description`='Portal to Stormwind' WHERE `ID`=388754;
DELETE FROM `smart_scripts` WHERE `entryorguid`=55142 AND `source_type`=5;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(55142, 5, 0, 0, '', 91, 0, 100, 0, 0, 0, 0, 0, 0, '', 62, 1643, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 1064.040, -483.834, 9.7001, 5.974, 'Kul Tiran Quest - On Quest Abandoned - Teleport Player');
-- NPC Katherine Proudmoore (150941)
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=150941;
DELETE FROM `creature` WHERE `guid`=11651;
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `phaseUseFlags`, `PhaseId`, `PhaseGroup`, `terrainSwapMap`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curHealthPct`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES
(11651, 150941, 1643, 8717, 9802, '0', 0, 0, 0, -1, 0, 0, 1072.93, -481.179, 9.78345, 4.40862, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
DELETE FROM `creature_addon` WHERE `guid` IN (248049,11651);
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(248049, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '49414'),
(11651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '49415');
DELETE FROM `creature_text` WHERE `CreatureID`=150941;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(150941, 0, 0, 'Champion, it is with great respect and admiration that I present you with the regalia of the Admiralty\'s most decorated officers.', 12, 0, 100, 1, 0, 126194, 0, 169359, 0, 'Katherine Proudmoore'),
(150941, 1, 0, 'Wear it with pride, as an honored hero of both the Alliance and Kul Tiras.', 12, 0, 100, 1, 0, 126195, 0, 169360, 0, 'Katherine Proudmoore');
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (150941,-248049,-11651) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=15094100 AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(150941, 0, 0, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 15094100, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - On Just Summoned - Run Actionlist'),
(-248049, 0, 0, 0, '', 19, 0, 100, 0, 55142, 0, 0, 0, 0, '', 143, 20005, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - On Quest Taken - Run Conversation'),
(-11651, 0, 0, 0, '', 20, 0, 100, 0, 53722, 0, 0, 0, 0, '', 162, 150941, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 1072.93, -481.179, 9.78345, 4.40862, 'Katherine Proudmoore - On Quest Rewarded - Summon Creature Katherine Proudmoore in Personal Visibility'),
(15094100, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 83, 2, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - Remove NPC Flag'),
(15094100, 9, 1, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 66, 0, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - Set Orientation to Invoker'),
(15094100, 9, 2, 0, '', 0, 0, 100, 0, 1000, 1000, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - Say Line 0'),
(15094100, 9, 3, 0, '', 0, 0, 100, 0, 10000, 10000, 0, 0, 0, '', 1, 1, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - Say Line 1'),
(15094100, 9, 4, 0, '', 0, 0, 100, 0, 12000, 12000, 0, 0, 0, '', 11, 52096, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - Cast Cosmetic Teleport Effect'),
(15094100, 9, 5, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 41, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Katherine Proudmoore - Despawn Instant');
-- Conversation (20005)
DELETE FROM `conversation_template` WHERE `Id`=20005;
INSERT INTO `conversation_template` (`Id`, `FirstLineId`, `TextureKitId`, `Flags`, `ScriptName`, `VerifiedBuild`) VALUES
(20005, 26136, 0, 0, '', 69587);
DELETE FROM `conversation_actors` WHERE `ConversationId`=20005;
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `ConversationActorNearId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(20005, 68967, 248049, 0, 0, 0, 0, 0, 0, 69587);
DELETE FROM `conversation_line_template` WHERE `Id` IN (26136,26137);
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`, `Unk`) VALUES
(26136, 0, 0, 0, 0, 69587, 0),
(26137, 0, 0, 0, 0, 69587, 0);
-- GO Portal to Stormwind (All)
UPDATE `gameobject_template` SET `IconName`='openhandglow' WHERE `entry`=293552;
DELETE FROM `gameobject_template_locale` WHERE `entry` IN (176296,193053,193207,193956,195139,201845,203981,205272,208227,209080,210805,227831,235883,246002,259031,278732,293552,293886,303144,313620,322804,325979,325983,334109,353823,355837,376417,383697,411616,420909,428728,442743,462394,508350,523593,543405,628997);
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
(176296, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(176296, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(176296, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(176296, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(176296, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(176296, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(176296, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(176296, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(176296, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(176296, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(193053, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(193053, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(193053, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(193053, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(193053, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(193053, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(193053, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(193053, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(193053, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(193053, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(193207, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(193207, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(193207, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(193207, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(193207, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(193207, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(193207, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(193207, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(193207, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(193207, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(193956, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(193956, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(193956, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(193956, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(193956, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(193956, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(193956, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(193956, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(193956, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(193956, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(195139, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(195139, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(195139, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(195139, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(195139, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(195139, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(195139, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(195139, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(195139, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(195139, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(201845, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(201845, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(201845, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(201845, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(201845, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(201845, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(201845, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(201845, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(201845, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(201845, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(203981, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(203981, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(203981, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(203981, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(203981, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(203981, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(203981, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(203981, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(203981, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(203981, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(205272, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(205272, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(205272, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(205272, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(205272, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(205272, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(205272, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(205272, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(205272, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(205272, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(208227, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(208227, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(208227, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(208227, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(208227, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(208227, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(208227, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(208227, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(208227, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(208227, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(209080, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(209080, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(209080, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(209080, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(209080, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(209080, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(209080, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(209080, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(209080, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(209080, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(210805, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(210805, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(210805, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(210805, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(210805, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(210805, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(210805, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(210805, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(210805, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(210805, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(227831, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(227831, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(227831, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(227831, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(227831, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(227831, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(227831, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(227831, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(227831, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(227831, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(235883, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(235883, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(235883, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(235883, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(235883, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(235883, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(235883, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(235883, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(235883, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(235883, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(246002, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(246002, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(246002, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(246002, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(246002, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(246002, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(246002, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(246002, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(246002, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(246002, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(259031, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(259031, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(259031, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(259031, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(259031, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(259031, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(259031, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(259031, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(259031, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(259031, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(278732, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(278732, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(278732, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(278732, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(278732, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(278732, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(278732, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(278732, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(278732, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(278732, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(293552, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(293552, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(293552, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(293552, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(293552, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(293552, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(293552, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(293552, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(293552, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(293552, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(293886, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(293886, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(293886, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(293886, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(293886, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(293886, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(293886, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(293886, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(293886, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(293886, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(303144, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(303144, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(303144, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(303144, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(303144, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(303144, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(303144, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(303144, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(303144, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(303144, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(313620, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(313620, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(313620, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(313620, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(313620, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(313620, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(313620, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(313620, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(313620, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(313620, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(322804, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(322804, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(322804, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(322804, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(322804, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(322804, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(322804, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(322804, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(322804, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(322804, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(325979, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(325979, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(325979, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(325979, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(325979, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(325979, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(325979, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(325979, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(325979, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(325979, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(325983, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(325983, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(325983, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(325983, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(325983, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(325983, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(325983, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(325983, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(325983, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(325983, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(334109, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(334109, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(334109, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(334109, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(334109, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(334109, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(334109, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(334109, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(334109, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(334109, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(353823, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(353823, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(353823, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(353823, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(353823, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(353823, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(353823, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(353823, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(353823, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(353823, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(355837, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(355837, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(355837, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(355837, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(355837, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(355837, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(355837, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(355837, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(355837, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(355837, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(376417, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(376417, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(376417, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(376417, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(376417, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(376417, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(376417, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(376417, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(376417, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(376417, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(383697, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(383697, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(383697, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(383697, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(383697, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(383697, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(383697, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(383697, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(383697, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(383697, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(411616, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(411616, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(411616, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(411616, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(411616, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(411616, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(411616, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(411616, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(411616, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(411616, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(420909, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(420909, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(420909, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(420909, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(420909, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(420909, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(420909, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(420909, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(420909, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(420909, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(428728, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(428728, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(428728, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(428728, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(428728, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(428728, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(428728, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(428728, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(428728, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(428728, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(442743, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(442743, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(442743, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(442743, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(442743, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(442743, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(442743, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(442743, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(442743, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(442743, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(462394, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(462394, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(462394, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(462394, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(462394, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(462394, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(462394, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(462394, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(462394, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(462394, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(508350, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(508350, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(508350, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(508350, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(508350, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(508350, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(508350, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(508350, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(508350, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(508350, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(523593, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(523593, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(523593, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(523593, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(523593, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(523593, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(523593, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(523593, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(523593, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(523593, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(543405, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(543405, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(543405, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(543405, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(543405, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(543405, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(543405, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(543405, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(543405, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(543405, 'zhTW', '暴風城傳送門', '', NULL, 69587),
(628997, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(628997, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(628997, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(628997, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(628997, 'itIT', 'Portale per Roccavento', '', NULL, 69587),
(628997, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(628997, 'ptBR', 'Portal para Ventobravo', '', NULL, 69587),
(628997, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(628997, 'zhCN', '到暴风城的传送门', '', NULL, 69587),
(628997, 'zhTW', '暴風城傳送門', '', NULL, 69587);
-- Spell Portal: Stormwind (245992)
DELETE FROM `spell_target_position` WHERE `ID`=245992;
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `OrderIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES
(245992, 1, 0, 0, -8175.94, 793.009, 74.0369, 0.6928, 69587);
-- ========================================
-- Quest Stranger in a Strange Land (55146)
-- ========================================
UPDATE `quest_poi_points` SET `X`=-8358, `Y`=622, `Z`=95 WHERE `QuestID`=55146 AND `Idx1`=0 AND `Idx2`=0;
-- NPC Provisioner Fray (150947)
UPDATE `creature_template` SET `AIName`='SmartAI', `unit_flags`=768 WHERE `entry`=150947;
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=150947;
UPDATE `creature` SET `PhaseId`=0, `position_x`=-8340.16, `position_y`=637.168, `position_z`=95.5151, `orientation`=3.3206 WHERE `guid`=248050;
DELETE FROM `creature_addon` WHERE `guid`=248050;
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(248050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '82343');
DELETE FROM `creature_text` WHERE `CreatureID`=150947;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(150947, 0, 0, 'This is my first time outside of Kul Tiras. I\'m going to go check out the docks! Safe travels, $n.', 12, 0, 100, 1, 0, 0, 0, 170367, 0, 'Provisioner Fray');
DELETE FROM `smart_scripts` WHERE `entryorguid`=150947 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=15094700 AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(150947, 0, 0, 0, '', 20, 0, 100, 0, 55146, 0, 0, 0, 0, '', 162, 150947, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, -8340.16, 637.168, 95.5151, 3.3206, 'Provisioner Fray - On Quest Rewarded - Summon Creature Provisioner Fray in Personal Visibility'),
(150947, 0, 1, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 15094700, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - On Just Summoned - Run Actionlist'),
(150947, 0, 2, 3, '', 34, 0, 100, 1, 8, 1, 0, 0, 0, '', 11, 52096, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - On Movement Inform 1 - Cast Cosmetic Teleport Effect'),
(150947, 0, 3, 0, '', 61, 0, 100, 1, 0, 0, 0, 0, 0, '', 41, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - Despawn Instant'),
(15094700, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 83, 2, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - Remove NPC Flag'),
(15094700, 9, 1, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 66, 0, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - Set Orientation to Invoker'),
(15094700, 9, 2, 0, '', 0, 0, 100, 0, 1000, 1000, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - Say Line 0'),
(15094700, 9, 3, 0, '', 0, 0, 100, 0, 7000, 7000, 0, 0, 0, '', 59, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Provisioner Fray - Set Run Off'),
(15094700, 9, 4, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 69, 1, 0, 0, 0, 0, 0, 0, NULL, 8, 0, 0, 0, 0, NULL, -8358.657, 622.213, 95.317, 3.814, 'Provisioner Fray - Move to PoS 1');
-- =======================================
-- Quest Heritage of the Kul Tiran (53722)
-- =======================================
UPDATE `quest_poi_points` SET `X`=1072, `Y`=-481, `Z`=9 WHERE `QuestID`=53722 AND `Idx1`=0 AND `Idx2`=0;
-- GO Portal to Boralus (287164,292824,302854,309917,312229,323845,620465)
UPDATE `gameobject_template` SET `IconName`='openhandglow' WHERE `entry` IN (287164,292824,302854,312229,323845,620465);
DELETE FROM `gameobject_template_locale` WHERE `entry` IN (287164,292824,302854,309917,312229,323845,620465);
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
(287164, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(287164, 'esES', 'Portal a Boralus', '', NULL, 69587),
(287164, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(287164, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(287164, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(287164, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(287164, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(287164, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(287164, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(287164, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587),
(292824, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(292824, 'esES', 'Portal a Boralus', '', NULL, 69587),
(292824, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(292824, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(292824, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(292824, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(292824, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(292824, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(292824, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(292824, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587),
(302854, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(302854, 'esES', 'Portal a Boralus', '', NULL, 69587),
(302854, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(302854, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(302854, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(302854, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(302854, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(302854, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(302854, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(302854, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587),
(309917, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(309917, 'esES', 'Portal a Boralus', '', NULL, 69587),
(309917, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(309917, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(309917, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(309917, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(309917, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(309917, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(309917, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(309917, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587),
(312229, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(312229, 'esES', 'Portal a Boralus', '', NULL, 69587),
(312229, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(312229, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(312229, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(312229, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(312229, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(312229, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(312229, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(312229, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587),
(323845, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(323845, 'esES', 'Portal a Boralus', '', NULL, 69587),
(323845, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(323845, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(323845, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(323845, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(323845, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(323845, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(323845, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(323845, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587),
(620465, 'deDE', 'Portal nach Boralus', '', NULL, 69587),
(620465, 'esES', 'Portal a Boralus', '', NULL, 69587),
(620465, 'esMX', 'Portal a Boralus', '', NULL, 69587),
(620465, 'frFR', 'Portail vers Boralus', '', NULL, 69587),
(620465, 'itIT', 'Portale per Boralus', '', NULL, 69587),
(620465, 'koKR', '보랄러스로 통하는 차원문', '', NULL, 69587),
(620465, 'ptBR', 'Portal para Boralus', '', NULL, 69587),
(620465, 'ruRU', 'Портал в Боралус', '', NULL, 69587),
(620465, 'zhCN', '通往波拉勒斯的傳送門', '', NULL, 69587),
(620465, 'zhTW', '通往波拉勒斯的傳送門', '', NULL, 69587);
@@ -17,7 +17,6 @@
#include "CriteriaHandler.h"
#include "ArenaTeamMgr.h"
#include "InitiativeManager.h"
#include "AzeriteItem.h"
#include "BattlePetMgr.h"
#include "Battleground.h"
+21 -15
View File
@@ -27,6 +27,7 @@
#include "PetBattleMgr.h"
#include "Player.h"
#include "Random.h"
#include "SceneObject.h"
#include "Util.h"
#include "WorldSession.h"
#include <algorithm>
@@ -898,21 +899,6 @@ namespace PetBattles
return;
}
// Additional safety check: validate abilityID exists in DB2
if (!sBattlePetAbilityStore.LookupEntry(abilityID))
{
TC_LOG_ERROR("server.loading", "PetBattle ApplyAbilityEffects: abilityID={} does not exist in BattlePetAbility.db2! Preventing crash.", abilityID);
PetBattleRoundEffect effect;
effect.AbilityEffectID = abilityID;
effect.EffectType = PET_BATTLE_EFFECT_STATUS_CHANGE;
effect.SourceTeam = attackerTeam;
effect.SourcePet = attackerPet;
effect.TargetTeam = attackerTeam;
effect.TargetPet = attackerPet;
_roundEffects.push_back(effect);
return;
}
// Determine which turn in the sequence to execute
uint8 turnIndex = 0;
if (attacker.IsLockedByMultiTurn && attacker.MultiTurnAbilityID == int32(abilityID))
@@ -2404,6 +2390,7 @@ namespace PetBattles
void PetBattle::SendFinalRoundPacket(bool abandoned)
{
WorldPackets::BattlePet::PetBattleFinalRound finalRound;
finalRound.SceneObjectGUID = _sceneObjectGUID;
finalRound.Abandoned = abandoned;
finalRound.PvpBattle = (_battleType == PET_BATTLE_TYPE_PVP || _battleType == PET_BATTLE_TYPE_LFPB);
// 12.0.7 (sniff-verified vs b_pets, 5 battles): the winner is the per-team flag pair in the FinalRound
@@ -2491,6 +2478,7 @@ namespace PetBattles
// Send finished notification and sync pet health to journal
WorldPackets::BattlePet::PetBattleFinished finished;
finished.SceneObjectGUID = _sceneObjectGUID;
for (uint8 t = 0; t < MAX_PET_BATTLE_PLAYERS; ++t)
{
Player* teamPlayer = GetPlayerForTeam(t);
@@ -2711,6 +2699,24 @@ namespace PetBattles
return ObjectAccessor::FindPlayer(_teams[teamIdx].PlayerGUID);
}
void PetBattle::DespawnSceneObject()
{
if (_sceneObjectGUID.IsEmpty())
return;
for (uint8 t = 0; t < MAX_PET_BATTLE_PLAYERS; ++t)
{
if (Player* player = GetPlayerForTeam(t))
{
if (SceneObject* sceneObject = ObjectAccessor::GetSceneObject(*player, _sceneObjectGUID))
sceneObject->Remove();
break;
}
}
_sceneObjectGUID.Clear();
}
uint32 PetBattle::GetOpponentCreatureID(uint8 teamIdx) const
{
uint8 opponentTeam = 1 - teamIdx;
+5
View File
@@ -292,6 +292,10 @@ public:
uint8 GetWinnerTeam() const { return _winnerTeam; }
Player* GetPlayerForTeam(uint8 teamIdx) const;
ObjectGuid GetSceneObjectGUID() const { return _sceneObjectGUID; }
void SetSceneObjectGUID(ObjectGuid guid) { _sceneObjectGUID = guid; }
void DespawnSceneObject();
// Trap validation
uint8 GetTrapStatus(uint8 playerTeam) const;
@@ -377,6 +381,7 @@ private:
ObjectGuid _wildCreatureGUID;
ObjectGuid _npcTrainerGUID;
ObjectGuid _sceneObjectGUID;
};
} // namespace PetBattles
@@ -24,6 +24,7 @@
#include "Log.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "SceneObject.h"
#include "WorldSession.h"
#include <algorithm>
@@ -600,6 +601,9 @@ namespace PetBattles
battle->SetBattleID(battleID);
battle->InitWildBattle(player, wildCreatureGUID);
if (SceneObject* sceneObject = SceneObject::CreatePetBattleSceneObject(player, player->GetPosition(), player->GetGUID()))
battle->SetSceneObjectGUID(sceneObject->GetGUID());
PetBattle* ptr = battle.get();
_activeBattles[battleID] = std::move(battle);
_playerToBattle[player->GetGUID()] = battleID;
@@ -623,6 +627,9 @@ namespace PetBattles
if (battle->IsFinished())
return nullptr; // Validation failed in InitPvPBattle
if (SceneObject* sceneObject = SceneObject::CreatePetBattleSceneObject(player1, player1->GetPosition(), ObjectGuid::Empty))
battle->SetSceneObjectGUID(sceneObject->GetGUID());
PetBattle* ptr = battle.get();
_activeBattles[battleID] = std::move(battle);
_playerToBattle[player1->GetGUID()] = battleID;
@@ -648,6 +655,9 @@ namespace PetBattles
battle->SetBattleID(battleID);
battle->InitNPCBattle(player, trainer, *npcTeam);
if (SceneObject* sceneObject = SceneObject::CreatePetBattleSceneObject(player, player->GetPosition(), player->GetGUID()))
battle->SetSceneObjectGUID(sceneObject->GetGUID());
PetBattle* ptr = battle.get();
_activeBattles[battleID] = std::move(battle);
_playerToBattle[player->GetGUID()] = battleID;
@@ -666,6 +676,8 @@ namespace PetBattles
PetBattle* battle = it->second.get();
battle->DespawnSceneObject();
// Remove player mappings
for (uint8 i = 0; i < MAX_PET_BATTLE_PLAYERS; ++i)
{
@@ -48,6 +48,7 @@
#include "Transport.h"
#include "Util.h"
#include "WorldStateMgr.h"
#include <array>
#include <cstdarg>
template<class Do>
@@ -410,6 +411,36 @@ inline void Battleground::_ProcessJoin(uint32 diff)
if (isArena())
{
/// @todo add arena sound PlaySoundToAll(SOUND_ARENA_START);
std::array<std::vector<WorldPackets::Battleground::ArenaOpponentSpecialization>, 2> teamOpponents;
for (auto const& [guid, battlegroundPlayer] : GetPlayers())
{
Player* teamMember = ObjectAccessor::FindPlayer(guid);
if (!teamMember)
continue;
WorldPackets::Battleground::ArenaOpponentSpecialization entry;
entry.SpecID = int32(teamMember->GetPrimarySpecialization());
ChrSpecializationEntry const* specEntry = sChrSpecializationStore.LookupEntry(uint32(teamMember->GetPrimarySpecialization()));
entry.Role = int8(specEntry ? specEntry->GetRole() : ChrSpecializationRole::Dps);
entry.Guid = guid;
teamOpponents[battlegroundPlayer.Team == ALLIANCE ? 0 : 1].push_back(entry);
}
for (auto const& [guid, battlegroundPlayer] : GetPlayers())
{
Player* recipient = ObjectAccessor::FindPlayer(guid);
if (!recipient)
continue;
recipient->SendDirectMessage(WorldPackets::Battleground::ArenaClearOpponents().Write());
WorldPackets::Battleground::ArenaPrepOpponentSpecializations prepOpponents;
prepOpponents.Opponents = teamOpponents[battlegroundPlayer.Team == ALLIANCE ? 1 : 0];
recipient->SendDirectMessage(prepOpponents.Write());
}
for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
{
if (Player* player = ObjectAccessor::FindPlayer(itr->first))
@@ -233,14 +233,16 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
AreaTriggerFieldFlags fieldFlags = [flags = GetCreateProperties()->Flags]()
{
AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation))
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::AbsoluteOrientation))
fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir))
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::FaceMovementDir))
fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain))
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::FollowsTerrain))
fieldFlags |= AreaTriggerFieldFlags::FollowsTerrain;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior))
fieldFlags |= AreaTriggerFieldFlags::AlwaysExterior;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::UsesUnitRawFacing))
fieldFlags |= AreaTriggerFieldFlags::UsesUnitRawFacing;
return fieldFlags;
}();
ReplaceAllAreaTriggerFlags(fieldFlags);
@@ -305,6 +307,8 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Facing), _stationaryPosition.GetOrientation());
SetRollPitchYaw(GetCreateProperties()->RollPitchYaw, GetCreateProperties()->TargetRollPitchYaw);
AI_Initialize();
UpdateDynamicShapeFlag();
@@ -472,9 +476,9 @@ void AreaTrigger::ClearOverrideMoveCurve()
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetOverrideShapeCurve(float overrideFacing)
void AreaTrigger::SetOverrideShapeCurve(float overrideShape)
{
SetOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideShapeCurve), overrideFacing);
SetOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideShapeCurve), overrideShape);
}
void AreaTrigger::SetOverrideShapeCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation)
@@ -497,13 +501,24 @@ void AreaTrigger::SetSpellVisual(SpellCastVisual const& visual)
void AreaTrigger::SetRollPitchYaw(float roll, float pitch, float yaw,
Optional<float> targetRoll, Optional<float> targetPitch, Optional<float> targetYaw)
{
TaggedPosition<Position::XYZ> rollPitchYaw = { roll, pitch, yaw };
Optional<TaggedPosition<Position::XYZ>> targetRollPitchYaw;
if (targetRoll && targetPitch && targetYaw)
targetRollPitchYaw.emplace(*targetRoll, *targetPitch, *targetYaw);
SetRollPitchYaw(rollPitchYaw, targetRollPitchYaw);
}
void AreaTrigger::SetRollPitchYaw(TaggedPosition<Position::XYZ> const& rollPitchYaw, Optional<TaggedPosition<Position::XYZ>> const& targetRollPitchYaw)
{
auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::RollPitchYaw), { roll, pitch, yaw });
if (targetRoll && targetPitch && targetYaw)
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::RollPitchYaw), rollPitchYaw);
if (targetRollPitchYaw)
{
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TargetRollPitchYaw, 0), { *targetRoll, *targetPitch, *targetYaw });
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TargetRollPitchYaw, 0), *targetRollPitchYaw);
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
}
else
@@ -51,7 +51,7 @@ enum class AreaTriggerFieldFlags : uint32
Attached = 0x0020,
FaceMovementDir = 0x0040, // applies when attached to unit (refers to movement direction of the unit)
FollowsTerrain = 0x0080,
Unknown1025 = 0x0100,
UsesUnitRawFacing = 0x0100, // uses GetTransOffsetO instead of GetOrientation when attached to unit on a transport/vehicle
AlwaysExterior = 0x0200,
HasPlayers = 0x0400,
};
@@ -154,7 +154,7 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
void ClearOverrideMoveCurve();
void SetOverrideShapeCurve(float overrideFacing);
void SetOverrideShapeCurve(float overrideShape);
void SetOverrideShapeCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
void ClearOverrideShapeCurve();
@@ -170,13 +170,15 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
uint32 GetTimeToTargetPos() const { return m_areaTriggerData->TimeToTargetPos; }
void SetTimeToTargetPos(uint32 timeToTargetPos) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), timeToTargetPos); }
uint32 GetTimeToTargetFacing() const { return m_areaTriggerData->TimeToTargetShape; }
void SetTimeToTargetFacing(uint32 timeToTargetShape) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetShape), timeToTargetShape); }
uint32 GetTimeToTargetShape() const { return m_areaTriggerData->TimeToTargetShape; }
void SetTimeToTargetShape(uint32 timeToTargetShape) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetShape), timeToTargetShape); }
void SetSpellVisual(SpellCastVisual const& visual);
void SetRollPitchYaw(float roll, float pitch, float yaw,
Optional<float> targetRoll = {}, Optional<float> targetPitch = {}, Optional<float> targetYaw = {});
void SetRollPitchYaw(TaggedPosition<Position::XYZ> const& rollPitchYaw,
Optional<TaggedPosition<Position::XYZ>> const& targetRollPitchYaw = {});
int32 GetDuration() const { return _duration; }
int32 GetTotalDuration() const { return _totalDuration; }
@@ -59,19 +59,14 @@ enum AreaTriggerActionUserTypes
enum class AreaTriggerCreatePropertiesFlag : uint32
{
None = 0x00000,
HasAbsoluteOrientation = 0x00001,
HasDynamicShape = 0x00002, // DEPRECATED
HasAttached = 0x00004, // DEPRECATED
HasFaceMovementDir = 0x00008, // NYI
HasFollowsTerrain = 0x00010, // NYI
AlwaysExterior = 0x00020,
HasTargetRollPitchYaw = 0x00040, // NYI
HasAnimId = 0x00080, // DEPRECATED
VisualAnimIsDecay = 0x00100,
HasAnimKitId = 0x00200, // DEPRECATED
HasCircularMovement = 0x00400, // DEPRECATED
Unk5 = 0x00800,
None = 0x0000,
HeightIgnoresScale = 0x0001,
VisualAnimIsDecay = 0x0002,
AbsoluteOrientation = 0x0004,
FaceMovementDir = 0x0008, // NYI
FollowsTerrain = 0x0010, // NYI
AlwaysExterior = 0x0020,
UsesUnitRawFacing = 0x0040 // NYI
};
DEFINE_ENUM_FLAG(AreaTriggerCreatePropertiesFlag);
@@ -263,6 +258,9 @@ public:
using SplineInfo = std::vector<Position>;
std::variant<std::monostate, SplineInfo, AreaTriggerOrbitInfo> Movement;
TaggedPosition<Position::XYZ> RollPitchYaw;
Optional<TaggedPosition<Position::XYZ>> TargetRollPitchYaw;
uint32 ScriptId = 0;
};
+15 -12
View File
@@ -633,20 +633,23 @@ void BaseEntity::BuildMovementUpdate(ByteBuffer& data, CreateObjectBits flags, P
data.FlushBits();
}
//if (flags.Room)
// data << ObjectGuid(HouseGUID);
if (flags.Room)
data << m_housingMovement.HouseGUID;
//if (flags.Decor)
// data << ObjectGuid(RoomGUID);
if (flags.Decor)
data << m_housingMovement.RoomGUID;
//if (flags.MeshObject)
//{
// data << ObjectGuid(AttachParentGUID);
// data << TaggedPosition<Position::XYZ>(PositionLocalSpace);
// data << QuaternionData(RotationLocalSpace);
// data << float(ScaleLocalSpace);
// data << uint8(AttachmentFlags);
//}
if (flags.MeshObject)
{
data << m_housingMovement.AttachParentGUID;
data << TaggedPosition<Position::XYZ>(m_housingMovement.PositionLocalSpace);
data << float(m_housingMovement.RotationLocalSpace.x);
data << float(m_housingMovement.RotationLocalSpace.y);
data << float(m_housingMovement.RotationLocalSpace.z);
data << float(m_housingMovement.RotationLocalSpace.w);
data << float(m_housingMovement.ScaleLocalSpace);
data << uint8(m_housingMovement.AttachmentFlags);
}
if (!PauseTimes.empty())
data.append(PauseTimes.data(), PauseTimes.size());
@@ -23,6 +23,9 @@
#include "UpdateFields.h"
#include "WowCSEntityDefinitions.h"
#include <unordered_map>
//WowCommunity
#include "Position.h"
//WowCommunity
class BaseEntity;
class Player;
@@ -31,6 +34,19 @@ class WorldPacket;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
//WowCommunity
struct HousingCreateObjectMovement
{
ObjectGuid HouseGUID;
ObjectGuid RoomGUID;
ObjectGuid AttachParentGUID;
TaggedPosition<Position::XYZ> PositionLocalSpace;
QuaternionData RotationLocalSpace;
float ScaleLocalSpace = 1.0f;
uint8 AttachmentFlags = 0;
};
//WowCommunity
struct CreateObjectBits
{
bool HasEntityPosition : 1;
@@ -212,6 +228,31 @@ class TC_GAME_API BaseEntity
virtual std::string GetDebugInfo() const;
//WowCommunity
void SetHousingRoomMovement(ObjectGuid const& houseGUID)
{
m_updateFlag.Room = true;
m_housingMovement.HouseGUID = houseGUID;
}
void SetHousingDecorMovement(ObjectGuid const& roomGUID)
{
m_updateFlag.Decor = true;
m_housingMovement.RoomGUID = roomGUID;
}
void SetHousingMeshMovement(ObjectGuid const& attachParentGUID, TaggedPosition<Position::XYZ> const& position,
QuaternionData const& rotation, float scale, uint8 attachmentFlags)
{
m_updateFlag.MeshObject = true;
m_housingMovement.AttachParentGUID = attachParentGUID;
m_housingMovement.PositionLocalSpace = position;
m_housingMovement.RotationLocalSpace = rotation;
m_housingMovement.ScaleLocalSpace = scale;
m_housingMovement.AttachmentFlags = attachmentFlags;
}
//WowCommunity
protected:
BaseEntity();
@@ -351,6 +392,9 @@ class TC_GAME_API BaseEntity
TypeID m_objectTypeId = NUM_CLIENT_OBJECT_TYPES;
CreateObjectBits m_updateFlag = {};
WowCS::EntityFragmentsHolder m_entityFragments;
//WowCommunity
HousingCreateObjectMovement m_housingMovement;
//WowCommunity
virtual bool AddToObjectUpdate() = 0;
virtual void RemoveFromObjectUpdate() = 0;
@@ -0,0 +1,662 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*/
#include "HousingDynamicEntity.h"
#include "DatabaseEnv.h"
#include "Map.h"
#include "PhasingHandler.h"
#include "Player.h"
#include "UpdateData.h"
#include <cmath>
#include <string_view>
namespace Housing
{
namespace
{
bool IsSafeHousingTransform(float positionX, float positionY, float positionZ,
float rotationX, float rotationY, float rotationZ, float rotationW, float scale)
{
if (!std::isfinite(positionX) || !std::isfinite(positionY) || !std::isfinite(positionZ) ||
!std::isfinite(rotationX) || !std::isfinite(rotationY) || !std::isfinite(rotationZ) ||
!std::isfinite(rotationW) || !std::isfinite(scale) || scale < 0.01f || scale > 100.0f)
return false;
float const rotationLengthSquared = rotationX * rotationX + rotationY * rotationY +
rotationZ * rotationZ + rotationW * rotationW;
return std::isfinite(rotationLengthSquared) && rotationLengthSquared > 0.000001f &&
rotationLengthSquared < 4.0f;
}
void QuarantineHousingEntity(std::string_view entityType, std::string const& entityGuid,
std::string_view reason)
{
CharacterDatabase.DirectPExecute(
"INSERT INTO housing_entity_quarantine (EntityType, EntityGuid, Reason, HitCount) "
"VALUES ('{}', '{}', '{}', 1) "
"ON DUPLICATE KEY UPDATE Reason = VALUES(Reason), HitCount = HitCount + 1, "
"LastSeenAt = CURRENT_TIMESTAMP",
entityType, entityGuid, reason);
}
}
DynamicEntity::DynamicEntity(Kind kind, ObjectGuid const& guid) : _kind(kind)
{
_Create(guid);
// Retail Housing/3 player-house CREATE blocks use the Housing entity type.
// Keep the other experimental entity kinds on their existing path while
// they remain quarantined from the client.
if (_kind == Kind::PlayerHouse)
m_objectTypeId = TYPEID_HOUSING_ENTITY;
else
{
m_objectTypeId = NUM_CLIENT_OBJECT_TYPES;
SetIsNewObject(true);
}
switch (_kind)
{
case Kind::PlayerHouse:
m_entityFragments.Add(WowCS::EntityFragment::FHousingPlayerHouse_C, false, &_playerHouse);
break;
case Kind::Room:
m_entityFragments.Remove(WowCS::EntityFragment::CGObject);
m_entityFragments.Add(WowCS::EntityFragment::FHousingRoom_C, false, &_room);
m_entityFragments.Add(WowCS::EntityFragment::FMirroredPositionData_C, false, &_roomMirroredPosition);
m_entityFragments.Add(WowCS::EntityFragment::Tag_HousingRoom, false);
break;
case Kind::Neighborhood:
m_entityFragments.Add(WowCS::EntityFragment::FNeighborhoodMirrorData_C, false, &_neighborhood);
break;
case Kind::Storage:
m_entityFragments.Add(WowCS::EntityFragment::FHousingStorage_C, false, &_storage);
break;
}
}
void DynamicEntity::InitializePlayerHouse(ObjectGuid const& bnetAccount, ObjectGuid const& cosmeticOwner,
int32 plotIndex, uint32 level, uint64 favor, ObjectGuid const& entityGuid)
{
ASSERT(_kind == Kind::PlayerHouse);
UF::MutableFieldReference<UF::HousingPlayerHouseData, false> fields(_playerHouse);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::BnetAccount), bnetAccount);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::CosmeticOwner), cosmeticOwner);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::PlotIndex), plotIndex);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::Level), level);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::Favor), favor);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::InteriorDecorPlacementBudget), uint32(910));
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::ExteriorDecorPlacementBudget), uint32(200));
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::ExteriorFixtureBudget), uint32(1000));
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::RoomPlacementBudget), uint32(19));
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingPlayerHouseData::EntityGUID), entityGuid);
}
void DynamicEntity::InitializeRoom(ObjectGuid const& houseGuid, int32 houseRoomId, int32 flags,
TaggedPosition<Position::XYZ> const& localPosition, QuaternionData const& localRotation,
float localScale, uint8 attachmentFlags)
{
ASSERT(_kind == Kind::Room);
UF::MutableFieldReference<UF::HousingRoomData, false> fields(_room);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::HouseGUID), houseGuid);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::HouseRoomID), houseRoomId);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::Flags), flags);
UF::MutableFieldReference<UF::MirroredPositionData, false> mirrored(_roomMirroredPosition);
auto position = mirrored.ModifyValue(&UF::MirroredPositionData::PositionData);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::AttachParentGUID), ObjectGuid::Empty);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::PositionLocalSpace),
TaggedPosition<Position::XYZ>(localPosition));
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::RotationLocalSpace), localRotation);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::ScaleLocalSpace), localScale);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::AttachmentFlags), attachmentFlags);
SetHousingRoomMovement(houseGuid);
}
void DynamicEntity::AddRoomMeshObject(ObjectGuid const& meshGuid)
{
ASSERT(_kind == Kind::Room);
UF::MutableFieldReference<UF::HousingRoomData, false> fields(_room);
AddDynamicUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::MeshObjects)) = meshGuid;
}
void DynamicEntity::InitializeNeighborhood(std::string const& name, ObjectGuid const& ownerGuid)
{
ASSERT(_kind == Kind::Neighborhood);
UF::MutableFieldReference<UF::NeighborhoodMirrorData, false> fields(_neighborhood);
SetUpdateFieldValue(fields.ModifyValue(&UF::NeighborhoodMirrorData::Name), name);
SetUpdateFieldValue(fields.ModifyValue(&UF::NeighborhoodMirrorData::OwnerGUID), ownerGuid);
}
void DynamicEntity::InitializeStorage(uint32 decorMaxOwnedCount)
{
ASSERT(_kind == Kind::Storage);
UF::MutableFieldReference<UF::HousingStorageData, false> fields(_storage);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingStorageData::DecorMaxOwnedCount), decorMaxOwnedCount);
}
void DynamicEntity::AddStorageDecor(ObjectGuid const& decorGuid, ObjectGuid const& houseGuid,
uint8 placementStatus, uint8 sourceType, std::string const& sourceValue)
{
ASSERT(_kind == Kind::Storage);
if (decorGuid.GetHigh() != HighGuid::Housing || decorGuid.GetSubType() != 1 ||
!decorGuid.GetEntry() || (!houseGuid.IsEmpty() && houseGuid.GetHigh() != HighGuid::Housing) ||
placementStatus > 2 || sourceType > 7 || sourceValue.size() > 255)
return;
UF::MutableFieldReference<UF::HousingStorageData, false> fields(_storage);
auto decor = fields.ModifyValue(&UF::HousingStorageData::Decor, decorGuid);
SetUpdateFieldValue(decor.ModifyValue(&UF::DecorStoragePersistedData::HouseGUID), houseGuid);
SetUpdateFieldValue(decor.ModifyValue(&UF::DecorStoragePersistedData::PlacementStatus), placementStatus);
SetUpdateFieldValue(decor.ModifyValue(&UF::DecorStoragePersistedData::SourceType), sourceType);
SetUpdateFieldValue(decor.ModifyValue(&UF::DecorStoragePersistedData::SourceValue), sourceValue);
}
void SendPlayerHouseCreate(Player* player, ObjectGuid const& houseGuid, ObjectGuid const& bnetAccount,
ObjectGuid const& cosmeticOwner, int32 plotIndex, uint32 level, uint64 favor)
{
if (!player || houseGuid.IsEmpty())
return;
DynamicEntity entity(DynamicEntity::Kind::PlayerHouse, houseGuid);
entity.InitializePlayerHouse(bnetAccount, cosmeticOwner, plotIndex, level, favor, ObjectGuid::Empty);
entity.AddToWorld();
entity.SendUpdateToPlayer(player);
entity.RemoveFromWorld();
}
void SendHousingStorageCreate(Player* player, ObjectGuid const& bnetAccount, uint32 decorMaxOwnedCount,
std::vector<StorageDecorEntry> const& decorEntries)
{
if (!player || bnetAccount.IsEmpty())
return;
// Captured 12.1 traffic creates FHousingStorage_C on the Battle.net account
// object itself, not on a synthetic Housing GUID.
DynamicEntity entity(DynamicEntity::Kind::Storage, bnetAccount);
entity.InitializeStorage(decorMaxOwnedCount);
for (StorageDecorEntry const& decor : decorEntries)
entity.AddStorageDecor(decor.DecorGuid, decor.HouseGuid, decor.PlacementStatus,
decor.SourceType, decor.SourceValue);
entity.AddToWorld();
entity.SendUpdateToPlayer(player);
entity.RemoveFromWorld();
}
RoomWorldEntity::RoomWorldEntity(ObjectGuid const& guid) : WorldObject(false)
{
_Create(guid);
m_objectTypeId = TYPEID_HOUSING_ENTITY;
m_updateFlag.HasEntityPosition = true;
m_updateFlag.Stationary = true;
SetIsNewObject(true);
m_entityFragments.Add(WowCS::EntityFragment::FHousingRoom_C, false, &_room);
m_entityFragments.Add(WowCS::EntityFragment::FMirroredPositionData_C, false, &_mirroredPosition);
m_entityFragments.Add(WowCS::EntityFragment::Tag_HousingRoom, false);
}
bool RoomWorldEntity::AttachToMap(Map* map, Position const& worldPosition)
{
if (!map)
return false;
SetMap(map);
Relocate(worldPosition);
SetObjectScale(1.0f);
if (!IsPositionValid())
return false;
PhasingHandler::InitDbPhaseShift(GetPhaseShift(), 0, 0, 0);
SetZoneScript();
UpdatePositionData();
return true;
}
void RoomWorldEntity::AddToWorld()
{
if (!IsInWorld())
{
GetMap()->GetObjectsStore().Insert<RoomWorldEntity>(this);
WorldObject::AddToWorld();
}
}
void RoomWorldEntity::RemoveFromWorld()
{
if (IsInWorld())
{
WorldObject::RemoveFromWorld();
GetMap()->GetObjectsStore().Remove<RoomWorldEntity>(this);
}
}
void RoomWorldEntity::Update(uint32 diff)
{
WorldObject::Update(diff);
}
void RoomWorldEntity::InitializeRoom(ObjectGuid const& houseGuid, int32 houseRoomId, int32 flags,
TaggedPosition<Position::XYZ> const& localPosition, QuaternionData const& localRotation,
float localScale, uint8 attachmentFlags)
{
UF::MutableFieldReference<UF::HousingRoomData, false> fields(_room);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::HouseGUID), houseGuid);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::HouseRoomID), houseRoomId);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::Flags), flags);
UF::MutableFieldReference<UF::MirroredPositionData, false> mirrored(_mirroredPosition);
auto position = mirrored.ModifyValue(&UF::MirroredPositionData::PositionData);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::AttachParentGUID), ObjectGuid::Empty);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::PositionLocalSpace), localPosition);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::RotationLocalSpace), localRotation);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::ScaleLocalSpace), localScale);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::AttachmentFlags), attachmentFlags);
SetHousingRoomMovement(houseGuid);
}
void RoomWorldEntity::AddRoomMeshObject(ObjectGuid const& meshGuid)
{
UF::MutableFieldReference<UF::HousingRoomData, false> fields(_room);
AddDynamicUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomData::MeshObjects)) = meshGuid;
}
void RoomWorldEntity::ClearValuesChangesMask()
{
_room.ClearChangesMask();
_mirroredPosition.ClearChangesMask();
Object::ClearValuesChangesMask();
}
void RoomWorldEntity::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
{
if (!target)
return;
ByteBuffer& buffer = data->GetBuffer();
buffer << uint8(UPDATETYPE_CREATE_OBJECT);
buffer << GetGUID();
buffer << uint8(m_objectTypeId);
BuildMovementUpdate(buffer, m_updateFlag, target);
UF::UpdateFieldFlag fieldFlags = GetUpdateFieldFlagsFor(target);
std::size_t sizePosition = buffer.wpos();
buffer << uint32(0);
buffer << uint8(fieldFlags);
std::span<WowCS::EntityFragment const> fragments = m_entityFragments.GetIds();
buffer.append(fragments.data(), fragments.size());
buffer << uint8(WowCS::EntityFragment::End);
for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
{
WowCS::EntityFragment fragmentId = m_entityFragments.Updateable.Ids[i];
if (WowCS::IsIndirectFragment(fragmentId))
buffer << uint8(1);
WowCS::EntityFragmentInfo->SerializeCreate[static_cast<std::size_t>(fragmentId)](
m_entityFragments.Updateable.Data[i], fieldFlags, buffer, target, this);
}
buffer.put<uint32>(sizePosition, buffer.wpos() - sizePosition - 4);
data->AddUpdateBlock();
}
DynamicWorldEntity::DynamicWorldEntity(Kind kind, ObjectGuid const& guid) : WorldObject(false), _kind(kind)
{
_Create(guid);
m_objectTypeId = TYPEID_MESH_OBJECT;
m_updateFlag.MeshObject = true;
SetIsNewObject(true);
m_entityFragments.Add(WowCS::EntityFragment::FMeshObjectData_C, false, &_mesh);
m_entityFragments.Add(WowCS::EntityFragment::FMirroredPositionData_C, false, &_mirroredPosition);
m_entityFragments.Add(WowCS::EntityFragment::Tag_MeshObject, false);
switch (_kind)
{
case Kind::Fixture:
m_entityFragments.Add(WowCS::EntityFragment::FHousingFixture_C, false, &_fixture);
m_entityFragments.Add(WowCS::EntityFragment::Tag_HouseExteriorPiece, false);
break;
case Kind::RoomComponentMesh:
m_entityFragments.Add(WowCS::EntityFragment::FHousingRoomComponentMesh_C, false, &_roomComponent);
break;
case Kind::Decor:
m_entityFragments.Add(WowCS::EntityFragment::FHousingDecor_C, false, &_decor);
break;
}
}
bool DynamicWorldEntity::AttachToMap(Map* map, Position const& worldPosition)
{
if (!map)
return false;
SetMap(map);
Relocate(worldPosition);
if (!IsPositionValid())
return false;
PhasingHandler::InitDbPhaseShift(GetPhaseShift(), 0, 0, 0);
SetZoneScript();
UpdatePositionData();
return true;
}
void DynamicWorldEntity::AddToWorld()
{
if (!IsInWorld())
{
GetMap()->GetObjectsStore().Insert<DynamicWorldEntity>(this);
WorldObject::AddToWorld();
}
}
void DynamicWorldEntity::RemoveFromWorld()
{
if (IsInWorld())
{
WorldObject::RemoveFromWorld();
GetMap()->GetObjectsStore().Remove<DynamicWorldEntity>(this);
}
}
void DynamicWorldEntity::Update(uint32 diff)
{
WorldObject::Update(diff);
}
void DynamicWorldEntity::InitializeMesh(uint32 fileDataID, bool isWmo, bool isRoom,
ObjectGuid const& attachParent, TaggedPosition<Position::XYZ> const& localPosition,
QuaternionData const& localRotation, float localScale, uint8 attachmentFlags)
{
SetEntry(fileDataID);
SetObjectScale(1.0f);
UF::MutableFieldReference<UF::MeshObjectData, false> mesh(_mesh);
SetUpdateFieldValue(mesh.ModifyValue(&UF::MeshObjectData::IsWMO), isWmo);
SetUpdateFieldValue(mesh.ModifyValue(&UF::MeshObjectData::IsRoom), isRoom);
SetUpdateFieldValue(mesh.ModifyValue(&UF::MeshObjectData::FileDataID), int32(fileDataID));
UF::MutableFieldReference<UF::MirroredPositionData, false> mirrored(_mirroredPosition);
auto position = mirrored.ModifyValue(&UF::MirroredPositionData::PositionData);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::AttachParentGUID), attachParent);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::PositionLocalSpace),
TaggedPosition<Position::XYZ>(localPosition));
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::RotationLocalSpace), localRotation);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::ScaleLocalSpace), localScale);
SetUpdateFieldValue(position.ModifyValue(&UF::MirroredMeshObjectData::AttachmentFlags), attachmentFlags);
SetHousingMeshMovement(attachParent, localPosition, localRotation, localScale, attachmentFlags);
}
void DynamicWorldEntity::InitializeFixture(ObjectGuid const& houseGuid, int32 exteriorComponentID,
int32 houseExteriorWmoDataID, int32 hookID, uint8 componentType, uint8 size)
{
ASSERT(_kind == Kind::Fixture);
UF::MutableFieldReference<UF::HousingFixtureData, false> fields(_fixture);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::ExteriorComponentID), exteriorComponentID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::HouseExteriorWmoDataID), houseExteriorWmoDataID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::ExteriorComponentHookID), hookID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::HouseGUID), houseGuid);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::AttachParentGUID), m_housingMovement.AttachParentGUID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::Guid), GetGUID());
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::GameObjectGUID), ObjectGuid::Empty);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::ExteriorComponentType), componentType);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::Field_59), uint8(1));
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingFixtureData::Size), size);
}
void DynamicWorldEntity::InitializeRoomComponent(ObjectGuid const& roomGuid, int32 optionID,
int32 componentID, uint8 componentType, int32 houseThemeID, int32 textureID, int32 typeParam)
{
ASSERT(_kind == Kind::RoomComponentMesh);
UF::MutableFieldReference<UF::HousingRoomComponentMeshData, false> fields(_roomComponent);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::RoomGUID), roomGuid);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::RoomComponentOptionID), optionID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::RoomComponentID), componentID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::RoomComponentType), componentType);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::HouseThemeID), houseThemeID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::RoomComponentTextureID), textureID);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingRoomComponentMeshData::RoomComponentTypeParam), typeParam);
}
void DynamicWorldEntity::InitializeDecor(ObjectGuid const& decorGuid, ObjectGuid const& roomGuid,
ObjectGuid const& attachParentGuid, uint8 flags)
{
ASSERT(_kind == Kind::Decor);
UF::MutableFieldReference<UF::HousingDecorData, false> fields(_decor);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingDecorData::DecorGUID), decorGuid);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingDecorData::AttachParentGUID), attachParentGuid);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingDecorData::Flags), flags);
SetUpdateFieldValue(fields.ModifyValue(&UF::HousingDecorData::TargetGameObjectGUID), ObjectGuid::Empty);
SetHousingDecorMovement(roomGuid);
}
void DynamicWorldEntity::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
{
if (!target)
return;
ByteBuffer& buffer = data->GetBuffer();
buffer << uint8(UPDATETYPE_CREATE_OBJECT);
buffer << GetGUID();
buffer << uint8(m_objectTypeId);
BuildMovementUpdate(buffer, m_updateFlag, target);
UF::UpdateFieldFlag fieldFlags = GetUpdateFieldFlagsFor(target);
std::size_t sizePosition = buffer.wpos();
buffer << uint32(0);
buffer << uint8(fieldFlags);
std::span<WowCS::EntityFragment const> fragments = m_entityFragments.GetIds();
buffer.append(fragments.data(), fragments.size());
buffer << uint8(WowCS::EntityFragment::End);
for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
{
WowCS::EntityFragment fragmentId = m_entityFragments.Updateable.Ids[i];
if (WowCS::IsIndirectFragment(fragmentId))
buffer << uint8(1);
WowCS::EntityFragmentInfo->SerializeCreate[static_cast<std::size_t>(fragmentId)](
m_entityFragments.Updateable.Data[i], fieldFlags, buffer, target, this);
}
buffer.put<uint32>(sizePosition, buffer.wpos() - sizePosition - 4);
data->AddUpdateBlock();
}
void DynamicWorldEntity::BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const
{
m_objectData->WriteCreate(flags, data, target, this);
}
void DynamicWorldEntity::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const
{
m_objectData->WriteUpdate(flags, data, target, this);
}
void DynamicWorldEntity::ClearValuesChangesMask()
{
Object::ClearValuesChangesMask();
}
void SendHouseDynamicEntities(Player* player, ObjectGuid const& houseGuid, uint8 plotId)
{
if (!player || houseGuid.IsEmpty())
return;
// The house list can also be requested from ordinary world maps. Dynamic
// mesh entities are meaningful only after the plot map transfer completed.
QueryResult plot = CharacterDatabase.PQuery(
"SELECT ExteriorMapID FROM housing_plot_template WHERE PlotID = {} AND ExteriorMapID = {} "
"ORDER BY VerifiedBuild DESC LIMIT 1", uint32(plotId), player->GetMapId());
if (!plot)
return;
std::string const escapedHouseGuid = houseGuid.ToString();
QueryResult rooms = CharacterDatabase.PQuery(
"SELECT RoomGuid, HouseRoomID, Flags, PositionX, PositionY, PositionZ, "
"RotationX, RotationY, RotationZ, RotationW, Scale, AttachmentFlags FROM housing_room_entity "
"WHERE HouseGuid = '{}' ORDER BY HouseRoomID, RoomGuid", escapedHouseGuid);
if (rooms)
{
do
{
Field* fields = rooms->Fetch();
ObjectGuid const roomGuid = ObjectGuid::FromString(fields[0].GetString());
if (roomGuid.GetHigh() != HighGuid::Housing ||
!IsSafeHousingTransform(fields[3].GetFloat(), fields[4].GetFloat(), fields[5].GetFloat(),
fields[6].GetFloat(), fields[7].GetFloat(), fields[8].GetFloat(), fields[9].GetFloat(),
fields[10].GetFloat()))
{
QuarantineHousingEntity("room", fields[0].GetString(), "invalid-guid-or-transform");
continue;
}
if (player->GetMap()->GetHousingRoomEntity(roomGuid))
continue;
RoomWorldEntity* room = new RoomWorldEntity(roomGuid);
room->InitializeRoom(houseGuid, fields[1].GetInt32(), fields[2].GetInt32(),
{ fields[3].GetFloat(), fields[4].GetFloat(), fields[5].GetFloat() },
{ fields[6].GetFloat(), fields[7].GetFloat(), fields[8].GetFloat(), fields[9].GetFloat() },
fields[10].GetFloat(), fields[11].GetUInt8());
QueryResult roomMeshes = CharacterDatabase.PQuery(
"SELECT EntityGuid FROM housing_room_component_entity WHERE HouseGuid = '{}' "
"AND RoomGuid = '{}' ORDER BY EntityGuid", escapedHouseGuid, fields[0].GetString());
if (roomMeshes)
{
do
{
ObjectGuid const meshGuid = ObjectGuid::FromString(roomMeshes->Fetch()[0].GetString());
if (meshGuid.GetHigh() == HighGuid::MeshObject)
room->AddRoomMeshObject(meshGuid);
} while (roomMeshes->NextRow());
}
if (!room->AttachToMap(player->GetMap(), *player) || !player->GetMap()->AddToMap(room))
delete room;
} while (rooms->NextRow());
}
QueryResult components = CharacterDatabase.PQuery(
"SELECT EntityGuid, RoomGuid, FileDataID, IsWMO, IsRoom, AttachParentGuid, "
"PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Scale, "
"AttachmentFlags, RoomComponentOptionID, RoomComponentID, RoomComponentType, "
"HouseThemeID, RoomComponentTextureID, RoomComponentTypeParam "
"FROM housing_room_component_entity WHERE HouseGuid = '{}' ORDER BY RoomGuid, EntityGuid",
escapedHouseGuid);
if (components)
{
do
{
Field* fields = components->Fetch();
ObjectGuid const entityGuid = ObjectGuid::FromString(fields[0].GetString());
ObjectGuid const roomGuid = ObjectGuid::FromString(fields[1].GetString());
ObjectGuid const parentGuid = ObjectGuid::FromString(fields[5].GetString());
if (entityGuid.GetHigh() != HighGuid::MeshObject || roomGuid.GetHigh() != HighGuid::Housing ||
!fields[2].GetUInt32() ||
!IsSafeHousingTransform(fields[6].GetFloat(), fields[7].GetFloat(), fields[8].GetFloat(),
fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat(), fields[12].GetFloat(),
fields[13].GetFloat()))
{
QuarantineHousingEntity("room-component", fields[0].GetString(), "invalid-guid-file-or-transform");
continue;
}
if (player->GetMap()->GetHousingDynamicEntity(entityGuid))
continue;
DynamicWorldEntity* entity = new DynamicWorldEntity(DynamicWorldEntity::Kind::RoomComponentMesh, entityGuid);
entity->InitializeMesh(fields[2].GetUInt32(), fields[3].GetUInt8() != 0, fields[4].GetUInt8() != 0,
parentGuid, { fields[6].GetFloat(), fields[7].GetFloat(), fields[8].GetFloat() },
{ fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat(), fields[12].GetFloat() },
fields[13].GetFloat(), fields[14].GetUInt8());
entity->InitializeRoomComponent(roomGuid, fields[15].GetInt32(), fields[16].GetInt32(),
fields[17].GetUInt8(), fields[18].GetInt32(), fields[19].GetInt32(), fields[20].GetInt32());
if (!entity->AttachToMap(player->GetMap(), *player) || !player->GetMap()->AddToMap(entity))
delete entity;
} while (components->NextRow());
}
QueryResult fixtures = CharacterDatabase.PQuery(
"SELECT EntityGuid, FileDataID, IsWMO, IsRoom, AttachParentGuid, "
"PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Scale, "
"AttachmentFlags, ExteriorComponentID, HouseExteriorWmoDataID, ExteriorComponentHookID, "
"ExteriorComponentType, Size FROM housing_fixture_entity "
"WHERE HouseGuid = '{}' ORDER BY EntityGuid", escapedHouseGuid);
if (fixtures)
{
do
{
Field* fields = fixtures->Fetch();
ObjectGuid const entityGuid = ObjectGuid::FromString(fields[0].GetString());
ObjectGuid const parentGuid = ObjectGuid::FromString(fields[4].GetString());
if (entityGuid.GetHigh() != HighGuid::MeshObject || !fields[1].GetUInt32() ||
!IsSafeHousingTransform(fields[5].GetFloat(), fields[6].GetFloat(), fields[7].GetFloat(),
fields[8].GetFloat(), fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat(),
fields[12].GetFloat()))
{
QuarantineHousingEntity("fixture", fields[0].GetString(), "invalid-guid-file-or-transform");
continue;
}
if (player->GetMap()->GetHousingDynamicEntity(entityGuid))
continue;
DynamicWorldEntity* entity = new DynamicWorldEntity(DynamicWorldEntity::Kind::Fixture, entityGuid);
entity->InitializeMesh(fields[1].GetUInt32(), fields[2].GetUInt8() != 0, fields[3].GetUInt8() != 0,
parentGuid, { fields[5].GetFloat(), fields[6].GetFloat(), fields[7].GetFloat() },
{ fields[8].GetFloat(), fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat() },
fields[12].GetFloat(), fields[13].GetUInt8());
entity->InitializeFixture(houseGuid, fields[14].GetInt32(), fields[15].GetInt32(),
fields[16].GetInt32(), fields[17].GetUInt8(), fields[18].GetUInt8());
if (!entity->AttachToMap(player->GetMap(), *player) || !player->GetMap()->AddToMap(entity))
delete entity;
} while (fixtures->NextRow());
}
QueryResult decor = CharacterDatabase.PQuery(
"SELECT EntityGuid, DecorGuid, RoomGuid, FileDataID, IsWMO, IsRoom, AttachParentGuid, "
"PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Scale, "
"AttachmentFlags, Flags FROM housing_placed_decor "
"WHERE HouseGuid = '{}' AND EntityGuid IS NOT NULL ORDER BY DecorGuid", escapedHouseGuid);
if (decor)
{
do
{
Field* fields = decor->Fetch();
ObjectGuid const entityGuid = ObjectGuid::FromString(fields[0].GetString());
ObjectGuid const decorGuid = ObjectGuid::FromString(fields[1].GetString());
ObjectGuid const roomGuid = ObjectGuid::FromString(fields[2].GetString());
ObjectGuid const parentGuid = ObjectGuid::FromString(fields[6].GetString());
if (entityGuid.GetHigh() != HighGuid::MeshObject || decorGuid.GetHigh() != HighGuid::Housing ||
!fields[3].GetUInt32() ||
!IsSafeHousingTransform(fields[7].GetFloat(), fields[8].GetFloat(), fields[9].GetFloat(),
fields[10].GetFloat(), fields[11].GetFloat(), fields[12].GetFloat(), fields[13].GetFloat(),
fields[14].GetFloat()))
{
QuarantineHousingEntity("decor", fields[0].GetString(), "invalid-guid-file-or-transform");
continue;
}
if (player->GetMap()->GetHousingDynamicEntity(entityGuid))
continue;
DynamicWorldEntity* entity = new DynamicWorldEntity(DynamicWorldEntity::Kind::Decor, entityGuid);
entity->InitializeMesh(fields[3].GetUInt32(), fields[4].GetUInt8() != 0, fields[5].GetUInt8() != 0,
parentGuid, { fields[7].GetFloat(), fields[8].GetFloat(), fields[9].GetFloat() },
{ fields[10].GetFloat(), fields[11].GetFloat(), fields[12].GetFloat(), fields[13].GetFloat() },
fields[14].GetFloat(), fields[15].GetUInt8());
entity->InitializeDecor(decorGuid, roomGuid, parentGuid, fields[16].GetUInt8());
if (!entity->AttachToMap(player->GetMap(), *player) || !player->GetMap()->AddToMap(entity))
delete entity;
} while (decor->NextRow());
}
}
}
@@ -0,0 +1,157 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*/
#ifndef TRINITYCORE_HOUSING_DYNAMIC_ENTITY_H
#define TRINITYCORE_HOUSING_DYNAMIC_ENTITY_H
#include "BaseEntity.h"
#include "GridObject.h"
#include "MapObject.h"
#include "Object.h"
#include <string>
#include <vector>
class Map;
class Player;
namespace Housing
{
class TC_GAME_API DynamicEntity final : public BaseEntity
{
public:
enum class Kind : uint8
{
PlayerHouse,
Room,
Neighborhood,
Storage
};
DynamicEntity(Kind kind, ObjectGuid const& guid);
void InitializePlayerHouse(ObjectGuid const& bnetAccount, ObjectGuid const& cosmeticOwner,
int32 plotIndex, uint32 level, uint64 favor, ObjectGuid const& entityGuid);
void InitializeRoom(ObjectGuid const& houseGuid, int32 houseRoomId, int32 flags,
TaggedPosition<Position::XYZ> const& localPosition, QuaternionData const& localRotation,
float localScale, uint8 attachmentFlags);
void AddRoomMeshObject(ObjectGuid const& meshGuid);
void InitializeNeighborhood(std::string const& name, ObjectGuid const& ownerGuid);
void InitializeStorage(uint32 decorMaxOwnedCount);
void AddStorageDecor(ObjectGuid const& decorGuid, ObjectGuid const& houseGuid,
uint8 placementStatus, uint8 sourceType, std::string const& sourceValue);
std::string GetNameForLocaleIdx(LocaleConstant /*locale*/) const override { return "HousingDynamicEntity"; }
private:
bool AddToObjectUpdate() override { return false; }
void RemoveFromObjectUpdate() override {}
Kind _kind;
UF::HousingPlayerHouseData _playerHouse;
UF::HousingRoomData _room;
UF::MirroredPositionData _roomMirroredPosition;
UF::NeighborhoodMirrorData _neighborhood;
UF::HousingStorageData _storage;
};
class TC_GAME_API RoomWorldEntity final : public WorldObject, public GridObject<RoomWorldEntity>, public MapObject
{
public:
explicit RoomWorldEntity(ObjectGuid const& guid);
~RoomWorldEntity() override = default;
bool AttachToMap(Map* map, Position const& worldPosition);
void AddToWorld() override;
void RemoveFromWorld() override;
void Update(uint32 diff) override;
std::string GetNameForLocaleIdx(LocaleConstant /*locale*/) const override { return "HousingRoomWorldEntity"; }
void InitializeRoom(ObjectGuid const& houseGuid, int32 houseRoomId, int32 flags,
TaggedPosition<Position::XYZ> const& localPosition, QuaternionData const& localRotation,
float localScale, uint8 attachmentFlags);
void AddRoomMeshObject(ObjectGuid const& meshGuid);
ObjectGuid GetCreatorGUID() const override { return ObjectGuid::Empty; }
ObjectGuid GetOwnerGUID() const override { return ObjectGuid::Empty; }
uint32 GetFaction() const override { return 0; }
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
private:
void BuildValuesCreate(UF::UpdateFieldFlag /*flags*/, ByteBuffer& /*data*/, Player const* /*target*/) const override {}
void BuildValuesUpdate(UF::UpdateFieldFlag /*flags*/, ByteBuffer& /*data*/, Player const* /*target*/) const override {}
void ClearValuesChangesMask() override;
UF::HousingRoomData _room;
UF::MirroredPositionData _mirroredPosition;
};
class TC_GAME_API DynamicWorldEntity final : public WorldObject, public GridObject<DynamicWorldEntity>, public MapObject
{
public:
enum class Kind : uint8
{
Fixture,
RoomComponentMesh,
Decor
};
DynamicWorldEntity(Kind kind, ObjectGuid const& guid);
~DynamicWorldEntity() override = default;
bool AttachToMap(Map* map, Position const& worldPosition);
void AddToWorld() override;
void RemoveFromWorld() override;
void Update(uint32 diff) override;
std::string GetNameForLocaleIdx(LocaleConstant /*locale*/) const override { return "HousingDynamicWorldEntity"; }
void InitializeMesh(uint32 fileDataID, bool isWmo, bool isRoom, ObjectGuid const& attachParent,
TaggedPosition<Position::XYZ> const& localPosition, QuaternionData const& localRotation, float localScale,
uint8 attachmentFlags);
void InitializeFixture(ObjectGuid const& houseGuid, int32 exteriorComponentID,
int32 houseExteriorWmoDataID, int32 hookID, uint8 componentType, uint8 size);
void InitializeRoomComponent(ObjectGuid const& roomGuid, int32 optionID, int32 componentID,
uint8 componentType, int32 houseThemeID, int32 textureID, int32 typeParam);
void InitializeDecor(ObjectGuid const& decorGuid, ObjectGuid const& roomGuid,
ObjectGuid const& attachParentGuid, uint8 flags);
ObjectGuid GetCreatorGUID() const override { return ObjectGuid::Empty; }
ObjectGuid GetOwnerGUID() const override { return ObjectGuid::Empty; }
uint32 GetFaction() const override { return 0; }
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
private:
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void ClearValuesChangesMask() override;
Kind _kind;
UF::MeshObjectData _mesh;
UF::MirroredPositionData _mirroredPosition;
UF::HousingFixtureData _fixture;
UF::HousingRoomComponentMeshData _roomComponent;
UF::HousingDecorData _decor;
};
TC_GAME_API void SendPlayerHouseCreate(Player* player, ObjectGuid const& houseGuid,
ObjectGuid const& bnetAccount, ObjectGuid const& cosmeticOwner, int32 plotIndex,
uint32 level, uint64 favor);
struct StorageDecorEntry
{
ObjectGuid DecorGuid;
ObjectGuid HouseGuid;
uint8 PlacementStatus = 0;
uint8 SourceType = 0;
std::string SourceValue;
};
// Retail attaches FHousingStorage_C directly to the Battle.net account object.
TC_GAME_API void SendHousingStorageCreate(Player* player, ObjectGuid const& bnetAccount,
uint32 decorMaxOwnedCount, std::vector<StorageDecorEntry> const& decorEntries);
// Sends the persisted room -> component/fixture/decor graph after map transfer.
TC_GAME_API void SendHouseDynamicEntities(Player* player, ObjectGuid const& houseGuid, uint8 plotId);
}
#endif
+5 -2
View File
@@ -54,7 +54,9 @@ enum TypeID : uint8
TYPEID_SCENARIO = 16,
TYPEID_LOOT_OBJECT = 17,
NUM_CLIENT_OBJECT_TYPES
NUM_CLIENT_OBJECT_TYPES,
TYPEID_HOUSING_ENTITY = 18
};
enum TypeMask
@@ -77,9 +79,10 @@ enum TypeMask
TYPEMASK_AI_GROUP = 1 << TYPEID_AI_GROUP,
TYPEMASK_SCENARIO = 1 << TYPEID_SCENARIO,
TYPEMASK_LOOT_OBJECT = 1 << TYPEID_LOOT_OBJECT,
TYPEMASK_HOUSING_ENTITY = 1 << TYPEID_HOUSING_ENTITY,
TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_PLAYER | TYPEMASK_DYNAMICOBJECT,
TYPEMASK_WORLDOBJECT = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT | TYPEMASK_CORPSE | TYPEMASK_AREATRIGGER | TYPEMASK_SCENEOBJECT | TYPEMASK_CONVERSATION | TYPEMASK_MESH_OBJECT
TYPEMASK_WORLDOBJECT = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT | TYPEMASK_CORPSE | TYPEMASK_AREATRIGGER | TYPEMASK_SCENEOBJECT | TYPEMASK_CONVERSATION | TYPEMASK_MESH_OBJECT | TYPEMASK_HOUSING_ENTITY
};
inline constexpr std::array<uint32, NUM_CLIENT_OBJECT_TYPES + 1> ObjectTypeMask =
+14 -5
View File
@@ -150,12 +150,14 @@
#include <sstream>
//WowCommunity
#include "Config.h"
#include "MythicPlusData.h"
#include "PerksProgramMgr.h"
#include "DelvesCompanion.h"
#include "DelvesDefines.h"
#include "DelvesRewards.h"
#include "GarrisonPackets.h"
#include "HousingDynamicEntity.h"
#include "MythicPlusPacketsCommon.h"
#include "ArchaeologyMgr.h"
#include "ElapsedTimerMgr.h"
@@ -25167,6 +25169,9 @@ void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
case TYPEID_CONVERSATION:
UpdateVisibilityOf(target->ToConversation(), udata, newVisibleObjects);
break;
case TYPEID_MESH_OBJECT:
UpdateVisibilityOf(static_cast<Housing::DynamicWorldEntity*>(target), udata, newVisibleObjects);
break;
default:
break;
}
@@ -25352,6 +25357,7 @@ template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data
template void Player::UpdateVisibilityOf(AreaTrigger* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(SceneObject* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(Conversation* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(Housing::DynamicWorldEntity* target, UpdateData& data, std::set<WorldObject*>& visibleNow);
void Player::UpdateObjectVisibility(bool forced)
{
@@ -31360,7 +31366,8 @@ SpellInfo const* Player::GetCastSpellInfo(SpellInfo const* spellInfo, TriggerCas
for (uint32 spellId : overrides->second)
if (context->AddSpell(spellId))
if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()))
return GetCastSpellInfo(newInfo, triggerFlag, context);
if (!newInfo->IsPassive())
return GetCastSpellInfo(newInfo, triggerFlag, context);
return Unit::GetCastSpellInfo(spellInfo, triggerFlag, context);
}
@@ -32320,6 +32327,12 @@ void Player::ExecutePendingSpellCastRequest()
// check known spell or raid marker spell (which not requires player to know it)
SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(_pendingSpellCastRequest->CastRequest.SpellID, GetMap()->GetDifficultyID());
// Check possible spell cast overrides (must be before HasActiveSpell check so override spells pass the known spell check)
auto [overrideSpellInfo, overrideTriggerFlag] = castingUnit->GetCastSpellInfo(spellInfo);
spellInfo = overrideSpellInfo;
triggerFlag |= overrideTriggerFlag;
Player* plrCaster = castingUnit->ToPlayer();
if (plrCaster && !plrCaster->HasActiveSpell(spellInfo->Id) && !spellInfo->HasAttribute(SPELL_ATTR8_SKIP_IS_KNOWN_CHECK))
{
@@ -32344,10 +32357,6 @@ void Player::ExecutePendingSpellCastRequest()
}
}
// Check possible spell cast overrides
auto [overrideSpellInfo, overrideTriggerFlag] = castingUnit->GetCastSpellInfo(spellInfo);
spellInfo = overrideSpellInfo;
triggerFlag |= overrideTriggerFlag;
if (spellInfo->IsPassive())
{
CancelPendingCastRequest();
@@ -199,3 +199,19 @@ void SceneObject::ClearValuesChangesMask()
m_values.ClearChangesMask(&SceneObject::m_sceneObjectData);
WorldObject::ClearValuesChangesMask();
}
//WowCommunity
SceneObject* SceneObject::CreatePetBattleSceneObject(Unit* creator, Position const& pos, ObjectGuid privateObjectOwner)
{
ObjectGuid::LowType lowGuid = creator->GetMap()->GenerateLowGuid<HighGuid::SceneObject>();
SceneObject* sceneObject = new SceneObject();
if (!sceneObject->Create(lowGuid, SceneType::PetBattle, /*sceneId*/ 0, /*scriptPackageId*/ 0, creator->GetMap(), creator, pos, privateObjectOwner))
{
delete sceneObject;
return nullptr;
}
return sceneObject;
}
@@ -63,6 +63,9 @@ public:
void Remove();
static SceneObject* CreateSceneObject(uint32 sceneId, Unit* creator, Position const& pos, ObjectGuid privateObjectOwner);
//WowCommunity
static SceneObject* CreatePetBattleSceneObject(Unit* creator, Position const& pos, ObjectGuid privateObjectOwner);
//WowCommunity
bool Create(ObjectGuid::LowType lowGuid, SceneType type, uint32 sceneId, uint32 scriptPackageId, Map* map, Unit* creator,
Position const& pos, ObjectGuid privateObjectOwner);
@@ -170,14 +170,18 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
if (QueryResult areatriggerCreateProperties = WorldDatabase.Query("SELECT Id, IsCustom, AreaTriggerId, IsAreatriggerCustom, Flags, "
"MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, SpellForVisuals, TimeToTargetScale, Speed, SpeedIsTime, "
"Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5, ShapeData6, ShapeData7, ScriptName FROM `areatrigger_create_properties`"))
"Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5, ShapeData6, ShapeData7, "
"Roll, Pitch, Yaw, TargetRoll, TargetPitch, TargetYaw, ScriptName FROM `areatrigger_create_properties`"))
{
do
{
DEFINE_FIELD_ACCESSOR_CACHE_ANONYMOUS(ResultSet, (Id)(IsCustom)(AreaTriggerId)(IsAreatriggerCustom)(Flags)
(MoveCurveId)(ScaleCurveId)(MorphCurveId)(FacingCurveId)(AnimId)(AnimKitId)(DecalPropertiesId)(SpellForVisuals)(TimeToTargetScale)(Speed)(SpeedIsTime)
(Shape)(ShapeData0)(ShapeData1)(ShapeData2)(ShapeData3)(ShapeData4)(ShapeData5)(ShapeData6)(ShapeData7)(ScriptName)
) fields { *areatriggerCreateProperties };
(Shape)(ShapeData0)(ShapeData1)(ShapeData2)(ShapeData3)(ShapeData4)(ShapeData5)(ShapeData6)(ShapeData7)
(Roll)(Pitch)(Yaw)(TargetRoll)(TargetPitch)(TargetYaw)(ScriptName)
) fields {
*areatriggerCreateProperties
};
AreaTriggerCreatePropertiesId createPropertiesId = { fields.Id().GetUInt32(), fields.IsCustom().GetBool() };
@@ -288,6 +292,31 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
break;
}
createProperties.RollPitchYaw.Pos.Relocate(
Position::NormalizeOrientation(fields.Roll().GetFloat()),
Position::NormalizeOrientation(fields.Pitch().GetFloat()),
Position::NormalizeOrientation(fields.Yaw().GetFloat()));
std::array<Optional<float>, 3> targetRollPitchYaw =
{
fields.TargetRoll().GetFloatOrNull(),
fields.TargetPitch().GetFloatOrNull(),
fields.TargetYaw().GetFloatOrNull()
};
if (std::ptrdiff_t trpyFields = std::ranges::count_if(targetRollPitchYaw, [](Optional<float> const& angle) { return angle.has_value(); }); trpyFields == 3)
{
createProperties.TargetRollPitchYaw.emplace(
Position::NormalizeOrientation(*targetRollPitchYaw[0]),
Position::NormalizeOrientation(*targetRollPitchYaw[1]),
Position::NormalizeOrientation(*targetRollPitchYaw[2]));
}
else if (trpyFields)
{
TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with invalid TargetRoll {}, TargetPitch {}, TargetYaw {} combination, they must either all be NULL or all have value, ignored.",
createPropertiesId.Id, uint32(createPropertiesId.IsCustom), targetRollPitchYaw[0], targetRollPitchYaw[1], targetRollPitchYaw[2]);
}
createProperties.ScriptId = sObjectMgr->GetScriptId(fields.ScriptName().GetStringView());
if (std::vector<Position>* spline = Trinity::Containers::MapGetValuePtr(splinesByCreateProperties, createProperties.Id))
+8 -2
View File
@@ -32,6 +32,9 @@ class Player;
class AreaTrigger;
class SceneObject;
class Conversation;
//WowCommunity
namespace Housing { class DynamicWorldEntity; class RoomWorldEntity; }
//WowCommunity
#define MAX_NUMBER_OF_CELLS 8
@@ -70,6 +73,8 @@ typedef GridRefManager<Player> PlayerMapType;
typedef GridRefManager<AreaTrigger> AreaTriggerMapType;
typedef GridRefManager<SceneObject> SceneObjectMapType;
typedef GridRefManager<Conversation> ConversationMapType;
typedef GridRefManager<Housing::DynamicWorldEntity> HousingDynamicEntityMapType;
typedef GridRefManager<Housing::RoomWorldEntity> HousingRoomEntityMapType;
enum GridMapTypeMask
{
@@ -81,11 +86,12 @@ enum GridMapTypeMask
GRID_MAP_TYPE_MASK_AREATRIGGER = 0x20,
GRID_MAP_TYPE_MASK_SCENEOBJECT = 0x40,
GRID_MAP_TYPE_MASK_CONVERSATION = 0x80,
GRID_MAP_TYPE_MASK_ALL = 0xFF
GRID_MAP_TYPE_MASK_HOUSING_ENTITY = 0x100,
GRID_MAP_TYPE_MASK_ALL = 0x1FF
};
// Creature used instead pet to simplify *::Visit templates (not required duplicate code for Creature->Pet case)
extern template struct TypeListContainer<GridRefManagerContainer, GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/, AreaTrigger, SceneObject, Conversation>;
extern template struct TypeListContainer<GridRefManagerContainer, GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/, AreaTrigger, SceneObject, Conversation, Housing::DynamicWorldEntity, Housing::RoomWorldEntity>;
extern template struct TypeListContainer<GridRefManagerContainer, Player, Creature/*pets*/, Corpse/*resurrectable*/, DynamicObject/*farsight target*/>;
typedef TypeListContainer<GridRefManagerContainer, GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/, AreaTrigger, SceneObject, Conversation> GridTypeMapContainer;
+1 -1
View File
@@ -32,5 +32,5 @@ GridInfo::GridInfo(time_t expiry, bool unload /*= true */) : i_timer(expiry), vi
template class TC_GAME_API Grid<WorldTypeMapContainer, GridTypeMapContainer>;
template class TC_GAME_API NGrid<MAX_NUMBER_OF_CELLS, WorldTypeMapContainer, GridTypeMapContainer>;
template struct TC_GAME_API TypeListContainer<GridRefManagerContainer, GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/, AreaTrigger, SceneObject, Conversation>;
template struct TC_GAME_API TypeListContainer<GridRefManagerContainer, GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/, AreaTrigger, SceneObject, Conversation, Housing::DynamicWorldEntity>;
template struct TC_GAME_API TypeListContainer<GridRefManagerContainer, Player, Creature/*pets*/, Corpse/*resurrectable*/, DynamicObject/*farsight target*/>;
@@ -23,6 +23,9 @@
#include "Transport.h"
#include "UpdateData.h"
#include "WorldPacket.h"
//WowCommunity
#include "HousingDynamicEntity.h"
//WowCommunity
using namespace Trinity;
@@ -325,3 +328,5 @@ template void ObjectUpdater::Visit<DynamicObject>(DynamicObjectMapType&);
template void ObjectUpdater::Visit<AreaTrigger>(AreaTriggerMapType&);
template void ObjectUpdater::Visit<SceneObject>(SceneObjectMapType&);
template void ObjectUpdater::Visit<Conversation>(ConversationMapType&);
template void ObjectUpdater::Visit<Housing::DynamicWorldEntity>(HousingDynamicEntityMapType&);
template void ObjectUpdater::Visit<Housing::RoomWorldEntity>(HousingRoomEntityMapType&);
@@ -30,6 +30,9 @@
#include "SpellInfo.h"
#include "UnitAI.h"
#include "UpdateData.h"
//WowCommunity
#include "HousingDynamicEntity.h"
//WowCommunity
namespace Trinity
{
@@ -44,6 +47,9 @@ namespace Trinity
template<> struct GridMapTypeMaskForType<AreaTrigger> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_AREATRIGGER> { };
template<> struct GridMapTypeMaskForType<SceneObject> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_SCENEOBJECT> { };
template<> struct GridMapTypeMaskForType<Conversation> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_CONVERSATION> { };
//WowCommunity
template<> struct GridMapTypeMaskForType<Housing::DynamicWorldEntity> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_HOUSING_ENTITY> {};
//WowCommunity
struct TC_GAME_API VisibleNotifier
{
@@ -143,6 +149,9 @@ namespace Trinity
void Visit(AreaTriggerMapType &m) { updateObjects<AreaTrigger>(m); }
void Visit(SceneObjectMapType &m) { updateObjects<SceneObject>(m); }
void Visit(ConversationMapType &m) { updateObjects<Conversation>(m); }
//WowCommunity
void Visit(HousingDynamicEntityMapType& m) { updateObjects<Housing::DynamicWorldEntity>(m); }
//WowCommunity
};
struct PacketSenderRef
@@ -29,6 +29,9 @@
#include "ObjectMgr.h"
#include "PhasingHandler.h"
#include "SceneObject.h"
//WowCommunity
#include "HousingDynamicEntity.h"
//WowCommunity
void ObjectGridEvacuator::Visit(CreatureMapType &m)
{
@@ -182,6 +185,10 @@ template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
template void ObjectGridUnloader::Visit(AreaTriggerMapType&);
template void ObjectGridUnloader::Visit(SceneObjectMapType&);
template void ObjectGridUnloader::Visit(ConversationMapType&);
//WowCommunity
template void ObjectGridUnloader::Visit(HousingRoomEntityMapType&);
template void ObjectGridUnloader::Visit(HousingDynamicEntityMapType&);
//WowCommunity
template void ObjectGridCleaner::Visit(CreatureMapType &);
template void ObjectGridCleaner::Visit<GameObject>(GameObjectMapType &);
@@ -190,3 +197,7 @@ template void ObjectGridCleaner::Visit<Corpse>(CorpseMapType &);
template void ObjectGridCleaner::Visit<AreaTrigger>(AreaTriggerMapType &);
template void ObjectGridCleaner::Visit<SceneObject>(SceneObjectMapType &);
template void ObjectGridCleaner::Visit<Conversation>(ConversationMapType &);
//WowCommunity
template void ObjectGridCleaner::Visit<Housing::RoomWorldEntity>(HousingRoomEntityMapType&);
template void ObjectGridCleaner::Visit<Housing::DynamicWorldEntity>(HousingDynamicEntityMapType&);
//WowCommunity
+8 -6
View File
@@ -194,13 +194,15 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
{ "browserEnabled"sv, "1"sv },
// Master looter is a fully supported loot method (LOOT_METHOD_MASTER); retail sends 1.
{ "masterLooterEnabled"sv, "1"sv },
{ "housingEnableCreateGuildNeighborhood"sv, "0"sv },
{ "housingEnableDeleteHouse"sv, "0"sv },
{ "housingServiceEnabled"sv, "0"sv },
{ "housingEnableMoveHouse"sv, "0"sv },
// Housing game rules ? ALL values verified against 12.0.1.65940 sniff packet data (Feb 2026)
// Service & feature flags (read from config, default true)
{ "performHousingExpansionCheckClient"sv, "0"sv },
{ "housingServiceEnabled"sv, "1"sv },
{ "housingEnableBuyHouse"sv, "1"sv },
{ "housingEnableDeleteHouse"sv, "1"sv },
{ "housingEnableMoveHouse"sv, "1"sv },
{ "housingEnableCreateCharterNeighborhood"sv, "0"sv },
{ "housingEnableBuyHouse"sv, "0"sv },
{ "housingMarketEnabled"sv, "0"sv },
{ "housingEnableCreateGuildNeighborhood"sv, "0"sv },
};
// shop2 endpoint advertisement. The client reaches the modern store over HTTPS at whatever host
@@ -604,6 +604,7 @@ void WorldSession::StartWildPetBattle(ObjectGuid targetGUID)
// Build and send initial update
WorldPackets::BattlePet::PetBattleInitialUpdate initialUpdate;
initialUpdate.SceneObjectGUID = battle->GetSceneObjectGUID();
BuildPetBattlePlayerUpdate(initialUpdate.Players[0], battle->GetTeam(PetBattles::PET_BATTLE_TEAM_1), battle, PetBattles::PET_BATTLE_TEAM_1);
BuildPetBattlePlayerUpdate(initialUpdate.Players[1], battle->GetTeam(PetBattles::PET_BATTLE_TEAM_2), battle, PetBattles::PET_BATTLE_TEAM_2);
@@ -656,6 +657,7 @@ void WorldSession::StartWildPetBattle(ObjectGuid targetGUID)
// we don't have intro animations. This packet tells the client abilities are available.
{
WorldPackets::BattlePet::PetBattleFirstRound firstRound;
firstRound.SceneObjectGUID = battle->GetSceneObjectGUID();
firstRound.CurRound = 0;
firstRound.NextPetBattleState = static_cast<int8>(PetBattles::PET_BATTLE_STATE_ROUND_IN_PROGRESS);
@@ -781,6 +783,7 @@ void WorldSession::StartNPCPetBattle(Creature* trainer)
// Build and send initial update
WorldPackets::BattlePet::PetBattleInitialUpdate initialUpdate;
initialUpdate.SceneObjectGUID = battle->GetSceneObjectGUID();
BuildPetBattlePlayerUpdate(initialUpdate.Players[0], battle->GetTeam(PetBattles::PET_BATTLE_TEAM_1), battle, PetBattles::PET_BATTLE_TEAM_1);
BuildPetBattlePlayerUpdate(initialUpdate.Players[1], battle->GetTeam(PetBattles::PET_BATTLE_TEAM_2), battle, PetBattles::PET_BATTLE_TEAM_2);
@@ -804,6 +807,7 @@ void WorldSession::StartNPCPetBattle(Creature* trainer)
// Send first round to unlock abilities
{
WorldPackets::BattlePet::PetBattleFirstRound firstRound;
firstRound.SceneObjectGUID = battle->GetSceneObjectGUID();
firstRound.CurRound = 0;
firstRound.NextPetBattleState = static_cast<int8>(PetBattles::PET_BATTLE_STATE_ROUND_IN_PROGRESS);
@@ -871,6 +875,7 @@ void WorldSession::HandlePetBattleInput(WorldPackets::BattlePet::PetBattleInput&
// after a delay by PetBattle::Update() when the battle is ending.
{
WorldPackets::BattlePet::PetBattleRoundResult roundResult;
roundResult.SceneObjectGUID = battle->GetSceneObjectGUID();
roundResult.CurRound = battle->GetCurrentRound();
roundResult.NextPetBattleState = static_cast<int8>(battle->GetBattleState());
for (uint8 i = 0; i < PetBattles::MAX_PET_BATTLE_PLAYERS; ++i)
@@ -961,6 +966,7 @@ void WorldSession::HandlePetBattleReplaceFrontPet(WorldPackets::BattlePet::PetBa
// Send REPLACEMENTS_MADE to acknowledge the swap
WorldPackets::BattlePet::PetBattleReplacementsMade replacements;
replacements.SceneObjectGUID = battle->GetSceneObjectGUID();
replacements.CurRound = battle->GetCurrentRound();
replacements.NextPetBattleState = static_cast<int8>(PetBattles::PET_BATTLE_STATE_ROUND_IN_PROGRESS);
for (uint8 i = 0; i < PetBattles::MAX_PET_BATTLE_PLAYERS; ++i)
@@ -1226,6 +1232,7 @@ void WorldSession::HandlePetBattleRequestUpdate(WorldPackets::BattlePet::PetBatt
// Send initial update to both players
WorldPackets::BattlePet::PetBattleInitialUpdate initialUpdate;
initialUpdate.SceneObjectGUID = battle->GetSceneObjectGUID();
BuildPetBattlePlayerUpdate(initialUpdate.Players[0], battle->GetTeam(PetBattles::PET_BATTLE_TEAM_1), battle, PetBattles::PET_BATTLE_TEAM_1);
BuildPetBattlePlayerUpdate(initialUpdate.Players[1], battle->GetTeam(PetBattles::PET_BATTLE_TEAM_2), battle, PetBattles::PET_BATTLE_TEAM_2);
BuildPetBattleEnviros(initialUpdate.Enviros, battle);
File diff suppressed because it is too large Load Diff
+14 -3
View File
@@ -130,12 +130,14 @@ void WorldSession::SendLFGListUpdateStatus(uint32 listingId, uint8 status /*= 0x
FillListingTicket(packet.Ticket, *listing);
packet.ExpirationTime = listing->ExpireTime;
packet.RawDescriptor = listing->Descriptor.RawBytes; // echo the client's descriptor verbatim
packet.PlayerGuid = listing->LeaderGuid; // sniff tail: owner's PackedGuid
packet.Listed = true;
}
else
{
packet.Ticket.Id = listingId;
packet.Ticket.RequesterGuid = _player ? _player->GetGUID() : ObjectGuid::Empty;
packet.PlayerGuid = packet.Ticket.RequesterGuid;
packet.Listed = false;
}
SendPacket(packet.Write());
@@ -187,11 +189,19 @@ void WorldSession::HandleLFGListJoin(WorldPackets::LFGList::LFGListJoin& packet)
uint32 const id = sLFGListMgr.CreateListing(player, packet.Listing);
if (id)
{
// A successful create is signalled by UPDATE_STATUS alone - no JOIN_RESULT on success. The 68974
// capture (idx 7573-7575) shows the retail server sends it THREE times: status 0x06, then 0x38 twice.
// A successful create is signalled by UPDATE_STATUS alone - no JOIN_RESULT on success. The 69587 capture
// (idx 44791-44793) sends UPDATE_STATUS 0x06, UPDATE_STATUS 0x38, then CENSORED_ACTIVE_ENTRY_UPDATE.
// (The old "0x06 then 0x38 twice" note from 68974 was the same triple - the CENSORED packet also begins
// with the 39-byte descriptor, so it hex-dumps like a third UPDATE_STATUS.)
SendLFGListUpdateStatus(id, 0x06);
SendLFGListUpdateStatus(id, 0x38);
SendLFGListUpdateStatus(id, 0x38);
if (LFGList::Listing const* listing = sLFGListMgr.GetListing(id))
{
WorldPackets::LFGList::LFGListCensoredActiveEntryUpdate censored;
censored.RawDescriptor = listing->Descriptor.RawBytes;
SendPacket(censored.Write());
}
}
else
{
@@ -224,6 +234,7 @@ void WorldSession::HandleLFGListLeave(WorldPackets::LFGList::LFGListLeave& packe
WorldPackets::LFGList::LFGListUpdateStatus status;
status.Ticket = packet.Ticket;
status.Status = 0x08;
status.PlayerGuid = player->GetGUID();
status.Listed = false;
SendPacket(status.Write());
}
+67 -56
View File
@@ -1523,76 +1523,87 @@ void WorldSession::HandleInstanceAbandonVoteResponse(WorldPackets::Instance::Ins
void WorldSession::HandleSetDifficultyID(WorldPackets::Instance::SetDifficultyID& setDifficultyID)
{
using ResultCode = WorldPackets::Instance::ChangePlayerDifficultyResultCode;
DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(setDifficultyID.DifficultyID);
if (!difficultyEntry)
{
TC_LOG_DEBUG("network", "WorldSession::HandleSetDifficultyID: player {} sent an invalid difficulty {}",
_player->GetGUID().ToString(), setDifficultyID.DifficultyID);
return;
}
if (difficultyEntry->InstanceType != MAP_INSTANCE && difficultyEntry->InstanceType != MAP_RAID)
return;
if (!(difficultyEntry->Flags & DIFFICULTY_FLAG_CAN_SELECT))
return;
// cannot reset while in an instance
Map* map = _player->FindMap();
if (map && map->Instanceable())
auto sendResult = [this](ResultCode code)
{
SendPacket(WorldPackets::Instance::ChangePlayerDifficultyResult(code).Write());
};
if (_player->IsInCombat())
{
sendResult(ResultCode::Combat);
return;
}
bool const isRaid = difficultyEntry->InstanceType == MAP_RAID;
bool const legacy = (difficultyEntry->Flags & DIFFICULTY_FLAG_LEGACY) != 0;
Difficulty const difficultyID = Difficulty(difficultyEntry->ID);
Group* group = _player->GetGroup();
if (group)
{
if (group->isLFGGroup())
{
sendResult(ResultCode::DisabledInLFG);
return;
}
if (!group->IsLeader(_player->GetGUID()))
return;
}
// TrinityCore only sets the difficulty of future instances; it cannot safely retune a map the player is
// already inside. That is the one condition whose exact retail result code is not recoverable offline, so
// we decline silently rather than emit a guessed code (the change simply does not happen).
if (Map* map = _player->FindMap(); map && map->Instanceable())
return;
Difficulty difficultyID = Difficulty(difficultyEntry->ID);
Group* group = _player->GetGroup();
if (difficultyEntry->InstanceType == MAP_INSTANCE)
Difficulty const current = isRaid ? (legacy ? _player->GetLegacyRaidDifficultyID() : _player->GetRaidDifficultyID())
: _player->GetDungeonDifficultyID();
if (difficultyID == current)
{
if (group)
{
if (difficultyID == group->GetDungeonDifficultyID())
return;
if (!group->IsLeader(_player->GetGUID()) || group->isLFGGroup())
return;
group->ResetInstances(InstanceResetMethod::OnChangeDifficulty, _player);
group->SetDungeonDifficultyID(difficultyID);
}
if (difficultyID == _player->GetDungeonDifficultyID())
return;
if (!group)
_player->ResetInstances(InstanceResetMethod::OnChangeDifficulty);
_player->SetDungeonDifficultyID(difficultyID);
_player->SendDungeonDifficulty();
WorldPackets::Instance::ChangePlayerDifficultyResult unchanged(ResultCode::Success);
unchanged.MapID = _player->GetMapId();
unchanged.DifficultyID = uint16(difficultyID);
SendPacket(unchanged.Write());
return;
}
else if (difficultyEntry->InstanceType == MAP_RAID)
if (group)
{
bool const legacy = (difficultyEntry->Flags & DIFFICULTY_FLAG_LEGACY) != 0;
if (group)
{
if (difficultyID == (legacy ? group->GetLegacyRaidDifficultyID() : group->GetRaidDifficultyID()))
return;
if (!group->IsLeader(_player->GetGUID()) || group->isLFGGroup())
return;
group->ResetInstances(InstanceResetMethod::OnChangeDifficulty, _player);
if (legacy)
group->SetLegacyRaidDifficultyID(difficultyID);
else
group->SetRaidDifficultyID(difficultyID);
}
if (difficultyID == (legacy ? _player->GetLegacyRaidDifficultyID() : _player->GetRaidDifficultyID()))
return;
if (!group)
_player->ResetInstances(InstanceResetMethod::OnChangeDifficulty);
if (legacy)
_player->SetLegacyRaidDifficultyID(difficultyID);
group->ResetInstances(InstanceResetMethod::OnChangeDifficulty, _player);
if (isRaid)
legacy ? group->SetLegacyRaidDifficultyID(difficultyID) : group->SetRaidDifficultyID(difficultyID);
else
_player->SetRaidDifficultyID(difficultyID);
_player->SendRaidDifficulty(legacy);
group->SetDungeonDifficultyID(difficultyID);
}
else
{
_player->ResetInstances(InstanceResetMethod::OnChangeDifficulty);
if (isRaid)
legacy ? _player->SetLegacyRaidDifficultyID(difficultyID) : _player->SetRaidDifficultyID(difficultyID);
else
_player->SetDungeonDifficultyID(difficultyID);
}
if (isRaid)
_player->SendRaidDifficulty(legacy);
else
_player->SendDungeonDifficulty();
WorldPackets::Instance::ChangePlayerDifficultyResult result(ResultCode::Success);
result.MapID = _player->GetMapId();
result.DifficultyID = uint16(difficultyID);
SendPacket(result.Write());
}
void WorldSession::HandleToggleDifficulty(WorldPackets::Instance::ToggleDifficulty& /*toggleDifficulty*/)
File diff suppressed because it is too large Load Diff
-154
View File
@@ -1,154 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef HouseInteriorMap_h__
#define HouseInteriorMap_h__
#include "Housing.h"
#include "Map.h"
#include "ObjectGuid.h"
#include <vector>
class HousingRoomEntity;
class Player;
// Map instance for a player's house interior (MAP_HOUSE_INTERIOR = 7, MapID 2783).
// Each player/account gets their own instance of this map. The interior is a
// WMO-based space with modular rooms that the player can customize.
// Similar pattern to GarrisonMap but for housing interiors.
class TC_GAME_API HouseInteriorMap : public Map
{
public:
HouseInteriorMap(uint32 id, time_t expiry, uint32 instanceId, ObjectGuid const& owner);
//
// void LoadGridObjects(NGridType* grid, Cell const& cell) override;
// void InitVisibilityDistance() override;
// bool AddPlayerToMap(Player* player, bool initPlayer = true) override;
// void RemovePlayerFromMap(Player* player, bool remove) override;
ObjectGuid GetOwnerGuid() const { return _owner; }
float GetOriginX() const { return _originX; }
float GetOriginY() const { return _originY; }
float GetOriginZ() const { return _originZ; }
// /// Get the Housing data for the owner (needed for room/decor state).
// Housing* GetOwnerHousing();
//
// /// The neighborhood map ID the owner came from (for exit teleport).
// uint32 GetSourceNeighborhoodMapId() const { return _sourceNeighborhoodMapId; }
// void SetSourceNeighborhoodMapId(uint32 mapId) { _sourceNeighborhoodMapId = mapId; }
//
// /// The plot index the owner's house is on (for exit teleport position).
// uint8 GetSourcePlotIndex() const { return _sourcePlotIndex; }
// void SetSourcePlotIndex(uint8 plotIndex) { _sourcePlotIndex = plotIndex; }
//
// /// Spawn all room meshes for the owner's house layout.
// /// Called once when the interior map is first populated.
// /// @param factionRestriction NEIGHBORHOOD_FACTION_ALLIANCE or NEIGHBORHOOD_FACTION_HORDE
// void SpawnRoomMeshObjects(Housing* housing, int32 factionRestriction);
//
// /// Overload that takes raw rooms ? used when visiting an offline owner's
// /// house where no live Housing object exists; data comes from
// /// Neighborhood::PlotInfo.Rooms (which mirrors character_housing_rooms).
// /// @param houseGuid owner's HousingPlayerHouse GUID, set as the parent on
// /// every HousingRoomEntity we spawn.
// void SpawnRoomMeshObjectsFromList(std::vector<Housing::Room const*> const& rooms, int32 factionRestriction, ObjectGuid houseGuid);
//
// /// Despawn all room meshes (e.g., when the interior is rebuilt).
// void DespawnAllRoomMeshObjects();
//
// /// Update room component textures in-place (material/wallpaper change).
// /// Sends UPDATE_OBJECT with changed texture fields ? no model change.
// void UpdateRoomComponentTextures(ObjectGuid roomGuid,
// std::vector<uint32> const* componentIDs, int32 textureID);
//
// /// Respawn room component MeshObjects for a theme change.
// /// Theme changes require new models (different FileDataIDs), so we DESTROY old
// /// meshes and CREATE new ones with new GUIDs. The client expects this pattern
// /// (sniff shows walls disappearing and reappearing during theme changes).
// /// @param overrideSubType If >= 0, forces SubType match for new options.
// /// @param overrideRoomCompID If >= 0, only spawns options with matching RoomCompID.
// /// Used by SET_CEILING_TYPE/SET_DOOR_TYPE to select the
// /// correct model variant (normal=0, vaulted=1, etc.).
// void RespawnRoomComponentsForTheme(ObjectGuid roomGuid, int32 factionRestriction,
// Housing::Room const& room, std::vector<uint32> const* componentIDs, int32 newThemeID,
// int32 overrideSubType = -1, int32 overrideRoomCompID = -1);
//
// /// Despawn a single room's entities (MeshObjects + HousingRoomEntity).
// void DespawnRoomEntities(ObjectGuid roomGuid);
//
// /// Replace a wall MeshObject with DoorwayWall+Doorway pair for an active connection.
// void ReplaceWallWithDoorway(ObjectGuid roomGuid, uint32 doorComponentID,
// int32 factionRestriction, Housing::Room const& room);
//
// /// Spawn all placed decor for the owner's house on the interior map.
// void SpawnInteriorDecor(Housing* housing);
//
// /// Overload for visits to offline owners ? iterates a raw decor vector
// /// sourced from Neighborhood::PlotInfo.Decor (mirror of character_housing_decor)
// /// with the owner's HouseGuid passed explicitly.
// void SpawnInteriorDecorFromList(std::vector<Housing::PlacedDecor> const& decor, ObjectGuid houseGuid);
//
// /// Spawn a single placed decor item immediately (called from PLACE handler).
// void SpawnSingleInteriorDecor(Housing::PlacedDecor const& decor, ObjectGuid houseGuid);
//
// /// Update position/rotation of a single interior decor item.
// void UpdateDecorPosition(ObjectGuid decorGuid, Position const& pos, QuaternionData const& rot, float scale = 1.0f);
//
// /// Despawn a single decor item by its Housing decor GUID.
// void DespawnDecorItem(ObjectGuid decorGuid);
//
// /// Get the interior decor GUID ? MeshObject GUID map (for edit mode CREATEs).
// std::unordered_map<ObjectGuid, ObjectGuid> const& GetDecorGuidMap() const { return _decorGuidToObjGuid; }
//
// /// Get the room GUID ? room MeshObject GUID vectors (for entity set synchronization).
// std::unordered_map<ObjectGuid, std::vector<ObjectGuid>> const& GetRoomMeshObjects() const { return _roomMeshObjects; }
//
// /// Get HousingRoomEntity instances for inclusion in initial UPDATE_OBJECT
// std::vector<HousingRoomEntity*> const& GetRoomEntities() const { return _roomEntities; }
//
// /// Send post-tutorial aura packets so the client knows the tutorial is complete
// /// and unlocks all editor modes (expert, cleanup, layout, customize).
// void SendPostTutorialAuras(Player* player);
//
private:
ObjectGuid _owner;
Player* _loadingPlayer; ///< @workaround Player not in ObjectAccessor during login
uint32 _sourceNeighborhoodMapId;
uint8 _sourcePlotIndex;
bool _roomsSpawned = false;
// Interior map origin from NeighborhoodMap DB2 (fallback: -1000, -1000, 0.1)
float _originX = -1000.0f;
float _originY = -1000.0f;
float _originZ = 0.1f;
// /// GUIDs of all spawned room MeshObjects, indexed by room GUID
// std::unordered_map<ObjectGuid /*roomGuid*/, std::vector<ObjectGuid>> _roomMeshObjects;
//
// /// Decor GUID ? visual object GUID (for despawning individual decor items)
// std::unordered_map<ObjectGuid, ObjectGuid> _decorGuidToObjGuid;
//
// /// HousingRoomEntity instances (objectType=18, Housing/2 GUIDs) for the layout editor
// std::vector<HousingRoomEntity*> _roomEntities;
//
// /// GUID of the interior plot AreaTrigger (entry 37358, FHousingPlotAreaTrigger_C).
// /// The client fires HOUSE_PLOT_ENTERED when it sees this AT, enabling housing CMSGs.
// ObjectGuid _interiorPlotAT;
};
#endif // HouseInteriorMap_h__
File diff suppressed because it is too large Load Diff
-320
View File
@@ -1,320 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef Housing_h__
//#define Housing_h__
//
//#include "Define.h"
//#include "DatabaseEnvFwd.h"
//#include "HousingDefines.h"
//#include "ObjectGuid.h"
//#include "Optional.h"
//#include "Position.h"
//#include <array>
//#include <atomic>
//#include <string>
//#include <unordered_map>
//#include <vector>
//
//class Map;
//class Player;
//
//namespace WorldPackets
//{
// namespace Housing
// {
// class HousingCatalogStateSync;
// }
//}
//
//class TC_GAME_API Housing
//{
//public:
// struct PlacedDecor
// {
// ObjectGuid Guid;
// uint32 DecorEntryId = 0;
// float PosX = 0.0f;
// float PosY = 0.0f;
// float PosZ = 0.0f;
// float RotationX = 0.0f;
// float RotationY = 0.0f;
// float RotationZ = 0.0f;
// float RotationW = 1.0f;
// float Scale = 1.0f;
// std::array<uint32, MAX_HOUSING_DYE_SLOTS> DyeSlots = {};
// ObjectGuid RoomGuid;
// bool Locked = false;
// time_t PlacementTime = 0;
// uint8 SourceType = DECOR_SOURCE_STANDARD;
// std::string SourceValue;
// };
//
// struct Room
// {
// ObjectGuid Guid;
// uint32 RoomEntryId = 0;
// uint32 SlotIndex = 0;
// int32 GridX = 0; // 2D grid position (yard offsets from origin)
// int32 GridY = 0;
// int32 FloorIndex = 0; // 0=ground, 1+=upper floors
// uint32 Orientation = 0;
// bool Mirrored = false;
// uint32 ThemeId = 0; // Legacy single-theme; kept for back-compat
// uint32 WallThemeId = 0; // Per-surface theme (HouseTheme ID)
// uint32 FloorThemeId = 0;
// uint32 CeilingThemeId = 0;
// uint32 WallTextureId = 0; // RoomComponentTexture ID for walls
// uint32 FloorTextureId = 0; // RoomComponentTexture ID for floors
// uint32 CeilingTextureId = 0; // RoomComponentTexture ID for ceilings
// int32 ColorOverride = -1; // Shared color override (-1 = default)
// uint32 DoorTypeId = 0;
// uint8 DoorSlot = 0;
// uint32 CeilingTypeId = 0;
// uint8 CeilingSlot = 0;
// };
//
// struct Fixture
// {
// uint32 FixturePointId = 0;
// uint32 OptionId = 0;
// };
//
// struct CatalogEntry
// {
// uint32 DecorEntryId = 0;
// uint32 Count = 0;
// uint8 SourceType = DECOR_SOURCE_STANDARD;
// std::string SourceValue;
// };
//
// explicit Housing(Player* owner);
//
// // Global DB ID generators ? must be called once during server startup
// // before any Housing objects are loaded, to prevent cross-player ID collisions.
// static void InitializeDbIdGenerators();
//
// bool LoadFromDB(PreparedQueryResult housing, PreparedQueryResult decor,
// PreparedQueryResult rooms, PreparedQueryResult fixtures, PreparedQueryResult catalog);
// void SaveToDB(CharacterDatabaseTransaction trans);
// static void DeleteFromDB(ObjectGuid::LowType ownerGuid, CharacterDatabaseTransaction trans);
//
// HousingResult Create(ObjectGuid neighborhoodGuid, uint8 plotIndex);
// void Delete();
//
// // Getters
// Player* GetOwner() const { return _owner; }
// ObjectGuid GetHouseGuid() const { return _houseGuid; }
// ObjectGuid GetNeighborhoodGuid() const { return _neighborhoodGuid; }
// void SetNeighborhoodGuid(ObjectGuid guid) { _neighborhoodGuid = guid; }
// ObjectGuid GetPlotGuid() const;
// uint8 GetPlotIndex() const { return _plotIndex; }
// void SetPlotIndex(uint8 plotIndex) { _plotIndex = plotIndex; }
// uint32 GetCreateTime() const { return _createTime; }
// uint32 GetLevel() const { return _level; }
// uint32 GetFavor() const { return _favor; }
// uint32 GetSettingsFlags() const { return _settingsFlags; }
// ObjectGuid GetCosmeticOwnerGuid() const { return _cosmeticOwnerGuid; }
// void SetCosmeticOwnerGuid(ObjectGuid guid) { _cosmeticOwnerGuid = guid; }
//
// // Editor mode
// void SetEditorMode(HousingEditorMode mode);
// HousingEditorMode GetEditorMode() const { return _editorMode; }
//
// // Interior state tracking (set by door script, cleared on leave)
// void SetInInterior(bool interior) { _isInInterior = interior; }
// bool IsInInterior() const { return _isInInterior; }
//
// // Decor operations ? StartPlacingNewDecor creates a pending placement, PlaceDecorWithGuid commits it
// ObjectGuid StartPlacingNewDecor(uint32 catalogEntryId, HousingResult& result);
// uint32 GetPendingPlacementEntryId(ObjectGuid decorGuid) const;
// void CancelPendingPlacement(ObjectGuid decorGuid);
// HousingResult PlaceDecorWithGuid(ObjectGuid decorGuid, uint32 decorEntryId, float x, float y, float z,
// float rotX, float rotY, float rotZ, float rotW, float scale, ObjectGuid roomGuid);
// HousingResult PlaceDecor(uint32 decorEntryId, float x, float y, float z,
// float rotX, float rotY, float rotZ, float rotW, ObjectGuid roomGuid);
// HousingResult MoveDecor(ObjectGuid decorGuid, float x, float y, float z,
// float rotX, float rotY, float rotZ, float rotW, float scale = 1.0f);
// HousingResult RemoveDecor(ObjectGuid decorGuid);
// HousingResult CommitDecorDyes(ObjectGuid decorGuid, std::array<uint32, MAX_HOUSING_DYE_SLOTS> const& dyeSlots);
// HousingResult SetDecorLocked(ObjectGuid decorGuid, bool locked);
// PlacedDecor const* GetPlacedDecor(ObjectGuid decorGuid) const;
// std::vector<PlacedDecor const*> GetAllPlacedDecor() const;
// uint32 GetDecorCount() const { return static_cast<uint32>(_placedDecor.size()); }
//
// // Auto-place starter decor in the visual room (called after catalog is populated).
// // Sniff-verified: retail pre-places starter items at fixed positions in Room 1.
// // The "Welcome Home" quest requires the player to remove 3 of these items.
// uint32 PlaceStarterDecor();
//
// // Room operations
// HousingResult PlaceRoom(uint32 roomEntryId, uint32 slotIndex, uint32 orientation, bool mirrored, ObjectGuid* outRoomGuid = nullptr, int32 gridX = 0, int32 gridY = 0, int32 floorIndex = 0);
// HousingResult RemoveRoom(ObjectGuid roomGuid);
// HousingResult RotateRoom(ObjectGuid roomGuid, bool clockwise);
// HousingResult MoveRoom(ObjectGuid roomGuid, uint32 newSlotIndex, ObjectGuid swapRoomGuid, uint32 swapSlotIndex);
// HousingResult ApplyRoomTheme(ObjectGuid roomGuid, uint32 themeSetId, std::vector<uint32> const& optionIds);
// HousingResult ApplyRoomMaterial(ObjectGuid roomGuid, uint32 textureId, int32 colorOverride, std::vector<uint32> const& optionIds);
// HousingResult SetDoorType(ObjectGuid roomGuid, uint32 doorTypeId, uint8 doorSlot);
// HousingResult SetCeilingType(ObjectGuid roomGuid, uint32 ceilingTypeId, uint8 ceilingSlot);
// std::vector<Room const*> GetRooms() const;
// std::unordered_map<ObjectGuid, Room> const& GetRoomsMap() const { return _rooms; }
//
// // Fixture operations
// HousingResult SelectFixtureOption(uint32 fixturePointId, uint32 optionId, std::vector<uint32>* removedHookIDs = nullptr);
// HousingResult RemoveFixture(uint32 componentID, uint32* outHookID = nullptr);
// std::vector<Fixture const*> GetFixtures() const;
// std::unordered_map<uint32, uint32> GetFixtureOverrideMap() const;
// uint32 GetCoreExteriorComponentID() const;
// std::unordered_map<uint8, uint32> GetRootComponentOverrides() const;
//
// // Catalog operations
// HousingResult AddToCatalog(uint32 decorEntryId, uint8 sourceType = DECOR_SOURCE_STANDARD, std::string sourceValue = {});
// HousingResult RemoveFromCatalog(uint32 decorEntryId);
// HousingResult DestroyAllCopies(uint32 decorEntryId);
// std::vector<CatalogEntry const*> GetCatalogEntries() const;
//
// // House level and favor
// void AddLevel(uint32 amount);
// void AddFavor(uint64 amount, HousingFavorUpdateSource source = HOUSING_FAVOR_SOURCE_UNKNOWN, bool emitUpdate = true);
// uint64 GetFavor64() const { return _favor64; }
// uint32 GetMaxDecorCount() const;
//
// // Budget tracking (WeightCost-based)
// uint32 GetInteriorDecorWeightUsed() const { return _interiorDecorWeightUsed; }
// uint32 GetExteriorDecorWeightUsed() const { return _exteriorDecorWeightUsed; }
// uint32 GetRoomWeightUsed() const { return _roomWeightUsed; }
// uint32 GetFixtureWeightUsed() const { return _fixtureWeightUsed; }
// uint32 GetMaxInteriorDecorBudget() const;
// uint32 GetMaxExteriorDecorBudget() const;
// uint32 GetMaxRoomBudget() const;
// uint32 GetMaxFixtureBudget() const;
// void RecalculateBudgets();
//
// // Level progression (QuestID-based)
// void OnQuestCompleted(uint32 questId);
//
// // UpdateField synchronization
// void SyncUpdateFields();
//
// // Settings
// void SaveSettings(uint32 settingsFlags);
//
// // House name and description
// std::string const& GetHouseName() const { return _houseName; }
// std::string const& GetHouseDescription() const { return _houseDescription; }
// void SetHouseNameDescription(std::string const& name, std::string const& desc);
//
// // Exterior lock state
// void SetExteriorLocked(bool locked);
// bool IsExteriorLocked() const { return _exteriorLocked; }
//
// // Photo sharing authorization (per-session, volatile)
// void SetPhotoSharingAuthorized(bool authorized) { _photoSharingAuthorized = authorized; }
// bool IsPhotoSharingAuthorized() const { return _photoSharingAuthorized; }
//
// // House size (HousingFixtureSize enum)
// void SetHouseSize(uint8 size);
// uint8 GetHouseSize() const { return _houseSize; }
//
// // House type (HouseExteriorWmoData ID)
// void SetHouseType(uint32 typeId);
// uint32 GetHouseType() const { return _houseType; }
//
// // House position persistence (player can reposition house on plot)
// bool HasCustomPosition() const { return _hasCustomPosition; }
// Position GetHousePosition() const { return Position(_housePosX, _housePosY, _housePosZ, _houseFacing); }
// void SetHousePosition(float x, float y, float z, float facing);
//
// // Direct access to placed decor map (for GO spawning)
// std::unordered_map<ObjectGuid, PlacedDecor> const& GetPlacedDecorMap() const { return _placedDecor; }
// bool IsStoragePopulated() const { return _storagePopulated; }
// void ResetStoragePopulated() { _storagePopulated = false; }
//
// // Populate ALL decor entries (placed + catalog) into the Account entity's FHousingStorage_C.
// // Called on-demand by REQUEST_STORAGE handler. Retail does NOT populate storage at login ?
// // FHousingStorage_C is only sent when the player enters edit mode or requests storage.
// void PopulateCatalogStorageEntries();
//
// // Build the per-character HousingCatalog ownership snapshot broadcast via
// // SMSG_HOUSING_CATALOG_STATE_SYNC on every housing-map entry. Aggregates across:
// // - Placed decor instances -> OwnedModifiedStack entries keyed by DecorEntryId
// // - Storage-only stacks (catalog.Count minus placed count) -> OwnedUnmodifiedStack
// // - Placed rooms -> Room entries (isRoom=1)
// // PackedState bit layout matches the IDA-decoded format for ClientMirrorSystem 0x56000E:
// // bits 0-1 subtype | bit 3 isRoom | bit 4 catalog-visible flag (always set)
// void BuildCatalogStateSync(WorldPackets::Housing::HousingCatalogStateSync& packet) const;
//
//private:
// uint64 GenerateDecorDbId();
// uint64 GenerateRoomDbId();
//
// // Room connectivity helpers
// ObjectGuid FindBaseRoomGuid() const;
// bool IsRoomGraphConnectedWithout(ObjectGuid excludeRoomGuid) const;
//
// // Immediate DB persistence helpers
// void PersistRoomToDB(ObjectGuid roomGuid, Room const& room);
// void PersistFixtureToDB(uint32 fixturePointId, uint32 optionId);
//
// // Populate starter fixtures (Base + Roof) on house creation
// void PopulateStarterFixtures();
//
// Player* _owner;
// ObjectGuid _houseGuid;
// ObjectGuid _neighborhoodGuid;
// uint8 _plotIndex;
// uint32 _level;
// uint32 _favor;
// uint64 _favor64 = 0;
// uint32 _settingsFlags;
// HousingEditorMode _editorMode;
// bool _exteriorLocked = false;
// bool _isInInterior = false;
// uint8 _houseSize = HOUSING_FIXTURE_SIZE_SMALL;
// uint32 _houseType = 0;
// uint32 _createTime = 0;
// std::string _houseName;
// std::string _houseDescription;
//
// // Persisted house position on plot
// float _housePosX = 0.0f;
// float _housePosY = 0.0f;
// float _housePosZ = 0.0f;
// float _houseFacing = 0.0f;
// ObjectGuid _cosmeticOwnerGuid; // Display owner for guild housing
// bool _hasCustomPosition = false;
// bool _storagePopulated = false; // True after PopulateCatalogStorageEntries() ? gates Account entity updates
// bool _photoSharingAuthorized = false; // Per-session photo sharing authorization state
//
// // WeightCost-based budget tracking
// uint32 _interiorDecorWeightUsed = 0;
// uint32 _exteriorDecorWeightUsed = 0;
// uint32 _roomWeightUsed = 0;
// uint32 _fixtureWeightUsed = 0;
//
// std::unordered_map<ObjectGuid, PlacedDecor> _placedDecor;
// std::unordered_map<ObjectGuid, uint32 /*decorEntryId*/> _pendingPlacements;
// std::unordered_map<ObjectGuid, Room> _rooms;
// std::unordered_map<uint32 /*fixturePointId*/, Fixture> _fixtures;
// std::unordered_map<uint32 /*decorEntryId*/, CatalogEntry> _catalog;
//
// // Global DB ID generators (atomic, shared across all Housing instances)
// static std::atomic<uint64> s_nextDecorDbId;
// static std::atomic<uint64> s_nextRoomDbId;
//};
//
//#endif // Housing_h__
-850
View File
@@ -1,850 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TRINITYCORE_HOUSING_DEFINES_H
#define TRINITYCORE_HOUSING_DEFINES_H
#include "Define.h"
// HousingResult enum - 90 values (0-89), verified against client binary
enum HousingResult : uint8
{
HOUSING_RESULT_SUCCESS = 0,
HOUSING_RESULT_ACTION_LOCKED_BY_COMBAT = 1,
HOUSING_RESULT_BOUNDS_FAILURE_CHILDREN = 2,
HOUSING_RESULT_BOUNDS_FAILURE_PLOT = 3,
HOUSING_RESULT_BOUNDS_FAILURE_ROOM = 4,
HOUSING_RESULT_BOUND_TO_STARTING_AREA = 5,
HOUSING_RESULT_CANNOT_AFFORD = 6,
HOUSING_RESULT_CHARTER_COMPLETE = 7,
HOUSING_RESULT_COLLISION_INVALID = 8,
HOUSING_RESULT_DB_ERROR = 9,
HOUSING_RESULT_DECOR_CANNOT_BE_REDEEMED = 10,
HOUSING_RESULT_DECOR_ITEM_NOT_DESTROYABLE = 11,
HOUSING_RESULT_DECOR_NOT_FOUND = 12,
HOUSING_RESULT_DECOR_NOT_FOUND_IN_STORAGE = 13,
HOUSING_RESULT_DUPLICATE_CHARTER_SIGNATURE = 14,
HOUSING_RESULT_FILTER_REJECTED = 15,
HOUSING_RESULT_FIXTURE_CANT_DELETE_DOOR = 16,
HOUSING_RESULT_FIXTURE_HOOK_EMPTY = 17,
HOUSING_RESULT_FIXTURE_HOOK_OCCUPIED = 18,
HOUSING_RESULT_FIXTURE_HOUSE_TYPE_MISMATCH = 19,
HOUSING_RESULT_FIXTURE_NOT_FOUND = 20,
HOUSING_RESULT_FIXTURE_SIZE_MISMATCH = 21,
HOUSING_RESULT_FIXTURE_TYPE_MISMATCH = 22,
HOUSING_RESULT_GENERIC_FAILURE = 23,
HOUSING_RESULT_GUILD_MORE_ACCOUNTS_NEEDED = 24,
HOUSING_RESULT_GUILD_MORE_ACTIVE_PLAYERS_NEEDED = 25,
HOUSING_RESULT_GUILD_NOT_LOADED = 26,
HOUSING_RESULT_HOUSE_EDIT_LOCK_FAILED = 27,
HOUSING_RESULT_HOUSE_EXTERIOR_ALREADY_THAT_SIZE = 28,
HOUSING_RESULT_HOUSE_EXTERIOR_ALREADY_THAT_TYPE = 29,
HOUSING_RESULT_HOUSE_EXTERIOR_ROOT_NOT_FOUND = 30,
HOUSING_RESULT_HOUSE_EXTERIOR_TYPE_NEIGHBORHOOD_MISMATCH = 31,
HOUSING_RESULT_HOUSE_EXTERIOR_TYPE_NOT_FOUND = 32,
HOUSING_RESULT_HOUSE_EXTERIOR_TYPE_SIZE_MISMATCH = 33,
HOUSING_RESULT_HOUSE_EXTERIOR_SIZE_NOT_AVAILABLE = 34,
HOUSING_RESULT_HOOK_NOT_CHILD_OF_FIXTURE = 35,
HOUSING_RESULT_HOUSE_NOT_FOUND = 36,
HOUSING_RESULT_INCORRECT_FACTION = 37,
HOUSING_RESULT_INVALID_DECOR_ITEM = 38,
HOUSING_RESULT_INVALID_DISTANCE = 39,
HOUSING_RESULT_INVALID_GUILD = 40,
HOUSING_RESULT_INVALID_HOUSE = 41,
HOUSING_RESULT_INVALID_INSTANCE = 42,
HOUSING_RESULT_INVALID_INTERACTION = 43,
HOUSING_RESULT_INVALID_LIGHT_OVERLAP = 44,
HOUSING_RESULT_INVALID_MAP = 45,
HOUSING_RESULT_INVALID_NEIGHBORHOOD_NAME = 46,
HOUSING_RESULT_INVALID_ROOM_LAYOUT = 47,
HOUSING_RESULT_LOCKED_BY_OTHER_PLAYER = 48,
HOUSING_RESULT_LOCK_OPERATION_FAILED = 49,
HOUSING_RESULT_MAX_DECOR_REACHED = 50,
HOUSING_RESULT_MAX_PREVIEW_DECOR_REACHED = 51,
HOUSING_RESULT_MISSING_CORE_FIXTURE = 52,
HOUSING_RESULT_MISSING_DYE = 53,
HOUSING_RESULT_MISSING_EXPANSION_ACCESS = 54,
HOUSING_RESULT_MISSING_FACTION_MAP = 55,
HOUSING_RESULT_MISSING_PRIVATE_NEIGHBORHOOD_INVITE = 56,
HOUSING_RESULT_MORE_HOUSE_SLOTS_NEEDED = 57,
HOUSING_RESULT_MORE_SIGNATURES_NEEDED = 58,
HOUSING_RESULT_NEIGHBORHOOD_NOT_FOUND = 59,
HOUSING_RESULT_NO_NEIGHBORHOOD_OWNERSHIP_REQUESTS = 60,
HOUSING_RESULT_NOT_IN_DECOR_EDIT_MODE = 61,
HOUSING_RESULT_NOT_IN_FIXTURE_EDIT_MODE = 62,
HOUSING_RESULT_NOT_IN_LAYOUT_EDIT_MODE = 63,
HOUSING_RESULT_NOT_INSIDE_HOUSE = 64,
HOUSING_RESULT_NOT_ON_OWNED_PLOT = 65,
HOUSING_RESULT_OPERATION_ABORTED = 66,
HOUSING_RESULT_OWNER_NOT_IN_GUILD = 67,
HOUSING_RESULT_PERMISSION_DENIED = 68,
HOUSING_RESULT_PLACEMENT_TARGET_INVALID = 69,
HOUSING_RESULT_PLAYER_NOT_FOUND = 70,
HOUSING_RESULT_PLAYER_NOT_IN_INSTANCE = 71,
HOUSING_RESULT_PLOT_NOT_FOUND = 72,
HOUSING_RESULT_PLOT_NOT_VACANT = 73,
HOUSING_RESULT_PLOT_RESERVATION_COOLDOWN = 74,
HOUSING_RESULT_PLOT_RESERVED = 75,
HOUSING_RESULT_ROOM_NOT_FOUND = 76,
HOUSING_RESULT_ROOM_UPDATE_FAILED = 77,
HOUSING_RESULT_RPC_FAILURE = 78,
HOUSING_RESULT_SERVICE_NOT_AVAILABLE = 79,
HOUSING_RESULT_STATIC_DATA_NOT_FOUND = 80,
HOUSING_RESULT_TIMEOUT_LIMIT = 81,
HOUSING_RESULT_TIMERUNNING_NOT_ALLOWED = 82,
HOUSING_RESULT_TOKEN_REQUIRED = 83,
HOUSING_RESULT_TOO_MANY_REQUESTS = 84,
HOUSING_RESULT_TRANSACTION_FAILURE = 85,
HOUSING_RESULT_UNCOLLECTED_EXTERIOR_FIXTURE = 86,
HOUSING_RESULT_UNCOLLECTED_HOUSE_TYPE = 87,
HOUSING_RESULT_UNCOLLECTED_ROOM = 88,
HOUSING_RESULT_UNCOLLECTED_ROOM_MATERIAL = 89,
HOUSING_RESULT_UNCOLLECTED_ROOM_THEME = 90,
HOUSING_RESULT_UNLOCK_OPERATION_FAILED = 91
};
// HouseEditorMode enum - 7 values
enum HousingEditorMode : uint8
{
HOUSING_EDITOR_MODE_NONE = 0,
HOUSING_EDITOR_MODE_BASIC_DECOR = 1,
HOUSING_EDITOR_MODE_EXPERT_DECOR = 2,
HOUSING_EDITOR_MODE_LAYOUT = 3,
HOUSING_EDITOR_MODE_CUSTOMIZE = 4,
HOUSING_EDITOR_MODE_CLEANUP = 5,
HOUSING_EDITOR_MODE_EXTERIOR_CUSTOMIZATION = 6
};
// HouseEditingContext enum - 4 values
enum HouseEditingContext : uint8
{
HOUSE_EDITING_CONTEXT_NONE = 0,
HOUSE_EDITING_CONTEXT_DECOR = 1,
HOUSE_EDITING_CONTEXT_ROOM = 2,
HOUSE_EDITING_CONTEXT_FIXTURE = 3
};
// HousingFixtureSize enum - 5 values
enum HousingFixtureSize : uint8
{
HOUSING_FIXTURE_SIZE_NONE = 0,
HOUSING_FIXTURE_SIZE_ANY = 1,
HOUSING_FIXTURE_SIZE_SMALL = 2,
HOUSING_FIXTURE_SIZE_MEDIUM = 3,
HOUSING_FIXTURE_SIZE_LARGE = 4
};
// HousingFixtureType enum - 9 values (sparse)
enum HousingFixtureType : uint8
{
HOUSING_FIXTURE_TYPE_NONE = 0,
HOUSING_FIXTURE_TYPE_BASE = 9,
HOUSING_FIXTURE_TYPE_ROOF = 10,
HOUSING_FIXTURE_TYPE_DOOR = 11,
HOUSING_FIXTURE_TYPE_WINDOW = 12,
HOUSING_FIXTURE_TYPE_ROOF_DETAIL = 13,
HOUSING_FIXTURE_TYPE_ROOF_WINDOW = 14,
HOUSING_FIXTURE_TYPE_TOWER = 15,
HOUSING_FIXTURE_TYPE_CHIMNEY = 16
};
// HousingRoomComponentType enum - 8 values
enum HousingRoomComponentType : uint8
{
HOUSING_ROOM_COMPONENT_NONE = 0,
HOUSING_ROOM_COMPONENT_WALL = 1,
HOUSING_ROOM_COMPONENT_FLOOR = 2,
HOUSING_ROOM_COMPONENT_CEILING = 3,
HOUSING_ROOM_COMPONENT_STAIRS = 4,
HOUSING_ROOM_COMPONENT_PILLAR = 5,
HOUSING_ROOM_COMPONENT_DOORWAY_WALL = 6,
HOUSING_ROOM_COMPONENT_DOORWAY = 7
};
// HousingRoomComponentDoorType enum - 3 values
enum HousingRoomComponentDoorType : uint8
{
HOUSING_ROOM_DOOR_TYPE_NONE = 0,
HOUSING_ROOM_DOOR_TYPE_DOORWAY = 1,
HOUSING_ROOM_DOOR_TYPE_THRESHOLD = 2
};
// HousingRoomComponentCeilingType enum - 2 values
enum HousingRoomComponentCeilingType : uint8
{
HOUSING_ROOM_CEILING_TYPE_FLAT = 0,
HOUSING_ROOM_CEILING_TYPE_VAULTED = 1
};
// HousingRoomComponentStairType enum - 5 values
enum HousingRoomComponentStairType : uint8
{
HOUSING_ROOM_STAIR_TYPE_NONE = 0,
HOUSING_ROOM_STAIR_TYPE_START_TO_END = 1,
HOUSING_ROOM_STAIR_TYPE_START_TO_MIDDLE = 2,
HOUSING_ROOM_STAIR_TYPE_MIDDLE_TO_MIDDLE = 3,
HOUSING_ROOM_STAIR_TYPE_MIDDLE_TO_END = 4
};
// HousingRoomComponentOptionType enum - 3 values
enum HousingRoomComponentOptionType : uint8
{
HOUSING_ROOM_COMPONENT_OPTION_COSMETIC = 0,
HOUSING_ROOM_COMPONENT_OPTION_DOORWAY_WALL = 1,
HOUSING_ROOM_COMPONENT_OPTION_DOORWAY = 2
};
enum DecorSourceType : uint8
{
DECOR_SOURCE_STANDARD = 0, // Default / starter decor / placed
DECOR_SOURCE_SPELL = 5, // Acquired via spell cast (SourceValue = spell ID string)
DECOR_SOURCE_ITEM = 6, // Acquired via item use (SourceValue = item GUID string)
DECOR_SOURCE_DEFERRED = 3, // Redeemed from deferred reward queue
};
// HousingCatalogEntryType enum - 3 values
enum HousingCatalogEntryType : uint8
{
HOUSING_CATALOG_ENTRY_INVALID = 0,
HOUSING_CATALOG_ENTRY_DECOR = 1,
HOUSING_CATALOG_ENTRY_ROOM = 2
};
// HousingCatalogEntrySize enum - 6 values
enum HousingCatalogEntrySize : uint8
{
HOUSING_CATALOG_SIZE_NONE = 0,
HOUSING_CATALOG_SIZE_TINY = 65,
HOUSING_CATALOG_SIZE_SMALL = 66,
HOUSING_CATALOG_SIZE_MEDIUM = 67,
HOUSING_CATALOG_SIZE_LARGE = 68,
HOUSING_CATALOG_SIZE_HUGE = 69
};
// HousingDecorTheme enum - 6 values
enum HousingDecorTheme : uint8
{
HOUSING_DECOR_THEME_NONE = 0,
HOUSING_DECOR_THEME_FOLK = 1,
HOUSING_DECOR_THEME_RUGGED = 2,
HOUSING_DECOR_THEME_GENERIC = 3,
HOUSING_DECOR_THEME_NIGHT_ELF = 4,
HOUSING_DECOR_THEME_BLOOD_ELF = 5
};
// RoomConnectionType enum - 2 values
enum RoomConnectionType : uint8
{
ROOM_CONNECTION_NONE = 0,
ROOM_CONNECTION_ALL = 1
};
// HousingRoomFlags enum - 5 values (bitmask)
enum HousingRoomFlags : uint32
{
HOUSING_ROOM_FLAG_NONE = 0x00,
HOUSING_ROOM_FLAG_BASE_ROOM = 0x01,
HOUSING_ROOM_FLAG_HAS_STAIRS = 0x02,
HOUSING_ROOM_FLAG_UNLOCKED_BY_DEFAULT = 0x04,
HOUSING_ROOM_FLAG_HAS_CUSTOM_GEOMETRY = 0x08
};
// HousingLayoutRestriction enum - 10 values
enum HousingLayoutRestriction : uint8
{
HOUSING_LAYOUT_RESTRICTION_NONE = 0,
HOUSING_LAYOUT_RESTRICTION_ROOM_NOT_FOUND = 1,
HOUSING_LAYOUT_RESTRICTION_NOT_INSIDE_HOUSE = 2,
HOUSING_LAYOUT_RESTRICTION_NOT_HOUSE_OWNER = 3,
HOUSING_LAYOUT_RESTRICTION_IS_BASE_ROOM = 4,
HOUSING_LAYOUT_RESTRICTION_ROOM_NOT_LEAF = 5,
HOUSING_LAYOUT_RESTRICTION_STAIRWELL_CONNECTION = 6,
HOUSING_LAYOUT_RESTRICTION_LAST_ROOM = 7,
HOUSING_LAYOUT_RESTRICTION_UNREACHABLE_ROOM = 8,
HOUSING_LAYOUT_RESTRICTION_SINGLE_DOOR = 9
};
// NeighborhoodInviteResult enum - 11 values (0-10), verified against client binary
enum NeighborhoodInviteResult : uint8
{
NEIGHBORHOOD_INVITE_SUCCESS = 0,
NEIGHBORHOOD_INVITE_DB_ERROR = 1,
NEIGHBORHOOD_INVITE_RPC_FAILURE = 2,
NEIGHBORHOOD_INVITE_GENERIC_FAILURE = 3,
NEIGHBORHOOD_INVITE_PERMISSION = 4,
NEIGHBORHOOD_INVITE_FACTION = 5,
NEIGHBORHOOD_INVITE_PENDING_INVITATION = 6,
NEIGHBORHOOD_INVITE_INVITE_LIMIT = 7,
NEIGHBORHOOD_INVITE_NOT_ENOUGH_PLOTS = 8,
NEIGHBORHOOD_INVITE_NOT_FOUND = 9,
NEIGHBORHOOD_INVITE_TOO_MANY_REQUESTS = 10
};
// BulkRefundResult enum - 4 values (from client string xrefs, build 66838)
enum BulkRefundResult : uint8
{
BULK_REFUND_RESULT_SUCCESS = 0,
BULK_REFUND_RESULT_INVALID_REQUEST = 1,
BULK_REFUND_RESULT_REFUND_WINDOW_EXPIRED = 2,
BULK_REFUND_RESULT_TIMEOUT = 3
};
// HouseOwnerError enum - 4 values
enum HouseOwnerError : uint8
{
HOUSE_OWNER_ERROR_NONE = 0,
HOUSE_OWNER_ERROR_FACTION = 1,
HOUSE_OWNER_ERROR_GUILD = 2,
HOUSE_OWNER_ERROR_GENERIC_PERMISSION = 3
};
// CreateNeighborhoodErrorType enum - 4 values
enum CreateNeighborhoodErrorType : uint8
{
CREATE_NEIGHBORHOOD_ERROR_NONE = 0,
CREATE_NEIGHBORHOOD_ERROR_PROFANITY = 1,
CREATE_NEIGHBORHOOD_ERROR_UNDERSIZED_GUILD = 2,
CREATE_NEIGHBORHOOD_ERROR_OVERSIZED_GUILD = 3
};
// NeighborhoodMemberRole enum - 3 values
enum NeighborhoodMemberRole : uint8
{
NEIGHBORHOOD_ROLE_RESIDENT = 0,
NEIGHBORHOOD_ROLE_MANAGER = 1,
NEIGHBORHOOD_ROLE_OWNER = 2
};
// NeighborhoodFactionRestriction enum - 3 values
enum NeighborhoodFactionRestriction : int32
{
NEIGHBORHOOD_FACTION_NONE = 0,
NEIGHBORHOOD_FACTION_HORDE = 1,
NEIGHBORHOOD_FACTION_ALLIANCE = 2
};
// HouseSettingFlags enum - 11 values (bitmask), verified against client binary
// Two groups: HouseAccess (bits 0-4) for interior, PlotAccess (bits 5-9) for exterior
enum HouseSettingFlags : uint32
{
HOUSE_SETTING_NONE = 0x000,
HOUSE_SETTING_HOUSE_ACCESS_ANYONE = 0x001,
HOUSE_SETTING_HOUSE_ACCESS_NEIGHBORS = 0x002,
HOUSE_SETTING_HOUSE_ACCESS_GUILD = 0x004,
HOUSE_SETTING_HOUSE_ACCESS_FRIENDS = 0x008,
HOUSE_SETTING_HOUSE_ACCESS_PARTY = 0x010,
HOUSE_SETTING_PLOT_ACCESS_ANYONE = 0x020,
HOUSE_SETTING_PLOT_ACCESS_NEIGHBORS = 0x040,
HOUSE_SETTING_PLOT_ACCESS_GUILD = 0x080,
HOUSE_SETTING_PLOT_ACCESS_FRIENDS = 0x100,
HOUSE_SETTING_PLOT_ACCESS_PARTY = 0x200
};
constexpr uint32 HOUSE_SETTING_DEFAULT = HOUSE_SETTING_PLOT_ACCESS_ANYONE; // 0x020 ? sniff-verified default
constexpr uint32 HOUSE_SETTING_VALID_MASK = 0x3FF; // bits 0-9
// HousingDecorPlacementFlags enum - 5 values (bitmask)
enum HousingDecorPlacementFlags : int32
{
DECOR_PLACEMENT_FLOOR = 0x01,
DECOR_PLACEMENT_WALL = 0x02,
DECOR_PLACEMENT_CEILING = 0x04,
DECOR_PLACEMENT_OUTDOOR = 0x08,
DECOR_PLACEMENT_STACKABLE = 0x10
};
// HousingRoomSize enum - 3 values
enum HousingRoomSize : int8
{
ROOM_SIZE_SMALL = 0,
ROOM_SIZE_MEDIUM = 1,
ROOM_SIZE_LARGE = 2
};
// HousingPlotSize enum - 3 values
enum HousingPlotSize : int32
{
PLOT_SIZE_SMALL = 0,
PLOT_SIZE_MEDIUM = 1,
PLOT_SIZE_LARGE = 2
};
// HousingInitiativeType enum - 4 values
enum HousingInitiativeType : int32
{
INITIATIVE_TYPE_GATHERING = 0,
INITIATIVE_TYPE_CRAFTING = 1,
INITIATIVE_TYPE_COMBAT = 2,
INITIATIVE_TYPE_EXPLORATION = 3
};
// HousingFixtureFlags enum - 3 values (bitmask)
enum HousingFixtureFlags : uint32
{
HOUSING_FIXTURE_FLAG_NONE = 0x00,
HOUSING_FIXTURE_FLAG_IS_DEFAULT = 0x01,
HOUSING_FIXTURE_FLAG_UNLOCKED_BY_DEFAULT = 0x02
};
// HousingRoomComponentFlags enum - 2 values (bitmask)
enum HousingRoomComponentFlags : uint32
{
HOUSING_ROOM_COMPONENT_FLAG_NONE = 0x00,
HOUSING_ROOM_COMPONENT_FLAG_HIDDEN_IN_LAYOUT_MODE = 0x01
};
// HousingDecorPlacementRestriction enum - 7 values (bitmask) - 12.0.7 (68275) client-verified,
// server-sent placement-failure reasons. HOUSING_ENUMS_68275.md.
enum HousingDecorPlacementRestriction : uint32
{
HOUSING_DECOR_PLACEMENT_RESTRICTION_TOO_FAR_AWAY = 0x01,
HOUSING_DECOR_PLACEMENT_RESTRICTION_OUTSIDE_ROOM_BOUNDS = 0x02,
HOUSING_DECOR_PLACEMENT_RESTRICTION_OUTSIDE_PLOT_BOUNDS = 0x04,
HOUSING_DECOR_PLACEMENT_RESTRICTION_CHILD_OUTSIDE_BOUNDS = 0x08,
HOUSING_DECOR_PLACEMENT_RESTRICTION_INVALID_TARGET = 0x10,
HOUSING_DECOR_PLACEMENT_RESTRICTION_INVALID_COLLISION = 0x20,
HOUSING_DECOR_PLACEMENT_RESTRICTION_INVALID_LIGHT_OVERLAP = 0x40
};
// HousingRoomComponentOptionFlags enum - 2 values (bitmask)
enum HousingRoomComponentOptionFlags : uint32
{
HOUSING_ROOM_COMPONENT_OPTION_FLAG_NONE = 0x00,
HOUSING_ROOM_COMPONENT_OPTION_FLAG_IS_DEFAULT = 0x01
};
// HousingRoomComponentTextureFlags enum - 2 values (bitmask)
enum HousingRoomComponentTextureFlags : uint32
{
HOUSING_ROOM_COMPONENT_TEXTURE_FLAG_NONE = 0x00,
HOUSING_ROOM_COMPONENT_TEXTURE_FLAG_UNLOCKED_BY_DEFAULT = 0x01
};
// NeighborhoodFlags enum - 3 values (bitmask)
enum NeighborhoodFlags : uint32
{
NEIGHBORHOOD_FLAG_NONE = 0x00,
NEIGHBORHOOD_FLAG_POOL_PARENT = 0x01,
NEIGHBORHOOD_FLAG_OPEN_TO_PUBLIC = 0x02
};
// HouseExteriorWMODataFlags enum - 4 values (bitmask)
enum HouseExteriorWMODataFlags : uint32
{
HOUSE_EXTERIOR_WMO_FLAG_NONE = 0x00,
HOUSE_EXTERIOR_WMO_FLAG_UNLOCKED_BY_DEFAULT = 0x01,
HOUSE_EXTERIOR_WMO_FLAG_ALLOWED_IN_HORDE_NEIGHBORHOODS = 0x02,
HOUSE_EXTERIOR_WMO_FLAG_ALLOWED_IN_ALLIANCE_NEIGHBORHOODS = 0x04
};
// ============================================================================
// New enums from client binary analysis (previously missing)
// ============================================================================
// HousingDecorModelType enum - 3 values
enum HousingDecorModelType : uint8
{
HOUSING_DECOR_MODEL_TYPE_NONE = 0,
HOUSING_DECOR_MODEL_TYPE_M2 = 1,
HOUSING_DECOR_MODEL_TYPE_WMO = 2
};
// NeighborhoodInitiativeUpdateStatus enum ? sent via SMSG_INITIATIVE_UPDATE_STATUS
enum NeighborhoodInitiativeUpdateStatus : uint8
{
NI_UPDATE_STATUS_STARTED = 0,
NI_UPDATE_STATUS_MILESTONE_COMPLETED = 1,
NI_UPDATE_STATUS_COMPLETED = 2,
NI_UPDATE_STATUS_FAILED = 3
};
// NeighborhoodInitiativeChestResult enum ? sent via SMSG_INITIATIVE_CHEST_RESULT
enum NeighborhoodInitiativeChestResult : uint32
{
NI_CHEST_SUCCESS = 0,
NI_CHEST_UNSPECIFIED_FAILURE = 1,
NI_CHEST_NO_HOUSE_FOUND = 2,
NI_CHEST_NO_REWARDS = 3,
NI_CHEST_THROTTLED = 4,
NI_CHEST_SERVICE_DISABLED = 5
};
// NeighborhoodInitiativeTaskType enum ? from InitiativeTask DB2 TaskType field
enum NeighborhoodInitiativeTaskType : int32
{
NI_TASK_TYPE_SINGLE = 0,
NI_TASK_TYPE_REPEATABLE_FINITE = 1,
NI_TASK_TYPE_REPEATABLE_INFINITE = 2
};
// NeighborhoodInitiativeCompletionState enum ? per-task completion state
enum NeighborhoodInitiativeCompletionState : uint8
{
NI_COMPLETION_NOT_COMPLETED = 0,
NI_COMPLETION_PLAYER_COMPLETED = 1,
NI_COMPLETION_SYSTEM_ABANDONED = 2
};
// NeighborhoodInitiativeFlags enum ? from NeighborhoodInitiative DB2 Flags field
enum NeighborhoodInitiativeFlags : uint32
{
NI_FLAG_DISABLED = 0x1,
NI_FLAG_NO_ABANDON = 0x2,
NI_FLAG_NO_REPEAT = 0x4
};
// InitiativeMilestoneFlags enum ? from InitiativeMilestone DB2 Flags field
enum InitiativeMilestoneFlags : int32
{
INITIATIVE_MILESTONE_FLAG_FINAL = 0x1
};
// InitiativeRewardFlags enum ? from InitiativeReward DB2 Flags field
enum InitiativeRewardFlags : int32
{
INITIATIVE_REWARD_FLAG_PERMANENT_WORLD_STATE = 0x1
};
// NeighborhoodInitiativeNeighborhoodType enum
enum NeighborhoodInitiativeNeighborhoodType : uint8
{
NI_NEIGHBORHOOD_TYPE_SINGLETON = 0,
NI_NEIGHBORHOOD_TYPE_POOL = 1
};
// HousingFavorUpdateSource enum - 8 values
enum HousingFavorUpdateSource : uint8
{
HOUSING_FAVOR_SOURCE_UNKNOWN = 0,
HOUSING_FAVOR_SOURCE_DECOR_COLLECTION = 1,
HOUSING_FAVOR_SOURCE_DEFERRED_REWARDS = 2,
HOUSING_FAVOR_SOURCE_RETROACTIVE_DECOR = 3,
HOUSING_FAVOR_SOURCE_NEW_HOUSE_DECOR = 4,
HOUSING_FAVOR_SOURCE_INITIATIVE_TASK = 5,
HOUSING_FAVOR_SOURCE_INITIATIVE_CHEST = 6,
HOUSING_FAVOR_SOURCE_QUEST = 7
};
// HousingFavorUpdateType enum - 3 values
enum HousingFavorUpdateType : uint8
{
HOUSING_FAVOR_UPDATE_NONE = 0,
HOUSING_FAVOR_UPDATE_INITIATIVE_ADD = 1,
HOUSING_FAVOR_UPDATE_SET = 2
};
// HousingPlotOwnerType enum - 4 values
enum HousingPlotOwnerType : uint8
{
HOUSING_PLOT_OWNER_NONE = 0,
HOUSING_PLOT_OWNER_STRANGER = 1,
HOUSING_PLOT_OWNER_FRIEND = 2,
HOUSING_PLOT_OWNER_SELF = 3
};
// HousingTeleportReason enum - 12 values
enum HousingTeleportReason : uint8
{
HOUSING_TELEPORT_NONE = 0,
HOUSING_TELEPORT_CHEAT = 1,
HOUSING_TELEPORT_UNSPECIFIED_SPELLCAST = 2,
HOUSING_TELEPORT_BOOTED = 3,
HOUSING_TELEPORT_HOMESTONE = 4,
HOUSING_TELEPORT_VISIT = 5,
HOUSING_TELEPORT_FRIEND = 6,
HOUSING_TELEPORT_GUILD_MEMBER = 7,
HOUSING_TELEPORT_PARTY_MEMBER = 8,
HOUSING_TELEPORT_EXITING_HOUSE = 9,
HOUSING_TELEPORT_PORTAL = 10,
HOUSING_TELEPORT_TUTORIAL = 11
};
// HousingThrottleType enum - 2 values
enum HousingThrottleType : uint8
{
HOUSING_THROTTLE_GENERAL = 0,
HOUSING_THROTTLE_DECORATION = 1
};
// HousingThemeFlags enum - 3 values (bitmask)
enum HousingThemeFlags : uint32
{
HOUSING_THEME_FLAG_NONE = 0x00,
HOUSING_THEME_FLAG_UNLOCKED_BY_DEFAULT = 0x01,
HOUSING_THEME_FLAG_SHOW_IN_STYLE_SELECTOR = 0x02
};
// NeighborhoodMapFlags enum - 4 values (bitmask)
enum NeighborhoodMapFlags : uint32
{
NEIGHBORHOOD_MAP_FLAG_NONE = 0x00,
NEIGHBORHOOD_MAP_FLAG_ALLIANCE_PURCHASABLE = 0x01,
NEIGHBORHOOD_MAP_FLAG_HORDE_PURCHASABLE = 0x02,
NEIGHBORHOOD_MAP_FLAG_CAN_SYSTEM_GENERATE = 0x04
};
// NeighborhoodOwnerType enum - 3 values
enum NeighborhoodOwnerType : uint8
{
NEIGHBORHOOD_OWNER_NONE = 0,
NEIGHBORHOOD_OWNER_GUILD = 1,
NEIGHBORHOOD_OWNER_CHARTER = 2
};
// NeighborhoodType enum - 3 values
enum NeighborhoodType : uint8
{
NEIGHBORHOOD_TYPE_OPEN = 0,
NEIGHBORHOOD_TYPE_PRIVATE = 1,
NEIGHBORHOOD_TYPE_PUBLIC = 2
};
// PurchaseHouseDisabledReason enum - 10 values
enum PurchaseHouseDisabledReason : uint8
{
PURCHASE_HOUSE_DISABLED_NONE = 0,
PURCHASE_HOUSE_DISABLED_WRONG_FACTION = 1,
PURCHASE_HOUSE_DISABLED_WRONG_GUILD = 2,
PURCHASE_HOUSE_DISABLED_NOT_INVITED = 3,
PURCHASE_HOUSE_DISABLED_NO_EXPANSION = 4,
PURCHASE_HOUSE_DISABLED_RESERVED = 5,
PURCHASE_HOUSE_DISABLED_GUILD_LOCKOUT = 6,
PURCHASE_HOUSE_DISABLED_CHARTER_LOCKOUT = 7,
PURCHASE_HOUSE_DISABLED_MAX_HOUSES = 8,
PURCHASE_HOUSE_DISABLED_NO_GAME_TIME = 9
};
// ReservationFlags enum - 4 values (bitmask)
enum ReservationFlags : uint32
{
RESERVATION_FLAG_NONE = 0x00,
RESERVATION_FLAG_RELINQUISH = 0x01,
RESERVATION_FLAG_CANCELED = 0x02,
RESERVATION_FLAG_PLOTLESS = 0x04
};
// RetroactiveDecorRewardFlags enum - 2 values (bitmask)
enum RetroactiveDecorRewardFlags : uint32
{
RETROACTIVE_DECOR_REWARD_FLAG_NONE = 0x00,
RETROACTIVE_DECOR_REWARD_FLAG_ALL_CRITERIA_REQUIRED = 0x01
};
// InvalidPlotScreenshotReason enum - 5 values
enum InvalidPlotScreenshotReason : uint8
{
INVALID_PLOT_SCREENSHOT_NONE = 0,
INVALID_PLOT_SCREENSHOT_OUT_OF_BOUNDS = 1,
INVALID_PLOT_SCREENSHOT_FACING = 2,
INVALID_PLOT_SCREENSHOT_NO_NEIGHBORHOOD = 3,
INVALID_PLOT_SCREENSHOT_NO_ACTIVE_PLAYER = 4
};
// HouseFinderSuggestionReason enum - 7 values (bitmask)
enum HouseFinderSuggestionReason : uint32
{
HOUSE_FINDER_SUGGESTION_NONE = 0x00,
HOUSE_FINDER_SUGGESTION_OWNER = 0x01,
HOUSE_FINDER_SUGGESTION_CHARTER_INVITE = 0x02,
HOUSE_FINDER_SUGGESTION_GUILD = 0x04,
HOUSE_FINDER_SUGGESTION_BNET_FRIENDS = 0x08,
HOUSE_FINDER_SUGGESTION_PARTY_SYNC = 0x10,
HOUSE_FINDER_SUGGESTION_RANDOM = 0x20
};
// CornerstonePurchaseMode enum - 3 values
enum CornerstonePurchaseMode : uint8
{
CORNERSTONE_PURCHASE_BASIC = 0,
CORNERSTONE_PURCHASE_IMPORT = 1,
CORNERSTONE_PURCHASE_MOVE = 2
};
// HouseLevelRewardType enum - 2 values
enum HouseLevelRewardType : uint8
{
HOUSE_LEVEL_REWARD_VALUE = 0,
HOUSE_LEVEL_REWARD_OBJECT = 1
};
// HouseVisitType enum - 4 values
enum HouseVisitType : uint8
{
HOUSE_VISIT_UNKNOWN = 0,
HOUSE_VISIT_FRIEND = 1,
HOUSE_VISIT_GUILD = 2,
HOUSE_VISIT_PARTY = 3
};
// HousingItemToastType enum - 5 values
enum HousingItemToastType : uint8
{
HOUSING_ITEM_TOAST_ROOM = 0,
HOUSING_ITEM_TOAST_FIXTURE = 1,
HOUSING_ITEM_TOAST_CUSTOMIZATION = 2,
HOUSING_ITEM_TOAST_DECOR = 3,
HOUSING_ITEM_TOAST_HOUSE = 4
};
// HousingRoomComponentFloorType enum - 1 value
enum HousingRoomComponentFloorType : uint8
{
HOUSING_ROOM_COMPONENT_FLOOR_TYPE_FLOOR = 0
};
// HousingDecorType enum - 5 values
enum HousingDecorType : uint8
{
HOUSING_DECOR_TYPE_NONE = 0,
HOUSING_DECOR_TYPE_FLOOR = 1,
HOUSING_DECOR_TYPE_WALL = 2,
HOUSING_DECOR_TYPE_CEILING = 3,
HOUSING_DECOR_TYPE_FLOORING = 4
};
// HouseLevelRewardValueType enum - 4 values
enum HouseLevelRewardValueType : uint8
{
HOUSE_LEVEL_REWARD_EXTERIOR_DECOR = 0,
HOUSE_LEVEL_REWARD_INTERIOR_DECOR = 1,
HOUSE_LEVEL_REWARD_ROOMS = 2,
HOUSE_LEVEL_REWARD_FIXTURES = 3
};
// Constants
static constexpr uint32 MAX_HOUSING_DECOR_PER_ROOM = 50;
static constexpr uint32 MAX_HOUSING_ROOMS_PER_HOUSE = 20;
static constexpr uint32 MAX_HOUSING_FIXTURES_PER_HOUSE = 10;
static constexpr uint32 MAX_HOUSING_DYE_SLOTS = 3;
static constexpr uint32 MAX_NEIGHBORHOOD_PLOTS = 55;
static constexpr uint32 MAX_NEIGHBORHOOD_MANAGERS = 5;
static constexpr uint32 MAX_PENDING_INVITES = 20;
static constexpr uint32 MIN_CHARTER_SIGNATURES = 4;
static constexpr uint8 INVALID_PLOT_INDEX = 255;
static constexpr uint32 HOUSING_MAX_NAME_LENGTH = 64;
static constexpr uint64 HOUSE_PURCHASE_COST_COPPER = 1000ULL * 10000ULL; // 1000g (sniff: 0x989680 = 10,000,000 copper)
static constexpr uint64 HOUSE_MOVE_COST_COPPER = 500ULL * 10000ULL; // 500g move cost
static constexpr uint32 MAX_HOUSE_LEVEL = 20;
// Starter favor granted on house purchase (sniff: ChangeAmount=910, NewFavorTotal=910 in the
// post-purchase HousingSvcsUpdateHousesLevelFavor pair).
static constexpr uint64 HOUSE_PURCHASE_STARTER_FAVOR = 910;
// Quest 91863 objective 17 ("Acquire a house") kill credit, granted on successful purchase.
static constexpr uint32 NPC_KILL_CREDIT_BUY_HOME = 248858;
// Spell applied during housing decor edit mode (creates "phased-out" visual effect)
// Sniff: aura slot 51, Flags=NoCaster, ActiveFlags=15, CastLevel=36
static constexpr uint32 SPELL_HOUSING_EDIT_MODE_AURA = 1263303;
// Spell applied when player enters their own housing plot
// Sniff: aura slot 50/55, Flags=NoCaster, ActiveFlags=1-2, CastLevel=36
static constexpr uint32 SPELL_HOUSING_PLOT_ENTER = 1239847;
// Second spell applied when player enters their own housing plot
// Sniff: aura slot 56, Flags=NoCaster, ActiveFlags=1, CastLevel=36
static constexpr uint32 SPELL_HOUSING_PLOT_PRESENCE = 469226;
// Third spell applied on first plot enter ? replaces slot 9 aura
// Sniff: aura slot 9, Flags=NoCaster|Scalable(9), ActiveFlags=1, CastLevel=36, has PointsCount
static constexpr uint32 SPELL_HOUSING_PLOT_ENTER_2 = 1266699;
static constexpr uint32 SPELL_HOUSING_MAP_ENTRY_FIXUP = 1272741; // "Housing Fixup Aura"
static constexpr uint32 SPELL_HOUSING_MAP_ENTRY_REACT = 1263578; // "Player Action React (DNT)"
static constexpr uint32 SPELL_HOUSING_MAP_ENTRY_ENDEAVOR = 1276064; // "[DNT] Endeavor Cover Aura"
static constexpr uint32 SPELL_HOUSING_MAP_ENTRY_NEIGHBOR = 1227147; // "In Your Neighborhood"
static constexpr uint32 VISUAL_HOUSING_MAP_ENTRY_NEIGHBOR = 503683;
static constexpr uint32 QUEST_HOUSING_TUTORIAL_COMPLETE = 94455; // "Home at Last"
static constexpr uint32 SPELL_HOUSING_TUTORIAL_DONE_1 = 1285428;
static constexpr uint32 SPELL_HOUSING_TUTORIAL_DONE_2 = 1285424;
static constexpr uint32 SPELL_HOUSING_TUTORIAL_DONE_3 = 1266699;
static constexpr uint32 WORLDSTATE_HOUSING_COUNTER_1 = 13436;
static constexpr uint32 WORLDSTATE_HOUSING_COUNTER_2 = 13437;
static constexpr uint32 WORLDSTATE_HOUSING_COUNTER_3 = 13438;
static constexpr uint32 WORLDSTATE_HOUSING_COUNTER_4 = 16035;
static constexpr uint32 WORLDSTATE_HOUSING_COUNTER_5 = 16711;
static constexpr uint32 WORLDSTATE_HOUSING_INTERIOR = 30906;
static constexpr uint32 WORLDSTATE_HOUSING_PLOT_BASE = 40000;
inline uint32 MakeHousingPlotWorldStateId(uint32 neighborhoodMapId, uint32 plotIndex)
{
return WORLDSTATE_HOUSING_PLOT_BASE + (neighborhoodMapId * 100u) + plotIndex;
}
static constexpr uint32 HOUSING_WORLDSTATE_INTERVAL_MS = 300;
static constexpr uint32 HOUSING_WORLDSTATE_INCREMENT = 1333;
static constexpr uint32 HOUSING_WORLDSTATE_INCREMENT_2 = 7233;
static constexpr uint32 HOUSING_COSMETIC_PHASES[] =
{
25571, 26216, 27429, 27442, 27489, 27695,
28304, 28312, 28313, 28314, 28315, 28316,
28320, 28339, 28370, 28748
};
static constexpr uint32 HOUSING_COSMETIC_PHASE_COUNT = sizeof(HOUSING_COSMETIC_PHASES) / sizeof(HOUSING_COSMETIC_PHASES[0]);
static constexpr uint32 HOUSING_COSMETIC_PHASE_DELAY_MS = 10000;
static constexpr float HOUSING_ROOM_GRID_SPACING = 24.0f;
static constexpr int32 HORDE_HOUSE_BUILDING_SHELL_FDI = 6322976;
static constexpr int32 HORDE_HOUSE_INTERIOR_ROOM_FDIS[] = {
6426613, // Main room / wall section (also used as corner)
6426431, // Small room variant
6426641, // Small room variant
6426647, // Small room variant
6426665, // Large room corner
6426605, // Room ceiling
6426671, // Room wall with door opening
6426452, // Small room with specific configuration
6426672 // Room section variant
};
static constexpr uint32 HORDE_HOUSE_INTERIOR_ROOM_COUNT = sizeof(HORDE_HOUSE_INTERIOR_ROOM_FDIS) / sizeof(HORDE_HOUSE_INTERIOR_ROOM_FDIS[0]);
static constexpr float HORDE_HOUSE_FLOOR_HEIGHT = 7.0f; // Vertical spacing between stacked rooms
// HouseExteriorWmoDataID for Horde theme (from sniff)
static constexpr int32 HORDE_HOUSE_EXTERIOR_WMO_DATA_ID = 87;
// Max players allowed on a housing map (exterior neighborhood + interior combined)
static constexpr uint32 MAX_HOUSING_MAP_PLAYERS = 40;
// Housing warning flags ? reasons why housing features may be restricted
enum HousingWarningFlag : uint32
{
HOUSING_WARNING_NONE = 0x00,
HOUSING_WARNING_EXPANSION_REQUIRED = 0x01, // Player needs The War Within expansion
HOUSING_WARNING_LEVEL_TOO_LOW = 0x02, // Player below minimum housing level
HOUSING_WARNING_FACTION_RESTRICTED = 0x04, // Faction-specific restriction
HOUSING_WARNING_SERVICE_DISABLED = 0x08, // Housing service disabled via CVar
};
// Minimum player level to access housing features
static constexpr uint32 HOUSING_MIN_PLAYER_LEVEL = 10;
// Required expansion for housing access (The War Within = 10)
static constexpr uint32 HOUSING_REQUIRED_EXPANSION = 10;
#endif // TRINITYCORE_HOUSING_DEFINES_H
File diff suppressed because it is too large Load Diff
-258
View File
@@ -1,258 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef HousingMap_h__
//#define HousingMap_h__
//
//#include "Housing.h"
//#include "Map.h"
//#include <memory>
//#include <unordered_set>
//
//class AreaTrigger;
//class Housing;
//class HousingMirrorEntity;
//class HousingRoomEntity;
//class MeshObject;
//class Neighborhood;
//class Player;
//
//class TC_GAME_API HousingMap : public Map
//{
//public:
// HousingMap(uint32 id, time_t expiry, uint32 instanceId, Difficulty spawnMode, uint32 neighborhoodId);
// ~HousingMap();
//
// void InitVisibilityDistance() override;
// void LoadGridObjects(NGridType* grid, Cell const& cell) override;
// bool AddPlayerToMap(Player* player, bool initPlayer = true) override;
// void RemovePlayerFromMap(Player* player, bool remove) override;
//
// Housing* GetHousingForPlayer(ObjectGuid playerGuid) const;
// AreaTrigger* GetPlotAreaTrigger(uint8 plotIndex);
// // Returns the plot index whose plot-bounds AT equals `atGuid`, or -1 when none.
// int8 GetPlotIndexForAreaTrigger(ObjectGuid atGuid) const;
// GameObject* GetPlotGameObject(uint8 plotIndex);
// void SetPlotOwnershipState(uint8 plotIndex, bool owned);
// HousingPlotOwnerType GetPlotOwnerTypeForPlayer(Player const* player, uint8 plotIndex) const;
// void SendPerPlayerPlotWorldStates(Player* player);
// Neighborhood* GetNeighborhood() const { return _neighborhood; }
// uint32 GetNeighborhoodId() const { return _neighborhoodId; }
//
// void LoadNeighborhoodData();
// void SpawnPlotGameObjects();
// void LockPlotGrids();
//
// // Player housing instance tracking
// void AddPlayerHousing(ObjectGuid playerGuid, Housing* housing);
// void RemovePlayerHousing(ObjectGuid playerGuid);
//
// // Fixture override map: hookID ? ExteriorComponentID from player's fixture selections.
// // When provided, SpawnExtCompTree uses these instead of the DB2 default component at each hook.
// using FixtureOverrideMap = std::unordered_map<uint32 /*hookID*/, uint32 /*extCompID*/>;
//
// // Root override map: componentType ? componentID from player's root fixture selections
// // (e.g., player chose a specific roof variant). When provided, SpawnFullHouseMeshObjects
// // uses these instead of the DB2 default root for that type.
// using RootOverrideMap = std::unordered_map<uint8 /*componentType*/, uint32 /*compID*/>;
//
// // House structure GO management
// GameObject* SpawnHouseForPlot(uint8 plotIndex, Position const* customPos,
// int32 exteriorComponentID, int32 houseExteriorWmoDataID,
// FixtureOverrideMap const* fixtureOverrides = nullptr,
// RootOverrideMap const* rootOverrides = nullptr);
// void DespawnHouseForPlot(uint8 plotIndex);
// void RespawnDoorGOAtHook(uint8 plotIndex, uint32 hookID, uint32 doorComponentID, Housing const* housing, Player* player = nullptr);
// void DespawnDoorGO(uint8 plotIndex);
// GameObject* GetHouseGameObject(uint8 plotIndex);
// int8 GetPlotIndexForHouseGO(ObjectGuid goGuid) const;
// uint32 GetHouseGameObjectCount() const { return static_cast<uint32>(_houseGameObjects.size()); }
//
// // House-exterior root mirror (HighGuid::Entity, objectType=18). Carries the
// // plot's world position in a single FMirroredPositionData_C fragment, used
// // by the client's world-map icon picker as the target of
// // FHousingPlayerHouse_C.EntityGUID (struct offset +56). Spawned 1:1 with
// // the exterior root MeshObject at SpawnHouseForPlot time. See
// // docs/HOUSING_ENTITY_MIRROR.md (pending) / memory/housing_entity_mirror_architecture.md.
// HousingMirrorEntity* GetHouseMirror(uint8 plotIndex) const;
// ObjectGuid GetHouseMirrorGuid(uint8 plotIndex) const;
// // Full list of per-piece Group A mirrors for this plot (one per visible
// // exterior fixture MeshObject, Type 9/10/11/12). Returns empty if no
// // house spawned. Index 0 is the Type-9 root (PieceAndRoot tags); the
// // others (Piece tag only) come from Roof/Door/Window pieces in spawn
// // order. The root mirror's GUID is the canonical "house mirror GUID"
// // referenced by FHousingPlayerHouse_C.EntityGUID.
// std::vector<HousingMirrorEntity*> GetHouseMirrors(uint8 plotIndex) const;
// // Deterministic mirror-GUID derivation that does not require the mirror to
// // exist yet ? used by proxy emission for neighbour plots whose plot index
// // and bnet owner are known from NeighborhoodMirror data. pieceIndex defaults
// // to 0 (the Type-9 root mirror) which is the canonical GUID referenced by
// // FHousingPlayerHouse_C.EntityGUID; pieceIndex 1+ identify the non-root
// // Group A mirrors (Roof/Door/Window).
// ObjectGuid MakeHouseMirrorGuid(uint8 plotIndex, uint32 bnetAccountId, uint8 pieceIndex = 0) const;
//
// // "Group B" per-piece mesh-level mirrors. Retail pairs EACH visible
// // exterior fixture MeshObject (Base/Roof/Door/Window ? ExteriorComponent
// // Type 9/10/11/12) with one untagged FMirroredPositionData_C Entity
// // mirror whose AttachParent is the piece's MeshObject. Sniff idx 9984:
// // 4 Group A (44-byte values) + 4 Group B (52-byte values, AttachParent=
// // MeshObject serialises longer). Without these per-piece anchors the
// // client's spatial index is missing finer-grained hooks (door-hover
// // detection, expert-mode placement preview off non-root meshes).
// HousingMirrorEntity* GetHouseMeshMirror(uint8 plotIndex) const;
// ObjectGuid GetHouseMeshMirrorGuid(uint8 plotIndex) const;
// ObjectGuid MakeHouseMeshMirrorGuid(uint8 plotIndex, uint32 bnetAccountId, uint8 pieceIndex = 0) const;
// // Full list of per-piece Group B mirrors for this plot (one per fixture
// // MeshObject of Type 9/10/11/12). Returns empty if no house spawned.
// std::vector<HousingMirrorEntity*> GetHouseMeshMirrors(uint8 plotIndex) const;
//
// // Lightweight Housing/2 identity room entity (HighGuid::Housing subType=2,
// // objectType=18) ? the authoritative room. Retail-verified architecture:
// // one Housing/2 identity per plot + one component MeshObject attached to
// // it (carries the Geobox). The unified model replaces the old dual-
// // MeshObject pattern. Group A Entity mirrors attach here.
// HousingRoomEntity* GetRoomIdentityEntity(uint8 plotIndex) const;
// ObjectGuid GetRoomIdentityGuid(uint8 plotIndex) const;
//
// // MeshObject management (housing fixture rendering)
// // pos: local-space position for child pieces (or world position for root pieces)
// // worldPos: if non-null, used for server-side grid placement (child pieces must be in parent's grid cell)
// MeshObject* SpawnHouseMeshObject(uint8 plotIndex, int32 fileDataID, bool isWMO,
// Position const& pos, QuaternionData const& rot, float scale,
// ObjectGuid houseGuid, int32 exteriorComponentID, int32 houseExteriorWmoDataID,
// uint8 exteriorComponentType = 9, uint8 houseSize = 2, int32 exteriorComponentHookID = -1,
// ObjectGuid attachParent = ObjectGuid::Empty, uint8 attachFlags = 0,
// Position const* worldPos = nullptr);
// void SpawnFullHouseMeshObjects(uint8 plotIndex, Position const& housePos,
// QuaternionData const& houseRot, ObjectGuid houseGuid,
// int32 exteriorComponentID, int32 houseExteriorWmoDataID,
// int32 factionRestriction = NEIGHBORHOOD_FACTION_ALLIANCE,
// FixtureOverrideMap const* fixtureOverrides = nullptr,
// RootOverrideMap const* rootOverrides = nullptr);
// void SpawnHordeHouseMeshObjects(uint8 plotIndex, Position const& housePos,
// QuaternionData const& houseRot, ObjectGuid houseGuid,
// int32 exteriorComponentID, int32 houseExteriorWmoDataID);
// uint32 SpawnExtCompTree(uint8 plotIndex, uint32 extCompID,
// Position const& pos, QuaternionData const& rot,
// ObjectGuid houseGuid, int32 houseExteriorWmoDataID,
// ObjectGuid parentGuid, Position const* worldPos, int32 depth = 0,
// FixtureOverrideMap const* fixtureOverrides = nullptr,
// int32 hookIDOverride = -1);
// void DespawnAllMeshObjectsForPlot(uint8 plotIndex);
//
// // Targeted fixture mesh operations (no full house rebuild)
// // Finds and removes the MeshObject at the given hookID for a plot, sends DESTROY to nearby players.
// MeshObject* FindMeshObjectByHookID(uint8 plotIndex, int32 hookID);
// void DespawnSingleMeshObject(uint8 plotIndex, ObjectGuid meshGuid);
// // Spawn a single fixture component at a hook and send CREATE to a specific player.
// MeshObject* SpawnFixtureAtHook(uint8 plotIndex, uint32 hookID, uint32 componentID,
// ObjectGuid houseGuid, int32 houseExteriorWmoDataID, Player* target);
//
// // Room entity management (provides Geobox for client OutsidePlotBounds check)
// void SpawnRoomForPlot(uint8 plotIndex, Position const& housePos,
// QuaternionData const& houseRot, ObjectGuid houseGuid);
// void DespawnRoomForPlot(uint8 plotIndex);
//
// // Decor management. Functional decor (HouseDecorData.GameObjectID > 0) spawns
// // as an interactive GameObject with FHousingDecor_C + FMirroredPositionData_C
// // fragments ? retains sit/open/use behavior. Visual-only decor spawns as a
// // MeshObject. Returns true on success.
// bool SpawnDecorItem(uint8 plotIndex, Housing::PlacedDecor const& decor, ObjectGuid houseGuid);
// void DespawnDecorItem(uint8 plotIndex, ObjectGuid decorGuid);
// void DespawnAllDecorForPlot(uint8 plotIndex);
// void SpawnAllDecorForPlot(uint8 plotIndex, Housing const* housing);
// void UpdateDecorPosition(uint8 plotIndex, ObjectGuid decorGuid, Position const& pos, QuaternionData const& rot, float scale = 1.0f);
//
// // Track which plot a player is currently visiting (set by at_housing_plot)
// void SetPlayerCurrentPlot(ObjectGuid playerGuid, uint8 plotIndex) { _playerCurrentPlot[playerGuid] = plotIndex; }
// void ClearPlayerCurrentPlot(ObjectGuid playerGuid) { _playerCurrentPlot.erase(playerGuid); }
// int8 GetPlayerCurrentPlot(ObjectGuid playerGuid) const
// {
// auto itr = _playerCurrentPlot.find(playerGuid);
// return itr != _playerCurrentPlot.end() ? static_cast<int8>(itr->second) : -1;
// }
//
// // Accessor for diagnostic logging (decor GUID ? MeshObject GUID map)
// std::unordered_map<ObjectGuid, ObjectGuid> const& GetDecorGuidMap() const { return _decorGuidToGoGuid; }
//
// // Accessor for fixture MeshObjects (plotIndex ? vector of MeshObject GUIDs)
// std::unordered_map<uint8, std::vector<ObjectGuid>> const& GetPlotMeshObjects() const { return _meshObjects; }
//
// // Manual spell packet helpers ? called from AddPlayerToMap and at_housing_plot AT script.
// // These spells don't exist in DB2, so CastSpell() silently fails; manual packets are required.
// void SendPostTutorialAuras(Player* player);
// void SendPlotEnterSpellPackets(Player* player, uint8 plotIndex);
// void SendPlotLeaveAuraRemoval(Player* player);
//
// // Blizzlike neighborhood-map-entry aura burst. Sniff-decoded from
// // dump_12.0.1.66838_2026-04-15_09-35-59.pkt at idx 9985-10000 (and
// // cross-checked against the 2026-04-10 capture). Emits the four
// // housing-specific AURA_UPDATE+SPELL_START+SPELL_GO triples that retail
// // sends immediately after the big UPDATE_OBJECT batch: Housing Fixup
// // (1272741 slot 20), Player Action React (1263578 slot 22), Endeavor
// // Cover (1276064 slot 53), In Your Neighborhood (1227147 slot 121 with
// // SpellXSpellVisualID 503683). Each aura has ActiveFlags and Flags
// // sniff-verified per slot. Non-housing pre-existing character auras
// // (e.g. class talents) are intentionally excluded ? core TC aura
// // resync handles those.
// void SendNeighborhoodMapEntryAuras(Player* player);
//
//private:
// uint32 _neighborhoodId;
// Neighborhood* _neighborhood;
// std::unordered_map<ObjectGuid, Housing*> _playerHousings;
// std::unordered_map<uint8, ObjectGuid> _plotAreaTriggers;
// std::unordered_map<uint8, ObjectGuid> _plotGameObjects;
//
// // House structure GO tracking (plotIndex -> house GO GUID)
// std::unordered_map<uint8, ObjectGuid> _houseGameObjects;
//
// // Group A house-exterior Entity mirrors (HighGuid::Entity, objectType=18)
// // ? one per visible exterior fixture MeshObject (Type 9/10/11/12). The
// // Type-9 (Base) entry at index 0 carries both Tag_HouseExteriorPiece +
// // Tag_HouseExteriorRoot and is the GUID referenced by every external
// // proxy (FHousingPlayerHouse_C.EntityGUID). The other three carry
// // Tag_HouseExteriorPiece only. Co-spawned with the house and despawned
// // together. Vector since retail emits 4 of these per plot (sniff idx
// // 9984 in dump_12.0.1.66838_2026-04-15_09-35-59).
// std::unordered_map<uint8, std::vector<std::unique_ptr<HousingMirrorEntity>>> _houseMirrorEntities;
//
// // "Group B" per-piece mesh-level Entity mirrors, one per visible exterior
// // fixture MeshObject (Type 9/10/11/12). Co-spawned with the house and
// // despawned together. Vector since retail emits 4 of these per plot.
// std::unordered_map<uint8, std::vector<std::unique_ptr<HousingMirrorEntity>>> _houseMeshMirrorEntities;
//
// // Lightweight Housing/2 identity room GUID per plot. The entity itself is
// // a WorldObject owned by the map's object store; we only track its GUID.
// std::unordered_map<uint8, ObjectGuid> _roomIdentityGuids;
//
// // MeshObject tracking (plotIndex -> vector of MeshObject GUIDs)
// std::unordered_map<uint8, std::vector<ObjectGuid>> _meshObjects;
//
// // Room entity tracking (plotIndex -> room/component MeshObject GUIDs)
// std::unordered_map<uint8, ObjectGuid> _roomEntities; // room "entity" MeshObject
// std::unordered_map<uint8, ObjectGuid> _roomComponentMeshes; // room component MeshObject (has Geobox)
//
// // Decor GO tracking
// std::unordered_map<uint8, std::vector<ObjectGuid>> _decorGameObjects; // plotIndex -> decor GO GUIDs
// std::unordered_map<ObjectGuid, ObjectGuid> _decorGuidToGoGuid; // decor GUID -> GO GUID
// std::unordered_map<ObjectGuid, uint8> _decorGuidToPlotIndex; // decor GUID -> plotIndex
// std::unordered_set<uint8> _decorSpawnedPlots; // plots whose decor has been spawned
// std::unordered_map<ObjectGuid, uint8> _playerCurrentPlot; // player GUID -> current visited plot index
//};
//
//#endif // HousingMap_h__
File diff suppressed because it is too large Load Diff
-475
View File
@@ -1,475 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef HousingMgr_h__
//#define HousingMgr_h__
//
//#include "Define.h"
//#include "HousingDefines.h"
//#include "ObjectGuid.h"
//#include "Position.h"
//#include <string>
//#include <unordered_map>
//#include <vector>
//
//class Neighborhood;
//struct ExteriorComponentEntry;
//struct ExteriorComponentExitPointEntry;
//struct ExteriorComponentHookEntry;
//struct RoomComponentOptionEntry;
//struct RoomComponentTextureEntry;
//
//struct HouseDecorData
//{
// uint32 ID = 0;
// std::string Name;
// float InitialRotation[3] = {};
// int32 Field_003 = 0;
// int32 GameObjectID = 0;
// int32 Flags = 0;
// uint8 Type = 0;
// uint8 ModelType = 0;
// int32 ModelFileDataID = 0;
// int32 ThumbnailFileDataID = 0;
// int32 WeightCost = 1;
// int32 ItemID = 0;
// float InitialScale = 1.0f;
// int32 FirstAcquisitionBonus = 0; // House XP gained on first acquisition (from Lua API)
// int32 OrderIndex = 0;
// int8 Size = 0; // HousingCatalogEntrySize (inferred from Lua API)
// int32 StartingQuantity = 0;
// int32 UiModelSceneID = 0;
//};
//
//struct HouseLevelData
//{
// uint32 ID = 0;
// int32 Level = 0;
// int32 QuestID = 0;
// // Budget fields populated from fallback defaults (not in HouseLevelData DB2)
// int32 InteriorDecorPlacementBudget = 0;
// int32 ExteriorDecorPlacementBudget = 0;
// int32 RoomPlacementBudget = 0;
// int32 ExteriorFixtureBudget = 0;
//};
//
//struct HouseRoomData
//{
// uint32 ID = 0;
// std::string Name;
// int8 Size = 0;
// int32 Flags = 0; // HousingRoomFlags bitmask
// int32 Field_002 = 0;
// int32 RoomWmoDataID = 0;
// int32 UiTextureAtlasElementID = 0;
// int32 WeightCost = 1;
//
// bool IsBaseRoom() const { return (Flags & HOUSING_ROOM_FLAG_BASE_ROOM) != 0; }
// bool HasStairs() const { return (Flags & HOUSING_ROOM_FLAG_HAS_STAIRS) != 0; }
//};
//
//struct RoomDoorInfo
//{
// uint32 RoomComponentID = 0;
// float OffsetPos[3] = {};
// float OffsetRot[3] = {};
// uint8 ConnectionType = 0; // RoomConnectionType
//};
//
///// Full room component data (all types: wall, floor, ceiling, stairs, pillar, doorway)
//struct RoomComponentData
//{
// uint32 ID = 0;
// uint32 RoomWmoDataID = 0;
// float OffsetPos[3] = {};
// float OffsetRot[3] = {};
// int32 ModelFileDataID = 0; // The WMO/mesh file to spawn
// uint8 Type = 0; // HousingRoomComponentType
// int32 MeshStyleFilterID = 0;
// uint8 ConnectionType = 0; // RoomConnectionType (for doorways)
// int32 Flags = 0;
//};
//
//struct HouseThemeData
//{
// uint32 ID = 0;
// std::string Name;
// int32 Flags = 0; // DB2: Flags
// int32 ParentThemeID = 0; // DB2: ParentThemeID FK->HouseTheme
//};
//
//struct HouseDecorThemeSetData
//{
// uint32 ID = 0;
// std::string Name;
// int32 HouseThemeID = 0;
// int32 HouseDecorCategoryID = 0;
//};
//
//struct NeighborhoodMapData
//{
// uint32 ID = 0;
// float Origin[3] = {}; // DB2: Position[3]
// int32 MapID = 0; // DB2: MapID
// float EntryRotation = 0.0f; // DB2: EntryRotation
// uint32 UiTextureKitID = 0; // DB2: UiTextureKitID
// int32 Flags = 0; // DB2: Flags (bitmask: 0x1=Alliance, 0x2=Horde, 0x4=SystemGenerate)
//};
//
//struct NeighborhoodPlotData
//{
// uint32 ID = 0;
// uint64 Cost = 0;
// std::string Name;
// float HousePosition[3] = {}; // Was named HousePosition before 12.0.0.64975
// float HouseRotation[3] = {}; // Was named HouseRotation before 12.0.0.64975
// float CornerstonePosition[3] = {};
// float CornerstoneRotation[3] = {};
// float TeleportPosition[3] = {};
// int32 NeighborhoodMapID = 0;
// int32 Field_010 = 0;
// int32 CornerstoneGameObjectID = 0;
// int32 PlotIndex = 0;
// int32 WorldState = 0;
// int32 PlotGameObjectID = 0;
// float TeleportFacing = 0.0f; // Facing angle at TeleportPosition
// int32 Field_016 = 0;
//};
//
//struct NeighborhoodNameGenData
//{
// uint32 ID = 0;
// std::string Prefix;
// std::string Middle;
// std::string Suffix;
// int32 NeighborhoodMapID = 0;
//};
//
//struct HouseDecorMaterialData
//{
// uint32 ID = 0;
// uint64 WMOMaterialReference = 0; // DB2: WMOMaterialReference
// int32 MaterialTextureIndex = 0; // DB2: MaterialTextureIndex
// int32 HouseThemeID = 0; // DB2: HouseThemeID FK->HouseTheme
// int32 TextureAFileDataID = 0; // DB2: TextureAFileDataID FK->FileData
// int32 TextureBFileDataID = 0; // DB2: TextureBFileDataID FK->FileData
//};
//
//struct HouseExteriorWmoData
//{
// uint32 ID = 0;
// std::string Name;
// int32 Flags = 0;
//};
//
//struct HouseLevelRewardInfoData
//{
// uint32 ID = 0;
// std::string Name;
// std::string Description;
// int32 HouseLevelDataID = 0; // DB2: HouseLevelDataID FK->HouseLevelData
// int32 Field_4 = 0; // DB2: Field_12_0_0_63967_004
// int32 IconFileDataID = 0; // DB2: IconFileDataID FK->FileData
//};
//
//struct NeighborhoodInitiativeData
//{
// uint32 ID = 0;
// std::string Name;
// std::string Description;
// int32 InitiativeType = 0;
// int32 Duration = 0;
// int32 RequiredParticipants = 0;
// int32 RewardCurrencyID = 0;
//};
//
//struct DecorCategoryData
//{
// uint32 ID = 0;
// std::string Name;
// int32 UiTextureAtlasElementID = 0; // DB2: UiTextureAtlasElementID
// int32 OrderIndex = 0; // DB2: OrderIndex
//};
//
//struct DecorSubcategoryData
//{
// uint32 ID = 0;
// std::string Name;
// int32 UiTextureAtlasElementID = 0; // DB2: UiTextureAtlasElementID
// int32 DecorCategoryID = 0;
// int32 OrderIndex = 0; // DB2: OrderIndex
//};
//
//struct DecorDyeSlotData
//{
// uint32 ID = 0;
// int32 DyeColorCategoryID = 0; // DB2: DyeColorCategoryID FK->DyeColorCategory
// int32 HouseDecorID = 0;
// int32 OrderIndex = 0; // DB2: OrderIndex
// int32 Channel = 0; // DB2: Channel
//};
//
//class TC_GAME_API HousingMgr
//{
//public:
// HousingMgr();
// HousingMgr(HousingMgr const&) = delete;
// HousingMgr(HousingMgr&&) = delete;
// HousingMgr& operator=(HousingMgr const&) = delete;
// HousingMgr& operator=(HousingMgr&&) = delete;
// ~HousingMgr();
//
// static HousingMgr& Instance();
//
// void Initialize();
//
// // DB2 data accessors
// HouseDecorData const* GetHouseDecorData(uint32 id) const;
// HouseLevelData const* GetLevelData(uint32 level) const;
// HouseRoomData const* GetHouseRoomData(uint32 id) const;
// HouseThemeData const* GetHouseThemeData(uint32 id) const;
// HouseDecorThemeSetData const* GetHouseDecorThemeSetData(uint32 id) const;
// NeighborhoodMapData const* GetNeighborhoodMapData(uint32 id) const;
// std::unordered_map<uint32, NeighborhoodMapData> const& GetAllNeighborhoodMapData() const { return _neighborhoodMapStore; }
// HouseDecorMaterialData const* GetHouseDecorMaterialData(uint32 id) const;
// HouseExteriorWmoData const* GetHouseExteriorWmoData(uint32 id) const;
// HouseLevelRewardInfoData const* GetHouseLevelRewardInfoData(uint32 id) const;
// NeighborhoodInitiativeData const* GetNeighborhoodInitiativeData(uint32 id) const;
// DecorCategoryData const* GetDecorCategoryData(uint32 id) const;
// DecorSubcategoryData const* GetDecorSubcategoryData(uint32 id) const;
//
// // Indexed lookups
// std::vector<DecorSubcategoryData const*> GetSubcategoriesForCategory(uint32 categoryId) const;
// std::vector<uint32> GetDecorIdsForSubcategory(uint32 subcategoryId) const;
// std::vector<DecorDyeSlotData const*> GetDyeSlotsForDecor(uint32 houseDecorId) const;
// std::vector<HouseDecorMaterialData const*> GetMaterialsForTheme(uint32 houseThemeId) const;
// std::vector<HouseLevelRewardInfoData const*> GetRewardsForLevel(uint32 houseLevelId) const;
//
// // Neighborhood plot lookups
// uint32 GetPlotStoreSize() const { return uint32(_neighborhoodPlotStore.size()); }
// std::vector<NeighborhoodPlotData const*> GetPlotsForMap(uint32 neighborhoodMapId) const;
// // Find a plot by its cornerstone GO entry within a specific neighborhood map
// NeighborhoodPlotData const* GetPlotByCornerstoneEntry(uint32 neighborhoodMapId, uint32 cornerstoneGoEntry) const;
//
// // Resolve the canonical DB2 PlotIndex from a client-supplied GUID.
// // The client sends the cornerstone GO GUID as "NeighborhoodGuid" in many CMSGs.
// // We extract the GO entry from that GUID and look up the DB2 plot data.
// // Returns the DB2 PlotIndex, or -1 if resolution failed (caller should use clientPlotIndex as fallback).
// int32 ResolvePlotIndex(ObjectGuid cornerstoneGuid, Neighborhood const* neighborhood) const;
//
// // Get the NeighborhoodMapData for a world MapID (returns nullptr if not a neighborhood)
// NeighborhoodMapData const* GetNeighborhoodMapDataForWorldMap(uint32 mapId) const;
//
// // Check if a world MapID corresponds to a neighborhood map
// bool IsNeighborhoodWorldMap(uint32 mapId) const;
// // Get the NeighborhoodMapID for a world MapID (returns 0 if not a neighborhood)
// uint32 GetNeighborhoodMapIdByWorldMap(uint32 mapId) const;
// // Get the world MapID for a NeighborhoodMapID (reverse lookup, returns 0 if not found)
// uint32 GetWorldMapIdByNeighborhoodMapId(uint32 neighborhoodMapId) const;
//
// // Name generation
// std::string GenerateNeighborhoodName(uint32 neighborhoodMapId) const;
//
// // Level-based limits
// uint32 GetMaxDecorForLevel(uint32 level) const;
//
// // Budget accessors (WeightCost-based)
// uint32 GetQuestForLevel(uint32 level) const;
// // Cumulative lifetime Favor needed to unlock `level`. Values extracted
// // from the retail client via C_Housing.GetHouseLevelFavorForLevel on
// // build 12.0.1.66838. See implementation for the full table and
// // semantics. Does not currently gate level-up (needs NPC/auto mechanism
// // verified first).
// uint32 GetFavorThresholdForLevel(uint32 level) const;
// uint32 GetInteriorDecorBudgetForLevel(uint32 level) const;
// uint32 GetExteriorDecorBudgetForLevel(uint32 level) const;
// uint32 GetRoomBudgetForLevel(uint32 level) const;
// uint32 GetFixtureBudgetForLevel(uint32 level) const;
// uint32 GetDecorWeightCost(uint32 decorEntryId) const;
// uint32 GetRoomWeightCost(uint32 roomEntryId) const;
//
// // Room connectivity
// bool IsBaseRoom(uint32 roomEntryId) const;
// uint32 GetRoomDoorCount(uint32 roomEntryId) const;
// std::vector<RoomDoorInfo> const* GetRoomDoors(uint32 roomWmoDataId) const;
//
// // Room component data (all types: wall, floor, ceiling, stairs, doorway, etc.)
// std::vector<RoomComponentData> const* GetRoomComponents(uint32 roomWmoDataId) const;
//
// // Faction-to-theme mapping (sniff-verified: Alliance=6, Horde=2)
// int32 GetFactionDefaultThemeID(int32 factionRestriction) const;
// int32 GetDefaultSubThemeID(int32 baseThemeID) const;
// int32 GetBaseThemeID(int32 themeID) const;
//
// // Find a RoomComponentOption matching a specific MeshStyleFilterID + theme
// // The retail DB2 links RoomComponent to RoomComponentOption via MeshStyleFilterID.
// // Returns nullptr if no match found
// RoomComponentOptionEntry const* FindRoomComponentOption(int32 meshStyleFilterID, int32 houseThemeID) const;
// std::vector<RoomComponentOptionEntry const*> FindAllRoomComponentOptions(int32 meshStyleFilterID, int32 houseThemeID) const;
//
// // Get the base room entry ID (exterior geobox room, from DB2 IsBaseRoom flag, fallback 18)
// uint32 GetBaseRoomEntryId() const { return _baseRoomEntryId; }
//
// // Get the entry hall room entry ID (interior base room, sniff-verified: Room 46)
// // Room 18 = exterior plot geobox (SpawnRoomForPlot), Room 46 = interior entry hall
// uint32 GetEntryHallRoomEntryId() const { return _entryHallRoomEntryId; }
//
// // Room grid spacing for interior layout (~24 yards between room centers)
// float GetRoomGridSpacing() const { return _roomGridSpacing; }
//
// // RoomComponentTexture lookup: given a RoomComponentOption ID, find the texture ID
// // Returns the first matched RoomComponentTexture ID, or 0 if no link exists in DB2.
// int32 GetTextureIdForComponentOption(int32 roomComponentOptionID) const;
// // RoomComponentTexture by component type: fallback when per-option data is missing
// // Returns the first matching texture for a given component type (1=wall, 2=floor, 3=ceiling)
// int32 GetTextureIdForComponentType(uint8 componentType) const;
//
// // ExteriorComponent indexed lookups
// std::vector<ExteriorComponentHookEntry const*> const* GetHooksOnComponent(uint32 extCompID) const;
// ExteriorComponentExitPointEntry const* GetExitPoint(uint32 extCompID) const;
// int32 GetGroupForComponent(uint32 extCompID) const;
// std::vector<uint32> const* GetChildComponents(uint32 parentCompID) const;
// std::vector<uint32> const* GetRootComponentsForWmoData(uint32 wmoDataID) const;
// std::vector<uint32> const* GetComponentsInGroup(int32 groupID) const;
//
// // Fixture resolution: given a hook's component type, the house's WmoDataID, and
// // optionally the house size, returns the default fixture component ID
// // (Flags & 0x1, ParentComponentID == 0).
// // If houseSize is 0, returns any size match; otherwise filters to exact size.
// uint32 GetDefaultFixtureForType(uint8 componentType, uint32 wmoDataID, uint8 houseSize = 0) const;
//
// // Racial house style: maps player race to the appropriate HouseExteriorWmoDataID.
// // Night Elf ? 55, Blood Elf ? 56, other Alliance ? 9 (Human), other Horde ? 87 (Orc).
// static uint32 GetRacialWmoDataID(uint8 race, uint32 teamId);
//
// // Find the first HouseRoom entry with visual components (not the base room 18)
// uint32 GetDefaultVisualRoomEntry() const;
//
// // Starter decor (items granted on first house purchase)
// // Returns starter decor IDs filtered by faction (teamId: ALLIANCE=469, HORDE=67)
// // Sniff-verified: Alliance and Horde receive different starter decor sets
// std::vector<uint32> GetStarterDecorIds(uint32 teamId) const;
// // Returns {DecorID, StartingQuantity} pairs for populating the catalog on purchase
// std::vector<std::pair<uint32, int32>> GetStarterDecorWithQuantities(uint32 teamId) const;
//
// // Access control ? checks if visitor can access a plot/house based on owner's settings
// // accessMask = HOUSE_SETTING_HOUSE_ACCESS_* for interior, HOUSE_SETTING_PLOT_ACCESS_* for exterior
// bool CanVisitorAccess(Player const* visitor, Player const* owner, uint32 settingsFlags, bool isInterior) const;
//
// // Same as CanVisitorAccess but works when owner is offline ? uses CharacterCache + the
// // visitor's own social/group/guild/neighborhood data to resolve friend/party/guild/neighbor
// // relationships symmetrically. Settings come from the persisted plotInfo->HouseSettingsFlags.
// bool CanVisitorAccessPlot(Player const* visitor, ObjectGuid ownerGuid, uint32 settingsFlags, bool isInterior) const;
//
// // Validation
// HousingResult ValidateDecorPlacement(uint32 decorId, Position const& pos, uint32 houseLevel) const;
//
//private:
// void LoadHouseDecorData();
// void LoadHouseLevelData();
// void LoadHouseRoomData();
// void LoadHouseThemeData();
// void LoadHouseDecorThemeSetData();
// void LoadNeighborhoodMapData();
// void LoadNeighborhoodPlotData();
// void LoadNeighborhoodNameGenData();
// void LoadHouseDecorMaterialData();
// void LoadHouseExteriorWmoData();
// void LoadHouseLevelRewardInfoData();
// void LoadNeighborhoodInitiativeData();
// void LoadRoomComponentData();
// void LoadDecorCategoryData();
// void LoadDecorSubcategoryData();
// void LoadDecorDyeSlotData();
// void LoadDecorXDecorSubcategoryData();
//
// // DB2 data stores indexed by ID
// std::unordered_map<uint32, HouseDecorData> _houseDecorStore;
// std::unordered_map<uint32, HouseLevelData> _houseLevelDataStore;
// std::unordered_map<uint32, HouseRoomData> _houseRoomStore;
// std::unordered_map<uint32, HouseThemeData> _houseThemeStore;
// std::unordered_map<uint32, HouseDecorThemeSetData> _houseDecorThemeSetStore;
// std::unordered_map<uint32, NeighborhoodMapData> _neighborhoodMapStore;
// std::unordered_map<uint32, NeighborhoodPlotData> _neighborhoodPlotStore;
// std::unordered_map<uint32, HouseDecorMaterialData> _houseDecorMaterialStore;
// std::unordered_map<uint32, HouseExteriorWmoData> _houseExteriorWmoStore;
// std::unordered_map<uint32, HouseLevelRewardInfoData> _houseLevelRewardInfoStore;
// std::unordered_map<uint32, NeighborhoodInitiativeData> _neighborhoodInitiativeStore;
// std::unordered_map<uint32, DecorCategoryData> _decorCategoryStore;
// std::unordered_map<uint32, DecorSubcategoryData> _decorSubcategoryStore;
// std::unordered_map<uint32, DecorDyeSlotData> _decorDyeSlotStore;
//
// // Lookup indexes
// std::unordered_map<uint32 /*neighborhoodMapId*/, std::vector<NeighborhoodPlotData const*>> _plotsByMap;
// std::unordered_map<uint32 /*neighborhoodMapId*/, std::vector<NeighborhoodNameGenData>> _nameGenByMap;
// std::unordered_map<uint32 /*level*/, HouseLevelData const*> _levelDataByLevel;
// std::unordered_map<uint32 /*houseThemeId*/, std::vector<HouseDecorMaterialData const*>> _materialsByTheme;
// std::unordered_map<uint32 /*houseLevelId*/, std::vector<HouseLevelRewardInfoData const*>> _rewardsByLevel;
// std::unordered_map<uint32 /*categoryId*/, std::vector<DecorSubcategoryData const*>> _subcategoriesByCategory;
// std::unordered_map<uint32 /*subcategoryId*/, std::vector<uint32 /*houseDecorId*/>> _decorsBySubcategory;
// std::unordered_map<uint32 /*houseDecorId*/, std::vector<DecorDyeSlotData const*>> _dyeSlotsByDecor;
//
// // Reverse lookup: world MapID -> NeighborhoodMap ID
// std::unordered_map<int32 /*worldMapId*/, uint32 /*neighborhoodMapId*/> _worldMapToNeighborhoodMap;
//
// // Room doorway map: RoomWmoDataID -> list of doorway components
// std::unordered_map<uint32 /*roomWmoDataId*/, std::vector<RoomDoorInfo>> _roomDoorMap;
//
// // All room components indexed by RoomWmoDataID (walls, floors, ceilings, stairs, doorways)
// std::unordered_map<uint32 /*roomWmoDataId*/, std::vector<RoomComponentData>> _roomComponentsByWmoData;
//
// // O(1) RoomComponentOption lookup: key = (uint64(MeshStyleFilterID) << 32) | uint32(HouseThemeID)
// std::unordered_map<uint64, RoomComponentOptionEntry const*> _roomCompOptionIndex;
// void BuildRoomComponentOptionIndex();
// void BuildExteriorComponentIndexes();
// void BuildRoomComponentTextureIndex();
// void DumpExteriorComponentDiagnostics();
// void DumpRoomComponentTextureDiagnostics();
// void EnsureDoorGameObjectTemplates();
//
// // Base room entry ID ? exterior geobox (from DB2 IsBaseRoom flag scan, fallback 18)
// uint32 _baseRoomEntryId = 0;
//
// // Entry hall room entry ID ? interior base room (second BASE_ROOM in DB2, fallback to _baseRoomEntryId)
// // Sniff-verified: Room 46 is the entry corridor with door connecting to the visual room
// uint32 _entryHallRoomEntryId = 0;
//
// // Room grid spacing (~24 yards between room centers)
// float _roomGridSpacing = HOUSING_ROOM_GRID_SPACING;
//
// // RoomComponentTexture indexes
// // RoomComponentOptionID ? RoomComponentTextureID (from RoomComponentOptionTexture join)
// std::unordered_map<int32 /*optionID*/, int32 /*textureID*/> _textureByOptionId;
// // componentType ? textureID (first matching texture per type, fallback)
// std::unordered_map<uint8 /*type*/, int32 /*textureID*/> _textureByComponentType;
//
// // ExteriorComponent indexes
// std::unordered_map<uint32 /*extCompID*/, std::vector<ExteriorComponentHookEntry const*>> _hooksByExtComp;
// std::unordered_map<uint32 /*extCompID*/, ExteriorComponentExitPointEntry const*> _exitPointByExtComp;
// std::unordered_map<uint32 /*extCompID*/, int32 /*groupID*/> _groupByExtComp;
// std::unordered_map<int32 /*groupID*/, std::vector<uint32 /*extCompID*/>> _extCompsByGroup;
// std::unordered_map<uint32 /*parentCompID*/, std::vector<uint32 /*childCompID*/>> _childrenByExtComp;
// std::unordered_map<uint32 /*wmoDataID*/, std::vector<uint32 /*compID*/>> _rootCompsByWmoDataId;
//
// // Fixture resolution: (componentType, wmoDataID, size) ? default component ID
// // Key = (uint64(componentType) << 40) | (uint64(wmoDataID) << 8) | size
// std::unordered_map<uint64, uint32> _defaultFixtureByTypeWmo;
//};
//
//#define sHousingMgr HousingMgr::Instance()
//
//#endif // HousingMgr_h__
File diff suppressed because it is too large Load Diff
-196
View File
@@ -1,196 +0,0 @@
/*
* this file is part of the trinitycore project. see authors file for copyright information
*
* this program is free software; you can redistribute it and/or modify it
* under the terms of the gnu general public license as published by the
* free software foundation; either version 2 of the license, or (at your
* option) any later version.
*
* this program is distributed in the hope that it will be useful, but without
* any warranty; without even the implied warranty of merchantability or
* fitness for a particular purpose. see the gnu general public license for
* more details.
*
* you should have received a copy of the gnu general public license along
* with this program. if not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef TRINITYCORE_INITIATIVE_MANAGER_H
//#define TRINITYCORE_INITIATIVE_MANAGER_H
//
//#include "Define.h"
//#include "HousingDefines.h"
//#include "ObjectGuid.h"
//#include <memory>
//#include <set>
//#include <unordered_map>
//#include <vector>
//
//class Neighborhood;
//class Player;
//class WorldSession;
//
//// Status of an individual task within an initiative
//enum InitiativeTaskStatus : uint32
//{
// INITIATIVE_TASK_STATUS_NOT_STARTED = 0,
// INITIATIVE_TASK_STATUS_IN_PROGRESS = 1,
// INITIATIVE_TASK_STATUS_COMPLETE = 2
//};
//
//// Tracks a single task's progress for a player within a neighborhood initiative
//struct InitiativeTaskProgress
//{
// uint32 TaskID = 0;
// uint32 Progress = 0;
// InitiativeTaskStatus Status = INITIATIVE_TASK_STATUS_NOT_STARTED;
//};
//
//// Runtime state for an active initiative instance in a neighborhood
//struct ActiveInitiative
//{
// uint64 DbId = 0; // neighborhood_initiatives.id
// uint64 NeighborhoodGuid = 0; // neighborhood_initiatives.neighborhoodGuid
// uint32 InitiativeID = 0; // NeighborhoodInitiative.db2 entry ID
// uint32 StartTime = 0; // Unix timestamp
// float Progress = 0.0f; // 0.0 to 1.0
// bool Completed = false;
//
// // Per-task progress (TaskID -> progress)
// std::unordered_map<uint32, InitiativeTaskProgress> TaskProgress;
//
// // Milestones reached (MilestoneIndex -> reached)
// std::unordered_map<uint32, bool> MilestonesReached;
//
// // Per-player contribution tracking: playerGuid -> taskId -> amount
// std::unordered_map<uint64, std::unordered_map<uint32, uint32>> PlayerContributions;
//
// // Per-player reward claims: milestoneIndex -> set of playerGuids who claimed
// std::unordered_map<uint32, std::set<uint64>> RewardClaims;
//};
//
//// Cached DB2 data for an initiative's tasks
//struct InitiativeTaskData
//{
// uint32 TaskID = 0;
// int32 CriteriaTreeID = 0; // DB2: CriteriaTreeID FK->CriteriaTree (task completion criteria)
// int32 QuestID = 0; // DB2: QuestID FK->QuestV2 (associated quest)
// int32 ProgressContributionAmount = 0; // DB2: ProgressContributionAmount (contribution weight per completion)
// int32 SortOrder = 0; // From InitiativeXTask join
//};
//
//// Cached DB2 data for an initiative's milestones
//struct InitiativeMilestoneData
//{
// uint32 MilestoneID = 0;
// int32 MilestoneOrderIndex = 0; // DB2: MilestoneOrderIndex
// float RequiredContributionAmount = 0.0f; // DB2: RequiredContributionAmount
// int32 Field_3 = 0; // DB2: Field_12_0_0_63534_003
//};
//
//class TC_GAME_API InitiativeManager
//{
//public:
// static InitiativeManager& Instance();
//
// InitiativeManager(InitiativeManager const&) = delete;
// InitiativeManager(InitiativeManager&&) = delete;
// InitiativeManager& operator=(InitiativeManager const&) = delete;
// InitiativeManager& operator=(InitiativeManager&&) = delete;
//
// // Lifecycle
// void Initialize();
// void LoadFromDB();
// void Update(uint32 diff);
//
// // DB2 data cache
// void BuildDB2IndexMaps();
// std::vector<InitiativeTaskData> GetTasksForInitiative(uint32 initiativeID) const;
// std::vector<InitiativeMilestoneData> GetMilestonesForCycle(uint32 cycleID) const;
// uint32 GetActiveCycleForInitiative(uint32 initiativeID) const;
//
// // Initiative lifecycle
// ActiveInitiative* StartInitiative(uint64 neighborhoodGuid, uint32 initiativeID);
// ActiveInitiative* GetActiveInitiative(uint64 neighborhoodGuid) const;
// std::vector<ActiveInitiative const*> GetInitiativesForNeighborhood(uint64 neighborhoodGuid) const;
// void CompleteInitiative(uint64 neighborhoodGuid, uint32 initiativeID);
//
// // Task progress
// void UpdateTaskProgress(uint64 neighborhoodGuid, uint32 initiativeID, uint32 taskID, uint32 progressDelta, Player* contributor);
// void ClearTaskCriteria(uint64 neighborhoodGuid, uint32 initiativeID, uint32 taskID);
//
// // CriteriaTree-based task matching ? called from CriteriaHandler when criteria progress fires
// // Checks if the updated criteria is referenced by any active initiative task's CriteriaTree,
// // and credits the community initiative accordingly.
// void OnCriteriaProgress(Player* player, uint32 criteriaId);
//
// // Reward queries and distribution
// bool HasUnclaimedRewards(uint64 neighborhoodGuid, uint32 initiativeID, uint64 playerGuid) const;
// bool ClaimMilestoneReward(uint64 neighborhoodGuid, uint32 initiativeID, uint32 milestoneIndex, Player* player);
//
// // Per-player contribution queries
// uint32 GetPlayerContribution(uint64 neighborhoodGuid, uint32 initiativeID, uint64 playerGuid) const;
// std::vector<std::pair<uint64, uint32>> GetTopContributors(uint64 neighborhoodGuid, uint32 initiativeID, uint32 limit) const;
// void UpdatePlayerInitiativeFavor(Player* player, uint64 neighborhoodGuid);
//
// // Send packets to a session
// void SendInitiativeServiceStatus(WorldSession* session, bool enabled) const;
// void SendPlayerInitiativeInfo(WorldSession* session, ObjectGuid const& neighborhoodGuid, uint64 neighborhoodLowGuid) const;
// void SendActivityLog(WorldSession* session, ObjectGuid const& neighborhoodGuid, uint64 neighborhoodLowGuid) const;
// void SendInitiativeRewardsResult(WorldSession* session, uint32 result) const;
//
// // Broadcast packets to all neighborhood members
// void BroadcastTaskComplete(Neighborhood* neighborhood, uint32 initiativeID, uint32 taskID) const;
// void BroadcastInitiativeComplete(Neighborhood* neighborhood, uint32 initiativeID) const;
// void BroadcastRewardAvailable(Neighborhood* neighborhood, uint32 initiativeID, uint32 milestoneIndex) const;
//
// // Auto-start initiatives for neighborhoods that don't have one
// void CheckAndStartInitiatives();
// // Retired 2026-05-11: SendInitiativeUpdateStatus / SendInitiativePointsUpdate /
// // SendInitiativeMilestoneUpdate (speculative SMSGs the retail client drops).
//
//private:
// InitiativeManager() = default;
//
// void PersistInitiative(ActiveInitiative const& initiative);
// void PersistTaskProgress(ActiveInitiative const& initiative);
// void PersistSingleTaskProgress(uint64 initiativeDbId, uint32 taskId, uint32 progress, uint8 status);
// void PersistMilestoneReached(uint64 initiativeDbId, uint32 milestoneIndex, uint32 reachedTime);
// void PersistRewardClaim(uint64 initiativeDbId, uint32 milestoneIndex, uint64 playerGuid);
// void PersistContribution(uint64 initiativeDbId, uint64 playerGuid, uint32 taskId, uint32 amount);
// void CheckMilestones(ActiveInitiative& initiative, Neighborhood* neighborhood);
// void GrantMilestoneRewards(Player* player, uint32 milestoneID);
// uint32 SelectWeightedCycle(uint32 initiativeID) const;
// uint32 CalculateMaxPoints(uint32 initiativeID) const;
// void BuildCriteriaIndex();
//
// // Active initiatives: neighborhoodGuid -> list of active initiatives
// std::unordered_map<uint64, std::vector<std::unique_ptr<ActiveInitiative>>> _activeInitiatives;
//
// // DB2 index maps (built once during Initialize)
// // InitiativeID -> list of tasks
// std::unordered_map<uint32, std::vector<InitiativeTaskData>> _initiativeTasks;
// // CycleID -> list of milestones
// std::unordered_map<uint32, std::vector<InitiativeMilestoneData>> _cycleMilestones;
// // InitiativeID -> active cycle ID
// std::unordered_map<uint32, uint32> _initiativeActiveCycle;
// // CycleID -> list of priority entries (for weighted selection)
// std::unordered_map<uint32, std::vector<std::pair<uint32, int32>>> _cyclePriorities; // cycleID -> [(initiativeID, weight)]
//
// // Reverse index: CriteriaID -> list of (neighborhoodGuid, initiativeID, taskID) for active tasks
// struct CriteriaTaskLink
// {
// uint64 NeighborhoodGuid;
// uint32 InitiativeID;
// uint32 TaskID;
// };
// std::unordered_map<uint32, std::vector<CriteriaTaskLink>> _criteriaToTasks;
//
// // Update timer
// uint32 _updateTimer = 0;
// static constexpr uint32 UPDATE_INTERVAL_MS = 60000; // Check every 60 seconds
//};
//
//#define sInitiativeManager InitiativeManager::Instance()
//
//#endif // TRINITYCORE_INITIATIVE_MANAGER_H
File diff suppressed because it is too large Load Diff
-219
View File
@@ -1,219 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef TRINITYCORE_NEIGHBORHOOD_H
//#define TRINITYCORE_NEIGHBORHOOD_H
//
//#include "Define.h"
//#include "DatabaseEnvFwd.h"
//#include "Housing.h"
//#include "HousingDefines.h"
//#include "ObjectGuid.h"
//#include "Optional.h"
//#include <array>
//#include <string>
//#include <unordered_map>
//#include <vector>
//
//class WorldPacket;
//
//class TC_GAME_API Neighborhood
//{
//public:
// struct Member
// {
// ObjectGuid PlayerGuid;
// ObjectGuid HouseGuid;
// uint8 Role = 0; // NeighborhoodMemberRole
// uint32 JoinTime = 0;
// uint8 PlotIndex = INVALID_PLOT_INDEX;
// uint8 StatusFlags = 0;
// };
//
// struct PlotInfo
// {
// uint8 PlotIndex = INVALID_PLOT_INDEX;
// ObjectGuid PlotGuid;
// ObjectGuid OwnerGuid;
// ObjectGuid HouseGuid;
// ObjectGuid OwnerBnetGuid;
//
// // Mirrored from character_housing for tooltip display of OTHER players' houses
// // on the neighborhood map (hover info). Set by Neighborhood::LoadFromDB; refreshed
// // on ownership / level / favor changes.
// uint8 HouseLevel = 1;
// uint64 HouseFavor = 0;
// std::string HouseName;
//
// // Mirrored from character_housing so the neighborhood map can spawn the
// // correct WMO geometry for EVERY occupied plot at preload. The data is
// // always in the DB regardless of whether the owner is currently online ?
// // PlotInfo carries enough of it to build the exterior visual for every
// // plot at map init without needing a live Housing object.
// uint32 HouseType = 0;
//
// // Mirrored from character_housing_fixtures. Key = FixturePointId (DB2
// // ExteriorComponentHook slot), value = FixtureOptionId (DB2
// // ExteriorComponent override). Drives the correct roof/doors/windows
// // on every plot's exterior, not just the logged-in owner's.
// std::unordered_map<uint32, uint32> Fixtures;
//
// // Mirrored from character_housing_decor. Every placed decor item
// // (exterior AND interior) for this plot's owner. HousingMap uses the
// // exterior entries (RoomGuid.IsEmpty()) at preload so visitors see
// // neighbours' placed decor even when the owner is offline. Interior
// // entries are reused when a visitor opens the owner's interior map.
// std::vector<Housing::PlacedDecor> Decor;
//
// // Mirrored from character_housing_rooms. Interior-room layout for the
// // plot owner. Used by HouseInteriorMap to spawn the owner's actual
// // rooms when a visitor enters their house ? independent of whether
// // the owner is currently online.
// std::vector<Housing::Room> Rooms;
//
// // Mirrored from character_housing.settingsFlags so visitor permission
// // checks (CanVisitorAccess) work when the plot owner is offline.
// // Refreshed when an online owner mutates their Housing settings.
// uint32 HouseSettingsFlags = 0;
//
// bool IsOccupied() const { return PlotIndex != INVALID_PLOT_INDEX; }
// };
//
// struct PendingInvite
// {
// ObjectGuid InviteeGuid;
// ObjectGuid InviterGuid;
// uint32 InviteTime = 0;
// };
//
// struct PendingOwnershipTransfer
// {
// ObjectGuid TargetGuid;
// uint32 OfferTime = 0;
// };
//
// explicit Neighborhood(ObjectGuid guid);
//
// // DB persistence
// bool LoadFromDB(PreparedQueryResult neighborhood, PreparedQueryResult members, PreparedQueryResult invites,
// PreparedQueryResult memberFixtures = nullptr, PreparedQueryResult memberDecor = nullptr,
// PreparedQueryResult memberRooms = nullptr);
// void SaveToDB(CharacterDatabaseTransaction trans);
// static void DeleteFromDB(ObjectGuid::LowType guid, CharacterDatabaseTransaction trans);
//
// // Accessors
// ObjectGuid GetGuid() const { return _guid; }
// std::string const& GetName() const { return _name; }
// uint32 GetNeighborhoodMapID() const { return _neighborhoodMapID; }
// ObjectGuid GetOwnerGuid() const { return _ownerGuid; }
// int32 GetFactionRestriction() const { return _factionRestriction; }
// void SetFactionRestriction(int32 faction) { _factionRestriction = faction; }
// bool IsPublic() const { return _isPublic; }
// uint32 GetCreateTime() const { return _createTime; }
//
// // Guild association
// uint32 GetGuildId() const { return _guildId; }
// void SetGuildId(uint32 guildId) { _guildId = guildId; }
//
// // Plot reservations (in-memory, time-limited holds before purchase)
// bool ReservePlot(ObjectGuid playerGuid, uint8 plotIndex);
// bool ClearReservation(ObjectGuid playerGuid);
// bool HasReservation(ObjectGuid playerGuid) const;
// uint8 GetReservedPlot(ObjectGuid playerGuid) const;
// // Returns the reserver's GUID if `plotIndex` is currently locked by another
// // player, or ObjectGuid::Empty when the plot is free / locked by `viewerGuid`.
// // Sweeps expired reservations as a side-effect (same 5-minute window as ReservePlot).
// ObjectGuid GetPlotReserverOther(uint8 plotIndex, ObjectGuid viewerGuid);
//
// // Management
// void SetName(std::string const& name);
// void SetPublic(bool isPublic);
// HousingResult AddManager(ObjectGuid playerGuid);
// HousingResult RemoveManager(ObjectGuid playerGuid);
// HousingResult InviteResident(ObjectGuid inviterGuid, ObjectGuid inviteeGuid);
// HousingResult CancelInvitation(ObjectGuid inviteeGuid);
// HousingResult AcceptInvitation(ObjectGuid playerGuid);
// HousingResult DeclineInvitation(ObjectGuid playerGuid);
// HousingResult EvictPlayer(ObjectGuid plotGuid);
// HousingResult TransferOwnership(ObjectGuid newOwnerGuid);
// HousingResult OfferOwnership(ObjectGuid targetGuid);
// HousingResult AcceptOwnershipTransfer(ObjectGuid acceptorGuid);
// HousingResult RejectOwnershipTransfer(ObjectGuid rejectorGuid);
// bool HasPendingTransfer() const { return _pendingTransfer.has_value(); }
// Optional<PendingOwnershipTransfer> const& GetPendingTransfer() const { return _pendingTransfer; }
//
// // Plot management
// HousingResult PurchasePlot(ObjectGuid playerGuid, uint8 plotIndex);
// void UpdatePlotHouseInfo(uint8 plotIndex, ObjectGuid houseGuid, ObjectGuid ownerBnetGuid);
// void UpdatePlotSettingsFlags(ObjectGuid ownerGuid, uint32 settingsFlags);
// HousingResult MoveHouse(ObjectGuid sourcePlotOwner, uint8 newPlotIndex);
// void SetPlotAreaTriggerGuid(uint8 plotIndex, ObjectGuid atGuid);
//
// PlotInfo const* GetPlotInfo(uint8 plotIndex) const
// {
// return (plotIndex < MAX_NEIGHBORHOOD_PLOTS && _plots[plotIndex].IsOccupied())
// ? &_plots[plotIndex] : nullptr;
// }
//
// std::array<PlotInfo, MAX_NEIGHBORHOOD_PLOTS> const& GetPlots() const { return _plots; }
// uint32 GetOccupiedPlotCount() const;
//
// // Members
// HousingResult AddResident(ObjectGuid playerGuid);
// Member const* GetMember(ObjectGuid playerGuid) const;
// std::vector<Member> const& GetMembers() const { return _members; }
// bool IsMember(ObjectGuid playerGuid) const;
// bool IsManager(ObjectGuid playerGuid) const;
// bool IsOwner(ObjectGuid playerGuid) const;
// uint32 GetMemberCount() const { return static_cast<uint32>(_members.size()); }
//
// // Invites
// bool HasPendingInvite(ObjectGuid playerGuid) const;
// std::vector<PendingInvite> const& GetPendingInvites() const { return _pendingInvites; }
//
// // Broadcast
// void BroadcastPacket(WorldPacket const* packet, ObjectGuid excludeGuid = ObjectGuid::Empty) const;
//
// // Rebuild NeighborhoodMirrorData on every online member's Account entity.
// // Call after any mutation to name, owner, managers, or houses.
// void RefreshMirrorDataForOnlineMembers() const;
//
//private:
// ObjectGuid _guid;
// std::string _name;
// uint32 _neighborhoodMapID = 0;
// ObjectGuid _ownerGuid;
// int32 _factionRestriction = 0;
// bool _isPublic = false;
// uint32 _createTime = 0;
// uint32 _guildId = 0;
//
// std::vector<Member> _members;
// std::array<PlotInfo, MAX_NEIGHBORHOOD_PLOTS> _plots{};
// std::vector<PendingInvite> _pendingInvites;
// Optional<PendingOwnershipTransfer> _pendingTransfer;
//
// // In-memory plot reservations: playerGuid -> {plotIndex, reserveTime}
// struct PlotReservation
// {
// uint8 PlotIndex = 0;
// uint32 ReserveTime = 0;
// };
// std::unordered_map<ObjectGuid, PlotReservation> _plotReservations;
//};
//
//#endif // TRINITYCORE_NEIGHBORHOOD_H
@@ -1,161 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#include "NeighborhoodCharter.h"
//#include "DatabaseEnv.h"
//#include "GameTime.h"
//#include "Log.h"
//#include <algorithm>
//
//NeighborhoodCharter::NeighborhoodCharter(uint64 id, ObjectGuid creatorGuid)
// : _id(id), _creatorGuid(creatorGuid), _createTime(static_cast<uint32>(GameTime::GetGameTime()))
//{
//}
//
//bool NeighborhoodCharter::LoadFromDB(PreparedQueryResult charter, PreparedQueryResult signatures)
//{
// if (!charter)
// return false;
//
// Field* fields = charter->Fetch();
//
// // 0 1 2 3 4 5 6
// // SELECT id, creatorGuid, name, neighborhoodMapID, factionFlags, isGuild, createTime
// // FROM neighborhood_charters WHERE id = ?
//
// _id = fields[0].GetUInt64();
// _creatorGuid = ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64());
// _name = fields[2].GetString();
// _neighborhoodMapID = fields[3].GetUInt32();
// _factionFlags = fields[4].GetUInt32();
// _isGuild = fields[5].GetBool();
// _createTime = fields[6].GetUInt32();
//
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::LoadFromDB: Loaded charter {} '{}' by {}",
// _id, _name, _creatorGuid.ToString());
//
// // Load signatures
// _signatures.clear();
//
// if (signatures)
// {
// do
// {
// Field* sigFields = signatures->Fetch();
//
// // 0
// // SELECT signerGuid FROM neighborhood_charter_signatures WHERE charterId = ?
//
// ObjectGuid signerGuid = ObjectGuid::Create<HighGuid::Player>(sigFields[0].GetUInt64());
// _signatures.push_back(signerGuid);
// } while (signatures->NextRow());
// }
//
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::LoadFromDB: Loaded {} signatures for charter {}",
// _signatures.size(), _id);
//
// return true;
//}
//
//void NeighborhoodCharter::SaveToDB(CharacterDatabaseTransaction trans)
//{
// // Replace the charter row
// CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_NEIGHBORHOOD_CHARTER);
// uint8 index = 0;
// stmt->setUInt64(index++, _id);
// stmt->setUInt64(index++, _creatorGuid.GetCounter());
// stmt->setString(index++, _name);
// stmt->setUInt32(index++, _neighborhoodMapID);
// stmt->setUInt32(index++, _factionFlags);
// stmt->setBool(index++, _isGuild);
// stmt->setUInt32(index++, _createTime);
// trans->Append(stmt);
//
// // Delete all existing signatures and re-insert
// stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NEIGHBORHOOD_CHARTER_SIGNATURES);
// stmt->setUInt64(0, _id);
// trans->Append(stmt);
//
// for (ObjectGuid const& signerGuid : _signatures)
// {
// stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NEIGHBORHOOD_CHARTER_SIGNATURE);
// index = 0;
// stmt->setUInt64(index++, _id);
// stmt->setUInt64(index++, signerGuid.GetCounter());
// stmt->setUInt32(index++, _createTime);
// trans->Append(stmt);
// }
//
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::SaveToDB: Saved charter {} '{}' with {} signatures",
// _id, _name, _signatures.size());
//}
//
///*static*/ void NeighborhoodCharter::DeleteFromDB(uint64 id, CharacterDatabaseTransaction trans)
//{
// // Delete signatures first (foreign key dependency)
// CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NEIGHBORHOOD_CHARTER_SIGNATURES);
// stmt->setUInt64(0, id);
// trans->Append(stmt);
//
// // Delete the charter
// stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NEIGHBORHOOD_CHARTER);
// stmt->setUInt64(0, id);
// trans->Append(stmt);
//
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::DeleteFromDB: Deleted charter {}", id);
//}
//
//bool NeighborhoodCharter::AddSignature(ObjectGuid signerGuid)
//{
// // Cannot sign your own charter
// if (signerGuid == _creatorGuid)
// {
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::AddSignature: Player {} cannot sign their own charter {}",
// signerGuid.ToString(), _id);
// return false;
// }
//
// // Cannot sign twice
// if (HasSigned(signerGuid))
// {
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::AddSignature: Player {} has already signed charter {}",
// signerGuid.ToString(), _id);
// return false;
// }
//
// _signatures.push_back(signerGuid);
//
// // Persist the new signature immediately
// CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
// CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NEIGHBORHOOD_CHARTER_SIGNATURE);
// uint8 index = 0;
// stmt->setUInt64(index++, _id);
// stmt->setUInt64(index++, signerGuid.GetCounter());
// stmt->setUInt32(index++, static_cast<uint32>(GameTime::GetGameTime()));
// trans->Append(stmt);
// CharacterDatabase.CommitTransaction(trans);
//
// TC_LOG_DEBUG("housing", "NeighborhoodCharter::AddSignature: Player {} signed charter {} ({}/{} signatures)",
// signerGuid.ToString(), _id, _signatures.size(), MIN_CHARTER_SIGNATURES);
//
// return true;
//}
//
//bool NeighborhoodCharter::HasSigned(ObjectGuid signerGuid) const
//{
// return std::find(_signatures.begin(), _signatures.end(), signerGuid) != _signatures.end();
//}
@@ -1,66 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef TRINITYCORE_NEIGHBORHOOD_CHARTER_H
//#define TRINITYCORE_NEIGHBORHOOD_CHARTER_H
//
//#include "Define.h"
//#include "DatabaseEnvFwd.h"
//#include "HousingDefines.h"
//#include "ObjectGuid.h"
//#include <string>
//#include <vector>
//
//class TC_GAME_API NeighborhoodCharter
//{
//public:
// explicit NeighborhoodCharter(uint64 id, ObjectGuid creatorGuid);
//
// uint64 GetId() const { return _id; }
// ObjectGuid GetCreatorGuid() const { return _creatorGuid; }
// std::string const& GetName() const { return _name; }
// uint32 GetNeighborhoodMapID() const { return _neighborhoodMapID; }
// uint32 GetFactionFlags() const { return _factionFlags; }
// bool IsGuildCharter() const { return _isGuild; }
//
// void SetName(std::string const& name) { _name = name; }
// void SetNeighborhoodMapID(uint32 mapId) { _neighborhoodMapID = mapId; }
// void SetFactionFlags(uint32 flags) { _factionFlags = flags; }
// void SetIsGuild(bool isGuild) { _isGuild = isGuild; }
//
// bool AddSignature(ObjectGuid signerGuid);
// bool HasSigned(ObjectGuid signerGuid) const;
// uint32 GetSignatureCount() const { return static_cast<uint32>(_signatures.size()); }
// bool HasEnoughSignatures() const { return GetSignatureCount() >= MIN_CHARTER_SIGNATURES; }
// std::vector<ObjectGuid> const& GetSignatures() const { return _signatures; }
//
// void SaveToDB(CharacterDatabaseTransaction trans);
// bool LoadFromDB(PreparedQueryResult charter, PreparedQueryResult signatures);
// static void DeleteFromDB(uint64 id, CharacterDatabaseTransaction trans);
//
//private:
// uint64 _id = 0;
// ObjectGuid _creatorGuid;
// std::string _name;
// uint32 _neighborhoodMapID = 0;
// uint32 _factionFlags = 0;
// bool _isGuild = false;
// uint32 _createTime = 0;
// std::vector<ObjectGuid> _signatures;
//};
//
//#endif // TRINITYCORE_NEIGHBORHOOD_CHARTER_H
-928
View File
@@ -1,928 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#include "NeighborhoodMgr.h"
//#include "DatabaseEnv.h"
//#include "DB2Stores.h"
//#include "GameTime.h"
//#include "HousingDefines.h"
//#include "HousingMap.h"
//#include "HousingMgr.h"
//#include "Log.h"
//#include "Map.h"
//#include "Neighborhood.h"
//#include "Player.h"
//#include "RealmList.h"
//#include "SharedDefines.h"
//#include "StringFormat.h"
//#include "Timer.h"
//#include "World.h"
//
//NeighborhoodMgr& NeighborhoodMgr::Instance()
//{
// static NeighborhoodMgr instance;
// return instance;
//}
//
//void NeighborhoodMgr::Initialize()
//{
// TC_LOG_INFO("server.loading", "Initializing NeighborhoodMgr...");
// LoadFromDB();
// VerifyNeighborhoodFactions();
// EnsurePublicNeighborhoods();
// MigrateWrongFactionResidents();
// RegenerateNeighborhoodNames();
//}
//
//void NeighborhoodMgr::Update(uint32 diff)
//{
// // Periodic neighborhood expansion check (every 60 seconds)
// // Ensures new instances are created even if no one is actively purchasing plots
// static constexpr uint32 EXPANSION_CHECK_INTERVAL = 60 * IN_MILLISECONDS;
//
// _expansionCheckTimer += diff;
// if (_expansionCheckTimer >= EXPANSION_CHECK_INTERVAL)
// {
// _expansionCheckTimer = 0;
// CheckAndExpandNeighborhoods();
// }
//}
//
//void NeighborhoodMgr::LoadFromDB()
//{
// uint32 oldMSTime = getMSTime();
//
// _neighborhoods.clear();
// _ownerToNeighborhood.clear();
//
// // 0 1 2 3 4 5 6
// QueryResult result = CharacterDatabase.Query("SELECT guid, name, neighborhoodMapID, ownerGuid, factionRestriction, isPublic, createTime FROM neighborhoods ORDER BY guid ASC");
//
// if (!result)
// {
// TC_LOG_INFO("server.loading", ">> Loaded 0 neighborhoods. DB table `neighborhoods` is empty.");
// return;
// }
//
// uint32 count = 0;
//
// do
// {
// Field* fields = result->Fetch();
//
// uint64 guidLow = fields[0].GetUInt64();
//
// // Track highest guid for generation
// if (guidLow >= _nextGuid)
// _nextGuid = guidLow + 1;
//
// ObjectGuid neighborhoodGuid = ObjectGuid::Create<HighGuid::Housing>(/*subType*/ 4, /*arg1*/ sRealmList->GetCurrentRealmId().Realm, /*arg2*/ 0, guidLow);
//
// auto neighborhood = std::make_unique<Neighborhood>(neighborhoodGuid);
//
// // Load members for this neighborhood
// CharacterDatabasePreparedStatement* memberStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_MEMBERS);
// memberStmt->setUInt64(0, guidLow);
// PreparedQueryResult memberResult = CharacterDatabase.Query(memberStmt);
//
// // Load invites for this neighborhood
// CharacterDatabasePreparedStatement* inviteStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_INVITES);
// inviteStmt->setUInt64(0, guidLow);
// PreparedQueryResult inviteResult = CharacterDatabase.Query(inviteStmt);
//
// // Load per-member exterior/interior state needed to render every
// // occupied plot's house without requiring the owner to be online.
// CharacterDatabasePreparedStatement* fixStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_MEMBER_FIXTURES);
// fixStmt->setUInt64(0, guidLow);
// PreparedQueryResult fixtureResult = CharacterDatabase.Query(fixStmt);
//
// CharacterDatabasePreparedStatement* decorStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_MEMBER_DECOR);
// decorStmt->setUInt64(0, guidLow);
// PreparedQueryResult decorResult = CharacterDatabase.Query(decorStmt);
//
// CharacterDatabasePreparedStatement* roomStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_MEMBER_ROOMS);
// roomStmt->setUInt64(0, guidLow);
// PreparedQueryResult roomResult = CharacterDatabase.Query(roomStmt);
//
// // Wrap the neighborhood row as a PreparedQueryResult by passing the raw result
// // LoadFromDB expects PreparedQueryResult for the first param but we have the raw fields;
// // so we call LoadFromDB with the data directly already parsed from fields above.
// // Since LoadFromDB needs the PreparedQueryResult format, we use a query per neighborhood.
// CharacterDatabasePreparedStatement* neighborhoodStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD);
// neighborhoodStmt->setUInt64(0, guidLow);
// PreparedQueryResult neighborhoodResult = CharacterDatabase.Query(neighborhoodStmt);
//
// if (!neighborhood->LoadFromDB(neighborhoodResult, memberResult, inviteResult, fixtureResult, decorResult, roomResult))
// {
// TC_LOG_ERROR("housing", "NeighborhoodMgr::LoadFromDB: Failed to load neighborhood guid {}. Skipping.", guidLow);
// continue;
// }
//
// ObjectGuid ownerGuid = neighborhood->GetOwnerGuid();
// _ownerToNeighborhood[ownerGuid] = neighborhoodGuid;
// _neighborhoods[neighborhoodGuid] = std::move(neighborhood);
// ++count;
//
// } while (result->NextRow());
//
// TC_LOG_INFO("server.loading", ">> Loaded {} neighborhoods in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
//
// // Debug dump all neighborhoods and their plot states
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// TC_LOG_INFO("housing", "NEIGHBORHOOD_DUMP: guid={} name='{}' mapId={} faction={} public={} "
// "members={} occupiedPlots={} owner={}",
// guid.ToString(), neighborhood->GetName(), neighborhood->GetNeighborhoodMapID(),
// neighborhood->GetFactionRestriction(), neighborhood->IsPublic(),
// neighborhood->GetMemberCount(), neighborhood->GetOccupiedPlotCount(),
// neighborhood->GetOwnerGuid().ToString());
//
// for (auto const& member : neighborhood->GetMembers())
// {
// TC_LOG_INFO("housing", " MEMBER: player={} role={} plotIndex={} houseGuid={}",
// member.PlayerGuid.ToString(), member.Role, member.PlotIndex, member.HouseGuid.ToString());
// }
//
// for (uint8 i = 0; i < MAX_NEIGHBORHOOD_PLOTS; ++i)
// {
// auto const& plot = neighborhood->GetPlots()[i];
// if (plot.IsOccupied())
// {
// TC_LOG_INFO("housing", " PLOT[{}]: owner={} house={} bnet={}",
// i, plot.OwnerGuid.ToString(), plot.HouseGuid.ToString(), plot.OwnerBnetGuid.ToString());
// }
// }
// }
//}
//
//Neighborhood* NeighborhoodMgr::CreateNeighborhood(ObjectGuid ownerGuid, std::string const& name, uint32 neighborhoodMapID, int32 factionRestriction, bool isPublic /*= false*/)
//{
// // Check if owner already has a neighborhood
// if (_ownerToNeighborhood.find(ownerGuid) != _ownerToNeighborhood.end())
// {
// TC_LOG_DEBUG("housing", "NeighborhoodMgr::CreateNeighborhood: Owner {} already has a neighborhood",
// ownerGuid.ToString());
// return nullptr;
// }
//
// ObjectGuid neighborhoodGuid = GenerateNeighborhoodGuid();
//
// auto neighborhood = std::make_unique<Neighborhood>(neighborhoodGuid);
//
// // Set up initial state via the member data structures
// // We need to persist and then reload to go through LoadFromDB, or set internal state directly.
// // For creation, we persist first and then load.
//
// uint32 createTime = static_cast<uint32>(GameTime::GetGameTime());
//
// CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
//
// // Insert the neighborhood row
// CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NEIGHBORHOOD);
// uint8 index = 0;
// stmt->setUInt64(index++, neighborhoodGuid.GetCounter());
// stmt->setString(index++, name);
// stmt->setUInt32(index++, neighborhoodMapID);
// stmt->setUInt64(index++, ownerGuid.GetCounter());
// stmt->setInt32(index++, factionRestriction);
// stmt->setBool(index++, isPublic);
// stmt->setUInt32(index++, createTime);
// trans->Append(stmt);
//
// // Insert the owner as a member with OWNER role
// stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NEIGHBORHOOD_MEMBER);
// index = 0;
// stmt->setUInt64(index++, neighborhoodGuid.GetCounter());
// stmt->setUInt64(index++, ownerGuid.GetCounter());
// stmt->setUInt8(index++, NEIGHBORHOOD_ROLE_OWNER);
// stmt->setUInt32(index++, createTime);
// stmt->setUInt8(index++, INVALID_PLOT_INDEX);
// trans->Append(stmt);
//
// CharacterDatabase.DirectCommitTransaction(trans);
//
// // Now load from DB to populate all internal structures properly
// CharacterDatabasePreparedStatement* selStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD);
// selStmt->setUInt64(0, neighborhoodGuid.GetCounter());
// PreparedQueryResult neighborhoodResult = CharacterDatabase.Query(selStmt);
//
// selStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_MEMBERS);
// selStmt->setUInt64(0, neighborhoodGuid.GetCounter());
// PreparedQueryResult memberResult = CharacterDatabase.Query(selStmt);
//
// selStmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEIGHBORHOOD_INVITES);
// selStmt->setUInt64(0, neighborhoodGuid.GetCounter());
// PreparedQueryResult inviteResult = CharacterDatabase.Query(selStmt);
//
// if (!neighborhood->LoadFromDB(neighborhoodResult, memberResult, inviteResult))
// {
// TC_LOG_ERROR("housing", "NeighborhoodMgr::CreateNeighborhood: Failed to load newly created neighborhood '{}'", name);
// return nullptr;
// }
//
// Neighborhood* result = neighborhood.get();
// _ownerToNeighborhood[ownerGuid] = neighborhoodGuid;
// _neighborhoods[neighborhoodGuid] = std::move(neighborhood);
//
// TC_LOG_DEBUG("housing", "NeighborhoodMgr::CreateNeighborhood: Created neighborhood '{}' (guid: {}) for owner {}",
// name, neighborhoodGuid.ToString(), ownerGuid.ToString());
//
// return result;
//}
//
//Neighborhood* NeighborhoodMgr::CreateGuildNeighborhood(ObjectGuid ownerGuid, std::string const& name, uint32 neighborhoodMapID, uint32 factionID)
//{
// int32 factionRestriction = NEIGHBORHOOD_FACTION_NONE;
// if (factionID == HORDE)
// factionRestriction = NEIGHBORHOOD_FACTION_HORDE;
// else if (factionID == ALLIANCE)
// factionRestriction = NEIGHBORHOOD_FACTION_ALLIANCE;
//
// return CreateNeighborhood(ownerGuid, name, neighborhoodMapID, factionRestriction);
//}
//
//void NeighborhoodMgr::DeleteNeighborhood(ObjectGuid neighborhoodGuid)
//{
// auto it = _neighborhoods.find(neighborhoodGuid);
// if (it == _neighborhoods.end())
// {
// TC_LOG_DEBUG("housing", "NeighborhoodMgr::DeleteNeighborhood: Neighborhood {} not found",
// neighborhoodGuid.ToString());
// return;
// }
//
// ObjectGuid ownerGuid = it->second->GetOwnerGuid();
//
// // Delete from DB
// CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
// Neighborhood::DeleteFromDB(neighborhoodGuid.GetCounter(), trans);
// CharacterDatabase.CommitTransaction(trans);
//
// // Remove from maps
// _ownerToNeighborhood.erase(ownerGuid);
// _neighborhoods.erase(it);
//
// TC_LOG_DEBUG("housing", "NeighborhoodMgr::DeleteNeighborhood: Deleted neighborhood {}",
// neighborhoodGuid.ToString());
//}
//
//Neighborhood* NeighborhoodMgr::GetNeighborhood(ObjectGuid neighborhoodGuid)
//{
// auto it = _neighborhoods.find(neighborhoodGuid);
// if (it != _neighborhoods.end())
// return it->second.get();
//
// return nullptr;
//}
//
//Neighborhood const* NeighborhoodMgr::GetNeighborhood(ObjectGuid neighborhoodGuid) const
//{
// auto it = _neighborhoods.find(neighborhoodGuid);
// if (it != _neighborhoods.end())
// return it->second.get();
//
// return nullptr;
//}
//
//Neighborhood* NeighborhoodMgr::ResolveNeighborhood(ObjectGuid guid, Player* player)
//{
// // Try direct lookup first (correct Housing GUID format)
// if (Neighborhood* neighborhood = GetNeighborhood(guid))
// return neighborhood;
//
// // If the GUID lookup fails (e.g., client sent a bulletin board GO GUID),
// // fall back to the player's current housing map neighborhood
// if (player)
// {
// if (HousingMap* housingMap = dynamic_cast<HousingMap*>(player->GetMap()))
// {
// if (Neighborhood* neighborhood = housingMap->GetNeighborhood())
// {
// TC_LOG_DEBUG("housing", "NeighborhoodMgr::ResolveNeighborhood: Resolved client GUID {} to neighborhood '{}' via housing map fallback",
// guid.ToString(), neighborhood->GetName());
// return neighborhood;
// }
// }
// }
//
// return nullptr;
//}
//
//Neighborhood* NeighborhoodMgr::GetNeighborhoodByOwner(ObjectGuid ownerGuid)
//{
// auto it = _ownerToNeighborhood.find(ownerGuid);
// if (it != _ownerToNeighborhood.end())
// return GetNeighborhood(it->second);
//
// return nullptr;
//}
//
//Neighborhood* NeighborhoodMgr::GetNeighborhoodByGuildId(uint32 guildId)
//{
// if (guildId == 0)
// return nullptr;
//
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (neighborhood->GetGuildId() == guildId)
// return neighborhood.get();
// }
// return nullptr;
//}
//
//std::vector<Neighborhood*> NeighborhoodMgr::GetAllNeighborhoods() const
//{
// std::vector<Neighborhood*> result;
// result.reserve(_neighborhoods.size());
// for (auto const& [guid, neighborhood] : _neighborhoods)
// result.push_back(neighborhood.get());
// return result;
//}
//
//std::vector<Neighborhood*> NeighborhoodMgr::GetPublicNeighborhoods() const
//{
// std::vector<Neighborhood*> result;
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (neighborhood->IsPublic())
// result.push_back(neighborhood.get());
// }
// return result;
//}
//
//std::vector<Neighborhood*> NeighborhoodMgr::GetNeighborhoodsForPlayer(ObjectGuid playerGuid) const
//{
// std::vector<Neighborhood*> result;
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (neighborhood->IsMember(playerGuid))
// result.push_back(neighborhood.get());
// }
// return result;
//}
//
//std::vector<Neighborhood*> NeighborhoodMgr::GetNeighborhoodsByBnetAccount(ObjectGuid bnetAccountGuid) const
//{
// std::vector<Neighborhood*> result;
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// for (auto const& plot : neighborhood->GetPlots())
// {
// if (plot.IsOccupied() && plot.OwnerBnetGuid == bnetAccountGuid)
// {
// result.push_back(neighborhood.get());
// break; // Only add each neighborhood once
// }
// }
// }
// return result;
//}
//
//std::string NeighborhoodMgr::GetNeighborhoodName(ObjectGuid neighborhoodGuid) const
//{
// Neighborhood const* neighborhood = GetNeighborhood(neighborhoodGuid);
// if (neighborhood)
// return neighborhood->GetName();
//
// return "";
//}
//
//Neighborhood* NeighborhoodMgr::FindNeighborhoodWithPendingInvite(ObjectGuid playerGuid)
//{
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (neighborhood->HasPendingInvite(playerGuid))
// return neighborhood.get();
// }
// return nullptr;
//}
//
//Neighborhood* NeighborhoodMgr::FindOrCreatePublicNeighborhood(uint32 teamId)
//{
// // Determine the correct NeighborhoodMapID for the faction
// uint32 targetMapId = 0;
//
// for (auto const& [id, data] : sHousingMgr.GetAllNeighborhoodMapData())
// {
// int32 flags = data.Flags;
// bool isAlliance = (flags & 0x1) != 0;
// bool isHorde = (flags & 0x2) != 0;
// bool canSystemGenerate = (flags & 0x4) != 0;
//
// if (!canSystemGenerate)
// continue;
//
// if ((teamId == ALLIANCE && isAlliance) || (teamId == HORDE && isHorde))
// {
// targetMapId = id;
// break;
// }
// }
//
// if (targetMapId == 0)
// {
// TC_LOG_ERROR("housing", "FindOrCreatePublicNeighborhood: No system-generatable NeighborhoodMap found for team {}", teamId);
// return nullptr;
// }
//
// // Look for an existing public neighborhood ? no membership changes
// Neighborhood* found = FindPublicNeighborhoodForMap(targetMapId);
// if (found)
// return found;
//
// // None exists yet ? EnsurePublicNeighborhoods should have created them at startup.
// // Force-run it now as a fallback, then retry.
// TC_LOG_WARN("housing", "FindOrCreatePublicNeighborhood: No public neighborhood for map {}, running EnsurePublicNeighborhoods", targetMapId);
// EnsurePublicNeighborhoods();
//
// return FindPublicNeighborhoodForMap(targetMapId);
//}
//
//Neighborhood* NeighborhoodMgr::FindPublicNeighborhoodForMap(uint32 neighborhoodMapId) const
//{
// // Return the least-loaded public neighborhood on this map.
// // When multiple instances exist (after expansion), we want to distribute
// // players evenly rather than always returning the first-created instance.
// Neighborhood* best = nullptr;
// uint32 bestOccupancy = MAX_NEIGHBORHOOD_PLOTS + 1;
//
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (neighborhood->GetNeighborhoodMapID() == neighborhoodMapId && neighborhood->IsPublic())
// {
// uint32 occupancy = neighborhood->GetOccupiedPlotCount();
// if (occupancy < bestOccupancy)
// {
// best = neighborhood.get();
// bestOccupancy = occupancy;
// }
// }
// }
// return best;
//}
//
//void NeighborhoodMgr::VerifyNeighborhoodFactions()
//{
// // Verify that each public neighborhood's factionRestriction matches its NeighborhoodMap's faction flags.
// // This fixes data inconsistencies from earlier code that may have assigned wrong faction values.
// // Must run BEFORE EnsurePublicNeighborhoods and MigrateWrongFactionResidents.
//
// auto const& allMaps = sHousingMgr.GetAllNeighborhoodMapData();
// uint32 fixedCount = 0;
//
// for (auto& [guid, nb] : _neighborhoods)
// {
// if (!nb->IsPublic())
// continue;
//
// uint32 mapId = nb->GetNeighborhoodMapID();
// auto it = allMaps.find(mapId);
// if (it == allMaps.end())
// continue;
//
// int32 mapFlags = it->second.Flags;
// bool mapIsAlliance = (mapFlags & 0x1) != 0;
// bool mapIsHorde = (mapFlags & 0x2) != 0;
//
// // Determine the correct faction restriction from the NeighborhoodMap flags
// int32 correctFaction = NEIGHBORHOOD_FACTION_NONE;
// if (mapIsAlliance && !mapIsHorde)
// correctFaction = NEIGHBORHOOD_FACTION_ALLIANCE;
// else if (mapIsHorde && !mapIsAlliance)
// correctFaction = NEIGHBORHOOD_FACTION_HORDE;
//
// if (correctFaction == NEIGHBORHOOD_FACTION_NONE)
// continue; // Ambiguous or no faction ? skip
//
// int32 currentFaction = nb->GetFactionRestriction();
// if (currentFaction == correctFaction)
// continue; // Already correct
//
// TC_LOG_INFO("server.loading", ">> Fixing neighborhood '{}' (guid={}) factionRestriction: {} -> {} (based on NeighborhoodMap {} flags)",
// nb->GetName(), guid.ToString(), currentFaction, correctFaction, mapId);
//
// // Update in DB
// CharacterDatabase.DirectExecute(
// Trinity::StringFormat("UPDATE neighborhoods SET factionRestriction = {} WHERE guid = {}",
// correctFaction, guid.GetCounter()).c_str());
//
// // Update in memory
// nb->SetFactionRestriction(correctFaction);
// ++fixedCount;
// }
//
// if (fixedCount > 0)
// TC_LOG_INFO("server.loading", ">> Fixed factionRestriction for {} neighborhood(s)", fixedCount);
//}
//
//void NeighborhoodMgr::EnsurePublicNeighborhoods()
//{
// // Ensure at least one public neighborhood exists per faction
// // This guarantees players always have a neighborhood to enter via the tutorial flow
//
// bool hasAlliancePublic = false;
// bool hasHordePublic = false;
//
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (!neighborhood->IsPublic())
// continue;
//
// int32 faction = neighborhood->GetFactionRestriction();
// if (faction == NEIGHBORHOOD_FACTION_ALLIANCE)
// hasAlliancePublic = true;
// else if (faction == NEIGHBORHOOD_FACTION_HORDE)
// hasHordePublic = true;
// }
//
// // Find system-generatable NeighborhoodMap entries for missing factions
// for (auto const& [id, data] : sHousingMgr.GetAllNeighborhoodMapData())
// {
// int32 flags = data.Flags;
// bool isAlliance = (flags & 0x1) != 0;
// bool isHorde = (flags & 0x2) != 0;
// bool canSystemGenerate = (flags & 0x4) != 0;
//
// if (!canSystemGenerate)
// continue;
//
// if (!hasAlliancePublic && isAlliance)
// {
// // Create a system-owned Alliance neighborhood (owner guid = empty)
// // Use a sentinel owner guid so the neighborhood has a valid owner
// ObjectGuid systemOwner = ObjectGuid::Create<HighGuid::Housing>(/*subType*/ 4, /*arg1*/ sRealmList->GetCurrentRealmId().Realm, /*arg2*/ 0, uint64(0));
// std::string allianceName = sHousingMgr.GenerateNeighborhoodName(id);
// Neighborhood* neighborhood = CreateNeighborhood(systemOwner, allianceName, id, NEIGHBORHOOD_FACTION_ALLIANCE, /*isPublic*/ true);
// if (neighborhood)
// {
// hasAlliancePublic = true;
// TC_LOG_INFO("server.loading", ">> Created default public Alliance neighborhood '{}' (map {})", allianceName, id);
// }
// }
//
// if (!hasHordePublic && isHorde)
// {
// ObjectGuid systemOwner = ObjectGuid::Create<HighGuid::Housing>(/*subType*/ 4, /*arg1*/ sRealmList->GetCurrentRealmId().Realm, /*arg2*/ 1, uint64(0));
// std::string hordeName = sHousingMgr.GenerateNeighborhoodName(id);
// Neighborhood* neighborhood = CreateNeighborhood(systemOwner, hordeName, id, NEIGHBORHOOD_FACTION_HORDE, /*isPublic*/ true);
// if (neighborhood)
// {
// hasHordePublic = true;
// TC_LOG_INFO("server.loading", ">> Created default public Horde neighborhood '{}' (map {})", hordeName, id);
// }
// }
// }
//
// if (hasAlliancePublic && hasHordePublic)
// TC_LOG_INFO("server.loading", ">> Public neighborhoods verified for both factions");
// else if (!hasAlliancePublic || !hasHordePublic)
// TC_LOG_WARN("server.loading", ">> Missing public neighborhood for {} ? no system-generatable NeighborhoodMap found",
// !hasAlliancePublic ? "Alliance" : "Horde");
//}
//
//void NeighborhoodMgr::MigrateWrongFactionResidents()
//{
// // After EnsurePublicNeighborhoods creates missing faction neighborhoods,
// // check if any members are in the wrong faction's public neighborhood.
// // This handles legacy data from before faction restrictions were enforced:
// // e.g. Alliance characters placed in a Horde neighborhood when only one existed.
//
// // Find public neighborhoods by faction
// uint64 allianceNbLow = 0;
// uint64 hordeNbLow = 0;
//
// for (auto const& [guid, nb] : _neighborhoods)
// {
// if (!nb->IsPublic())
// continue;
// if (nb->GetFactionRestriction() == NEIGHBORHOOD_FACTION_ALLIANCE && !allianceNbLow)
// allianceNbLow = guid.GetCounter();
// else if (nb->GetFactionRestriction() == NEIGHBORHOOD_FACTION_HORDE && !hordeNbLow)
// hordeNbLow = guid.GetCounter();
// }
//
// if (!allianceNbLow || !hordeNbLow)
// return;
//
// // Query all members in faction-restricted public neighborhoods joined with their race
// QueryResult result = CharacterDatabase.Query(
// "SELECT nm.playerGuid, nm.neighborhoodGuid, nm.plotIndex, nm.role, nm.joinTime, c.race "
// "FROM neighborhood_members nm "
// "JOIN characters c ON nm.playerGuid = c.guid "
// "JOIN neighborhoods n ON nm.neighborhoodGuid = n.guid "
// "WHERE n.isPublic = 1 AND n.factionRestriction != 0");
//
// if (!result)
// return;
//
// struct MemberInfo
// {
// uint64 PlayerGuidLow;
// uint64 NbGuidLow;
// uint8 PlotIndex;
// uint8 Role;
// uint32 JoinTime;
// uint8 Race;
// };
//
// std::vector<MemberInfo> allMembers;
// do
// {
// Field* fields = result->Fetch();
// allMembers.push_back({
// fields[0].GetUInt64(),
// fields[1].GetUInt64(),
// fields[2].GetUInt8(),
// fields[3].GetUInt8(),
// fields[4].GetUInt32(),
// fields[5].GetUInt8()
// });
// } while (result->NextRow());
//
// // Build set of existing memberships for quick lookup: (playerGuid, nbGuid)
// std::set<std::pair<uint64, uint64>> membershipSet;
// for (auto const& m : allMembers)
// membershipSet.insert({m.PlayerGuidLow, m.NbGuidLow});
//
// // Pre-populate used plots in each target neighborhood
// std::set<uint8> usedPlotsInAlliance;
// std::set<uint8> usedPlotsInHorde;
// for (auto const& m : allMembers)
// {
// if (m.NbGuidLow == allianceNbLow && m.PlotIndex != INVALID_PLOT_INDEX)
// usedPlotsInAlliance.insert(m.PlotIndex);
// else if (m.NbGuidLow == hordeNbLow && m.PlotIndex != INVALID_PLOT_INDEX)
// usedPlotsInHorde.insert(m.PlotIndex);
// }
//
// uint32 migratedCount = 0;
//
// for (auto const& m : allMembers)
// {
// Team team = Player::TeamForRace(m.Race);
// uint64 correctNbLow = (team == ALLIANCE) ? allianceNbLow : hordeNbLow;
//
// if (m.NbGuidLow == correctNbLow)
// continue; // Already in correct faction's neighborhood
//
// bool alreadyInCorrect = membershipSet.count({m.PlayerGuidLow, correctNbLow}) > 0;
//
// // Delete old wrong-faction membership
// CharacterDatabasePreparedStatement* delStmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NEIGHBORHOOD_MEMBER);
// delStmt->setUInt64(0, m.NbGuidLow);
// delStmt->setUInt64(1, m.PlayerGuidLow);
// CharacterDatabase.DirectExecute(delStmt);
//
// if (!alreadyInCorrect)
// {
// // Player doesn't have a membership in the correct neighborhood yet ? create one
// std::set<uint8>& usedPlots = (correctNbLow == allianceNbLow) ? usedPlotsInAlliance : usedPlotsInHorde;
// uint8 newPlotIndex = m.PlotIndex;
//
// // Check if character_housing already points to the correct neighborhood
// // (e.g., player bought a new house there before migration ran)
// QueryResult housingResult = CharacterDatabase.Query(
// Trinity::StringFormat("SELECT plotIndex FROM character_housing WHERE guid = {} AND neighborhoodGuid = {}",
// m.PlayerGuidLow, correctNbLow).c_str());
// if (housingResult)
// newPlotIndex = housingResult->Fetch()[0].GetUInt8();
//
// // Check for plot conflict in target neighborhood
// if (newPlotIndex != INVALID_PLOT_INDEX && usedPlots.count(newPlotIndex))
// {
// // Find first available plot
// newPlotIndex = INVALID_PLOT_INDEX;
// for (uint8 i = 0; i < MAX_NEIGHBORHOOD_PLOTS; ++i)
// {
// if (!usedPlots.count(i))
// {
// newPlotIndex = i;
// break;
// }
// }
// }
//
// if (newPlotIndex != INVALID_PLOT_INDEX)
// usedPlots.insert(newPlotIndex);
//
// // Insert new membership in correct neighborhood
// CharacterDatabasePreparedStatement* insStmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_NEIGHBORHOOD_MEMBER);
// insStmt->setUInt64(0, correctNbLow);
// insStmt->setUInt64(1, m.PlayerGuidLow);
// insStmt->setUInt8(2, m.Role);
// insStmt->setUInt32(3, m.JoinTime);
// insStmt->setUInt8(4, newPlotIndex);
// CharacterDatabase.DirectExecute(insStmt);
//
// // Update character_housing to point to correct neighborhood (only if it still references the old one)
// CharacterDatabase.DirectExecute(
// Trinity::StringFormat("UPDATE character_housing SET neighborhoodGuid = {}, plotIndex = {} WHERE guid = {} AND neighborhoodGuid = {}",
// correctNbLow, newPlotIndex, m.PlayerGuidLow, m.NbGuidLow).c_str());
//
// TC_LOG_INFO("server.loading", ">> Migrated player {} from neighborhood {} to {} (plot {} -> {})",
// m.PlayerGuidLow, m.NbGuidLow, correctNbLow, m.PlotIndex, newPlotIndex);
// }
// else
// {
// TC_LOG_INFO("server.loading", ">> Removed duplicate wrong-faction membership for player {} from neighborhood {}",
// m.PlayerGuidLow, m.NbGuidLow);
// }
//
// ++migratedCount;
// }
//
// if (migratedCount > 0)
// {
// TC_LOG_INFO("server.loading", ">> Migrated {} resident(s) to correct faction neighborhoods ? reloading", migratedCount);
// LoadFromDB(); // Reload to pick up the changes
// }
//}
//
//void NeighborhoodMgr::RegenerateNeighborhoodNames()
//{
// // Neighborhood names are stored as "ID1-ID2-ID3" tokens referencing NeighborhoodNameGen
// // entry IDs from the base DB2. Old names (from hotfix-era data) may contain text
// // where the values are the TEXT content of overwritten entries, not actual DB2 entry IDs.
// // Validate each public neighborhood's name: parse tokens, verify each is a real entry.
// uint32 regenerated = 0;
// for (auto& [guid, neighborhood] : _neighborhoods)
// {
// if (!neighborhood->IsPublic())
// continue;
//
// std::string const& name = neighborhood->GetName();
// bool needsRegeneration = false;
//
// // Validate: name must be "ID1-ID2-ID3" where each ID is a valid NeighborhoodNameGen entry
// std::vector<std::string> tokens;
// std::string token;
// for (char c : name)
// {
// if (c == '-')
// {
// if (!token.empty())
// tokens.push_back(token);
// token.clear();
// }
// else
// token += c;
// }
// if (!token.empty())
// tokens.push_back(token);
//
// if (tokens.size() != 3)
// {
// needsRegeneration = true;
// }
// else
// {
// for (std::string const& t : tokens)
// {
// // Must be purely numeric
// bool allDigits = !t.empty();
// for (char c : t)
// {
// if (c < '0' || c > '9')
// {
// allDigits = false;
// break;
// }
// }
// if (!allDigits)
// {
// needsRegeneration = true;
// break;
// }
//
// // Must reference a valid NeighborhoodNameGen entry in the base DB2
// uint32 entryId = std::stoul(t);
// if (!sNeighborhoodNameGenStore.LookupEntry(entryId))
// {
// needsRegeneration = true;
// break;
// }
// }
// }
//
// if (!needsRegeneration)
// continue;
//
// std::string newName = sHousingMgr.GenerateNeighborhoodName(neighborhood->GetNeighborhoodMapID());
// if (newName == "Unnamed Neighborhood")
// continue;
//
// TC_LOG_INFO("server.loading", ">> Regenerating neighborhood (guid={}) name: '{}' -> '{}'",
// guid.ToString(), name, newName);
// neighborhood->SetName(newName);
// ++regenerated;
// }
//
// if (regenerated > 0)
// TC_LOG_INFO("server.loading", ">> Regenerated {} neighborhood name(s) using base DB2 entry IDs", regenerated);
// else
// TC_LOG_INFO("server.loading", ">> Public neighborhood names verified");
//}
//
//void NeighborhoodMgr::CheckAndExpandNeighborhoods()
//{
// // For each faction, check if all public neighborhoods are at or above 50% occupation
// // If so, create a new one to accommodate future players
//
// // Group public neighborhoods by faction
// std::unordered_map<int32, std::vector<Neighborhood*>> factionNeighborhoods;
// for (auto const& [guid, neighborhood] : _neighborhoods)
// {
// if (neighborhood->IsPublic())
// factionNeighborhoods[neighborhood->GetFactionRestriction()].push_back(neighborhood.get());
// }
//
// // Check each faction
// for (auto const& [faction, neighborhoods] : factionNeighborhoods)
// {
// if (faction == NEIGHBORHOOD_FACTION_NONE)
// continue;
//
// bool hasCapacity = false;
// for (Neighborhood* neighborhood : neighborhoods)
// {
// uint32 occupiedPlots = neighborhood->GetOccupiedPlotCount();
// uint32 memberCount = neighborhood->GetMemberCount();
//
// // Check both occupied plots AND member count ? either can be the bottleneck.
// // A neighborhood might have many members (invited/added) but few plots occupied,
// // or vice versa. Use the higher of the two for capacity assessment.
// uint32 usage = std::max(occupiedPlots, memberCount);
//
// // If any neighborhood is below 50% usage, there's still capacity
// if (usage < MAX_NEIGHBORHOOD_PLOTS / 2)
// {
// hasCapacity = true;
// break;
// }
// }
//
// if (hasCapacity)
// continue;
//
// // All public neighborhoods for this faction are at or above 50% ? create a new one
// // Find the correct NeighborhoodMapID for this faction
// uint32 targetMapId = 0;
// for (auto const& [id, data] : sHousingMgr.GetAllNeighborhoodMapData())
// {
// int32 flags = data.Flags;
// bool isAlliance = (flags & 0x1) != 0;
// bool isHorde = (flags & 0x2) != 0;
// bool canSystemGenerate = (flags & 0x4) != 0;
//
// if (!canSystemGenerate)
// continue;
//
// if (faction == NEIGHBORHOOD_FACTION_ALLIANCE && isAlliance)
// { targetMapId = id; break; }
// else if (faction == NEIGHBORHOOD_FACTION_HORDE && isHorde)
// { targetMapId = id; break; }
// }
//
// if (targetMapId == 0)
// continue;
//
// std::string name = sHousingMgr.GenerateNeighborhoodName(targetMapId);
// // Use a unique system owner per neighborhood to avoid the "owner already has a neighborhood" check
// // Offset by the number of existing neighborhoods for this faction
// ObjectGuid systemOwner = ObjectGuid::Create<HighGuid::Housing>(/*subType*/ 4, /*arg1*/ sRealmList->GetCurrentRealmId().Realm,
// /*arg2*/ static_cast<uint32>(neighborhoods.size()), uint64(0));
//
// Neighborhood* newNeighborhood = CreateNeighborhood(systemOwner, name, targetMapId, faction, /*isPublic*/ true);
// if (newNeighborhood)
// {
// TC_LOG_INFO("housing", "CheckAndExpandNeighborhoods: Created new {} neighborhood '{}' (all existing at 50%+ capacity)",
// faction == NEIGHBORHOOD_FACTION_ALLIANCE ? "Alliance" : "Horde", name);
// }
// }
//}
//
//ObjectGuid NeighborhoodMgr::GenerateNeighborhoodGuid()
//{
// if (_nextGuid >= 0xFFFFFFFFFFFFFFFE)
// {
// TC_LOG_ERROR("housing", "Neighborhood guid overflow! Cannot continue, shutting down server.");
// World::StopNow(ERROR_EXIT_CODE);
// }
//
// uint64 counter = _nextGuid++;
// return ObjectGuid::Create<HighGuid::Housing>(/*subType*/ 4, /*arg1*/ sRealmList->GetCurrentRealmId().Realm, /*arg2*/ 0, counter);
//}
-99
View File
@@ -1,99 +0,0 @@
/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef TRINITYCORE_NEIGHBORHOOD_MGR_H
//#define TRINITYCORE_NEIGHBORHOOD_MGR_H
//
//#include "Define.h"
//#include "ObjectGuid.h"
//#include <memory>
//#include <string>
//#include <unordered_map>
//#include <vector>
//
//class Neighborhood;
//class Player;
//
//class TC_GAME_API NeighborhoodMgr
//{
//public:
// static NeighborhoodMgr& Instance();
//
// NeighborhoodMgr(NeighborhoodMgr const&) = delete;
// NeighborhoodMgr(NeighborhoodMgr&&) = delete;
// NeighborhoodMgr& operator=(NeighborhoodMgr const&) = delete;
// NeighborhoodMgr& operator=(NeighborhoodMgr&&) = delete;
//
// void Initialize();
// void LoadFromDB();
// void Update(uint32 diff);
//
// // Neighborhood lifecycle
// Neighborhood* CreateNeighborhood(ObjectGuid ownerGuid, std::string const& name, uint32 neighborhoodMapID, int32 factionRestriction, bool isPublic = false);
// Neighborhood* CreateGuildNeighborhood(ObjectGuid ownerGuid, std::string const& name, uint32 neighborhoodMapID, uint32 factionID);
// void DeleteNeighborhood(ObjectGuid neighborhoodGuid);
// Neighborhood* GetNeighborhood(ObjectGuid neighborhoodGuid);
// Neighborhood const* GetNeighborhood(ObjectGuid neighborhoodGuid) const;
//
// // Resolve a neighborhood GUID that may be in client format (GO GUID of bulletin board)
// // Falls back to the player's current HousingMap neighborhood when direct lookup fails
// Neighborhood* ResolveNeighborhood(ObjectGuid guid, Player* player);
//
// // Queries
// Neighborhood* GetNeighborhoodByOwner(ObjectGuid ownerGuid);
// Neighborhood* GetNeighborhoodByGuildId(uint32 guildId);
// std::vector<Neighborhood*> GetAllNeighborhoods() const;
// std::vector<Neighborhood*> GetPublicNeighborhoods() const;
// std::vector<Neighborhood*> GetNeighborhoodsForPlayer(ObjectGuid playerGuid) const;
// std::vector<Neighborhood*> GetNeighborhoodsByBnetAccount(ObjectGuid bnetAccountGuid) const;
// std::string GetNeighborhoodName(ObjectGuid neighborhoodGuid) const;
// Neighborhood* FindNeighborhoodWithPendingInvite(ObjectGuid playerGuid);
//
// // Find or create a public neighborhood for a faction (no membership changes)
// Neighborhood* FindOrCreatePublicNeighborhood(uint32 teamId);
//
// // Find a public neighborhood on the given map (for visitors, no membership change)
// Neighborhood* FindPublicNeighborhoodForMap(uint32 neighborhoodMapId) const;
//
// // Expansion
// void CheckAndExpandNeighborhoods();
//
// // Charter support
// ObjectGuid GenerateNeighborhoodGuid();
//
// // Startup guarantee
// void VerifyNeighborhoodFactions();
// void EnsurePublicNeighborhoods();
//
// // Migrate members in wrong-faction public neighborhoods (legacy data fix)
// void MigrateWrongFactionResidents();
//
// // Regenerate names for public neighborhoods using base DB2 entry IDs
// void RegenerateNeighborhoodNames();
//
//private:
// NeighborhoodMgr() = default;
//
// std::unordered_map<ObjectGuid, std::unique_ptr<Neighborhood>> _neighborhoods;
// std::unordered_map<ObjectGuid, ObjectGuid> _ownerToNeighborhood; // owner guid -> neighborhood guid
// uint64 _nextGuid = 1;
// uint32 _expansionCheckTimer = 0;
//};
//
//#define sNeighborhoodMgr NeighborhoodMgr::Instance()
//
//#endif // TRINITYCORE_NEIGHBORHOOD_MGR_H
+196 -1
View File
@@ -73,6 +73,9 @@
#include "DelveInstance.h"
#include "DelveMgr.h"
#include "DelvesDefines.h"
#include "GameObject.h"
#include "HousingDynamicEntity.h"
//#include "SeasonMgr.h" TODO
//WowCommunity
#define DEFAULT_GRID_EXPIRY 300
#define MAX_GRID_LOAD_TIME 50
@@ -412,6 +415,15 @@ bool Map::AddPlayerToMap(Player* player, bool initPlayer /*= true*/)
// Check if we are adding to correct map
ASSERT(player->GetMap() == this);
player->SetMap(this);
//WowCommunity
// Cornerstones must exist before SendInitSelf builds the player's initial
// visibility set. This avoids sending housing objects before the player
// object itself has completed world initialization.
SpawnHousingPlotCornerstones();
//WowCommunity
player->AddToWorld();
if (initPlayer)
@@ -1831,6 +1843,13 @@ TransferAbortParams Map::PlayerCannotEnter(uint32 mapid, Player* player)
if (player->IsGameMaster())
return TRANSFER_ABORT_NONE;
// Enforce STAGEXO seasonal progression before a new instance is created.
// InstanceMap::CannotEnter handles already-created/bound instances, but
// the first portal/area-trigger entry reaches this path before a bound
// InstanceMap necessarily exists.
//if (!sSeasonMgr->IsMapAvailable(mapid, entry->IsRaid(), entry->IsDungeon(), uint32(mapDiff->DifficultyID)))
// return TRANSFER_ABORT_MAP_NOT_ALLOWED; TODO THOR
//Other requirements
{
TransferAbortParams params(TRANSFER_ABORT_NONE);
@@ -2861,6 +2880,10 @@ template TC_GAME_API bool Map::AddToMap(DynamicObject*);
template TC_GAME_API bool Map::AddToMap(AreaTrigger*);
template TC_GAME_API bool Map::AddToMap(SceneObject*);
template TC_GAME_API bool Map::AddToMap(Conversation*);
//WowCommunity
template TC_GAME_API bool Map::AddToMap(Housing::RoomWorldEntity*);
template TC_GAME_API bool Map::AddToMap(Housing::DynamicWorldEntity*);
//WowCommunity
template TC_GAME_API void Map::RemoveFromMap(Corpse*, bool);
template TC_GAME_API void Map::RemoveFromMap(Creature*, bool);
@@ -2869,6 +2892,10 @@ template TC_GAME_API void Map::RemoveFromMap(DynamicObject*, bool);
template TC_GAME_API void Map::RemoveFromMap(AreaTrigger*, bool);
template TC_GAME_API void Map::RemoveFromMap(SceneObject*, bool);
template TC_GAME_API void Map::RemoveFromMap(Conversation*, bool);
//WowCommunity
template TC_GAME_API void Map::RemoveFromMap(Housing::RoomWorldEntity*, bool);
template TC_GAME_API void Map::RemoveFromMap(Housing::DynamicWorldEntity*, bool);
//WowCommunity
/* ******* Dungeon Instance Maps ******* */
@@ -3593,6 +3620,19 @@ Conversation* Map::GetConversation(ObjectGuid const& guid)
return _objectsStore.Find<Conversation>(guid);
}
//WowCommunity
Housing::RoomWorldEntity* Map::GetHousingRoomEntity(ObjectGuid const& guid)
{
return _objectsStore.Find<Housing::RoomWorldEntity>(guid);
}
Housing::DynamicWorldEntity* Map::GetHousingDynamicEntity(ObjectGuid const& guid)
{
return _objectsStore.Find<Housing::DynamicWorldEntity>(guid);
}
//WowCommunity
Player* Map::GetPlayer(ObjectGuid const& guid)
{
return ObjectAccessor::GetPlayer(this, guid);
@@ -4185,5 +4225,160 @@ void InstanceMap::ActivateChallengeMode()
if (!i_challengeMode)
i_challengeMode = std::make_unique<ChallengeMode>(this);
}
void Map::SpawnHousingPlotCornerstones()
{
if (_housingPlotCornerstonesSpawned || (GetId() != 2735 && GetId() != 2736))
return;
// Set the guard before creating objects because AddToMap may load additional grids.
_housingPlotCornerstonesSpawned = true;
QueryResult result = CharacterDatabase.PQuery(
"SELECT PlotID, CornerstoneEntry, CornerstonePositionX, CornerstonePositionY, "
"CornerstonePositionZ, CornerstoneRotationZ FROM housing_plot_template "
"WHERE ExteriorMapID = {} ORDER BY PlotID", GetId());
if (!result)
{
TC_LOG_ERROR("housing", "No housing plot templates found for map {}", GetId());
return;
}
uint32 spawned = 0;
uint32 fallbackTemplates = 0;
do
{
Field* fields = result->Fetch();
uint32 const capturedEntry = fields[1].GetUInt32();
uint32 entry = capturedEntry;
// Current world data contains the sniffed generic Cornerstone template.
// Prefer each DB2 entry when available and retain a safe visual fallback
// until all unique Cornerstone templates have been imported.
if (!sObjectMgr->GetGameObjectTemplate(entry))
{
entry = 457142;
++fallbackTemplates;
}
if (!sObjectMgr->GetGameObjectTemplate(entry))
continue;
float const x = fields[2].GetFloat();
float const y = fields[3].GetFloat();
float const z = fields[4].GetFloat();
float const orientation = fields[5].GetFloat();
Position const position(x, y, z, orientation);
QuaternionData const rotation = QuaternionData::fromEulerAnglesZYX(orientation, 0.0f, 0.0f);
GameObject* cornerstone = GameObject::CreateGameObject(entry, this, position, rotation, 255, GO_STATE_READY);
if (!cornerstone)
continue;
cornerstone->SetRespawnTime(0);
cornerstone->setActive(true);
cornerstone->SetFarVisible(true);
if (!AddToMap(cornerstone))
{
delete cornerstone;
continue;
}
_housingPlotCornerstones[fields[0].GetUInt8()] = cornerstone->GetGUID();
++spawned;
} while (result->NextRow());
TC_LOG_INFO("housing", "Spawned {} data-driven housing Cornerstones on map {} ({} generic template fallbacks)",
spawned, GetId(), fallbackTemplates);
for (uint8 plotId = 0; plotId < 55; ++plotId)
RefreshHousingPlotHouseDoor(plotId);
}
ObjectGuid Map::GetHousingPlotCornerstoneGuid(uint8 plotId) const
{
auto itr = _housingPlotCornerstones.find(plotId);
return itr != _housingPlotCornerstones.end() ? itr->second : ObjectGuid::Empty;
}
int32 Map::GetHousingPlotIdByCornerstoneGuid(ObjectGuid const& cornerstoneGuid) const
{
for (auto const& [plotId, guid] : _housingPlotCornerstones)
if (guid == cornerstoneGuid)
return int32(plotId);
return -1;
}
void Map::SetHousingPlotOwnershipState(uint8 plotId, bool owned)
{
auto itr = _housingPlotCornerstones.find(plotId);
if (itr == _housingPlotCornerstones.end())
return;
if (GameObject* cornerstone = GetGameObject(itr->second))
cornerstone->SetGoState(owned ? GO_STATE_ACTIVE : GO_STATE_READY);
}
void Map::RefreshHousingPlotHouseDoor(uint8 plotId)
{
auto existing = _housingPlotHouseDoors.find(plotId);
if (existing != _housingPlotHouseDoors.end())
{
if (GameObject* door = GetGameObject(existing->second))
door->AddObjectToRemoveList();
_housingPlotHouseDoors.erase(existing);
}
if (GetId() != 2735 && GetId() != 2736)
return;
QueryResult result = CharacterDatabase.PQuery(
"SELECT p.DoorEntry, p.HousePositionX, p.HousePositionY, p.HousePositionZ, p.HouseRotationZ "
"FROM housing_plot_template p WHERE p.ExteriorMapID = {} AND p.PlotID = {} "
"AND EXISTS (SELECT 1 FROM character_housing h WHERE h.PlotID = p.PlotID "
"AND h.ExteriorMapID = p.ExteriorMapID) LIMIT 1",
GetId(), uint32(plotId));
if (!result)
return;
Field* fields = result->Fetch();
uint32 const entry = fields[0].GetUInt32();
if (!entry || !sObjectMgr->GetGameObjectTemplate(entry))
{
TC_LOG_ERROR("housing", "Housing door template {} is missing for map {}", entry, GetId());
return;
}
float const orientation = fields[4].GetFloat();
Position const position(fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat(), orientation);
QuaternionData const rotation = QuaternionData::fromEulerAnglesZYX(orientation, 0.0f, 0.0f);
GameObject* door = GameObject::CreateGameObject(entry, this, position, rotation, 255, GO_STATE_READY);
if (!door)
return;
door->SetRespawnTime(0);
door->setActive(true);
door->SetFarVisible(true);
if (!AddToMap(door))
{
delete door;
return;
}
_housingPlotHouseDoors[plotId] = door->GetGUID();
}
bool Map::RemoveHousingDynamicEntity(ObjectGuid const& guid)
{
Housing::DynamicWorldEntity* entity = GetHousingDynamicEntity(guid);
if (!entity)
return false;
RemoveFromMap(entity, true);
return true;
}
//WowCommunity
template struct TC_GAME_API TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation>;
template struct TC_GAME_API TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation, Housing::RoomWorldEntity, Housing::DynamicWorldEntity>;
+22 -6
View File
@@ -56,8 +56,6 @@ class InstanceLock;
class InstanceMap;
class InstanceScript;
class InstanceScenario;
class HousingDecorEntity;
class HousingRoomEntity;
class MeshObject;
class Object;
class PhaseShift;
@@ -73,6 +71,7 @@ class WorldSession;
//WowCommunity
class ChallengeMode;
namespace Delves { class DelveInstance; }
namespace Housing { class RoomWorldEntity; class DynamicWorldEntity; }
//WowCommunity
struct DungeonEncounterEntry;
struct MapDifficultyEntry;
@@ -228,8 +227,8 @@ struct MapStoredObjectsUnorderedMap
}
};
extern template struct TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation, MeshObject, HousingRoomEntity, HousingDecorEntity>;
typedef TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation, MeshObject, HousingRoomEntity, HousingDecorEntity> MapStoredObjectTypesContainer;
extern template struct TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation, Housing::RoomWorldEntity, Housing::DynamicWorldEntity>;
typedef TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation, Housing::RoomWorldEntity, Housing::DynamicWorldEntity> MapStoredObjectTypesContainer;
class TC_GAME_API Map : public GridRefManager<NGridType>
{
@@ -449,8 +448,16 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
Creature* GetCreature(ObjectGuid const& guid);
DynamicObject* GetDynamicObject(ObjectGuid const& guid);
GameObject* GetGameObject(ObjectGuid const& guid);
MeshObject* GetMeshObject(ObjectGuid const& guid);
HousingRoomEntity* GetHousingRoomEntity(ObjectGuid const& guid);
//WowCommunity
Housing::RoomWorldEntity* GetHousingRoomEntity(ObjectGuid const& guid);
ObjectGuid GetHousingPlotCornerstoneGuid(uint8 plotId) const;
int32 GetHousingPlotIdByCornerstoneGuid(ObjectGuid const& cornerstoneGuid) const;
void SetHousingPlotOwnershipState(uint8 plotId, bool owned);
void RefreshHousingPlotHouseDoor(uint8 plotId);
bool RemoveHousingDynamicEntity(ObjectGuid const& guid);
Housing::DynamicWorldEntity* GetHousingDynamicEntity(ObjectGuid const& guid);
//WowCommunity
Pet* GetPet(ObjectGuid const& guid);
Transport* GetTransport(ObjectGuid const& guid);
Creature* GetCreatureBySpawnId(ObjectGuid::LowType spawnId) const;
@@ -659,6 +666,10 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
protected:
virtual void LoadGridObjects(NGridType* grid);
//WowCommunity
void SpawnHousingPlotCornerstones();
//WowCommunity
MapEntry const* i_mapEntry;
Difficulty i_spawnMode;
uint32 i_InstanceId;
@@ -713,6 +724,11 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
typedef std::multimap<time_t, ScriptAction> ScriptScheduleMap;
ScriptScheduleMap m_scriptSchedule;
//WowCommunity
bool _housingPlotCornerstonesSpawned = false;
std::unordered_map<uint8, ObjectGuid> _housingPlotCornerstones;
std::unordered_map<uint8, ObjectGuid> _housingPlotHouseDoors;
//WowCommunity
public:
void ProcessRespawns();
@@ -332,16 +332,12 @@ namespace WorldPackets::BattlePet
ByteBuffer& operator<<(ByteBuffer& data, PetBattleEffectTargetInfo const& target)
{
// Safety check: ensure target.Type fits in upper nibble (0-15)
// If Type >= 16, this would corrupt the packet and crash the client
uint8 targetType = (target.Type > 15) ? 0 : static_cast<uint8>(target.Type);
data << uint8(targetType << 4); // Upper nibble (IDA-verified 12.0: client reads uint8 >> 4)
data << uint8(target.Type << 4); // Upper nibble (client reads uint8 >> 4)
data << uint8(target.Petx);
if (target.Type == 8 && target.EmbeddedPetUpdate)
data << *target.EmbeddedPetUpdate;
data << int32(target.Petx);
for (int32 param : target.Params)
data << int32(param);
@@ -351,11 +347,11 @@ namespace WorldPackets::BattlePet
ByteBuffer& operator<<(ByteBuffer& data, PetBattleEffectInfo const& effect)
{
data << int32(effect.AbilityEffectID);
data << int32(effect.Flags);
data << uint16(effect.Flags);
data << int16(effect.SourceAuraInstanceID);
data << int16(effect.TurnInstanceID);
data << int32(effect.PetBattleEffectType);
data << int32(effect.CasterPBOID);
data << int8(effect.PetBattleEffectType);
data << uint8(effect.CasterPBOID);
data << uint8(effect.StackDepth);
data << uint32(effect.Targets.size());
@@ -505,6 +501,9 @@ namespace WorldPackets::BattlePet
WorldPacket const* PetBattleInitialUpdate::Write()
{
// SceneObjectGUID wrapper (see BEFUND/PLAN_B5) precedes the existing body, unchanged otherwise.
_worldPacket << SceneObjectGUID;
// Wire format matches BaseEntity.cpp:494-588
for (std::size_t i = 0; i < 2; ++i)
{
@@ -542,6 +541,7 @@ namespace WorldPackets::BattlePet
WorldPacket const* PetBattleFirstRound::Write()
{
_worldPacket << SceneObjectGUID;
WriteRoundResult(_worldPacket, CurRound, NextPetBattleState, Players, Effects, Cooldowns, PetXDied);
return &_worldPacket;
@@ -549,6 +549,7 @@ namespace WorldPackets::BattlePet
WorldPacket const* PetBattleRoundResult::Write()
{
_worldPacket << SceneObjectGUID;
WriteRoundResult(_worldPacket, CurRound, NextPetBattleState, Players, Effects, Cooldowns, PetXDied);
return &_worldPacket;
@@ -556,6 +557,7 @@ namespace WorldPackets::BattlePet
WorldPacket const* PetBattleReplacementsMade::Write()
{
_worldPacket << SceneObjectGUID;
WriteRoundResult(_worldPacket, CurRound, NextPetBattleState, Players, Effects, Cooldowns, PetXDied);
return &_worldPacket;
@@ -582,6 +584,8 @@ namespace WorldPackets::BattlePet
WorldPacket const* PetBattleFinalRound::Write()
{
_worldPacket << SceneObjectGUID;
// 12.0.7 (68275) wire (sniff-verified vs b_pets, 5 battles): flags_byte, u32(=0), npcCreatureID(u32), pets.count, pets[].
// flags_byte = MSB-first bitfield{4}: bit7=Abandoned, bit6=PvpBattle, bit5=Winners[0] (team0), bit4=Winners[1] (team1).
_worldPacket << Bits<1>(Abandoned);
@@ -650,4 +654,13 @@ namespace WorldPackets::BattlePet
{
_worldPacket >> PetGuid;
}
WorldPacket const* PetBattleFinished::Write()
{
// Body is disasm-verified to be exactly this one ObjectGuid (petbattle_wire_FULL_68275.json
// 0x42008a, read_count 1) - see BEFUND/PLAN_B5.
_worldPacket << SceneObjectGUID;
return &_worldPacket;
}
}
@@ -22,7 +22,6 @@
#include "PacketUtilities.h"
#include "ObjectGuid.h"
#include "Optional.h"
#include "Position.h"
#include "UnitDefines.h"
#include <array>
#include <memory>
@@ -195,6 +194,18 @@ namespace WorldPackets
ObjectGuid PetGuid;
};
// Developer/GM cheat variant of DELETE_PET (opcode DELETE_PET+1). Same wire (one pet GUID); the handler
// is gated on GM security since the client only emits this in developer mode.
class BattlePetDeletePetCheat final : public ClientPacket
{
public:
explicit BattlePetDeletePetCheat(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_DELETE_PET_CHEAT, std::move(packet)) {}
void Read() override;
ObjectGuid PetGuid;
};
class BattlePetSetFlags final : public ClientPacket
{
public:
@@ -355,7 +366,7 @@ namespace WorldPackets
struct PetBattleEffectTargetInfo
{
uint8 Type = 0; // JamPetBattleEffectTarget field 0 (wire: uint8(Type << 4); client reads byte>>4)
int32 Petx = 0; // field 1 (petx@4) ? target pet index / PBOID, always read after the discriminator
int32 Petx = 0; // field 1 (petx@4) - target pet index / PBOID, always read after the discriminator
// Params carry the type-specific union members (ascending reflection offset):
// 1 aura: auraInstanceID, auraAbilityID, roundsRemaining, currentRound (fields 2-5)
// 2 state: stateID, stateValue (fields 6-7)
@@ -364,7 +375,7 @@ namespace WorldPackets
// 5 trigger: triggerAbilityID (field 10)
// 6 cooldown: changedAbilityID, cooldownRemaining, lockdownRemaining (fields 11-13)
// 7 broadcast:broadcastTextID (field 14)
// 8 pet: EmbeddedPetUpdate (field 15 'pet'); slot/newAbilityID (16-17) not serialized ? see report
// 8 pet: EmbeddedPetUpdate (field 15 'pet'); slot/newAbilityID (16-17) not serialized - see report
std::vector<int32> Params;
Optional<PetBattlePetUpdateInfo> EmbeddedPetUpdate; // Only when Type == 8
};
@@ -548,10 +559,14 @@ namespace WorldPackets
class PetBattleInitialUpdate final : public ServerPacket
{
public:
PetBattleInitialUpdate() : ServerPacket(SMSG_PET_BATTLE_INITIAL_UPDATE) {}
// 12.1 (69382, PLAN_B5): the client only listens for the round-broadcast body on the
// (SceneType::PetBattle). SMSG_PET_BATTLE_INITIAL_UPDATE is dead (TC-declared STATUS_NEVER,
// no longer dispatched by the retail client) - this class now targets the live opcode.
PetBattleInitialUpdate() : ServerPacket(SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE) {}
WorldPacket const* Write() override;
ObjectGuid SceneObjectGUID;
std::array<PetBattlePlayerUpdateInfo, 2> Players;
std::array<PetBattleEnviroInfo, 3> Enviros;
uint16 WaitingForFrontPetsMaxSecs = 30;
@@ -569,10 +584,14 @@ namespace WorldPackets
class PetBattleFirstRound final : public ServerPacket
{
public:
PetBattleFirstRound() : ServerPacket(SMSG_PET_BATTLE_FIRST_ROUND) {}
// See PetBattleInitialUpdate above: FIRST_ROUND/ROUND_RESULT/REPLACEMENTS_MADE share one
// client parser (JamPetBattleRoundResult, PLAN_B5) and only differ by which
// SMSG_SCENE_OBJECT_PET_BATTLE_* opcode wraps the identical body.
PetBattleFirstRound() : ServerPacket(SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND) {}
WorldPacket const* Write() override;
ObjectGuid SceneObjectGUID;
uint32 CurRound = 0;
int8 NextPetBattleState = 0;
std::array<PetBattleRoundPlayerData, 2> Players;
@@ -584,10 +603,11 @@ namespace WorldPackets
class PetBattleRoundResult final : public ServerPacket
{
public:
PetBattleRoundResult() : ServerPacket(SMSG_PET_BATTLE_ROUND_RESULT) {}
PetBattleRoundResult() : ServerPacket(SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT) {}
WorldPacket const* Write() override;
ObjectGuid SceneObjectGUID;
uint32 CurRound = 0;
int8 NextPetBattleState = 0;
std::array<PetBattleRoundPlayerData, 2> Players;
@@ -599,10 +619,11 @@ namespace WorldPackets
class PetBattleReplacementsMade final : public ServerPacket
{
public:
PetBattleReplacementsMade() : ServerPacket(SMSG_PET_BATTLE_REPLACEMENTS_MADE) {}
PetBattleReplacementsMade() : ServerPacket(SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE) {}
WorldPacket const* Write() override;
ObjectGuid SceneObjectGUID;
uint32 CurRound = 0;
int8 NextPetBattleState = 0;
std::array<PetBattleRoundPlayerData, 2> Players;
@@ -629,16 +650,23 @@ namespace WorldPackets
class PetBattleFinalRound final : public ServerPacket
{
public:
PetBattleFinalRound() : ServerPacket(SMSG_PET_BATTLE_FINAL_ROUND) {}
// 12.1 (69382, PLAN_B5): live opcode is SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND; the send
// site (PetBattle::SendFinalRoundPacket) and the body already existed, only the opcode +
// SceneObjectGUID wrapper were missing (rank #2, "lowest fruit" in the cluster).
PetBattleFinalRound() : ServerPacket(SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND) {}
WorldPacket const* Write() override;
// UNVERIFIED (PLAN_B5): whether FINAL_ROUND really carries a SceneObjectGUID prefix is only
// confirmed by pattern-matching against FIRST_ROUND/ROUND_RESULT (both sniff-verified); no
// direct sniff of FINAL_ROUND itself exists yet.
ObjectGuid SceneObjectGUID;
bool Abandoned = false;
bool PvpBattle = false;
// 12.0.7 (68275) JamPetBattleFinalRound (sniff-verified vs b_pets, 5 battles): the winner is the
// per-team flag pair in the flag byte ? bit5=Winners[0] (team0), bit4=Winners[1] (team1). The two
// flat uint32s after the flush are field#1 (0 in every capture, role unknown, NOT winners) and
// NpcCreatureID (0 for wild battles, the trainer entry for NPC battles).
// per-team flag pair in the flag byte - bit5=Winners[0] (team0), bit4=Winners[1] (team1). The two
// flat uint32s after the flush are field#1 (0 in every capture, role unknown, NOT winners) and
// NpcCreatureID (0 for wild battles, the trainer entry for NPC battles).
std::array<bool, 2> Winners = {};
uint32 NpcCreatureID = 0;
std::vector<PetBattleFinalPet> Pets;
@@ -647,9 +675,14 @@ namespace WorldPackets
class PetBattleFinished final : public ServerPacket
{
public:
PetBattleFinished() : ServerPacket(SMSG_PET_BATTLE_FINISHED, 0) {}
// 12.1 (69382, PLAN_B5): live opcode is SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED; body is
// disasm-verified to be exactly one ObjectGuid (petbattle_wire_FULL_68275.json 0x42008a,
// read_count 1) - the best-belegte opcode in the whole cluster.
PetBattleFinished() : ServerPacket(SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED, 20) {}
WorldPacket const* Write() override { return &_worldPacket; }
WorldPacket const* Write() override;
ObjectGuid SceneObjectGUID;
};
class PetBattleRequestFailed final : public ServerPacket
@@ -742,18 +775,6 @@ namespace WorldPackets
uint16 TrapLevel = 0;
};
// Developer/GM cheat variant of DELETE_PET (opcode DELETE_PET+1). Same wire (one pet GUID); the handler
// is gated on GM security since the client only emits this in developer mode.
class BattlePetDeletePetCheat final : public ClientPacket
{
public:
explicit BattlePetDeletePetCheat(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_DELETE_PET_CHEAT, std::move(packet)) {}
void Read() override;
ObjectGuid PetGuid;
};
}
}
@@ -604,4 +604,22 @@ WorldPacket const* BattlefieldStatusGroupProposalFailed::Write()
}
ByteBuffer& operator<<(ByteBuffer& data, ArenaOpponentSpecialization const& opponent)
{
data << int32(opponent.SpecID);
data << int8(opponent.Role);
data << opponent.Guid;
return data;
}
WorldPacket const* ArenaPrepOpponentSpecializations::Write()
{
_worldPacket << Size<uint32>(Opponents);
for (ArenaOpponentSpecialization const& opponent : Opponents)
_worldPacket << opponent;
return &_worldPacket;
}
}
@@ -26,6 +26,10 @@
#include "Position.h"
#include <array>
//WowCommunity
#include "DBCEnums.h"
//WowCommunity
namespace WorldPackets
{
namespace Battleground
@@ -790,6 +794,34 @@ namespace WorldPackets
WorldPacket const* Write() override { return &_worldPacket; }
};
struct ArenaOpponentSpecialization
{
int32 SpecID = 0;
int8 Role = int8(ChrSpecializationRole::Dps);
ObjectGuid Guid;
};
ByteBuffer& operator<<(ByteBuffer& data, ArenaOpponentSpecialization const& opponent);
class ArenaPrepOpponentSpecializations final : public ServerPacket
{
public:
explicit ArenaPrepOpponentSpecializations() : ServerPacket(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, 4) {}
WorldPacket const* Write() override;
std::vector<ArenaOpponentSpecialization> Opponents;
};
class ArenaClearOpponents final : public ServerPacket
{
public:
explicit ArenaClearOpponents() : ServerPacket(SMSG_ARENA_CLEAR_OPPONENTS, 0) {}
WorldPacket const* Write() override { return &_worldPacket; }
};
}
}

Some files were not shown because too many files have changed in this diff Show More