コード例 #1
0
        private static void GameObject_OnDestroy(GameObject sender)
        {
            if (sender == null || !sender.IsValid)
            {
                return;
            }

            var mc = sender as MissileClient;

            if (mc == null || mc.SpellCaster == null || mc.SpellCaster.IsMelee || mc.SpellCaster is Obj_AI_Hero)
            {
                return;
            }

            var target = mc.Target as Obj_AI_Base;

            if (target == null)
            {
                return;
            }

            var attacks = Attacks.GetOutBoundAttacks(mc.SpellCaster.NetworkId);

            //Might be destroying too eearly, attack may not land when missile destroyed
            //add the missile to the attack object
            var attack = attacks?.Where(x => x.Target.NetworkId == mc.Target.NetworkId && x.AttackStatus != AutoAttack.AttackState.Completed).MinBy(x => x.DetectTime);

            if (attack != null)
            {
                if (attack is RangedAttack rangedAttack)
                {
                    rangedAttack.MissileDestroyed();
                }
            }
        }
コード例 #2
0
        private void GameObject_OnDestroy(GameObject sender)
        {
            if (sender == null || !sender.IsValid)
            {
                return;
            }

            var mc = sender as MissileClient;

            if (mc == null || mc.SpellCaster == null || mc.SpellCaster.IsMelee || mc.SpellCaster is Obj_AI_Hero)
            {
                return;
            }

            var target = mc.Target as Obj_AI_Base;

            if (target == null)
            {
                return;
            }

            var attacks = Attacks.GetOutBoundAttacks(mc.SpellCaster.NetworkId);

            var attack = attacks?.Where(x => x.Target.NetworkId == mc.Target.NetworkId && x.AttackStatus != AutoAttack.AttackState.Completed && x is RangedAttack).MinBy(x => x.DetectTime);

            if (attack != null)
            {
                var rattack = attack as RangedAttack;
                if (rattack != null)
                {
                    rattack.AttackStatus = AutoAttack.AttackState.Completed;
                }
            }
        }
コード例 #3
0
        private void GameObject_OnCreate(GameObject gsender)
        {
            if (gsender == null || !gsender.IsValid)
            {
                return;
            }

            var mc = gsender as MissileClient;

            if (mc == null || !mc.IsValid || mc.Target == null || !mc.Target.IsValid)
            {
                return;
            }

            var sender = mc.SpellCaster;

            var target = mc.Target as Obj_AI_Minion;

            if (sender == null || !sender.IsValid || sender.IsMelee || sender is Obj_AI_Hero)
            {
                return;
            }

            if (target == null || !target.IsValid)
            {
                return;
            }

            //Ignore the missile if it is not an auto attack...
            if (!mc.SpellData.Name.ToLower().Contains("attack"))
            {
                return;
            }

            var attacks = Attacks.GetOutBoundAttacks(mc.SpellCaster.NetworkId);

            if (attacks != null)
            {
                var attack = attacks.MaxBy(x => x.DetectTime);
                if (attack != null)
                {
                    if (attack is RangedAttack rangedAttack)
                    {
                        rangedAttack.MissileCreated(mc);
                    }
                }
            }
        }
コード例 #4
0
        private void SpellBook_OnStopCast(Obj_AI_Base sender, SpellBookStopCastEventArgs e)
        {
            if (sender == null || !sender.IsValid)
            {
                return;
            }

            var ob = Attacks.GetOutBoundAttacks(sender.NetworkId);

            if (ob != null)
            {
                //Remove any pending attacks or attacks in progress because the auto attack was cancelled
                if (e.StopAnimation || e.ForceStop || e.DestroyMissile)
                {
                    ob.Clear();
                }
            }
        }
コード例 #5
0
        private void Obj_AI_Base_OnPerformCast(Obj_AI_Base sender, Obj_AI_BaseMissileClientDataEventArgs e)
        {
            if (sender != null && sender.IsValid && sender.IsMelee)
            {
                var ob = Attacks.GetOutBoundAttacks(sender.NetworkId);
                if (ob != null)
                {
                    var attacks = ob.Where(x => x.AttackStatus != AutoAttack.AttackState.Completed);

                    //Get the oldest attack
                    var attack = attacks.MinBy(x => x.DetectTime);

                    if (attack != null)
                    {
                        attack.AttackStatus = AutoAttack.AttackState.Completed;
                    }
                }
            }
        }
コード例 #6
0
        private void SpellBook_OnStopCast(Obj_AI_Base sender, SpellBookStopCastEventArgs e)
        {
            if (sender == null || !sender.IsValid)
            {
                return;
            }

            var ob = Attacks.GetOutBoundAttacks(sender.NetworkId);

            if (ob != null)
            {
                //Remove any pending attacks or attacks in progress because the auto attack was cancelled
                if (e.StopAnimation || e.ForceStop || e.DestroyMissile)
                {
                    foreach (var attack in ob)
                    {
                        if (attack.AttackStatus == AutoAttack.AttackState.Completed)
                        {
                            continue;
                        }

                        attack.Completed();

                        var rattack = attack as RangedAttack;

                        if (rattack == null)
                        {
                            continue;
                        }

                        if (e.DestroyMissile)
                        {
                            rattack.MissileDestroyed();
                        }
                    }
                }
            }
        }