fix(Scripts/Ulduar): update Winter Jormungar and Snow Mound creature script (#17054)

* initial

* add auras

* spacing
This commit is contained in:
Dan
2023-09-05 11:39:44 +02:00
committed by GitHub
parent 056b28ea21
commit 189818e781
3 changed files with 96 additions and 51 deletions
@@ -0,0 +1,6 @@
--
DELETE FROM `creature_template_addon` WHERE `entry` IN (34146, 34150, 34151);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(34146, 0, 0, 0, 0, 0, 0, '64615'),
(34150, 0, 0, 0, 0, 0, 0, '64615'),
(34151, 0, 0, 0, 0, 0, 0, '64615');
@@ -24,30 +24,49 @@
#include "SpellAuraEffects.h" #include "SpellAuraEffects.h"
#include "SpellScript.h" #include "SpellScript.h"
#include "Vehicle.h" #include "Vehicle.h"
#include "TaskScheduler.h"
enum Texts enum Texts
{ {
// Freya // Freya
GOSSIP_MENU_FREYA = 10324, GOSSIP_MENU_FREYA = 10324,
NPC_TEXT_FREYA = 14332, NPC_TEXT_FREYA = 14332,
// Hodir // Hodir
GOSSIP_MENU_HODIR = 10335, GOSSIP_MENU_HODIR = 10335,
NPC_TEXT_HODIR = 14326, NPC_TEXT_HODIR = 14326,
// Mimiron // Mimiron
GOSSIP_MENU_MIMIRON = 10336, GOSSIP_MENU_MIMIRON = 10336,
NPC_TEXT_MIMIRON = 14334, NPC_TEXT_MIMIRON = 14334,
// Thorim // Thorim
GOSSIP_MENU_THORIM = 10337, GOSSIP_MENU_THORIM = 10337,
NPC_TEXT_THORIM = 14333, NPC_TEXT_THORIM = 14333,
// Confirm assistance // Confirm assistance
GOSSIP_MENU_CONFIRM = 10333, GOSSIP_MENU_CONFIRM = 10333,
NPC_TEXT_CONFIRM = 14325, NPC_TEXT_CONFIRM = 14325,
SAY_KEEPER_SELECTED = 1, SAY_KEEPER_SELECTED = 1,
};
enum UldNPCs
{
NPC_WINTER_JORMUNGAR = 34137,
NPC_SNOW_MOUND_4 = 34146,
NPC_SNOW_MOUND_6 = 34150,
NPC_SNOW_MOUND_8 = 34151
};
enum UldGameObjects
{
GOBJ_SNOW_MOUND = 194907
};
enum UldSpells
{
SPELL_SNOW_MOUND_PARTICLES = 64615
}; };
class npc_ulduar_keeper : public CreatureScript class npc_ulduar_keeper : public CreatureScript
@@ -157,52 +176,72 @@ public:
} }
}; };
class npc_ulduar_snow_mound : public CreatureScript struct npc_ulduar_snow_mound : public ScriptedAI
{ {
public: npc_ulduar_snow_mound(Creature* creature) : ScriptedAI(creature)
npc_ulduar_snow_mound() : CreatureScript("npc_ulduar_snow_mound") { }
CreatureAI* GetAI(Creature* creature) const override
{ {
return GetUlduarAI<npc_ulduar_snow_moundAI>(creature); _activated = false;
_count = 0;
_counter = 0;
} }
struct npc_ulduar_snow_moundAI : public ScriptedAI void MoveInLineOfSight(Unit* who) override
{ {
npc_ulduar_snow_moundAI(Creature* creature) : ScriptedAI(creature) if (!_activated && who->GetTypeId() == TYPEID_PLAYER)
{ {
activated = false; if (me->GetExactDist2d(who) <= 10.0f && me->GetMap()->isInLineOfSight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f,
me->CastSpell(me, 64615, true); who->GetPositionX(), who->GetPositionY(), who->GetPositionZ() + 5.0f, 2, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::Nothing))
} {
_activated = true;
bool activated; me->RemoveAura(SPELL_SNOW_MOUND_PARTICLES);
if (GameObject* go = me->FindNearestGameObject(GOBJ_SNOW_MOUND, 5.0f))
void MoveInLineOfSight(Unit* who) override
{
if (!activated && who->GetTypeId() == TYPEID_PLAYER)
if (me->GetExactDist2d(who) <= 25.0f && me->GetMap()->isInLineOfSight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.0f,
who->GetPositionX(), who->GetPositionY(), who->GetPositionZ() + 5.0f, 2, LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags::Nothing))
{ {
activated = true; go->Delete();
me->RemoveAura(64615);
if (GameObject* go = me->FindNearestGameObject(194907, 5.0f))
go->Delete();
uint8 count;
if (me->GetEntry() == 34146) count = 4;
else if (me->GetEntry() == 34150) count = 6;
else count = 8;
for (uint8 i = 0; i < count; ++i)
{
float a = rand_norm() * 2 * M_PI;
float d = rand_norm() * 4.0f;
if (Creature* c = me->SummonCreature(34137, me->GetPositionX() + cos(a) * d, me->GetPositionY() + std::sin(a) * d, me->GetPositionZ() + 1.0f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000))
c->AI()->AttackStart(who);
}
} }
}
void UpdateAI(uint32 /*diff*/) override {} switch (me->GetEntry())
}; {
case NPC_SNOW_MOUND_4:
_count = 4;
break;
case NPC_SNOW_MOUND_6:
_count = 6;
break;
case NPC_SNOW_MOUND_8:
_count = 8;
break;
default:
return;
}
_scheduler.Schedule(0s, [this](TaskContext context)
{
_counter++;
float a = rand_norm() * 2 * M_PI; //needs verification from sniffs
float d = rand_norm() * 4.0f;
if (Creature* jormungar = me->SummonCreature(NPC_WINTER_JORMUNGAR, me->GetPositionX() + cos(a) * d, me->GetPositionY() + std::sin(a) * d, me->GetPositionZ() + 1.0f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000))
{
jormungar->SetInCombatWithZone();
}
if (_counter < _count)
{
context.Repeat(2s);
}
});
}
}
}
void UpdateAI(uint32 diff) override
{
_scheduler.Update(diff);
}
private:
bool _activated;
TaskScheduler _scheduler;
uint8 _count;
uint8 _counter;
}; };
class npc_ulduar_storm_tempered_keeper : public CreatureScript class npc_ulduar_storm_tempered_keeper : public CreatureScript
@@ -512,13 +551,11 @@ struct npc_salvaged_siege_engine : public VehicleAI
void AddSC_ulduar() void AddSC_ulduar()
{ {
new npc_ulduar_keeper(); new npc_ulduar_keeper();
new spell_ulduar_energy_sap(); new spell_ulduar_energy_sap();
new npc_ulduar_snow_mound(); RegisterUlduarCreatureAI(npc_ulduar_snow_mound);
new npc_ulduar_storm_tempered_keeper(); new npc_ulduar_storm_tempered_keeper();
new npc_ulduar_arachnopod_destroyer(); new npc_ulduar_arachnopod_destroyer();
new spell_ulduar_arachnopod_damaged(); new spell_ulduar_arachnopod_damaged();
new AreaTrigger_at_celestial_planetarium_enterance(); new AreaTrigger_at_celestial_planetarium_enterance();
new go_call_tram(); new go_call_tram();
@@ -302,4 +302,6 @@ inline AI* GetUlduarAI(T* obj)
return GetInstanceAI<AI>(obj, UlduarScriptName); return GetInstanceAI<AI>(obj, UlduarScriptName);
} }
#define RegisterUlduarCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetUlduarAI)
#endif #endif