Пример #1
0
        public static bool CanHeroEvade(this Spell spell, Obj_AI_Base hero, out float rEvadeTime,
                                        out float rSpellHitTime)
        {
            var   heroPos      = hero.ServerPosition.To2D();
            float evadeTime    = 0;
            float spellHitTime = 0;
            var   speed        = hero.MoveSpeed;
            float delay        = 0;

            var moveBuff = EvadeSpell.evadeSpells.OrderBy(s => s.dangerlevel)
                           .FirstOrDefault(s => s.evadeType == EvadeType.MovementSpeedBuff);

            if (moveBuff != null && EvadeSpell.ShouldUseMovementBuff(spell))
            {
                speed += speed * moveBuff.speedArray[
                    ObjectManager.GetLocalPlayer().GetSpell(moveBuff.spellKey).Level - 1] / 100;
                delay += (moveBuff.spellDelay > 50 ? moveBuff.spellDelay : 0) + ObjectCache.gamePing;
            }

            if (spell.spellType == SpellType.Line)
            {
                var projection = heroPos.ProjectOn(spell.startPos, spell.endPos).SegmentPoint;
                evadeTime    = 1000 * (spell.radius - heroPos.Distance(projection) + hero.BoundingRadius) / speed;
                spellHitTime = spell.GetSpellHitTime(projection);
            }
            else if (spell.spellType == SpellType.Circular)
            {
                evadeTime    = 1000 * (spell.radius - heroPos.Distance(spell.endPos)) / speed;
                spellHitTime = spell.GetSpellHitTime(heroPos);
            }
            else if (spell.spellType == SpellType.Cone)
            {
                var sides = new[]
                {
                    heroPos.ProjectOn(spell.cnStart, spell.cnLeft).SegmentPoint,
                    heroPos.ProjectOn(spell.cnLeft, spell.cnRight).SegmentPoint,
                    heroPos.ProjectOn(spell.cnRight, spell.cnStart).SegmentPoint
                };

                var p = sides.OrderBy(x => x.Distance(x)).First();
                evadeTime    = 1000 * (spell.info.range / 2 - heroPos.Distance(p) + hero.BoundingRadius) / speed;
                spellHitTime = spell.GetSpellHitTime(heroPos);
            }

            rEvadeTime    = evadeTime;
            rSpellHitTime = spellHitTime;

            return(spellHitTime - delay > evadeTime);
        }