Vars


SUBMITTED BY: Alerand

DATE: May 7, 2016, 11:01 a.m.

FORMAT: Text only

SIZE: 12.5 kB

HITS: 9991

  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 Varus : Champion
  13. {
  14. public static Spell Q, W, E, R;
  15. private float LastSpellTick;
  16. public Varus()
  17. {
  18. Utils.Utils.PrintMessage("Varus loaded!");
  19. Q = new Spell(SpellSlot.Q, 1600f);
  20. W = new Spell(SpellSlot.W);
  21. E = new Spell(SpellSlot.E, 925f);
  22. R = new Spell(SpellSlot.R, 1200f);
  23. Q.SetSkillshot(.25f, 70f, 1650f, false, SkillshotType.SkillshotLine);
  24. E.SetSkillshot(.50f, 250f, 1400f, false, SkillshotType.SkillshotCircle);
  25. R.SetSkillshot(.25f, 120f, 1950f, false, SkillshotType.SkillshotLine);
  26. Q.SetCharged("VarusQ", "VarusQ", 250, 1600, 1.2f);
  27. Utility.HpBarDamageIndicator.DamageToUnit = GetComboDamage;
  28. Utility.HpBarDamageIndicator.Enabled = true;
  29. Obj_AI_Base.OnProcessSpellCast += Obj_AI_Hero_OnProcessSpellCast;
  30. }
  31. private static float CalcWDamage
  32. {
  33. get
  34. {
  35. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  36. var xEnemyWStackCount = EnemyWStackCount(t);
  37. var wExplodePerStack = ObjectManager.Player.GetSpellDamage(t, SpellSlot.W, 1)*xEnemyWStackCount > 0
  38. ? xEnemyWStackCount
  39. : 1;
  40. return wExplodePerStack;
  41. }
  42. }
  43. private static float CalcQDamage
  44. {
  45. get
  46. {
  47. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  48. if (!Q.IsReady())
  49. return 0;
  50. /*
  51. var qDamageMaxPerLevel = new[] {15f, 70f, 125f, 180f, 235f};
  52. var fxQDamage2 = qDamageMaxPerLevel[Q.Level - 1] +
  53. 1.6*
  54. (ObjectManager.Player.BaseAttackDamage + ObjectManager.Player.FlatPhysicalDamageMod);
  55. var xDis = ObjectManager.Player.Distance(t)/Q.ChargedMaxRange;
  56. return (float) fxQDamage2*xDis;
  57. */
  58. var fxQDamage2 = ObjectManager.Player.GetSpellDamage(t, SpellSlot.Q, 1);
  59. return (float) fxQDamage2;
  60. }
  61. }
  62. private float GetComboDamage(Obj_AI_Hero t)
  63. {
  64. var fComboDamage = 0f;
  65. if (Q.IsReady())
  66. fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.Q);
  67. //fComboDamage += CalcQDamage;
  68. if (W.Level > 0)
  69. fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.W);
  70. if (E.IsReady())
  71. fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.E);
  72. if (R.IsReady())
  73. fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.R);
  74. if (ObjectManager.Player.GetSpellSlot("summonerdot") != SpellSlot.Unknown &&
  75. ObjectManager.Player.Spellbook.CanUseSpell(ObjectManager.Player.GetSpellSlot("summonerdot")) ==
  76. SpellState.Ready && ObjectManager.Player.Distance(t) < 550)
  77. fComboDamage += (float) ObjectManager.Player.GetSummonerSpellDamage(t, Damage.SummonerSpell.Ignite);
  78. if (Items.CanUseItem(3144) && ObjectManager.Player.Distance(t) < 550)
  79. fComboDamage += (float) ObjectManager.Player.GetItemDamage(t, Damage.DamageItems.Bilgewater);
  80. if (Items.CanUseItem(3153) && ObjectManager.Player.Distance(t) < 550)
  81. fComboDamage += (float) ObjectManager.Player.GetItemDamage(t, Damage.DamageItems.Botrk);
  82. return fComboDamage;
  83. }
  84. private void Obj_AI_Hero_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args)
  85. {
  86. if (!sender.IsMe || args.SData.Name.ToLower().Contains("attack"))
  87. return;
  88. LastSpellTick = Environment.TickCount;
  89. }
  90. public static int EnemyWStackCount(Obj_AI_Hero t)
  91. {
  92. return
  93. t.Buffs.Where(xBuff => xBuff.Name == "varuswdebuff" && t.IsValidTarget(Q.Range))
  94. .Select(xBuff => xBuff.Count)
  95. .FirstOrDefault();
  96. }
  97. public override void Drawing_OnDraw(EventArgs args)
  98. {
  99. var drawQ = GetValue<Circle>("DrawQ");
  100. var drawE = GetValue<Circle>("DrawE");
  101. var drawR = GetValue<Circle>("DrawR");
  102. var drawQc = GetValue<Circle>("DrawQC");
  103. var drawRs = GetValue<Circle>("DrawRS");
  104. if (drawQ.Active)
  105. Render.Circle.DrawCircle(ObjectManager.Player.Position, Q.Range, drawQ.Color);
  106. if (drawE.Active)
  107. Render.Circle.DrawCircle(ObjectManager.Player.Position, E.Range, drawE.Color);
  108. if (drawQc.Active)
  109. Render.Circle.DrawCircle(ObjectManager.Player.Position, GetValue<Slider>("QMinChargeC").Value,
  110. drawQc.Color);
  111. if (drawR.Active)
  112. Render.Circle.DrawCircle(ObjectManager.Player.Position, R.Range, drawR.Color);
  113. if (GetValue<KeyBind>("CastR").Active && drawRs.Active)
  114. {
  115. Vector3 drawPosition;
  116. if (ObjectManager.Player.Distance(Game.CursorPos) < R.Range - 300f)
  117. drawPosition = Game.CursorPos;
  118. else
  119. drawPosition = ObjectManager.Player.Position +
  120. Vector3.Normalize(Game.CursorPos - ObjectManager.Player.Position)*(R.Range - 300f);
  121. Render.Circle.DrawCircle(drawPosition, 300f, drawRs.Color);
  122. }
  123. }
  124. private static void CastSpellQ()
  125. {
  126. if (!Q.IsReady())
  127. return;
  128. var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  129. if (!t.IsValidTarget(Q.Range))
  130. return;
  131. var qMinCharge = Program.Config.Item("QMinChargeC").GetValue<Slider>().Value;
  132. ObjectManager.Player.IssueOrder(GameObjectOrder.MoveTo, Game.CursorPos);
  133. if (Q.IsCharging)
  134. {
  135. if (Q.Range >= qMinCharge)
  136. Q.Cast(t, false, true);
  137. }
  138. else
  139. {
  140. Q.StartCharging();
  141. }
  142. }
  143. public override void Game_OnGameUpdate(EventArgs args)
  144. {
  145. if (GetValue<KeyBind>("CastR").Active)
  146. {
  147. Vector3 searchPos;
  148. if (ObjectManager.Player.Distance(Game.CursorPos) < R.Range - 300f)
  149. searchPos = Game.CursorPos;
  150. else
  151. searchPos = ObjectManager.Player.Position +
  152. Vector3.Normalize(Game.CursorPos - ObjectManager.Player.Position)*(R.Range - 300f);
  153. var rTarget =
  154. ObjectManager.Get<Obj_AI_Hero>()
  155. .Where(hero => hero.IsValidTarget(R.Range) && hero.Distance(searchPos) < 300f)
  156. .OrderByDescending(TargetSelector.GetPriority)
  157. .First();
  158. if (rTarget != null && R.IsReady())
  159. R.Cast(rTarget);
  160. }
  161. if (GetValue<KeyBind>("UseQ2C").Active)
  162. {
  163. ObjectManager.Player.IssueOrder(GameObjectOrder.MoveTo, Game.CursorPos);
  164. CastSpellQ();
  165. }
  166. Obj_AI_Hero t;
  167. if (E.IsReady() && GetValue<KeyBind>("UseETH").Active)
  168. {
  169. if (ObjectManager.Player.HasBuff("Recall"))
  170. return;
  171. t = TargetSelector.GetTarget(E.Range, TargetSelector.DamageType.Physical);
  172. if (t != null)
  173. E.Cast(t, false, true);
  174. }
  175. if (!ComboActive && !HarassActive) return;
  176. var useQ = GetValue<StringList>("UseQ" + (ComboActive ? "C" : "H"));
  177. var useE = GetValue<bool>("UseE" + (ComboActive ? "C" : "H"));
  178. var useR = GetValue<bool>("UseRC");
  179. t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical);
  180. if (t.IsValidTarget(Q.Range) && t.Health <= CalcQDamage + CalcWDamage)
  181. CastSpellQ();
  182. switch (useQ.SelectedIndex)
  183. {
  184. case 1:
  185. {
  186. CastSpellQ();
  187. break;
  188. }
  189. case 2:
  190. {
  191. if (EnemyWStackCount(t) > 2 || W.Level == 0)
  192. CastSpellQ();
  193. break;
  194. }
  195. }
  196. if (useE && E.IsReady())
  197. {
  198. t = TargetSelector.GetTarget(E.Range, TargetSelector.DamageType.Physical);
  199. if (t.IsValidTarget(E.Range))
  200. E.Cast(t, false, true);
  201. }
  202. if (useR && R.IsReady())
  203. {
  204. t = TargetSelector.GetTarget(R.Range, TargetSelector.DamageType.Physical);
  205. if (t.IsValidTarget(R.Range) && t.Health <= ObjectManager.Player.GetSpellDamage(t, SpellSlot.R) - 30f)
  206. R.Cast(t);
  207. }
  208. }
  209. public override void DeathWalker_BeforeAttack(DeathWalker.BeforeAttackEventArgs args)
  210. {
  211. args.Process = !Q.IsCharging;
  212. }
  213. public override bool ComboMenu(Menu config)
  214. {
  215. config.AddItem(
  216. new MenuItem("UseQC" + Id, "Q Mode").SetValue(
  217. new StringList(new[] {"Off", "Use Allways", "Max W Stack = 3"}, 0)));
  218. config.AddItem(new MenuItem("UseEC" + Id, "Use E").SetValue(true));
  219. config.AddItem(new MenuItem("UseRC" + Id, "Use R").SetValue(true));
  220. config.AddItem(
  221. new MenuItem("QMinChargeC", "Min. Q Charge").SetValue(new Slider(1000, Q.ChargedMinRange,
  222. Q.ChargedMaxRange)));
  223. config.AddItem(
  224. new MenuItem("UseQ2C" + Id, "Use Insta Q").SetValue(new KeyBind("J".ToCharArray()[0], KeyBindType.Press)));
  225. return true;
  226. }
  227. public override bool HarassMenu(Menu config)
  228. {
  229. config.AddItem(
  230. new MenuItem("UseQH" + Id, "Q").SetValue(new StringList(
  231. new[] {"Off", "Use Allways", "Max W Stack = 3"}, 0)));
  232. config.AddItem(new MenuItem("UseEH" + Id, "E").SetValue(true));
  233. config.AddItem(
  234. new MenuItem("UseETH" + Id, "Use E (Toggle)").SetValue(new KeyBind("H".ToCharArray()[0],
  235. KeyBindType.Toggle)));
  236. return true;
  237. }
  238. public override bool MiscMenu(Menu config)
  239. {
  240. config.AddItem(new MenuItem("spellDelay" + Id, "Spell delay").SetValue(new Slider(500, 0, 3000)));
  241. config.AddItem(
  242. new MenuItem("CastR" + Id, "Cast R").SetValue(new KeyBind("T".ToCharArray()[0], KeyBindType.Press)));
  243. return true;
  244. }
  245. public override bool DrawingMenu(Menu config)
  246. {
  247. config.AddItem(new MenuItem("DrawQ" + Id, "Q").SetValue(new Circle(true, Color.DarkGray)));
  248. config.AddItem(new MenuItem("DrawE" + Id, "E").SetValue(new Circle(true, Color.DarkGray)));
  249. config.AddItem(new MenuItem("DrawR" + Id, "R").SetValue(new Circle(true, Color.DarkGray)));
  250. config.AddItem(new MenuItem("DrawQC" + Id, "Min. Q Charge").SetValue(new Circle(true, Color.White)));
  251. config.AddItem(new MenuItem("DrawRS" + Id, "R: Search Area").SetValue(new Circle(true, Color.White)));
  252. return true;
  253. }
  254. public override bool ExtrasMenu(Menu config)
  255. {
  256. return true;
  257. }
  258. public override bool LaneClearMenu(Menu config)
  259. {
  260. return true;
  261. }
  262. }
  263. }

comments powered by Disqus