private void SpellDetector_OnProcessDetectedSpells() { GameData.HeroInfo.UpdateInfo(); if (!ConfigValue.DodgeSkillShots.GetBool()) { LastPosInfo = PositionInfo.SetAllUndodgeable(); EvadeSpell.UseEvadeSpell(); return; } if (GameData.HeroInfo.ServerPos2D.CheckDangerousPos(0) || GameData.HeroInfo.ServerPos2DExtra.CheckDangerousPos(0)) { if (EvadeSpell.PreferEvadeSpell()) { LastPosInfo = PositionInfo.SetAllUndodgeable(); } else { var calculationTimer = EvadeUtils.TickCount; var posInfo = EvadeHelper.GetBestPosition(); var caculationTime = EvadeUtils.TickCount - calculationTimer; if (NumCalculationTime > 0) { SumCalculationTime += caculationTime; AvgCalculationTime = SumCalculationTime/NumCalculationTime; } NumCalculationTime += 1; //ConsoleDebug.WriteLine("CalculationTime: " + caculationTime); /*if (EvadeHelper.GetHighestDetectedSpellID() > EvadeHelper.GetHighestSpellID(posInfo)) { return; }*/ if (posInfo != null) { LastPosInfo = posInfo.CompareLastMovePos(); var travelTime = GameData.HeroInfo.ServerPos2DPing.Distance(LastPosInfo.Position)/GameData.MyHero.MoveSpeed; LastPosInfo.EndTime = EvadeUtils.TickCount + travelTime*1000 - 100; } CheckHeroInDanger(); DodgeSkillShots(); //walking CheckLastMoveTo(); EvadeSpell.UseEvadeSpell(); //using spells } } else { LastPosInfo = PositionInfo.SetAllDodgeable(); CheckLastMoveTo(); } //ConsoleDebug.WriteLine("SkillsDodged: " + lastPosInfo.dodgeableSpells.Count + " DangerLevel: " + lastPosInfo.undodgeableSpells.Count); }
private void RecalculatePath() { if (ConfigValue.RecalculatePath.GetBool() && IsDodging) //recheck path { if (LastPosInfo != null && !LastPosInfo.RecalculatedPath) { var path = GameData.MyHero.Path; if (path.Length > 0) { var movePos = path.Last().To2D(); if (movePos.Distance(LastPosInfo.Position) < 5) //more strict checking { var posInfo = EvadeHelper.CanHeroWalkToPos(movePos, GameData.HeroInfo.MoveSpeed, 0, 0, false); if (posInfo.PosDangerCount > LastPosInfo.PosDangerCount) { LastPosInfo.RecalculatedPath = true; if (EvadeSpell.PreferEvadeSpell()) { LastPosInfo = PositionInfo.SetAllUndodgeable(); } else { var newPosInfo = EvadeHelper.GetBestPosition(); if (newPosInfo.PosDangerCount < posInfo.PosDangerCount) { LastPosInfo = newPosInfo; CheckHeroInDanger(); DodgeSkillShots(); } } } } } } } }
public static void SetAllUndodgeable() { LastPosInfo = PositionInfo.SetAllUndodgeable(); }
private void Game_OnCastSpell(Spellbook spellbook, SpellbookCastSpellEventArgs args) { if (!spellbook.Owner.IsMe) return; var sData = spellbook.GetSpell(args.Slot); string name; if (SpellDetector.ChanneledSpells.TryGetValue(sData.Name, out name)) { //Evade.isChanneling = true; //Evade.channelPosition = GameData.HeroInfo.serverPos2D; LastStopEvadeTime = EvadeUtils.TickCount + Game.Ping + 100; } if (EvadeSpell.LastSpellEvadeCommand != null && EvadeSpell.LastSpellEvadeCommand.Timestamp + Game.Ping + 150 > EvadeUtils.TickCount) { args.Process = false; } LastSpellCast = args.Slot; LastSpellCastTime = EvadeUtils.TickCount; //moved from processPacket /*if (args.Slot == SpellSlot.Recall) { lastStopPosition = GameData.MyHero.ServerPosition.To2D(); }*/ if (Situation.ShouldDodge()) { if (IsDodging && SpellDetector.Spells.Count() > 0) { foreach (KeyValuePair<String, SpellData> entry in SpellDetector.WindupSpells) { SpellData spellData = entry.Value; if (spellData.SpellKey == args.Slot) //check if it's a spell that we should block { args.Process = false; return; } } } } foreach (var evadeSpell in EvadeSpell.EvadeSpells) { if (evadeSpell.IsItem == false && evadeSpell.SpellKey == args.Slot) { if (evadeSpell.EvadeType == EvadeType.Blink || evadeSpell.EvadeType == EvadeType.Dash) { //Block spell cast if flashing/blinking into spells if (args.EndPosition.To2D().CheckDangerousPos(6, true)) //for blink + dash { args.Process = false; return; } if (evadeSpell.EvadeType == EvadeType.Dash) { var extraDelayBuffer = Config.Properties.GetInt(ConfigValue.ExtraPingBuffer); var extraDist = Config.Properties.GetInt(ConfigValue.ExtraCpaDistance); var dashPos = Game.CursorPos.To2D(); //real pos? if (evadeSpell.FixedRange) { var dir = (dashPos - GameData.MyHero.ServerPosition.To2D()).Normalized(); dashPos = GameData.MyHero.ServerPosition.To2D() + dir * evadeSpell.Range; } //Draw.RenderObjects.Add(new Draw.RenderPosition(dashPos, 1000)); var posInfo = EvadeHelper.CanHeroWalkToPos(dashPos, evadeSpell.Speed, extraDelayBuffer + Game.Ping, extraDist); if (posInfo.PosDangerLevel > 0) { args.Process = false; return; } } LastPosInfo = PositionInfo.SetAllUndodgeable(); //really? if (IsDodging || EvadeUtils.TickCount < LastDodgingEndTime + 500) { EvadeCommand.MoveTo(Game.CursorPos.To2D()); //block moveto LastStopEvadeTime = EvadeUtils.TickCount + Game.Ping + 100; } } return; } } }