Luc


SUBMITTED BY: Alerand

DATE: May 7, 2016, 10:55 a.m.

FORMAT: Text only

SIZE: 10.6 kB

HITS: 10612

  1. #region
  2. using System;
  3. using System.Linq;
  4. using DetuksSharp;
  5. using LeagueSharp;
  6. using LeagueSharp.Common;
  7. using SharpDX;
  8. using Color = System.Drawing.Color;
  9. #endregion
  10. namespace Marksman.Champions
  11. {
  12. internal class Lucian : Champion
  13. {
  14. public static Spell Q;
  15. public static Spell Q2;
  16. public static Spell W;
  17. public static Spell E;
  18. public static bool DoubleHit = false;
  19. private static int xAttackLeft;
  20. private static float xPassiveUsedTime;
  21. public Lucian()
  22. {
  23. Utils.Utils.PrintMessage("Lucian loaded.");
  24. Q = new Spell(SpellSlot.Q, 675);
  25. Q2 = new Spell(SpellSlot.Q, 1100);
  26. W = new Spell(SpellSlot.W, 1000);
  27. Q.SetSkillshot(0.25f, 65f, 1100f, false, SkillshotType.SkillshotLine);
  28. W.SetSkillshot(0.30f, 80f, 1600f, true, SkillshotType.SkillshotLine);
  29. E = new Spell(SpellSlot.E, 475);
  30. xPassiveUsedTime = Game.Time;
  31. Obj_AI_Base.OnProcessSpellCast += Game_OnProcessSpell;
  32. }
  33. public static Obj_AI_Base QMinion
  34. {
  35. get
  36. {
  37. var vTarget = TargetSelector.GetTarget(Q2.Range, TargetSelector.DamageType.Physical);
  38. var vMinions = MinionManager.GetMinions(
  39. ObjectManager.Player.ServerPosition, Q.Range, MinionTypes.All, MinionTeam.NotAlly,
  40. MinionOrderTypes.None);
  41. return (from vMinion in vMinions.Where(vMinion => vMinion.IsValidTarget(Q.Range))
  42. let endPoint =
  43. vMinion.ServerPosition.To2D()
  44. .Extend(ObjectManager.Player.ServerPosition.To2D(), -Q2.Range)
  45. .To3D()
  46. where
  47. vMinion.Distance(vTarget) <= vTarget.Distance(ObjectManager.Player) &&
  48. Intersection(ObjectManager.Player.ServerPosition.To2D(), endPoint.To2D(),
  49. vTarget.ServerPosition.To2D(), vTarget.BoundingRadius + Q.Width/4)
  50. select vMinion).FirstOrDefault();
  51. }
  52. }
  53. public static bool IsPositionSafeForE(Obj_AI_Hero target, Spell spell)
  54. {
  55. var predPos = spell.GetPrediction(target).UnitPosition.To2D();
  56. var myPos = ObjectManager.Player.Position.To2D();
  57. var newPos = (target.Position.To2D() - myPos);
  58. newPos.Normalize();
  59. var checkPos = predPos + newPos*(spell.Range - Vector2.Distance(predPos, myPos));
  60. Obj_Turret closestTower = null;
  61. foreach (var tower in ObjectManager.Get<Obj_Turret>()
  62. .Where(tower => tower.IsValid && !tower.IsDead && Math.Abs(tower.Health) > float.Epsilon)
  63. .Where(tower => Vector3.Distance(tower.Position, ObjectManager.Player.Position) < 1450))
  64. {
  65. closestTower = tower;
  66. }
  67. if (closestTower == null)
  68. return true;
  69. if (Vector2.Distance(closestTower.Position.To2D(), checkPos) <= 910)
  70. return false;
  71. return true;
  72. }
  73. public override void Drawing_OnDraw(EventArgs args)
  74. {
  75. Spell[] spellList = {Q, Q2, W, E};
  76. foreach (var spell in spellList)
  77. {
  78. var menuItem = GetValue<Circle>("Draw" + spell.Slot);
  79. if (!menuItem.Active || spell.Level < 0) return;
  80. Render.Circle.DrawCircle(ObjectManager.Player.Position, spell.Range, menuItem.Color);
  81. }
  82. }
  83. public static bool Intersection(Vector2 p1, Vector2 p2, Vector2 pC, float radius)
  84. {
  85. var p3 = new Vector2(pC.X + radius, pC.Y + radius);
  86. var m = ((p2.Y - p1.Y)/(p2.X - p1.X));
  87. var constant = (m*p1.X) - p1.Y;
  88. var b = -(2f*((m*constant) + p3.X + (m*p3.Y)));
  89. var a = (1 + (m*m));
  90. var c = ((p3.X*p3.X) + (p3.Y*p3.Y) - (radius*radius) + (2f*constant*p3.Y) + (constant*constant));
  91. var d = ((b*b) - (4f*a*c));
  92. return d > 0;
  93. }
  94. public void Game_OnProcessSpell(Obj_AI_Base unit, GameObjectProcessSpellCastEventArgs spell)
  95. {
  96. if (!unit.IsMe) return;
  97. if (spell.SData.Name.Contains("summoner")) return;
  98. if (!Config.Item("Passive" + Id).GetValue<bool>()) return;
  99. if (spell.SData.Name.ToLower().Contains("lucianq") || spell.SData.Name.ToLower().Contains("lucianw") ||
  100. spell.SData.Name.ToLower().Contains("luciane") || spell.SData.Name.ToLower().Contains("lucianr"))
  101. {
  102. xAttackLeft = 1;
  103. xPassiveUsedTime = Game.Time;
  104. }
  105. if (spell.SData.Name.ToLower().Contains("lucianpassiveattack"))
  106. {
  107. Utility.DelayAction.Add(500, () => { xAttackLeft -= 1; });
  108. }
  109. }
  110. public override void Game_OnGameUpdate(EventArgs args)
  111. {
  112. if (ObjectManager.Player.IsDead)
  113. {
  114. xAttackLeft = 0;
  115. return;
  116. }
  117. if (Game.Time > xPassiveUsedTime + 3 && xAttackLeft == 1)
  118. {
  119. xAttackLeft = 0;
  120. }
  121. if (Config.Item("Passive" + Id).GetValue<bool>() && xAttackLeft > 0)
  122. return;
  123. if (Q.IsReady() && GetValue<KeyBind>("UseQTH").Active && ToggleActive)
  124. {
  125. if (ObjectManager.Player.HasBuff("Recall"))
  126. return;
  127. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  128. if (t != null)
  129. Q.CastOnUnit(t);
  130. }
  131. if (Q.IsReady() && GetValue<KeyBind>("UseQExtendedTH").Active && ToggleActive)
  132. {
  133. if (ObjectManager.Player.HasBuff("Recall"))
  134. return;
  135. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  136. if (t.IsValidTarget() && QMinion.IsValidTarget())
  137. {
  138. if (ObjectManager.Player.Distance(t) > Q.Range)
  139. Q.CastOnUnit(QMinion);
  140. }
  141. }
  142. if ((!ComboActive && !HarassActive)) return;
  143. var useQ = Config.Item("UseQ" + (ComboActive ? "C" : "H") + Id).GetValue<bool>();
  144. var useW = Config.Item("UseW" + (ComboActive ? "C" : "H") + Id).GetValue<bool>();
  145. var useE = Config.Item("UseE" + (ComboActive ? "C" : "H") + Id).GetValue<bool>();
  146. var useQExtended = Config.Item("UseQExtended" + (ComboActive ? "C" : "H") + Id).GetValue<bool>();
  147. // if (ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Level > 0)
  148. // Config.Item("GHOSTBLADE")
  149. // .SetValue(ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Name == "LucianR");
  150. if (useQExtended && Q.IsReady())
  151. {
  152. var t = TargetSelector.GetTarget(Q2.Range, TargetSelector.DamageType.Physical);
  153. if (t.IsValidTarget() && QMinion.IsValidTarget())
  154. {
  155. if (!DeathWalker.inAutoAttackRange(t))
  156. Q.CastOnUnit(QMinion);
  157. }
  158. }
  159. if (useQ && Q.IsReady())
  160. {
  161. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  162. if (t.IsValidTarget())
  163. {
  164. Q.CastOnUnit(t);
  165. }
  166. }
  167. if (useW && W.IsReady())
  168. {
  169. var t = TargetSelector.GetTarget(W.Range, TargetSelector.DamageType.Physical);
  170. if (t.IsValidTarget())
  171. {
  172. W.Cast(t);
  173. }
  174. }
  175. if (useE && E.IsReady())
  176. {
  177. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  178. if (t != null)
  179. {
  180. E.Cast(Game.CursorPos);
  181. }
  182. }
  183. }
  184. public override bool ComboMenu(Menu config)
  185. {
  186. config.AddItem(new MenuItem("UseQC" + Id, "Use Q").SetValue(true));
  187. config.AddItem(new MenuItem("UseQExtendedC" + Id, "Use Extended Q").SetValue(true));
  188. config.AddItem(new MenuItem("UseWC" + Id, "Use W").SetValue(true));
  189. config.AddItem(new MenuItem("UseEC" + Id, "Use E").SetValue(true));
  190. return true;
  191. }
  192. public override bool HarassMenu(Menu config)
  193. {
  194. config.AddItem(new MenuItem("UseQH" + Id, "Use Q").SetValue(true));
  195. config.AddItem(
  196. new MenuItem("UseQTH" + Id, "Use Q (Toggle)").SetValue(new KeyBind("T".ToCharArray()[0],
  197. KeyBindType.Toggle)));
  198. config.AddItem(new MenuItem("UseQExtendedH" + Id, "Use Extended Q").SetValue(true));
  199. config.AddItem(
  200. new MenuItem("UseQExtendedTH" + Id, "Use Ext. Q (Toggle)").SetValue(new KeyBind("H".ToCharArray()[0],
  201. KeyBindType.Toggle)));
  202. config.AddItem(new MenuItem("UseWH" + Id, "Use W").SetValue(true));
  203. config.AddItem(new MenuItem("UseEH" + Id, "Use E").SetValue(true));
  204. return true;
  205. }
  206. public override bool MiscMenu(Menu config)
  207. {
  208. config.AddItem(new MenuItem("Passive" + Id, "Check Passive").SetValue(true));
  209. return true;
  210. }
  211. public override bool DrawingMenu(Menu config)
  212. {
  213. config.AddItem(new MenuItem("DrawQ" + Id, "Q range").SetValue(new Circle(true, Color.Gray)));
  214. config.AddItem(new MenuItem("DrawQ2" + Id, "Ext. Q range").SetValue(new Circle(true, Color.Gray)));
  215. config.AddItem(new MenuItem("DrawW" + Id, "W range").SetValue(new Circle(false, Color.Gray)));
  216. config.AddItem(new MenuItem("DrawE" + Id, "E range").SetValue(new Circle(false, Color.Gray)));
  217. return true;
  218. }
  219. public override bool ExtrasMenu(Menu config)
  220. {
  221. return true;
  222. }
  223. public override bool LaneClearMenu(Menu config)
  224. {
  225. return true;
  226. }
  227. }
  228. }

comments powered by Disqus