Core/Scripts: add checks to Master's Call script
This commit is contained in:
@@ -230,40 +230,58 @@ namespace Scripts.Spells.Hunter
|
||||
{
|
||||
public override bool Validate(SpellInfo spellInfo)
|
||||
{
|
||||
return ValidateSpellInfo(SpellIds.MastersCallTriggered, (uint)spellInfo.GetEffect(0).CalcValue());
|
||||
return spellInfo.GetEffect(0) != null && ValidateSpellInfo(SpellIds.MastersCallTriggered, (uint)spellInfo.GetEffect(0).CalcValue());
|
||||
}
|
||||
|
||||
public override bool Load()
|
||||
{
|
||||
return GetCaster().IsPlayer();
|
||||
}
|
||||
|
||||
SpellCastResult DoCheckCast()
|
||||
{
|
||||
Pet pet = GetCaster().ToPlayer().GetPet();
|
||||
if (pet == null || !pet.IsAlive())
|
||||
return SpellCastResult.CantDoThatRightNow;
|
||||
|
||||
// Do a mini Spell::CheckCasterAuras on the pet, no other way of doing this
|
||||
SpellCastResult result = SpellCastResult.SpellCastOk;
|
||||
UnitFlags unitflag = (UnitFlags)pet.GetUInt32Value(UnitFields.Flags);
|
||||
if (!pet.GetCharmerGUID().IsEmpty())
|
||||
result = SpellCastResult.Charmed;
|
||||
else if (unitflag.HasAnyFlag(UnitFlags.Stunned))
|
||||
result = SpellCastResult.Stunned;
|
||||
else if (unitflag.HasAnyFlag(UnitFlags.Fleeing))
|
||||
result = SpellCastResult.Fleeing;
|
||||
else if (unitflag.HasAnyFlag(UnitFlags.Confused))
|
||||
result = SpellCastResult.Confused;
|
||||
|
||||
if (result != SpellCastResult.SpellCastOk)
|
||||
return result;
|
||||
|
||||
Unit target = GetExplTargetUnit();
|
||||
if (!target)
|
||||
return SpellCastResult.BadTargets;
|
||||
|
||||
if (!pet.IsWithinLOSInMap(target))
|
||||
return SpellCastResult.LineOfSight;
|
||||
|
||||
return SpellCastResult.SpellCastOk;
|
||||
}
|
||||
|
||||
void HandleDummy(uint effIndex)
|
||||
{
|
||||
Unit ally = GetHitUnit();
|
||||
if (ally)
|
||||
{
|
||||
Player caster = GetCaster().ToPlayer();
|
||||
if (caster)
|
||||
{
|
||||
Pet target = caster.GetPet();
|
||||
if (target)
|
||||
{
|
||||
TriggerCastFlags castMask = (TriggerCastFlags.FullMask & ~TriggerCastFlags.IgnoreCasterAurastate);
|
||||
target.CastSpell(ally, (uint)GetEffectValue(), castMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
GetCaster().ToPlayer().GetPet().CastSpell(GetHitUnit(), (uint)GetEffectValue(), true);
|
||||
}
|
||||
|
||||
void HandleScriptEffect(uint effIndex)
|
||||
{
|
||||
Unit target = GetHitUnit();
|
||||
if (target)
|
||||
{
|
||||
// Cannot be processed while pet is dead
|
||||
TriggerCastFlags castMask = (TriggerCastFlags.FullMask & ~TriggerCastFlags.IgnoreCasterAurastate);
|
||||
target.CastSpell(target, SpellIds.MastersCallTriggered, castMask);
|
||||
}
|
||||
GetHitUnit().CastSpell((Unit)null, SpellIds.MastersCallTriggered, true);
|
||||
}
|
||||
|
||||
public override void Register()
|
||||
{
|
||||
OnCheckCast.Add(new CheckCastHandler(DoCheckCast));
|
||||
OnEffectHitTarget.Add(new EffectHandler(HandleDummy, 0, SpellEffectName.Dummy));
|
||||
OnEffectHitTarget.Add(new EffectHandler(HandleScriptEffect, 1, SpellEffectName.ScriptEffect));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user