From 15b346163da9f9179d1b698a66fe633c47674dab Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Mon, 13 Sep 2021 16:09:40 +0200 Subject: [PATCH] =?UTF-8?q?fix(Scripts/BRD):=20Mobs=20in=20Manufactory=20s?= =?UTF-8?q?hould=20attack=20on=20Golem=20Lord=20Arg=E2=80=A6=20(#7794)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Closes #3077 --- .../rev_1631178211175526300.sql | 22 +++ .../game/AI/SmartScripts/SmartScript.cpp | 3 +- .../BlackrockDepths/blackrock_depths.h | 53 +++--- .../instance_blackrock_depths.cpp | 163 ++++++++++++++++-- .../Uldaman/instance_uldaman.cpp | 7 +- 5 files changed, 209 insertions(+), 39 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1631178211175526300.sql diff --git a/data/sql/updates/pending_db_world/rev_1631178211175526300.sql b/data/sql/updates/pending_db_world/rev_1631178211175526300.sql new file mode 100644 index 000000000..cf55c6099 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1631178211175526300.sql @@ -0,0 +1,22 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1631178211175526300'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=8983 AND `id` BETWEEN 3 AND 13; +INSERT INTO `smart_scripts` VALUES +(8983,0,3,0,4,0,100,0,0,0,0,0,0,34,31,1,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On Aggro - Set instance data 34'), +(8983,0,4,5,38,0,100,0,31,1,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On set 31 data - set react passive'), +(8983,0,5,6,61,0,100,0,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On set 31 data - set phase mask to 2'), +(8983,0,6,0,61,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On set 31 data - say 0'), +(8983,0,7,8,0,2,100,1,100,100,0,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - IC - set phase mask to 4'), +(8983,0,8,9,61,0,100,0,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - IC - set react passive'), +(8983,0,9,0,61,0,100,0,0,0,0,0,0,69,1,0,0,0,0,0,8,0,0,0,0,809.1331,22.008,-53.658,3.16,'Golem Lord Argelmach - On set 31 data - move to pos 1'), +(8983,0,10,0,34,0,100,0,8,1,0,0,0,34,32,1,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On pos 1 - set instance data 32'), +(8983,0,11,12,25,0,100,0,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On reset - set react aggressive'), +(8983,0,12,0,61,0,100,0,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On reset - reset phase mask'), +(8983,0,13,0,38,0,100,0,31,3,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Golem Lord Argelmach - On set 31 data - set phase mask to 1'); + +UPDATE `smart_scripts` SET `event_phase_mask`=0 WHERE `entryorguid`=8983 AND `id`=0; +UPDATE `smart_scripts` SET `event_phase_mask`=1 WHERE `entryorguid`=8983 AND `id` BETWEEN 1 AND 2; + +DELETE FROM `creature_text` WHERE `CreatureId`=8983; +INSERT INTO `creature_text` VALUES +(8983,0,0,'Intruders in the Manufactory? My constructs will destroy you!',12,0,100,0,0,0,5297,0,'Golem Lord Argelmach Say 0'); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index e37181e0d..7a90c4348 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1875,7 +1875,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (TransportBase* trans = me->GetDirectTransport()) trans->CalculatePassengerPosition(dest.x, dest.y, dest.z); - me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, dest.x, dest.y, dest.z, true, true, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE); + me->GetMotionMaster()->MovePoint(e.action.MoveToPos.pointId, dest.x, dest.y, dest.z, true, true, + isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE, e.target.o); } else // Xinef: we can use dest.x, dest.y, dest.z to make offset { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h index f9f7788fa..5d6e97e95 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h @@ -24,39 +24,42 @@ enum BRDBosses enum DataTypes { - TYPE_RING_OF_LAW = 1, - TYPE_VAULT = 2, - TYPE_BAR = 3, - TYPE_TOMB_OF_SEVEN = 4, - TYPE_LYCEUM = 5, - TYPE_IRON_HALL = 6, + TYPE_RING_OF_LAW = 1, + TYPE_VAULT = 2, + TYPE_BAR = 3, + TYPE_TOMB_OF_SEVEN = 4, + TYPE_LYCEUM = 5, + TYPE_IRON_HALL = 6, - DATA_EMPEROR = 10, - DATA_PHALANX = 11, + DATA_EMPEROR = 10, + DATA_PHALANX = 11, - DATA_ARENA1 = 12, - DATA_ARENA2 = 13, - DATA_ARENA3 = 14, - DATA_ARENA4 = 15, + DATA_ARENA1 = 12, + DATA_ARENA2 = 13, + DATA_ARENA3 = 14, + DATA_ARENA4 = 15, - DATA_GO_BAR_KEG = 16, - DATA_GO_BAR_KEG_TRAP = 17, - DATA_GO_BAR_DOOR = 18, - DATA_GO_CHALICE = 19, + DATA_GO_BAR_KEG = 16, + DATA_GO_BAR_KEG_TRAP = 17, + DATA_GO_BAR_DOOR = 18, + DATA_GO_CHALICE = 19, - DATA_GHOSTKILL = 20, - DATA_EVENSTARTER = 21, + DATA_GHOSTKILL = 20, + DATA_EVENSTARTER = 21, - DATA_GOLEM_DOOR_N = 22, - DATA_GOLEM_DOOR_S = 23, + DATA_GOLEM_DOOR_N = 22, + DATA_GOLEM_DOOR_S = 23, - DATA_THRONE_DOOR = 24, + DATA_THRONE_DOOR = 24, - DATA_SF_BRAZIER_N = 25, - DATA_SF_BRAZIER_S = 26, - DATA_MOIRA = 27, + DATA_SF_BRAZIER_N = 25, + DATA_SF_BRAZIER_S = 26, + DATA_MOIRA = 27, - DATA_OPEN_COFFER_DOORS = 30 + DATA_OPEN_COFFER_DOORS = 30, + + DATA_GOLEM_LORD_ARGELMACH_INIT = 31, + DATA_GOLEM_LORD_ARGELMACH_ADDS = 32 }; template diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index 29793fc1d..a52be1718 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -13,19 +13,25 @@ enum Creatures { - NPC_EMPEROR = 9019, - NPC_PHALANX = 9502, - NPC_ANGERREL = 9035, - NPC_DOPEREL = 9040, - NPC_HATEREL = 9034, - NPC_VILEREL = 9036, - NPC_SEETHREL = 9038, - NPC_GLOOMREL = 9037, - NPC_DOOMREL = 9039, - NPC_MAGMUS = 9938, - NPC_MOIRA = 8929, + NPC_EMPEROR = 9019, + NPC_PHALANX = 9502, + NPC_ANGERREL = 9035, + NPC_DOPEREL = 9040, + NPC_HATEREL = 9034, + NPC_VILEREL = 9036, + NPC_SEETHREL = 9038, + NPC_GLOOMREL = 9037, + NPC_DOOMREL = 9039, + NPC_MAGMUS = 9938, + NPC_MOIRA = 8929, - NPC_WATCHMAN_DOOMGRIP = 9476, + NPC_WATCHMAN_DOOMGRIP = 9476, + + NPC_WEAPON_TECHNICIAN = 8920, + NPC_DOOMFORGE_ARCANASMITH = 8900, + NPC_RAGEREAVER_GOLEM = 8906, + NPC_WRATH_HAMMER_CONSTRUCT = 8907, + NPC_GOLEM_LORD_ARGELMACH = 8983 }; enum GameObjects @@ -53,6 +59,34 @@ enum GameObjects GO_CHEST_SEVEN = 169243, }; +enum MiscData +{ + SPELL_STONED = 10255 +}; + +class RestoreAttack : public BasicEvent +{ +public: + RestoreAttack(Creature* boss) : _boss(boss) {} + + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override + { + _boss->SetReactState(REACT_AGGRESSIVE); + _boss->AI()->SetData(DATA_GOLEM_LORD_ARGELMACH_INIT, DONE); + + if (Unit* victim = _boss->GetVictim()) + { + _boss->SetTarget(victim->GetGUID()); + _boss->GetMotionMaster()->MoveChase(victim); + } + + return true; + } + +private: + Creature* _boss; +}; + class instance_blackrock_depths : public InstanceMapScript { public: @@ -105,6 +139,9 @@ public: uint32 TombEventCounter; uint32 OpenedCoofers; + GuidList ArgelmachAdds; + ObjectGuid ArgelmachGUID; + void Initialize() override { memset(&encounter, 0, sizeof(encounter)); @@ -155,6 +192,20 @@ public: if (!creature->IsAlive()) HandleGameObject(GetGuidData(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss break; + case NPC_WEAPON_TECHNICIAN: + case NPC_DOOMFORGE_ARCANASMITH: + case NPC_RAGEREAVER_GOLEM: + case NPC_WRATH_HAMMER_CONSTRUCT: + if (creature->IsAlive() && creature->GetPositionZ() < -51.5f && creature->GetPositionZ() > -55.f) + { + ArgelmachAdds.push_back(creature->GetGUID()); + } + break; + case NPC_GOLEM_LORD_ARGELMACH: + ArgelmachGUID = creature->GetGUID(); + break; + default: + break; } } @@ -232,6 +283,21 @@ public: } } + void OnUnitDeath(Unit* unit) override + { + switch (unit->GetEntry()) + { + case NPC_WEAPON_TECHNICIAN: + case NPC_DOOMFORGE_ARCANASMITH: + case NPC_RAGEREAVER_GOLEM: + case NPC_WRATH_HAMMER_CONSTRUCT: + ArgelmachAdds.remove(unit->GetGUID()); + break; + default: + break; + } + } + void SetGuidData(uint32 type, ObjectGuid data) override { switch (type) @@ -285,6 +351,79 @@ public: summon->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN); } break; + case DATA_GOLEM_LORD_ARGELMACH_INIT: + { + if (Creature* argelmach = instance->GetCreature(ArgelmachGUID)) + { + GuidList adds = ArgelmachAdds; + for (GuidList::const_iterator itr = adds.begin(); itr != adds.end();) + { + if (Creature* argelmachAdd = instance->GetCreature(*itr)) + { + if (argelmachAdd->GetEntry() == NPC_WRATH_HAMMER_CONSTRUCT) + { + argelmachAdd->RemoveAurasDueToSpell(SPELL_STONED); + argelmachAdd->AI()->AttackStart(argelmach->GetVictim()); + itr = adds.erase(itr); + } + else if (argelmachAdd->GetEntry() == NPC_RAGEREAVER_GOLEM) + { + if (argelmachAdd->IsWithinDist2d(argelmach, 10.f)) + { + argelmachAdd->RemoveAurasDueToSpell(SPELL_STONED); + argelmachAdd->AI()->AttackStart(argelmach->GetVictim()); + itr = adds.erase(itr); + } + else + ++itr; + } + else + { + ++itr; + } + } + else + { + ++itr; + } + } + + if (!adds.empty()) + { + argelmach->SetReactState(REACT_PASSIVE); + argelmach->SetTarget(); + argelmach->AI()->SetData(DATA_GOLEM_LORD_ARGELMACH_INIT, IN_PROGRESS); + } + else + { + argelmach->AI()->SetData(DATA_GOLEM_LORD_ARGELMACH_INIT, DONE); + } + } + break; + } + case DATA_GOLEM_LORD_ARGELMACH_ADDS: + { + if (Creature* argelmach = instance->GetCreature(ArgelmachGUID)) + { + argelmach->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT); + argelmach->m_Events.AddEvent(new RestoreAttack(argelmach), argelmach->m_Events.CalculateTime(3000)); + + for (ObjectGuid const& argelmachAddGUID : ArgelmachAdds) + { + if (Creature* argelmachAdd = instance->GetCreature(argelmachAddGUID)) + { + if (!argelmachAdd->IsInCombat()) + { + argelmachAdd->RemoveAurasDueToSpell(SPELL_STONED); + argelmachAdd->AI()->AttackStart(argelmach->GetVictim()); + } + } + } + } + break; + } + default: + break; } if (data == DONE || GhostKillCount >= 7) diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 523e82e22..93fbacd28 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -156,6 +156,11 @@ public: } }; +enum UldamanStonedEnum +{ + MAP_ULDAMAN = 70 +}; + class spell_uldaman_stoned : public SpellScriptLoader { public: @@ -167,7 +172,7 @@ public: bool Load() override { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT && GetUnitOwner()->GetMapId() == MAP_ULDAMAN; } void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)