Tris


SUBMITTED BY: Alerand

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

FORMAT: Text only

SIZE: 15.5 kB

HITS: 10279

  1. #region
  2. using System;
  3. using System.Linq;
  4. using DetuksSharp;
  5. using LeagueSharp;
  6. using LeagueSharp.Common;
  7. using SharpDX;
  8. using SharpDX.Direct3D9;
  9. #endregion
  10. namespace Marksman.Champions
  11. {
  12. internal class Tristana : Champion
  13. {
  14. public static Obj_AI_Hero Player = ObjectManager.Player;
  15. public static Spell Q, W, E, R;
  16. public static Font vText;
  17. public static int LastTickTime;
  18. public Tristana()
  19. {
  20. Q = new Spell(SpellSlot.Q, 703);
  21. W = new Spell(SpellSlot.W, 900);
  22. W.SetSkillshot(.50f, 250f, 1400f, false, SkillshotType.SkillshotCircle);
  23. E = new Spell(SpellSlot.E, 703);
  24. R = new Spell(SpellSlot.R, 703);
  25. Utility.HpBarDamageIndicator.DamageToUnit = GetComboDamage;
  26. Utility.HpBarDamageIndicator.Enabled = true;
  27. AntiGapcloser.OnEnemyGapcloser += AntiGapcloser_OnEnemyGapcloser;
  28. Interrupter2.OnInterruptableTarget += Interrupter2_OnInterruptableTarget;
  29. vText = new Font(
  30. Drawing.Direct3DDevice,
  31. new FontDescription
  32. {
  33. FaceName = "Courier new",
  34. Height = 15,
  35. OutputPrecision = FontPrecision.Default,
  36. Quality = FontQuality.Default
  37. });
  38. Utils.Utils.PrintMessage("Tristana loaded.");
  39. }
  40. public void AntiGapcloser_OnEnemyGapcloser(ActiveGapcloser gapcloser)
  41. {
  42. if (R.IsReady() && gapcloser.Sender.IsValidTarget(R.Range) && GetValue<bool>("UseRMG"))
  43. R.CastOnUnit(gapcloser.Sender);
  44. }
  45. private void Interrupter2_OnInterruptableTarget(Obj_AI_Hero unit, Interrupter2.InterruptableTargetEventArgs args)
  46. {
  47. if (R.IsReady() && unit.IsValidTarget(R.Range) && GetValue<bool>("UseRMI"))
  48. R.CastOnUnit(unit);
  49. }
  50. public override void DeathWalker_AfterAttack(AttackableUnit unit, AttackableUnit target)
  51. {
  52. var t = target as Obj_AI_Hero;
  53. if (t != null && (ComboActive || HarassActive) && unit.IsMe)
  54. {
  55. var useQ = Q.IsReady() && GetValue<bool>("UseQ" + (ComboActive ? "C" : "H"));
  56. var useE = E.IsReady() && GetValue<bool>("UseE" + (ComboActive ? "C" : "H"));
  57. if (useQ)
  58. Q.CastOnUnit(Player);
  59. if (useE && canUseE(t))
  60. E.CastOnUnit(t);
  61. }
  62. }
  63. private static bool canUseE(Obj_AI_Hero t)
  64. {
  65. if (Player.CountEnemiesInRange(W.Range + (E.Range/2)) == 1)
  66. return true;
  67. return (Program.Config.Item("DontUseE" + t.ChampionName) != null &&
  68. Program.Config.Item("DontUseE" + t.ChampionName).GetValue<bool>() == false);
  69. }
  70. public override void Game_OnGameUpdate(EventArgs args)
  71. {
  72. if (!DeathWalker.canMove())
  73. return;
  74. var getEMarkedEnemy = TristanaData.GetEMarkedEnemy;
  75. if (getEMarkedEnemy != null)
  76. {
  77. TargetSelector.SetTarget(getEMarkedEnemy);
  78. }
  79. else
  80. {
  81. var attackRange = DeathWalker.getRealAutoAttackRange(Player);
  82. TargetSelector.SetTarget(TargetSelector.GetTarget(attackRange, TargetSelector.DamageType.Physical));
  83. }
  84. Q.Range = 600 + 5*(Player.Level - 1);
  85. E.Range = 630 + 7*(Player.Level - 1);
  86. R.Range = 630 + 7*(Player.Level - 1);
  87. if (GetValue<KeyBind>("UseETH").Active)
  88. {
  89. if (Player.HasBuff("Recall"))
  90. return;
  91. var t = TristanaData.GetTarget(E.Range);
  92. if (t.IsValidTarget() && E.IsReady() && canUseE(t))
  93. E.CastOnUnit(t);
  94. }
  95. var useW = W.IsReady() && GetValue<bool>("UseWC");
  96. var useWc = W.IsReady() && GetValue<bool>("UseWCS");
  97. var useWks = W.IsReady() && GetValue<bool>("UseWKs");
  98. var useE = E.IsReady() && GetValue<bool>("UseE" + (ComboActive ? "C" : "H"));
  99. var useR = R.IsReady() && GetValue<bool>("UseRM") && R.IsReady();
  100. if (ComboActive || HarassActive)
  101. {
  102. Obj_AI_Hero t;
  103. if (TristanaData.GetEMarkedEnemy != null)
  104. {
  105. t = TristanaData.GetEMarkedEnemy;
  106. TargetSelector.SetTarget(TristanaData.GetEMarkedEnemy);
  107. }
  108. else
  109. {
  110. t = TristanaData.GetTarget(W.Range);
  111. }
  112. if (useE && canUseE(t))
  113. {
  114. if (E.IsReady() && t.IsValidTarget(E.Range))
  115. E.CastOnUnit(t);
  116. }
  117. if (useW)
  118. {
  119. t = TristanaData.GetTarget(W.Range);
  120. if (t.IsValidTarget())
  121. W.Cast(t);
  122. }
  123. else if (useWks)
  124. {
  125. t = TristanaData.GetTarget(W.Range);
  126. if (t.IsValidTarget() && t.Health < TristanaData.GetWDamage)
  127. W.Cast(t);
  128. }
  129. else if (useWc)
  130. {
  131. t = TristanaData.GetTarget(W.Range);
  132. if (t.IsValidTarget() && TristanaData.GetEMarkedCount == 4)
  133. W.Cast(t);
  134. }
  135. }
  136. if (ComboActive)
  137. {
  138. if (useR)
  139. {
  140. var t = TristanaData.GetTarget(R.Range - 20);
  141. if (!t.IsValidTarget())
  142. return;
  143. if (Player.GetSpellDamage(t, SpellSlot.R) - 30 < t.Health ||
  144. t.Health < Player.GetAutoAttackDamage(t, true))
  145. return;
  146. R.CastOnUnit(t);
  147. }
  148. }
  149. }
  150. private static float GetComboDamage(Obj_AI_Hero t)
  151. {
  152. return TristanaData.GetComboDamage;
  153. }
  154. public override void Drawing_OnDraw(EventArgs args)
  155. {
  156. // Draw marked enemy status
  157. var drawEMarksStatus = Program.Config.SubMenu("Drawings").Item("DrawEMarkStatus").GetValue<bool>();
  158. var drawEMarkEnemy = Program.Config.SubMenu("Drawings").Item("DrawEMarkEnemy").GetValue<Circle>();
  159. if (drawEMarksStatus || drawEMarkEnemy.Active)
  160. {
  161. var vText1 = vText;
  162. var getEMarkedEnemy = TristanaData.GetEMarkedEnemy;
  163. if (getEMarkedEnemy != null)
  164. {
  165. if (drawEMarksStatus)
  166. {
  167. if (LastTickTime < Environment.TickCount)
  168. LastTickTime = Environment.TickCount + 5000;
  169. var xTime = LastTickTime - Environment.TickCount;
  170. var timer = string.Format("0:{0:D2}", xTime/1000);
  171. Utils.Utils.DrawText(
  172. vText1, timer + " : 4 / " + TristanaData.GetEMarkedCount,
  173. (int) getEMarkedEnemy.HPBarPosition.X + 145, (int) getEMarkedEnemy.HPBarPosition.Y + 5,
  174. Color.White);
  175. }
  176. if (drawEMarkEnemy.Active)
  177. {
  178. Render.Circle.DrawCircle(TristanaData.GetEMarkedEnemy.Position, 140f, drawEMarkEnemy.Color, 1);
  179. }
  180. }
  181. }
  182. Spell[] spellList = {W};
  183. foreach (var spell in spellList)
  184. {
  185. var menuItem = GetValue<Circle>("Draw" + spell.Slot);
  186. if (menuItem.Active)
  187. Render.Circle.DrawCircle(Player.Position, spell.Range, menuItem.Color, 1);
  188. }
  189. var drawE = Program.Config.SubMenu("Drawings").Item("DrawE").GetValue<Circle>();
  190. if (drawE.Active)
  191. {
  192. Render.Circle.DrawCircle(Player.Position, E.Range, drawE.Color, 1);
  193. }
  194. }
  195. public override bool ComboMenu(Menu config)
  196. {
  197. config.AddItem(new MenuItem("UseQC" + Id, "Use Q").SetValue(true));
  198. config.AddItem(new MenuItem("UseWC" + Id, "Use W").SetValue(true));
  199. config.AddItem(new MenuItem("UseWKs" + Id, "Use W Kill Steal").SetValue(true));
  200. config.AddItem(new MenuItem("UseWCS" + Id, "Complete E stacks with W").SetValue(true));
  201. config.AddItem(new MenuItem("UseEC" + Id, "Use E").SetValue(true));
  202. config.AddSubMenu(new Menu("Don't Use E to", "DontUseE"));
  203. {
  204. foreach (var enemy in
  205. ObjectManager.Get<Obj_AI_Hero>().Where(enemy => enemy.Team != Player.Team))
  206. {
  207. config.SubMenu("DontUseE")
  208. .AddItem(new MenuItem("DontUseE" + enemy.ChampionName, enemy.ChampionName).SetValue(false));
  209. }
  210. }
  211. return true;
  212. }
  213. public override bool HarassMenu(Menu config)
  214. {
  215. config.AddItem(new MenuItem("UseQH" + Id, "Use Q").SetValue(false));
  216. config.AddItem(new MenuItem("UseWH" + Id, "Use W").SetValue(true));
  217. config.AddItem(new MenuItem("UseEH" + Id, "Use E").SetValue(true));
  218. config.AddItem(
  219. new MenuItem("UseETH" + Id, "Use E (Toggle)").SetValue(
  220. new KeyBind("H".ToCharArray()[0], KeyBindType.Toggle)));
  221. return true;
  222. }
  223. public override bool DrawingMenu(Menu config)
  224. {
  225. config.AddItem(new MenuItem("DrawW" + Id, "W range").SetValue(new Circle(true, System.Drawing.Color.Beige)));
  226. var drawE = new Menu("Draw E", "DrawE");
  227. {
  228. drawE.AddItem(new MenuItem("DrawE", "E range").SetValue(new Circle(true, System.Drawing.Color.Beige)));
  229. drawE.AddItem(
  230. new MenuItem("DrawEMarkEnemy", "E Marked Enemy").SetValue(new Circle(true,
  231. System.Drawing.Color.GreenYellow)));
  232. drawE.AddItem(new MenuItem("DrawEMarkStatus", "E Marked Status").SetValue(true));
  233. config.AddSubMenu(drawE);
  234. }
  235. var dmgAfterComboItem = new MenuItem("DamageAfterCombo", "Damage After Combo").SetValue(true);
  236. Config.AddItem(dmgAfterComboItem);
  237. return true;
  238. }
  239. public override bool MiscMenu(Menu config)
  240. {
  241. config.AddItem(new MenuItem("UseWM" + Id, "Use W KillSteal").SetValue(true));
  242. config.AddItem(new MenuItem("UseRM" + Id, "Use R KillSteal").SetValue(true));
  243. config.AddItem(new MenuItem("UseRMG" + Id, "Use R Gapclosers").SetValue(true));
  244. config.AddItem(new MenuItem("UseRMI" + Id, "Use R Interrupt").SetValue(true));
  245. return true;
  246. }
  247. public override bool ExtrasMenu(Menu config)
  248. {
  249. return true;
  250. }
  251. public override bool LaneClearMenu(Menu config)
  252. {
  253. return true;
  254. }
  255. public class TristanaData
  256. {
  257. public static double GetWDamage
  258. {
  259. get
  260. {
  261. if (W.IsReady())
  262. {
  263. var wDamage = new double[] {80, 105, 130, 155, 180}[W.Level - 1] +
  264. 0.5*Player.FlatMagicDamageMod;
  265. if (GetEMarkedCount > 0 && GetEMarkedCount < 4)
  266. {
  267. return wDamage + (wDamage*GetEMarkedCount*.20);
  268. }
  269. switch (GetEMarkedCount)
  270. {
  271. case 0:
  272. return wDamage;
  273. case 4:
  274. return wDamage*2;
  275. }
  276. }
  277. return 0;
  278. }
  279. }
  280. public static float GetComboDamage
  281. {
  282. get
  283. {
  284. var fComboDamage = 0d;
  285. var t = GetTarget(W.Range*2);
  286. if (!t.IsValidTarget())
  287. return 0;
  288. /*
  289. if (Q.IsReady())
  290. {
  291. var baseAttackSpeed = 0.656 + (0.656 / 100 * (Player.Level - 1) * 1.5);
  292. var qExtraAttackSpeed = new double[] { 30, 50, 70, 90, 110 }[Q.Level - 1];
  293. var attackDelay = (float) (baseAttackSpeed + (baseAttackSpeed / 100 * qExtraAttackSpeed));
  294. attackDelay = (float) Math.Round(attackDelay, 2);
  295. attackDelay *= 5;
  296. attackDelay *= (float) Math.Floor(Player.TotalAttackDamage());
  297. fComboDamage += attackDelay;
  298. }
  299. */
  300. if (W.IsReady())
  301. {
  302. fComboDamage += GetWDamage;
  303. }
  304. if (E.IsReady())
  305. {
  306. fComboDamage += new double[] {60, 70, 80, 90, 100}[E.Level - 1]*2*
  307. Player.FlatMagicDamageMod;
  308. }
  309. if (R.IsReady())
  310. {
  311. fComboDamage += new double[] {300, 400, 500}[R.Level - 1] + Player.FlatMagicDamageMod;
  312. }
  313. return (float) fComboDamage;
  314. }
  315. }
  316. public static Obj_AI_Hero GetEMarkedEnemy
  317. {
  318. get
  319. {
  320. return
  321. ObjectManager.Get<Obj_AI_Hero>()
  322. .Where(
  323. enemy =>
  324. !enemy.IsDead &&
  325. enemy.IsValidTarget(W.Range + DeathWalker.getRealAutoAttackRange(Player)))
  326. .FirstOrDefault(
  327. enemy => enemy.Buffs.Any(buff => buff.DisplayName == "TristanaEChargeSound"));
  328. }
  329. }
  330. public static int GetEMarkedCount
  331. {
  332. get
  333. {
  334. if (GetEMarkedEnemy == null)
  335. return 0;
  336. return
  337. GetEMarkedEnemy.Buffs.Where(buff => buff.DisplayName == "TristanaECharge")
  338. .Select(xBuff => xBuff.Count)
  339. .FirstOrDefault();
  340. }
  341. }
  342. public static Obj_AI_Hero GetTarget(float vRange)
  343. {
  344. return TargetSelector.GetTarget(vRange, TargetSelector.DamageType.Physical);
  345. }
  346. }
  347. }
  348. }

comments powered by Disqus