ak77now

SOW Plugin.lua

Aug 5th, 2014
3,411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 128.31 KB | None | 0 0
  1. --[[
  2.                 Sida's Auto revamped
  3. ]]
  4.  
  5.  
  6. require 'VPrediction'
  7. require 'SOW'
  8.  
  9. local AutoCarryGlobal = {}
  10. AutoCarryGlobal.Data = {}
  11. _G.AutoCarry = AutoCarryGlobal.Data
  12.  
  13. local DoneInit = false
  14. function OnTick()
  15.  
  16. if not DoneInit then
  17.         if not Init() then
  18.                 return
  19.         end
  20. end
  21.  
  22.         if Keys.LastHit then
  23.                 Minions:LastHit()
  24.         end
  25.  
  26.         if Keys.AutoCarry then
  27.                 Items:UseAll(Crosshair.Attack_Crosshair.target)
  28.                 Skills:CastAll(Crosshair:GetTarget())
  29.                 Orbwalker:Orbwalk(Crosshair.Attack_Crosshair.target)
  30.         end
  31.  
  32.         if Keys.LaneClear then
  33.                 Skills:CastAll(Crosshair:GetTarget())
  34.                 if LaneClearMenu.MinionPriority and Orbwalker:CanOrbwalkTarget(Minions.KillableMinion) then
  35.                         Orbwalker:Orbwalk(Minions.KillableMinion)
  36.                 elseif Orbwalker:CanOrbwalkTarget(Crosshair.Attack_Crosshair.target) then
  37.                         Items:UseAll(Crosshair.Attack_Crosshair.target)
  38.                         Orbwalker:Orbwalk(Crosshair.Attack_Crosshair.target)
  39.                 elseif Orbwalker:CanOrbwalkTarget(Jungle:GetAttackableMonster()) then
  40.                         Orbwalker:Orbwalk(Jungle:GetAttackableMonster())
  41.                 else
  42.                         Minions:LaneClear()
  43.                 end
  44.         end
  45.  
  46.         if Keys.MixedMode then        
  47.                 Skills:CastAll(Crosshair:GetTarget())
  48.                 if MixedModeMenu.MinionPriority and Orbwalker:CanOrbwalkTarget(Minions.KillableMinion) then
  49.                         Orbwalker:Orbwalk(Minions.KillableMinion)
  50.                 elseif Orbwalker:CanOrbwalkTarget(Crosshair.Attack_Crosshair.target) then
  51.                         Items:UseAll(Crosshair.Attack_Crosshair.target)
  52.                         Orbwalker:Orbwalk(Crosshair.Attack_Crosshair.target)
  53.                 else
  54.                         Minions:LastHit()
  55.                 end
  56.         end
  57. end
  58.  
  59. AdvancedCallback:bind('OnLoseVision', function(unit) end)
  60. AdvancedCallback:bind('OnGainVision', function(unit) end)
  61. AdvancedCallback:bind('OnDash', function(unit) end)
  62. AdvancedCallback:bind('OnGainBuff', function(unit, buff) end)
  63. AdvancedCallback:bind('OnLoseBuff', function(unit, buff) end)
  64. AdvancedCallback:bind('OnUpdateBuff', function(unit, buff) end)
  65.  
  66.  
  67. MODE_AUTOCARRY = 0
  68. MODE_MIXEDMODE = 1
  69. MODE_LASTHIT = 2
  70. MODE_LANECLEAR = 3
  71. AutoCarry.MODE_AUTOCARRY = 0
  72. AutoCarry.MODE_MIXEDMODE = 1
  73. AutoCarry.MODE_LASTHIT = 2
  74. AutoCarry.MODE_LANECLEAR = 3
  75.  
  76. --[[
  77.                 Orbwalker Class
  78.                                                 ]]
  79. class '_Orbwalker' Orbwalker = nil
  80.  
  81. STAGE_SHOOT = 0
  82. STAGE_MOVE = 1
  83. STAGE_SHOOTING = 2
  84. RegisteredOnAttacked = {}
  85.  
  86. function _Orbwalker:__init()
  87.         self.LastAttack = 0
  88.         self.LastWindUp = 0
  89.         self.AttackCooldown = 0
  90.         self.AttackCompletesAt = 0
  91.         self.AttackBufferMin = 50
  92.         self.AttackBufferMax = 400
  93.         self.AfterAttackTime = 0
  94.         self.FleeingEnemyRangeBuffer = 0
  95.         self.Stage = 0
  96.         self.LastEnemyAttacked = nil
  97.         Orbwalker = self
  98.  
  99.         AddTickCallback(function() self:_OnTick() end)
  100.         AddProcessSpellCallback(function(Unit, Spell) self:_OnProcessSpell(Unit, Spell) end)
  101.         AddAnimationCallback(function(Unit, Animation) self:_OnAnimation(Unit, Animation) end)
  102. end
  103.  
  104. local lastTick = 0
  105. function _Orbwalker:_OnTick()
  106.         --self.Boost = ConfigMenu.Boost - (myHero.attackSpeed * 15) - (Helper.Latency * 0.5)
  107.         --self.AttackBoost = ConfigMenu.AttackBoost
  108.         lastTick = GetTickCount()
  109.         if Helper.Tick + Helper.Latency / 2 > self.LastAttack + self.AttackCooldown then
  110.                 self.Stage = STAGE_SHOOT
  111.         elseif Helper.Tick + Helper.Latency / 2 > self.LastAttack + self.LastWindUp + self.AttackBufferMin + (Data.ChampionData[myHero.charName] and Data.ChampionData[myHero.charName].BugDelay or 0) then
  112.                 self.Stage = STAGE_MOVE
  113.         end
  114.  
  115.         if self.Stage == STAGE_MOVE and Helper.Tick  + Helper.Latency < self.LastAttack + self.LastWindUp + self.AttackBufferMax then
  116.                 self.AfterAttackTime = self.LastAttack + self.LastWindUp + self.AttackBufferMax
  117.                 Orbwalker:_OnAttacked()
  118.         end
  119. end
  120.  
  121. function _Orbwalker:_OnProcessSpell(Unit, Spell)
  122.         if Unit.isMe then
  123.                 if Data:IsAttack(Spell) then
  124.                         self.LastAttack = Helper.Tick
  125.                         self.LastWindUp = Spell.windUpTime * 1000
  126.                         self.AttackCooldown = Spell.animationTime * 1000
  127.                         self.AttackCompletesAt = self.LastAttack + self.LastWindUp
  128.                         self.LastAttackSpeed = myHero.attackSpeed
  129.                         self.Stage = STAGE_SHOOTING
  130.                         self.SlowChecked = false
  131.                 elseif Data:IsResetSpell(Spell) then
  132.                         self:ResetAttackTimer()
  133.                 end
  134.         elseif Spell.target and Spell.name == "SummonerExhaust" and Spell.target.isMe then
  135.                 self.AttackCooldown = self.AttackCooldown * 1.5
  136.         elseif Spell.target and Spell.name == "Wither" and Spell.target.isMe then
  137.                 self.AttackCooldown = self.AttackCooldown * 1.35
  138.         end
  139. end
  140.  
  141. function _Orbwalker:_OnAttacked()
  142.         for _, func in pairs(RegisteredOnAttacked) do
  143.                 func()
  144.         end
  145. end
  146.  
  147. function _Orbwalker:_OnAnimation(Unit, Animation)
  148.         if Helper.Tick < Orbwalker.AttackCompletesAt and Unit.isMe and (Animation == "Run" or Animation == "Idle") then
  149.                 Orbwalker:ResetAttackTimer()
  150.         end
  151. end
  152.  
  153. function _Orbwalker:Orbwalk(target)
  154.         if target and self.Stage == STAGE_SHOOT and self:CanOrbwalkTarget(target) then
  155.                 MyHero:Attack(target)
  156.         elseif self.Stage ~= STAGE_SHOOTING then
  157.                 MyHero:Move()
  158.         end
  159. end
  160.  
  161. function _Orbwalker:OrbwalkIgnoreChecks(target)
  162.         if target and self.Stage == STAGE_SHOOT then
  163.                 MyHero:Attack(target)
  164.         elseif self.Stage == STAGE_MOVE then
  165.                 MyHero:Move()
  166.         end
  167. end
  168.  
  169. function _Orbwalker:ResetAttackTimer()
  170.         self.LastAttack = Helper.Tick - Helper.Latency / 2 - self.AttackCooldown
  171. end
  172.  
  173. function _Orbwalker:GetNextAttackTime()
  174.         return self.LastAttack + self.AttackCooldown - Helper.Latency / 2
  175. end
  176.  
  177. function _Orbwalker:IsAfterAttack()
  178.         if self then
  179.                 return Helper.Tick + Helper.Latency / 2 < self.AfterAttackTime
  180.         end
  181. end
  182.  
  183. function _Orbwalker:CanOrbwalkTarget(Target)
  184.         if ValidTarget(Target) then
  185.                 if Target.type == myHero.type then
  186.                         local predPos = AutoCarry.GetPrediction({range=MyHero.TrueRange, speed=math.huge, delay=Orbwalker.LastWindUp}, Target)
  187.                         if predPos and GetDistance(predPos) - Data:GetGameplayCollisionRadius(Target.charName) + self.FleeingEnemyRangeBuffer > MyHero.TrueRange then
  188.                                 return false
  189.                         end
  190.                 end
  191.                 local CheckRange
  192.                 if MyHero.IsMelee and Target.type ~= myHero.type then
  193.                         CheckRange = MyHero.TrueRange + 75
  194.                 else
  195.                         CheckRange = MyHero.TrueRange
  196.                 end
  197.                 return GetDistance(Target) - Data:GetGameplayCollisionRadius(Target.charName) < CheckRange
  198.         end
  199.         return false
  200. end
  201.  
  202. function _Orbwalker:IsShooting()
  203.         return self.Stage == STAGE_SHOOTING
  204. end
  205.  
  206. function RegisterOnAttacked(func)
  207.         table.insert(RegisteredOnAttacked, func)
  208. end
  209.  
  210. --[[                                  
  211.                 _MyHero Class
  212.                                                 ]]
  213.  
  214. class '_MyHero' MyHero = nil
  215.  
  216. function _MyHero:__init()
  217.         self.Range = myHero.range
  218.         self.HitBox = GetDistance(myHero.minBBox)
  219.         self.GameplayCollisionRadius = Data:GetGameplayCollisionRadius(myHero.charName)
  220.         self.TrueRange = self.Range + self.GameplayCollisionRadius
  221.         self.IsMelee = myHero.range < 300
  222.         self.MoveDistance = 480
  223.         self.LastHitDamageBuffer = -10 --TODO
  224.         self.ChampionAdditionalLastHitDamage = 0
  225.         self.ItemAdditionalLastHitDamage = 0
  226.         self.MasteryAdditionalLastHitDamage = 0
  227.         self.Team = myHero.team == 100 and "Blue" or "Red"
  228.         self.ProjectileSpeed = Data:GetProjectileSpeed(myHero.charName)
  229.         self.LastMoved = 0
  230.         self.MoveDelay = 50
  231.         self.CanMove = true
  232.         self.CanAttack = true
  233.         self.InStandZone = false
  234.         self.HasStopped = false
  235.         MyHero = self
  236.  
  237.         AddTickCallback(function() self:_OnTick() end)
  238. end
  239.  
  240. function _MyHero:_OnTick()
  241.         if myHero.range ~= self.Range then
  242.                 if myHero.range and myHero.range > 0 and myHero.range < 1500 then
  243.                         self.Range = myHero.range
  244.                         self.TrueRange = self.Range + self.GameplayCollisionRadius - 10
  245.                         self.IsMelee = myHero.range < 300
  246.                 end
  247.         end
  248.         if GetDistance(mousePos) < ExtrasMenu["StandZone"..myHero.charName] then
  249.                 self.InStandZone = true
  250.         else
  251.                 self.InStandZone = false
  252.         end
  253.         self:CheckStopMovement()
  254. end
  255.  
  256. function _MyHero:GetTimeToHitTarget(Target)
  257.         local AttackTime = (GetDistance(Target) / self.ProjectileSpeed) + (Helper.Latency / 2)
  258.         local NextAttack = Helper.Tick
  259.         return AttackTime + NextAttack
  260. end
  261.  
  262. function _MyHero:GetTotalAttackDamageAgainstTarget(Target, LastHit)
  263.         local MyDamage = myHero:CalcDamage(Target, myHero.totalDamage)
  264.         if LastHit then
  265.                 MyDamage = MyDamage + self.ChampionAdditionalLastHitDamage -- TODO
  266.                 MyDamage = MyDamage + self.ItemAdditionalLastHitDamage
  267.                 MyDamage = MyDamage + self:GetMasteryAdditionalLastHitDamage(MyDamage, Target)
  268.                 MyDamage = MyDamage + self.LastHitDamageBuffer
  269.         end
  270.         return MyDamage
  271. end
  272.  
  273. function _MyHero:GetMasteryAdditionalLastHitDamage(Damage, Target)
  274.         local _Damage = Damage
  275.         _Damage = _Damage + Items:GetBotrkBonusLastHitDamage(_Damage, Target)
  276.         _Damage = ConfigMenu.Spellblade and _Damage + (myHero.ap * 0.05) or _Damage
  277.         _Damage = (ConfigMenu.Executioner and Target.health / Target.maxHealth < 0.5) and _Damage + (_Damage * 0.05) or _Damage
  278.         _Damage = _Damage + (ConfigMenu.Butcher * 2)
  279.         return _Damage - Damage - 1
  280. end
  281.  
  282. function _MyHero:Move()
  283.         if self:HeroCanMove() and not Helper:IsEvading() then
  284.                 if Helper.Tick > self.LastMoved + self.MoveDelay then
  285.                         Streaming:OnMove()
  286.                         local Distance = self.MoveDistance + Helper.Latency / 10
  287.                         if self.IsMelee and Crosshair.Target and Crosshair.Target.type == myHero.type and GetDistance(Crosshair.Target) < 80 then
  288.                                 return
  289.                         elseif GetDistance(mousePos) < Distance and GetDistance(mousePos) > 100 then
  290.                                 Distance = GetDistance(mousePos)
  291.                         end
  292.  
  293.                         local MoveSqr = math.sqrt((mousePos.x - myHero.x) ^ 2 + (mousePos.z - myHero.z) ^ 2)
  294.                         local MoveX = myHero.x + Distance * ((mousePos.x - myHero.x) / MoveSqr)
  295.                         local MoveZ = myHero.z + Distance * ((mousePos.z - myHero.z) / MoveSqr)
  296.  
  297.                         --myHero:MoveTo(MoveX, MoveZ)
  298.                         self.LastMoved = Helper.Tick
  299.                         self.HasStopped = false
  300.                 end
  301.         end
  302. end
  303.  
  304. function _MyHero:Attack(target)
  305.         if self.CanAttack and not Helper:IsEvading() then
  306.                 if target.type ~= myHero.type then
  307.                         MuramanaOff()
  308.                 end
  309.  
  310.                 for _, func in pairs(Plugins.RegisteredPreAttack) do
  311.                         func(target)
  312.                 end
  313.  
  314.                 myHero:Attack(target)
  315.                 Orbwalker.LastEnemyAttacked = target
  316.         end
  317. end
  318.  
  319. function _MyHero:MovementEnabled(canMove)
  320.         self.CanMove = canMove
  321. end
  322.  
  323. function _MyHero:AttacksEnabled(canAttack)
  324.         self.CanAttack = canAttack
  325. end
  326.  
  327. function _MyHero:HeroCanMove()
  328.         return not self.InStandZone and self.CanMove
  329. end
  330.  
  331. function _MyHero:CheckStopMovement()
  332.         if not MyHero:HeroCanMove() and not self.HasStopped then
  333.                 myHero:HoldPosition()
  334.                 self.HasStopped = true
  335.         end
  336. end
  337.  
  338. --[[
  339.                 _Crosshair Class
  340.         ]]
  341.  
  342. class '_Crosshair' Crosshair = nil
  343.  
  344. --[[
  345.                 Initialise _Crosshair class
  346.  
  347.                 damageType      DAMAGE_PHYSICAL or DAMAGE_MAGIC
  348.                 attackRange     Integer
  349.                 skillRange              Integer
  350.                 targetFocused   Boolean. Whether targets selected with left click should be focused.
  351.                 isCaster                Boolean. Whether spells should be prioritised over auto attacks.
  352. ]]
  353.  
  354. function _Crosshair:__init(damageType, attackRange, skillRange, targetFocused, isCaster)
  355.         self.DamageType = damageType and damageType or DAMAGE_PHYSICAL
  356.         self.AttackRange = attackRange
  357.         self.SkillRange = skillRange
  358.         self.TargetFocused = targetFocused
  359.         self.IsCaster = isCaster
  360.         self.Target = nil
  361.         self.TargetMinion = nil
  362.         self.Attack_Crosshair = TargetSelector(TARGET_LOW_HP_PRIORITY, attackRange, DAMAGE_PHYSICAL, self.TargetFocused)
  363.         self.Skills_Crosshair = TargetSelector(TARGET_LOW_HP_PRIORITY, skillRange, self.DamageType, self.TargetFocused)
  364.         self.Attack_Crosshair:SetBBoxMode(true)
  365.         self.Attack_Crosshair:SetDamages(0, myHero.totalDamage, 0)
  366.         self:ArrangePriorities()
  367.         self.RangeScaling = true
  368.         Crosshair = self
  369.  
  370.         self:UpdateCrosshairRange()
  371.         self:LoadTargetSelector()
  372.  
  373.         AddTickCallback(function() self:_OnTick() end)
  374.         AddUnloadCallback(function() self:_OnUnload() end)
  375. end
  376.  
  377. function _Crosshair:_OnTick()
  378.         self.Attack_Crosshair:update()
  379.         if self.Attack_Crosshair.range ~= MyHero.TrueRange then
  380.                 self.Attack_Crosshair.range = MyHero.TrueRange
  381.         end
  382.         if self.Attack_Crosshair.target then
  383.                 self.Target = self.Attack_Crosshair.target
  384.         else
  385.                 self.Skills_Crosshair:update()
  386.                 self.Target = self.Skills_Crosshair.target
  387.         end
  388.         if ConfigMenu.Focused ~= self.TargetFocused then
  389.                 self.TargetFocused = ConfigMenu.Focused
  390.                 self.Attack_Crosshair.targetSelected = self.TargetFocused
  391.                 self.Skills_Crosshair.targetSelected = self.targetFocused
  392.         end
  393.         self.TargetMinion = Minions.Target
  394. end
  395.  
  396. function _Crosshair:_OnUnload()
  397.         self:SaveTargetSelector()
  398. end
  399.  
  400. function _Crosshair:GetTarget()
  401.         if ValidTarget(self.Attack_Crosshair.target) and not self.IsCaster then
  402.                 return self.Attack_Crosshair.target
  403.         elseif ValidTarget(self.Skills_Crosshair.target) then
  404.                 return self.Skills_Crosshair.target
  405.         end
  406. end
  407.  
  408. function _Crosshair:HasOrbwalkTarget()
  409.         return self and self.Target and self.Attack_Crosshair.Target and self.Target == self.Attack_Crosshair.target
  410. end
  411.  
  412. function _Crosshair:ArrangePriorities()
  413.         if #GetEnemyHeroes() < 5 then return end
  414.         for _, Champion in pairs(Data.ChampionData) do
  415.                 TS_SetHeroPriority(Champion.Priority, Champion.Name)
  416.         end
  417. end
  418.  
  419. function _Crosshair:SetSkillCrosshairRange(Range)
  420.         self.RangeScaling = false
  421.         self.Skills_Crosshair.range = Range
  422. end
  423.  
  424. function _Crosshair:UpdateCrosshairRange()
  425.         for _, Skill in pairs(Skills.SkillsList) do
  426.                 if Skill:GetRange() > self.Skills_Crosshair.range then
  427.                         self.Skills_Crosshair.range = Skill:GetRange()
  428.                 end
  429.         end
  430. end
  431.  
  432. function _Crosshair:SaveTargetSelector()
  433.         local save = GetSave("SidasAutoCarry")
  434.         save.TargetSelectorMode = Crosshair.Attack_Crosshair.mode
  435.         save:Save()
  436. end
  437.  
  438. function _Crosshair:LoadTargetSelector()
  439.         local save = GetSave("SidasAutoCarry")
  440.         if save.TargetSelectorMode then
  441.                 Crosshair.Attack_Crosshair.mode = save.TargetSelectorMode
  442.                 Crosshair.Skills_Crosshair.mode = save.TargetSelectorMode
  443.         end
  444. end
  445.  
  446. --[[
  447.                 _Minions Class
  448. ]]
  449.  
  450. class '_Minions' Minions = nil
  451.  
  452. function _Minions:__init()
  453.         self.ScanRange = 3000
  454.         self.MinionHealthBuffer = 1.5
  455.         self.EnemyMinions = minionManager(MINION_ENEMY, MyHero.TrueRange + 65, myHero, MINION_SORT_HEALTH_ASC)
  456.     self.AllyMinions = minionManager(MINION_ALLY, self.ScanRange, myHero, MINION_SORT_HEALTH_ASC)
  457.     self.IncomingDamage = {}
  458.     Minions = self
  459.  
  460.     AddTickCallback(function() self:_OnTick() end)
  461.     AddProcessSpellCallback(function(Unit, Spell)self:_OnProcessSpell(Unit, Spell) end)
  462. end
  463.  
  464. function _Minions:_OnTick()
  465.         self.EnemyMinions:update()
  466.         self.AllyMinions:update()
  467.  
  468.         if not Orbwalker:CanOrbwalkTarget(self.KillableMinion) then
  469.                 local _Menu = MenuManager:GetActiveMenu()
  470.                 if _Menu and ConfigMenu.Freeze and (_Menu.name ~= "sidasaclaneclear") then
  471.                         Killable, AlmostKillable = self:GetKillableMinionFreeze()
  472.                 else
  473.                         Killable, AlmostKillable = self:GetKillableMinion()
  474.                 end
  475.                
  476.                 if Orbwalker:CanOrbwalkTarget(Killable) then
  477.                         self.KillableMinion = Killable
  478.                 elseif Orbwalker:CanOrbwalkTarget(AlmostKillable) then
  479.                         self.AlmostKillable = AlmostKillable
  480.                 else
  481.                         self.KillableMinion = nil
  482.                         self.AlmostKillable = nil
  483.                 end
  484.         end
  485. end
  486.  
  487. function _Minions:_OnProcessSpell(Unit, Spell)
  488.         if Unit and Spell.target and Unit.team == myHero.team and (Data.MinionData[Unit.charName] or Data.MinionData[Unit.type]) and GetDistance(Unit) <= self.ScanRange then
  489.                 self.IncomingDamage[Unit.networkID] = _Attack(Unit, Spell)
  490.         end
  491. end
  492.  
  493. function _Minions:LaneClear()
  494.         if Orbwalker:CanOrbwalkTarget(self.KillableMinion) then
  495.                 Orbwalker:Orbwalk(self.KillableMinion)
  496.         elseif self.AlmostKillable then
  497.                 MyHero:Move()
  498.         elseif Structures:CanOrbwalkStructure() then
  499.                 Orbwalker:OrbwalkIgnoreChecks(Structures:GetTargetStructure())
  500.         else
  501.                 Orbwalker:Orbwalk(self:GetSecondLowestHealthMinion())
  502.         end
  503. end
  504.  
  505. function _Minions:LastHit()
  506.         Orbwalker:Orbwalk(self.KillableMinion)
  507. end
  508.  
  509. function _Minions:GetPredictedDamage(Attack)
  510.         if not ValidTarget(Attack.Source, self.ScanRange, false) or not ValidTarget(Attack.Target) or Helper.Tick > Attack.LandsAt then
  511.                 self.IncomingDamage[Attack.Source.networkID] = nil
  512.                 return 0, 0
  513.         elseif GetDistance(Attack.Source, Attack.Origin) > 3 then
  514.                 return 0, 0
  515.         else
  516.                 local TimeToHit = 0
  517.                 if MyHero.IsMelee then
  518.                         TimeToHit = Orbwalker.LastWindUp
  519.                 else
  520.                         TimeToHit = MyHero:GetTimeToHitTarget(Attack.Target)
  521.                 end
  522.                 if TimeToHit > Attack.LandsAt then
  523.                         return Attack.Damage, Attack.Damage
  524.                 else
  525.                         return 0, Attack.Damage
  526.                 end
  527.         end
  528. end
  529.  
  530. function _Minions:GetKillableMinion(Freeze)
  531.         for _, EnemyMinion in ipairs(self.EnemyMinions.objects) do
  532.                 local Damage, TotalDamage, MyDamage = 0, 0, 0
  533.  
  534.                 if Freeze then
  535.                         MyDamage = MyHero:GetTotalAttackDamageAgainstTarget(EnemyMinion, true)
  536.                         MyDamage = MyDamage < 50 and MyDamage or 50
  537.                 else
  538.                         MyDamage = MyHero:GetTotalAttackDamageAgainstTarget(EnemyMinion, true)
  539.                 end
  540.  
  541.                 if Orbwalker:CanOrbwalkTarget(EnemyMinion) or (MyHero.IsMelee and GetDistance(EnemyMinion) < MyHero.TrueRange + 75) then
  542.                         if EnemyMinion.health < MyDamage then
  543.                                 return EnemyMinion, nil
  544.                         else
  545.                                 for _, Attack in pairs(self.IncomingDamage) do
  546.                                         if Attack.Target.networkID == EnemyMinion.networkID then
  547.                                                 local _Damage, _TotalDamage = self:GetPredictedDamage(Attack)
  548.                                                 Damage = Damage + _Damage
  549.                                                 TotalDamage = TotalDamage + _TotalDamage
  550.                                         end
  551.                                 end
  552.  
  553.                                 if EnemyMinion.health - Damage + self.MinionHealthBuffer < MyDamage then
  554.                                         return EnemyMinion, nil
  555.                                 end
  556.                                 if not Freeze then
  557.                                         for _, func in pairs(Plugins.RegisteredBonusLastHitDamage) do
  558.                                                 if EnemyMinion.health - Damage + self.MinionHealthBuffer < MyDamage + func(EnemyMinion) then
  559.                                                         return EnemyMinion, nil
  560.                                                 end
  561.                                         end
  562.                                 end
  563.                                 if EnemyMinion.health - TotalDamage < MyDamage then
  564.                                         return nil, EnemyMinion
  565.                                 end
  566.                         end
  567.                 end
  568.         end
  569. end
  570.  
  571. function _Minions:GetKillableMinionFreeze()
  572.         return self:GetKillableMinion(true)
  573. end
  574.  
  575. function _Minions:GetLowestHealthMinion()
  576.         for i =1, #self.EnemyMinions.objects, 1 do
  577.                 local Minion = self.EnemyMinions.objects[i]
  578.                 if Orbwalker:CanOrbwalkTarget(Minion) then
  579.                         return Minion
  580.                 end
  581.         end
  582. end
  583.  
  584. function _Minions:GetSecondLowestHealthMinion()
  585.         local found = nil
  586.         for i =1, #self.EnemyMinions.objects, 1 do
  587.                 local Minion = self.EnemyMinions.objects[i]
  588.                 if Orbwalker:CanOrbwalkTarget(Minion) and found then
  589.                         return Minion
  590.                 elseif Orbwalker:CanOrbwalkTarget(Minion) then
  591.                         found = Minion
  592.                 end
  593.         end
  594.         return found
  595. end
  596.  
  597. --[[
  598.                 _Attack Class
  599. ]]
  600.  
  601. class '_Attack'
  602.  
  603. function _Attack:__init(Source, Spell)
  604.         self.Source = Source
  605.         self.Target = Spell.target
  606.         self.Damage = Source:CalcDamage(self.Target)
  607.         self.Started = Helper.Tick
  608.         self.Delay = Spell.windUpTime * 1000
  609.         self.Speed = Data.MinionData[Source.charName] and Data.MinionData[Source.charName].ProjectileSpeed or Data.MinionData[Source.type].ProjectileSpeed
  610.         self.LandsAt = ((self.Speed == 0 and self.Delay or self.Delay + GetDistance(Source, self.Target) / self.Speed) + Helper.Tick)
  611.         self.FiresAt = Helper.Tick + self.Delay
  612.         self.Origin = {x = Source.x, z = Source.z}
  613.         self.IsTowerShot = false
  614. end
  615.  
  616. --[[
  617.                 _Jungle Class
  618. ]]
  619.  
  620. class '_Jungle' Jungle = nil
  621.  
  622. function _Jungle:__init()
  623.         self.JungleMonsters = {}
  624.         Jungle = self
  625.         for i = 0, objManager.maxObjects do
  626.         local object = objManager:getObject(i)
  627.                 if Data:IsJungleMinion(object) then
  628.                         table.insert(self.JungleMonsters, object)
  629.                 end
  630.         end
  631.  
  632.         AddCreateObjCallback(function(Object) self:_OnCreateObj(Object) end)
  633.         AddDeleteObjCallback(function(Object) self:_OnDeleteObj(Object) end)
  634. end
  635.  
  636. function _Jungle:_OnCreateObj(Object)
  637.         if Data:IsJungleMinion(Object) then
  638.                 table.insert(self.JungleMonsters, Object)
  639.         end
  640. end
  641.  
  642. function _Jungle:_OnDeleteObj(Object)
  643.         if Data:IsJungleMinion(Object) then
  644.                 for i, Obj in pairs(self.JungleMonsters) do
  645.                         if obj == Object then
  646.                                 table.remove(self.JungleMonsters, i)
  647.                         end
  648.                 end
  649.         end
  650. end
  651.  
  652. function _Jungle:GetJungleMonsters()
  653.         return self.JungleMonsters
  654. end
  655.  
  656. function _Jungle:GetAttackableMonster()
  657.         local HighestPriorityMonster =  nil
  658.         local Priority = 0
  659.         for _, Monster in pairs(self.JungleMonsters) do
  660.                 if Orbwalker:CanOrbwalkTarget(Monster) then
  661.                         local CurrentPriority = Data:GetJunglePriority(Monster.name)
  662.                         if Monster.health < MyHero:GetTotalAttackDamageAgainstTarget(Monster) then
  663.                                 return Monster
  664.                         elseif not HighestPriorityMonster then
  665.                                 HighestPriorityMonster = Monster
  666.                                 Priority = CurrentPriority
  667.                         else
  668.                                 if CurrentPriority < Priority then
  669.                                         HighestPriorityMonster = Monster
  670.                                         Priority = CurrentPriority
  671.                                 end
  672.                         end
  673.                 end
  674.         end
  675.         return HighestPriorityMonster
  676. end
  677.  
  678. class '_Structures' Structures = nil
  679.  
  680. function _Structures:__init()
  681.         Structures = self
  682.         self.TowerCollisionRange = 88.4
  683.         self.InhibCollisionRange = 205
  684.         self.NexusCollisionRange = 300
  685. end
  686.  
  687. function _Structures:TowerTargetted()
  688.         return GetTarget() and GetTarget().type == "obj_AI_Turret" and GetTarget().team ~= myHero.team
  689. end
  690.  
  691. function _Structures:InhibTargetted()
  692.         return GetTarget() and GetTarget().type == "obj_BarracksDampener" and GetTarget().team ~= myHero.team
  693. end
  694.  
  695. function _Structures:NexusTargetted()
  696.         return GetTarget() and GetTarget().type == "obj_HQ" and GetTarget().team ~= myHero.team
  697. end
  698.  
  699. function _Structures:CanOrbwalkStructure()
  700.         return self:CanOrbwalkTower() or self:CanOrbwalkInhib() or self:CanOrbwalkNexus()
  701. end
  702.  
  703. function _Structures:GetTargetStructure()
  704.         return GetTarget()
  705. end
  706.  
  707. function _Structures:CanOrbwalkTower()
  708.         return self:TowerTargetted() and GetDistance(GetTarget()) - self.TowerCollisionRange < MyHero.TrueRange
  709. end
  710.  
  711. function _Structures:CanOrbwalkInhib()
  712.         return self:InhibTargetted() and GetDistance(GetTarget()) - self.InhibCollisionRange < MyHero.TrueRange
  713. end
  714.  
  715. function _Structures:CanOrbwalkNexus()
  716.         return self:NexusTargetted() and GetDistance(GetTarget()) - self.NexusCollisionRange < MyHero.TrueRange
  717. end
  718.  
  719. --[[
  720.                 _Skills Class
  721. ]]
  722.  
  723. class '_Skills' Skills = nil
  724.  
  725. function _Skills:__init()
  726.         self.SkillsList = {}
  727.         Skills = self
  728.         if VIP_USER then require "Collision" end
  729.         AddTickCallback(function() self:_OnTick() end)
  730. end
  731.  
  732. function _Skills:_OnTick()
  733.         for _, Skill in pairs(self.SkillsList) do
  734.                 if Keys.AutoCarry and AutoCarryMenu[Skill.RawName.."AutoCarry"] or
  735.                         Keys.MixedMode and MixedModeMenu[Skill.RawName.."MixedMode"] or
  736.                         Keys.LaneClear and LaneClearMenu[Skill.RawName.."LaneClear"] then
  737.                         Skill.Active = true
  738.                 else
  739.                         Skill.Active = false
  740.                 end
  741.         end
  742.         self:SortSkillOrder()
  743. end
  744.  
  745. function _Skills:CastAll(Target)
  746.         for _, Skill in ipairs(self.SkillsList) do
  747.                 if Skill.Enabled then
  748.                         Skill:Cast(Target)
  749.                 end
  750.         end
  751. end
  752.  
  753. function _Skills:GetSkill(Key)
  754.         for _, Skill in pairs(self.SkillsList) do
  755.                 if Skill.Key == Key then
  756.                         return Skill
  757.                 end
  758.         end
  759. end
  760.  
  761. function _Skills:GetSkillMenu(Key)
  762.         if MenuManager.SkillMenu[Key] then
  763.                 return MenuManager.SkillMenu[Key]
  764.         else
  765.                 return {CastPrio = 0}
  766.         end
  767. end
  768.  
  769. function _Skills:SortSkillOrder()
  770.         table.sort(self.SkillsList, function(a, b) return self:GetSkillMenu(a.Key).CastPrio < self:GetSkillMenu(b.Key).CastPrio end)
  771. end
  772.  
  773. function _Skills:HasSkillReady()
  774.         for _, Skill in pairs(self.SkillsList) do
  775.                 if Skill.Ready then
  776.                         return true
  777.                 end
  778.         end
  779. end
  780.  
  781. function _Skills:NewSkill(enabled, key, range, displayName, type, minMana, afterAttack, reqAttackTarget, speed, delay, width, collision)
  782.         return _Skill(enabled, key, range, displayName, type, minMana, afterAttack, reqAttackTarget, speed, delay, width, collision, true)
  783. end
  784.  
  785. function _Skills:DisableAll()
  786.         for _, Skill in pairs(self.SkillsList) do
  787.                 Skill.Enabled = false
  788.         end
  789. end
  790.  
  791. --[[
  792.                 _Skill Class
  793. ]]
  794.  
  795. class '_Skill'
  796.  
  797. SPELL_TARGETED = 1
  798. SPELL_LINEAR = 2
  799. SPELL_CIRCLE = 3
  800. SPELL_CONE = 4
  801. SPELL_LINEAR_COL = 5
  802. SPELL_SELF = 6
  803. SPELL_SELF_AT_MOUSE = 7
  804. AutoCarry.SPELL_TARGETED = 1
  805. AutoCarry.SPELL_LINEAR = 2
  806. AutoCarry.SPELL_CIRCLE = 3
  807. AutoCarry.SPELL_CONE = 4
  808. AutoCarry.SPELL_LINEAR_COL = 5
  809. AutoCarry.SPELL_SELF = 6
  810. AutoCarry.SPELL_SELF_AT_MOUSE = 7
  811.  
  812. -- --[[
  813. --              Initialise _Skill class
  814.  
  815. --              enabled                         Boolean - set true for auto carry to automatically cast it, false for manual control in plugin
  816. --              key                             Spell key, e.g _Q
  817. --              range                           Spell range
  818. --              displayName             The name to display in menus
  819. --              type                            SPELL_TARGETED, SPELL_LINEAR, SPELL_CIRCLE, SPELL_CONE, SPELL_LINEAR_COL, SPELL_SELF, SPELL_SELF_AT_MOUSE
  820. --              minMana                         Minimum percentage mana before cast is allowed
  821. --              afterAttack             Boolean - set true to only cast right after an auto attack
  822. --              reqAttackTarget         Boolean - set true to only cast if a target is in attack range
  823. --              speed                           Speed of the projectile for skillshots
  824. --              delay                           Delay of the spell for skillshots
  825. --              width                           Width of the projectile for skillshots
  826. --              collision                       Boolean - set true to check minion collision before casting
  827.  
  828. -- ]]
  829. function _Skill:__init(enabled, key, range, displayName, type, minMana, afterAttack, reqAttackTarget, speed, delay, width, collision, custom)
  830.         self.Key = key
  831.         self.Range = range
  832.         self.DisplayName = displayName
  833.         self.RawName = self.DisplayName:gsub("[^A-Za-z0-9]", "")
  834.         self.Type = type
  835.         self.MinMana = minMana or 0
  836.         self.AfterAttack = afterAttack or false
  837.         self.ReqAttackTarget = reqAttackTarget or false
  838.         self.Speed = speed or 0
  839.         self.Delay = delay or 0
  840.         self.Width = width or 0
  841.         self.Collision = collision
  842.         self.IsCustom = custom
  843.         self.Active = true
  844.         self.Enabled = enabled or false
  845.         self.Ready = false
  846.         if VIP_USER then
  847.                 self.KloPredCallback = function(unit, pos, castSpell)
  848.                         if GetDistanceSqr(pos, castSpell.Source) < castSpell.RangeSqr and  myHero:CanUseSpell(castSpell.Name) == READY and myHero:GetSpellData(castSpell.Name).mana < myHero.mana then
  849.                                 if (self.Collision and not self:GetCollision(pos)) or not self.Collision then
  850.                                 CastSpell(castSpell.Name, pos.x, pos.z)
  851.                         end
  852.                     end
  853.                 end
  854.                
  855.                 self.KloPred = ProdictManager.GetInstance():AddProdictionObject(self.Key, self.Range, self.Speed * 1000, self.Delay / 1000, self.Width, myHero, self.KloPredCallback)
  856.         end
  857.  
  858.         AddTickCallback(function() self:_OnTick() end)
  859.  
  860.         table.insert(Skills.SkillsList, self)
  861. end
  862.  
  863. function _Skill:_OnTick()
  864.         if self.Enabled then
  865.                 if Skills:GetSkillMenu(self.Key).ManualCast and Crosshair:GetTarget() then
  866.                         self:ForceCast(Crosshair:GetTarget())
  867.                 end
  868.         end
  869.         self.Ready = myHero:CanUseSpell(self.Key) == READY
  870.         if self.Enabled and not self.IsCustom then
  871.                 self.reqAttackTarget = Skills:GetSkillMenu(self.Key).RequiresTarget
  872.         end
  873. end
  874.  
  875. function _Skill:Cast(Target, ForceCast)
  876.         if not ForceCast then
  877.                 if (not self.Active and self.Enabled) or (not self.Enabled and not self.IsCustom) then
  878.                         return
  879.                 elseif self.AfterAttack and not Orbwalker:IsAfterAttack() then
  880.                         return
  881.                 elseif not self:ValidSkillTarget(Target) then
  882.                         return
  883.                 elseif (self.ReqAttackTarget and not Orbwalker:CanOrbwalkTarget(Target)) then
  884.                         return
  885.                 end
  886.         end
  887.         if not self:IsReady() then
  888.                 return
  889.         end
  890.  
  891.  
  892.         if self.Type == SPELL_SELF then
  893.                 CastSpell(self.Key)
  894.         elseif self.Type == SPELL_SELF_AT_MOUSE then
  895.                 CastSpell(self.Key, mousePos.x, mousePos.z)
  896.         elseif self.Type == SPELL_TARGETED then
  897.                 if ValidTarget(Target, self.Range) then
  898.                         CastSpell(self.Key, Target)
  899.                 end
  900.         elseif self.Type == SPELL_CONE then
  901.                 if ValidTarget(Target, self.Range) then
  902.                         if not VIP_USER then
  903.                                 local predPos = self:GetPrediction(Target)
  904.                                 if predPos then
  905.                                         CastSpell(self.Key, predPos.x, predPos.z)
  906.                                 end
  907.                         else
  908.                                 self.KloPred:EnableTarget(Target, true)
  909.                         end
  910.                 end
  911.         elseif self.Type == SPELL_LINEAR or self.Type == SPELL_CIRCLE then
  912.                 if ValidTarget(Target) then
  913.                         if not VIP_USER then
  914.                                 local predPos = self:GetPrediction(Target)
  915.                                 if predPos then
  916.                                         CastSpell(self.Key, predPos.x, predPos.z)
  917.                                 end
  918.                         else
  919.                                 self.KloPred:EnableTarget(Target, true)
  920.                         end
  921.                 end
  922.         elseif self.Type == SPELL_LINEAR_COL then
  923.                 if ValidTarget(Target) then
  924.                        
  925.                         if self.Collision then
  926.                                 if not VIP_USER then
  927.                                         local predPos = self:GetPrediction(Target)
  928.                                         if predPos then
  929.                                                 local collision = self:GetCollision(predPos)
  930.                                                 if not collision or ForceCast then
  931.                                                         CastSpell(self.Key, predPos.x, predPos.z)
  932.                                                 end
  933.                                         end
  934.                                 else
  935.                                         self.KloPred:EnableTarget(Target, true)
  936.                                 end
  937.                         end
  938.                 end
  939.         end
  940. end
  941.  
  942. function _Skill:ForceCast(Target)
  943.         self:Cast(Target, true)
  944. end
  945.  
  946. function _Skill:GetPrediction(Target)
  947.         if VIP_USER then
  948.                 pred = TargetPredictionVIP(self.Range, self.Speed*1000, self.Delay/1000, self.Width)
  949.                 if pred and pred:GetHitChance(Target) > ConfigMenu.HitChance/100 then
  950.                         return pred:GetPrediction(Target)
  951.                 end
  952.         elseif not VIP_USER then
  953.                 pred = TargetPrediction(self.Range, self.Speed, self.Delay, self.Width)
  954.                 return pred:GetPrediction(Target)
  955.         end
  956. end
  957.  
  958. function _Skill:GetCollision(pos)
  959.         if VIP_USER and self.Collision then
  960.                 local col = Collision(self.Range, self.Speed*1000, self.Delay/1000, self.Width)
  961.                 return col:GetMinionCollision(myHero, pos)
  962.         elseif self.Collision then
  963.                 for _, Minion in pairs(Minions.EnemyMinions.objects) do
  964.                         if ValidTarget(Minion) and myHero.x ~= Minion.x then
  965.                                 local myX = myHero.x
  966.                                 local myZ = myHero.z
  967.                                 local tarX = pos.x
  968.                                 local tarZ = pos.z
  969.                                 local deltaX = myX - tarX
  970.                                 local deltaZ = myZ - tarZ
  971.                                 local m = deltaZ/deltaX
  972.                                 local c = myX - m*myX
  973.                                 local minionX = Minion.x
  974.                                 local minionZ = Minion.z
  975.                                 local distanc = (math.abs(minionZ - m*minionX - c))/(math.sqrt(m*m+1))
  976.                                 if distanc < self.Width and ((tarX - myX)*(tarX - myX) + (tarZ - myZ)*(tarZ - myZ)) > ((tarX - minionX)*(tarX - minionX) + (tarZ - minionZ)*(tarZ - minionZ)) then
  977.                                         return true
  978.                                 end
  979.                         end
  980.            end
  981.            return false
  982.         end
  983. end
  984.  
  985. function _Skill:GetHitChance(pred)
  986.         if VIP_USER then
  987.                 return pred:GetHitChance(target) > ConfigMenu.HitChance/100
  988.         end
  989. end
  990.  
  991. function _Skill:ValidSkillTarget(Target)
  992.         if not self.IsCustom then
  993.                 local _Menu = Skills:GetSkillMenu(self.Key)
  994.                 if not Target or myHero.mana / myHero.maxMana * 100 < _Menu.MinMana or Target.health / Target.maxHealth * 100 < _Menu.MinHealth or Target.health / Target.maxHealth * 100 > _Menu.MaxHealth then
  995.                         return false
  996.                 end
  997.                 return true
  998.         end
  999.         return true
  1000. end
  1001.  
  1002. function _Skill:GetRange()
  1003.         return self.reqAttackTarget and MyHero.TrueRange or self.Range
  1004. end
  1005.  
  1006. function _Skill:IsReady()
  1007.         return myHero:CanUseSpell(self.Key) == READY
  1008. end
  1009.  
  1010. --[[
  1011.                 _Items Class
  1012. ]]
  1013.  
  1014. class '_Items' Items = nil
  1015.  
  1016. function _Items:__init()
  1017.         self.ItemList = {}
  1018.         Items = self
  1019.  
  1020.         AddTickCallback(function() self:_OnTick() end)
  1021. end
  1022.  
  1023. function _Items:_OnTick()
  1024.         for _, Item in pairs(self.ItemList) do
  1025.                 if Keys.AutoCarry and AutoCarryMenu[Item.RawName.."AutoCarry"] or
  1026.                         Keys.MixedMode and MixedModeMenu[Item.RawName.."MixedMode"] or
  1027.                         Keys.LaneClear and LaneClearMenu[Item.RawName.."LaneClear"] then
  1028.                         Item.Active = true
  1029.                 else
  1030.                         Item.Active = false
  1031.                 end
  1032.         end
  1033. end
  1034.  
  1035. function _Items:UseAll(Target)
  1036.         if Target and Target.type == myHero.type then
  1037.                 for _, Item in pairs(self.ItemList) do
  1038.                         Item:Use(Target)
  1039.                 end
  1040.         end
  1041. end
  1042.  
  1043. function _Items:UseItem(ID, Target)
  1044.         for _, Item in pairs(self.ItemList) do
  1045.                 if Item.ID == ID then
  1046.                         Item:Use(Target)
  1047.                 end
  1048.         end
  1049. end
  1050.  
  1051. function _Items:GetItem(ID)
  1052.         for _, Item in pairs(self.ItemList) do
  1053.                 if Item.ID == ID then
  1054.                         return Item
  1055.                 end
  1056.         end
  1057. end
  1058.  
  1059. function _Items:GetBotrkBonusLastHitDamage(StartingDamage, Target)
  1060.         local _BonusDamage = 0
  1061.         if GetInventoryHaveItem(3153) then
  1062.                 if ValidTarget(Target) then
  1063.                         _BonusDamage = Target.health / 20
  1064.                         if _BonusDamage >= 60 then
  1065.                                 _BonusDamage = 60
  1066.                         end
  1067.                 end
  1068.         end
  1069.         return _BonusDamage
  1070. end
  1071.  
  1072. --[[
  1073.                 _Item Class
  1074. ]]
  1075.  
  1076. class '_Item'
  1077.  
  1078. --TODO: Add Muramana
  1079. function _Item:__init(_Name, _ID, _RequiresTarget, _Range, _Override)
  1080.         self.Name = _Name
  1081.         self.RawName = self.Name:gsub("[^A-Za-z0-9]", "")
  1082.         self.ID = _ID
  1083.         self.RequiresTarget = _RequiresTarget
  1084.         self.Range = _Range
  1085.         self.Slot = nil
  1086.         self.Override = _Override
  1087.         self.Active = true
  1088.         self.Enabled = true
  1089.  
  1090.         table.insert(Items.ItemList, self)
  1091. end
  1092.  
  1093. function _Item:Use(Target)
  1094.         if self.Override then
  1095.                 return self.Override()
  1096.         end
  1097.         if self.RequiresTarget and not Target then
  1098.                 return
  1099.         end
  1100.         if not self.Active or not self.Enabled then
  1101.                 return
  1102.         end
  1103.  
  1104.         self.Slot = GetInventorySlotItem(self.ID)
  1105.  
  1106.         if self.Slot then      
  1107.                 if self.ID == 3153 then -- BRK
  1108.                         local _Menu = MenuManager:GetActiveMenu()
  1109.                         if _Menu and _Menu.botrkSave then
  1110.                                 if  myHero.health <= myHero.maxHealth * 0.65 then
  1111.                                         CastSpell(self.Slot, Target)
  1112.                                 end
  1113.                         else
  1114.                                 CastSpell(self.Slot, Target)
  1115.                         end
  1116.                 elseif self.ID == 3042 then -- Muramana
  1117.                         if not MuramanaIsActive() then
  1118.                                 MuramanaOn()
  1119.                         end
  1120.                 elseif not self.RequiresTarget and Orbwalker:CanOrbwalkTarget(Target) then
  1121.                         CastSpell(self.Slot)
  1122.                 elseif self.RequiresTarget and ValidTarget(Target) and GetDistance(Target) <= self.Range then
  1123.                         CastSpell(self.Slot, Target)
  1124.                 end
  1125.         end
  1126. end
  1127.  
  1128. --[[
  1129.                 _Helper Class
  1130. ]]
  1131.  
  1132. class '_Helper' Helper = nil
  1133.  
  1134. function _Helper:__init()
  1135.         self.Tick = 0
  1136.         self.Latency = 0
  1137.         self.Colour = {Green = 0x00FF00}
  1138.         self.EnemyTable = {}
  1139.         Helper = self
  1140.         self.EnemyTable = GetEnemyHeroes()
  1141.         AddTickCallback(function() self:_OnTick() end)
  1142. end
  1143.  
  1144. function _Helper:_OnTick()
  1145.         self.Tick = GetTickCount()
  1146.         self.Latency = GetLatency()
  1147. end
  1148.  
  1149. function _Helper:StringContains(string, contains)
  1150.         return string:lower():find(contains)
  1151. end
  1152.  
  1153. function _Helper:DrawCircleObject(Object, Range, Colour, Thickness)
  1154.         Thickness = Thickness and Thickness or 0
  1155.         for i = 0, Thickness do
  1156.                 if DrawingMenu.LowFPS then
  1157.                         self:DrawCircle2(Object.x, Object.y, Object.z, Range + i, Colour)
  1158.                 else
  1159.                         DrawCircle(Object.x, Object.y, Object.z, Range + i, Colour)
  1160.                 end
  1161.         end
  1162. end
  1163.  
  1164. -- Low fps circles by barasia, vadash and viseversa
  1165. function _Helper:DrawCircleNextLvl(x, y, z, radius, width, color, chordlength)
  1166.     radius = radius or 300
  1167.                 quality = math.max(8,self:round(180/math.deg((math.asin((chordlength/(2*radius)))))))
  1168.                 quality = 2 * math.pi / quality
  1169.                 radius = radius*.92
  1170.     local points = {}
  1171.     for theta = 0, 2 * math.pi + quality, quality do
  1172.         local c = WorldToScreen(D3DXVECTOR3(x + radius * math.cos(theta), y, z - radius * math.sin(theta)))
  1173.         points[#points + 1] = D3DXVECTOR2(c.x, c.y)
  1174.     end
  1175.     DrawLines2(points, width or 1, color or 4294967295)
  1176. end
  1177.  
  1178. function _Helper:round(num)
  1179.         if num >= 0 then return math.floor(num+.5) else return math.ceil(num-.5) end
  1180. end
  1181.  
  1182. function _Helper:DrawCircle2(x, y, z, radius, color)
  1183.     local vPos1 = Vector(x, y, z)
  1184.     local vPos2 = Vector(cameraPos.x, cameraPos.y, cameraPos.z)
  1185.     local tPos = vPos1 - (vPos1 - vPos2):normalized() * radius
  1186.     local sPos = WorldToScreen(D3DXVECTOR3(tPos.x, tPos.y, tPos.z))
  1187.     if OnScreen({ x = sPos.x, y = sPos.y }, { x = sPos.x, y = sPos.y }) then
  1188.         self:DrawCircleNextLvl(x, y, z, radius, 1, color, 75)  
  1189.     end
  1190. end
  1191.  
  1192. function _Helper:GetHitBoxDistance(Target)
  1193.         return GetDistance(Target) - GetDistance(Target, Target.minBBox)
  1194. end
  1195.  
  1196. function _Helper:TrimString(s)
  1197.         return s:find'^%s*$' and '' or s:match'^%s*(.*%S)'
  1198. end
  1199.  
  1200. function _Helper:GetClasses()
  1201.         return AutoCarry.Skills, AutoCarry.Keys, AutoCarry.Items, AutoCarry.Data, AutoCarry.Jungle, AutoCarry.Helper, AutoCarry.MyHero, AutoCarry.Minions, AutoCarry.Crosshair, AutoCarry.Orbwalker
  1202. end
  1203.  
  1204. function _Helper:ArgbFromMenu(menu)
  1205.         return ARGB(menu[1], menu[2], menu[3], menu[4])
  1206. end
  1207.  
  1208. function _Helper:DecToHex(Dec)
  1209.         local B, K, Hex, I, D = 16, "0123456789ABCDEF", "", 0
  1210.         while Dec > 0 do
  1211.                 I = I + 1
  1212.                 Dec, D = math.floor(Dec / B), math.fmod(Dec, B) + 1
  1213.                 Hex = string.sub(K, D, D)..Hex
  1214.         end
  1215.         return Hex
  1216. end
  1217.  
  1218. function _Helper:HexFromMenu(menu)
  1219.         local argb = {}
  1220.         argb["a"] = menu[1]
  1221.         argb["r"] = menu[2]
  1222.         argb["g"] = menu[3]
  1223.         argb["b"] = menu[4]
  1224.         return tonumber(self:DecToHex(argb["a"]) .. self:DecToHex(argb["r"]) .. self:DecToHex(argb["g"]) .. self:DecToHex(argb["b"]), 16);
  1225. end
  1226.  
  1227. function _Helper:IsEvading()
  1228.         return _G.evade
  1229. end
  1230.  
  1231. --[[
  1232.                 Keys Class
  1233. ]]
  1234.  
  1235. class '_Keys' Keys = nil
  1236.  
  1237. function _Keys:__init()
  1238.         self.KEYS_KEY = 0
  1239.         self.KEYS_MENUKEY = 1
  1240.         self.AutoCarry = false
  1241.         self.MixedMode = false
  1242.         self.LastHit = false
  1243.         self.LaneClear = false
  1244.         self.AutoCarryKeys = {}
  1245.         self.MixedModeKeys = {}
  1246.         self.LastHitKeys = {}
  1247.         self.LaneClearKeys = {}
  1248.         Keys = self
  1249.  
  1250.         AddTickCallback(function() self:_OnTick() end)
  1251. end
  1252.  
  1253. function _Keys:_OnTick()
  1254.         self.AutoCarry = self:IsKeyEnabled(self.AutoCarryKeys)
  1255.         self.MixedMode = self:IsKeyEnabled(self.MixedModeKeys)
  1256.         self.LastHit = self:IsKeyEnabled(self.LastHitKeys)
  1257.         self.LaneClear = self:IsKeyEnabled(self.LaneClearKeys)
  1258. end
  1259.  
  1260. function _Keys:IsKeyEnabled(List)
  1261.         for _, Key in pairs(List) do
  1262.                 if Key.Type == self.KEYS_KEY then
  1263.                         if IsKeyDown(Key.Key) then
  1264.                                 return true
  1265.                         end
  1266.                 elseif Key.Type == self.KEYS_MENUKEY then
  1267.                         if Key.Menu[Key.Param] then
  1268.                                 return true
  1269.                         end
  1270.                 end
  1271.         end
  1272.         return false
  1273. end
  1274.  
  1275. function _Keys:RegisterMenuKey(Menu, Param, Mode)
  1276.         local MenuKey = _MenuKey(Menu, Param)
  1277.         self:Insert(MenuKey, Mode)
  1278. end
  1279.  
  1280. function _Keys:RegisterKey(key, Mode)
  1281.         local Key = _Key(key)
  1282.         self:Insert(Key, Mode)
  1283. end
  1284.  
  1285. function _Keys:Insert(Key, Mode)
  1286.         if Mode == MODE_AUTOCARRY then
  1287.                 table.insert(self.AutoCarryKeys, Key)
  1288.         elseif Mode == MODE_MIXEDMODE then
  1289.                 table.insert(self.MixedModeKeys, Key)
  1290.         elseif Mode == MODE_LASTHIT then
  1291.                 table.insert(self.LastHitKeys, Key)
  1292.         elseif Mode == MODE_LANECLEAR then
  1293.                 table.insert(self.LaneClearKeys, Key)
  1294.         end
  1295. end
  1296.  
  1297. --[[
  1298.                 Key Class
  1299. ]]
  1300.  
  1301. class '_Key'
  1302.  
  1303. function _Key:__init(key)
  1304.         self.Key = key
  1305.         self.Type = Keys.KEYS_KEY
  1306. end
  1307.  
  1308. --[[
  1309.                 MenuKey Class
  1310. ]]
  1311.  
  1312. class '_MenuKey'
  1313.  
  1314. function _MenuKey:__init(menu, param)
  1315.         self.Menu = menu
  1316.         self.Param = param
  1317.         self.Type = Keys.KEYS_MENUKEY
  1318. end
  1319.  
  1320. --[[
  1321.                 _SwingTimer Class
  1322. ]]
  1323.  
  1324. class '_SwingTimer' SwingTimer = nil
  1325.  
  1326. function _SwingTimer:__init()
  1327.         self.bar_green = GetSprite("SidasAutoCarry\\bar_green.dds")
  1328.         self.bar_red = GetSprite("SidasAutoCarry\\bar_red.dds")
  1329.         self.Width = 300
  1330.         self.X = WINDOW_W/2 - (self.Width/2)
  1331.         self.Y = WINDOW_H/2
  1332.         self.Height = self.bar_green.height    
  1333.         self.ResizeButtonWidth = 30
  1334.         self.Moving = false
  1335.         self.Resizing = false
  1336.         self.Save = GetSave("SidasAutoCarry").SwingTimer
  1337.         SwingTimer = self
  1338.  
  1339.         if self.Save then
  1340.                 self.X = self.Save.X
  1341.                 self.Y = self.Save.Y
  1342.                 self.Width = self.Save.Width
  1343.         end
  1344.         AddMsgCallback(function(Msg, Key) self:_OnWndMsg(Msg, Key) end)
  1345.         AddDrawCallback(function() self:_OnDraw() end)
  1346.         AddTickCallback(function() self:_OnTick() end)
  1347. end
  1348.  
  1349. function _SwingTimer:_OnDraw()
  1350.         if not ExtrasMenu.ShowSwingTimer then return end
  1351.         local Difference = (Helper.Tick - Orbwalker.LastAttack) / (Orbwalker:GetNextAttackTime() - Orbwalker.LastAttack)
  1352.         if Difference > 1 or Difference < 0 then
  1353.                 self:_DrawBar(self.X, self.Y, self.Width, 1)
  1354.         else
  1355.                 self:_DrawBar(self.X, self.Y, self.Width, Difference)
  1356.         end
  1357.         if IsKeyDown(16) then
  1358.                 DrawRectangleOutline(self.X + self.Width + 5, self.Y, self.ResizeButtonWidth, self.Height, ARGB(0xFF,0xFF,0xFF,0xFF), 3)
  1359.         end
  1360. end
  1361.  
  1362. function _SwingTimer:_OnWndMsg(Msg, Key)
  1363.         if Msg == WM_LBUTTONDOWN and IsKeyDown(16) then
  1364.                 if CursorIsUnder(self.X, self.Y, self.Width, self.Height) then
  1365.                         self.Moving = true
  1366.                 elseif CursorIsUnder(self.X + self.Width + 5, self.Y, self.ResizeButtonWidth, self.Height) then
  1367.                         self.Resizing = true
  1368.                 end
  1369.         elseif Msg == WM_LBUTTONUP and (self.Moving or self.Resizing) then
  1370.                 self.Moving = false
  1371.                 self.Resizing = false
  1372.                 GetSave("SidasAutoCarry").SwingTimer = {X = self.X, Y = self.Y, Height = self.Height, Width = self.Width}
  1373.         end
  1374. end
  1375.  
  1376. function _SwingTimer:_OnTick()
  1377.         if self.Moving then
  1378.                 self.X = GetCursorPos().x - self.Width / 2
  1379.                 self.Y = GetCursorPos().y
  1380.         elseif self.Resizing then
  1381.                 self.Width = GetCursorPos().x - self.X - self.ResizeButtonWidth / 2
  1382.         end
  1383. end
  1384.  
  1385. function _SwingTimer:_DrawBar(x, y, barLen, percentage)
  1386.         DrawRectangleOutline(x-1, y-1, barLen+3, self.Height+2, ARGB(0x00,0xFF,0xFF,0xFF), 1)
  1387.     self.bar_green:DrawEx(Rect(0, 0, barLen*percentage, self.Height), D3DXVECTOR3(0,0,0), D3DXVECTOR3(x,y,0), 0xFF)
  1388.     self.bar_red:DrawEx(Rect(barLen*percentage, 0, barLen, self.Height), D3DXVECTOR3(0,0,0), D3DXVECTOR3(x+barLen*percentage,y,0), 0xFF)
  1389.     DrawTextA(math.floor(percentage*100).."%", 12, x+(barLen/2), y-1, ARGB(255,255,255,255), "center")
  1390. end
  1391.  
  1392. --[[
  1393.                 _Streaming Class
  1394. ]]
  1395.  
  1396. class '_Streaming'
  1397.  
  1398. function _Streaming:__init()
  1399.         self.Save = GetSave("SidasAutoCarry")
  1400.  
  1401.         AddTickCallback(function()self:_OnTick() end)
  1402.         AddMsgCallback(function(msg, key)self:_OnWndMsg(msg, key) end)
  1403.  
  1404.         if self.Save.StreamingMode then
  1405.                 self:EnableStreaming()
  1406.         else
  1407.                 self:DisableStreaming()
  1408.         end
  1409. end
  1410.  
  1411. function _Streaming:_OnTick()
  1412.         if self.StreamingMenu then
  1413.                 self.StreamingMenu._param[4].text = self.StreamingMenu.Colour == 0 and "Green" or "Red"
  1414.         end
  1415.         if self.StreamEnabled then
  1416.                 self:EnableStreaming()
  1417.         end
  1418. end
  1419.  
  1420. function _Streaming:_OnWndMsg(msg, key)
  1421.         if msg == KEY_DOWN and key == 118 then
  1422.                 if not self.StreamEnabled then
  1423.                         self:EnableStreaming()
  1424.                 else
  1425.                         self:DisableStreaming()
  1426.                 end
  1427.         end
  1428. end
  1429.  
  1430. function _Streaming:EnableStreaming()
  1431.         self.Save.StreamingMode = true
  1432.         self.StreamEnabled = true
  1433.         if not self.ChatTimeout then
  1434.                 self.ChatTimeout = GetTickCount() + 3000
  1435.         elseif GetTickCount() < self.ChatTimeout then
  1436.                 self:DisableOverlay()
  1437.                 for i = 0, 15 do
  1438.                         PrintChat("")
  1439.                 end
  1440.         else
  1441.                 _G.PrintChat = function() end
  1442.         end
  1443. end
  1444.  
  1445. function _Streaming:DisableStreaming()
  1446.         self.Save.StreamingMode = false
  1447.         self.StreamEnabled = false
  1448.         if self.ChatTimeout then
  1449.                 EnableOverlay()
  1450.                 self.ChatTimeout = nil
  1451.         end
  1452. end
  1453.  
  1454. function _Streaming:OnMove()
  1455.         if not self.MenuCreated then return end
  1456.         if self.StreamingMenu.MinRand > self.StreamingMenu.MaxRand then
  1457.                 print("revamped: Min cannot be higher than Max in Streaming Menu")
  1458.         elseif self.StreamingMenu.ShowClick and (not self.NextClick or Helper.Tick > self.NextClick) then
  1459.                 if self.StreamingMenu.Colour == 0 then
  1460.                         ShowGreenClick(mousePos)
  1461.                 else
  1462.                         ShowRedClick(mousePos)
  1463.                 end
  1464.                 self.nextClick = Helper.Tick + math.random(self.StreamingMenu.MinRand, self.StreamingMenu.MaxRand)
  1465.         end
  1466. end
  1467.  
  1468. function _Streaming:CreateMenu()
  1469.         self.StreamingMenu = scriptConfig("Sida's Auto Carry: Streaming", "sidasacstreaming")
  1470.         self.StreamingMenu:addParam("ShowClick", "Show Fake Click Marker", SCRIPT_PARAM_ONOFF, false)
  1471.         self.StreamingMenu:addParam("MinRand", "Minimum Time Between Clicks", SCRIPT_PARAM_SLICE, 150, 0, 1000, 0)
  1472.         self.StreamingMenu:addParam("MaxRand", "Maximum Time Between Clicks", SCRIPT_PARAM_SLICE, 650, 0, 1000, 0)
  1473.         self.StreamingMenu:addParam("Colour", "Green", SCRIPT_PARAM_SLICE, 0, 0, 1, 0)
  1474.         self.StreamingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1475.         self.StreamingMenu:addParam("sep", "Toggle Streaming Mode with F7", SCRIPT_PARAM_INFO, "")
  1476.         self.MenuCreated = true
  1477. end
  1478.  
  1479. function _Streaming:DisableOverlay()
  1480.     _G.DrawText,
  1481.     _G.PrintFloatText,
  1482.     _G.DrawLine,
  1483.     _G.DrawArrow,
  1484.     _G.DrawCircle,
  1485.     _G.DrawRectangle,
  1486.     _G.DrawLines,
  1487.     _G.DrawLines2 = function() end,
  1488.     function() end,
  1489.     function() end,
  1490.     function() end,
  1491.     function() end,
  1492.     function() end,
  1493.     function() end
  1494. end
  1495.  
  1496. Streaming = _Streaming()
  1497.  
  1498. --[[
  1499.                 _MenuManager Class
  1500. ]]
  1501.  
  1502. --[[
  1503.                 _Summoner Class
  1504. ]]
  1505.  
  1506. class '_Summoner'
  1507.  
  1508. function _Summoner:__init()
  1509.  
  1510. end
  1511.  
  1512. class '_MenuManager' MenuManager = nil
  1513.  
  1514. function _MenuManager:__init()
  1515.         self.AutoCarry = false
  1516.         self.MixedMode = false
  1517.         self.LastHit = false
  1518.         self.LaneClear = false
  1519.         self.SkillMenu = {}
  1520.  
  1521.         AddTickCallback(function() self:OnTick() end)
  1522.         AddMsgCallback(function(msg, key) self:OnWndMsg(msg, key) end)
  1523.         AddUnloadCallback(function() self:_OnUnload() end)
  1524.         AddBugsplatCallback(function() self:_OnBugsplat() end)
  1525.         AddExitCallback(function() self:_OnExit() end)
  1526.         MenuManager = self
  1527.  
  1528.         --[[ Auto Carry Menu ]]
  1529.  
  1530.         AutoCarryMenu = scriptConfig("Set it Space", "sidasacautocarry")
  1531.         AutoCarryMenu:addParam("title", "              Sida's Auto Carry: revamped", SCRIPT_PARAM_INFO, "")
  1532.         AutoCarryMenu:addParam("sep", "-- Settings--", SCRIPT_PARAM_INFO, "")
  1533.         AutoCarryMenu:addParam("Toggle", "Toggle mode (requires reload)", SCRIPT_PARAM_ONOFF, false)
  1534.         AutoCarryMenu:addParam("Active", "Set it Space", AutoCarryMenu.Toggle and SCRIPT_PARAM_ONKEYTOGGLE or SCRIPT_PARAM_ONKEYDOWN, false, 219)
  1535.         AutoCarryMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1536.         AutoCarryMenu:addParam("sep", "-- Skills --", SCRIPT_PARAM_INFO, "")
  1537.         AutoCarryMenu:permaShow("title")
  1538.         AutoCarryMenu:permaShow("Active")
  1539.         AutoCarryMenu:addTS(Crosshair.Attack_Crosshair)
  1540.         Keys:RegisterMenuKey(AutoCarryMenu, "Active", MODE_AUTOCARRY)
  1541.  
  1542.         if #Skills.SkillsList > 0 then
  1543.                 for _, Skill in pairs(Skills.SkillsList) do
  1544.                         AutoCarryMenu:addParam(Skill.RawName.."AutoCarry", "Use "..Skill.DisplayName, SCRIPT_PARAM_ONOFF, self:LoadSkill(AutoCarryMenu, Skill.RawName, "AutoCarry"))
  1545.                 end
  1546.         else
  1547.                 AutoCarryMenu:addParam("sep", "No supported skills for "..myHero.charName, SCRIPT_PARAM_INFO, "")
  1548.         end
  1549.  
  1550.         AutoCarryMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1551.         AutoCarryMenu:addParam("sep", "-- Items --", SCRIPT_PARAM_INFO, "")
  1552.         for _, Item in pairs(Items.ItemList) do
  1553.                 AutoCarryMenu:addParam(Item.RawName.."AutoCarry", "Use "..Item.Name, SCRIPT_PARAM_ONOFF, true)
  1554.         end
  1555.         AutoCarryMenu:addParam("botrkSave", "Save BotRK for max heal", SCRIPT_PARAM_ONOFF, true)
  1556.  
  1557.  
  1558.         --[[ Last Hit Menu ]]
  1559.  
  1560.         LastHitMenu = scriptConfig("Set it L", "sidasaclasthit")
  1561.         LastHitMenu:addParam("sep", "-- Settings--", SCRIPT_PARAM_INFO, "")
  1562.         LastHitMenu:addParam("Toggle", "Toggle mode (requires reload)", SCRIPT_PARAM_ONOFF, false)
  1563.         LastHitMenu:addParam("Active", "Set it L", LastHitMenu.Toggle and SCRIPT_PARAM_ONKEYTOGGLE or SCRIPT_PARAM_ONKEYDOWN, false, string.byte("A"))
  1564.         LastHitMenu:permaShow("Active")
  1565.         Keys:RegisterMenuKey(LastHitMenu, "Active", MODE_LASTHIT)
  1566.  
  1567.  
  1568.         --[[ Mixed Mode Menu ]]
  1569.  
  1570.         MixedModeMenu = scriptConfig("Set it L", "sidasacmixedmode")
  1571.         MixedModeMenu:addParam("sep", "-- Settings--", SCRIPT_PARAM_INFO, "")
  1572.         MixedModeMenu:addParam("Toggle", "Toggle mode (requires reload)", SCRIPT_PARAM_ONOFF, false)
  1573.         MixedModeMenu:addParam("Active", "Set it L", MixedModeMenu.Toggle and SCRIPT_PARAM_ONKEYTOGGLE or SCRIPT_PARAM_ONKEYDOWN, false, string.byte("D"))
  1574.         MixedModeMenu:addParam("MinionPriority", "Prioritise Last Hit Over Harass", SCRIPT_PARAM_ONOFF, true)
  1575.         MixedModeMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1576.         MixedModeMenu:addParam("sep", "-- Skills (Against Champions Only) --", SCRIPT_PARAM_INFO, "")
  1577.         MixedModeMenu:permaShow("Active")
  1578.         Keys:RegisterMenuKey(MixedModeMenu, "Active", MODE_MIXEDMODE)
  1579.  
  1580.         if #Skills.SkillsList > 0 then
  1581.                 for _, Skill in pairs(Skills.SkillsList) do
  1582.                         MixedModeMenu:addParam(Skill.RawName.."MixedMode", "Use "..Skill.DisplayName, SCRIPT_PARAM_ONOFF, self:LoadSkill(MixedModeMenu, Skill.RawName, "MixedMode"))
  1583.                 end
  1584.         else
  1585.                 MixedModeMenu:addParam("sep", "No supported skills for "..myHero.charName, SCRIPT_PARAM_INFO, "")
  1586.         end
  1587.  
  1588.         MixedModeMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1589.         MixedModeMenu:addParam("sep", "-- Items (Against Champions Only) --", SCRIPT_PARAM_INFO, "")
  1590.         for _, Item in pairs(Items.ItemList) do
  1591.                 MixedModeMenu:addParam(Item.RawName.."MixedMode", "Use "..Item.Name, SCRIPT_PARAM_ONOFF, true)
  1592.         end
  1593.         MixedModeMenu:addParam("botrkSave", "Save BotRK for max heal", SCRIPT_PARAM_ONOFF, true)
  1594.        
  1595.  
  1596.         --[[ Lane Clear Menu ]]
  1597.  
  1598.         LaneClearMenu = scriptConfig("Set it L", "sidasaclaneclear")
  1599.         LaneClearMenu:addParam("sep", "-- Settings--", SCRIPT_PARAM_INFO, "")
  1600.         LaneClearMenu:addParam("Toggle", "Toggle mode (requires reload)", SCRIPT_PARAM_ONOFF, false)
  1601.         LaneClearMenu:addParam("Active", "Set it L", LaneClearMenu.Toggle and SCRIPT_PARAM_ONKEYTOGGLE or SCRIPT_PARAM_ONKEYDOWN, false, string.byte("C"))
  1602.         LaneClearMenu:addParam("MinionPriority", "Prioritise Last Hit Over Harass", SCRIPT_PARAM_ONOFF, true)
  1603.         LaneClearMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1604.         LaneClearMenu:addParam("sep", "-- Skills (Against Champions Only) --", SCRIPT_PARAM_INFO, "")
  1605.         LaneClearMenu:permaShow("Active")
  1606.         Keys:RegisterMenuKey(LaneClearMenu, "Active", MODE_LANECLEAR)
  1607.  
  1608.         if #Skills.SkillsList > 0 then
  1609.                 for _, Skill in pairs(Skills.SkillsList) do
  1610.                         LaneClearMenu:addParam(Skill.RawName.."LaneClear", "Use "..Skill.DisplayName, SCRIPT_PARAM_ONOFF, self:LoadSkill(LaneClearMenu, Skill.RawName, "LaneClear"))  
  1611.                 end
  1612.         else
  1613.                 LaneClearMenu:addParam("sep", "No supported skills for "..myHero.charName, SCRIPT_PARAM_INFO, "")
  1614.         end
  1615.  
  1616.         LaneClearMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1617.         LaneClearMenu:addParam("sep", "-- Items (Against Champions Only) --", SCRIPT_PARAM_INFO, "")
  1618.         for _, Item in pairs(Items.ItemList) do
  1619.                 LaneClearMenu:addParam(Item.RawName.."LaneClear", "Use "..Item.Name, SCRIPT_PARAM_ONOFF, true)
  1620.         end
  1621.         LaneClearMenu:addParam("botrkSave", "Save BotRK for max heal", SCRIPT_PARAM_ONOFF, true)
  1622.  
  1623.         --[[ Skills Menus ]]
  1624.         for _, Skill in pairs(Skills.SkillsList) do
  1625.                 self.SkillMenu[Skill.Key] = scriptConfig("Sida's Auto Carry: Skill "..Skill.DisplayName, Skill.RawName)
  1626.                 self.SkillMenu[Skill.Key]:addParam("sep", "-- Against Champions --", SCRIPT_PARAM_INFO, "")
  1627.                 self.SkillMenu[Skill.Key]:addParam("CastPrio", "Cast Priority (0 Is Cast First)", SCRIPT_PARAM_SLICE, 0, 0, 3, 0)
  1628.                 self.SkillMenu[Skill.Key]:addParam("MinMana", "Mana Must Be Above %", SCRIPT_PARAM_SLICE, 0, 0, 100, 0)
  1629.                 self.SkillMenu[Skill.Key]:addParam("MinHealth", "Enemy Health Must Be Above %", SCRIPT_PARAM_SLICE, 0, 0, 100, 0)
  1630.                 self.SkillMenu[Skill.Key]:addParam("MaxHealth", "Enemy Health Must Be Below %", SCRIPT_PARAM_SLICE, 100, 0, 100, 0)
  1631.                 self.SkillMenu[Skill.Key]:addParam("RequiresTarget", "Target Must Be In Attack Range", SCRIPT_PARAM_ONOFF, Skill.ReqAttackTarget)
  1632.                 self.SkillMenu[Skill.Key]:addParam("ManualCast", "Manual Cast", SCRIPT_PARAM_ONKEYDOWN, false, 119)
  1633.                 -- self.SkillMenu[Skill.Key]:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1634.                 -- self.SkillMenu[Skill.Key]:addParam("sep", "-- Against Minions --", SCRIPT_PARAM_INFO, "")
  1635.                 -- self.SkillMenu[Skill.Key]:addParam("LastHit", "Last Hit With This Skill", SCRIPT_PARAM_ONOFF, false)
  1636.                 -- self.SkillMenu[Skill.Key]:addParam("MinManaMinions", "Minimum Mana %", SCRIPT_PARAM_SLICE, 0, 0, 100, 0)
  1637.         end
  1638.        
  1639.         --[[Configuration Menu ]]
  1640.         ConfigMenu = scriptConfig("Sida's Auto Carry: Configuration", "sidasacconfig")
  1641.         ConfigMenu:addParam("Focused", "Focus Selected Target", SCRIPT_PARAM_ONOFF, false)
  1642.         ConfigMenu:addParam("Butcher", "Butcher Mastery", SCRIPT_PARAM_SLICE, 0, 0, 2, 0)
  1643.         ConfigMenu:addParam("Spellblade", "Spellblade Mastery", SCRIPT_PARAM_ONOFF, true)
  1644.         ConfigMenu:addParam("Executioner", "Executioner Mastery", SCRIPT_PARAM_ONOFF, true)
  1645.         if VIP_USER then
  1646.                 ConfigMenu:addParam("HitChance", "Ability Hitchance", SCRIPT_PARAM_SLICE, 60, 0, 100, 0)
  1647.         end
  1648.         ConfigMenu:addParam("Freeze", "Lane Freeze Toggle", SCRIPT_PARAM_ONKEYTOGGLE, false, 112)
  1649.  
  1650.         -- ConfigMenu:addParam("Boost", "Turbo Boost: Attack", SCRIPT_PARAM_SLICE, 0, 0, 1000, 0)
  1651.         -- ConfigMenu:addParam("AttackBoost", "Turbo Boost: Movement", SCRIPT_PARAM_SLICE, 0, 0, 1000, 0)
  1652.  
  1653.         --[[ Drawing Menu ]]
  1654.         DrawingMenu = scriptConfig("Sida's Auto Carry: Drawing", "sidasacdrawing")
  1655.         DrawingMenu:addParam("RangeCircle", "Champion Range Circle", SCRIPT_PARAM_ONOFF, true)
  1656.         DrawingMenu:addParam("RangeCircleColour", "Colour", SCRIPT_PARAM_COLOR, {255, 0, 189, 22})
  1657.         DrawingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1658.         DrawingMenu:addParam("CastRangeCircle", "Spell Range Circle", SCRIPT_PARAM_ONOFF, true)
  1659.         DrawingMenu:addParam("CastRangeCircleColour", "Colour", SCRIPT_PARAM_COLOR, {183, 0, 26, 173})
  1660.         DrawingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1661.         DrawingMenu:addParam("TargetCircle", "Circle Around Target", SCRIPT_PARAM_ONOFF, true)
  1662.         DrawingMenu:addParam("TargetCircleColour", "Colour", SCRIPT_PARAM_COLOR, {255, 0, 112, 95})
  1663.         DrawingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1664.         DrawingMenu:addParam("MinionCircle", "Minion Marker With Prediction", SCRIPT_PARAM_ONOFF, true)
  1665.         DrawingMenu:addParam("MinionCircleColour", "Colour", SCRIPT_PARAM_COLOR, {183, 0, 26, 173})
  1666.         DrawingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1667.         DrawingMenu:addParam("ArrowToTarget", "Line To Target", SCRIPT_PARAM_ONOFF, true)
  1668.         DrawingMenu:addParam("ArrowToTargetColour", "Colour", SCRIPT_PARAM_COLOR, {100, 255, 100, 100})
  1669.         DrawingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1670.         DrawingMenu:addParam("StandZone", "Stand & Shoot Range", SCRIPT_PARAM_ONOFF, true)
  1671.         DrawingMenu:addParam("StandZoneColour", "Stand Zone Colour", SCRIPT_PARAM_COLOR, {183, 0, 26, 173})
  1672.         DrawingMenu:addParam("sep", "", SCRIPT_PARAM_INFO, "")
  1673.         DrawingMenu:addParam("LowFPS", "Use Low FPS Circles", SCRIPT_PARAM_ONOFF, false)
  1674.  
  1675.         --[[ Extras Menu ]]
  1676.         ExtrasMenu = scriptConfig("Sida's Auto Carry: Extras", "sidasacextras")
  1677.         ExtrasMenu:addParam("sep", "-- May Cause FPS Drops--", SCRIPT_PARAM_INFO, "")
  1678.         ExtrasMenu:addParam("ShowSwingTimer", "Show Swing Timer", SCRIPT_PARAM_ONOFF, true)
  1679.         ExtrasMenu:addParam("StandZone"..myHero.charName, "Stand Still And Shoot Range", SCRIPT_PARAM_SLICE, self:LoadStandRange(), 0, MyHero.TrueRange, 0)
  1680.  
  1681.         self:DisableAllModes()
  1682.         -- self.Boost = ConfigMenu.Boost
  1683.         -- self.AttackBoost = ConfigMenu.AttackBoost
  1684. end
  1685.  
  1686. function _MenuManager:OnTick()
  1687.         -- if self.Boost ~= ConfigMenu.Boost then
  1688.         --      print("Hyper Charge: Attack - When you start cancelling attacks, you've gone too high!")
  1689.         --      self.Boost = ConfigMenu.Boost
  1690.         -- end
  1691.  
  1692.         -- if self.AttackBoost ~= ConfigMenu.AttackBoost then
  1693.         --      print("Hyper Charge: Movement - When you stand still before each attack, you've gone too high!")
  1694.         --      self.AttackBoost = ConfigMenu.AttackBoost
  1695.         -- end
  1696.  
  1697.         if AutoCarryMenu.Active ~= self.AutoCarry and not self.AutoCarry then
  1698.                 self:SetToggles(true, false, false, false)
  1699.         elseif MixedModeMenu.Active ~= self.MixedMode and not self.MixedMode then
  1700.                 self:SetToggles(false, true, false, false)
  1701.         elseif LastHitMenu.Active ~= self.LastHit and not self.LastHit then
  1702.                 self:SetToggles(false, false, true, false)
  1703.         elseif LaneClearMenu.Active ~= self.LaneClear and not self.LaneClear then
  1704.                 self:SetToggles(false, false, false, true)
  1705.         end
  1706.  
  1707.         if ConfigMenu.Freeze then
  1708.                 MixedModeMenu._param[3].text = "Set it L"
  1709.                 LastHitMenu._param[3].text = "Set it L"
  1710.         else
  1711.                 MixedModeMenu._param[3].text = "Set it L"
  1712.                 LastHitMenu._param[3].text = "Set it L"
  1713.         end
  1714. end
  1715.  
  1716. function _MenuManager:OnWndMsg(msg, key)
  1717.         if msg == WM_RBUTTONDOWN then
  1718.                 local _Menu = self:GetActiveMenu()
  1719.                 if _Menu and _Menu.Toggle then
  1720.                         self:DisableAllModes()
  1721.                 end
  1722.         end
  1723. end
  1724.  
  1725. function _MenuManager:_OnUnload()
  1726.         self:SaveSkills()
  1727.         self:SaveStandRange()
  1728. end
  1729.  
  1730. function _MenuManager:_OnBugsplat()
  1731.         self:SaveSkills()
  1732.         self:SaveStandRange()
  1733. end
  1734.  
  1735. function _MenuManager:_OnExit()
  1736.         self:SaveSkills()
  1737.         self:SaveStandRange()
  1738. end
  1739.  
  1740. function _MenuManager:SetToggles(ac, mm, lh, lc)
  1741.         AutoCarryMenu.Active, self.AutoCarry = ac, ac
  1742.         MixedModeMenu.Active, self.MixedMode = mm, mm
  1743.         LastHitMenu.Active, self.LastHit = lh, lh
  1744.         LaneClearMenu.Active, self.LaneClear = lc, lc
  1745. end
  1746.  
  1747. function _MenuManager:DisableAllModes()
  1748.         AutoCarryMenu.Active = false
  1749.         MixedModeMenu.Active = false
  1750.         LastHitMenu.Active = false
  1751.         LaneClearMenu.Active = false
  1752. end
  1753.  
  1754. function _MenuManager:GetActiveMenu()
  1755.         if AutoCarryMenu.Active then
  1756.                 return AutoCarryMenu
  1757.         elseif MixedModeMenu.Active then
  1758.                 return MixedModeMenu
  1759.         elseif LastHitMenu.Active then
  1760.                 return LastHitMenu
  1761.         elseif LaneClearMenu.Active then
  1762.                 return LaneClearMenu
  1763.         end
  1764. end
  1765.  
  1766. function _MenuManager:SaveSkills()
  1767.         local _skills = {}
  1768.  
  1769.         for _, Skill in pairs(Skills.SkillsList) do
  1770.                 if AutoCarryMenu[Skill.RawName.."AutoCarry"] ~= nil then
  1771.                         table.insert(_skills , {mode = "AutoCarry", name=Skill.RawName, value=AutoCarryMenu[Skill.RawName.."AutoCarry"]})
  1772.                 end
  1773.                 if MixedModeMenu[Skill.RawName.."MixedMode"] ~= nil then
  1774.                         table.insert(_skills , {mode = "MixedMode", name=Skill.RawName, value=MixedModeMenu[Skill.RawName.."MixedMode"]})
  1775.                 end
  1776.                 if LaneClearMenu[Skill.RawName.."LaneClear"] ~= nil then
  1777.                         table.insert(_skills , {mode = "LaneClear", name=Skill.RawName, value=LaneClearMenu[Skill.RawName.."LaneClear"]})
  1778.                 end
  1779.         end
  1780.  
  1781.         local save = GetSave("SidasAutoCarry")
  1782.         save[myHero.charName] = _skills
  1783.         save:Save()
  1784. end
  1785.  
  1786. function _MenuManager:LoadSkill(Menu, Name, Mode)
  1787.         local save = GetSave("SidasAutoCarry")[myHero.charName]
  1788.         if not save then return false end
  1789.         for _, Skill in pairs(save) do
  1790.                 if Skill.name == Name and Skill.mode == Mode then
  1791.                         return Skill.value
  1792.                 end
  1793.         end
  1794.         return false
  1795. end
  1796.  
  1797. function _MenuManager:SaveStandRange()
  1798.         local save = GetSave("SidasAutoCarry")
  1799.  
  1800.         save.HoldZone = ExtrasMenu["StandZone"..myHero.charName]
  1801.         save:Save()
  1802. end
  1803.  
  1804. function _MenuManager:LoadStandRange()
  1805.         local save = GetSave("SidasAutoCarry")
  1806.  
  1807.         if save.HoldZone then
  1808.                 return save.HoldZone
  1809.         else
  1810.                 return 0
  1811.         end
  1812. end
  1813.  
  1814. --[[
  1815.                 _Plugins Class
  1816. ]]
  1817.  
  1818. class '_Plugins' Plugins = nil
  1819.  
  1820. function _Plugins:__init()
  1821.         self.Plugins = {}
  1822.         self.RegisteredBonusLastHitDamage = {}
  1823.         self.RegisteredPreAttack = {}
  1824.         Plugins = self
  1825. end
  1826.  
  1827. function _Plugins:RegisterPlugin(plugin, name)
  1828.         if plugin.OnTick then
  1829.                 AddTickCallback(function() plugin:OnTick() end)
  1830.         end
  1831.         if plugin.OnDraw then
  1832.                 AddDrawCallback(function() plugin:OnDraw() end)
  1833.         end
  1834.         if plugin.OnCreateObj then
  1835.                 AddCreateObjCallback(function(obj) plugin:OnCreateObj(obj) end)
  1836.         end
  1837.         if plugin.OnDeleteObj then
  1838.                 AddDeleteObjCallback(function(obj) plugin:OnDeleteObj(obj) end)
  1839.         end
  1840.         if plugin.OnLoad then
  1841.                 plugin:OnLoad()
  1842.         end
  1843.         if plugin.OnUnload then
  1844.                 AddUnloadCallback(function() plugin.OnUnload() end)
  1845.         end
  1846.         if plugin.OnWndMsg then
  1847.                 AddMsgCallback(function(msg, key) plugin:OnWndMsg(msg, key) end)
  1848.         end
  1849.         if plugin.OnProcessSpell then
  1850.                 AddProcessSpellCallback(function(unit, spell) plugin:OnProcessSpell(unit, spell) end)
  1851.         end
  1852.         if plugin.OnSendChat then
  1853.                 AddChatCallback(function(text) plugin:OnSendChat(text) end)
  1854.         end
  1855.         if plugin.OnBugsplat then
  1856.                 AddBugsplatCallback(function() plugin:OnBugsplat() end)
  1857.         end
  1858.         if plugin.OnAnimation then
  1859.                 AddAnimationCallback(function(unit, anim) plugin:OnAnimation(unit, anim) end)
  1860.         end
  1861.         if plugin.OnSendPacket then
  1862.                 AddSendPacketCallback(function(packet) plugin:OnSendPacket(packet) end)
  1863.         end
  1864.         if plugin.OnRecvPacket then
  1865.                 AddRecvPacketCallback(function(packet) plugin:OnRecvPacket(packet) end)
  1866.         end
  1867.         if name then
  1868.                 self.Plugins[name] = scriptConfig("Sida's Auto Carry Plugin: "..name, "sidasacautocarryplugin"..name)
  1869.                 return self.Plugins[name]
  1870.         end
  1871. end
  1872.  
  1873. function _Plugins:RegisterBonusLastHitDamage(func)
  1874.         table.insert(self.RegisteredBonusLastHitDamage, func)
  1875. end
  1876.  
  1877. function _Plugins:RegisterPreAttack(func)
  1878.         table.insert(self.RegisteredPreAttack, func)
  1879. end
  1880.  
  1881. function _Plugins:RegisterOnAttacked(func)
  1882.         RegisterOnAttacked(func)
  1883. end
  1884.  
  1885. function _Plugins:GetProdiction(Key, Range, Speed, Delay, Width, Source, Callback)
  1886.         return ProdictManager.GetInstance():AddProdictionObject(Key, Range, Speed * 1000, Delay / 1000, Width, myHero, Callback)
  1887. end
  1888.  
  1889. --[[
  1890.                 Drawing Class
  1891. ]]
  1892.  
  1893. class '_Drawing'
  1894.  
  1895. function _Drawing:__init()
  1896.         AddDrawCallback(function() self:_OnDraw() end)
  1897. end
  1898.  
  1899. function _Drawing:_OnDraw()
  1900.         if DrawingMenu.RangeCircle then
  1901.                 Helper:DrawCircleObject(myHero, MyHero.TrueRange, Helper:ArgbFromMenu(DrawingMenu.RangeCircleColour))
  1902.         end
  1903.  
  1904.         if DrawingMenu.CastRangeCircle and Crosshair.Skills_Crosshair.range ~= MyHero.TrueRange then
  1905.                 Helper:DrawCircleObject(myHero, Crosshair.Skills_Crosshair.range, Helper:ArgbFromMenu(DrawingMenu.CastRangeCircleColour))
  1906.         end
  1907.  
  1908.         if DrawingMenu.TargetCircle and Crosshair.Target then
  1909.                 Helper:DrawCircleObject(Crosshair.Target, 100, Helper:ArgbFromMenu(DrawingMenu.TargetCircleColour), 6)
  1910.         end
  1911.  
  1912.         if DrawingMenu.MinionCircle and Minions.KillableMinion then
  1913.                 Helper:DrawCircleObject(Minions.KillableMinion, 80, Helper:ArgbFromMenu(DrawingMenu.MinionCircleColour), 6)
  1914.         end
  1915.  
  1916.         if DrawingMenu.ArrowToTarget and Crosshair.Target then
  1917.                 self:DrawArrows(myHero, Crosshair.Target)
  1918.         end
  1919.  
  1920.         if DrawingMenu.StandZone and ExtrasMenu["StandZone"..myHero.charName] > 0 then
  1921.                 Helper:DrawCircleObject(myHero, ExtrasMenu["StandZone"..myHero.charName], Helper:ArgbFromMenu(DrawingMenu.StandZoneColour))
  1922.         end
  1923. end
  1924.  
  1925. function _Drawing:DrawArrows(Start, End)
  1926.         if Start and End then
  1927.         DrawArrows(D3DXVECTOR3(Start.x, Start.y, Start.z), D3DXVECTOR3(End.x, End.y, End.z), 60, Helper:HexFromMenu(DrawingMenu.ArrowToTargetColour), 100)
  1928.     end
  1929. end
  1930.  
  1931. --[[
  1932.                 _Data Class
  1933. ]]
  1934.  
  1935.  
  1936. class '_Data' Data = nil
  1937.  
  1938.  function _Data:__init()
  1939.         self.ResetSpells = {}
  1940.         self.SpellAttacks = {}
  1941.         self.NoneAttacks = {}
  1942.         self.ChampionData = {}
  1943.         self.MinionData = {}
  1944.         self.JungleData = {}
  1945.         self.ItemData = {}
  1946.         self.Skills = {}
  1947.         Data = self
  1948.  
  1949.         self:__GenerateNoneAttacks()
  1950.         self:__GenerateSpellAttacks()
  1951.         self:__GenerateResetSpells()
  1952.         self:_GenerateMinionData()
  1953.         self:_GenerateJungleData()
  1954.         self:_GenerateItemData()
  1955.         self:__GenerateChampionData()
  1956.         self:__GenerateSkillData()
  1957.  end
  1958.  
  1959. function _Data:__GenerateResetSpells()
  1960.         self:AddResetSpell("Powerfist")
  1961.         self:AddResetSpell("DariusNoxianTacticsONH")
  1962.         self:AddResetSpell("Takedown")
  1963.         self:AddResetSpell("Ricochet")
  1964.         self:AddResetSpell("BlindingDart")
  1965.         self:AddResetSpell("VayneTumble")
  1966.         self:AddResetSpell("JaxEmpowerTwo")
  1967.         self:AddResetSpell("MordekaiserMaceOfSpades")
  1968.         self:AddResetSpell("SiphoningStrikeNew")
  1969.         self:AddResetSpell("RengarQ")
  1970.         self:AddResetSpell("MonkeyKingDoubleAttack")
  1971.         self:AddResetSpell("YorickSpectral")
  1972.         self:AddResetSpell("ViE")
  1973.         self:AddResetSpell("GarenSlash3")
  1974.         self:AddResetSpell("HecarimRamp")
  1975.         self:AddResetSpell("XenZhaoComboTarget")
  1976.         self:AddResetSpell("LeonaShieldOfDaybreak")
  1977.         self:AddResetSpell("ShyvanaDoubleAttack")
  1978.         self:AddResetSpell("shyvanadoubleattackdragon")
  1979.         self:AddResetSpell("TalonNoxianDiplomacy")
  1980.         self:AddResetSpell("TrundleTrollSmash")
  1981.         self:AddResetSpell("VolibearQ")
  1982.         self:AddResetSpell("PoppyDevastatingBlow")
  1983.         self:AddResetSpell("SivirW")
  1984. end
  1985.  
  1986. function _Data:__GenerateSpellAttacks()
  1987.         self:AddSpellAttack("frostarrow")
  1988.         self:AddSpellAttack("CaitlynHeadshotMissile")
  1989.         self:AddSpellAttack("QuinnWEnhanced")
  1990.         self:AddSpellAttack("TrundleQ")
  1991.         self:AddSpellAttack("XenZhaoThrust")
  1992.         self:AddSpellAttack("XenZhaoThrust2")
  1993.         self:AddSpellAttack("XenZhaoThrust3")
  1994.         self:AddSpellAttack("GarenSlash2")
  1995.         self:AddSpellAttack("RenektonExecute")
  1996.         self:AddSpellAttack("RenektonSuperExecute")
  1997.         self:AddSpellAttack("KennenMegaProc")
  1998. end
  1999.  
  2000. function _Data:__GenerateNoneAttacks()
  2001.         self:AddNoneAttack("shyvanadoubleattackdragon")
  2002.         self:AddNoneAttack("ShyvanaDoubleAttack")
  2003.         self:AddNoneAttack("MonkeyKingDoubleAttack")
  2004. end
  2005.  
  2006. function _Data:_GenerateMinionData()
  2007.         self:AddMinionData((myHero.team == 100 and "Blue" or "Red").."_Minion_Basic", 400, 0)
  2008.         self:AddMinionData((myHero.team == 100 and "Blue" or "Red").."_Minion_Caster", 484, 0.68)
  2009.         self:AddMinionData((myHero.team == 100 and "Blue" or "Red").."_Minion_Wizard", 484, 0.68)
  2010.         self:AddMinionData((myHero.team == 100 and "Blue" or "Red").."_Minion_MechCannon", 365, 1.18)
  2011.         self:AddMinionData("obj_AI_Turret", 150, 1.14)
  2012. end
  2013.  
  2014. function _Data:_GenerateJungleData()
  2015.         self:AddJungleMonster("Worm12.1.1",             1)              -- Baron
  2016.         self:AddJungleMonster("Dragon6.1.1",            1)              -- Dragon
  2017.         self:AddJungleMonster("AncientGolem1.1.1",      1)              -- Blue Buff
  2018.         self:AddJungleMonster("AncientGolem7.1.1",      1)              -- Blue Buff
  2019.         self:AddJungleMonster("YoungLizard1.1.2",       2)              -- Blue Buff Add
  2020.         self:AddJungleMonster("YoungLizard7.1.3",       2)              -- Blue Buff Add
  2021.         self:AddJungleMonster("YoungLizard1.1.3",       2)              -- Blue Buff Add
  2022.         self:AddJungleMonster("YoungLizard7.1.2",       2)              -- Blue Buff Add
  2023.         self:AddJungleMonster("LizardElder4.1.1",       1)              -- Red Buff
  2024.         self:AddJungleMonster("LizardElder10.1.1",      1)              -- Red Buff
  2025.         self:AddJungleMonster("YoungLizard4.1.2",       2)              -- Red Buff Add
  2026.         self:AddJungleMonster("YoungLizard4.1.3",       2)              -- Red Buff Add
  2027.         self:AddJungleMonster("YoungLizard10.1.2",      2)              -- Red Buff Add
  2028.         self:AddJungleMonster("YoungLizard10.1.3",      2)              -- Red Buff Add
  2029.         self:AddJungleMonster("GiantWolf2.1.3",         1)              -- Big Wolf
  2030.         self:AddJungleMonster("GiantWolf8.1.3",         1)              -- Big Wolf
  2031.         self:AddJungleMonster("wolf2.1.1",                      2)              -- Small Wolf
  2032.         self:AddJungleMonster("wolf2.1.2",                      2)              -- Small Wolf
  2033.         self:AddJungleMonster("wolf8.1.1",                      2)              -- Small Wolf
  2034.         self:AddJungleMonster("wolf8.1.2",                      2)              -- Small Wolf
  2035.         self:AddJungleMonster("Wraith3.1.3",            1)              -- Big Wraith
  2036.         self:AddJungleMonster("Wraith9.1.3",            1)              -- Big Wraith
  2037.         self:AddJungleMonster("LesserWraith3.1.1",      2)              -- Small Wraith
  2038.         self:AddJungleMonster("LesserWraith3.1.2",      2)              -- Small Wraith
  2039.         self:AddJungleMonster("LesserWraith3.1.4",      2)              -- Small Wraith
  2040.         self:AddJungleMonster("LesserWraith9.1.1",      2)              -- Small Wraith
  2041.         self:AddJungleMonster("LesserWraith9.1.2",      2)              -- Small Wraith
  2042.         self:AddJungleMonster("LesserWraith9.1.4",      2)              -- Small Wraith
  2043.         self:AddJungleMonster("Golem5.1.2",             1)              -- Big Golem
  2044.         self:AddJungleMonster("Golem11.1.2",            1)              -- Big Golem
  2045.         self:AddJungleMonster("SmallGolem5.1.1",        2)              -- Small Golem
  2046.         self:AddJungleMonster("SmallGolem11.1.1",       2)              -- Small Golem
  2047. end
  2048.  
  2049. function _Data:_GenerateItemData()
  2050.         self:AddItemData("Blade of the Ruined King",    3153, true, 500)
  2051.         self:AddItemData("Bilgewater Cutlass",                  3144, true, 500)
  2052.         self:AddItemData("Deathfire Grasp",                     3128, true, 750)
  2053.         self:AddItemData("Hextech Gunblade",                    3146, true, 400)
  2054.         self:AddItemData("Blackfire Torch",                     3188, true, 750)
  2055.         self:AddItemData("Ravenous Hydra",                              3074, false)
  2056.         self:AddItemData("Sword of the Divine",                 3131, false)
  2057.         self:AddItemData("Tiamat",                                              3077, false)
  2058.         self:AddItemData("Entropy",                                     3184, false)
  2059.         self:AddItemData("Youmuu's Ghostblade",                 3142, false)
  2060.         self:AddItemData("Muramana",                                    3042, false)
  2061. end
  2062.  
  2063. ROLE_AD_CARRY = 1
  2064. ROLE_AP = 2
  2065. ROLE_SUPPORT = 3
  2066. ROLE_BRUISER = 4
  2067. ROLE_TANK = 5
  2068.  
  2069. function _Data:__GenerateChampionData()
  2070.                                                 -- Champion, Projectile Speed,  GameplayCollisionRadius         Anti-bug delay                  Role
  2071.         self:AddChampionData("Aatrox",                  0,                                      65,                                             0,                              ROLE_BRUISER)
  2072.         self:AddChampionData("Ahri",            1.6,                            65,                                             0,                      ROLE_AP)
  2073.         self:AddChampionData("Akali",           0,                              65,                                             0,                      ROLE_AP)
  2074.         self:AddChampionData("Alistar",         0,                              80,                                             0,                      ROLE_SUPPORT)
  2075.         self:AddChampionData("Amumu",           0,                              55,                                             0,                      ROLE_TANK)
  2076.         self:AddChampionData("Anivia",          1.05,                           65,                                             0,                      ROLE_AP)
  2077.         self:AddChampionData("Annie",           1,                              55,                                             0,                      ROLE_AP)
  2078.         self:AddChampionData("Ashe",            2,                              65,                                             0,                      ROLE_AD_CARRY)
  2079.         self:AddChampionData("Blitzcrank",      0,                              80,                                             0,                      ROLE_SUPPORT)
  2080.         self:AddChampionData("Brand",           1.975,                          65,                                             0,                      ROLE_AP)
  2081.         self:AddChampionData("Caitlyn",         2.5,                            65,                                             0,                      ROLE_AD_CARRY)
  2082.         self:AddChampionData("Cassiopeia",      1.22,                           65,                                             0,                      ROLE_AP)
  2083.         self:AddChampionData("Chogath",         0,                              80,                                             0,                      ROLE_TANK)
  2084.         self:AddChampionData("Corki",           2,                              65,                                             0,                      ROLE_AD_CARRY)
  2085.         self:AddChampionData("Darius",                  0,                                      80,                                             0,                              ROLE_BRUISER)
  2086.         self:AddChampionData("Diana",           0,                              65,                                             0,                      ROLE_AP)
  2087.         self:AddChampionData("DrMundo",         0,                              80,                                             0,                      ROLE_TANK)
  2088.         self:AddChampionData("Draven",          1.4,                            65,                                             0,                      ROLE_AD_CARRY)
  2089.         self:AddChampionData("Elise",                   0,                                      65,                                             0,                              ROLE_BRUISER)
  2090.         self:AddChampionData("Evelynn",         0,                              65,                                             0,                      ROLE_AP)
  2091.         self:AddChampionData("Ezreal",          2,                              65,                                             0,                      ROLE_AD_CARRY)
  2092.         self:AddChampionData("FiddleSticks",    1.75,                           65,                                             0,                      ROLE_AP)
  2093.         self:AddChampionData("Fiora",                   0,                                      65,                                             0,                              ROLE_BRUISER)
  2094.         self:AddChampionData("Fizz",            0,                              65,                                             0,                      ROLE_AP)
  2095.         self:AddChampionData("Galio",           0,                              80,                                             0,                      ROLE_TANK)
  2096.         self:AddChampionData("Gangplank",               0,                                      65,                                             0,                              ROLE_BRUISER)
  2097.         self:AddChampionData("Garen",                   0,                                      65,                                             0,                              ROLE_BRUISER)
  2098.         self:AddChampionData("Gnar",                  0,                                      65,                                             0,                              ROLE_BRUISER)
  2099.         self:AddChampionData("Gragas",          0,                              80,                                             0,                      ROLE_AP)
  2100.         self:AddChampionData("Graves",          3,                              65,                                             0,                      ROLE_AD_CARRY)
  2101.         self:AddChampionData("Hecarim",         0,                              80,                                             0,                      ROLE_TANK)
  2102.         self:AddChampionData("Heimerdinger",    1.4,                            55,                                             0,                      ROLE_AP)
  2103.         self:AddChampionData("Irelia",                  0,                                      65,                                             0,                              ROLE_BRUISER)
  2104.         self:AddChampionData("Janna",           1.2,                            65,                                             0,                      ROLE_SUPPORT)
  2105.         self:AddChampionData("JarvanIV",                0,                                      65,                                             0,                              ROLE_BRUISER)
  2106.         self:AddChampionData("Jax",                             0,                                      65,                                             0,                              ROLE_BRUISER)
  2107.         self:AddChampionData("Jayce",           2.2,                            65,                                             0,                      ROLE_AD_CARRY)
  2108.         self:AddChampionData("Jinx",            2,                              65,                                             0,                      ROLE_AD_CARRY)
  2109.         self:AddChampionData("Karma",           1.2,                            65,                                             0,                      ROLE_SUPPORT)
  2110.         self:AddChampionData("Karthus",         1.25,                           65,                                             0,                      ROLE_AP)
  2111.         self:AddChampionData("Kassadin",        0,                              65,                                             0,                      ROLE_AP)
  2112.         self:AddChampionData("Katarina",        0,                              65,                                             0,                      ROLE_AP)
  2113.         self:AddChampionData("Kayle",           1.8,                            65,                                             0,                      ROLE_AP)
  2114.         self:AddChampionData("Kennen",          1.35,                           55,                                             0,                      ROLE_AP)
  2115.         self:AddChampionData("Khazix",                  0,                                      65,                                             0,                              ROLE_BRUISER)
  2116.         self:AddChampionData("KogMaw",          1.8,                            65,                                             0,                      ROLE_AD_CARRY)
  2117.         self:AddChampionData("Leblanc",         1.7,                            65,                                             0,                      ROLE_AP)
  2118.         self:AddChampionData("LeeSin",                  0,                                      65,                                             0,                              ROLE_BRUISER)
  2119.         self:AddChampionData("Leona",           0,                              65,                                             0,                      ROLE_SUPPORT)
  2120.         self:AddChampionData("Lissandra",       0,                              65,                                             0,                      ROLE_AP)
  2121.         self:AddChampionData("Lucian",          2,                              65,                                             0,                      ROLE_AD_CARRY)
  2122.         self:AddChampionData("Lulu",            2.5,                            65,                                             0,                      ROLE_SUPPORT)
  2123.         self:AddChampionData("Lux",             1.55,                           65,                                             0,                      ROLE_AP)
  2124.         self:AddChampionData("Malphite",        0,                              80,                                             0,                      ROLE_TANK)
  2125.         self:AddChampionData("Malzahar",        1.5,                            65,                                             0,                      ROLE_AP)
  2126.         self:AddChampionData("Maokai",          0,                              80,                                             0,                      ROLE_TANK)
  2127.         self:AddChampionData("MasterYi",        0,                              65,                                             0,                      ROLE_AP)
  2128.         self:AddChampionData("MissFortune",     2,                              65,                                             0,                      ROLE_AD_CARRY)
  2129.         self:AddChampionData("MonkeyKing",              0,                                      65,                                             0,                              ROLE_BRUISER)
  2130.         self:AddChampionData("Mordekaiser",     0,                              80,                                             0,                      ROLE_AP)
  2131.         self:AddChampionData("Morgana",         1.6,                            65,                                             0,                      ROLE_AP)
  2132.         self:AddChampionData("Nami",            0,                              65,                                             0,                      ROLE_SUPPORT)
  2133.         self:AddChampionData("Nasus",           0,                              80,                                             0,                      ROLE_TANK)
  2134.         self:AddChampionData("Nautilus",                0,                                      80,                                             0,                              ROLE_BRUISER)
  2135.         self:AddChampionData("Nidalee",         1.7,                            65,                                             0,                      ROLE_AP)
  2136.         self:AddChampionData("Nocturne",                0,                                      65,                                             0,                              ROLE_BRUISER)
  2137.         self:AddChampionData("Nunu",            0,                              65,                                             0,                      ROLE_SUPPORT)
  2138.         self:AddChampionData("Olaf",                    0,                                      65,                                             0,                              ROLE_BRUISER)
  2139.         self:AddChampionData("Orianna",         1.4,                            65,                                             0,                      ROLE_AP)
  2140.         self:AddChampionData("Pantheon",        0,                              65,                                             0,                      ROLE_AD_CARRY)
  2141.         self:AddChampionData("Poppy",                   0,                                      55,                                             0,                              ROLE_BRUISER)
  2142.         self:AddChampionData("Quinn",           1.85,                           65,                                             0,                      ROLE_AD_CARRY)
  2143.         self:AddChampionData("Rammus",          0,                              65,                                             0,                      ROLE_TANK)
  2144.         self:AddChampionData("Renekton",                0,                                      80,                                             0,                              ROLE_BRUISER)
  2145.         self:AddChampionData("Rengar",                  0,                                      65,                                             0,                              ROLE_BRUISER)
  2146.         self:AddChampionData("Riven",                   0,                                      65,                                             0,                              ROLE_BRUISER)
  2147.         self:AddChampionData("Rumble",          0,                              80,                                             0,                      ROLE_AP)
  2148.         self:AddChampionData("Ryze",            2.4,                            65,                                             0,                      ROLE_AP)
  2149.         self:AddChampionData("Sejuani",         0,                              80,                                             0,                      ROLE_TANK)
  2150.         self:AddChampionData("Shaco",           0,                              65,                                             0,                      ROLE_AD_CARRY)
  2151.         self:AddChampionData("Shen",            0,                              65,                                             0,                      ROLE_TANK)
  2152.         self:AddChampionData("Shyvana",                 0,                                      50,                                             0,                              ROLE_BRUISER)
  2153.         self:AddChampionData("Singed",          0,                              65,                                             0,                      ROLE_TANK)
  2154.         self:AddChampionData("Sion",            0,                              80,                                             0,                      ROLE_AP)
  2155.         self:AddChampionData("Sivir",           1.4,                            65,                                             0,                      ROLE_AD_CARRY)
  2156.         self:AddChampionData("Skarner",         0,                              80,                                             0,                      ROLE_TANK)
  2157.         self:AddChampionData("Sona",            1.6,                            65,                                             0,                      ROLE_SUPPORT)
  2158.         self:AddChampionData("Soraka",          1,                              65,                                             0,                      ROLE_SUPPORT)
  2159.         self:AddChampionData("Swain",           1.6,                            65,                                             0,                      ROLE_AP)
  2160.         self:AddChampionData("Syndra",          1.2,                            65,                                             0,                      ROLE_AP)
  2161.         self:AddChampionData("Talon",           0,                              65,                                             0,                      ROLE_AD_CARRY)
  2162.         self:AddChampionData("Taric",           0,                              65,                                             0,                      ROLE_SUPPORT)
  2163.         self:AddChampionData("Teemo",           1.3,                            55,                                             0,                      ROLE_AP)
  2164.         self:AddChampionData("Thresh",          0,                              55,                                             0,                      ROLE_SUPPORT)
  2165.         self:AddChampionData("Tristana",        2.25,                           55,                                             0,                      ROLE_AD_CARRY)
  2166.         self:AddChampionData("Trundle",                 0,                                      65,                                             0,                              ROLE_BRUISER)
  2167.         self:AddChampionData("Tryndamere",              0,                                      65,                                             0,                              ROLE_BRUISER)
  2168.         self:AddChampionData("TwistedFate",     1.5,                            65,                                             0,                      ROLE_AP)
  2169.         self:AddChampionData("Twitch",          2.5,                            65,                                             0,                      ROLE_AD_CARRY)
  2170.         self:AddChampionData("Udyr",                    0,                                      65,                                             0,                              ROLE_BRUISER)
  2171.         self:AddChampionData("Urgot",           1.3,                            80,                                             0,                      ROLE_AD_CARRY)
  2172.         self:AddChampionData("Varus",           2,                              65,                                             0,                      ROLE_AD_CARRY)
  2173.         self:AddChampionData("Vayne",           2,                              65,                                             0,                      ROLE_AD_CARRY)
  2174.         self:AddChampionData("Velkoz",          1.05,               55,                     0,              ROLE_AP)
  2175.         self:AddChampionData("Veigar",          1.05,                           55,                                             0,                      ROLE_AP)
  2176.         self:AddChampionData("Vi",                              0,                                      50,                                             0,                              ROLE_BRUISER)
  2177.         self:AddChampionData("Viktor",          2.25,                           65,                                             0,                      ROLE_AP)
  2178.         self:AddChampionData("Vladimir",        1.4,                            65,                                             0,                      ROLE_AP)
  2179.         self:AddChampionData("Volibear",        0,                              80,                                             0,                      ROLE_TANK)
  2180.         self:AddChampionData("Warwick",         0,                              65,                                             0,                      ROLE_TANK)
  2181.         self:AddChampionData("Xerath",          1.2,                            65,                                             0,                      ROLE_AP)
  2182.         self:AddChampionData("XinZhao",                 0,                                      65,                                             0,                              ROLE_BRUISER)
  2183.         self:AddChampionData("Yorick",          0,                              80,                                             0,                      ROLE_TANK)
  2184.         self:AddChampionData("Zac",             0,                              65,                                             0,                      ROLE_TANK)
  2185.         self:AddChampionData("Zed",             0,                              65,                                             0,                      ROLE_AD_CARRY)
  2186.         self:AddChampionData("Ziggs",           1.5,                            55,                                             0,                      ROLE_AP)
  2187.         self:AddChampionData("Zilean",          1.25,                           65,                                             0,                      ROLE_SUPPORT)
  2188.         self:AddChampionData("Zyra",            1.7,                            65,                                             0,                      ROLE_AP)
  2189. end                                                    
  2190.                                                        
  2191. --TODO: Complete the table
  2192. function _Data:__GenerateSkillData()
  2193.                                   --Name                          Enabled    Key         Range          Display Name                            Type                    MinMana  Reset   Require Attack Target     Speed                Delay   Width   Collision
  2194.         self:AddSkillData("Ezreal",                     true,    _Q,     1100,   "Q (Mystic Shot)",                     SPELL_LINEAR_COL,               0,       false,         false,                                  2,                      250,    70,             true)
  2195.         self:AddSkillData("Ezreal",                     true,    _W,     1050,   "W (Essence Flux)",            SPELL_LINEAR,                   0,       false,         false,                                  1.6,            250,    90,             false)
  2196.         self:AddSkillData("KogMaw",                     true,    _Q,     625,    "Q (Caustic Spittle)",         SPELL_TARGETED,                 0,       true,          true,                                   1.3,            260,    200,    false)
  2197.         self:AddSkillData("KogMaw",                     true,    _W,     625,    "W (Bio-Arcane Barrage)",      SPELL_SELF,                             0,       false,         false,                                  1.3,            260,    200,    false)
  2198.         self:AddSkillData("KogMaw",                     true,    _E,     850,    "E (Void Ooze)",                       SPELL_LINEAR,                   0,       false,         false,                                  1.3,            260,    200,    false)
  2199.         self:AddSkillData("KogMaw",                     true,    _R,     1700,   "R (Living Artillery)",        SPELL_LINEAR,                   0,       false,         false,                                  math.huge,      1000,   200,    false)
  2200.         self:AddSkillData("Sivir",                      true,    _Q,     1000,   "Q (Boomerang Blade)",         SPELL_LINEAR,                   0,       false,         false,                                  1.33,           250,    120,    false)
  2201.         self:AddSkillData("Sivir",                      true,    _W,     900,    "W (Ricochet)",                        SPELL_SELF,                             0,       true,          true,                                   1,                      0,              200,    false)
  2202.         self:AddSkillData("Graves",                     true,    _Q,     750,    "Q (Buck Shot)",                       SPELL_CONE,                             0,       false,         false,                                  2,                      250,    200,    false)
  2203.         self:AddSkillData("Graves",                     true,    _W,     700,    "W (Smoke Screen)",            SPELL_CIRCLE,                   0,       false,         false,                                  1400,           300,    500,    false)
  2204.         self:AddSkillData("Graves",                     true,    _E,     580,    "E (Quick Draw)",                      SPELL_SELF_AT_MOUSE,    0,       true,          true,                                   1450,           250,    200,    false)
  2205.         self:AddSkillData("Caitlyn",            true,    _Q,     1300,   "Q (Piltover Peacemaker)",     SPELL_LINEAR,                   0,       false,         false,                                  2.1,            625,    100,    true)
  2206.         self:AddSkillData("Corki",                      true,    _Q,     600,    "Q (Phosphorus Bomb)",         SPELL_CIRCLE,                   0,       false,         false,                                  2,                      200,    500,    false)
  2207.         self:AddSkillData("Corki",                      true,    _R,     1225,   "R (Missile Barrage)",         SPELL_LINEAR_COL,               0,       false,         false,                                  2,                      200,    50,             true)
  2208.         self:AddSkillData("Teemo",                      true,    _Q,     580,    "Q (Blinding Dart)",           SPELL_TARGETED,                 0,       false,         false,                                  2,                      0,              200,    false)
  2209.         self:AddSkillData("TwistedFate",        true,    _Q,     1200,   "Q (Wild Cards)",                      SPELL_LINEAR,                   0,       false,         false,                                  1.45,           250,    200,    false)
  2210.         self:AddSkillData("Vayne",                      true,    _Q,     750,    "Q (Tumble)",                          SPELL_SELF_AT_MOUSE,    0,       true,          true,                                   1.45,           250,    200,    false)
  2211.         self:AddSkillData("Vayne",                      true,    _R,     580,    "R (Final Hour)",                      SPELL_SELF,                             0,       false,         true,                                   1.45,           250,    200,    false)
  2212.         self:AddSkillData("MissFortune",        true,    _Q,     650,    "Q (Double Up)",                       SPELL_TARGETED,                 0,       true,          true,                                   1.45,           250,    200,    false)
  2213.         self:AddSkillData("MissFortune",        true,    _W,     580,    "W (Impure Shots)",            SPELL_SELF,                             0,       false,         true,                                   1.45,           250,    200,    false)
  2214.         self:AddSkillData("MissFortune",        true,    _E,     800,    "E (Make It Rain)",            SPELL_CIRCLE,                   0,       false,         false,                                  math.huge,      500,    500,    false)
  2215.         self:AddSkillData("Tristana",           true,    _Q,     580,    "Q (Rapid Fire)",                      SPELL_SELF,                             0,       false,         true,                                   1.45,           250,    200,    false)
  2216.         self:AddSkillData("Tristana",           true,    _E,     550,    "E (Explosive Shot)",          SPELL_TARGETED,                 0,       false,         false,                                  1.45,           250,    200,    false)
  2217.         self:AddSkillData("Draven",                     true,    _E,     950,    "E (Stand Aside)",                     SPELL_LINEAR,                   0,       false,         false,                                  1.37,           300,    130,    false)
  2218.         self:AddSkillData("Kennen",                     true,    _Q,     1050,   "Q (Thundering Shuriken)",     SPELL_LINEAR_COL,               0,       false,         false,                                  1.65,           180,    80,             true)
  2219.         self:AddSkillData("Ashe",                       true,    _W,     1200,   "W (Volley)",                          SPELL_LINEAR_COL,               0,       false,         false,                                  2,                      120,    85,             true)
  2220.         self:AddSkillData("Syndra",                     true,    _Q,     800,    "Q (Dark Sphere)",                     SPELL_CIRCLE,                   0,       false,         false,                                  math.huge,      400,    100,    false)
  2221.         self:AddSkillData("Jayce",                      true,    _Q,     1600,   "Q (Shock Blast)",                     SPELL_LINEAR_COL,               0,       false,         false,                                  2,                      350,    90,             true)
  2222.         self:AddSkillData("Nidalee",            true,    _Q,     1500,   "Q (Javelin Toss)",            SPELL_LINEAR_COL,               0,       false,         false,                                  1.3,            125,    80,             true)
  2223.         self:AddSkillData("Varus",                      true,    _E,     925,    "E (Hail of Arrows)",          SPELL_CIRCLE,                   0,       false,         false,                                  1.75,           240,    235,    false)
  2224.         self:AddSkillData("Quinn",                      true,    _Q,     1050,   "Q (Blinding Assault)",        SPELL_LINEAR_COL,               0,       false,         false,                                  1.55,           220,    90,             true)
  2225.         self:AddSkillData("LeeSin",                     true,    _Q,     975,    "Q (Sonic Wave)",                      SPELL_LINEAR_COL,               0,       false,         false,                                  1.5,            250,    70,             true)
  2226.         self:AddSkillData("Gangplank",          true,    _Q,     625,    "Q (Parley)",                          SPELL_TARGETED,                 0,       false,         false,                                  1.45,           250,    200,    false)
  2227.         self:AddSkillData("Twitch",                     true,    _W,     950,    "W (Venom Cask)",                      SPELL_CIRCLE,                   0,       false,         false,                                  1.4,            250,    275,    false)
  2228.         self:AddSkillData("Darius",                     true,    _W,     300,    "W (Crippling Strike)",        SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2229.         self:AddSkillData("Hecarim",            true,    _Q,     300,    "Q (Rampage)",                         SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2230.         self:AddSkillData("Warwick",            true,    _Q,     300,    "Q (Hungering Strike)",        SPELL_TARGETED,                 0,       true,          true,                                   2,                      0,              200,    true)
  2231.         self:AddSkillData("MonkeyKing",         true,    _Q,     300,    "Q (Crushing Blow)",           SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2232.         self:AddSkillData("Poppy",                      true,    _Q,     300,    "Q (Devastating Blow)",        SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2233.         self:AddSkillData("Talon",                      true,    _Q,     300,    "Q (Noxian Diplomacy)",        SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2234.         self:AddSkillData("Nautilus",           true,    _W,     300,    "W (Titans Wrath)",            SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2235.         self:AddSkillData("Gangplank",          true,    _Q,     300,    "Q (Parlay)",                          SPELL_TARGETED,                 0,       true,          true,                                   2,                      0,              200,    true)
  2236.         self:AddSkillData("Vi",                         true,    _E,     300,    "E (Excessive Force)",         SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2237.         self:AddSkillData("Rengar",                     true,    _Q,     300,    "Q (Savagery)",                        SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2238.         self:AddSkillData("Trundle",            true,    _Q,     300,    "Q (Chomp)",                           SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2239.         self:AddSkillData("Leona",                      true,    _Q,     300,    "Q (Shield Of Daybreak)",      SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2240.         self:AddSkillData("Fiora",                      true,    _E,     300,    "E (Burst Of Speed)",          SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2241.         self:AddSkillData("Blitzcrank",         true,    _E,     300,    "E (Power Fist)",                      SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2242.         self:AddSkillData("Shyvana",            true,    _Q,     300,    "Q (Twin Blade)",                      SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2243.         self:AddSkillData("Renekton",           true,    _W,     300,    "W (Ruthless Predator)",       SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2244.         self:AddSkillData("Jax",                        true,    _W,     300,    "W (Empower)",                         SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2245.         self:AddSkillData("XinZhao",            true,    _Q,     300,    "Q (Three Talon Strike)",      SPELL_SELF,                             0,       true,          true,                                   2,                      0,              200,    true)
  2246.         self:AddSkillData("Nunu",                       true,    _E,     300,    "E (Snowball)",                        SPELL_TARGETED,                 0,       false,         false,                                  1.45,           250,    200,    false)
  2247.         self:AddSkillData("Khazix",                     true,    _Q,     300,    "Q (Taste Their Fear)",        SPELL_TARGETED,                 0,       true,          true,                                   1.45,           250,    200,    false)
  2248.         self:AddSkillData("Shen",                       true,    _Q,     300,    "Q (Vorpal Blade)",            SPELL_TARGETED,                 0,       false,         false,                                  1.45,           250,    200,    false)
  2249. end
  2250.  
  2251. function _Data:AddResetSpell(name)
  2252.         self.ResetSpells[name] = true
  2253. end
  2254.  
  2255. function _Data:AddSpellAttack(name)
  2256.         self.SpellAttacks[name] = true
  2257. end
  2258.  
  2259. function _Data:AddNoneAttack(name)
  2260.         self.NoneAttacks[name] = true
  2261. end
  2262.  
  2263. function _Data:AddChampionData(Champion, ProjSpeed, _GameplayCollisionRadius, Delay, _Priority)
  2264.         self.ChampionData[Champion] = {Name = Champion, ProjectileSpeed = ProjSpeed, GameplayCollisionRadius = _GameplayCollisionRadius, BugDelay = Delay and Delay or 0, Priority = _Priority }
  2265. end
  2266.  
  2267. function _Data:AddMinionData(Name, delay, ProjSpeed)
  2268.         self.MinionData[Name] = {Delay = delay, ProjectileSpeed = ProjSpeed}
  2269. end
  2270.  
  2271. function _Data:AddJungleMonster(Name, Priority)
  2272.         self.JungleData[Name] = Priority
  2273. end
  2274.  
  2275. function _Data:GetJunglePriority(Name)
  2276.         return self.JungleData[Name]
  2277. end
  2278.  
  2279. function _Data:AddItemData(Name, ID, RequiresTarget, Range)
  2280.         self.ItemData[ID] = _Item(Name, ID, RequiresTarget, Range)
  2281. end
  2282.  
  2283. function _Data:AddSkillData(Name, Enabled, Key, Range, DisplayName, Type, MinMana, AfterAttack, ReqAttackTarget, Speed, Delay, Width, Collision)
  2284.         if myHero.charName == Name then
  2285.                 local skill = _Skill(Enabled, Key, Range, DisplayName, Type, MinMana, AfterAttack, ReqAttackTarget, Speed, Delay, Width, Collision)
  2286.                 table.insert(self.Skills, skill)
  2287.         end
  2288. end
  2289.  
  2290. function _Data:GetProjectileSpeed(name)
  2291.         return self.ChampionData[name] and self.ChampionData[name].ProjectileSpeed or nil
  2292. end
  2293.  
  2294. function _Data:GetGameplayCollisionRadius(name)
  2295.         return self.ChampionData[name] and self.ChampionData[name].GameplayCollisionRadius or 65
  2296. end
  2297.  
  2298. function _Data:IsResetSpell(Spell)
  2299.         return self.ResetSpells[Spell.name]
  2300. end
  2301.  
  2302. function _Data:IsAttack(Spell)
  2303.         return (self.SpellAttacks[Spell.name] or Helper:StringContains(Spell.name, "attack")) and not self.NoneAttacks[Spell.name]
  2304. end
  2305.  
  2306. function _Data:IsJungleMinion(Object)
  2307.         return Object and Object.name and self.JungleData[Object.name] ~= nil
  2308. end
  2309.  
  2310. --[[ Initialize Classes ]]
  2311. function Init()
  2312.         if VIP_USER then
  2313.                 if FileExist(SCRIPT_PATH..'Common/Prodiction.lua') then
  2314.                         require "Prodiction"
  2315.                 else
  2316.                         print("[revamped]: You need the Prodiction library from the forums!")
  2317.                         return false
  2318.                 end
  2319.         end
  2320.         AutoCarry.Skills                = _Skills()
  2321.         AutoCarry.Keys                  = _Keys()
  2322.         AutoCarry.Items                 = _Items()
  2323.         AutoCarry.Data                  = _Data()
  2324.         AutoCarry.Jungle                = _Jungle()
  2325.         AutoCarry.Helper                = _Helper()
  2326.         AutoCarry.MyHero                = _MyHero()
  2327.         AutoCarry.Minions               = _Minions()
  2328.         AutoCarry.Crosshair     = _Crosshair(DAMAGE_PHYSICAL, MyHero.TrueRange, 0, false, false)
  2329.         AutoCarry.Orbwalker     = _Orbwalker()
  2330.         AutoCarry.Plugins               = _Plugins()
  2331.         Skills, Keys, Items, Data, Jungle, Helper, MyHero, Minions, Crosshair, Orbwalker = Helper:GetClasses()
  2332.         SwingTimer      = _SwingTimer()
  2333.         _MenuManager()
  2334.         _Drawing()
  2335.         _Structures()
  2336.         Streaming:CreateMenu()
  2337.         local _, files = ScanDirectory(BOL_PATH.."Scripts\\SidasAutoCarryPlugins")
  2338.         for _, file in pairs(files) do
  2339.                 dofile(BOL_PATH.."Scripts\\SidasAutoCarryPlugins\\"..AutoCarry.Helper:TrimString(file))
  2340.         end
  2341.  
  2342.         PrintChat("<font color='#CCCCCC'> >> Valid license found! <<</font>")
  2343.         PrintChat("<font color='#CCCCCC'> >> Sida's Auto Carry - revamped, loaded! <<</font>")
  2344.         PrintChat("<font color='#CCCCCC'> >> Loaded as "..(VIP_USER and "VIP" or "Non-VIP").." user <<</font>")
  2345.  
  2346.  
  2347.         --[[
  2348.                         Legacy Plugin Support
  2349.                         Plugins should be updated, this may be removed after a few months.
  2350.         ]]
  2351.  
  2352.         --AutoCarry.Orbwalker = AutoCarry.Crosshair.Attack_Crosshair
  2353.         AutoCarry.SkillsCrosshair = AutoCarry.Crosshair.Skills_Crosshair
  2354.         AutoCarry.CanMove = true
  2355.         AutoCarry.CanAttack = true
  2356.         AutoCarry.MainMenu = {}
  2357.         AutoCarry.PluginMenu = nil
  2358.         AutoCarry.EnemyTable = GetEnemyHeroes()
  2359.         AutoCarry.shotFired = false
  2360.         AutoCarry.OverrideCustomChampionSupport = false
  2361.         AutoCarry.CurrentlyShooting = false
  2362.         DoneInit = true
  2363.  
  2364.  
  2365.         class '_LegacyPlugin'
  2366.  
  2367.         function _LegacyPlugin:__init()
  2368.                 AutoCarry.PluginMenu = scriptConfig("Sida's Auto Carry Plugin: "..myHero.charName, "sidasacplugin"..myHero.charName)
  2369.                 require("SidasAutoCarryPlugin - "..myHero.charName)
  2370.                 PrintChat(">> Sida's Auto Carry: Loaded "..myHero.charName.." plugin!")
  2371.                 AddTickCallback(function() self:_OnTick() end)
  2372.  
  2373.                 if PluginOnTick then
  2374.                         AddTickCallback(function() PluginOnTick() end)
  2375.                 end
  2376.                 if PluginOnDraw then
  2377.                         AddDrawCallback(function() PluginOnDraw() end)
  2378.                 end
  2379.                 if PluginOnCreateObj then
  2380.                         AddCreateObjCallback(function(obj) PluginOnCreateObj(obj) end)
  2381.                 end
  2382.                 if PluginOnDeleteObj then
  2383.                         AddDeleteObjCallback(function(obj) PluginOnDeleteObj(obj) end)
  2384.                 end
  2385.                 if PluginOnLoad then
  2386.                         PluginOnLoad()
  2387.                 end
  2388.                 if PluginOnUnload then
  2389.                         AddUnloadCallback(function() PluginOnUnload() end)
  2390.                 end
  2391.                 if PluginOnWndMsg then
  2392.                         AddMsgCallback(function(msg, key) PluginOnWndMsg(msg, key) end)
  2393.                 end
  2394.                 if PluginOnProcessSpell then
  2395.                         AddProcessSpellCallback(function(unit, spell) PluginOnProcessSpell(unit, spell) end)
  2396.                 end
  2397.                 if PluginOnSendChat then
  2398.                         AddChatCallback(function(text) PluginOnSendChat(text) end)
  2399.                 end
  2400.                 if PluginOnBugsplat then
  2401.                         AddBugsplatCallback(function() PluginOnBugsplat() end)
  2402.                 end
  2403.                 if PluginOnAnimation then
  2404.                         AddAnimationCallback(function(unit, anim) PluginOnAnimation(unit, anim) end)
  2405.                 end
  2406.                 if PluginOnSendPacket then
  2407.                         AddSendPacketCallback(function(packet) PluginOnSendPacket(packet) end)
  2408.                 end
  2409.                 if PluginOnRecvPacket then
  2410.                         AddRecvPacketCallback(function(packet) PluginOnRecvPacket(packet) end)
  2411.                 end
  2412.                 if PluginOnApplyParticle then
  2413.                         AddParticleCallback(function(unit, particle) PluginOnApplyParticle(unit, particle) end)
  2414.                 end
  2415.                 if OnAttacked then
  2416.                         RegisterOnAttacked(OnAttacked)
  2417.                 end
  2418.                 if PluginBonusLastHitDamage then
  2419.                         Plugins:RegisterBonusLastHitDamage(PluginBonusLastHitDamage)
  2420.                 end
  2421.  
  2422.                 if CustomAttackEnemy then
  2423.                         Plugins:RegisterPreAttack(CustomAttackEnemy)
  2424.                 end
  2425.         end
  2426.  
  2427.         function _LegacyPlugin:_OnTick()
  2428.                 AutoCarry.MainMenu.AutoCarry = AutoCarryMenu.Active
  2429.                 AutoCarry.MainMenu.LastHit = LastHitMenu.Active
  2430.                 AutoCarry.MainMenu.MixedMode = MixedModeMenu.Active
  2431.                 AutoCarry.MainMenu.LaneClear = LaneClearMenu.Active
  2432.                 MyHero:MovementEnabled(AutoCarry.CanMove)
  2433.                 MyHero:AttacksEnabled(AutoCarry.CanAttack)
  2434.                 if #AutoCarry.EnemyTable < #Helper.EnemyTable then
  2435.                         AutoCarry.EnemyTable = Helper.EnemyTable
  2436.                 end
  2437.         end
  2438.  
  2439.         AutoCarry.GetAttackTarget = function(isCaster)
  2440.                 return Crosshair:GetTarget()
  2441.         end
  2442.  
  2443.         AutoCarry.GetKillableMinion = function()
  2444.                 return Minions.KillableMinion
  2445.         end
  2446.  
  2447.         AutoCarry.GetMinionTarget = function()
  2448.                 return nil
  2449.         end
  2450.  
  2451.         AutoCarry.EnemyMinions = function()
  2452.                 return Minions.EnemyMinions
  2453.         end
  2454.  
  2455.         AutoCarry.AllyMinions = function()
  2456.                 return Minions.AllyMinions
  2457.         end
  2458.  
  2459.         AutoCarry.GetJungleMobs = function()
  2460.                 return Jungle.JungleMonsters
  2461.         end
  2462.  
  2463.         AutoCarry.GetLastAttacked = function()
  2464.                 return Orbwalker.LastEnemyAttacked
  2465.         end
  2466.  
  2467.         AutoCarry.GetNextAttackTime = function()
  2468.                 return Orbwalker:GetNextAttackTime()
  2469.         end
  2470.  
  2471.         AutoCarry.CastSkillshot = function (skill, target)
  2472.             if VIP_USER then
  2473.                 pred = TargetPredictionVIP(skill.range, skill.speed*1000, (skill.delay/1000 - (GetLatency()/2)/1000), skill.width)
  2474.             elseif not VIP_USER then
  2475.                 pred = TargetPrediction(skill.range, skill.speed, skill.delay, skill.width)
  2476.             end
  2477.             local predPos = pred:GetPrediction(target)
  2478.             if predPos and GetDistance(predPos) <= skill.range then
  2479.                 if VIP_USER and pred:GetHitChance(target) > ConfigMenu.HitChance/100 then --TODO
  2480.                     if not skill.minions or not AutoCarry.GetCollision(skill, myHero, predPos) then
  2481.                        CastSpell(skill.spellKey, predPos.x, predPos.z)
  2482.                     end
  2483.                 elseif not VIP_USER then
  2484.                     if not skill.minions or not AutoCarry.GetCollision(skill, myHero, predPos) then
  2485.                             CastSpell(skill.spellKey, predPos.x, predPos.z)
  2486.                     end
  2487.                 end
  2488.             end
  2489.         end
  2490.  
  2491.         AutoCarry.GetCollision = function (skill, source, destination)
  2492.                 if VIP_USER then
  2493.                         local col = Collision(skill.range, skill.speed*1000 , (skill.delay/1000 - (GetLatency()/2)/1000), skill.width)
  2494.                         return col:GetMinionCollision(source, destination)
  2495.                 else
  2496.                         return willHitMinion(destination, skill.width)
  2497.                 end
  2498.         end
  2499.  
  2500.         AutoCarry.GetPrediction = function(skill, target)
  2501.                 if VIP_USER then
  2502.                         pred = TargetPredictionVIP(skill.range, skill.speed*1000, skill.delay/1000, skill.width)
  2503.                 elseif not VIP_USER then
  2504.                         pred = TargetPrediction(skill.range, skill.speed, skill.delay, skill.width)
  2505.                 end
  2506.                 return pred:GetPrediction(target)
  2507.         end
  2508.  
  2509.         AutoCarry.IsValidHitChance = function(skill, target)
  2510.                 return true
  2511.         end
  2512.  
  2513.         AutoCarry.GetProdiction = function(Key, Range, Speed, Delay, Width, Source, Callback)
  2514.                 return AutoCarry.Plugins:GetProdiction(Key, Range, Speed, Delay, Width, Source, Callback)
  2515.         end
  2516.  
  2517.         function willHitMinion(predic, width)
  2518.                 for _, minion in pairs(Minions.EnemyMinions.objects) do
  2519.                         if minion ~= nil and minion.valid and string.find(minion.name,"Minion_") == 1 and minion.team ~= player.team and minion.dead == false then
  2520.                                 if predic ~= nil then
  2521.                                         ex = player.x
  2522.                                         ez = player.z
  2523.                                         tx = predic.x
  2524.                                         tz = predic.z
  2525.                                         dx = ex - tx
  2526.                                         dz = ez - tz
  2527.                                         if dx ~= 0 then
  2528.                                                 m = dz/dx
  2529.                                                 c = ez - m*ex
  2530.                                         end
  2531.                                         mx = minion.x
  2532.                                         mz = minion.z
  2533.                                         distanc = (math.abs(mz - m*mx - c))/(math.sqrt(m*m+1))
  2534.                                         if distanc < width and math.sqrt((tx - ex)*(tx - ex) + (tz - ez)*(tz - ez)) > math.sqrt((tx - mx)*(tx - mx) + (tz - mz)*(tz - mz)) then
  2535.                                                 return true
  2536.                                         end
  2537.                                 end
  2538.                         end
  2539.                 end
  2540.                 return false
  2541.         end
  2542.  
  2543.         if FileExist(LIB_PATH .."SidasAutoCarryPlugin - "..myHero.charName..".lua") then
  2544.             _LegacyPlugin()
  2545.         end
  2546. end
  2547.  
  2548. function OnLoad()
  2549.     local VP = VPrediction()
  2550.     Orbwalker = SOW(VP)
  2551.     ts = TargetSelector(TARGET_LESS_CAST, 2400)
  2552.  
  2553.     Menu = scriptConfig("SOW", "SOW") --SOW
  2554.  
  2555.     Menu:addTS(ts)
  2556.     ts.name = "Target Selector"
  2557.  
  2558.     Menu:addSubMenu("["..myHero.charName.." SOW ", "SOWorb")
  2559.     Orbwalker:LoadToMenu(Menu.SOWorb)
  2560.  
  2561. end
Advertisement
Add Comment
Please, Sign In to add comment