public static void UpdateSpellInfo(this Spell spell) { spell.currentSpellPosition = spell.GetCurrentSpellPosition(); spell.currentNegativePosition = spell.GetCurrentSpellPosition(true, 0); spell.dangerlevel = spell.GetSpellDangerLevel(); spell.radius = spell.GetSpellRadius(); }
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.info.spellType == SpellType.Line) { var projection = heroPos.ProjectOn(spell.startPos, spell.endPos).SegmentPoint; evadeTime = 1000 * (spell.GetSpellRadius() - heroPos.Distance(projection) + hero.BoundingRadius) / hero.MoveSpeed; spellHitTime = spell.GetSpellHitTime(projection); } else if (spell.info.spellType == SpellType.Circular) { evadeTime = 1000 * (spell.GetSpellRadius() - heroPos.Distance(spell.endPos) + hero.BoundingRadius) / hero.MoveSpeed; spellHitTime = spell.GetSpellHitTime(heroPos); } rEvadeTime = evadeTime; rSpellHitTime = spellHitTime; return(spellHitTime > evadeTime); }
public static BoundingBox GetLinearSpellBoundingBox(this Spell spell) { var myBoundingRadius = Evade.myHero.BoundingRadius; var spellDir = spell.direction; var pSpellDir = spell.direction.Perpendicular(); var spellRadius = spell.GetSpellRadius(); var spellPos = spell.GetCurrentSpellPosition() - spellDir * myBoundingRadius; //leave some space at back of spell var endPos = spell.endPos + spellDir * myBoundingRadius; //leave some space at the front of spell var startRightPos = spellPos + pSpellDir * (spellRadius + myBoundingRadius); var endLeftPos = endPos - pSpellDir * (spellRadius + myBoundingRadius); return(new BoundingBox(new Vector3(endLeftPos.X, endLeftPos.Y, -1), new Vector3(startRightPos.X, startRightPos.Y, 1))); }
public static void CreateSpellData(Obj_AI_Base hero, Vector3 spellStartPos, Vector3 spellEndPos, SpellData spellData, GameObject obj = null, float extraEndTick = 0.0f, bool processSpell = true, SpellType spellType = SpellType.None, bool checkEndExplosion = true, float spellRadius = 0) { if (checkEndExplosion && spellData.hasEndExplosion) { CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, false, spellData.spellType, false); CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, true, SpellType.Circular, false); return; } if (spellStartPos.Distance(myHero.Position) < spellData.range + 1000) { Vector2 startPosition = spellStartPos.To2D(); Vector2 endPosition = spellEndPos.To2D(); Vector2 direction = (endPosition - startPosition).Normalized(); float endTick = 0; if (spellType == SpellType.None) { spellType = spellData.spellType; } if (spellData.fixedRange) //for diana q { if (endPosition.Distance(startPosition) > spellData.range) { //var heroCastPos = hero.ServerPosition.To2D(); //direction = (endPosition - heroCastPos).Normalized(); endPosition = startPosition + direction * spellData.range; } } if (spellType == SpellType.Line) { endTick = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; endPosition = startPosition + direction * spellData.range; if (spellData.useEndPosition) { var range = spellEndPos.To2D().Distance(spellStartPos.To2D()); endTick = spellData.spellDelay + (range / spellData.projectileSpeed) * 1000; endPosition = spellEndPos.To2D(); } if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellType == SpellType.Circular) { endTick = spellData.spellDelay; if (spellData.projectileSpeed == 0) { endPosition = hero.ServerPosition.To2D(); } else if (spellData.projectileSpeed > 0) { if (spellData.spellType == SpellType.Line && spellData.hasEndExplosion && spellData.useEndPosition == false) { endPosition = startPosition + direction * spellData.range; } endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; } } else if (spellType == SpellType.Arc) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellType == SpellType.Cone) { return; } else { return; } endTick += extraEndTick; Spell newSpell = new Spell(); newSpell.startTime = EvadeUtils.TickCount; newSpell.endTime = EvadeUtils.TickCount + endTick; newSpell.startPos = startPosition; newSpell.endPos = endPosition; newSpell.height = spellEndPos.Z + spellData.extraDrawHeight; newSpell.direction = direction; newSpell.heroID = hero.NetworkId; newSpell.info = spellData; newSpell.spellType = spellType; newSpell.radius = spellRadius > 0 ? spellRadius : newSpell.GetSpellRadius(); if (obj != null) { newSpell.spellObject = obj; newSpell.projectileID = obj.NetworkId; } int spellID = CreateSpell(newSpell, processSpell); DelayAction.Add((int)(endTick + spellData.extraEndTime), () => DeleteSpell(spellID)); } }
public static void CreateSpellData(Obj_AI_Base hero, Vector3 spellStartPos, Vector3 spellEndPos, SpellData spellData, GameObject obj = null, float extraEndTick = 0.0f, bool processSpell = true, SpellType spellType = SpellType.None, bool checkEndExplosion = true, float spellRadius = 0) { if (checkEndExplosion && spellData.hasEndExplosion) { CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, false, spellData.spellType, false); CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, true, SpellType.Circular, false); return; } if (spellStartPos.Distance(myHero.Position) < spellData.range + 1000) { var startPosition = spellStartPos.To2D(); var endPosition = spellEndPos.To2D(); var direction = (endPosition - startPosition).Normalized(); var endTick = 0f; if (spellType == SpellType.None) { spellType = spellData.spellType; } if (spellData.fixedRange) //for diana q { if (endPosition.Distance(startPosition) > spellData.range) { endPosition = startPosition + direction * spellData.range; } } if (spellType == SpellType.Line) { endTick = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; endPosition = startPosition + direction * spellData.range; if (spellData.fixedRange) // for all lines { if (endPosition.Distance(startPosition) < spellData.range) { endPosition = startPosition + direction * spellData.range; } } if (endPosition.Distance(startPosition) > spellData.range) { endPosition = startPosition + direction * spellData.range; } if (spellData.useEndPosition) { var range = endPosition.Distance(startPosition); endTick = spellData.spellDelay + (range / spellData.projectileSpeed) * 1000; } if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellType == SpellType.Circular) { endTick = spellData.spellDelay; if (endPosition.Distance(startPosition) > spellData.range) { endPosition = startPosition + direction * spellData.range; } if (spellData.projectileSpeed == 0 && hero != null) { endPosition = hero.ServerPosition.To2D(); } else if (spellData.projectileSpeed > 0) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; if (spellData.spellType == SpellType.Line && spellData.hasEndExplosion) { if (!spellData.useEndPosition) { endPosition = startPosition + direction * spellData.range; } } } } else if (spellType == SpellType.Arc) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellType == SpellType.Cone) { endPosition = startPosition + direction * spellData.range; endTick = spellData.spellDelay; if (endPosition.Distance(startPosition) > spellData.range) { endPosition = startPosition + direction * spellData.range; } if (spellData.projectileSpeed == 0 && hero != null) { endPosition = hero.ServerPosition.To2D(); } else if (spellData.projectileSpeed > 0) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; } } else { return; } if (spellData.invert) { var dir = (startPosition - endPosition).Normalized(); endPosition = startPosition + dir * startPosition.Distance(endPosition); } if (spellData.isPerpendicular) { startPosition = spellEndPos.To2D() - direction.Perpendicular() * spellData.secondaryRadius; endPosition = spellEndPos.To2D() + direction.Perpendicular() * spellData.secondaryRadius; } endTick += extraEndTick; Spell newSpell = new Spell(); newSpell.startTime = EvadeUtils.TickCount; newSpell.endTime = EvadeUtils.TickCount + endTick; newSpell.startPos = startPosition; newSpell.endPos = endPosition; newSpell.height = spellEndPos.Z + spellData.extraDrawHeight; newSpell.direction = direction; newSpell.info = spellData; newSpell.spellType = spellType; newSpell.radius = spellRadius > 0 ? spellRadius : newSpell.GetSpellRadius(); if (spellType == SpellType.Cone) { newSpell.radius = 100 + (newSpell.radius * 3); // for now.. eh newSpell.cnStart = startPosition + direction; newSpell.cnLeft = endPosition + direction.Perpendicular() * newSpell.radius; newSpell.cnRight = endPosition - direction.Perpendicular() * newSpell.radius; } if (hero != null) { newSpell.heroID = hero.NetworkId; } if (obj != null) { newSpell.spellObject = obj; newSpell.projectileID = obj.NetworkId; } int spellID = CreateSpell(newSpell, processSpell); if (extraEndTick != 1337f) // traps { DelayAction.Add((int)(endTick + spellData.extraEndTime), () => DeleteSpell(spellID)); } } }
private void Drawing_OnDraw(EventArgs args) { //PrintTimers(); //EvadeHelper.CheckMovePath(Game.CursorPos.To2D()); foreach (KeyValuePair <int, Spell> entry in SpellDetector.drawSpells) { Spell spell = entry.Value; if (spell.info.spellType == SpellType.Line) { Vector2 spellPos = spell.GetCurrentSpellPosition(); Render.Circle.DrawCircle(new Vector3(spellPos.X, spellPos.Y, myHero.Position.Z), spell.info.radius, Color.White, 3); /*spellPos = spellPos + spell.direction * spell.info.projectileSpeed * (60 / 1000); //move the spellPos by 50 miliseconds forwards * spellPos = spellPos + spell.direction * 200; //move the spellPos by 50 units forwards * * Render.Circle.DrawCircle(new Vector3(spellPos.X, spellPos.Y, myHero.Position.Z), spell.info.radius, Color.White, 3);*/ } } RenderTestCircles(); if (testMenu.Item("TestHeroPos").GetValue <bool>()) { var path = myHero.Path; if (path.Length > 0) { var heroPos2 = EvadeHelper.GetRealHeroPos(Game.Ping + 50);// path[path.Length - 1].To2D(); var heroPos1 = myHero.ServerPosition.To2D(); Render.Circle.DrawCircle(new Vector3(heroPos2.X, heroPos2.Y, myHero.ServerPosition.Z), myHero.BoundingRadius, Color.Red, 3); Render.Circle.DrawCircle(new Vector3(myHero.ServerPosition.X, myHero.ServerPosition.Y, myHero.ServerPosition.Z), myHero.BoundingRadius, Color.White, 3); var heroPos = Drawing.WorldToScreen(ObjectManager.Player.Position); var dimension = Drawing.GetTextExtent("Evade: ON"); Drawing.DrawText(heroPos.X - dimension.Width / 2, heroPos.Y, Color.Red, "" + (int)(heroPos2.Distance(heroPos1))); Render.Circle.DrawCircle(new Vector3(circleRenderPos.X, circleRenderPos.Y, myHero.ServerPosition.Z), 10, Color.Red, 3); } } if (testMenu.Item("DrawHeroPos").GetValue <bool>()) { Render.Circle.DrawCircle(new Vector3(myHero.ServerPosition.X, myHero.ServerPosition.Y, myHero.ServerPosition.Z), myHero.BoundingRadius, Color.White, 3); } if (testMenu.Item("TestMoveTo").GetValue <KeyBind>().Active) { var keyBind = testMenu.Item("TestMoveTo").GetValue <KeyBind>(); testMenu.Item("TestMoveTo").SetValue(new KeyBind(keyBind.Key, KeyBindType.Toggle, false)); myHero.IssueOrder(GameObjectOrder.MoveTo, Game.CursorPos); var dir = (Game.CursorPos - myHero.Position).Normalized(); var pos2 = myHero.Position - dir * Game.CursorPos.Distance(myHero.Position); Utility.DelayAction.Add(1, () => myHero.IssueOrder(GameObjectOrder.MoveTo, pos2)); } if (testMenu.Item("TestPath").GetValue <bool>()) { var tPath = myHero.GetPath(Game.CursorPos); Vector2 lastPoint = Vector2.Zero; foreach (Vector3 point in tPath) { var point2D = point.To2D(); //Render.Circle.DrawCircle(new Vector3(point.X, point.Y, point.Z), myHero.BoundingRadius, Color.Violet, 3); lastPoint = point2D; } } if (testMenu.Item("TestPath").GetValue <bool>()) { var tPath = myHero.GetPath(Game.CursorPos); Vector2 lastPoint = Vector2.Zero; foreach (Vector3 point in tPath) { var point2D = point.To2D(); //Render.Circle.DrawCircle(new Vector3(point.X, point.Y, point.Z), myHero.BoundingRadius, Color.Violet, 3); lastPoint = point2D; } foreach (KeyValuePair <int, Spell> entry in SpellDetector.spells) { Spell spell = entry.Value; Vector2 to = Game.CursorPos.To2D(); var dir = (to - myHero.Position.To2D()).Normalized(); Vector2 cPos1, cPos2; var cpa = MathUtilsCPA.CPAPointsEx(myHero.Position.To2D(), dir * myHero.MoveSpeed, spell.endPos, spell.direction * spell.info.projectileSpeed, to, spell.endPos); var cpaTime = MathUtilsCPA.CPATime(myHero.Position.To2D(), dir * myHero.MoveSpeed, spell.endPos, spell.direction * spell.info.projectileSpeed); //Game.PrintChat("" + cpaTime); //Render.Circle.DrawCircle(cPos1.To3D(), myHero.BoundingRadius, Color.Red, 3); if (cpa < myHero.BoundingRadius + spell.GetSpellRadius()) { } } } if (testMenu.Item("ShowBuffs").GetValue <bool>()) { var target = myHero; foreach (var hero in HeroManager.Enemies) { target = hero; } var buffs = target.Buffs; //Game.PrintChat(myHero.ChampionName); //if(myHero.IsDead) // Game.PrintChat("dead"); if (!target.IsTargetable) { Game.PrintChat("invul" + Evade.GetTickCount()); } int height = 20; foreach (var buff in buffs) { if (buff.IsValidBuff()) { Drawing.DrawText(10, height, Color.White, buff.Name); height += 20; Game.PrintChat(buff.Name); } } } if (testMenu.Item("TestTracker").GetValue <bool>()) { foreach (KeyValuePair <int, ObjectTrackerInfo> entry in SpecialSpells.objTracker) { var info = entry.Value; Vector3 endPos2; if (info.usePosition == false) { endPos2 = info.obj.Position; } else { endPos2 = info.position; } Render.Circle.DrawCircle(new Vector3(endPos2.X, endPos2.Y, myHero.Position.Z), 50, Color.Green, 3); } } if (testMenu.Item("TestWall").GetValue <bool>()) { foreach (var posInfo in sortedBestPos) { var posOnScreen = Drawing.WorldToScreen(posInfo.position.To3D()); //Drawing.DrawText(posOnScreen.X, posOnScreen.Y, Color.Aqua, "" + (int)posInfo.closestDistance); /* * if (!posInfo.rejectPosition) * { * Drawing.DrawText(posOnScreen.X, posOnScreen.Y, Color.Aqua, "" + (int)posInfo.closestDistance); * }*/ Drawing.DrawText(posOnScreen.X, posOnScreen.Y, Color.Aqua, "" + (int)posInfo.closestDistance); /*if (posInfo.posDangerCount <= 0) * { * var pos = posInfo.position; * Render.Circle.DrawCircle(new Vector3(pos.X, pos.Y, myHero.Position.Z), (float)25, Color.White, 3); * }*/ } } }
private void Game_OnIssueOrder(Obj_AI_Base hero, GameObjectIssueOrderEventArgs args) { if (!hero.IsMe) { return; } if (args.Order == GameObjectOrder.HoldPosition) { var path = myHero.Path; var heroPoint = myHero.ServerPosition.To2D(); if (path.Length > 0) { var movePos = path[path.Length - 1].To2D(); var walkDir = (movePos - heroPoint).Normalized(); //circleRenderPos = EvadeHelper.GetRealHeroPos(); //heroPoint;// +walkDir * myHero.MoveSpeed * (((float)Game.Ping) / 1000); } } /* * if (args.Order == GameObjectOrder.MoveTo) * { * if (testingCollision) * { * if (args.TargetPosition.To2D().Distance(testCollisionPos) < 3) * { * //var path = myHero.GetPath(); * //circleRenderPos * * args.Process = false; * } * } * }*/ if (args.Order == GameObjectOrder.MoveTo) { Vector2 heroPos = myHero.ServerPosition.To2D(); Vector2 pos = args.TargetPosition.To2D(); float speed = myHero.MoveSpeed; startWalkPos = heroPos; startWalkTime = Evade.GetTickCount(); foreach (KeyValuePair <int, Spell> entry in SpellDetector.spells) { Spell spell = entry.Value; var spellPos = spell.GetCurrentSpellPosition(); var walkDir = (pos - heroPos).Normalized(); float spellTime = (Evade.GetTickCount() - spell.startTime) - spell.info.spellDelay; spellPos = spell.startPos + spell.direction * spell.info.projectileSpeed * (spellTime / 1000); //Game.PrintChat("aaaa" + spellTime); bool isCollision = false; float movingCollisionTime = MathUtils.GetCollisionTime(heroPos, spellPos, walkDir * (speed - 25), spell.direction * (spell.info.projectileSpeed - 200), myHero.BoundingRadius, spell.GetSpellRadius(), out isCollision); if (isCollision) { //Game.PrintChat("aaaa" + spellPos.Distance(spell.endPos) / spell.info.projectileSpeed); if (true)//spellPos.Distance(spell.endPos) / spell.info.projectileSpeed > movingCollisionTime) { Game.PrintChat("movingCollisionTime: " + movingCollisionTime); //circleRenderPos = heroPos + walkDir * speed * movingCollisionTime; } } } } }
public static void CreateSpellData(Obj_AI_Base hero, Vector3 spellStartPos, Vector3 spellEndPos, SpellData spellData, GameObject obj = null, float extraEndTick = 0.0f, bool processSpell = true, SpellType spellType = SpellType.None, bool checkEndExplosion = true, bool onUpdate = false, float spellRadius = 0) { var activeSpells = detectedSpells.Select(entry => entry.Value); if (activeSpells.Count(spell => spell.info.spellName == spellData.spellName) > 1 && onUpdate) { return; } var checkEndCollision = ObjectCache.menuCache.cache["CheckSpellCollision"].GetValue <bool>(); if (checkEndExplosion && spellData.hasEndExplosion) { if (checkEndCollision) { var predictedEndTime = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; if (!collisionObjs.ContainsKey(spellIDCount)) { collisionObjs.Add(spellIDCount, new CollisionCandidate(hero, spellStartPos.To2D(), spellIDCount, EvadeUtils.TickCount, spellStartPos.To2D(), spellEndPos.To2D(), spellData, predictedEndTime)); } } CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, false, spellData.spellType, false); CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, true, SpellType.Circular, false); return; } if (spellStartPos.Distance(myHero.Position) < spellData.range + 1000) { Vector2 startPosition = spellStartPos.To2D(); Vector2 endPosition = spellEndPos.To2D(); Vector2 direction = (endPosition - startPosition).Normalized(); float endTick = 0; if (spellType == SpellType.None) { spellType = spellData.spellType; } if (spellData.fixedRange) //for diana q { if (endPosition.Distance(startPosition) > spellData.range) { endPosition = startPosition + direction * spellData.range; } } if (spellType == SpellType.Line) { endTick = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; endPosition = startPosition + direction * spellData.range; if (spellData.useEndPosition) { var range = spellEndPos.To2D().Distance(spellStartPos.To2D()); endTick = spellData.spellDelay + (range / spellData.projectileSpeed) * 1000; endPosition = spellEndPos.To2D(); } if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellType == SpellType.Circular) { endTick = spellData.spellDelay; if (spellData.projectileSpeed == 0) { endPosition = hero.ServerPosition.To2D(); } else if (spellData.projectileSpeed > 0) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; if (spellData.spellType == SpellType.Line && spellData.hasEndExplosion && !spellData.useEndPosition) { if (checkEndCollision) { if (!onUpdate) { endPosition = Vector2.Zero; endTick = 0; } else { endTick -= spellData.spellDelay; } } else { endPosition = startPosition + direction * spellData.range; } } } } else if (spellType == SpellType.Arc) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellType == SpellType.Cone) { return; } else { return; } if (spellData.invert) { var dir = (startPosition - endPosition).Normalized(); endPosition = startPosition + dir * startPosition.Distance(endPosition); } if (spellData.isPerpendicular) { startPosition = spellEndPos.To2D() - direction.Perpendicular() * spellData.secondaryRadius; endPosition = spellEndPos.To2D() + direction.Perpendicular() * spellData.secondaryRadius; } endTick += extraEndTick; Spell newSpell = new Spell(); newSpell.startTime = EvadeUtils.TickCount; newSpell.endTime = EvadeUtils.TickCount + endTick; newSpell.startPos = startPosition; newSpell.endPos = endPosition; newSpell.height = spellEndPos.Z + spellData.extraDrawHeight; newSpell.direction = direction; newSpell.heroID = hero.NetworkId; newSpell.info = spellData; newSpell.spellType = spellType; newSpell.radius = spellRadius > 0 ? spellRadius : newSpell.GetSpellRadius(); if (obj != null) { newSpell.spellObject = obj; newSpell.projectileID = obj.NetworkId; } int spellID = CreateSpell(newSpell, processSpell); DelayAction.Add((int)(endTick + spellData.extraEndTime), () => DeleteSpell(spellID)); } }
public static void CreateSpellData(Obj_AI_Base hero, Vector3 spellStartPos, Vector3 spellEndPos, SpellData spellData, GameObject obj = null, float extraEndTick = 0.0f, bool processSpell = true, SpellType spellType = SpellType.None, bool checkEndExplosion = true, float spellRadius = 0) { if (checkEndExplosion && spellData.hasEndExplosion) { CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, false, spellData.spellType, false); CreateSpellData(hero, spellStartPos, spellEndPos, spellData, obj, extraEndTick, true, SpellType.Circular, false); return; } if (spellStartPos.Distance(myHero.Position) < spellData.range + 1000) { Vector2 startPosition = spellStartPos.To2D(); Vector2 endPosition = spellEndPos.To2D(); Vector2 direction = (endPosition - startPosition).Normalized(); float endTick = 0; if (spellType == SpellType.None) { spellType = spellData.spellType; } if (spellData.fixedRange) //for diana q { if (endPosition.Distance(startPosition) > spellData.range) { //var heroCastPos = hero.ServerPosition.To2D(); //direction = (endPosition - heroCastPos).Normalized(); endPosition = startPosition + direction * spellData.range; } } if (spellType == SpellType.Line) { endTick = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; endPosition = startPosition + direction * spellData.range; if (spellData.useEndPosition) { var range = spellEndPos.To2D().Distance(spellStartPos.To2D()); endTick = spellData.spellDelay + (range / spellData.projectileSpeed) * 1000; endPosition = spellEndPos.To2D(); } if (obj != null) endTick -= spellData.spellDelay; } else if (spellType == SpellType.Circular) { endTick = spellData.spellDelay; if (spellData.projectileSpeed == 0) { endPosition = hero.ServerPosition.To2D(); } else if (spellData.projectileSpeed > 0) { if (spellData.spellType == SpellType.Line && spellData.hasEndExplosion && spellData.useEndPosition == false) { endPosition = startPosition + direction * spellData.range; } endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; } } else if (spellType == SpellType.Arc) { endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.projectileSpeed; if (obj != null) endTick -= spellData.spellDelay; } else if (spellType == SpellType.Cone) { return; } else { return; } endTick += extraEndTick; Spell newSpell = new Spell(); newSpell.startTime = EvadeUtils.TickCount; newSpell.endTime = EvadeUtils.TickCount + endTick; newSpell.startPos = startPosition; newSpell.endPos = endPosition; newSpell.height = spellEndPos.Z + spellData.extraDrawHeight; newSpell.direction = direction; newSpell.heroID = hero.NetworkId; newSpell.info = spellData; newSpell.spellType = spellType; newSpell.radius = spellRadius > 0 ? spellRadius : newSpell.GetSpellRadius(); if (obj != null) { newSpell.spellObject = obj; newSpell.projectileID = obj.NetworkId; } int spellID = CreateSpell(newSpell, processSpell); DelayAction.Add((int)(endTick + spellData.extraEndTime), () => DeleteSpell(spellID)); } }
private void Drawing_OnDraw(EventArgs args) { if (menu.SubMenu("Draw").Item("DrawSkillShots").GetValue <bool>() == false) { return; } if (menu.SubMenu("Draw").Item("DrawEvadePosition").GetValue <bool>()) { if (Evade.lastPosInfo != null) { var pos = Evade.lastPosInfo.position; Render.Circle.DrawCircle(new Vector3(pos.X, pos.Y, myHero.Position.Z), 65, Color.Red, 10); } } DrawEvadeStatus(); foreach (KeyValuePair <int, Spell> entry in SpellDetector.drawSpells) { Spell spell = entry.Value; var dangerStr = spell.GetSpellDangerString(); var spellDrawingConfig = Evade.menu.SubMenu("Draw").SubMenu("DangerLevelDrawings") .SubMenu(dangerStr + "Drawing").Item(dangerStr + "Color").GetValue <Circle>(); var spellDrawingWidth = Evade.menu.SubMenu("Draw").SubMenu("DangerLevelDrawings") .SubMenu(dangerStr + "Drawing").Item(dangerStr + "Width").GetValue <Slider>().Value; if (Evade.menu.SubMenu("Spells").SubMenu(spell.info.charName + spell.info.spellName + "Settings") .Item(spell.info.spellName + "DrawSpell").GetValue <bool>() && spellDrawingConfig.Active) { if (spell.info.spellType == SpellType.Line) { Vector2 spellPos = spell.GetCurrentSpellPosition(); DrawLineRectangle(spellPos, spell.endPos, (int)spell.GetSpellRadius(), spellDrawingWidth, spellDrawingConfig.Color); /*foreach (var hero in ObjectManager.Get<Obj_AI_Hero>()) * { * Render.Circle.DrawCircle(new Vector3(hero.ServerPosition.X, hero.ServerPosition.Y, myHero.Position.Z), (int)spell.GetSpellRadius(), Color.Red, 5); * }*/ if (menu.SubMenu("Draw").Item("DrawSpellPos").GetValue <bool>())// && spell.spellObject != null) { //spellPos = SpellDetector.GetCurrentSpellPosition(spell, true, Game.Ping); /*if (true) * { * var spellPos2 = spell.startPos + spell.direction * spell.info.projectileSpeed * (Evade.GetTickCount() - spell.startTime - spell.info.spellDelay) / 1000 + spell.direction * spell.info.projectileSpeed * ((float)Game.Ping / 1000); * Render.Circle.DrawCircle(new Vector3(spellPos2.X, spellPos2.Y, myHero.Position.Z), (int)spell.GetSpellRadius(), Color.Red, 8); * }*/ Render.Circle.DrawCircle(new Vector3(spellPos.X, spellPos.Y, myHero.Position.Z), (int)spell.GetSpellRadius(), spellDrawingConfig.Color, spellDrawingWidth); } } else if (spell.info.spellType == SpellType.Circular) { Render.Circle.DrawCircle(new Vector3(spell.endPos.X, spell.endPos.Y, myHero.Position.Z), (int)spell.GetSpellRadius(), spellDrawingConfig.Color, spellDrawingWidth); } else if (spell.info.spellType == SpellType.Cone) { } } } }