Core/Scripts: add checks to Master's Call script

This commit is contained in:
hondacrx
2017-12-30 16:59:47 -05:00
parent b180f6a9ba
commit 6f1c9c47e6
+40 -22
View File
@@ -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));
}