Advertisement
tiago9115

SOW

Dec 17th, 2014
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.19 KB | None | 0 0
  1. local version = "1.1301"
  2. local AUTOUPDATE = true
  3. local UPDATE_HOST = "raw.github.com"
  4. local UPDATE_PATH = "/Hellsing/BoL/master/common/SOW.lua".."?rand="..math.random(1,10000)
  5. local UPDATE_FILE_PATH = LIB_PATH.."SOW.lua"
  6. local UPDATE_URL = "https://"..UPDATE_HOST..UPDATE_PATH
  7.  
  8. function _AutoupdaterMsg(msg) print("<font color=\"#6699ff\"><b>SOW:</b></font> <font color=\"#FFFFFF\">"..msg..".</font>") end
  9. if AUTOUPDATE then
  10.     local ServerData = GetWebResult(UPDATE_HOST, "/Hellsing/BoL/master/version/SOW.version")
  11.     if ServerData then
  12.         ServerVersion = type(tonumber(ServerData)) == "number" and tonumber(ServerData) or nil
  13.         if ServerVersion then
  14.             if tonumber(version) < ServerVersion then
  15.                 _AutoupdaterMsg("New version available"..ServerVersion)
  16.                 _AutoupdaterMsg("Updating, please don't press F9")
  17.                 DelayAction(function() DownloadFile(UPDATE_URL, UPDATE_FILE_PATH, function () _AutoupdaterMsg("Successfully updated. ("..version.." => "..ServerVersion.."), press F9 twice to load the updated version.") end) end, 3)
  18.             else
  19.                 _AutoupdaterMsg("You have got the latest version ("..ServerVersion..")")
  20.             end
  21.         end
  22.     else
  23.         _AutoupdaterMsg("Error downloading version info")
  24.     end
  25. end
  26.  
  27. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  28. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  29. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  30.  
  31.  
  32. class "SOW"
  33. function SOW:__init(VP)
  34.     _G.SOWLoaded = true
  35.  
  36.     self.ProjectileSpeed = myHero.range > 300 and VP:GetProjectileSpeed(myHero) or math.huge
  37.     self.BaseWindupTime = 3
  38.     self.BaseAnimationTime = 0.65
  39.     self.DataUpdated = false
  40.  
  41.     self.VP = VP
  42.    
  43.     --Callbacks
  44.     self.AfterAttackCallbacks = {}
  45.     self.OnAttackCallbacks = {}
  46.     self.BeforeAttackCallbacks = {}
  47.  
  48.     self.AttackTable =
  49.         {
  50.             ["Ashes Q"] = "frostarrow",
  51.         }
  52.  
  53.     self.NoAttackTable =
  54.         {
  55.             ["Shyvana1"] = "shyvanadoubleattackdragon",
  56.             ["Shyvana2"] = "ShyvanaDoubleAttack",
  57.             ["Wukong"] = "MonkeyKingDoubleAttack",
  58.         }
  59.  
  60.     self.AttackResetTable =
  61.         {
  62.             ["vayne"] = _Q,
  63.             ["darius"] = _W,
  64.             ["fiora"] = _E,
  65.             ["gangplank"] = _Q,
  66.             ["jax"] = _W,
  67.             ["leona"] = _Q,
  68.             ["mordekaiser"] = _Q,
  69.             ["nasus"] = _Q,
  70.             ["nautilus"] = _W,
  71.             ["nidalee"] = _Q,
  72.             ["poppy"] = _Q,
  73.             ["renekton"] = _W,
  74.             ["rengar"] = _Q,
  75.             ["shyvana"] = _Q,
  76.             ["sivir"] = _W,
  77.             ["talon"] = _Q,
  78.             ["trundle"] = _Q,
  79.             ["vi"] = _E,
  80.             ["volibear"] = _Q,
  81.             ["xinzhao"] = _Q,
  82.             ["monkeyking"] = _Q,
  83.             ["yorick"] = _Q,
  84.             ["cassiopeia"] = _E,
  85.             ["garen"] = _Q,
  86.             ["khazix"] = _Q,
  87.             ["gnar"] = _E
  88.         }
  89.  
  90.     self.LastAttack = 0
  91.     self.EnemyMinions = minionManager(MINION_ENEMY, 2000, myHero, MINION_SORT_MAXHEALTH_ASC)
  92.     self.JungleMinions = minionManager(MINION_JUNGLE, 2000, myHero, MINION_SORT_MAXHEALTH_DEC)
  93.     self.OtherMinions = minionManager(MINION_OTHER, 2000, myHero, MINION_SORT_HEALTH_ASC)
  94.    
  95.     GetSave("SOW").FarmDelay = GetSave("SOW").FarmDelay and GetSave("SOW").FarmDelay or 0
  96.     GetSave("SOW").ExtraWindUpTime = GetSave("SOW").ExtraWindUpTime and GetSave("SOW").ExtraWindUpTime or 50
  97.     GetSave("SOW").Mode3 = GetSave("SOW").Mode3 and GetSave("SOW").Mode3 or string.byte("X")
  98.     GetSave("SOW").Mode2 = GetSave("SOW").Mode2 and GetSave("SOW").Mode2 or string.byte("V")
  99.     GetSave("SOW").Mode1 = GetSave("SOW").Mode1 and GetSave("SOW").Mode1 or string.byte("C")
  100.     GetSave("SOW").Mode0 = GetSave("SOW").Mode0 and GetSave("SOW").Mode0 or 32
  101.  
  102.     self.Attacks = true
  103.     self.Move = true
  104.     self.mode = -1
  105.     self.checkcancel = 0
  106.  
  107.     AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end)
  108. end
  109.  
  110. function SOW:LoadToMenu(m, STS)
  111.     if not m then
  112.         self.Menu = scriptConfig("Simple OrbWalker", "SOW")
  113.     else
  114.         self.Menu = m
  115.     end
  116.  
  117.     if STS then
  118.         self.STS = STS
  119.         self.STS.VP = self.VP
  120.     end
  121.    
  122.     self.Menu:addParam("Enabled", "Enabled", SCRIPT_PARAM_ONOFF, true)
  123.     self.Menu:addParam("FarmDelay", "Farm Delay", SCRIPT_PARAM_SLICE, -150, 0, 150)
  124.     self.Menu:addParam("ExtraWindUpTime", "Extra WindUp Time", SCRIPT_PARAM_SLICE, -150,  0, 150)
  125.    
  126.     self.Menu.FarmDelay = GetSave("SOW").FarmDelay
  127.     self.Menu.ExtraWindUpTime = GetSave("SOW").ExtraWindUpTime
  128.  
  129.     self.Menu:addParam("Attack",  "Attack", SCRIPT_PARAM_LIST, 2, { "Only Farming", "Farming + Carry mode"})
  130.     self.Menu:addParam("Mode",  "Orbwalking mode", SCRIPT_PARAM_LIST, 1, { "To mouse", "To target"})
  131.  
  132.     self.Menu:addParam("Hotkeys", "", SCRIPT_PARAM_INFO, "")
  133.  
  134.     self.Menu:addParam("Mode3", "Last hit!", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("X"))
  135.     self.Mode3ParamID = #self.Menu._param
  136.     self.Menu:addParam("Mode1", "Mixed Mode!", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("C"))
  137.     self.Mode1ParamID = #self.Menu._param
  138.     self.Menu:addParam("Mode2", "Laneclear!", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("V"))
  139.     self.Mode2ParamID = #self.Menu._param
  140.     self.Menu:addParam("Mode0", "Carry me!", SCRIPT_PARAM_ONKEYDOWN, false, 32)
  141.     self.Mode0ParamID = #self.Menu._param
  142.  
  143.     self.Menu._param[self.Mode3ParamID].key = GetSave("SOW").Mode3
  144.     self.Menu._param[self.Mode2ParamID].key = GetSave("SOW").Mode2
  145.     self.Menu._param[self.Mode1ParamID].key = GetSave("SOW").Mode1
  146.     self.Menu._param[self.Mode0ParamID].key = GetSave("SOW").Mode0
  147.    
  148.     AddTickCallback(function() self:OnTick() end)
  149.     AddTickCallback(function() self:CheckConfig() end)
  150. end
  151.  
  152. function SOW:CheckConfig()
  153.     GetSave("SOW").FarmDelay = self.Menu.FarmDelay
  154.     GetSave("SOW").ExtraWindUpTime = self.Menu.ExtraWindUpTime
  155.  
  156.     GetSave("SOW").Mode3 = self.Menu._param[self.Mode3ParamID].key
  157.     GetSave("SOW").Mode2 = self.Menu._param[self.Mode2ParamID].key
  158.     GetSave("SOW").Mode1 = self.Menu._param[self.Mode1ParamID].key
  159.     GetSave("SOW").Mode0 = self.Menu._param[self.Mode0ParamID].key
  160. end
  161.  
  162. function SOW:DisableAttacks()
  163.     self.Attacks = false
  164. end
  165.  
  166. function SOW:EnableAttacks()
  167.     self.Attacks = true
  168. end
  169.  
  170. function SOW:ForceTarget(target)
  171.     self.forcetarget = target
  172. end
  173.  
  174. function SOW:GetTime()
  175.     return os.clock()
  176. end
  177.  
  178. function SOW:MyRange(target)
  179.     local myRange = myHero.range + self.VP:GetHitBox(myHero)
  180.     if target and ValidTarget(target) then
  181.         myRange = myRange + self.VP:GetHitBox(target)
  182.     end
  183.     return myRange - 20
  184. end
  185.  
  186. function SOW:InRange(target)
  187.     local MyRange = self:MyRange(target)
  188.     if target and GetDistanceSqr(target.visionPos, myHero.visionPos) <= MyRange * MyRange then
  189.         return true
  190.     end
  191. end
  192.  
  193. function SOW:ValidTarget(target)
  194.     if target and target.type and (target.type == "obj_BarracksDampener" or target.type == "obj_HQ")  then
  195.         return false
  196.     end
  197.     return ValidTarget(target) and self:InRange(target)
  198. end
  199.  
  200. function SOW:Attack(target)
  201.     self.LastAttack = self:GetTime() + self:Latency()
  202.     myHero:Attack(target)
  203. end
  204.  
  205. function SOW:WindUpTime(exact)
  206.     return (1 / (myHero.attackSpeed * self.BaseWindupTime)) + (exact and 0 or GetSave("SOW").ExtraWindUpTime / 1000)
  207. end
  208.  
  209. function SOW:AnimationTime()
  210.     return (1 / (myHero.attackSpeed * self.BaseAnimationTime))
  211. end
  212.  
  213. function SOW:Latency()
  214.     return GetLatency() / 2000
  215. end
  216.  
  217. function SOW:CanAttack()
  218.     if self.LastAttack <= self:GetTime() then
  219.         return (self:GetTime() + self:Latency()  > self.LastAttack + self:AnimationTime())
  220.     end
  221.     return false
  222. end
  223.  
  224. function SOW:CanMove()
  225.     if self.LastAttack <= self:GetTime() then
  226.         return ((self:GetTime() + self:Latency() > self.LastAttack + self:WindUpTime()) or self.ParticleCreated) and not _G.evade
  227.     end
  228. end
  229.  
  230. function SOW:BeforeAttack(target)
  231.     local result = false
  232.     for i, cb in ipairs(self.BeforeAttackCallbacks) do
  233.         local ri = cb(target, self.mode)
  234.         if ri then
  235.             result = true
  236.         end
  237.     end
  238.     return result
  239. end
  240.  
  241. function SOW:RegisterBeforeAttackCallback(f)
  242.     table.insert(self.BeforeAttackCallbacks, f)
  243. end
  244.  
  245. function SOW:OnAttack(target)
  246.     for i, cb in ipairs(self.OnAttackCallbacks) do
  247.         cb(target, self.mode)
  248.     end
  249. end
  250.  
  251. function SOW:RegisterOnAttackCallback(f)
  252.     table.insert(self.OnAttackCallbacks, f)
  253. end
  254.  
  255. function SOW:AfterAttack(target)
  256.     for i, cb in ipairs(self.AfterAttackCallbacks) do
  257.         cb(target, self.mode)
  258.     end
  259. end
  260.  
  261. function SOW:RegisterAfterAttackCallback(f)
  262.     table.insert(self.AfterAttackCallbacks, f)
  263. end
  264.  
  265. function SOW:MoveTo(x, y)
  266.     myHero:MoveTo(x, y)
  267. end
  268. function SOW:OrbWalk(target, point)
  269.     point = point or self.forceorbwalkpos
  270.     if self.Attacks and self:CanAttack() and self:ValidTarget(target) and not self:BeforeAttack(target) then
  271.         self:Attack(target)
  272.     elseif self:CanMove() and self.Move then
  273.         if not point then
  274.             local OBTarget = GetTarget() or target
  275.             if self.Menu.Mode == 1 or not OBTarget then
  276.                 local Mv = Vector(myHero) + 400 * (Vector(mousePos) - Vector(myHero)):normalized()
  277.                 self:MoveTo(Mv.x, Mv.z)
  278.             elseif GetDistanceSqr(OBTarget) > 100*100 + math.pow(self.VP:GetHitBox(OBTarget), 2) then
  279.                 local point = self.VP:GetPredictedPos(OBTarget, 0, 2*myHero.ms, myHero, false)
  280.                 if GetDistanceSqr(point) < 100*100 + math.pow(self.VP:GetHitBox(OBTarget), 2) then
  281.                     point = Vector(Vector(myHero) - point):normalized() * 50
  282.                 end
  283.                 self:MoveTo(point.x, point.z)
  284.             end
  285.         else
  286.             self:MoveTo(point.x, point.z)
  287.         end
  288.     end
  289. end
  290.  
  291. function SOW:IsAttack(SpellName)
  292.     return (SpellName:lower():find("attack") or table.contains(self.AttackTable, SpellName:lower())) and not table.contains(self.NoAttackTable, SpellName:lower())
  293. end
  294.  
  295. function SOW:IsAAReset(SpellName)
  296.     local SpellID
  297.     if SpellName:lower() == myHero:GetSpellData(_Q).name:lower() then
  298.         SpellID = _Q
  299.     elseif SpellName:lower() == myHero:GetSpellData(_W).name:lower() then
  300.         SpellID = _W
  301.     elseif SpellName:lower() == myHero:GetSpellData(_E).name:lower() then
  302.         SpellID = _E
  303.     elseif SpellName:lower() == myHero:GetSpellData(_R).name:lower() then
  304.         SpellID = _R
  305.     end
  306.  
  307.     if SpellID then
  308.         return self.AttackResetTable[myHero.charName:lower()] == SpellID
  309.     end
  310.     return false
  311. end
  312.  
  313. function SOW:OnProcessSpell(unit, spell)
  314.     if unit.isMe and self:IsAttack(spell.name) then
  315.         if self.debugdps then
  316.             DPS = DPS and DPS or 0
  317.             print("DPS: "..(1000/(self:GetTime()- DPS)).." "..(1000/(self:AnimationTime())))
  318.             DPS = self:GetTime()
  319.         end
  320.         if not self.DataUpdated and not spell.name:lower():find("card") then
  321.             self.BaseAnimationTime = 1 / (spell.animationTime * myHero.attackSpeed)
  322.             self.BaseWindupTime = 1 / (spell.windUpTime * myHero.attackSpeed)
  323.             if self.debug then
  324.                 print("<font color=\"#FF0000\">Basic Attacks data updated: </font>")
  325.                 print("<font color=\"#FF0000\">BaseWindupTime: "..self.BaseWindupTime.."</font>")
  326.                 print("<font color=\"#FF0000\">BaseAnimationTime: "..self.BaseAnimationTime.."</font>")
  327.                 print("<font color=\"#FF0000\">ProjectileSpeed: "..self.ProjectileSpeed.."</font>")
  328.             end
  329.             self.DataUpdated = true
  330.         end
  331.         self.LastAttack = self:GetTime() - self:Latency()
  332.         self.checking = true
  333.         self.LastAttackCancelled = false
  334.         self:OnAttack(spell.target)
  335.         self.checkcancel = self:GetTime()
  336.         DelayAction(function(t) self:AfterAttack(t) end, self:WindUpTime() - self:Latency(), {spell.target})
  337.  
  338.     elseif unit.isMe and self:IsAAReset(spell.name) then
  339.         DelayAction(function() self:resetAA() end, 0.25)
  340.     end
  341. end
  342.  
  343. function SOW:resetAA()
  344.     self.LastAttack = 0
  345. end
  346. --TODO: Change this.
  347. function SOW:BonusDamage(minion)
  348.     local AD = myHero:CalcDamage(minion, myHero.totalDamage)
  349.     local BONUS = 0
  350.     if myHero.charName == 'Vayne' then
  351.         if myHero:GetSpellData(_Q).level > 0 and myHero:CanUseSpell(_Q) == SUPRESSED then
  352.             BONUS = BONUS + myHero:CalcDamage(minion, ((0.05 * myHero:GetSpellData(_Q).level) + 0.25 ) * myHero.totalDamage)
  353.         end
  354.         if not VayneCBAdded then
  355.             VayneCBAdded = true
  356.             function VayneParticle(obj)
  357.                 if GetDistance(obj) < 1000 and obj.name:lower():find("vayne_w_ring2.troy") then
  358.                     VayneWParticle = obj
  359.                 end
  360.             end
  361.             AddCreateObjCallback(VayneParticle)
  362.         end
  363.         if VayneWParticle and VayneWParticle.valid and GetDistance(VayneWParticle, minion) < 10 then
  364.             BONUS = BONUS + 10 + 10 * myHero:GetSpellData(_W).level + (0.03 + (0.01 * myHero:GetSpellData(_W).level)) * minion.maxHealth
  365.         end
  366.     elseif myHero.charName == 'Teemo' and myHero:GetSpellData(_E).level > 0 then
  367.         BONUS = BONUS + myHero:CalcMagicDamage(minion, (myHero:GetSpellData(_E).level * 10) + (myHero.ap * 0.3) )
  368.     elseif myHero.charName == 'Corki' then
  369.         BONUS = BONUS + myHero.totalDamage/10
  370.     elseif myHero.charName == 'MissFortune' and myHero:GetSpellData(_W).level > 0 then
  371.         BONUS = BONUS + myHero:CalcMagicDamage(minion, (4 + 2 * myHero:GetSpellData(_W).level) + (myHero.ap/20))
  372.     elseif myHero.charName == 'Varus' and myHero:GetSpellData(_W).level > 0 then
  373.         BONUS = BONUS + (6 + (myHero:GetSpellData(_W).level * 4) + (myHero.ap * 0.25))
  374.     elseif myHero.charName == 'Caitlyn' then
  375.             if not CallbackCaitlynAdded then
  376.                 function CaitlynParticle(obj)
  377.                     if GetDistance(obj) < 100 and obj.name:lower():find("caitlyn_headshot_rdy") then
  378.                             HeadShotParticle = obj
  379.                     end
  380.                 end
  381.                 AddCreateObjCallback(CaitlynParticle)
  382.                 CallbackCaitlynAdded = true
  383.             end
  384.             if HeadShotParticle and HeadShotParticle.valid then
  385.                 BONUS = BONUS + AD * 1.5
  386.             end
  387.     elseif myHero.charName == 'Orianna' then
  388.         BONUS = BONUS + myHero:CalcMagicDamage(minion, 10 + 8 * ((myHero.level - 1) % 3))
  389.     elseif myHero.charName == 'TwistedFate' then
  390.             if not TFCallbackAdded then
  391.                 function TFParticle(obj)
  392.                     if GetDistance(obj) < 100 and obj.name:lower():find("cardmaster_stackready.troy") then
  393.                         TFEParticle = obj
  394.                     elseif GetDistance(obj) < 100 and obj.name:lower():find("card_blue.troy") then
  395.                         TFWParticle = obj
  396.                     end
  397.                 end
  398.                 AddCreateObjCallback(TFParticle)
  399.                 TFCallbackAdded = true
  400.             end
  401.             if TFEParticle and TFEParticle.valid then
  402.                 BONUS = BONUS + myHero:CalcMagicDamage(minion, myHero:GetSpellData(_E).level * 15 + 40 + 0.5 * myHero.ap)  
  403.             end
  404.             if TFWParticle and TFWParticle.valid then
  405.                 BONUS = BONUS + math.max(myHero:CalcMagicDamage(minion, myHero:GetSpellData(_W).level * 20 + 20 + 0.5 * myHero.ap) - 40, 0)
  406.             end
  407.     elseif myHero.charName == 'Draven' then
  408.             if not CallbackDravenAdded then
  409.                 function DravenParticle(obj)
  410.                     if GetDistance(obj) < 100 and obj.name:lower():find("draven_q_buf") then
  411.                             DravenParticleo = obj
  412.                     end
  413.                 end
  414.                 AddCreateObjCallback(DravenParticle)
  415.                 CallbackDravenAdded = true
  416.             end
  417.             if DravenParticleo and DravenParticleo.valid then
  418.                 BONUS = BONUS + AD * (0.3 + (0.10 * myHero:GetSpellData(_Q).level))
  419.             end
  420.     elseif myHero.charName == 'Nasus' and VIP_USER then
  421.         if myHero:GetSpellData(_Q).level > 0 and myHero:CanUseSpell(_Q) == SUPRESSED then
  422.             local Qdamage = {30, 50, 70, 90, 110}
  423.             NasusQStacks = NasusQStacks or 0
  424.             BONUS = BONUS + myHero:CalcDamage(minion, 10 + 20 * (myHero:GetSpellData(_Q).level) + NasusQStacks)
  425.             if not RecvPacketNasusAdded then
  426.                 function NasusOnRecvPacket(p)
  427.                     if p.header == 0xFE and p.size == 0xC then
  428.                         p.pos = 1
  429.                         pNetworkID = p:DecodeF()
  430.                         unk01 = p:Decode2()
  431.                         unk02 = p:Decode1()
  432.                         stack = p:Decode4()
  433.                         if pNetworkID == myHero.networkID then
  434.                             NasusQStacks = stack
  435.                         end
  436.                     end
  437.                 end
  438.                 RecvPacketNasusAdded = true
  439.                 AddRecvPacketCallback(NasusOnRecvPacket)
  440.             end
  441.         end
  442.     elseif myHero.charName == "Ziggs" then
  443.         if not CallbackZiggsAdded then
  444.             function ZiggsParticle(obj)
  445.                 if GetDistance(obj) < 100 and obj.name:lower():find("ziggspassive") then
  446.                         ZiggsParticleObj = obj
  447.                 end
  448.             end
  449.             AddCreateObjCallback(ZiggsParticle)
  450.             CallbackZiggsAdded = true
  451.         end
  452.         if ZiggsParticleObj and ZiggsParticleObj.valid then
  453.             local base = {20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, 136, 148, 160}
  454.             BONUS = BONUS + myHero:CalcMagicDamage(minion, base[myHero.level] + (0.25 + 0.05 * (myHero.level % 7)) * myHero.ap)  
  455.         end
  456.     end
  457.  
  458.     return BONUS
  459. end
  460.  
  461. function SOW:KillableMinion()
  462.     local result
  463.     for i, minion in ipairs(self.EnemyMinions.objects) do
  464.         local time = self:WindUpTime(true) + GetDistance(minion.visionPos, myHero.visionPos) / self.ProjectileSpeed - 0.07
  465.         local PredictedHealth = self.VP:GetPredictedHealth(minion, time, GetSave("SOW").FarmDelay / 1000)
  466.         if self:ValidTarget(minion) and PredictedHealth < self.VP:CalcDamageOfAttack(myHero, minion, {name = "Basic"}, 0) + self:BonusDamage(minion) and PredictedHealth > -40 then
  467.             result = minion
  468.             break
  469.         end
  470.     end
  471.     return result
  472. end
  473.  
  474. function SOW:ShouldWait()
  475.     for i, minion in ipairs(self.EnemyMinions.objects) do
  476.         local time = self:AnimationTime() + GetDistance(minion.visionPos, myHero.visionPos) / self.ProjectileSpeed - 0.07
  477.         if self:ValidTarget(minion) and self.VP:GetPredictedHealth2(minion, time * 2) < (self.VP:CalcDamageOfAttack(myHero, minion, {name = "Basic"}, 0) + self:BonusDamage(minion)) then
  478.             return true
  479.         end
  480.     end
  481. end
  482.  
  483. function SOW:ValidStuff()
  484.     local result = self:GetTarget()
  485.  
  486.     if result then
  487.         return result
  488.     end
  489.  
  490.     for i, minion in ipairs(self.EnemyMinions.objects) do
  491.         local time = self:AnimationTime() + GetDistance(minion.visionPos, myHero.visionPos) / self.ProjectileSpeed - 0.07
  492.         local pdamage2 = minion.health - self.VP:GetPredictedHealth(minion, time, GetSave("SOW").FarmDelay / 1000)
  493.         local pdamage = self.VP:GetPredictedHealth2(minion, time * 2)
  494.         if self:ValidTarget(minion) and ((pdamage) > 2*self.VP:CalcDamageOfAttack(myHero, minion, {name = "Basic"}, 0) + self:BonusDamage(minion) or pdamage2 == 0) then
  495.             return minion
  496.         end
  497.     end
  498.  
  499.     for i, minion in ipairs(self.JungleMinions.objects) do
  500.         if self:ValidTarget(minion) then
  501.             return minion
  502.         end
  503.     end
  504.  
  505.     for i, minion in ipairs(self.OtherMinions.objects) do
  506.         if self:ValidTarget(minion) then
  507.             return minion
  508.         end
  509.     end
  510. end
  511.  
  512. function SOW:GetTarget(OnlyChampions)
  513.     local result
  514.     local healthRatio
  515.  
  516.     if self:ValidTarget(self.forcetarget) then
  517.         return self.forcetarget
  518.     elseif self.forcetarget ~= nil then
  519.         return nil
  520.     end
  521.  
  522.     if (not self.STS or not OnlyChampions) and self:ValidTarget(GetTarget()) and (GetTarget().type == myHero.type or (not OnlyChampions)) then
  523.         return GetTarget()
  524.     end
  525.  
  526.     if self.STS then
  527.         local oldhitboxmode = self.STS.hitboxmode
  528.         self.STS.hitboxmode = true
  529.  
  530.         result = self.STS:GetTarget(myHero.range)
  531.  
  532.         self.STS.hitboxmode = oldhitboxmode
  533.         return result
  534.     end
  535.  
  536.     for i, champion in ipairs(GetEnemyHeroes()) do
  537.         local hr = champion.health / myHero:CalcDamage(champion, 200)
  538.         if self:ValidTarget(champion) and ((healthRatio == nil) or hr < healthRatio) then
  539.             result = champion
  540.             healthRatio = hr
  541.         end
  542.     end
  543.  
  544.     return result
  545. end
  546.  
  547. function SOW:Farm(mode, point)
  548.     if mode == 1 then
  549.         self.EnemyMinions:update()
  550.         local target = self:KillableMinion() or self:GetTarget()
  551.         self:OrbWalk(target, point)
  552.         self.mode = 1
  553.     elseif mode == 2 then
  554.         self.EnemyMinions:update()
  555.         self.OtherMinions:update()
  556.         self.JungleMinions:update()
  557.  
  558.         local target = self:KillableMinion()
  559.         if target then
  560.             self:OrbWalk(target, point)
  561.         elseif not self:ShouldWait() then
  562.  
  563.             if self:ValidTarget(self.lasttarget) then
  564.                 target = self.lasttarget
  565.             else
  566.                 target = self:ValidStuff()
  567.             end
  568.             self.lasttarget = target
  569.            
  570.             self:OrbWalk(target, point)
  571.         else
  572.             self:OrbWalk(nil, point)
  573.         end
  574.         self.mode = 2
  575.     elseif mode == 3 then
  576.         self.EnemyMinions:update()
  577.         local target = self:KillableMinion()
  578.         self:OrbWalk(target, point)
  579.         self.mode = 3
  580.     end
  581. end
  582.  
  583. function SOW:OnTick()
  584.     if not self.Menu.Enabled then return end
  585.     if self.Menu.Mode0 then
  586.         local target = self:GetTarget(true)
  587.         if self.Menu.Attack == 2 then
  588.             self:OrbWalk(target)
  589.         else
  590.             self:OrbWalk()
  591.         end
  592.         self.mode = 0
  593.     elseif self.Menu.Mode1 then
  594.         self:Farm(1)
  595.     elseif self.Menu.Mode2 then
  596.         self:Farm(2)
  597.     elseif self.Menu.Mode3 then
  598.         self:Farm(3)
  599.     else
  600.         self.mode = -1
  601.     end
  602. end
  603.  
  604. function SOW:DrawAARange(width, color)
  605.     local p = WorldToScreen(D3DXVECTOR3(myHero.x, myHero.y, myHero.z))
  606.     if OnScreen(p.x, p.y) then
  607.         DrawCircle3D(myHero.x, myHero.y, myHero.z, self:MyRange() + 25, width or 1, color or ARGB(255, 255, 0, 0))
  608.     end
  609. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement