Compare commits
74
Commits
fdf2335ab1
...
5a04c57da9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a04c57da9 | ||
|
|
5459305be7 | ||
|
|
fb18dd4abe | ||
|
|
090d058a23 | ||
|
|
53c230fc7e | ||
|
|
eca6949659 | ||
|
|
3c67dfeb8e | ||
|
|
66b4c0031b | ||
|
|
16d09bc6ae | ||
|
|
abe5bb06e0 | ||
|
|
89faba7a1d | ||
|
|
c56516fedc | ||
|
|
0327947c5c | ||
|
|
2a6309ee39 | ||
|
|
e06b82c20f | ||
|
|
35af683510 | ||
|
|
ff59d91281 | ||
|
|
dbe44b1fbc | ||
|
|
4b78bf1783 | ||
|
|
a81ad1441f | ||
|
|
fe82981295 | ||
|
|
39630ba78f | ||
|
|
78f3039bcf | ||
|
|
9479327891 | ||
|
|
4fa9aa772e | ||
|
|
1ce75096ca | ||
|
|
7053a981d5 | ||
|
|
2ffefdb117 | ||
|
|
f920c67ee4 | ||
|
|
365148aa93 | ||
|
|
78b7c0c895 | ||
|
|
f26aa8250b | ||
|
|
42cd278def | ||
|
|
4b27cd02c8 | ||
|
|
b8a7cabe2e | ||
|
|
1546d2bac5 | ||
|
|
82d3395770 | ||
|
|
a63a1aa146 | ||
|
|
7e2e539196 | ||
|
|
8f41f84183 | ||
|
|
91f8b7d397 | ||
|
|
3ed5549531 | ||
|
|
57182d1da0 | ||
|
|
02d961c7df | ||
|
|
84bf44ed1d | ||
|
|
ecc0ce9269 | ||
|
|
6ca76c41ff | ||
|
|
9f39780c4f | ||
|
|
36c38b89c2 | ||
|
|
50a720bf8e | ||
|
|
00f55ed447 | ||
|
|
5682c19edc | ||
|
|
861a694c4e | ||
|
|
2b010c1935 | ||
|
|
64cbe030ec | ||
|
|
22ae6ca777 | ||
|
|
1c7a856e48 | ||
|
|
2496fc7de3 | ||
|
|
36db8a16b5 | ||
|
|
21519e88fd | ||
|
|
996c3393dc | ||
|
|
744aedc0d5 | ||
|
|
de23a70e93 | ||
|
|
1e5b4eab89 | ||
|
|
061fefb08b | ||
|
|
40917cb70b | ||
|
|
92652e693a | ||
|
|
6d4ff69a62 | ||
|
|
a0adb613ba | ||
|
|
3ab50aef37 | ||
|
|
754cb9547b | ||
|
|
ef2b7bf837 | ||
|
|
c5382a4d9c | ||
|
|
3dd0c91898 |
@@ -0,0 +1,21 @@
|
||||
-- Midnight 12.1 Housing Stage 2: separate transient plot reservations from owned plots.
|
||||
-- A reservation must never rewrite character_housing.PlotID before purchase/move commits.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `housing_plot_reservation` (
|
||||
`ExteriorMapID` int unsigned NOT NULL,
|
||||
`PlotID` tinyint unsigned NOT NULL,
|
||||
`OwnerGuid` bigint unsigned NOT NULL,
|
||||
`NeighborhoodGuid` varchar(64) NOT NULL,
|
||||
`ReservedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`ExpiresAt` timestamp NOT NULL,
|
||||
PRIMARY KEY (`ExteriorMapID`, `PlotID`, `NeighborhoodGuid`),
|
||||
UNIQUE KEY `uk_housing_plot_reservation_owner` (`OwnerGuid`),
|
||||
KEY `idx_housing_plot_reservation_expiry` (`ExpiresAt`),
|
||||
KEY `idx_housing_plot_reservation_neighborhood` (`NeighborhoodGuid`, `PlotID`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Transaction type 2 is used when a house is relinquished. This only updates
|
||||
-- metadata/documentation for an already-existing column; no data is dropped.
|
||||
ALTER TABLE `housing_plot_transaction`
|
||||
MODIFY COLUMN `TransactionType` tinyint unsigned NOT NULL
|
||||
COMMENT '0=purchase, 1=move, 2=relinquish';
|
||||
@@ -0,0 +1,92 @@
|
||||
-- Housing room client-data contract for WoW 12.1.0.69587.
|
||||
--
|
||||
-- Verified DB2 contracts:
|
||||
-- HouseRoom.db2 FileDataID 5163003, layout 0xF04DC279
|
||||
-- HouseLevelData.db2 FileDataID 7149539, layout 0xF8146F9D
|
||||
--
|
||||
-- This update is intentionally non-destructive. Existing hotfix rows are preserved.
|
||||
-- HouseDecor is deliberately not touched here because that table remains quarantined
|
||||
-- from the active 12.1.0 client hotfix path until its duplicate-key crash is resolved.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `house_level_data` (
|
||||
`ID` int unsigned NOT NULL DEFAULT '0',
|
||||
`Level` int NOT NULL DEFAULT '0',
|
||||
`QuestID` int NOT NULL DEFAULT '0',
|
||||
`Field_12_0_7_67808_003` int NOT NULL DEFAULT '0',
|
||||
`VerifiedBuild` int NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`ID`,`VerifiedBuild`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `house_room` (
|
||||
`Name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
|
||||
`ID` int unsigned NOT NULL DEFAULT '0',
|
||||
`Size` tinyint NOT NULL DEFAULT '0',
|
||||
`Flags` int NOT NULL DEFAULT '0',
|
||||
`Field_002` int NOT NULL DEFAULT '0',
|
||||
`RoomWmoDataID` int NOT NULL DEFAULT '0',
|
||||
`UiTextureAtlasElementID` int NOT NULL DEFAULT '0',
|
||||
`WeightCost` int NOT NULL DEFAULT '0',
|
||||
`ItemID` int NOT NULL DEFAULT '0',
|
||||
`SortPriority` int NOT NULL DEFAULT '0',
|
||||
`VerifiedBuild` int NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`ID`,`VerifiedBuild`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `house_room_locale` (
|
||||
`ID` int unsigned NOT NULL DEFAULT '0',
|
||||
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
|
||||
`VerifiedBuild` int NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Reconcile installations that already have the older three-field HouseLevelData
|
||||
-- table without relying on MariaDB-only ADD COLUMN IF NOT EXISTS syntax.
|
||||
SET @housing_sql := IF(
|
||||
EXISTS(
|
||||
SELECT 1
|
||||
FROM `INFORMATION_SCHEMA`.`COLUMNS`
|
||||
WHERE `TABLE_SCHEMA` = DATABASE()
|
||||
AND `TABLE_NAME` = 'house_level_data'
|
||||
AND `COLUMN_NAME` = 'Field_12_0_7_67808_003'
|
||||
),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `house_level_data` ADD COLUMN `Field_12_0_7_67808_003` int NOT NULL DEFAULT 0 AFTER `QuestID`'
|
||||
);
|
||||
PREPARE housing_stmt FROM @housing_sql;
|
||||
EXECUTE housing_stmt;
|
||||
DEALLOCATE PREPARE housing_stmt;
|
||||
|
||||
-- HouseRoom gained ItemID and SortPriority in the verified 69587 layout. Preserve
|
||||
-- existing rows and add only the columns that are absent on older installations.
|
||||
SET @housing_sql := IF(
|
||||
EXISTS(
|
||||
SELECT 1
|
||||
FROM `INFORMATION_SCHEMA`.`COLUMNS`
|
||||
WHERE `TABLE_SCHEMA` = DATABASE()
|
||||
AND `TABLE_NAME` = 'house_room'
|
||||
AND `COLUMN_NAME` = 'ItemID'
|
||||
),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `house_room` ADD COLUMN `ItemID` int NOT NULL DEFAULT 0 AFTER `WeightCost`'
|
||||
);
|
||||
PREPARE housing_stmt FROM @housing_sql;
|
||||
EXECUTE housing_stmt;
|
||||
DEALLOCATE PREPARE housing_stmt;
|
||||
|
||||
SET @housing_sql := IF(
|
||||
EXISTS(
|
||||
SELECT 1
|
||||
FROM `INFORMATION_SCHEMA`.`COLUMNS`
|
||||
WHERE `TABLE_SCHEMA` = DATABASE()
|
||||
AND `TABLE_NAME` = 'house_room'
|
||||
AND `COLUMN_NAME` = 'SortPriority'
|
||||
),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `house_room` ADD COLUMN `SortPriority` int NOT NULL DEFAULT 0 AFTER `ItemID`'
|
||||
);
|
||||
PREPARE housing_stmt FROM @housing_sql;
|
||||
EXECUTE housing_stmt;
|
||||
DEALLOCATE PREPARE housing_stmt;
|
||||
|
||||
SET @housing_sql := NULL;
|
||||
@@ -0,0 +1,5 @@
|
||||
-- Item Sparse
|
||||
DELETE FROM `item_sparse` WHERE `ID`=269938;
|
||||
INSERT INTO `item_sparse` (`ID`, `Description`, `Display3`, `Display2`, `Display1`, `Display`, `ExpansionID`, `DmgVariance`, `LimitCategory`, `DurationInInventory`, `QualityModifier`, `BagFamily`, `StartQuestID`, `LanguageID`, `ItemRange`, `StatPercentageOfSocket1`, `StatPercentageOfSocket2`, `StatPercentageOfSocket3`, `StatPercentageOfSocket4`, `StatPercentageOfSocket5`, `StatPercentageOfSocket6`, `StatPercentageOfSocket7`, `StatPercentageOfSocket8`, `StatPercentageOfSocket9`, `StatPercentageOfSocket10`, `StatPercentEditor1`, `StatPercentEditor2`, `StatPercentEditor3`, `StatPercentEditor4`, `StatPercentEditor5`, `StatPercentEditor6`, `StatPercentEditor7`, `StatPercentEditor8`, `StatPercentEditor9`, `StatPercentEditor10`, `StatModifierBonusStat1`, `StatModifierBonusStat2`, `StatModifierBonusStat3`, `StatModifierBonusStat4`, `StatModifierBonusStat5`, `StatModifierBonusStat6`, `StatModifierBonusStat7`, `StatModifierBonusStat8`, `StatModifierBonusStat9`, `StatModifierBonusStat10`, `Stackable`, `MaxCount`, `MinReputation`, `RequiredAbility`, `AllowableRace1`, `AllowableRace2`, `SellPrice`, `BuyPrice`, `VendorStackCount`, `PriceVariance`, `PriceRandomValue`, `Flags1`, `Flags2`, `Flags3`, `Flags4`, `Flags5`, `FactionRelated`, `ModifiedCraftingReagentItemID`, `ContentTuningID`, `PlayerLevelToItemLevelCurveID`, `ItemLevelOffsetCurveID`, `ItemLevelOffsetItemLevel`, `ItemSquishEraID`, `ItemNameDescriptionID`, `RequiredTransmogHoliday`, `RequiredHoliday`, `GemProperties`, `SocketMatchEnchantmentId`, `TotemCategoryID`, `InstanceBound`, `ZoneBound1`, `ZoneBound2`, `ItemSet`, `LockID`, `PageID`, `ItemDelay`, `MinFactionID`, `RequiredSkillRank`, `RequiredSkill`, `ItemLevel`, `AllowableClass`, `ArtifactID`, `SpellWeight`, `SpellWeightCategory`, `SocketType1`, `SocketType2`, `SocketType3`, `SheatheType`, `Material`, `PageMaterialID`, `Bonding`, `DamageDamageType`, `ContainerSlots`, `RequiredPVPMedal`, `RequiredPVPRank`, `RequiredLevel`, `InventoryType`, `OverallQualityID`, `VerifiedBuild`) VALUES
|
||||
(269938, 'May be used to repair the Supply Wagon when near it.', NULL, NULL, NULL, 'Repair Supplies', 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0); -- Repair Supplies
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
--
|
||||
-- BattlePetState.db2 (12.1.0.69587 layout 489B22AD). Loaded so the pet-battle engine can tell
|
||||
-- which weather/aura states the client must be told about (Flags 0x8) -- without it the client
|
||||
-- never showed Call Blizzard / Call Lightning weather.
|
||||
--
|
||||
DROP TABLE IF EXISTS `battle_pet_state`;
|
||||
CREATE TABLE `battle_pet_state` (
|
||||
`ID` int unsigned NOT NULL DEFAULT '0',
|
||||
`LuaName` text,
|
||||
`Flags` int NOT NULL DEFAULT '0',
|
||||
`BattlePetVisualID` smallint unsigned NOT NULL DEFAULT '0',
|
||||
`VerifiedBuild` int NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`ID`,`VerifiedBuild`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,569 @@
|
||||
-- DBErrors Fixes
|
||||
DELETE FROM `page_text` WHERE `ID` IN (10569,10575,10576,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858);
|
||||
INSERT INTO `page_text` (`ID`, `Text`, `NextPageID`, `PlayerConditionID`, `Flags`, `VerifiedBuild`) VALUES
|
||||
(10569, 'Unknown', 0, 0, 0, 69587),
|
||||
(10575, 'Unknown', 0, 0, 0, 69587),
|
||||
(10576, 'Unknown', 0, 0, 0, 69587),
|
||||
(10847, 'Here lies a soul beyond comparison. I dreamt of our life together. Now you may rest while I must dream new dreams.', 0, 0, 0, 69587),
|
||||
(10848, 'Here fell my daughter. I carve this and weep with sorrow as much as I wept with joy the day you were born.', 0, 0, 0, 69587),
|
||||
(10849, 'To those I failed: I will sing your valor. Before you lies eternity, may glory be your everlasting companion.', 0, 0, 0, 69587),
|
||||
(10850, 'To the stranger who passes by: Know that I dine with the ancestors now. I am free from the dust of this world.', 0, 0, 0, 69587),
|
||||
(10851, 'To my captain, who fought to the last: Even in death, your foes will fear your white bones. I shall howl your name and crush the serpents\' hearts.', 0, 0, 0, 69587),
|
||||
(10852, 'Here fell the joy of my heart. I still see you in my dreams. Then I wake. Where do you go when I open my eyes?', 0, 0, 0, 69587),
|
||||
(10853, 'Here fell my mother and father. Together, they were the thunder and the lightning. Now the skies are clear, and they rest.', 0, 0, 0, 69587),
|
||||
(10854, 'To my sister, always swift of foot and sure of strength: Soundless are your footfalls now. I carry your spear, but it hangs heavy in my hand.', 0, 0, 0, 69587),
|
||||
(10855, 'To those who stood by my side: Sorrow is my comrade now, but we will meet again. I will laugh with you then, and weep, then laugh once more.', 0, 0, 0, 69587),
|
||||
(10856, 'Here lies the boys I raised. Do you remember the constellations I taught you? How far away the stars seem now.', 0, 0, 0, 69587),
|
||||
(10857, 'To my father: I will sing the songs you taught me, but I cannot remember the words. I hope you will teach me again someday.', 0, 0, 0, 69587),
|
||||
(10858, 'To my shield-bearer: What bargain is this? Your life for mine? I would die a thousand deaths rather than carry this grief.', 0, 0, 0, 69587);
|
||||
|
||||
|
||||
UPDATE `creature_template_addon` SET `auras`='' WHERE `entry` IN (259700,263653,262741,262754,262773);
|
||||
UPDATE `quest_offer_reward` SET `Emote1`=0 WHERE `ID` IN (92921,93265,92919,92917,92916);
|
||||
UPDATE `creature_template` SET `npcflag`=2 WHERE `entry` IN (253476,253493,255269,255282,255758,257078,262798,262880,263331,272109);
|
||||
UPDATE `creature_template` SET `npcflag`=130 WHERE `entry`=262880;
|
||||
UPDATE `creature_template` SET `npcflag`=128 WHERE `entry`=272751;
|
||||
|
||||
|
||||
DELETE FROM `npc_text` WHERE `ID`=2627980;
|
||||
INSERT INTO `npc_text` (`ID`, `Probability0`, `Probability1`, `Probability2`, `Probability3`, `Probability4`, `Probability5`, `Probability6`, `Probability7`, `BroadcastTextID0`, `BroadcastTextID1`, `BroadcastTextID2`, `BroadcastTextID3`, `BroadcastTextID4`, `BroadcastTextID5`, `BroadcastTextID6`, `BroadcastTextID7`, `VerifiedBuild`) VALUES
|
||||
(2627980, 100, 0, 0, 0, 0, 0, 0, 0, 50429, 0, 0, 0, 0, 0, 0, 0, 69587);
|
||||
|
||||
|
||||
UPDATE `gameobject_template` SET `Data1`=671498, `Data30`=0 WHERE `entry`=671498;
|
||||
UPDATE `gameobject_template` SET `Data1`=645580 WHERE `entry`=645580;
|
||||
UPDATE `gameobject_template` SET `Data1`=670350 WHERE `entry`=670350;
|
||||
UPDATE `gameobject_template` SET `Data1`=656039 WHERE `entry`=656039;
|
||||
UPDATE `gameobject_template` SET `Data1`=675629, `Data30`=0 WHERE `entry`=675629;
|
||||
UPDATE `gameobject_template` SET `Data1`=655891 WHERE `entry`=655891;
|
||||
UPDATE `gameobject_template` SET `Data1`=656044 WHERE `entry`=656044;
|
||||
UPDATE `gameobject_template` SET `Data1`=656001 WHERE `entry`=656001;
|
||||
UPDATE `gameobject_template` SET `Data1`=645579 WHERE `entry`=645579;
|
||||
UPDATE `gameobject_template` SET `Data1`=649687 WHERE `entry`=649687;
|
||||
UPDATE `gameobject_template` SET `Data1`=625510, `Data30`=0 WHERE `entry`=625510;
|
||||
UPDATE `gameobject_template` SET `Data1`=649640 WHERE `entry`=649640;
|
||||
UPDATE `gameobject_template` SET `Data1`=670351 WHERE `entry`=670351;
|
||||
UPDATE `gameobject_template` SET `Data1`=654991 WHERE `entry`=654991;
|
||||
UPDATE `gameobject_template` SET `Data1`=670349 WHERE `entry`=670349;
|
||||
UPDATE `gameobject_template` SET `Data1`=655890 WHERE `entry`=655890;
|
||||
UPDATE `gameobject_template` SET `Data1`=613853, `Data30`=0 WHERE `entry`=613853;
|
||||
UPDATE `gameobject_template` SET `Data1`=642203 WHERE `entry`=642203;
|
||||
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_thundering_totem' WHERE `entry`=135761;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_akaali_the_conqueror' WHERE `entry`=269808;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_explosive_totem' WHERE `entry`=135764;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_king_dazar' WHERE `entry`=136160;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_kula_the_butcher' WHERE `entry`=269811;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_mchimba_the_embalmer' WHERE `entry`=134993;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_reban' WHERE `entry`=136984;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_interment_construct' WHERE `entry`=137969;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_wretched_mummy' WHERE `entry` IN (273050,136264);
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_zanazal_the_wise' WHERE `entry`=269810;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_tzala' WHERE `entry`=136976;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_gold_pool_stalker' WHERE `entry`=269148;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_kings_rest_torrent_totem' WHERE `entry`=135765;
|
||||
|
||||
|
||||
DELETE FROM `instance_template` WHERE `map`=2927;
|
||||
INSERT INTO `instance_template` (`map`, `parent`, `script`, `insideResurrection`) VALUES
|
||||
(2927, 0, 'instance_catchup_arathi', 1);
|
||||
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 671498;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(671498, 0, 278536, 100, 0, 1, 0, 1, 1, 'Mummified Lynx''s Paw');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 645580;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(645580, 0, 271693, 100, 0, 1, 0, 1, 1, 'Congealed Venom');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 670350;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670350, 0, 244712, 1, 0, 1, 0, 1, 1, 'Sin''dorei Angler''s Rod');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670350, 0, 279091, 1, 0, 1, 0, 1, 1, 'Oozing Goby');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670350, 0, 279093, 1, 0, 1, 0, 1, 1, 'Giggling Skull');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670350, 0, 279094, 1, 0, 1, 0, 1, 1, 'Grotesque Sturgeon');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670350, 0, 274596, 1, 0, 1, 0, 1, 1, 'Beached Asteroid');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670350, 0, 274587, 1, 0, 1, 0, 1, 1, 'Spotted Killifish');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 656039;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 219934, 0.96479106, 0, 1, 0, 10, 10, 'Spark of War');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258138, 90.52858, 0, 1, 0, 1, 2, 'Potent Healing Potion');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258848, 0.91772807, 0, 1, 0, 1, 1, 'Stained Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258849, 0.87360644, 0, 1, 0, 1, 1, 'Stained Headguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258850, 0.91184515, 0, 1, 0, 1, 1, 'Stained Fistguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258851, 0.9236109, 0, 1, 0, 1, 1, 'Stained Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258852, 0.8383092, 0, 1, 0, 1, 1, 'Stained Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258853, 0.95596665, 0, 1, 0, 1, 1, 'Stained Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258854, 0.93831813, 0, 1, 0, 1, 1, 'Stained Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258855, 0.8618408, 0, 1, 0, 1, 1, 'Stained Armguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258856, 0.9294937, 0, 1, 0, 1, 1, 'Threadbare Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258857, 0.944201, 0, 1, 0, 1, 1, 'Threadbare Sash');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258858, 0.89125514, 0, 1, 0, 1, 1, 'Threadbare Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258859, 0.9147866, 0, 1, 0, 1, 1, 'Threadbare Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258860, 0.82654345, 0, 1, 0, 1, 1, 'Threadbare Leggings');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258861, 0.8559579, 0, 1, 0, 1, 1, 'Threadbare Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258862, 0.8588993, 0, 1, 0, 1, 1, 'Threadbare Vestments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258863, 0.9530253, 0, 1, 0, 1, 1, 'Threadbare Armbands');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258864, 0.92066944, 0, 1, 0, 1, 1, 'Brittle Waistguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258865, 0.93537664, 0, 1, 0, 1, 1, 'Brittle Breastplate');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258866, 0.92066944, 0, 1, 0, 1, 1, 'Brittle Gauntlets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258867, 0.897138, 0, 1, 0, 1, 1, 'Brittle Faceguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258868, 0.897138, 0, 1, 0, 1, 1, 'Brittle Legguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258869, 0.8588993, 0, 1, 0, 1, 1, 'Brittle Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258870, 0.8412507, 0, 1, 0, 1, 1, 'Brittle Warboots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258871, 0.9677324, 0, 1, 0, 1, 1, 'Brittle Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258872, 0.944201, 0, 1, 0, 1, 1, 'Frayed Wristwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258873, 0.8383092, 0, 1, 0, 1, 1, 'Frayed Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258874, 0.8588993, 0, 1, 0, 1, 1, 'Frayed Shoulderpads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258875, 0.9530253, 0, 1, 0, 1, 1, 'Frayed Britches');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258876, 0.8618408, 0, 1, 0, 1, 1, 'Frayed Guise');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258877, 0.944201, 0, 1, 0, 1, 1, 'Frayed Handwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258878, 0.87360644, 0, 1, 0, 1, 1, 'Frayed Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258879, 0.8677236, 0, 1, 0, 1, 1, 'Frayed Strap');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258911, 0.1882519, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Pendant');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258921, 0.16472042, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258923, 0.18236904, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Hood');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258926, 0.18236904, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Belt');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258927, 0.20590052, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Bracers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258928, 0.20590052, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258929, 0.20001766, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258930, 0.20295908, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Handguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258931, 0.19413477, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Cover');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258939, 0.17060329, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Helmet');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258940, 0.15883754, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258941, 0.20590052, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258946, 0.17354472, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Chopper');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258947, 0.19707622, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Dagger');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258948, 0.17060329, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Knife');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258951, 0.16472042, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Shortsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258953, 0.1794276, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Longbow');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258956, 0.16766185, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Scepter');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 258958, 0.18236904, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Greatsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259188, 0.55004853, 0, 1, 0, 1, 1, 'Lightbloomed Spore Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259189, 0.6147601, 0, 1, 0, 1, 1, 'Aged Cruor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259190, 0.34708944, 0, 1, 0, 1, 1, 'Thalassian Whetstone');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259191, 0.39709386, 0, 1, 0, 1, 1, 'Infused Quenching Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259192, 0.55004853, 0, 1, 0, 1, 1, 'Voidstorm Ashes');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259193, 0.6294673, 0, 1, 0, 1, 1, 'Lost Thalassian Vellum');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259194, 0.4088596, 0, 1, 0, 1, 1, 'Dance Gear');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259195, 0.43827397, 0, 1, 0, 1, 1, 'Dawn Capacitor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259196, 0.22354913, 0, 1, 0, 1, 1, 'Brilliant Phoenix Ink');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259197, 0.23237343, 0, 1, 0, 1, 1, 'Loa-Blessed Rune');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259198, 0.24119776, 0, 1, 0, 1, 1, 'Void-Touched Eversong Diamond Fragments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259199, 0.24708062, 0, 1, 0, 1, 1, 'Harandar Stone Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259200, 0.35297233, 0, 1, 0, 1, 1, 'Amani Tanning Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259201, 0.33238226, 0, 1, 0, 1, 1, 'Thalassian Mana Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259202, 0.45886403, 0, 1, 0, 1, 1, 'Embroidered Memento');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 259203, 0.43827397, 0, 1, 0, 1, 1, 'Finely Woven Lynx Collar');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266208, 0.18531047, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266209, 0.1882519, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266210, 0.21766627, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266216, 0.944201, 0, 1, 0, 1, 1, 'Threadbare Cloak');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266221, 0.91184515, 0, 1, 0, 1, 1, 'Frayed Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266223, 0.8677236, 0, 1, 0, 1, 1, 'Stained Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 266224, 0.8853722, 0, 1, 0, 1, 1, 'Brittle Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 274464, 3.014972, 0, 1, 0, 1, 1, 'Black Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 274469, 3.0649762, 0, 1, 0, 1, 1, 'Brown Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 274470, 3.206165, 0, 1, 0, 1, 1, 'Green Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 276126, 44.53334, 0, 1, 0, 1, 1, 'Serpent''s Feather');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 278070, 0.9059623, 0, 1, 0, 1, 1, 'Handful of Esoteric Ingredients');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656039, 0, 279573, 9.897932, 0, 1, 0, 5, 5, 'Fading Voidwhisper');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 675629;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(675629, 0, 278472, 100, 0, 1, 0, 1, 1, 'Noxious Corrosive Coin');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 655891;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 244712, 1, 0, 1, 0, 1, 1, 'Sin''dorei Angler''s Rod');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 274594, 1, 0, 1, 0, 1, 1, 'Polluted Puffer');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 274587, 1, 0, 1, 0, 1, 1, 'Spotted Killifish');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 274588, 1, 0, 1, 0, 1, 1, 'Toxic Tlhapi');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 274590, 1, 0, 1, 0, 1, 1, 'Sulfurous Sludgefish');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 274592, 1, 0, 1, 0, 1, 1, 'Dirty Darter');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 262798, 1, 0, 1, 0, 1, 1, 'Stranded Glimmerline');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655891, 0, 243343, 1, 0, 1, 0, 1, 1, 'Angler''s Anomaly');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 656044;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 219934, 1.0788171, 0, 1, 0, 10, 10, 'Spark of War');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258138, 91.179085, 0, 1, 0, 1, 2, 'Potent Healing Potion');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258848, 0.9836273, 0, 1, 0, 1, 1, 'Stained Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258849, 0.9265135, 0, 1, 0, 1, 1, 'Stained Headguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258850, 0.9603588, 0, 1, 0, 1, 1, 'Stained Fistguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258851, 0.9117062, 0, 1, 0, 1, 1, 'Stained Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258852, 0.97093534, 0, 1, 0, 1, 1, 'Stained Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258853, 0.9159368, 0, 1, 0, 1, 1, 'Stained Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258854, 0.8376698, 0, 1, 0, 1, 1, 'Stained Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258855, 0.9624741, 0, 1, 0, 1, 1, 'Stained Armguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258856, 0.88843757, 0, 1, 0, 1, 1, 'Threadbare Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258857, 0.90324485, 0, 1, 0, 1, 1, 'Threadbare Sash');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258858, 0.9413208, 0, 1, 0, 1, 1, 'Threadbare Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258859, 0.9624741, 0, 1, 0, 1, 1, 'Threadbare Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258860, 0.8376698, 0, 1, 0, 1, 1, 'Threadbare Leggings');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258861, 0.9117062, 0, 1, 0, 1, 1, 'Threadbare Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258862, 0.9836273, 0, 1, 0, 1, 1, 'Threadbare Vestments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258863, 0.93285954, 0, 1, 0, 1, 1, 'Threadbare Armbands');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258864, 0.9243982, 0, 1, 0, 1, 1, 'Brittle Waistguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258865, 0.8609383, 0, 1, 0, 1, 1, 'Brittle Breastplate');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258866, 0.9095909, 0, 1, 0, 1, 1, 'Brittle Gauntlets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258867, 0.95189744, 0, 1, 0, 1, 1, 'Brittle Faceguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258868, 0.9730508, 0, 1, 0, 1, 1, 'Brittle Legguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258869, 0.858823, 0, 1, 0, 1, 1, 'Brittle Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258870, 0.9138215, 0, 1, 0, 1, 1, 'Brittle Warboots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258871, 0.9138215, 0, 1, 0, 1, 1, 'Brittle Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258872, 0.87997633, 0, 1, 0, 1, 1, 'Frayed Wristwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258873, 0.9159368, 0, 1, 0, 1, 1, 'Frayed Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258874, 0.9095909, 0, 1, 0, 1, 1, 'Frayed Shoulderpads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258875, 0.92016757, 0, 1, 0, 1, 1, 'Frayed Britches');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258876, 0.81440115, 0, 1, 0, 1, 1, 'Frayed Guise');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258877, 0.86516905, 0, 1, 0, 1, 1, 'Frayed Handwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258878, 0.9413208, 0, 1, 0, 1, 1, 'Frayed Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258879, 0.9095909, 0, 1, 0, 1, 1, 'Frayed Strap');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258908, 0.18191819, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Band');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258913, 0.17134154, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258914, 0.19249482, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258920, 0.18826416, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258932, 0.19249482, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Chausses');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258936, 0.18403351, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Breastplate');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258947, 0.1903795, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Dagger');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258953, 0.17345688, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Longbow');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 258959, 0.17345688, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Blade');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259188, 0.4230655, 0, 1, 0, 1, 1, 'Lightbloomed Spore Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259189, 0.45268014, 0, 1, 0, 1, 1, 'Aged Cruor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259190, 0.31306848, 0, 1, 0, 1, 1, 'Thalassian Whetstone');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259191, 0.31941447, 0, 1, 0, 1, 1, 'Infused Quenching Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259192, 0.44844946, 0, 1, 0, 1, 1, 'Voidstorm Ashes');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259193, 0.46114144, 0, 1, 0, 1, 1, 'Lost Thalassian Vellum');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259194, 0.4188349, 0, 1, 0, 1, 1, 'Dance Gear');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259195, 0.39556628, 0, 1, 0, 1, 1, 'Dawn Capacitor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259197, 0.18614884, 0, 1, 0, 1, 1, 'Loa-Blessed Rune');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259198, 0.2538393, 0, 1, 0, 1, 1, 'Void-Touched Eversong Diamond Fragments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259199, 0.23268603, 0, 1, 0, 1, 1, 'Harandar Stone Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259200, 0.27710792, 0, 1, 0, 1, 1, 'Amani Tanning Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259201, 0.27287725, 0, 1, 0, 1, 1, 'Thalassian Mana Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259202, 0.4209502, 0, 1, 0, 1, 1, 'Embroidered Memento');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 259203, 0.4357575, 0, 1, 0, 1, 1, 'Finely Woven Lynx Collar');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 266210, 0.16922621, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 266216, 0.871515, 0, 1, 0, 1, 1, 'Threadbare Cloak');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 266221, 0.86516905, 0, 1, 0, 1, 1, 'Frayed Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 266223, 0.92016757, 0, 1, 0, 1, 1, 'Stained Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 266224, 0.8947836, 0, 1, 0, 1, 1, 'Brittle Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 274464, 3.1560688, 0, 1, 0, 1, 1, 'Black Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 274469, 3.0333798, 0, 1, 0, 1, 1, 'Brown Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 274470, 3.2301054, 0, 1, 0, 1, 1, 'Green Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 276117, 43.269028, 0, 1, 0, 1, 1, 'Clouded Blood-Pearl');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 278070, 0.79113257, 0, 1, 0, 1, 1, 'Handful of Esoteric Ingredients');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656044, 0, 279573, 9.459745, 0, 1, 0, 5, 5, 'Fading Voidwhisper');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 656001;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 274781, 1, 0, 1, 0, 1, 1, 'Cursebound Globe');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 237359, 1, 0, 1, 0, 1, 1, 'Refulgent Copper Ore');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 237361, 1, 0, 1, 0, 1, 1, 'Refulgent Copper Ore');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 237366, 1, 0, 1, 0, 1, 1, 'Dazzling Thorium');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 237496, 1, 0, 1, 0, 1, 1, 'Igneous Rock Specimen');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 237506, 1, 0, 1, 0, 1, 1, 'Septarian Nodule');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 237507, 1, 0, 1, 0, 1, 1, 'Cloudy Quartz');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (656001, 0, 274781, 1, 0, 1, 0, 1, 1, 'Cursebound Globe');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 645579;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(645579, 0, 271693, 100, 0, 1, 0, 1, 1, 'Congealed Venom');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 649687;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258138, 92.01089, 0, 1, 0, 2, 3, 'Potent Healing Potion');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258848, 0.46994808, 0, 1, 0, 1, 1, 'Stained Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258849, 0.7420232, 0, 1, 0, 1, 1, 'Stained Headguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258850, 0.692555, 0, 1, 0, 1, 1, 'Stained Fistguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258851, 0.66782093, 0, 1, 0, 1, 1, 'Stained Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258852, 0.71728915, 0, 1, 0, 1, 1, 'Stained Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258853, 0.86569375, 0, 1, 0, 1, 1, 'Stained Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258854, 0.76675737, 0, 1, 0, 1, 1, 'Stained Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258855, 0.9893644, 0, 1, 0, 1, 1, 'Stained Armguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258856, 0.6183527, 0, 1, 0, 1, 1, 'Threadbare Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258857, 0.5936186, 0, 1, 0, 1, 1, 'Threadbare Sash');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258858, 0.79149145, 0, 1, 0, 1, 1, 'Threadbare Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258859, 0.79149145, 0, 1, 0, 1, 1, 'Threadbare Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258860, 0.7420232, 0, 1, 0, 1, 1, 'Threadbare Leggings');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258861, 0.79149145, 0, 1, 0, 1, 1, 'Threadbare Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258862, 0.9893644, 0, 1, 0, 1, 1, 'Threadbare Vestments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258863, 0.9646302, 0, 1, 0, 1, 1, 'Threadbare Armbands');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258864, 0.9646302, 0, 1, 0, 1, 1, 'Brittle Waistguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258865, 0.66782093, 0, 1, 0, 1, 1, 'Brittle Breastplate');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258866, 0.89042795, 0, 1, 0, 1, 1, 'Brittle Gauntlets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258867, 0.8162255, 0, 1, 0, 1, 1, 'Brittle Faceguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258868, 0.76675737, 0, 1, 0, 1, 1, 'Brittle Legguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258869, 0.66782093, 0, 1, 0, 1, 1, 'Brittle Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258870, 0.692555, 0, 1, 0, 1, 1, 'Brittle Warboots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258871, 0.8162255, 0, 1, 0, 1, 1, 'Brittle Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258872, 0.66782093, 0, 1, 0, 1, 1, 'Frayed Wristwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258873, 0.79149145, 0, 1, 0, 1, 1, 'Frayed Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258874, 0.6430868, 0, 1, 0, 1, 1, 'Frayed Shoulderpads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258875, 0.84095967, 0, 1, 0, 1, 1, 'Frayed Britches');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258876, 0.5194163, 0, 1, 0, 1, 1, 'Frayed Guise');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258877, 0.76675737, 0, 1, 0, 1, 1, 'Frayed Handwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258878, 0.79149145, 0, 1, 0, 1, 1, 'Frayed Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258879, 0.5688845, 0, 1, 0, 1, 1, 'Frayed Strap');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258908, 0.2968093, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Band');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258909, 0.39574572, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Signet');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258911, 0.3710116, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Pendant');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258912, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Robe');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258913, 0.17313875, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258914, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258915, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258916, 0.14840464, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Trousers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258917, 0.46994808, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Pads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258918, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Sash');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258921, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258922, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Gloves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258923, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Hood');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258924, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Breeches');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258925, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Spaulders');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258926, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Belt');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258927, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Bracers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258928, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258929, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258930, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Handguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258931, 0.3710116, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Cover');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258932, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Chausses');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258933, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Epaulets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258934, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258935, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Armguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258937, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Warboots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258938, 0.2968093, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Gauntlets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258939, 0.2720752, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Helmet');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258940, 0.2473411, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258941, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258942, 0.12367055, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Greatbelt');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258944, 0.3462775, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Cleaver');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258945, 0.2968093, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Carver');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258946, 0.3710116, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Chopper');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258947, 0.2720752, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Dagger');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258948, 0.2720752, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Knife');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258949, 0.22260699, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Mace');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258950, 0.17313875, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Warmace');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258951, 0.2968093, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Shortsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258952, 0.44521397, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Longsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258953, 0.2473411, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Longbow');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258954, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Poleaxe');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258955, 0.4946822, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Halberd');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258956, 0.2473411, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Scepter');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258957, 0.2473411, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Staff');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258958, 0.3215434, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Greatsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258959, 0.2720752, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Blade');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 258960, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Beacon');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259188, 0.5688845, 0, 1, 0, 1, 1, 'Lightbloomed Spore Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259189, 0.39574572, 0, 1, 0, 1, 1, 'Aged Cruor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259190, 0.3462775, 0, 1, 0, 1, 1, 'Thalassian Whetstone');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259191, 0.2720752, 0, 1, 0, 1, 1, 'Infused Quenching Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259192, 0.7420232, 0, 1, 0, 1, 1, 'Voidstorm Ashes');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259193, 0.5194163, 0, 1, 0, 1, 1, 'Lost Thalassian Vellum');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259194, 0.5194163, 0, 1, 0, 1, 1, 'Dance Gear');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259195, 0.44521397, 0, 1, 0, 1, 1, 'Dawn Capacitor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259198, 0.2968093, 0, 1, 0, 1, 1, 'Void-Touched Eversong Diamond Fragments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259199, 0.19787286, 0, 1, 0, 1, 1, 'Harandar Stone Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259201, 0.2720752, 0, 1, 0, 1, 1, 'Thalassian Mana Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259202, 0.2473411, 0, 1, 0, 1, 1, 'Embroidered Memento');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 259203, 0.39574572, 0, 1, 0, 1, 1, 'Finely Woven Lynx Collar');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266207, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Cloak');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266208, 0.2968093, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266209, 0.2473411, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266210, 0.19787286, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266216, 0.46994808, 0, 1, 0, 1, 1, 'Threadbare Cloak');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266221, 0.6183527, 0, 1, 0, 1, 1, 'Frayed Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266223, 0.692555, 0, 1, 0, 1, 1, 'Stained Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 266224, 0.6430868, 0, 1, 0, 1, 1, 'Brittle Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 274464, 4.99629, 0, 1, 0, 1, 1, 'Black Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 274469, 4.6994805, 0, 1, 0, 1, 1, 'Brown Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 274470, 4.798417, 0, 1, 0, 1, 1, 'Green Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 275060, 13.603761, 0, 1, 0, 1, 1, 'Forgotten Relic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649687, 0, 279573, 6.529804, 0, 1, 0, 5, 5, 'Fading Voidwhisper');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry`=625510;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(625510, 0, 93179, 100, 0, 1, 0, 1, 1, 'Scrap Metal');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 649640;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258138, 90.917915, 0, 1, 0, 1, 2, 'Potent Healing Potion');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258848, 0.8976951, 0, 1, 0, 1, 1, 'Stained Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258849, 0.7925596, 0, 1, 0, 1, 1, 'Stained Headguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258850, 0.788516, 0, 1, 0, 1, 1, 'Stained Fistguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258851, 0.92600083, 0, 1, 0, 1, 1, 'Stained Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258852, 0.8572584, 0, 1, 0, 1, 1, 'Stained Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258853, 0.9138698, 0, 1, 0, 1, 1, 'Stained Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258854, 0.812778, 0, 1, 0, 1, 1, 'Stained Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258855, 0.92600083, 0, 1, 0, 1, 1, 'Stained Armguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258856, 0.84108377, 0, 1, 0, 1, 1, 'Threadbare Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258857, 0.97856855, 0, 1, 0, 1, 1, 'Threadbare Sash');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258858, 0.9138698, 0, 1, 0, 1, 1, 'Threadbare Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258859, 0.8532147, 0, 1, 0, 1, 1, 'Threadbare Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258860, 0.8936514, 0, 1, 0, 1, 1, 'Threadbare Leggings');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258861, 1.0230489, 0, 1, 0, 1, 1, 'Threadbare Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258862, 0.8936514, 0, 1, 0, 1, 1, 'Threadbare Vestments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258863, 0.94217545, 0, 1, 0, 1, 1, 'Threadbare Armbands');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258864, 0.78042865, 0, 1, 0, 1, 1, 'Brittle Waistguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258865, 0.8491711, 0, 1, 0, 1, 1, 'Brittle Breastplate');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258866, 0.97452486, 0, 1, 0, 1, 1, 'Brittle Gauntlets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258867, 0.90173876, 0, 1, 0, 1, 1, 'Brittle Faceguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258868, 0.84108377, 0, 1, 0, 1, 1, 'Brittle Legguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258869, 0.9138698, 0, 1, 0, 1, 1, 'Brittle Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258870, 0.8491711, 0, 1, 0, 1, 1, 'Brittle Warboots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258871, 0.8289527, 0, 1, 0, 1, 1, 'Brittle Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258872, 0.861302, 0, 1, 0, 1, 1, 'Frayed Wristwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258873, 0.90982616, 0, 1, 0, 1, 1, 'Frayed Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258874, 0.8289527, 0, 1, 0, 1, 1, 'Frayed Shoulderpads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258875, 0.84108377, 0, 1, 0, 1, 1, 'Frayed Britches');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258876, 0.87343305, 0, 1, 0, 1, 1, 'Frayed Guise');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258877, 0.9623938, 0, 1, 0, 1, 1, 'Frayed Handwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258878, 0.7925596, 0, 1, 0, 1, 1, 'Frayed Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258879, 1.0028305, 0, 1, 0, 1, 1, 'Frayed Strap');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258909, 0.18196523, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Signet');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258915, 0.19409624, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258930, 0.16579054, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Handguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258934, 0.19005257, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258939, 0.16983421, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Helmet');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258943, 0.23048927, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258944, 0.13748485, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Cleaver');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258947, 0.17387788, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Dagger');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258950, 0.19409624, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Warmace');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 258957, 0.1981399, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Staff');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259188, 0.6227254, 0, 1, 0, 1, 1, 'Lightbloomed Spore Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259189, 0.6146381, 0, 1, 0, 1, 1, 'Aged Cruor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259190, 0.35179943, 0, 1, 0, 1, 1, 'Thalassian Whetstone');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259191, 0.36393046, 0, 1, 0, 1, 1, 'Infused Quenching Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259192, 0.6712495, 0, 1, 0, 1, 1, 'Voidstorm Ashes');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259193, 0.69955516, 0, 1, 0, 1, 1, 'Lost Thalassian Vellum');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259194, 0.44884756, 0, 1, 0, 1, 1, 'Dance Gear');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259195, 0.48928428, 0, 1, 0, 1, 1, 'Dawn Capacitor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259196, 0.23048927, 0, 1, 0, 1, 1, 'Brilliant Phoenix Ink');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259197, 0.23857662, 0, 1, 0, 1, 1, 'Loa-Blessed Rune');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259198, 0.2992317, 0, 1, 0, 1, 1, 'Void-Touched Eversong Diamond Fragments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259199, 0.2871007, 0, 1, 0, 1, 1, 'Harandar Stone Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259200, 0.3679741, 0, 1, 0, 1, 1, 'Amani Tanning Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259201, 0.38010514, 0, 1, 0, 1, 1, 'Thalassian Mana Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259202, 0.4407602, 0, 1, 0, 1, 1, 'Embroidered Memento');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 259203, 0.36393046, 0, 1, 0, 1, 1, 'Finely Woven Lynx Collar');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 266209, 0.17792155, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 266216, 1.059442, 0, 1, 0, 1, 1, 'Threadbare Cloak');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 266221, 0.94621915, 0, 1, 0, 1, 1, 'Frayed Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 266223, 0.9340881, 0, 1, 0, 1, 1, 'Stained Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 266224, 0.8491711, 0, 1, 0, 1, 1, 'Brittle Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 274464, 2.9923172, 0, 1, 0, 1, 1, 'Black Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 274469, 3.1985443, 0, 1, 0, 1, 1, 'Brown Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 274470, 2.858876, 0, 1, 0, 1, 1, 'Green Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 275060, 12.1431465, 0, 1, 0, 1, 1, 'Forgotten Relic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 279550, 20.097048, 0, 1, 0, 1, 1, 'Potion of Venomous Return');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (649640, 0, 279573, 8.524059, 0, 1, 0, 5, 5, 'Fading Voidwhisper');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry`=670351;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(670351, 0, 93179, 100, 0, 1, 0, 1, 1, 'Scrap Metal');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 654991;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 219934, 1.1002752, 0, 1, 0, 10, 10, 'Spark of War');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258138, 91.44578, 0, 1, 0, 1, 2, 'Potent Healing Potion');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258848, 0.8710511, 0, 1, 0, 1, 1, 'Stained Girdle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258849, 0.9460699, 0, 1, 0, 1, 1, 'Stained Headguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258850, 0.94815373, 0, 1, 0, 1, 1, 'Stained Fistguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258851, 1.0169209, 0, 1, 0, 1, 1, 'Stained Hauberk');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258852, 0.92523134, 0, 1, 0, 1, 1, 'Stained Greaves');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258853, 0.9898308, 0, 1, 0, 1, 1, 'Stained Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258854, 0.99191463, 0, 1, 0, 1, 1, 'Stained Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258855, 0.8898058, 0, 1, 0, 1, 1, 'Stained Armguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258856, 0.9835793, 0, 1, 0, 1, 1, 'Threadbare Mantle');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258857, 0.8731349, 0, 1, 0, 1, 1, 'Threadbare Sash');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258858, 0.9898308, 0, 1, 0, 1, 1, 'Threadbare Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258859, 0.9023089, 0, 1, 0, 1, 1, 'Threadbare Mitts');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258860, 0.9731599, 0, 1, 0, 1, 1, 'Threadbare Leggings');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258861, 0.92523134, 0, 1, 0, 1, 1, 'Threadbare Slippers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258862, 0.8272901, 0, 1, 0, 1, 1, 'Threadbare Vestments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258863, 0.9981662, 0, 1, 0, 1, 1, 'Threadbare Armbands');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258864, 0.8773027, 0, 1, 0, 1, 1, 'Brittle Waistguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258865, 0.87521875, 0, 1, 0, 1, 1, 'Brittle Breastplate');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258866, 0.86688334, 0, 1, 0, 1, 1, 'Brittle Gauntlets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258867, 0.86271566, 0, 1, 0, 1, 1, 'Brittle Faceguard');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258868, 0.89397347, 0, 1, 0, 1, 1, 'Brittle Legguards');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258869, 0.9168959, 0, 1, 0, 1, 1, 'Brittle Pauldrons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258870, 0.9023089, 0, 1, 0, 1, 1, 'Brittle Warboots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258871, 0.91897976, 0, 1, 0, 1, 1, 'Brittle Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258872, 0.93981826, 0, 1, 0, 1, 1, 'Frayed Wristwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258873, 0.84604484, 0, 1, 0, 1, 1, 'Frayed Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258874, 0.9377344, 0, 1, 0, 1, 1, 'Frayed Shoulderpads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258875, 0.929399, 0, 1, 0, 1, 1, 'Frayed Britches');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258876, 0.83145785, 0, 1, 0, 1, 1, 'Frayed Guise');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258877, 0.8606318, 0, 1, 0, 1, 1, 'Frayed Handwraps');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258878, 0.9127282, 0, 1, 0, 1, 1, 'Frayed Boots');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258879, 0.8335417, 0, 1, 0, 1, 1, 'Frayed Strap');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258908, 0.17087606, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Band');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258910, 0.14586979, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Loop');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258912, 0.1875469, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Robe');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258915, 0.18963075, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Crown');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258916, 0.17504376, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Trousers');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258917, 0.15212137, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Spellbinder''s Pads');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258920, 0.19379845, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Tunic');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258926, 0.16045679, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Corsair''s Belt');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258929, 0.17504376, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Sabatons');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258932, 0.18546303, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Chausses');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258933, 0.1958823, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Epaulets');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258943, 0.17295991, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Commander''s Armplates');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258945, 0.17295991, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Carver');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258946, 0.18963075, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Chopper');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258950, 0.17295991, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Warmace');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258952, 0.21046929, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Longsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258957, 0.17921147, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Staff');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258958, 0.15420522, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Greatsword');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 258959, 0.20421772, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Blade');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259188, 0.56680834, 0, 1, 0, 1, 1, 'Lightbloomed Spore Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259189, 0.56680834, 0, 1, 0, 1, 1, 'Aged Cruor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259190, 0.40843543, 0, 1, 0, 1, 1, 'Thalassian Whetstone');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259191, 0.37092605, 0, 1, 0, 1, 1, 'Infused Quenching Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259192, 0.63974327, 0, 1, 0, 1, 1, 'Voidstorm Ashes');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259193, 0.6126532, 0, 1, 0, 1, 1, 'Lost Thalassian Vellum');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259194, 0.4792865, 0, 1, 0, 1, 1, 'Dance Gear');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259195, 0.4251063, 0, 1, 0, 1, 1, 'Dawn Capacitor');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259196, 0.22714013, 0, 1, 0, 1, 1, 'Brilliant Phoenix Ink');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259197, 0.22505626, 0, 1, 0, 1, 1, 'Loa-Blessed Rune');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259198, 0.2750688, 0, 1, 0, 1, 1, 'Void-Touched Eversong Diamond Fragments');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259199, 0.30007502, 0, 1, 0, 1, 1, 'Harandar Stone Sample');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259200, 0.38134533, 0, 1, 0, 1, 1, 'Amani Tanning Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259201, 0.35842294, 0, 1, 0, 1, 1, 'Thalassian Mana Oil');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259202, 0.45219636, 0, 1, 0, 1, 1, 'Embroidered Memento');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 259203, 0.49387348, 0, 1, 0, 1, 1, 'Finely Woven Lynx Collar');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 266209, 0.16879219, 0, 1, 0, 1, 1, 'Tarnished Dawnlit Sentinel''s Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 266216, 0.85438025, 0, 1, 0, 1, 1, 'Threadbare Cloak');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 266221, 0.9085605, 0, 1, 0, 1, 1, 'Frayed Shroud');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 266223, 0.92523134, 0, 1, 0, 1, 1, 'Stained Drape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 266224, 0.91064435, 0, 1, 0, 1, 1, 'Brittle Cape');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 274464, 3.175794, 0, 1, 0, 1, 1, 'Black Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 274469, 3.2549806, 0, 1, 0, 1, 1, 'Brown Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 274470, 3.0986912, 0, 1, 0, 1, 1, 'Green Housing Dye');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 276124, 40.681004, 0, 1, 0, 1, 1, 'Ancient Knucklebone');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 278070, 0.76894224, 0, 1, 0, 1, 1, 'Handful of Esoteric Ingredients');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (654991, 0, 279573, 10.538052, 0, 1, 0, 5, 5, 'Fading Voidwhisper');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 670349;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670349, 0, 244712, 1, 0, 1, 0, 1, 1, 'Sin''dorei Angler''s Rod');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670349, 0, 279100, 1, 0, 1, 0, 1, 1, 'Many-Eyed Flounder');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670349, 0, 236949, 1, 0, 1, 0, 1, 1, 'Mote of Light');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670349, 0, 279105, 1, 0, 1, 0, 1, 1, 'Twin-Headed Snipefish');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670349, 0, 262650, 1, 0, 1, 0, 1, 1, 'Writhing Wiggleworm');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (670349, 0, 279106, 1, 0, 1, 0, 1, 1, 'Loathsome Anglerfish');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 655890;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 244712, 1, 0, 1, 0, 1, 1, 'Sin''dorei Angler''s Rod');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 274590, 1, 0, 1, 0, 1, 1, 'Sulfurous Sludgefish');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 274588, 1, 0, 1, 0, 1, 1, 'Toxic Tlhapi');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 243342, 1, 0, 1, 0, 1, 1, 'Bloom Bauble');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 274589, 1, 0, 1, 0, 1, 1, 'Ula''tek Snakehead');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 274592, 1, 0, 1, 0, 1, 1, 'Dirty Darter');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 274587, 1, 0, 1, 0, 1, 1, 'Spotted Killifish');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 262650, 1, 0, 1, 0, 1, 1, 'Writhing Wiggleworm');
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES (655890, 0, 238477, 1, 0, 1, 0, 1, 1, 'Rotten Meat');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry`=613853;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(613853, 0, 93179, 100, 0, 1, 0, 1, 1, 'Scrap Metal');
|
||||
|
||||
DELETE FROM `gameobject_loot_template` WHERE `Entry` = 642203;
|
||||
INSERT INTO `gameobject_loot_template` (`Entry`, `ItemType`, `Item`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
|
||||
(642203, 0, 269938, 100, 0, 1, 0, 1, 1, 'Repair Supplies');
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
-- ======================
|
||||
-- Void Elf Starting Zone
|
||||
-- ======================
|
||||
|
||||
-- Misc: Spell Area Calibration
|
||||
DELETE FROM `spell_area` WHERE `area` IN (9415,9531,15382,15383);
|
||||
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, 9415, 49788, 0, 0, -1, 268435456, 2, 3, 74, 64, 'Generic Quest Invisibility Detection 1 - Void Elf (Telogrus Rift, Telogrus Rift)'),
|
||||
(49417, 9415, 50305, 0, 0, -1, 268435456, 2, 3, 64, 64, 'Generic Quest Invisibility Detection 2 - Void Elf (Telogrus Rift, Telogrus Rift)'),
|
||||
(60922, 9415, 49788, 49788, 0, -1, 268435456, 2, 3, 11, 64, 'Generic Quest Invisibility Detection 3 - Void Elf (Telogrus Rift, Telogrus Rift)'),
|
||||
(90161, 9415, 49928, 49928, 0, -1, 268435456, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 4 - Void Elf (Telogrus Rift, Telogrus Rift)');
|
||||
|
||||
|
||||
-- NPC Alleria Windrunner (131345)
|
||||
DELETE FROM `creature` WHERE `guid`=21732;
|
||||
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
|
||||
(21732, 131345, 1865, 9415, 9415, '0', 0, 0, 0, -1, 0, 1, 2138.36, 3319.13, 55.0343, 3.6204, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (238178,21732);
|
||||
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(238178, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, '60921'),
|
||||
(21732, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, '82343');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (131345,-238178,-21732) AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=13134500 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
|
||||
(131345, 0, 0, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 13134500, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Alleria Windrunner - On Just Summoned - Run Actionlist'),
|
||||
|
||||
(-238178, 0, 0, 0, '', 19, 0, 100, 0, 49788, 0, 0, 0, 0, '', 143, 6798, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Alleria Windrunner - On Quest Taken - Run Conversation'),
|
||||
(-21732, 0, 0, 0, '', 20, 0, 100, 0, 49928, 0, 0, 0, 0, '', 162, 131345, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 2138.36, 3319.13, 55.0343, 3.6204, 'Alleria Windrunner - On Quest Rewarded - Summon Creature Alleria Windrunner in Personal Visibility'),
|
||||
|
||||
(13134500, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 83, 3, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Alleria Windrunner - Remove NPC Flag'),
|
||||
(13134500, 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, 'Alleria Windrunner - Set Orientation to Invoker'),
|
||||
(13134500, 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, 'Alleria Windrunner - Say Line 0'),
|
||||
(13134500, 9, 3, 0, '', 0, 0, 100, 0, 11000, 11000, 0, 0, 0, '', 1, 1, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Alleria Windrunner - Say Line 1'),
|
||||
(13134500, 9, 4, 0, '', 0, 0, 100, 0, 13000, 13000, 0, 0, 0, '', 11, 52096, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Alleria Windrunner - Cast Cosmetic Teleport Effect'),
|
||||
(13134500, 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, 'Alleria Windrunner - Despawn Instant');
|
||||
|
||||
|
||||
-- NPC Magister Umbric (132382)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=132382;
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid`=238179;
|
||||
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(238179, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, '60921');
|
||||
|
||||
|
||||
-- Conversation (20002)
|
||||
DELETE FROM `conversation_template` WHERE `Id`=20002;
|
||||
DELETE FROM `conversation_actors` WHERE `ConversationId`=20002;
|
||||
DELETE FROM `conversation_line_template` WHERE `Id` IN (15601,15602);
|
||||
|
||||
|
||||
|
||||
-- =================================
|
||||
-- Lightforged Draenei Starting Zone
|
||||
-- =================================
|
||||
|
||||
-- Misc: Spell Area Calibration
|
||||
DELETE FROM `spell_area` WHERE `area`=9359;
|
||||
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, 9359, 49772, 0, 0, -1, 536870912, 2, 3, 74, 64, 'Generic Quest Invisibility Detection 1 - Lightforged Draenei (The Vindicaar, The Vindicaar)'),
|
||||
(49417, 9359, 49772, 49772, 0, -1, 536870912, 2, 3, 11, 64, 'Generic Quest Invisibility Detection 2 - Lightforged Draenei (The Vindicaar, The Vindicaar)'),
|
||||
(60922, 9359, 49782, 49782, 0, -1, 536870912, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 3 - Lightforged Draenei (The Vindicaar, The Vindicaar)');
|
||||
|
||||
|
||||
-- NPC Captain Fareeya (130993)
|
||||
DELETE FROM `creature` WHERE `guid`=21901;
|
||||
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
|
||||
(21901, 130993, 1860, 9359, 9359, '0', 0, 0, 0, -1, 0, 1, 463.762, 1452.3, 757.656, 3.58093, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (238180,21901);
|
||||
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(238180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '49415'),
|
||||
(21901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '60921');
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=130993;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(130993, 0, 0, 'Throughout your journeys, you have been a beacon of Light in the darkness. You have shown the Alliance what it means to be Lightforged.', 12, 0, 100, 1, 0, 93703, 0, 141949, 0, 'Captain Fareeya'),
|
||||
(130993, 1, 0, 'Wear these vestments with pride, $p. The Army of the Light will always be honored to count you in its ranks.', 12, 0, 100, 1, 0, 93704, 0, 141950, 0, 'Captain Fareeya');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (130993,-238180,-21901) AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=13099300 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
|
||||
(130993, 0, 0, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 13099300, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - On Just Summoned - Run Actionlist'),
|
||||
|
||||
(-238180, 0, 0, 0, '', 19, 0, 100, 0, 49772, 0, 0, 0, 0, '', 143, 6481, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - On Quest Taken - Run Conversation'),
|
||||
(-21901, 0, 0, 0, '', 20, 0, 100, 0, 49782, 0, 0, 0, 0, '', 162, 130993, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 463.762, 1452.3, 757.656, 3.58093, 'Captain Fareeya - On Quest Rewarded - Summon Creature Captain Fareeya in Personal Visibility'),
|
||||
|
||||
(13099300, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 83, 3, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - Remove NPC Flag'),
|
||||
(13099300, 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, 'Captain Fareeya - Set Orientation to Invoker'),
|
||||
(13099300, 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, 'Captain Fareeya - Say Line 0'),
|
||||
(13099300, 9, 3, 0, '', 0, 0, 100, 0, 14000, 14000, 0, 0, 0, '', 1, 1, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - Say Line 1'),
|
||||
(13099300, 9, 4, 0, '', 0, 0, 100, 0, 15000, 15000, 0, 0, 0, '', 11, 52096, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - Cast Cosmetic Teleport Effect'),
|
||||
(13099300, 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, 'Captain Fareeya - Despawn Instant');
|
||||
|
||||
|
||||
-- Conversation (20003)
|
||||
DELETE FROM `conversation_template` WHERE `Id`=20003;
|
||||
DELETE FROM `conversation_actors` WHERE `ConversationId`=20003;
|
||||
DELETE FROM `conversation_line_template` WHERE `Id` IN (15593,15594);
|
||||
|
||||
|
||||
|
||||
-- =============================
|
||||
-- Dark Iron Dwarf Starting Zone
|
||||
-- =============================
|
||||
|
||||
-- Misc: Spell Area Calibration
|
||||
DELETE FROM `spell_area` WHERE `area`=10028;
|
||||
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, 10028, 51486, 0, 0, -1, 2048, 2, 3, 74, 64, 'Generic Quest Invisibility Detection 1 - Dark Iron Dwarf (Blackrock Depths, Blackrock Depths)'),
|
||||
(49417, 10028, 51486, 51486, 0, -1, 2048, 2, 3, 11, 64, 'Generic Quest Invisibility Detection 2 - Dark Iron Dwarf (Blackrock Depths, Blackrock Depths)'),
|
||||
(60922, 10028, 51483, 51483, 0, -1, 2048, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 3 - Dark Iron Dwarf (Blackrock Depths, Blackrock Depths)');
|
||||
|
||||
|
||||
-- NPC Moira Thaurissan (144152)
|
||||
DELETE FROM `creature` WHERE `guid`=21907;
|
||||
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
|
||||
(21907, 144152, 2081, 10028, 10028, '0', 0, 0, 0, -1, 0, 0, 1632.3, 524.549, 201.495, 2.14499, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (241312,21907);
|
||||
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(241312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '49415'),
|
||||
(21907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '60921');
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=144152;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(144152, 0, 0, 'Now the Alliance knows we Dark Iron mean business. I couldna asked fer a better champion.', 12, 0, 100, 1, 0, 109892, 0, 156230, 0, 'Moira Thaurissan'),
|
||||
(144152, 1, 0, 'Thurgaden and Thaelin cooked up a set o\' armor tae recognize yer achievements. Wear it with pride, $n.', 12, 0, 100, 1, 0, 109893, 0, 156231, 0, 'Moira Thaurissan');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (144152,-241312,-21907) AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=14415200 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
|
||||
(144152, 0, 0, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 14415200, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Moira Thaurissan - On Just Summoned - Run Actionlist'),
|
||||
|
||||
(-241312, 0, 0, 0, '', 19, 0, 100, 0, 51486, 0, 0, 0, 0, '', 143, 9652, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Moira Thaurissan - On Quest Taken - Run Conversation'),
|
||||
(-21907, 0, 1, 0, '', 20, 0, 100, 0, 51483, 0, 0, 0, 0, '', 162, 144152, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 1632.3, 524.549, 201.495, 2.14499, 'Moira Thaurissan - On Quest Rewarded - Summon Creature Moira Thaurissan in Personal Visibility'),
|
||||
|
||||
(14415200, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 83, 3, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Moira Thaurissan - Remove NPC Flag'),
|
||||
(14415200, 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, 'Moira Thaurissan - Set Orientation to Invoker'),
|
||||
(14415200, 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, 'Moira Thaurissan - Say Line 0'),
|
||||
(14415200, 9, 3, 0, '', 0, 0, 100, 0, 8000, 8000, 0, 0, 0, '', 1, 1, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Moira Thaurissan - Say Line 1'),
|
||||
(14415200, 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, 'Moira Thaurissan - Cast Cosmetic Teleport Effect'),
|
||||
(14415200, 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, 'Moira Thaurissan - Despawn Instant');
|
||||
|
||||
|
||||
-- Conversation (20004)
|
||||
DELETE FROM `conversation_template` WHERE `Id`=20004;
|
||||
DELETE FROM `conversation_actors` WHERE `ConversationId`=20004;
|
||||
DELETE FROM `conversation_line_template` WHERE `Id` IN (22099,22100);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=387506 AND `ScriptName`='spell_warl_mayhem';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (387506, 'spell_warl_mayhem');
|
||||
|
||||
UPDATE `creature_addon` SET `auras`='0' WHERE `guid`=135295;
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=1247227 AND `ScriptName`='spell_rog_crimson_tempest';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (1247227, 'spell_rog_crimson_tempest');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=360194 AND `ScriptName`='spell_rog_deathmark';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (360194, 'spell_rog_deathmark');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=315585 AND `ScriptName`='spell_rog_instant_poison';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (315585, 'spell_rog_instant_poison');
|
||||
|
||||
DELETE FROM `spell_script_names` WHERE `spell_id`=381673 AND `ScriptName`='spell_rog_doomblade';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (381673, 'spell_rog_doomblade');
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
-- NPC Hrun the Exiled (160451,156900)
|
||||
UPDATE `creature_template` SET `unit_flags`=768, `flags_extra`=128 WHERE `entry`=160451;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=160451;
|
||||
UPDATE `creature_template_difficulty` SET `StaticFlags1`=536871168 WHERE `Entry`=160451;
|
||||
|
||||
UPDATE `creature_template_addon` SET `auras`='' WHERE `entry`=156900;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=156900;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(156900, 0, 0, 'You will be kindling for the flame!', 12, 0, 100, 0, 0, 152997, 0, 172629, 0, 'Hrun the Exiled'),
|
||||
(156900, 1, 0, 'If... I die... so... do you!', 12, 0, 100, 0, 0, 152998, 0, 183958, 0, 'Hrun the Exiled');
|
||||
|
||||
@@ -0,0 +1,211 @@
|
||||
DELETE FROM `creature_equip_template` WHERE (`CreatureID`=184335 AND `ID`=2);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `AppearanceModID1`, `ItemVisual1`, `ItemID2`, `AppearanceModID2`, `ItemVisual2`, `ItemID3`, `AppearanceModID3`, `ItemVisual3`, `VerifiedBuild`) VALUES
|
||||
(184335, 2, 184573, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Infinite Agent
|
||||
|
||||
|
||||
DELETE FROM `areatrigger_template` WHERE (`Id`=28735 AND `IsCustom`=0);
|
||||
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES
|
||||
(28735, 0, 69587);
|
||||
|
||||
|
||||
DELETE FROM `quest_offer_reward` WHERE `ID`=93502;
|
||||
INSERT INTO `quest_offer_reward` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `RewardText`, `VerifiedBuild`) VALUES
|
||||
(93502, 1, 1, 0, 0, 0, 0, 0, 0, 'Great work, soldier. Take these.', 69587); -- Enshrouded Solo
|
||||
|
||||
|
||||
DELETE FROM `quest_greeting` WHERE (`ID`=254971 AND `Type`=0);
|
||||
INSERT INTO `quest_greeting` (`ID`, `Type`, `GreetEmoteType`, `GreetEmoteDelay`, `Greeting`, `VerifiedBuild`) VALUES
|
||||
(254971, 0, 0, 0, 'Hail, $c. Come to make a name for yourself?', 69587); -- 254971
|
||||
|
||||
|
||||
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=72292;
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=71093;
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=60129;
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=60129;
|
||||
|
||||
DELETE FROM `ui_map_quest_line` WHERE (`UIMapId`=37 AND `QuestLineId` IN (6043,6024,6023,6021,6016,6009,6008,6007,6006,5930,5855,5811,5770,5751,5740,1107,242,183,150));
|
||||
INSERT INTO `ui_map_quest_line` (`UIMapId`, `QuestLineId`, `VerifiedBuild`) VALUES
|
||||
(37, 6043, 69587),
|
||||
(37, 6024, 69587),
|
||||
(37, 6023, 69587),
|
||||
(37, 6021, 69587),
|
||||
(37, 6016, 69587),
|
||||
(37, 6009, 69587),
|
||||
(37, 6008, 69587),
|
||||
(37, 6007, 69587),
|
||||
(37, 6006, 69587),
|
||||
(37, 5930, 69587),
|
||||
(37, 5855, 69587),
|
||||
(37, 5811, 69587),
|
||||
(37, 5770, 69587),
|
||||
(37, 5751, 69587),
|
||||
(37, 5740, 69587),
|
||||
(37, 1107, 69587),
|
||||
(37, 242, 69587),
|
||||
(37, 183, 69587),
|
||||
(37, 150, 69587);
|
||||
|
||||
|
||||
DELETE FROM `creature_questender` WHERE (`id`=254971 AND `quest`=93502);
|
||||
INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
|
||||
(254971, 93502, 69587); -- Enshrouded Solo ended by Zerella
|
||||
|
||||
|
||||
DELETE FROM `world_quest_template` WHERE `QuestID` IN (54020 /*Wet Work: Gloomwater Span*/, 54818 /*Conflagros*/, 63166 /*A Shadowed Fate*/, 57587 /*Spirit Drinker*/, 58236 /*Symbolic Destruction*/, 51644 /*Azerite Mining*/, 52877 /*Azerite Mining*/, 51116 /*Skycarver Krakit*/, 51906 /*Sister Martha*/, 48736 /*Overseer Y'Morna*/, 54856 /*Bilgewater Bandits*/, 55726 /*Requisition: A Few Cone Shells*/, 52862 /*Azerite Empowerment*/, 59643 /*It's Race Day in the Ramparts!*/, 51920 /*Cottontail Matron*/, 54838 /*Croz Bloodrage*/, 51245 /*I'm a Lumberjack and I'm Okay*/, 55304 /*The Cycle of Life*/, 55827 /*Bounty: More Naga*/, 54693 /*Pterror of the Horde*/, 56388 /*Mindshackle*/, 55899 /*Starseeker of the Shirakess*/, 58276 /*Mar'at In Flames*/, 56396 /*Creakclank*/, 51157 /*Golanar*/, 49051 /*Corrupted Blood of Argus*/, 60534 /*Disloyal Denizens*/, 57774 /*Nine Lives*/, 96641 /*Relentless Strikes*/, 44730 /*Ravaged Dreams*/, 50857 /*Golrakahn*/, 56796 /*Work Order: Fragrant Kakavia*/, 61103 /*Disrupting the Cycle*/, 51976 /*Sabertron*/, 45923 /*Gloth*/, 52939 /*Ordnance Orders*/, 52211 /*Red Sunrise*/);
|
||||
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
|
||||
(54020, 25200, 16292, 1), -- Wet Work: Gloomwater Span
|
||||
(54818, 86400, 17012, 1), -- Conflagros
|
||||
(63166, 86400, 20309, 2), -- A Shadowed Fate
|
||||
(57587, 86400, 18489, 1), -- Spirit Drinker
|
||||
(58236, 86400, 18450, 3), -- Symbolic Destruction
|
||||
(51644, 86400, 15726, 1), -- Azerite Mining
|
||||
(52877, 86400, 15920, 1), -- Azerite Mining
|
||||
(51116, 86400, 15089, 1), -- Skycarver Krakit
|
||||
(51906, 86400, 15575, 1), -- Sister Martha
|
||||
(48736, 86400, 14186, 1), -- Overseer Y'Morna
|
||||
(54856, 86400, 17074, 1), -- Bilgewater Bandits
|
||||
(55726, 86400, 17448, 1), -- Requisition: A Few Cone Shells
|
||||
(52862, 86400, 16019, 1), -- Azerite Empowerment
|
||||
(59643, 86400, 18990, 1), -- It's Race Day in the Ramparts!
|
||||
(51920, 86400, 15580, 1), -- Cottontail Matron
|
||||
(54838, 86400, 17033, 1), -- Croz Bloodrage
|
||||
(51245, 86400, 15147, 2), -- I'm a Lumberjack and I'm Okay
|
||||
(55304, 86400, 17262, 1), -- The Cycle of Life
|
||||
(55827, 86400, 17522, 1), -- Bounty: More Naga
|
||||
(54693, 25200, 16943, 1), -- Pterror of the Horde
|
||||
(56388, 86400, 17787, 8), -- Mindshackle
|
||||
(55899, 86400, 17582, 1), -- Starseeker of the Shirakess
|
||||
(58276, 86400, 18503, 1), -- Mar'at In Flames
|
||||
(56396, 86400, 17788, 4), -- Creakclank
|
||||
(51157, 86400, 15271, 1), -- Golanar
|
||||
(49051, 86400, 14317, 1), -- Corrupted Blood of Argus
|
||||
(60534, 259200, 19334, 1), -- Disloyal Denizens
|
||||
(57774, 86400, 18448, 2), -- Nine Lives
|
||||
(96641, 86400, 31554, 1), -- Relentless Strikes
|
||||
(44730, 21600, 13004, 1), -- Ravaged Dreams
|
||||
(50857, 86400, 14947, 1), -- Golrakahn
|
||||
(56796, 86400, 17978, 4), -- Work Order: Fragrant Kakavia
|
||||
(61103, 86400, 19687, 2), -- Disrupting the Cycle
|
||||
(51976, 86400, 15586, 4), -- Sabertron
|
||||
(45923, 21600, 13015, 1), -- Gloth
|
||||
(52939, 86400, 15997, 1), -- Ordnance Orders
|
||||
(52211, 86400, 15626, 1); -- Red Sunrise
|
||||
|
||||
UPDATE `world_quest_template` SET `VariableID`=14243 WHERE `QuestID`=49098; -- Invasion Point: Cen'gar
|
||||
|
||||
|
||||
UPDATE `spawn_tracking_template` SET `PhaseId`=0 WHERE `SpawnTrackingId`=1867398;
|
||||
UPDATE `spawn_tracking_template` SET `MapId`=1643 WHERE `SpawnTrackingId`=1727469;
|
||||
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;
|
||||
|
||||
UPDATE `spell_target_position` SET `PositionZ`=213.59063720703125 WHERE (`ID`=382431 AND `EffectIndex`=0 AND `OrderIndex`=0);
|
||||
|
||||
|
||||
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`DifficultyID`=1 AND `Entry` IN (215641,212200,212225,212228)); -- Path Helper
|
||||
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`Entry`=135002 AND `DifficultyID`=1); -- Demonic Tyrant
|
||||
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`Entry`=194269 AND `DifficultyID`=1); -- Spiderling
|
||||
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`Entry`=141587 AND `DifficultyID`=1); -- Rat
|
||||
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`Entry`=230734 AND `DifficultyID`=0); -- Dracthyr Stalker
|
||||
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`Entry`=12922 AND `DifficultyID`=0); -- Imp Minion
|
||||
|
||||
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=191566 AND `DifficultyID`=1); -- 191566 (Eternal Orb) -
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184125 AND `DifficultyID`=1); -- 184125 (Chrono-Lord Deios) - CanSwim - DoNotFadeIn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`DifficultyID`=1 AND `Entry` IN (193777,191220,195344,193299,195511,195508,186465,189649,184301,186107,191911,191910));
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=198213 AND `DifficultyID`=1); -- 198213 (Vault Keeper) - Sessile, CanSwim, Floating - UntargetableByClient
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=191311 AND `DifficultyID`=1); -- 191311 (Infinite Whelp) - CanSwim - DoNotFadeIn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184422 AND `DifficultyID`=1); -- 184422 (Emberon) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184335 AND `DifficultyID`=1); -- 184335 (Infinite Agent) - CanSwim - DoNotFadeIn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=191914 AND `DifficultyID`=1); -- 191914 (Eric "The Swift") - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=191913 AND `DifficultyID`=1); -- 191913 (Olaf) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=191912 AND `DifficultyID`=1); -- 191912 (Baelog) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=193530 AND `DifficultyID`=1); -- 193530 (Neglected Mole Machine) - Sessile, Floating - DoNotFadeIn, CannotTurn - InteractWhileHostile
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=193554 AND `DifficultyID`=1); -- 193554 (Neglected Mole Machine) - Sessile, Floating - InteractWhileHostile
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=186696 AND `DifficultyID`=1); -- 186696 (Quaking Totem) - Sessile, CanSwim, Floating - CannotTurn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=186658 AND `DifficultyID`=1); -- 186658 (Stonevault Geomancer) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=186664 AND `DifficultyID`=1); -- 186664 (Stonevault Ambusher) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=186945 AND `DifficultyID`=1); -- 186945 (Longboat Raid) - Floating - UntargetableByClient
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=186420 AND `DifficultyID`=1); -- 186420 (Earthen Weaver) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184303 AND `DifficultyID`=1); -- 184303 (Skittering Crawler) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184124 AND `DifficultyID`=1); -- 184124 (Sentinel Talondras) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184107 AND `DifficultyID`=1); -- 184107 (Runic Protector) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184331 AND `DifficultyID`=1); -- 184331 (Infinite Timereaver) - CanSwim - DoNotFadeIn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184319 AND `DifficultyID`=1); -- 184319 (Refti Custodian) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=191459 AND `DifficultyID`=1); -- 191459 (Longboat Raid) - Floating - UntargetableByClient
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184300 AND `DifficultyID`=1); -- 184300 (Ebonstone Golem) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184582 AND `DifficultyID`=1); -- 184582 (Eric "The Swift") - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184581 AND `DifficultyID`=1); -- 184581 (Baelog) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184580 AND `DifficultyID`=1); -- 184580 (Olaf) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184131 AND `DifficultyID`=1); -- 184131 (Earthen Guardian) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184130 AND `DifficultyID`=1); -- 184130 (Earthen Custodian) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184132 AND `DifficultyID`=1); -- 184132 (Earthen Warder) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184018 AND `DifficultyID`=1); -- 184018 (Bromach) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=234224 AND `DifficultyID`=1); -- 234224 (Helper) - Sessile, CanSwim, Floating - UntargetableByClient
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=195343 AND `DifficultyID`=1); -- 195343 (Runic Protector) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=141587 AND `DifficultyID`=1); -- 141587 (Rat) -
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184134 AND `DifficultyID`=1); -- 184134 (Scavenging Leaper) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184020 AND `DifficultyID`=1); -- 184020 (Hulking Berserker) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184019 AND `DifficultyID`=1); -- 184019 (Burly Rock-Thrower) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184023 AND `DifficultyID`=1); -- 184023 (Vicious Basilisk) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2938 WHERE (`Entry`=184022 AND `DifficultyID`=1); -- 184022 (Stonevault Geomancer) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=371 WHERE (`Entry`=143142 AND `DifficultyID`=0); -- 143142 (Rooter) -
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=73 WHERE (`Entry`=12922 AND `DifficultyID`=0); -- 12922 (Imp Minion) -
|
||||
UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=3, `LevelScalingDeltaMax`=3, `ContentTuningID`=872 WHERE (`Entry`=271457 AND `DifficultyID`=0); -- 271457 (Trygsdottir) - Sessile, CanSwim, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=872 WHERE (`Entry`=271456 AND `DifficultyID`=0); -- 271456 (Peerson) - Sessile, CanSwim, Floating
|
||||
UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=-1, `LevelScalingDeltaMax`=-1, `ContentTuningID`=798 WHERE (`Entry`=264883 AND `DifficultyID`=0); -- 264883 (Caravan Home Entrance) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3321 WHERE (`Entry`=251423 AND `DifficultyID`=0); -- 251423 (Elder Marsilla Dawnstar) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3321 WHERE (`Entry`=251450 AND `DifficultyID`=0); -- 251450 (Aeldon Sunbrand) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3320 WHERE (`Entry`=264056 AND `DifficultyID`=0); -- 264056 (Disguised Decor Duel Vendor) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3321 WHERE (`Entry`=247815 AND `DifficultyID`=0); -- 247815 (Karynna) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=243167 AND `DifficultyID`=0); -- 243167 (Dungeoneer's Training Dummy) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=243208 AND `DifficultyID`=0); -- 243208 (Cleave Training Dummy) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=243211 AND `DifficultyID`=0); -- 243211 (PvP Training Dummy) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=243212 AND `DifficultyID`=0); -- 243212 (PvP Training Dummy) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3321 WHERE (`Entry`=251416 AND `DifficultyID`=0); -- 251416 (Geron) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3323 WHERE (`Entry`=254219 AND `DifficultyID`=0); -- 254219 (Champion Vranesh) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=623 WHERE (`Entry`=253183 AND `DifficultyID`=0); -- 253183 (Chatty Contender) -
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=623 WHERE (`Entry`=253181 AND `DifficultyID`=0); -- 253181 (Babbling Brawler) -
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=5223 WHERE (`Entry`=259865 AND `DifficultyID`=0); -- 259865 (Image of Astalor Bloodsworn) - CanSwim, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=407 WHERE (`DifficultyID`=0 AND `Entry` IN (268188,268180,268174,268193));
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=268179 AND `DifficultyID`=0); -- 268179 (Mannequin) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=268195 AND `DifficultyID`=0); -- 268195 (Mannequin) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=181 WHERE (`Entry`=268199 AND `DifficultyID`=0); -- 268199 (Mannequin) - Sessile, Floating
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2145 WHERE (`DifficultyID`=0 AND `Entry` IN (270250,270249));
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=264100 AND `DifficultyID`=0); -- 264100 - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=264099 AND `DifficultyID`=0); -- 264099 - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=264832 AND `DifficultyID`=0); -- 264832 - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=264098 AND `DifficultyID`=0); -- 264098 (Blink) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=271655 AND `DifficultyID`=0); -- 271655 - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=81 WHERE (`Entry`=271654 AND `DifficultyID`=0); -- 271654 (Mandu) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3320 WHERE (`Entry`=265903 AND `DifficultyID`=0); -- 265903 (Magister's Missive) - CanSwim, Floating - CannotTurn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=3321 WHERE (`Entry`=242803 AND `DifficultyID`=0); -- 242803 (Taelia Fordragon) - CanSwim - InteractWhileHostile
|
||||
|
||||
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=1.408163189888000488, `CombatReach`=2.346938610076904296 WHERE `DisplayID`=110619;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=3.45301055908203125, `CombatReach`=2 WHERE `DisplayID`=53767;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=0.138685286045074462, `CombatReach`=0.5 WHERE `DisplayID`=5585;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=1.316326498985290527, `CombatReach`=1.096938729286193847 WHERE `DisplayID`=18156;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=0.987635195255279541, `CombatReach`=2.0625 WHERE `DisplayID`=131995;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=0.158240109682083129, `CombatReach`=0.300000011920928955 WHERE `DisplayID`=120521;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=0.57750016450881958, `CombatReach`=0.533333361148834228 WHERE `DisplayID`=127895;
|
||||
|
||||
|
||||
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=303710 WHERE (`MenuID`=26056 AND `OptionID`=0);
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_baelog' WHERE `entry`=184581;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_olaf' WHERE `entry`=184580;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_eric' WHERE `entry`=184582;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_bromach' WHERE `entry`=184018;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_sentinel_talondras' WHERE `entry`=184124;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_emberon' WHERE `entry`=184422;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_chrono_lord_deios_U' WHERE `entry`=184125;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_stonevault_geomancer' WHERE `entry`=186658;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_stonevault_ambusher' WHERE `entry`=186664;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_quaking_totem' WHERE `entry`=186696;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_vault_keeper' WHERE `entry`=198213;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_eternal_orb' WHERE `entry`=191566;
|
||||
UPDATE `creature_template` SET `ScriptName`='npc_longboat_raid' WHERE `entry`=186945;
|
||||
@@ -0,0 +1,529 @@
|
||||
/*==========================================================================
|
||||
-- Mechagnome Starting Zone (Map 2268 - ZoneID/AreaID 12825 - Mechagon City)
|
||||
==========================================================================*/
|
||||
|
||||
-- =======================
|
||||
-- Misc: Zone Calibrations
|
||||
-- =======================
|
||||
UPDATE `creature` SET `zoneId`=12825, `areaId`=12825, `PhaseId`=0, `spawntimesecs`=180, `wander_distance`=0, `MovementType`=0 WHERE `map`=2268;
|
||||
UPDATE `gameobject` SET `zoneId`=12825, `areaId`=12825, `PhaseId`=0, `spawntimesecs`=180 WHERE `map`=2268;
|
||||
DELETE FROM `gameobject` WHERE `guid` IN (197193,197199,197202,197213,197219,197224,197232,197234,197186,197215,197228,197230,197183,197188,197194,197203,197211,197216,197221,197222,197231,197184,197191,197207,197190,197201,197204,197217,197198,197209,197206,197189,197192,197197,197205,197208,197214,197220,197226,197229,197182,197195,197200,197212,197227,197187,197196,197210,197225,197218,197233,197185,197223);
|
||||
DELETE FROM `gameobject_addon` WHERE `guid` IN (197193,197199,197202,197213,197219,197224,197232,197234,197186,197215,197228,197230,197183,197188,197194,197203,197211,197216,197221,197222,197231,197184,197191,197207,197190,197201,197204,197217,197198,197209,197206,197189,197192,197197,197205,197208,197214,197220,197226,197229,197182,197195,197200,197212,197227,197187,197196,197210,197225,197218,197233,197185,197223);
|
||||
|
||||
|
||||
|
||||
-- ============================
|
||||
-- Misc: Spell Area Calibration
|
||||
-- ============================
|
||||
DELETE FROM `spell_area` WHERE `area`=12825;
|
||||
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, 12825, 58146, 0, 0, -1, 16384, 2, 3, 74, 64, 'Generic Quest Invisibility Detection 1 - Mechagnome (Mechagon City, Mechagon City)');
|
||||
|
||||
DELETE FROM `spell_area` WHERE `area`=5150 AND `spell`=94566;
|
||||
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
|
||||
(94566, 5150, 58147, 58147, 0, -1, 16384, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 5 - Mechagnome (Dwarven District, Stormwind City)');
|
||||
|
||||
DELETE FROM `spell_area` WHERE `area`=9171 AND `spell`=94566;
|
||||
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
|
||||
(94566, 9171, 58147, 0, 0, -1, 16384, 2, 3, 64, 64, 'Generic Quest Invisibility Detection 5 - Mechagnome (Stormwind Embassy, Stormwind City)');
|
||||
|
||||
|
||||
|
||||
-- ================================
|
||||
-- Misc: Graveyard Zone Calibration
|
||||
-- ================================
|
||||
DELETE FROM `world_safe_locs` WHERE `MapID`=2268;
|
||||
INSERT INTO `world_safe_locs` (`ID`, `MapID`, `LocX`, `LocY`, `LocZ`, `Facing`, `TransportSpawnId`, `Comment`) VALUES
|
||||
(20150, 2268, 716.140, 600.379, -238.583, 5.323, NULL, 'Mechagon City (Mechagnome Starting Zone)');
|
||||
|
||||
DELETE FROM `graveyard_zone` WHERE `GhostZone`=12825;
|
||||
INSERT INTO `graveyard_zone` (`ID`, `GhostZone`, `Comment`) VALUES
|
||||
(20150, 12825, 'Mechagon City (Mechagnome Starting Zone)');
|
||||
|
||||
|
||||
|
||||
-- ==============================
|
||||
-- Quest For the Alliance (58146)
|
||||
-- ==============================
|
||||
UPDATE `quest_template_addon` SET `ScriptName`='SmartQuest' WHERE `ID`=58146;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=58146 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
|
||||
(58146, 5, 0, 0, '', 91, 0, 100, 0, 0, 0, 0, 0, 0, '', 62, 2268, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 707.727, 611.752, -238.584, 2.234, 'Mechagnome Quest - On Quest Abandoned - Teleport Player');
|
||||
|
||||
|
||||
-- NPC Gelbin Mekkatorque (159587)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159587;
|
||||
DELETE FROM `creature_template_addon` WHERE `entry`=159587;
|
||||
|
||||
|
||||
-- GO Stormwind Teleportation Unit (339337)
|
||||
UPDATE `gameobject_template` SET `type`=22, `IconName`='openhandglow', `Data0`=312593, `Data1`=-1, `Data3`=1, `Data4`=1, `Data5`=116363, `Data6`=1, `ContentTuningId`=2732, `AIName`='SmartGameObjectAI' WHERE `entry`=339337;
|
||||
DELETE FROM `areatrigger` WHERE `SpawnId`=6;
|
||||
DELETE FROM `areatrigger_create_properties` WHERE `Id`=6;
|
||||
DELETE FROM `areatrigger_template` WHERE `Id`=6;
|
||||
DELETE FROM `areatrigger_template_actions` WHERE `AreaTriggerId`=6;
|
||||
|
||||
DELETE FROM `gameobject_addon` WHERE `guid`=197149;
|
||||
INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`, `invisibilityType`, `invisibilityValue`, `WorldEffectID`, `AIAnimKitID`) VALUES
|
||||
(197149, 0, 0, 0, 1, 7, 1, 0, 0);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=339337 AND `source_type`=1;
|
||||
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
|
||||
(339337, 1, 0, 0, '', 64, 0, 100, 0, 0, 0, 0, 0, 0, '', 33, 160561, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Stormwind Teleportation Unit - On Gossip Hello - Quest Credit');
|
||||
|
||||
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=339337 AND `SourceId`=1;
|
||||
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
|
||||
(22, 1, 339337, 1, 0, 9, 0, 58146, 0, 0, '', 0, 0, 0, '', 'Stormwind Teleportation Unit - Run Script if Quest is Taken');
|
||||
|
||||
DELETE FROM `gameobject_template_locale` WHERE `entry`=339337;
|
||||
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
|
||||
(339337, 'deDE', 'Teleportationsstation Sturmwind', '', NULL, 69587),
|
||||
(339337, 'esES', 'Unidad de teletransporte a Ventormenta', '', NULL, 69587),
|
||||
(339337, 'esMX', 'Unidad de teletransporte a Ventormenta', '', NULL, 69587),
|
||||
(339337, 'frFR', 'Unité de téléportation de Hurlevent', '', NULL, 69587),
|
||||
(339337, 'itIT', 'Unità di teletrasporto di Roccavento', '', NULL, 69587),
|
||||
(339337, 'koKR', '스톰윈드 순간이동 장치', '', NULL, 69587),
|
||||
(339337, 'ptBR', 'Unidade de Teletransporte de Ventobravo', '', NULL, 69587),
|
||||
(339337, 'ruRU', 'Устройство телепортации в Штормград', '', NULL, 69587),
|
||||
(339337, 'zhCN', '暴风城传送装置', '', NULL, 69587),
|
||||
(339337, 'zhTW', '暴风城传送装置', '', NULL, 69587);
|
||||
|
||||
|
||||
-- Spell Dust in the Stormwind (312593)
|
||||
DELETE FROM `spell_target_position` WHERE `ID`=312593;
|
||||
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `OrderIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES
|
||||
(312593, 0, 0, 0, -8187.572, 783.276, 72.595, 0.738, 69587);
|
||||
|
||||
|
||||
|
||||
-- ========================================
|
||||
-- Quest Stranger in a Strange Land (58147)
|
||||
-- ========================================
|
||||
UPDATE `quest_poi_points` SET `X`=-8358, `Y`=622, `Z`=95 WHERE `QuestID`=58147 AND `Idx1`=2 AND `Idx2`=0;
|
||||
|
||||
|
||||
-- NPC Lulana (160600)
|
||||
UPDATE `creature_template` SET `npcflag`=2, `unit_flags`=768, `AIName`='SmartAI' WHERE `entry`=160600;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=160600;
|
||||
UPDATE `creature_text` SET `comment`='Lulana' WHERE `CreatureID`=160600 AND `GroupID`=0 AND `ID`=0;
|
||||
UPDATE `creature` SET `PhaseId`=0, `position_x`=-8340.16, `position_y`=637.168, `position_z`=95.5151, `orientation`=3.3206 WHERE `guid`=241313;
|
||||
|
||||
DELETE FROM `creature_addon` WHERE `guid`=241313;
|
||||
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(241313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '80797');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=160600 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=16060000 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
|
||||
(160600, 0, 0, 0, '', 20, 0, 100, 0, 58147, 0, 0, 0, 0, '', 162, 160600, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, -8340.16, 637.168, 95.5151, 3.3206, 'Lulana - On Quest Rewarded - Summon Creature Lulana in Personal Visibility'),
|
||||
(160600, 0, 1, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 16060000, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lulana - On Just Summoned - Run Actionlist'),
|
||||
(160600, 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, 'Lulana - On Movement Inform 1 - Cast Cosmetic Teleport Effect'),
|
||||
(160600, 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, 'Lulana - Despawn Instant'),
|
||||
|
||||
(16060000, 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, 'Lulana - Remove NPC Flag'),
|
||||
(16060000, 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, 'Lulana - Set Orientation to Invoker'),
|
||||
(16060000, 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, 'Lulana - Say Line 0'),
|
||||
(16060000, 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, 'Lulana - Set Run Off'),
|
||||
(16060000, 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, 'Lulana - Move to PoS 1');
|
||||
|
||||
|
||||
-- GO Mechagon City Teleporter (341363)
|
||||
UPDATE `gameobject_template` SET `type`=22, `IconName`='openhandglow', `Data0`=315958, `Data1`=-1, `Data3`=1, `Data4`=1, `Data5`=116363, `Data6`=1, `ContentTuningId`=2732, `AIName`='SmartGameObjectAI' WHERE `entry`=341363;
|
||||
UPDATE `gameobject` SET `PhaseId`=0 WHERE `guid`=114186;
|
||||
|
||||
DELETE FROM `gameobject_addon` WHERE `guid`=114186;
|
||||
INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`, `invisibilityType`, `invisibilityValue`, `WorldEffectID`, `AIAnimKitID`) VALUES
|
||||
(114186, 0, 0, 0, 1, 13, 100, 0, 0);
|
||||
|
||||
DELETE FROM `gameobject_template_locale` WHERE `entry`=341363;
|
||||
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
|
||||
(341363, 'deDE', 'Teleporter in Mechagon City', '', NULL, 69587),
|
||||
(341363, 'esES', 'Teletransportador a la ciudad de Mechagon', '', NULL, 69587),
|
||||
(341363, 'esMX', 'Teletransportador a la ciudad de Mechagon', '', NULL, 69587),
|
||||
(341363, 'frFR', 'Téléporteur de Mechagon City', '', NULL, 69587),
|
||||
(341363, 'itIT', 'Teletrasporto di Mechagon City', '', NULL, 69587),
|
||||
(341363, 'koKR', '메카곤 시티 텔레포터', '', NULL, 69587),
|
||||
(341363, 'ptBR', 'Teletransportador da Cidade de Mechagon', '', NULL, 69587),
|
||||
(341363, 'ruRU', 'Телепорт в городе Мехагон', '', NULL, 69587),
|
||||
(341363, 'zhCN', '梅卡冈城传送门', '', NULL, 69587),
|
||||
(341363, 'zhTW', '梅卡冈城传送门', '', NULL, 69587);
|
||||
|
||||
|
||||
|
||||
-- ========================================
|
||||
-- Quest Heritage of the Mechagnome (58436)
|
||||
-- ========================================
|
||||
|
||||
-- NPC Prince Erazmin (158145)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=158145;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=158145;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583056;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=158145 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
|
||||
(158145, 0, 0, 0, '', 20, 0, 100, 0, 58436, 0, 0, 0, 0, '', 143, 20002, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Prince Erazmin - On Quest Rewarded - Run Conversation');
|
||||
|
||||
|
||||
-- Conversation (20002)
|
||||
DELETE FROM `conversation_template` WHERE `Id`=20002;
|
||||
INSERT INTO `conversation_template` (`Id`, `FirstLineId`, `TextureKitId`, `Flags`, `ScriptName`, `VerifiedBuild`) VALUES
|
||||
(20002, 31736, 0, 0, '', 69587);
|
||||
|
||||
DELETE FROM `conversation_actors` WHERE `ConversationId`=20002;
|
||||
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `ConversationActorNearId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
|
||||
(20002, 62451, 583056, 0, 0, 0, 0, 0, 0, 69587);
|
||||
|
||||
DELETE FROM `conversation_line_template` WHERE `Id` IN (31736,31737);
|
||||
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`, `Unk`) VALUES
|
||||
(31736, 0, 0, 0, 0, 69587, 0),
|
||||
(31737, 0, 0, 0, 0, 69587, 0);
|
||||
|
||||
|
||||
|
||||
-- ==============================
|
||||
-- Misc: Gameobjects Calibrations
|
||||
-- ==============================
|
||||
UPDATE `gameobject_template_addon` SET `flags`=16 WHERE `entry` IN (335522,335523,335524,335574,335521,335513,338477,335514,335515,338477,335516,335525,335517,341828,335518,335519,335520);
|
||||
|
||||
|
||||
|
||||
-- ============================
|
||||
-- Misc: Creatures Calibrations
|
||||
-- ============================
|
||||
|
||||
-- NPC Spirit Healer (6491)
|
||||
DELETE FROM `creature` WHERE `guid`=23891;
|
||||
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
|
||||
(23891, 6491, 2268, 12825, 12825, '0', 0, 0, 0, -1, 0, 0, 718.617, 597.151, -238.149, 2.24323, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
|
||||
|
||||
|
||||
|
||||
-- NPC Kelsey Steelspark (157997)
|
||||
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=157997;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583053;
|
||||
|
||||
|
||||
|
||||
-- NPC Abel Camhorn (159468)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `auras`='230497' WHERE `entry`=159468;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583058;
|
||||
|
||||
|
||||
|
||||
-- NPC Jonian Monkash (159470)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=159470;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583062;
|
||||
|
||||
|
||||
|
||||
-- NPC Alvin Teasprocket (159471)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `auras`='230497' WHERE `entry`=159471;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583028;
|
||||
|
||||
|
||||
|
||||
-- NPC Tera Geotorque (159485)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159485;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583035;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159485 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15948500,15948501) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159485, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15948500, 15948501, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tera Geotorque - On Update - Run Random Actionlist'),
|
||||
|
||||
(15948500, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Tera Geotorque - Play Random Emote'),
|
||||
(15948501, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Tera Geotorque - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Raz L. Dazzle (159486)
|
||||
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=159486;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583054;
|
||||
UPDATE `creature` SET `wander_distance`=3, `MovementType`=1 WHERE `guid`=583054;
|
||||
|
||||
|
||||
|
||||
-- NPC Petra Cogwenne (159487)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159487;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583039,583043);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159487 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15948700,15948701) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159487, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15948700, 15948701, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Petra Cogwenne - On Update - Run Random Actionlist'),
|
||||
|
||||
(15948700, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Petra Cogwenne - Play Random Emote'),
|
||||
(15948701, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Petra Cogwenne - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Lanna Statiglow (159523)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=159523;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159523;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583030,583049);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159523 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15952300,15952301) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159523, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15952300, 15952301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lanna Statiglow - On Update - Run Random Actionlist'),
|
||||
|
||||
(15952300, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lanna Statiglow - Play Random Emote'),
|
||||
(15952301, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lanna Statiglow - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Briony Vandercog (159524)
|
||||
UPDATE `creature` SET `position_x`=723.456, `position_y`=404.117, `position_z`=-312.611, `orientation`=2.553 WHERE `guid`=583042;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=159524;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583042;
|
||||
|
||||
|
||||
|
||||
-- NPC Drusilla Zapwell (159528)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `auras`='230497' WHERE `entry`=159528;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583059;
|
||||
|
||||
|
||||
|
||||
-- NPC Heidi Mitercone (159529)
|
||||
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=159529;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=455 WHERE `entry`=159529;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583033;
|
||||
|
||||
|
||||
|
||||
-- NPC Twyla Flickspring (159530)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=159530;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159530;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583044,583060);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (159530,-583060) AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15953000,15953001) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159530, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15953000, 15953001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Twyla Flickspring - On Update - Run Random Actionlist'),
|
||||
(-583060, 0, 0, 0, 25, 0, 100, 1, 0, 0, 0, 0, 17, 469, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Twyla Flickspring - On Reset - Set Emote State'),
|
||||
|
||||
(15953000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Twyla Flickspring - Play Random Emote'),
|
||||
(15953001, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Twyla Flickspring - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Pete Mixelgear (159543)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=159543;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159543;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583029,583032);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159543 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15954300,15954301) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159543, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15954300, 15954301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Pete Mixelgear - On Update - Run Random Actionlist'),
|
||||
|
||||
(15954300, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Pete Mixelgear - Play Random Emote'),
|
||||
(15954301, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Pete Mixelgear - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Stuard Sharpsprocket (159545)
|
||||
UPDATE `creature_template` SET `npcflag`=1, `AIName`='SmartAI' WHERE `entry`=159545;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159545;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583057;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=182652 WHERE `MenuID`=24867 AND `OptionID`=0;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=159545;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(159545, 0, 0, 'He shares his responsibilities, he is one of us. He is more than a leader, he is our friend.', 12, 0, 100, 1, 0, 0, 0, 182480, 0, 'Stuard Sharpsprocket');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159545 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
|
||||
(159545, 0, 0, 1, '', 62, 0, 100, 0, 24867, 0, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Stuard Sharpsprocket - On Gossip Select - Say Line 0'),
|
||||
(159545, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Stuard Sharpsprocket - Close Gossip');
|
||||
|
||||
|
||||
|
||||
-- NPC Shim Crankturner (159549)
|
||||
UPDATE `creature_template_addon` SET `emote`=233 WHERE `entry`=159549;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583055;
|
||||
UPDATE `creature` SET `position_x`=716.299, `position_y`=394.178, `position_z`=-312.619, `orientation`=2.601 WHERE `guid`=583055;
|
||||
|
||||
|
||||
|
||||
-- NPC Lelu Multipass (159550)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=159550;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159550;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583034,583040);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159550 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15955000,15955001) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159550, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15955000, 15955001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lelu Multipass - On Update - Run Random Actionlist'),
|
||||
|
||||
(15955000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lelu Multipass - Play Random Emote'),
|
||||
(15955001, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lelu Multipass - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Spark Nimblecog (159551)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=159551;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583027;
|
||||
|
||||
|
||||
|
||||
-- NPC Noden Gyrozap (159552)
|
||||
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=159552;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=159552;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583061;
|
||||
|
||||
|
||||
|
||||
-- NPC Pegi Cogster (159558)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159558;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583037;
|
||||
UPDATE `creature_template_difficulty` SET `StaticFlags1`=536871168 WHERE `Entry`=159558;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=182654 WHERE `MenuID`=24864 AND `OptionID`=0;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=159558;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(159558, 0, 0, 'A good leader would give us ownership... and accountability. They would not micromanage us.', 12, 0, 100, 1, 0, 0, 0, 182526, 0, 'Pegi Cogster');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159558 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
|
||||
(159558, 0, 0, 1, '', 62, 0, 100, 0, 24864, 0, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Pegi Cogster - On Gossip Select - Say Line 0'),
|
||||
(159558, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Pegi Cogster - Close Gossip');
|
||||
|
||||
|
||||
|
||||
-- NPC Elya Codepunch (159559)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=159559;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=641 WHERE `entry`=159559;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583038;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=182654 WHERE `MenuID`=24764 AND `OptionID`=0;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=159559;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(159559, 0, 0, 'Well, they must at least be as brilliant as I! Or is it me?', 12, 0, 100, 5, 0, 0, 0, 182537, 0, 'Elya Codepunch');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159559 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
|
||||
(159559, 0, 0, 1, '', 62, 0, 100, 0, 24764, 0, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Elya Codepunch - On Gossip Select - Say Line 0'),
|
||||
(159559, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Elya Codepunch - Close Gossip');
|
||||
|
||||
|
||||
|
||||
-- NPC Idee Quickcoil (159567)
|
||||
UPDATE `creature_template` SET `npcflag`=1, `AIName`='SmartAI' WHERE `entry`=159567;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=641 WHERE `entry`=159567;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=182653 WHERE `MenuID`=24863 AND `OptionID`=0;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=182653 WHERE `MenuID`=24865 AND `OptionID`=0;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=159567;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(159567, 0, 0, 'A sharp-minded problem solver that I can go to when my inventions go awry!', 12, 0, 100, 5, 0, 0, 0, 182534, 0, 'Idee Quickcoil');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159567 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
|
||||
(159567, 0, 0, 1, '', 62, 0, 100, 0, 24863, 0, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Idee Quickcoil - On Gossip Select - Say Line 0'),
|
||||
(159567, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Idee Quickcoil - Close Gossip');
|
||||
|
||||
|
||||
|
||||
-- NPC Endora Enginator (159568)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159568;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583048;
|
||||
|
||||
|
||||
|
||||
-- NPC Yergin Galvaquad (159569)
|
||||
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=159569;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=159569;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583031;
|
||||
|
||||
|
||||
|
||||
-- NPC Flouresce Brightgear (159571)
|
||||
UPDATE `creature_template` SET `npcflag`=1, `AIName`='SmartAI' WHERE `entry`=159571;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159571;
|
||||
UPDATE `creature_addon` SET `SheathState`=0, `emote`=641 WHERE `guid`=583045;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583052;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextID`=182654 WHERE `MenuID`=24866 AND `OptionID`=0;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=159571;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(159571, 0, 0, 'I\'d just like for someone to help us clean up this mess.', 12, 0, 100, 1, 0, 0, 0, 182538, 0, 'Flouresce Brightgear');
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159571 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
|
||||
(159571, 0, 0, 1, '', 62, 0, 100, 0, 24866, 0, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Flouresce Brightgear - On Gossip Select - Say Line 0'),
|
||||
(159571, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Flouresce Brightgear - Close Gossip');
|
||||
|
||||
|
||||
|
||||
-- NPC Luka Morespark (159572)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=159572;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=159572;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583047,583050);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=159572 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (15957200,15957201) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(159572, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 15957200, 15957201, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Luka Morespark - On Update - Run Random Actionlist'),
|
||||
|
||||
(15957200, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Luka Morespark - Play Random Emote'),
|
||||
(15957201, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Luka Morespark - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Blastatron X-81 (160087)
|
||||
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=160087;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=160087;
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2151, `LootID`=160087, `VerifiedBuild`=69587 WHERE `Entry`=160087;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID`=160087;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `SoundPlayType`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(160087, 0, 0, 'Resistance is futile.', 14, 0, 100, 0, 0, 143132, 0, 184742, 0, 'Blastatron X-81'),
|
||||
(160087, 1, 0, 'You will be exterminated.', 14, 0, 100, 0, 0, 143133, 0, 184743, 0, 'Blastatron X-81');
|
||||
|
||||
|
||||
|
||||
-- NPC Projection (160273)
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=160273;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583036;
|
||||
UPDATE `creature_template_difficulty` SET `StaticFlags1`=536871168 WHERE `Entry`=160273;
|
||||
|
||||
|
||||
|
||||
-- NPC Quimby Sparklighter (160578)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=160578;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=160578;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=583041;
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=160578 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (16057800,16057801) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(160578, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 16057800, 16057801, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Quimby Sparklighter - On Update - Run Random Actionlist'),
|
||||
|
||||
(16057800, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Quimby Sparklighter - Play Random Emote'),
|
||||
(16057801, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Quimby Sparklighter - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Milnar Danspark (160628)
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=160628;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=160628;
|
||||
DELETE FROM `creature_addon` WHERE `guid` IN (583026,583051);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid`=160628 AND `source_type`=0;
|
||||
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (16062800,16062801) AND `source_type`=9;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||
(160628, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 16062800, 16062801, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Milnar Danspark - On Update - Run Random Actionlist'),
|
||||
|
||||
(16062800, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Milnar Danspark - Play Random Emote'),
|
||||
(16062801, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Milnar Danspark - Play Random Emote');
|
||||
|
||||
|
||||
|
||||
-- NPC Gelbin Mekkatorque (162806)
|
||||
UPDATE `creature_template` SET `npcflag`=2 WHERE `entry`=162806;
|
||||
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=162806;
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=2151, `VerifiedBuild`=69587 WHERE `Entry`=162806;
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
DELETE FROM `creature_equip_template` WHERE (`CreatureID`=167334 AND `ID`=1);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `AppearanceModID1`, `ItemVisual1`, `ItemID2`, `AppearanceModID2`, `ItemVisual2`, `ItemID3`, `AppearanceModID3`, `ItemVisual3`, `VerifiedBuild`) VALUES
|
||||
(167334, 1, 171132, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Kleia
|
||||
|
||||
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=65033;
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=62279;
|
||||
UPDATE `quest_details` SET `Emote2`=0 WHERE `ID`=60129;
|
||||
|
||||
DELETE FROM `world_quest_template` WHERE `QuestID` IN (54020 /*Wet Work: Gloomwater Span*/, 54818 /*Conflagros*/, 57587 /*Spirit Drinker*/, 58236 /*Symbolic Destruction*/, 51644 /*Azerite Mining*/, 52877 /*Azerite Mining*/, 51116 /*Skycarver Krakit*/, 51906 /*Sister Martha*/, 48736 /*Overseer Y'Morna*/, 54856 /*Bilgewater Bandits*/, 55726 /*Requisition: A Few Cone Shells*/, 52862 /*Azerite Empowerment*/, 59643 /*It's Race Day in the Ramparts!*/, 51920 /*Cottontail Matron*/, 54838 /*Croz Bloodrage*/, 51245 /*I'm a Lumberjack and I'm Okay*/, 55304 /*The Cycle of Life*/, 55827 /*Bounty: More Naga*/, 54693 /*Pterror of the Horde*/, 56388 /*Mindshackle*/, 55899 /*Starseeker of the Shirakess*/, 58276 /*Mar'at In Flames*/, 56396 /*Creakclank*/, 51157 /*Golanar*/, 49051 /*Corrupted Blood of Argus*/, 57774 /*Nine Lives*/, 55901 /*Rustbolt Rebellion*/, 44730 /*Ravaged Dreams*/, 50857 /*Golrakahn*/, 51976 /*Sabertron*/, 45923 /*Gloth*/, 52939 /*Ordnance Orders*/, 52211 /*Red Sunrise*/);
|
||||
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
|
||||
(54020, 25200, 16292, 1), -- Wet Work: Gloomwater Span
|
||||
(54818, 86400, 17012, 1), -- Conflagros
|
||||
(57587, 86400, 18489, 1), -- Spirit Drinker
|
||||
(58236, 86400, 18450, 3), -- Symbolic Destruction
|
||||
(51644, 86400, 15726, 1), -- Azerite Mining
|
||||
(52877, 86400, 15920, 1), -- Azerite Mining
|
||||
(51116, 86400, 15089, 1), -- Skycarver Krakit
|
||||
(51906, 86400, 15575, 1), -- Sister Martha
|
||||
(48736, 86400, 14186, 1), -- Overseer Y'Morna
|
||||
(54856, 86400, 17074, 1), -- Bilgewater Bandits
|
||||
(55726, 86400, 17448, 1), -- Requisition: A Few Cone Shells
|
||||
(52862, 86400, 16019, 1), -- Azerite Empowerment
|
||||
(59643, 86400, 18990, 1), -- It's Race Day in the Ramparts!
|
||||
(51920, 86400, 15580, 1), -- Cottontail Matron
|
||||
(54838, 86400, 17033, 1), -- Croz Bloodrage
|
||||
(51245, 86400, 15147, 2), -- I'm a Lumberjack and I'm Okay
|
||||
(55304, 86400, 17262, 1), -- The Cycle of Life
|
||||
(55827, 86400, 17522, 1), -- Bounty: More Naga
|
||||
(54693, 25200, 16943, 1), -- Pterror of the Horde
|
||||
(56388, 86400, 17787, 8), -- Mindshackle
|
||||
(55899, 86400, 17582, 1), -- Starseeker of the Shirakess
|
||||
(58276, 86400, 18503, 1), -- Mar'at In Flames
|
||||
(56396, 86400, 17788, 4), -- Creakclank
|
||||
(51157, 86400, 15271, 1), -- Golanar
|
||||
(49051, 86400, 14317, 1), -- Corrupted Blood of Argus
|
||||
(57774, 86400, 18448, 2), -- Nine Lives
|
||||
(55901, 86400, 17639, 2), -- Rustbolt Rebellion
|
||||
(44730, 21600, 13004, 1), -- Ravaged Dreams
|
||||
(50857, 86400, 14947, 1), -- Golrakahn
|
||||
(51976, 86400, 15586, 4), -- Sabertron
|
||||
(45923, 21600, 13015, 1), -- Gloth
|
||||
(52939, 86400, 15997, 1), -- Ordnance Orders
|
||||
(52211, 86400, 15626, 1); -- Red Sunrise
|
||||
|
||||
UPDATE `world_quest_template` SET `VariableID`=14243 WHERE `QuestID`=49098; -- Invasion Point: Cen'gar
|
||||
|
||||
|
||||
UPDATE `spawn_tracking_template` SET `PhaseId`=16190 WHERE `SpawnTrackingId`=2001795;
|
||||
UPDATE `spawn_tracking_template` SET `PhaseId`=0 WHERE `SpawnTrackingId`=1867398;
|
||||
UPDATE `spawn_tracking_template` SET `MapId`=1643 WHERE `SpawnTrackingId`=1727469;
|
||||
|
||||
DELETE FROM `creature_template_difficulty` WHERE (`DifficultyID`=1 AND `Entry` IN (211227,211204));
|
||||
INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `HealthScalingExpansion`, `HealthModifier`, `ManaModifier`, `CreatureDifficultyID`, `TypeFlags`, `TypeFlags2`, `TypeFlags3`) VALUES
|
||||
(211227, 1, 11, 1, 1, 260578, 0x40200048, 34, 0), -- Path Helper
|
||||
(211204, 1, 11, 1, 1, 260555, 0x40200048, 34, 0); -- Path Helper
|
||||
|
||||
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=5.041165828704833984, `CombatReach`=9.600000381469726562 WHERE `DisplayID`=104578;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=0.262957334518432617, `CombatReach`=0.375 WHERE `DisplayID`=104025;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=1.036973834037780761, `CombatReach`=2.20000004768371582 WHERE `DisplayID`=93160;
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=3.061506509780883789, `CombatReach`=2.519999980926513671 WHERE `DisplayID` IN (92702, 92701);
|
||||
UPDATE `creature_model_info` SET `BoundingRadius`=0.556511938571929931 WHERE `DisplayID`=98201;
|
||||
|
||||
|
||||
|
||||
UPDATE `gossip_menu_option` SET `GossipOptionID`=53547, `ActionMenuID`=26339 WHERE (`MenuID`=26284 AND `OptionID`=1);
|
||||
UPDATE `gossip_menu_option` SET `ActionMenuID`=26513 WHERE (`MenuID`=26131 AND `OptionID`=5);
|
||||
UPDATE `gossip_menu_option` SET `GossipOptionID`=54058 WHERE (`MenuID`=26339 AND `OptionID`=0);
|
||||
|
||||
UPDATE `creature_template_model` SET `CreatureDisplayID`=11686 WHERE (`Idx`=0 AND `CreatureID`=189474) OR (`Idx`=1 AND `CreatureID` IN (175229,165858,166314,167891,62167));
|
||||
UPDATE `creature_template_model` SET `CreatureDisplayID`=27823 WHERE (`CreatureID`=169845 AND `Idx`=1);
|
||||
|
||||
|
||||
-- Template Addon
|
||||
DELETE FROM `creature_template_addon` WHERE `entry` IN (51247 /*51247 (Julak-Doom) - Black Breath*/, 50089 /*50089 (Julak-Doom) - Boss Hittin' Ya*/, 50091 /*50091 (Julak-Doom) - Ride Vehicle*/);
|
||||
INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
|
||||
(51247, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '94635'), -- 51247 (Julak-Doom) - Black Breath
|
||||
(50089, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, '91334'), -- 50089 (Julak-Doom) - Boss Hittin' Ya
|
||||
(50091, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, ''); -- 50091 (Julak-Doom) - Ride Vehicle
|
||||
|
||||
|
||||
UPDATE `creature_template` SET `speed_walk`=1.20000004768371582, `BaseAttackTime`=1500, `unit_flags`=0x40 WHERE `entry`=50089; -- Julak-Doom
|
||||
UPDATE `creature_template` SET `speed_run`=1.357142806053161621, `unit_flags`=0x2000200, `unit_flags2`=0x20800 WHERE `entry`=50091; -- Julak-Doom
|
||||
UPDATE `creature_template` SET `speed_walk`=2.20000004768371582, `speed_run`=0.785714268684387207, `unit_flags`=0x2000000, `unit_flags3`=0x40080001, `flags_extra` = 128 WHERE `entry`=51247; -- Julak-Doom
|
||||
|
||||
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'worldboss_julak_doom' WHERE `entry` = 50089;
|
||||
|
||||
-- Difficulty
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=56, `StaticFlags1`=0x10000000, `VerifiedBuild`=69587 WHERE (`Entry`=50089 AND `DifficultyID`=0); -- 50089 (Julak-Doom) - CanSwim
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=56, `StaticFlags1`=0x20000100, `StaticFlags3`=0x2000000, `VerifiedBuild`=69587 WHERE (`Entry`=50091 AND `DifficultyID`=0); -- 50091 (Julak-Doom) - Sessile, Floating - CannotTurn
|
||||
UPDATE `creature_template_difficulty` SET `ContentTuningID`=56, `StaticFlags1`=0x20000100, `VerifiedBuild`=69587 WHERE (`Entry`=51247 AND `DifficultyID`=0); -- 51247 (Julak-Doom) - Sessile, Floating
|
||||
|
||||
-- Spellproc
|
||||
DELETE FROM `spell_proc` WHERE `SpellId` IN (93621);
|
||||
INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
|
||||
(93621,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0); -- Dark Whispers
|
||||
|
||||
-- ScriptName
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_julak_doom_dark_whisper', 'spell_julak_doom_black_breath');
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(93612, 'spell_julak_doom_black_breath'),
|
||||
(93621, 'spell_julak_doom_dark_whisper');
|
||||
|
||||
-- Vehicles
|
||||
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` = 50089;
|
||||
INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
|
||||
(50089, 61791, 1, 0);
|
||||
|
||||
DELETE FROM `vehicle_template_accessory` WHERE (`seat_id`=0 AND `entry`=50089);
|
||||
INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `seat_id`, `minion`, `description`, `summontype`, `summontimer`) VALUES
|
||||
(50089, 50091, 0, 1, 'Julak-Doom - Julak-Doom', 8, 0); -- Julak-Doom - Julak-Doom
|
||||
|
||||
-- Julak-Doom smart ai
|
||||
SET @ENTRY := 51247;
|
||||
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
|
||||
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
|
||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`, `Difficulties`) VALUES
|
||||
(@ENTRY, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 85, 94639, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'On just summoned - Self: Cast spell 94639 on self', '');
|
||||
|
||||
-- Path for Julak-Doom
|
||||
SET @ENTRY := 50089;
|
||||
SET @PATHOFFSET := 0;
|
||||
SET @PATH := @ENTRY * 100 + @PATHOFFSET;
|
||||
DELETE FROM `waypoint_path` WHERE `PathId`= @PATH;
|
||||
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES
|
||||
(@PATH, 0, 0x0, NULL, 'Julak-Doom - Scripted Path');
|
||||
|
||||
DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH;
|
||||
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
|
||||
(@PATH, 0, -2396.1807, -5441.4497, 140.16254, NULL, 0),
|
||||
(@PATH, 1, -2372.4722, -5452.0957, 129.6178, NULL, 0),
|
||||
(@PATH, 2, -2372.0972, -5478.788, 125.80329, NULL, 0),
|
||||
(@PATH, 3, -2369.6528, -5517.988, 120.622086, NULL, 0),
|
||||
(@PATH, 4, -2375.198, -5558.3145, 114.32381, NULL, 0),
|
||||
(@PATH, 5, -2382.9045, -5607.5103, 108.78274, NULL, 61601),
|
||||
(@PATH, 6, -2374.144, -5523.5156, 121.61144, NULL, 0),
|
||||
(@PATH, 7, -2375.7778, -5499.488, 126.4896, NULL, 0),
|
||||
(@PATH, 8, -2383.7551, -5476.1025, 132.48381, NULL, 0),
|
||||
(@PATH, 9, -2403.677, -5456.7256, 142.08533, NULL, 0),
|
||||
(@PATH, 10, -2440.8923, -5465.597, 147.89722, NULL, 0),
|
||||
(@PATH, 11, -2469.6667, -5480.415, 146.06825, NULL, 0),
|
||||
(@PATH, 12, -2499.7812, -5485.0366, 141.8139, NULL, 0),
|
||||
(@PATH, 13, -2531.0215, -5469.1777, 150.58344, NULL, 0),
|
||||
(@PATH, 14, -2547.7014, -5443.0835, 160.23291, NULL, 0),
|
||||
(@PATH, 15, -2554.1614, -5412.335, 162.37889, NULL, 0),
|
||||
(@PATH, 16, -2587.912, -5399.8887, 170.36353, NULL, 0),
|
||||
(@PATH, 17, -2590.5261, -5376.8057, 173.48349, NULL, 0),
|
||||
(@PATH, 18, -2585.2551, -5359.816, 174.70645, NULL, 0),
|
||||
(@PATH, 19, -2582.6199, -5331.229, 171.61417, NULL, 0),
|
||||
(@PATH, 20, -2584.7285, -5301.287, 168.13611, NULL, 0),
|
||||
(@PATH, 21, -2587.2969, -5261.653, 161.69852, NULL, 0),
|
||||
(@PATH, 22, -2559.684, -5233.059, 157.60756, NULL, 0),
|
||||
(@PATH, 23, -2537.2534, -5203.241, 148.88406, NULL, 0),
|
||||
(@PATH, 24, -2518.644, -5176.8784, 143.89433, NULL, 0),
|
||||
(@PATH, 25, -2493.375, -5139.9165, 133.0672, NULL, 0),
|
||||
(@PATH, 26, -2479.3489, -5108.901, 132.28502, NULL, 0),
|
||||
(@PATH, 27, -2473.052, -5074.915, 132.90402, NULL, 0),
|
||||
(@PATH, 28, -2420.4375, -5052.3994, 115.140915, NULL, 61056),
|
||||
(@PATH, 29, -2443.7969, -5065.9097, 123.39856, NULL, 0),
|
||||
(@PATH, 30, -2431.9824, -5085.631, 118.50279, NULL, 0),
|
||||
(@PATH, 31, -2419.8542, -5110.604, 115.40777, NULL, 0),
|
||||
(@PATH, 32, -2411.6824, -5136.1353, 112.77623, NULL, 0),
|
||||
(@PATH, 33, -2410.231, -5167.1094, 109.52954, NULL, 0),
|
||||
(@PATH, 34, -2418.8298, -5197.3335, 113.16438, NULL, 0),
|
||||
(@PATH, 35, -2430.5798, -5244.6704, 122.15738, NULL, 60315),
|
||||
(@PATH, 36, -2470.684, -5198.5767, 132.4703, NULL, 0),
|
||||
(@PATH, 37, -2500.0989, -5181.222, 138.43855, NULL, 0),
|
||||
(@PATH, 38, -2530.7449, -5190.2017, 147.05144, NULL, 0),
|
||||
(@PATH, 39, -2545.323, -5223.5347, 153.60725, NULL, 0),
|
||||
(@PATH, 40, -2556.7102, -5252.771, 159.27701, NULL, 0),
|
||||
(@PATH, 41, -2565.7466, -5280.953, 163.85547, NULL, 0),
|
||||
(@PATH, 42, -2568.7734, -5305.758, 168.57376, NULL, 0),
|
||||
(@PATH, 43, -2562.2483, -5330.757, 170.93304, NULL, 0),
|
||||
(@PATH, 44, -2549.2285, -5361.049, 170.17668, NULL, 0),
|
||||
(@PATH, 45, -2554.5156, -5410.731, 162.51285, NULL, 0),
|
||||
(@PATH, 46, -2536.2986, -5452.4287, 155.0878, NULL, 0),
|
||||
(@PATH, 47, -2490.5435, -5435.182, 147.60214, NULL, 0),
|
||||
(@PATH, 48, -2459.6372, -5418.422, 149.50963, NULL, 0),
|
||||
(@PATH, 49, -2429.8455, -5435.3506, 146.86827, NULL, 0);
|
||||
|
||||
UPDATE `creature_template_addon` SET `PathId` = 5008900 WHERE `entry` = 227661;
|
||||
UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 2 WHERE `guid` = 227661;
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE `areatrigger_create_properties` ADD `PositionalSoundKitId` int NOT NULL DEFAULT 0 AFTER `SpellForVisuals`;
|
||||
@@ -3030,6 +3030,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()
|
||||
PrepareStatement(HOTFIX_SEL_MANAGED_WORLD_STATE_BUFF, "SELECT ID, BuffSpellID, PlayerConditionID, OccurrenceValue, ManagedWorldStateID FROM managed_world_state_buff"
|
||||
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
|
||||
PREPARE_MAX_ID_STMT(HOTFIX_SEL_MANAGED_WORLD_STATE_BUFF, "SELECT MAX(ID) + 1 FROM managed_world_state_buff", CONNECTION_SYNCH);
|
||||
|
||||
// BattlePetState.db2
|
||||
PrepareStatement(HOTFIX_SEL_BATTLE_PET_STATE, "SELECT ID, LuaName, Flags, BattlePetVisualID FROM battle_pet_state"
|
||||
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
|
||||
PREPARE_MAX_ID_STMT(HOTFIX_SEL_BATTLE_PET_STATE, "SELECT MAX(ID) + 1 FROM battle_pet_state", CONNECTION_SYNCH);
|
||||
}
|
||||
|
||||
HotfixDatabaseConnection::HotfixDatabaseConnection(MySQLConnectionInfo& connInfo, ConnectionFlags connectionFlags) : MySQLConnection(connInfo, connectionFlags)
|
||||
|
||||
@@ -1769,6 +1769,9 @@ enum HotfixDatabaseStatements : uint32
|
||||
|
||||
HOTFIX_SEL_MANAGED_WORLD_STATE_BUFF,
|
||||
HOTFIX_SEL_MANAGED_WORLD_STATE_BUFF_MAX_ID,
|
||||
|
||||
HOTFIX_SEL_BATTLE_PET_STATE,
|
||||
HOTFIX_SEL_BATTLE_PET_STATE_MAX_ID,
|
||||
//WowCommunity end
|
||||
MAX_HOTFIXDATABASE_STATEMENTS
|
||||
};
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "Creature.h"
|
||||
#include "DB2Stores.h"
|
||||
#include "GameTables.h"
|
||||
#include <cmath>
|
||||
#include "Log.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "ObjectMgr.h"
|
||||
@@ -1137,6 +1138,7 @@ namespace PetBattles
|
||||
cancelEffect.Param1 = _environments[PET_BATTLE_WEATHER_ENV_SLOT].AuraInstanceID;
|
||||
cancelEffect.Param2 = _environments[PET_BATTLE_WEATHER_ENV_SLOT].AbilityID;
|
||||
_roundEffects.push_back(cancelEffect);
|
||||
EmitWeatherStateEffects(effect->ID, attackerTeam, attackerPet, true);
|
||||
ClearWeatherStates();
|
||||
}
|
||||
|
||||
@@ -1162,6 +1164,7 @@ namespace PetBattles
|
||||
applyEffect.Param3 = auraDuration;
|
||||
applyEffect.Param4 = _currentRound;
|
||||
_roundEffects.push_back(applyEffect);
|
||||
EmitWeatherStateEffects(effect->ID, attackerTeam, attackerPet, false);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1285,6 +1288,7 @@ namespace PetBattles
|
||||
cancelEffect.Param1 = _environments[PET_BATTLE_WEATHER_ENV_SLOT].AuraInstanceID;
|
||||
cancelEffect.Param2 = _environments[PET_BATTLE_WEATHER_ENV_SLOT].AbilityID;
|
||||
_roundEffects.push_back(cancelEffect);
|
||||
EmitWeatherStateEffects(effect->ID, attackerTeam, attackerPet, true);
|
||||
ClearWeatherStates();
|
||||
}
|
||||
|
||||
@@ -1308,6 +1312,7 @@ namespace PetBattles
|
||||
applyEffect.Param3 = auraDuration;
|
||||
applyEffect.Param4 = _currentRound;
|
||||
_roundEffects.push_back(applyEffect);
|
||||
EmitWeatherStateEffects(effect->ID, attackerTeam, attackerPet, false);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2045,6 +2050,30 @@ namespace PetBattles
|
||||
_environments[PET_BATTLE_WEATHER_ENV_SLOT].PeriodicStateIDs.clear();
|
||||
}
|
||||
|
||||
// The client shows weather from the states it is told about, not from the aura alone. Retail
|
||||
// (12.1.0.69587, Call Blizzard): AURA_APPLY on PBOID 8, then one SET_STATE per client-visible
|
||||
// state of the weather aura (52 Mechanic_IsChilled = 1, 58 Weather_Blizzard = 1); states without
|
||||
// BattlePetState.Flags 0x8 (87, the damage modifier) stay server-side. `clear` sends them as 0.
|
||||
void PetBattle::EmitWeatherStateEffects(uint32 abilityEffectID, uint8 casterTeam, uint8 casterPet, bool clear)
|
||||
{
|
||||
for (auto const& [stateID, value] : _environments[PET_BATTLE_WEATHER_ENV_SLOT].States)
|
||||
{
|
||||
BattlePetStateEntry const* stateEntry = sBattlePetStateStore.LookupEntry(stateID);
|
||||
if (!stateEntry || !(stateEntry->Flags & BATTLE_PET_STATE_FLAG_CLIENT_VISIBLE))
|
||||
continue;
|
||||
|
||||
PetBattleRoundEffect stateEffect;
|
||||
stateEffect.AbilityEffectID = abilityEffectID;
|
||||
stateEffect.EffectType = PET_BATTLE_EFFECT_SET_STATE;
|
||||
stateEffect.SourceTeam = casterTeam;
|
||||
stateEffect.SourcePet = casterPet;
|
||||
stateEffect.TargetEnvSlot = PET_BATTLE_WEATHER_ENV_SLOT;
|
||||
stateEffect.Param1 = int32(stateID);
|
||||
stateEffect.Param2 = clear ? 0 : value;
|
||||
_roundEffects.push_back(stateEffect);
|
||||
}
|
||||
}
|
||||
|
||||
void PetBattle::TickWeather()
|
||||
{
|
||||
for (uint8 envSlot = 0; envSlot < MAX_PET_BATTLE_ENVIRONMENTS; ++envSlot)
|
||||
@@ -2061,6 +2090,7 @@ namespace PetBattles
|
||||
changeEffect.EffectType = PET_BATTLE_EFFECT_AURA_CHANGE;
|
||||
changeEffect.SourceTeam = env.CasterTeam;
|
||||
changeEffect.SourcePet = _teams[env.CasterTeam].FrontPetIndex;
|
||||
changeEffect.SourceEnvSlot = static_cast<int8>(envSlot); // wire: CasterPBOID 8 for the weather aura's own AURA_CHANGE
|
||||
changeEffect.TargetEnvSlot = static_cast<int8>(envSlot);
|
||||
changeEffect.Param1 = env.AuraInstanceID;
|
||||
changeEffect.Param2 = env.AbilityID;
|
||||
@@ -2106,7 +2136,10 @@ namespace PetBattles
|
||||
env.AbilityID = 0;
|
||||
env.AuraInstanceID = 0;
|
||||
if (envSlot == PET_BATTLE_WEATHER_ENV_SLOT)
|
||||
{
|
||||
EmitWeatherStateEffects(0, env.CasterTeam, _teams[env.CasterTeam].FrontPetIndex, true);
|
||||
ClearWeatherStates();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2261,8 +2294,25 @@ namespace PetBattles
|
||||
for (uint8 i = 0; i < loserTeam.PetCount; ++i)
|
||||
maxOpponentLevel = std::max(maxOpponentLevel, loserTeam.Pets[i].Level);
|
||||
|
||||
// Award XP to every pet of the winning team that took the field (retail: a pet that died
|
||||
// during the battle still gets XP, a pet that never fought gets none -- FINAL_ROUND SeenAction)
|
||||
// Retail rule, fitted to seven awards in three 12.1.0.69587 captures (five battles with L1-L3
|
||||
// pets, two with the friend's; docs/PET_BATTLES_12.1_PARITY_2026-09-11.md "Fourth iteration"):
|
||||
//
|
||||
// award = BattlePetXP.xp(petLevel) * 3 * (1 + 0.2 * (opponentLevel - petLevel)) / participants
|
||||
// * 0.5 if the pet died
|
||||
//
|
||||
// xp(level) is the gt row's per-win value of the PET's own pre-battle level (50 at L1, 55 at
|
||||
// L2, 60 at L3); the whole award is applied at once and cascades through level-ups (L1 pet:
|
||||
// 180 XP -> L3 with 20 left). "participants" are the winning team's pets that took the field;
|
||||
// the bench gets nothing. Retail keeps the fraction (82.5 shows as 82 or 83 depending on the
|
||||
// stored remainder); we round half to even once. Only L2 opponents were observed, so the
|
||||
// factor 3 could also be (opponentLevel + 1) -- see the report before changing it.
|
||||
uint32 participants = 0;
|
||||
for (uint8 i = 0; i < winnerTeam.PetCount; ++i)
|
||||
if (winnerTeam.Pets[i].SeenAction)
|
||||
++participants;
|
||||
if (!participants)
|
||||
return;
|
||||
|
||||
BattlePets::BattlePetMgr* petMgr = player->GetSession()->GetBattlePetMgr();
|
||||
|
||||
for (uint8 i = 0; i < winnerTeam.PetCount; ++i)
|
||||
@@ -2274,18 +2324,21 @@ namespace PetBattles
|
||||
if (pet.BattlePetGUID.IsEmpty())
|
||||
continue;
|
||||
|
||||
// Look up XP from GameTable
|
||||
GtBattlePetXPEntry const* xpEntry = sBattlePetXPGameTable.GetRow(maxOpponentLevel);
|
||||
uint16 xpAward = xpEntry ? static_cast<uint16>(GetBattlePetXPPerLevel(xpEntry)) : 100;
|
||||
GtBattlePetXPEntry const* xpEntry = sBattlePetXPGameTable.GetRow(pet.Level);
|
||||
if (!xpEntry)
|
||||
continue;
|
||||
|
||||
// Scale by level difference: pets much lower than opponent get more XP
|
||||
int16 levelDiff = static_cast<int16>(maxOpponentLevel) - static_cast<int16>(pet.Level);
|
||||
if (levelDiff > 0)
|
||||
xpAward = static_cast<uint16>(xpAward * (1.0f + levelDiff * 0.1f)); // +10% per level below opponent
|
||||
else if (levelDiff < -5)
|
||||
xpAward = static_cast<uint16>(xpAward * 0.1f); // Heavily reduced for fighting much lower level
|
||||
float levelMod = 1.0f + PET_BATTLE_XP_LEVEL_DIFF_STEP * (int32(maxOpponentLevel) - int32(pet.Level));
|
||||
if (levelMod <= 0.0f)
|
||||
continue;
|
||||
|
||||
if (xpAward < 1) xpAward = 1;
|
||||
float award = xpEntry->Xp * PET_BATTLE_XP_WIN_MULTIPLIER * levelMod / float(participants);
|
||||
if (!pet.IsAlive())
|
||||
award *= PET_BATTLE_XP_DEATH_FACTOR;
|
||||
|
||||
uint16 xpAward = uint16(std::nearbyint(award));
|
||||
if (!xpAward)
|
||||
continue;
|
||||
|
||||
petMgr->GrantBattlePetExperience(pet.BattlePetGUID, xpAward, BattlePets::BattlePetXpSource::PetBattle);
|
||||
}
|
||||
@@ -2424,8 +2477,12 @@ namespace PetBattles
|
||||
pet.Pboid = t * MAX_PET_BATTLE_TEAM_SIZE + i;
|
||||
pet.Captured = team.Pets[i].IsCaptured;
|
||||
pet.Caged = false;
|
||||
pet.SeenAction = team.Pets[i].SeenAction;
|
||||
pet.AwardedXP = _canAwardXP && team.Pets[i].SeenAction && team.Pets[i].Level < BattlePets::MAX_BATTLE_PET_LEVEL;
|
||||
// Wire (three captures): AwardedXP = 1 for every pet that took the field, the wild
|
||||
// pet and max-level pets included; SeenAction = 1 only for player pets that took the
|
||||
// field and can still gain XP. The bench is 0/0.
|
||||
pet.AwardedXP = team.Pets[i].SeenAction;
|
||||
pet.SeenAction = _canAwardXP && team.Pets[i].SeenAction && !team.Pets[i].BattlePetGUID.IsEmpty()
|
||||
&& team.Pets[i].Level < BattlePets::MAX_BATTLE_PET_LEVEL;
|
||||
finalRound.Pets.push_back(pet);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,6 +248,7 @@ namespace PetBattles
|
||||
int32 Param3 = 0; // For aura effects: RoundsRemaining (captured at creation time)
|
||||
int32 Param4 = 0; // For aura effects: CurrentRound (captured at creation time)
|
||||
int8 TargetEnvSlot = -1; // >= 0: target is environment slot (PBOID = PBOID_ENVIRONMENT_BASE + slot)
|
||||
int8 SourceEnvSlot = -1; // >= 0: caster is an environment slot (wire: weather AURA_CHANGE has CasterPBOID 8)
|
||||
};
|
||||
|
||||
class TC_GAME_API PetBattle
|
||||
@@ -335,6 +336,7 @@ namespace PetBattles
|
||||
|
||||
// Environment/weather (state-driven from BattlePetAbilityState DB2)
|
||||
void ApplyWeatherStates(uint32 abilityID);
|
||||
void EmitWeatherStateEffects(uint32 abilityEffectID, uint8 casterTeam, uint8 casterPet, bool clear);
|
||||
void ClearWeatherStates();
|
||||
void TickWeather();
|
||||
|
||||
|
||||
@@ -37,6 +37,12 @@ namespace PetBattles
|
||||
static constexpr uint32 MAX_PET_BATTLE_AURAS = 10; // max auras on a single pet
|
||||
static constexpr uint32 MAX_PET_BATTLE_ENVIRONMENTS = 3; // Pad0(0), Pad1(1), Weather(2)
|
||||
static constexpr uint32 PBOID_ENVIRONMENT_BASE = MAX_PET_BATTLE_PLAYERS * MAX_PET_BATTLE_TEAM_SIZE; // PBOID 6 = environment slot 0
|
||||
|
||||
// BattlePetState.Flags bit that marks a state the server sends to the client as a SET_STATE effect.
|
||||
// 12.1.0.69587 wire: Blizzard (aura 205) applied on PBOID 8 sends SET_STATE 52 Mechanic_IsChilled and
|
||||
// 58 Weather_Blizzard (both Flags 0x8) but not 87 Mod_PetTypeDamageDealtPercent (Flags 0); every
|
||||
// state ever seen on the wire (18/19/20/25/40/42..51/1/302) carries 0x8.
|
||||
static constexpr int32 BATTLE_PET_STATE_FLAG_CLIENT_VISIBLE = 0x8;
|
||||
static constexpr uint32 PET_BATTLE_WEATHER_ENV_SLOT = 2; // PetbattleEnviros::Weather = 2 (PBOID 8)
|
||||
static constexpr float PASSIVE_HUMANOID_HEAL_PCT = 0.04f; // 4% max HP each round
|
||||
static constexpr float PASSIVE_DRAGONKIN_DAMAGE_BONUS = 0.50f;
|
||||
@@ -338,6 +344,11 @@ namespace PetBattles
|
||||
static constexpr float PET_BATTLE_BASE_CRIT_CHANCE = 0.05f;
|
||||
static constexpr float PET_BATTLE_CRIT_MULTIPLIER = 1.5f;
|
||||
|
||||
// Battle XP (12.1.0.69587 wire, seven awards): xp(petLevel) * 3 * (1 + 0.2 * levelDiff) / participants, half if dead
|
||||
static constexpr float PET_BATTLE_XP_WIN_MULTIPLIER = 3.0f;
|
||||
static constexpr float PET_BATTLE_XP_LEVEL_DIFF_STEP = 0.2f;
|
||||
static constexpr float PET_BATTLE_XP_DEATH_FACTOR = 0.5f;
|
||||
|
||||
// Capture success chance based on target HP percentage, quality, and cumulative fail bonus
|
||||
// Quality modifiers: Poor(0)=+20%, Common(1)=+10%, Uncommon(2)=0%, Rare(3)=-10%, Epic(4)=-20%, Legendary(5)=-30%
|
||||
inline float GetCaptureChance(uint16 trapLevel, float healthPct, uint8 quality = 1, float failBonus = 0.0f)
|
||||
|
||||
@@ -9580,4 +9580,18 @@ struct ManagedWorldStateBuffLoadInfo
|
||||
|
||||
static constexpr DB2LoadInfo Instance{ Fields, 5, &ManagedWorldStateBuffMeta::Instance, HOTFIX_SEL_MANAGED_WORLD_STATE_BUFF };
|
||||
};
|
||||
|
||||
struct BattlePetStateLoadInfo
|
||||
{
|
||||
static constexpr DB2FieldMeta Fields[4] =
|
||||
{
|
||||
{.IsSigned = false, .Type = FT_INT, .Name = "ID" },
|
||||
{.IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "LuaName" },
|
||||
{.IsSigned = true, .Type = FT_INT, .Name = "Flags" },
|
||||
{.IsSigned = false, .Type = FT_SHORT, .Name = "BattlePetVisualID" },
|
||||
};
|
||||
|
||||
static constexpr DB2LoadInfo Instance{ Fields, 4, &BattlePetStateMeta::Instance, HOTFIX_SEL_BATTLE_PET_STATE };
|
||||
};
|
||||
|
||||
#endif // TRINITYCORE_DB2_LOAD_INFO_H
|
||||
|
||||
@@ -86,6 +86,7 @@ DB2Storage<BattlePetEffectPropertiesEntry> sBattlePetEffectPropertiesStore(
|
||||
DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore("BattlePetSpecies.db2", &BattlePetSpeciesLoadInfo::Instance);
|
||||
DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", &BattlePetSpeciesStateLoadInfo::Instance);
|
||||
DB2Storage<BattlePetSpeciesXAbilityEntry> sBattlePetSpeciesXAbilityStore("BattlePetSpeciesXAbility.db2", &BattlePetSpeciesXAbilityLoadInfo::Instance);
|
||||
DB2Storage<BattlePetStateEntry> sBattlePetStateStore("BattlePetState.db2", &BattlePetStateLoadInfo::Instance);
|
||||
DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", &BattlemasterListLoadInfo::Instance);
|
||||
DB2Storage<BattlemasterListXMapEntry> sBattlemasterListXMapStore("BattlemasterListXMap.db2", &BattlemasterListXMapLoadInfo::Instance);
|
||||
DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance);
|
||||
@@ -895,6 +896,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
|
||||
LOAD_DB2(sBattlePetSpeciesStore);
|
||||
LOAD_DB2(sBattlePetSpeciesStateStore);
|
||||
LOAD_DB2(sBattlePetSpeciesXAbilityStore);
|
||||
LOAD_DB2(sBattlePetStateStore);
|
||||
LOAD_DB2(sBattlemasterListStore);
|
||||
LOAD_DB2(sBattlemasterListXMapStore);
|
||||
LOAD_DB2(sBroadcastTextStore);
|
||||
|
||||
@@ -69,6 +69,7 @@ TC_GAME_API extern DB2Storage<BattlePetEffectPropertiesEntry> sBattlePetEf
|
||||
TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore;
|
||||
TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore;
|
||||
TC_GAME_API extern DB2Storage<BattlePetSpeciesXAbilityEntry> sBattlePetSpeciesXAbilityStore;
|
||||
TC_GAME_API extern DB2Storage<BattlePetStateEntry> sBattlePetStateStore;
|
||||
TC_GAME_API extern DB2Storage<BattlemasterListEntry> sBattlemasterListStore;
|
||||
TC_GAME_API extern DB2Storage<BattlemasterListXMapEntry> sBattlemasterListXMapStore;
|
||||
TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore;
|
||||
|
||||
@@ -6753,6 +6753,15 @@ struct ManagedWorldStateBuffEntry
|
||||
uint32 OccurrenceValue;
|
||||
int32 ManagedWorldStateID;
|
||||
};
|
||||
|
||||
struct BattlePetStateEntry
|
||||
{
|
||||
uint32 ID;
|
||||
char const* LuaName;
|
||||
int32 Flags;
|
||||
uint16 BattlePetVisualID;
|
||||
};
|
||||
|
||||
//WowCommunity
|
||||
#pragma pack(pop)
|
||||
#endif
|
||||
|
||||
@@ -59,7 +59,8 @@ LFGDungeonData::LFGDungeonData(LFGDungeonsEntry const* dbc) : id(dbc->ID), name(
|
||||
}
|
||||
|
||||
LFGMgr::LFGMgr() : m_QueueTimer(0), m_lfgProposalId(1),
|
||||
m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK))
|
||||
m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK)),
|
||||
m_isSoloLFG(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1087,7 +1088,7 @@ void LFGMgr::UpdateProposal(uint32 proposalId, ObjectGuid guid, bool accept)
|
||||
if (itPlayers->second.accept != LFG_ANSWER_AGREE) // No answer (-1) or not accepted (0)
|
||||
allAnswered = false;
|
||||
|
||||
if (!allAnswered)
|
||||
if (!sLFGMgr->IsSoloLFG() && !allAnswered)
|
||||
{
|
||||
for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
|
||||
SendLfgUpdateProposal(it->first, proposal);
|
||||
@@ -2511,4 +2512,9 @@ void LFGMgr::ConfirmExpandSearch(Player* player, WorldPackets::LFG::RideTicket c
|
||||
owner.ToString(), uint32(queued.size()), uint32(expanded.size()));
|
||||
}
|
||||
|
||||
void LFGMgr::ToggleSoloLFG()
|
||||
{
|
||||
m_isSoloLFG = !m_isSoloLFG;
|
||||
}
|
||||
|
||||
} // namespace lfg
|
||||
|
||||
@@ -434,6 +434,10 @@ class TC_GAME_API LFGMgr
|
||||
//WowCommunity
|
||||
/// CMSG_DF_CONFIRM_EXPAND_SEARCH: widen an already-queued entry's dungeon set without losing its place
|
||||
void ConfirmExpandSearch(Player* player, WorldPackets::LFG::RideTicket const& ticket);
|
||||
/// Toggle LFG in debug mode
|
||||
void ToggleSoloLFG();
|
||||
/// Check if debug mode
|
||||
bool IsSoloLFG() const { return m_isSoloLFG; }
|
||||
//WowCommunity
|
||||
/// Gets unique join queue data
|
||||
WorldPackets::LFG::RideTicket const* GetTicket(ObjectGuid guid) const;
|
||||
@@ -519,6 +523,7 @@ class TC_GAME_API LFGMgr
|
||||
LfgGroupDataContainer GroupsStore; /// Group data
|
||||
//WowCommunity
|
||||
GuidSet ExpandSearchPromptedStore; /// Queue owners already offered SMSG_LFG_EXPAND_SEARCH_PROMPT
|
||||
bool m_isSoloLFG; /// solo lfg
|
||||
//WowCommunity
|
||||
};
|
||||
|
||||
|
||||
@@ -367,6 +367,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check)
|
||||
LfgDungeonSet proposalDungeons;
|
||||
LfgGroupsMap proposalGroups;
|
||||
LfgRolesMap proposalRoles;
|
||||
bool forceMinPlayers = sWorld->getBoolConfig(CONFIG_LFG_FORCE_MINPLAYERS);
|
||||
|
||||
// Check for correct size
|
||||
if (check.size() > MAX_GROUP_SIZE || check.empty())
|
||||
@@ -447,7 +448,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check)
|
||||
|
||||
// Group with less that MAX_GROUP_SIZE members always compatible
|
||||
// For follower dungeons, allow solo play (minimum 1 player)
|
||||
if (numPlayers != MAX_GROUP_SIZE && !hasFollowerDungeon)
|
||||
if (!sLFGMgr->IsSoloLFG() && !forceMinPlayers && numPlayers != MAX_GROUP_SIZE && !hasFollowerDungeon)
|
||||
{
|
||||
TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: ({}) single group. Compatibles", GetDetailedMatchRoles(check));
|
||||
LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(check.front());
|
||||
@@ -559,7 +560,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check)
|
||||
}
|
||||
|
||||
// Enough players?
|
||||
if (numPlayers != MAX_GROUP_SIZE && !hasFollowerDungeon)
|
||||
if (!forceMinPlayers && !sLFGMgr->IsSoloLFG() && numPlayers != MAX_GROUP_SIZE && !hasFollowerDungeon)
|
||||
{
|
||||
TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: ({}) Compatibles but not enough players({})", GetDetailedMatchRoles(check), numPlayers);
|
||||
LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS);
|
||||
|
||||
@@ -230,6 +230,8 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
|
||||
if (GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::VisualAnimIsDecay))
|
||||
SetUpdateFieldValue(visualAnim.ModifyValue(&UF::VisualAnim::IsDecay), true);
|
||||
|
||||
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PositionalSoundKitID), GetCreateProperties()->PositionalSoundKitId);
|
||||
|
||||
AreaTriggerFieldFlags fieldFlags = [flags = GetCreateProperties()->Flags]()
|
||||
{
|
||||
AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None;
|
||||
|
||||
@@ -249,6 +249,8 @@ public:
|
||||
|
||||
Optional<int32> SpellForVisuals;
|
||||
|
||||
int32 PositionalSoundKitId = 0;
|
||||
|
||||
uint32 TimeToTargetScale = 0;
|
||||
|
||||
AreaTriggerShapeInfo Shape;
|
||||
|
||||
@@ -169,14 +169,16 @@ 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, "
|
||||
"MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, SpellForVisuals, "
|
||||
"PositionalSoundKitId, TimeToTargetScale, Speed, SpeedIsTime, "
|
||||
"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)
|
||||
(MoveCurveId)(ScaleCurveId)(MorphCurveId)(FacingCurveId)(AnimId)(AnimKitId)(DecalPropertiesId)(SpellForVisuals)
|
||||
(PositionalSoundKitId)(TimeToTargetScale)(Speed)(SpeedIsTime)
|
||||
(Shape)(ShapeData0)(ShapeData1)(ShapeData2)(ShapeData3)(ShapeData4)(ShapeData5)(ShapeData6)(ShapeData7)
|
||||
(Roll)(Pitch)(Yaw)(TargetRoll)(TargetPitch)(TargetYaw)(ScriptName)
|
||||
) fields {
|
||||
@@ -240,6 +242,23 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
|
||||
}
|
||||
}
|
||||
|
||||
createProperties.PositionalSoundKitId = fields.PositionalSoundKitId().GetInt32();
|
||||
if (createProperties.PositionalSoundKitId)
|
||||
{
|
||||
if (!sSoundKitStore.HasRecord(createProperties.PositionalSoundKitId))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with invalid PositionalSoundKitId {}, set to 0.",
|
||||
createPropertiesId.Id, uint32(createPropertiesId.IsCustom), createProperties.PositionalSoundKitId);
|
||||
createProperties.PositionalSoundKitId = 0;
|
||||
}
|
||||
else if (shape != AreaTriggerShapeType::Sphere && shape != AreaTriggerShapeType::Cylinder)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with PositionalSoundKitId {} on unsupported shape {}, set to 0.",
|
||||
createPropertiesId.Id, uint32(createPropertiesId.IsCustom), createProperties.PositionalSoundKitId, uint32(shape));
|
||||
createProperties.PositionalSoundKitId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
createProperties.TimeToTargetScale = fields.TimeToTargetScale().GetUInt32();
|
||||
createProperties.Speed = fields.Speed().GetFloat();
|
||||
createProperties.SpeedIsTime = fields.SpeedIsTime().GetBool();
|
||||
|
||||
@@ -396,7 +396,10 @@ static void BuildRoundEffects(std::vector<WorldPackets::BattlePet::PetBattleEffe
|
||||
// Wire offset 12 is the PetBattleEffectType ? client switches on this to process effects
|
||||
// (SetHealth=0, AuraApply=1, PetSwap=4, SetState=6, etc.), NOT a sequential index
|
||||
effect.PetBattleEffectType = roundEffect.EffectType;
|
||||
effect.CasterPBOID = static_cast<int32>(roundEffect.SourceTeam * PetBattles::MAX_PET_BATTLE_TEAM_SIZE + roundEffect.SourcePet);
|
||||
if (roundEffect.SourceEnvSlot >= 0)
|
||||
effect.CasterPBOID = static_cast<int32>(PetBattles::PBOID_ENVIRONMENT_BASE + roundEffect.SourceEnvSlot);
|
||||
else
|
||||
effect.CasterPBOID = static_cast<int32>(roundEffect.SourceTeam * PetBattles::MAX_PET_BATTLE_TEAM_SIZE + roundEffect.SourcePet);
|
||||
effect.StackDepth = 0;
|
||||
|
||||
WorldPackets::BattlePet::PetBattleEffectTargetInfo target;
|
||||
|
||||
@@ -7,21 +7,37 @@
|
||||
* 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.
|
||||
* 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 "WorldSession.h"
|
||||
#include "DB2Stores.h"
|
||||
#include "GameTime.h"
|
||||
#include "HotfixPackets.h"
|
||||
#include "Log.h"
|
||||
#include "MapUtils.h"
|
||||
#include "World.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
constexpr uint32 HouseDecorTableHash = 0x137145D0;
|
||||
|
||||
bool IsUnsafeClientHotfixTable(uint32 tableHash)
|
||||
{
|
||||
// HouseDecor.db2 is intentionally not loaded in DB2Manager::LoadStores for the
|
||||
// current 12.1 branch. An unloaded DB2Storage keeps its runtime table hash at 0,
|
||||
// so using sHouseDecorStore.GetTableHash() here does not identify HouseDecor.
|
||||
// Use the stable DB2 table hash for HouseDecor (FileDataID 5149691) instead.
|
||||
// Forwarding DB-supplied HouseDecor blobs can otherwise make the retail client
|
||||
// merge duplicate unique keys and terminate with ERROR #134 before character login.
|
||||
return tableHash == HouseDecorTableHash;
|
||||
}
|
||||
}
|
||||
|
||||
void WorldSession::HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery)
|
||||
{
|
||||
DB2StorageBase const* store = sDB2Manager.GetStorage(dbQuery.TableHash);
|
||||
@@ -63,10 +79,19 @@ void WorldSession::SendAvailableHotfixes()
|
||||
|
||||
for (auto const& [pushId, push] : sDB2Manager.GetHotfixData())
|
||||
{
|
||||
if (!(push.AvailableLocalesMask & (1 << GetSessionDbcLocale())))
|
||||
continue;
|
||||
for (DB2Manager::HotfixRecord const& hotfixRecord : push.Records)
|
||||
{
|
||||
if (!(hotfixRecord.AvailableLocalesMask & (1 << GetSessionDbcLocale())))
|
||||
continue;
|
||||
|
||||
availableHotfixes.Hotfixes.insert(push.Records.front().ID);
|
||||
if (IsUnsafeClientHotfixTable(hotfixRecord.TableHash))
|
||||
continue;
|
||||
|
||||
// One AvailableHotfixes entry is enough to advertise the push. Pick a
|
||||
// safe record so a mixed push never exposes HouseDecor's UniqueID.
|
||||
availableHotfixes.Hotfixes.insert(hotfixRecord.ID);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SendPacket(availableHotfixes.Write());
|
||||
@@ -77,6 +102,9 @@ void WorldSession::HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotf
|
||||
DB2Manager::HotfixContainer const& hotfixes = sDB2Manager.GetHotfixData();
|
||||
WorldPackets::Hotfix::HotfixConnect hotfixQueryResponse;
|
||||
hotfixQueryResponse.Hotfixes.reserve(hotfixQuery.Hotfixes.size());
|
||||
|
||||
uint32 blockedHouseDecorRecords = 0;
|
||||
|
||||
for (int32 hotfixId : hotfixQuery.Hotfixes)
|
||||
{
|
||||
if (DB2Manager::HotfixPush const* hotfixRecords = Trinity::Containers::MapGetValuePtr(hotfixes, hotfixId))
|
||||
@@ -86,6 +114,12 @@ void WorldSession::HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotf
|
||||
if (!(hotfixRecord.AvailableLocalesMask & (1 << GetSessionDbcLocale())))
|
||||
continue;
|
||||
|
||||
if (IsUnsafeClientHotfixTable(hotfixRecord.TableHash))
|
||||
{
|
||||
++blockedHouseDecorRecords;
|
||||
continue;
|
||||
}
|
||||
|
||||
WorldPackets::Hotfix::HotfixConnect::HotfixData& hotfixData = hotfixQueryResponse.Hotfixes.emplace_back();
|
||||
hotfixData.Record = hotfixRecord;
|
||||
if (hotfixRecord.HotfixStatus == DB2Manager::HotfixRecord::Status::Valid)
|
||||
@@ -120,5 +154,12 @@ void WorldSession::HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotf
|
||||
}
|
||||
}
|
||||
|
||||
if (blockedHouseDecorRecords)
|
||||
{
|
||||
TC_LOG_WARN("network",
|
||||
"Blocked {} unsafe HouseDecor hotfix record(s) for client build {} / data build {} to prevent DB2 duplicate-key client crashes.",
|
||||
blockedHouseDecorRecords, hotfixQuery.ClientBuild, hotfixQuery.DataBuild);
|
||||
}
|
||||
|
||||
SendPacket(hotfixQueryResponse.Write());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#ifndef TRINITYCORE_HOUSING_DEFINES_H
|
||||
#define TRINITYCORE_HOUSING_DEFINES_H
|
||||
|
||||
#include "Define.h"
|
||||
#include "ObjectGuid.h"
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
enum class Result : uint8
|
||||
{
|
||||
Success = 0,
|
||||
HouseNotFound = 27,
|
||||
InvalidDecorItem = 29,
|
||||
NotInDecorEditMode = 50,
|
||||
PermissionDenied = 57
|
||||
};
|
||||
|
||||
enum class PlotTransactionType : uint8
|
||||
{
|
||||
Purchase = 0,
|
||||
Move = 1,
|
||||
Relinquish = 2
|
||||
};
|
||||
|
||||
constexpr uint32 AllianceExteriorMapId = 2735;
|
||||
constexpr uint32 HordeExteriorMapId = 2736;
|
||||
constexpr uint32 HouseSettingsValidMask = 0x3FF;
|
||||
constexpr uint32 PlotReservationLifetimeSeconds = 300;
|
||||
|
||||
// Defensive persistence/materialization limits. These are server safety caps,
|
||||
// not client gameplay limits, and intentionally sit above normal Housing use.
|
||||
constexpr uint32 SafetyMaxOwnedHousesPerCharacter = 32;
|
||||
constexpr uint32 SafetyMaxRoomsPerHouse = 64;
|
||||
constexpr uint32 SafetyMaxRoomComponentsPerHouse = 4096;
|
||||
constexpr uint32 SafetyMaxFixturesPerHouse = 1024;
|
||||
constexpr uint32 SafetyMaxPlacedDecorPerHouse = 2048;
|
||||
constexpr uint32 SafetyMaxBlueprintsPerAccount = 100;
|
||||
constexpr uint32 SafetyMaxBlueprintItems = 10000;
|
||||
|
||||
inline bool IsExteriorMapId(uint32 mapId)
|
||||
{
|
||||
return mapId == AllianceExteriorMapId || mapId == HordeExteriorMapId;
|
||||
}
|
||||
|
||||
inline bool IsHouseGuid(ObjectGuid const& guid)
|
||||
{
|
||||
return !guid.IsEmpty() && guid.GetHigh() == HighGuid::Housing && guid.GetSubType() == 3;
|
||||
}
|
||||
|
||||
inline bool IsRoomGuid(ObjectGuid const& guid)
|
||||
{
|
||||
// Retail FHousingRoom_C entities use Housing subtype 2. Keep this check
|
||||
// centralized so malformed persisted GUIDs are rejected before they are
|
||||
// ever materialized into a room object or echoed back to the client.
|
||||
return !guid.IsEmpty() && guid.GetHigh() == HighGuid::Housing && guid.GetSubType() == 2;
|
||||
}
|
||||
|
||||
inline bool IsNeighborhoodGuid(ObjectGuid const& guid)
|
||||
{
|
||||
return !guid.IsEmpty() && guid.GetHigh() == HighGuid::Housing && guid.GetSubType() == 4;
|
||||
}
|
||||
|
||||
inline bool IsDecorGuid(ObjectGuid const& guid)
|
||||
{
|
||||
return !guid.IsEmpty() && guid.GetHigh() == HighGuid::Housing && guid.GetSubType() == 1;
|
||||
}
|
||||
|
||||
inline bool IsHousingAttachmentGuid(ObjectGuid const& guid)
|
||||
{
|
||||
return guid.IsEmpty() || guid.GetHigh() == HighGuid::Housing || guid.GetHigh() == HighGuid::MeshObject;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // TRINITYCORE_HOUSING_DEFINES_H
|
||||
@@ -0,0 +1,378 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#include "HousingMgr.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "Log.h"
|
||||
#include "Player.h"
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
Manager& Manager::Instance()
|
||||
{
|
||||
static Manager instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
uint32 Manager::GetExteriorMapId(Player const* player) const
|
||||
{
|
||||
return player && player->GetTeamId() == TEAM_HORDE ? HordeExteriorMapId : AllianceExteriorMapId;
|
||||
}
|
||||
|
||||
bool Manager::IsPlayerOnHousingExterior(Player const* player, uint32* exteriorMapId) const
|
||||
{
|
||||
if (!player || !player->IsInWorld())
|
||||
return false;
|
||||
|
||||
uint32 const expectedMapId = GetExteriorMapId(player);
|
||||
if (exteriorMapId)
|
||||
*exteriorMapId = expectedMapId;
|
||||
|
||||
return player->GetMapId() == expectedMapId;
|
||||
}
|
||||
|
||||
std::vector<HouseState> Manager::LoadOwnedHouses(Player const* player) const
|
||||
{
|
||||
std::vector<HouseState> houses;
|
||||
if (!player)
|
||||
return houses;
|
||||
|
||||
houses.reserve(SafetyMaxOwnedHousesPerCharacter);
|
||||
|
||||
QueryResult result = CharacterDatabase.PQuery(
|
||||
"SELECT HouseGuid, CosmeticOwnerGuid, NeighborhoodGuid, PlotID, ExteriorMapID, HouseSettingFlags, ReservationTime "
|
||||
"FROM character_housing WHERE OwnerGuid = {} ORDER BY PlotID, HouseGuid LIMIT {}",
|
||||
player->GetGUID().GetCounter(), SafetyMaxOwnedHousesPerCharacter + 1);
|
||||
if (!result)
|
||||
return houses;
|
||||
|
||||
do
|
||||
{
|
||||
if (houses.size() >= SafetyMaxOwnedHousesPerCharacter)
|
||||
{
|
||||
TC_LOG_WARN("housing", "Character {} has more than {} persisted Housing rows; ignoring the remainder",
|
||||
player->GetGUID().ToString(), SafetyMaxOwnedHousesPerCharacter);
|
||||
break;
|
||||
}
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
ObjectGuid const houseGuid = ObjectGuid::FromString(fields[0].GetString());
|
||||
ObjectGuid const cosmeticOwnerGuid = ObjectGuid::FromString(fields[1].GetString());
|
||||
ObjectGuid const neighborhoodGuid = ObjectGuid::FromString(fields[2].GetString());
|
||||
|
||||
if (!IsHouseGuid(houseGuid) || !cosmeticOwnerGuid.IsPlayer() || !IsNeighborhoodGuid(neighborhoodGuid))
|
||||
{
|
||||
TC_LOG_WARN("housing", "Ignoring malformed Housing row for character {}: house={}, cosmeticOwner={}, neighborhood={}",
|
||||
player->GetGUID().ToString(), fields[0].GetString(), fields[1].GetString(), fields[2].GetString());
|
||||
continue;
|
||||
}
|
||||
|
||||
HouseState state;
|
||||
state.HouseGuid = houseGuid;
|
||||
state.CosmeticOwnerGuid = cosmeticOwnerGuid;
|
||||
state.NeighborhoodGuid = neighborhoodGuid;
|
||||
state.PlotId = fields[3].GetUInt8();
|
||||
state.ExteriorMapId = fields[4].GetUInt32();
|
||||
if (!IsExteriorMapId(state.ExteriorMapId))
|
||||
state.ExteriorMapId = GetExteriorMapId(player);
|
||||
|
||||
state.SettingsFlags = fields[5].GetUInt32() & HouseSettingsValidMask;
|
||||
if (!fields[6].IsNull())
|
||||
{
|
||||
state.HasReservationTime = true;
|
||||
state.ReservationTime = fields[6].GetUInt64();
|
||||
}
|
||||
|
||||
houses.push_back(state);
|
||||
} while (result->NextRow());
|
||||
|
||||
return houses;
|
||||
}
|
||||
|
||||
Result Manager::LoadOwnedHouse(Player const* player, ObjectGuid const& requestedHouse, HouseState& state) const
|
||||
{
|
||||
state = {};
|
||||
if (!player)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
if (!requestedHouse.IsEmpty() && !IsHouseGuid(requestedHouse))
|
||||
return Result::HouseNotFound;
|
||||
|
||||
for (HouseState const& candidate : LoadOwnedHouses(player))
|
||||
{
|
||||
if (requestedHouse.IsEmpty() || candidate.HouseGuid == requestedHouse)
|
||||
{
|
||||
state = candidate;
|
||||
return Result::Success;
|
||||
}
|
||||
}
|
||||
|
||||
return Result::HouseNotFound;
|
||||
}
|
||||
|
||||
Result Manager::LoadPlot(Player const* player, uint8 plotId, PlotState& state) const
|
||||
{
|
||||
state = {};
|
||||
if (!player)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
uint32 const exteriorMapId = GetExteriorMapId(player);
|
||||
QueryResult result = CharacterDatabase.PQuery(
|
||||
"SELECT InteriorMapID, DestinationX, DestinationY, DestinationZ, DestinationO, CornerstoneEntry, Cost "
|
||||
"FROM housing_plot_template WHERE PlotID = {} AND ExteriorMapID = {} "
|
||||
"ORDER BY VerifiedBuild DESC LIMIT 1",
|
||||
uint32(plotId), exteriorMapId);
|
||||
if (!result)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
state.PlotId = plotId;
|
||||
state.ExteriorMapId = exteriorMapId;
|
||||
state.InteriorMapId = fields[0].GetUInt32();
|
||||
state.DestinationX = fields[1].GetFloat();
|
||||
state.DestinationY = fields[2].GetFloat();
|
||||
state.DestinationZ = fields[3].GetFloat();
|
||||
state.DestinationO = fields[4].GetFloat();
|
||||
state.CornerstoneEntry = fields[5].GetUInt32();
|
||||
state.Cost = fields[6].GetUInt64();
|
||||
return Result::Success;
|
||||
}
|
||||
|
||||
Result Manager::UpdateOwnedHouseSettings(Player const* player, ObjectGuid const& houseGuid, uint32 settingsFlags, HouseState& state) const
|
||||
{
|
||||
Result const loadResult = LoadOwnedHouse(player, houseGuid, state);
|
||||
if (loadResult != Result::Success)
|
||||
return loadResult;
|
||||
|
||||
state.SettingsFlags = settingsFlags & HouseSettingsValidMask;
|
||||
CharacterDatabase.DirectPExecute(
|
||||
"UPDATE character_housing SET HouseSettingFlags = {} WHERE OwnerGuid = {} AND HouseGuid = '{}'",
|
||||
state.SettingsFlags, player->GetGUID().GetCounter(), state.HouseGuid.ToString());
|
||||
return Result::Success;
|
||||
}
|
||||
|
||||
Result Manager::ReservePlot(Player const* player, ObjectGuid const& neighborhoodGuid, uint8 plotId, bool reserve) const
|
||||
{
|
||||
if (!player || !IsNeighborhoodGuid(neighborhoodGuid))
|
||||
return Result::PermissionDenied;
|
||||
|
||||
PlotState plot;
|
||||
if (LoadPlot(player, plotId, plot) != Result::Success)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
QueryResult neighborhood = CharacterDatabase.PQuery(
|
||||
"SELECT 1 FROM housing_neighborhood WHERE NeighborhoodGuid = '{}' LIMIT 1",
|
||||
neighborhoodGuid.ToString());
|
||||
if (!neighborhood)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
uint64 const owner = player->GetGUID().GetCounter();
|
||||
if (!reserve)
|
||||
{
|
||||
CharacterDatabase.DirectPExecute(
|
||||
"DELETE FROM housing_plot_reservation WHERE OwnerGuid = {} AND NeighborhoodGuid = '{}' "
|
||||
"AND ExteriorMapID = {} AND PlotID = {}",
|
||||
owner, neighborhoodGuid.ToString(), plot.ExteriorMapId, uint32(plotId));
|
||||
return Result::Success;
|
||||
}
|
||||
|
||||
QueryResult occupied = CharacterDatabase.PQuery(
|
||||
"SELECT 1 FROM character_housing WHERE NeighborhoodGuid = '{}' AND PlotID = {} AND OwnerGuid <> {} LIMIT 1",
|
||||
neighborhoodGuid.ToString(), uint32(plotId), owner);
|
||||
if (occupied)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
trans->Append("DELETE FROM housing_plot_reservation WHERE ExpiresAt <= CURRENT_TIMESTAMP");
|
||||
trans->PAppend("DELETE FROM housing_plot_reservation WHERE OwnerGuid = {}", owner);
|
||||
trans->PAppend(
|
||||
"INSERT IGNORE INTO housing_plot_reservation "
|
||||
"(ExteriorMapID, PlotID, OwnerGuid, NeighborhoodGuid, ReservedAt, ExpiresAt) "
|
||||
"VALUES ({}, {}, {}, '{}', CURRENT_TIMESTAMP, DATE_ADD(CURRENT_TIMESTAMP, INTERVAL {} SECOND))",
|
||||
plot.ExteriorMapId, uint32(plotId), owner, neighborhoodGuid.ToString(), PlotReservationLifetimeSeconds);
|
||||
CharacterDatabase.DirectCommitTransaction(trans);
|
||||
|
||||
QueryResult reservation = CharacterDatabase.PQuery(
|
||||
"SELECT OwnerGuid FROM housing_plot_reservation WHERE ExteriorMapID = {} AND PlotID = {} "
|
||||
"AND NeighborhoodGuid = '{}' AND ExpiresAt > CURRENT_TIMESTAMP LIMIT 1",
|
||||
plot.ExteriorMapId, uint32(plotId), neighborhoodGuid.ToString());
|
||||
if (!reservation || reservation->Fetch()[0].GetUInt64() != owner)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
return Result::Success;
|
||||
}
|
||||
|
||||
Result Manager::CommitReservedPlot(Player* player, uint8 plotId, HouseState& state,
|
||||
uint64* chargedCost, bool* moved) const
|
||||
{
|
||||
state = {};
|
||||
if (chargedCost)
|
||||
*chargedCost = 0;
|
||||
if (moved)
|
||||
*moved = false;
|
||||
|
||||
if (!player)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
uint32 const exteriorMapId = GetExteriorMapId(player);
|
||||
QueryResult reservation = CharacterDatabase.PQuery(
|
||||
"SELECT NeighborhoodGuid FROM housing_plot_reservation WHERE ExteriorMapID = {} AND PlotID = {} "
|
||||
"AND OwnerGuid = {} AND ExpiresAt > CURRENT_TIMESTAMP LIMIT 1",
|
||||
exteriorMapId, uint32(plotId), player->GetGUID().GetCounter());
|
||||
if (!reservation)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
ObjectGuid const neighborhoodGuid = ObjectGuid::FromString(reservation->Fetch()[0].GetString());
|
||||
if (!IsNeighborhoodGuid(neighborhoodGuid))
|
||||
{
|
||||
TC_LOG_WARN("housing", "Ignoring malformed Housing reservation neighborhood for character {} and plot {}",
|
||||
player->GetGUID().ToString(), uint32(plotId));
|
||||
return Result::HouseNotFound;
|
||||
}
|
||||
|
||||
return CommitReservedPlot(player, neighborhoodGuid, plotId, state, chargedCost, moved);
|
||||
}
|
||||
|
||||
Result Manager::CommitReservedPlot(Player* player, ObjectGuid const& neighborhoodGuid, uint8 plotId,
|
||||
HouseState& state, uint64* chargedCost, bool* moved) const
|
||||
{
|
||||
state = {};
|
||||
if (chargedCost)
|
||||
*chargedCost = 0;
|
||||
if (moved)
|
||||
*moved = false;
|
||||
|
||||
if (!player || !IsNeighborhoodGuid(neighborhoodGuid))
|
||||
return Result::PermissionDenied;
|
||||
|
||||
PlotState plot;
|
||||
if (LoadPlot(player, plotId, plot) != Result::Success)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
uint64 const owner = player->GetGUID().GetCounter();
|
||||
QueryResult reservation = CharacterDatabase.PQuery(
|
||||
"SELECT 1 FROM housing_plot_reservation WHERE ExteriorMapID = {} AND PlotID = {} "
|
||||
"AND OwnerGuid = {} AND NeighborhoodGuid = '{}' AND ExpiresAt > CURRENT_TIMESTAMP LIMIT 1",
|
||||
plot.ExteriorMapId, uint32(plotId), owner, neighborhoodGuid.ToString());
|
||||
if (!reservation)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
QueryResult occupied = CharacterDatabase.PQuery(
|
||||
"SELECT 1 FROM character_housing WHERE NeighborhoodGuid = '{}' AND PlotID = {} AND OwnerGuid <> {} LIMIT 1",
|
||||
neighborhoodGuid.ToString(), uint32(plotId), owner);
|
||||
if (occupied)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
QueryResult neighborhood = CharacterDatabase.PQuery(
|
||||
"SELECT 1 FROM housing_neighborhood WHERE NeighborhoodGuid = '{}' LIMIT 1",
|
||||
neighborhoodGuid.ToString());
|
||||
if (!neighborhood)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
HouseState current;
|
||||
bool const isMove = LoadOwnedHouse(player, ObjectGuid::Empty, current) == Result::Success;
|
||||
if (isMove && current.NeighborhoodGuid == neighborhoodGuid && current.PlotId == plotId)
|
||||
{
|
||||
CharacterDatabase.DirectPExecute("DELETE FROM housing_plot_reservation WHERE OwnerGuid = {}", owner);
|
||||
state = current;
|
||||
return Result::Success;
|
||||
}
|
||||
|
||||
uint64 const purchaseCost = isMove ? 0 : plot.Cost;
|
||||
if (purchaseCost && player->GetMoney() < purchaseCost)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
ObjectGuid houseGuid = current.HouseGuid;
|
||||
uint8 oldPlotId = current.PlotId;
|
||||
if (!isMove)
|
||||
{
|
||||
houseGuid = ObjectGuid::Create<HighGuid::Housing>(
|
||||
3, uint32(plotId), uint32(owner & 0x7FFF), owner);
|
||||
oldPlotId = plotId;
|
||||
}
|
||||
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
if (isMove)
|
||||
{
|
||||
trans->PAppend(
|
||||
"UPDATE character_housing SET NeighborhoodGuid = '{}', PlotID = {}, ExteriorMapID = {}, ReservationTime = NULL "
|
||||
"WHERE OwnerGuid = {} AND HouseGuid = '{}'",
|
||||
neighborhoodGuid.ToString(), uint32(plotId), plot.ExteriorMapId, owner, houseGuid.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
trans->PAppend(
|
||||
"INSERT INTO character_housing "
|
||||
"(OwnerGuid, HouseGuid, CosmeticOwnerGuid, NeighborhoodGuid, PlotID, ExteriorMapID, HouseSettingFlags, ReservationTime) "
|
||||
"VALUES ({}, '{}', '{}', '{}', {}, {}, 0, NULL)",
|
||||
owner, houseGuid.ToString(), player->GetGUID().ToString(), neighborhoodGuid.ToString(),
|
||||
uint32(plotId), plot.ExteriorMapId);
|
||||
}
|
||||
|
||||
trans->PAppend(
|
||||
"INSERT INTO housing_plot_transaction "
|
||||
"(OwnerGuid, HouseGuid, NeighborhoodGuid, OldPlotID, NewPlotID, ExteriorMapID, Cost, TransactionType) "
|
||||
"VALUES ({}, '{}', '{}', {}, {}, {}, {}, {})",
|
||||
owner, houseGuid.ToString(), neighborhoodGuid.ToString(), uint32(oldPlotId), uint32(plotId),
|
||||
plot.ExteriorMapId, purchaseCost, uint32(isMove ? PlotTransactionType::Move : PlotTransactionType::Purchase));
|
||||
trans->PAppend("DELETE FROM housing_plot_reservation WHERE OwnerGuid = {}", owner);
|
||||
CharacterDatabase.DirectCommitTransaction(trans);
|
||||
|
||||
if (purchaseCost)
|
||||
player->ModifyMoney(-int64(purchaseCost));
|
||||
|
||||
state.HouseGuid = houseGuid;
|
||||
state.CosmeticOwnerGuid = isMove ? current.CosmeticOwnerGuid : player->GetGUID();
|
||||
state.NeighborhoodGuid = neighborhoodGuid;
|
||||
state.PlotId = plotId;
|
||||
state.ExteriorMapId = plot.ExteriorMapId;
|
||||
state.SettingsFlags = isMove ? current.SettingsFlags : 0;
|
||||
|
||||
if (chargedCost)
|
||||
*chargedCost = purchaseCost;
|
||||
if (moved)
|
||||
*moved = isMove;
|
||||
return Result::Success;
|
||||
}
|
||||
|
||||
Result Manager::RelinquishOwnedHouse(Player const* player, ObjectGuid const& houseGuid, HouseState* previousState) const
|
||||
{
|
||||
HouseState state;
|
||||
Result const loadResult = LoadOwnedHouse(player, houseGuid, state);
|
||||
if (loadResult != Result::Success)
|
||||
return loadResult;
|
||||
|
||||
if (previousState)
|
||||
*previousState = state;
|
||||
|
||||
uint64 const owner = player->GetGUID().GetCounter();
|
||||
std::string const houseGuidString = state.HouseGuid.ToString();
|
||||
std::string const neighborhoodGuidString = state.NeighborhoodGuid.ToString();
|
||||
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
trans->PAppend(
|
||||
"UPDATE housing_decor_instance i INNER JOIN housing_placed_decor p ON p.DecorGuid = i.DecorGuid "
|
||||
"SET i.HouseGuid = '', i.PlacementStatus = 0 WHERE p.HouseGuid = '{}'",
|
||||
houseGuidString);
|
||||
trans->PAppend("DELETE FROM housing_placed_decor WHERE HouseGuid = '{}'", houseGuidString);
|
||||
trans->PAppend("DELETE FROM housing_room_component_entity WHERE HouseGuid = '{}'", houseGuidString);
|
||||
trans->PAppend("DELETE FROM housing_fixture_entity WHERE HouseGuid = '{}'", houseGuidString);
|
||||
trans->PAppend("DELETE FROM housing_room_entity WHERE HouseGuid = '{}'", houseGuidString);
|
||||
trans->PAppend("DELETE FROM character_housing_permission WHERE HouseGuid = '{}'", houseGuidString);
|
||||
trans->PAppend("DELETE FROM housing_plot_reservation WHERE OwnerGuid = {}", owner);
|
||||
trans->PAppend(
|
||||
"INSERT INTO housing_plot_transaction "
|
||||
"(OwnerGuid, HouseGuid, NeighborhoodGuid, OldPlotID, NewPlotID, ExteriorMapID, Cost, TransactionType) "
|
||||
"VALUES ({}, '{}', '{}', {}, {}, {}, 0, {})",
|
||||
owner, houseGuidString, neighborhoodGuidString, uint32(state.PlotId), uint32(state.PlotId),
|
||||
state.ExteriorMapId, uint32(PlotTransactionType::Relinquish));
|
||||
trans->PAppend("DELETE FROM character_housing WHERE OwnerGuid = {} AND HouseGuid = '{}'", owner, houseGuidString);
|
||||
CharacterDatabase.DirectCommitTransaction(trans);
|
||||
|
||||
// Neighborhood lifetime is intentionally not coupled to a single house. Shared,
|
||||
// guild and charter neighborhoods can temporarily have zero houses and must not
|
||||
// be deleted as a side effect of relinquishing one player's house.
|
||||
return Result::Success;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#ifndef TRINITYCORE_HOUSING_MGR_H
|
||||
#define TRINITYCORE_HOUSING_MGR_H
|
||||
|
||||
#include "Define.h"
|
||||
#include "HousingDefines.h"
|
||||
#include "HousingState.h"
|
||||
#include <vector>
|
||||
|
||||
class Player;
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
class TC_GAME_API Manager
|
||||
{
|
||||
public:
|
||||
static Manager& Instance();
|
||||
|
||||
uint32 GetExteriorMapId(Player const* player) const;
|
||||
bool IsPlayerOnHousingExterior(Player const* player, uint32* exteriorMapId = nullptr) const;
|
||||
|
||||
Result LoadOwnedHouse(Player const* player, ObjectGuid const& requestedHouse, HouseState& state) const;
|
||||
std::vector<HouseState> LoadOwnedHouses(Player const* player) const;
|
||||
Result LoadPlot(Player const* player, uint8 plotId, PlotState& state) const;
|
||||
|
||||
Result UpdateOwnedHouseSettings(Player const* player, ObjectGuid const& houseGuid, uint32 settingsFlags, HouseState& state) const;
|
||||
Result ReservePlot(Player const* player, ObjectGuid const& neighborhoodGuid, uint8 plotId, bool reserve) const;
|
||||
Result CommitReservedPlot(Player* player, uint8 plotId, HouseState& state,
|
||||
uint64* chargedCost = nullptr, bool* moved = nullptr) const;
|
||||
Result CommitReservedPlot(Player* player, ObjectGuid const& neighborhoodGuid, uint8 plotId,
|
||||
HouseState& state, uint64* chargedCost = nullptr, bool* moved = nullptr) const;
|
||||
Result RelinquishOwnedHouse(Player const* player, ObjectGuid const& houseGuid, HouseState* previousState = nullptr) const;
|
||||
|
||||
private:
|
||||
Manager() = default;
|
||||
};
|
||||
}
|
||||
|
||||
#define sHousingMgr Housing::Manager::Instance()
|
||||
|
||||
#endif // TRINITYCORE_HOUSING_MGR_H
|
||||
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#include "HousingRoomPersistence.h"
|
||||
#include "DB2Stores.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "HousingMgr.h"
|
||||
#include "Log.h"
|
||||
#include "Player.h"
|
||||
#include <cmath>
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
namespace
|
||||
{
|
||||
// HouseRoom.db2, FileDataID 5163003, verified for WoW 12.1.0.69587.
|
||||
// Keep persisted/client supplied room ids fail-closed if generated metadata
|
||||
// drifts to another layout or the store was not actually loaded.
|
||||
constexpr uint32 HouseRoomLayoutHash69587 = 0xF04DC279;
|
||||
|
||||
RoomState ReadRoomState(Field* fields)
|
||||
{
|
||||
RoomState state;
|
||||
state.RoomGuid = ObjectGuid::FromString(fields[0].GetString());
|
||||
state.HouseGuid = ObjectGuid::FromString(fields[1].GetString());
|
||||
state.HouseRoomId = fields[2].GetInt32();
|
||||
state.Flags = fields[3].GetInt32();
|
||||
state.PositionX = fields[4].GetFloat();
|
||||
state.PositionY = fields[5].GetFloat();
|
||||
state.PositionZ = fields[6].GetFloat();
|
||||
state.RotationX = fields[7].GetFloat();
|
||||
state.RotationY = fields[8].GetFloat();
|
||||
state.RotationZ = fields[9].GetFloat();
|
||||
state.RotationW = fields[10].GetFloat();
|
||||
state.Scale = fields[11].GetFloat();
|
||||
state.AttachmentFlags = fields[12].GetUInt8();
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
RoomPersistence& RoomPersistence::Instance()
|
||||
{
|
||||
static RoomPersistence instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
bool RoomPersistence::IsSafePersistedRoom(RoomState const& state) const
|
||||
{
|
||||
if (!IsRoomGuid(state.RoomGuid) || !IsHouseGuid(state.HouseGuid) || state.HouseRoomId <= 0)
|
||||
return false;
|
||||
|
||||
if (!std::isfinite(state.PositionX) || !std::isfinite(state.PositionY) || !std::isfinite(state.PositionZ) ||
|
||||
!std::isfinite(state.RotationX) || !std::isfinite(state.RotationY) || !std::isfinite(state.RotationZ) ||
|
||||
!std::isfinite(state.RotationW) || !std::isfinite(state.Scale) || state.Scale < 0.01f || state.Scale > 100.0f)
|
||||
return false;
|
||||
|
||||
float const rotationLengthSquared =
|
||||
state.RotationX * state.RotationX + state.RotationY * state.RotationY +
|
||||
state.RotationZ * state.RotationZ + state.RotationW * state.RotationW;
|
||||
|
||||
return std::isfinite(rotationLengthSquared) && rotationLengthSquared > 0.000001f &&
|
||||
rotationLengthSquared < 4.0f;
|
||||
}
|
||||
|
||||
bool RoomPersistence::IsRoomTemplateStoreReady() const
|
||||
{
|
||||
// DB2StorageBase starts with tableHash=0 and receives the real hash only
|
||||
// after Load(). The explicit layout guard prevents a future generated-data
|
||||
// drift from turning client-controlled HouseRoom ids into trusted template ids.
|
||||
return sHouseRoomStore.GetLayoutHash() == HouseRoomLayoutHash69587 &&
|
||||
sHouseRoomStore.GetTableHash() != 0 &&
|
||||
sHouseRoomStore.GetNumRows() != 0;
|
||||
}
|
||||
|
||||
bool RoomPersistence::IsKnownRoomTemplate(uint32 houseRoomId) const
|
||||
{
|
||||
return houseRoomId != 0 && IsRoomTemplateStoreReady() && sHouseRoomStore.LookupEntry(houseRoomId) != nullptr;
|
||||
}
|
||||
|
||||
std::vector<RoomState> RoomPersistence::LoadOwnedRooms(Player const* player, ObjectGuid const& houseGuid) const
|
||||
{
|
||||
std::vector<RoomState> rooms;
|
||||
if (!player || !IsHouseGuid(houseGuid))
|
||||
return rooms;
|
||||
|
||||
HouseState house;
|
||||
if (sHousingMgr.LoadOwnedHouse(player, houseGuid, house) != Result::Success)
|
||||
return rooms;
|
||||
|
||||
rooms.reserve(SafetyMaxRoomsPerHouse);
|
||||
QueryResult result = CharacterDatabase.PQuery(
|
||||
"SELECT RoomGuid, HouseGuid, HouseRoomID, Flags, PositionX, PositionY, PositionZ, "
|
||||
"RotationX, RotationY, RotationZ, RotationW, Scale, AttachmentFlags "
|
||||
"FROM housing_room_entity WHERE HouseGuid = '{}' ORDER BY RoomGuid LIMIT {}",
|
||||
house.HouseGuid.ToString(), SafetyMaxRoomsPerHouse + 1);
|
||||
if (!result)
|
||||
return rooms;
|
||||
|
||||
do
|
||||
{
|
||||
if (rooms.size() >= SafetyMaxRoomsPerHouse)
|
||||
{
|
||||
TC_LOG_WARN("housing", "House {} has more than {} persisted rooms; ignoring the remainder",
|
||||
house.HouseGuid.ToString(), SafetyMaxRoomsPerHouse);
|
||||
break;
|
||||
}
|
||||
|
||||
RoomState state = ReadRoomState(result->Fetch());
|
||||
if (state.HouseGuid != house.HouseGuid || !IsSafePersistedRoom(state))
|
||||
{
|
||||
TC_LOG_WARN("housing", "Ignoring malformed persisted room {} for owned house {}",
|
||||
state.RoomGuid.ToString(), house.HouseGuid.ToString());
|
||||
continue;
|
||||
}
|
||||
|
||||
rooms.push_back(state);
|
||||
} while (result->NextRow());
|
||||
|
||||
return rooms;
|
||||
}
|
||||
|
||||
Result RoomPersistence::LoadOwnedRoom(Player const* player, ObjectGuid const& roomGuid, RoomState& state) const
|
||||
{
|
||||
state = {};
|
||||
if (!player || !IsRoomGuid(roomGuid))
|
||||
return Result::HouseNotFound;
|
||||
|
||||
QueryResult result = CharacterDatabase.PQuery(
|
||||
"SELECT RoomGuid, HouseGuid, HouseRoomID, Flags, PositionX, PositionY, PositionZ, "
|
||||
"RotationX, RotationY, RotationZ, RotationW, Scale, AttachmentFlags "
|
||||
"FROM housing_room_entity WHERE RoomGuid = '{}' LIMIT 1",
|
||||
roomGuid.ToString());
|
||||
if (!result)
|
||||
return Result::HouseNotFound;
|
||||
|
||||
RoomState candidate = ReadRoomState(result->Fetch());
|
||||
if (candidate.RoomGuid != roomGuid || !IsSafePersistedRoom(candidate))
|
||||
{
|
||||
TC_LOG_WARN("housing", "Rejecting malformed persisted Housing room {}", roomGuid.ToString());
|
||||
return Result::HouseNotFound;
|
||||
}
|
||||
|
||||
HouseState house;
|
||||
Result const ownership = sHousingMgr.LoadOwnedHouse(player, candidate.HouseGuid, house);
|
||||
if (ownership != Result::Success)
|
||||
return Result::PermissionDenied;
|
||||
|
||||
state = candidate;
|
||||
return Result::Success;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#ifndef TRINITYCORE_HOUSING_ROOM_PERSISTENCE_H
|
||||
#define TRINITYCORE_HOUSING_ROOM_PERSISTENCE_H
|
||||
|
||||
#include "Define.h"
|
||||
#include "HousingDefines.h"
|
||||
#include "HousingState.h"
|
||||
#include <vector>
|
||||
|
||||
class Player;
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
// Read/validation layer for housing_room_entity. Stage 5 deliberately keeps
|
||||
// room mutation and opcode activation out until HouseRoom client data is safe
|
||||
// for build 12.1.0.69587.
|
||||
class TC_GAME_API RoomPersistence
|
||||
{
|
||||
public:
|
||||
static RoomPersistence& Instance();
|
||||
|
||||
std::vector<RoomState> LoadOwnedRooms(Player const* player, ObjectGuid const& houseGuid) const;
|
||||
Result LoadOwnedRoom(Player const* player, ObjectGuid const& roomGuid, RoomState& state) const;
|
||||
|
||||
bool IsSafePersistedRoom(RoomState const& state) const;
|
||||
|
||||
// Fail-closed gate for future room mutation handlers. The DB2Storage table
|
||||
// hash is assigned only after a successful load, so a disabled/stale
|
||||
// HouseRoom store can never be mistaken for ready client data.
|
||||
bool IsRoomTemplateStoreReady() const;
|
||||
bool IsKnownRoomTemplate(uint32 houseRoomId) const;
|
||||
|
||||
private:
|
||||
RoomPersistence() = default;
|
||||
};
|
||||
}
|
||||
|
||||
#define sHousingRoomPersistence Housing::RoomPersistence::Instance()
|
||||
|
||||
#endif // TRINITYCORE_HOUSING_ROOM_PERSISTENCE_H
|
||||
@@ -0,0 +1,685 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#include "HousingSessionLifecycle.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "HousingDynamicEntity.h"
|
||||
#include "HousingMgr.h"
|
||||
#include "HousingPackets.h"
|
||||
#include "Log.h"
|
||||
#include "Map.h"
|
||||
#include "Opcodes.h"
|
||||
#include "Player.h"
|
||||
#include "WorldSession.h"
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
namespace
|
||||
{
|
||||
template<class PacketClass, void(*HandlerFunction)(WorldSession*, PacketClass&)>
|
||||
void CallSessionHandler(WorldSession* session, WorldPacket& packet)
|
||||
{
|
||||
std::remove_cv_t<PacketClass> nicePacket(std::move(packet));
|
||||
nicePacket.Read();
|
||||
HandlerFunction(session, nicePacket);
|
||||
session->LogUnprocessedTail(nicePacket.GetRawPacket());
|
||||
}
|
||||
|
||||
bool InstallClientHandler(OpcodeClient opcode, SessionStatus status, PacketProcessing processing,
|
||||
ClientOpcodeHandler::HandlerFunction call)
|
||||
{
|
||||
ClientOpcodeHandler const* existing = opcodeTable[opcode];
|
||||
if (!existing)
|
||||
{
|
||||
TC_LOG_ERROR("housing", "Cannot install Housing route for missing client opcode {}",
|
||||
GetOpcodeNameForLogging(opcode));
|
||||
return false;
|
||||
}
|
||||
|
||||
// OpcodeTable exposes immutable lookup entries outside Opcodes.cpp. This
|
||||
// startup-only installer runs after OpcodeTable::Initialize and before the
|
||||
// world listener opens; the underlying entry itself is not const.
|
||||
ClientOpcodeHandler* handler = const_cast<ClientOpcodeHandler*>(existing);
|
||||
handler->Status = status;
|
||||
handler->ProcessingPlace = processing;
|
||||
handler->Call = call;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool EnableServerOpcode(OpcodeServer opcode)
|
||||
{
|
||||
ServerOpcodeHandler const* existing = opcodeTable[opcode];
|
||||
if (!existing)
|
||||
{
|
||||
TC_LOG_ERROR("housing", "Cannot enable missing Housing server opcode {}",
|
||||
GetOpcodeNameForLogging(opcode));
|
||||
return false;
|
||||
}
|
||||
|
||||
ServerOpcodeHandler* handler = const_cast<ServerOpcodeHandler*>(existing);
|
||||
handler->Status = STATUS_NEVER;
|
||||
return true;
|
||||
}
|
||||
|
||||
uint8 ToPacketResult(Result result)
|
||||
{
|
||||
return static_cast<uint8>(result);
|
||||
}
|
||||
|
||||
WorldPackets::Housing::HouseInfo ToPacketHouse(HouseState const& state)
|
||||
{
|
||||
WorldPackets::Housing::HouseInfo house;
|
||||
house.GUID = state.HouseGuid;
|
||||
house.CosmeticOwner = state.CosmeticOwnerGuid;
|
||||
house.NeighborhoodGUID = state.NeighborhoodGuid;
|
||||
house.PlotID = state.PlotId;
|
||||
house.HouseSettingFlags = state.SettingsFlags;
|
||||
if (state.HasReservationTime)
|
||||
house.ReservationTime = time_t(state.ReservationTime);
|
||||
return house;
|
||||
}
|
||||
|
||||
std::vector<WorldPackets::Housing::HouseInfo> LoadPersistedHousesForOwner(ObjectGuid const& ownerGuid)
|
||||
{
|
||||
std::vector<WorldPackets::Housing::HouseInfo> houses;
|
||||
if (!ownerGuid.IsPlayer())
|
||||
return houses;
|
||||
|
||||
houses.reserve(SafetyMaxOwnedHousesPerCharacter);
|
||||
QueryResult result = CharacterDatabase.PQuery(
|
||||
"SELECT HouseGuid, CosmeticOwnerGuid, NeighborhoodGuid, PlotID, HouseSettingFlags, ReservationTime "
|
||||
"FROM character_housing WHERE OwnerGuid = {} ORDER BY PlotID, HouseGuid LIMIT {}",
|
||||
ownerGuid.GetCounter(), SafetyMaxOwnedHousesPerCharacter + 1);
|
||||
if (!result)
|
||||
return houses;
|
||||
|
||||
do
|
||||
{
|
||||
if (houses.size() >= SafetyMaxOwnedHousesPerCharacter)
|
||||
break;
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
WorldPackets::Housing::HouseInfo house;
|
||||
house.GUID = ObjectGuid::FromString(fields[0].GetString());
|
||||
house.CosmeticOwner = ObjectGuid::FromString(fields[1].GetString());
|
||||
house.NeighborhoodGUID = ObjectGuid::FromString(fields[2].GetString());
|
||||
if (!IsHouseGuid(house.GUID) || !house.CosmeticOwner.IsPlayer() ||
|
||||
!IsNeighborhoodGuid(house.NeighborhoodGUID))
|
||||
continue;
|
||||
|
||||
house.PlotID = fields[3].GetUInt8();
|
||||
house.HouseSettingFlags = fields[4].GetUInt32() & HouseSettingsValidMask;
|
||||
if (!fields[5].IsNull())
|
||||
house.ReservationTime = time_t(fields[5].GetUInt64());
|
||||
houses.push_back(std::move(house));
|
||||
} while (result->NextRow());
|
||||
|
||||
return houses;
|
||||
}
|
||||
|
||||
void SendHouseEntityGraph(WorldSession* session, Player* player, HouseState const& house)
|
||||
{
|
||||
if (!session || !player || !player->IsInWorld())
|
||||
return;
|
||||
|
||||
if (!session->ShouldSendHousingEntityCreate(house.HouseGuid, player->GetMapId(), player->GetInstanceId()))
|
||||
return;
|
||||
|
||||
SendPlayerHouseCreate(player, house.HouseGuid, session->GetBattlenetAccountGUID(),
|
||||
house.CosmeticOwnerGuid, int32(house.PlotId), 1, 0);
|
||||
SendHouseDynamicEntities(player, house.HouseGuid, house.PlotId);
|
||||
}
|
||||
|
||||
void CollectEntityGuids(QueryResult result, uint32 limit, bool roomEntity, std::vector<ObjectGuid>& output)
|
||||
{
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
uint32 added = 0;
|
||||
do
|
||||
{
|
||||
if (added >= limit)
|
||||
break;
|
||||
|
||||
ObjectGuid const guid = ObjectGuid::FromString(result->Fetch()[0].GetString());
|
||||
if (guid.IsEmpty())
|
||||
continue;
|
||||
|
||||
if (roomEntity)
|
||||
{
|
||||
if (guid.GetHigh() != HighGuid::Housing)
|
||||
continue;
|
||||
}
|
||||
else if (!IsHousingAttachmentGuid(guid))
|
||||
continue;
|
||||
|
||||
output.push_back(guid);
|
||||
++added;
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
void CollectPersistedLiveEntities(HouseState const& house, std::vector<ObjectGuid>& rooms,
|
||||
std::vector<ObjectGuid>& dynamicEntities)
|
||||
{
|
||||
std::string const houseGuid = house.HouseGuid.ToString();
|
||||
|
||||
CollectEntityGuids(CharacterDatabase.PQuery(
|
||||
"SELECT RoomGuid FROM housing_room_entity WHERE HouseGuid = '{}' ORDER BY RoomGuid LIMIT {}",
|
||||
houseGuid, SafetyMaxRoomsPerHouse), SafetyMaxRoomsPerHouse, true, rooms);
|
||||
|
||||
CollectEntityGuids(CharacterDatabase.PQuery(
|
||||
"SELECT EntityGuid FROM housing_room_component_entity WHERE HouseGuid = '{}' ORDER BY EntityGuid LIMIT {}",
|
||||
houseGuid, SafetyMaxRoomComponentsPerHouse), SafetyMaxRoomComponentsPerHouse, false, dynamicEntities);
|
||||
|
||||
CollectEntityGuids(CharacterDatabase.PQuery(
|
||||
"SELECT EntityGuid FROM housing_fixture_entity WHERE HouseGuid = '{}' ORDER BY EntityGuid LIMIT {}",
|
||||
houseGuid, SafetyMaxFixturesPerHouse), SafetyMaxFixturesPerHouse, false, dynamicEntities);
|
||||
|
||||
CollectEntityGuids(CharacterDatabase.PQuery(
|
||||
"SELECT EntityGuid FROM housing_placed_decor WHERE HouseGuid = '{}' AND EntityGuid IS NOT NULL "
|
||||
"ORDER BY EntityGuid LIMIT {}",
|
||||
houseGuid, SafetyMaxPlacedDecorPerHouse), SafetyMaxPlacedDecorPerHouse, false, dynamicEntities);
|
||||
}
|
||||
|
||||
void RemoveLiveHouseEntities(Player* player, HouseState const& house,
|
||||
std::vector<ObjectGuid> const& rooms, std::vector<ObjectGuid> const& dynamicEntities)
|
||||
{
|
||||
if (!player || !player->IsInWorld())
|
||||
return;
|
||||
|
||||
Map* map = player->GetMap();
|
||||
if (!map)
|
||||
return;
|
||||
|
||||
// Remove attachment children before their room/house parents. Map owns
|
||||
// every live object lifetime; never delete Housing world objects directly.
|
||||
for (ObjectGuid const& guid : dynamicEntities)
|
||||
map->RemoveHousingDynamicEntity(guid);
|
||||
|
||||
for (ObjectGuid const& guid : rooms)
|
||||
if (Housing::RoomWorldEntity* room = map->GetHousingRoomEntity(guid))
|
||||
map->RemoveFromMap(room, true);
|
||||
|
||||
map->RemoveHousingDynamicEntity(house.HouseGuid);
|
||||
}
|
||||
|
||||
void SynchronizeExteriorPlot(Player* player, HouseState const& house, bool owned)
|
||||
{
|
||||
if (!player || !player->IsInWorld() || player->GetMapId() != house.ExteriorMapId)
|
||||
return;
|
||||
|
||||
Map* map = player->GetMap();
|
||||
if (!map)
|
||||
return;
|
||||
|
||||
map->SetHousingPlotOwnershipState(house.PlotId, owned);
|
||||
map->RefreshHousingPlotHouseDoor(house.PlotId);
|
||||
}
|
||||
|
||||
void SynchronizeExteriorMove(Player* player, HouseState const& previousState, HouseState const& newState)
|
||||
{
|
||||
if (!player || !player->IsInWorld() || player->GetMapId() != newState.ExteriorMapId)
|
||||
return;
|
||||
|
||||
Map* map = player->GetMap();
|
||||
if (!map)
|
||||
return;
|
||||
|
||||
if (previousState.PlotId != newState.PlotId)
|
||||
{
|
||||
map->SetHousingPlotOwnershipState(previousState.PlotId, false);
|
||||
map->RefreshHousingPlotHouseDoor(previousState.PlotId);
|
||||
}
|
||||
|
||||
map->SetHousingPlotOwnershipState(newState.PlotId, true);
|
||||
map->RefreshHousingPlotHouseDoor(newState.PlotId);
|
||||
}
|
||||
}
|
||||
|
||||
bool InstallSessionOpcodeHandlers()
|
||||
{
|
||||
static bool installed = false;
|
||||
if (installed)
|
||||
return true;
|
||||
|
||||
bool success = true;
|
||||
|
||||
#define INSTALL_HOUSING_CLIENT(opcode, status, processing, packetClass, handler) \
|
||||
success = InstallClientHandler(opcode, status, processing, \
|
||||
&CallSessionHandler<packetClass, handler>) && success
|
||||
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_DECOR_SET_EDIT_MODE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HousingDecorSetEditMode, &Housing::HandleDecorSetEditMode);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_GET_CURRENT_HOUSE_INFO, STATUS_AUTHED, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::GetCurrentHouseInfo, &Housing::HandleGetCurrentHouseInfo);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_GET_PLAYER_PERMISSIONS, STATUS_AUTHED, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::GetPlayerPermissions, &Housing::HandleGetPlayerPermissions);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_HOUSE_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HouseStatus, &Housing::HandleHouseStatus);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_GET_HOUSE_FINDER_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HousingGetHouseFinderInfo, &Housing::HandleGetHouseFinderInfo);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_GET_PLAYER_HOUSES_INFO, STATUS_AUTHED, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::GetPlayerHousesInfo, &Housing::HandleGetPlayerHousesInfo);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_NEIGHBORHOOD_RESERVE_PLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HousingReservePlot, &Housing::HandleReservePlot);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_BY_PLAYER, STATUS_AUTHED, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::PlayerViewHousesByPlayer, &Housing::HandlePlayerViewHousesByPlayer);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_RELINQUISH_HOUSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HousingRelinquishHouse, &Housing::HandleRelinquishHouse);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_TELEPORT_TO_PLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HousingTeleportToPlot, &Housing::HandleTeleportToPlot);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_HOUSING_SVCS_UPDATE_HOUSE_SETTINGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::HousingUpdateHouseSettings, &Housing::HandleUpdateHouseSettings);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_NEIGHBORHOOD_BUY_HOUSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::NeighborhoodBuyHouse, &Housing::HandleBuyHouse);
|
||||
INSTALL_HOUSING_CLIENT(CMSG_NEIGHBORHOOD_MOVE_HOUSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE,
|
||||
WorldPackets::Housing::NeighborhoodMoveHouse, &Housing::HandleMoveHouse);
|
||||
|
||||
#undef INSTALL_HOUSING_CLIENT
|
||||
|
||||
success = EnableServerOpcode(SMSG_HOUSING_DECOR_SET_EDIT_MODE_RESPONSE) && success;
|
||||
success = EnableServerOpcode(SMSG_HOUSING_SVCS_RELINQUISH_HOUSE_RESPONSE) && success;
|
||||
success = EnableServerOpcode(SMSG_HOUSING_SVCS_UPDATE_HOUSE_SETTINGS_RESPONSE) && success;
|
||||
|
||||
if (success)
|
||||
{
|
||||
installed = true;
|
||||
TC_LOG_INFO("housing", "Installed manager-backed Housing session lifecycle routes");
|
||||
}
|
||||
else
|
||||
TC_LOG_ERROR("housing", "Housing session lifecycle route installation was incomplete");
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
void HandleGetCurrentHouseInfo(WorldSession* session, WorldPackets::Housing::GetCurrentHouseInfo& /*packet*/)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::GetCurrentHouseInfoResponse response;
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
|
||||
HouseState state;
|
||||
if (sHousingMgr.LoadOwnedHouse(session->GetPlayer(), ObjectGuid::Empty, state) == Result::Success)
|
||||
{
|
||||
response.House = ToPacketHouse(state);
|
||||
response.Result = ToPacketResult(Result::Success);
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleGetPlayerPermissions(WorldSession* session, WorldPackets::Housing::GetPlayerPermissions& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::GetPlayerPermissionsResponse response;
|
||||
ObjectGuid const requestedHouse = packet.HasHouseGUID ? packet.HouseGUID : ObjectGuid::Empty;
|
||||
|
||||
HouseState state;
|
||||
Result const result = sHousingMgr.LoadOwnedHouse(session->GetPlayer(), requestedHouse, state);
|
||||
if (result == Result::Success)
|
||||
{
|
||||
response.HouseGUID = state.HouseGuid;
|
||||
response.Result = ToPacketResult(Result::Success);
|
||||
response.PermissionData = 0;
|
||||
}
|
||||
else
|
||||
response.Result = ToPacketResult(packet.HasHouseGUID ? Result::PermissionDenied : Result::HouseNotFound);
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleHouseStatus(WorldSession* session, WorldPackets::Housing::HouseStatus& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
// Preserve WorldSession's edit-mode flags without allowing the legacy
|
||||
// handler to auto-create ownership. Once a real house is verified, the
|
||||
// existing status serializer is safe to reuse.
|
||||
HouseState state;
|
||||
if (sHousingMgr.LoadOwnedHouse(session->GetPlayer(), ObjectGuid::Empty, state) == Result::Success)
|
||||
{
|
||||
session->HandleHousingHouseStatus(packet);
|
||||
return;
|
||||
}
|
||||
|
||||
WorldPackets::Housing::HouseStatusResponse response;
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandlePlayerViewHousesByPlayer(WorldSession* session, WorldPackets::Housing::PlayerViewHousesByPlayer& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::PlayerViewHousesResponse response;
|
||||
response.Result = ToPacketResult(Result::Success);
|
||||
|
||||
if (!packet.TargetPlayerGUID.IsPlayer())
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
else if (Player* player = session->GetPlayer(); player && packet.TargetPlayerGUID == player->GetGUID())
|
||||
{
|
||||
for (HouseState const& state : sHousingMgr.LoadOwnedHouses(player))
|
||||
response.TargetHouses.push_back(ToPacketHouse(state));
|
||||
}
|
||||
else
|
||||
response.TargetHouses = LoadPersistedHousesForOwner(packet.TargetPlayerGUID);
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleGetPlayerHousesInfo(WorldSession* session, WorldPackets::Housing::GetPlayerHousesInfo& /*packet*/)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::GetPlayerHousesInfoResponse response;
|
||||
response.Result = ToPacketResult(Result::Success);
|
||||
|
||||
if (Player* player = session->GetPlayer())
|
||||
{
|
||||
for (HouseState const& state : sHousingMgr.LoadOwnedHouses(player))
|
||||
{
|
||||
response.PlayerHouses.push_back(ToPacketHouse(state));
|
||||
SendHouseEntityGraph(session, player, state);
|
||||
}
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleBuyHouse(WorldSession* session, WorldPackets::Housing::NeighborhoodBuyHouse& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::NeighborhoodBuyHouseResponse response;
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
if (!player || !sHousingMgr.IsPlayerOnHousingExterior(player))
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
Map* map = player->GetMap();
|
||||
int32 const targetPlot = map ? map->GetHousingPlotIdByCornerstoneGuid(packet.CornerstoneGUID) : -1;
|
||||
if (targetPlot < 0 || targetPlot > std::numeric_limits<uint8>::max())
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
HouseState previousState;
|
||||
bool const hadHouse = sHousingMgr.LoadOwnedHouse(player, ObjectGuid::Empty, previousState) == Result::Success;
|
||||
if (hadHouse && !packet.HouseGUID.IsEmpty() && packet.HouseGUID != previousState.HouseGuid)
|
||||
{
|
||||
response.Result = ToPacketResult(Result::PermissionDenied);
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
HouseState state;
|
||||
bool moved = false;
|
||||
Result const result = sHousingMgr.CommitReservedPlot(player, uint8(targetPlot), state, nullptr, &moved);
|
||||
response.Result = ToPacketResult(result);
|
||||
if (result == Result::Success)
|
||||
{
|
||||
response.House = ToPacketHouse(state);
|
||||
if (moved && hadHouse)
|
||||
SynchronizeExteriorMove(player, previousState, state);
|
||||
else
|
||||
SynchronizeExteriorPlot(player, state, true);
|
||||
SendHouseEntityGraph(session, player, state);
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleMoveHouse(WorldSession* session, WorldPackets::Housing::NeighborhoodMoveHouse& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::NeighborhoodMoveHouseResponse response;
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
HouseState previousState;
|
||||
if (!player || !sHousingMgr.IsPlayerOnHousingExterior(player) ||
|
||||
sHousingMgr.LoadOwnedHouse(player, packet.HouseGUID, previousState) != Result::Success)
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
Map* map = player->GetMap();
|
||||
int32 const targetPlot = map ? map->GetHousingPlotIdByCornerstoneGuid(packet.CornerstoneGUID) : -1;
|
||||
if (targetPlot < 0 || targetPlot > std::numeric_limits<uint8>::max() ||
|
||||
uint8(targetPlot) == previousState.PlotId)
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
HouseState state;
|
||||
bool moved = false;
|
||||
Result result = sHousingMgr.CommitReservedPlot(player, uint8(targetPlot), state, nullptr, &moved);
|
||||
if (result == Result::Success && !moved)
|
||||
result = Result::PermissionDenied;
|
||||
|
||||
response.Result = ToPacketResult(result);
|
||||
if (result == Result::Success)
|
||||
{
|
||||
response.House = ToPacketHouse(state);
|
||||
response.MoveTransactionGUID = ObjectGuid::Create<HighGuid::Housing>(
|
||||
6, state.ExteriorMapId, uint32(state.PlotId), player->GetGUID().GetCounter());
|
||||
SynchronizeExteriorMove(player, previousState, state);
|
||||
SendHouseEntityGraph(session, player, state);
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleGetHouseFinderInfo(WorldSession* session, WorldPackets::Housing::HousingGetHouseFinderInfo& /*packet*/)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::HousingGetHouseFinderInfoResponse response;
|
||||
response.Result = ToPacketResult(Result::Success);
|
||||
|
||||
if (Player* player = session->GetPlayer())
|
||||
{
|
||||
for (HouseState const& state : sHousingMgr.LoadOwnedHouses(player))
|
||||
{
|
||||
auto itr = std::find_if(response.Neighborhoods.begin(), response.Neighborhoods.end(),
|
||||
[&state](WorldPackets::Housing::HouseFinderNeighborhoodInfo const& entry)
|
||||
{
|
||||
return entry.NeighborhoodGUID == state.NeighborhoodGuid;
|
||||
});
|
||||
|
||||
if (itr == response.Neighborhoods.end())
|
||||
{
|
||||
WorldPackets::Housing::HouseFinderNeighborhoodInfo neighborhood;
|
||||
neighborhood.NeighborhoodGUID = state.NeighborhoodGuid;
|
||||
response.Neighborhoods.push_back(std::move(neighborhood));
|
||||
itr = std::prev(response.Neighborhoods.end());
|
||||
}
|
||||
|
||||
itr->Houses.push_back(ToPacketHouse(state));
|
||||
itr->Population = uint32(itr->Houses.size());
|
||||
}
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleTeleportToPlot(WorldSession* session, WorldPackets::Housing::HousingTeleportToPlot& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
if (!player || packet.OwnerGUID != player->GetGUID() || packet.PlotIndex > std::numeric_limits<uint8>::max())
|
||||
return;
|
||||
|
||||
HouseState house;
|
||||
if (sHousingMgr.LoadOwnedHouse(player, ObjectGuid::Empty, house) != Result::Success ||
|
||||
packet.NeighborhoodGUID != house.NeighborhoodGuid || packet.PlotIndex != uint32(house.PlotId))
|
||||
return;
|
||||
|
||||
PlotState plot;
|
||||
if (sHousingMgr.LoadPlot(player, house.PlotId, plot) != Result::Success)
|
||||
return;
|
||||
|
||||
player->TeleportTo(plot.ExteriorMapId, plot.DestinationX, plot.DestinationY,
|
||||
plot.DestinationZ, plot.DestinationO);
|
||||
}
|
||||
|
||||
void HandleReservePlot(WorldSession* session, WorldPackets::Housing::HousingReservePlot& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::HousingReservePlotResponse response;
|
||||
Player* player = session->GetPlayer();
|
||||
response.Result = ToPacketResult(player
|
||||
? sHousingMgr.ReservePlot(player, packet.NeighborhoodGUID, packet.PlotIndex, packet.Reserve)
|
||||
: Result::HouseNotFound);
|
||||
|
||||
// Reservation is intentionally not ownership. Do not toggle plot doors or
|
||||
// live ownership state until CommitReservedPlot succeeds.
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleDecorSetEditMode(WorldSession* session, WorldPackets::Housing::HousingDecorSetEditMode& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
HouseState state;
|
||||
if (sHousingMgr.LoadOwnedHouse(session->GetPlayer(), ObjectGuid::Empty, state) == Result::Success)
|
||||
{
|
||||
// The existing member handler owns WorldSession's private edit-mode
|
||||
// flags. Gate it behind authoritative ownership so its legacy
|
||||
// EnsureOwnedHouse path can no longer create a house.
|
||||
session->HandleHousingDecorSetEditMode(packet);
|
||||
return;
|
||||
}
|
||||
|
||||
WorldPackets::Housing::HousingDecorSetEditModeResponse response;
|
||||
response.HouseOwnerAccountGUID = session->GetBattlenetAccountGUID();
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleRelinquishHouse(WorldSession* session, WorldPackets::Housing::HousingRelinquishHouse& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::HousingRelinquishHouseResponse response;
|
||||
response.HouseGUID = packet.HouseGUID;
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
if (!player)
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
HouseState previousState;
|
||||
Result result = sHousingMgr.LoadOwnedHouse(player, packet.HouseGUID, previousState);
|
||||
if (result != Result::Success)
|
||||
{
|
||||
response.Result = ToPacketResult(result);
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<ObjectGuid> roomGuids;
|
||||
std::vector<ObjectGuid> dynamicEntityGuids;
|
||||
roomGuids.reserve(SafetyMaxRoomsPerHouse);
|
||||
dynamicEntityGuids.reserve(SafetyMaxRoomComponentsPerHouse + SafetyMaxFixturesPerHouse + SafetyMaxPlacedDecorPerHouse);
|
||||
CollectPersistedLiveEntities(previousState, roomGuids, dynamicEntityGuids);
|
||||
|
||||
result = sHousingMgr.RelinquishOwnedHouse(player, packet.HouseGUID, &previousState);
|
||||
response.Result = ToPacketResult(result);
|
||||
|
||||
if (result == Result::Success)
|
||||
{
|
||||
response.HouseGUID = previousState.HouseGuid;
|
||||
response.NeighborhoodGUID = previousState.NeighborhoodGuid;
|
||||
|
||||
// Persistence is gone at this point, so only the GUID snapshot captured
|
||||
// before the transaction may be used to remove live entities safely.
|
||||
RemoveLiveHouseEntities(player, previousState, roomGuids, dynamicEntityGuids);
|
||||
SynchronizeExteriorPlot(player, previousState, false);
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleUpdateHouseSettings(WorldSession* session, WorldPackets::Housing::HousingUpdateHouseSettings& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::HousingUpdateHouseSettingsResponse response;
|
||||
response.HouseGUID = packet.HouseGUID;
|
||||
response.Result = ToPacketResult(Result::HouseNotFound);
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
if (!player)
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
response.OwnerGUID = player->GetGUID();
|
||||
|
||||
// The observed packet exposes an optional visitor GUID, but the current
|
||||
// source has no verified visitor ACL semantics. Reject malformed/non-player
|
||||
// GUIDs instead of persisting speculative permission data.
|
||||
if (packet.VisitorPermissionGUID && !packet.VisitorPermissionGUID->IsPlayer())
|
||||
{
|
||||
response.Result = ToPacketResult(Result::PermissionDenied);
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
HouseState state;
|
||||
Result result = sHousingMgr.LoadOwnedHouse(player, packet.HouseGUID, state);
|
||||
if (result == Result::Success && packet.PlotSettingsID)
|
||||
result = sHousingMgr.UpdateOwnedHouseSettings(player, packet.HouseGUID,
|
||||
*packet.PlotSettingsID & HouseSettingsValidMask, state);
|
||||
|
||||
response.Result = ToPacketResult(result);
|
||||
if (result == Result::Success)
|
||||
{
|
||||
response.HouseGUID = state.HouseGuid;
|
||||
response.OwnerGUID = player->GetGUID();
|
||||
response.NeighborhoodGUID = state.NeighborhoodGuid;
|
||||
response.PlotIndex = state.PlotId;
|
||||
response.SettingsFlags = state.SettingsFlags;
|
||||
SynchronizeExteriorPlot(player, state, true);
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#ifndef TRINITYCORE_HOUSING_SESSION_LIFECYCLE_H
|
||||
#define TRINITYCORE_HOUSING_SESSION_LIFECYCLE_H
|
||||
|
||||
#include "Define.h"
|
||||
|
||||
class WorldSession;
|
||||
|
||||
namespace WorldPackets::Housing
|
||||
{
|
||||
class GetCurrentHouseInfo;
|
||||
class GetPlayerPermissions;
|
||||
class HouseStatus;
|
||||
class PlayerViewHousesByPlayer;
|
||||
class GetPlayerHousesInfo;
|
||||
class NeighborhoodBuyHouse;
|
||||
class NeighborhoodMoveHouse;
|
||||
class HousingGetHouseFinderInfo;
|
||||
class HousingTeleportToPlot;
|
||||
class HousingReservePlot;
|
||||
class HousingDecorSetEditMode;
|
||||
class HousingRelinquishHouse;
|
||||
class HousingUpdateHouseSettings;
|
||||
}
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
// Installs the restarted Housing routes after the core OpcodeTable has been
|
||||
// initialized and before world sockets begin accepting sessions.
|
||||
TC_GAME_API bool InstallSessionOpcodeHandlers();
|
||||
|
||||
// Client-facing adapters for the restarted Housing implementation. Persistence
|
||||
// and ownership validation stay in Housing::Manager; this layer owns only wire
|
||||
// responses plus safe synchronization of live map entities.
|
||||
TC_GAME_API void HandleGetCurrentHouseInfo(WorldSession* session,
|
||||
WorldPackets::Housing::GetCurrentHouseInfo& packet);
|
||||
TC_GAME_API void HandleGetPlayerPermissions(WorldSession* session,
|
||||
WorldPackets::Housing::GetPlayerPermissions& packet);
|
||||
TC_GAME_API void HandleHouseStatus(WorldSession* session,
|
||||
WorldPackets::Housing::HouseStatus& packet);
|
||||
TC_GAME_API void HandlePlayerViewHousesByPlayer(WorldSession* session,
|
||||
WorldPackets::Housing::PlayerViewHousesByPlayer& packet);
|
||||
TC_GAME_API void HandleGetPlayerHousesInfo(WorldSession* session,
|
||||
WorldPackets::Housing::GetPlayerHousesInfo& packet);
|
||||
TC_GAME_API void HandleBuyHouse(WorldSession* session,
|
||||
WorldPackets::Housing::NeighborhoodBuyHouse& packet);
|
||||
TC_GAME_API void HandleMoveHouse(WorldSession* session,
|
||||
WorldPackets::Housing::NeighborhoodMoveHouse& packet);
|
||||
TC_GAME_API void HandleGetHouseFinderInfo(WorldSession* session,
|
||||
WorldPackets::Housing::HousingGetHouseFinderInfo& packet);
|
||||
TC_GAME_API void HandleTeleportToPlot(WorldSession* session,
|
||||
WorldPackets::Housing::HousingTeleportToPlot& packet);
|
||||
TC_GAME_API void HandleReservePlot(WorldSession* session,
|
||||
WorldPackets::Housing::HousingReservePlot& packet);
|
||||
TC_GAME_API void HandleDecorSetEditMode(WorldSession* session,
|
||||
WorldPackets::Housing::HousingDecorSetEditMode& packet);
|
||||
TC_GAME_API void HandleRelinquishHouse(WorldSession* session,
|
||||
WorldPackets::Housing::HousingRelinquishHouse& packet);
|
||||
TC_GAME_API void HandleUpdateHouseSettings(WorldSession* session,
|
||||
WorldPackets::Housing::HousingUpdateHouseSettings& packet);
|
||||
}
|
||||
|
||||
#endif // TRINITYCORE_HOUSING_SESSION_LIFECYCLE_H
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#ifndef TRINITYCORE_HOUSING_STATE_H
|
||||
#define TRINITYCORE_HOUSING_STATE_H
|
||||
|
||||
#include "Define.h"
|
||||
#include "ObjectGuid.h"
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
struct HouseState
|
||||
{
|
||||
ObjectGuid HouseGuid;
|
||||
ObjectGuid CosmeticOwnerGuid;
|
||||
ObjectGuid NeighborhoodGuid;
|
||||
uint8 PlotId = 0;
|
||||
uint32 ExteriorMapId = 0;
|
||||
uint32 SettingsFlags = 0;
|
||||
bool HasReservationTime = false;
|
||||
uint64 ReservationTime = 0;
|
||||
};
|
||||
|
||||
struct PlotState
|
||||
{
|
||||
uint8 PlotId = 0;
|
||||
uint32 ExteriorMapId = 0;
|
||||
uint32 InteriorMapId = 0;
|
||||
float DestinationX = 0.0f;
|
||||
float DestinationY = 0.0f;
|
||||
float DestinationZ = 0.0f;
|
||||
float DestinationO = 0.0f;
|
||||
uint32 CornerstoneEntry = 0;
|
||||
uint64 Cost = 0;
|
||||
};
|
||||
|
||||
// Persistence-only representation of housing_room_entity. Keeping the DB row
|
||||
// separate from WorldObject ownership prevents room handlers from retaining raw
|
||||
// pointers across Map removal/despawn operations.
|
||||
struct RoomState
|
||||
{
|
||||
ObjectGuid RoomGuid;
|
||||
ObjectGuid HouseGuid;
|
||||
int32 HouseRoomId = 0;
|
||||
int32 Flags = 0;
|
||||
float PositionX = 0.0f;
|
||||
float PositionY = 0.0f;
|
||||
float PositionZ = 0.0f;
|
||||
float RotationX = 0.0f;
|
||||
float RotationY = 0.0f;
|
||||
float RotationZ = 0.0f;
|
||||
float RotationW = 1.0f;
|
||||
float Scale = 1.0f;
|
||||
uint8 AttachmentFlags = 3;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // TRINITYCORE_HOUSING_STATE_H
|
||||
@@ -394,15 +394,16 @@ namespace WorldPackets::BattlePet
|
||||
|
||||
data << uint32(cooldowns.size());
|
||||
|
||||
// 12.1.0.69587 wire order (every FIRST_ROUND / ROUND_RESULT / REPLACEMENTS_MADE of two retail
|
||||
// captures, verified byte-exact): Cooldowns, Effects, PetXDied count (3 bits) + flush, PetXDied.
|
||||
// The count used to be written BEFORE the effects, which shifted every effect by one byte.
|
||||
for (PetBattleCooldownInfo const& cd : cooldowns)
|
||||
data << cd;
|
||||
|
||||
// 12.1.0.69587 wire order (three retail captures, 61 round packets byte-exact, six of them
|
||||
// with non-empty cooldown lists): Effects, Cooldowns, PetXDied count (3 bits) + flush, PetXDied.
|
||||
// Both the cooldowns and the PetXDied count used to be written BEFORE the effects; every
|
||||
// round in which an ability went on cooldown mis-parsed on the client.
|
||||
for (PetBattleEffectInfo const& effect : effects)
|
||||
data << effect;
|
||||
|
||||
for (PetBattleCooldownInfo const& cd : cooldowns)
|
||||
data << cd;
|
||||
|
||||
data << Bits<3>(petXDied.size());
|
||||
data.FlushBits();
|
||||
|
||||
|
||||
@@ -187,6 +187,45 @@ namespace WorldPackets::Housing
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
void HousingRelinquishHouse::Read()
|
||||
{
|
||||
_worldPacket >> HouseGUID;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRelinquishHouseResponse::Write()
|
||||
{
|
||||
_worldPacket << uint8(Result);
|
||||
_worldPacket << HouseGUID;
|
||||
_worldPacket << NeighborhoodGUID;
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
void HousingUpdateHouseSettings::Read()
|
||||
{
|
||||
_worldPacket >> HouseGUID;
|
||||
_worldPacket >> OptionalInit(PlotSettingsID);
|
||||
_worldPacket >> OptionalInit(VisitorPermissionGUID);
|
||||
|
||||
if (PlotSettingsID)
|
||||
_worldPacket >> *PlotSettingsID;
|
||||
if (VisitorPermissionGUID)
|
||||
_worldPacket >> *VisitorPermissionGUID;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingUpdateHouseSettingsResponse::Write()
|
||||
{
|
||||
// Verified Housing response order: result, three packed GUIDs, level,
|
||||
// plot index and the persisted settings mask.
|
||||
_worldPacket << uint8(Result);
|
||||
_worldPacket << HouseGUID;
|
||||
_worldPacket << OwnerGUID;
|
||||
_worldPacket << NeighborhoodGUID;
|
||||
_worldPacket << uint8(HouseLevel);
|
||||
_worldPacket << uint8(PlotIndex);
|
||||
_worldPacket << uint32(SettingsFlags);
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
|
||||
WorldPacket const* HousingBlueprintGetResponse::Write()
|
||||
{
|
||||
|
||||
@@ -262,6 +262,52 @@ namespace WorldPackets::Housing
|
||||
uint8 Result = 0;
|
||||
};
|
||||
|
||||
class HousingRelinquishHouse final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRelinquishHouse(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_SVCS_RELINQUISH_HOUSE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid HouseGUID;
|
||||
};
|
||||
|
||||
class HousingRelinquishHouseResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRelinquishHouseResponse() : ServerPacket(SMSG_HOUSING_SVCS_RELINQUISH_HOUSE_RESPONSE, 33) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
uint8 Result = 0;
|
||||
ObjectGuid HouseGUID;
|
||||
ObjectGuid NeighborhoodGUID;
|
||||
};
|
||||
|
||||
class HousingUpdateHouseSettings final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingUpdateHouseSettings(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_SVCS_UPDATE_HOUSE_SETTINGS, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid HouseGUID;
|
||||
Optional<uint32> PlotSettingsID;
|
||||
Optional<ObjectGuid> VisitorPermissionGUID;
|
||||
};
|
||||
|
||||
class HousingUpdateHouseSettingsResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingUpdateHouseSettingsResponse() : ServerPacket(SMSG_HOUSING_SVCS_UPDATE_HOUSE_SETTINGS_RESPONSE, 48) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
uint8 Result = 0;
|
||||
ObjectGuid HouseGUID;
|
||||
ObjectGuid OwnerGUID;
|
||||
ObjectGuid NeighborhoodGUID;
|
||||
uint8 HouseLevel = 1;
|
||||
uint8 PlotIndex = 0;
|
||||
uint32 SettingsFlags = 0;
|
||||
};
|
||||
|
||||
|
||||
class HousingBlueprintRequestCollection final : public ClientPacket
|
||||
{
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "HousingRoomPackets.h"
|
||||
#include "Log.h"
|
||||
#include "PacketOperators.h"
|
||||
|
||||
namespace WorldPackets::Housing
|
||||
{
|
||||
namespace
|
||||
{
|
||||
// Allocation-safety cap only; this is not used as a retail protocol semantic limit.
|
||||
// Oversized client counts are rejected before vector allocation/iteration.
|
||||
constexpr uint32 MaxRoomComponentOptionIds = 1024;
|
||||
}
|
||||
|
||||
void HousingRoomSetLayoutEditMode::Read()
|
||||
{
|
||||
_worldPacket >> Bits<1>(Active);
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE Active: {}", Active);
|
||||
}
|
||||
|
||||
void HousingRoomAdd::Read()
|
||||
{
|
||||
_worldPacket >> SourceRoomGuid;
|
||||
_worldPacket >> TargetDoorComponentID;
|
||||
_worldPacket >> HouseRoomID;
|
||||
_worldPacket >> FloorIndex;
|
||||
_worldPacket >> Bits<1>(AutoFurnish);
|
||||
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_ADD SourceRoomGuid: {} DoorComponentID: {} HouseRoomID: {} FloorIndex: {} AutoFurnish: {}",
|
||||
SourceRoomGuid.ToString(), TargetDoorComponentID, HouseRoomID, FloorIndex, AutoFurnish);
|
||||
}
|
||||
|
||||
void HousingRoomRemove::Read()
|
||||
{
|
||||
_worldPacket >> RoomGuid;
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_REMOVE RoomGuid: {}", RoomGuid.ToString());
|
||||
}
|
||||
|
||||
void HousingRoomRotate::Read()
|
||||
{
|
||||
_worldPacket >> RoomGuid;
|
||||
_worldPacket >> Bits<1>(Clockwise);
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_ROTATE RoomGuid: {} Clockwise: {}", RoomGuid.ToString(), Clockwise);
|
||||
}
|
||||
|
||||
void HousingRoomMoveRoom::Read()
|
||||
{
|
||||
_worldPacket >> RoomGuid;
|
||||
_worldPacket >> TargetSlotIndex;
|
||||
_worldPacket >> TargetGuid;
|
||||
_worldPacket >> FloorIndex;
|
||||
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_MOVE RoomGuid: {} TargetSlotIndex: {} TargetGuid: {} FloorIndex: {}",
|
||||
RoomGuid.ToString(), TargetSlotIndex, TargetGuid.ToString(), FloorIndex);
|
||||
}
|
||||
|
||||
void HousingRoomSetComponentTheme::Read()
|
||||
{
|
||||
_worldPacket >> RoomGuid;
|
||||
|
||||
uint32 const optionCount = _worldPacket.read<uint32>();
|
||||
if (optionCount > MaxRoomComponentOptionIds)
|
||||
WorldPackets::OnInvalidArraySize(optionCount, MaxRoomComponentOptionIds);
|
||||
|
||||
OptionIDs.resize(optionCount);
|
||||
_worldPacket >> HouseThemeID;
|
||||
for (uint32& optionID : OptionIDs)
|
||||
_worldPacket >> optionID;
|
||||
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_SET_COMPONENT_THEME RoomGuid: {} HouseThemeID: {} OptionCount: {}",
|
||||
RoomGuid.ToString(), HouseThemeID, OptionIDs.size());
|
||||
}
|
||||
|
||||
void HousingRoomApplyComponentMaterials::Read()
|
||||
{
|
||||
// 12.1 wire order: PackedGUID + count + color override + texture ID +
|
||||
// component slot byte + option IDs. Keeping the slot before the array is
|
||||
// critical; treating it as a trailing bit shifts the first option by one byte.
|
||||
_worldPacket >> RoomGuid;
|
||||
|
||||
uint32 const optionCount = _worldPacket.read<uint32>();
|
||||
if (optionCount > MaxRoomComponentOptionIds)
|
||||
WorldPackets::OnInvalidArraySize(optionCount, MaxRoomComponentOptionIds);
|
||||
|
||||
OptionIDs.resize(optionCount);
|
||||
_worldPacket >> ColorOverride;
|
||||
_worldPacket >> RoomComponentTextureID;
|
||||
_worldPacket >> ComponentSlot;
|
||||
for (uint32& optionID : OptionIDs)
|
||||
_worldPacket >> optionID;
|
||||
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS RoomGuid: {} ColorOverride: {} TextureID: {} ComponentSlot: {} OptionCount: {}",
|
||||
RoomGuid.ToString(), ColorOverride, RoomComponentTextureID, ComponentSlot, OptionIDs.size());
|
||||
}
|
||||
|
||||
void HousingRoomSetDoorType::Read()
|
||||
{
|
||||
_worldPacket >> RoomGuid;
|
||||
_worldPacket >> ThemeOptionID;
|
||||
_worldPacket >> DoorType;
|
||||
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_SET_DOOR_TYPE RoomGuid: {} ThemeOptionID: {} DoorType: {}",
|
||||
RoomGuid.ToString(), ThemeOptionID, DoorType);
|
||||
}
|
||||
|
||||
void HousingRoomSetCeilingType::Read()
|
||||
{
|
||||
_worldPacket >> RoomGuid;
|
||||
_worldPacket >> ThemeOptionID;
|
||||
_worldPacket >> CeilingType;
|
||||
|
||||
TC_LOG_DEBUG("network.opcode", "CMSG_HOUSING_ROOM_SET_CEILING_TYPE RoomGuid: {} ThemeOptionID: {} CeilingType: {}",
|
||||
RoomGuid.ToString(), ThemeOptionID, CeilingType);
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomSetLayoutEditModeResponse::Write()
|
||||
{
|
||||
_worldPacket << PlayerGuid;
|
||||
_worldPacket << uint8(Result);
|
||||
_worldPacket << uint8(Active ? 0x80 : 0x00);
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomAddResponse::Write()
|
||||
{
|
||||
_worldPacket << PlayerGuid;
|
||||
_worldPacket << uint8(Result);
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomRemoveResponse::Write()
|
||||
{
|
||||
_worldPacket << RoomGuid;
|
||||
_worldPacket << SecondGuid;
|
||||
_worldPacket << uint8(Result);
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomUpdateResponse::Write()
|
||||
{
|
||||
_worldPacket << RoomGuid;
|
||||
_worldPacket << uint8(Result);
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomSetComponentThemeResponse::Write()
|
||||
{
|
||||
_worldPacket << RoomGuid;
|
||||
_worldPacket << uint32(OptionIDs.size());
|
||||
_worldPacket << uint32(ThemeSetID);
|
||||
_worldPacket << uint8(Result);
|
||||
for (uint32 optionID : OptionIDs)
|
||||
_worldPacket << optionID;
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomApplyComponentMaterialsResponse::Write()
|
||||
{
|
||||
_worldPacket << RoomGuid;
|
||||
_worldPacket << uint32(OptionIDs.size());
|
||||
_worldPacket << uint32(RoomComponentTextureID);
|
||||
_worldPacket << uint8(Result);
|
||||
for (uint32 optionID : OptionIDs)
|
||||
_worldPacket << optionID;
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomSetDoorTypeResponse::Write()
|
||||
{
|
||||
_worldPacket << RoomGuid;
|
||||
_worldPacket << uint32(ComponentID);
|
||||
_worldPacket << uint8(DoorType);
|
||||
_worldPacket << uint8(Result);
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
WorldPacket const* HousingRoomSetCeilingTypeResponse::Write()
|
||||
{
|
||||
_worldPacket << RoomGuid;
|
||||
_worldPacket << uint32(ComponentID);
|
||||
_worldPacket << uint8(CeilingType);
|
||||
_worldPacket << uint8(Result);
|
||||
return &_worldPacket;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef TRINITYCORE_HOUSING_ROOM_PACKETS_H
|
||||
#define TRINITYCORE_HOUSING_ROOM_PACKETS_H
|
||||
|
||||
#include "Packet.h"
|
||||
#include "PacketUtilities.h"
|
||||
#include <vector>
|
||||
|
||||
namespace WorldPackets::Housing
|
||||
{
|
||||
// Room protocol foundation for Midnight 12.1.x.
|
||||
// Mutating handlers are intentionally not enabled by this stage; Stage 5 will
|
||||
// bind them only after ownership, persistence and DB2 room validation are ready.
|
||||
|
||||
class HousingRoomSetLayoutEditMode final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomSetLayoutEditMode(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
bool Active = false;
|
||||
};
|
||||
|
||||
class HousingRoomAdd final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomAdd(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_ADD, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid SourceRoomGuid;
|
||||
uint32 TargetDoorComponentID = 0;
|
||||
uint32 HouseRoomID = 0;
|
||||
uint32 FloorIndex = 0;
|
||||
bool AutoFurnish = false;
|
||||
};
|
||||
|
||||
class HousingRoomRemove final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomRemove(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_REMOVE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
};
|
||||
|
||||
class HousingRoomRotate final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomRotate(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_ROTATE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
bool Clockwise = false;
|
||||
};
|
||||
|
||||
class HousingRoomMoveRoom final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomMoveRoom(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_MOVE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 TargetSlotIndex = 0;
|
||||
ObjectGuid TargetGuid;
|
||||
uint32 FloorIndex = 0;
|
||||
};
|
||||
|
||||
class HousingRoomSetComponentTheme final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomSetComponentTheme(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_SET_COMPONENT_THEME, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 HouseThemeID = 0;
|
||||
std::vector<uint32> OptionIDs;
|
||||
};
|
||||
|
||||
class HousingRoomApplyComponentMaterials final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomApplyComponentMaterials(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
int32 ColorOverride = -1;
|
||||
uint32 RoomComponentTextureID = 0;
|
||||
uint8 ComponentSlot = 0;
|
||||
std::vector<uint32> OptionIDs;
|
||||
};
|
||||
|
||||
class HousingRoomSetDoorType final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomSetDoorType(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_SET_DOOR_TYPE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 ThemeOptionID = 0;
|
||||
uint8 DoorType = 0;
|
||||
};
|
||||
|
||||
class HousingRoomSetCeilingType final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
explicit HousingRoomSetCeilingType(WorldPacket&& packet) : ClientPacket(CMSG_HOUSING_ROOM_SET_CEILING_TYPE, std::move(packet)) { }
|
||||
void Read() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 ThemeOptionID = 0;
|
||||
uint8 CeilingType = 0;
|
||||
};
|
||||
|
||||
class HousingRoomSetLayoutEditModeResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomSetLayoutEditModeResponse() : ServerPacket(SMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid PlayerGuid;
|
||||
uint8 Result = 0;
|
||||
bool Active = false;
|
||||
};
|
||||
|
||||
class HousingRoomAddResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomAddResponse() : ServerPacket(SMSG_HOUSING_ROOM_ADD_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid PlayerGuid;
|
||||
uint8 Result = 0;
|
||||
};
|
||||
|
||||
class HousingRoomRemoveResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomRemoveResponse() : ServerPacket(SMSG_HOUSING_ROOM_REMOVE_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
ObjectGuid SecondGuid;
|
||||
uint8 Result = 0;
|
||||
};
|
||||
|
||||
class HousingRoomUpdateResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomUpdateResponse() : ServerPacket(SMSG_HOUSING_ROOM_UPDATE_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint8 Result = 0;
|
||||
};
|
||||
|
||||
class HousingRoomSetComponentThemeResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomSetComponentThemeResponse() : ServerPacket(SMSG_HOUSING_ROOM_SET_COMPONENT_THEME_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 ThemeSetID = 0;
|
||||
uint8 Result = 0;
|
||||
std::vector<uint32> OptionIDs;
|
||||
};
|
||||
|
||||
class HousingRoomApplyComponentMaterialsResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomApplyComponentMaterialsResponse() : ServerPacket(SMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 RoomComponentTextureID = 0;
|
||||
uint8 Result = 0;
|
||||
std::vector<uint32> OptionIDs;
|
||||
};
|
||||
|
||||
class HousingRoomSetDoorTypeResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomSetDoorTypeResponse() : ServerPacket(SMSG_HOUSING_ROOM_SET_DOOR_TYPE_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 ComponentID = 0;
|
||||
uint8 DoorType = 0;
|
||||
uint8 Result = 0;
|
||||
};
|
||||
|
||||
class HousingRoomSetCeilingTypeResponse final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
HousingRoomSetCeilingTypeResponse() : ServerPacket(SMSG_HOUSING_ROOM_SET_CEILING_TYPE_RESPONSE) { }
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
ObjectGuid RoomGuid;
|
||||
uint32 ComponentID = 0;
|
||||
uint8 CeilingType = 0;
|
||||
uint8 Result = 0;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // TRINITYCORE_HOUSING_ROOM_PACKETS_H
|
||||
@@ -664,6 +664,7 @@ void World::LoadConfigSettings(bool reload)
|
||||
{ .Name = "Quests.IgnoreAutoComplete"sv, .DefaultValue = false, .Index = CONFIG_QUEST_IGNORE_AUTO_COMPLETE },
|
||||
{ .Name = "DetectPosCollision"sv, .DefaultValue = true, .Index = CONFIG_DETECT_POS_COLLISION },
|
||||
{ .Name = "Channel.RestrictedLfg"sv, .DefaultValue = true, .Index = CONFIG_RESTRICTED_LFG_CHANNEL },
|
||||
{ .Name = "DungeonFinder.ForceMinplayers"sv, .DefaultValue = false, .Index = CONFIG_LFG_FORCE_MINPLAYERS },
|
||||
{ .Name = "ChatFakeMessagePreventing"sv, .DefaultValue = false, .Index = CONFIG_CHAT_FAKE_MESSAGE_PREVENTING },
|
||||
{ .Name = "Death.CorpseReclaimDelay.PvP"sv, .DefaultValue = true, .Index = CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP },
|
||||
{ .Name = "Death.CorpseReclaimDelay.PvE"sv, .DefaultValue = true, .Index = CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE },
|
||||
|
||||
@@ -204,6 +204,7 @@ enum WorldBoolConfigs : uint32
|
||||
CONFIG_WOW_TOKEN_MARKET_ENABLED,
|
||||
CONFIG_SHOP_ENTITLEMENTS_ENABLED,
|
||||
CONFIG_SHOP_ENTITLEMENT_ASSIGN_ENABLED,
|
||||
CONFIG_LFG_FORCE_MINPLAYERS,
|
||||
BOOL_CONFIG_VALUE_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* WOWCOMMUNITY
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "Player.h"
|
||||
#include "Configuration/Config.h"
|
||||
#include "World.h"
|
||||
#include "LFGMgr.h"
|
||||
#include "Chat.h"
|
||||
#include "Opcodes.h"
|
||||
|
||||
class lfg_solo_announce : public PlayerScript
|
||||
{
|
||||
public:
|
||||
lfg_solo_announce() : PlayerScript("lfg_solo_announce") {}
|
||||
|
||||
void OnLogin(Player* player, bool /*firstLogin*/) override
|
||||
{
|
||||
// Announce Module
|
||||
if (sConfigMgr->GetBoolDefault("SoloLFG.Announce", true))
|
||||
{
|
||||
ChatHandler(player->GetSession()).SendSysMessage("This server is running |cff4CFF00Solo Dungeon Finder|r.");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class lfg_solo : public PlayerScript
|
||||
{
|
||||
public:
|
||||
lfg_solo() : PlayerScript("lfg_solo") { }
|
||||
|
||||
void OnLogin(Player* /*player*/, bool /*firstLogin*/) override
|
||||
{
|
||||
if (sConfigMgr->GetIntDefault("SoloLFG.Enable", true))
|
||||
{
|
||||
if (!sLFGMgr->IsSoloLFG())
|
||||
{
|
||||
sLFGMgr->ToggleSoloLFG();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void AddLfgSoloScripts()
|
||||
{
|
||||
new lfg_solo_announce();
|
||||
new lfg_solo();
|
||||
}
|
||||
@@ -37,6 +37,7 @@ void AddSC_custom_stormwind_player();
|
||||
void AddSC_custom_stormwind_quests();
|
||||
|
||||
void AddCustom_playerscript();
|
||||
void AddLfgSoloScripts();
|
||||
|
||||
void AddCustomScripts()
|
||||
{
|
||||
@@ -57,4 +58,5 @@ void AddCustomScripts()
|
||||
AddSC_custom_stormwind_quests();
|
||||
|
||||
AddCustom_playerscript();
|
||||
AddLfgSoloScripts();
|
||||
}
|
||||
|
||||
@@ -15,13 +15,296 @@
|
||||
#include "Unit.h"
|
||||
#include "Uldamanlegacyoftyr.h"
|
||||
|
||||
//here to script trash and gobs
|
||||
|
||||
enum NpcsSpells
|
||||
enum UldamanTrashSpells
|
||||
{
|
||||
// Stonevault Geomancer - 186658
|
||||
SPELL_STONE_SPIKE = 369674,
|
||||
|
||||
// Stonevault Ambusher - 186664
|
||||
SPELL_AMBUSH_1 = 369696,
|
||||
SPELL_AMBUSH_2 = 369697,
|
||||
|
||||
// Quaking Totem - 186696
|
||||
SPELL_SPAWN_VISUAL = 388314,
|
||||
SPELL_SHOCKING_QUAKE = 369610,
|
||||
SPELL_QUAKING = 369611,
|
||||
SPELL_TREMOR = 369665,
|
||||
|
||||
// Vault Keeper - 198213
|
||||
SPELL_PURGING_FLAMES_KEEPER = 392673,
|
||||
|
||||
// Eternal Orb - 191566
|
||||
SPELL_ETERNAL_ORB_SPAWN = 376188,
|
||||
SPELL_ETERNAL_ORB_DISPLAY = 181113,
|
||||
SPELL_ETERNITY_ZONE = 376273,
|
||||
|
||||
// Longboat Raid - 186945
|
||||
SPELL_LONGBOAT_RAID_ID = 369861,
|
||||
SPELL_SEARING_CANNONFIRE_1 = 375280,
|
||||
SPELL_SEARING_CANNONFIRE_2 = 375281,
|
||||
};
|
||||
|
||||
enum UldamanTrashEvents
|
||||
{
|
||||
EVENT_STONE_SPIKE = 1,
|
||||
EVENT_AMBUSH,
|
||||
EVENT_TREMOR,
|
||||
EVENT_SHOCKING_QUAKE,
|
||||
EVENT_PURGING_FLAMES,
|
||||
EVENT_ETERNAL_ORB,
|
||||
EVENT_ETERNITY_ZONE,
|
||||
EVENT_CANNONFIRE,
|
||||
};
|
||||
|
||||
// 186658 Stonevault Geomancer - Bromach add / dungeon trash
|
||||
struct npc_stonevault_geomancer : public ScriptedAI
|
||||
{
|
||||
npc_stonevault_geomancer(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_STONE_SPIKE, 3s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_STONE_SPIKE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
|
||||
DoCast(target, SPELL_STONE_SPIKE);
|
||||
events.RescheduleEvent(EVENT_STONE_SPIKE, 6s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
// 186664 Stonevault Ambusher - Bromach add / dungeon trash
|
||||
struct npc_stonevault_ambusher : public ScriptedAI
|
||||
{
|
||||
npc_stonevault_ambusher(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_AMBUSH, 2s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_AMBUSH:
|
||||
{
|
||||
Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true);
|
||||
if (target)
|
||||
{
|
||||
DoCast(target, SPELL_AMBUSH_1);
|
||||
DoCast(target, SPELL_AMBUSH_2);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_AMBUSH, Seconds(urand(4, 6)));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
// 186696 Quaking Totem - spawns from Bromach's Quaking Totem
|
||||
struct npc_quaking_totem : public ScriptedAI
|
||||
{
|
||||
npc_quaking_totem(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
DoCastSelf(SPELL_SPAWN_VISUAL);
|
||||
events.ScheduleEvent(EVENT_TREMOR, 2s);
|
||||
events.ScheduleEvent(EVENT_SHOCKING_QUAKE, 3s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_TREMOR:
|
||||
DoCastSelf(SPELL_TREMOR);
|
||||
DoCastSelf(SPELL_QUAKING);
|
||||
events.RescheduleEvent(EVENT_TREMOR, 1s);
|
||||
break;
|
||||
case EVENT_SHOCKING_QUAKE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, false))
|
||||
DoCast(target, SPELL_SHOCKING_QUAKE);
|
||||
events.RescheduleEvent(EVENT_SHOCKING_QUAKE, 5s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
// 198213 Vault Keeper - Emberon Purge Protocol add
|
||||
struct npc_vault_keeper : public ScriptedAI
|
||||
{
|
||||
npc_vault_keeper(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_PURGING_FLAMES, 2s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PURGING_FLAMES:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_PURGING_FLAMES_KEEPER);
|
||||
events.RescheduleEvent(EVENT_PURGING_FLAMES, 4s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
// 191566 Eternal Orb - Chrono-Lord Deios add
|
||||
struct npc_eternal_orb : public ScriptedAI
|
||||
{
|
||||
npc_eternal_orb(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoCastSelf(SPELL_ETERNAL_ORB_DISPLAY);
|
||||
DoCastSelf(SPELL_ETERNAL_ORB_SPAWN);
|
||||
events.ScheduleEvent(EVENT_ETERNAL_ORB, 1s);
|
||||
events.ScheduleEvent(EVENT_ETERNITY_ZONE, 4s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ETERNAL_ORB:
|
||||
DoCastSelf(SPELL_ETERNAL_ORB_SPAWN);
|
||||
break;
|
||||
case EVENT_ETERNITY_ZONE:
|
||||
DoCastSelf(SPELL_ETERNITY_ZONE);
|
||||
me->DespawnOrUnsummon(1s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
// 186945 Longboat Raid - The Lost Dwarves cannon ship
|
||||
struct npc_longboat_raid : public ScriptedAI
|
||||
{
|
||||
npc_longboat_raid(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoCastSelf(SPELL_LONGBOAT_RAID_ID);
|
||||
events.ScheduleEvent(EVENT_CANNONFIRE, 1s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CANNONFIRE:
|
||||
{
|
||||
Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true);
|
||||
if (target)
|
||||
{
|
||||
DoCast(target, SPELL_SEARING_CANNONFIRE_1);
|
||||
DoCast(target, SPELL_SEARING_CANNONFIRE_2);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_CANNONFIRE, 1s);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
void AddSC_Uldamanlegacyoftyr()
|
||||
{
|
||||
}
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(npc_stonevault_geomancer);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(npc_stonevault_ambusher);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(npc_quaking_totem);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(npc_vault_keeper);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(npc_eternal_orb);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(npc_longboat_raid);
|
||||
}
|
||||
@@ -24,6 +24,11 @@ enum ULDAMANLEGACYOFTYRDataTypes
|
||||
DATA_SENTINEL_TALONDRAS = 2,
|
||||
DATA_EMBERON = 3,
|
||||
DATA_CHRONO_LORD_DEIOS = 4,
|
||||
|
||||
// The Lost Dwarves encounter participants
|
||||
DATA_BAELOG = 5,
|
||||
DATA_OLAF = 6,
|
||||
DATA_ERIC = 7,
|
||||
};
|
||||
|
||||
enum ULDAMANLEGACYOFTYRCreatureIds
|
||||
@@ -33,6 +38,25 @@ enum ULDAMANLEGACYOFTYRCreatureIds
|
||||
BOSS_SENTINEL_TALONDRAS = 184124,
|
||||
BOSS_EMBERON = 184422,
|
||||
BOSS_CHRONO_LORD_DEIOS = 184125,
|
||||
|
||||
// The Lost Dwarves - encounter participants
|
||||
NPC_OLAF = 184580,
|
||||
NPC_ERIC = 184582,
|
||||
NPC_LONGBOAT_RAID = 186945,
|
||||
|
||||
// Bromach adds
|
||||
NPC_STONEVAULT_GEOMANCER = 186658,
|
||||
NPC_STONEVAULT_AMBUSHER = 186664,
|
||||
NPC_QUAKING_TOTEM = 186696,
|
||||
|
||||
// Talondras
|
||||
NPC_RUNIC_PROTECTOR = 184107,
|
||||
|
||||
// Emberon
|
||||
NPC_VAULT_KEEPER = 198213,
|
||||
|
||||
// Chrono-Lord Deios
|
||||
NPC_ETERNAL_ORB = 191566,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -38,6 +38,13 @@ enum Bromachevents
|
||||
EVENT_THUNDERING_SLAM,
|
||||
};
|
||||
|
||||
enum BromachTexts
|
||||
{
|
||||
TALK_AGGRO = 0, // "Bromach the chief here! Gonna smash you!"
|
||||
TALK_ADD_TROGGS, // "Get out here and smash 'em!" + "Stonevault troggs! Attack!"
|
||||
TALK_BLOODLUST, // "Now you see a chieftain's power!"
|
||||
};
|
||||
|
||||
//184018 Bromach
|
||||
class boss_bromach : public BossAI
|
||||
{
|
||||
@@ -56,12 +63,13 @@ public:
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(TALK_AGGRO);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
DoCast(SPELL_PERIODIC_ENERGY_GAIN);
|
||||
events.ScheduleEvent(EVENT_BLOODLUST, 24s);
|
||||
events.ScheduleEvent(EVENT_CALL_OF_THE_DEEP, 8s);
|
||||
events.ScheduleEvent(EVENT_QUAKING_TOTEM, 12s);
|
||||
events.ScheduleEvent(EVENT_THUNDERING_SLAM, 14s);
|
||||
events.ScheduleEvent(EVENT_CALL_OF_THE_DEEP, 2s);
|
||||
events.ScheduleEvent(EVENT_THUNDERING_SLAM, 6s);
|
||||
events.ScheduleEvent(EVENT_QUAKING_TOTEM, 15s);
|
||||
events.ScheduleEvent(EVENT_BLOODLUST, 33s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
@@ -78,6 +86,17 @@ public:
|
||||
me->RemoveAllAreaTriggers();
|
||||
}
|
||||
|
||||
void SummonStonevaultTroggs()
|
||||
{
|
||||
Talk(TALK_ADD_TROGGS);
|
||||
me->SummonCreature(NPC_STONEVAULT_GEOMANCER, me->GetPosition(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
Position pos = me->GetRandomPoint(me->GetPosition(), 7.0f);
|
||||
me->SummonCreature(NPC_STONEVAULT_AMBUSHER, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
@@ -101,19 +120,22 @@ public:
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_BLOODLUST:
|
||||
Talk(TALK_BLOODLUST);
|
||||
DoCastSelf(SPELL_BLOODLUST);
|
||||
events.ScheduleEvent(EVENT_BLOODLUST, 20s);
|
||||
events.RescheduleEvent(EVENT_BLOODLUST, 35s);
|
||||
break;
|
||||
case EVENT_CALL_OF_THE_DEEP:
|
||||
DoCast(SPELL_CALL_OF_THE_DEEP);
|
||||
SummonStonevaultTroggs();
|
||||
events.RescheduleEvent(EVENT_CALL_OF_THE_DEEP, 40s);
|
||||
break;
|
||||
case EVENT_QUAKING_TOTEM:
|
||||
DoCast(SPELL_QUAKING_TOTEM);
|
||||
events.ScheduleEvent(EVENT_QUAKING_TOTEM, 25s);
|
||||
me->SummonCreature(NPC_QUAKING_TOTEM, me->GetRandomPoint(me->GetPosition(), 12.0f), TEMPSUMMON_TIMED_DESPAWN, 15s);
|
||||
events.RescheduleEvent(EVENT_QUAKING_TOTEM, 40s);
|
||||
break;
|
||||
case EVENT_THUNDERING_SLAM:
|
||||
DoCast(SPELL_THUNDERING_SLAM);
|
||||
events.ScheduleEvent(EVENT_THUNDERING_SLAM, 33s);
|
||||
events.RescheduleEvent(EVENT_THUNDERING_SLAM, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -126,4 +148,4 @@ public:
|
||||
void AddSC_boss_bromach()
|
||||
{
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_bromach);
|
||||
};
|
||||
};
|
||||
@@ -24,7 +24,11 @@
|
||||
enum ChronolorddeiosSpells
|
||||
{
|
||||
SPELL_ETERNITY_ORB = 376292,
|
||||
SPELL_ETERNITY_ORB_2 = 376321,
|
||||
SPELL_ETERNITY_ORB_3 = 376319,
|
||||
SPELL_ETERNITY_ZONE = 376325,
|
||||
SPELL_REWIND_TIMEFLOW = 376208,
|
||||
SPELL_REWIND_TIMEFLOW_TICK = 376209,
|
||||
SPELL_SAND_BREATH = 375727,
|
||||
SPELL_TIME_SINK = 377395,
|
||||
SPELL_WING_BUFFET = 376049,
|
||||
@@ -40,6 +44,13 @@ enum Chronolorddeiosevents
|
||||
EVENT_WING_BUFFET,
|
||||
};
|
||||
|
||||
enum ChronolorddeiosTexts
|
||||
{
|
||||
TALK_AGGRO = 0, // "In all timelines, you fail to stop me!"
|
||||
TALK_REWIND, // "The timeways answer to me!"
|
||||
TALK_TIME_SINK, // "Lost in the sands!"
|
||||
};
|
||||
|
||||
//184125 Chrono lord deios
|
||||
class boss_chrono_lord_deios_U : public BossAI
|
||||
{
|
||||
@@ -60,14 +71,14 @@ public:
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(TALK_AGGRO);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
Talk(0);
|
||||
DoCast(SPELL_PERIODIC_ENERGY_GAIN);
|
||||
events.ScheduleEvent(EVENT_ETERNITY_ORB, 24s);
|
||||
events.ScheduleEvent(EVENT_REWIND_TIMEFLOW, 8s);
|
||||
events.ScheduleEvent(EVENT_SAND_BREATH, 12s);
|
||||
events.ScheduleEvent(EVENT_TIME_SINK, 14s);
|
||||
events.ScheduleEvent(EVENT_ETERNITY_ORB, 2s);
|
||||
events.ScheduleEvent(EVENT_TIME_SINK, 8s);
|
||||
events.ScheduleEvent(EVENT_WING_BUFFET, 5s);
|
||||
events.ScheduleEvent(EVENT_SAND_BREATH, 10s);
|
||||
events.ScheduleEvent(EVENT_REWIND_TIMEFLOW, 36s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
@@ -84,6 +95,27 @@ public:
|
||||
me->RemoveAllAreaTriggers();
|
||||
}
|
||||
|
||||
void SummonEternalOrbs()
|
||||
{
|
||||
std::list<Player*> targets;
|
||||
me->GetPlayerListInGrid(targets, 60.0f);
|
||||
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
// Snapshot: the boss fires 2 orbs toward each player on the pull.
|
||||
uint8 orbs = 0;
|
||||
for (Player* target : targets)
|
||||
{
|
||||
if (orbs >= 6)
|
||||
break;
|
||||
|
||||
me->SummonCreature(NPC_ETERNAL_ORB, target->GetPosition(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10s, 0, true);
|
||||
me->SummonCreature(NPC_ETERNAL_ORB, target->GetPosition(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10s, 0, true);
|
||||
orbs += 2;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
@@ -108,22 +140,30 @@ public:
|
||||
{
|
||||
case EVENT_ETERNITY_ORB:
|
||||
DoCast(SPELL_ETERNITY_ORB);
|
||||
DoCast(SPELL_ETERNITY_ORB_2);
|
||||
DoCast(SPELL_ETERNITY_ORB_3);
|
||||
SummonEternalOrbs();
|
||||
events.RescheduleEvent(EVENT_ETERNITY_ORB, 26s);
|
||||
break;
|
||||
case EVENT_REWIND_TIMEFLOW:
|
||||
Talk(TALK_REWIND);
|
||||
DoCastSelf(SPELL_REWIND_TIMEFLOW);
|
||||
events.ScheduleEvent(EVENT_REWIND_TIMEFLOW, 35s);
|
||||
DoCastSelf(SPELL_REWIND_TIMEFLOW_TICK);
|
||||
events.RescheduleEvent(EVENT_REWIND_TIMEFLOW, 60s);
|
||||
break;
|
||||
case EVENT_SAND_BREATH:
|
||||
DoCastVictim(SPELL_SAND_BREATH);
|
||||
events.ScheduleEvent(EVENT_SAND_BREATH, 12s);
|
||||
events.RescheduleEvent(EVENT_SAND_BREATH, 22s);
|
||||
break;
|
||||
case EVENT_TIME_SINK:
|
||||
DoCastVictim(SPELL_TIME_SINK);
|
||||
events.ScheduleEvent(EVENT_TIME_SINK, 24s);
|
||||
Talk(TALK_TIME_SINK);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_TIME_SINK);
|
||||
events.RescheduleEvent(EVENT_TIME_SINK, 26s);
|
||||
break;
|
||||
case EVENT_WING_BUFFET:
|
||||
DoCast(SPELL_WING_BUFFET);
|
||||
events.ScheduleEvent(EVENT_WING_BUFFET, 29s);
|
||||
events.RescheduleEvent(EVENT_WING_BUFFET, 29s);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -137,4 +177,4 @@ public:
|
||||
void AddSC_boss_chrono_lord_deios_U()
|
||||
{
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_chrono_lord_deios_U);
|
||||
};
|
||||
};
|
||||
@@ -27,9 +27,15 @@ enum EmberonSpells
|
||||
SPELL_BURNING_HEAT = 369006,
|
||||
SPELL_HEAT_ENGINE = 369026,
|
||||
SPELL_PURGING_FLAMES = 368996,
|
||||
SPELL_PURGING_FLAMES_AOE = 369022,
|
||||
SPELL_SACRED_BARRIER = 369031,
|
||||
SPELL_SEARING_CRAP = 369061,
|
||||
SPELL_UNSTABLE_EMBERS = 369110,
|
||||
SPELL_FIRE_WAVE = 369025,
|
||||
SPELL_ENERGIZE = 369099,
|
||||
SPELL_DENERGIZE = 369101,
|
||||
SPELL_KNOCKBACK = 393341,
|
||||
SPELL_CANCEL_AURA = 373841,
|
||||
SPELL_PERIODIC_ENERGY_GAIN = 299956,
|
||||
};
|
||||
|
||||
@@ -42,6 +48,14 @@ enum Emberonevents
|
||||
EVENT_SACRED_BARRIER,
|
||||
EVENT_SEARING_CRAP,
|
||||
EVENT_UNSTABLE_EMBERS,
|
||||
EVENT_FIRE_WAVE,
|
||||
EVENT_PURGE_PROTOCOL,
|
||||
};
|
||||
|
||||
enum EmberonTexts
|
||||
{
|
||||
TALK_PURGE = 0, // "Purging protocols activated."
|
||||
TALK_TARGET, // "Target acquired."
|
||||
};
|
||||
|
||||
//184422 Emberon
|
||||
@@ -57,6 +71,7 @@ public:
|
||||
me->SetPowerType(POWER_ENERGY);
|
||||
me->SetPower(POWER_ENERGY, 0);
|
||||
me->RemoveAllAreaTriggers();
|
||||
_purgeActive = false;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
@@ -64,13 +79,11 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
DoCast(SPELL_PERIODIC_ENERGY_GAIN);
|
||||
events.ScheduleEvent(EVENT_ACTIVATE_KEEPERS, 24s);
|
||||
events.ScheduleEvent(EVENT_BURNING_HEAT, 8s);
|
||||
events.ScheduleEvent(EVENT_HEAT_ENGINE, 12s);
|
||||
events.ScheduleEvent(EVENT_PURGING_FLAMES, 14s);
|
||||
events.ScheduleEvent(EVENT_SACRED_BARRIER, 22s);
|
||||
events.ScheduleEvent(EVENT_SEARING_CRAP, 17s);
|
||||
events.ScheduleEvent(EVENT_UNSTABLE_EMBERS, 5s);
|
||||
DoCast(SPELL_ACTIVATE_KEEPERS);
|
||||
events.ScheduleEvent(EVENT_SEARING_CRAP, 5s);
|
||||
events.ScheduleEvent(EVENT_BURNING_HEAT, 7s);
|
||||
events.ScheduleEvent(EVENT_UNSTABLE_EMBERS, 13s);
|
||||
events.ScheduleEvent(EVENT_ACTIVATE_KEEPERS, 65s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
@@ -79,12 +92,31 @@ public:
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
me->RemoveAllAreaTriggers();
|
||||
_purgeActive = false;
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
me->RemoveAllAreaTriggers();
|
||||
_purgeActive = false;
|
||||
}
|
||||
|
||||
void StartPurgeProtocol()
|
||||
{
|
||||
Talk(TALK_PURGE);
|
||||
_purgeActive = true;
|
||||
DoCastSelf(SPELL_DENERGIZE);
|
||||
DoCastSelf(SPELL_SACRED_BARRIER);
|
||||
me->SummonCreature(NPC_VAULT_KEEPER, me->GetRandomPoint(me->GetPosition(), 8.0f), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
|
||||
me->SummonCreature(NPC_VAULT_KEEPER, me->GetRandomPoint(me->GetPosition(), 12.0f), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
|
||||
events.ScheduleEvent(EVENT_FIRE_WAVE, 3s);
|
||||
events.ScheduleEvent(EVENT_FIRE_WAVE, 6s);
|
||||
events.ScheduleEvent(EVENT_FIRE_WAVE, 9s);
|
||||
events.ScheduleEvent(EVENT_FIRE_WAVE, 12s);
|
||||
events.ScheduleEvent(EVENT_FIRE_WAVE, 15s);
|
||||
events.ScheduleEvent(EVENT_FIRE_WAVE, 18s);
|
||||
events.ScheduleEvent(EVENT_SACRED_BARRIER, 21s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -97,10 +129,10 @@ public:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
if (me->GetPowerPct(POWER_ENERGY) == 100)
|
||||
if (!_purgeActive && me->GetPowerPct(POWER_ENERGY) == 100)
|
||||
{
|
||||
me->ModifyPower(POWER_ENERGY, -100);
|
||||
events.ScheduleEvent(EVENT_SACRED_BARRIER, 2s);
|
||||
StartPurgeProtocol();
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
@@ -111,31 +143,40 @@ public:
|
||||
{
|
||||
case EVENT_ACTIVATE_KEEPERS:
|
||||
DoCast(SPELL_ACTIVATE_KEEPERS);
|
||||
events.ScheduleEvent(EVENT_ACTIVATE_KEEPERS, 20s);
|
||||
DoCastSelf(SPELL_ENERGIZE);
|
||||
events.RescheduleEvent(EVENT_ACTIVATE_KEEPERS, 65s);
|
||||
break;
|
||||
case EVENT_BURNING_HEAT:
|
||||
DoCast(SPELL_BURNING_HEAT);
|
||||
events.ScheduleEvent(EVENT_BURNING_HEAT, 15s);
|
||||
me->RemoveAurasDueToSpell(SPELL_SACRED_BARRIER);
|
||||
events.RescheduleEvent(EVENT_BURNING_HEAT, 23s);
|
||||
break;
|
||||
case EVENT_HEAT_ENGINE:
|
||||
DoCast(SPELL_HEAT_ENGINE);
|
||||
events.ScheduleEvent(EVENT_HEAT_ENGINE, 12s);
|
||||
events.RescheduleEvent(EVENT_HEAT_ENGINE, 12s);
|
||||
break;
|
||||
case EVENT_PURGING_FLAMES:
|
||||
DoCastSelf(SPELL_PURGING_FLAMES);
|
||||
events.ScheduleEvent(EVENT_PURGING_FLAMES, 91s);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_PURGING_FLAMES);
|
||||
events.RescheduleEvent(EVENT_PURGING_FLAMES, 15s);
|
||||
break;
|
||||
case EVENT_SACRED_BARRIER:
|
||||
DoCastSelf(SPELL_SACRED_BARRIER);
|
||||
me->RemoveAurasDueToSpell(SPELL_SACRED_BARRIER);
|
||||
DoCastSelf(SPELL_ENERGIZE);
|
||||
_purgeActive = false;
|
||||
me->SetPower(POWER_ENERGY, 0);
|
||||
events.RescheduleEvent(EVENT_ACTIVATE_KEEPERS, 5s);
|
||||
break;
|
||||
case EVENT_SEARING_CRAP:
|
||||
Talk(TALK_TARGET);
|
||||
DoCast(SPELL_SEARING_CRAP);
|
||||
events.ScheduleEvent(EVENT_SEARING_CRAP, 44s);
|
||||
events.RescheduleEvent(EVENT_SEARING_CRAP, 23s);
|
||||
break;
|
||||
case EVENT_UNSTABLE_EMBERS:
|
||||
DoCast(SPELL_UNSTABLE_EMBERS);
|
||||
events.ScheduleEvent(EVENT_UNSTABLE_EMBERS, 28s);
|
||||
events.RescheduleEvent(EVENT_UNSTABLE_EMBERS, 12s);
|
||||
break;
|
||||
case EVENT_FIRE_WAVE:
|
||||
DoCast(SPELL_FIRE_WAVE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -143,9 +184,12 @@ public:
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
bool _purgeActive = false;
|
||||
};
|
||||
|
||||
void AddSC_boss_emberon()
|
||||
{
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_emberon);
|
||||
};
|
||||
};
|
||||
@@ -26,7 +26,10 @@ enum SentineltalondrasSpells
|
||||
SPELL_CRUSHING_STOMP = 372701,
|
||||
SPELL_EARTHEN_SHARDS = 372718,
|
||||
SPELL_INEXORABLE = 372600,
|
||||
SPELL_RESONATING_ORB = 372623,// 382071,
|
||||
SPELL_RESONATING_ORB = 372623,
|
||||
SPELL_RESONATING_ORB_2 = 382071,
|
||||
SPELL_RESONATING_ORB_3 = 372650,
|
||||
SPELL_RESONATING_ORB_4 = 372684,
|
||||
SPELL_TITANIC_EMPOWERMENT = 372719,
|
||||
SPELL_UNRELENTING = 386332,
|
||||
SPELL_PERIODIC_ENERGY_GAIN = 299956,
|
||||
@@ -40,6 +43,13 @@ enum Sentineltalondrasevents
|
||||
EVENT_RESONATING_ORB,
|
||||
EVENT_TITANIC_EMPOWERMENT,
|
||||
EVENT_UNRELENTING,
|
||||
EVENT_SUMMON_PROTECTORS,
|
||||
};
|
||||
|
||||
enum SentineltalondrasTexts
|
||||
{
|
||||
TALK_AGGRO = 0, // "Halt! You will go no further!"
|
||||
TALK_ORB, // "Keeper Tyr's secrets will be protected!"
|
||||
};
|
||||
|
||||
//184124 Sentinel talondras
|
||||
@@ -60,14 +70,13 @@ public:
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(TALK_AGGRO);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
DoCast(SPELL_PERIODIC_ENERGY_GAIN);
|
||||
events.ScheduleEvent(EVENT_CRUSHING_STOMP, 24s);
|
||||
events.ScheduleEvent(EVENT_EARTHEN_SHARDS, 8s);
|
||||
events.ScheduleEvent(EVENT_INEXORABLE, 12s);
|
||||
events.ScheduleEvent(EVENT_RESONATING_ORB, 14s);
|
||||
events.ScheduleEvent(EVENT_TITANIC_EMPOWERMENT, 22s);
|
||||
events.ScheduleEvent(EVENT_UNRELENTING, 17s);
|
||||
events.ScheduleEvent(EVENT_RESONATING_ORB, 2s);
|
||||
events.ScheduleEvent(EVENT_CRUSHING_STOMP, 9s);
|
||||
events.ScheduleEvent(EVENT_EARTHEN_SHARDS, 5s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_PROTECTORS, 25s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
@@ -109,26 +118,38 @@ public:
|
||||
{
|
||||
case EVENT_CRUSHING_STOMP:
|
||||
DoCast(SPELL_CRUSHING_STOMP);
|
||||
events.ScheduleEvent(EVENT_CRUSHING_STOMP, 37s);
|
||||
events.RescheduleEvent(EVENT_CRUSHING_STOMP, 12s);
|
||||
break;
|
||||
case EVENT_EARTHEN_SHARDS:
|
||||
DoCastVictim(SPELL_EARTHEN_SHARDS);
|
||||
events.ScheduleEvent(EVENT_EARTHEN_SHARDS, 15s);
|
||||
events.RescheduleEvent(EVENT_EARTHEN_SHARDS, 13s);
|
||||
break;
|
||||
case EVENT_INEXORABLE:
|
||||
DoCastSelf(SPELL_INEXORABLE);
|
||||
events.ScheduleEvent(EVENT_INEXORABLE, 12s);
|
||||
events.RescheduleEvent(EVENT_INEXORABLE, 27s);
|
||||
break;
|
||||
case EVENT_RESONATING_ORB:
|
||||
Talk(TALK_ORB);
|
||||
DoCast(SPELL_RESONATING_ORB);
|
||||
events.ScheduleEvent(EVENT_RESONATING_ORB, 33s);
|
||||
DoCast(SPELL_RESONATING_ORB_2);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
{
|
||||
DoCast(target, SPELL_RESONATING_ORB_3);
|
||||
DoCast(target, SPELL_RESONATING_ORB_4);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_RESONATING_ORB, 27s);
|
||||
break;
|
||||
case EVENT_TITANIC_EMPOWERMENT:
|
||||
DoCastSelf(SPELL_TITANIC_EMPOWERMENT);
|
||||
break;
|
||||
case EVENT_UNRELENTING:
|
||||
DoCastSelf(SPELL_UNRELENTING);
|
||||
events.ScheduleEvent(EVENT_UNRELENTING, 61s);
|
||||
events.RescheduleEvent(EVENT_UNRELENTING, 61s);
|
||||
break;
|
||||
case EVENT_SUMMON_PROTECTORS:
|
||||
me->SummonCreature(NPC_RUNIC_PROTECTOR, me->GetRandomPoint(me->GetPosition(), 10.0f), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
|
||||
me->SummonCreature(NPC_RUNIC_PROTECTOR, me->GetRandomPoint(me->GetPosition(), 12.0f), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15s);
|
||||
events.RescheduleEvent(EVENT_SUMMON_PROTECTORS, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -141,4 +162,4 @@ public:
|
||||
void AddSC_boss_sentinel_talondras()
|
||||
{
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_sentinel_talondras);
|
||||
};
|
||||
};
|
||||
@@ -23,19 +23,69 @@
|
||||
|
||||
enum ThelostdwarvesSpells
|
||||
{
|
||||
SPELL_STRIKE = 14516,
|
||||
// Shared
|
||||
SPELL_DWARVEN_RAGE = 381962,
|
||||
SPELL_DEFENSIVE_BULWARK = 369603,
|
||||
|
||||
// Baelog - 184581
|
||||
SPELL_WILD_CLEAVE = 369563,
|
||||
SPELL_WILD_CLEAVE_TRIGGERED = 395753,
|
||||
SPELL_HEAVY_ARROW = 455242,
|
||||
|
||||
// Olaf - 184580
|
||||
SPELL_RICOCHETING_SHIELD = 369677,
|
||||
SPELL_DEFENSIVE_BULWARK_1 = 369597,
|
||||
SPELL_DEFENSIVE_BULWARK_2 = 369601,
|
||||
SPELL_DEFENSIVE_BULWARK_3 = 369602,
|
||||
|
||||
// Eric "The Swift" - 184582
|
||||
SPELL_DAGGER_THROW = 369781,
|
||||
SPELL_SKULLCRACKER_1 = 369790,
|
||||
SPELL_SKULLCRACKER_2 = 369791,
|
||||
SPELL_SKULLCRACKER_3 = 369792,
|
||||
|
||||
// Longboat Raid phase
|
||||
SPELL_LONGBOAT_RAID = 375924,
|
||||
SPELL_LONGBOAT_RAID_2 = 375076,
|
||||
SPELL_LONGBOAT_RAID_3 = 375322,
|
||||
SPELL_SEARING_CANNONFIRE_1 = 375280,
|
||||
SPELL_SEARING_CANNONFIRE_2 = 375281,
|
||||
};
|
||||
|
||||
enum Thelostdwarvesevents
|
||||
{
|
||||
EVENT_STRIKE = 1,
|
||||
EVENT_WILD_CLEAVE = 1,
|
||||
EVENT_HEAVY_ARROW,
|
||||
EVENT_RICOCHETING_SHIELD,
|
||||
EVENT_DEFENSIVE_BULWARK,
|
||||
EVENT_DAGGER_THROW,
|
||||
EVENT_SKULLCRACKER,
|
||||
EVENT_LONGBOAT_RAID,
|
||||
};
|
||||
|
||||
//184581 The lost dwarves
|
||||
class boss_the_lost_dwarves : public BossAI
|
||||
/// Returns true when every single dwarf of the encounter is dead.
|
||||
bool AreAllDwarvesDead(InstanceScript* instance)
|
||||
{
|
||||
if (Creature* baelog = instance->GetCreature(DATA_BAELOG))
|
||||
if (baelog->IsAlive())
|
||||
return false;
|
||||
|
||||
if (Creature* olaf = instance->GetCreature(DATA_OLAF))
|
||||
if (olaf->IsAlive())
|
||||
return false;
|
||||
|
||||
if (Creature* eric = instance->GetCreature(DATA_ERIC))
|
||||
if (eric->IsAlive())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//184581 Baelog
|
||||
class boss_baelog : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_the_lost_dwarves(Creature* creature) : BossAI(creature, DATA_THE_LOST_DWARVES) {}
|
||||
boss_baelog(Creature* creature) : BossAI(creature, DATA_THE_LOST_DWARVES) {}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
@@ -49,7 +99,10 @@ public:
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
events.ScheduleEvent(EVENT_STRIKE, 8s);
|
||||
DoCastSelf(SPELL_DWARVEN_RAGE);
|
||||
events.ScheduleEvent(EVENT_WILD_CLEAVE, 8s);
|
||||
events.ScheduleEvent(EVENT_HEAVY_ARROW, 21s);
|
||||
events.ScheduleEvent(EVENT_LONGBOAT_RAID, 26s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
@@ -62,8 +115,11 @@ public:
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
me->RemoveAllAreaTriggers();
|
||||
if (!AreAllDwarvesDead(instance))
|
||||
return;
|
||||
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -82,19 +138,180 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_STRIKE:
|
||||
DoCastVictim(SPELL_STRIKE);
|
||||
events.ScheduleEvent(EVENT_STRIKE, 20s);
|
||||
case EVENT_WILD_CLEAVE:
|
||||
DoCastVictim(SPELL_WILD_CLEAVE);
|
||||
events.RescheduleEvent(EVENT_WILD_CLEAVE, 10s);
|
||||
break;
|
||||
case EVENT_HEAVY_ARROW:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_HEAVY_ARROW);
|
||||
events.RescheduleEvent(EVENT_HEAVY_ARROW, 21s);
|
||||
break;
|
||||
case EVENT_LONGBOAT_RAID:
|
||||
DoCastSelf(SPELL_LONGBOAT_RAID);
|
||||
DoCastSelf(SPELL_LONGBOAT_RAID_2);
|
||||
me->SummonCreature(NPC_LONGBOAT_RAID, me->GetPosition(), TEMPSUMMON_TIMED_DESPAWN, 12s);
|
||||
events.RescheduleEvent(EVENT_LONGBOAT_RAID, 48s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//184580 Olaf
|
||||
class boss_olaf : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_olaf(Creature* creature) : BossAI(creature, DATA_THE_LOST_DWARVES) {}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetPowerType(POWER_ENERGY);
|
||||
me->SetPower(POWER_ENERGY, 0);
|
||||
me->RemoveAllAreaTriggers();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
DoCastSelf(SPELL_DWARVEN_RAGE);
|
||||
events.ScheduleEvent(EVENT_RICOCHETING_SHIELD, 13s);
|
||||
events.ScheduleEvent(EVENT_DEFENSIVE_BULWARK, 18s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
me->RemoveAllAreaTriggers();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
me->RemoveAllAreaTriggers();
|
||||
if (!AreAllDwarvesDead(instance))
|
||||
return;
|
||||
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_RICOCHETING_SHIELD:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_RICOCHETING_SHIELD);
|
||||
events.RescheduleEvent(EVENT_RICOCHETING_SHIELD, 16s);
|
||||
break;
|
||||
case EVENT_DEFENSIVE_BULWARK:
|
||||
DoCastSelf(SPELL_DEFENSIVE_BULWARK_1);
|
||||
DoCastSelf(SPELL_DEFENSIVE_BULWARK_2);
|
||||
DoCastSelf(SPELL_DEFENSIVE_BULWARK_3);
|
||||
DoCastSelf(SPELL_DEFENSIVE_BULWARK);
|
||||
events.RescheduleEvent(EVENT_DEFENSIVE_BULWARK, 43s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//184582 Eric "The Swift"
|
||||
class boss_eric : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_eric(Creature* creature) : BossAI(creature, DATA_THE_LOST_DWARVES) {}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
me->SetPowerType(POWER_ENERGY);
|
||||
me->SetPower(POWER_ENERGY, 0);
|
||||
me->RemoveAllAreaTriggers();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
DoCastSelf(SPELL_DWARVEN_RAGE);
|
||||
events.ScheduleEvent(EVENT_DAGGER_THROW, 1s);
|
||||
events.ScheduleEvent(EVENT_SKULLCRACKER, 8s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
_EnterEvadeMode();
|
||||
_DespawnAtEvade();
|
||||
me->RemoveAllAreaTriggers();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
me->RemoveAllAreaTriggers();
|
||||
if (!AreAllDwarvesDead(instance))
|
||||
return;
|
||||
|
||||
BossAI::JustDied(killer);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_DAGGER_THROW:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, SPELL_DAGGER_THROW);
|
||||
events.RescheduleEvent(EVENT_DAGGER_THROW, 2s);
|
||||
break;
|
||||
case EVENT_SKULLCRACKER:
|
||||
DoCastVictim(SPELL_SKULLCRACKER_1);
|
||||
DoCastVictim(SPELL_SKULLCRACKER_2);
|
||||
DoCastVictim(SPELL_SKULLCRACKER_3);
|
||||
events.RescheduleEvent(EVENT_SKULLCRACKER, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_the_lost_dwarves()
|
||||
{
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_the_lost_dwarves);
|
||||
};
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_baelog);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_olaf);
|
||||
RegisterUldamanlegacyoftyrdfCreatureAI(boss_eric);
|
||||
};
|
||||
@@ -11,7 +11,9 @@
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ BOSS_THE_LOST_DWARVES, DATA_THE_LOST_DWARVES },
|
||||
{ BOSS_THE_LOST_DWARVES, DATA_BAELOG },
|
||||
{ NPC_OLAF, DATA_OLAF },
|
||||
{ NPC_ERIC, DATA_ERIC },
|
||||
{ BOSS_BROMACH, DATA_BROMACH },
|
||||
{ BOSS_SENTINEL_TALONDRAS, DATA_SENTINEL_TALONDRAS },
|
||||
{ BOSS_EMBERON, DATA_EMBERON },
|
||||
@@ -46,12 +48,16 @@ class instance_Uldamanlegacyoftyr_df : public InstanceMapScript
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* 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 "ScriptedCreature.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellScript.h"
|
||||
#include "Unit.h"
|
||||
|
||||
namespace Scripts::EasternKingdoms::TwilightHighlands::JulakDoom
|
||||
{
|
||||
namespace Spells
|
||||
{
|
||||
static constexpr uint32 SpellBlackBreath = 93611;
|
||||
static constexpr uint32 SpellMassiveShockwave = 93610;
|
||||
static constexpr uint32 SpellDarkWhisper = 93621;
|
||||
}
|
||||
namespace Events
|
||||
{
|
||||
static constexpr uint32 EventBlackBreath = 1;
|
||||
static constexpr uint32 EventMassiveShockwave = 2;
|
||||
static constexpr uint32 EventDarkWhisper = 3;
|
||||
}
|
||||
|
||||
// 50089 - Julak-Doom
|
||||
struct worldboss_julak_doom : public WorldBossAI
|
||||
{
|
||||
using WorldBossAI::WorldBossAI;
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
WorldBossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(Events::EventBlackBreath, 8s);
|
||||
events.ScheduleEvent(Events::EventMassiveShockwave, 12s);
|
||||
events.ScheduleEvent(Events::EventDarkWhisper, 60s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case Events::EventBlackBreath:
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, Spells::SpellBlackBreath);
|
||||
events.ScheduleEvent(Events::EventBlackBreath, 15s);
|
||||
break;
|
||||
}
|
||||
case Events::EventMassiveShockwave:
|
||||
{
|
||||
DoCast(Spells::SpellMassiveShockwave);
|
||||
events.ScheduleEvent(Events::EventMassiveShockwave, 29s);
|
||||
break;
|
||||
}
|
||||
case Events::EventDarkWhisper:
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
|
||||
DoCast(target, Spells::SpellDarkWhisper);
|
||||
events.ScheduleEvent(Events::EventDarkWhisper, 40s);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 93612 - Black Breath
|
||||
class spell_julak_doom_black_breath : public SpellScript
|
||||
{
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
float maxRadius = 5.0f * GetCaster()->GetObjectScale();
|
||||
targets.remove_if([this, maxRadius](WorldObject* target) -> bool
|
||||
{
|
||||
return target->GetExactDist(GetCaster()) > maxRadius;
|
||||
});
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_julak_doom_black_breath::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
// 93621 - Dark Whisper
|
||||
class spell_julak_doom_dark_whisper : public AuraScript
|
||||
{
|
||||
bool CheckProc(ProcEventInfo& eventInfo)
|
||||
{
|
||||
if (eventInfo.GetActionTarget()->HealthBelowPct(90))
|
||||
return true;
|
||||
|
||||
DamageInfo* damageInfo = eventInfo.GetDamageInfo();
|
||||
if (damageInfo && damageInfo->GetDamage())
|
||||
if (GetTarget()->HealthBelowPctDamaged(90, damageInfo->GetDamage()))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_julak_doom_dark_whisper::CheckProc);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void AddSC_worldboss_julak_doom()
|
||||
{
|
||||
using namespace Scripts::EasternKingdoms::TwilightHighlands::JulakDoom;
|
||||
|
||||
// Creature
|
||||
RegisterCreatureAI(worldboss_julak_doom);
|
||||
|
||||
// Spells
|
||||
RegisterSpellScript(spell_julak_doom_black_breath);
|
||||
RegisterSpellScript(spell_julak_doom_dark_whisper);
|
||||
}
|
||||
@@ -215,6 +215,9 @@ void AddSC_boss_the_curator_rtk();
|
||||
void AddSC_boss_mana_devourer();
|
||||
void AddSC_boss_shade_of_medivh();
|
||||
|
||||
// Twilight Highlands
|
||||
void AddSC_worldboss_julak_doom();
|
||||
|
||||
// Vashjir
|
||||
void AddSC_vashjir();
|
||||
void AddSC_abyssal_depths();
|
||||
@@ -423,6 +426,9 @@ void AddEasternKingdomsScripts()
|
||||
AddSC_boss_mana_devourer();
|
||||
AddSC_boss_shade_of_medivh();
|
||||
|
||||
// Twilight Highlands
|
||||
AddSC_worldboss_julak_doom();
|
||||
|
||||
// Vashjir
|
||||
AddSC_vashjir();
|
||||
AddSC_abyssal_depths();
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_fungal_folly_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_fungal_folly_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace
|
||||
struct instance_kriegvals_rest_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_kriegvals_rest_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_mycomancer_cavern_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_mycomancer_cavern_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_nightfall_sanctum_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_nightfall_sanctum_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_skittering_breach_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_skittering_breach_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_tak_rethan_abyss_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_tak_rethan_abyss_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_the_dread_pit_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_the_dread_pit_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_the_sinkhole_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_the_sinkhole_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_the_spiral_weave_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_the_spiral_weave_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_the_underkeep_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_the_underkeep_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_the_waterworks_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_the_waterworks_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
struct instance_zekvirs_lair_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_zekvirs_lair_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: tier from context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
}
|
||||
|
||||
@@ -40,12 +40,10 @@ namespace Delves
|
||||
if (!_delveInstance)
|
||||
return;
|
||||
|
||||
// First entrant locks the run's tier from their gossip selection.
|
||||
if (_delveInstance->GetState() == DelveState::Entering &&
|
||||
player->m_delveSelectedTier > 0 && player->m_delveSelectedTier <= MAX_DELVE_TIER)
|
||||
{
|
||||
_delveInstance->SetTier(player->m_delveSelectedTier);
|
||||
}
|
||||
// Tier adoption is handled by DelveInstance::OnPlayerEnter below: the
|
||||
// first entrant locks the run's tier from their entrance selection
|
||||
// (gossip menu or the native tiered-entrance UI), validated against
|
||||
// the selected map id.
|
||||
|
||||
_delveInstance->OnPlayerEnter(player);
|
||||
|
||||
|
||||
@@ -29,10 +29,14 @@ namespace Delves
|
||||
* Extends InstanceScript with delve-specific lifecycle (revives, companion, checkpoints).
|
||||
* Per-delve scripts inherit from this and define boss encounters, objectives, and environmental mechanics.
|
||||
*/
|
||||
// Initial tier until the first entrant locks the real one from their
|
||||
// entrance selection (gossip menu or the native tiered-entrance UI).
|
||||
inline constexpr uint8 DEFAULT_DELVE_TIER = 1;
|
||||
|
||||
class DelveInstanceScript : public InstanceScript
|
||||
{
|
||||
public:
|
||||
DelveInstanceScript(InstanceMap* map, uint8 tier);
|
||||
DelveInstanceScript(InstanceMap* map, uint8 tier = DEFAULT_DELVE_TIER);
|
||||
~DelveInstanceScript() override;
|
||||
|
||||
// InstanceScript overrides
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
struct instance_earthcrawl_mines_InstanceScript : public Delves::DelveInstanceScript
|
||||
{
|
||||
instance_earthcrawl_mines_InstanceScript(InstanceMap* map)
|
||||
: DelveInstanceScript(map, 1 /* TODO: get tier from gossip/creation context */)
|
||||
: DelveInstanceScript(map)
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
// TODO: LoadDungeonEncounterData(Encounters);
|
||||
|
||||
@@ -42,6 +42,23 @@ struct instance_altaroffangs : public InstanceScript
|
||||
LoadDoorData(doorData);
|
||||
LoadDungeonEncounterData(encounters);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player * player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void AddSC_instance_altaroffangs()
|
||||
|
||||
@@ -46,6 +46,22 @@ struct instance_blindingvale : public InstanceScript
|
||||
LoadDoorData(doorData);
|
||||
LoadDungeonEncounterData(encounters);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_blindingvale()
|
||||
|
||||
+16
@@ -44,6 +44,22 @@ struct instance_magisters_terrace_midnight : public InstanceScript
|
||||
LoadDoorData(doorData);
|
||||
LoadDungeonEncounterData(encounters);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_magisters_terrace_midnight()
|
||||
|
||||
@@ -82,6 +82,22 @@ class instance_maisara_caverns : public InstanceMapScript
|
||||
return ObjectGuid::Empty;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
|
||||
private:
|
||||
ObjectGuid _murojinGUID;
|
||||
ObjectGuid _vordazaGUID;
|
||||
|
||||
@@ -52,6 +52,22 @@ struct instance_nexuspointxenas : public InstanceScript
|
||||
LoadDungeonEncounterData(encounters);
|
||||
LoadObjectData({}, gameObjectData);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_instance_nexuspointxenas()
|
||||
|
||||
@@ -40,9 +40,25 @@ struct instance_voidscar_arena : public InstanceScript
|
||||
LoadDungeonEncounterData(encounters);
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void AddSC_instance_voidscar_arena()
|
||||
{
|
||||
RegisterInstanceMapScript(instance_voidscar_arena, 2923);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,22 @@ struct instance_windrunner_spire : public InstanceScript
|
||||
}
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (!player->GetGroup() || !player->GetGroup()->GetLeaderGUID())
|
||||
return;
|
||||
|
||||
player->GetGroup()->AddFollowerModeBots(player);
|
||||
}
|
||||
|
||||
void OnPlayerExit(Player* player)
|
||||
{
|
||||
if (!player->GetGroup())
|
||||
return;
|
||||
|
||||
player->GetGroup()->DespawnFollowerModeBots(player);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8 _spellguardMagusCount = 2;
|
||||
};
|
||||
|
||||
@@ -1729,14 +1729,14 @@ class spell_hun_aspect_of_the_hydra : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_HUNTER_RAPID_FIRE, SPELL_HUNTER_ARCANE_SHOT });
|
||||
return ValidateSpellInfo({ SPELL_HUNTER_AIMED_SHOT, SPELL_HUNTER_RAPID_FIRE_DAMAGE });
|
||||
}
|
||||
|
||||
bool CheckProc(ProcEventInfo& eventInfo)
|
||||
{
|
||||
// Only proc on Aimed Shot (19434), Rapid Fire (257044), or Arcane Shot (185358)
|
||||
// Aimed Shot (19434) and Rapid Fire Damage (257045)
|
||||
uint32 spellId = eventInfo.GetSpellInfo()->Id;
|
||||
return spellId == 19434 || spellId == SPELL_HUNTER_RAPID_FIRE || spellId == SPELL_HUNTER_ARCANE_SHOT;
|
||||
return spellId == SPELL_HUNTER_AIMED_SHOT || spellId == SPELL_HUNTER_RAPID_FIRE_DAMAGE;
|
||||
}
|
||||
|
||||
void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
|
||||
@@ -1780,7 +1780,7 @@ class spell_hun_aspect_of_the_hydra : public AuraScript
|
||||
break;
|
||||
|
||||
// Deal damage using a custom spell damage
|
||||
Unit::DealDamage(caster, nearbyTarget, damage, nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
|
||||
Unit::DealDamage(caster, nearbyTarget, damage, nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NATURE, nullptr, false);
|
||||
targetsHit++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +105,7 @@ enum MageSpells
|
||||
SPELL_MAGE_ICE_BARRIER = 11426,
|
||||
SPELL_MAGE_ICE_BLOCK = 45438,
|
||||
SPELL_MAGE_IGNITE = 12654,
|
||||
SPELL_MAGE_IGNITION = 1254756,
|
||||
SPELL_MAGE_IGNITION_BURST = 1217359,
|
||||
SPELL_MAGE_IMPROVED_COMBUSTION = 383967,
|
||||
SPELL_MAGE_IMPROVED_SCORCH = 383608,
|
||||
@@ -864,13 +865,70 @@ class spell_mage_firestarter_dots : public AuraScript
|
||||
// 108853 - Fire Blast
|
||||
class spell_mage_fire_blast : public SpellScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_MAGE_IGNITION, SPELL_MAGE_IGNITE });
|
||||
}
|
||||
|
||||
void CalcCritChance(Unit const* /*victim*/, float& critChance)
|
||||
{
|
||||
critChance = 100.0f;
|
||||
}
|
||||
|
||||
void HandleIgnitionSpread(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (!GetCaster() || !GetCaster()->HasAura(SPELL_MAGE_IGNITION))
|
||||
return;
|
||||
|
||||
Unit* hitTarget = GetHitUnit();
|
||||
if (!hitTarget || !hitTarget->IsAlive())
|
||||
return;
|
||||
|
||||
Aura* sourceIgnite = hitTarget->GetAura(SPELL_MAGE_IGNITE);
|
||||
if (!sourceIgnite)
|
||||
return;
|
||||
|
||||
AuraEffect const* igniteAurEff = sourceIgnite->GetEffect(EFFECT_0);
|
||||
if (!igniteAurEff)
|
||||
return;
|
||||
|
||||
Aura* ignition = GetCaster()->GetAura(SPELL_MAGE_IGNITION);
|
||||
int32 spreadPct = int32(ignition->GetEffect(EFFECT_2)->GetAmount());
|
||||
int32 maxTargets = int32(ignition->GetEffect(EFFECT_0)->GetAmount());
|
||||
if (spreadPct <= 0 || maxTargets <= 0)
|
||||
return;
|
||||
|
||||
int32 spreadAmount = CalculatePct(int32(igniteAurEff->GetAmount()), spreadPct);
|
||||
if (spreadAmount <= 0)
|
||||
return;
|
||||
|
||||
std::list<Unit*> targets;
|
||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck check(hitTarget, GetCaster(), 10.0f);
|
||||
Trinity::UnitListSearcher searcher(hitTarget, targets, check);
|
||||
Cell::VisitAllObjects(hitTarget, searcher, 10.0f);
|
||||
|
||||
uint32 spreadCount = 0;
|
||||
targets.remove_if([&](Unit* target)
|
||||
{
|
||||
return !target->IsAlive() || target->GetGUID() == hitTarget->GetGUID() || !GetCaster()->IsInCombatWith(target);
|
||||
});
|
||||
targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
|
||||
|
||||
for (Unit* target : targets)
|
||||
{
|
||||
if (spreadCount >= uint32(maxTargets))
|
||||
break;
|
||||
|
||||
CastSpellExtraArgs args(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
|
||||
args.AddSpellMod(SPELLVALUE_BASE_POINT0, spreadAmount);
|
||||
GetCaster()->CastSpell(target, SPELL_MAGE_IGNITE, args);
|
||||
++spreadCount;
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mage_fire_blast::HandleIgnitionSpread, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
OnCalcCritChance += SpellOnCalcCritChanceFn(spell_mage_fire_blast::CalcCritChance);
|
||||
}
|
||||
};
|
||||
@@ -1912,7 +1970,7 @@ class spell_mage_ignite : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_MAGE_HOT_STREAK, SPELL_MAGE_PYROBLAST, SPELL_MAGE_FLAMESTRIKE })
|
||||
return ValidateSpellInfo({ SPELL_MAGE_HOT_STREAK, SPELL_MAGE_PYROBLAST, SPELL_MAGE_FLAMESTRIKE, SPELL_MAGE_IGNITION })
|
||||
&& ValidateSpellEffect({ { SPELL_MAGE_IGNITE, EFFECT_0 } })
|
||||
&& sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, DIFFICULTY_NONE)->GetEffect(EFFECT_0).GetPeriodicTickCount() > 0;
|
||||
}
|
||||
@@ -1933,6 +1991,10 @@ class spell_mage_ignite : public AuraScript
|
||||
if (spell_mage_hot_streak_ignite_marker::IsActive(eventInfo.GetProcSpell()))
|
||||
pct *= 2;
|
||||
|
||||
if (Aura* ignition = eventInfo.GetActor()->GetAura(SPELL_MAGE_IGNITION))
|
||||
if (eventInfo.GetProcSpell() && eventInfo.GetProcSpell()->GetSpellInfo()->Id == SPELL_MAGE_FLAMESTRIKE)
|
||||
pct += ignition->GetEffect(EFFECT_1)->GetAmount();
|
||||
|
||||
SpellEffectValue amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot.GetPeriodicTickCount();
|
||||
|
||||
CastSpellExtraArgs args(aurEff);
|
||||
@@ -2923,10 +2985,17 @@ class aura_mage_clearcasting_proc : public AuraScript
|
||||
// 12654 - Ignite DOT
|
||||
class spell_mage_ignite_periodic : public AuraScript
|
||||
{
|
||||
void CalculateRefreshedDot(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
|
||||
void CalculateRefreshedDot(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
|
||||
{
|
||||
canBeRecalculated = false;
|
||||
_critDamageValues.emplace_back(std::make_pair(2, amount));
|
||||
|
||||
int32 prevAmount = 0;
|
||||
for (auto const& damageValuePair : _critDamageValues)
|
||||
prevAmount += damageValuePair.second;
|
||||
|
||||
int32 newDamage = amount - prevAmount;
|
||||
if (newDamage > 0)
|
||||
_critDamageValues.emplace_back(std::make_pair(2, newDamage));
|
||||
|
||||
amount = 0;
|
||||
for (auto const& damageValuePair : _critDamageValues)
|
||||
@@ -2937,7 +3006,7 @@ class spell_mage_ignite_periodic : public AuraScript
|
||||
{
|
||||
int32 newDotValue = 0;
|
||||
bool changed = false;
|
||||
for (std::vector<std::pair<uint8, int32>>::iterator itr = _critDamageValues.begin(); itr != _critDamageValues.end();)
|
||||
for (auto itr = _critDamageValues.begin(); itr != _critDamageValues.end();)
|
||||
{
|
||||
--itr->first;
|
||||
newDotValue += itr->second;
|
||||
|
||||
@@ -57,9 +57,11 @@ enum RogueSpells
|
||||
SPELL_ROGUE_CLOAKED_IN_SHADOWS_ABSORB = 386165,
|
||||
SPELL_ROGUE_CRIPPLING_POISON = 3408,
|
||||
SPELL_ROGUE_CRIPPLING_POISON_DEBUFF = 3409,
|
||||
SPELL_ROGUE_CRIMSON_TEMPEST = 1247227,
|
||||
SPELL_ROGUE_DEADLY_POISON = 2823,
|
||||
SPELL_ROGUE_DEADLY_POISON_DEBUFF = 2818,
|
||||
SPELL_ROGUE_DEADLY_POISON_INSTANT_DAMAGE = 113780,
|
||||
SPELL_ROGUE_GARROTE = 703,
|
||||
SPELL_ROGUE_GRAND_MELEE = 193358,
|
||||
SPELL_ROGUE_GRAPPLING_HOOK = 195457,
|
||||
SPELL_ROGUE_IMPROVED_GARROTE_AFTER_STEALTH = 392401,
|
||||
@@ -84,6 +86,7 @@ enum RogueSpells
|
||||
SPELL_ROGUE_PREMEDITATION_ENERGIZE = 343170,
|
||||
SPELL_ROGUE_PREY_ON_THE_WEAK_TALENT = 131511,
|
||||
SPELL_ROGUE_PREY_ON_THE_WEAK = 255909,
|
||||
SPELL_ROGUE_RUPTURE = 1943,
|
||||
SPELL_ROGUE_RUTHLESS_PRECISION = 193357,
|
||||
SPELL_ROGUE_SANCTUARY = 98877,
|
||||
SPELL_ROGUE_SKULL_AND_CROSSBONES = 199603,
|
||||
@@ -115,6 +118,9 @@ enum RogueSpells
|
||||
SPELL_ROGUE_WOUND_POISON = 8679,
|
||||
SPELL_ROGUE_WOUND_POISON_DEBUFF = 8680,
|
||||
SPELL_ROGUE_DEATHMARK = 360194,
|
||||
SPELL_ROGUE_DOOMBLADE_BLEED = 394021,
|
||||
SPELL_ROGUE_MUTILATE_MAIN_HAND = 5374,
|
||||
SPELL_ROGUE_MUTILATE_OFF_HAND = 27576,
|
||||
};
|
||||
|
||||
static constexpr std::array<std::pair<uint32 /*poisonAura*/, uint32 /*triggeredPoisonSpell*/>, 7> PoisonAuraToDebuff
|
||||
@@ -388,7 +394,7 @@ class spell_rog_deadly_poison : public SpellScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_ROGUE_DEADLY_POISON_INSTANT_DAMAGE });
|
||||
return ValidateSpellInfo({ SPELL_ROGUE_DEADLY_POISON_INSTANT_DAMAGE, SPELL_ROGUE_DEATHMARK });
|
||||
}
|
||||
|
||||
void HandleInstantDamage(SpellEffIndex /*effIndex*/) const
|
||||
@@ -401,9 +407,30 @@ class spell_rog_deadly_poison : public SpellScript
|
||||
});
|
||||
}
|
||||
|
||||
void HandleAfterCast()
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
Unit* target = GetExplTargetUnit();
|
||||
if (!caster || !target || !target->IsAlive())
|
||||
return;
|
||||
|
||||
// Deathmark: each application of a Lethal Poison is applied twice
|
||||
if (!target->GetAura(SPELL_ROGUE_DEATHMARK, caster->GetGUID()))
|
||||
return;
|
||||
|
||||
if (Aura* deadlyPoison = target->GetAura(GetSpellInfo()->Id, caster->GetGUID()))
|
||||
{
|
||||
deadlyPoison->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, false);
|
||||
caster->CastSpell(target, SPELL_ROGUE_DEADLY_POISON_INSTANT_DAMAGE, CastSpellExtraArgsInit{
|
||||
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectLaunchTarget += SpellEffectFn(spell_rog_deadly_poison::HandleInstantDamage, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
|
||||
AfterCast += SpellCastFn(spell_rog_deadly_poison::HandleAfterCast);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1002,6 +1029,240 @@ class spell_rog_rupture : public AuraScript
|
||||
}
|
||||
};
|
||||
|
||||
// 1247227 - Crimson Tempest
|
||||
class spell_rog_crimson_tempest : public SpellScript
|
||||
{
|
||||
static constexpr float COPY_RADIUS = 10.0f;
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_ROGUE_GARROTE, SPELL_ROGUE_RUPTURE });
|
||||
}
|
||||
|
||||
void HandleHitTarget(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* hitTarget = GetHitUnit())
|
||||
_hitTargets.push_back(hitTarget);
|
||||
}
|
||||
|
||||
void HandleAfterCast()
|
||||
{
|
||||
CopyLongestDot(SPELL_ROGUE_GARROTE);
|
||||
CopyLongestDot(SPELL_ROGUE_RUPTURE);
|
||||
}
|
||||
|
||||
void CopyLongestDot(uint32 dotSpellId)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
if (!caster)
|
||||
return;
|
||||
|
||||
// Find the enemy we hit carrying the longest remaining instance of this dot
|
||||
Aura* sourceAura = nullptr;
|
||||
for (Unit* hitTarget : _hitTargets)
|
||||
{
|
||||
if (!hitTarget || !hitTarget->IsAlive())
|
||||
continue;
|
||||
|
||||
Aura* aura = hitTarget->GetAura(dotSpellId);
|
||||
if (!aura)
|
||||
continue;
|
||||
|
||||
if (!sourceAura || aura->GetDuration() > sourceAura->GetDuration())
|
||||
sourceAura = aura;
|
||||
}
|
||||
|
||||
if (!sourceAura)
|
||||
return;
|
||||
|
||||
Unit* dotCaster = sourceAura->GetCaster();
|
||||
AuraEffect const* dotAurEff = sourceAura->GetEffect(EFFECT_0);
|
||||
int32 remainingDuration = sourceAura->GetDuration();
|
||||
if (!dotCaster || !dotAurEff || remainingDuration <= 0)
|
||||
return;
|
||||
|
||||
int32 tickAmount = dotAurEff->GetAmount();
|
||||
uint32 maxCopyTargets = uint32(sSpellMgr->AssertSpellInfo(SPELL_ROGUE_CRIMSON_TEMPEST, GetCastDifficulty())->GetEffect(EFFECT_1).BasePoints);
|
||||
|
||||
// Other enemies: not hit by the AoE and not already carrying the dot
|
||||
std::list<Unit*> targets;
|
||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck check(caster, caster, COPY_RADIUS);
|
||||
Trinity::UnitListSearcher searcher(caster, targets, check);
|
||||
Cell::VisitAllObjects(caster, searcher, COPY_RADIUS);
|
||||
|
||||
uint32 targetsCopied = 0;
|
||||
targets.remove_if([&](Unit* target)
|
||||
{
|
||||
return !target->IsAlive() || !caster->IsInCombatWith(target) || target->GetGUID() == caster->GetGUID()
|
||||
|| std::ranges::find(_hitTargets.begin(), _hitTargets.end(), target) != _hitTargets.end() || target->GetAura(dotSpellId) != nullptr;
|
||||
});
|
||||
targets.sort(Trinity::ObjectDistanceOrderPred(caster));
|
||||
|
||||
for (Unit* target : targets)
|
||||
{
|
||||
if (targetsCopied >= maxCopyTargets)
|
||||
break;
|
||||
|
||||
CastSpellExtraArgs args;
|
||||
args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
|
||||
args.SetTriggeringSpell(GetSpell());
|
||||
args.AddSpellBP0(tickAmount);
|
||||
args.AddSpellMod(SPELLVALUE_DURATION, remainingDuration);
|
||||
dotCaster->CastSpell(target, dotSpellId, args);
|
||||
++targetsCopied;
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_rog_crimson_tempest::HandleHitTarget, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
|
||||
AfterCast += SpellCastFn(spell_rog_crimson_tempest::HandleAfterCast);
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<Unit*> _hitTargets;
|
||||
};
|
||||
|
||||
static thread_local bool g_isDeathmarkPoisonDoubling = false;
|
||||
|
||||
// Deathmark: each time a Lethal Poison is applied to the marked target, apply it twice
|
||||
void ApplyDeathmarkPoisonTwice(Unit* caster, Unit* target, uint32 poisonSpellId)
|
||||
{
|
||||
if (g_isDeathmarkPoisonDoubling || !caster || !target || !target->IsAlive())
|
||||
return;
|
||||
|
||||
if (!target->GetAura(SPELL_ROGUE_DEATHMARK, caster->GetGUID()))
|
||||
return;
|
||||
|
||||
g_isDeathmarkPoisonDoubling = true;
|
||||
caster->CastSpell(target, poisonSpellId, CastSpellExtraArgsInit{
|
||||
.TriggerFlags = TRIGGERED_FULL_MASK
|
||||
});
|
||||
g_isDeathmarkPoisonDoubling = false;
|
||||
}
|
||||
|
||||
// 360194 - Deathmark
|
||||
class spell_rog_deathmark : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_ROGUE_DEATHMARK });
|
||||
}
|
||||
|
||||
void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
if (!caster)
|
||||
return;
|
||||
|
||||
// Effect 1 (SPELL_EFFECT_APPLY_AREA_AURA_PARTY) has no core handler, so the 75% damage
|
||||
// amplification aura (SPELL_AURA_MOD_SPELL_DAMAGE_FROM_CASTER) is applied manually here
|
||||
GetUnitOwner()->RemoveOwnedAura(SPELL_ROGUE_DEATHMARK, caster->GetGUID(), 1u << EFFECT_1, AURA_REMOVE_BY_DEFAULT);
|
||||
caster->AddAura(GetSpellInfo(), 1u << EFFECT_1, GetUnitOwner());
|
||||
}
|
||||
|
||||
void HandlePeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
Player* caster = GetCaster() ? GetCaster()->ToPlayer() : nullptr;
|
||||
if (!caster)
|
||||
return;
|
||||
|
||||
// Effect 2 (SPELL_AURA_DUMMY, 80) represents the energy restored over the bleed duration
|
||||
SpellEffectInfo const& energyBind = GetSpellInfo()->GetEffect(EFFECT_2);
|
||||
uint32 ticks = std::max(1u, aurEff->GetTotalTicks());
|
||||
caster->ModifyPower(POWER_ENERGY, int32(energyBind.BasePoints) / int32(ticks));
|
||||
}
|
||||
|
||||
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
GetUnitOwner()->RemoveOwnedAura(SPELL_ROGUE_DEATHMARK, ObjectGuid::Empty, 1u << EFFECT_1, AURA_REMOVE_BY_DEFAULT);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_rog_deathmark::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_deathmark::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_rog_deathmark::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
// 381673 - Doomblade
|
||||
class spell_rog_doomblade : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_ROGUE_DOOMBLADE_BLEED })
|
||||
&& ValidateSpellEffect({ { SPELL_ROGUE_DOOMBLADE_BLEED, EFFECT_0 } })
|
||||
&& sSpellMgr->AssertSpellInfo(SPELL_ROGUE_DOOMBLADE_BLEED, DIFFICULTY_NONE)->GetEffect(EFFECT_0).GetPeriodicTickCount() > 0;
|
||||
}
|
||||
|
||||
bool CheckProc(ProcEventInfo& eventInfo)
|
||||
{
|
||||
Spell const* procSpell = eventInfo.GetProcSpell();
|
||||
if (!procSpell)
|
||||
return false;
|
||||
|
||||
uint32 spellId = procSpell->GetSpellInfo()->Id;
|
||||
return spellId == SPELL_ROGUE_MUTILATE_MAIN_HAND || spellId == SPELL_ROGUE_MUTILATE_OFF_HAND;
|
||||
}
|
||||
|
||||
void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
|
||||
Unit* caster = eventInfo.GetActor();
|
||||
Unit* target = eventInfo.GetActionTarget();
|
||||
DamageInfo* damageInfo = eventInfo.GetDamageInfo();
|
||||
if (!caster || !target || !damageInfo)
|
||||
return;
|
||||
|
||||
SpellEffectInfo const& bleedDot = sSpellMgr->AssertSpellInfo(SPELL_ROGUE_DOOMBLADE_BLEED, DIFFICULTY_NONE)->GetEffect(EFFECT_0);
|
||||
SpellEffectValue pct = aurEff->GetAmount();
|
||||
|
||||
// Each Mutilate weapon hit (main hand 5374 + off hand 27576) pools into the bleed
|
||||
// (ignite-style), so the DoT deals 25% of the full Mutilate damage over its duration.
|
||||
SpellEffectValue hitContribution = CalculatePct(damageInfo->GetDamage(), pct);
|
||||
|
||||
if (Aura* bleed = target->GetAura(SPELL_ROGUE_DOOMBLADE_BLEED, caster->GetGUID()))
|
||||
{
|
||||
AuraEffect* bleedEffect = bleed->GetEffect(EFFECT_0);
|
||||
if (!bleedEffect)
|
||||
return;
|
||||
|
||||
SpellEffectValue pool = bleedEffect->GetAmount() * bleedEffect->GetRemainingTicks() + hitContribution;
|
||||
|
||||
bleed->RefreshDuration();
|
||||
bleedEffect->SetAmount(pool / bleedEffect->GetTotalTicks());
|
||||
}
|
||||
else
|
||||
{
|
||||
CastSpellExtraArgs args(aurEff);
|
||||
args.AddSpellMod(SPELLVALUE_BASE_POINT0, hitContribution / bleedDot.GetPeriodicTickCount());
|
||||
caster->CastSpell(target, SPELL_ROGUE_DOOMBLADE_BLEED, args);
|
||||
}
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_rog_doomblade::CheckProc);
|
||||
OnEffectProc += AuraEffectProcFn(spell_rog_doomblade::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
// 315585 - Instant Poison
|
||||
class spell_rog_instant_poison : public SpellScript
|
||||
{
|
||||
void HandleAfterCast()
|
||||
{
|
||||
ApplyDeathmarkPoisonTwice(GetCaster(), GetExplTargetUnit(), SPELL_ROGUE_INSTANT_POISON_DAMAGE);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterCast += SpellCastFn(spell_rog_instant_poison::HandleAfterCast);
|
||||
}
|
||||
};
|
||||
|
||||
// 14161 - Ruthlessness
|
||||
class spell_rog_ruthlessness : public AuraScript
|
||||
{
|
||||
@@ -1496,13 +1757,17 @@ void AddSC_rogue_spell_scripts()
|
||||
RegisterSpellScript(spell_rog_blade_flurry);
|
||||
RegisterSpellScript(spell_rog_cheat_death);
|
||||
RegisterSpellScript(spell_rog_cloaked_in_shadows);
|
||||
RegisterSpellScript(spell_rog_crimson_tempest);
|
||||
RegisterSpellScript(spell_rog_deadly_poison);
|
||||
RegisterSpellScript(spell_rog_deathmark);
|
||||
RegisterSpellScript(spell_rog_doomblade);
|
||||
RegisterSpellScript(spell_rog_envenom);
|
||||
RegisterSpellScript(spell_rog_eviscerate);
|
||||
RegisterSpellScript(spell_rog_grand_melee);
|
||||
RegisterSpellScript(spell_rog_improved_garrote);
|
||||
RegisterSpellScript(spell_rog_improved_garrote_damage);
|
||||
RegisterSpellScript(spell_rog_improved_shiv);
|
||||
RegisterSpellScript(spell_rog_instant_poison);
|
||||
RegisterSpellScript(spell_rog_killing_spree_aura);
|
||||
RegisterSpellScript(spell_rog_kingsbane);
|
||||
RegisterSpellScript(spell_rog_leeching_poison);
|
||||
|
||||
@@ -104,6 +104,7 @@ enum WarlockSpells
|
||||
SPELL_WARLOCK_WITHER_PERIODIC = 445474,
|
||||
SPELL_WARLOCK_WITHER_TALENT = 445465,
|
||||
//WowCommunity
|
||||
SPELL_WARLOCK_HAVOC = 80240,
|
||||
SPELL_WARLOCK_CALL_DREADSTALKERS_LEFT = 193331,
|
||||
SPELL_WARLOCK_CALL_DREADSTALKERS_RIGHT = 193332,
|
||||
SPELL_WARLOCK_DREADSTALKER_CHARGE = 194247,
|
||||
@@ -1940,6 +1941,50 @@ class spell_warl_cunning_cruelty : public AuraScript
|
||||
}
|
||||
};
|
||||
|
||||
// 387506 - Mayhem
|
||||
// On harmful single-target spells, 35% chance to apply Havoc to a nearby enemy.
|
||||
class spell_warl_mayhem : public AuraScript
|
||||
{
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_WARLOCK_HAVOC });
|
||||
}
|
||||
|
||||
static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
|
||||
{
|
||||
return roll_chance(aurEff->GetAmount());
|
||||
}
|
||||
|
||||
static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
|
||||
{
|
||||
Unit* caster = eventInfo.GetActor();
|
||||
Unit* victim = eventInfo.GetActionTarget();
|
||||
if (!caster || !victim)
|
||||
return;
|
||||
|
||||
constexpr float Range = 20.0f;
|
||||
|
||||
std::list<Unit*> targets;
|
||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(caster, caster, Range);
|
||||
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(caster, targets, u_check);
|
||||
Cell::VisitAllObjects(caster, searcher, Range);
|
||||
|
||||
targets.remove_if([=](Unit* u) { return u == victim || u->isDead() || u->HasAura(SPELL_WARLOCK_HAVOC); });
|
||||
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
caster->CastSpell(Trinity::Containers::SelectRandomContainerElement(targets), SPELL_WARLOCK_HAVOC,
|
||||
CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR });
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
DoCheckEffectProc += AuraCheckEffectProcFn(spell_warl_mayhem::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
OnEffectProc += AuraEffectProcFn(spell_warl_mayhem::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_warlock_spell_scripts()
|
||||
{
|
||||
RegisterSpellScript(spell_warl_absolute_corruption);
|
||||
@@ -1969,6 +2014,7 @@ void AddSC_warlock_spell_scripts()
|
||||
RegisterSpellScript(spell_warl_health_funnel);
|
||||
RegisterSpellScript(spell_warl_healthstone_heal);
|
||||
RegisterSpellScript(spell_warl_immolate);
|
||||
RegisterSpellScript(spell_warl_mayhem);
|
||||
RegisterSpellScript(spell_warl_perpetual_unstability);
|
||||
RegisterSpellScript(spell_warl_pyrogenics);
|
||||
RegisterSpellScript(spell_warl_rain_of_fire);
|
||||
|
||||
@@ -390,28 +390,6 @@ private:
|
||||
ObjectGuid stormforgedEradictorGUID;
|
||||
};
|
||||
|
||||
struct areatrigger_stormwind_teleport_unit : AreaTriggerAI
|
||||
{
|
||||
enum MiscIds
|
||||
{
|
||||
SPELL_DUST_IN_THE_STORMWIND = 312593,
|
||||
|
||||
NPC_KILL_CREDIT_TELEPORT_STORMWIND = 160561
|
||||
};
|
||||
|
||||
areatrigger_stormwind_teleport_unit(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
|
||||
|
||||
void OnUnitEnter(Unit* unit) override
|
||||
{
|
||||
Player* player = unit->ToPlayer();
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
player->CastSpell(unit, SPELL_DUST_IN_THE_STORMWIND);
|
||||
player->KilledMonsterCredit(NPC_KILL_CREDIT_TELEPORT_STORMWIND);
|
||||
}
|
||||
};
|
||||
|
||||
void HandleBuffAreaTrigger(Player* player)
|
||||
{
|
||||
if (GameObject* buffObject = player->FindNearestGameObjectWithOptions(4.0f, { .StringId = "bg_buff_object" }))
|
||||
@@ -548,7 +526,6 @@ void AddSC_areatrigger_scripts()
|
||||
new AreaTrigger_at_brewfest();
|
||||
new AreaTrigger_at_area_52_entrance();
|
||||
new AreaTrigger_at_frostgrips_hollow();
|
||||
RegisterAreaTriggerAI(areatrigger_stormwind_teleport_unit);
|
||||
RegisterAreaTriggerAI(areatrigger_battleground_buffs);
|
||||
new AreaTrigger_at_battleground_buffs();
|
||||
RegisterAreaTriggerAI(areatrigger_action_capture_flag);
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "DatabaseLoader.h"
|
||||
#include "DeadlineTimer.h"
|
||||
#include "GitRevision.h"
|
||||
#include "HousingSessionLifecycle.h"
|
||||
#include "InstanceLockMgr.h"
|
||||
#include "IoContext.h"
|
||||
#include "IpNetwork.h"
|
||||
@@ -360,6 +361,14 @@ int main(int argc, char** argv)
|
||||
if (!sWorld->SetInitialWorldSettings())
|
||||
return 1;
|
||||
|
||||
// OpcodeTable is initialized by SetInitialWorldSettings(). Install the
|
||||
// restarted Housing routes now, before any realm socket accepts a session.
|
||||
if (!Housing::InstallSessionOpcodeHandlers())
|
||||
{
|
||||
TC_LOG_ERROR("server.worldserver", "Failed to install Housing session opcode routes");
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto instanceLockMgrHandle = Trinity::make_unique_ptr_with_deleter<&InstanceLockMgr::Unload>(&sInstanceLockMgr);
|
||||
|
||||
auto terrainMgrHandle = Trinity::make_unique_ptr_with_deleter<&TerrainMgr::UnloadAll>(&sTerrainMgr);
|
||||
|
||||
@@ -5567,4 +5567,23 @@ Warfront.Contribution.MinutesPerDonation = 60.0
|
||||
|
||||
Contribution.AccumulationRate = 1.0
|
||||
|
||||
###################################################################################################
|
||||
# SOLO LFG
|
||||
#
|
||||
# SoloLFG.Enable
|
||||
# Description: Enable the module.
|
||||
# Default: 1 - (Enabled)
|
||||
# 0 - (Disabled)
|
||||
|
||||
SoloLFG.Enable = 1
|
||||
|
||||
# SoloLFG.Announce
|
||||
# Description: Announce the module.
|
||||
# Default: 1 - (Enabled)
|
||||
# 0 - (Disabled)
|
||||
|
||||
SoloLFG.Announce = 1
|
||||
|
||||
#
|
||||
###################################################################################################
|
||||
|
||||
|
||||
Reference in New Issue
Block a user