Quinn


SUBMITTED BY: Alerand

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

FORMAT: Text only

SIZE: 8.2 kB

HITS: 10470

  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 Quinn : Champion
  13. {
  14. public static float ValorMinDamage;
  15. public static float ValorMaxDamage;
  16. public Spell E;
  17. public Spell Q;
  18. public Spell R;
  19. public Quinn()
  20. {
  21. Utils.Utils.PrintMessage("Quinn loaded.");
  22. Q = new Spell(SpellSlot.Q, 1010);
  23. E = new Spell(SpellSlot.E, 800);
  24. R = new Spell(SpellSlot.R, 550);
  25. Q.SetSkillshot(0.25f, 160f, 1150, true, SkillshotType.SkillshotLine);
  26. E.SetTargetted(0.25f, 2000f);
  27. AntiGapcloser.OnEnemyGapcloser += AntiGapcloser_OnEnemyGapcloser;
  28. }
  29. public void AntiGapcloser_OnEnemyGapcloser(ActiveGapcloser gapcloser)
  30. {
  31. if (E.IsReady() && gapcloser.Sender.IsValidTarget(E.Range))
  32. E.CastOnUnit(gapcloser.Sender);
  33. }
  34. public override void DeathWalker_AfterAttack(AttackableUnit unit, AttackableUnit target)
  35. {
  36. var t = target as Obj_AI_Hero;
  37. if (t == null || (!ComboActive && !HarassActive) || unit.IsMe) return;
  38. if (Q.IsReady() && GetValue<bool>("UseQ" + (ComboActive ? "C" : "H")))
  39. Q.Cast(t, false, true);
  40. }
  41. public override void Drawing_OnDraw(EventArgs args)
  42. {
  43. Spell[] spellList = {Q, E};
  44. foreach (var spell in spellList)
  45. {
  46. var menuItem = GetValue<Circle>("Draw" + spell.Slot);
  47. if (menuItem.Active && spell.Level > 0)
  48. Render.Circle.DrawCircle(ObjectManager.Player.Position, spell.Range, menuItem.Color);
  49. if (menuItem.Active && spell.Level > 0 && IsValorMode())
  50. Render.Circle.DrawCircle(ObjectManager.Player.Position, R.Range, menuItem.Color);
  51. }
  52. }
  53. public static bool IsPositionSafe(Obj_AI_Hero target, Spell spell)
  54. // use underTurret and .Extend for this please
  55. {
  56. var predPos = spell.GetPrediction(target).UnitPosition.To2D();
  57. var myPos = ObjectManager.Player.Position.To2D();
  58. var newPos = (target.Position.To2D() - myPos);
  59. newPos.Normalize();
  60. var checkPos = predPos + newPos*(spell.Range - Vector2.Distance(predPos, myPos));
  61. Obj_Turret closestTower = null;
  62. foreach (var tower in ObjectManager.Get<Obj_Turret>()
  63. .Where(tower => tower.IsValid && !tower.IsDead && Math.Abs(tower.Health) > float.Epsilon)
  64. .Where(tower => Vector3.Distance(tower.Position, ObjectManager.Player.Position) < 1450))
  65. {
  66. closestTower = tower;
  67. }
  68. if (closestTower == null)
  69. return true;
  70. if (Vector2.Distance(closestTower.Position.To2D(), checkPos) <= 910)
  71. return false;
  72. return true;
  73. }
  74. public static bool isHePantheon(Obj_AI_Hero target)
  75. {
  76. /* Quinn's Spell E can do nothing when Pantheon's passive is active. */
  77. return target.Buffs.All(buff => buff.Name == "pantheonpassivebuff");
  78. }
  79. private static bool IsValorMode()
  80. {
  81. return ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Name == "QuinnRFinale";
  82. }
  83. public static void calculateValorDamage()
  84. {
  85. if (ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Level > 0)
  86. {
  87. ValorMinDamage = ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Level*50 + 50;
  88. ValorMinDamage += ObjectManager.Player.BaseAttackDamage*50;
  89. ValorMaxDamage = ObjectManager.Player.Spellbook.GetSpell(SpellSlot.R).Level*100 + 100;
  90. ValorMaxDamage += ObjectManager.Player.BaseAttackDamage*100;
  91. }
  92. }
  93. public override void Game_OnGameUpdate(EventArgs args)
  94. {
  95. if (Q.IsReady() && GetValue<KeyBind>("UseQTH").Active)
  96. {
  97. if (ObjectManager.Player.HasBuff("Recall"))
  98. return;
  99. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  100. if (t != null)
  101. Q.Cast(t, false, true);
  102. }
  103. if (ComboActive || HarassActive)
  104. {
  105. var useQ = GetValue<bool>("UseQ" + (ComboActive ? "C" : "H"));
  106. var useE = GetValue<bool>("UseE" + (ComboActive ? "C" : "H"));
  107. var useET = GetValue<bool>("UseET" + (ComboActive ? "C" : "H"));
  108. if (DeathWalker.canMove())
  109. {
  110. if (E.IsReady() && useE)
  111. {
  112. var vTarget = TargetSelector.GetTarget(E.Range, TargetSelector.DamageType.Physical);
  113. if (vTarget != null && !isHePantheon(vTarget))
  114. {
  115. if (vTarget.Health <= E.GetDamage(vTarget) + Q.GetDamage(vTarget)*2)
  116. E.CastOnUnit(vTarget);
  117. else if (!useET)
  118. E.CastOnUnit(vTarget);
  119. else if (!vTarget.UnderTurret())
  120. E.CastOnUnit(vTarget);
  121. }
  122. }
  123. if (Q.IsReady() && useQ)
  124. {
  125. var vTarget = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  126. if (vTarget != null)
  127. Q.Cast(vTarget);
  128. }
  129. if (IsValorMode() && !E.IsReady())
  130. {
  131. var vTarget = TargetSelector.GetTarget(R.Range, TargetSelector.DamageType.Physical);
  132. if (vTarget != null)
  133. {
  134. calculateValorDamage();
  135. if (vTarget.Health >= ValorMinDamage && vTarget.Health <= ValorMaxDamage)
  136. R.Cast();
  137. }
  138. }
  139. }
  140. }
  141. }
  142. public override bool ComboMenu(Menu config)
  143. {
  144. config.AddItem(new MenuItem("UseQC" + Id, "Use Q").SetValue(true));
  145. config.AddItem(new MenuItem("UseEC" + Id, "Use E").SetValue(true));
  146. config.AddItem(new MenuItem("UseETC" + Id, "Do not Under Turret E").SetValue(true));
  147. config.AddItem(new MenuItem("UseETK" + Id, "Use E Under Turret If Enemy Killable")
  148. .SetValue(true));
  149. return true;
  150. }
  151. public override bool HarassMenu(Menu config)
  152. {
  153. config.AddItem(new MenuItem("UseQH" + Id, "Use Q").SetValue(true));
  154. config.AddItem(new MenuItem("UseEH" + Id, "Use E").SetValue(true));
  155. config.AddItem(new MenuItem("UseETH" + Id, "Do not Under Turret E").SetValue(true));
  156. config.AddItem(
  157. new MenuItem("UseQTH" + Id, "Use Q (Toggle)").SetValue(new KeyBind("H".ToCharArray()[0],
  158. KeyBindType.Toggle)));
  159. return true;
  160. }
  161. public override bool DrawingMenu(Menu config)
  162. {
  163. config.AddItem(
  164. new MenuItem("DrawQ" + Id, "Q range").SetValue(new Circle(true,
  165. Color.FromArgb(100, 255, 0, 255))));
  166. config.AddItem(
  167. new MenuItem("DrawE" + Id, "E range").SetValue(new Circle(false,
  168. Color.FromArgb(100, 255, 255, 255))));
  169. return true;
  170. }
  171. public override bool ExtrasMenu(Menu config)
  172. {
  173. return true;
  174. }
  175. public override bool LaneClearMenu(Menu config)
  176. {
  177. return true;
  178. }
  179. }
  180. }

comments powered by Disqus