aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2024_02_23_01_world.sql24
-rw-r--r--src/server/scripts/Pet/pet_generic.cpp125
2 files changed, 149 insertions, 0 deletions
diff --git a/sql/updates/world/3.3.5/2024_02_23_01_world.sql b/sql/updates/world/3.3.5/2024_02_23_01_world.sql
new file mode 100644
index 00000000000..1815bdce3ae
--- /dev/null
+++ b/sql/updates/world/3.3.5/2024_02_23_01_world.sql
@@ -0,0 +1,24 @@
+-- Creature - 33200 - Elwynn Lamb
+DELETE FROM `creature_template_addon` WHERE `entry` = 33200;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `auras`) VALUES
+(33200, 0, 0, 0, 0, 0, 1, 0, 0, '62703');
+
+UPDATE `creature_model_info` SET `BoundingRadius` = 0.65, `CombatReach` = 0.65 WHERE `DisplayID` = 16205;
+
+-- Creature - 33286 - Elwynn Forest Wolf
+UPDATE `creature_template` SET `unit_flags` = 768, `AIName` = '', `ScriptName` = 'npc_elwynn_forest_wolf' WHERE `entry` = 33286;
+UPDATE `creature_model_info` SET `BoundingRadius` = 0.85 WHERE `DisplayID` = 28545;
+
+-- Spell - 62701 - Elwynn Forest Wolf
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 62701;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 62701, 0, 0, 31, 0, 3, 33200, 0, 0, 0, 0, '', 'Spell \'Elwynn Forest Wolf\' only targets NPC \'Elwynn Lamb\'');
+
+DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_elwynn_forest_wolf';
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(62701, 'spell_gen_elwynn_forest_wolf');
+
+-- Spell - 62703 - Elwynn Lamb
+DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_elwynn_lamb';
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(62703, 'spell_gen_elwynn_lamb');
diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp
index 45f70bd6cb1..b8bb69fe226 100644
--- a/src/server/scripts/Pet/pet_generic.cpp
+++ b/src/server/scripts/Pet/pet_generic.cpp
@@ -27,6 +27,7 @@
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
+#include "ObjectAccessor.h"
enum PandarenMonkMisc
{
@@ -289,6 +290,127 @@ class spell_pet_gen_lich_pet_focus : public SpellScript
}
};
+enum ElwynnLambMisc
+{
+ // Spells
+ SPELL_SLEEPING_SLEEP = 32951,
+ SPELL_SUICIDE = 45254,
+ SPELL_ELWYNN_FOREST_WOLF = 62701,
+
+ // Sound
+ SOUND_WOLF_HOWL = 9036,
+};
+
+struct npc_elwynn_forest_wolf : public NullCreatureAI
+{
+ npc_elwynn_forest_wolf(Creature* creature) : NullCreatureAI(creature), _chasing(false) { }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ if (!summoner->IsCreature())
+ return;
+
+ _summonerGUID = summoner->GetGUID();
+ _ScheduleBeforeChasingEvents();
+ }
+
+ void MovementInform(uint32 type, uint32 id) override
+ {
+ if (type == CHASE_MOTION_TYPE && id == _summonerGUID.GetCounter())
+ _ScheduleAfterChasingEvents();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+
+ if (_chasing && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
+ _ScheduleAfterChasingEvents();
+ }
+
+private:
+ void _ScheduleBeforeChasingEvents()
+ {
+ _scheduler.Schedule(1s, [this](TaskContext /*context*/)
+ {
+ me->PlayDistanceSound(SOUND_WOLF_HOWL);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_BATTLE_ROAR);
+ })
+ .Schedule(4s, [this](TaskContext /*context*/)
+ {
+ if (Creature* summoner = ObjectAccessor::GetCreature(*me, _summonerGUID))
+ if (me->Attack(summoner, false))
+ me->GetMotionMaster()->MoveChase(summoner);
+
+ _chasing = true;
+ });
+ }
+
+ void _ScheduleAfterChasingEvents()
+ {
+ _chasing = false;
+ me->GetMotionMaster()->Clear();
+
+ _scheduler.Schedule(2s, [this](TaskContext /*context*/)
+ {
+ DoCastAOE(SPELL_ELWYNN_FOREST_WOLF);
+ })
+ .Schedule(4s, [this](TaskContext /*context*/)
+ {
+ DoCastSelf(SPELL_SLEEPING_SLEEP);
+ me->DespawnOrUnsummon(7s);
+ });
+ }
+
+ ObjectGuid _summonerGUID;
+ bool _chasing;
+ TaskScheduler _scheduler;
+};
+
+// 62701 - Elwynn Forest Wolf
+class spell_gen_elwynn_forest_wolf : public SpellScript
+{
+ PrepareSpellScript(spell_gen_elwynn_forest_wolf);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SUICIDE });
+ }
+
+ void HandleDummy(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (Creature* target = GetHitCreature())
+ {
+ target->CastSpell(target, SPELL_SUICIDE, true);
+ target->DespawnOrUnsummon(4s);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_elwynn_forest_wolf::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 62703 - Elwynn Lamb
+class spell_gen_elwynn_lamb : public AuraScript
+{
+ PrepareAuraScript(spell_gen_elwynn_lamb);
+
+ void HandlePeriodic(AuraEffect const* /*aurEff*/)
+ {
+ // Based on WotLK Classic sniffs (3.4.3 52237).
+ if (!GetTarget()->IsOutdoors() || !roll_chance_i(5))
+ PreventDefaultAction();
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_elwynn_lamb::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+};
+
void AddSC_generic_pet_scripts()
{
RegisterCreatureAI(npc_pet_gen_pandaren_monk);
@@ -299,4 +421,7 @@ void AddSC_generic_pet_scripts()
RegisterSpellScript(spell_pet_gen_lich_pet_periodic_emote);
RegisterSpellScript(spell_pet_gen_lich_pet_emote);
RegisterSpellScript(spell_pet_gen_lich_pet_focus);
+ RegisterCreatureAI(npc_elwynn_forest_wolf);
+ RegisterSpellScript(spell_gen_elwynn_forest_wolf);
+ RegisterSpellScript(spell_gen_elwynn_lamb);
}