public static void AddAllParty(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { var cast = targets.Cast; if (cast.CasterChar != null) { // For Characters: Add the whole party if (targets.Cast.CasterChar.Group != null) { foreach (var member in cast.CasterChar.Group) { var chr = member.Character; if (chr != null) { targets.Add(chr); } } } else { failReason = SpellFailedReason.TargetNotInParty; } } else { var radius = targets.FirstHandler.GetRadius(); if (radius == 0) { // For NPCs: Add all friendly minions around (radius 30 if no radius is set?) radius = 30; } targets.AddAreaSource(cast.Spell.HasHarmfulEffects ? (TargetFilter)DefaultTargetFilters.IsFriendly : DefaultTargetFilters.IsHostile, ref failReason, radius); } }
public static void AddObject(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { if (!(targets.Cast.SelectedTarget is GameObject)) { failReason = SpellFailedReason.BadTargets; } else { targets.Add(targets.Cast.SelectedTarget); } }
public static void AddSelf(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { var self = targets.Cast.CasterObject; if (self == null) { // invalid trigger proc log.Warn("Invalid SpellCast tried to target self, but no Caster given: {0}", targets.Cast); failReason = SpellFailedReason.Error; return; } if ((failReason = targets.ValidateTargetForHandlers(self)) == SpellFailedReason.Ok) { targets.Add(self); } }
public static void AddChannelObject(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { var caster = targets.Cast.CasterUnit; if (caster != null) { if (caster.ChannelObject != null) { if ((failReason = targets.ValidateTarget(caster.ChannelObject, filter)) == SpellFailedReason.Ok) { targets.Add(caster.ChannelObject); } } else { failReason = SpellFailedReason.BadTargets; } } }
public static void AddSelf(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { WorldObject casterObject = targets.Cast.CasterObject; if (casterObject == null) { DefaultTargetAdders.log.Warn("Invalid SpellCast tried to target self, but no Caster given: {0}", (object)targets.Cast); failReason = SpellFailedReason.Error; } else { if ((sbyte)(failReason = targets.ValidateTargetForHandlers(casterObject)) != (sbyte)-1) { return; } targets.Add(casterObject); } }
/// <summary> /// /// </summary> public static void AddSecondHighestThreatTarget(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { var caster = targets.Cast.CasterUnit as NPC; if (caster == null) { failReason = SpellFailedReason.NoValidTargets; return; } var nearest = caster.ThreatCollection.GetAggressorByThreatRank(2); if (nearest != null) { targets.Add(nearest); } else { failReason = SpellFailedReason.NoValidTargets; } }
public static void AddPet(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { var caster = targets.Cast.CasterObject; if (!(caster is Character)) { log.Warn("Non-Player {0} tried to cast Pet - spell {1}", caster, targets.Cast.Spell); failReason = SpellFailedReason.TargetNotPlayer; return; } var pet = ((Character)caster).ActivePet; if (pet == null) { failReason = SpellFailedReason.NoPet; return; } targets.Add(pet); }
/// <summary> /// /// </summary> public static void AddSecondHighestThreatTarget(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { NPC casterUnit = targets.Cast.CasterUnit as NPC; if (casterUnit == null) { failReason = SpellFailedReason.NoValidTargets; } else { Unit aggressorByThreatRank = casterUnit.ThreatCollection.GetAggressorByThreatRank(2); if (aggressorByThreatRank != null) { targets.Add((WorldObject)aggressorByThreatRank); } else { failReason = SpellFailedReason.NoValidTargets; } } }
public static void AddChannelObject(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { Unit casterUnit = targets.Cast.CasterUnit; if (casterUnit == null) { return; } if (casterUnit.ChannelObject != null) { if ((sbyte)(failReason = targets.ValidateTarget(casterUnit.ChannelObject, filter)) != (sbyte)-1) { return; } targets.Add(casterUnit.ChannelObject); } else { failReason = SpellFailedReason.BadTargets; } }
public static void AddPet(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { WorldObject casterObject = targets.Cast.CasterObject; if (!(casterObject is Character)) { DefaultTargetAdders.log.Warn("Non-Player {0} tried to cast Pet - spell {1}", (object)casterObject, (object)targets.Cast.Spell); failReason = SpellFailedReason.TargetNotPlayer; } else { NPC activePet = ((Character)casterObject).ActivePet; if (activePet == null) { failReason = SpellFailedReason.NoPet; } else { targets.Add((WorldObject)activePet); } } }
public static void AddAllParty(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason) { SpellCast cast = targets.Cast; if (cast.CasterChar != null) { if (targets.Cast.CasterChar.Group != null) { foreach (GroupMember groupMember in cast.CasterChar.Group) { Character character = groupMember.Character; if (character != null) { targets.Add((WorldObject)character); } } } else { failReason = SpellFailedReason.TargetNotInParty; } } else { float radius = targets.FirstHandler.GetRadius(); if ((double)radius == 0.0) { radius = 30f; } targets.AddAreaSource( cast.Spell.HasHarmfulEffects ? new TargetFilter(DefaultTargetFilters.IsFriendly) : new TargetFilter(DefaultTargetFilters.IsHostile), ref failReason, radius); } }
/// <summary> /// Adds the selected targets and chain-targets (if any) /// </summary> public static void AddSelection(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason, bool harmful) { var cast = targets.Cast; if (cast == null) { return; } var caster = cast.CasterObject as Unit; var selected = cast.SelectedTarget; if (selected == null) { if (caster == null) { log.Warn("Invalid SpellCast, tried to add Selection but nothing selected and no Caster present: {0}", targets.Cast); failReason = SpellFailedReason.Error; return; } selected = caster.Target; if (selected == null) { failReason = SpellFailedReason.BadTargets; return; } } var effect = targets.FirstHandler.Effect; var spell = effect.Spell; if (selected != caster && caster != null) { if (!caster.IsInMaxRange(spell, selected)) { failReason = SpellFailedReason.OutOfRange; } else if (caster.IsPlayer && !selected.IsInFrontOf(caster)) { failReason = SpellFailedReason.UnitNotInfront; } } if (failReason == SpellFailedReason.Ok) { // standard checks failReason = targets.ValidateTarget(selected, filter); if (failReason == SpellFailedReason.Ok) { // add target and look for more if we have a chain effect targets.Add(selected); var chainCount = effect.ChainTargets; if (caster != null) { chainCount = caster.Auras.GetModifiedInt(SpellModifierType.ChainTargets, spell, chainCount); } if (chainCount > 1 && selected is Unit) { targets.FindChain((Unit)selected, filter, true, chainCount); } } } }
/// <summary>Adds the selected targets and chain-targets (if any)</summary> public static void AddSelection(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason, bool harmful) { SpellCast cast = targets.Cast; if (cast == null) { return; } Unit casterObject = cast.CasterObject as Unit; WorldObject target = cast.SelectedTarget; if (target == null) { if (casterObject == null) { DefaultTargetAdders.log.Warn( "Invalid SpellCast, tried to add Selection but nothing selected and no Caster present: {0}", (object)targets.Cast); failReason = SpellFailedReason.Error; return; } target = (WorldObject)casterObject.Target; if (target == null) { failReason = SpellFailedReason.BadTargets; return; } } SpellEffect effect = targets.FirstHandler.Effect; Spell spell = effect.Spell; if (target != casterObject && casterObject != null) { if (!casterObject.IsInMaxRange(spell, target)) { failReason = SpellFailedReason.OutOfRange; } else if (casterObject.IsPlayer && !target.IsInFrontOf((WorldObject)casterObject)) { failReason = SpellFailedReason.UnitNotInfront; } } if (failReason != SpellFailedReason.Ok) { return; } failReason = targets.ValidateTarget(target, filter); if (failReason != SpellFailedReason.Ok) { return; } targets.Add(target); int limit = effect.ChainTargets; if (casterObject != null) { limit = casterObject.Auras.GetModifiedInt(SpellModifierType.ChainTargets, spell, limit); } if (limit <= 1 || !(target is Unit)) { return; } targets.FindChain((Unit)target, filter, true, limit); }
private void InitHandler(SpellEffect effect, int h, SpellEffectHandler[] handlers, out SpellTargetCollection targets, ref SpellFailedReason failReason) { targets = null; var handler = effect.SpellEffectHandlerCreator(this, effect); handlers[h] = handler; // make sure, we have the right Caster-Type handler.CheckCasterType(ref failReason); if (failReason != SpellFailedReason.Ok) { return; } handler.Initialize(ref failReason); if (failReason != SpellFailedReason.Ok) { return; } // find targets and amount SpellTargetCollection if effects have same ImplicitTargetTypes if (m_initialTargets != null) { // do we have given targets? //targets = SpellTargetCollection.SpellTargetCollectionPool.Obtain(); targets = new SpellTargetCollection(); for (var j = 0; j < m_initialTargets.Length; j++) { var target = m_initialTargets[j]; if (target.IsInWorld) { var err = handler.CheckValidTarget(target); if (err != SpellFailedReason.Ok) { if (!IsAoE) { failReason = err; return; } } else { targets.Add(target); } } } } else if (handler.HasOwnTargets) { // check if we have same target-types, else collect targets specifically for this Effect for (var j = 0; j < h; j++) { var handler2 = handlers[j]; if (handler.Effect.TargetsEqual(handler2.Effect)) { targets = handler2.Targets; break; } } if (targets == null) { //targets = SpellTargetCollection.SpellTargetCollectionPool.Obtain(); targets = new SpellTargetCollection(); } } if (targets != null) { handler.Targets = targets; targets.m_handlers.Add(handler); } }