AhScript


SUBMITTED BY: Alerand

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

UPDATED: May 7, 2016, 10:47 a.m.

FORMAT: Text only

SIZE: 11.5 kB

HITS: 12239

  1. namespace Marksman.Champions
  2. {
  3. internal class Ashe : Champion
  4. {
  5. public static Spell Q;
  6. public static Spell W;
  7. public static Spell E;
  8. public static Spell R;
  9. public Ashe()
  10. {
  11. Q = new Spell(SpellSlot.Q);
  12. W = new Spell(SpellSlot.W, 1200);
  13. E = new Spell(SpellSlot.E);
  14. R = new Spell(SpellSlot.R, 20000);
  15. W.SetSkillshot(250f, (float) (24.32f*Math.PI/180), 902f, true, SkillshotType.SkillshotCone);
  16. E.SetSkillshot(377f, 299f, 1400f, false, SkillshotType.SkillshotLine);
  17. R.SetSkillshot(250f, 130f, 1600f, false, SkillshotType.SkillshotLine);
  18. Obj_AI_Base.OnProcessSpellCast += Game_OnProcessSpell;
  19. Interrupter2.OnInterruptableTarget += Interrupter2_OnInterruptableTarget;
  20. Utility.HpBarDamageIndicator.DamageToUnit = GetComboDamage;
  21. Utility.HpBarDamageIndicator.Enabled = true;
  22. Utils.Utils.PrintMessage("Ashe loaded.");
  23. }
  24. private static bool AsheQCastReady
  25. {
  26. get { return ObjectManager.Player.HasBuff("AsheQCastReady", true); }
  27. }
  28. public bool IsQActive
  29. {
  30. get { return ObjectManager.Player.HasBuff("FrostShot"); }
  31. }
  32. private void Interrupter2_OnInterruptableTarget(Obj_AI_Hero unit, Interrupter2.InterruptableTargetEventArgs args)
  33. {
  34. if (R.IsReady() && Config.Item("RInterruptable" + Id).GetValue<bool>() && unit.IsValidTarget(1500))
  35. {
  36. R.Cast(unit);
  37. }
  38. }
  39. private static float GetComboDamage(Obj_AI_Hero t)
  40. {
  41. var fComboDamage = 0f;
  42. if (W.IsReady())
  43. fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.W);
  44. if (R.IsReady())
  45. fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.R);
  46. if (ObjectManager.Player.GetSpellSlot("summonerdot") != SpellSlot.Unknown &&
  47. ObjectManager.Player.Spellbook.CanUseSpell(ObjectManager.Player.GetSpellSlot("summonerdot")) ==
  48. SpellState.Ready && ObjectManager.Player.Distance(t) < 550)
  49. fComboDamage += (float) ObjectManager.Player.GetSummonerSpellDamage(t, Damage.SummonerSpell.Ignite);
  50. if (Items.CanUseItem(3144) && ObjectManager.Player.Distance(t) < 550)
  51. fComboDamage += (float) ObjectManager.Player.GetItemDamage(t, Damage.DamageItems.Bilgewater);
  52. if (Items.CanUseItem(3153) && ObjectManager.Player.Distance(t) < 550)
  53. fComboDamage += (float) ObjectManager.Player.GetItemDamage(t, Damage.DamageItems.Botrk);
  54. return fComboDamage;
  55. }
  56. public void Game_OnProcessSpell(Obj_AI_Base unit, GameObjectProcessSpellCastEventArgs spell)
  57. {
  58. if (!Config.Item("EFlash" + Id).GetValue<bool>() || unit.Team == ObjectManager.Player.Team)
  59. return;
  60. if (spell.SData.Name.ToLower() == "summonerflash")
  61. E.Cast(spell.End);
  62. }
  63. public override void Game_OnGameUpdate(EventArgs args)
  64. {
  65. if (LaneClearActive)
  66. {
  67. if (Program.Config.Item("UseQForBigBoys").GetValue<bool>())
  68. JungleFarm();
  69. }
  70. else if (!ComboActive)
  71. {
  72. var t = TargetSelector.GetTarget(W.Range, TargetSelector.DamageType.Physical);
  73. if (!t.IsValidTarget() || !W.IsReady())
  74. return;
  75. if (Program.Config.Item("UseWTH").GetValue<KeyBind>().Active)
  76. {
  77. if (ObjectManager.Player.HasBuff("Recall"))
  78. return;
  79. W.Cast(t);
  80. }
  81. if (t.HasBuffOfType(BuffType.Stun) || t.HasBuffOfType(BuffType.Snare) ||
  82. t.HasBuffOfType(BuffType.Charm) || t.HasBuffOfType(BuffType.Fear) ||
  83. t.HasBuffOfType(BuffType.Taunt) || t.HasBuff("zhonyasringshield") ||
  84. t.HasBuff("Recall"))
  85. {
  86. W.Cast(t.Position);
  87. }
  88. }
  89. /* [ Combo ] */
  90. if (ComboActive)
  91. {
  92. var useQ = Config.Item("UseQC" + Id).GetValue<bool>();
  93. var useW = Config.Item("UseWC" + Id).GetValue<bool>();
  94. var t = TargetSelector.GetTarget(W.Range, TargetSelector.DamageType.Physical);
  95. if (useQ && Q.IsReady() && AsheQCastReady)
  96. {
  97. if (t.IsValidTarget(DeathWalker.getRealAutoAttackRange(null) + 90))
  98. {
  99. Q.Cast();
  100. }
  101. }
  102. if (useW && W.IsReady() && t.IsValidTarget())
  103. {
  104. W.Cast(t);
  105. }
  106. var useR = Program.Config.SubMenu("Combo").Item("UseRC").GetValue<bool>();
  107. if (useR && R.IsReady())
  108. {
  109. var minRRange = Program.Config.SubMenu("Combo").Item("UseRCMinRange").GetValue<Slider>().Value;
  110. var maxRRange = Program.Config.SubMenu("Combo").Item("UseRCMaxRange").GetValue<Slider>().Value;
  111. t = TargetSelector.GetTarget(maxRRange, TargetSelector.DamageType.Physical);
  112. if (!t.IsValidTarget())
  113. return;
  114. var aaDamage = DeathWalker.inAutoAttackRange(t)
  115. ? ObjectManager.Player.GetAutoAttackDamage(t, true)
  116. : 0;
  117. if (t.Health > aaDamage && t.Health <= ObjectManager.Player.GetSpellDamage(t, SpellSlot.R) &&
  118. ObjectManager.Player.Distance(t) >= minRRange)
  119. {
  120. R.Cast(t);
  121. }
  122. }
  123. }
  124. //Harass
  125. if (HarassActive)
  126. {
  127. var target = TargetSelector.GetTarget(1200, TargetSelector.DamageType.Physical);
  128. if (target == null)
  129. return;
  130. if (Config.Item("UseWH" + Id).GetValue<bool>() && W.IsReady())
  131. W.Cast(target);
  132. }
  133. //Manual cast R
  134. if (Config.Item("RManualCast" + Id).GetValue<KeyBind>().Active)
  135. {
  136. var rTarget = TargetSelector.GetTarget(2000, TargetSelector.DamageType.Physical);
  137. R.Cast(rTarget);
  138. }
  139. }
  140. public override bool ComboMenu(Menu config)
  141. {
  142. config.AddItem(new MenuItem("UseQC" + Id, "Q").SetValue(true));
  143. config.AddItem(new MenuItem("UseWC" + Id, "W").SetValue(true));
  144. var xRMenu = new Menu("R", "ComboR");
  145. {
  146. xRMenu.AddItem(new MenuItem("UseRC", "Use").SetValue(true));
  147. xRMenu.AddItem(new MenuItem("UseRCMinRange", "Min. Range").SetValue(new Slider(200, 200, 1000)));
  148. xRMenu.AddItem(new MenuItem("UseRCMaxRange", "Max. Range").SetValue(new Slider(500, 500, 2000)));
  149. xRMenu.AddItem(
  150. new MenuItem("DrawRMin", "Draw Min. R Range").SetValue(
  151. new Circle(true, System.Drawing.Color.DarkRed)));
  152. xRMenu.AddItem(
  153. new MenuItem("DrawRMax", "Draw Max. R Range").SetValue(
  154. new Circle(true, System.Drawing.Color.DarkMagenta)));
  155. config.AddSubMenu(xRMenu);
  156. }
  157. return true;
  158. }
  159. public override bool HarassMenu(Menu config)
  160. {
  161. config.AddItem(new MenuItem("UseWH" + Id, "W").SetValue(true));
  162. config.AddItem(
  163. new MenuItem("UseWTH", "Use W (Toggle)").SetValue(new KeyBind("H".ToCharArray()[0], KeyBindType.Toggle)));
  164. return true;
  165. }
  166. public override bool LaneClearMenu(Menu config)
  167. {
  168. config.AddItem(new MenuItem("UseQForBigBoys", "Use Q For Baron/Dragon/Red/Blue").SetValue(true));
  169. return true;
  170. }
  171. public override bool DrawingMenu(Menu config)
  172. {
  173. config.AddItem(
  174. new MenuItem("DrawW" + Id, "W range").SetValue(new Circle(true, System.Drawing.Color.CornflowerBlue)));
  175. config.AddItem(
  176. new MenuItem("DrawE" + Id, "E range").SetValue(new Circle(true,
  177. System.Drawing.Color.FromArgb(100, 255, 0, 255))));
  178. return true;
  179. }
  180. public override bool MiscMenu(Menu config)
  181. {
  182. config.AddItem(new MenuItem("RInterruptable" + Id, "Auto R Interruptable Spells").SetValue(true));
  183. config.AddItem(new MenuItem("EFlash" + Id, "Use E against Flashes").SetValue(true));
  184. config.AddItem(new MenuItem("RManualCast" + Id, "Cast R Manually(2000 range)"))
  185. .SetValue(new KeyBind('T', KeyBindType.Press));
  186. return true;
  187. }
  188. public override void Drawing_OnDraw(EventArgs args)
  189. {
  190. var drawW = Config.Item("DrawW" + Id).GetValue<Circle>();
  191. if (drawW.Active)
  192. {
  193. Render.Circle.DrawCircle(ObjectManager.Player.Position, W.Range, drawW.Color);
  194. }
  195. var drawE = Config.Item("DrawE" + Id).GetValue<Circle>();
  196. if (drawE.Active)
  197. {
  198. Render.Circle.DrawCircle(ObjectManager.Player.Position, E.Range, drawE.Color);
  199. }
  200. var drawRMin = Program.Config.SubMenu("Combo").Item("DrawRMin").GetValue<Circle>();
  201. if (drawRMin.Active)
  202. {
  203. var minRRange = Program.Config.SubMenu("Combo").Item("UseRCMinRange").GetValue<Slider>().Value;
  204. Render.Circle.DrawCircle(ObjectManager.Player.Position, minRRange, drawRMin.Color, 2);
  205. }
  206. var drawRMax = Program.Config.SubMenu("Combo").Item("DrawRMax").GetValue<Circle>();
  207. if (drawRMax.Active)
  208. {
  209. var maxRRange = Program.Config.SubMenu("Combo").Item("UseRCMaxRange").GetValue<Slider>().Value;
  210. Render.Circle.DrawCircle(ObjectManager.Player.Position, maxRRange, drawRMax.Color, 2);
  211. }
  212. }
  213. private static void JungleFarm()
  214. {
  215. var mobs = MinionManager.GetMinions(ObjectManager.Player.ServerPosition,
  216. DeathWalker.getRealAutoAttackRange(null) + 65, MinionTypes.All,
  217. MinionTeam.Neutral, MinionOrderTypes.MaxHealth);
  218. if (mobs == null)
  219. return;
  220. var mob = mobs[0];
  221. string[] bigBoys = {"Baron", "Dragon", "Red", "Blue"};
  222. foreach (
  223. var xbigBoys in
  224. bigBoys.Where(xbigBoys => mob.Name.Contains(xbigBoys))
  225. .Where(xbigBoys => Q.IsReady() && AsheQCastReady))
  226. {
  227. Q.Cast();
  228. }
  229. }
  230. public override bool ExtrasMenu(Menu config)
  231. {
  232. return true;
  233. }
  234. }
  235. }

comments powered by Disqus