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; float speed = hero.MoveSpeed; 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.Player.GetSpell(moveBuff.spellKey).Level - 1] / 100; } 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); } rEvadeTime = evadeTime; rSpellHitTime = spellHitTime; return(spellHitTime > evadeTime); }
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; float 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.Player.GetSpell(moveBuff.spellKey).Level - 1] / 100; //delay += moveBuff.spellDelay; 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 > evadeTime + delay); }
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; if (spell.spellType == SpellType.Line) { var projection = heroPos.ProjectOn(spell.startPos, spell.endPos).SegmentPoint; evadeTime = 1000 * (spell.radius - heroPos.Distance(projection) + hero.BoundingRadius) / hero.MoveSpeed; spellHitTime = spell.GetSpellHitTime(projection); } else if (spell.spellType == SpellType.Circular) { evadeTime = 1000 * (spell.radius - heroPos.Distance(spell.endPos)) / hero.MoveSpeed; spellHitTime = spell.GetSpellHitTime(heroPos); } rEvadeTime = evadeTime; rSpellHitTime = spellHitTime; return(spellHitTime > evadeTime); }
public static bool CheckWindupTime(float windupTime) { foreach (KeyValuePair <int, Spell> entry in SpellDetector.spells) { Spell spell = entry.Value; var hitTime = spell.GetSpellHitTime(ObjectCache.myHeroCache.serverPos2D); if (hitTime < windupTime) { return(true); } } return(false); }