Fix Dire Beast (120679): summoned beasts now attack the hunter target
The spell script spell_hun_dire_beast summoned the zone "Beast" guardian but never ordered it to attack, and the ~108 summon templates had no AIName/ScriptName, so the beasts idled next to the owner instead of engaging the target. Add a dedicated ScriptedAI npc_pet_hun_dire_beast (mirroring npc_pet_hunter_snake_trap, minus the snake-specific level-40 health formula and poison) that, on spawn, attacks the summoner target (owner GetVictim / getAttackerForHelper), and bind it to the 108 inert level-1 friendly "Beast" summon templates via sql/sylvania/dire_beast_ai_20260705.sql. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
-- Dire Beast (spell 120679 "Bête féroce") — the summoned "Beast" guardians had no AI/ScriptName
|
||||
-- and never engaged the hunter's target (they idled next to the owner).
|
||||
-- Bind them to the new C++ AI npc_pet_hun_dire_beast (added to src/server/scripts/Pet/pet_hunter.cpp),
|
||||
-- which orders the summon to attack the summoner's target on spawn.
|
||||
-- Targets the 108 inert level-1 friendly "Beast" summon templates (one per zone/expansion).
|
||||
-- 2026-07-05
|
||||
UPDATE `creature_template`
|
||||
SET `ScriptName` = 'npc_pet_hun_dire_beast'
|
||||
WHERE `name` = 'Beast'
|
||||
AND `type` = 1
|
||||
AND `faction` = 35
|
||||
AND `minlevel` = 1
|
||||
AND `maxlevel` = 1
|
||||
AND (`AIName` IS NULL OR `AIName` = '')
|
||||
AND (`ScriptName` IS NULL OR `ScriptName` = '');
|
||||
@@ -181,8 +181,65 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// Dire Beast (120679) summoned "Beast" - order the summoned beast to attack the hunter's target.
|
||||
// Same proven pattern as npc_pet_hunter_snake_trap, without the snake-specific health/poison
|
||||
// (dire beasts are level 1 -> the snake health formula would underflow).
|
||||
class npc_pet_hun_dire_beast : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_pet_hun_dire_beast() : CreatureScript("npc_pet_hun_dire_beast") { }
|
||||
|
||||
struct npc_pet_hun_dire_beastAI : public ScriptedAI
|
||||
{
|
||||
npc_pet_hun_dire_beastAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
// On spawn, engage the summoner's current target (or its attacker).
|
||||
if (!me->GetVictim() && me->IsSummon())
|
||||
if (Unit* owner = me->ToTempSummon()->GetSummoner())
|
||||
{
|
||||
if (Unit* target = owner->GetVictim())
|
||||
AttackStart(target);
|
||||
else if (Unit* attacker = owner->getAttackerForHelper())
|
||||
AttackStart(attacker);
|
||||
}
|
||||
}
|
||||
|
||||
// Pick up a closer target if the owner switches while the beast is out.
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!me->GetVictim() && me->CanCreatureAttack(who))
|
||||
{
|
||||
if (me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
|
||||
return;
|
||||
|
||||
float attackRadius = me->GetAttackDistance(who);
|
||||
if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
|
||||
AttackStart(who);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override
|
||||
{
|
||||
if (!UpdateVictim() || !me->GetVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_pet_hun_dire_beastAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_hunter_pet_scripts()
|
||||
{
|
||||
new npc_pet_hunter_snake_trap();
|
||||
new npc_pet_hunter_hati();
|
||||
new npc_pet_hun_dire_beast();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user