private static void ProcessSpell_ProcessThreeWay(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData) { if (spellData.isThreeWay) { Vector3 endPos2 = MathUtils.RotateVector(args.Start.To2D(), args.End.To2D(), spellData.angle).To3D(); SpellDetector.CreateSpellData(hero, args.Start, endPos2, spellData, null); Vector3 endPos3 = MathUtils.RotateVector(args.Start.To2D(), args.End.To2D(), -spellData.angle).To3D(); SpellDetector.CreateSpellData(hero, args.Start, endPos3, spellData, null); } }
public static void LoadSpecialSpell(SpellData spellData) { if (spellData.isThreeWay && !pDict.ContainsKey("ProcessSpell_ProcessThreeWay")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ProcessThreeWay; pDict["ProcessSpell_ProcessThreeWay"] = true; } if (spellData.spellName == "ZiggsQ" && !pDict.ContainsKey("ProcessSpell_ProcessZiggsQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ProcessZiggsQ; pDict["ProcessSpell_ProcessZiggsQ"] = true; } }
private static void ProcessSpell_ProcessZiggsQ(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData) { if (spellData.spellName == "ZiggsQ") { var startPos = hero.ServerPosition.To2D(); var endPos = args.End.To2D(); var dir = (endPos - startPos).Normalized(); if (endPos.Distance(startPos) > 850) { endPos = startPos + dir * 850; } SpellDetector.CreateSpellData(hero, args.Start, endPos.To3D(), spellData, null); var endPos2 = endPos + dir * 0.4f * startPos.Distance(endPos); SpellDetector.CreateSpellData(hero, args.Start, endPos2.To3D(), spellData, null, 250); var endPos3 = endPos2 + dir * 0.6f * endPos.Distance(endPos2); SpellDetector.CreateSpellData(hero, args.Start, endPos3.To3D(), spellData, null, 800); } }
private static void ProcessSpell_AlZaharCalloftheVoid(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "AlZaharCalloftheVoid") { var direction = (args.End.To2D() - args.Start.To2D()).Normalized(); var pDirection = direction.Perpendicular(); var targetPoint = args.End.To2D(); var pos1 = targetPoint - pDirection * spellData.sideRadius; var pos2 = targetPoint + pDirection * spellData.sideRadius; SpellDetector.CreateSpellData(hero, pos1.To3D(), pos2.To3D(), spellData, null, 0, false); SpellDetector.CreateSpellData(hero, pos2.To3D(), pos1.To3D(), spellData, null, 0); specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_EkkoR(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "EkkoR") { foreach (var obj in ObjectManager.Get<Obj_AI_Minion>()) { if (obj != null && obj.IsValid && !obj.IsDead && obj.Name == "Ekko" && obj.IsEnemy) { var blinkPos = obj.ServerPosition.To2D(); SpellDetector.CreateSpellData(hero, args.Start, blinkPos.To3D(), spellData); } } specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_XerathArcanopulse2(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (args.SData.Name == "XerathArcanopulseChargeUp")// || spellData.spellName == "xeratharcanopulse2") { var castTime = -1 * (hero.Spellbook.CastTime - Game.Time) * 1000; if (castTime > 0) { var dir = (args.End.To2D() - args.Start.To2D()).Normalized(); var endPos = args.Start.To2D() + dir * Math.Min(spellData.range, 750 + castTime / 2); SpellDetector.CreateSpellData(hero, args.Start, endPos.To3D(), spellData); } specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_jayceshockblast(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "jayceshockblast") { } }
private static void ProcessSpell_YasuoQW(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData) { if (hero.IsEnemy && args.SData.Name == "yasuoq") { var castTime = (hero.Spellbook.CastTime - Game.Time) * 1000; if (castTime > 0) { spellData.spellDelay = castTime; } } }
public static Vector2 GetLinearSpellPosition(this Vector2 startPos, Vector2 endPos, float startTick, SpellData data, bool allowNegative = false, float processDelay = 0f) { Vector2 spellPos = startPos; var spellTime = EvadeUtils.TickCount - startTick - data.spellDelay; if (spellTime >= 0 || allowNegative) { spellPos = startPos + (endPos - startPos).Normalized() * data.projectileSpeed * (spellTime / 1000); } if (processDelay > 0) { spellPos = startPos + (endPos - startPos).Normalized() * data.projectileSpeed * (spellTime + processDelay / 1000); } return(spellPos); }
private static void OnCreateObj_JinxWMissile(GameObject obj, EventArgs args, Obj_AI_Hero hero, SpellData spellData) { if (hero != null && !hero.IsVisible && obj.IsEnemy && obj.Name.Contains("Jinx") && obj.Name.Contains("W_Cas")) { var pos1 = hero.Position; var dir = (obj.Position - myHero.Position).Normalized(); var pos2 = pos1 + dir * 500; SpellDetector.CreateSpellData(hero, pos1, pos2, spellData, null, 0); } }
private static void ProcessSpell_OrianaIzunaCommand(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "OrianaIzunaCommand") { foreach (KeyValuePair<int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (entry.Value.Name == "TheDoomBall") { if (info.usePosition) { SpellDetector.CreateSpellData(hero, info.position, args.End, spellData, null, 0); } else { if (info.obj == null) return; SpellDetector.CreateSpellData(hero, info.obj.Position, args.End, spellData, null, 0); } info.position = args.End; info.usePosition = true; } } specialSpellArgs.noProcess = true; } if (spellData.spellName == "OrianaDetonateCommand" || spellData.spellName == "OrianaDissonanceCommand") { foreach (KeyValuePair<int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (entry.Value.Name == "TheDoomBall") { if (info.usePosition) { Vector3 endPos2 = info.position; SpellDetector.CreateSpellData(hero, endPos2, endPos2, spellData, null, 0); } else { if (info.obj == null) return; Vector3 endPos2 = info.obj.Position; SpellDetector.CreateSpellData(hero, endPos2, endPos2, spellData, null, 0); } } } specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_FizzPiercingStrike(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "FizzPiercingStrike") { if (args.Target != null && args.Target.IsMe) { SpellDetector.CreateSpellData(hero, args.Start, args.End, spellData, null, 0); } specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_AsheVolley(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "Volley") { for (int i = -4; i < 5; i++) { Vector3 endPos2 = MathUtils.RotateVector(args.Start.To2D(), args.End.To2D(), i * spellData.angle).To3D(); if (i != 0) { SpellDetector.CreateSpellData(hero, args.Start, endPos2, spellData, null, 0, false); } } } }
private static void ProcessSpell_SionE(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "SionE") { var objList = new List <Obj_AI_Minion>(); foreach (var obj in ObjectManager.Get <Obj_AI_Minion>()) { if (obj != null && obj.IsValid && !obj.IsDead && obj.IsAlly) { objList.Add(obj); } } objList.OrderBy(o => o.Distance(hero.ServerPosition)); var spellStart = args.Start.To2D(); var dir = (args.End.To2D() - spellStart).Normalized(); var spellEnd = spellStart + dir * spellData.range; foreach (var obj in objList) { var objProjection = obj.ServerPosition.To2D().ProjectOn(spellStart, spellEnd); if (objProjection.IsOnSegment && objProjection.SegmentPoint.Distance(obj.ServerPosition.To2D()) < obj.BoundingRadius + spellData.radius) { //sth happens } } //specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_EkkoR(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "EkkoR") { foreach (var obj in ObjectManager.Get <Obj_AI_Minion>()) { if (obj != null && obj.IsValid && !obj.IsDead && obj.Name == "Ekko" && obj.IsEnemy) { var blinkPos = obj.ServerPosition.To2D(); SpellDetector.CreateSpellData(hero, args.Start, blinkPos.To3D(), spellData); } } specialSpellArgs.noProcess = true; } }
private static void ProcessSpell_JarvanIVDragonStrike(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (args.SData.Name == "JarvanIVDragonStrike") { if (SpellDetector.onProcessSpells.TryGetValue("JarvanIVDragonStrike2", out spellData)) { foreach (KeyValuePair<int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (info.Name == "Beacon" || info.obj.Name == "Beacon") { if (info.usePosition == false && (info.obj == null || !info.obj.IsValid || info.obj.IsDead)) { DelayAction.Add(1, () => objTracker.Remove(info.obj.NetworkId)); continue; } var objPosition = info.usePosition ? info.position.To2D() : info.obj.Position.To2D(); if (args.End.To2D().Distance(objPosition) < 300) { var dir = (objPosition - args.Start.To2D()).Normalized(); var endPosition = objPosition + dir * 110; SpellDetector.CreateSpellData(hero, args.Start, endPosition.To3D(), spellData); specialSpellArgs.noProcess = true; return; } } } } } }
private static void OnCreateObj_LuxMaliceCannon(GameObject obj, EventArgs args, Obj_AI_Hero hero, SpellData spellData) { if (obj.IsEnemy && !hero.IsVisible && obj.Name.Contains("Lux") && obj.Name.Contains("R_mis_beam_middle")) { var objList = objTracker.Values.Where(o => o.Name == "hiu"); if (objList.Count() > 3) { var dir = GetLastHiuOrientation(); var pos1 = obj.Position.To2D() - dir * 1750; var pos2 = obj.Position.To2D() + dir * 1750; SpellDetector.CreateSpellData(hero, pos1.To3D(), pos2.To3D(), spellData, null, 0); foreach (ObjectTrackerInfo gameObj in objList) { DelayAction.Add(1, () => objTracker.Remove(gameObj.obj.NetworkId)); } } } }
private static void ProcessSpell_LucianQ(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "LucianQ") { if (args.Target.IsValid<Obj_AI_Base>()) { var target = args.Target as Obj_AI_Base; float spellDelay = ((float)(350 - ObjectCache.gamePing)) / 1000; var heroWalkDir = (target.ServerPosition - target.Position).Normalized(); var predictedHeroPos = target.Position + heroWalkDir * target.MoveSpeed * (spellDelay); SpellDetector.CreateSpellData(hero, args.Start, predictedHeroPos, spellData, null, 0); specialSpellArgs.noProcess = true; } } }
public static void LoadSpecialSpell(SpellData spellData) { Obj_AI_Minion.OnCreate += HiuCreate_ObjectTracker; //Obj_AI_Minion.OnCreate += HiuDelete_ObjectTracker; if (spellData.isThreeWay && !pDict.ContainsKey("ProcessSpell_ProcessThreeWay")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ThreeWay; pDict["ProcessSpell_ProcessThreeWay"] = true; } if (spellData.spellName == "ZiggsQ" && !pDict.ContainsKey("ProcessSpell_ProcessZiggsQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ZiggsQ; pDict["ProcessSpell_ProcessZiggsQ"] = true; } if (spellData.spellName == "ZedShuriken" && !pDict.ContainsKey("ProcessSpell_ProcessZedShuriken")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ZedShuriken; MissileClient.OnCreate += SpellMissile_ZedShadowDash; Obj_AI_Minion.OnCreate += OnCreateObj_ZedShuriken; Obj_AI_Minion.OnDelete += OnDeleteObj_ZedShuriken; pDict["ProcessSpell_ProcessZedShuriken"] = true; } if (spellData.spellName == "LuluQ" && !pDict.ContainsKey("ProcessSpell_LuluQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_LuluQ; GetLuluPix(); pDict["ProcessSpell_LuluQ"] = true; } if (spellData.spellName == "OrianaIzunaCommand" && !pDict.ContainsKey("ProcessSpell_OrianaIzunaCommand")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Orianna"); if (hero == null) { return; } ObjectTrackerInfo info = new ObjectTrackerInfo(hero); info.Name = "TheDoomBall"; info.OwnerNetworkID = hero.NetworkId; objTracker.Add(hero.NetworkId, info); Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_OrianaIzunaCommand(obj, args, hero); Obj_AI_Minion.OnDelete += (obj, args) => OnDeleteObj_OrianaIzunaCommand(obj, args, hero); Obj_AI_Hero.OnProcessSpellCast += ProcessSpell_OrianaRedactCommand; SpellDetector.OnProcessSpecialSpell += ProcessSpell_OrianaIzunaCommand; pDict["ProcessSpell_OrianaIzunaCommand"] = true; } if (spellData.spellName == "AlZaharCalloftheVoid" && !pDict.ContainsKey("ProcessSpell_AlZaharCalloftheVoid")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_AlZaharCalloftheVoid; pDict["ProcessSpell_AlZaharCalloftheVoid"] = true; } if (spellData.spellName == "LucianQ" && !pDict.ContainsKey("ProcessSpell_LucianQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_LucianQ; pDict["ProcessSpell_LucianQ"] = true; } if (spellData.spellName == "LuxMaliceCannon" && !pDict.ContainsKey("ProcessSpell_LuxMaliceCannon")) { var hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Lux"); if (hero != null) { GameObject.OnCreate += (obj, args) => OnCreateObj_LuxMaliceCannon(obj, args, hero, spellData); } pDict["ProcessSpell_LuxMaliceCannon"] = true; } /*if (spellData.spellName == "JinxWMissile" && !pDict.ContainsKey("ProcessSpell_JinxWMissile")) * { * var hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Jinx"); * if (hero != null) * { * GameObject.OnCreate += (obj, args) => OnCreateObj_JinxWMissile(obj, args, hero, spellData); * } * * pDict["ProcessSpell_JinxWMissile"] = true; * }*/ if (spellData.spellName == "Volley" && !pDict.ContainsKey("ProcessSpell_AsheVolley")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_AsheVolley; pDict["ProcessSpell_AsheVolley"] = true; } if (spellData.spellName == "FizzPiercingStrike" && !pDict.ContainsKey("ProcessSpell_FizzPiercingStrike")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_FizzPiercingStrike; pDict["ProcessSpell_FizzPiercingStrike"] = true; } if (spellData.spellName == "FizzMarinerDoom" && !pDict.ContainsKey("ProcessSpell_FizzMarinerDoom")) { Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_FizzMarinerDoom(obj, args, spellData); Obj_AI_Minion.OnDelete += (obj, args) => OnDeleteObj_FizzMarinerDoom(obj, args, spellData); pDict["ProcessSpell_FizzMarinerDoom"] = true; } /*if (spellData.spellName == "SionE" && !pDict.ContainsKey("ProcessSpell_SionE")) * { * SpellDetector.OnProcessSpecialSpell += ProcessSpell_SionE; * pDict["ProcessSpell_SionE"] = true; * }*/ if (spellData.spellName == "EkkoR" && !pDict.ContainsKey("ProcessSpell_EkkoR")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_EkkoR; pDict["ProcessSpell_EkkoR"] = true; } if (spellData.spellName == "YasuoQW" && !pDict.ContainsKey("ProcessSpell_YasuoQW")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Yasuo"); if (hero == null) { return; } Obj_AI_Hero.OnProcessSpellCast += (sender, args) => ProcessSpell_YasuoQW(sender, args, spellData); pDict["ProcessSpell_YasuoQW"] = true; } /*if (spellData.spellName == "JayceShockBlastWall" && !pDict.ContainsKey("ProcessSpell_JayceShockBlastWall")) * { * Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Jayce"); * if (hero == null) * { * return; * } * * Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_jayceshockblast(obj, args, hero, spellData); * //Obj_AI_Hero.OnProcessSpellCast += OnProcessSpell_jayceshockblast; * //SpellDetector.OnProcessSpecialSpell += ProcessSpell_jayceshockblast; * pDict["ProcessSpell_JayceShockBlastWall"] = true; * }*/ if (spellData.spellName == "ViktorDeathRay3" && !pDict.ContainsKey("ProcessSpell_ViktorDeathRay3")) { Obj_AI_Minion.OnCreate += OnCreateObj_ViktorDeathRay3; pDict["ProcessSpell_ViktorDeathRay3"] = true; } if (spellData.spellName == "xeratharcanopulse2" && !pDict.ContainsKey("ProcessSpell_XerathArcanopulse2")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_XerathArcanopulse2; pDict["ProcessSpell_XerathArcanopulse2"] = true; } if (spellData.spellName == "JarvanIVDragonStrike" && !pDict.ContainsKey("ProcessSpell_JarvanIVDragonStrike")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "JarvanIV"); if (hero == null) { return; } Obj_AI_Hero.OnProcessSpellCast += ProcessSpell_JarvanIVDemacianStandard; SpellDetector.OnProcessSpecialSpell += ProcessSpell_JarvanIVDragonStrike; Obj_AI_Minion.OnCreate += OnCreateObj_JarvanIVDragonStrike; Obj_AI_Minion.OnDelete += OnDeleteObj_JarvanIVDragonStriken; pDict["ProcessSpell_JarvanIVDragonStrike"] = true; } }
public static void LoadSpecialSpell(SpellData spellData) { Obj_AI_Minion.OnCreate += HiuCreate_ObjectTracker; //Obj_AI_Minion.OnCreate += HiuDelete_ObjectTracker; if (spellData.isThreeWay && !pDict.ContainsKey("ProcessSpell_ProcessThreeWay")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ThreeWay; pDict["ProcessSpell_ProcessThreeWay"] = true; } if (spellData.spellName == "ZiggsQ" && !pDict.ContainsKey("ProcessSpell_ProcessZiggsQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ZiggsQ; pDict["ProcessSpell_ProcessZiggsQ"] = true; } if (spellData.spellName == "ZedShuriken" && !pDict.ContainsKey("ProcessSpell_ProcessZedShuriken")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ZedShuriken; MissileClient.OnCreate += SpellMissile_ZedShadowDash; Obj_AI_Minion.OnCreate += OnCreateObj_ZedShuriken; Obj_AI_Minion.OnDelete += OnDeleteObj_ZedShuriken; pDict["ProcessSpell_ProcessZedShuriken"] = true; } if (spellData.spellName == "LuluQ" && !pDict.ContainsKey("ProcessSpell_LuluQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_LuluQ; GetLuluPix(); pDict["ProcessSpell_LuluQ"] = true; } if (spellData.spellName == "OrianaIzunaCommand" && !pDict.ContainsKey("ProcessSpell_OrianaIzunaCommand")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Orianna"); if (hero == null) { return; } ObjectTrackerInfo info = new ObjectTrackerInfo(hero); info.Name = "TheDoomBall"; info.OwnerNetworkID = hero.NetworkId; objTracker.Add(hero.NetworkId, info); Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_OrianaIzunaCommand(obj, args, hero); Obj_AI_Minion.OnDelete += (obj, args) => OnDeleteObj_OrianaIzunaCommand(obj, args, hero); Obj_AI_Hero.OnProcessSpellCast += ProcessSpell_OrianaRedactCommand; SpellDetector.OnProcessSpecialSpell += ProcessSpell_OrianaIzunaCommand; pDict["ProcessSpell_OrianaIzunaCommand"] = true; } if (spellData.spellName == "AlZaharCalloftheVoid" && !pDict.ContainsKey("ProcessSpell_AlZaharCalloftheVoid")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_AlZaharCalloftheVoid; pDict["ProcessSpell_AlZaharCalloftheVoid"] = true; } if (spellData.spellName == "LucianQ" && !pDict.ContainsKey("ProcessSpell_LucianQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_LucianQ; pDict["ProcessSpell_LucianQ"] = true; } if (spellData.spellName == "LuxMaliceCannon" && !pDict.ContainsKey("ProcessSpell_LuxMaliceCannon")) { var hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Lux"); if (hero != null) { GameObject.OnCreate += (obj, args) => OnCreateObj_LuxMaliceCannon(obj, args, hero, spellData); } pDict["ProcessSpell_LuxMaliceCannon"] = true; } /*if (spellData.spellName == "JinxWMissile" && !pDict.ContainsKey("ProcessSpell_JinxWMissile")) { var hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Jinx"); if (hero != null) { GameObject.OnCreate += (obj, args) => OnCreateObj_JinxWMissile(obj, args, hero, spellData); } pDict["ProcessSpell_JinxWMissile"] = true; }*/ if (spellData.spellName == "Volley" && !pDict.ContainsKey("ProcessSpell_AsheVolley")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_AsheVolley; pDict["ProcessSpell_AsheVolley"] = true; } if (spellData.spellName == "FizzPiercingStrike" && !pDict.ContainsKey("ProcessSpell_FizzPiercingStrike")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_FizzPiercingStrike; pDict["ProcessSpell_FizzPiercingStrike"] = true; } if (spellData.spellName == "FizzMarinerDoom" && !pDict.ContainsKey("ProcessSpell_FizzMarinerDoom")) { Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_FizzMarinerDoom(obj, args, spellData); Obj_AI_Minion.OnDelete += (obj, args) => OnDeleteObj_FizzMarinerDoom(obj, args, spellData); pDict["ProcessSpell_FizzMarinerDoom"] = true; } /*if (spellData.spellName == "SionE" && !pDict.ContainsKey("ProcessSpell_SionE")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_SionE; pDict["ProcessSpell_SionE"] = true; }*/ if (spellData.spellName == "EkkoR" && !pDict.ContainsKey("ProcessSpell_EkkoR")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_EkkoR; pDict["ProcessSpell_EkkoR"] = true; } if (spellData.spellName == "YasuoQW" && !pDict.ContainsKey("ProcessSpell_YasuoQW")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Yasuo"); if (hero == null) { return; } Obj_AI_Hero.OnProcessSpellCast += (sender, args) => ProcessSpell_YasuoQW(sender, args, spellData); pDict["ProcessSpell_YasuoQW"] = true; } /*if (spellData.spellName == "JayceShockBlastWall" && !pDict.ContainsKey("ProcessSpell_JayceShockBlastWall")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Jayce"); if (hero == null) { return; } Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_jayceshockblast(obj, args, hero, spellData); //Obj_AI_Hero.OnProcessSpellCast += OnProcessSpell_jayceshockblast; //SpellDetector.OnProcessSpecialSpell += ProcessSpell_jayceshockblast; pDict["ProcessSpell_JayceShockBlastWall"] = true; }*/ if (spellData.spellName == "ViktorDeathRay3" && !pDict.ContainsKey("ProcessSpell_ViktorDeathRay3")) { Obj_AI_Minion.OnCreate += OnCreateObj_ViktorDeathRay3; pDict["ProcessSpell_ViktorDeathRay3"] = true; } if (spellData.spellName == "xeratharcanopulse2" && !pDict.ContainsKey("ProcessSpell_XerathArcanopulse2")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_XerathArcanopulse2; pDict["ProcessSpell_XerathArcanopulse2"] = true; } if (spellData.spellName == "JarvanIVDragonStrike" && !pDict.ContainsKey("ProcessSpell_JarvanIVDragonStrike")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "JarvanIV"); if (hero == null) { return; } Obj_AI_Hero.OnProcessSpellCast += ProcessSpell_JarvanIVDemacianStandard; SpellDetector.OnProcessSpecialSpell += ProcessSpell_JarvanIVDragonStrike; Obj_AI_Minion.OnCreate += OnCreateObj_JarvanIVDragonStrike; Obj_AI_Minion.OnDelete += OnDeleteObj_JarvanIVDragonStriken; pDict["ProcessSpell_JarvanIVDragonStrike"] = true; } }
private static void ProcessSpell_LucianQ(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "LucianQ") { if (args.Target.IsValid <Obj_AI_Base>()) { var target = args.Target as Obj_AI_Base; float spellDelay = ((float)(350 - ObjectCache.gamePing)) / 1000; var heroWalkDir = (target.ServerPosition - target.Position).Normalized(); var predictedHeroPos = target.Position + heroWalkDir * target.MoveSpeed * (spellDelay); SpellDetector.CreateSpellData(hero, args.Start, predictedHeroPos, spellData, null, 0); specialSpellArgs.noProcess = true; } } }
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 = ObjectCache.myHeroCache.serverPos2D; lastStopEvadeTime = EvadeUtils.TickCount + ObjectCache.gamePing + 100; } //block spell commmands if evade spell just used if (EvadeSpell.lastSpellEvadeCommand != null && EvadeSpell.lastSpellEvadeCommand.timestamp + ObjectCache.gamePing + 150 > EvadeUtils.TickCount) { args.Process = false; } lastSpellCast = args.Slot; lastSpellCastTime = EvadeUtils.TickCount; //moved from processPacket /*if (args.Slot == SpellSlot.Recall) * { * lastStopPosition = 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 && evadeSpell.untargetable == false) { 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 = ObjectCache.menuCache.cache["ExtraPingBuffer"].GetValue<Slider>().Value; //var extraDist = ObjectCache.menuCache.cache["ExtraCPADistance"].GetValue<Slider>().Value; var dashPos = args.StartPosition.To2D(); //real pos? if (args.Target != null) { dashPos = args.Target.Position.To2D(); } if (evadeSpell.fixedRange || dashPos.Distance(myHero.ServerPosition.To2D()) > evadeSpell.range) { var dir = (dashPos - myHero.ServerPosition.To2D()).Normalized(); dashPos = myHero.ServerPosition.To2D() + dir * evadeSpell.range; } //Draw.RenderObjects.Add(new Draw.RenderCircle(dashPos, 1000)); var posInfo = EvadeHelper.CanHeroWalkToPos(dashPos, evadeSpell.speed, ObjectCache.gamePing, 0); 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 + ObjectCache.gamePing + 100; } } return; } } }
public static void LoadDummySpell(SpellData spell) { string menuName = spell.charName + " (" + spell.spellKey.ToString() + ") Settings"; var enableSpell = !spell.defaultOff; Menu newSpellMenu = new Menu(menuName, spell.charName + spell.spellName + "Settings"); newSpellMenu.AddItem(new MenuItem(spell.spellName + "DodgeSpell", "Dodge Spell").SetValue(enableSpell)); newSpellMenu.AddItem(new MenuItem(spell.spellName + "DrawSpell", "Draw Spell").SetValue(enableSpell)); newSpellMenu.AddItem(new MenuItem(spell.spellName + "SpellRadius", "Spell Radius") .SetValue(new Slider((int)spell.radius, (int)spell.radius - 100, (int)spell.radius + 100))); newSpellMenu.AddItem(new MenuItem(spell.spellName + "DangerLevel", "Danger Level") .SetValue(new StringList(new[] { "Low", "Normal", "High", "Extreme" }, spell.dangerlevel - 1))); spellMenu.AddSubMenu(newSpellMenu); ObjectCache.menuCache.AddMenuToCache(newSpellMenu); }
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 = ObjectCache.myHeroCache.serverPos2D; lastStopEvadeTime = EvadeUtils.TickCount + ObjectCache.gamePing + 100; } //block spell commmands if evade spell just used if (EvadeSpell.lastSpellEvadeCommand != null && EvadeSpell.lastSpellEvadeCommand.timestamp + ObjectCache.gamePing + 150 > EvadeUtils.TickCount) { args.Process = false; } lastSpellCast = args.Slot; lastSpellCastTime = EvadeUtils.TickCount; //moved from processPacket /*if (args.Slot == SpellSlot.Recall) * { * lastStopPosition = myHero.ServerPosition.To2D(); * }*/ if (Situation.ShouldDodge()) { if (isDodging && SpellDetector.spells.Any()) { 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 && evadeSpell.untargetable == false) { if (evadeSpell.evadeType == EvadeType.Blink) { var dir = (args.StartPosition.To2D() - myHero.ServerPosition.To2D()).Normalized(); var end = myHero.ServerPosition.To2D() + dir * myHero.ServerPosition.To2D().Distance(Game.CursorPos.To2D()); if (evadeSpell.fixedRange || end.Distance(myHero.ServerPosition.To2D()) > evadeSpell.range) { end = myHero.ServerPosition.To2D() + dir * evadeSpell.range; } var posInfo = EvadeHelper.CanHeroWalkToPos(end, evadeSpell.speed, ObjectCache.gamePing, 0); if (posInfo.posDangerCount < 1) { if (lastPosInfo != null) { lastPosInfo = posInfo; } if (lastPosInfo == null) { lastPosInfo = posInfo; } if (isDodging || EvadeUtils.TickCount < lastDodgingEndTime + 250) { EvadeCommand.MoveTo(Game.CursorPos.To2D()); lastStopEvadeTime = EvadeUtils.TickCount + ObjectCache.gamePing + 100; } return; } } if (evadeSpell.evadeType == EvadeType.Dash) { var dashPos = args.StartPosition.To2D(); if (args.Target != null) { dashPos = args.Target.Position.To2D(); } if (evadeSpell.fixedRange || dashPos.Distance(myHero.ServerPosition.To2D()) > evadeSpell.range) { var dir = (dashPos - myHero.ServerPosition.To2D()).Normalized(); dashPos = myHero.ServerPosition.To2D() + dir * evadeSpell.range; } var posInfo = EvadeHelper.CanHeroWalkToPos(dashPos, evadeSpell.speed, ObjectCache.gamePing, 0); if (posInfo.posDangerLevel > 0) { args.Process = false; } else { if (isDodging || EvadeUtils.TickCount < lastDodgingEndTime + 500) { EvadeCommand.MoveTo(Game.CursorPos.To2D()); lastStopEvadeTime = EvadeUtils.TickCount + ObjectCache.gamePing + 100; } return; } } lastPosInfo = PositionInfo.SetAllUndodgeable(); return; } } }
private static void OnCreateObj_FizzMarinerDoom(GameObject obj, EventArgs args, SpellData spellData) { if (!obj.IsValid <MissileClient>()) { return; } MissileClient missile = (MissileClient)obj; if (missile.SpellCaster != null && missile.SpellCaster.Team != myHero.Team && missile.SData.Name == "FizzMarinerDoomMissile") { SpellDetector.CreateSpellData(missile.SpellCaster, missile.StartPosition, missile.EndPosition, spellData, null, 500, true, SpellType.Circular, false, spellData.secondaryRadius); /*foreach (KeyValuePair<int, Spell> entry in SpellDetector.spells) * { * var spell = entry.Value; * * if (spell.info.spellName == "FizzMarinerDoom" && * spell.spellObject != null && spell.spellObject.NetworkId == missile.NetworkId) * { * if (spell.spellType == SpellType.Circular) * { * spell.spellObject = null; * } * } * }*/ } }
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 = spellEndPos.To2D().Distance(spellStartPos.To2D()); 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 && !spellData.useEndPosition) { if (ObjectCache.menuCache.cache["CheckSpellCollision"].GetValue <bool>()) { endPosition = startPosition; } 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) { 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; var 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 (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 static void OnCreateObj_jayceshockblast(GameObject obj, EventArgs args, Obj_AI_Hero hero, SpellData spellData) { return; if (obj.IsEnemy && obj.Type == GameObjectType.obj_GeneralParticleEmitter && obj.Name.Contains("Jayce") && obj.Name.Contains("accel_gate_start")) { var dir = GetLastHiuOrientation(); var pos1 = obj.Position.To2D() - dir * 470; var pos2 = obj.Position.To2D() + dir * 470; var gateTracker = new ObjectTrackerInfo(obj, "AccelGate"); gateTracker.direction = dir.To3D(); objTracker.Add(obj.NetworkId, gateTracker); foreach (var entry in SpellDetector.spells) { var spell = entry.Value; if (spell.info.spellName == "jayceshockblast") { var tHero = spell.heroID; var intersection = spell.startPos.Intersection(spell.endPos, pos1, pos2); var projection = intersection.Point.ProjectOn(spell.startPos, spell.endPos); if (intersection.Intersects && projection.IsOnSegment) { SpellDetector.CreateSpellData(hero, intersection.Point.To3D(), spell.endPos.To3D(), spellData, spell.spellObject); DelayAction.Add(1, () => SpellDetector.DeleteSpell(entry.Key)); } } } //SpellDetector.CreateSpellData(hero, pos1.To3D(), pos2.To3D(), spellData, null, 0); } }
public static void LoadDummySpell(SpellData spell) { string menuName = spell.charName + " (" + spell.spellKey.ToString() + ") Settings"; var enableSpell = !spell.defaultOff; newSpellMenu = menu.AddSubMenu(menuName, spell.charName + spell.spellName + "Settings"); newSpellMenu.Add(spell.spellName + "DodgeSpell", new CheckBox("Dodge Spell", enableSpell)); newSpellMenu.Add(spell.spellName + "DrawSpell", new CheckBox("Draw Spell", enableSpell)); newSpellMenu.Add(spell.spellName + "SpellRadius", new Slider("Spell Radius", (int)spell.radius, (int)spell.radius - 100, (int)spell.radius + 100)); newSpellMenu.Add(spell.spellName + "FastEvade", new CheckBox("Force Fast Evade", spell.dangerlevel == 4)); newSpellMenu.Add(spell.spellName + "DodgeIgnoreHP", new Slider("Ignore above HP %", spell.dangerlevel == 1 ? 80 : 100)); newSpellMenu.Add(spell.spellName + "DangerLevel", new ComboBox("Danger Level", spell.dangerlevel - 1, "Low", "Normal", "High", "Extreme")); ObjectCache.menuCache.AddMenuToCache(newSpellMenu); }
public static void LoadSpecialSpell(SpellData spellData) { if (spellData.isThreeWay && !pDict.ContainsKey("ProcessSpell_ProcessThreeWay")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ThreeWay; pDict["ProcessSpell_ProcessThreeWay"] = true; } if (spellData.spellName == "ZiggsQ" && !pDict.ContainsKey("ProcessSpell_ProcessZiggsQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ZiggsQ; pDict["ProcessSpell_ProcessZiggsQ"] = true; } if (spellData.spellName == "ZedShuriken" && !pDict.ContainsKey("ProcessSpell_ProcessZedShuriken")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_ZedShuriken; MissileClient.OnCreate += SpellMissile_ZedShadowDash; Obj_AI_Minion.OnCreate += OnCreateObj_ZedShuriken; Obj_AI_Minion.OnDelete += OnDeleteObj_ZedShuriken; pDict["ProcessSpell_ProcessZedShuriken"] = true; } if (spellData.spellName == "LuluQ" && !pDict.ContainsKey("ProcessSpell_LuluQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_LuluQ; GetLuluPix(); pDict["ProcessSpell_LuluQ"] = true; } if (spellData.spellName == "OrianaIzunaCommand" && !pDict.ContainsKey("ProcessSpell_OrianaIzunaCommand")) { Obj_AI_Hero hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Orianna"); if (hero == null) { return; } ObjectTrackerInfo info = new ObjectTrackerInfo(hero); info.Name = "TheDoomBall"; info.OwnerNetworkID = hero.NetworkId; objTracker.Add(hero.NetworkId, info); Obj_AI_Minion.OnCreate += (obj, args) => OnCreateObj_OrianaIzunaCommand(obj, args, hero); Obj_AI_Minion.OnDelete += (obj, args) => OnDeleteObj_OrianaIzunaCommand(obj, args, hero); Obj_AI_Hero.OnProcessSpellCast += ProcessSpell_OrianaRedactCommand; SpellDetector.OnProcessSpecialSpell += ProcessSpell_OrianaIzunaCommand; pDict["ProcessSpell_OrianaIzunaCommand"] = true; } if (spellData.spellName == "AlZaharCalloftheVoid" && !pDict.ContainsKey("ProcessSpell_AlZaharCalloftheVoid")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_AlZaharCalloftheVoid; pDict["ProcessSpell_AlZaharCalloftheVoid"] = true; } if (spellData.spellName == "LucianQ" && !pDict.ContainsKey("ProcessSpell_LucianQ")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_LucianQ; pDict["ProcessSpell_LucianQ"] = true; } /*if (spellData.spellName == "LuxMaliceCannon" && !pDict.ContainsKey("ProcessSpell_LuxMaliceCannon")) { var hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Lux"); if (hero != null) { GameObject.OnCreate += (obj, args) => OnCreateObj_LuxMaliceCannon(obj, args, hero, spellData); } pDict["ProcessSpell_LuxMaliceCannon"] = true; }*/ /*if (spellData.spellName == "JinxWMissile" && !pDict.ContainsKey("ProcessSpell_JinxWMissile")) { var hero = HeroManager.Enemies.FirstOrDefault(h => h.ChampionName == "Jinx"); if (hero != null) { GameObject.OnCreate += (obj, args) => OnCreateObj_JinxWMissile(obj, args, hero, spellData); } pDict["ProcessSpell_JinxWMissile"] = true; }*/ if (spellData.spellName == "Volley" && !pDict.ContainsKey("ProcessSpell_AsheVolley")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_AsheVolley; pDict["ProcessSpell_AsheVolley"] = true; } if (spellData.spellName == "FizzPiercingStrike" && !pDict.ContainsKey("ProcessSpell_FizzPiercingStrike")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_FizzPiercingStrike; pDict["ProcessSpell_FizzPiercingStrike"] = true; } if (spellData.spellName == "SionE" && !pDict.ContainsKey("ProcessSpell_SionE")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_SionE; pDict["ProcessSpell_SionE"] = true; } if (spellData.spellName == "EkkoR" && !pDict.ContainsKey("ProcessSpell_EkkoR")) { SpellDetector.OnProcessSpecialSpell += ProcessSpell_EkkoR; pDict["ProcessSpell_EkkoR"] = true; } }
private static void OnDeleteObj_FizzMarinerDoom(GameObject obj, EventArgs args, SpellData spellData) { //need to track where bait is attached to if (!obj.IsValid<MissileClient>()) return; MissileClient missile = (MissileClient)obj; if (missile.SpellCaster != null && missile.SpellCaster.Team != myHero.Team && missile.SData.Name == "FizzMarinerDoomMissile") { SpellDetector.CreateSpellData(missile.SpellCaster, missile.StartPosition, missile.EndPosition, spellData, null, 1000, true, SpellType.Circular, false, 350); } }
private static void ProcessSpell_OrianaIzunaCommand(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "OrianaIzunaCommand") { foreach (KeyValuePair <int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (entry.Value.Name == "TheDoomBall") { if (info.usePosition) { SpellDetector.CreateSpellData(hero, info.position, args.End, spellData, null, 0); } else { if (info.obj == null) { return; } SpellDetector.CreateSpellData(hero, info.obj.Position, args.End, spellData, null, 0); } specialSpellArgs.noProcess = true; info.position = args.End; info.usePosition = true; } } } if (spellData.spellName == "OrianaDetonateCommand" || spellData.spellName == "OrianaDissonanceCommand") { foreach (KeyValuePair <int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (entry.Value.Name == "TheDoomBall") { if (info.usePosition) { Vector3 endPos2 = info.position; SpellDetector.CreateSpellData(hero, endPos2, endPos2, spellData, null, 0); } else { if (info.obj == null) { return; } Vector3 endPos2 = info.obj.Position; SpellDetector.CreateSpellData(hero, endPos2, endPos2, spellData, null, 0); } specialSpellArgs.noProcess = true; } } } }
private static void ProcessSpell_LuluQ(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "LuluQ") { foreach (KeyValuePair <int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (entry.Value.Name == "RobotBuddy") { if (info.obj == null || info.obj.IsDead) { continue; } else { Vector3 endPos2 = info.obj.Position.Extend(args.End, spellData.range); SpellDetector.CreateSpellData(hero, info.obj.Position, endPos2, spellData, null, 0, false); } } } } }
private static void ProcessSpell_ZedShuriken(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "ZedShuriken") { foreach (KeyValuePair <int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (info.obj.Name == "Shadow" || info.Name == "Shadow") { if (info.usePosition == false && (info.obj == null || info.obj.IsDead)) { Utility.DelayAction.Add(1, () => objTracker.Remove(info.obj.NetworkId)); continue; } else { Vector3 endPos2; if (info.usePosition == false) { endPos2 = info.obj.Position.Extend(args.End, spellData.range); SpellDetector.CreateSpellData(hero, info.obj.Position, endPos2, spellData, null, 0, false); } else { endPos2 = info.position.Extend(args.End, spellData.range); SpellDetector.CreateSpellData(hero, info.position, endPos2, spellData, null, 0, false); } } } } } }
private static void ProcessSpell_LuluQ(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "LuluQ") { foreach (KeyValuePair<int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (entry.Value.Name == "RobotBuddy") { if (info.obj == null || !info.obj.IsValid || info.obj.IsDead || info.obj.IsVisible) { continue; } else { Vector3 endPos2 = info.obj.Position.Extend(args.End, spellData.range); SpellDetector.CreateSpellData(hero, info.obj.Position, endPos2, spellData, null, 0, false); } } } } }
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 = ObjectCache.myHeroCache.serverPos2D; lastStopEvadeTime = EvadeUtils.TickCount + ObjectCache.gamePing + 100; } if (EvadeSpell.lastSpellEvadeCommand != null && EvadeSpell.lastSpellEvadeCommand.timestamp + ObjectCache.gamePing + 150 > EvadeUtils.TickCount) { args.Process = false; } lastSpellCast = args.Slot; lastSpellCastTime = EvadeUtils.TickCount; //moved from processPacket 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) { lastPosInfo = PositionInfo.SetAllUndodgeable(); if (evadeSpell.evadeType == EvadeType.Blink || evadeSpell.evadeType == EvadeType.Dash) { /*if (args.EndPosition.To2D().CheckDangerousPos(6, true)) //need testing * { * args.Process = false; * return; * }*/ if (isDodging || EvadeUtils.TickCount < lastDodgingEndTime + 500) { EvadeCommand.MoveTo(Game.CursorPos.To2D()); lastStopEvadeTime = EvadeUtils.TickCount + ObjectCache.gamePing + 100; } } return; } } }
private static void ProcessSpell_SionE(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "SionE") { var objList = new List<Obj_AI_Minion>(); foreach (var obj in ObjectManager.Get<Obj_AI_Minion>()) { if (obj != null && obj.IsValid && !obj.IsDead && obj.IsAlly) { objList.Add(obj); } } objList.OrderBy(o => o.Distance(hero.ServerPosition)); var spellStart = args.Start.To2D(); var dir = (args.End.To2D() - spellStart).Normalized(); var spellEnd = spellStart + dir * spellData.range; foreach (var obj in objList) { var objProjection = obj.ServerPosition.To2D().ProjectOn(spellStart, spellEnd); if (objProjection.IsOnSegment && objProjection.SegmentPoint.Distance(obj.ServerPosition.To2D()) < obj.BoundingRadius + spellData.radius) { //sth happens } } //specialSpellArgs.noProcess = true; } }
private static void OnCreateObj_LuxMaliceCannon(GameObject obj, EventArgs args, Obj_AI_Hero hero, SpellData spellData) { if (hero != null && !hero.IsVisible && obj.Name == "hiu" && obj.IsEnemy) { objTracker.Add(obj.NetworkId, new ObjectTrackerInfo(obj)); DelayAction.Add(250, () => objTracker.Remove(obj.NetworkId)); var objList = objTracker.Values.Where(o => o.Name == "hiu"); if (objList.Count() > 4) { var pos1 = objList.First().obj.Position; var pos2 = objList.Last().obj.Position; SpellDetector.CreateSpellData(hero, pos1, pos2, spellData, null, 0); foreach (ObjectTrackerInfo gameObj in objList) { DelayAction.Add(1, () => objTracker.Remove(gameObj.obj.NetworkId)); } } } }
public static void CreateSpellData(Obj_AI_Base hero, Vector3 startStartPos, Vector3 spellEndPos, SpellData spellData, GameObject obj = null, float extraEndTick = 0.0f, bool processSpell = true) { if (startStartPos.Distance(myHero.Position) < spellData.range + 1000) { Vector2 startPosition = startStartPos.To2D(); Vector2 endPosition = spellEndPos.To2D(); Vector2 direction = (endPosition - startPosition).Normalized(); float endTick = 0; 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 (spellData.spellType == SpellType.Line) { endTick = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; endPosition = startPosition + direction * spellData.range; if (obj != null) endTick -= spellData.spellDelay; } else if (spellData.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; } } else if (spellData.spellType == SpellType.Cone) { return; } endTick += extraEndTick; Spell newSpell = new Spell(); newSpell.startTime = EvadeUtils.TickCount; newSpell.endTime = EvadeUtils.TickCount + endTick; newSpell.startPos = startPosition; newSpell.endPos = endPosition; newSpell.direction = direction; newSpell.heroID = hero.NetworkId; newSpell.info = spellData; if (obj != null) { newSpell.spellObject = obj; newSpell.projectileID = obj.NetworkId; } int spellID = CreateSpell(newSpell, processSpell); DelayAction.Add((int)endTick, () => DeleteSpell(spellID)); } }
private static void ProcessSpell_ZedShuriken(Obj_AI_Base hero, GameObjectProcessSpellCastEventArgs args, SpellData spellData, SpecialSpellEventArgs specialSpellArgs) { if (spellData.spellName == "ZedShuriken") { foreach (KeyValuePair<int, ObjectTrackerInfo> entry in objTracker) { var info = entry.Value; if (info.obj.Name == "Shadow" || info.Name == "Shadow") { if (info.usePosition == false && (info.obj == null || !info.obj.IsValid || info.obj.IsDead)) { DelayAction.Add(1, () => objTracker.Remove(info.obj.NetworkId)); continue; } else { Vector3 endPos2; if (info.usePosition == false) { endPos2 = info.obj.Position.Extend(args.End, spellData.range); SpellDetector.CreateSpellData(hero, info.obj.Position, endPos2, spellData, null, 0, false); } else { endPos2 = info.position.Extend(args.End, spellData.range); SpellDetector.CreateSpellData(hero, info.position, endPos2, spellData, null, 0, false); } } } } } }
public static Obj_AI_Base CheckPositionCollision(this Vector3 currentSpellPosition, Vector3 endPos, SpellData data, bool ignoreSelf = true, float extraRadius = 0f) { var currentPos = currentSpellPosition; var distToHero = currentPos.To2D().Distance(ObjectCache.myHeroCache.serverPos2D); List <Obj_AI_Base> collisionCandidates = new List <Obj_AI_Base>(); if (data.collisionObjects.Contains(CollisionObjectType.EnemyChampions)) { foreach (var hero in HeroManager.Allies .Where(h => h.IsValidTarget(distToHero, false, currentSpellPosition))) { if (ignoreSelf && hero.IsMe) { continue; } collisionCandidates.Add(hero); } } if (data.collisionObjects.Contains(CollisionObjectType.EnemyMinions)) { foreach (var minion in ObjectManager.Get <Obj_AI_Minion>() .Where(h => h.Team == Evade.myHero.Team && h.IsValidTarget(distToHero, false, currentSpellPosition))) { if (minion.CharData.BaseSkinName.ToLower() == "teemomushroom" || minion.CharData.BaseSkinName.ToLower() == "shacobox") { continue; } collisionCandidates.Add(minion); } } var sortedCandidates = collisionCandidates.OrderBy(h => h.Distance(currentSpellPosition)); foreach (var candidate in sortedCandidates) { var projection = candidate.ServerPosition.To2D().ProjectOn(currentSpellPosition.To2D(), endPos.To2D()); if (projection.IsOnSegment && projection.SegmentPoint.Distance(candidate.ServerPosition.To2D()) <= candidate.BoundingRadius + data.radius + extraRadius) { return(candidate); } } return(null); }
public static SpellData CopyData(this SpellData data) { return(data); }
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; } 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 startStartPos, Vector3 spellEndPos, SpellData spellData, GameObject obj = null, float extraEndTick = 0.0f, bool processSpell = true) { if (startStartPos.Distance(myHero.Position) < spellData.range + 1000) { Vector2 startPosition = startStartPos.To2D(); Vector2 endPosition = spellEndPos.To2D(); Vector2 direction = (endPosition - startPosition).Normalized(); float endTick = 0; 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 (spellData.spellType == SpellType.Line) { endTick = spellData.spellDelay + (spellData.range / spellData.projectileSpeed) * 1000; endPosition = startPosition + direction * spellData.range; if (obj != null) { endTick -= spellData.spellDelay; } } else if (spellData.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; } } else if (spellData.spellType == SpellType.Cone) { return; } endTick += extraEndTick; Spell newSpell = new Spell(); newSpell.startTime = Evade.GetTickCount(); newSpell.endTime = Evade.GetTickCount() + endTick; newSpell.startPos = startPosition; newSpell.endPos = endPosition; newSpell.direction = direction; newSpell.heroID = hero.NetworkId; newSpell.info = spellData; if (obj != null) { newSpell.spellObject = obj; newSpell.projectileID = obj.NetworkId; } int spellID = CreateSpell(newSpell, processSpell); Utility.DelayAction.Add((int)endTick, () => DeleteSpell(spellID)); } }
private static void OnCreateObj_FizzMarinerDoom(GameObject obj, EventArgs args, SpellData spellData) { if (!obj.IsValid<MissileClient>()) return; MissileClient missile = (MissileClient)obj; if (missile.SpellCaster != null && missile.SpellCaster.Team != myHero.Team && missile.SData.Name == "FizzMarinerDoomMissile") { SpellDetector.CreateSpellData(missile.SpellCaster, missile.StartPosition, missile.EndPosition, spellData, null, 500, true, SpellType.Circular, false, spellData.secondaryRadius); /*foreach (KeyValuePair<int, Spell> entry in SpellDetector.spells) { var spell = entry.Value; if (spell.info.spellName == "FizzMarinerDoom" && spell.spellObject != null && spell.spellObject.NetworkId == missile.NetworkId) { if (spell.spellType == SpellType.Circular) { spell.spellObject = null; } } }*/ } }
public static void LoadDummySpell(SpellData spell) { string menuName = spell.charName + " (" + spell.spellKey.ToString() + ") Settings"; var enableSpell = !spell.defaultOff; Menu newSpellMenu = spellMenu.IsSubMenu ? spellMenu.Parent.AddSubMenuEx(menuName, spell.charName + spell.spellName + "Settings") : spellMenu.AddSubMenuEx(menuName, spell.charName + spell.spellName + "Settings"); newSpellMenu.Add(spell.spellName + "DodgeSpell", new CheckBox("Dodge Spell", enableSpell)); newSpellMenu.Add(spell.spellName + "DrawSpell", new CheckBox("Draw Spell", enableSpell)); newSpellMenu.Add(spell.spellName + "SpellRadius", new Slider("Spell Radius", (int)spell.radius, (int)spell.radius - 100, (int)spell.radius + 100)); var slider = newSpellMenu.Add(spell.spellName + "DangerLevel", new Slider("Danger Level", spell.dangerlevel - 1, 0, 3)); var array = new[] {"Low", "Normal", "High", "Extreme"}; slider.OnValueChange += delegate(ValueBase<int> sender, ValueBase<int>.ValueChangeArgs args) { sender.DisplayName = array[args.NewValue]; }; slider.DisplayName = array[slider.CurrentValue]; ObjectCache.menuCache.AddMenuToCache(newSpellMenu); }
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.LSDistance(myHero.Position) < spellData.range + 1000) { Vector2 startPosition = spellStartPos.LSTo2D(); Vector2 endPosition = spellEndPos.LSTo2D(); Vector2 direction = (endPosition - startPosition).LSNormalized(); float endTick = 0; if (spellType == SpellType.None) { spellType = spellData.spellType; } if (spellData.fixedRange) //for diana q { if (endPosition.LSDistance(startPosition) > spellData.range) { //var heroCastPos = hero.ServerPosition.LSTo2D(); //direction = (endPosition - heroCastPos).LSNormalized(); 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.LSTo2D().LSDistance(spellStartPos.LSTo2D()); endTick = spellData.spellDelay + (range / spellData.projectileSpeed) * 1000; endPosition = spellEndPos.LSTo2D(); } if (obj != null) endTick -= spellData.spellDelay; } else if (spellType == SpellType.Circular) { endTick = spellData.spellDelay; if (spellData.projectileSpeed == 0) { endPosition = hero.ServerPosition.LSTo2D(); } else if (spellData.projectileSpeed > 0) { if (spellData.spellType == SpellType.Line && spellData.hasEndExplosion && spellData.useEndPosition == false) { endPosition = startPosition + direction * spellData.range; } endTick = endTick + 1000 * startPosition.LSDistance(endPosition) / spellData.projectileSpeed; } } else if (spellType == SpellType.Arc) { endTick = endTick + 1000 * startPosition.LSDistance(endPosition) / spellData.projectileSpeed; if (obj != null) endTick -= spellData.spellDelay; } else if (spellType == SpellType.Cone) { return; } else { return; } if (spellData.invert) { var dir = (startPosition - endPosition).LSNormalized(); endPosition = startPosition + dir * startPosition.LSDistance(endPosition); } if (spellData.isPerpendicular) { startPosition = spellEndPos.LSTo2D() - direction.LSPerpendicular() * spellData.secondaryRadius; endPosition = spellEndPos.LSTo2D() + direction.LSPerpendicular() * 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)); } }
private void LoadSpecialSpell(SpellData spell) { if (championPlugins.ContainsKey(spell.charName)) { championPlugins[spell.charName].LoadSpecialSpell(spell); } championPlugins["AllChampions"].LoadSpecialSpell(spell); }
private static void OnDeleteObj_FizzMarinerDoom(GameObject obj, EventArgs args, SpellData spellData) { //need to track where bait is attached to if (!obj.IsValid <MissileClient>()) { return; } MissileClient missile = (MissileClient)obj; if (missile.SpellCaster != null && missile.SpellCaster.Team != myHero.Team && missile.SData.Name == "FizzMarinerDoomMissile") { SpellDetector.CreateSpellData(missile.SpellCaster, missile.StartPosition, missile.EndPosition, spellData, null, 1000, true, SpellType.Circular, false, 350); } }