From 3bb3283c0715850916d5727ae73f585e7c3459f4 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Mon, 27 Oct 2014 00:57:20 -0200 Subject: [PATCH 01/22] Scripts/Ulduar: Fix Kologarn's arms being despawned before they're used to access the rubble spawning triggers (cherry picked from commit 4c93ac74da81eeb5af27320777b64d347050f8e2) --- src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 9486d95639f..d643b3bd8ce 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -166,7 +166,6 @@ class boss_kologarn : public CreatureScript left = apply; if (!apply && isEncounterInProgress) { - who->ToCreature()->DespawnOrUnsummon(); Talk(SAY_LEFT_ARM_GONE); events.ScheduleEvent(EVENT_RESPAWN_LEFT_ARM, 40000); } @@ -177,7 +176,6 @@ class boss_kologarn : public CreatureScript right = apply; if (!apply && isEncounterInProgress) { - who->ToCreature()->DespawnOrUnsummon(); Talk(SAY_RIGHT_ARM_GONE); events.ScheduleEvent(EVENT_RESPAWN_RIGHT_ARM, 40000); } @@ -194,6 +192,7 @@ class boss_kologarn : public CreatureScript { rubbleStalker->CastSpell(rubbleStalker, SPELL_FALLING_RUBBLE, true); rubbleStalker->CastSpell(rubbleStalker, SPELL_SUMMON_RUBBLE, true); + who->ToCreature()->DespawnOrUnsummon(); } if (!right && !left) From ccb055d95f83828b0d59ad452614e6ed60f28f73 Mon Sep 17 00:00:00 2001 From: Unholychick Date: Thu, 23 Oct 2014 14:44:42 -0200 Subject: [PATCH 02/22] Scripts/Ulduar: Fix Ignis' golems not shattering in 25m Closes #10519 (cherry picked from commit 60493b3057034833dc24674d688eae9bf3d77505) --- src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index d4fbf959c53..78bebbb9b7f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -50,6 +50,7 @@ enum Spells SPELL_HEAT = 65667, SPELL_MOLTEN = 62373, SPELL_BRITTLE = 62382, + SPELL_BRITTLE_25 = 67114, SPELL_SHATTER = 62383, SPELL_GROUND = 62548, }; @@ -320,7 +321,7 @@ class npc_iron_construct : public CreatureScript void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (me->HasAura(SPELL_BRITTLE) && damage >= 5000) + if (me->HasAura(RAID_MODE(SPELL_BRITTLE, SPELL_BRITTLE_25)) && damage >= 5000) { DoCast(SPELL_SHATTER); if (Creature* ignis = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(BOSS_IGNIS))) From 379be8649313a3b0aac0f9a739b14b90811d45c8 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Wed, 29 Oct 2014 21:54:15 -0200 Subject: [PATCH 03/22] Scripts/Ulduar: Fix Ignis' Slag Pot periodic ticks and enable achievement "Hot Pocket" (cherry picked from commit 21820b425b0b573229f683a2d45b23d8a42c888d) --- sql/updates/world/2014_10_29_00_world.sql | 7 +++++++ .../Northrend/Ulduar/Ulduar/boss_ignis.cpp | 15 +++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 sql/updates/world/2014_10_29_00_world.sql diff --git a/sql/updates/world/2014_10_29_00_world.sql b/sql/updates/world/2014_10_29_00_world.sql new file mode 100644 index 00000000000..f29b6745133 --- /dev/null +++ b/sql/updates/world/2014_10_29_00_world.sql @@ -0,0 +1,7 @@ +-- Spell difficulty entry for Slag Pot Damage spell +DELETE FROM `spelldifficulty_dbc` WHERE `id` = 65722; +INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`, `spellid2`, `spellid3`) VALUES +(65722, 65722, 65723, 0, 0); + +-- Clean up unneeded criteria data, enables achievement Hot Pocket +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (10430, 10431) AND `type` = 18; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index 78bebbb9b7f..b3b8ebb24b0 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -241,7 +241,7 @@ class boss_ignis : public CreatureScript case EVENT_CHANGE_POT: if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID)) { - slagPotTarget->AddAura(SPELL_SLAG_POT, slagPotTarget); + DoCast(slagPotTarget, SPELL_SLAG_POT, true); slagPotTarget->EnterVehicle(me, 1); events.CancelEvent(EVENT_CHANGE_POT); events.ScheduleEvent(EVENT_END_POT, 10000); @@ -458,14 +458,13 @@ class spell_ignis_slag_pot : public SpellScriptLoader return true; } - void HandleEffectPeriodic(AuraEffect const* aurEff) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - Unit* aurEffCaster = aurEff->GetCaster(); - if (!aurEffCaster) - return; - - Unit* target = GetTarget(); - aurEffCaster->CastSpell(target, SPELL_SLAG_POT_DAMAGE, true); + if (Unit* caster = GetCaster()) + { + Unit* target = GetTarget(); + caster->CastSpell(target, SPELL_SLAG_POT_DAMAGE, true); + } } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) From 23ae2b252163584c8c2b0e39dd7b7db872b03d86 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Thu, 30 Oct 2014 04:38:55 -0200 Subject: [PATCH 04/22] DB/Disables: Remove criteria for the "Shattered" achievement from disables ...as it works fine. Ulduar/Ignis achievement. (cherry picked from commit 799bdc17105c566a705cb93b4f1d1813c23f2ba2) --- sql/updates/world/2014_10_30_00_world.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 sql/updates/world/2014_10_30_00_world.sql diff --git a/sql/updates/world/2014_10_30_00_world.sql b/sql/updates/world/2014_10_30_00_world.sql new file mode 100644 index 00000000000..30c528cf3f0 --- /dev/null +++ b/sql/updates/world/2014_10_30_00_world.sql @@ -0,0 +1 @@ +DELETE FROM `disables` WHERE `entry` IN (10068, 10069) AND `sourceType` = 4; From dbf5aa73e5f934485dcf5a73ce1b1684e815fd27 Mon Sep 17 00:00:00 2001 From: DDuarte Date: Thu, 30 Oct 2014 13:45:49 +0000 Subject: [PATCH 05/22] SQL: Update /dev/world_database.sql --- sql/base/dev/world_database.sql | 244 +++++++++++++++++++------------- 1 file changed, 142 insertions(+), 102 deletions(-) diff --git a/sql/base/dev/world_database.sql b/sql/base/dev/world_database.sql index 474843b7c84..1a9e58d0569 100644 --- a/sql/base/dev/world_database.sql +++ b/sql/base/dev/world_database.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.15 Distrib 10.0.13-MariaDB, for Win64 (x86) +-- MySQL dump 10.13 Distrib 5.6.9-rc, for Win64 (x86_64) -- --- Host: localhost Database: world +-- Host: localhost Database: world434 -- ------------------------------------------------------ --- Server version 10.0.13-MariaDB +-- Server version 5.6.9-rc /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -275,6 +275,8 @@ CREATE TABLE `creature` ( `guid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Global Unique Identifier', `id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'Creature Identifier', `map` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Map Identifier', + `zoneId` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Zone Identifier', + `areaId` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Area Identifier', `spawnMask` tinyint(3) unsigned NOT NULL DEFAULT '1', `phaseMask` int(10) unsigned NOT NULL DEFAULT '1', `PhaseId` int(10) DEFAULT '0', @@ -392,14 +394,17 @@ DROP TABLE IF EXISTS `creature_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `creature_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -660,14 +665,17 @@ DROP TABLE IF EXISTS `disenchant_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `disenchant_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'Recommended id selection: item_level*100 + item_quality', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(9) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -714,14 +722,17 @@ DROP TABLE IF EXISTS `fishing_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `fishing_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -992,7 +1003,7 @@ CREATE TABLE `game_tele` ( `map` smallint(5) unsigned NOT NULL DEFAULT '0', `name` varchar(100) NOT NULL DEFAULT '', PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=1523 DEFAULT CHARSET=utf8 COMMENT='Tele Command'; +) ENGINE=MyISAM AUTO_INCREMENT=1524 DEFAULT CHARSET=utf8 COMMENT='Tele Command'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -1032,6 +1043,8 @@ CREATE TABLE `gameobject` ( `guid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Global Unique Identifier', `id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'Gameobject Identifier', `map` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Map Identifier', + `zoneId` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Zone Identifier', + `areaId` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Area Identifier', `spawnMask` tinyint(3) unsigned NOT NULL DEFAULT '1', `phaseMask` int(10) unsigned NOT NULL DEFAULT '1', `PhaseId` int(10) DEFAULT '0', @@ -1060,14 +1073,17 @@ DROP TABLE IF EXISTS `gameobject_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `gameobject_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1319,14 +1335,17 @@ DROP TABLE IF EXISTS `item_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `item_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2160,14 +2179,17 @@ DROP TABLE IF EXISTS `mail_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `mail_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2179,14 +2201,17 @@ DROP TABLE IF EXISTS `milling_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `milling_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2457,14 +2482,17 @@ DROP TABLE IF EXISTS `pickpocketing_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `pickpocketing_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2804,14 +2832,17 @@ DROP TABLE IF EXISTS `prospecting_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `prospecting_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3044,14 +3075,17 @@ DROP TABLE IF EXISTS `reference_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `reference_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3176,14 +3210,17 @@ DROP TABLE IF EXISTS `skinning_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `skinning_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3401,14 +3438,17 @@ DROP TABLE IF EXISTS `spell_loot_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `spell_loot_template` ( - `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', - `item` mediumint(8) unsigned NOT NULL DEFAULT '0', - `ChanceOrQuestChance` float NOT NULL DEFAULT '100', - `lootmode` smallint(5) unsigned NOT NULL DEFAULT '1', - `groupid` tinyint(3) unsigned NOT NULL DEFAULT '0', - `mincountOrRef` mediumint(8) NOT NULL DEFAULT '1', - `maxcount` tinyint(3) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`entry`,`item`) + `Entry` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Item` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Reference` mediumint(8) unsigned NOT NULL DEFAULT '0', + `Chance` float NOT NULL DEFAULT '100', + `QuestRequired` tinyint(1) NOT NULL DEFAULT '0', + `LootMode` smallint(5) unsigned NOT NULL DEFAULT '1', + `GroupId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `Comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`Entry`,`Item`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3609,7 +3649,7 @@ CREATE TABLE `spelleffect_dbc` ( `Effect` int(10) unsigned NOT NULL DEFAULT '0', `EffectValueMultiplier` float unsigned NOT NULL DEFAULT '0', `EffectApplyAuraName` int(10) unsigned NOT NULL DEFAULT '0', - `EffectAplitude` int(10) unsigned NOT NULL DEFAULT '0', + `EffectAmplitude` int(10) unsigned NOT NULL DEFAULT '0', `EffectBasePoints` int(10) NOT NULL DEFAULT '0', `EffectBonusMultiplier` float unsigned NOT NULL DEFAULT '0', `EffectDamageMultiplier` float unsigned NOT NULL DEFAULT '0', @@ -3822,4 +3862,4 @@ CREATE TABLE `waypoints` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2014-09-21 17:05:48 +-- Dump completed on 2014-10-30 13:45:31 From 39c09a60ddb19656d4167e7ab0168754481ec4c6 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Thu, 30 Oct 2014 20:09:37 -0200 Subject: [PATCH 06/22] DB/Achievement: Remove unneeded criteria data for "A Tribute to Immortality" Required team is already checked from dbc on criteria update Closes #4622 Thanks to @joschiwald (cherry picked from commit 1823e2f9b822b163a7f79719e6c8d1504707292e) --- sql/updates/world/2014_10_30_02_world.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 sql/updates/world/2014_10_30_02_world.sql diff --git a/sql/updates/world/2014_10_30_02_world.sql b/sql/updates/world/2014_10_30_02_world.sql new file mode 100644 index 00000000000..a3de351d578 --- /dev/null +++ b/sql/updates/world/2014_10_30_02_world.sql @@ -0,0 +1 @@ +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (12358, 12359) AND `type` = 14; From 5781119c4bbd486abb3652c5ceacaf38a76a6bd1 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 1 Nov 2014 00:24:10 +0100 Subject: [PATCH 07/22] Core/Entities: Fixed data sent in movement packets - time3 in transport block is actually the id of a vehicle we are passenger on --- src/server/game/Entities/Object/Object.cpp | 18 ++-- src/server/game/Entities/Object/Object.h | 4 +- src/server/game/Entities/Player/Player.cpp | 10 +- src/server/game/Entities/Unit/Unit.cpp | 10 +- src/server/game/Entities/Vehicle/Vehicle.cpp | 1 + .../game/Movement/MovementStructures.cpp | 102 +++++++++--------- src/server/game/Movement/MovementStructures.h | 2 +- 7 files changed, 74 insertions(+), 73 deletions(-) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 38ad803d177..2174e9e8bae 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -339,7 +339,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const uint16 movementFlagsExtra = 0; bool hasTransportTime2 = false; - bool hasTransportTime3 = false; + bool hasVehicleId = false; bool hasFallDirection = false; bool hasFallData = false; bool hasPitch = false; @@ -376,7 +376,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const hasSpline = self->IsSplineEnabled(); hasTransportTime2 = self->m_movementInfo.transport.guid != 0 && self->m_movementInfo.transport.time2 != 0; - hasTransportTime3 = false; + hasVehicleId = false; hasPitch = self->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || self->HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); hasFallDirection = self->HasUnitMovementFlag(MOVEMENTFLAG_FALLING); hasFallData = hasFallDirection || self->m_movementInfo.jump.fallTime != 0; @@ -411,7 +411,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(transGuid[4]); data->WriteBit(transGuid[0]); data->WriteBit(transGuid[6]); - data->WriteBit(hasTransportTime3); // Has transport time 3 + data->WriteBit(hasVehicleId); // Has transport time 3 data->WriteBit(transGuid[7]); data->WriteBit(transGuid[5]); data->WriteBit(transGuid[3]); @@ -523,8 +523,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteByteSeq(transGuid[3]); *data << float(self->GetTransOffsetZ()); data->WriteByteSeq(transGuid[0]); - if (hasTransportTime3) - *data << uint32(self->m_movementInfo.transport.time3); + if (hasVehicleId) + *data << uint32(self->m_movementInfo.transport.vehicleId); *data << int8(self->GetTransSeat()); data->WriteByteSeq(transGuid[1]); @@ -573,8 +573,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(transGuid[0]); data->WriteBit(transGuid[5]); - if (hasTransportTime3) - *data << uint32(self->m_movementInfo.transport.time3); + if (hasVehicleId) + *data << uint32(self->m_movementInfo.transport.vehicleId); data->WriteBit(transGuid[3]); *data << float(self->GetTransOffsetX()); @@ -1265,8 +1265,8 @@ void MovementInfo::OutDebug() TC_LOG_INFO("misc", "time: %u", transport.time); if (flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT) TC_LOG_INFO("misc", "time2: %u", transport.time2); - if (transport.time3) - TC_LOG_INFO("misc", "time3: %u", transport.time3); + if (transport.vehicleId) + TC_LOG_INFO("misc", "vehicleId: %u", transport.vehicleId); } if ((flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index b8410ec307c..bf3231db575 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -401,7 +401,7 @@ struct MovementInfo seat = -1; time = 0; time2 = 0; - time3 = 0; + vehicleId = 0; } ObjectGuid guid; @@ -409,7 +409,7 @@ struct MovementInfo int8 seat; uint32 time; uint32 time2; - uint32 time3; + uint32 vehicleId; } transport; // swimming/flying diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 86400232a9d..c5d323f5e37 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27700,7 +27700,7 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext bool hasOrientation = false; bool hasTransportData = false; bool hasTransportTime2 = false; - bool hasTransportTime3 = false; + bool hasTransportVehicleId = false; bool hasPitch = false; bool hasFallData = false; bool hasFallDirection = false; @@ -27778,7 +27778,7 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext break; case MSEHasTransportTime3: if (hasTransportData) - hasTransportTime3 = data.ReadBit(); + hasTransportVehicleId = data.ReadBit(); break; case MSEHasPitch: hasPitch = !data.ReadBit(); @@ -27849,9 +27849,9 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext if (hasTransportData && hasTransportTime2) data >> mi->transport.time2; break; - case MSETransportTime3: - if (hasTransportData && hasTransportTime3) - data >> mi->transport.time3; + case MSETransportVehicleId: + if (hasTransportData && hasTransportVehicleId) + data >> mi->transport.vehicleId; break; case MSEPitch: if (hasPitch) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 30a22f4d193..1e5e0f44a70 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15597,7 +15597,7 @@ void Unit::WriteMovementInfo(WorldPacket& data, Movement::ExtraMovementStatusEle bool hasSpline = IsSplineEnabled(); bool hasTransportTime2 = hasTransportData && m_movementInfo.transport.time2 != 0; - bool hasTransportTime3 = false; + bool hasTransportVehicleId = hasTransportData && m_movementInfo.transport.vehicleId != 0; bool hasPitch = HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING); bool hasFallDirection = HasUnitMovementFlag(MOVEMENTFLAG_FALLING); bool hasFallData = hasFallDirection || m_movementInfo.jump.fallTime != 0; @@ -15682,7 +15682,7 @@ void Unit::WriteMovementInfo(WorldPacket& data, Movement::ExtraMovementStatusEle break; case MSEHasTransportTime3: if (hasTransportData) - data.WriteBit(hasTransportTime3); + data.WriteBit(hasTransportVehicleId); break; case MSEHasPitch: data.WriteBit(!hasPitch); @@ -15753,9 +15753,9 @@ void Unit::WriteMovementInfo(WorldPacket& data, Movement::ExtraMovementStatusEle if (hasTransportData && hasTransportTime2) data << mi.transport.time2; break; - case MSETransportTime3: - if (hasTransportData && hasTransportTime3) - data << mi.transport.time3; + case MSETransportVehicleId: + if (hasTransportData && hasTransportVehicleId) + data << mi.transport.vehicleId; break; case MSEPitch: if (hasPitch) diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 3eefc7d9209..12e2eb55480 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -802,6 +802,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) Passenger->m_movementInfo.transport.time = 0; Passenger->m_movementInfo.transport.seat = Seat->first; Passenger->m_movementInfo.transport.guid = Target->GetBase()->GetGUID(); + Passenger->m_movementInfo.transport.vehicleId = Target->GetVehicleInfo()->m_ID; if (Target->GetBase()->GetTypeId() == TYPEID_UNIT && Passenger->GetTypeId() == TYPEID_PLAYER && Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp index 242b2aeaca7..62998aee7fc 100644 --- a/src/server/game/Movement/MovementStructures.cpp +++ b/src/server/game/Movement/MovementStructures.cpp @@ -62,7 +62,7 @@ MovementStatusElements const PlayerMove[] = MSEGuidByte7, MSEPositionY, MSEGuidByte3, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte6, MSETransportSeat, MSETransportGuidByte5, @@ -140,7 +140,7 @@ MovementStatusElements const MovementFallLand[] = MSETransportPositionY, MSETransportPositionX, MSETransportGuidByte5, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte1, MSETransportSeat, MSETransportTime2, @@ -218,7 +218,7 @@ MovementStatusElements const MovementHeartBeat[] = MSETransportGuidByte1, MSETransportGuidByte3, MSETransportGuidByte7, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime2, MSETransportGuidByte2, MSETransportGuidByte0, @@ -283,7 +283,7 @@ MovementStatusElements const MovementJump[] = MSETransportGuidByte7, MSETransportPositionX, MSETransportGuidByte4, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportOrientation, MSETransportTime2, @@ -359,7 +359,7 @@ MovementStatusElements const MovementSetFacing[] = MSETransportPositionZ, MSETransportOrientation, MSETransportGuidByte2, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte3, MSETransportSeat, MSETransportPositionY, @@ -428,7 +428,7 @@ MovementStatusElements const MovementSetPitch[] = MSETransportGuidByte6, MSETransportOrientation, MSETransportGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime, MSETransportGuidByte2, MSETransportPositionZ, @@ -497,7 +497,7 @@ MovementStatusElements const MovementStartBackward[] = MSEGuidByte3, MSETransportPositionZ, MSETransportGuidByte2, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportGuidByte5, MSETransportPositionY, @@ -582,7 +582,7 @@ MovementStatusElements const MovementStartForward[] = MSETransportGuidByte2, MSETransportPositionX, MSETransportGuidByte5, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime, MSETransportGuidByte6, MSETransportGuidByte0, @@ -650,7 +650,7 @@ MovementStatusElements const MovementStartStrafeLeft[] = MSETransportTime2, MSETransportGuidByte3, MSETransportPositionZ, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportGuidByte7, MSETransportPositionY, @@ -721,7 +721,7 @@ MovementStatusElements const MovementStartStrafeRight[] = MSETransportGuidByte2, MSETransportSeat, MSETransportPositionX, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime, MSETransportGuidByte4, MSETransportGuidByte7, @@ -801,7 +801,7 @@ MovementStatusElements const MovementStartTurnLeft[] = MSETransportGuidByte1, MSETransportGuidByte3, MSETransportPositionY, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime2, MSETransportGuidByte5, MSETransportGuidByte7, @@ -865,7 +865,7 @@ MovementStatusElements const MovementStartTurnRight[] = MSETransportSeat, MSETransportOrientation, MSETransportGuidByte5, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionZ, MSETransportPositionX, MSETransportTime, @@ -933,7 +933,7 @@ MovementStatusElements const MovementStop[] = MSETransportTime, MSETransportSeat, MSETransportPositionZ, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte2, MSETransportGuidByte0, MSETransportPositionY, @@ -1003,7 +1003,7 @@ MovementStatusElements const MovementStopStrafe[] = MSETransportSeat, MSETransportGuidByte6, MSETransportPositionZ, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte1, MSETransportGuidByte3, MSETransportGuidByte2, @@ -1080,7 +1080,7 @@ MovementStatusElements const MovementStopTurn[] = MSETransportGuidByte3, MSETransportOrientation, MSETransportTime2, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte7, MSETransportGuidByte1, MSETransportGuidByte0, @@ -1154,7 +1154,7 @@ MovementStatusElements const MovementStartAscend[] = MSETransportGuidByte7, MSETransportTime2, MSETransportPositionZ, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte6, MSETransportTime, MSETransportGuidByte0, @@ -1219,7 +1219,7 @@ MovementStatusElements const MovementStartDescend[] = MSEPitch, MSETransportPositionZ, MSETransportSeat, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte6, MSETransportTime2, MSETransportGuidByte1, @@ -1296,7 +1296,7 @@ MovementStatusElements const MovementStartSwim[] = MSETransportTime, MSETransportPositionX, MSETransportOrientation, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte6, MSETransportGuidByte5, MSETransportGuidByte4, @@ -1360,7 +1360,7 @@ MovementStatusElements const MovementStopSwim[] = MSEGuidByte1, MSEGuidByte5, MSEGuidByte2, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte4, MSETransportTime, MSETransportPositionZ, @@ -1438,7 +1438,7 @@ MovementStatusElements const MovementStopAscend[] = MSETransportGuidByte2, MSETransportGuidByte6, MSETransportTime2, - MSETransportTime3, + MSETransportVehicleId, MSETransportOrientation, MSETransportGuidByte3, MSETransportGuidByte4, @@ -1519,7 +1519,7 @@ MovementStatusElements const MovementStopPitch[] = MSETransportGuidByte3, MSETransportGuidByte1, MSETransportPositionZ, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportGuidByte4, MSETransportTime, @@ -1576,7 +1576,7 @@ MovementStatusElements const MovementStartPitchDown[] = MSEGuidByte6, MSEGuidByte4, MSEGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte3, MSETransportTime2, MSETransportGuidByte5, @@ -1661,7 +1661,7 @@ MovementStatusElements const MovementStartPitchUp[] = MSETransportSeat, MSETransportGuidByte6, MSETransportGuidByte5, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionY, MSETransportGuidByte4, MSEFallTime, @@ -1729,7 +1729,7 @@ MovementStatusElements const MoveChngTransport[]= MSETransportGuidByte6, MSETransportPositionZ, MSETransportPositionX, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime, MSETransportGuidByte7, MSETransportGuidByte5, @@ -1806,7 +1806,7 @@ MovementStatusElements const MoveSplineDone[] = MSEOrientation, MSETransportGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte7, MSETransportTime, MSETransportPositionY, @@ -1881,7 +1881,7 @@ MovementStatusElements const MoveNotActiveMover[] = MSEFallHorizontalSpeed, MSEFallTime, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte1, MSETransportTime2, MSETransportOrientation, @@ -1956,7 +1956,7 @@ MovementStatusElements const DismissControlledVehicle[] = MSETimestamp, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte4, MSETransportGuidByte7, MSETransportTime2, @@ -2031,7 +2031,7 @@ MovementStatusElements const MoveUpdateTeleport[] = MSETransportGuidByte3, MSETransportGuidByte4, MSETransportOrientation, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte1, MSETransportTime2, MSETransportPositionZ, @@ -2124,7 +2124,7 @@ MovementStatusElements const MovementSetRunMode[] = MSETransportOrientation, MSETransportGuidByte4, MSETransportTime, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportPositionY, MSETransportGuidByte6, @@ -2195,7 +2195,7 @@ MovementStatusElements const MovementSetWalkMode[] = MSETransportTime2, MSETransportOrientation, MSETransportPositionX, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte7, MSETransportPositionY, MSETransportGuidByte1, @@ -2270,7 +2270,7 @@ MovementStatusElements const MovementSetCanFly[] = MSETransportGuidByte0, MSETransportOrientation, MSETransportGuidByte6, - MSETransportTime3, + MSETransportVehicleId, MSESplineElevation, MSEFallSinAngle, MSEFallCosAngle, @@ -2348,7 +2348,7 @@ MovementStatusElements const MovementSetCanTransitionBetweenSwimAndFlyAck[] = MSETransportTime2, MSETransportGuidByte6, MSETransportOrientation, - MSETransportTime3, + MSETransportVehicleId, MSEPitch, MSEOrientation, MSETimestamp, @@ -2467,7 +2467,7 @@ MovementStatusElements const MovementUpdateRunSpeed[] = MSETransportPositionY, MSETransportGuidByte3, MSETransportGuidByte2, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionZ, MSETimestamp, MSEFallCosAngle, @@ -2667,7 +2667,7 @@ MovementStatusElements const MovementForceRunSpeedChangeAck[] = MSETransportGuidByte7, MSETransportOrientation, MSETransportGuidByte3, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte2, MSETransportSeat, MSETransportGuidByte4, @@ -2745,7 +2745,7 @@ MovementStatusElements const MovementSetCollisionHeightAck[] = MSETransportGuidByte6, MSETransportGuidByte3, MSETransportGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionZ, MSEFallVerticalSpeed, MSEFallTime, @@ -2812,7 +2812,7 @@ MovementStatusElements const MovementForceFlightSpeedChangeAck[] = MSETransportOrientation, MSETransportGuidByte1, MSETransportGuidByte5, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte2, MSETransportPositionZ, MSETransportGuidByte7, @@ -2881,7 +2881,7 @@ MovementStatusElements const MovementSetCanFlyAck[] = MSETransportTime2, MSETransportGuidByte6, MSETransportTime, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte7, MSETransportPositionZ, MSETransportGuidByte3, @@ -2953,7 +2953,7 @@ MovementStatusElements const MovementForceSwimSpeedChangeAck[] = MSEGuidByte4, MSEGuidByte7, MSETransportGuidByte0, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime2, MSETransportPositionX, MSETransportGuidByte7, @@ -3037,7 +3037,7 @@ MovementStatusElements const MovementForceWalkSpeedChangeAck[] = MSETransportPositionX, MSETransportGuidByte0, MSETransportTime, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionY, MSETransportGuidByte2, MSETransportGuidByte4, @@ -3112,7 +3112,7 @@ MovementStatusElements const MovementForceRunBackSpeedChangeAck[] = MSETransportGuidByte0, MSETransportGuidByte2, MSETransportPositionY, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionX, MSETransportOrientation, MSETransportGuidByte3, @@ -3297,7 +3297,7 @@ MovementStatusElements const ForceMoveRootAck[] = MSETransportGuidByte4, MSETransportOrientation, MSETransportPositionZ, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime2, MSETransportGuidByte7, MSETransportGuidByte2, @@ -3371,7 +3371,7 @@ MovementStatusElements const ForceMoveUnrootAck[] = MSETransportGuidByte2, MSETransportGuidByte3, MSETransportPositionY, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte5, MSETransportSeat, MSETransportGuidByte0, @@ -3448,7 +3448,7 @@ MovementStatusElements const MovementFallReset[] = MSETransportSeat, MSETransportTime2, MSETransportGuidByte6, - MSETransportTime3, + MSETransportVehicleId, MSETransportTime, MSETransportGuidByte0, MSETransportOrientation, @@ -3511,7 +3511,7 @@ MovementStatusElements const MovementFeatherFallAck[] = MSEGuidByte4, MSEGuidByte3, MSEGuidByte2, - MSETransportTime3, + MSETransportVehicleId, MSETransportOrientation, MSETransportPositionZ, MSETransportGuidByte7, @@ -3599,7 +3599,7 @@ MovementStatusElements const MovementGravityDisableAck[] = MSETransportTime2, MSETransportPositionX, MSETransportGuidByte7, - MSETransportTime3, + MSETransportVehicleId, MSEFallSinAngle, MSEFallCosAngle, MSEFallHorizontalSpeed, @@ -3664,7 +3664,7 @@ MovementStatusElements const MovementGravityEnableAck[] = MSEFallVerticalSpeed, MSETransportGuidByte1, MSETransportPositionX, - MSETransportTime3, + MSETransportVehicleId, MSETransportOrientation, MSETransportGuidByte2, MSETransportGuidByte0, @@ -3738,7 +3738,7 @@ MovementStatusElements const MovementHoverAck[] = MSEFallVerticalSpeed, MSEOrientation, MSETransportGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte2, MSETransportGuidByte7, MSETransportGuidByte3, @@ -3818,7 +3818,7 @@ MovementStatusElements const MovementKnockBackAck[] = MSETransportTime, MSETransportGuidByte3, MSETransportGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte2, MSETransportPositionZ, MSETransportGuidByte0, @@ -3878,7 +3878,7 @@ MovementStatusElements const MovementWaterWalkAck[] = MSEGuidByte1, MSETransportPositionX, MSETransportGuidByte1, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportOrientation, MSETransportGuidByte7, @@ -5018,7 +5018,7 @@ MovementStatusElements const ChangeSeatsOnControlledVehicle[] = MSEFallVerticalSpeed, MSETransportGuidByte2, MSETransportTime2, - MSETransportTime3, + MSETransportVehicleId, MSETransportGuidByte0, MSETransportTime, MSETransportSeat, @@ -5087,7 +5087,7 @@ MovementStatusElements const CastSpellEmbeddedMovement[] = MSETransportTime, MSETransportGuidByte6, MSETransportGuidByte5, - MSETransportTime3, + MSETransportVehicleId, MSETransportPositionX, MSETransportGuidByte4, MSETransportPositionZ, diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 278eaa877fa..c98b2303e6a 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -86,7 +86,7 @@ enum MovementStatusElements MSETransportSeat, MSETransportTime, MSETransportTime2, - MSETransportTime3, + MSETransportVehicleId, MSEPitch, MSEFallTime, MSEFallVerticalSpeed, From 2a1ad10b806ffad2be227ef2aa6ce1ca12e6cf5f Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Sat, 1 Nov 2014 00:47:15 -0200 Subject: [PATCH 08/22] Scripts/ToC: Twin Val'kyr - Script rewritten to EventMaps - Implemented random special ability sequence - Adjusted timer for special abilities to 45 seconds - Misc clean up. Closes #7546 (cherry picked from commit e5da0dccfac75fc1ccb111b9977f31ff35745922) --- .../TrialOfTheCrusader/boss_twin_valkyr.cpp | 214 +++++++++--------- 1 file changed, 104 insertions(+), 110 deletions(-) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 63b47da0807..4ffecad04e0 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -31,14 +31,14 @@ #include "CellImpl.h" #include "trial_of_the_crusader.h" -enum Yells +enum Texts { SAY_AGGRO = 0, SAY_NIGHT = 1, SAY_LIGHT = 2, EMOTE_VORTEX = 3, - EMOTE_TWINK_PACT = 4, - SAY_TWINK_PACT = 5, + EMOTE_TWIN_PACT = 4, + SAY_TWIN_PACT = 5, SAY_KILL_PLAYER = 6, SAY_BERSERK = 7, SAY_DEATH = 8 @@ -91,6 +91,23 @@ enum BossSpells SPELL_SURGE_OF_SPEED = 65828 }; +enum Events +{ + EVENT_TWIN_SPIKE = 1, + EVENT_TOUCH = 2, + EVENT_SPECIAL_ABILITY = 3, + EVENT_BERSERK = 4 +}; + +enum Stages +{ + STAGE_DARK_VORTEX, + STAGE_DARK_PACT, + STAGE_LIGHT_VORTEX, + STAGE_LIGHT_PACT, + MAX_STAGES +}; + #define SPELL_DARK_ESSENCE_HELPER RAID_MODE(65684, 67176, 67177, 67178) #define SPELL_LIGHT_ESSENCE_HELPER RAID_MODE(65686, 67222, 67223, 67224) @@ -101,8 +118,9 @@ enum BossSpells enum Actions { - ACTION_VORTEX = 0, - ACTION_PACT = 1 + ACTION_VORTEX, + ACTION_PACT, + ACTION_SPECIAL_ABILITY }; #define ESSENCE_REMOVE 0 @@ -143,14 +161,8 @@ struct boss_twin_baseAI : public BossAI { boss_twin_baseAI(Creature* creature) : BossAI(creature, BOSS_VALKIRIES) { - Initialize(); AuraState = AURA_STATE_NONE; - - Stage = 0; - Weapon = 0; - - VortexEmote = 0; SisterNpcId = 0; MyEmphatySpellId = 0; OtherEssenceSpellId = 0; @@ -162,16 +174,6 @@ struct boss_twin_baseAI : public BossAI TouchSpellId = 0; } - void Initialize() - { - IsBerserk = false; - - SpecialAbilityTimer = 1 * MINUTE*IN_MILLISECONDS; - SpikeTimer = 20 * IN_MILLISECONDS; - TouchTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - BerserkTimer = IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS; - } - void Reset() override { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); @@ -180,7 +182,6 @@ struct boss_twin_baseAI : public BossAI /* Uncomment this once that they are floating above the ground me->SetLevitate(true); me->SetFlying(true); */ - Initialize(); summons.DespawnAll(); } @@ -218,11 +219,6 @@ struct boss_twin_baseAI : public BossAI } } - void JustSummoned(Creature* summoned) override - { - summons.Summon(summoned); - } - void SummonedCreatureDespawn(Creature* summoned) override { switch (summoned->GetEntry()) @@ -282,6 +278,11 @@ struct boss_twin_baseAI : public BossAI Talk(SAY_AGGRO); DoCast(me, SurgeSpellId); + + events.ScheduleEvent(EVENT_TWIN_SPIKE, 20 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS); + if (IsHeroic()) + events.ScheduleEvent(EVENT_TOUCH, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); } void DoAction(int32 action) override @@ -289,10 +290,16 @@ struct boss_twin_baseAI : public BossAI switch (action) { case ACTION_VORTEX: - Stage = me->GetEntry() == NPC_LIGHTBANE ? 2 : 1; + Talk(EMOTE_VORTEX); + DoCastAOE(VortexSpellId); break; case ACTION_PACT: - Stage = me->GetEntry() == NPC_LIGHTBANE ? 1 : 2; + Talk(EMOTE_TWIN_PACT); + Talk(SAY_TWIN_PACT); + if (Creature* sister = GetSister()) + sister->CastSpell(sister, SPELL_POWER_TWINS, false); + DoCast(me, ShieldSpellId); + DoCast(me, TwinPactSpellId); break; default: break; @@ -305,95 +312,31 @@ struct boss_twin_baseAI : public BossAI me->SetCanDualWield(mode); } - void UpdateAI(uint32 diff) override + void ExecuteEvent(uint32 eventId) override { - if (!instance || !UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (Stage) + switch (eventId) { - case 0: + case EVENT_TWIN_SPIKE: + DoCastVictim(SpikeSpellId); + events.ScheduleEvent(EVENT_TWIN_SPIKE, 20 * IN_MILLISECONDS); break; - case 1: // Vortex - if (SpecialAbilityTimer <= diff) - { - if (Creature* pSister = GetSister()) - pSister->AI()->DoAction(ACTION_VORTEX); - Talk(VortexEmote); - DoCastAOE(VortexSpellId); - Stage = 0; - SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS; - } - else - SpecialAbilityTimer -= diff; + case EVENT_TOUCH: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, OtherEssenceSpellId)) + me->CastCustomSpell(TouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); + events.ScheduleEvent(EVENT_TOUCH, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); break; - case 2: // Shield + Pact - if (SpecialAbilityTimer <= diff) - { - Talk(EMOTE_TWINK_PACT); - Talk(SAY_TWINK_PACT); - if (Creature* pSister = GetSister()) - { - pSister->AI()->DoAction(ACTION_PACT); - pSister->CastSpell(pSister, SPELL_POWER_TWINS, false); - } - DoCast(me, ShieldSpellId); - DoCast(me, TwinPactSpellId); - Stage = 0; - SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS; - } - else - SpecialAbilityTimer -= diff; + case EVENT_BERSERK: + DoCast(me, SPELL_BERSERK); + Talk(SAY_BERSERK); break; default: break; } - - if (SpikeTimer <= diff) - { - DoCastVictim(SpikeSpellId); - SpikeTimer = 20*IN_MILLISECONDS; - } - else - SpikeTimer -= diff; - - if (IsHeroic() && TouchTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, OtherEssenceSpellId)) - me->CastCustomSpell(TouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); - TouchTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS); - } - else - TouchTimer -= diff; - - if (!IsBerserk && BerserkTimer <= diff) - { - DoCast(me, SPELL_BERSERK); - Talk(SAY_BERSERK); - IsBerserk = true; - } - else - BerserkTimer -= diff; - - DoMeleeAttackIfReady(); } protected: AuraStateType AuraState; - - uint8 Stage; - bool IsBerserk; - uint32 Weapon; - uint32 SpecialAbilityTimer; - uint32 SpikeTimer; - uint32 TouchTimer; - uint32 BerserkTimer; - - int32 VortexEmote; uint32 SisterNpcId; uint32 MyEmphatySpellId; uint32 OtherEssenceSpellId; @@ -414,15 +357,14 @@ class boss_fjola : public CreatureScript { boss_fjolaAI(Creature* creature) : boss_twin_baseAI(creature) { + GenerateStageSequence(); } void Reset() override { SetEquipmentSlots(false, EQUIP_MAIN_1, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); - Stage = 0; Weapon = EQUIP_MAIN_1; AuraState = AURA_STATE_UNKNOWN22; - VortexEmote = EMOTE_VORTEX; SisterNpcId = NPC_DARKBANE; MyEmphatySpellId = SPELL_TWIN_EMPATHY_DARK; OtherEssenceSpellId = SPELL_DARK_ESSENCE_HELPER; @@ -437,10 +379,43 @@ class boss_fjola : public CreatureScript boss_twin_baseAI::Reset(); } + void ExecuteEvent(uint32 eventId) override + { + if (eventId == EVENT_SPECIAL_ABILITY) + { + if (CurrentStage == MAX_STAGES) + GenerateStageSequence(); + + switch (Stage[CurrentStage]) + { + case STAGE_DARK_VORTEX: + if (Creature* sister = GetSister()) + sister->AI()->DoAction(ACTION_VORTEX); + break; + case STAGE_DARK_PACT: + if (Creature* sister = GetSister()) + sister->AI()->DoAction(ACTION_PACT); + break; + case STAGE_LIGHT_VORTEX: + DoAction(ACTION_VORTEX); + break; + case STAGE_LIGHT_PACT: + DoAction(ACTION_PACT); + break; + default: + break; + } + ++CurrentStage; + events.ScheduleEvent(EVENT_SPECIAL_ABILITY, 45 * IN_MILLISECONDS); + } + else + boss_twin_baseAI::ExecuteEvent(eventId); + } + void EnterCombat(Unit* who) override { instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT); - + events.ScheduleEvent(EVENT_SPECIAL_ABILITY, 45 * IN_MILLISECONDS); me->SummonCreature(NPC_BULLET_CONTROLLER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN); boss_twin_baseAI::EnterCombat(who); } @@ -457,6 +432,27 @@ class boss_fjola : public CreatureScript boss_twin_baseAI::JustReachedHome(); } + + void GenerateStageSequence() + { + CurrentStage = 0; + + // Initialize and clean up. + for (int i = 0; i < MAX_STAGES; ++i) + Stage[i] = i; + + // Allocate an unique random stage to each position in the array. + for (int i = 0; i < MAX_STAGES - 1; ++i) + { + int random = i + (rand32() % (MAX_STAGES - i)); + int temp = Stage[i]; + Stage[i] = Stage[random]; + Stage[random] = temp; + } + } + private: + uint8 Stage[4]; + uint8 CurrentStage; }; CreatureAI* GetAI(Creature* creature) const override @@ -477,10 +473,8 @@ class boss_eydis : public CreatureScript void Reset() override { SetEquipmentSlots(false, EQUIP_MAIN_2, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); - Stage = 1; Weapon = EQUIP_MAIN_2; AuraState = AURA_STATE_UNKNOWN19; - VortexEmote = EMOTE_VORTEX; SisterNpcId = NPC_LIGHTBANE; MyEmphatySpellId = SPELL_TWIN_EMPATHY_LIGHT; OtherEssenceSpellId = SPELL_LIGHT_ESSENCE_HELPER; From 33aaacb2e82701d37aa6d2e8cf9fe5170c6ecf41 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Sat, 1 Nov 2014 01:58:49 -0200 Subject: [PATCH 09/22] Scripts/ToC: Few codestyle changes and clean ups (cherry picked from commit f6896c9a3a460047b47190d2964d73029bf33eb1) --- .../TrialOfTheCrusader/boss_lord_jaraxxus.cpp | 13 ++----------- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 4 +--- .../TrialOfTheCrusader/boss_twin_valkyr.cpp | 3 +-- .../TrialOfTheCrusader/trial_of_the_crusader.cpp | 4 +--- 4 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index a8a370076a8..f26ccd6bf25 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -97,9 +97,7 @@ class boss_jaraxxus : public CreatureScript struct boss_jaraxxusAI : public BossAI { - boss_jaraxxusAI(Creature* creature) : BossAI(creature, BOSS_JARAXXUS) - { - } + boss_jaraxxusAI(Creature* creature) : BossAI(creature, BOSS_JARAXXUS) { } void Reset() override { @@ -136,11 +134,6 @@ class boss_jaraxxus : public CreatureScript Talk(SAY_DEATH); } - void JustSummoned(Creature* summoned) override - { - summons.Summon(summoned); - } - void EnterCombat(Unit* /*who*/) override { _EnterCombat(); @@ -370,9 +363,7 @@ class npc_nether_portal : public CreatureScript struct npc_nether_portalAI : public ScriptedAI { - npc_nether_portalAI(Creature* creature) : ScriptedAI(creature), _summons(me) - { - } + npc_nether_portalAI(Creature* creature) : ScriptedAI(creature), _summons(me) { } void Reset() override { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 771151632ff..2f7722d96fc 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -156,9 +156,7 @@ class boss_gormok : public CreatureScript struct boss_gormokAI : public BossAI { - boss_gormokAI(Creature* creature) : BossAI(creature, BOSS_BEASTS) - { - } + boss_gormokAI(Creature* creature) : BossAI(creature, BOSS_BEASTS) { } void Reset() override { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 4ffecad04e0..75649215db6 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -119,8 +119,7 @@ enum Stages enum Actions { ACTION_VORTEX, - ACTION_PACT, - ACTION_SPECIAL_ABILITY + ACTION_PACT }; #define ESSENCE_REMOVE 0 diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 885017c24dd..e79437b06a2 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -111,9 +111,7 @@ class npc_announcer_toc10 : public CreatureScript struct npc_announcer_toc10AI : public ScriptedAI { - npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature) - { - } + npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature) { } void Reset() override { From 9ed8dc02638eb2f473241c13725af651353273b7 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Sun, 2 Nov 2014 01:17:45 -0200 Subject: [PATCH 10/22] Scripts/ToC: Remove a safe-measure call that caused issues Closes #11874 (cherry picked from commit 3f094b9116d934ffeee917b0abf9ccd622381f68) --- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 2f7722d96fc..021cae3e623 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -640,7 +640,6 @@ struct boss_jormungarAI : public BossAI me->SetDisplayId(ModelMobile); me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->GetMotionMaster()->Clear(); // if the worm was mobile before submerging, make him stationary now if (WasMobile) @@ -721,9 +720,7 @@ class boss_dreadscale : public CreatureScript struct boss_dreadscaleAI : public boss_jormungarAI { - boss_dreadscaleAI(Creature* creature) : boss_jormungarAI(creature) - { - } + boss_dreadscaleAI(Creature* creature) : boss_jormungarAI(creature) { } void Reset() override { From c05163c937ea887126e698b2264c0c0a07a7c30f Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Tue, 4 Nov 2014 02:58:11 -0200 Subject: [PATCH 11/22] DB/Disables: Remove achievement "Drive Me Crazy" from disables Refers to Yogg-Saron (cherry picked from commit 76419aadcddddb5d47f54f7d144e6cd9951b6408) --- sql/updates/world/2014_11_04_00_world.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 sql/updates/world/2014_11_04_00_world.sql diff --git a/sql/updates/world/2014_11_04_00_world.sql b/sql/updates/world/2014_11_04_00_world.sql new file mode 100644 index 00000000000..8fdd922f8f9 --- /dev/null +++ b/sql/updates/world/2014_11_04_00_world.sql @@ -0,0 +1 @@ +DELETE FROM `disables` WHERE `entry` IN (10185, 10296) AND `sourceType` = 4; From 5d6de9a821ccd927fff8e7b21d2764bd84001f72 Mon Sep 17 00:00:00 2001 From: Gecko32 Date: Tue, 4 Nov 2014 14:29:18 -0200 Subject: [PATCH 12/22] Core/Spells: Prevent Divine Intervention from removing death persistent auras Such as Dungeon Deserter, Resurrection Sickness, etc (cherry picked from commit fbcd180716f38eb933c28f33fc7641a0c7696cef) --- src/server/game/Spells/SpellInfo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 62d5763d6e2..a5804ffd648 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1380,8 +1380,8 @@ bool SpellInfo::CanPierceImmuneAura(SpellInfo const* aura) const bool SpellInfo::CanDispelAura(SpellInfo const* aura) const { - // These spells (like Mass Dispel) can dispell all auras - if (Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY) + // These spells (like Mass Dispel) can dispell all auras, except death persistent ones (like Dungeon and Battleground Deserter) + if (Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY && !aura->IsDeathPersistent()) return true; // These auras (like Divine Shield) can't be dispelled From 50bf6cad6a6bf1e4190a492c3a88316d6d831656 Mon Sep 17 00:00:00 2001 From: Mihapro Date: Sat, 25 Oct 2014 17:37:55 +0200 Subject: [PATCH 13/22] Scripts/Instance: The Stonecore --- sql/updates/world/2014_11_05_00_world.sql | 350 ++++++++ src/server/game/Scripting/ScriptLoader.cpp | 12 + src/server/scripts/Maelstrom/CMakeLists.txt | 7 + .../Maelstrom/Stonecore/boss_corborus.cpp | 319 +++++++ .../Stonecore/boss_high_priestess_azil.cpp | 807 ++++++++++++++++++ .../Maelstrom/Stonecore/boss_ozruk.cpp | 287 +++++++ .../Maelstrom/Stonecore/boss_slabhide.cpp | 599 +++++++++++++ .../Stonecore/instance_stonecore.cpp | 262 ++++++ .../scripts/Maelstrom/Stonecore/stonecore.cpp | 440 ++++++++++ .../scripts/Maelstrom/Stonecore/stonecore.h | 72 ++ 10 files changed, 3155 insertions(+) create mode 100644 sql/updates/world/2014_11_05_00_world.sql create mode 100644 src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp create mode 100644 src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp create mode 100644 src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp create mode 100644 src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp create mode 100644 src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp create mode 100644 src/server/scripts/Maelstrom/Stonecore/stonecore.cpp create mode 100644 src/server/scripts/Maelstrom/Stonecore/stonecore.h diff --git a/sql/updates/world/2014_11_05_00_world.sql b/sql/updates/world/2014_11_05_00_world.sql new file mode 100644 index 00000000000..64a59180b46 --- /dev/null +++ b/sql/updates/world/2014_11_05_00_world.sql @@ -0,0 +1,350 @@ +-- The Stonecore +DELETE FROM `instance_template` WHERE `map` = 725; +INSERT INTO `instance_template` (`map`, `parent`, `script`, `allowMount`) VALUES +(725, 0, 'instance_stonecore', 0); + +DELETE FROM `instance_encounters` WHERE `entry` IN (1056, 1059, 1058, 1057); +INSERT INTO `instance_encounters` (`entry`, `creditType`, `creditEntry`, `lastEncounterDungeon`, `comment`) VALUES +(1056, 0, 43438, 0, 'Corborus'), +(1059, 0, 43214, 0, 'Slabhide'), +(1058, 0, 42188, 0, 'Ozruk'), +(1057, 0, 42333, 0, 'High Priestess Azil'); + +UPDATE `creature_template` SET `mechanic_immune_mask` = 617299839 WHERE `entry` IN (43391, 43438, 43214, 42188, 42333); + +-- Script names +UPDATE `creature_template` SET `ScriptName` = 'boss_corborus' WHERE `entry` = 43438; +UPDATE `creature_template` SET `ScriptName` = 'boss_slabhide' WHERE `entry` = 43214; +UPDATE `creature_template` SET `ScriptName` = 'boss_ozruk' WHERE `entry` = 42188; +UPDATE `creature_template` SET `ScriptName` = 'boss_high_priestess_azil' WHERE `entry` = 42333; +UPDATE `creature_template` SET `ScriptName` = 'npc_rock_borer' WHERE `entry` = 43917; +UPDATE `creature_template` SET `ScriptName` = 'npc_sc_millhouse_manastorm' WHERE `entry` = 43391; +UPDATE `creature_template` SET `ScriptName` = 'npc_lava_fissure' WHERE `entry` = 43242; +UPDATE `creature_template` SET `ScriptName` = 'npc_stalactite_trigger' WHERE `entry` = 43159; +UPDATE `creature_template` SET `ScriptName` = 'npc_devout_follower' WHERE `entry` = 42428; +UPDATE `creature_template` SET `ScriptName` = 'npc_gravity_well' WHERE `entry` = 42499; +UPDATE `creature_template` SET `ScriptName` = 'npc_seismic_shard' WHERE `entry` = 42355; + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (81459, 45313, 93167, 81008, 81035, 81028, 80650, 80654, 80643, 92653, 80647, 92309, 92306, 92300, 92393, 78835, 92429, 79200, 79196, 79251, 79249, 79332, 86862, 86863, 79015); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(81459, 'spell_force_of_earth'), +(45313, 'spell_sc_anchor_here'), +(93167, 'spell_sc_twilight_documents'), +(81008, 'spell_sc_quake'), +(81035, 'spell_s81035_stalactite'), +(81028, 'spell_s81028_s80650_stalactite'), +(80650, 'spell_s81028_s80650_stalactite'), +(80654, 'spell_stalactite_mod_dest_height'), +(80643, 'spell_stalactite_mod_dest_height'), +(92653, 'spell_stalactite_mod_dest_height'), +(80647, 'spell_stalactite_mod_dest_height'), +(92309, 'spell_stalactite_mod_dest_height'), +(92306, 'spell_s92306_crystal_storm'), +(92300, 'spell_s92300_crystal_storm'), +(92393, 'spell_rupture'), +(78835, 'spell_elementium_spike_shield'), +(92429, 'spell_elementium_spike_shield'), +(79200, 'spell_summon_wave_south'), +(79196, 'spell_summon_wave_west'), +(79251, 'spell_gravity_well_damage_nearby'), +(79249, 'spell_gravity_well_damage'), +(79332, 'spell_gravity_well_pull'), +(86862, 'spell_seismic_shard_prepare'), +(86863, 'spell_seismic_shard_change_seat'), +(79015, 'spell_seismic_shard'); + +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (6076, 6070); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(6076, 'at_sc_corborus_intro'), +(6070, 'at_sc_slabhide_intro'); + +-- Twilight Documents object is spawned by Millhouse. +DELETE FROM `gameobject` WHERE `id` = 207415; + +-- Millhouse Manastorm texts +DELETE FROM `creature_text` WHERE `entry` IN (43391); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(43391, 0, 1, 'Follow me if you dare!', 14, 0, 100, 0, 0, 21783, 0, 0, 'Millhouse Manastorm'), +(43391, 0, 2, 'It''s time for a tactical retreat!', 14, 0, 100, 0, 0, 21784, 0, 0, 'Millhouse Manastorm'), +(43391, 0, 3, 'You''re gonna be sorry!', 14, 0, 100, 0, 0, 21785, 0, 0, 'Millhouse Manastorm'), +(43391, 0, 4, 'Don''t say I didn''t warn ya!', 14, 0, 100, 0, 0, 21786, 0, 0, 'Millhouse Manastorm'), +(43391, 1, 1, 'Ah-ha! I''ve got you right where I want you!', 14, 0, 100, 0, 0, 21787, 0, 0, 'Millhouse Manastorm'), +(43391, 1, 2, 'Now... witness the full power of Millhouse Manastorm!', 14, 0, 100, 0, 0, 21788, 0, 0, 'Millhouse Manastorm'), +(43391, 1, 3, 'Prison taught me one very important lesson, well, two if you count how to hold your soap, but yes! SURVIVAL!', 14, 0, 100, 0, 0, 21789, 0, 0, 'Millhouse Manastorm'); + +-- Creature formations for Millhouse event (340418 -> trash, 340492 -> last group) +DELETE FROM `creature_formations` WHERE `leaderGUID` IN (340418, 340392, 340492); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(340418, 340418, 0, 0, 0, 0, 0), +(340418, 340419, 0, 0, 0, 0, 0), +(340418, 340421, 0, 0, 0, 0, 0), +(340418, 340422, 0, 0, 0, 0, 0), +(340418, 340465, 0, 0, 0, 0, 0), +(340418, 340466, 0, 0, 0, 0, 0), +(340418, 340467, 0, 0, 0, 0, 0), +(340418, 340469, 0, 0, 0, 0, 0), +(340418, 340476, 0, 0, 0, 0, 0), +(340418, 340477, 0, 0, 0, 0, 0), +(340418, 340478, 0, 0, 0, 0, 0), +(340418, 340479, 0, 0, 0, 0, 0), +(340492, 340492, 0, 0, 0, 0, 0), +(340492, 340493, 0, 0, 0, 0, 0), +(340492, 340494, 0, 0, 0, 0, 0), +(340492, 340495, 0, 0, 0, 0, 0), +(340492, 340496, 0, 0, 0, 0, 0), +(340492, 340497, 0, 0, 0, 0, 0), +(340492, 340498, 0, 0, 0, 0, 0), +(340492, 340499, 0, 0, 0, 0, 0), +(340492, 340500, 0, 0, 0, 0, 0); + +-- Stonecore Flayer SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 42808; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 42808 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`, `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 +(42808, 0, 0, 0, 1, 0, 100, 0, 0, 0, 60000, 60000, 17, 438, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Flayer - In Combat - Set emote state 438"), +(42808, 0, 1, 0, 4, 0, 100, 0, 2500, 10000, 10000, 15000, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Flayer - On Aggro - Set emote state 0"), +(42808, 0, 2, 0, 0, 0, 100, 0, 2500, 10000, 10000, 15000, 11, 79922, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Flayer - In Combat - Cast 'Flay'"); + +-- Stonecore Earthshaper SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 43537; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 43537 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`, `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 +(43537, 0, 0, 1, 25, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - On Reset - Set Phase 1"), +(43537, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - Linked - Demorph"), +(43537, 0, 2, 0, 0, 1, 100, 0, 3000, 3000, 10000, 15000, 11, 81576, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - In Combat (Phase 1) - Cast 'Lava Burst'"), +(43537, 0, 3, 4, 0, 1, 100, 0, 9000, 9000, 12000, 12000, 11, 81459, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - In Combat (Phase 1) - Cast 'Force of Earth'"), +(43537, 0, 4, 0, 61, 1, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - Linked - Say Text 0"), +(43537, 0, 5, 0, 0, 1, 100, 0, 15000, 15000, 10000, 15000, 11, 81530, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - In Combat (Phase 1) - Cast 'Ground Shock'"), +(43537, 0, 6, 7, 8, 1, 100, 1, 81459, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - Hit by 'Force of Earth' (Phase 1) - Set Phase 2"), +(43537, 0, 7, 0, 61, 1, 100, 1, 81459, 0, 0, 0, 3, 26693, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - Linked - Morph"), +(43537, 0, 8, 0, 0, 2, 100, 0, 5000, 5000, 15000, 15000, 11, 81463, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - In Combat (Phase 2) - Cast 'Dust Storm'"), +(43537, 0, 9, 0, 6, 0, 100, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Earthshaper - On Death - Demorph"); +-- TODO: Demorph 3 seconds after death. Need more sniffs for Force of Earth's dummy. + +DELETE FROM `creature_text` WHERE `entry` = 43537 AND `groupid` = 0; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES +(43537, 0, 0, '%s begins to transform into a Force of Earth!', 16, 0, 100, 0, 0, 0, 46680, 'Stonecore Earthshaper'); + +-- Stonecore Warbringer SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 42696; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 42696 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`, `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 +(42696, 0, 0, 0, 0, 0, 100, 0, 4000, 4000, 12000, 12000, 11, 80158, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Stonecore Warbringer - In Combat - Cast 'Rage'"), +(42696, 0, 1, 0, 0, 0, 100, 0, 8000, 8000, 8000, 12000, 11, 15496, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Stonecore Warbringer - In Combat - Cast 'Cleave'"); + +-- Stonecore Berserker SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 43430; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 43430 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`, `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 +(43430, 0, 0, 0, 0, 0, 100, 0, 0, 0, 10000, 10000, 11, 81574, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, "Stonecore Warbringer - In Combat - Cast 'Charge'"), +(43430, 0, 1, 0, 0, 0, 100, 0, 10000, 15000, 10000, 20000, 11, 81568, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Warbringer - In Combat - Cast 'Spinning Slash'"); + +-- Heroic template of Corborus, Flags on creation (from sniffs) +UPDATE `creature_template` SET `difficulty_entry_1` = 49642, `unit_flags` = 33088 WHERE `entry` = 43438; +DELETE FROM `creature_template` WHERE `entry` = 49642; +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `femaleName`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `exp_unk`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `type_flags2`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `HealthModifierExtra`, `ManaModifier`, `ManaModifierExtra`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES +(49642, 0, 0, 0, 0, 0, 33477, 0, 0, 0, 'Corborus (1)', '', '', '', 0, 87, 87, 3, 0, 14, 0, 2.8, 1.14286, 1, 1, 0, 2000, 2000, 1, 1, 1, 33088, 2048, 0, 0, 0, 0, 0, 4, 584, 0, 49642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 1, 35, 1, 1, 1, 1, 1, 1, 0, 52506, 0, 0, 0, 0, 0, 154, 1, 617299839, 1, '', 15595); + +-- Corborus loot +UPDATE `creature_template` SET `lootid` = 43438 WHERE `entry` = 43438; +UPDATE `creature_template` SET `lootid` = 49642 WHERE `entry` = 49642; + +DELETE FROM `creature_loot_template` WHERE `Entry` IN (43438, 49642); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(43438, 1, 43400, 100, 0, 1, 0, 1, 1, NULL), +(49642, 1, 43401, 100, 0, 1, 0, 1, 1, NULL); + +DELETE FROM `reference_loot_template` WHERE `Entry` IN (43400, 43401); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(43400, 55792, 0, 0, 0, 1, 1, 1, 1, NULL), +(43400, 55793, 0, 0, 0, 1, 1, 1, 1, NULL), +(43400, 55794, 0, 0, 0, 1, 1, 1, 1, NULL), +(43400, 55795, 0, 0, 0, 1, 1, 1, 1, NULL), +(43400, 55796, 0, 0, 0, 1, 1, 1, 1, NULL), +(43401, 56328, 0, 0, 0, 1, 1, 1, 1, NULL), +(43401, 56329, 0, 0, 0, 1, 1, 1, 1, NULL), +(43401, 56330, 0, 0, 0, 1, 1, 1, 1, NULL), +(43401, 56331, 0, 0, 0, 1, 1, 1, 1, NULL), +(43401, 56332, 0, 0, 0, 1, 1, 1, 1, NULL); + +-- Set UNIT_FLAG_NOT_SELECTABLE to Trashing Charge. +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` = 43743; + +-- Crystalspawn Giant SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 42810; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 42810 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`, `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 +(42810, 0, 0, 0, 0, 0, 100, 0, 5000, 5000, 12000, 12000, 11, 81008, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Crystalspawn Giant - In Combat - Cast 'Quake'"); +-- (42810, 0, 1, 0, 0, 0, 100, 0, 10000, 10000, 12000, 12000, 11, ?????, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Crystalspawn Giant - In Combat - Cast 'Crystal Shard'"); +-- need Stonecore HC sniffs for this spell + +-- Remove one Slabhide spawn, only the flying one is needed +DELETE FROM `creature` WHERE `id` = 43214; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(340550, 43214, 725, 0, 0, 3, 1, 0, 0, 0, 0, 1191.1, 1154.01, 270.759, 4.69494, 7200, 0, 0, 1, 0, 0, 0, 0, 0, 0); + +-- Heroic template of Slabhide, InhabitType correction +UPDATE `creature_template` SET `difficulty_entry_1` = 49538, `InhabitType` = 7 WHERE `entry` = 43214; +DELETE FROM `creature_template` WHERE `entry` = 49538; +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `femaleName`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `exp_unk`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `type_flags2`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `HealthModifierExtra`, `ManaModifier`, `ManaModifierExtra`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES +(49538, 0, 0, 0, 0, 0, 36476, 0, 0, 0, 'Slabhide (1)', '', '', '', 0, 87, 87, 3, 0, 16, 0, 2.8, 1.42857, 1, 1, 0, 2000, 2000, 1, 1, 1, 33587264, 2048, 0, 0, 0, 0, 0, 2, 72, 0, 49538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 7, 1.25, 50, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 154, 1, 0, 1, '', 15595); + +-- Slabhide loot +UPDATE `creature_template` SET `lootid` = 43214 WHERE `entry` = 43214; +UPDATE `creature_template` SET `lootid` = 49538 WHERE `entry` = 49538; + +DELETE FROM `creature_loot_template` WHERE `Entry` IN (43214, 49538); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(43214, 1, 43402, 100, 0, 1, 0, 1, 1, 'Slabhide N - Reference Loot'), +(49538, 1, 43403, 100, 0, 1, 0, 1, 1, 'Slabhide H - Reference Loot'), +(43214, 63043, 0, 1, 0, 1, 0, 1, 1, 'Slabhide N - Mount Drop'), +(49538, 63043, 0, 1, 0, 1, 0, 1, 1, 'Slabhide H - Mount Drop'); + +DELETE FROM `reference_loot_template` WHERE `Entry` IN (43402, 43403); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(43402, 55797, 0, 0, 0, 1, 1, 1, 1, NULL), +(43402, 55798, 0, 0, 0, 1, 1, 1, 1, NULL), +(43402, 55799, 0, 0, 0, 1, 1, 1, 1, NULL), +(43402, 55800, 0, 0, 0, 1, 1, 1, 1, NULL), +(43402, 55801, 0, 0, 0, 1, 1, 1, 1, NULL), +(43403, 56333, 0, 0, 0, 1, 1, 1, 1, NULL), +(43403, 56334, 0, 0, 0, 1, 1, 1, 1, NULL), +(43403, 56335, 0, 0, 0, 1, 1, 1, 1, NULL), +(43403, 56336, 0, 0, 0, 1, 1, 1, 1, NULL), +(43403, 56337, 0, 0, 0, 1, 1, 1, 1, NULL); + +-- Set UNIT_FLAG_NOT_SELECTABLE to Stalactite Trigger - Boss, Lava Fissure, . +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` IN (43159, 43242); + +-- "Stalactite Trigger - Boss": InhabitType correction +UPDATE `creature_template` SET `InhabitType` = 7 WHERE `entry` = 43159; + +-- Stonecore Magmalord SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 42789; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 42789 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`, `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 +(42789, 0, 0, 0, 0, 0, 100, 0, 4000, 8000, 10000, 20000, 11, 80151, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Stonecore Magmalord - In Combat - Cast '80151'"), +(42789, 0, 1, 0, 0, 0, 100, 0, 8000, 10000, 10000, 20000, 11, 80038, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Magmalord - In Combat - Cast 'Eruption'"); + +-- Stonecore Rift Conjurer SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 42691; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 42691 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`, `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 +(42691, 0, 0, 0, 0, 0, 100, 0, 0, 0, 2000, 2000, 11, 80279, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Stonecore Rift Conjurer - In Combat - Cast 'Shadow Bolt'"), +(42691, 0, 1, 0, 0, 0, 100, 0, 10000, 20000, 20000, 30000, 11, 80308, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Rift Conjurer - In Combat - Cast 'Demon Portal'"); + +-- Imp SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 43014; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 43014 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`, `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 +(43014, 0, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 80344, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "Imp - In Combat - Cast 'Fel Firebolt'"); + +-- Stonecore Bruiser SAI +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` = 42692; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 42692 AND `source_type` = 0 OR `entryorguid` = 4269200 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 +(42692, 0, 0, 0, 0, 0, 100, 0, 8000, 10000, 13000, 15000, 80, 4269200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Bruiser - In Combat - Start Actionlist"), +(4269200, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 80180, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, "Stonecore Bruiser - Actionlist- Cast 'Body Slam'"), +(4269200, 9, 1, 0, 0, 0, 100, 0, 2400, 2400, 0, 0, 11, 80180, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, "Stonecore Bruiser - Actionlist - Cast 'Body Slam' again"), +(4269200, 9, 2, 0, 0, 0, 100, 0, 2400, 2400, 0, 0, 11, 80180, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, "Stonecore Bruiser - Actionlist - Cast 'Body Slam' again"), +(42692, 0, 1, 0, 0, 0, 100, 0, 14000, 18000, 14000, 18000, 11, 80195, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Stonecore Bruiser - In Combat - Cast 'Shockwave'"); + +-- Heroic template of Ozruk +UPDATE `creature_template` SET `difficulty_entry_1` = 49654 WHERE `entry` = 42188; +DELETE FROM `creature_template` WHERE `entry` = 49654; +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `femaleName`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `exp_unk`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `type_flags2`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `HealthModifierExtra`, `ManaModifier`, `ManaModifierExtra`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES +(49654, 0, 0, 0, 0, 0, 36475, 0, 0, 0, 'Ozruk (1)', '', '', '', 0, 87, 87, 3, 0, 14, 0, 1, 1.5873, 1, 1, 0, 2000, 2000, 1, 1, 1, 32832, 134219776, 0, 0, 0, 0, 0, 5, 584, 0, 49654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 867, 0, 0, '', 0, 3, 1, 40, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 617299839, 1, '', 15595); + +-- Ozruk texts +DELETE FROM `creature_text` WHERE `entry` = 42188; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(42188, 0, 0, 'None may pass into the World''s Heart!', 14, 0, 100, 0, 0, 21919, 0, 0, 'Ozruk to Player'), +(42188, 1, 0, '|TInterface\\Icons\\ability_warrior_shieldreflection.blp:20|tOzruk casts |cFFFF0000|Hspell:78939|h[Elementium Bulwark]|h|r!', 41, 0, 100, 0, 0, 0, 0, 0, 'Ozruk'), +(42188, 2, 0, 'Break yourselves upon my body. Feel the strength of the earth!', 14, 0, 100, 0, 0, 21921, 0, 0, 'Ozruk'), +(42188, 3, 0, '%s becomes enraged!', 41, 0, 100, 0, 0, 0, 0, 0, 'Ozruk'), +(42188, 4, 0, 'A protector has fallen. The World''s Heart lies exposed!', 14, 0, 100, 0, 0, 21922, 0, 0, 'Ozruk to Player'); + +-- Ozruk loot +UPDATE `creature_template` SET `lootid` = 42188 WHERE `entry` = 42188; +UPDATE `creature_template` SET `lootid` = 49654 WHERE `entry` = 49654; + +DELETE FROM `creature_loot_template` WHERE `Entry` IN (42188, 49654); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(42188, 1, 43404, 100, 0, 1, 0, 1, 1, 'Ozruk N - Reference Loot'), +(49654, 1, 43405, 100, 0, 1, 0, 1, 1, 'Ozruk H - Reference Loot'); + +DELETE FROM `reference_loot_template` WHERE `Entry` IN (43404, 43405); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(43404, 55802, 0, 0, 0, 1, 1, 1, 1, NULL), +(43404, 55803, 0, 0, 0, 1, 1, 1, 1, NULL), +(43404, 55804, 0, 0, 0, 1, 1, 1, 1, NULL), +(43404, 55810, 0, 0, 0, 1, 1, 1, 1, NULL), +(43404, 55811, 0, 0, 0, 1, 1, 1, 1, NULL), +(43405, 56338, 0, 0, 0, 1, 1, 1, 1, NULL), +(43405, 56339, 0, 0, 0, 1, 1, 1, 1, NULL), +(43405, 56340, 0, 0, 0, 1, 1, 1, 1, NULL), +(43405, 56341, 0, 0, 0, 1, 1, 1, 1, NULL), +(43405, 56342, 0, 0, 0, 1, 1, 1, 1, NULL); + +-- Set UNIT_FLAG_NOT_SELECTABLE to Rupture Controller and Rupture. +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` IN (49597, 49576); + +-- Heroic template of High Priestess Azil +UPDATE `creature_template` SET `difficulty_entry_1` = 49624 WHERE `entry` = 42333; +DELETE FROM `creature_template` WHERE `entry` = 49624; +INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `femaleName`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `exp_unk`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `type_flags2`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `HealthModifierExtra`, `ManaModifier`, `ManaModifierExtra`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES +(49624, 0, 0, 0, 0, 0, 26448, 0, 0, 0, 'High Priestess Azil (1)', '', '', '', 0, 84, 84, 3, 0, 14, 2, 1.2, 1.42857, 1, 1, 0, 2000, 2000, 1, 1, 1, 32832, 2048, 0, 0, 0, 0, 0, 7, 72, 0, 49624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 903, 0, 0, '', 0, 3, 1, 30, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 721, 1, 617299839, 1, '', 15595); + +-- "Stalactite Trigger - Boss": InhabitType correction +UPDATE `creature_template` SET `InhabitType` = 7 WHERE `entry` IN (42333, 49624); + +-- High Priestess Azil texts +DELETE FROM `creature_text` WHERE `entry` = 42333; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(42333, 0, 0, 'The world will be reborn in flames!', 14, 0, 100, 0, 0, 21634, 0, 0, 'High Priestess Azil to Player'), +(42333, 1, 0, 'Witness the power bestowed upon me by Deathwing! Feel the fury of earth!', 14, 0, 100, 0, 0, 21628, 0, 0, 'High Priestess Azil to High Priestess Azil'), +(42333, 2, 0, 'For my death, countless more will fall. The burden is now yours to bear.', 14, 0, 100, 0, 0, 21633, 0, 0, 'High Priestess Azil to Player'); + +-- High Priestess Azil loot +UPDATE `creature_template` SET `lootid` = 42333 WHERE `entry` = 42333; +UPDATE `creature_template` SET `lootid` = 49624 WHERE `entry` = 49624; + +DELETE FROM `creature_loot_template` WHERE `Entry` IN (42333, 49624); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(42333, 1, 43406, 100, 0, 1, 0, 1, 1, 'High Priestess Azil N - Reference Loot'), +(49624, 1, 43407, 100, 0, 1, 0, 1, 1, 'High Priestess Azil H - Reference Loot'), +(49624, 52078, 0, 100, 0, 1, 0, 1, 1, 'High Priestess Azil H - Chaos Orb'); + +DELETE FROM `reference_loot_template` WHERE `Entry` IN (43406, 43407); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(43406, 55812, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55813, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55814, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55815, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55816, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55817, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55818, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55819, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55820, 0, 0, 0, 1, 1, 1, 1, NULL), +(43406, 55821, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56343, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56344, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56345, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56346, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56347, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56348, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56349, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56350, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56351, 0, 0, 0, 1, 1, 1, 1, NULL), +(43407, 56352, 0, 0, 0, 1, 1, 1, 1, NULL); + +DELETE FROM `spell_target_position` WHERE `id` IN (79193, 79199, 86860, 86858, 86856); +INSERT INTO `spell_target_position` (`id`, `effIndex`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`, `VerifiedBuild`) VALUES +(79193, 0, 725, 1260, 960, 205.443756, 0, 0), +(79199, 0, 725, 1280, 1050, 210.383057, 0, 0), +(86860, 0, 725, 1350.75, 919.133, 194.769, 0, 0), +(86858, 0, 725, 1341.19, 913.399, 197.092, 0, 0), +(86856, 0, 725, 1361.89, 920.219, 196.308, 0, 0); + +-- Set UNIT_FLAG_NOT_SELECTABLE to Gravity Well and Seismic Shard. +UPDATE `creature_template` SET `unit_flags` = 33554432 WHERE `entry` IN (42499, 42355); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 0e43a63c98e..ad727fc17d2 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -677,6 +677,12 @@ void AddSC_zangarmarsh(); // Maelstrom void AddSC_kezan(); +void AddSC_instance_stonecore(); // Stonecore +void AddSC_stonecore(); +void AddSC_boss_corborus(); +void AddSC_boss_slabhide(); +void AddSC_boss_ozruk(); +void AddSC_boss_high_priestess_azil(); // Events void AddSC_event_childrens_week(); @@ -1411,6 +1417,12 @@ void AddMaelstromScripts() { #ifdef SCRIPTS AddSC_kezan(); + AddSC_instance_stonecore(); // Stonecore + AddSC_stonecore(); + AddSC_boss_corborus(); + AddSC_boss_slabhide(); + AddSC_boss_ozruk(); + AddSC_boss_high_priestess_azil(); #endif } diff --git a/src/server/scripts/Maelstrom/CMakeLists.txt b/src/server/scripts/Maelstrom/CMakeLists.txt index 79f0789fd3f..8d3f1ee1c69 100644 --- a/src/server/scripts/Maelstrom/CMakeLists.txt +++ b/src/server/scripts/Maelstrom/CMakeLists.txt @@ -9,6 +9,13 @@ set(scripts_STAT_SRCS ${scripts_STAT_SRCS} Maelstrom/kezan.cpp + Maelstrom/Stonecore/instance_stonecore.cpp + Maelstrom/Stonecore/stonecore.cpp + Maelstrom/Stonecore/stonecore.h + Maelstrom/Stonecore/boss_corborus.cpp + Maelstrom/Stonecore/boss_slabhide.cpp + Maelstrom/Stonecore/boss_ozruk.cpp + Maelstrom/Stonecore/boss_high_priestess_azil.cpp ) message(" -> Prepared: The Maelstrom") diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp new file mode 100644 index 00000000000..2d522928fce --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp @@ -0,0 +1,319 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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 . + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "CreatureGroups.h" +#include "stonecore.h" + +// TO-DO: +// Find heroic sniffs and script spawning Crystal Shards on heroic mode. + +enum Spells +{ + // Corborus intro + SPELL_TWILIGHT_DOCUMENTS = 93167, + SPELL_RING_WYRM_CHARGE = 81237, + SPELL_DOOR_BREAK = 81232, // cast by World Trigger 22515 + + // Corborus boss + SPELL_DAMPENING_WAVE = 82415, + SPELL_CRYSTAL_BARRAGE = 86881, // 81638 triggers 81637 +// SPELL_CRYSTAL_BARRAGE_SHARD = 92012, // heroic only, summons Crystal Shard (TO-DO!) + SPELL_CLEAR_ALL_DEBUFFS = 34098, + SPELL_SUBMERGE = 81629, + SPELL_TRASHING_CHARGE_TELEPORT = 81839, // triggers 81864 +// SPELL_TRASHING_CHARGE_TELEPORT_2= 81838, // dummy, targets all players, threat update packet follows + SPELL_SUMMON_TRASHING_CHARGE = 81816, + SPELL_TRASHING_CHARGE_VISUAL = 81801, // cast time 3.5 sec + SPELL_TRASHING_CHARGE_EFFECT = 81828, // 40 yard radius + SPELL_EMERGE = 81948, + + // Rock Borer npc (43917) + SPELL_ROCK_BORER_EMERGE = 82185, + SPELL_ROCK_BORE = 80028, +}; + +enum NPCs +{ + NPC_TRASHING_CHARGE = 43743, +// NPC_CRYSTAL_SHARD = 49267, // 49473 +}; + +enum Events +{ + EVENT_NONE, + + // Corborus intro + EVENT_CORBORUS_CHARGE, + EVENT_CORBORUS_KNOCKBACK, + EVENT_CORBORUS_FACEPLAYERS, + + // Corborus boss + EVENT_DAMPENING_WAVE, + EVENT_CRYSTAL_BARRAGE, + EVENT_SUBMERGE, + EVENT_TELEPORT, + EVENT_TRASHING_CHARGE, + EVENT_SUMMON_BEETLE, + EVENT_EMERGE, + EVENT_ATTACK, + + // Rock Borer + EVENT_EMERGED, + EVENT_ROCK_BORE, +}; + +class boss_corborus : public CreatureScript +{ + public: + boss_corborus() : CreatureScript("boss_corborus") { } + + struct boss_corborusAI : public BossAI + { + boss_corborusAI(Creature* creature) : BossAI(creature, DATA_CORBORUS) + { + stateIntro = NOT_STARTED; + } + + void Reset() override + { + _Reset(); + countTrashingCharge = 0; + events.ScheduleEvent(EVENT_DAMPENING_WAVE, 10000); + events.ScheduleEvent(EVENT_CRYSTAL_BARRAGE, 15000); + events.ScheduleEvent(EVENT_SUBMERGE, 36000); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_CORBORUS_INTRO: // Executes Corborus intro event + { + if (stateIntro != NOT_STARTED) + return; + + stateIntro = IN_PROGRESS; + + if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM))) + { + Millhouse->InterruptNonMeleeSpells(true); + Millhouse->RemoveAllAuras(); + Millhouse->HandleEmoteCommand(EMOTE_ONESHOT_KNOCKDOWN); + } + + events.ScheduleEvent(EVENT_CORBORUS_CHARGE, 1000); + break; + } + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && stateIntro != IN_PROGRESS) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CORBORUS_CHARGE: + // Face Millhouse and other mobs + instance->SetData(DATA_MILLHOUSE_EVENT_FACE, 0); + + // Open rock gate and cast visual from nearby worldtrigger + instance->HandleGameObject(instance->GetGuidData(GAMEOBJECT_CORBORUS_ROCKDOOR), true); + if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 60.0f)) + worldtrigger->CastSpell(worldtrigger, SPELL_DOOR_BREAK, true); + + // Make Corborus charge + me->CastSpell(me, SPELL_RING_WYRM_CHARGE, true); + + events.ScheduleEvent(EVENT_CORBORUS_KNOCKBACK, 1000); + break; + case EVENT_CORBORUS_KNOCKBACK: + // Spawn Twilight Documents (quest gameobject) + if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM))) + Millhouse->CastSpell(Millhouse, SPELL_TWILIGHT_DOCUMENTS, true); + + // Knockback Millhouse and other mobs + instance->SetData(DATA_MILLHOUSE_EVENT_KNOCKBACK, 0); + + events.ScheduleEvent(EVENT_CORBORUS_FACEPLAYERS, 2000); + break; + case EVENT_CORBORUS_FACEPLAYERS: + // Face Corborus to players and set new home position + me->SetFacingTo(3.176499f); + me->SetHomePosition(1154.55f, 878.843f, 284.963f, 3.176499f); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + + // Despawn Millhouse and all trash + instance->SetData(DATA_MILLHOUSE_EVENT_DESPAWN, 0); + + stateIntro = DONE; + break; + case EVENT_DAMPENING_WAVE: + DoCastVictim(SPELL_DAMPENING_WAVE); + events.ScheduleEvent(EVENT_DAMPENING_WAVE, 15000); + break; + case EVENT_CRYSTAL_BARRAGE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_CRYSTAL_BARRAGE); + events.ScheduleEvent(EVENT_CRYSTAL_BARRAGE, 10000); + break; + case EVENT_SUBMERGE: + events.RescheduleEvent(EVENT_DAMPENING_WAVE, 35000); + events.RescheduleEvent(EVENT_CRYSTAL_BARRAGE, 30000); + events.RescheduleEvent(EVENT_SUBMERGE, 100000); + + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DoCast(me, SPELL_CLEAR_ALL_DEBUFFS); + me->AttackStop(); + + DoCast(me, SPELL_SUBMERGE); + + countTrashingCharge = 0; + events.ScheduleEvent(EVENT_TELEPORT, 500); + break; + case EVENT_TELEPORT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_TRASHING_CHARGE_TELEPORT); + countTrashingCharge += 1; + if (countTrashingCharge <= 4) + events.ScheduleEvent(EVENT_TRASHING_CHARGE, 1000); + else + events.ScheduleEvent(EVENT_EMERGE, 2500); + break; + case EVENT_TRASHING_CHARGE: + DoCast(me, SPELL_SUMMON_TRASHING_CHARGE); + DoCast(me, SPELL_TRASHING_CHARGE_VISUAL); + events.ScheduleEvent(EVENT_TELEPORT, 5000); + break; + case EVENT_EMERGE: + me->RemoveAllAuras(); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + DoCast(me, SPELL_EMERGE); + events.ScheduleEvent(EVENT_ATTACK, 2500); + break; + case EVENT_ATTACK: + me->SetReactState(REACT_AGGRESSIVE); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + void JustSummoned(Creature* summon) override + { + if (summon->GetEntry() != NPC_TRASHING_CHARGE) + return; + + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_TRASHING_CHARGE_EFFECT); + summon->DespawnOrUnsummon(6000); + } + + private: + EncounterState stateIntro; + uint32 countTrashingCharge; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 43391 - Rock Borer +class npc_rock_borer : public CreatureScript +{ + public: + npc_rock_borer() : CreatureScript("npc_rock_borer") { } + + struct npc_rock_borerAI : public ScriptedAI + { + npc_rock_borerAI(Creature* creature) : ScriptedAI(creature) + { + me->SetDisableGravity(true); + me->SetReactState(REACT_PASSIVE); + events.ScheduleEvent(EVENT_EMERGED, 1200); + events.ScheduleEvent(EVENT_ROCK_BORE, urand(15000, 20000)); // Need sniffs for this timer + } + + void IsSummonedBy(Unit* summoner) override + { + me->SetInCombatState(false, summoner); + DoCast(SPELL_ROCK_BORER_EMERGE); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && me->GetReactState() != REACT_PASSIVE) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_EMERGED: + me->RemoveAurasDueToSpell(SPELL_ROCK_BORER_EMERGE); + me->SetReactState(REACT_AGGRESSIVE); + break; + case EVENT_ROCK_BORE: + DoCast(SPELL_ROCK_BORE); + events.ScheduleEvent(EVENT_ROCK_BORE, urand(15000, 20000)); // Need sniffs for this timer + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +void AddSC_boss_corborus() +{ + new boss_corborus(); + new npc_rock_borer(); +} diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp new file mode 100644 index 00000000000..fc14bf7a703 --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp @@ -0,0 +1,807 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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 . + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "Vehicle.h" +#include "stonecore.h" + +enum Spells +{ + SPELL_ENERGY_SHIELD = 82858, + + SPELL_CURSE_OF_BLOOD = 79345, + SPELL_FORCE_GRIP = 79351, + SPELL_SUMMON_GRAVITY_WELL = 79340, + SPELL_EARTH_FURY_ENERGY_SHIELD = 79050, + + // Gravity Well + SPELL_GRAVITY_WELL_VISUAL = 79245, + SPELL_GRAVITY_WELL_AURA_DAMAGE = 79244, + SPELL_GRAVITY_WELL_AURA_PULL = 79333, + + SPELL_GRAVITY_WELL_DAMAGE = 79249, + SPELL_GRAVITY_WELL_PULL = 79332, + + // Fury of Earth phase + SPELL_EARTH_FURY_CASTING_VISUAL = 79002, + SPELL_SEISMIC_SHARD_SUMMON_1 = 86860, + SPELL_SEISMIC_SHARD_SUMMON_2 = 86858, + SPELL_SEISMIC_SHARD_SUMMON_3 = 86856, + SPELL_SEISMIC_SHARD_VISUAL = 79009, + SPELL_SEISMIC_SHARD_PREPARE = 86862, + SPELL_SEISMIC_SHARD_TARGETING = 80511, + SPELL_SEISMIC_SHARD_LAUNCH = 79015, + SPELL_SEISMIC_SHARD_MISSLE = 79014, + SPELL_EJECT_ALL_PASSENGERS = 68576, + + // Add wave spells + SPELL_SUMMON_WAVE_SOUTH = 79200, + SPELL_SUMMON_WAVE_WEST = 79196, + SPELL_SUMMON_ADD_SOUTH = 79193, + SPELL_SUMMON_ADD_WEST = 79199, +}; + +enum NPCs +{ + NPC_DEVOUT_FOLLOWER = 42428, + NPC_SEISMIC_SHARD = 42355, +}; + +enum Texts +{ + SAY_AGGRO = 0, + SAY_PHASE_TWO = 1, + SAY_DEATH = 2, +}; + +enum Events +{ + EVENT_NONE, + + EVENT_INTRO_MOVE, + + EVENT_CURSE_OF_BLOOD, + EVENT_FORCE_GRIP, + EVENT_SUMMON_GRAVITY_WELL, + EVENT_ENERGY_SHIELD, + EVENT_EARTH_FURY, + + EVENT_SUMMON_WAVE_SOUTH, + EVENT_SUMMON_WAVE_WEST, + + EVENT_GRAVITY_WELL_AURA_DAMAGE, + EVENT_GRAVITY_WELL_AURA_PULL, + + // Phase 2: Fury of Earth + EVENT_EARTH_FURY_FLY_UP, + EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM, + EVENT_EARTH_FURY_CHECK_SEAT0, + EVENT_EARTH_FURY_LAUNCH_SHARD, + EVENT_EARTH_FURY_FLY_DOWN, + EVENT_START_ATTACK, + + EVENT_LAUNCH, + EVENT_SEISMIC_SHARD_MOUNT +}; + +enum EventGroups +{ + EVENT_GROUP_PHASE_ONE, + EVENT_GROUP_ADDS, +}; + +enum Points +{ + POINT_NONE, + + POINT_INTRO_MOVE, + POINT_FLY_UP, + POINT_ABOVE_PLATFORM, + POINT_PLATFORM, + POINT_GROUND, +}; + +Position const GroundPos = { 1331.82f, 980.314f, 207.542f }; +Position const AbovePlatformPos = { 1336.21f, 960.813f, 215.0f }; + +// TO-DO: +// - Find out why NPCs summoned by boss are usually two times bigger than their normal size. +// - Find more sniffs and script Force Grip spell (79351) + +class boss_high_priestess_azil : public CreatureScript +{ + public: + boss_high_priestess_azil() : CreatureScript("boss_high_priestess_azil") { } + + struct boss_high_priestess_azilAI : public BossAI + { + boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL), vehicle(creature->GetVehicleKit()) + { + ASSERT(vehicle); + } + + Vehicle* vehicle; + + void Reset() override + { + _Reset(); + + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetReactState(REACT_PASSIVE); + + events.ScheduleEvent(EVENT_INTRO_MOVE, 2000); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000, EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000,10000), EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000, EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_ENERGY_SHIELD, urand(35000,36000)); + events.ScheduleEvent(EVENT_SUMMON_WAVE_SOUTH, 0); + events.ScheduleEvent(EVENT_SUMMON_WAVE_WEST, 40000); + } + + void EnterCombat(Unit* /*victim*/) override + { + _EnterCombat(); + + DoCast(SPELL_ENERGY_SHIELD); + Talk(SAY_AGGRO); + } + + void JustDied(Unit* killer) override + { + me->Say(SAY_DEATH); + } + + /* + void PassengerBoarded(Unit* who, int8 seatId, bool apply) override + { + if (!apply || who->GetEntry() != NPC_SEISMIC_SHARD) + return; + + Movement::MoveSplineInit init(who); + init.DisableTransportPathTransformations(); + if (seatId == 0) + init.MoveTo(12.13748f, 0.0f, 2.442475f); + else if (seatId == 1) + init.MoveTo(12.13748f, 17.5f, 11.19248f); + else + init.MoveTo(12.13748f, -17.5f, 11.19248f); + init.Launch(); + } + */ + + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE && id != POINT_INTRO_MOVE) + return; + + switch (id) + { + case POINT_INTRO_MOVE: + me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD); + me->SetReactState(REACT_AGGRESSIVE); + break; + case POINT_FLY_UP: + me->SetCanFly(true); + me->SetDisableGravity(true); + events.ScheduleEvent(EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM, 1000); + break; + case POINT_ABOVE_PLATFORM: + me->SetFacingTo(5.218534f); + DoCast(SPELL_EARTH_FURY_CASTING_VISUAL); + DoCast(SPELL_SEISMIC_SHARD_SUMMON_1); + DoCast(SPELL_SEISMIC_SHARD_SUMMON_2); + DoCast(SPELL_SEISMIC_SHARD_SUMMON_3); + events.ScheduleEvent(EVENT_EARTH_FURY_CHECK_SEAT0, 6700); + break; + case POINT_GROUND: + DoCast(SPELL_EJECT_ALL_PASSENGERS); + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetReactState(REACT_AGGRESSIVE); + // Find more sniffs to correct these timers, this was copied from Reset() void. + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000, EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000, 10000), EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000, EVENT_GROUP_PHASE_ONE); + break; + default: + break; + } + } + + 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_INTRO_MOVE: + me->GetMotionMaster()->MoveJump(GroundPos, me->GetSpeed(MOVE_FLIGHT), 1.918408f, POINT_INTRO_MOVE); + break; + case EVENT_CURSE_OF_BLOOD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_CURSE_OF_BLOOD); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000), EVENT_GROUP_PHASE_ONE); + break; + case EVENT_FORCE_GRIP: + DoCastVictim(SPELL_FORCE_GRIP); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000), EVENT_GROUP_PHASE_ONE); + break; + case EVENT_SUMMON_GRAVITY_WELL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_SUMMON_GRAVITY_WELL); + events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, urand(13000, 15000), EVENT_GROUP_PHASE_ONE); + break; + case EVENT_ENERGY_SHIELD: + events.CancelEventGroup(EVENT_GROUP_PHASE_ONE); + DoCast(SPELL_EARTH_FURY_ENERGY_SHIELD); + events.ScheduleEvent(EVENT_EARTH_FURY, 0); + break; + case EVENT_EARTH_FURY: + countSeismicShard = 3; + me->SetReactState(REACT_PASSIVE); + me->SetFacingTo(5.862942f); + events.ScheduleEvent(EVENT_EARTH_FURY_FLY_UP, 1600); + break; + case EVENT_EARTH_FURY_FLY_UP: + Talk(SAY_PHASE_TWO); + me->GetMotionMaster()->MovePoint(POINT_FLY_UP, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5); + break; + case EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM: + me->GetMotionMaster()->MovePoint(POINT_ABOVE_PLATFORM, AbovePlatformPos); + break; + case EVENT_EARTH_FURY_CHECK_SEAT0: + if (!vehicle->GetPassenger(0)) + DoCast(SPELL_SEISMIC_SHARD_PREPARE); + events.ScheduleEvent(EVENT_EARTH_FURY_LAUNCH_SHARD, 1800); + break; + case EVENT_EARTH_FURY_LAUNCH_SHARD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + { + me->SetFacingToObject(target); + DoCast(target, SPELL_SEISMIC_SHARD_TARGETING); + DoCast(SPELL_SEISMIC_SHARD_LAUNCH); + countSeismicShard -= 1; + } + events.ScheduleEvent(countSeismicShard > 0 ? EVENT_EARTH_FURY_CHECK_SEAT0 : EVENT_EARTH_FURY_FLY_DOWN, 4800); + break; + case EVENT_EARTH_FURY_FLY_DOWN: + { + me->RemoveAurasDueToSpell(SPELL_EARTH_FURY_CASTING_VISUAL); + me->RemoveAurasDueToSpell(SPELL_EARTH_FURY_ENERGY_SHIELD); + Position pos = me->GetPosition(); + pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); + me->GetMotionMaster()->MovePoint(POINT_GROUND, pos); + break; + } + case EVENT_SUMMON_WAVE_SOUTH: + if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f)) + worldtrigger->CastSpell(worldtrigger, SPELL_SUMMON_WAVE_SOUTH); + events.ScheduleEvent(EVENT_SUMMON_WAVE_SOUTH, 12000); + break; + case EVENT_SUMMON_WAVE_WEST: + if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f)) + worldtrigger->CastSpell(worldtrigger, SPELL_SUMMON_WAVE_WEST); + events.ScheduleEvent(EVENT_SUMMON_WAVE_WEST, 20000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + uint8 countSeismicShard; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 42428 - Devout Follower +class npc_devout_follower : public CreatureScript +{ +public: + npc_devout_follower() : CreatureScript("npc_devout_follower") { } + + struct npc_devout_followerAI : public ScriptedAI + { + npc_devout_followerAI(Creature* creature) : ScriptedAI(creature) { } + + void IsSummonedBy(Unit* summoner) override + { + if (summoner->GetEntry() != NPC_WORLDTRIGGER) + return; + + if (Unit* target = me->SelectNearestPlayer(200.0f)) + { + me->AddThreat(target, 0.0f); + me->SetInCombatWith(target); + target->SetInCombatWith(me); + DoStartMovement(target); + me->Attack(target, true); + } + else + me->GetMotionMaster()->MovePoint(POINT_NONE, summoner->GetPosition()); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 42499 - Gravity Well +class npc_gravity_well : public CreatureScript +{ +public: + npc_gravity_well() : CreatureScript("npc_gravity_well") { } + + struct npc_gravity_wellAI : public ScriptedAI + { + npc_gravity_wellAI(Creature* creature) : ScriptedAI(creature) + { + me->SetReactState(REACT_PASSIVE); + DoCast(SPELL_GRAVITY_WELL_VISUAL); + events.ScheduleEvent(EVENT_GRAVITY_WELL_AURA_DAMAGE, 3200); + events.ScheduleEvent(EVENT_GRAVITY_WELL_AURA_PULL, 4500); + if (!me->GetMap()->IsHeroic()) + me->DespawnOrUnsummon(23200); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetEntry() != NPC_DEVOUT_FOLLOWER) + return; + + me->SetObjectScale(me->GetObjectScale() - 0.25f); + if (me->GetObjectScale() <= 0.0f) + me->DespawnOrUnsummon(1000); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GRAVITY_WELL_AURA_DAMAGE: + me->RemoveAurasDueToSpell(SPELL_GRAVITY_WELL_VISUAL); + DoCast(SPELL_GRAVITY_WELL_AURA_DAMAGE); + break; + case EVENT_GRAVITY_WELL_AURA_PULL: + DoCast(SPELL_GRAVITY_WELL_AURA_PULL); + break; + default: + break; + } + } + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 42355 - Seismic Shard +class npc_seismic_shard : public CreatureScript +{ +public: + npc_seismic_shard() : CreatureScript("npc_seismic_shard") { } + + struct npc_seismic_shardAI : public ScriptedAI + { + npc_seismic_shardAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + me->SetDisableGravity(true); + me->SetReactState(REACT_PASSIVE); + DoCast(SPELL_SEISMIC_SHARD_VISUAL); + + Movement::MoveSplineInit init(me); + FillPath(me->GetPosition(), init.Path()); + init.SetFly(); + init.Launch(); + + events.ScheduleEvent(EVENT_SEISMIC_SHARD_MOUNT, 2400); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SEISMIC_SHARD_MOUNT: + if (Creature* highPriestAzil = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGH_PRIESTESS_AZIL))) + if (Vehicle* vehicle = highPriestAzil->GetVehicleKit()) + me->EnterVehicle(highPriestAzil, vehicle->GetNextEmptySeat(0, false)->first); + break; + default: + break; + } + } + + } + + private: + void FillPath(Position const& pos, Movement::PointsArray& path) + { + G3D::Vector3 point; + + point.x = pos.GetPositionX(); + point.y = pos.GetPositionY(); + point.z = pos.GetPositionZ(); + + point.x -= 1.0f; + path.push_back(point); + + point.x += 1.0f; + path.push_back(point); + + point.z += 25.0f; + path.push_back(point); + + path.push_back(point); + } + + InstanceScript* instance; + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 79200 - Summon Follower +class spell_summon_wave_south : public SpellScriptLoader +{ +public: + spell_summon_wave_south() : SpellScriptLoader("spell_summon_wave_south") { } + + class spell_summon_wave_south_SpellScript : public SpellScript + { + PrepareSpellScript(spell_summon_wave_south_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_ADD_SOUTH)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + for (uint8 i = 0; i < 3; i++) + GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_ADD_SOUTH, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_summon_wave_south_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_summon_wave_south_SpellScript(); + } +}; + +// 79196 - Summon Follower +class spell_summon_wave_west : public SpellScriptLoader +{ +public: + spell_summon_wave_west() : SpellScriptLoader("spell_summon_wave_west") { } + + class spell_summon_wave_west_SpellScript : public SpellScript + { + PrepareSpellScript(spell_summon_wave_west_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_ADD_WEST)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + for (uint8 i = 0; i < 10; i++) + GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_ADD_WEST, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_summon_wave_west_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_summon_wave_west_SpellScript(); + } +}; + +// 79251 - Gravity Well (casts damage spell on units within 10 yards) +class PlayerPetOrDevoutFollowerCheck +{ +public: + bool operator()(WorldObject* object) const + { + // Valid targets are players, pets and Devout Followers + if (Creature* creature = object->ToCreature()) + return (!creature->ToPet() && object->GetEntry() != NPC_DEVOUT_FOLLOWER); + return (!object->ToPlayer()); + } +}; + +class spell_gravity_well_damage_nearby : public SpellScriptLoader +{ +public: + spell_gravity_well_damage_nearby() : SpellScriptLoader("spell_gravity_well_damage_nearby") { } + + class spell_gravity_well_damage_nearby_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gravity_well_damage_nearby_SpellScript); + + void SetRadiusMod() + { + GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3)); + } + + void FilterTargets(std::list& unitList) + { + unitList.remove_if(PlayerPetOrDevoutFollowerCheck()); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_GRAVITY_WELL_DAMAGE, true); + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_gravity_well_damage_nearby_SpellScript::SetRadiusMod); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gravity_well_damage_nearby_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_gravity_well_damage_nearby_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gravity_well_damage_nearby_SpellScript(); + } +}; + +// 79249 - Gravity Well (damage) +class spell_gravity_well_damage : public SpellScriptLoader +{ +public: + spell_gravity_well_damage() : SpellScriptLoader("spell_gravity_well_damage") { } + + class spell_gravity_well_damage_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gravity_well_damage_SpellScript); + + void CalculateDamage(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + if (!target) + return; + + float distance = GetCaster()->GetDistance2d(target); + + if (target->GetEntry() == NPC_DEVOUT_FOLLOWER) + SetHitDamage(int32(200000 - (1000 * distance))); //need more research on this formula, damage values from sniffs: 189264, 190318, 190478, 196134, 197672, 199735 + else + SetHitDamage(int32(4000 - (200 * distance))); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gravity_well_damage_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gravity_well_damage_SpellScript(); + } +}; + +// 79332 - Gravity Well (pull units within 10 yards) +class PulledRecentlyCheck +{ +public: + bool operator()(WorldObject* object) const + { + return (object->ToUnit() && object->ToUnit()->HasAura(SPELL_GRAVITY_WELL_PULL)); + } +}; + +class spell_gravity_well_pull : public SpellScriptLoader +{ +public: + spell_gravity_well_pull() : SpellScriptLoader("spell_gravity_well_pull") { } + + class spell_gravity_well_pull_SpellScript : public SpellScript + { + PrepareSpellScript(spell_gravity_well_pull_SpellScript); + + void SetRadiusMod() + { + GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3)); + } + + void FilterTargets(std::list& unitList) + { + unitList.remove_if(PulledRecentlyCheck()); + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_gravity_well_pull_SpellScript::SetRadiusMod); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gravity_well_pull_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_gravity_well_pull_SpellScript(); + } +}; + +// 86862 - Seismic Shard (forces target to cast 86863) +class spell_seismic_shard_prepare : public SpellScriptLoader +{ +public: + spell_seismic_shard_prepare() : SpellScriptLoader("spell_seismic_shard_prepare") { } + + class spell_seismic_shard_prepare_SpellScript : public SpellScript + { + PrepareSpellScript(spell_seismic_shard_prepare_SpellScript); + + void SetTarget(WorldObject*& target) + { + target = GetCaster()->FindNearestCreature(NPC_SEISMIC_SHARD, 50.0f); + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_seismic_shard_prepare_SpellScript::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_seismic_shard_prepare_SpellScript(); + } +}; + +// 86863 - Seismic Shard (moves shard to seat 0) +class spell_seismic_shard_change_seat : public SpellScriptLoader +{ +public: + spell_seismic_shard_change_seat() : SpellScriptLoader("spell_seismic_shard_change_seat") { } + + class spell_seismic_shard_change_seat_SpellScript : public SpellScript + { + PrepareSpellScript(spell_seismic_shard_change_seat_SpellScript); + + void SetTarget(WorldObject*& target) + { + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + target = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_HIGH_PRIESTESS_AZIL)); + } + + void ChangeSeat(SpellEffIndex /*effIndex*/) + { + GetCaster()->ExitVehicle(); + if (GetHitUnit()->IsVehicle()) + GetCaster()->EnterVehicle(GetHitUnit(), 0); + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_seismic_shard_change_seat_SpellScript::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_seismic_shard_change_seat_SpellScript::ChangeSeat, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_seismic_shard_change_seat_SpellScript(); + } +}; + +// 79015 - Seismic Shard (launches shard) +class spell_seismic_shard : public SpellScriptLoader +{ +public: + spell_seismic_shard() : SpellScriptLoader("spell_seismic_shard") { } + + class spell_seismic_shard_SpellScript : public SpellScript + { + PrepareSpellScript(spell_seismic_shard_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Creature* target = GetHitUnit()->ToCreature(); + if (!target) + return; + + target->ExitVehicle(); + DynamicObject* dynamicObject = GetCaster()->GetDynObject(SPELL_SEISMIC_SHARD_TARGETING); + target->CastSpell(dynamicObject->GetPositionX(), dynamicObject->GetPositionY(), dynamicObject->GetPositionZ(), SPELL_SEISMIC_SHARD_MISSLE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_seismic_shard_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_seismic_shard_SpellScript(); + } +}; + +void AddSC_boss_high_priestess_azil() +{ + new boss_high_priestess_azil(); + new npc_devout_follower(); + new npc_gravity_well(); + new npc_seismic_shard(); + new spell_summon_wave_south(); + new spell_summon_wave_west(); + new spell_gravity_well_damage_nearby(); + new spell_gravity_well_damage(); + new spell_gravity_well_pull(); + new spell_seismic_shard_prepare(); + new spell_seismic_shard_change_seat(); + new spell_seismic_shard(); +} diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp new file mode 100644 index 00000000000..92c9bba4bc1 --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp @@ -0,0 +1,287 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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 . + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "Vehicle.h" +#include "stonecore.h" + +enum Spells +{ + SPELL_ELEMENTIUM_BULWARK = 78939, + SPELL_GROUND_SLAM = 78903, + SPELL_ELEMENTIUM_SPIKE_SHIELD = 78835, + SPELL_SHATTER = 78807, + SPELL_ENRAGE = 80467, + + // Rupture Controller and Rupture + SPELL_RUPTURE = 92393, +// SPELL_RUPTURE_SUMMON_CENTER? = 95669, // summons rupture 8 yards front +// SPELL_RUPTURE_SUMMON_LEFT? = 95348, // summons rupture 3 yards left? +// SPELL_RUPTURE_SUMMON_RIGHT? = 92383, // summons rupture 3 yards right? + SPELL_RUPTURE_DAMAGE = 92381, +}; + +enum NPCs +{ + NPC_BOUNCER_SPIKE = 42189, + NPC_RUPTURE_CONTROLLER = 49597, + NPC_RUPTURE = 49576, +}; + +enum Texts +{ + SAY_AGGRO = 0, + SAY_ELEMENTIUM_BULWARK = 1, + SAY_ELEMENTIUM_SPIKE_SHIELD = 2, + SAY_ENRAGE = 3, + SAY_DEATH = 4, +}; + +enum Events +{ + EVENT_NONE, + + EVENT_ELEMENTIUM_BULWARK, + EVENT_GROUND_SLAM, + EVENT_ELEMENTIUM_SPIKE_SHIELD, + EVENT_SHATTER, + EVENT_ENRAGE, + + EVENT_START_ATTACK, +}; + +// TO-DO: +// - Find heroic sniffs and spawn Ruptures using spells commented above. +// - Make Bouncer Spikes enter ozruk without jump animation. + +class boss_ozruk : public CreatureScript +{ + public: + boss_ozruk() : CreatureScript("boss_ozruk") { } + + struct boss_ozrukAI : public BossAI + { + boss_ozrukAI(Creature* creature) : BossAI(creature, DATA_OZRUK) { } + + void Reset() override + { + _Reset(); + + me->SetReactState(REACT_AGGRESSIVE); + + events.ScheduleEvent(EVENT_ELEMENTIUM_BULWARK, 5000); + events.ScheduleEvent(EVENT_GROUND_SLAM, 10000); + events.ScheduleEvent(EVENT_ELEMENTIUM_SPIKE_SHIELD, 13000); + + RemoveBouncerSpikes(); + } + + void EnterCombat(Unit* /*victim*/) override + { + _EnterCombat(); + + Talk(SAY_AGGRO); + } + + void JustSummoned(Creature* summon) override + { + if (summon->GetEntry() != NPC_RUPTURE_CONTROLLER) + return; + + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_RUPTURE, true); + summon->DespawnOrUnsummon(10000); + } + + void DamageTaken(Unit* /*attacker*/, uint32 &damage) override + { + if (!me->HealthBelowPctDamaged(25, damage) || me->HasAura(SPELL_ENRAGE)) + return; + + DoCast(me, SPELL_ENRAGE); + me->Say(SAY_ENRAGE); + } + + void JustDied(Unit* killer) override + { + me->Say(SAY_DEATH, killer); // receiver is the killer, sniff source! + + RemoveBouncerSpikes(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasAura(SPELL_ELEMENTIUM_SPIKE_SHIELD)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ELEMENTIUM_BULWARK: + DoCast(me, SPELL_ELEMENTIUM_BULWARK); + Talk(SAY_ELEMENTIUM_BULWARK); + break; + case EVENT_GROUND_SLAM: + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + DoCast(me, SPELL_GROUND_SLAM); + events.ScheduleEvent(EVENT_START_ATTACK, 4600); + break; + case EVENT_ELEMENTIUM_SPIKE_SHIELD: + DoCast(me, SPELL_ELEMENTIUM_SPIKE_SHIELD); + Talk(SAY_ELEMENTIUM_SPIKE_SHIELD); + events.ScheduleEvent(EVENT_SHATTER, 10000); + break; + case EVENT_SHATTER: + RemoveBouncerSpikes(); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + DoCast(me, SPELL_SHATTER); + events.ScheduleEvent(EVENT_START_ATTACK, 4600); + // Spells are cast in same order everytime after Shatter, so we schedule them here + events.ScheduleEvent(EVENT_ELEMENTIUM_BULWARK, urand(3000,4000)); + events.ScheduleEvent(EVENT_GROUND_SLAM, urand(7000,9000)); + events.ScheduleEvent(EVENT_ELEMENTIUM_SPIKE_SHIELD, urand(10000,12000)); + break; + case EVENT_START_ATTACK: + me->SetReactState(REACT_AGGRESSIVE); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + void RemoveBouncerSpikes() + { + Vehicle* vehicle = me->GetVehicleKit(); + if (!vehicle) + return; + + for (uint8 i = 0; i < vehicle->GetAvailableSeatCount(); i++) + if (Unit* passenger = vehicle->GetPassenger(i)) + if (Creature* creature = passenger->ToCreature()) + creature->RemoveFromWorld(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 92393 - Rupture +class spell_rupture : public SpellScriptLoader +{ +public: + spell_rupture() : SpellScriptLoader("spell_rupture") { } + + class spell_rupture_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rupture_AuraScript); + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + Unit* caster = GetCaster(); + + float dist = aurEff->GetTickNumber() * 8.0f; + + // probably hack, should use spells (see Spells enum above) + Position pos = caster->GetNearPosition(dist, 0.0f); + SummonRupture(caster, pos); + + pos = caster->GetNearPosition(dist, 0.2f); + SummonRupture(caster, pos); + + pos = caster->GetNearPosition(dist, -0.2f); + SummonRupture(caster, pos); + } + + void SummonRupture(Unit* caster, Position pos) + { + Creature* rupture = caster->SummonCreature(NPC_RUPTURE, pos, TEMPSUMMON_TIMED_DESPAWN, 2500); + if (!rupture) + return; + + rupture->SetReactState(REACT_PASSIVE); + rupture->CastSpell(rupture, SPELL_RUPTURE_DAMAGE, true); + } + + void Register() + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_rupture_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_rupture_AuraScript(); + } +}; + +// 78835 - Elementium Spike Shield +class spell_elementium_spike_shield : public SpellScriptLoader +{ +public: + spell_elementium_spike_shield() : SpellScriptLoader("spell_elementium_spike_shield") { } + + class spell_elementium_spike_shield_SpellScript : public SpellScript + { + PrepareSpellScript(spell_elementium_spike_shield_SpellScript); + + void HandleBouncerSpikes() + { + Unit* caster = GetCaster(); + Vehicle* vehicle = caster->GetVehicleKit(); + if (!vehicle) + return; + + for (uint8 i = 0; i < vehicle->GetAvailableSeatCount(); i++) + if (Creature* summon = caster->SummonCreature(NPC_BOUNCER_SPIKE, caster->GetPosition(), TEMPSUMMON_TIMED_DESPAWN, 10000)) + summon->EnterVehicle(caster, i); + } + + void Register() override + { + OnCast += SpellCastFn(spell_elementium_spike_shield_SpellScript::HandleBouncerSpikes); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_elementium_spike_shield_SpellScript(); + } +}; + +void AddSC_boss_ozruk() +{ + new boss_ozruk(); + new spell_rupture(); + new spell_elementium_spike_shield(); +} diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp new file mode 100644 index 00000000000..6827312deef --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp @@ -0,0 +1,599 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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 . + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "stonecore.h" + +enum Spells +{ + SPELL_FACE_RANDOM_PLAYER = 82530, + + // Stalactite Trigger - Trash, On Ground + SPELL_STALACTITE_SUMMON_TRIGGER = 81028, + + // Slabhide + SPELL_LAVA_FISSURE = 80803, + SPELL_SAND_BLAST = 80807, + SPELL_STALACTITE_SUMMON = 80656, +// SPELL_COOLDOWN_5S = 95323, Cooldown: Creature Special 1 (5s)? + SPELL_CRYSTAL_STORM = 92305, + SPELL_CRYSTAL_STORM_TRIGGER = 92265, + + // Lava Fissure + SPELL_LAVA_FISSURE_CRACK = 80798, + SPELL_LAVA_FISSURE_ERUPTION = 80800, + + // Stalactite Trigger - Boss + SPELL_STALACTITE_SHADE = 80654, + SPELL_STALACTITE_MISSLE = 80643, + SPELL_STALACTITE_CREATE = 80647, +}; + +enum Entries +{ + NPC_LAVA_FISSURE = 43242, + NPC_STALACTITE_TRIGGER_GROUND = 43357, + NPC_STALACTITE_TRIGGER = 43159, + GO_STALACTITE = 204337, +}; + +enum Actions +{ + ACTION_STALACTITE_MISSLE, +}; + +enum Events +{ + EVENT_NONE, + + // Intro events + EVENT_ROAR_EMOTE, + + // Slabhide combat + EVENT_HANDLE_ROCK_WALLS, + EVENT_LAVA_FISSURE, + EVENT_SAND_BLAST, + EVENT_AIR_PHASE, + EVENT_TAKEOFF, + EVENT_STALACTITE, + EVENT_LAND, + EVENT_ATTACK, + + // Lava Fissure + EVENT_LAVA_FISSURE_ERUPTION, + + // Stalactite Trigger - Boss + EVENT_STALACTITE_MISSLE, +}; + +enum MovementPoints +{ + POINT_NONE, + + POINT_SLABHIDE_INTRO, + POINT_SLABHIDE_INTRO_LAND, + + POINT_SLABHIDE_MIDDLE, + POINT_SLABHIDE_IN_AIR, + POINT_SLABHIDE_LAND, +}; + +Position const SlabhideIntroPos = { 1292.27f, 1226.16f, 265.573f }; +Position const SlabhideIntroLandPos = { 1292.352f, 1226.478f, 247.6368f, 3.630285f }; + +Position const SlabhideMiddlePos = { 1280.73f, 1212.31f, 247.3837f }; +Position const SlabhideInAirPos = { 1280.73f, 1212.31f, 257.3837f }; +Position const SlabhideLandPos = { 1282.7f, 1229.77f, 247.155f, 3.82227f }; + +class boss_slabhide : public CreatureScript +{ + public: + boss_slabhide() : CreatureScript("boss_slabhide") { } + + struct boss_slabhideAI : public BossAI + { + boss_slabhideAI(Creature* creature) : BossAI(creature, DATA_SLABHIDE) + { + me->setActive(true); + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->SetReactState(REACT_PASSIVE); + instance->SetData(DATA_SLABHIDE_INTRO, NOT_STARTED); + } + + void Reset() + { + if (instance->GetData(DATA_SLABHIDE_INTRO) == NOT_STARTED) + return; + + _Reset(); + DespawnAll(); + + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->SetReactState(REACT_AGGRESSIVE); + } + + void EnterCombat(Unit* /*victim*/) override + { + _EnterCombat(); + + events.ScheduleEvent(EVENT_HANDLE_ROCK_WALLS, 4000); + events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000)); + events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 10000)); + events.ScheduleEvent(EVENT_AIR_PHASE, 10000); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + + // Despawn related npcs and gameobjects + DespawnAll(); + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_SLABHIDE_INTRO: + { + if (instance->GetData(DATA_SLABHIDE_INTRO) != NOT_STARTED) + return; + + instance->SetData(DATA_SLABHIDE_INTRO, IN_PROGRESS); + + // Execute Slabhide intro event + me->GetMotionMaster()->MovePoint(POINT_SLABHIDE_INTRO, SlabhideIntroPos); + break; + } + default: + break; + } + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) + return; + + switch (id) + { + case POINT_SLABHIDE_INTRO: + me->SetFacingTo(SlabhideIntroLandPos.GetOrientation()); + me->GetMotionMaster()->MoveLand(POINT_SLABHIDE_INTRO_LAND, SlabhideIntroLandPos); + break; + case POINT_SLABHIDE_INTRO_LAND: + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->SetHover(false); + me->SetHomePosition(SlabhideIntroLandPos); + me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + instance->SetData(DATA_SLABHIDE_INTRO, DONE); + break; + case POINT_SLABHIDE_MIDDLE: + events.ScheduleEvent(EVENT_TAKEOFF, 100); + break; + case POINT_SLABHIDE_IN_AIR: + events.ScheduleEvent(EVENT_STALACTITE, 400); + break; + case POINT_SLABHIDE_LAND: + //DoCast(SPELL_COOLDOWN_5S); // unknown purpose + events.ScheduleEvent(EVENT_ATTACK, 1200); + break; + default: + break; + } + } + + 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_HANDLE_ROCK_WALLS: // Close rock walls + instance->SetData(DATA_SLABHIDE_ROCK_WALL, false); + break; + case EVENT_LAVA_FISSURE: + DoCast(SPELL_LAVA_FISSURE); + events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000)); + break; + case EVENT_SAND_BLAST: + DoCast(SPELL_SAND_BLAST); + events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 11000)); + break; + case EVENT_AIR_PHASE: + events.Reset(); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->GetMotionMaster()->MovePoint(POINT_SLABHIDE_MIDDLE, SlabhideMiddlePos); + events.ScheduleEvent(EVENT_AIR_PHASE, 60000); + break; + case EVENT_TAKEOFF: + me->GetMotionMaster()->MoveTakeoff(POINT_SLABHIDE_IN_AIR, SlabhideInAirPos); + break; + case EVENT_STALACTITE: + me->SetCanFly(true); + me->SetDisableGravity(true); + me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->SetHover(true); + + DoCast(SPELL_STALACTITE_SUMMON); + + events.ScheduleEvent(EVENT_LAND, 8000); + break; + case EVENT_LAND: + { + Position pos = me->GetPosition(); + pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); + me->GetMotionMaster()->MoveLand(POINT_SLABHIDE_LAND, pos); + break; + } + case EVENT_ATTACK: + me->SetCanFly(false); + me->SetDisableGravity(false); + me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); + me->SetHover(false); + + events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000)); + events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 10000)); + DoCast(SPELL_CRYSTAL_STORM); + me->SetReactState(REACT_AGGRESSIVE); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + void DespawnAll() + { + // Despawn stalactite triggers npcs + std::list listStalactiteTrigger; + me->GetCreatureListWithEntryInGrid(listStalactiteTrigger, NPC_STALACTITE_TRIGGER, 200.0f); + if (!listStalactiteTrigger.empty()) + for (std::list::const_iterator itr = listStalactiteTrigger.begin(); itr != listStalactiteTrigger.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + + // Despawn stalactite objects + std::list listStalactite; + me->GetGameObjectListWithEntryInGrid(listStalactite, GO_STALACTITE, 200.0f); + if (!listStalactite.empty()) + for (std::list::const_iterator itr = listStalactite.begin(); itr != listStalactite.end(); ++itr) + (*itr)->Delete(); + } + + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 43242 - Lava Fissure +class npc_lava_fissure : public CreatureScript +{ +public: + npc_lava_fissure() : CreatureScript("npc_lava_fissure") { } + + struct npc_lava_fissureAI : public ScriptedAI + { + npc_lava_fissureAI(Creature* creature) : ScriptedAI(creature) + { + me->SetReactState(REACT_PASSIVE); + me->CastSpell(me, SPELL_LAVA_FISSURE_CRACK, true); + events.ScheduleEvent(EVENT_LAVA_FISSURE_ERUPTION, 6000); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_LAVA_FISSURE_ERUPTION: + me->RemoveAurasDueToSpell(SPELL_LAVA_FISSURE_CRACK); + me->CastSpell(me, SPELL_LAVA_FISSURE_ERUPTION, true); + me->DespawnOrUnsummon(14000); + break; + default: + break; + } + } + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 43159 - Stalactite Trigger - Boss +class npc_stalactite_trigger : public CreatureScript +{ +public: + npc_stalactite_trigger() : CreatureScript("npc_stalactite_trigger") { } + + struct npc_stalactite_triggerAI : public ScriptedAI + { + npc_stalactite_triggerAI(Creature* creature) : ScriptedAI(creature) + { + me->SetReactState(REACT_PASSIVE); + me->SetDisableGravity(true); + me->CastSpell(me, SPELL_STALACTITE_SHADE, true); + events.ScheduleEvent(EVENT_STALACTITE_MISSLE, 5600); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_STALACTITE_MISSLE: + DoCast(SPELL_STALACTITE_MISSLE); + me->DespawnOrUnsummon(11000); + break; + default: + break; + } + } + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 81035 - Stalactite (check if player is near to summon stalactite) +class NotPlayerCheck +{ + public: + bool operator()(WorldObject* object) const + { + return (object->GetTypeId() != TYPEID_PLAYER); + } +}; + +class spell_s81035_stalactite : public SpellScriptLoader +{ +public: + spell_s81035_stalactite() : SpellScriptLoader("spell_s81035_stalactite") { } + + class spell_s81035_stalactite_SpellScript : public SpellScript + { + PrepareSpellScript(spell_s81035_stalactite_SpellScript); + + void FilterTargets(std::list& targets) + { + targets.remove_if(NotPlayerCheck()); + } + + void SummonStalactiteTrigger() + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_STALACTITE_SUMMON_TRIGGER, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_s81035_stalactite_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnHit += SpellHitFn(spell_s81035_stalactite_SpellScript::SummonStalactiteTrigger); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_s81035_stalactite_SpellScript(); + } +}; + +// 81028 - Stalactite (summons "Stalactite Trigger - Boss", 20 yard radius) +// 80650 - Stalactite (summons "Stalactite Trigger - Boss", 40 yard radius) +class spell_s81028_s80650_stalactite : public SpellScriptLoader +{ +public: + spell_s81028_s80650_stalactite() : SpellScriptLoader("spell_s81028_s80650_stalactite") { } + + class spell_s81028_s80650_stalactite_SpellScript : public SpellScript + { + PrepareSpellScript(spell_s81028_s80650_stalactite_SpellScript); + + void ModDestHeight(SpellDestination& dest) + { + // All stalactite triggers should have Z position 301.3837f, but no way to relocate (not relocateoffset!) height only. + Position offset = { 0.0f, 0.0f, 50.0f, 0.0f }; + dest.RelocateOffset(offset); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_s81028_s80650_stalactite_SpellScript::ModDestHeight, EFFECT_0, TARGET_DEST_CASTER_RANDOM); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_s81028_s80650_stalactite_SpellScript(); + } +}; + +// 80654 - Stalactite (creates visual shade on ground) +// 80643/92653 - Stalactite (launches missle to the ground) +// 80647/92309 - Stalactite (creates stalactite object) +class spell_stalactite_mod_dest_height : public SpellScriptLoader +{ +public: + spell_stalactite_mod_dest_height() : SpellScriptLoader("spell_stalactite_mod_dest_height") { } + + class spell_stalactite_mod_dest_height_SpellScript : public SpellScript + { + PrepareSpellScript(spell_stalactite_mod_dest_height_SpellScript); + + void ModDestHeight(SpellDestination& dest) + { + Unit* caster = GetCaster(); + Position pos = caster->GetPosition(); + pos.m_positionZ = caster->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, 100.0f); + dest.Relocate(pos); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_stalactite_mod_dest_height_SpellScript::ModDestHeight, EFFECT_0, TARGET_DEST_CASTER); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_stalactite_mod_dest_height_SpellScript(); + } +}; + +// 92306 - Crystal storm (heroic mode check) +class spell_s92306_crystal_storm : public SpellScriptLoader +{ +public: + spell_s92306_crystal_storm() : SpellScriptLoader("spell_s92306_crystal_storm") { } + + class spell_s92306_crystal_storm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_s92306_crystal_storm_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_CRYSTAL_STORM_TRIGGER)) + return false; + return true; + } + + void HandleDummyEffect(SpellEffIndex /*eff*/) + { + Unit* caster = GetCaster(); + if (caster->GetMap()->IsHeroic()) + caster->CastSpell(caster, SPELL_CRYSTAL_STORM_TRIGGER, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_s92306_crystal_storm_SpellScript::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_s92306_crystal_storm_SpellScript(); + } +}; + +// 92300 - Crystal Storm (damage) +class BehindObjectCheck +{ + public: + BehindObjectCheck(Unit* caster, std::list objectList) : caster(caster), objectList(objectList) { } + + bool operator()(WorldObject* unit) + { + for (std::list::const_iterator itr = objectList.begin(); itr != objectList.end(); ++itr) + if (!(*itr)->IsInvisibleDueToDespawn() && (*itr)->IsInBetween(caster, unit, 1.5f)) + return true; + return false; + } + + private: + Unit* caster; + std::list objectList; +}; + +class spell_s92300_crystal_storm : public SpellScriptLoader +{ +public: + spell_s92300_crystal_storm() : SpellScriptLoader("spell_s92300_crystal_storm") { } + + class spell_s92300_crystal_storm_SpellScript : public SpellScript + { + PrepareSpellScript(spell_s92300_crystal_storm_SpellScript); + + void FilterTargets(std::list& unitList) + { + Unit* caster = GetCaster(); + + std::list goList; + caster->GetGameObjectListWithEntryInGrid(goList, GO_STALACTITE, 40.0f); + if (goList.empty()) + return; + + unitList.remove_if(BehindObjectCheck(caster, goList)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_s92300_crystal_storm_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_s92300_crystal_storm_SpellScript(); + } +}; + +void AddSC_boss_slabhide() +{ + new boss_slabhide(); + new npc_lava_fissure(); + new npc_stalactite_trigger(); + new spell_s81035_stalactite(); + new spell_s81028_s80650_stalactite(); + new spell_stalactite_mod_dest_height(); + new spell_s92306_crystal_storm(); + new spell_s92300_crystal_storm(); +} diff --git a/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp new file mode 100644 index 00000000000..8cb4df0622f --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp @@ -0,0 +1,262 @@ +/* +* Copyright (C) 2008-2014 TrinityCore +* Copyright (C) 2006-2009 ScriptDev2 +* +* 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 . +*/ + +#include "ScriptMgr.h" +#include "Player.h" +#include "CreatureGroups.h" +#include "InstanceScript.h" +#include "stonecore.h" + +#define MAX_ENCOUNTER 4 + +/* Stonecore encounters: +0 - Corborus +1 - Slabhide +2 - Ozruk +3 - High Priestess Azil +*/ + +// TO-DO: +// - Find out spell IDs for both Stonecore Teleporters (spellclick). + +class instance_stonecore : public InstanceMapScript +{ + public: + instance_stonecore() : InstanceMapScript(SCScriptName, 725) { } + + struct instance_stonecore_InstanceScript : public InstanceScript + { + instance_stonecore_InstanceScript(Map* map) : InstanceScript(map) + { + SetHeaders(DataHeader); + SetBossNumber(MAX_ENCOUNTER); + } + + void OnGameObjectCreate(GameObject* go) override + { + switch (go->GetEntry()) + { + case GAMEOBJECT_CORBORUS_ROCKDOOR: + corborusRockDoorGUID = go->GetGUID(); + go->SetGoState(GetBossState(DATA_CORBORUS) != DONE ? GO_STATE_READY : GO_STATE_ACTIVE); + break; + case GAMEOBJECT_SLABHIDE_ROCK_WALL: + slabhideRockWallGUIDs.push_back(go->GetGUID()); + break; + default: + break; + } + } + + void OnCreatureCreate(Creature* creature) override + { + switch (creature->GetEntry()) + { + case NPC_MILLHOUSE_MANASTORM: + millhouseGUID = creature->GetGUID(); + break; + case NPC_CORBORUS: + corobrusGUID = creature->GetGUID(); + break; + case NPC_SLABHIDE: + slabhideGUID = creature->GetGUID(); + break; + case NPC_HIGH_PRIESTESS_AZIL: + highPriestessAzilGUID = creature->GetGUID(); + break; + case NPC_STONECORE_TELEPORTER: + case NPC_STONECORE_TELEPORTER_2: + if (GetBossState(DATA_SLABHIDE) != DONE) + stonecoreTeleporterGUID[creature->GetEntry() - NPC_STONECORE_TELEPORTER] = creature->GetGUID(); + else // If Slabhide is already dead, no need to store teleporter guids + { + creature->CastSpell(creature, SPELL_TELEPORTER_ACTIVE_VISUAL, true); + creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + } + break; + default: + break; + } + + // Check if creature is part of Millhouse event + creature->SearchFormation(); + if (CreatureGroup* group = creature->GetFormation()) // TO-DO: Fix formations + { + switch (group->GetId()) + { + case CREATURE_FORMATION_MILLHOUSE_EVENT_TRASH: + millhouseTrashGUIDs.push_back(creature->GetGUID()); + break; + case CREATURE_FORMATION_MILLHOUSE_EVENT_LAST_GROUP: + millhouseLastGroupGUIDs.push_back(creature->GetGUID()); + creature->SetReactState(REACT_PASSIVE); + creature->SetMeleeAnimKitId(ANIM_READY2H); + break; + } + } + } + + bool SetBossState(uint32 type, EncounterState state) override + { + switch (type) + { + case DATA_SLABHIDE: + // Open rock walls (Slabhide AI handles closing because it must be delayed) + if (state != IN_PROGRESS) + SetData(DATA_SLABHIDE_ROCK_WALL, true); + + // Activate teleporters + if (state == DONE) + { + for (int8 i = 0; i < MAX_STONECORE_TELEPORTERS; i++) + { + if (Creature* teleporter = GetCreature(stonecoreTeleporterGUID[i])) + { + teleporter->CastSpell(teleporter, SPELL_TELEPORTER_ACTIVE_VISUAL, true); + teleporter->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + } + } + } + + break; + default: + break; + } + + return InstanceScript::SetBossState(type, state); + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_SLABHIDE_INTRO: + return slabhideIntro; + default: + break; + } + + return 0; + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { + case DATA_MILLHOUSE_EVENT_FACE: + MillhouseEvent_Face(); + break; + case DATA_MILLHOUSE_EVENT_KNOCKBACK: + MillhouseEvent_Knockback(); + break; + case DATA_MILLHOUSE_EVENT_DESPAWN: + MillhouseEvent_Despawn(); + break; + case DATA_SLABHIDE_INTRO: + slabhideIntro = EncounterState(data); + break; + case DATA_SLABHIDE_ROCK_WALL: // Handles rock walls + for (std::vector::iterator itr = slabhideRockWallGUIDs.begin(); itr != slabhideRockWallGUIDs.end(); ++itr) + HandleGameObject((*itr), data ? true : false); + break; + default: + break; + } + } + + ObjectGuid GetGuidData(uint32 type) const override + { + switch (type) + { + case DATA_MILLHOUSE_MANASTORM: + return millhouseGUID; + case GAMEOBJECT_CORBORUS_ROCKDOOR: + return corborusRockDoorGUID; + case DATA_CORBORUS: + return corobrusGUID; + case DATA_SLABHIDE: + return slabhideGUID; + case DATA_HIGH_PRIESTESS_AZIL: + return highPriestessAzilGUID; + case NPC_STONECORE_TELEPORTER: + case NPC_STONECORE_TELEPORTER_2: + return stonecoreTeleporterGUID[type - NPC_STONECORE_TELEPORTER]; + default: + break; + } + + return ObjectGuid::Empty; + } + + private: + // Face Millhouse and other nearby mobs to Corborus + void MillhouseEvent_Face() + { + if (Creature* Millhouse = instance->GetCreature(millhouseGUID)) + Millhouse->SetFacingTo(1.570796f); + for (GuidVector::const_iterator i = millhouseLastGroupGUIDs.begin(); i != millhouseLastGroupGUIDs.end(); ++i) + if (Creature* creature = instance->GetCreature(*i)) + creature->SetFacingTo(1.570796f); + } + + // Knock back Millhouse and other mobs + void MillhouseEvent_Knockback() + { + if (Creature* Millhouse = instance->GetCreature(millhouseGUID)) + Millhouse->CastSpell(Millhouse, SPELL_RING_WYRM_KNOCKBACK, true); + for (GuidVector::const_iterator itr = millhouseLastGroupGUIDs.begin(); itr != millhouseLastGroupGUIDs.end(); ++itr) + if (Creature* creature = instance->GetCreature(*itr)) + creature->CastSpell(creature, SPELL_RING_WYRM_KNOCKBACK, true); + } + + // Despawn all mobs + void MillhouseEvent_Despawn() + { + if (Creature* Millhouse = instance->GetCreature(millhouseGUID)) + Millhouse->DespawnOrUnsummon(3000); + for (GuidVector::const_iterator itr = millhouseTrashGUIDs.begin(); itr != millhouseTrashGUIDs.end(); ++itr) + if (Creature* creature = instance->GetCreature(*itr)) + creature->DespawnOrUnsummon(3000); + for (GuidVector::const_iterator itr = millhouseLastGroupGUIDs.begin(); itr != millhouseLastGroupGUIDs.end(); ++itr) + if (Creature* creature = instance->GetCreature(*itr)) + creature->DespawnOrUnsummon(3000); + } + + ObjectGuid millhouseGUID; + GuidVector millhouseTrashGUIDs; + GuidVector millhouseLastGroupGUIDs; + ObjectGuid corborusRockDoorGUID; + ObjectGuid corobrusGUID; + ObjectGuid slabhideGUID; + ObjectGuid highPriestessAzilGUID; + ObjectGuid stonecoreTeleporterGUID[2]; + GuidVector slabhideRockWallGUIDs; + + EncounterState slabhideIntro; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_stonecore_InstanceScript(map); + } +}; + +void AddSC_instance_stonecore() +{ + new instance_stonecore(); +} diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp new file mode 100644 index 00000000000..2612cd02385 --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp @@ -0,0 +1,440 @@ +/* + * Copyright (C) 2008-2014 TrinityCore + * + * 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 . + */ + +#include "ObjectGuid.h" +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "stonecore.h" + +enum Texts +{ + // Millhouse Manastorm + SAY_MILLHOUSE_EVENT_1 = 0, + SAY_MILLHOUSE_EVENT_2 = 1, +}; + +enum NPCs +{ + NPC_GENERIC_TRIGGER_LAB = 40350, +}; + +enum Spells +{ + // Millhouse Manastorm + SPELL_SHADOW_BOLT = 81439, + SPELL_FROSTBOLT_VOLLEY = 81440, + SPELL_SHADOWFURY = 81441, + SPELL_FEAR = 81442, +// SPELL_MILLHOUSE_SAFE_CHECK = 81213, // unknown purpose + SPELL_CLEAR_ALL_DEBUFFS = 34098, + SPELL_BLUR = 81216, + SPELL_ANCHOR_HERE = 45313, + SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND = 81220, + SPELL_IMPENDING_DOOM = 86838, + SPELL_IMPENDING_DOOM_CHANNEL = 86830, + +// SPELL_PORTAL_VISUAL = 79754, +}; + +enum Events +{ + EVENT_NONE, + + // Millhouse Manastorm + EVENT_FROSTBOLT_VOLLEY, + EVENT_SHADOWFURY, + EVENT_FEAR, + + EVENT_READY_FOR_COMBAT, + EVENT_CAST_IMPENDING_DOOM, + EVENT_INTERRUPT_IMPENDING_DOOM, +}; + +enum Phase +{ + PHASE_NONE, + + PHASE_MILLHOUSE_GROUP_1, + PHASE_MILLHOUSE_GROUP_2, + PHASE_MILLHOUSE_GROUP_3, + PHASE_MILLHOUSE_GROUP_4, + + PHASE_MASK_MILLHOUSE_GROUP_1 = (1 << (PHASE_MILLHOUSE_GROUP_1 - 1)), + PHASE_MASK_MILLHOUSE_GROUP_2 = (1 << (PHASE_MILLHOUSE_GROUP_2 - 1)), + PHASE_MASK_MILLHOUSE_GROUP_3 = (1 << (PHASE_MILLHOUSE_GROUP_3 - 1)), + PHASE_MASK_MILLHOUSE_GROUP_4 = (1 << (PHASE_MILLHOUSE_GROUP_4 - 1)), +}; + +enum MovementPoints +{ + POINT_NONE, + + POINT_MILLHOUSE_GROUP_2, + POINT_MILLHOUSE_GROUP_3, + POINT_MILLHOUSE_GROUP_4, +}; + +// Millhouse trash groups +Position const MillhousePointGroup2 = { 977.3045f, 895.2347f, 306.3298f }; +Position const MillhousePointGroup3 = { 1049.823f, 871.4349f, 295.006f }; +Position const MillhousePointGroup4 = { 1149.04f, 884.431f, 284.9406f }; + +// 43391 - Millhouse Manastorm +class npc_sc_millhouse_manastorm : public CreatureScript +{ + public: + npc_sc_millhouse_manastorm() : CreatureScript("npc_sc_millhouse_manastorm") { } + + struct npc_sc_millhouse_manastormAI : public ScriptedAI + { + npc_sc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()) + { + events.SetPhase(PHASE_MILLHOUSE_GROUP_1); + } + + void ScheduleEvents() + { + events.ScheduleEvent(EVENT_SHADOWFURY, 3000); + events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 5000); + events.ScheduleEvent(EVENT_FEAR, 8000); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + + if (!HealthBelowPct(50) || me->HasAura(SPELL_BLUR)) + return; + + switch (events.GetPhaseMask()) + { + case PHASE_MASK_MILLHOUSE_GROUP_1: + events.Reset(); + events.SetPhase(PHASE_MILLHOUSE_GROUP_2); + me->SetReactState(REACT_PASSIVE); + me->InterruptNonMeleeSpells(true); + DoCast(me, SPELL_CLEAR_ALL_DEBUFFS); + DoCast(me, SPELL_BLUR); + Talk(SAY_MILLHOUSE_EVENT_1); + me->GetMotionMaster()->MovePoint(POINT_MILLHOUSE_GROUP_2, MillhousePointGroup2); + break; + case PHASE_MASK_MILLHOUSE_GROUP_2: + events.Reset(); + events.SetPhase(PHASE_MILLHOUSE_GROUP_3); + me->SetReactState(REACT_PASSIVE); + me->InterruptNonMeleeSpells(true); + DoCast(me, SPELL_CLEAR_ALL_DEBUFFS); + DoCast(me, SPELL_BLUR); + Talk(SAY_MILLHOUSE_EVENT_1); + me->GetMotionMaster()->MovePoint(POINT_MILLHOUSE_GROUP_3, MillhousePointGroup3); + break; + case PHASE_MASK_MILLHOUSE_GROUP_3: + events.Reset(); + events.SetPhase(PHASE_MILLHOUSE_GROUP_4); + me->SetReactState(REACT_PASSIVE); + me->InterruptNonMeleeSpells(true); + DoCast(me, SPELL_CLEAR_ALL_DEBUFFS); + DoCast(me, SPELL_BLUR); + me->GetMotionMaster()->MovePoint(POINT_MILLHOUSE_GROUP_4, MillhousePointGroup4); + break; + default: + break; + } + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type != POINT_MOTION_TYPE) + return; + + if (pointId < POINT_MILLHOUSE_GROUP_2 || pointId > POINT_MILLHOUSE_GROUP_4) + return; + + me->RemoveAllAuras(); + me->CombatStop(true); + me->DeleteThreatList(); + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); + me->SetReactState(REACT_AGGRESSIVE); + + switch (pointId) + { + case POINT_MILLHOUSE_GROUP_2: + if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f)) + me->SetFacingToObject(worldtrigger); // o: 5.497359f (sniff data) + me->CastSpell(me, SPELL_ANCHOR_HERE, true); + me->AddAura(SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, me); + events.ScheduleEvent(EVENT_READY_FOR_COMBAT, 10000); + break; + case POINT_MILLHOUSE_GROUP_3: + me->SetFacingTo(5.931499f); + me->CastSpell(me, SPELL_ANCHOR_HERE, true); + me->AddAura(SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, me); + events.ScheduleEvent(EVENT_READY_FOR_COMBAT, 10000); + break; + case POINT_MILLHOUSE_GROUP_4: + me->SetFacingTo(3.455752f); + me->CastSpell(me, SPELL_ANCHOR_HERE, true); + Talk(SAY_MILLHOUSE_EVENT_2); + events.ScheduleEvent(EVENT_CAST_IMPENDING_DOOM, 1000); + break; + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + // Only update events if Millhouse is aggressive + if (me->GetReactState() != REACT_AGGRESSIVE) + return; + + events.Update(diff); + + // Impending Doom is exception because it needs to be interrupted. + if (me->HasUnitState(UNIT_STATE_CASTING) && !me->GetCurrentSpell(SPELL_IMPENDING_DOOM)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FROSTBOLT_VOLLEY: + DoCast(SPELL_FROSTBOLT_VOLLEY); + events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 7000); + break; + case EVENT_SHADOWFURY: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_SHADOWFURY); + events.ScheduleEvent(EVENT_SHADOWFURY, 7000); + break; + case EVENT_FEAR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_FEAR); + events.ScheduleEvent(EVENT_FEAR, 18000); + break; + case EVENT_READY_FOR_COMBAT: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); + me->SetReactState(REACT_AGGRESSIVE); + ScheduleEvents(); + break; + case EVENT_CAST_IMPENDING_DOOM: + DoCast(SPELL_IMPENDING_DOOM); + DoCast(SPELL_IMPENDING_DOOM_CHANNEL); + events.ScheduleEvent(EVENT_INTERRUPT_IMPENDING_DOOM, urand(15000,20000)); + break; + case EVENT_INTERRUPT_IMPENDING_DOOM: + me->InterruptNonMeleeSpells(true); + me->RemoveAllAuras(); + me->HandleEmoteCommand(EMOTE_ONESHOT_KNOCKDOWN); + events.ScheduleEvent(EVENT_CAST_IMPENDING_DOOM, 3000); + break; + default: + break; + } + } + + DoSpellAttackIfReady(SPELL_SHADOW_BOLT); + } + + private: + InstanceScript* _instance; + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI(creature); + } +}; + +// 81459 - Force of Earth +class spell_force_of_earth : public SpellScriptLoader +{ + public: + spell_force_of_earth() : SpellScriptLoader("spell_force_of_earth") { } + + class spell_force_of_earth_SpellScript : public SpellScript + { + PrepareSpellScript(spell_force_of_earth_SpellScript); + + void DummyEffect(SpellEffIndex /*effIndex*/) + { + GetCaster()->SetDisplayId(26693); // can be moved to SAI part, need sniffs to see what this dummy does (note: npc 43552) + } + + void Register() + { + OnEffectLaunch += SpellEffectFn(spell_force_of_earth_SpellScript::DummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_force_of_earth_SpellScript(); + } +}; + +// 45313 - Anchor Here +class spell_sc_anchor_here : public SpellScriptLoader +{ +public: + spell_sc_anchor_here() : SpellScriptLoader("spell_sc_anchor_here") { } + + class spell_sc_anchor_here_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sc_anchor_here_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Creature* creature = GetHitUnit()->ToCreature()) + creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation()); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_sc_anchor_here_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_sc_anchor_here_SpellScript(); + } +}; + +// 93167 - Twilight Documents +class spell_sc_twilight_documents : public SpellScriptLoader +{ + public: + spell_sc_twilight_documents() : SpellScriptLoader("spell_sc_twilight_documents") { } + + class spell_sc_twilight_documents_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sc_twilight_documents_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sObjectMgr->GetGameObjectTemplate(GAMEOBJECT_TWILIGHT_DOCUMENTS)) + return false; + return true; + } + + void SetTarget(WorldObject*& target) + { + target = GetCaster()->FindNearestCreature(NPC_GENERIC_TRIGGER_LAB, 100.0f); + } + + void SpawnGameObject(SpellEffIndex /*effIndex*/) + { + if (WorldLocation* loc = GetHitDest()) + GetCaster()->SummonGameObject(GAMEOBJECT_TWILIGHT_DOCUMENTS, loc->GetPositionX(), loc->GetPositionY(), loc->GetPositionZ(), loc->GetOrientation(), 0, 0, 0, 0, 7200); + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_sc_twilight_documents_SpellScript::SetTarget, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); + OnEffectHit += SpellEffectFn(spell_sc_twilight_documents_SpellScript::SpawnGameObject, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_sc_twilight_documents_SpellScript(); + } +}; + +// 81008 - Quake +class JumpCheck +{ + public: + bool operator()(WorldObject* object) const + { + Player* player = object->ToPlayer(); + return (player && player->HasUnitState(UNIT_STATE_JUMPING)); + } +}; + +class spell_sc_quake : public SpellScriptLoader +{ + public: + spell_sc_quake() : SpellScriptLoader("spell_sc_quake") { } + + class spell_sc_quake_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sc_quake_SpellScript); + + void FilterTargets(std::list& unitList) + { + unitList.remove_if(JumpCheck()); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sc_quake_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_sc_quake_SpellScript(); + } +}; + +class at_sc_corborus_intro : public AreaTriggerScript +{ +public: + at_sc_corborus_intro() : AreaTriggerScript("at_sc_corborus_intro") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* corborus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_CORBORUS))) + corborus->AI()->DoAction(ACTION_CORBORUS_INTRO); + return true; + } +}; + +class at_sc_slabhide_intro : public AreaTriggerScript +{ +public: + at_sc_slabhide_intro() : AreaTriggerScript("at_sc_slabhide_intro") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* slabhide = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SLABHIDE))) + slabhide->AI()->DoAction(ACTION_SLABHIDE_INTRO); + return true; + } +}; + +void AddSC_stonecore() +{ + new npc_sc_millhouse_manastorm(); + new spell_force_of_earth(); + new spell_sc_anchor_here(); + new spell_sc_twilight_documents(); + new spell_sc_quake(); + new at_sc_corborus_intro(); + new at_sc_slabhide_intro(); +} diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.h b/src/server/scripts/Maelstrom/Stonecore/stonecore.h new file mode 100644 index 00000000000..98a9878e0d3 --- /dev/null +++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.h @@ -0,0 +1,72 @@ +/* +* Copyright (C) 2008-2014 TrinityCore +* +* 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 . +*/ + +#ifndef DEF_STONECORE_H +#define DEF_STONECORE_H + +#define SCScriptName "instance_stonecore" +#define DataHeader "SC" + +enum DataTypes +{ + // Encounter States/Boss GUIDs + DATA_CORBORUS, + DATA_SLABHIDE, + DATA_OZRUK, + DATA_HIGH_PRIESTESS_AZIL, + + // Additional Data + DATA_MILLHOUSE_MANASTORM, + DATA_MILLHOUSE_EVENT_FACE, + DATA_MILLHOUSE_EVENT_KNOCKBACK, + DATA_MILLHOUSE_EVENT_DESPAWN, + + DATA_SLABHIDE_INTRO, + DATA_SLABHIDE_ROCK_WALL, +}; + +enum Misc +{ + ACTION_CORBORUS_INTRO, + ACTION_SLABHIDE_INTRO, + + NPC_WORLDTRIGGER = 22515, + NPC_MILLHOUSE_MANASTORM = 43391, + + NPC_CORBORUS = 43438, + NPC_SLABHIDE = 43214, + NPC_OZRUK = 42188, + NPC_HIGH_PRIESTESS_AZIL = 42333, + + // Stonecore Teleporter misc + MAX_STONECORE_TELEPORTERS = 2, + NPC_STONECORE_TELEPORTER = 51396, // Entrance teleporter + NPC_STONECORE_TELEPORTER_2 = 51397, // Slabhide teleporter + SPELL_TELEPORTER_ACTIVE_VISUAL = 95298, + + GAMEOBJECT_TWILIGHT_DOCUMENTS = 207415, + GAMEOBJECT_CORBORUS_ROCKDOOR = 207343, + GAMEOBJECT_SLABHIDE_ROCK_WALL = 204381, + + SPELL_RING_WYRM_KNOCKBACK = 81235, + + // Creature Formation IDs + CREATURE_FORMATION_MILLHOUSE_EVENT_TRASH = 340418, + CREATURE_FORMATION_MILLHOUSE_EVENT_LAST_GROUP = 340492, +}; + +#endif // DEF_STONECORE From a7c781a02df358a7a45655f33bb082dda95171a2 Mon Sep 17 00:00:00 2001 From: Nyeriah Date: Thu, 6 Nov 2014 22:13:13 -0200 Subject: [PATCH 14/22] Scripts/ToC: Simplify the code for "A Tribute to Immortality" achievement * also fixes the achievement being still awarded if players die indirectly during boss fights (Anub'arak adds, for example) (cherry picked from commit 9838cbda1a44ca6e45d114a0c2facc71cb481d38) --- .../TrialOfTheCrusader/boss_anubarak_trial.cpp | 8 +------- .../TrialOfTheCrusader/boss_faction_champions.cpp | 2 -- .../TrialOfTheCrusader/boss_lord_jaraxxus.cpp | 3 --- .../TrialOfTheCrusader/boss_northrend_beasts.cpp | 14 -------------- .../TrialOfTheCrusader/boss_twin_valkyr.cpp | 3 --- .../instance_trial_of_the_crusader.cpp | 10 +++++++--- .../TrialOfTheCrusader/trial_of_the_crusader.h | 5 ++--- 7 files changed, 10 insertions(+), 35 deletions(-) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 072dbd81fd8..69dc25892c1 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -205,10 +205,7 @@ class boss_anubarak_trial : public CreatureScript void KilledUnit(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER) - { Talk(SAY_KILL_PLAYER); - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); - } } void MoveInLineOfSight(Unit* /*who*/) override @@ -611,9 +608,7 @@ class npc_frost_sphere : public CreatureScript struct npc_frost_sphereAI : public ScriptedAI { - npc_frost_sphereAI(Creature* creature) : ScriptedAI(creature) - { - } + npc_frost_sphereAI(Creature* creature) : ScriptedAI(creature) { } void Reset() override { @@ -766,7 +761,6 @@ class npc_anubarak_spike : public CreatureScript } void MoveInLineOfSight(Unit* pWho) override - { if (!pWho) return; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 562e67f4b6a..2b541e4b972 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -647,8 +647,6 @@ struct boss_faction_championsAI : public BossAI if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_GARROSH))) temp->AI()->Talk(SAY_KILL_PLAYER); - - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index f26ccd6bf25..7e8653c4a55 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -122,10 +122,7 @@ class boss_jaraxxus : public CreatureScript void KilledUnit(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER) - { Talk(SAY_KILL_PLAYER); - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); - } } void JustDied(Unit* /*killer*/) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 021cae3e623..f7bee426012 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -540,12 +540,6 @@ struct boss_jormungarAI : public BossAI me->DespawnOrUnsummon(); } - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); - } - void EnterCombat(Unit* /*who*/) override { _EnterCombat(); @@ -943,14 +937,6 @@ class boss_icehowl : public CreatureScript me->DespawnOrUnsummon(); } - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - { - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); - } - } - void EnterCombat(Unit* /*who*/) override { _EnterCombat(); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 75649215db6..d0756df23f8 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -212,10 +212,7 @@ struct boss_twin_baseAI : public BossAI void KilledUnit(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER) - { Talk(SAY_KILL_PLAYER); - instance->SetData(DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE, 0); - } } void SummonedCreatureDespawn(Creature* summoned) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index e3ad891fdc7..cb7e58cfe16 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -190,6 +190,13 @@ class instance_trial_of_the_crusader : public InstanceMapScript } } + void OnUnitDeath(Unit* unit) override + { + if (unit->GetTypeId() == TYPEID_PLAYER && IsEncounterInProgress()) + TributeToImmortalityEligible = false; + + } + bool SetBossState(uint32 type, EncounterState state) override { if (!InstanceScript::SetBossState(type, state)) @@ -427,9 +434,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript else if (data == DECREASE) --MistressOfPainCount; break; - case DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE: - TributeToImmortalityEligible = false; - break; default: break; } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index e37148aa508..90b9781954f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -24,9 +24,8 @@ enum DataTypes TYPE_EVENT_NPC = 102, TYPE_NORTHREND_BEASTS = 103, - DATA_SNOBOLD_COUNT = 301, - DATA_MISTRESS_OF_PAIN_COUNT = 302, - DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE = 303, + DATA_SNOBOLD_COUNT = 301, + DATA_MISTRESS_OF_PAIN_COUNT = 302, INCREASE = 501, DECREASE = 502, From 34553afa955ea700832e9f3d72c81efb79ab9d09 Mon Sep 17 00:00:00 2001 From: Rat Date: Sun, 2 Nov 2014 16:49:45 +0100 Subject: [PATCH 15/22] Core/Zmq: Added 50ms wait in the Run() loop to get rid of excessive cpu usage (cherry picked from commit cbb6ca03399b6288ddda3d37bb42558af8103649) --- src/server/ipc/ZmqMux.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/ipc/ZmqMux.cpp b/src/server/ipc/ZmqMux.cpp index 4b5a4f48b05..2b62eaaf1eb 100644 --- a/src/server/ipc/ZmqMux.cpp +++ b/src/server/ipc/ZmqMux.cpp @@ -56,6 +56,7 @@ void ZmqMux::Run() { for (;;) { + std::this_thread::sleep_for(std::chrono::milliseconds(50)); if (!_poller->poll()) break; From 75f0c7967c2254d013fa5f76f9221855d3f2cc04 Mon Sep 17 00:00:00 2001 From: Gooyeth Date: Mon, 10 Nov 2014 08:30:20 -0600 Subject: [PATCH 16/22] Fix Battleground List window. Hide window after level 10, show only in level 10 --- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index e2c1c931b18..728aeb44847 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -901,7 +901,7 @@ void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid data->WriteBit(guid[3]); data->WriteBit(0); // unk data->WriteBit(guid[5]); - data->WriteBit(0); // unk + data->WriteBit(player->getLevel() != 10 ? 1 : 0); // hide battleground list window, show only in level 10 data->FlushBits(); From 5c2768bf7beedbe2a758f376051863dbbad60624 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Wed, 10 Dec 2014 12:01:54 +0100 Subject: [PATCH 17/22] Core/Misc: Better unknown account log By Warpten. --- src/server/game/Server/WorldSocket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 7933ddfeb4d..1f10569b354 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -365,7 +365,7 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket) { // We can not log here, as we do not know the account. Thus, no accountId. SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT); - TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (unknown account)."); + TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (unknown account %s).", account.c_str()); DelayedCloseSocket(); return; } From de44a3250cbbf4d97ae0555d9df48bd903cc6106 Mon Sep 17 00:00:00 2001 From: Aokromes Date: Fri, 12 Dec 2014 20:33:02 +0100 Subject: [PATCH 18/22] Update worldserver.conf.dist --- src/server/worldserver/worldserver.conf.dist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index de62005642b..40f00664e79 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2995,7 +2995,7 @@ AuctionHouseBot.Buyer.Neutral.Chance.Ratio = 3 ################################################################################################### ################################################################################################### -# LOGGING SYSTEM SETTINGS +# LOGGING SYSTEM SETTINGS # # Appender config values: Given a appender "name" # Appender.name @@ -3153,7 +3153,7 @@ Allow.IP.Based.Action.Logging = 0 ################################################################################################### ################################################################################################### -# GUILD LEVELING SETTINGS +# GUILD LEVELING SETTINGS # # Guild.LevelingEnabled # Description: Controls whether guild can gain levels From 2a307f685c3fabfaca87342d19e896f3d72d61d7 Mon Sep 17 00:00:00 2001 From: Gooyeth Date: Fri, 19 Dec 2014 17:04:55 -0600 Subject: [PATCH 19/22] Hide Battleground List window The Battleground List window never showed on retail. Blizzlike. --- src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 728aeb44847..1038ef884aa 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -901,7 +901,7 @@ void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid data->WriteBit(guid[3]); data->WriteBit(0); // unk data->WriteBit(guid[5]); - data->WriteBit(player->getLevel() != 10 ? 1 : 0); // hide battleground list window, show only in level 10 + data->WriteBit(1); // hide battleground list window data->FlushBits(); From 4e668f9d4b25b3473c04724d26adf46d1c5f44cc Mon Sep 17 00:00:00 2001 From: Aokromes Date: Sun, 28 Dec 2014 10:23:21 +0100 Subject: [PATCH 20/22] Core/Logs: Move runtime log to debug because it's already checked at startup. --- src/server/game/AI/SmartScripts/SmartScript.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index ccfeb61206f..a73133170c7 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2266,7 +2266,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (linked) ProcessEvent(linked, unit, var0, var1, bvar, spell, gob); else - TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Link Event %u not found or invalid, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.link); + TC_LOG_DEBUG("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Link Event %u not found or invalid, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.link); } } @@ -2383,7 +2383,20 @@ SmartScriptHolder SmartScript::CreateEvent(SMART_EVENT e, uint32 event_flags, ui script.target.type = t; script.target.raw.param1 = target_param1; script.target.raw.param2 = target_param2; - script.target.raw.param3 = target_param3; + script.target.raw.param3 = target_param3ActivateTaxiPathTo(e.action.taxi.id); + + delete targets; + break; + } + case SMART_ACTION_RANDOM_MOVE: + { + ObjectList* targets = GetTargets(e, unit); + if (!targets) + break; + + bool foundTarget = false; + + for (ObjectList::const_iterator itr = targets-; script.source_type = SMART_SCRIPT_TYPE_CREATURE; InitTimer(script); From 708b09e9f7af94cf3325e8b765ec9d81ea682587 Mon Sep 17 00:00:00 2001 From: Rat Date: Sun, 28 Dec 2014 10:44:10 +0100 Subject: [PATCH 21/22] Core/Logs: fixing typos --- src/server/game/AI/SmartScripts/SmartScript.cpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index a73133170c7..3d9280cffa8 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2383,20 +2383,7 @@ SmartScriptHolder SmartScript::CreateEvent(SMART_EVENT e, uint32 event_flags, ui script.target.type = t; script.target.raw.param1 = target_param1; script.target.raw.param2 = target_param2; - script.target.raw.param3 = target_param3ActivateTaxiPathTo(e.action.taxi.id); - - delete targets; - break; - } - case SMART_ACTION_RANDOM_MOVE: - { - ObjectList* targets = GetTargets(e, unit); - if (!targets) - break; - - bool foundTarget = false; - - for (ObjectList::const_iterator itr = targets-; + script.target.raw.param3 = target_param3; script.source_type = SMART_SCRIPT_TYPE_CREATURE; InitTimer(script); From 9a941ae125c8b22b802270f7f419c1a8bfd2a343 Mon Sep 17 00:00:00 2001 From: Mihapro Date: Sun, 28 Dec 2014 17:52:16 +0000 Subject: [PATCH 22/22] Scripts/Instance: The Stonecore updates Stonecore Teleporters scripted. Some corrections, better handlings, fixed Travis warnings ... Closes #13626 --- sql/updates/world/2014_12_28_00_world_434.sql | 25 +++ src/server/game/Spells/SpellMgr.cpp | 5 + .../Maelstrom/Stonecore/boss_corborus.cpp | 26 +-- .../Stonecore/boss_high_priestess_azil.cpp | 161 +++++------------- .../Maelstrom/Stonecore/boss_ozruk.cpp | 39 ++--- .../Maelstrom/Stonecore/boss_slabhide.cpp | 39 ++--- .../Stonecore/instance_stonecore.cpp | 95 ++++------- .../scripts/Maelstrom/Stonecore/stonecore.cpp | 53 +++--- .../scripts/Maelstrom/Stonecore/stonecore.h | 5 + 9 files changed, 173 insertions(+), 275 deletions(-) create mode 100644 sql/updates/world/2014_12_28_00_world_434.sql diff --git a/sql/updates/world/2014_12_28_00_world_434.sql b/sql/updates/world/2014_12_28_00_world_434.sql new file mode 100644 index 00000000000..e36026c1ff4 --- /dev/null +++ b/sql/updates/world/2014_12_28_00_world_434.sql @@ -0,0 +1,25 @@ +-- The Stonecore updates +-- Spell conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (93167, 86862, 86863); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 93167, 0, 0, 31, 0, 3, 40350, 0, 0, 0, 0, '', 'Twilight Documents targets Generic Trigger LAB'), +(13, 1, 86862, 0, 0, 31, 0, 3, 42355, 0, 0, 0, 0, '', 'Seismic Shard targets Seismic Shards'), +(13, 1, 86862, 0, 0, 1, 0, 79009, 0, 0, 0, 0, 0, '', 'Seismic Shard''s target must have SPELL_SEISMIC_SHARD_VISUAL aura'), +(13, 1, 86863, 0, 0, 31, 0, 3, 42333, 0, 0, 0, 0, '', 'Seismic Shard targets High Priestess Azil'); + +-- Set CREATURE_FLAG_EXTRA_TRIGGER to Stonecore Teleporters, Lava Fissure, Stalactite Trigger - Boss, Rupture Controller, Rupture, Gravity Well, Seismic Shard +UPDATE `creature_template` SET `flags_extra` = 128 WHERE `entry` IN (51396, 51397, 43242, 43159, 49597, 49576, 42499, 42355); + +-- Stonecore Teleporters +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` IN (51396, 51397); +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(51396, 95284, 3, 0), +(51397, 95285, 3, 0); + +DELETE FROM `spell_target_position` WHERE `id` IN (95284, 95285); +INSERT INTO `spell_target_position` (`id`, `effIndex`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`, `VerifiedBuild`) VALUES +(95284, 0, 725, 1313.26, 1236.833, 247.2859, 0, 0), +(95285, 0, 725, 853.8577, 999.7518, 317.3986, 0, 0); + +-- Remove cpp script from Seismic Shard (86862) spell +DELETE FROM `spell_script_names` WHERE `spell_id` = 86862; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 46fac6340a8..6cfe56f44db 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3710,6 +3710,11 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->ManaCost = 0; spellInfo->ManaPerSecond = 0; break; + // Stonecore spells + case 95284: // Teleport (from entrance to Slabhide) + case 95285: // Teleport (from Slabhide to entrance) + spellInfo->Effects[EFFECT_0].TargetB = SpellImplicitTargetInfo(TARGET_DEST_DB); + break; // Halls Of Origination spells // Temple Guardian Anhuur case 76606: // Disable Beacon Beams L diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp index 2d522928fce..87bc866a74f 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp @@ -93,7 +93,9 @@ class boss_corborus : public CreatureScript void Reset() override { _Reset(); + countTrashingCharge = 0; + events.ScheduleEvent(EVENT_DAMPENING_WAVE, 10000); events.ScheduleEvent(EVENT_CRYSTAL_BARRAGE, 15000); events.ScheduleEvent(EVENT_SUBMERGE, 36000); @@ -110,7 +112,7 @@ class boss_corborus : public CreatureScript stateIntro = IN_PROGRESS; - if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM))) + if (Creature* Millhouse = instance->GetCreature(DATA_MILLHOUSE_MANASTORM)) { Millhouse->InterruptNonMeleeSpells(true); Millhouse->RemoveAllAuras(); @@ -144,18 +146,18 @@ class boss_corborus : public CreatureScript instance->SetData(DATA_MILLHOUSE_EVENT_FACE, 0); // Open rock gate and cast visual from nearby worldtrigger - instance->HandleGameObject(instance->GetGuidData(GAMEOBJECT_CORBORUS_ROCKDOOR), true); + instance->SetData(DATA_HANDLE_CORBORUS_ROCKDOOR, 0); if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 60.0f)) worldtrigger->CastSpell(worldtrigger, SPELL_DOOR_BREAK, true); // Make Corborus charge - me->CastSpell(me, SPELL_RING_WYRM_CHARGE, true); + DoCast(me, SPELL_RING_WYRM_CHARGE, true); events.ScheduleEvent(EVENT_CORBORUS_KNOCKBACK, 1000); break; case EVENT_CORBORUS_KNOCKBACK: // Spawn Twilight Documents (quest gameobject) - if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM))) + if (Creature* Millhouse = instance->GetCreature(DATA_MILLHOUSE_MANASTORM)) Millhouse->CastSpell(Millhouse, SPELL_TWILIGHT_DOCUMENTS, true); // Knockback Millhouse and other mobs @@ -231,12 +233,14 @@ class boss_corborus : public CreatureScript void JustSummoned(Creature* summon) override { - if (summon->GetEntry() != NPC_TRASHING_CHARGE) - return; + if (summon->GetEntry() == NPC_TRASHING_CHARGE) + { + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_TRASHING_CHARGE_EFFECT); + summon->DespawnOrUnsummon(6000); + } - summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_TRASHING_CHARGE_EFFECT); - summon->DespawnOrUnsummon(6000); + BossAI::JustSummoned(summon); } private: @@ -269,7 +273,7 @@ class npc_rock_borer : public CreatureScript void IsSummonedBy(Unit* summoner) override { me->SetInCombatState(false, summoner); - DoCast(SPELL_ROCK_BORER_EMERGE); + DoCast(me, SPELL_ROCK_BORER_EMERGE); } void UpdateAI(uint32 diff) override @@ -291,7 +295,7 @@ class npc_rock_borer : public CreatureScript me->SetReactState(REACT_AGGRESSIVE); break; case EVENT_ROCK_BORE: - DoCast(SPELL_ROCK_BORE); + DoCast(me, SPELL_ROCK_BORE); events.ScheduleEvent(EVENT_ROCK_BORE, urand(15000, 20000)); // Need sniffs for this timer break; default: diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp index fc14bf7a703..d5abb9ed41b 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp @@ -91,7 +91,7 @@ enum Events // Phase 2: Fury of Earth EVENT_EARTH_FURY_FLY_UP, EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM, - EVENT_EARTH_FURY_CHECK_SEAT0, + EVENT_EARTH_FURY_PREPARE_SHARD, EVENT_EARTH_FURY_LAUNCH_SHARD, EVENT_EARTH_FURY_FLY_DOWN, EVENT_START_ATTACK, @@ -100,12 +100,6 @@ enum Events EVENT_SEISMIC_SHARD_MOUNT }; -enum EventGroups -{ - EVENT_GROUP_PHASE_ONE, - EVENT_GROUP_ADDS, -}; - enum Points { POINT_NONE, @@ -121,7 +115,6 @@ Position const GroundPos = { 1331.82f, 980.314f, 207.542f }; Position const AbovePlatformPos = { 1336.21f, 960.813f, 215.0f }; // TO-DO: -// - Find out why NPCs summoned by boss are usually two times bigger than their normal size. // - Find more sniffs and script Force Grip spell (79351) class boss_high_priestess_azil : public CreatureScript @@ -131,12 +124,7 @@ class boss_high_priestess_azil : public CreatureScript struct boss_high_priestess_azilAI : public BossAI { - boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL), vehicle(creature->GetVehicleKit()) - { - ASSERT(vehicle); - } - - Vehicle* vehicle; + boss_high_priestess_azilAI(Creature* creature) : BossAI(creature, DATA_HIGH_PRIESTESS_AZIL) { } void Reset() override { @@ -147,9 +135,9 @@ class boss_high_priestess_azil : public CreatureScript me->SetReactState(REACT_PASSIVE); events.ScheduleEvent(EVENT_INTRO_MOVE, 2000); - events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000, EVENT_GROUP_PHASE_ONE); - events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000,10000), EVENT_GROUP_PHASE_ONE); - events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000, EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000); + events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000,10000)); + events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000); events.ScheduleEvent(EVENT_ENERGY_SHIELD, urand(35000,36000)); events.ScheduleEvent(EVENT_SUMMON_WAVE_SOUTH, 0); events.ScheduleEvent(EVENT_SUMMON_WAVE_WEST, 40000); @@ -159,32 +147,16 @@ class boss_high_priestess_azil : public CreatureScript { _EnterCombat(); - DoCast(SPELL_ENERGY_SHIELD); + DoCast(me, SPELL_ENERGY_SHIELD); Talk(SAY_AGGRO); } - void JustDied(Unit* killer) override + void JustDied(Unit* /*killer*/) override { - me->Say(SAY_DEATH); - } + _JustDied(); - /* - void PassengerBoarded(Unit* who, int8 seatId, bool apply) override - { - if (!apply || who->GetEntry() != NPC_SEISMIC_SHARD) - return; - - Movement::MoveSplineInit init(who); - init.DisableTransportPathTransformations(); - if (seatId == 0) - init.MoveTo(12.13748f, 0.0f, 2.442475f); - else if (seatId == 1) - init.MoveTo(12.13748f, 17.5f, 11.19248f); - else - init.MoveTo(12.13748f, -17.5f, 11.19248f); - init.Launch(); + Talk(SAY_DEATH); } - */ void MovementInform(uint32 type, uint32 id) override { @@ -196,6 +168,7 @@ class boss_high_priestess_azil : public CreatureScript case POINT_INTRO_MOVE: me->RemoveAurasDueToSpell(SPELL_ENERGY_SHIELD); me->SetReactState(REACT_AGGRESSIVE); + DoStartMovement(me->GetVictim()); break; case POINT_FLY_UP: me->SetCanFly(true); @@ -204,21 +177,22 @@ class boss_high_priestess_azil : public CreatureScript break; case POINT_ABOVE_PLATFORM: me->SetFacingTo(5.218534f); - DoCast(SPELL_EARTH_FURY_CASTING_VISUAL); - DoCast(SPELL_SEISMIC_SHARD_SUMMON_1); - DoCast(SPELL_SEISMIC_SHARD_SUMMON_2); - DoCast(SPELL_SEISMIC_SHARD_SUMMON_3); - events.ScheduleEvent(EVENT_EARTH_FURY_CHECK_SEAT0, 6700); + DoCast(me, SPELL_EARTH_FURY_CASTING_VISUAL); + DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_1); + DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_2); + DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_3); + events.ScheduleEvent(EVENT_EARTH_FURY_PREPARE_SHARD, 6700); break; case POINT_GROUND: - DoCast(SPELL_EJECT_ALL_PASSENGERS); + DoCast(me, SPELL_EJECT_ALL_PASSENGERS); me->SetCanFly(false); me->SetDisableGravity(false); me->SetReactState(REACT_AGGRESSIVE); + DoStartMovement(me->GetVictim()); // Find more sniffs to correct these timers, this was copied from Reset() void. - events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000, EVENT_GROUP_PHASE_ONE); - events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000, 10000), EVENT_GROUP_PHASE_ONE); - events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000, EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6000); + events.ScheduleEvent(EVENT_FORCE_GRIP, urand(8000, 10000)); + events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16000); break; default: break; @@ -245,20 +219,20 @@ class boss_high_priestess_azil : public CreatureScript case EVENT_CURSE_OF_BLOOD: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) DoCast(target, SPELL_CURSE_OF_BLOOD); - events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000), EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000)); break; case EVENT_FORCE_GRIP: DoCastVictim(SPELL_FORCE_GRIP); - events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000), EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, urand(13000, 15000)); break; case EVENT_SUMMON_GRAVITY_WELL: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) DoCast(target, SPELL_SUMMON_GRAVITY_WELL); - events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, urand(13000, 15000), EVENT_GROUP_PHASE_ONE); + events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, urand(13000, 15000)); break; case EVENT_ENERGY_SHIELD: - events.CancelEventGroup(EVENT_GROUP_PHASE_ONE); - DoCast(SPELL_EARTH_FURY_ENERGY_SHIELD); + events.Reset(); + DoCast(me, SPELL_EARTH_FURY_ENERGY_SHIELD); events.ScheduleEvent(EVENT_EARTH_FURY, 0); break; case EVENT_EARTH_FURY: @@ -274,9 +248,8 @@ class boss_high_priestess_azil : public CreatureScript case EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM: me->GetMotionMaster()->MovePoint(POINT_ABOVE_PLATFORM, AbovePlatformPos); break; - case EVENT_EARTH_FURY_CHECK_SEAT0: - if (!vehicle->GetPassenger(0)) - DoCast(SPELL_SEISMIC_SHARD_PREPARE); + case EVENT_EARTH_FURY_PREPARE_SHARD: + DoCast(me, SPELL_SEISMIC_SHARD_PREPARE); events.ScheduleEvent(EVENT_EARTH_FURY_LAUNCH_SHARD, 1800); break; case EVENT_EARTH_FURY_LAUNCH_SHARD: @@ -284,10 +257,10 @@ class boss_high_priestess_azil : public CreatureScript { me->SetFacingToObject(target); DoCast(target, SPELL_SEISMIC_SHARD_TARGETING); - DoCast(SPELL_SEISMIC_SHARD_LAUNCH); + DoCast(me, SPELL_SEISMIC_SHARD_LAUNCH); countSeismicShard -= 1; } - events.ScheduleEvent(countSeismicShard > 0 ? EVENT_EARTH_FURY_CHECK_SEAT0 : EVENT_EARTH_FURY_FLY_DOWN, 4800); + events.ScheduleEvent(countSeismicShard > 0 ? EVENT_EARTH_FURY_PREPARE_SHARD : EVENT_EARTH_FURY_FLY_DOWN, 4800); break; case EVENT_EARTH_FURY_FLY_DOWN: { @@ -370,8 +343,7 @@ public: { npc_gravity_wellAI(Creature* creature) : ScriptedAI(creature) { - me->SetReactState(REACT_PASSIVE); - DoCast(SPELL_GRAVITY_WELL_VISUAL); + DoCast(me, SPELL_GRAVITY_WELL_VISUAL); events.ScheduleEvent(EVENT_GRAVITY_WELL_AURA_DAMAGE, 3200); events.ScheduleEvent(EVENT_GRAVITY_WELL_AURA_PULL, 4500); if (!me->GetMap()->IsHeroic()) @@ -398,10 +370,10 @@ public: { case EVENT_GRAVITY_WELL_AURA_DAMAGE: me->RemoveAurasDueToSpell(SPELL_GRAVITY_WELL_VISUAL); - DoCast(SPELL_GRAVITY_WELL_AURA_DAMAGE); + DoCast(me, SPELL_GRAVITY_WELL_AURA_DAMAGE); break; case EVENT_GRAVITY_WELL_AURA_PULL: - DoCast(SPELL_GRAVITY_WELL_AURA_PULL); + DoCast(me, SPELL_GRAVITY_WELL_AURA_PULL); break; default: break; @@ -431,8 +403,7 @@ public: { instance = creature->GetInstanceScript(); me->SetDisableGravity(true); - me->SetReactState(REACT_PASSIVE); - DoCast(SPELL_SEISMIC_SHARD_VISUAL); + DoCast(me, SPELL_SEISMIC_SHARD_VISUAL); Movement::MoveSplineInit init(me); FillPath(me->GetPosition(), init.Path()); @@ -513,8 +484,8 @@ public: void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - for (uint8 i = 0; i < 3; i++) - GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_ADD_SOUTH, true); + for (int i = 0; i < 3; i++) + caster->CastSpell(caster, SPELL_SUMMON_ADD_SOUTH, true); } void Register() override @@ -549,8 +520,8 @@ public: void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); - for (uint8 i = 0; i < 10; i++) - GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_ADD_WEST, true); + for (int i = 0; i < 10; i++) + caster->CastSpell(caster, SPELL_SUMMON_ADD_WEST, true); } void Register() override @@ -653,15 +624,6 @@ public: }; // 79332 - Gravity Well (pull units within 10 yards) -class PulledRecentlyCheck -{ -public: - bool operator()(WorldObject* object) const - { - return (object->ToUnit() && object->ToUnit()->HasAura(SPELL_GRAVITY_WELL_PULL)); - } -}; - class spell_gravity_well_pull : public SpellScriptLoader { public: @@ -676,15 +638,9 @@ public: GetSpell()->SetSpellValue(SPELLVALUE_RADIUS_MOD, int32(GetCaster()->GetObjectScale() * 10000 * 2 / 3)); } - void FilterTargets(std::list& unitList) - { - unitList.remove_if(PulledRecentlyCheck()); - } - void Register() override { BeforeCast += SpellCastFn(spell_gravity_well_pull_SpellScript::SetRadiusMod); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gravity_well_pull_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -694,34 +650,7 @@ public: } }; -// 86862 - Seismic Shard (forces target to cast 86863) -class spell_seismic_shard_prepare : public SpellScriptLoader -{ -public: - spell_seismic_shard_prepare() : SpellScriptLoader("spell_seismic_shard_prepare") { } - - class spell_seismic_shard_prepare_SpellScript : public SpellScript - { - PrepareSpellScript(spell_seismic_shard_prepare_SpellScript); - - void SetTarget(WorldObject*& target) - { - target = GetCaster()->FindNearestCreature(NPC_SEISMIC_SHARD, 50.0f); - } - - void Register() override - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_seismic_shard_prepare_SpellScript::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_seismic_shard_prepare_SpellScript(); - } -}; - -// 86863 - Seismic Shard (moves shard to seat 0) +// 86863 - Seismic Shard (makes shard reenter Azil) class spell_seismic_shard_change_seat : public SpellScriptLoader { public: @@ -731,23 +660,14 @@ public: { PrepareSpellScript(spell_seismic_shard_change_seat_SpellScript); - void SetTarget(WorldObject*& target) - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - target = ObjectAccessor::GetCreature(*GetCaster(), instance->GetGuidData(DATA_HIGH_PRIESTESS_AZIL)); - } - - void ChangeSeat(SpellEffIndex /*effIndex*/) + void ExitVehicle() { GetCaster()->ExitVehicle(); - if (GetHitUnit()->IsVehicle()) - GetCaster()->EnterVehicle(GetHitUnit(), 0); } void Register() override { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_seismic_shard_change_seat_SpellScript::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_seismic_shard_change_seat_SpellScript::ChangeSeat, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + BeforeCast += SpellCastFn(spell_seismic_shard_change_seat_SpellScript::ExitVehicle); } }; @@ -801,7 +721,6 @@ void AddSC_boss_high_priestess_azil() new spell_gravity_well_damage_nearby(); new spell_gravity_well_damage(); new spell_gravity_well_pull(); - new spell_seismic_shard_prepare(); new spell_seismic_shard_change_seat(); new spell_seismic_shard(); } diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp index 92c9bba4bc1..14b89e6d63a 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp @@ -89,8 +89,6 @@ class boss_ozruk : public CreatureScript events.ScheduleEvent(EVENT_ELEMENTIUM_BULWARK, 5000); events.ScheduleEvent(EVENT_GROUND_SLAM, 10000); events.ScheduleEvent(EVENT_ELEMENTIUM_SPIKE_SHIELD, 13000); - - RemoveBouncerSpikes(); } void EnterCombat(Unit* /*victim*/) override @@ -102,12 +100,13 @@ class boss_ozruk : public CreatureScript void JustSummoned(Creature* summon) override { - if (summon->GetEntry() != NPC_RUPTURE_CONTROLLER) - return; + if (summon->GetEntry() == NPC_RUPTURE_CONTROLLER) + { + summon->CastSpell(summon, SPELL_RUPTURE, true); + summon->DespawnOrUnsummon(10000); + } - summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_RUPTURE, true); - summon->DespawnOrUnsummon(10000); + BossAI::JustSummoned(summon); } void DamageTaken(Unit* /*attacker*/, uint32 &damage) override @@ -116,14 +115,14 @@ class boss_ozruk : public CreatureScript return; DoCast(me, SPELL_ENRAGE); - me->Say(SAY_ENRAGE); + Talk(SAY_ENRAGE); } - void JustDied(Unit* killer) override + void JustDied(Unit* /*killer*/) override { - me->Say(SAY_DEATH, killer); // receiver is the killer, sniff source! + _JustDied(); - RemoveBouncerSpikes(); + Talk(SAY_DEATH); } void UpdateAI(uint32 diff) override @@ -133,7 +132,7 @@ class boss_ozruk : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasAura(SPELL_ELEMENTIUM_SPIKE_SHIELD)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -156,7 +155,7 @@ class boss_ozruk : public CreatureScript events.ScheduleEvent(EVENT_SHATTER, 10000); break; case EVENT_SHATTER: - RemoveBouncerSpikes(); + summons.DespawnEntry(NPC_BOUNCER_SPIKE); me->SetReactState(REACT_PASSIVE); me->AttackStop(); DoCast(me, SPELL_SHATTER); @@ -168,6 +167,7 @@ class boss_ozruk : public CreatureScript break; case EVENT_START_ATTACK: me->SetReactState(REACT_AGGRESSIVE); + DoStartMovement(me->GetVictim()); break; default: break; @@ -176,18 +176,6 @@ class boss_ozruk : public CreatureScript DoMeleeAttackIfReady(); } - - void RemoveBouncerSpikes() - { - Vehicle* vehicle = me->GetVehicleKit(); - if (!vehicle) - return; - - for (uint8 i = 0; i < vehicle->GetAvailableSeatCount(); i++) - if (Unit* passenger = vehicle->GetPassenger(i)) - if (Creature* creature = passenger->ToCreature()) - creature->RemoveFromWorld(); - } }; CreatureAI* GetAI(Creature* creature) const override @@ -229,7 +217,6 @@ public: if (!rupture) return; - rupture->SetReactState(REACT_PASSIVE); rupture->CastSpell(rupture, SPELL_RUPTURE_DAMAGE, true); } diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp index 6827312deef..f9af00370df 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp @@ -199,7 +199,7 @@ class boss_slabhide : public CreatureScript events.ScheduleEvent(EVENT_STALACTITE, 400); break; case POINT_SLABHIDE_LAND: - //DoCast(SPELL_COOLDOWN_5S); // unknown purpose + //DoCast(me, SPELL_COOLDOWN_5S); // unknown purpose events.ScheduleEvent(EVENT_ATTACK, 1200); break; default: @@ -225,11 +225,12 @@ class boss_slabhide : public CreatureScript instance->SetData(DATA_SLABHIDE_ROCK_WALL, false); break; case EVENT_LAVA_FISSURE: - DoCast(SPELL_LAVA_FISSURE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_LAVA_FISSURE); events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000)); break; case EVENT_SAND_BLAST: - DoCast(SPELL_SAND_BLAST); + DoCast(me, SPELL_SAND_BLAST); events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 11000)); break; case EVENT_AIR_PHASE: @@ -248,7 +249,7 @@ class boss_slabhide : public CreatureScript me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetHover(true); - DoCast(SPELL_STALACTITE_SUMMON); + DoCast(me, SPELL_STALACTITE_SUMMON); events.ScheduleEvent(EVENT_LAND, 8000); break; @@ -267,7 +268,7 @@ class boss_slabhide : public CreatureScript events.ScheduleEvent(EVENT_LAVA_FISSURE, urand(6000, 8000)); events.ScheduleEvent(EVENT_SAND_BLAST, urand(8000, 10000)); - DoCast(SPELL_CRYSTAL_STORM); + DoCast(me, SPELL_CRYSTAL_STORM); me->SetReactState(REACT_AGGRESSIVE); break; default: @@ -315,8 +316,7 @@ public: { npc_lava_fissureAI(Creature* creature) : ScriptedAI(creature) { - me->SetReactState(REACT_PASSIVE); - me->CastSpell(me, SPELL_LAVA_FISSURE_CRACK, true); + DoCast(me, SPELL_LAVA_FISSURE_CRACK, true); events.ScheduleEvent(EVENT_LAVA_FISSURE_ERUPTION, 6000); } @@ -330,7 +330,7 @@ public: { case EVENT_LAVA_FISSURE_ERUPTION: me->RemoveAurasDueToSpell(SPELL_LAVA_FISSURE_CRACK); - me->CastSpell(me, SPELL_LAVA_FISSURE_ERUPTION, true); + DoCast(me, SPELL_LAVA_FISSURE_ERUPTION, true); me->DespawnOrUnsummon(14000); break; default: @@ -359,14 +359,16 @@ public: { npc_stalactite_triggerAI(Creature* creature) : ScriptedAI(creature) { - me->SetReactState(REACT_PASSIVE); me->SetDisableGravity(true); - me->CastSpell(me, SPELL_STALACTITE_SHADE, true); + DoCast(me, SPELL_STALACTITE_SHADE, true); events.ScheduleEvent(EVENT_STALACTITE_MISSLE, 5600); } void UpdateAI(uint32 diff) override { + if (events.Empty()) + return; + events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) @@ -374,7 +376,7 @@ public: switch (eventId) { case EVENT_STALACTITE_MISSLE: - DoCast(SPELL_STALACTITE_MISSLE); + DoCast(me, SPELL_STALACTITE_MISSLE); me->DespawnOrUnsummon(11000); break; default: @@ -394,15 +396,6 @@ public: }; // 81035 - Stalactite (check if player is near to summon stalactite) -class NotPlayerCheck -{ - public: - bool operator()(WorldObject* object) const - { - return (object->GetTypeId() != TYPEID_PLAYER); - } -}; - class spell_s81035_stalactite : public SpellScriptLoader { public: @@ -412,11 +405,6 @@ public: { PrepareSpellScript(spell_s81035_stalactite_SpellScript); - void FilterTargets(std::list& targets) - { - targets.remove_if(NotPlayerCheck()); - } - void SummonStalactiteTrigger() { Unit* caster = GetCaster(); @@ -425,7 +413,6 @@ public: void Register() override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_s81035_stalactite_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); OnHit += SpellHitFn(spell_s81035_stalactite_SpellScript::SummonStalactiteTrigger); } }; diff --git a/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp index 8cb4df0622f..f67c5acdb67 100644 --- a/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp @@ -34,6 +34,17 @@ // TO-DO: // - Find out spell IDs for both Stonecore Teleporters (spellclick). +ObjectData const creatureData[] = +{ + { NPC_MILLHOUSE_MANASTORM, DATA_MILLHOUSE_MANASTORM }, + { NPC_CORBORUS, DATA_CORBORUS }, + { NPC_SLABHIDE, DATA_SLABHIDE }, + { NPC_HIGH_PRIESTESS_AZIL, DATA_HIGH_PRIESTESS_AZIL }, + { NPC_STONECORE_TELEPORTER, DATA_STONECORE_TELEPORTER }, + { NPC_STONECORE_TELEPORTER_2, DATA_STONECORE_TELEPORTER_2 }, + { 0, 0 } // END +}; + class instance_stonecore : public InstanceMapScript { public: @@ -45,6 +56,7 @@ class instance_stonecore : public InstanceMapScript { SetHeaders(DataHeader); SetBossNumber(MAX_ENCOUNTER); + LoadObjectData(creatureData, nullptr); } void OnGameObjectCreate(GameObject* go) override @@ -67,27 +79,10 @@ class instance_stonecore : public InstanceMapScript { switch (creature->GetEntry()) { - case NPC_MILLHOUSE_MANASTORM: - millhouseGUID = creature->GetGUID(); - break; - case NPC_CORBORUS: - corobrusGUID = creature->GetGUID(); - break; - case NPC_SLABHIDE: - slabhideGUID = creature->GetGUID(); - break; - case NPC_HIGH_PRIESTESS_AZIL: - highPriestessAzilGUID = creature->GetGUID(); - break; case NPC_STONECORE_TELEPORTER: case NPC_STONECORE_TELEPORTER_2: - if (GetBossState(DATA_SLABHIDE) != DONE) - stonecoreTeleporterGUID[creature->GetEntry() - NPC_STONECORE_TELEPORTER] = creature->GetGUID(); - else // If Slabhide is already dead, no need to store teleporter guids - { - creature->CastSpell(creature, SPELL_TELEPORTER_ACTIVE_VISUAL, true); - creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - } + if (GetBossState(DATA_SLABHIDE) == DONE) + ActivateTeleporter(creature); break; default: break; @@ -95,7 +90,7 @@ class instance_stonecore : public InstanceMapScript // Check if creature is part of Millhouse event creature->SearchFormation(); - if (CreatureGroup* group = creature->GetFormation()) // TO-DO: Fix formations + if (CreatureGroup* group = creature->GetFormation()) { switch (group->GetId()) { @@ -109,6 +104,8 @@ class instance_stonecore : public InstanceMapScript break; } } + + InstanceScript::OnCreatureCreate(creature); } bool SetBossState(uint32 type, EncounterState state) override @@ -123,16 +120,9 @@ class instance_stonecore : public InstanceMapScript // Activate teleporters if (state == DONE) { - for (int8 i = 0; i < MAX_STONECORE_TELEPORTERS; i++) - { - if (Creature* teleporter = GetCreature(stonecoreTeleporterGUID[i])) - { - teleporter->CastSpell(teleporter, SPELL_TELEPORTER_ACTIVE_VISUAL, true); - teleporter->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - } - } + ActivateTeleporter(GetCreature(DATA_STONECORE_TELEPORTER)); + ActivateTeleporter(GetCreature(DATA_STONECORE_TELEPORTER_2)); } - break; default: break; @@ -158,6 +148,9 @@ class instance_stonecore : public InstanceMapScript { switch (type) { + case DATA_HANDLE_CORBORUS_ROCKDOOR: + HandleGameObject(corborusRockDoorGUID, true); + break; case DATA_MILLHOUSE_EVENT_FACE: MillhouseEvent_Face(); break; @@ -179,35 +172,11 @@ class instance_stonecore : public InstanceMapScript } } - ObjectGuid GetGuidData(uint32 type) const override - { - switch (type) - { - case DATA_MILLHOUSE_MANASTORM: - return millhouseGUID; - case GAMEOBJECT_CORBORUS_ROCKDOOR: - return corborusRockDoorGUID; - case DATA_CORBORUS: - return corobrusGUID; - case DATA_SLABHIDE: - return slabhideGUID; - case DATA_HIGH_PRIESTESS_AZIL: - return highPriestessAzilGUID; - case NPC_STONECORE_TELEPORTER: - case NPC_STONECORE_TELEPORTER_2: - return stonecoreTeleporterGUID[type - NPC_STONECORE_TELEPORTER]; - default: - break; - } - - return ObjectGuid::Empty; - } - private: // Face Millhouse and other nearby mobs to Corborus void MillhouseEvent_Face() { - if (Creature* Millhouse = instance->GetCreature(millhouseGUID)) + if (Creature* Millhouse = GetCreature(DATA_MILLHOUSE_MANASTORM)) Millhouse->SetFacingTo(1.570796f); for (GuidVector::const_iterator i = millhouseLastGroupGUIDs.begin(); i != millhouseLastGroupGUIDs.end(); ++i) if (Creature* creature = instance->GetCreature(*i)) @@ -217,7 +186,7 @@ class instance_stonecore : public InstanceMapScript // Knock back Millhouse and other mobs void MillhouseEvent_Knockback() { - if (Creature* Millhouse = instance->GetCreature(millhouseGUID)) + if (Creature* Millhouse = GetCreature(DATA_MILLHOUSE_MANASTORM)) Millhouse->CastSpell(Millhouse, SPELL_RING_WYRM_KNOCKBACK, true); for (GuidVector::const_iterator itr = millhouseLastGroupGUIDs.begin(); itr != millhouseLastGroupGUIDs.end(); ++itr) if (Creature* creature = instance->GetCreature(*itr)) @@ -227,7 +196,7 @@ class instance_stonecore : public InstanceMapScript // Despawn all mobs void MillhouseEvent_Despawn() { - if (Creature* Millhouse = instance->GetCreature(millhouseGUID)) + if (Creature* Millhouse = GetCreature(DATA_MILLHOUSE_MANASTORM)) Millhouse->DespawnOrUnsummon(3000); for (GuidVector::const_iterator itr = millhouseTrashGUIDs.begin(); itr != millhouseTrashGUIDs.end(); ++itr) if (Creature* creature = instance->GetCreature(*itr)) @@ -237,14 +206,18 @@ class instance_stonecore : public InstanceMapScript creature->DespawnOrUnsummon(3000); } - ObjectGuid millhouseGUID; + void ActivateTeleporter(Creature* teleporter) + { + if (!teleporter) + return; + + teleporter->CastSpell(teleporter, SPELL_TELEPORTER_ACTIVE_VISUAL, true); + teleporter->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + } + GuidVector millhouseTrashGUIDs; GuidVector millhouseLastGroupGUIDs; ObjectGuid corborusRockDoorGUID; - ObjectGuid corobrusGUID; - ObjectGuid slabhideGUID; - ObjectGuid highPriestessAzilGUID; - ObjectGuid stonecoreTeleporterGUID[2]; GuidVector slabhideRockWallGUIDs; EncounterState slabhideIntro; diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp index 2612cd02385..7133cf32284 100644 --- a/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.cpp @@ -28,11 +28,6 @@ enum Texts SAY_MILLHOUSE_EVENT_2 = 1, }; -enum NPCs -{ - NPC_GENERIC_TRIGGER_LAB = 40350, -}; - enum Spells { // Millhouse Manastorm @@ -94,6 +89,9 @@ Position const MillhousePointGroup2 = { 977.3045f, 895.2347f, 306.3298f }; Position const MillhousePointGroup3 = { 1049.823f, 871.4349f, 295.006f }; Position const MillhousePointGroup4 = { 1149.04f, 884.431f, 284.9406f }; +// TO-DO: +// - Millhouse Manastorm should face and cast SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, but he won't. :( + // 43391 - Millhouse Manastorm class npc_sc_millhouse_manastorm : public CreatureScript { @@ -173,27 +171,28 @@ class npc_sc_millhouse_manastorm : public CreatureScript me->CombatStop(true); me->DeleteThreatList(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); - me->SetReactState(REACT_AGGRESSIVE); - switch (pointId) { case POINT_MILLHOUSE_GROUP_2: - if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f)) - me->SetFacingToObject(worldtrigger); // o: 5.497359f (sniff data) - me->CastSpell(me, SPELL_ANCHOR_HERE, true); - me->AddAura(SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, me); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); + me->SetReactState(REACT_AGGRESSIVE); + if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 200.0f)) + me->SetFacingToObject(worldtrigger); + DoCast(me, SPELL_ANCHOR_HERE); + DoCast(me, SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND); events.ScheduleEvent(EVENT_READY_FOR_COMBAT, 10000); break; case POINT_MILLHOUSE_GROUP_3: + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); + me->SetReactState(REACT_AGGRESSIVE); me->SetFacingTo(5.931499f); - me->CastSpell(me, SPELL_ANCHOR_HERE, true); - me->AddAura(SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND, me); + DoCast(me, SPELL_ANCHOR_HERE); + DoCast(me, SPELL_TIGULE_AND_FORORS_SPECIAL_BLEND); events.ScheduleEvent(EVENT_READY_FOR_COMBAT, 10000); break; case POINT_MILLHOUSE_GROUP_4: me->SetFacingTo(3.455752f); - me->CastSpell(me, SPELL_ANCHOR_HERE, true); + DoCast(me, SPELL_ANCHOR_HERE); Talk(SAY_MILLHOUSE_EVENT_2); events.ScheduleEvent(EVENT_CAST_IMPENDING_DOOM, 1000); break; @@ -204,14 +203,14 @@ class npc_sc_millhouse_manastorm : public CreatureScript void UpdateAI(uint32 diff) override { - // Only update events if Millhouse is aggressive - if (me->GetReactState() != REACT_AGGRESSIVE) + // Do not update events if Millhouse is aggressive and has no combat. + if (!UpdateVictim() && me->GetReactState() == REACT_AGGRESSIVE) return; events.Update(diff); // Impending Doom is exception because it needs to be interrupted. - if (me->HasUnitState(UNIT_STATE_CASTING) && !me->GetCurrentSpell(SPELL_IMPENDING_DOOM)) + if (me->HasUnitState(UNIT_STATE_CASTING) && !me->FindCurrentSpellBySpellId(SPELL_IMPENDING_DOOM)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -219,7 +218,7 @@ class npc_sc_millhouse_manastorm : public CreatureScript switch (eventId) { case EVENT_FROSTBOLT_VOLLEY: - DoCast(SPELL_FROSTBOLT_VOLLEY); + DoCastAOE(SPELL_FROSTBOLT_VOLLEY); events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 7000); break; case EVENT_SHADOWFURY: @@ -238,8 +237,8 @@ class npc_sc_millhouse_manastorm : public CreatureScript ScheduleEvents(); break; case EVENT_CAST_IMPENDING_DOOM: - DoCast(SPELL_IMPENDING_DOOM); - DoCast(SPELL_IMPENDING_DOOM_CHANNEL); + DoCast(me, SPELL_IMPENDING_DOOM); + DoCast(me, SPELL_IMPENDING_DOOM_CHANNEL); events.ScheduleEvent(EVENT_INTERRUPT_IMPENDING_DOOM, urand(15000,20000)); break; case EVENT_INTERRUPT_IMPENDING_DOOM: @@ -338,11 +337,6 @@ class spell_sc_twilight_documents : public SpellScriptLoader return false; return true; } - - void SetTarget(WorldObject*& target) - { - target = GetCaster()->FindNearestCreature(NPC_GENERIC_TRIGGER_LAB, 100.0f); - } void SpawnGameObject(SpellEffIndex /*effIndex*/) { @@ -352,7 +346,6 @@ class spell_sc_twilight_documents : public SpellScriptLoader void Register() override { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_sc_twilight_documents_SpellScript::SetTarget, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); OnEffectHit += SpellEffectFn(spell_sc_twilight_documents_SpellScript::SpawnGameObject, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -370,7 +363,7 @@ class JumpCheck bool operator()(WorldObject* object) const { Player* player = object->ToPlayer(); - return (player && player->HasUnitState(UNIT_STATE_JUMPING)); + return (player && (player->IsFalling() || player->HasUnitState(UNIT_STATE_JUMPING))); } }; @@ -408,7 +401,7 @@ public: bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) - if (Creature* corborus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_CORBORUS))) + if (Creature* corborus = instance->GetCreature(DATA_CORBORUS)) corborus->AI()->DoAction(ACTION_CORBORUS_INTRO); return true; } @@ -422,7 +415,7 @@ public: bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) - if (Creature* slabhide = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SLABHIDE))) + if (Creature* slabhide = instance->GetCreature(DATA_SLABHIDE)) slabhide->AI()->DoAction(ACTION_SLABHIDE_INTRO); return true; } diff --git a/src/server/scripts/Maelstrom/Stonecore/stonecore.h b/src/server/scripts/Maelstrom/Stonecore/stonecore.h index 98a9878e0d3..a13a0efad58 100644 --- a/src/server/scripts/Maelstrom/Stonecore/stonecore.h +++ b/src/server/scripts/Maelstrom/Stonecore/stonecore.h @@ -32,11 +32,16 @@ enum DataTypes // Additional Data DATA_MILLHOUSE_MANASTORM, DATA_MILLHOUSE_EVENT_FACE, + DATA_HANDLE_CORBORUS_ROCKDOOR, DATA_MILLHOUSE_EVENT_KNOCKBACK, DATA_MILLHOUSE_EVENT_DESPAWN, DATA_SLABHIDE_INTRO, DATA_SLABHIDE_ROCK_WALL, + + // Teleporters + DATA_STONECORE_TELEPORTER, + DATA_STONECORE_TELEPORTER_2, }; enum Misc