#region using System; using System.Linq; using DetuksSharp; using LeagueSharp; using LeagueSharp.Common; using SharpDX; using Color = System.Drawing.Color; #endregion namespace Marksman.Champions { internal class Lucian : Champion { public static Spell Q; public static Spell Q2; public static Spell W; public static Spell E; public static bool DoubleHit = false; private static int xAttackLeft; private static float xPassiveUsedTime; public Lucian() { Utils.Utils.PrintMessage("Lucian loaded."); Q = new Spell(SpellSlot.Q, 675); Q2 = new Spell(SpellSlot.Q, 1100); W = new Spell(SpellSlot.W, 1000); Q.SetSkillshot(0.25f, 65f, 1100f, false, SkillshotType.SkillshotLine); W.SetSkillshot(0.30f, 80f, 1600f, true, SkillshotType.SkillshotLine); E = new Spell(SpellSlot.E, 475); xPassiveUsedTime = Game.Time; Obj_AI_Base.OnProcessSpellCast += Game_OnProcessSpell; } public static Obj_AI_Base QMinion { get { var vTarget = TargetSelector.GetTarget(Q2.Range, TargetSelector.DamageType.Physical); var vMinions = MinionManager.GetMinions( ObjectManager.Player.ServerPosition, Q.Range, MinionTypes.All, MinionTeam.NotAlly, MinionOrderTypes.None); return (from vMinion in vMinions.Where(vMinion => vMinion.IsValidTarget(Q.Range)) let endPoint = vMinion.ServerPosition.To2D() .Extend(ObjectManager.Player.ServerPosition.To2D(), -Q2.Range) .To3D() where vMinion.Distance(vTarget) <= vTarget.Distance(ObjectManager.Player) && Intersection(ObjectManager.Player.ServerPosition.To2D(), endPoint.To2D(), vTarget.ServerPosition.To2D(), vTarget.BoundingRadius + Q.Width/4) select vMinion).FirstOrDefault(); } } public static bool IsPositionSafeForE(Obj_AI_Hero target, Spell spell) { var predPos = spell.GetPrediction(target).UnitPosition.To2D(); var myPos = ObjectManager.Player.Position.To2D(); var newPos = (target.Position.To2D() - myPos); newPos.Normalize(); var checkPos = predPos + newPos*(spell.Range - Vector2.Distance(predPos, myPos)); Obj_Turret closestTower = null; foreach (var tower in ObjectManager.Get() .Where(tower => tower.IsValid && !tower.IsDead && Math.Abs(tower.Health) > float.Epsilon) .Where(tower => Vector3.Distance(tower.Position, ObjectManager.Player.Position) < 1450)) { closestTower = tower; } if (closestTower == null) return true; if (Vector2.Distance(closestTower.Position.To2D(), checkPos) <= 910) return false; return true; } public override void Drawing_OnDraw(EventArgs args) { Spell[] spellList = {Q, Q2, W, E}; foreach (var spell in spellList) { var menuItem = GetValue("Draw" + spell.Slot); if (!menuItem.Active || spell.Level < 0) return; Render.Circle.DrawCircle(ObjectManager.Player.Position, spell.Range, menuItem.Color); } } public static bool Intersection(Vector2 p1, Vector2 p2, Vector2 pC, float radius) { var p3 = new Vector2(pC.X + radius, pC.Y + radius); var m = ((p2.Y - p1.Y)/(p2.X - p1.X)); var constant = (m*p1.X) - p1.Y; var b = -(2f*((m*constant) + p3.X + (m*p3.Y))); var a = (1 + (m*m)); var c = ((p3.X*p3.X) + (p3.Y*p3.Y) - (radius*radius) + (2f*constant*p3.Y) + (constant*constant)); var d = ((b*b) - (4f*a*c)); return d > 0; } public void Game_OnProcessSpell(Obj_AI_Base unit, GameObjectProcessSpellCastEventArgs spell) { if (!unit.IsMe) return; if (spell.SData.Name.Contains("summoner")) return; if (!Config.Item("Passive" + Id).GetValue()) return; if (spell.SData.Name.ToLower().Contains("lucianq") || spell.SData.Name.ToLower().Contains("lucianw") || spell.SData.Name.ToLower().Contains("luciane") || spell.SData.Name.ToLower().Contains("lucianr")) { xAttackLeft = 1; xPassiveUsedTime = Game.Time; } if (spell.SData.Name.ToLower().Contains("lucianpassiveattack")) { Utility.DelayAction.Add(500, () => { xAttackLeft -= 1; }); } } public override void Game_OnGameUpdate(EventArgs args) { if (ObjectManager.Player.IsDead) { xAttackLeft = 0; return; } if (Game.Time > xPassiveUsedTime + 3 && xAttackLeft == 1) { xAttackLeft = 0; } if (Config.Item("Passive" + Id).GetValue() && xAttackLeft > 0) return; if (Q.IsReady() && GetValue("UseQTH").Active && ToggleActive) { if (ObjectManager.Player.HasBuff("Recall")) return; var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (t != null) Q.CastOnUnit(t); } if (Q.IsReady() && GetValue("UseQExtendedTH").Active && ToggleActive) { if (ObjectManager.Player.HasBuff("Recall")) return; var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget() && QMinion.IsValidTarget()) { if (ObjectManager.Player.Distance(t) > Q.Range) Q.CastOnUnit(QMinion); } } if ((!ComboActive && !HarassActive)) return; var useQ = Config.Item("UseQ" + (ComboActive ? "C" : "H") + Id).GetValue(); var useW = Config.Item("UseW" + (ComboActive ? "C" : "H") + Id).GetValue(); var useE = Config.Item("UseE" + (ComboActive ? "C" : "H") + Id).GetValue(); var useQExtended = Config.Item("UseQExtended" + (ComboActive ? "C" : "H") + Id).GetValue(); // if (ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Level > 0) // Config.Item("GHOSTBLADE") // .SetValue(ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Name == "LucianR"); if (useQExtended && Q.IsReady()) { var t = TargetSelector.GetTarget(Q2.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget() && QMinion.IsValidTarget()) { if (!DeathWalker.inAutoAttackRange(t)) Q.CastOnUnit(QMinion); } } if (useQ && Q.IsReady()) { var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget()) { Q.CastOnUnit(t); } } if (useW && W.IsReady()) { var t = TargetSelector.GetTarget(W.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget()) { W.Cast(t); } } if (useE && E.IsReady()) { var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (t != null) { E.Cast(Game.CursorPos); } } } public override bool ComboMenu(Menu config) { config.AddItem(new MenuItem("UseQC" + Id, "Use Q").SetValue(true)); config.AddItem(new MenuItem("UseQExtendedC" + Id, "Use Extended Q").SetValue(true)); config.AddItem(new MenuItem("UseWC" + Id, "Use W").SetValue(true)); config.AddItem(new MenuItem("UseEC" + Id, "Use E").SetValue(true)); return true; } public override bool HarassMenu(Menu config) { config.AddItem(new MenuItem("UseQH" + Id, "Use Q").SetValue(true)); config.AddItem( new MenuItem("UseQTH" + Id, "Use Q (Toggle)").SetValue(new KeyBind("T".ToCharArray()[0], KeyBindType.Toggle))); config.AddItem(new MenuItem("UseQExtendedH" + Id, "Use Extended Q").SetValue(true)); config.AddItem( new MenuItem("UseQExtendedTH" + Id, "Use Ext. Q (Toggle)").SetValue(new KeyBind("H".ToCharArray()[0], KeyBindType.Toggle))); config.AddItem(new MenuItem("UseWH" + Id, "Use W").SetValue(true)); config.AddItem(new MenuItem("UseEH" + Id, "Use E").SetValue(true)); return true; } public override bool MiscMenu(Menu config) { config.AddItem(new MenuItem("Passive" + Id, "Check Passive").SetValue(true)); return true; } public override bool DrawingMenu(Menu config) { config.AddItem(new MenuItem("DrawQ" + Id, "Q range").SetValue(new Circle(true, Color.Gray))); config.AddItem(new MenuItem("DrawQ2" + Id, "Ext. Q range").SetValue(new Circle(true, Color.Gray))); config.AddItem(new MenuItem("DrawW" + Id, "W range").SetValue(new Circle(false, Color.Gray))); config.AddItem(new MenuItem("DrawE" + Id, "E range").SetValue(new Circle(false, Color.Gray))); return true; } public override bool ExtrasMenu(Menu config) { return true; } public override bool LaneClearMenu(Menu config) { return true; } } }