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);
        }
Exemple #14
0
		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);
			}
		}