diff --git a/data/sql/updates/db_world/2023_04_26_03.sql b/data/sql/updates/db_world/2023_04_26_03.sql new file mode 100644 index 000000000..05e56adfb --- /dev/null +++ b/data/sql/updates/db_world/2023_04_26_03.sql @@ -0,0 +1,5 @@ +-- DB update 2023_04_26_02 -> 2023_04_26_03 +-- Tortured Skeletons flags +UPDATE `creature_template` SET `unit_flags` = `unit_flags`&~33554432 WHERE (`entry` = 20662); +-- Most gameobjects were missing Heroic spawns +UPDATE `gameobject` SET `spawnMask` = `spawnMask`|2 WHERE `map` = 555 AND `id` NOT IN (184196); diff --git a/data/sql/updates/db_world/2023_04_27_00.sql b/data/sql/updates/db_world/2023_04_27_00.sql new file mode 100644 index 000000000..1a665b22f --- /dev/null +++ b/data/sql/updates/db_world/2023_04_27_00.sql @@ -0,0 +1,4 @@ +-- DB update 2023_04_26_03 -> 2023_04_27_00 +-- Add Highlord Tirion Fordring - SAY_TIRION_OUTRO_3 +DELETE FROM `creature_text` WHERE `CreatureID`=38995 AND `GroupID`=4 AND `ID`=0; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES (38995, 4, 0, 'The Lich King must fall!!', 14, 0, 0, 0, 0, 17389, 38113, 0, 'Highlord Tirion Fordring - SAY_TIRION_OUTRO_3'); diff --git a/data/sql/updates/db_world/2023_04_27_01.sql b/data/sql/updates/db_world/2023_04_27_01.sql new file mode 100644 index 000000000..9970d2edb --- /dev/null +++ b/data/sql/updates/db_world/2023_04_27_01.sql @@ -0,0 +1,16 @@ +-- DB update 2023_04_27_00 -> 2023_04_27_01 +-- add item_dbc table +DROP TABLE IF EXISTS `item_dbc`; +CREATE TABLE `item_dbc` ( `ID` INT NOT NULL DEFAULT '0', `ClassID` INT NOT NULL DEFAULT '0', `SubclassID` INT NOT NULL DEFAULT '0', `Sound_Override_Subclassid` INT NOT NULL DEFAULT '0', `Material` INT NOT NULL DEFAULT '0', `DisplayInfoID` INT NOT NULL DEFAULT '0', `InventoryType` INT NOT NULL DEFAULT '0', `SheatheType` INT NOT NULL DEFAULT '0', PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Corrects subclass error messages +UPDATE `item_template` SET `subclass`=4 WHERE `entry`=17; +UPDATE `item_template` SET `subclass`=6 WHERE `entry`=2556; +UPDATE `item_template` SET `subclass`=0 WHERE `entry`=20221; +UPDATE `item_template` SET `subclass`=13 WHERE `entry`=31802; +UPDATE `item_template` SET `subclass`=3 WHERE `entry`=33080; +UPDATE `item_template` SET `subclass`=3 WHERE `entry`=33604; +UPDATE `item_template` SET `subclass`=8 WHERE `entry`=37445; +UPDATE `item_template` SET `subclass`=12 WHERE `entry`=37677; +UPDATE `item_template` SET `subclass`=7 WHERE `entry`=41749; +UPDATE `item_template` SET `subclass`=1 WHERE `entry`=53048; diff --git a/data/sql/updates/db_world/2023_04_27_02.sql b/data/sql/updates/db_world/2023_04_27_02.sql new file mode 100644 index 000000000..1d17db4e6 --- /dev/null +++ b/data/sql/updates/db_world/2023_04_27_02.sql @@ -0,0 +1,3 @@ +-- DB update 2023_04_27_01 -> 2023_04_27_02 +DROP TABLE IF EXISTS `chrraces_dbc`; +CREATE TABLE `chrraces_dbc` ( `ID` INT NOT NULL DEFAULT '0', `Flags` INT NOT NULL DEFAULT '0', `FactionID` INT NOT NULL DEFAULT '0', `ExplorationSoundID` INT NOT NULL DEFAULT '0', `MaleDisplayId` INT NOT NULL DEFAULT '0', `FemaleDisplayId` INT NOT NULL DEFAULT '0', `ClientPrefix` TEXT NULL, `BaseLanguage` INT NOT NULL DEFAULT '0', `CreatureType` INT NOT NULL DEFAULT '0', `ResSicknessSpellID` INT NOT NULL DEFAULT '0', `SplashSoundID` INT NOT NULL DEFAULT '0', `ClientFilestring` TEXT NULL, `CinematicSequenceID` INT NOT NULL DEFAULT '0', `Alliance` INT NOT NULL DEFAULT '0', `Name_Lang_enUS` TEXT NULL, `Name_Lang_enGB` TEXT NULL, `Name_Lang_koKR` TEXT NULL, `Name_Lang_frFR` TEXT NULL, `Name_Lang_deDE` TEXT NULL, `Name_Lang_enCN` TEXT NULL, `Name_Lang_zhCN` TEXT NULL, `Name_Lang_enTW` TEXT NULL, `Name_Lang_zhTW` TEXT NULL, `Name_Lang_esES` TEXT NULL, `Name_Lang_esMX` TEXT NULL, `Name_Lang_ruRU` TEXT NULL, `Name_Lang_ptPT` TEXT NULL, `Name_Lang_ptBR` TEXT NULL, `Name_Lang_itIT` TEXT NULL, `Name_Lang_Unk` TEXT NULL, `Name_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', `Name_Female_Lang_enUS` TEXT NULL, `Name_Female_Lang_enGB` TEXT NULL, `Name_Female_Lang_koKR` TEXT NULL, `Name_Female_Lang_frFR` TEXT NULL, `Name_Female_Lang_deDE` TEXT NULL, `Name_Female_Lang_enCN` TEXT NULL, `Name_Female_Lang_zhCN` TEXT NULL, `Name_Female_Lang_enTW` TEXT NULL, `Name_Female_Lang_zhTW` TEXT NULL, `Name_Female_Lang_esES` TEXT NULL, `Name_Female_Lang_esMX` TEXT NULL, `Name_Female_Lang_ruRU` TEXT NULL, `Name_Female_Lang_ptPT` TEXT NULL, `Name_Female_Lang_ptBR` TEXT NULL, `Name_Female_Lang_itIT` TEXT NULL, `Name_Female_Lang_Unk` TEXT NULL, `Name_Female_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', `Name_Male_Lang_enUS` TEXT NULL, `Name_Male_Lang_enGB` TEXT NULL, `Name_Male_Lang_koKR` TEXT NULL, `Name_Male_Lang_frFR` TEXT NULL, `Name_Male_Lang_deDE` TEXT NULL, `Name_Male_Lang_enCN` TEXT NULL, `Name_Male_Lang_zhCN` TEXT NULL, `Name_Male_Lang_enTW` TEXT NULL, `Name_Male_Lang_zhTW` TEXT NULL, `Name_Male_Lang_esES` TEXT NULL, `Name_Male_Lang_esMX` TEXT NULL, `Name_Male_Lang_ruRU` TEXT NULL, `Name_Male_Lang_ptPT` TEXT NULL, `Name_Male_Lang_ptBR` TEXT NULL, `Name_Male_Lang_itIT` TEXT NULL, `Name_Male_Lang_Unk` TEXT NULL, `Name_Male_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', `FacialHairCustomization_1` TEXT NULL, `FacialHairCustomization_2` TEXT NULL, `HairCustomization` TEXT NULL, `Required_Expansion` INT NOT NULL DEFAULT '0', PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/data/sql/updates/db_world/2023_04_29_00.sql b/data/sql/updates/db_world/2023_04_29_00.sql new file mode 100644 index 000000000..42cf1545d --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_00.sql @@ -0,0 +1,53 @@ +-- DB update 2023_04_27_02 -> 2023_04_29_00 +DROP TABLE IF EXISTS `lfgdungeons_dbc`; +CREATE TABLE `lfgdungeons_dbc` ( +`ID` INT NOT NULL DEFAULT '0', +`Name_Lang_enUS` TEXT NULL, +`Name_Lang_enGB` TEXT NULL, +`Name_Lang_koKR` TEXT NULL, +`Name_Lang_frFR` TEXT NULL, +`Name_Lang_deDE` TEXT NULL, +`Name_Lang_enCN` TEXT NULL, +`Name_Lang_zhCN` TEXT NULL, +`Name_Lang_enTW` TEXT NULL, +`Name_Lang_zhTW` TEXT NULL, +`Name_Lang_esES` TEXT NULL, +`Name_Lang_esMX` TEXT NULL, +`Name_Lang_ruRU` TEXT NULL, +`Name_Lang_ptPT` TEXT NULL, +`Name_Lang_ptBR` TEXT NULL, +`Name_Lang_itIT` TEXT NULL, +`Name_Lang_Unk` TEXT NULL, +`Name_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', +`MinLevel` INT NOT NULL DEFAULT '0', +`MaxLevel` INT NOT NULL DEFAULT '0', +`Target_Level` INT NOT NULL DEFAULT '0', +`Target_Level_Min` INT NOT NULL DEFAULT '0', +`Target_Level_Max` INT NOT NULL DEFAULT '0', +`MapID` INT NOT NULL DEFAULT '0', +`Difficulty` INT NOT NULL DEFAULT '0', +`Flags` INT NOT NULL DEFAULT '0', +`TypeID` INT NOT NULL DEFAULT '0', +`Faction` INT NOT NULL DEFAULT '0', +`TextureFilename` TEXT NULL, +`ExpansionLevel` INT NOT NULL DEFAULT '0', +`Order_Index` INT NOT NULL DEFAULT '0', +`Group_Id` INT NOT NULL DEFAULT '0', +`Description_Lang_enUS` TEXT NULL, +`Description_Lang_enGB` TEXT NULL, +`Description_Lang_koKR` TEXT NULL, +`Description_Lang_frFR` TEXT NULL, +`Description_Lang_deDE` TEXT NULL, +`Description_Lang_enCN` TEXT NULL, +`Description_Lang_zhCN` TEXT NULL, +`Description_Lang_enTW` TEXT NULL, +`Description_Lang_zhTW` TEXT NULL, +`Description_Lang_esES` TEXT NULL, +`Description_Lang_esMX` TEXT NULL, +`Description_Lang_ruRU` TEXT NULL, +`Description_Lang_ptPT` TEXT NULL, +`Description_Lang_ptBR` TEXT NULL, +`Description_Lang_itIT` TEXT NULL, +`Description_Lang_Unk` TEXT NULL, +`Description_Lang_Mask` INT UNSIGNED NOT NULL DEFAULT '0', +PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/data/sql/updates/db_world/2023_04_29_01.sql b/data/sql/updates/db_world/2023_04_29_01.sql new file mode 100644 index 000000000..9ac21b73a --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_01.sql @@ -0,0 +1,100 @@ +-- DB update 2023_04_29_00 -> 2023_04_29_01 +-- -------------------------------------------------------- +-- Host: 127.0.0.1 +-- Server version: 8.0.29 - MySQL Community Server - GPL +-- Server OS: Win64 +-- HeidiSQL Version: 12.0.0.6468 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- Dumping structure for table acore_world.chrraces_dbc +DROP TABLE IF EXISTS `chrraces_dbc`; +CREATE TABLE IF NOT EXISTS `chrraces_dbc` ( + `ID` int NOT NULL DEFAULT '0', + `Flags` int NOT NULL DEFAULT '0', + `FactionID` int NOT NULL DEFAULT '0', + `ExplorationSoundID` int NOT NULL DEFAULT '0', + `MaleDisplayId` int NOT NULL DEFAULT '0', + `FemaleDisplayId` int NOT NULL DEFAULT '0', + `ClientPrefix` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `BaseLanguage` int NOT NULL DEFAULT '0', + `CreatureType` int NOT NULL DEFAULT '0', + `ResSicknessSpellID` int NOT NULL DEFAULT '0', + `SplashSoundID` int NOT NULL DEFAULT '0', + `ClientFilestring` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `CinematicSequenceID` int NOT NULL DEFAULT '0', + `Alliance` int NOT NULL DEFAULT '0', + `Name_Lang_enUS` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_enGB` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_koKR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_frFR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_deDE` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_enCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_zhCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_enTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_zhTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_esES` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_esMX` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_ruRU` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_ptPT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_ptBR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_itIT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_Unk` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Lang_Mask` int unsigned NOT NULL DEFAULT '0', + `Name_Female_Lang_enUS` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_enGB` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_koKR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_frFR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_deDE` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_enCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_zhCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_enTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_zhTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_esES` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_esMX` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_ruRU` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_ptPT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_ptBR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_itIT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_Unk` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Female_Lang_Mask` int unsigned NOT NULL DEFAULT '0', + `Name_Male_Lang_enUS` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_enGB` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_koKR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_frFR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_deDE` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_enCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_zhCN` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_enTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_zhTW` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_esES` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_esMX` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_ruRU` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_ptPT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_ptBR` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_itIT` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_Unk` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Name_Male_Lang_Mask` int unsigned NOT NULL DEFAULT '0', + `FacialHairCustomization_1` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `FacialHairCustomization_2` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `HairCustomization` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `Required_Expansion` int NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- Dumping data for table acore_world.chrraces_dbc: ~0 rows (approximately) +DELETE FROM `chrraces_dbc`; + +/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */; diff --git a/data/sql/updates/db_world/2023_04_29_02.sql b/data/sql/updates/db_world/2023_04_29_02.sql new file mode 100644 index 000000000..74eeef405 --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_02.sql @@ -0,0 +1,24 @@ +-- DB update 2023_04_29_01 -> 2023_04_29_02 +-- + +DELETE FROM `creature` WHERE `guid` IN (125917, 125918, 125920, 125921) AND `id1` = 18766; -- Pool of Souls +INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `npcflag`, `MovementType`) VALUES +(125917, 18766, 558, 3, 1, 0, 113.589, -132.944, -139.589, 2.72271, 7200, 0, 0, 1, 0, 0, 0), +(125918, 18766, 558, 3, 1, 0, 40.7895, -191.962, -139.589, 3.89208, 7200, 0, 0, 1, 0, 0, 0), +(125920, 18766, 558, 3, 1, 0, 113.81, -191.401, -139.589, 2.9147, 7200, 0, 0, 1, 0, 0, 0), +(125921, 18766, 558, 3, 1, 0, 40.4961, -134.312, -139.589, 5.74213, 7200, 0, 0, 1, 0, 0, 0); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`IN (18766); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(18766) AND `source_type`=0; +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`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18766, 0, 0, 0, 10, 0, 100, 0, 0, 60, 1000, 1000, 0, 11, 32889, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Pool of Souls - Ooc los - Cast Grasp of Death'); + +UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33554432 WHERE `entry` = 18766; + +DELETE FROM `creature_template_movement` WHERE `creatureId` = 18766; +INSERT INTO `creature_template_movement` (`CreatureId`, `Flight`, `Rooted`) VALUES +(18766, 1, 1); + +DELETE FROM `creature_template_addon` WHERE `entry`= 20316; +INSERT INTO `creature_template_addon` (`entry`, `auras`) VALUES +(20316, '35841 35850'); -- Raging Soul diff --git a/data/sql/updates/db_world/2023_04_29_03.sql b/data/sql/updates/db_world/2023_04_29_03.sql new file mode 100644 index 000000000..93dc9f54e --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_03.sql @@ -0,0 +1,22 @@ +-- DB update 2023_04_29_02 -> 2023_04_29_03 +-- +DELETE FROM `waypoints` WHERE `entry` = 1728000; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `point_comment`) VALUES +(1728000,1,-1273.8602,1493.8004,68.55935,NULL,'Shattered Hand Warhound - Decomposed'), -- Decomposed +(1728000,2,-1279.3286,1497.2529,68.56155,NULL,'Shattered Hand Warhound'), +(1728000,3,-1290.9882,1513.8473,68.57747,NULL,'Shattered Hand Warhound'), +(1728000,4,-1293.7421,1531.0709,68.577995,NULL,'Shattered Hand Warhound'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17455) AND (`source_type` = 0) AND (`id` IN (3, 4, 5, 6)); +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`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17455, 0, 3, 4, 0, 0, 100, 1, 25000, 25000, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Beastmaster - In Combat - Say Text'), +(17455, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 12, 17280, 4, 60000, 0, 0, 0, 8, 0, 0, 0, 0, -1256.9419, 1483.1189, 68.57015, 2.578432559967041015, 'Bonechewer Beastmaster - In Combat - Summon Creature'), +(17455, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 0, 12, 17280, 4, 60000, 0, 0, 0, 8, 0, 0, 0, 0, -1256.0056, 1477.52, 68.560974, 2.30606842041015625, 'Bonechewer Beastmaster - In Combat - Summon Creature'), +(17455, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 12, 17280, 4, 60000, 0, 0, 0, 8, 0, 0, 0, 0, -1257.537, 1474.4856, 68.56642, 1.780675649642944335, 'Bonechewer Beastmaster - In Combat - Summon Creature'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17280) AND (`source_type` = 0) AND (`id` IN (2, 3)); +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`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17280, 0, 2, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1728000, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Warhound - On Just Summoned - Start Waypoint'), +(17280, 0, 3, 0, 58, 0, 100, 0, 4, 1728000, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Warhound - On Waypoint Finished - Set In Combat With Zone'); + +UPDATE `creature_template` SET `flags_extra` = `flags_extra`&~33554432 WHERE (`entry` IN (17280, 18059)); diff --git a/data/sql/updates/db_world/2023_04_29_04.sql b/data/sql/updates/db_world/2023_04_29_04.sql new file mode 100644 index 000000000..dfc36f66b --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_04.sql @@ -0,0 +1,33 @@ +-- DB update 2023_04_29_03 -> 2023_04_29_04 +-- Kidney Shot updates +UPDATE `smart_scripts` SET `event_param1` = 6100, `event_param2` = 17200, `event_param3` = 20650, `event_param4` = 26950 WHERE (`entryorguid` = 17264) AND (`source_type` = 0) AND (`id` = 2); -- Bonechewer Ravener +UPDATE `smart_scripts` SET `event_param1` = 5700, `event_param2` = 25050, `event_param3` = 15400, `event_param4` = 25050 WHERE (`entryorguid` = 17517) AND (`source_type` = 0) AND (`id` = 0); -- Hellfire Sentry + +-- Complete Rewrites +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (17259, 17271, 17269)); +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`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17259, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Hungerer - On Aggro - Say Line 0'), +(17259, 0, 1, 0, 0, 0, 100, 0, 1200, 12050, 10900, 27600, 0, 11, 16244, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Hungerer - In Combat - Cast \'Demoralizing Shout\''), +(17259, 0, 2, 0, 0, 0, 100, 0, 3700, 17400, 6100, 19750, 0, 11, 6713, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Hungerer - In Combat - Cast \'Disarm\''), +(17259, 0, 3, 0, 0, 0, 100, 0, 3700, 23550, 6100, 19750, 0, 11, 14516, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Hungerer - In Combat - Cast \'Strike\''), +(17271, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Destroyer - On Aggro - Say Line 0'), +(17271, 0, 1, 0, 0, 0, 100, 0, 3200, 10900, 6500, 18600, 0, 11, 16856, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Destroyer - In Combat - Cast \'Mortal Strike\''), +(17271, 0, 2, 3, 0, 0, 100, 0, 19300, 31400, 11100, 27100, 0, 11, 10101, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Destroyer - In Combat - Cast \'Knock Away\''), +(17271, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 13, 0, 35, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bonechewer Destroyer - In Combat - Set Single Threat 0-35'), +(17269, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Darkcaster - On Aggro - Say Line 0'), +(17269, 0, 1, 0, 0, 0, 100, 2, 0, 2050, 1750, 2050, 0, 11, 15241, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Darkcaster - In Combat - Cast \'Scorch\' (Normal Dungeon)'), +(17269, 0, 2, 0, 0, 0, 100, 4, 0, 2050, 1750, 2050, 0, 11, 36807, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Darkcaster - In Combat - Cast \'Scorch\' (Heroic Dungeon)'), +(17269, 0, 3, 0, 0, 0, 100, 2, 15650, 23000, 20650, 31600, 0, 11, 20754, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Darkcaster - In Combat - Cast \'Rain of Fire\' (Normal Dungeon)'), +(17269, 0, 4, 0, 0, 0, 100, 4, 15650, 23000, 20650, 31600, 0, 11, 36808, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Darkcaster - In Combat - Cast \'Rain of Fire\' (Heroic Dungeon)'); + +-- Partial Rewrites +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17280) AND (`source_type` = 0) AND (`id` IN (0, 1)); +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`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17280, 0, 0, 0, 0, 0, 100, 0, 1050, 9100, 12150, 24350, 0, 11, 30636, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Warhound - In Combat - Cast \'Furious Howl\''), +(17280, 0, 1, 0, 0, 0, 100, 0, 3700, 15800, 3700, 15800, 0, 11, 30639, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Warhound - In Combat - Cast \'Carnivorous Bite\''); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17478) AND (`source_type` = 0) AND (`id` IN (3, 4, 5)); +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`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17478, 0, 3, 0, 0, 0, 100, 2, 800, 1700, 3600, 4700, 0, 11, 12471, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Scryer - In Combat - Cast \'Shadow Bolt\' (Normal Dungeon)'), +(17478, 0, 4, 0, 0, 0, 100, 4, 800, 1700, 3600, 4700, 0, 11, 15232, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Scryer - In Combat - Cast \'Shadow Bolt\' (Heroic Dungeon)'), +(17478, 0, 5, 0, 0, 0, 100, 0, 4850, 23500, 15450, 23800, 0, 11, 30615, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Bleeding Hollow Scryer - In Combat - Cast \'Fear\''); diff --git a/data/sql/updates/db_world/2023_04_29_05.sql b/data/sql/updates/db_world/2023_04_29_05.sql new file mode 100644 index 000000000..7f9095491 --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_05.sql @@ -0,0 +1,14 @@ +-- DB update 2023_04_29_04 -> 2023_04_29_05 +-- +DELETE FROM `spell_area` WHERE `spell` = 57940 AND `area` IN (495,4277); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(57940, 495, 0, 0, 0, 0, 2, 1, 0, 0), -- Howling Fjord +(57940, 4277, 0, 0, 0, 0, 2, 1, 0, 0); -- Azjol-Nerub (Dungeon) + +-- Remove Essence of Wintergrasp in Instances (must be obtained only in Northrend map and Dungeons) +DELETE FROM `spell_area` WHERE `spell` = 57940 AND `area` IN ( +3456, -- Naxxramas +4493, -- The Obsidian Sanctum +4603, -- Vault of Archavon +4273 -- Ulduar +); diff --git a/data/sql/updates/db_world/2023_04_29_06.sql b/data/sql/updates/db_world/2023_04_29_06.sql new file mode 100644 index 000000000..398871a5f --- /dev/null +++ b/data/sql/updates/db_world/2023_04_29_06.sql @@ -0,0 +1,10 @@ +-- DB update 2023_04_29_05 -> 2023_04_29_06 +-- +DELETE FROM `spell_area` WHERE `spell` = 57940 AND `area` IN (4723, 4809, 4813, 4820); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(57940, 4723, 0, 0, 0, 0, 2, 1, 0, 0), +(57940, 4809, 0, 0, 0, 0, 2, 1, 0, 0), +(57940, 4813, 0, 0, 0, 0, 2, 1, 0, 0), +(57940, 4820, 0, 0, 0, 0, 2, 1, 0, 0); + +UPDATE `spell_area` SET `quest_start_status` = 0, `quest_end_status` = 0 WHERE `spell` = 57940; diff --git a/data/sql/updates/db_world/2023_04_30_00.sql b/data/sql/updates/db_world/2023_04_30_00.sql new file mode 100644 index 000000000..b39444194 --- /dev/null +++ b/data/sql/updates/db_world/2023_04_30_00.sql @@ -0,0 +1,24 @@ +-- DB update 2023_04_29_06 -> 2023_04_30_00 +-- + +DELETE FROM `warden_checks` WHERE `id` IN (793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811); +INSERT INTO `warden_checks` (`id`, `type`, `data`, `str`, `address`, `length`, `result`, `comment`) VALUES +(793, 139, NULL, 'local f=DEFAULT_CHAT_FRAME for i=1,f:GetNumMessages() do if (f:GetMessageInfo(i)):find("New addon name is ") then return true end end', NULL, NULL, NULL, 'Detects KickKitty'), +(794, 139, NULL, 'local f=DEFAULT_CHAT_FRAME for i=1,f:GetNumMessages() do if (f:GetMessageInfo(i)):find(". It\'s in new directory not this one") then return true end end', NULL, NULL, NULL, 'Detects KickKitty'), +(795, 217, '', 'BlackMagic.dll', 0, 0, '', 'BlackMagic - injected dll'), +(796, 217, '', 'x0.dll', 0, 0, '', 'x0 gold hack dll'), +(797, 217, '', 'Luim.dll', 0, 0, '', 'Lua Unlocker dll'), +(798, 217, '', 'Gold Hack.dll', 0, 0, '', 'Gold Hack dll'), +(799, 217, '', 'fasmdll_managed.dll', 0, 0, '', 'Rotation Bot'), +(800, 217, '', 'PortBlock.dll', 0, 0, '', 'Multiclient Lagger'), +(801, 217, '', 'PinvokeCollection.dll', 0, 0, '', 'Keysender'), +(802, 217, '', 'FuncCollection.dll', 0, 0, '', 'Multi Hack dll'), +(803, 139, NULL, 'local f=DEFAULT_CHAT_FRAME for i=1,f:GetNumMessages() do if (f:GetMessageInfo(i)):find("Rotation : %3s") then return true end end', NULL, NULL, NULL, 'Cloud Magic Rotation Bot'), +(804, 217, '', 'nampower.dll', 0, 0, '', 'Multi Hack dll'), +(805, 217, '', 'EWTDll.dll', 0, 0, '', 'Multi Hack dll'), +(806, 217, '', 'iKillFish.dll', 0, 0, '', 'Fish Bot'), +(807, 217, '', 'iwanna.dll', 0, 0, '', 'Fish Bot'), +(808, 217, '', 'oGasai.dll', 0, 0, '', 'Multi Hack dll'), +(809, 217, '', 'tMorph.dll', 0, 0, '', 'tMorph - injected dll'), +(810, 217, '', 'jMorph.dll', 0, 0, '', 'jMorph - injected dll'), +(811, 217, '', 'dmorph.dll', 0, 0, '', 'dmorph - injected dll'); diff --git a/data/sql/updates/db_world/2023_05_01_00.sql b/data/sql/updates/db_world/2023_05_01_00.sql new file mode 100644 index 000000000..019baccdc --- /dev/null +++ b/data/sql/updates/db_world/2023_05_01_00.sql @@ -0,0 +1,3 @@ +-- DB update 2023_04_30_00 -> 2023_05_01_00 +-- +DELETE FROM `warden_checks` WHERE `id` IN (793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811); diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 99dfc9cc0..ac3935a12 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -1309,6 +1309,14 @@ DeletedCharacterTicketTrace = 0 DungeonFinder.OptionsMask = 5 +# +# DBC.EnforceItemAttributes +# Disallow overriding item attributes stored in DBC files with values from the database +# Default: 0 - Off, Use DB values +# 1 - On, Enforce DBC Values (default) + +DBC.EnforceItemAttributes = 1 + # # AccountInstancesPerHour # Description: Controls the max amount of different instances player can enter within hour diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 70308be04..88d82027e 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -2007,7 +2007,7 @@ private: bool IsItemValid(SmartScriptHolder const& e, uint32 entry) { - if (!sObjectMgr->GetItemTemplate(entry)) + if (!sItemStore.LookupEntry(entry)) { LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} uses non-existent Item entry {}, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry); return false; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index f195c41ee..a0fd111b0 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -108,6 +108,7 @@ DBCStorage sGtRegenMPPerSptStore(GtRegenMPPerSptf DBCStorage sHolidaysStore(Holidaysfmt); +DBCStorage sItemStore(Itemfmt); DBCStorage sItemBagFamilyStore(ItemBagFamilyfmt); //DBCStorage sItemCondExtCostsStore(ItemCondExtCostsEntryfmt); DBCStorage sItemDisplayInfoStore(ItemDisplayTemplateEntryfmt); @@ -329,6 +330,7 @@ void LoadDBCStores(const std::string& dataPath) LOAD_DBC(sGtRegenHPPerSptStore, "gtRegenHPPerSpt.dbc", "gtregenhpperspt_dbc"); LOAD_DBC(sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc", "gtregenmpperspt_dbc"); LOAD_DBC(sHolidaysStore, "Holidays.dbc", "holidays_dbc"); + LOAD_DBC(sItemStore, "Item.dbc", "item_dbc"); LOAD_DBC(sItemBagFamilyStore, "ItemBagFamily.dbc", "itembagfamily_dbc"); LOAD_DBC(sItemDisplayInfoStore, "ItemDisplayInfo.dbc", "itemdisplayinfo_dbc"); //LOAD_DBC(sItemCondExtCostsStore, "ItemCondExtCosts.dbc", "itemcondextcosts_dbc"); @@ -650,9 +652,10 @@ void LoadDBCStores(const std::string& dataPath) } // Check loaded DBC files proper version - if (!sAreaTableStore.LookupEntry(4987) || // last area added in 3.3.5a + if (!sAreaTableStore.LookupEntry(4987) || // last area added in 3.3.5a !sCharTitlesStore.LookupEntry(177) || // last char title added in 3.3.5a !sGemPropertiesStore.LookupEntry(1629) || // last added spell in 3.3.5a + !sItemStore.LookupEntry(56806) || // last client known item added in 3.3.5a !sItemExtendedCostStore.LookupEntry(2997) || // last item extended cost added in 3.3.5a !sMapStore.LookupEntry(724) || // last map added in 3.3.5a !sSpellStore.LookupEntry(80864) ) // last client known item added in 3.3.5a @@ -875,9 +878,15 @@ CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType /// Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple dungeons use the same map (such as Scarlet Monastery) LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty) { - for (LFGDungeonEntry const* dungeon : sLFGDungeonStore) - if (dungeon->map == int32(mapId) && Difficulty(dungeon->difficulty) == difficulty) + for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i) + { + LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i); + if (!dungeon) + continue; + + if (dungeon->MapID == uint32(mapId) && Difficulty(dungeon->Difficulty) == difficulty) return dungeon; + } return nullptr; } @@ -886,7 +895,7 @@ LFGDungeonEntry const* GetZoneLFGDungeonEntry(std::string const& zoneName, Local { for (LFGDungeonEntry const* dungeon : sLFGDungeonStore) { - if (dungeon->type == lfg::LFG_TYPE_ZONE && zoneName.find(dungeon->name[locale]) != std::string::npos) + if (dungeon->TypeID == lfg::LFG_TYPE_ZONE && zoneName.find(dungeon->Name[locale]) != std::string::npos) { return dungeon; } diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 148525cdc..344f26cd6 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -130,6 +130,7 @@ extern DBCStorage sGtRegenHPPerSptStore; extern DBCStorage sGtRegenMPPerSptStore; extern DBCStorage sHolidaysStore; extern DBCStorage sItemBagFamilyStore; +extern DBCStorage sItemStore; extern DBCStorage sItemDisplayInfoStore; extern DBCStorage sItemExtendedCostStore; extern DBCStorage sItemLimitCategoryStore; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 5e9306abc..ae21b5c76 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -189,7 +189,7 @@ namespace lfg if (!dungeon) continue; - switch (dungeon->type) + switch (dungeon->TypeID) { case LFG_TYPE_DUNGEON: case LFG_TYPE_HEROIC: diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index dceeefb22..dea74893a 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -394,10 +394,10 @@ namespace lfg { LFGDungeonData(): name("") { } - LFGDungeonData(LFGDungeonEntry const* dbc): id(dbc->ID), name(dbc->name[0]), map(dbc->map), - type(dbc->type), expansion(dbc->expansion), group(dbc->grouptype), - minlevel(dbc->minlevel), maxlevel(dbc->maxlevel), difficulty(Difficulty(dbc->difficulty)), - seasonal(dbc->flags & LFG_FLAG_SEASONAL), x(0.0f), y(0.0f), z(0.0f), o(0.0f) + LFGDungeonData(LFGDungeonEntry const* dbc) : id(dbc->ID), name(dbc->Name[0]), map(dbc->MapID), + type(dbc->TypeID), expansion(uint8(dbc->ExpansionLevel)), group(uint8(dbc->GroupID)), + minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->Difficulty)), + seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f) { } uint32 id{0}; diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index 68b9df231..593b94beb 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -451,7 +451,7 @@ namespace lfg { if (Player* player = ObjectAccessor::FindConnectedPlayer(itRoles->first)) { - if (player->GetMapId() == static_cast(dungeon->map)) + if (player->GetMapId() == static_cast(dungeon->MapID)) { if (InstanceScript* instance = player->GetInstanceScript()) { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8f2af8851..c1dba76dd 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5879,7 +5879,7 @@ void Player::RewardReputation(Unit* victim, float rate) Map const* map = GetMap(); if (map->IsNonRaidDungeon()) if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty())) - if (dungeon->reclevel == 80) + if (dungeon->TargetLevel == 80) ChampioningFaction = GetChampioningFaction(); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c01d06403..c4f1d7025 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -812,8 +812,14 @@ void Unit::DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb) } } -uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, bool /*allowGM*/, Spell const* damageSpell /*= nullptr*/) +uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, bool /*allowGM*/, Spell const* damageSpell /*= nullptr*/, bool delayed) { + if (delayed && attacker->GetTypeId() == TYPEID_PLAYER && attacker->GetGUID() != victim->GetGUID()) + { + sWorld->AddDelayedDamage(attacker, victim, damage, cleanDamage, damagetype, damageSchoolMask, spellProto, durabilityLoss); + return 0; + } + // Xinef: initialize damage done for rage calculations // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0); @@ -1454,7 +1460,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss, // Call default DealDamage CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL); - Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell); + Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell, true); } // @todo for melee need create structure as in @@ -20189,7 +20195,10 @@ void Unit::_ExitVehicle(Position const* exitPosition) } if (player) + { player->ResummonPetTemporaryUnSummonedIfAny(); + player->SetCanTeleport(true); + } } void Unit::BuildMovementPacket(ByteBuffer* data) const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2081b013f..d3083f7cf 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -757,6 +757,18 @@ struct CleanDamage struct CalcDamageInfo; struct SpellNonMeleeDamage; +struct DelayedDamage +{ + Unit* attacker; + Unit* victim; + uint32 damage; + CleanDamage const* cleanDamage; + DamageEffectType damagetype; + SpellSchoolMask damageSchoolMask; + SpellInfo const* spellProto; + bool durabilityLoss; +}; + class DamageInfo { private: @@ -1559,7 +1571,7 @@ public: uint16 GetMaxSkillValueForLevel(Unit const* target = nullptr) const { return (target ? getLevelForTarget(target) : GetLevel()) * 5; } static void DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb); - static uint32 DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage = nullptr, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = nullptr, bool durabilityLoss = true, bool allowGM = false, Spell const* spell = nullptr); + static uint32 DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage = nullptr, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = nullptr, bool durabilityLoss = true, bool allowGM = false, Spell const* spell = nullptr, bool delayed = false); static void Kill(Unit* killer, Unit* victim, bool durabilityLoss = true, WeaponAttackType attackType = BASE_ATTACK, SpellInfo const* spellProto = nullptr, Spell const* spell = nullptr); void KillSelf(bool durabilityLoss = true, WeaponAttackType attackType = BASE_ATTACK, SpellInfo const* spellProto = nullptr, Spell const* spell = nullptr) { Kill(this, this, durabilityLoss, attackType, spellProto, spell); }; static int32 DealHeal(Unit* healer, Unit* victim, uint32 addhealth); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index e3176547d..c40591cfd 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1595,9 +1595,9 @@ void ObjectMgr::LoadEquipmentTemplates() if (!equipmentInfo.ItemEntry[i]) continue; - ItemTemplate const* item = GetItemTemplate(equipmentInfo.ItemEntry[i]); + ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]); - if (!item) + if (!dbcItem) { LOG_ERROR("sql.sql", "Unknown item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {}, forced to 0.", equipmentInfo.ItemEntry[i], i + 1, entry, id); @@ -1605,15 +1605,15 @@ void ObjectMgr::LoadEquipmentTemplates() continue; } - if (item->InventoryType != INVTYPE_WEAPON && - item->InventoryType != INVTYPE_SHIELD && - item->InventoryType != INVTYPE_RANGED && - item->InventoryType != INVTYPE_2HWEAPON && - item->InventoryType != INVTYPE_WEAPONMAINHAND && - item->InventoryType != INVTYPE_WEAPONOFFHAND && - item->InventoryType != INVTYPE_HOLDABLE && - item->InventoryType != INVTYPE_THROWN && - item->InventoryType != INVTYPE_RANGEDRIGHT) + if (dbcItem->InventoryType != INVTYPE_WEAPON && + dbcItem->InventoryType != INVTYPE_SHIELD && + dbcItem->InventoryType != INVTYPE_RANGED && + dbcItem->InventoryType != INVTYPE_2HWEAPON && + dbcItem->InventoryType != INVTYPE_WEAPONMAINHAND && + dbcItem->InventoryType != INVTYPE_WEAPONOFFHAND && + dbcItem->InventoryType != INVTYPE_HOLDABLE && + dbcItem->InventoryType != INVTYPE_THROWN && + dbcItem->InventoryType != INVTYPE_RANGEDRIGHT) { LOG_ERROR("sql.sql", "Item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {} is not equipable in a hand, forced to 0.", equipmentInfo.ItemEntry[i], i + 1, entry, id); @@ -2741,8 +2741,10 @@ void ObjectMgr::LoadItemTemplates() return; } - _itemTemplateStore.rehash(result->GetRowCount()); + _itemTemplateStore.reserve(result->GetRowCount()); uint32 count = 0; + // original inspiration https://github.com/TrinityCore/TrinityCore/commit/0c44bd33ee7b42c924859139a9f4b04cf2b91261 + bool enforceDBCAttributes = sWorld->getBoolConfig(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES); do { @@ -2859,17 +2861,55 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FlagsCu = fields[137].Get(); // Checks - if (itemTemplate.Class >= MAX_ITEM_CLASS) - { - LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Class value ({})", entry, itemTemplate.Class); - itemTemplate.Class = ITEM_CLASS_MISC; - } + ItemEntry const* dbcitem = sItemStore.LookupEntry(entry); - if (itemTemplate.SubClass >= MaxItemSubclassValues[itemTemplate.Class]) + if (dbcitem) { - LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Subclass value ({}) for class {}", entry, itemTemplate.SubClass, itemTemplate.Class); - itemTemplate.SubClass = 0;// exist for all item classes + if (itemTemplate.Class != dbcitem->ClassID) + { + LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Class value ({}), must be ({}).", entry, itemTemplate.Class, dbcitem->ClassID); + if (enforceDBCAttributes) + itemTemplate.Class = dbcitem->ClassID; + } + if (itemTemplate.SubClass != dbcitem->SubclassID) + { + LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Subclass value ({}) for class {}, must be ({}).", entry, itemTemplate.SubClass, itemTemplate.Class, dbcitem->SubclassID); + if (enforceDBCAttributes) + itemTemplate.SubClass = dbcitem->SubclassID; + } + if (itemTemplate.SoundOverrideSubclass != dbcitem->SoundOverrideSubclassID) + { + LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct SoundOverrideSubclass ({}), must be {}.", entry, itemTemplate.SoundOverrideSubclass); + if (enforceDBCAttributes) + itemTemplate.SoundOverrideSubclass = dbcitem->SoundOverrideSubclassID; + } + if (itemTemplate.Material != dbcitem->Material) + { + LOG_ERROR("sql.sql", "Item (Entry: {%u}}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material); + if (enforceDBCAttributes) + itemTemplate.Material = dbcitem->Material; + } + if (itemTemplate.InventoryType != dbcitem->InventoryType) + { + LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong InventoryType value ({}), must be {}.", entry, itemTemplate.InventoryType, dbcitem->InventoryType); + if (enforceDBCAttributes) + itemTemplate.InventoryType = dbcitem->InventoryType; + } + if (itemTemplate.DisplayInfoID != dbcitem->DisplayInfoID) + { + LOG_ERROR("sql.sql", "Item (Entry: {%u}}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID); + if (enforceDBCAttributes) + itemTemplate.DisplayInfoID = dbcitem->DisplayInfoID; + } + if (itemTemplate.Sheath != dbcitem->SheatheType) + { + LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Sheath ({}), must be {}.", entry, itemTemplate.Sheath, dbcitem->SheatheType); + if (enforceDBCAttributes) + itemTemplate.Sheath = dbcitem->SheatheType; + } } + else + LOG_ERROR("sql.sql", "Item (Entry: {}) does not exist in item.dbc! (not correct id?).", entry); if (itemTemplate.Quality >= MAX_ITEM_QUALITY) { @@ -2902,12 +2942,6 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.BuyCount = 1; } - if (itemTemplate.InventoryType >= MAX_INVTYPE) - { - LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong InventoryType value ({})", entry, itemTemplate.InventoryType); - itemTemplate.InventoryType = INVTYPE_NON_EQUIP; - } - if (itemTemplate.RequiredSkill >= MAX_SKILL_TYPE) { LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RequiredSkill value ({})", entry, itemTemplate.RequiredSkill); @@ -3118,12 +3152,6 @@ void ObjectMgr::LoadItemTemplates() if (itemTemplate.LockID && !sLockStore.LookupEntry(itemTemplate.LockID)) LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LockID ({})", entry, itemTemplate.LockID); - if (itemTemplate.Sheath >= MAX_SHEATHETYPE) - { - LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Sheath ({})", entry, itemTemplate.Sheath); - itemTemplate.Sheath = SHEATHETYPE_NONE; - } - if (itemTemplate.RandomProperty) { // To be implemented later @@ -9995,8 +10023,8 @@ void ObjectMgr::LoadGameObjectQuestItems() { uint32 oldMSTime = getMSTime(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId FROM gameobject_questitem ORDER BY Idx ASC"); + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId, Idx FROM gameobject_questitem ORDER BY Idx ASC"); if (!result) { @@ -10011,6 +10039,21 @@ void ObjectMgr::LoadGameObjectQuestItems() uint32 entry = fields[0].Get(); uint32 item = fields[1].Get(); + uint32 idx = fields[2].Get(); + + GameObjectTemplate const* goInfo = GetGameObjectTemplate(entry); + if (!goInfo) + { + LOG_ERROR("sql.sql", "Table `gameobject_questitem` has data for nonexistent gameobject (entry: {}, idx: {}), skipped", entry, idx); + continue; + }; + + ItemEntry const* dbcData = sItemStore.LookupEntry(item); + if (!dbcData) + { + LOG_ERROR("sql.sql", "Table `gameobject_questitem` has nonexistent item (ID: {}) in gameobject (entry: {}, idx: {}), skipped", item, entry, idx); + continue; + }; _gameObjectQuestItemStore[entry].push_back(item); @@ -10025,8 +10068,8 @@ void ObjectMgr::LoadCreatureQuestItems() { uint32 oldMSTime = getMSTime(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId FROM creature_questitem ORDER BY Idx ASC"); + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC"); if (!result) { @@ -10041,6 +10084,21 @@ void ObjectMgr::LoadCreatureQuestItems() uint32 entry = fields[0].Get(); uint32 item = fields[1].Get(); + uint32 idx = fields[2].Get(); + + CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry); + if (!creatureInfo) + { + LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: {}, idx: {}), skipped", entry, idx); + continue; + }; + + ItemEntry const* dbcData = sItemStore.LookupEntry(item); + if (!dbcData) + { + LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: {}) in creature (entry: {}, idx: {}), skipped", item, entry, idx); + continue; + }; _creatureQuestItemStore[entry].push_back(item); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 5738cdf81..b58b4137f 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2243,7 +2243,7 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptrminlevel > level) + if (lfgDungeon->MinLevel > level) { FillTaxiMask(field, 0); continue; diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 3d013e302..993d7e905 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -505,16 +505,26 @@ void InstanceScript::DoRespawnGameObject(ObjectGuid uiGuid, uint32 uiTimeToDespa { if (GameObject* go = instance->GetGameObject(uiGuid)) { - //not expect any of these should ever be handled - if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE || go->GetGoType() == GAMEOBJECT_TYPE_DOOR || - go->GetGoType() == GAMEOBJECT_TYPE_BUTTON || go->GetGoType() == GAMEOBJECT_TYPE_TRAP) - return; + switch (go->GetGoType()) + { + case GAMEOBJECT_TYPE_DOOR: + case GAMEOBJECT_TYPE_BUTTON: + case GAMEOBJECT_TYPE_TRAP: + case GAMEOBJECT_TYPE_FISHINGNODE: + // not expect any of these should ever be handled + LOG_ERROR("scripts", "InstanceScript: DoRespawnGameObject can't respawn gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType()); + return; + default: + break; + } if (go->isSpawned()) return; go->SetRespawnTime(uiTimeToDespawn); } + else + LOG_DEBUG("scripts", "InstanceScript: DoRespawnGameObject failed"); } void InstanceScript::DoRespawnCreature(ObjectGuid guid, bool force) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 069b75086..b811441bf 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6387,7 +6387,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const SpellPeriodicAuraLogInfo pInfo(this, damage, overkill, absorb, resist, 0.0f, crit); target->SendPeriodicAuraLog(&pInfo); - Unit::DealDamage(caster, target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); + Unit::DealDamage(caster, target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true, false); Unit::ProcDamageAndSpell(caster, target, caster ? procAttacker : 0, procVictim, procEx, damage, BASE_ATTACK, GetSpellInfo(), nullptr, GetEffIndex(), nullptr, &dmgInfo); } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index d1bb58fca..06fa659d2 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4928,11 +4928,11 @@ void Spell::WriteAmmoToPacket(WorldPacket* data) { if (uint32 item_id = m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i)) { - if (ItemTemplate const* itemEntry = sObjectMgr->GetItemTemplate(item_id)) + if (ItemEntry const* itemEntry = sItemStore.LookupEntry(item_id)) { - if (itemEntry->Class == ITEM_CLASS_WEAPON) + if (itemEntry->ClassID == ITEM_CLASS_WEAPON) { - switch (itemEntry->SubClass) + switch (itemEntry->SubclassID) { case ITEM_SUBCLASS_WEAPON_THROWN: ammoDisplayID = itemEntry->DisplayInfoID; diff --git a/src/server/game/World/IWorld.cpp b/src/server/game/World/IWorld.cpp new file mode 100644 index 000000000..c29b2729d --- /dev/null +++ b/src/server/game/World/IWorld.cpp @@ -0,0 +1,35 @@ +/* + * This file is part of the AzerothCore 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 Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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 . + */ + +#include "IWorld.h" + +class Unit; +class IWorld; + +void IWorld::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) +{ + DelayedDamage delayedDamage; + delayedDamage.attacker = attacker; + delayedDamage.victim = victim; + delayedDamage.damage = damage; + delayedDamage.cleanDamage = cleanDamage; + delayedDamage.damagetype = damagetype; + delayedDamage.damageSchoolMask = damageSchoolMask; + delayedDamage.spellProto = spellProto; + delayedDamage.durabilityLoss = durabilityLoss; + _delayedDamages.push_back(delayedDamage); +} diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 237b23704..0ec2f8472 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -24,15 +24,17 @@ #include "ObjectGuid.h" #include "QueryResult.h" #include "SharedDefines.h" +#include "Unit.h" #include #include #include #include #include +class IWorld; +class Player; class WorldPacket; class WorldSession; -class Player; /// Storage class for commands issued for delayed execution struct AC_GAME_API CliCommandHolder @@ -138,6 +140,7 @@ enum WorldBoolConfigs CONFIG_AUTOBROADCAST, CONFIG_ALLOW_TICKETS, CONFIG_DELETE_CHARACTER_TICKET_TRACE, + CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, CONFIG_PRESERVE_CUSTOM_CHANNELS, CONFIG_PDUMP_NO_PATHS, CONFIG_PDUMP_NO_OVERWRITE, @@ -515,10 +518,13 @@ enum Rates class IWorld { public: + std::list _delayedDamages; + virtual ~IWorld() = default; [[nodiscard]] virtual WorldSession* FindSession(uint32 id) const = 0; [[nodiscard]] virtual WorldSession* FindOfflineSession(uint32 id) const = 0; [[nodiscard]] virtual WorldSession* FindOfflineSessionForCharacterGUID(ObjectGuid::LowType guidLow) const = 0; + virtual void AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss); virtual void AddSession(WorldSession* s) = 0; virtual bool KickSession(uint32 id) = 0; virtual void UpdateMaxSessionCounters() = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index cbb30c091..8019b4c0d 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1357,6 +1357,9 @@ void World::LoadConfigSettings(bool reload) // Dungeon finder _int_configs[CONFIG_LFG_OPTIONSMASK] = sConfigMgr->GetOption("DungeonFinder.OptionsMask", 5); + // DBC_ItemAttributes + _bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = sConfigMgr->GetOption("DBC.EnforceItemAttributes", true); + // Max instances per hour _int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetOption("AccountInstancesPerHour", 5); @@ -2062,6 +2065,8 @@ void World::SetInitialWorldSettings() _mail_expire_check_timer = GameTime::GetGameTime() + 6h; + _timers[WUPDATE_DELAYED_DAMAGES].SetInterval(400); + ///- Initialize MapMgr LOG_INFO("server.loading", "Starting Map System"); LOG_INFO("server.loading", " "); @@ -2308,6 +2313,12 @@ void World::Update(uint32 diff) { METRIC_TIMER("world_update_time", METRIC_TAG("type", "Check quest reset times")); + if (_timers[WUPDATE_DELAYED_DAMAGES].Passed()) + { + _timers[WUPDATE_DELAYED_DAMAGES].Reset(); + ProcessDelayedDamages(); + } + /// Handle daily quests reset time if (currentGameTime > _nextDailyQuestReset) { @@ -3340,3 +3351,24 @@ CliCommandHolder::~CliCommandHolder() { free(m_command); } + +void World::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) +{ + DelayedDamage delayedDamage; + delayedDamage.attacker = attacker; + delayedDamage.victim = victim; + delayedDamage.damage = damage; + delayedDamage.cleanDamage = cleanDamage; + delayedDamage.damagetype = damagetype; + delayedDamage.damageSchoolMask = damageSchoolMask; + delayedDamage.spellProto = spellProto; + delayedDamage.durabilityLoss = durabilityLoss; + _delayedDamages.push_back(delayedDamage); +} + +void World::ProcessDelayedDamages() +{ + for (auto& damage : _delayedDamages) + Unit::DealDamage(damage.attacker, damage.victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss); + _delayedDamages.clear(); +} diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 5fa4becef..478dd70ef 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -28,6 +28,7 @@ #include "QueryResult.h" #include "SharedDefines.h" #include "Timer.h" +#include "Unit.h" #include #include #include @@ -70,6 +71,7 @@ enum WorldTimers WUPDATE_PINGDB, WUPDATE_5_SECS, WUPDATE_WHO_LIST, + WUPDATE_DELAYED_DAMAGES, WUPDATE_COUNT }; @@ -153,6 +155,8 @@ public: World(); ~World() override; + std::list _delayedDamages; + static World* instance(); static uint32 m_worldLoopCounter; @@ -353,6 +357,10 @@ public: void RemoveOldCorpses() override; + void AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) override; + + void ProcessDelayedDamages(); + protected: void _UpdateGameTime(); // callback for UpdateRealmCharacters diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index 2a2fad44c..6558001bb 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -222,7 +222,7 @@ public: void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override { - if (_dying && who->GetGUID() != me->GetGUID()) + if (_dying && who && who->GetGUID() != me->GetGUID()) damage = 0; if (me->HealthBelowPctDamaged(0, damage) && instance->GetData(DATA_BUG_TRIO_DEATH) < 2 && !_dying) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 17ce3995c..8db7c0c14 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -61,6 +61,7 @@ enum Texts SAY_TIRION_INTRO_2 = 1, SAY_TIRION_OUTRO_1 = 2, SAY_TIRION_OUTRO_2 = 3, + SAY_TIRION_OUTRO_3 = 4, // Terenas Menethil (outro) SAY_TERENAS_OUTRO_1 = 0, @@ -343,6 +344,7 @@ enum MiscData { LIGHT_SNOWSTORM = 2490, LIGHT_SOULSTORM = 2508, + EQUIP_ASHBRINGER = 13262, MUSIC_FROZEN_THRONE = 17457, MUSIC_SPECIAL = 17458, // Summon Shambling Horror, Remorseless Winter, Quake, Summon Val'kyr Periodic, Harvest Soul, Vile Spirits MUSIC_FURY_OF_FROSTMOURNE = 17459, @@ -833,8 +835,7 @@ public: _bFordringMustFallYell = true; if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING))) { - tirion->Yell("The Lich King must fall!", LANG_UNIVERSAL); - tirion->PlayDirectSound(17389); + tirion->AI()->Talk(SAY_TIRION_OUTRO_3); } } } @@ -1354,7 +1355,7 @@ public: { // remove glow on ashbringer and tirion me->RemoveAllAuras(); - SetEquipmentSlots(true); + SetEquipmentSlots(false, EQUIP_ASHBRINGER); } } @@ -1595,7 +1596,7 @@ public: lichKing->SetImmuneToNPC(false); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->RemoveAllAuras(); - SetEquipmentSlots(true); + SetEquipmentSlots(false, EQUIP_ASHBRINGER); me->Attack(lichKing, true); me->GetMotionMaster()->MovePoint(0, 512.16f, -2120.25f, 840.86f); } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index e689df387..eb153fb78 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -74,6 +74,8 @@ struct boss_murmur : public BossAI void CastSupressionOOC() { + me->m_Events.CancelEventGroup(GROUP_OOC_CAST); + me->m_Events.AddEventAtOffset([this] { if (me->FindNearestCreature(NPC_CABAL_SPELLBINDER, 35.0f)) { @@ -125,8 +127,13 @@ struct boss_murmur : public BossAI } } - void JustEngagedWith(Unit* /*who*/) override + void JustEngagedWith(Unit* who) override { + if (!who->IsInCombatWith(me)) + { + return; + } + _JustEngagedWith(); scheduler.Schedule(28s, [this](TaskContext context) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index b2cc0ea3c..838216b81 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -102,7 +102,6 @@ public: { if (Creature* broggok = instance->GetCreature(DATA_BROGGOK)) { - instance->SetData(DATA_BROGGOK, IN_PROGRESS); broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); } } diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index ba5b2a8b0..81d436922 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -30,13 +30,15 @@ DoorData const doorData[] = ObjectData const gameobjectData[] = { { GO_BROGGOK_DOOR_REAR, DATA_BROGGOK_REAR_DOOR }, - { GO_BROGGOK_LEVER, DATA_BROGGOK_LEVER } + { GO_BROGGOK_LEVER, DATA_BROGGOK_LEVER }, + { 0, 0, } }; ObjectData const creatureData[] = { { NPC_BROGGOK, DATA_BROGGOK }, - { NPC_KELIDAN, DATA_KELIDAN } + { NPC_KELIDAN, DATA_KELIDAN }, + { 0, 0 } }; class instance_blood_furnace : public InstanceMapScript diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index 53ffbed74..d19226bbb 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -1163,6 +1163,18 @@ struct HolidaysEntry //uint32 flags; // 54 m_flags (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) }; +struct ItemEntry +{ + uint32 ID; // 0 + uint32 ClassID; // 1 + uint32 SubclassID; // 2 + int32 SoundOverrideSubclassID; // 3 + int32 Material; // 4 + uint32 DisplayInfoID; // 5 + uint32 InventoryType; // 6 + uint32 SheatheType; // 7 +}; + struct ItemBagFamilyEntry { uint32 ID; // 0 @@ -1258,25 +1270,28 @@ struct ItemSetEntry struct LFGDungeonEntry { - uint32 ID; // 0 - char const* name[16]; // 1-17 Name lang - uint32 minlevel; // 18 - uint32 maxlevel; // 19 - uint32 reclevel; // 20 - uint32 recminlevel; // 21 - uint32 recmaxlevel; // 22 - int32 map; // 23 - uint32 difficulty; // 24 - uint32 flags; // 25 - uint32 type; // 26 - //uint32 unk; // 27 - //char const* iconname; // 28 - uint32 expansion; // 29 - //uint32 unk4; // 30 - uint32 grouptype; // 31 - //char const* desc[16]; // 32-47 Description + uint32 ID; // 0 + char const* Name[16]; // 1-16 + //uint32 Name_lang_mask; // 17 + uint32 MinLevel; // 18 + uint32 MaxLevel; // 19 + uint32 TargetLevel; // 20 + uint32 TargetLevelMin; // 21 + uint32 TargetLevelMax; // 22 + uint32 MapID; // 23 + uint32 Difficulty; // 24 + uint32 Flags; // 25 + uint32 TypeID; // 26 + //int32 Faction; // 27 + //char const* TextureFilename; // 28 + uint32 ExpansionLevel; // 29 + //uint32 OrderIndex; // 30 + uint32 GroupID; // 31 + //char const* Description[16]; // 32-47 + //uint32 Description_lang_mask; // 48 + // Helpers - [[nodiscard]] uint32 Entry() const { return ID + (type << 24); } + [[nodiscard]] uint32 Entry() const { return ID + (TypeID << 24); } }; struct LightEntry diff --git a/src/server/shared/DataStores/DBCfmt.h b/src/server/shared/DataStores/DBCfmt.h index a25dc698b..e84ed2853 100644 --- a/src/server/shared/DataStores/DBCfmt.h +++ b/src/server/shared/DataStores/DBCfmt.h @@ -70,6 +70,7 @@ char constexpr GtOCTRegenHPfmt[] = "df"; char constexpr GtRegenHPPerSptfmt[] = "df"; char constexpr GtRegenMPPerSptfmt[] = "df"; char constexpr Holidaysfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix"; +char constexpr Itemfmt[] = "niiiiiii"; char constexpr ItemBagFamilyfmt[] = "nxxxxxxxxxxxxxxxxx"; char constexpr ItemDisplayTemplateEntryfmt[] = "nxxxxsxxxxxxxxxxxxxxxxxxx"; //char constexpr ItemCondExtCostsEntryfmt[] = "xiii";