#region using System; using System.Linq; using DetuksSharp; using LeagueSharp; using LeagueSharp.Common; using SharpDX; using Color = System.Drawing.Color; #endregion namespace Marksman.Champions { internal class Varus : Champion { public static Spell Q, W, E, R; private float LastSpellTick; public Varus() { Utils.Utils.PrintMessage("Varus loaded!"); Q = new Spell(SpellSlot.Q, 1600f); W = new Spell(SpellSlot.W); E = new Spell(SpellSlot.E, 925f); R = new Spell(SpellSlot.R, 1200f); Q.SetSkillshot(.25f, 70f, 1650f, false, SkillshotType.SkillshotLine); E.SetSkillshot(.50f, 250f, 1400f, false, SkillshotType.SkillshotCircle); R.SetSkillshot(.25f, 120f, 1950f, false, SkillshotType.SkillshotLine); Q.SetCharged("VarusQ", "VarusQ", 250, 1600, 1.2f); Utility.HpBarDamageIndicator.DamageToUnit = GetComboDamage; Utility.HpBarDamageIndicator.Enabled = true; Obj_AI_Base.OnProcessSpellCast += Obj_AI_Hero_OnProcessSpellCast; } private static float CalcWDamage { get { var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); var xEnemyWStackCount = EnemyWStackCount(t); var wExplodePerStack = ObjectManager.Player.GetSpellDamage(t, SpellSlot.W, 1)*xEnemyWStackCount > 0 ? xEnemyWStackCount : 1; return wExplodePerStack; } } private static float CalcQDamage { get { var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (!Q.IsReady()) return 0; /* var qDamageMaxPerLevel = new[] {15f, 70f, 125f, 180f, 235f}; var fxQDamage2 = qDamageMaxPerLevel[Q.Level - 1] + 1.6* (ObjectManager.Player.BaseAttackDamage + ObjectManager.Player.FlatPhysicalDamageMod); var xDis = ObjectManager.Player.Distance(t)/Q.ChargedMaxRange; return (float) fxQDamage2*xDis; */ var fxQDamage2 = ObjectManager.Player.GetSpellDamage(t, SpellSlot.Q, 1); return (float) fxQDamage2; } } private float GetComboDamage(Obj_AI_Hero t) { var fComboDamage = 0f; if (Q.IsReady()) fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.Q); //fComboDamage += CalcQDamage; if (W.Level > 0) fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.W); if (E.IsReady()) fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.E); if (R.IsReady()) fComboDamage += (float) ObjectManager.Player.GetSpellDamage(t, SpellSlot.R); if (ObjectManager.Player.GetSpellSlot("summonerdot") != SpellSlot.Unknown && ObjectManager.Player.Spellbook.CanUseSpell(ObjectManager.Player.GetSpellSlot("summonerdot")) == SpellState.Ready && ObjectManager.Player.Distance(t) < 550) fComboDamage += (float) ObjectManager.Player.GetSummonerSpellDamage(t, Damage.SummonerSpell.Ignite); if (Items.CanUseItem(3144) && ObjectManager.Player.Distance(t) < 550) fComboDamage += (float) ObjectManager.Player.GetItemDamage(t, Damage.DamageItems.Bilgewater); if (Items.CanUseItem(3153) && ObjectManager.Player.Distance(t) < 550) fComboDamage += (float) ObjectManager.Player.GetItemDamage(t, Damage.DamageItems.Botrk); return fComboDamage; } private void Obj_AI_Hero_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { if (!sender.IsMe || args.SData.Name.ToLower().Contains("attack")) return; LastSpellTick = Environment.TickCount; } public static int EnemyWStackCount(Obj_AI_Hero t) { return t.Buffs.Where(xBuff => xBuff.Name == "varuswdebuff" && t.IsValidTarget(Q.Range)) .Select(xBuff => xBuff.Count) .FirstOrDefault(); } public override void Drawing_OnDraw(EventArgs args) { var drawQ = GetValue("DrawQ"); var drawE = GetValue("DrawE"); var drawR = GetValue("DrawR"); var drawQc = GetValue("DrawQC"); var drawRs = GetValue("DrawRS"); if (drawQ.Active) Render.Circle.DrawCircle(ObjectManager.Player.Position, Q.Range, drawQ.Color); if (drawE.Active) Render.Circle.DrawCircle(ObjectManager.Player.Position, E.Range, drawE.Color); if (drawQc.Active) Render.Circle.DrawCircle(ObjectManager.Player.Position, GetValue("QMinChargeC").Value, drawQc.Color); if (drawR.Active) Render.Circle.DrawCircle(ObjectManager.Player.Position, R.Range, drawR.Color); if (GetValue("CastR").Active && drawRs.Active) { Vector3 drawPosition; if (ObjectManager.Player.Distance(Game.CursorPos) < R.Range - 300f) drawPosition = Game.CursorPos; else drawPosition = ObjectManager.Player.Position + Vector3.Normalize(Game.CursorPos - ObjectManager.Player.Position)*(R.Range - 300f); Render.Circle.DrawCircle(drawPosition, 300f, drawRs.Color); } } private static void CastSpellQ() { if (!Q.IsReady()) return; var t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (!t.IsValidTarget(Q.Range)) return; var qMinCharge = Program.Config.Item("QMinChargeC").GetValue().Value; ObjectManager.Player.IssueOrder(GameObjectOrder.MoveTo, Game.CursorPos); if (Q.IsCharging) { if (Q.Range >= qMinCharge) Q.Cast(t, false, true); } else { Q.StartCharging(); } } public override void Game_OnGameUpdate(EventArgs args) { if (GetValue("CastR").Active) { Vector3 searchPos; if (ObjectManager.Player.Distance(Game.CursorPos) < R.Range - 300f) searchPos = Game.CursorPos; else searchPos = ObjectManager.Player.Position + Vector3.Normalize(Game.CursorPos - ObjectManager.Player.Position)*(R.Range - 300f); var rTarget = ObjectManager.Get() .Where(hero => hero.IsValidTarget(R.Range) && hero.Distance(searchPos) < 300f) .OrderByDescending(TargetSelector.GetPriority) .First(); if (rTarget != null && R.IsReady()) R.Cast(rTarget); } if (GetValue("UseQ2C").Active) { ObjectManager.Player.IssueOrder(GameObjectOrder.MoveTo, Game.CursorPos); CastSpellQ(); } Obj_AI_Hero t; if (E.IsReady() && GetValue("UseETH").Active) { if (ObjectManager.Player.HasBuff("Recall")) return; t = TargetSelector.GetTarget(E.Range, TargetSelector.DamageType.Physical); if (t != null) E.Cast(t, false, true); } if (!ComboActive && !HarassActive) return; var useQ = GetValue("UseQ" + (ComboActive ? "C" : "H")); var useE = GetValue("UseE" + (ComboActive ? "C" : "H")); var useR = GetValue("UseRC"); t = TargetSelector.GetTarget(Q.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget(Q.Range) && t.Health <= CalcQDamage + CalcWDamage) CastSpellQ(); switch (useQ.SelectedIndex) { case 1: { CastSpellQ(); break; } case 2: { if (EnemyWStackCount(t) > 2 || W.Level == 0) CastSpellQ(); break; } } if (useE && E.IsReady()) { t = TargetSelector.GetTarget(E.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget(E.Range)) E.Cast(t, false, true); } if (useR && R.IsReady()) { t = TargetSelector.GetTarget(R.Range, TargetSelector.DamageType.Physical); if (t.IsValidTarget(R.Range) && t.Health <= ObjectManager.Player.GetSpellDamage(t, SpellSlot.R) - 30f) R.Cast(t); } } public override void DeathWalker_BeforeAttack(DeathWalker.BeforeAttackEventArgs args) { args.Process = !Q.IsCharging; } public override bool ComboMenu(Menu config) { config.AddItem( new MenuItem("UseQC" + Id, "Q Mode").SetValue( new StringList(new[] {"Off", "Use Allways", "Max W Stack = 3"}, 0))); config.AddItem(new MenuItem("UseEC" + Id, "Use E").SetValue(true)); config.AddItem(new MenuItem("UseRC" + Id, "Use R").SetValue(true)); config.AddItem( new MenuItem("QMinChargeC", "Min. Q Charge").SetValue(new Slider(1000, Q.ChargedMinRange, Q.ChargedMaxRange))); config.AddItem( new MenuItem("UseQ2C" + Id, "Use Insta Q").SetValue(new KeyBind("J".ToCharArray()[0], KeyBindType.Press))); return true; } public override bool HarassMenu(Menu config) { config.AddItem( new MenuItem("UseQH" + Id, "Q").SetValue(new StringList( new[] {"Off", "Use Allways", "Max W Stack = 3"}, 0))); config.AddItem(new MenuItem("UseEH" + Id, "E").SetValue(true)); config.AddItem( new MenuItem("UseETH" + Id, "Use E (Toggle)").SetValue(new KeyBind("H".ToCharArray()[0], KeyBindType.Toggle))); return true; } public override bool MiscMenu(Menu config) { config.AddItem(new MenuItem("spellDelay" + Id, "Spell delay").SetValue(new Slider(500, 0, 3000))); config.AddItem( new MenuItem("CastR" + Id, "Cast R").SetValue(new KeyBind("T".ToCharArray()[0], KeyBindType.Press))); return true; } public override bool DrawingMenu(Menu config) { config.AddItem(new MenuItem("DrawQ" + Id, "Q").SetValue(new Circle(true, Color.DarkGray))); config.AddItem(new MenuItem("DrawE" + Id, "E").SetValue(new Circle(true, Color.DarkGray))); config.AddItem(new MenuItem("DrawR" + Id, "R").SetValue(new Circle(true, Color.DarkGray))); config.AddItem(new MenuItem("DrawQC" + Id, "Min. Q Charge").SetValue(new Circle(true, Color.White))); config.AddItem(new MenuItem("DrawRS" + Id, "R: Search Area").SetValue(new Circle(true, Color.White))); return true; } public override bool ExtrasMenu(Menu config) { return true; } public override bool LaneClearMenu(Menu config) { return true; } } }