Esempio n. 1
0
        public override string ToString()
        {
            string       ReturnValue = base.ToString();
            TargetFilter tf          = targetFilterFlags;

            if (textID != null && textID != string.Empty)
            {
                ReturnValue = textID;
            }
            if ((tf & TargetFilter.Dead) != 0)
            {
                ReturnValue += " (Dead)";
            }
            else
            {
                if ((tf & TargetFilter.Cloaked) != 0)
                {
                    ReturnValue += " (Cloaked)";
                }
                if ((tf & TargetFilter.Detector) != 0)
                {
                    ReturnValue += " (Detector)";
                }
            }

            return(ReturnValue);
        }
Esempio n. 2
0
        public static void AddTargetFilter(string name, Serial serial)
        {
            if (TargetFilters.Any(f => f.Serial == serial) == false)
            {
                if (FriendsManager.IsFriend(serial))
                {
                    World.Player.SendMessage(MsgLevel.Warning, $"'{name}' ({serial}) is a friend, not adding to target filter list");
                    return;
                }

                TargetFilter newFilter = new TargetFilter
                {
                    Name   = name,
                    Serial = serial
                };

                TargetFilters.Add(newFilter);

                World.Player.SendMessage(MsgLevel.Info, $"Added '{name}' ({serial}) to the target filter list");
            }
            else
            {
                World.Player.SendMessage(MsgLevel.Warning, $"'{name}' ({serial}) is already on the target filter");
            }
        }
Esempio n. 3
0
        public async Task <User.Info> GetUserFromIdAsync(string id, TargetFilter targetFilter)
        {
            EnsureNotCancelled();
            var result = await Resolve <IAppApiEndPoint>().GetSingleUserAsync(new SingleUserRequest(id, targetFilter.GetDescription())).ConfigureAwait(false);

            return(result.UserEntity !);
        }
Esempio n. 4
0
 public RecommendationEngine(MakoClient makoClient, RecommendationContentType?recommendContentType, TargetFilter filter, uint?maxBookmarkIdForRecommend, uint?minBookmarkIdForRecentIllust, EngineHandle?engineHandle) : base(makoClient, engineHandle)
 {
     _recommendContentType = recommendContentType ?? RecommendationContentType.Illust;
     _filter = filter;
     _maxBookmarkIdForRecommend    = maxBookmarkIdForRecommend;
     _minBookmarkIdForRecentIllust = minBookmarkIdForRecentIllust;
 }
Esempio n. 5
0
        public MemberMenuData(InspectorData inspectorData, Object[] components)
        {
            this.inspectorData = inspectorData;
            this.components    = new MemberMenuComponent[components.Length];
            for (int i = 0; i < components.Length; i++)
            {
                int occurences = 1;
                if (componentOccurrences.ContainsKey(components[i].GetType()))
                {
                    occurences = ++componentOccurrences[components[i].GetType()];
                }
                else
                {
                    componentOccurrences.Add(components[i].GetType(), occurences);
                }

                TargetFilter     menuTargetFilters = TargetFilter.Static | TargetFilter.Dynamic;
                TargetTypeFilter menuTypeFilters   = TargetTypeFilter.Any;
                if (inspectorData.filterAttribute != null)
                {
                    menuTargetFilters = inspectorData.filterAttribute.targetFilters;
                    menuTypeFilters   = inspectorData.filterAttribute.typeFilters;
                }

                this.components[i] = new MemberMenuComponent(i, components[i], components[i].GetType().Name + (occurences > 1 ? (" " + (occurences - 1)) : ""), inspectorData.eventType, menuTargetFilters, menuTypeFilters);
            }
        }
Esempio n. 6
0
        public static void Load(XmlElement node)
        {
            ClearAll();

            try
            {
                foreach (XmlElement el in node.GetElementsByTagName("targetfilter"))
                {
                    try
                    {
                        TargetFilter filter = new TargetFilter
                        {
                            Name   = el.GetAttribute("name"),
                            Serial = Serial.Parse(el.GetAttribute("serial"))
                        };

                        TargetFilters.Add(filter);
                    }
                    catch
                    {
                        // bad entry, ignore
                    }
                }
            }
            catch
            {
                // must not be in the profile, move on
            }

            RedrawList();
        }
        /// <summary>
        /// Adds all chained units around the selected unit to the list
        /// </summary>
        public void FindChain(Unit first, TargetFilter filter, bool harmful, int limit)
        {
            SpellEffectHandler firstHandler = FirstHandler;
            WorldObject        caster       = firstHandler.Cast.CasterObject;
            Spell spell = firstHandler.Cast.Spell;

            first.IterateEnvironment(firstHandler.GetRadius(), target =>
            {
                if ((spell.FacingFlags & SpellFacingFlags.RequiresInFront) != 0 && caster != null &&
                    !target.IsInFrontOf(caster) || (target == caster || target == first || caster == null) ||
                    (harmful && !caster.MayAttack(target) ||
                     !harmful && !caster.IsInSameDivision(target) ||
                     ValidateTarget(target, filter) != SpellFailedReason.Ok))
                {
                    return(true);
                }
                AddOrReplace(target, limit);
                return(true);
            });
            if (TargetEvaluator != null)
            {
                return;
            }
            Sort((a, b) =>
                 a.GetDistanceSq(first).CompareTo(b.GetDistanceSq(first)));
            if (Count <= limit)
            {
                return;
            }
            RemoveRange(limit, Count - limit);
        }
Esempio n. 8
0
 // todo: export combat filtering class.
 public static bool PassFiltering(TargetFilter filter, CombatAction e)
 {
     return((filter == TargetFilter.Enemies && e.target && e.source.data.alliance != e.target.data.alliance) ||
            (filter == TargetFilter.All) ||
            (filter == TargetFilter.AlliesAll && e.target && e.source.data.alliance == e.target.data.alliance) ||
            (filter == TargetFilter.AlliesOther && e.target && e.target != e.source && e.source.data.alliance == e.target.data.alliance) ||
            (filter == TargetFilter.Self && e.target && e.target == e.source));
 }
Esempio n. 9
0
 public override void OnReloaded()
 {
     NavigationNode.Clear();
     NodeCondition.Clear();
     NodeAction.Clear();
     AITarget.Clear();
     TargetFilter.Clear();
 }
Esempio n. 10
0
 /// <summary>
 ///     Search user in Pixiv.
 /// </summary>
 /// <param name="keyword">The text in searching</param>
 /// <param name="userSortOption">The <see cref="UserSortOption" /> enum as date ascending or descending.</param>
 /// <param name="targetFilter">The <see cref="TargetFilter" /> option targeting android or ios</param>
 /// <returns>
 ///     The <see cref="UserSearchEngine" /> containing the search results for users.
 /// </returns>
 public IFetchEngine <User> SearchUser(
     string keyword,
     UserSortOption userSortOption = UserSortOption.DateDescending,
     TargetFilter targetFilter     = TargetFilter.ForAndroid)
 {
     EnsureNotCancelled();
     return(new UserSearchEngine(this, targetFilter, userSortOption, keyword, new EngineHandle(CancelInstance)));
 }
Esempio n. 11
0
        private static Composite FindTarget(CanRunDecoratorDelegate cond, TargetFilter filter, RefineFilter refineFilter, Comparison <HealableUnit> compare, string label, params Composite[] children)
        {
            return(new Decorator(
                       cond,
                       new Sequence(

                           // get a target
                           new Action(
                               delegate
            {
                var targetPerformanceTimer = new Stopwatch();   // lets see if we can get some performance on this one.
                targetPerformanceTimer.Start();                 // lets see if we can get some performance on this one.

                //CrabbyProfiler.Instance.Runs.Add(new Run("FindTarget"));

                // Nothing to filter against
                if (!UnitsFilter(filter).Any())
                {
                    HealableUnit.HealTarget = null;
                    return RunStatus.Failure;
                }

                // Filter the Healable Units
                var raid = UnitsFilter(filter).Where(x => x != null && (ObjectManager.ObjectList.Any(y => y.Guid == x.ToUnit().Guid) && refineFilter(x)) && x.ToUnit().Distance2DSqr < 40 * 40 && !x.ToUnit().ToPlayer().IsGhost&& !x.ToUnit().HasAura("Deep Corruption")).ToList();

                // Nothing to heal.
                if (!IsPlayingWoW() || !raid.Any())
                {
                    HealableUnit.HealTarget = null;
                    return RunStatus.Failure;
                }

                raid.Sort(compare);
                var target = raid.FirstOrDefault();
                if (target != null)
                {
                    Log(
                        label,
                        CLULogger.SafeName(target.ToUnit()),
                        target.MaxHealth,
                        target.CurrentHealth,
                        target.MaxHealth - target.CurrentHealth,
                        targetPerformanceTimer.ElapsedMilliseconds);                 // lets see if we can get some performance on this one.

                    //target.ToUnit().Target();
                    HealableUnit.HealTarget = target;
                    return RunStatus.Success;
                }
                HealableUnit.HealTarget = null;

                //CrabbyProfiler.Instance.EndLast();
                return RunStatus.Failure;
            }),
                           new Action(a => StyxWoW.SleepForLagDuration()),

                           // if success, keep going. Else quit sub routine
                           new PrioritySelector(children))));
        }
Esempio n. 12
0
 /// <summary>
 /// Used for Lock picking and opening (with or without keys)
 /// </summary>
 public static void AddItemOrObject(this SpellTargetCollection targets, TargetFilter filter,
                                    ref SpellFailedReason failReason)
 {
     if (targets.Cast.TargetItem != null || targets.Cast.SelectedTarget is GameObject)
     {
         return;
     }
     failReason = SpellFailedReason.BadTargets;
 }
Esempio n. 13
0
 public PostedNovelEngine(
     [NotNull] MakoClient makoClient,
     string uid,
     TargetFilter targetFilter,
     EngineHandle?engineHandle) : base(makoClient, engineHandle)
 {
     _uid          = uid;
     _targetFilter = targetFilter;
 }
Esempio n. 14
0
 /// <summary>
 ///     Request recommended illustrations in Pixiv.
 /// </summary>
 /// <param name="recommendContentType">The <see cref="RecommendationContentType" /> option for illust or manga</param>
 /// <param name="targetFilter">The <see cref="TargetFilter" /> option targeting android or ios</param>
 /// <param name="maxBookmarkIdForRecommend">Max bookmark id for recommendation</param>
 /// <param name="minBookmarkIdForRecentIllust">Min bookmark id for recent illust</param>
 /// <returns>
 ///     The <see cref="RecommendationEngine" /> containing recommended illustrations.
 /// </returns>
 public IFetchEngine <Illustration> Recommendations(
     RecommendationContentType recommendContentType = RecommendationContentType.Illust,
     TargetFilter targetFilter         = TargetFilter.ForAndroid,
     uint?maxBookmarkIdForRecommend    = null,
     uint?minBookmarkIdForRecentIllust = null)
 {
     EnsureNotCancelled();
     return(new RecommendationEngine(this, recommendContentType, targetFilter, maxBookmarkIdForRecommend, minBookmarkIdForRecentIllust, new EngineHandle(CancelInstance)));
 }
Esempio n. 15
0
        public DarkClown() : base("Dark Clown", 4, Civilization.Darkness, 6000, Subtype.BrainJacker)
        {
            Abilities.Add(new BlockerAbility());
            Abilities.Add(new CannotAttackCreaturesAbility());
            Abilities.Add(new CannotAttackPlayersAbility());
            var targetFilter = new TargetFilter();

            Abilities.Add(new WinBattleAbility(new DestroyCreaturesResolvable(targetFilter), targetFilter));
        }
Esempio n. 16
0
    //获取目标节点组
    public static List <NodeItem> SelectTarget(int _player, TargetFilter _filter, NodeItem _origin = null, int _range = 0)
    {
        targetNodes = new List <NodeItem>();

        if (_origin != null)
        {
            targetNodes = BattleManager.instance.map.GetNodeItemsWithinRange(_origin, _range, false);
        }

        //目标类型为单位
        if (_filter.targetType == TargetType.Unit)
        {
            List <Unit> targetUnits;

            if (_filter.allyOrEnemy == AllyOrEnemy.All)
            {
                targetUnits = BattleManager.instance.allUnits;
            }
            else
            {
                //目标为玩家单位
                int side = (_player + (int)_filter.allyOrEnemy) % 2;

                targetUnits = BattleManager.instance.units[side];
            }
            //如果源点存在
            if (_origin != null)
            {
                //移除不在目标单位组的目标节点
                NodeObject obj;
                for (int i = targetNodes.Count - 1; i > 0; i--)
                {
                    obj = targetNodes[i].nodeObject;
                    if (obj == null || obj.GetComponent <NodeObject>().nodeObjectType == NodeObjectType.unit ||
                        !targetUnits.Contains(obj.GetComponent <Unit>()))
                    {
                        targetNodes.RemoveAt(i);
                    }
                }
            }
            else
            {
                //否则直接返回这些单位的所在点
                foreach (Unit item in targetUnits)
                {
                    targetNodes.Add(item.nodeItem);
                }
            }
        }
        else
        {
            //目标类型为节点
        }

        return(targetNodes);
    }
Esempio n. 17
0
 public async Task<IEnumerable<TrendingTag>> GetTrendingTagsAsync(TargetFilter targetFilter)
 {
     EnsureNotCancelled();
     return ((await Resolve<IAppApiEndPoint>().GetTrendingTagsAsync(targetFilter.GetDescription()).ConfigureAwait(false)).TrendTags ?? Enumerable.Empty<TrendingTagResponse.TrendTag>()).Select(t => new TrendingTag
     {
         Tag = t.TagStr,
         Translation = t.TranslatedName,
         Illustration = t.Illust
     });
 }
Esempio n. 18
0
 /// <summary>
 ///     Creates a <see cref="BookmarkEngine" />
 /// </summary>
 /// <param name="makoClient">The <see cref="MakoClient" /> that owns this object</param>
 /// <param name="uid">Id of the user</param>
 /// <param name="privacyPolicy">The privacy option</param>
 /// <param name="targetFilter">Indicates the target API of the fetch operation</param>
 /// <param name="engineHandle"></param>
 public BookmarkEngine(
     MakoClient makoClient,
     string uid,
     PrivacyPolicy privacyPolicy,
     TargetFilter targetFilter,
     EngineHandle?engineHandle = null) : base(makoClient, engineHandle)
 {
     _uid           = uid;
     _privacyPolicy = privacyPolicy;
     _targetFilter  = targetFilter;
 }
Esempio n. 19
0
 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);
     }
 }
Esempio n. 20
0
 public SetupTargets(
     IAbility parent,
     TargetFilter filter,
     TargetNotification notification,
     int priority = 0)
 {
     Parent       = parent;
     Priority     = priority;
     TargetFilter = filter;
     Notification = notification;
 }
Esempio n. 21
0
 public RankingEngine(
     MakoClient makoClient,
     RankOption rankOption,
     DateTime dateTime,
     TargetFilter targetFilter,
     EngineHandle?engineHandle) : base(makoClient, engineHandle)
 {
     _rankOption   = rankOption;
     _dateTime     = dateTime;
     _targetFilter = targetFilter;
 }
Esempio n. 22
0
 public MemberMenuComponent(int index, Object component, string displayName, Type eventType, TargetFilter menuTargetFilters, TargetTypeFilter menuTypeFilters)
 {
     this.index             = index;
     this.component         = component;
     this.displayName       = displayName;
     this.eventType         = eventType;
     this.menuTargetFilters = menuTargetFilters;
     this.menuTypeFilters   = menuTypeFilters;
     // Automatically create members list when new instance of this class is created
     CreateStaticMemberItems(GetValidStaticMembers());
     CreateDynamicMemberItems(GetValidDynamicMembers());
 }
Esempio n. 23
0
            public MissileCoordination(MissileManagement management, IMyTerminalBlock rc, ACPWrapper antennas, TargetFilter tFilter, int targetTimeOutSec = 15)
            {
                this.management       = management;
                this.reference        = rc;
                this.antennas         = antennas;
                this.targetTimeOutSec = targetTimeOutSec;
                this.tFilter          = tFilter;

                targets        = new Dictionary <long, MyDetectedEntityInfo>();
                missileStaging = new List <IEnumerator <bool> >();
                firedMissiles  = new Dictionary <long, MissileManagement.MissileInfo>();
                firedAt        = new Dictionary <long, DateTime>();
            }
Esempio n. 24
0
        public static void IsInFrontOfCaster(SpellEffectHandler effectHandler, WorldObject target,
                                             ref SpellFailedReason failedReason, TargetFilter filter)
        {
            WorldObject casterObject = effectHandler.Cast.CasterObject;

            if (casterObject.IsPlayer && !target.IsInFrontOf(casterObject))
            {
                failedReason = SpellFailedReason.NotInfront;
            }
            else
            {
                filter(effectHandler, target, ref failedReason);
            }
        }
    //効果の処理
    private IEnumerator EffctExecution(BattleCommand battleCommand)
    {
        BattleCharacter        owner         = battleCommand.owner;
        List <BattleCharacter> targets       = battleCommand.target;
        TargetUnit             targetUnit    = battleCommand.GetTargetType().targetUnit;
        PlayableAsset          playableAsset = battleCommand.GetCommand().animation;
        var effects = battleCommand.GetEffect();

        //効果の範囲が全体の場合
        if (battleCommand.GetTargetType().targetRange == TargetRange.全体)
        {
            //敵キャラクタの行動はアニメション表示をしない
            if (owner is PlayerCharacter)
            {
                BattleDirectorController.Instance.AnimationPlay(playableAsset);
            }
        }

        foreach (var effect in effects)
        {
            //単体処理
            foreach (var target in targets)
            {
                //ターゲットが存在しないとき新しいターゲットに変更する
                BattleCharacter newTarget = target;
                if (TargetUnit.死亡者 != targetUnit && target.IsDead())
                {
                    TargetFilter targetFilter = new TargetFilter();
                    newTarget = targetFilter.Auto(battleCommand);
                }

                //効果の処理
                if (battleCommand.GetTargetType().targetRange == TargetRange.単体)
                {
                    //敵キャラクタの行動はアニメション表示をしない
                    if (owner is PlayerCharacter)
                    {
                        BattleDirectorController.Instance.AnimationPlay(playableAsset, newTarget.transform);
                    }
                }

                effect.Use(owner, newTarget);
                //演出を再生する
                yield return(BattleDirectorController.Instance.Play());
            }
        }
        yield break;
    }
Esempio n. 26
0
		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);
			}
		}
Esempio n. 27
0
 public SCard_AcraneExplosion() : base("Acrane Explosion", 2)
 {
     filter = (int pattern, TargetObject x) => {
         if ((pattern & Action.OPP) == 0)
         {
             return(false);
         }
         if ((pattern & Action.BOARD) == 0)
         {
             return(false);
         }
         return(x is Monster);
     };
     fixer = (TargetObject x) => {
         (x as Monster).TakeDamage(1);
     };
 }
Esempio n. 28
0
        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);
            }
        }
Esempio n. 29
0
        /// <summary>
        /// Adds all chained units around the selected unit to the list
        /// </summary>
        public void FindChain(Unit first, TargetFilter filter, bool harmful, int limit)
        {
            var handler = FirstHandler;
            var caster  = handler.Cast.CasterObject;
            var spell   = handler.Cast.Spell;

            first.IterateEnvironment(handler.GetRadius(), target =>
            {
                if ((spell.FacingFlags & SpellFacingFlags.RequiresInFront) != 0 &&
                    caster != null &&
                    !target.IsInFrontOf(caster))
                {
                    return(true);
                }
                if (target != caster &&
                    target != first)
                {
                    if (caster == null)
                    {
                        // TODO: Add chain targets, even if there is no caster
                        return(true);
                    }
                    else if ((harmful && !caster.MayAttack(target)) ||
                             (!harmful && !caster.IsInSameDivision(target)))
                    {
                        return(true);
                    }
                    if (ValidateTarget(target, filter) == SpellFailedReason.Ok)
                    {
                        AddOrReplace(target, limit);
                    }
                    //return Count < limit;
                }
                return(true);
            });

            if (TargetEvaluator == null)
            {
                Sort((a, b) => a.GetDistanceSq(first).CompareTo(b.GetDistanceSq(first)));
                if (Count > limit)
                {
                    RemoveRange(limit, Count - limit);
                }
            }
        }
Esempio n. 30
0
        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;
                }
            }
        }
Esempio n. 31
0
        /// <summary>
        /// Removes all targets that don't satisfy the effects' constraints
        /// </summary>
        public void RevalidateAll()
        {
            SpellEffectHandler firstHandler = this.FirstHandler;
            SpellCast          cast         = firstHandler.Cast;

            for (int index = this.Count - 1; index >= 0; --index)
            {
                WorldObject target = this[index];
                if (target.IsInWorld)
                {
                    TargetDefinition targetDefinition = firstHandler.Effect.GetTargetDefinition();
                    if (targetDefinition != null)
                    {
                        if (this.ValidateTarget(target, targetDefinition.Filter) == SpellFailedReason.Ok)
                        {
                            continue;
                        }
                    }
                    else if (this.ValidateTarget(target,
                                                 DefaultTargetDefinitions.GetTargetFilter(firstHandler.Effect.ImplicitTargetA)) ==
                             SpellFailedReason.Ok)
                    {
                        TargetFilter targetFilter =
                            DefaultTargetDefinitions.GetTargetFilter(firstHandler.Effect.ImplicitTargetB);
                        if (targetFilter != null)
                        {
                            SpellFailedReason failReason = SpellFailedReason.Ok;
                            targetFilter(firstHandler, target, ref failReason);
                            if (failReason == SpellFailedReason.Ok)
                            {
                                continue;
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                }

                this.RemoveAt(index);
            }
        }
Esempio n. 32
0
		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);
		}
Esempio n. 33
0
		/// <summary>
		/// Composites the given filter into the existing filter
		/// </summary>
		public void AddFilter(TargetFilter filter)
		{
			if (Filter == null)
			{
				Filter = filter;
			}
			else
			{
				// create new filter that filters through both filters
				var oldFilter = Filter;
				Filter = (SpellEffectHandler effectHandler, WorldObject target, ref SpellFailedReason failReason) =>
				{
					oldFilter(effectHandler, target, ref failReason);
					if (failReason == SpellFailedReason.Ok)
					{
						filter(effectHandler, target, ref failReason);
					}
				};
			}
		}
Esempio n. 34
0
        private static Composite FindTarget(CanRunDecoratorDelegate cond, TargetFilter filter, RefineFilter refineFilter, Comparison<HealableUnit> compare, string label, params Composite[] children)
        {
            return new Decorator(
                       cond,
                       new Sequence(
                         // get a target
                           new Action(
                            delegate
                            {
                                var targetPerformanceTimer = new Stopwatch(); // lets see if we can get some performance on this one.
                                targetPerformanceTimer.Start(); // lets see if we can get some performance on this one.

                                //CrabbyProfiler.Instance.Runs.Add(new Run("FindTarget"));

                                // Nothing to filter against
                                if (!UnitsFilter(filter).Any())
                                {
                                    HealableUnit.HealTarget = null;
                                    return RunStatus.Failure;
                                }

                                // Filter the Healable Units
                                var raid = UnitsFilter(filter).Where(x => x != null && (ObjectManager.ObjectList.Any(y => y.Guid == x.ToUnit().Guid) && refineFilter(x)) && x.ToUnit().Distance2DSqr < 40 * 40 && !x.ToUnit().ToPlayer().IsGhost && !x.ToUnit().HasAura("Deep Corruption")).ToList();

                                // Nothing to heal.
                                if (!IsPlayingWoW() || !raid.Any())
                                {
                                    HealableUnit.HealTarget = null;
                                    return RunStatus.Failure;
                                }

                                raid.Sort(compare);
                                var target = raid.FirstOrDefault();
                                if (target != null)
                                {
                                    Log(
                                        label,
                                        CLULogger.SafeName(target.ToUnit()),
                                        target.MaxHealth,
                                        target.CurrentHealth,
                                        target.MaxHealth - target.CurrentHealth,
                                        targetPerformanceTimer.ElapsedMilliseconds); // lets see if we can get some performance on this one.

                                    //target.ToUnit().Target();
                                    HealableUnit.HealTarget = target;
                                    return RunStatus.Success;
                                }
                                HealableUnit.HealTarget = null;
                                //CrabbyProfiler.Instance.EndLast();
                                return RunStatus.Failure;
                            }),
                           new Action(a => StyxWoW.SleepForLagDuration()),
                // if success, keep going. Else quit sub routine
                           new PrioritySelector(children)));
        }
Esempio n. 35
0
		//public static void AddOwnPet(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason)
		//{
		//    var chr = targets.Cast.Caster as Character;
		//    if (chr != null)
		//    {
		//        var pet = chr.ActivePet;
		//        if (pet != null)
		//        {
		//            foreach (var handler in targets.m_handlers)
		//            {
		//                if ((failReason = handler.CheckValidTarget(pet)) != SpellFailedReason.Ok)
		//                {
		//                    return;
		//                }
		//            }
		//            targets.Add(pet);
		//        }
		//        else
		//        {
		//            failReason = SpellFailedReason.BadTargets;
		//        }
		//    }
		//    else
		//    {
		//        log.Warn("NPC \"{0}\" used Spell with Pet-Target.", targets.Cast.Caster);
		//        failReason = SpellFailedReason.BadTargets;
		//    }
		//}
		#endregion

		#region Selection
		/// <summary>
		/// Adds the object or unit that has been chosen by a player when the spell was casted
		/// </summary>
		/// <param name="targets"></param>
		public static void AddSelection(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason)
		{
			AddSelection(targets, filter, ref  failReason, false);
		}
Esempio n. 36
0
		/// <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;
			}
		}
Esempio n. 37
0
		/// <summary>
		/// Your current summon or self
		/// </summary>
		public static void AddSummon(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason)
		{
			// if (Handler.SpellCast.Caster.Summon == null)
			targets.AddSelf(filter, ref failReason);
		}
Esempio n. 38
0
		/// <summary>
		/// Used for Lock picking and opening (with or without keys)
		/// </summary>
		public static void AddItemOrObject(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason)
		{
			if (targets.Cast.TargetItem == null && !(targets.Cast.Selected is GameObject))
			{
				failReason = SpellFailedReason.BadTargets;
			}
		}
Esempio n. 39
0
		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;
				}
			}
		}
Esempio n. 40
0
		public static void AddTargetsInArea(this SpellTargetCollection targets, Vector3 pos, TargetFilter targetFilter, float radius)
		{
			var handler = targets.FirstHandler;
			var spell = handler.Effect.Spell;
			var cast = handler.Cast;

			int limit;
			if (spell.MaxTargetEffect != null)
			{
				limit = spell.MaxTargetEffect.CalcEffectValue(cast.CasterReference);
			}
			else
			{
				//if IsAllied (used by group/raid spell targeting) it's save to asume the limit is the raid max size (40 players) since some spells have wrong dbc values
				if (targetFilter == DefaultTargetFilters.IsAllied)
				{
					limit = 40;
				}
				else
					limit = (int)spell.MaxTargets;
			}

			if (limit < 1)
			{
				limit = int.MaxValue;
			}

			cast.Map.IterateObjects(pos, radius > 0 ? radius : 5, cast.Phase,
				obj =>
				{
					// AoE spells only make sense on Unit targets (at least there is no known spell that does anything else)
					if (obj is Unit && targets.ValidateTarget(obj, targetFilter) == SpellFailedReason.Ok)
					{
						return targets.AddOrReplace(obj, limit);
					}
					return true;
				});
		}
Esempio n. 41
0
		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);
			}
		}
Esempio n. 42
0
		public static void AddAreaDest(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason, float radius)
		{
			targets.AddTargetsInArea(targets.Cast.TargetLoc, filter, radius);
		}
Esempio n. 43
0
		/// <summary>
		/// Adds targets around the target area
		/// </summary>
		public static void AddAreaDest(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason)
		{
			AddAreaDest(targets, filter, ref  failReason, targets.FirstHandler.GetRadius());
		}
Esempio n. 44
0
        private static IEnumerable<HealableUnit> UnitsFilter(TargetFilter filter)
        {
            var mobs = new List<WoWPlayer>();

            if (HealableUnit.ListofHealableUnits != null)
            {
                List<HealableUnit> grp = HealableUnit.ListofHealableUnits.ToList();

                switch (filter)
                {
                    case TargetFilter.None:
                        {
                            return grp.Where(x => x != null && !x.Blacklisted).Select(n => n);
                        }

                    case TargetFilter.Tanks:
                        {
                            return grp.Where(x => x != null && (x.Tank && !x.Blacklisted)).Select(t => t);
                        }

                    case TargetFilter.Healers:
                        {

                            return grp.Where(x => x != null && (x.Healer && !x.Blacklisted)).Select(h => h);
                        }

                    case TargetFilter.Damage:
                        {
                            return grp.Where(x => x != null && (x.Damage && !x.Blacklisted)).Select(d => d);
                        }

                    //// PvP Based targeting...
                    //case TargetFilter.EnemyHealers:
                    //    {
                    //        var enemyHealers = hostile.Where(x => x.IsPlayer && x.DistanceSqr < 30 * 30 && x.InLineOfSpellSight && x.IsCasting && Unit.HealerSpells.Contains(x.CastingSpell.Name));
                    //        return mobs.Where(x => enemyHealers.Any(y => y.Guid == x.Guid));
                    //    }

                    //case TargetFilter.FlagCarrier:
                    //    {
                    //        var flagCarriers = hostile.Where(x => x.IsPlayer && x.DistanceSqr < 30 * 30 && x.InLineOfSpellSight && (Me.IsHorde ? x.HasAura("Alliance Flag") : x.HasAura("Horde Flag")));
                    //        return mobs.Where(x => flagCarriers.Any(y => y.Guid == x.Guid));
                    //    }

                    //case TargetFilter.Threats:
                    //    {
                    //        var threats = hostile.Where(x => x.IsPlayer && x.DistanceSqr < 15 * 15 && x.InLineOfSpellSight && x.IsTargetingMeOrPet);
                    //        return mobs.Where(x => threats.Any(y => y.Guid == x.Guid));
                    //    }

                    //case TargetFilter.LowHealth:
                    //    {
                    //        var lowhealthers = hostile.Where(x => x.IsPlayer && x.DistanceSqr < 15 * 15 && x.InLineOfSpellSight && x.HealthPercent < 30);
                    //        return mobs.Where(x => lowhealthers.Any(y => y.Guid == x.Guid));
                    //    }

                    default:
                        return null;
                }
            }
            return null;
        }
Esempio n. 45
0
 public void DrawEditor()
 {
     targetType = (TargetType)EditorGUILayout.EnumPopup("Target Type", targetType);
     targetFilter = (TargetFilter)EditorGUILayout.EnumPopup("Target Filter", targetFilter);
     targetRange = (TargetRange)EditorGUILayout.EnumPopup("Target Range", targetRange);
     if (targetRange == TargetRange.Range)
     {
         range = EditorGUILayout.IntField("Range", range);
     }
     else
     {
         range = 1;
         EditorGUILayout.LabelField("Range value is 1 for melee spells");
     }
     targetAOE = (TargetAOE)EditorGUILayout.EnumPopup("Target AOE", targetAOE);
     for (int i = 0; i < protoEvents.Count; i++)
     {
         protoEvents[i].DrawEditor();
     }
 }
Esempio n. 46
0
		public static void AddObject(this SpellTargetCollection targets, TargetFilter filter, ref SpellFailedReason failReason)
		{
			if (!(targets.Cast.Selected is GameObject))
			{
				failReason = SpellFailedReason.BadTargets;
			}
			else
			{
				targets.Add(targets.Cast.Selected);
			}
		}
Esempio n. 47
0
		public static void IsInFrontOfCaster(SpellEffectHandler effectHandler, WorldObject target, ref SpellFailedReason failedReason, TargetFilter filter)
		{
			var caster = effectHandler.Cast.CasterObject;
			if (caster.IsPlayer && !target.IsInFrontOf(caster))
			{
				failedReason = SpellFailedReason.NotInfront;
			}
			else
			{
				filter(effectHandler, target, ref failedReason);
			}
		}
Esempio n. 48
0
		/// <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.Selected;
			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);
					}
				}
			}
		}