local AUTOUPDATES = true local ScriptName = "SimpleLib" _G.SimpleLibVersion = 1.96 SPELL_TYPE = { LINEAR = 1, CIRCULAR = 2, CONE = 3, TARGETTED = 4, SELF = 5} ORBWALK_MODE = { COMBO = 1, HARASS = 2, CLEAR = 3, LASTHIT = 4, NONE = -1} CIRCLE_MANAGER = { CIRCLE_2D = 1, CIRCLE_3D = 2, CIRCLE_MINIMAP = 3} LASTHIT_MODE = { NEVER = 1, SMART = 2, ALWAYS = 3} class "_CircleManager" class "_SpellManager" class "_Spell" class "_Prediction" class "_Circle" class "_OrbwalkManager" class "_KeyManager" class "_Required" class "_Downloader" class "_ScriptUpdate" class "_Interrupter" class "_Initiator" class "_Evader" class "_AutoSmite" class "_SimpleTargetSelector" local CHANELLING_SPELLS = { ["Caitlyn"] = { "R" }, ["Katarina"] = { "R" }, ["MasterYi"] = { "W" }, ["Fiddlesticks"] = { "R" }, ["Galio"] = { "R" }, ["Lucian"] = { "R" }, ["MissFortune"] = { "R" }, ["VelKoz"] = { "R" }, ["Nunu"] = { "R" }, ["Shen"] = { "R" }, ["Karthus"] = { "R" }, ["Malzahar"] = { "R" }, ["Pantheon"] = { "R" }, ["Warwick"] = { "R" }, ["Xerath"] = { "R" }, } local GAPCLOSER_SPELLS = { ["Aatrox"] = { "Q" }, ["Akali"] = { "R" }, ["Alistar"] = { "W" }, ["Amumu"] = { "Q" }, ["Caitlyn"] = { "E" }, ["Corki"] = { "W" }, ["Diana"] = { "R" }, ["Ezreal"] = { "E" }, ["Elise"] = { "Q", "E" }, ["Fiddlesticks"] = { "R" }, ["Fiora"] = { "Q" }, ["Fizz"] = { "Q" }, ["Gnar"] = { "E" }, ["Gragas"] = { "E" }, ["Graves"] = { "E" }, ["Hecarim"] = { "R" }, ["Irelia"] = { "Q" }, ["JarvanIV"] = { "Q", "R" }, ["Jax"] = { "Q" }, ["Jayce"] = { "Q" }, ["Katarina"] = { "E" }, ["Kassadin"] = { "R" }, ["Kennen"] = { "E" }, ["KhaZix"] = { "E" }, ["Lissandra"] = { "E" }, ["LeBlanc"] = { "W" , "R"}, ["LeeSin"] = { "Q" }, ["Leona"] = { "E" }, ["Lucian"] = { "E" }, ["Malphite"] = { "R" }, ["MasterYi"] = { "Q" }, ["MonkeyKing"] = { "E" }, ["Nautilus"] = { "Q" }, ["Nocturne"] = { "R" }, ["Olaf"] = { "R" }, ["Pantheon"] = { "W" , "R"}, ["Poppy"] = { "E" }, ["RekSai"] = { "E" }, ["Renekton"] = { "E" }, ["Riven"] = { "Q", "E"}, ["Rengar"] = { "R" }, ["Sejuani"] = { "Q" }, ["Sion"] = { "R" }, ["Shen"] = { "E" }, ["Shyvana"] = { "R" }, ["Talon"] = { "E" }, ["Thresh"] = { "Q" }, ["Tristana"] = { "W" }, ["Tryndamere"] = { "E" }, ["Udyr"] = { "E" }, ["Volibear"] = { "Q" }, ["Vi"] = { "Q" }, ["XinZhao"] = { "E" }, ["Yasuo"] = { "E" }, ["Zac"] = { "E" }, ["Ziggs"] = { "W" }, } local CC_SPELLS = { ["Ahri"] = { "E" }, ["Amumu"] = { "Q", "R" }, ["Anivia"] = { "Q" }, ["Annie"] = { "R" }, ["Ashe"] = { "R" }, ["Bard"] = { "Q" }, ["Blitzcrank"] = { "Q" }, ["Brand"] = { "Q" }, ["Braum"] = { "Q" }, ["Cassiopeia"] = { "R" }, ["Darius"] = { "E" }, ["Draven"] = { "E" }, ["DrMundo"] = { "Q" }, ["Ekko"] = { "W" }, ["Elise"] = { "E" }, ["Evelynn"] = { "R" }, ["Ezreal"] = { "R" }, ["Fizz"] = { "R" }, ["Galio"] = { "R" }, ["Gnar"] = { "R" }, ["Gragas"] = { "R" }, ["Graves"] = { "R" }, ["Jinx"] = { "W" , "R" }, ["KhaZix"] = { "W" }, ["Leblanc"] = { "E" }, ["LeeSin"] = { "Q" }, ["Leona"] = { "E" , "R" }, ["Lux"] = { "Q" , "R" }, ["Malphite"] = { "R" }, ["Morgana"] = { "Q" }, ["Nami"] = { "Q" }, ["Nautilus"] = { "Q" }, ["Nidalee"] = { "Q" }, ["Orianna"] = { "R" }, ["Rengar"] = { "E" }, ["Riven"] = { "R" }, ["Sejuani"] = { "R" }, ["Sion"] = { "E" }, ["Shen"] = { "E" }, --["Shyvana"] = { "R" }, ["Sona"] = { "R" }, ["Swain"] = { "W" }, ["Thresh"] = { "Q" }, ["Varus"] = { "R" }, ["Veigar"] = { "E" }, ["Vi"] = { "Q" }, ["Xerath"] = { "E" , "R" }, ["Yasuo"] = { "Q" }, ["Zyra"] = { "E" }, ["Quinn"] = { "E" }, ["Rumble"] = { "E" }, ["Zed"] = { "R" }, } local YASUO_WALL_SPELLS = { ["Ahri"] = { "Q" , "E" }, ["Amumu"] = { "Q" }, ["Anivia"] = { "Q" }, ["Annie"] = { "R" }, ["Ashe"] = { "W" , "R" }, ["Bard"] = { "Q" }, ["Blitzcrank"] = { "Q" }, ["Brand"] = { "Q" }, ["Braum"] = { "Q" , "R" }, ["Caitlyn"] = { "Q" , "E", "R" }, ["Corki"] = { "Q" , "R" }, ["Cassiopeia"] = { "R" }, ["Diana"] = { "Q" }, ["Darius"] = { "E" }, ["Draven"] = { "E" , "R" }, ["DrMundo"] = { "Q" }, ["Ekko"] = { "Q" }, ["Elise"] = { "E" }, ["Ezreal"] = { "Q" , "W" , "R" }, ["Fiora"] = { "W" }, ["Fizz"] = { "R" }, ["Galio"] = { "E" }, ["Gnar"] = { "Q" }, ["Gragas"] = { "Q" , "R" }, ["Graves"] = { "R" }, ["Heimerdinger"] = { "W" , "E" }, ["Irelia"] = { "R" }, ["Janna"] = { "Q" }, ["Jayce"] = { "Q" }, ["Jinx"] = { "W" , "R" }, ["Kalista"] = { "Q" }, ["Karma"] = { "Q" }, ["Kennen"] = { "Q" }, ["KhaZix"] = { "W" }, ["KogMaw"] = { "Q" , "E" }, ["Leblanc"] = { "E" }, ["LeeSin"] = { "Q" }, ["Leona"] = { "E" }, ["Lissandra"] = { "Q" , "E" }, ["Lulu"] = { "Q" }, ["Lux"] = { "Q" , "E" , "R" }, ["Morgana"] = { "Q" }, ["Nami"] = { "R" }, ["Nautilus"] = { "Q" }, ["Nocturne"] = { "Q" }, ["Nidalee"] = { "Q" }, ["Olaf"] = { "Q" }, ["Orianna"] = { "Q" , "E" }, ["Quinn"] = { "Q" }, ["Rengar"] = { "E" }, ["RekSai"] = { "Q" }, ["Riven"] = { "R" }, ["Rumble"] = { "E" }, ["Ryze"] = { "Q" }, ["Sejuani"] = { "Q" , "R"}, ["Sion"] = { "E" }, ["Soraka"] = { "Q" }, ["Shen"] = { "E" }, ["Shyvana"] = { "E" }, ["Sivir"] = { "Q" }, ["Skarner"] = { "E" }, ["Sona"] = { "R" }, ["TahmKench"] = { "Q" }, ["Thresh"] = { "Q" }, ["TwistedFate"] = { "Q" }, ["Twitch"] = { "W" }, ["Varus"] = { "Q" , "R" }, ["Veigar"] = { "Q" }, ["VelKoz"] = { "Q" }, ["Viktor"] = { "E" }, ["Xerath"] = { "E" }, ["Yasuo"] = { "Q" }, ["Zed"] = { "Q" }, ["Ziggs"] = { "W" }, ["Zilean"] = { "Q" }, ["Zyra"] = { "E" }, } local EnemiesInGame = {} function ExtraTime() return -0.07--Latency() - 0.1 end function Latency() return GetLatency()/2000 end function CheckUpdate() if AUTOUPDATES then local ToUpdate = {} ToUpdate.LocalVersion = _G.SimpleLibVersion ToUpdate.VersionPath = "raw.githubusercontent.com/jachicao/BoL/master/version/SimpleLib.version" ToUpdate.ScriptPath = "raw.githubusercontent.com/jachicao/BoL/master/SimpleLib.lua" ToUpdate.SavePath = LIB_PATH.."SimpleLib.lua" ToUpdate.CallbackUpdate = function(NewVersion,OldVersion) PrintMessage("Updated to "..NewVersion..". Please reload with 2x F9.") end ToUpdate.CallbackNoUpdate = function(OldVersion) PrintMessage("No Updates Found.") end ToUpdate.CallbackNewVersion = function(NewVersion) PrintMessage("New Version found ("..NewVersion.."). Please wait...") end ToUpdate.CallbackError = function(NewVersion) PrintMessage("Error while trying to check update.") end _ScriptUpdate(ToUpdate) end end function Immune(target) --[[ if EnemiesInGame["Kayle"] and TargetHaveBuff("judicatorintervention", target) then return true elseif target.charName == "Tryndamere" and TargetHaveBuff("undyingrage", target) then return true elseif target.charName == "Sion" and TargetHaveBuff("sionpassivezombie", target) then return true elseif target.charName == "Aatrox" and TargetHaveBuff("aatroxpassivedeath", target) then return true elseif EnemiesInGame["Zilean"] and TargetHaveBuff("chronoshift", target) then return true end ]] return false end function IsEvading() return _G.evade or _G.Evade end function IsValidTarget(object, distance, enemyTeam) local enemyTeam = (enemyTeam ~= false) return object ~= nil and object.valid and (object.team ~= player.team) == enemyTeam and object.visible and not object.dead and object.bTargetable and (enemyTeam == false or object.bInvulnerable == 0) and (distance == nil or GetDistanceSqr(object) <= distance * distance) and (object.type == myHero.type and not Immune(object) or (object.type ~= myHero.type and true)) end function SlotToString(Slot) local string = "Q" if Slot == _Q then string = "Q" elseif Slot == _W then string = "W" elseif Slot == _E then string = "E" elseif Slot == _R then string = "R" elseif Slot == SUMMONER_1 then string = "D" elseif Slot == SUMMONER_2 then string = "F" elseif Slot == ITEM_1 then string = "ITEM_1" elseif Slot == ITEM_2 then string = "ITEM_2" elseif Slot == ITEM_3 then string = "ITEM_3" elseif Slot == ITEM_4 then string = "ITEM_4" elseif Slot == ITEM_5 then string = "ITEM_5" elseif Slot == ITEM_6 then string = "ITEM_6" elseif Slot == ITEM_7 then string = "ITEM_7" end return string end function PrintMessage(arg1, arg2) local a, b = "", "" if arg2 ~= nil then a = arg1 b = arg2 else a = ScriptName b = arg1 end print("" .. a .. ": " .. b .. "") end function FindItemSlot(name) for slot = ITEM_1, ITEM_7 do if myHero:CanUseSpell(slot) == READY and myHero:GetSpellData(slot) ~= nil and myHero:GetSpellData(slot).name ~= nil and ( tostring(myHero:GetSpellData(slot).name):lower():find(tostring(name):lower()) or tostring(name):lower():find(tostring(myHero:GetSpellData(slot).name):lower()) ) then return slot end end return nil end function FindSummonerSlot(name) for slot = SUMMONER_1, SUMMONER_2 do if myHero:GetSpellData(slot) ~= nil and myHero:GetSpellData(slot).name ~= nil and ( tostring(myHero:GetSpellData(slot).name):lower():find(tostring(name):lower()) or tostring(name):lower():find(tostring(myHero:GetSpellData(slot).name):lower()) ) then return slot end end return nil end function GetPriority(enemy) return 1 + math.max(0, math.min(1.5, TS_GetPriority(enemy) * 0.25)) end function _GetDistanceSqr(p1, p2) p2 = p2 or player if p1 and p1.networkID and (p1.networkID ~= 0) and p1.visionPos then p1 = p1.visionPos end if p2 and p2.networkID and (p2.networkID ~= 0) and p2.visionPos then p2 = p2.visionPos end return GetDistanceSqr(p1, p2) end function CountObjectsNearPos(pos, range, radius, objects) local n = 0 for i, object in ipairs(objects) do local r = radius --+ object.boundingRadius if _GetDistanceSqr(pos, object) <= math.pow(r, 2) then n = n + 1 end end return n end function GetBestCircularFarmPosition(range, radius, objects) local BestPos local BestHit = 0 for i, object in ipairs(objects) do local hit = CountObjectsNearPos(object.visionPos or object, range, radius, objects) if hit > BestHit then BestHit = hit BestPos = object--Vector(object) if BestHit == #objects then break end end end return BestPos, BestHit end function CountObjectsOnLineSegment(StartPos, EndPos, width, objects) local n = 0 for i, object in ipairs(objects) do local pointSegment, pointLine, isOnSegment = VectorPointProjectionOnLineSegment(StartPos, EndPos, object) local w = width --+ object.boundingRadius if isOnSegment and GetDistanceSqr(pointSegment, object) < math.pow(w, 2) and GetDistanceSqr(StartPos, EndPos) > GetDistanceSqr(StartPos, object) then n = n + 1 end end return n end function GetBestLineFarmPosition(range, width, objects) local BestPos local BestHit = 0 for i, object in ipairs(objects) do local EndPos = Vector(myHero) + range * (Vector(object) - Vector(myHero)):normalized() local hit = CountObjectsOnLineSegment(myHero, EndPos, width, objects) if hit > BestHit then BestHit = hit BestPos = object--Vector(object) if BestHit == #objects then break end end end return BestPos, BestHit end function GetHPBarPos(enemy) enemy.barData = {PercentageOffset = {x = -0.05, y = 0}} local barPos = GetUnitHPBarPos(enemy) local barPosOffset = GetUnitHPBarOffset(enemy) local barOffset = { x = enemy.barData.PercentageOffset.x, y = enemy.barData.PercentageOffset.y } local barPosPercentageOffset = { x = enemy.barData.PercentageOffset.x, y = enemy.barData.PercentageOffset.y } local BarPosOffsetX = -50 local BarPosOffsetY = 46 local CorrectionY = 39 local StartHpPos = 31 barPos.x = math.floor(barPos.x + (barPosOffset.x - 0.5 + barPosPercentageOffset.x) * BarPosOffsetX + StartHpPos) barPos.y = math.floor(barPos.y + (barPosOffset.y - 0.5 + barPosPercentageOffset.y) * BarPosOffsetY + CorrectionY) local StartPos = Vector(barPos.x , barPos.y, 0) local EndPos = Vector(barPos.x + 108 , barPos.y , 0) return Vector(StartPos.x, StartPos.y, 0), Vector(EndPos.x, EndPos.y, 0) end function DrawLineHPBar(damage, text, unit, enemyteam) if unit.dead or not unit.visible then return end local p = WorldToScreen(D3DXVECTOR3(unit.x, unit.y, unit.z)) if not OnScreen(p.x, p.y) then return end local thedmg = 0 local line = 2 local linePosA = {x = 0, y = 0 } local linePosB = {x = 0, y = 0 } local TextPos = {x = 0, y = 0 } if damage >= unit.maxHealth then thedmg = unit.maxHealth - 1 else thedmg = damage end thedmg = math.round(thedmg) local StartPos, EndPos = GetHPBarPos(unit) local Real_X = StartPos.x + 24 local Offs_X = (Real_X + ((unit.health - thedmg) / unit.maxHealth) * (EndPos.x - StartPos.x - 2)) if Offs_X < Real_X then Offs_X = Real_X end local mytrans = 350 - math.round(255*((unit.health-thedmg)/unit.maxHealth)) if mytrans >= 255 then mytrans=254 end local my_bluepart = math.round(400*((unit.health-thedmg)/unit.maxHealth)) if my_bluepart >= 255 then my_bluepart=254 end if enemyteam then linePosA.x = Offs_X-150 linePosA.y = (StartPos.y-(30+(line*15))) linePosB.x = Offs_X-150 linePosB.y = (StartPos.y-10) TextPos.x = Offs_X-148 TextPos.y = (StartPos.y-(30+(line*15))) else linePosA.x = Offs_X-125 linePosA.y = (StartPos.y-(30+(line*15))) linePosB.x = Offs_X-125 linePosB.y = (StartPos.y-15) TextPos.x = Offs_X-122 TextPos.y = (StartPos.y-(30+(line*15))) end DrawLine(linePosA.x, linePosA.y, linePosB.x, linePosB.y , 2, ARGB(mytrans, 255, my_bluepart, 0)) DrawText(tostring(thedmg).." "..tostring(text), 15, TextPos.x, TextPos.y , ARGB(mytrans, 255, my_bluepart, 0)) end function _arrangePriorities() local priorityTable2 = { p5 = {"Alistar", "Amumu", "Blitzcrank", "Braum", "ChoGath", "DrMundo", "Garen", "Gnar", "Hecarim", "JarvanIV", "Leona", "Lulu", "Malphite", "Nasus", "Nautilus", "Nunu", "Olaf", "Rammus", "Renekton", "Sejuani", "Shen", "Shyvana", "Singed", "Sion", "Skarner", "TahmKench", "Taric", "Thresh", "Volibear", "Warwick", "MonkeyKing", "Yorick", "Zac"}, p4 = {"Aatrox", "Darius", "Elise", "Evelynn", "Galio", "Gangplank", "Gragas", "Irelia", "Jax","LeeSin", "Maokai", "Morgana", "Nocturne", "Pantheon", "Poppy", "Rengar", "Rumble", "Ryze", "Swain","Trundle", "Tryndamere", "Udyr", "Urgot", "Vi", "XinZhao", "RekSai"}, p3 = {"Akali", "Diana", "Fiddlesticks", "Fiora", "Fizz", "Heimerdinger", "Janna", "Jayce", "Kassadin","Kayle", "KhaZix", "Lissandra", "Mordekaiser", "Nami", "Nidalee", "Riven", "Shaco", "Sona", "Soraka", "Vladimir", "Yasuo", "Zilean", "Zyra"}, p2 = {"Ahri", "Anivia", "Annie", "Brand", "Cassiopeia", "Ekko", "Karma", "Karthus", "Katarina", "Kennen", "LeBlanc", "Lux", "Malzahar", "MasterYi", "Orianna", "Syndra", "Talon", "TwistedFate", "Veigar", "VelKoz", "Viktor", "Xerath", "Zed", "Ziggs" }, p1 = {"Ashe", "Caitlyn", "Corki", "Draven", "Ezreal", "Graves", "Jinx", "Kalista", "KogMaw", "Lucian", "MissFortune", "Quinn", "Sivir", "Teemo", "Tristana", "Twitch", "Varus", "Vayne"}, } local priorityOrder = { [1] = {1,1,1,1,1}, [2] = {1,1,2,2,2}, [3] = {1,1,2,3,3}, [4] = {1,2,3,4,4}, [5] = {1,2,3,4,5}, } local function _SetPriority(tab, hero, priority) if table ~= nil and hero ~= nil and priority ~= nil and type(table) == "table" then for i=1, #tab, 1 do if tostring(hero.charName):find(tostring(tab[i])) ~= nil and type(priority) == "number" then TS_SetHeroPriority(priority, hero.charName) end end end end local enemies = #GetEnemyHeroes() if priorityTable2~=nil and type(priorityTable2) == "table" and enemies > 0 then for i, enemy in ipairs(GetEnemyHeroes()) do _SetPriority(priorityTable2.p1, enemy, math.min(1, #GetEnemyHeroes())) _SetPriority(priorityTable2.p2, enemy, math.min(2, #GetEnemyHeroes())) _SetPriority(priorityTable2.p3, enemy, math.min(3, #GetEnemyHeroes())) _SetPriority(priorityTable2.p4, enemy, math.min(4, #GetEnemyHeroes())) _SetPriority(priorityTable2.p5, enemy, math.min(5, #GetEnemyHeroes())) end end end --CLASS: _AutoSmite function _AutoSmite:__init() self.Spell = _Spell({Slot = FindSummonerSlot("smite"), DamageName = "SMITE", Range = 780, Type = SPELL_TYPE.TARGETTED}) if self.Spell.Slot ~= nil then if _G.SimpleAutoSmite == nil then self.JungleMinions = minionManager(MINION_JUNGLE, self.Spell.Range + 100, myHero, MINION_SORT_MAXHEALTH_DEC) _G.SimpleAutoSmite = scriptConfig("SimpleLib - Auto Smite", "SimpleAutoSmite".."07072015"..tostring(myHero.charName)) _G.SimpleAutoSmite:addParam("Baron", "Use Smite on Dragon/Baron", SCRIPT_PARAM_ONOFF, true) _G.SimpleAutoSmite:addParam("Red", "Use Smite on Red", SCRIPT_PARAM_ONOFF, false) _G.SimpleAutoSmite:addParam("Blue", "Use Smite on Blue", SCRIPT_PARAM_ONOFF, false) _G.SimpleAutoSmite:addParam("Killsteal", "Use Smite to Killsteal", SCRIPT_PARAM_ONOFF, true) AddTickCallback( function() if self.Spell:IsReady() then self.JungleMinions:update() for i, minion in pairs(self.JungleMinions.objects) do if self.Spell:ValidTarget(minion) and minion.health > 0 and self.Spell:Damage(minion) > minion.health then local charName = tostring(minion.charName):lower() if _G.SimpleAutoSmite.Baron and (charName:find("dragon") or charName:find("baron")) then self.Spell:Cast(minion) end if _G.SimpleAutoSmite.Red and charName == "sru_red" then self.Spell:Cast(minion) end if _G.SimpleAutoSmite.Blue and charName == "sru_blue" then self.Spell:Cast(minion) end end end if _G.SimpleAutoSmite.Killsteal then for i, enemy in ipairs(GetEnemyHeroes()) do if self.Spell:ValidTarget(enemy) and self.Spell:Damage(enemy) > enemy.health then self.Spell:Cast(enemy) end end end end end ) end end end --CLASS: _CircleManager function _CircleManager:__init() self.circles = {} AddDrawCallback( function() if #self.circles > 0 and not myHero.dead then for _, circle in ipairs(self.circles) do local menu = circle.Menu local condition = true if circle.Condition ~= nil then if type(circle.Condition) == "function" then condition = circle.Condition() elseif type(circle.Condition) == "boolean" then condition = circle.Condition end end if menu.Enable and condition then local source = myHero local range = 0 if circle.Source ~= nil then if type(circle.Source) == "function" then source = circle.Source() elseif type(circle.Source) == "boolean" then source = circle.Source end end if circle.Range ~= nil then if type(circle.Range) == "function" then range = circle.Range() elseif type(circle.Range) == "number" then range = circle.Range end end if source ~= nil and range > 0 then local mode = circle.Mode local color = menu.Color local width = menu.Width local quality = menu.Quality local pos = WorldToScreen(D3DXVECTOR3(source.x , source.y, source.z)) if mode == CIRCLE_MANAGER.CIRCLE_2D and OnScreen(pos.x, pos.y) then DrawCircle2D(source.x, source.y, range, width, ARGB(color[1], color[2], color[3], color[4]), quality) elseif mode == CIRCLE_MANAGER.CIRCLE_3D and OnScreen(pos.x, pos.y) then if OnScreen(pos.x, pos.y) and range <= 1800 then DrawCircle3D(source.x, source.y, source.z, range, width, ARGB(color[1], color[2], color[3], color[4]), quality) elseif range > 1800 then DrawCircleMinimap(source.x, source.y, source.z, range, width, ARGB(color[1], color[2], color[3], color[4]), quality) end elseif mode == CIRCLE_MANAGER.CIRCLE_MINIMAP then DrawCircleMinimap(source.x, source.y, source.z, range, width, ARGB(color[1], color[2], color[3], color[4]), quality) end end end end end end ) end function _CircleManager:AddCircle(circle) table.insert(self.circles, circle) end --CLASS: _Circle function _Circle:__init(t) self.Menu = nil assert(t and type(t) == "table", "_Circle: table is invalid!") assert(t.Menu ~= nil, "_Circle: Table doesn't have Menu!") self.Mode = nil self.Name = nil self.Text = nil self.Range = nil self.Condition = nil self.Source = nil if t ~= nil then if t.Menu ~= nil then local mode = t.Mode ~= nil and t.Mode or CIRCLE_MANAGER.CIRCLE_3D local name = t.Name ~= nil and t.Name or "Circle"..tostring(#CircleManager.circles + 1) local text = t.Text ~= nil and t.Text or name local range = 0 if t.Range ~= nil then if type(t.Range) == "function" then range = t.Range() elseif type(t.Range) == "number" then range = t.Range end end t.Menu:addSubMenu(text, name) self.Menu = t.Menu[name] if self.Menu ~= nil then local enable = true if t.Enable ~= nil and type(t.Enable) == "boolean" then enable = t.Enable end local color = t.Color ~= nil and t.Color or { 255, 255, 255, 255 } local width = t.Width ~= nil and t.Width or 1 local quality = t.Quality ~= nil and t.Quality or math.min(math.round((range/5 + 6)/2), 30) self.Menu:addParam("Enable", "Enable", SCRIPT_PARAM_ONOFF, enable) self.Menu:addParam("Color", "Color", SCRIPT_PARAM_COLOR, color) self.Menu:addParam("Width", "Width", SCRIPT_PARAM_SLICE, width, 1, 6) self.Menu:addParam("Quality", "Quality", SCRIPT_PARAM_SLICE, quality, 10, math.round(range/5)) end self.Mode = mode self.Name = name self.Text = text self.Range = t.Range self.Condition = t.Condition self.Source = t.Source ~= nil and t.Source or myHero CircleManager:AddCircle(self) end end return self end function _SpellManager:__init() self.spells = {} end function _SpellManager:AddSpell(spell) table.insert(self.spells, spell) end function _SpellManager:InitMenu() if _G.SpellManagerMenu == nil then _G.SpellManagerMenu = scriptConfig("SimpleLib - Spell Manager", "SpellManager".."19052015"..tostring(myHero.charName)) if VIP_USER then --_G.SpellManagerMenu:addParam("Packet", "Enable Packets", SCRIPT_PARAM_ONOFF, false) --_G.SpellManagerMenu:addParam("Exploit", "Enable No-Face Exploit", SCRIPT_PARAM_ONOFF, false) end _G.SpellManagerMenu:addParam("DisableDraws", "Disable All Draws", SCRIPT_PARAM_ONOFF, false) local tab = {" "} for i, name in ipairs(Prediction.PredictionList) do table.insert(tab, name) end _G.SpellManagerMenu:addParam("PredictionSelected", "Set All Skillshots to: ", SCRIPT_PARAM_LIST, 1, tab) _G.SpellManagerMenu.PredictionSelected = 1 _G.SpellManagerMenu:setCallback("PredictionSelected", function(v) if v and v ~= 1 then --print(tostring(_G.SpellManagerMenu._param[_G.SpellManagerMenu:getParamIndex("PredictionSelected")].listTable[v])) for i, spell in ipairs(self.spells) do if spell.Menu ~= nil then if spell.Menu.PredictionSelected ~= nil then spell.Menu.PredictionSelected = _G.SpellManagerMenu.PredictionSelected -1 end end end end end ) end end function _SpellManager:AddLastHit() if _G.SpellManagerMenu ~= nil then if not _G.SpellManagerMenu.FarmDelay then _G.SpellManagerMenu:addParam("FarmDelay", "Delay for LastHit (in ms)", SCRIPT_PARAM_SLICE, 0, -150, 150) end end end --CLASS: _Spell function _Spell:__init(tab) assert(tab and type(tab) == "table", "_Spell: Table is invalid!") self.LastCastTime = 0 self.LastSentTime = 0 self.Object = nil self.Source = myHero self.DrawSource = myHero self.TS = nil self.Menu = nil --self.LastHitMode = LASTHIT_MODE.NEVER if tab ~= nil then self.Type = tab.Type ~= nil and tab.Type or SPELL_TYPE.SELF self.Slot = tab.Slot self.IsForEnemies = true if tab.IsForEnemies ~= nil and type(tab.IsForEnemies) == "boolean" then self.IsForEnemies = tab.IsForEnemies end self.DamageName = nil if tab.DamageName ~= nil then self.DamageName = tab.DamageName self.Name = tab.DamageName elseif self.Slot ~= nil then self.DamageName = SlotToString(self.Slot) self.Name = SlotToString(self.Slot) else self.Name = "Spell"..tostring(#SpellManager.spells + 1) end assert(tab.Range and type(tab.Range) == "number", "_Spell: Range is invalid!") self.Range = tab.Range self.Width = tab.Width ~= nil and tab.Width or 1 self.EnemyMinions = minionManager(MINION_ENEMY, self.Range + self.Width + 50, self.Source, MINION_SORT_MAXHEALTH_DEC) self.JungleMinions = minionManager(MINION_JUNGLE, self.Range + self.Width + 50, self.Source, MINION_SORT_MAXHEALTH_DEC) self.Delay = tab.Delay ~= nil and tab.Delay or 0 self.Speed = tab.Speed ~= nil and tab.Speed or math.huge self.Collision = tab.Collision ~= nil and tab.Collision or false self.Aoe = tab.Aoe ~= nil and tab.Aoe or false self.IsVeryLowAccuracy = tab.IsVeryLowAccuracy if self:IsSkillShot() then self:AddToMenu() if self.Menu ~= nil then self.Menu:addParam("PredictionSelected", "Prediction Selection", SCRIPT_PARAM_LIST, 1, Prediction.PredictionList) Prediction:LoadPrediction(tostring(self.Menu._param[self.Menu:getParamIndex("PredictionSelected")].listTable[self.Menu.PredictionSelected])) local lastest = self.Menu.PredictionSelected self.Menu:setCallback("PredictionSelected", function(v) if v then Prediction:LoadPrediction(tostring(self.Menu._param[self.Menu:getParamIndex("PredictionSelected")].listTable[v])) if tostring(self.Menu._param[self.Menu:getParamIndex("PredictionSelected")].listTable[v]) == "DivinePred" then Prediction:BindSpell(self) end if tostring(self.Menu._param[self.Menu:getParamIndex("PredictionSelected")].listTable[lastest]) == "DivinePred" and v ~= lastest then local boolean = true for i, spell in ipairs(SpellManager.spells) do if spell.Menu ~= nil then if spell.Menu.PredictionSelected ~= nil then if tostring(spell.Menu._param[spell.Menu:getParamIndex("PredictionSelected")].listTable[spell.Menu.PredictionSelected]) == "DivinePred" then boolean = false end end end end if boolean then if not self.Draw then self.Draw = true AddDrawCallback( function() local p = WorldToScreen(D3DXVECTOR3(myHero.x, myHero.y, myHero.z)) local boolean = true for i, spell in ipairs(SpellManager.spells) do if spell.Menu ~= nil then if spell.Menu.PredictionSelected ~= nil then if tostring(spell.Menu._param[spell.Menu:getParamIndex("PredictionSelected")].listTable[spell.Menu.PredictionSelected]) == "DivinePred" then boolean = false end end end end if OnScreen(p.x, p.y) and boolean then DrawText("Press 2x F9!", 25, p.x, p.y, ARGB(255, 255, 255, 255)) end end ) end end end lastest = v end end ) self.Menu:addParam("Combo", "X % Combo Accuracy", SCRIPT_PARAM_SLICE, 60, 0, 100) self.Menu:setCallback("Combo", function(v) if v then if v >= 85 then PrintMessage("Using more than 85% of accuracy isn't recommended!.") end end end ) self.Menu:addParam("Harass", "X % Harass Accuracy", SCRIPT_PARAM_SLICE, 70, 0, 100) self.Menu:setCallback("Harass", function(v) if v then if v >= 85 then PrintMessage("Using more than 85% of accuracy isn't recommended!.") end end end ) self.Menu:addParam("info", "80 % ~ Super High Accuracy", SCRIPT_PARAM_INFO, "") self.Menu:addParam("info2", "60 % ~ High Accuracy (Recommended)", SCRIPT_PARAM_INFO, "") self.Menu:addParam("info3", "30 % ~ Medium Accuracy", SCRIPT_PARAM_INFO, "") self.Menu:addParam("info4", "10 % ~ Low Accuracy", SCRIPT_PARAM_INFO, "") end Prediction:BindSpell(self) elseif self:IsSelf() then end SpellManager:AddSpell(self) end return self end function _Spell:AddDraw(t) self:AddToMenu() if self.Menu ~= nil then local table = {Menu = self.Menu, Name = "Draw", Text = "Drawing Settings", Source = function() if self.DrawSourceFunction ~= nil then return self.DrawSource end return self.Source end, Range = function() return self.Range end, Condition = function() return self:IsReady() and not _G.SpellManagerMenu.DisableDraws end} local enable = true if t ~= nil and t.Enable ~= nil and type(t.Enable) == "boolean" then enable = t.Enable end local color = t ~= nil and t.Color ~= nil and t.Color or { 255, 255, 255, 255 } local width = t ~= nil and t.Width ~= nil and t.Width or 1 table.Enable = enable table.Color = color table.Width = width _Circle(table) end return self end function _Spell:AddTrackTime(t) assert(t and (type(t) == "string" or type(t) == "table"), "_Spell: AddTrackTime is invalid!") self.Track = type(t) == "table" and t or { t } self:LoadProcessSpellCallback() return self end function _Spell:AddTrackCallback(func) assert(self.Track and type(self.Track) == "table", "_Spell: AddTrackCallback needs TrackTime!") assert(func and type(func) == "function", "_Spell: AddTrackCallback needs function!") self.TrackCallback = func return self end function _Spell:AddRangeFunction(rngFunc) assert(rngFunc and type(rngFunc) == "function", "_Spell: RangeFunction is invalid!") self.RangeFunction = rngFunc self:LoadTickCallback() return self end function _Spell:AddWidthFunction(func) assert(func and type(func) == "function", "_Spell: WidthFunction is invalid!") self.WidthFunction = func self:LoadTickCallback() return self end function _Spell:AddTypeFunction(f) assert(f and type(f) == "function", "_Spell: TypeFunction is invalid!") self.TypeFunction = f self:LoadTickCallback() return self end function _Spell:AddDamageFunction(f) assert(f and type(f) == "function", "_Spell: DamageFunction is invalid!") self.DamageFunction = f return self end function _Spell:AddSlotFunction(f) assert(f and type(f) == "function", "_Spell: SlotFunction is invalid!") self.SlotFunction = f self:LoadTickCallback() return self end function _Spell:AddSourceFunction(srcFunc) assert(srcFunc and type(srcFunc) == "function", "_Spell: SourceFunction is invalid!") self.SourceFunction = srcFunc self:LoadTickCallback() return self end function _Spell:AddDrawSourceFunction(drawSrcFunc) assert(drawSrcFunc and type(drawSrcFunc) == "function", "_Spell: DrawSourceFunction is invalid!") self.DrawSourceFunction = drawSrcFunc self:LoadTickCallback() return self end function _Spell:AddTrackObject(t) assert(t and (type(t) == "string" or type(t) == "table"), "_Spell: AddTrackObject is invalid!") self.TrackObject = type(t) == "table" and t or { t } self:LoadCreateAndDeleteCallback() return self end function _Spell:SetAccuracy(int) if self.Menu ~= nil then assert(int and type(int) == "number", "_Spell: SetAccuracy is invalid!") self.Menu.Combo = int self.Menu.Harass = int + 10 end return self end function _Spell:YasuoWall(vector) if YasuoWall ~= nil and self.Speed ~= math.huge and vector ~= nil then for i, enemy in ipairs(GetEnemyHeroes()) do if tostring(enemy.charName):lower():find("yasuo") then local level = enemy:GetSpellData(_W) ~= nil and enemy:GetSpellData(_W).level ~= nil and enemy:GetSpellData(_W).level or 0 local width = 250 + level * 50 local pos1 = Vector(YasuoWall.Object) + Vector(Vector(YasuoWall.Object) - Vector(YasuoWall.StartVector)):normalized():perpendicular() * width/2 local pos2 = Vector(YasuoWall.Object) + Vector(Vector(YasuoWall.Object) - Vector(YasuoWall.StartVector)):normalized():perpendicular2() * width/2 local p1 = WorldToScreen(D3DXVECTOR3(pos1.x, pos1.y, pos1.z)) local p2 = WorldToScreen(D3DXVECTOR3(pos2.x, pos2.y, pos2.z)) local p3 = WorldToScreen(D3DXVECTOR3(self.Source.x, self.Source.y, self.Source.z)) local p4 = WorldToScreen(D3DXVECTOR3(vector.x, vector.y, vector.z)) return IsLineSegmentIntersection(p1, p2, p3, p4) end end end return false end function _Spell:CastToVector(vector) if self:IsReady() and vector ~= nil and not IsEvading() then if self:YasuoWall(vector) then return end self.LastSentTime = os.clock() CastSpell(self.Slot, vector.x, vector.z) end end function _Spell:Cast(target, t) if self:IsReady() and not IsEvading() then if self:ValidTarget(target) then if OrbwalkManager:IsHarass() and target.type == myHero.type then if OrbwalkManager:IsAttacking() and OrbwalkManager.AA.LastTarget and OrbwalkManager.AA.LastTarget.type ~= myHero.type then return end if OrbwalkManager:ShouldWait() then return end end if self:IsSkillShot() then local CastPosition, WillHit = self:GetPrediction(target, t) if CastPosition ~= nil and WillHit then self.LastSentTime = os.clock() self:CastToVector(CastPosition) end elseif self:IsTargetted() then if self:YasuoWall(target) then return end self.LastSentTime = os.clock() CastSpell(self.Slot, target) elseif self:IsSelf() then local CastPosition, WillHit = self:GetPrediction(target, t) if CastPosition ~= nil and GetDistanceSqr(self.Source, CastPosition) <= self.Range * self.Range then if (target.type == myHero.type and WillHit) or (target.type ~= myHero.type) then self.LastSentTime = os.clock() CastSpell(self.Slot) end end end elseif target == nil and self:IsSelf() then self.LastSentTime = os.clock() CastSpell(self.Slot) end end end function _Spell:GetPrediction(target, t) local range = t ~= nil and t.Range ~= nil and t.Range or self.Range if self:ValidTarget(target, range) then if self:IsSkillShot() then local pred = t ~= nil and t.TypeOfPrediction ~= nil and t.TypeOfPrediction or self:PredictionSelected() local accuracy = t ~= nil and t.Accuracy ~= nil and t.Accuracy or self:GetAccuracy() local source = t ~= nil and t.Source ~= nil and t.Source or self.Source local delay = t ~= nil and t.Delay ~= nil and t.Delay or self.Delay local speed = t ~= nil and t.Speed ~= nil and t.Speed or self.Speed local width = t ~= nil and t.Width ~= nil and t.Width or self.Width local type = t ~= nil and t.Type ~= nil and t.Type or self.Type local tab = {Delay = delay, Width = width, Speed = speed, Range = range, Source = source, Type = type, Collision = self.Collision, Aoe = self.Aoe, TypeOfPrediction = pred, Accuracy = accuracy, Slot = self.Slot, IsVeryLowAccuracy = self.IsVeryLowAccuracy, Name = self.Name} return Prediction:GetPrediction(target, tab) elseif self:IsSelf() then local pred = t ~= nil and t.TypeOfPrediction ~= nil and t.TypeOfPrediction or self:PredictionSelected() local accuracy = t ~= nil and t.Accuracy ~= nil and t.Accuracy or self:GetAccuracy() local source = t ~= nil and t.Source ~= nil and t.Source or self.Source local tab = {Delay = self.Delay, Speed = self.Speed, Source = source, Collision = self.Collision, TypeOfPrediction = pred, Accuracy = accuracy} return Prediction:GetPredictedPos(target, tab) end end return Vector(target), false, Vector(target) end function _Spell:LoadTickCallback() if not self.TickCallback then self.TickCallback = true local LastTick = 0 local Interval = 10 --segs AddTickCallback( function() if myHero.dead then return end if self.SourceFunction ~= nil then self.Source = self.SourceFunction() end if self.RangeFunction ~= nil then self.Range = self.RangeFunction() end if self.TypeFunction ~= nil then self.Type = self.TypeFunction() end if self.DrawSourceFunction ~= nil then self.DrawSource = self.DrawSourceFunction() end if self.WidthFunction ~= nil then self.Width = self.WidthFunction() end if self.SlotFunction ~= nil then if os.clock() - LastTick > Interval then self.Slot = self.SlotFunction() LastTick = os.clock() end end end ) end end function _Spell:LoadCreateAndDeleteCallback() if not self.ObjectCallback then AddCreateObjCallback( function(obj) if obj and obj.name and obj.valid and self.Object == nil and os.clock() - self.LastCastTime > self.Delay * 0.8 and os.clock() - self.LastCastTime < self.Delay * 1.2 then local name = tostring(obj.name):lower() if ( (obj.spellOwner and obj.spellName and obj.spellOwner.isMe) or GetDistanceSqr(self.Source, obj) <= math.pow(10, 2)) then for _, s in ipairs(self.TrackObject) do if name:find(tostring(s):lower()) then self.Object = obj end end end end end ) AddDeleteObjCallback( function(obj) if obj and obj.name and self.Object ~= nil and self.Object.valid and GetDistanceSqr(obj, self.Object) <= math.pow(10, 2) then local name = tostring(obj.name):lower() for _, s in ipairs(self.TrackObject) do if name:find(tostring(s):lower()) then self.Object = nil end end end end ) self.ObjectCallback = true end end function _Spell:LoadProcessSpellCallback() if not self.ProcessCallback then self.ProcessCallback = true if AddProcessSpellCallback then AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end) end if AddProcessAttackCallback then AddProcessAttackCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end) end end end function _Spell:OnProcessSpell(unit, spell) if unit and spell and spell.name and unit.isMe then if self.Track ~= nil then for _, s in ipairs(self.Track) do if tostring(spell.name):lower():find(tostring(s):lower()) then self.LastCastTime = os.clock() if self.TrackCallback ~= nil then self.TrackCallback(spell) end end end end end end function _Spell:IsLinear() return self.Type == SPELL_TYPE.LINEAR end function _Spell:IsCircular() return self.Type == SPELL_TYPE.CIRCULAR end function _Spell:IsCone() return self.Type == SPELL_TYPE.CONE end function _Spell:IsSkillShot() return self:IsLinear() or self.Type == SPELL_TYPE.CIRCULAR or self.Type == SPELL_TYPE.CONE end function _Spell:IsSelf() return self.Type == SPELL_TYPE.SELF end function _Spell:IsTargetted() return self.Type == SPELL_TYPE.TARGETTED end function _Spell:PredictionSelected() local int = self.Menu ~= nil and self.Menu.PredictionSelected or 1 return Prediction.PredictionList[int] ~= nil and tostring(Prediction.PredictionList[int]) or "VPrediction" end function _Spell:ValidTarget(target, range) local source = self.DrawSourceFunction ~= nil and self.DrawSource or self.Source local extrarange = self:IsCircular() and self.Width or 0 local range = range ~= nil and range or self.Range return IsValidTarget(target, math.huge, self.IsForEnemies) and GetDistanceSqr(source, target) <= math.pow(range + extrarange, 2) end function _Spell:ObjectsInArea(objects) local objects2 = {} if objects ~= nil and self:IsSelf() and self:IsReady() then for i, object in ipairs(objects) do if self:ValidTarget(object) then local Position, WillHit = self:GetPrediction(object) if GetDistanceSqr(self.Source, Position) <= self.Range * self.Range then if object.type == myHero.type then if WillHit then table.insert(objects2, object) end else table.insert(objects2, object) end end end end end return objects2 end function _Spell:IsReady() if tostring(myHero.charName) == "Kennen" then if self.Slot ~= nil and self.Slot == _W then return myHero:CanUseSpell(self.Slot) == READY or myHero:CanUseSpell(self.Slot) == 3 end end return self.Slot ~= nil and (self:CanUseSpell() == READY or ( self:GetSpellData().level > 0 and self:GetSpellData().currentCd <= Latency())) end function _Spell:GetSpellData() return self.Slot ~= nil and myHero:GetSpellData(self.Slot) or nil end function _Spell:CanUseSpell() return self.Slot ~= nil and myHero:CanUseSpell(self.Slot) or nil end function _Spell:Damage(target, stage) if self.DamageName ~= nil and self.Slot ~= nil then if tostring(myHero.charName) == "Irelia" and self.Slot ~= nil and self.Slot == _Q then return getDmg(self.DamageName, target, myHero, stage) + getDmg("AD", target, myHero, stage) end if self.DamageFunction ~= nil then return self.DamageFunction(self.DamageName, target, stage) end if self.DamageName == "SMITE" then if IsValidTarget(target) then if target.type == myHero.type then local name = self:GetSpellData() ~= nil and tostring(self:GetSpellData().name):lower() or "" if name:find("smiteduel") then return getDmg("SMITESS", target, myHero, stage) elseif name:find("smiteplayerganker") then return getDmg("SMITESB", target, myHero, stage) end else return math.max(20 * myHero.level + 370, 30 * myHero.level + 330, 40 * myHero.level + 240, 50 * myHero.level + 100) end end return 0 end return getDmg(self.DamageName, target, myHero, stage) end return 0 end function _Spell:Mana() return self.Slot ~= nil and myHero:GetSpellData(self.Slot) ~= nil and myHero:GetSpellData(self.Slot).mana ~= nil and myHero:GetSpellData(self.Slot).mana or 0 end function _Spell:GetAccuracy() if self.Menu ~= nil then if not OrbwalkManager:IsNone() then if OrbwalkManager:IsHarass() then return self.Menu.Harass else return self.Menu.Combo end end end return 60 end --TODO: Normalize this function _Spell:LaneClear(tab) if self.EnemyMinions ~= nil and self:IsReady() and OrbwalkManager:GetClearMode() == "laneclear" then if self.SourceFunction ~= nil then self.EnemyMinions.fromPos = self.Source end if self.RangeFunction ~= nil then self.EnemyMinions.range = self.Range end self.EnemyMinions:update() local NumberOfHits = tab ~= nil and tab.NumberOfHits ~= nil and type(tab.NumberOfHits) == "number" and tab.NumberOfHits or 1 local UseCast = true if tab ~= nil and tab.UseCast ~= nil and type(tab.UseCast) == "boolean" then UseCast = tab.UseCast end if NumberOfHits >= 1 and #self.EnemyMinions.objects >= NumberOfHits then if self:IsLinear() then local bestMinion, hits = GetBestLineFarmPosition(self.Range, self.Width, self.EnemyMinions.objects) if hits >= NumberOfHits then if UseCast then self:Cast(bestMinion) end return bestMinion end elseif self:IsCircular() then local bestMinion, hits = GetBestCircularFarmPosition(self.Range, self.Width, self.EnemyMinions.objects) if hits >= NumberOfHits then if UseCast then self:Cast(bestMinion) end return bestMinion end elseif self:IsCone() then local bestMinion, hits = GetBestLineFarmPosition(self.Range, self.Width, self.EnemyMinions.objects) if hits >= NumberOfHits then if UseCast then self:Cast(bestMinion) end return minion end elseif self:IsSelf() then local objects = self:ObjectsInArea(self.EnemyMinions.objects) local hits = #objects if hits >= NumberOfHits then local bestMinion = nil for i, minion in pairs(objects) do bestMinion = minion break end if UseCast then self:Cast(bestMinion) end return bestMinion end elseif self:IsTargetted() then local bestMinion = nil for i, minion in pairs(self.EnemyMinions.objects) do if self:IsReady() then self:Cast(minion) bestMinion = minion end end return bestMinion end end end return nil end function _Spell:JungleClear(tab) if self.JungleMinions ~= nil and self:IsReady() and OrbwalkManager:GetClearMode() == "jungleclear" then if self.SourceFunction ~= nil then self.JungleMinions.fromPos = self.Source end if self.RangeFunction ~= nil then self.JungleMinions.range = self.Range end self.JungleMinions:update() local NumberOfHits = 1 local UseCast = true if tab ~= nil and tab.UseCast ~= nil and type(tab.UseCast) == "boolean" then UseCast = tab.UseCast end if self:IsLinear() then local bestMinion, hits = GetBestLineFarmPosition(self.Range, self.Width, self.JungleMinions.objects) if hits >= NumberOfHits then if UseCast then self:Cast(bestMinion) end return bestMinion end elseif self:IsCircular() then local bestMinion, hits = GetBestCircularFarmPosition(self.Range, self.Width, self.JungleMinions.objects) if hits >= NumberOfHits then if UseCast then self:Cast(bestMinion) end return bestMinion end elseif self:IsCone() then local bestMinion, hits = GetBestLineFarmPosition(self.Range, self.Width, self.JungleMinions.objects) if hits >= NumberOfHits then if UseCast then self:Cast(bestMinion) end end return bestMinion elseif self:IsSelf() then local objects = self:ObjectsInArea(self.JungleMinions.objects) local hits = #objects if hits >= NumberOfHits then local bestMinion = nil for i, minion in pairs(objects) do bestMinion = minion break end if UseCast then self:Cast(bestMinion) end return bestMinion end elseif self:IsTargetted() then local bestMinion = nil for i, minion in pairs(self.JungleMinions.objects) do if self:IsReady() then if UseCast then self:Cast(minion) bestMinion = minion end end end return bestMinion end end return nil end function _Spell:LastHit(tab) SpellManager:AddLastHit() local mode = tab ~= nil and tab.Mode ~= nil and type(tab.Mode) == "number" and tab.Mode or LASTHIT_MODE.SMART if self.EnemyMinions ~= nil and (self:IsSkillShot() or self:IsTargetted() or self:IsSelf()) and mode ~= LASTHIT_MODE.NEVER and self:IsReady() and _G.VP then if self.SourceFunction ~= nil then self.EnemyMinions.fromPos = self.Source end if self.RangeFunction ~= nil then self.EnemyMinions.range = self.Range end local UseCast = true if tab ~= nil and tab.UseCast ~= nil and type(tab.UseCast) == "boolean" then UseCast = tab.UseCast end if self:IsReady() then self.EnemyMinions:update() for i, object in pairs(self.EnemyMinions.objects) do if self:IsReady() and self:ValidTarget(object) and not object.dead and object.health > 0 then local delay = _G.SpellManagerMenu.FarmDelay ~= nil and _G.SpellManagerMenu.FarmDelay or 0 local CanCalculate = false if mode == LASTHIT_MODE.SMART then if not OrbwalkManager:CanAttack() then if OrbwalkManager.AA.LastTarget and object.networkID ~= OrbwalkManager.AA.LastTarget.networkID and not OrbwalkManager:IsAttacking() then CanCalculate = true end else if not OrbwalkManager:InRange(object) then CanCalculate = true else local ProjectileSpeed = _G.VP:GetProjectileSpeed(myHero) local time = OrbwalkManager:WindUpTime() + GetDistance(myHero, object) / ProjectileSpeed + ExtraTime() local predHealth = _G.VP:GetPredictedHealth(object, time, delay) if predHealth <= 20 then CanCalculate = true end end end elseif mode == LASTHIT_MODE.ALWAYS then CanCalculate = true end if CanCalculate then local dmg = self:Damage(object) local time = 0 if self:IsSkillShot() then time = self.Delay + GetDistance(object, self.Source) / self.Speed + ExtraTime() elseif self:IsTargetted() then time = self.Delay + GetDistance(object, self.Source) / self.Speed + ExtraTime() elseif self:IsSelf() then time = self.Delay + GetDistance(object, self.Source) / self.Speed + ExtraTime() end local predHealth = _G.VP:GetPredictedHealth(object, time, delay) if predHealth == object.health and self.Delay + GetDistance(object, self.Source) / self.Speed > 0 and mode == LASTHIT_MODE.SMART then return end if dmg > predHealth and predHealth > -1 then if UseCast then self:Cast(object) end return object end end end end end end end function _Spell:AddToMenu() SpellManager:InitMenu() if self.Menu == nil then _G.SpellManagerMenu:addSubMenu(self.Name.." Settings", self.Name) self.Menu = _G.SpellManagerMenu[self.Name] end end --CLASS: _Prediction function _Prediction:__init() self.UnitsImmobile = {} self.PredictionList = {} self.Actives = { ["VPrediction"] = false, ["HPrediction"] = false, ["KPrediction"] = false, --["TRPrediction"] = false, } if FileExist(LIB_PATH.."VPrediction.lua") then table.insert(self.PredictionList, "VPrediction") require "VPrediction" self.Actives["VPrediction"] = true self.VP = VPrediction() _G.VP = self.VP if _G.VP.version < 2.973 then PrintMessage("Downloading the lastest version of VPrediction...") local r = _Required() local d = _Downloader({Name = "VPrediction", Url = "raw.githubusercontent.com/SidaBoL/Scripts/master/Common/VPrediction.lua", Extension = "lua", UseHttps = true}) table.insert(r.downloading, d) r:Check() end self.VP.projectilespeeds = {["Velkoz"]= 2000, ["TeemoMushroom"] = math.huge, ["TestCubeRender"] = math.huge ,["Xerath"] = 2000.0000 ,["Kassadin"] = math.huge ,["Rengar"] = math.huge ,["Thresh"] = 1000.0000 ,["Ziggs"] = 1500.0000 ,["ZyraPassive"] = 1500.0000 ,["ZyraThornPlant"] = 1500.0000 ,["KogMaw"] = 1800.0000 ,["HeimerTBlue"] = 1599.3999 ,["EliseSpider"] = 500.0000 ,["Skarner"] = 500.0000 ,["ChaosNexus"] = 500.0000 ,["Katarina"] = 467.0000 ,["Riven"] = 347.79999 ,["SightWard"] = 347.79999 ,["HeimerTYellow"] = 1599.3999 ,["Ashe"] = 2000.0000 ,["VisionWard"] = 2000.0000 ,["TT_NGolem2"] = math.huge ,["ThreshLantern"] = math.huge ,["TT_Spiderboss"] = math.huge ,["OrderNexus"] = math.huge ,["Soraka"] = 1000.0000 ,["Jinx"] = 2750.0000 ,["TestCubeRenderwCollision"] = 2750.0000 ,["Red_Minion_Wizard"] = 650.0000 ,["JarvanIV"] = 20.0000 ,["Blue_Minion_Wizard"] = 650.0000 ,["TT_ChaosTurret2"] = 1200.0000 ,["TT_ChaosTurret3"] = 1200.0000 ,["TT_ChaosTurret1"] = 1200.0000 ,["ChaosTurretGiant"] = 1200.0000 ,["Dragon"] = 1200.0000 ,["LuluSnowman"] = 1200.0000 ,["Worm"] = 1200.0000 ,["ChaosTurretWorm"] = 1200.0000 ,["TT_ChaosInhibitor"] = 1200.0000 ,["ChaosTurretNormal"] = 1200.0000 ,["AncientGolem"] = 500.0000 ,["ZyraGraspingPlant"] = 500.0000 ,["HA_AP_OrderTurret3"] = 1200.0000 ,["HA_AP_OrderTurret2"] = 1200.0000 ,["Tryndamere"] = 347.79999 ,["OrderTurretNormal2"] = 1200.0000 ,["Singed"] = 700.0000 ,["OrderInhibitor"] = 700.0000 ,["Diana"] = 347.79999 ,["HA_FB_HealthRelic"] = 347.79999 ,["TT_OrderInhibitor"] = 347.79999 ,["GreatWraith"] = 750.0000 ,["Yasuo"] = 347.79999 ,["OrderTurretDragon"] = 1200.0000 ,["OrderTurretNormal"] = 1200.0000 ,["LizardElder"] = 500.0000 ,["HA_AP_ChaosTurret"] = 1200.0000 ,["Ahri"] = 1750.0000 ,["Lulu"] = 1450.0000 ,["ChaosInhibitor"] = 1450.0000 ,["HA_AP_ChaosTurret3"] = 1200.0000 ,["HA_AP_ChaosTurret2"] = 1200.0000 ,["ChaosTurretWorm2"] = 1200.0000 ,["TT_OrderTurret1"] = 1200.0000 ,["TT_OrderTurret2"] = 1200.0000 ,["TT_OrderTurret3"] = 1200.0000 ,["LuluFaerie"] = 1200.0000 ,["HA_AP_OrderTurret"] = 1200.0000 ,["OrderTurretAngel"] = 1200.0000 ,["YellowTrinketUpgrade"] = 1200.0000 ,["MasterYi"] = math.huge ,["Lissandra"] = 2000.0000 ,["ARAMOrderTurretNexus"] = 1200.0000 ,["Draven"] = 1700.0000 ,["FiddleSticks"] = 1750.0000 ,["SmallGolem"] = math.huge ,["ARAMOrderTurretFront"] = 1200.0000 ,["ChaosTurretTutorial"] = 1200.0000 ,["NasusUlt"] = 1200.0000 ,["Maokai"] = math.huge ,["Wraith"] = 750.0000 ,["Wolf"] = math.huge ,["Sivir"] = 1750.0000 ,["Corki"] = 2000.0000 ,["Janna"] = 1200.0000 ,["Nasus"] = math.huge ,["Golem"] = math.huge ,["ARAMChaosTurretFront"] = 1200.0000 ,["ARAMOrderTurretInhib"] = 1200.0000 ,["LeeSin"] = math.huge ,["HA_AP_ChaosTurretTutorial"] = 1200.0000 ,["GiantWolf"] = math.huge ,["HA_AP_OrderTurretTutorial"] = 1200.0000 ,["YoungLizard"] = 750.0000 ,["Jax"] = 400.0000 ,["LesserWraith"] = math.huge ,["Blitzcrank"] = math.huge ,["ARAMChaosTurretInhib"] = 1200.0000 ,["Shen"] = 400.0000 ,["Nocturne"] = math.huge ,["Sona"] = 1500.0000 ,["ARAMChaosTurretNexus"] = 1200.0000 ,["YellowTrinket"] = 1200.0000 ,["OrderTurretTutorial"] = 1200.0000 ,["Caitlyn"] = 2500.0000 ,["Trundle"] = 347.79999 ,["Malphite"] = 1000.0000 ,["Mordekaiser"] = math.huge ,["ZyraSeed"] = math.huge ,["Vi"] = 1000.0000 ,["Tutorial_Red_Minion_Wizard"] = 650.0000 ,["Renekton"] = math.huge ,["Anivia"] = 1400.0000 ,["Fizz"] = math.huge ,["Heimerdinger"] = 1500.0000 ,["Evelynn"] = 467.0000 ,["Rumble"] = 347.79999 ,["Leblanc"] = 1700.0000 ,["Darius"] = math.huge ,["OlafAxe"] = math.huge ,["Viktor"] = 2300.0000 ,["XinZhao"] = 20.0000 ,["Orianna"] = 1450.0000 ,["Vladimir"] = 1400.0000 ,["Nidalee"] = 1750.0000 ,["Tutorial_Red_Minion_Basic"] = math.huge ,["ZedShadow"] = 467.0000 ,["Syndra"] = 1800.0000 ,["Zac"] = 1000.0000 ,["Olaf"] = 347.79999 ,["Veigar"] = 1100.0000 ,["Twitch"] = 2500.0000 ,["Alistar"] = math.huge ,["Akali"] = 467.0000 ,["Urgot"] = 1300.0000 ,["Leona"] = 347.79999 ,["Talon"] = math.huge ,["Karma"] = 1500.0000 ,["Jayce"] = 347.79999 ,["Galio"] = 1000.0000 ,["Shaco"] = math.huge ,["Taric"] = math.huge ,["TwistedFate"] = 1500.0000 ,["Varus"] = 2000.0000 ,["Garen"] = 347.79999 ,["Swain"] = 1600.0000 ,["Vayne"] = 2000.0000 ,["Fiora"] = 467.0000 ,["Quinn"] = 2000.0000 ,["Kayle"] = math.huge ,["Blue_Minion_Basic"] = math.huge ,["Brand"] = 2000.0000 ,["Teemo"] = 1300.0000 ,["Amumu"] = 500.0000 ,["Annie"] = 1200.0000 ,["Odin_Blue_Minion_caster"] = 1200.0000 ,["Elise"] = 1600.0000 ,["Nami"] = 1500.0000 ,["Poppy"] = 500.0000 ,["AniviaEgg"] = 500.0000 ,["Tristana"] = 2250.0000 ,["Graves"] = 3000.0000 ,["Morgana"] = 1600.0000 ,["Gragas"] = math.huge ,["MissFortune"] = 2000.0000 ,["Warwick"] = math.huge ,["Cassiopeia"] = 1200.0000 ,["Tutorial_Blue_Minion_Wizard"] = 650.0000 ,["DrMundo"] = math.huge ,["Volibear"] = 467.0000 ,["Irelia"] = 467.0000 ,["Odin_Red_Minion_Caster"] = 650.0000 ,["Lucian"] = 2800.0000 ,["Yorick"] = math.huge ,["RammusPB"] = math.huge ,["Red_Minion_Basic"] = math.huge ,["Udyr"] = 467.0000 ,["MonkeyKing"] = 20.0000 ,["Tutorial_Blue_Minion_Basic"] = math.huge ,["Kennen"] = 1600.0000 ,["Nunu"] = 500.0000 ,["Ryze"] = 2400.0000 ,["Zed"] = 467.0000 ,["Nautilus"] = 1000.0000 ,["Gangplank"] = 1000.0000 ,["Lux"] = 1600.0000 ,["Sejuani"] = 500.0000 ,["Ezreal"] = 2000.0000 ,["OdinNeutralGuardian"] = 1800.0000 ,["Khazix"] = 500.0000 ,["Sion"] = math.huge ,["Aatrox"] = 347.79999 ,["Hecarim"] = 500.0000 ,["Pantheon"] = 20.0000 ,["Shyvana"] = 467.0000 ,["Zyra"] = 1700.0000 ,["Karthus"] = 1200.0000 ,["Rammus"] = math.huge ,["Zilean"] = 1200.0000 ,["Chogath"] = 500.0000 ,["Malzahar"] = 2000.0000 ,["YorickRavenousGhoul"] = 347.79999 ,["YorickSpectralGhoul"] = 347.79999 ,["JinxMine"] = 347.79999 ,["YorickDecayedGhoul"] = 347.79999 ,["XerathArcaneBarrageLauncher"] = 347.79999 ,["Odin_SOG_Order_Crystal"] = 347.79999 ,["TestCube"] = 347.79999 ,["ShyvanaDragon"] = math.huge ,["FizzBait"] = math.huge ,["Blue_Minion_MechMelee"] = math.huge ,["OdinQuestBuff"] = math.huge ,["TT_Buffplat_L"] = math.huge ,["TT_Buffplat_R"] = math.huge ,["KogMawDead"] = math.huge ,["TempMovableChar"] = math.huge ,["Lizard"] = 500.0000 ,["GolemOdin"] = math.huge ,["OdinOpeningBarrier"] = math.huge ,["TT_ChaosTurret4"] = 500.0000 ,["TT_Flytrap_A"] = 500.0000 ,["TT_NWolf"] = math.huge ,["OdinShieldRelic"] = math.huge ,["LuluSquill"] = math.huge ,["redDragon"] = math.huge ,["MonkeyKingClone"] = math.huge ,["Odin_skeleton"] = math.huge ,["OdinChaosTurretShrine"] = 500.0000 ,["Cassiopeia_Death"] = 500.0000 ,["OdinCenterRelic"] = 500.0000 ,["OdinRedSuperminion"] = math.huge ,["JarvanIVWall"] = math.huge ,["ARAMOrderNexus"] = math.huge ,["Red_Minion_MechCannon"] = 1200.0000 ,["OdinBlueSuperminion"] = math.huge ,["SyndraOrbs"] = math.huge ,["LuluKitty"] = math.huge ,["SwainNoBird"] = math.huge ,["LuluLadybug"] = math.huge ,["CaitlynTrap"] = math.huge ,["TT_Shroom_A"] = math.huge ,["ARAMChaosTurretShrine"] = 500.0000 ,["Odin_Windmill_Propellers"] = 500.0000 ,["TT_NWolf2"] = math.huge ,["OdinMinionGraveyardPortal"] = math.huge ,["SwainBeam"] = math.huge ,["Summoner_Rider_Order"] = math.huge ,["TT_Relic"] = math.huge ,["odin_lifts_crystal"] = math.huge ,["OdinOrderTurretShrine"] = 500.0000 ,["SpellBook1"] = 500.0000 ,["Blue_Minion_MechCannon"] = 1200.0000 ,["TT_ChaosInhibitor_D"] = 1200.0000 ,["Odin_SoG_Chaos"] = 1200.0000 ,["TrundleWall"] = 1200.0000 ,["HA_AP_HealthRelic"] = 1200.0000 ,["OrderTurretShrine"] = 500.0000 ,["OriannaBall"] = 500.0000 ,["ChaosTurretShrine"] = 500.0000 ,["LuluCupcake"] = 500.0000 ,["HA_AP_ChaosTurretShrine"] = 500.0000 ,["TT_NWraith2"] = 750.0000 ,["TT_Tree_A"] = 750.0000 ,["SummonerBeacon"] = 750.0000 ,["Odin_Drill"] = 750.0000 ,["TT_NGolem"] = math.huge ,["AramSpeedShrine"] = math.huge ,["OriannaNoBall"] = math.huge ,["Odin_Minecart"] = math.huge ,["Summoner_Rider_Chaos"] = math.huge ,["OdinSpeedShrine"] = math.huge ,["TT_SpeedShrine"] = math.huge ,["odin_lifts_buckets"] = math.huge ,["OdinRockSaw"] = math.huge ,["OdinMinionSpawnPortal"] = math.huge ,["SyndraSphere"] = math.huge ,["Red_Minion_MechMelee"] = math.huge ,["SwainRaven"] = math.huge ,["crystal_platform"] = math.huge ,["MaokaiSproutling"] = math.huge ,["Urf"] = math.huge ,["TestCubeRender10Vision"] = math.huge ,["MalzaharVoidling"] = 500.0000 ,["GhostWard"] = 500.0000 ,["MonkeyKingFlying"] = 500.0000 ,["LuluPig"] = 500.0000 ,["AniviaIceBlock"] = 500.0000 ,["TT_OrderInhibitor_D"] = 500.0000 ,["Odin_SoG_Order"] = 500.0000 ,["RammusDBC"] = 500.0000 ,["FizzShark"] = 500.0000 ,["LuluDragon"] = 500.0000 ,["OdinTestCubeRender"] = 500.0000 ,["TT_Tree1"] = 500.0000 ,["ARAMOrderTurretShrine"] = 500.0000 ,["Odin_Windmill_Gears"] = 500.0000 ,["ARAMChaosNexus"] = 500.0000 ,["TT_NWraith"] = 750.0000 ,["TT_OrderTurret4"] = 500.0000 ,["Odin_SOG_Chaos_Crystal"] = 500.0000 ,["OdinQuestIndicator"] = 500.0000 ,["JarvanIVStandard"] = 500.0000 ,["TT_DummyPusher"] = 500.0000 ,["OdinClaw"] = 500.0000 ,["EliseSpiderling"] = 2000.0000 ,["QuinnValor"] = math.huge ,["UdyrTigerUlt"] = math.huge ,["UdyrTurtleUlt"] = math.huge ,["UdyrUlt"] = math.huge ,["UdyrPhoenixUlt"] = math.huge ,["ShacoBox"] = 1500.0000 ,["HA_AP_Poro"] = 1500.0000 ,["AnnieTibbers"] = math.huge ,["UdyrPhoenix"] = math.huge ,["UdyrTurtle"] = math.huge ,["UdyrTiger"] = math.huge ,["HA_AP_OrderShrineTurret"] = 500.0000 ,["HA_AP_Chains_Long"] = 500.0000 ,["HA_AP_BridgeLaneStatue"] = 500.0000 ,["HA_AP_ChaosTurretRubble"] = 500.0000 ,["HA_AP_PoroSpawner"] = 500.0000 ,["HA_AP_Cutaway"] = 500.0000 ,["HA_AP_Chains"] = 500.0000 ,["ChaosInhibitor_D"] = 500.0000 ,["ZacRebirthBloblet"] = 500.0000 ,["OrderInhibitor_D"] = 500.0000 ,["Nidalee_Spear"] = 500.0000 ,["Nidalee_Cougar"] = 500.0000 ,["TT_Buffplat_Chain"] = 500.0000 ,["WriggleLantern"] = 500.0000 ,["TwistedLizardElder"] = 500.0000 ,["RabidWolf"] = math.huge ,["HeimerTGreen"] = 1599.3999 ,["HeimerTRed"] = 1599.3999 ,["ViktorFF"] = 1599.3999 ,["TwistedGolem"] = math.huge ,["TwistedSmallWolf"] = math.huge ,["TwistedGiantWolf"] = math.huge ,["TwistedTinyWraith"] = 750.0000 ,["TwistedBlueWraith"] = 750.0000 ,["TwistedYoungLizard"] = 750.0000 ,["Red_Minion_Melee"] = math.huge ,["Blue_Minion_Melee"] = math.huge ,["Blue_Minion_Healer"] = 1000.0000 ,["Ghast"] = 750.0000 ,["blueDragon"] = 800.0000 ,["Red_Minion_MechRange"] = 3000, ["SRU_OrderMinionRanged"] = 650, ["SRU_ChaosMinionRanged"] = 650, ["SRU_OrderMinionSiege"] = 1200, ["SRU_ChaosMinionSiege"] = 1200, ["SRUAP_Turret_Chaos1"] = 1200, ["SRUAP_Turret_Chaos2"] = 1200, ["SRUAP_Turret_Chaos3"] = 1200, ["SRUAP_Turret_Chaos3_Test"] = 1200, ["SRUAP_Turret_Chaos4"] = 1200, ["SRUAP_Turret_Chaos5"] = 500, ["SRUAP_Turret_Order1"] = 1200, ["SRUAP_Turret_Order2"] = 1200, ["SRUAP_Turret_Order3"] = 1200, ["SRUAP_Turret_Order3_Test"] = math.huge, ["SRUAP_Turret_Order4"] = math.huge, ["SRUAP_Turret_Order5"] = 500, ["Kalista"] = 2600, ["BW_Ocklepod"] = 750, ["BW_Plundercrab"] = 1000, ["BW_AP_ChaosTurret"] = 1200, ["BW_AP_ChaosTurret2"] = 1200, ["BW_AP_ChaosTurret3"] = 1200, ["BW_AP_OrderTurret"] = 1200, ["BW_AP_OrderTurret2"] = 1200, ["BW_AP_OrderTurret3"] = 1200, } self.ProjectileSpeed = self.VP:GetProjectileSpeed(myHero) end --[[if FileExist(LIB_PATH.."TRPrediction.lua") then table.insert(self.PredictionList, "TRPrediction") end]] if FileExist(LIB_PATH.."KPrediction.lua") then table.insert(self.PredictionList, "KPrediction") end if FileExist(LIB_PATH.."HPrediction.lua") then table.insert(self.PredictionList, "HPrediction") end self.LastRequest = 0 local ImmobileBuffs = { [5] = true, [11] = true, [29] = true, [24] = true, } --[[ AddApplyBuffCallback( function(source, unit, buff) if unit and buff and buff.type then if ImmobileBuffs[buff.type] ~= nil then for i = 1, unit.buffCount do local buf = unit:getBuff(i) if buf and buf.name ~= nil and buf.endT ~= nil and buf.startT ~= nil and type(buf.name) == "string" and type(buf.endT) == "number" and type(buf.startT) == "number" and buf.name == buff.name then self.UnitsImmobile[unit.networkID] = {Time = os.clock() - Latency(), Duration = buf.endT - buf.startT} end end end end end ) AddRemoveBuffCallback( function(unit, buff) if unit and buff and buff.type then if ImmobileBuffs[buff.type] ~= nil then self.UnitsImmobile[unit.networkID] = nil end end end )]] end function _Prediction:LoadPrediction(TypeOfPrediction) if TypeOfPrediction == "VPrediction" then elseif TypeOfPrediction == "HPrediction" then if _G.HP then self.HP = _G.HP self.Actives["HPrediction"] = true else require "HPrediction" _G.HP = HPrediction() self.HP = _G.HP self.Actives["HPrediction"] = true end elseif TypeOfPrediction == "KPrediction" then if _G.KP then self.Actives["KPrediction"] = true else require "KPrediction" _G.KP = KPrediction() self.KP = _G.KP self.Actives["KPrediction"] = true end --[[elseif TypeOfPrediction == "TRPrediction" then if _G.TRP then self.TRP = _G.TRP self.Actives["TRPrediction"] = true else require "TRPrediction" _G.TRP = TRPrediction() self.TRP = _G.TRP self.Actives["TRPrediction"] = true end]] end end function _Prediction:BindSpell(sp) if self.DP ~= nil and sp ~= nil then local delay = sp.Delay ~= nil and sp.Delay or 0 local width = sp.Width ~= nil and sp.Width or 1 local range = sp.Range ~= nil and sp.Range or math.huge local speed = sp.Speed ~= nil and sp.Speed or math.huge local skillshotType = sp.Type ~= nil and sp.Type or SPELL_TYPE.CIRCULAR local collision = sp.Collision ~= nil and sp.Collision or false local aoe = sp.Aoe ~= nil and sp.Aoe or false local accuracy = sp.Accuracy ~= nil and sp.Accuracy or 60 local source = sp.Source ~= nil and sp.Source or myHero local name = sp.Name ~= nil and sp.Name or "Q" local col = collision and 0 or math.huge if self.BindedSpells[name] == nil then local spell = nil if skillshotType == SPELL_TYPE.LINEAR then spell = LineSS(speed, range, width, delay * 1000, col) elseif skillshotType == SPELL_TYPE.CIRCULAR then spell = CircleSS(speed, range, width, delay * 1000, col) elseif skillshotType == SPELL_TYPE.CONE then spell = ConeSS(speed, range, width, delay * 1000, col) end self.BindedSpells[name] = self.DP:bindSS(name, spell, 50) end end end function _Prediction:ValidRequest(TypeOfPrediction) if os.clock() - self.LastRequest < self:TimeRequest(TypeOfPrediction) then return false else self.LastRequest = os.clock() return true end end function _Prediction:AccuracyToHitChance(TypeOfPrediction, Accuracy) if TypeOfPrediction == "DivinePred" then if Accuracy >= 90 then return math.max((Accuracy / 2)/100 + 1 - 0, 1) elseif Accuracy >= 80 then return math.max((Accuracy / 2)/100 + 1 - 0.05, 1) elseif Accuracy >= 50 then return math.max((Accuracy / 2)/100 + 1 - 0.1, 1) elseif Accuracy >= 20 then return math.max((Accuracy / 2)/100 + 1 - 0.05, 1) else return math.max((Accuracy / 2)/100 + 1 - 0, 1) end elseif TypeOfPrediction == "HPrediction" then return (Accuracy/100) * 3 elseif TypeOfPrediction == "KPrediction" then return (Accuracy/100) --elseif TypeOfPrediction == "TRPrediction" then end if Accuracy >= 90 then return 3 elseif Accuracy >= 60 then return 2 elseif Accuracy >= 30 then return 1 else return 0 end end function _Prediction:TimeRequest(TypeOfPrediction) if TypeOfPrediction == "DivinePred" then return 0.15 end return 0 end function _Prediction:IsImmobile(target, sp) if IsValidTarget(target) and self.UnitsImmobile[target.networkID] ~= nil then local delay = sp.Delay ~= nil and sp.Delay or 0 local width = sp.Width ~= nil and sp.Width or 1 local range = sp.Range ~= nil and sp.Range or math.huge local speed = sp.Speed ~= nil and sp.Speed or math.huge local skillshotType = sp.Type ~= nil and sp.Type or SPELL_TYPE.CIRCULAR local collision = sp.Collision ~= nil and sp.Collision or false local aoe = sp.Aoe ~= nil and sp.Aoe or false local accuracy = sp.Accuracy ~= nil and sp.Accuracy or 60 local source = sp.Source ~= nil and sp.Source or myHero local ExtraDelay = speed == math.huge and 0 or (GetDistance(source, target) / speed) range = range + (skillshotType == SPELL_TYPE.CIRCULAR and width or 0) local ExtraDelay2 = skillshotType == SPELL_TYPE.CIRCULAR and 0 or (width / target.ms) if not collision and self.UnitsImmobile[target.networkID].Duration - (os.clock() + Latency() - self.UnitsImmobile[target.networkID].Time) + ExtraDelay2 >= delay + ExtraDelay and GetDistanceSqr(source, target) <= math.pow(range , 2) then return true end end return false end function _Prediction:GetPrediction(target, sp) assert(sp and type(sp) == "table", "Prediction:GetPrediction() Table is invalid!") local TypeOfPrediction = sp.TypeOfPrediction ~= nil and sp.TypeOfPrediction or "VPrediction" local CastPosition, WillHit, NumberOfHits, Position = nil, -1, 1, nil if target ~= nil and IsValidTarget(target, math.huge, target.team ~= myHero.team) and self:ValidRequest(TypeOfPrediction) then CastPosition = Vector(target) Position = Vector(target) local delay = sp.Delay ~= nil and sp.Delay or 0 local width = sp.Width ~= nil and sp.Width or 1 local range = sp.Range ~= nil and sp.Range or math.huge local speed = sp.Speed ~= nil and sp.Speed or math.huge local skillshotType = sp.Type ~= nil and sp.Type or SPELL_TYPE.CIRCULAR local collision = sp.Collision ~= nil and sp.Collision or false local aoe = sp.Aoe ~= nil and sp.Aoe or false local accuracy = sp.Accuracy ~= nil and sp.Accuracy or 60 local source = sp.Source ~= nil and sp.Source or myHero local name = sp.Name ~= nil and sp.Name or "Q" TypeOfPrediction = target.type ~= myHero.type and "VPrediction" or TypeOfPrediction TypeOfPrediction = self.Actives[tostring(TypeOfPrediction)] == true and TypeOfPrediction or "VPrediction" if self.Actives[TypeOfPrediction] then if TypeOfPrediction == "HPrediction" then local tipo = "PromptCircle" local tab = {} range = GetDistance(source, myHero) + range local time = delay + range/speed if sp.IsVeryLowAccuracy ~= nil then tab.IsVeryLowAccuracy = sp.IsVeryLowAccuracy end if time > 1 and width <= 120 then tab.IsVeryLowAccuracy = true elseif time > 0.8 and width <= 100 then tab.IsVeryLowAccuracy = true elseif time > 0.6 and width <= 60 then tab.IsVeryLowAccuracy = true elseif width <= 40 then tab.IsVeryLowAccuracy = true end if skillshotType == SPELL_TYPE.LINEAR then width = 2 * width if speed ~= math.huge then tipo = "DelayLine" tab.speed = speed else tipo = "PromptLine" end if collision then tab.collisionM = collision tab.collisionH = collision end tab.width = width elseif skillshotType == SPELL_TYPE.CIRCULAR then tab.radius = width if speed ~= math.huge then tipo = "DelayCircle" tab.speed = speed else tipo = "PromptCircle" end elseif skillshotType == SPELL_TYPE.CONE then tab.angle = width tipo = "CircularArc" tab.speed = speed aoe = false end tab.range = range tab.delay = delay tab.type = tipo if aoe then CastPosition, WillHit, NumberOfHits = self.HP:GetPredict(HPSkillshot(tab), target, Vector(source), aoe) Position = CastPosition else CastPosition, WillHit = self.HP:GetPredict(HPSkillshot(tab), target, Vector(source)) Position = CastPosition end elseif TypeOfPrediction == "KPrediction" then local tipo = "PromptCircle" local tab = {} range = GetDistance(source, myHero) + range if skillshotType == SPELL_TYPE.LINEAR then width = 2 * width if speed ~= math.huge then tipo = "DelayLine" tab.speed = speed else tipo = "PromptLine" end if collision then tab.collision_H = collision tab.collision_M = collision end tab.width = width elseif skillshotType == SPELL_TYPE.CIRCULAR then tab.radius = width if speed ~= math.huge then tipo = "DelayCircle" tab.speed = speed else tipo = "PromptCircle" end elseif skillshotType == SPELL_TYPE.CONE then tab.angle = width tipo = "CircularArc" tab.speed = speed aoe = false end tab.range = range tab.delay = delay tab.type = tipo CastPosition, WillHit = self.KP:GetPrediction(KPSkillshot(tab), target, Vector(source)) Position = CastPosition --[[elseif TypeOfPrediction == "TRPrediction" then local tipo = "IsRadial" local tab = {} tab.aoe = aoe if skillshotType == SPELL_TYPE.LINEAR then width = 2 * width tipo = "IsLinear" tab.width = width elseif skillshotType == SPELL_TYPE.CIRCULAR then tab.radius = width tipo = "IsRadial" elseif skillshotType == SPELL_TYPE.CONE then tab.angle = width tipo = "IsConic" end tab.speed = speed tab.range = range tab.delay = delay tab.type = tipo if collision then tab.allowedCollisionCount = ((source.charName == "Lux" or source.charName == "Veigar") and 1 or 0) else tab.allowedCollisionCount = math.huge end if aoe then CastPosition, WillHit = self.TRP:GetAOEPrediction(TR_BindSS(tab), target, Vector(source)) else CastPosition, WillHit = self.TRP:GetPrediction(TR_BindSS(tab), target, Vector(source)) end Position = CastPosition]] else if skillshotType == SPELL_TYPE.LINEAR then if aoe then CastPosition, WillHit, NumberOfHits, Position = self.VP:GetLineAOECastPosition(target, delay, width, range, speed, source) else CastPosition, WillHit, Position = self.VP:GetLineCastPosition(target, delay, width, range, speed, source, collision) end elseif skillshotType == SPELL_TYPE.CIRCULAR then if aoe then CastPosition, WillHit, NumberOfHits, Position = self.VP:GetCircularAOECastPosition(target, delay, width, range, speed, source) else CastPosition, WillHit, Position = self.VP:GetCircularCastPosition(target, delay, width, range, speed, source, collision) end elseif skillshotType == SPELL_TYPE.CONE then if aoe then CastPosition, WillHit, NumberOfHits, Position = self.VP:GetConeAOECastPosition(target, delay, width, range, speed, source) else CastPosition, WillHit, Position = self.VP:GetLineCastPosition(target, delay, width, range, speed, source, collision) end end end end if WillHit then if type(WillHit) == "number" then if sp.IsVeryLowAccuracy then accuracy = accuracy - 30 end WillHit = ((WillHit >= self:AccuracyToHitChance(TypeOfPrediction, accuracy)) or self:IsImmobile(target, sp)) end else WillHit = false end if aoe then return CastPosition, WillHit, NumberOfHits, Position else return CastPosition, WillHit, Position end end return nil, false, nil end function _Prediction:GetPredictedPos(target, tab) if IsValidTarget(target, math.huge, target.team ~= myHero.team) then local delay = tab.Delay ~= nil and tab.Delay or 0 local speed = tab.Speed or nil local from = tab.Source or nil local collision = tab.Collision or nil local TypeOfPrediction = tab.TypeOfPrediction ~= nil and tab.TypeOfPrediction or "VPrediction" local accuracy = tab.Accuracy ~= nil and tab.Accuracy or 60 local CastPosition, HitChance, Position = self.VP:GetPredictedPos(target, delay, speed, from, collision) local WillHit = false if HitChance >= 0 then WillHit = true else WillHit = false end return CastPosition, WillHit, Position end return Vector(target), false, Vector(target) end --CLASS: _OrbwalkManager function _OrbwalkManager:__init() self.OrbLoaded = "" self.OrbwalkList = {} self.KeyMan = _KeyManager() DelayAction(function() if _G.Reborn_Loaded or _G.Reborn_Initialised or _G.AutoCarry ~= nil then table.insert(self.OrbwalkList, "AutoCarry") end if _G._Pewalk and VIP_USER then table.insert(self.OrbwalkList, "Pewalk") end if _G["BigFatOrb_Loaded"] then table.insert(self.OrbwalkList, "Big Fat Walk") end if _G.SxOrb then table.insert(self.OrbwalkList, "SxOrbWalk") end if _G.OrbwalkManagerMenu == nil then _G.OrbwalkManagerMenu = scriptConfig("SimpleLib - Orbwalk Manager", "OrbwalkManager".."24052015"..tostring(myHero.charName)) end if FileExist(LIB_PATH .. "Big Fat Orbwalker.lua") and not _G["BigFatOrb_Loaded"] then table.insert(self.OrbwalkList, "Big Fat Walk") end if FileExist(LIB_PATH .. "SxOrbWalk.lua") and not _G.SxOrb then table.insert(self.OrbwalkList, "SxOrbWalk") end if #self.OrbwalkList > 0 then _G.OrbwalkManagerMenu:addParam("OrbwalkerSelected", "Orbwalker Selection", SCRIPT_PARAM_LIST, 1, self.OrbwalkList) local default = _G.OrbwalkManagerMenu.OrbwalkerSelected if #self.OrbwalkList > 1 then --_G.OrbwalkManagerMenu:addParam("info", "Requires 2x F9 when changing selection", SCRIPT_PARAM_INFO, "") _G.OrbwalkManagerMenu:setCallback("OrbwalkerSelected", function(v) if v and v ~= default then if not self.Draw then self.Draw = true AddDrawCallback( function() local p = WorldToScreen(D3DXVECTOR3(myHero.x, myHero.y, myHero.z)) if OnScreen(p.x, p.y) and _G.OrbwalkManagerMenu.OrbwalkerSelected ~= default then DrawText("Press 2x F9!", 25, p.x, p.y, ARGB(255, 255, 255, 255)) end end ) end end end ) end end DelayAction(function() self:OrbLoad() end, 1) end, 1) self.NoAttacks = { jarvanivcataclysmattack = true, monkeykingdoubleattack = true, shyvanadoubleattack = true, shyvanadoubleattackdragon = true, zyragraspingplantattack = true, zyragraspingplantattack2 = true, zyragraspingplantattackfire = true, zyragraspingplantattack2fire = true, viktorpowertransfer = true, sivirwattackbounce = true, } self.Attacks = { caitlynheadshotmissile = true, frostarrow = true, garenslash2 = true, kennenmegaproc = true, lucianpassiveattack = true, masteryidoublestrike = true, quinnwenhanced = true, renektonexecute = true, renektonsuperexecute = true, rengarnewpassivebuffdash = true, trundleq = true, xenzhaothrust = true, xenzhaothrust2 = true, xenzhaothrust3 = true, viktorqbuff = true, } self.Resets = { dariusnoxiantacticsonh = true, garenq = true, hecarimrapidslash = true, jaxempowertwo = true, jaycehypercharge = true, leonashieldofdaybreak = true, luciane = true, lucianq = true, monkeykingdoubleattack = true, mordekaisermaceofspades = true, nasusq = true, nautiluspiercinggaze = true, netherblade = true, parley = true, poppydevastatingblow = true, powerfist = true, renektonpreexecute = true, shyvanadoubleattack = true, sivirw = true, takedown = true, talonnoxiandiplomacy = true, trundletrollsmash = true, vaynetumble = true, vie = true, volibearq = true, xenzhaocombotarget = true, yorickspectral = true, reksaiq = true, riventricleave = true, itemtiamatcleave = true, fioraflurry = true, rengarq = true, } self.Attack = true self.Move = true self.KeysMenu = nil self.GotReset = false self.DataUpdated = false self.BaseWindUpTime = 3 self.BaseAnimationTime = 0.665 self.Mode = ORBWALK_MODE.NONE self.AfterAttackCallbacks = {} self.LastAnimationName = "" self.AA = {LastTime = 0, LastTarget = nil, IsAttacking = false, Object = nil} self.LastKeyAdded = os.clock() self.EnemyMinions = minionManager(MINION_ENEMY, myHero.range + myHero.boundingRadius + 500, myHero, MINION_SORT_HEALTH_ASC) self.JungleMinions = minionManager(MINION_JUNGLE, myHero.range + myHero.boundingRadius + 500, myHero, MINION_SORT_MAXHEALTH_DEC) AddCreateObjCallback( function(obj) if obj and obj.name and obj.valid and tostring(obj.name):lower() == "missile" and self:GetTime() - self.AA.LastTime + self:Latency() < 1.2 * self:WindUpTime() and obj.spellOwner and obj.spellName and obj.spellOwner.isMe and self:IsAutoAttack(tostring(obj.spellName)) then self:ResetMove() end end ) AddAnimationCallback(function(unit, animation) self:OnAnimation(unit, animation) end) if AddProcessSpellCallback then AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end) end if AddProcessAttackCallback then AddProcessAttackCallback(function(unit, spell) self:OnProcessAttack(unit, spell) end) end AddTickCallback( function() self.Mode = self.KeyMan:ModePressed() if not self:IsAttacking() then if self.AA.IsAttacking then self:TriggerAfterAttackCallback(spell) self.AA.IsAttacking = false if self.GotReset then self.GotReset = false end end end if self.OrbLoaded == self:GetOrbwalkSelected() then if self.RegisterCommon and not self.RegisteredCommon then self.RegisteredCommon = true self.AddedCommon = true self:AddKey({ Name = "Combo", Text = "Combo", Type = SCRIPT_PARAM_ONKEYDOWN, Key = 32, Mode = ORBWALK_MODE.COMBO}) self:AddKey({ Name = "Harass", Text = "Harass", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("C"), Mode = ORBWALK_MODE.HARASS}) self:AddKey({ Name = "Clear", Text = "LaneClear or JungleClear", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("V"), Mode = ORBWALK_MODE.CLEAR }) self:AddKey({ Name = "LastHit", Text = "LastHit", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("X"), Mode = ORBWALK_MODE.LASTHIT}) end if self.Register and os.clock() - self.LastKeyAdded > 0.15 then self.Register = false self.KeyMan:RegisterKeys() end end end ) end function _OrbwalkManager:GetOrbwalkSelected() local int = _G.OrbwalkManagerMenu ~= nil and _G.OrbwalkManagerMenu.OrbwalkerSelected or 1 return #self.OrbwalkList > 0 and tostring(self.OrbwalkList[int]) or nil end function _OrbwalkManager:IsAutoAttack(name) return name and ((tostring(name):lower():find("attack") and not self.NoAttacks[tostring(name):lower()]) or self.Attacks[tostring(name):lower()]) end function _OrbwalkManager:IsReset(name) return name and self.Resets[tostring(name):lower()] end function _OrbwalkManager:LoadCommonKeys(m) local menu = nil if m == nil then if _G.OrbwalkManagerMenu ~= nil then _G.OrbwalkManagerMenu:addSubMenu(myHero.charName.." - Key Settings", "Keys") menu = _G.OrbwalkManagerMenu.Keys end else menu = m end self.KeysMenu = menu if self.KeysMenu ~= nil then self.KeysMenu:addParam("Common", "Use main keys from your Orbwalker", SCRIPT_PARAM_ONOFF, true) self.RegisterCommon = self.KeysMenu.Common == false self.KeysMenu:setCallback("Common", function(v) if v == false and not self.AddedCommon then self.AddedCommon = true self:AddKey({ Name = "Combo", Text = "Combo (Space)", Type = SCRIPT_PARAM_ONKEYDOWN, Key = 32, Mode = ORBWALK_MODE.COMBO}) self:AddKey({ Name = "Harass", Text = "Harass", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("C"), Mode = ORBWALK_MODE.HARASS}) self:AddKey({ Name = "Clear", Text = "LaneClear or JungleClear", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("V"), Mode = ORBWALK_MODE.CLEAR }) self:AddKey({ Name = "LastHit", Text = "LastHit", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("X"), Mode = ORBWALK_MODE.LASTHIT}) --[[ if not self.Registered2 then AddTickCallback( function() if self.OrbLoaded == self:GetOrbwalkSelected() then if not self.Registered2 then self.Registered2 = true self.KeyMan:RegisterKeys() end end end ) end ]] elseif v == true and self.AddedCommon then self.KeysMenu:removeParam("Combo") self.KeysMenu:removeParam("Combo".."TypeList") self.KeysMenu:removeParam("Harass") self.KeysMenu:removeParam("Harass".."TypeList") self.KeysMenu:removeParam("Clear") self.KeysMenu:removeParam("Clear".."TypeList") self.KeysMenu:removeParam("LastHit") self.KeysMenu:removeParam("LastHit".."TypeList") self.AddedCommon = false end end ) end end function _OrbwalkManager:OnAnimation(unit, animation) if unit and animation then animation = tostring(animation) if unit.isMe then if self:GetTime() - self.AA.LastTime + self:Latency() < 1 * self:WindUpTime() then if not animation:lower():find("attack") then self:ResetMove() end else if animation:lower():find("attack") and self:GetTime() - self.AA.LastTime + self:Latency() >= 1 * self:AnimationTime() - 25/1000 then self.AA.IsAttacking = true self.AA.LastTime = self:GetTime() - self:Latency() end end self.LastAnimationName = animation end end end function _OrbwalkManager:OnProcessAttack(unit, spell) if unit and spell and unit.isMe and spell.name then if self:IsAutoAttack(spell.name) then if not self.DataUpdated then self.BaseAnimationTime = 1 / (spell.animationTime * myHero.attackSpeed) self.BaseWindUpTime = 1 / (spell.windUpTime * myHero.attackSpeed) self.DataUpdated = true end self.AA.LastTarget = spell.target self.AA.IsAttacking = false self.AA.LastTime = self:GetTime() - self:Latency() - self:WindUpTime() end end end function _OrbwalkManager:OnProcessSpell(unit, spell) if unit and spell and spell.name and unit.isMe then if self:IsReset(tostring(spell.name)) then self.GotReset = true DelayAction( function() self:ResetAA() end ,2 * Latency()) end end end function _OrbwalkManager:GetTime() return 1 * os.clock() end function _OrbwalkManager:Latency() return GetLatency() / 2000 end function _OrbwalkManager:ExtraWindUp() return _G.OrbwalkManagerMenu ~= nil and _G.OrbwalkManagerMenu.ExtraWindUp ~= nil and _G.OrbwalkManagerMenu.ExtraWindUp/1000 or 0 end function _OrbwalkManager:WindUpTime() return (1 / (myHero.attackSpeed * self.BaseWindUpTime)) + self:ExtraWindUp() end function _OrbwalkManager:AnimationTime() return (1 / (myHero.attackSpeed * self.BaseAnimationTime)) end function _OrbwalkManager:CanAttack(ExtraTime) if self.OrbLoaded == "AutoCarry" then return _G.AutoCarry.Orbwalker:CanShoot() elseif self.OrbLoaded == "Pewalk" then return _G._Pewalk.CanAttack() elseif self.OrbLoaded == "SxOrbWalk" then return _G.SxOrb:CanAttack() elseif self.OrbLoaded == "Big Fat Walk" then end return self:_CanAttack(ExtraTime) end function _OrbwalkManager:_CanAttack(ExtraTime) local int = ExtraTime ~= nil and ExtraTime or 0 return self:GetTime() - self.AA.LastTime + self:Latency() >= 1 * self:AnimationTime() - 25/1000 + int and not IsEvading() end function _OrbwalkManager:CanMove(ExtraTime) if self.OrbLoaded == "AutoCarry" then return _G.AutoCarry.Orbwalker:CanMove() elseif self.OrbLoaded == "SxOrbWalk" then return _G.SxOrb:CanMove() elseif self.OrbLoaded == "Pewalk" then return _G._Pewalk.CanMove() elseif self.OrbLoaded == "Big Fat Walk" then end return self:_CanMove(ExtraTime) end function _OrbwalkManager:_CanMove(ExtraTime) local int = ExtraTime ~= nil and ExtraTime or 0 return self:GetTime() - self.AA.LastTime + self:Latency() >= 1 * self:WindUpTime() + int and not IsEvading() end function _OrbwalkManager:IsAttacking() return not self:CanMove() end function _OrbwalkManager:CanCast() return not self:IsAttacking() end function _OrbwalkManager:Evade() return _G.evade or _G.Evade end function _OrbwalkManager:MyRange(target) local int1 = 0 if IsValidTarget(target) then int1 = target.boundingRadius end return myHero.range + myHero.boundingRadius + int1 end function _OrbwalkManager:InRange(target, off) local offset = off ~= nil and off or 0 return IsValidTarget(target, self:MyRange(target) + offset) end function _OrbwalkManager:IsCombo() return self.KeyMan.Combo end function _OrbwalkManager:IsHarass() return self.KeyMan.Harass end function _OrbwalkManager:IsClear() return self.KeyMan.Clear end function _OrbwalkManager:IsLastHit() return self.KeyMan.LastHit end function _OrbwalkManager:IsNone() return not (self:IsCombo() or self:IsHarass() or self:IsClear() or self:IsLastHit()) end function _OrbwalkManager:TakeControl() _G.OrbwalkManagerMenu:addParam("ExtraWindUp","Extra WindUpTime", SCRIPT_PARAM_SLICE, 15, -40, 160, 1) AddTickCallback(function() if not self:IsAttacking() then self:EnableMovement() else self:DisableMovement() end if self:CanAttack() then self:EnableAttacks() else self:DisableAttacks() end end) if VIP_USER then HookPackets() AddSendPacketCallback( function(p) p.pos = 2 if _G.OrbwalkManagerMenu ~= nil and myHero.networkID == p:DecodeF() then if self:GetTime() - self.AA.LastTime + self:Latency() < 1 * self:WindUpTime() * 1/2 and not IsEvading() then Packet(p):block() end end end ) end end --boring part function _OrbwalkManager:ShouldWait() if self.EnemyMinions ~= nil and _G.VP then self.EnemyMinions:update() if #self.EnemyMinions.objects > 0 and self:CanAttack() then for i, minion in pairs(self.EnemyMinions.objects) do if self:InRange(minion) and not minion.dead then local delay = _G.SpellManagerMenu ~= nil and _G.SpellManagerMenu.FarmDelay ~= nil and _G.SpellManagerMenu.FarmDelay or 0 local ProjectileSpeed = _G.VP:GetProjectileSpeed(myHero) local time = self:WindUpTime() + GetDistance(myHero.pos, minion.pos) / ProjectileSpeed + ExtraTime() local predHealth = _G.VP:GetPredictedHealth(minion, time, delay) local damage = _G.VP:CalcDamageOfAttack(myHero, minion, {name = "Basic"}, 0) if predHealth > 0 then if damage > predHealth * 0.9 and predHealth < minion.health then return true else --[[ time = self:AnimationTime() + GetDistance(myHero.pos, minion.pos) / ProjectileSpeed + ExtraTime() time = time * 2 predHealth = _G.VP:GetPredictedHealth2(minion, time) if damage > predHealth and predHealth < minion.health then return true end]] end end end end end end return false end function _OrbwalkManager:ObjectInRange(off) local offset = off ~= nil and off or 0 if self:IsCombo() then for i, enemy in ipairs(GetEnemyHeroes()) do if self:InRange(enemy, offset) then return enemy end end elseif self:IsHarass() then for i, enemy in ipairs(GetEnemyHeroes()) do if self:InRange(enemy, offset) then return enemy end end self.EnemyMinions:update() for i, object in ipairs(self.EnemyMinions.objects) do if self:InRange(object, offset) then return object end end elseif self:IsClear() then for i, enemy in ipairs(GetEnemyHeroes()) do if self:InRange(enemy, offset) then return enemy end end self.EnemyMinions:update() for i, object in ipairs(self.EnemyMinions.objects) do if self:InRange(object, offset) then return object end end self.JungleMinions:update() for i, object in ipairs(self.JungleMinions.objects) do if self:InRange(object, offset) then return object end end elseif self:IsLastHit() then self.EnemyMinions:update() for i, object in ipairs(self.EnemyMinions.objects) do if self:InRange(object, offset) then return object end end else for i, enemy in ipairs(GetEnemyHeroes()) do if self:InRange(enemy, offset) then return enemy end end self.EnemyMinions:update() for i, object in ipairs(self.EnemyMinions.objects) do if self:InRange(object, offset) then return object end end self.JungleMinions:update() for i, object in ipairs(self.JungleMinions.objects) do if self:InRange(object, offset) then return object end end end return nil end function _OrbwalkManager:GetClearMode() local bestMinion = nil self.EnemyMinions:update() self.JungleMinions:update() if #self.EnemyMinions.objects > #self.JungleMinions.objects then return "laneclear" elseif #self.EnemyMinions.objects < #self.JungleMinions.objects then return "jungleclear" end return nil end function _OrbwalkManager:RegisterAfterAttackCallback(func) table.insert(self.AfterAttackCallbacks, func) end function _OrbwalkManager:TriggerAfterAttackCallback(spell) for i, func in ipairs(self.AfterAttackCallbacks) do func(spell) end end function _OrbwalkManager:OrbLoad() if self:GetOrbwalkSelected() ~= nil then if _G.Reborn_Initialised then if self:GetOrbwalkSelected() == "AutoCarry" then self.OrbLoaded = self:GetOrbwalkSelected() self:EnableMovement() self:EnableAttacks() return else _G.AutoCarry.MyHero:MovementEnabled(false) _G.AutoCarry.MyHero:AttacksEnabled(false) PrintMessage("Disabling Movement and Attacks from SAC:R because you decided to use "..self:GetOrbwalkSelected()..".") return end end if _G.Reborn_Loaded and not _G.Reborn_Initialised then DelayAction(function() self:OrbLoad() end, 1) end if self.Loaded == nil then self.Loaded = true if self:GetOrbwalkSelected() == "Pewalk" then if not _G._Pewalk then require "Pewalk" end self.OrbLoaded = self:GetOrbwalkSelected() self:EnableMovement() self:EnableAttacks() elseif self:GetOrbwalkSelected() == "SxOrbWalk" then if not _G.SxOrb then require 'SxOrbWalk' _G.SxOrb:LoadToMenu() end self.OrbLoaded = self:GetOrbwalkSelected() self:EnableMovement() self:EnableAttacks() elseif self:GetOrbwalkSelected() == "Big Fat Walk" then if not _G["BigFatOrb_Loaded"] then require "Big Fat Orbwalker" end self.OrbLoaded = self:GetOrbwalkSelected() self:EnableMovement() self:EnableAttacks() end end else _Required():Add({Name = "SxOrbWalk", Url = "raw.githubusercontent.com/Superx321/BoL/master/common/SxOrbWalk.lua"}):Check() end end function _OrbwalkManager:AddKey(t) assert(t and type(t) == "table", "OrbwalkManager: AddKey Table is invalid!") if self.KeysMenu ~= nil then local name = t.Name assert(name and type(name) == "string", "OrbwalkManager: AddKey Name is invalid!") local text = t.Text assert(text and type(text) == "string", "OrbwalkManager: AddKey Text is invalid!") local tipo = t.Type ~= nil and t.Type or SCRIPT_PARAM_ONKEYDOWN local key = t.Key assert(key and type(key) == "number", "OrbwalkManager: AddKey Key is invalid!") local mode = t.Mode assert(mode and type(mode) == "number", "OrbwalkManager: AddKey Mode is invalid!") self.KeysMenu:addDynamicParam(name, text, tipo, false, key) self.KeysMenu[name] = false self.KeyMan:RegisterKey(self.KeysMenu, name, mode) self.Register = true self.LastKeyAdded = os.clock() end end function _OrbwalkManager:ResetMove() self.AA.LastTime = self:GetTime() + self:Latency() - self:WindUpTime() end function _OrbwalkManager:ResetAA() self.AA.LastTime = self:GetTime() + self:Latency() - self:AnimationTime() self.GotReset = true if self.OrbLoaded == "AutoCarry" then _G.AutoCarry.Orbwalker:ResetAttackTimer() elseif self.OrbLoaded == "SxOrbWalk" then _G.SxOrb:ResetAA() end end function _OrbwalkManager:DisableMovement() if self.Move then if self.OrbLoaded == "AutoCarry" then _G.AutoCarry.MyHero:MovementEnabled(false) self.Move = false elseif self.OrbLoaded == "Pewalk" then _G._Pewalk.AllowMove(false) self.Move = false elseif self.OrbLoaded == "Big Fat Walk" then _G["BigFatOrb_DisableMove"] = true self.Move = false elseif self.OrbLoaded == "SxOrbWalk" then _G.SxOrb:DisableMove() self.Move = false end end end function _OrbwalkManager:EnableMovement() if not self.Move then if self.OrbLoaded == "AutoCarry" then _G.AutoCarry.MyHero:MovementEnabled(true) self.Move = true elseif self.OrbLoaded == "Pewalk" then _G._Pewalk.AllowMove(true) self.Move = true elseif self.OrbLoaded == "Big Fat Walk" then _G["BigFatOrb_DisableMove"] = false self.Move = true elseif self.OrbLoaded == "SxOrbWalk" then _G.SxOrb:EnableMove() self.Move = true end end end function _OrbwalkManager:DisableAttacks() if self.Attack then if self.OrbLoaded == "AutoCarry" then _G.AutoCarry.MyHero:AttacksEnabled(false) self.Attack = false elseif self.OrbLoaded == "Pewalk" then _G._Pewalk.AllowAttack(false) self.Attack = false elseif self.OrbLoaded == "SxOrbWalk" then _G.SxOrb:DisableAttacks() self.Attack = false elseif self.OrbLoaded == "Big Fat Walk" then _G["BigFatOrb_DisableAttacks"] = true self.Attack = false end end end function _OrbwalkManager:EnableAttacks() if not self.Attack then if self.OrbLoaded == "AutoCarry" then _G.AutoCarry.MyHero:AttacksEnabled(true) self.Attack = true elseif self.OrbLoaded == "Pewalk" then _G._Pewalk.AllowAttack(true) self.Attack = true elseif self.OrbLoaded == "Big Fat Walk" then _G["BigFatOrb_DisableAttacks"] = false self.Attack = true elseif self.OrbLoaded == "SxOrbWalk" then _G.SxOrb:EnableAttacks() self.Attack = true end end end --CLASS INITIATOR function _Initiator:__init(menu) self.Callbacks = {} self.ActiveSpells = {} assert(menu, "_Initiator: menu is invalid!") self.Menu = menu if #GetAllyHeroes() > 0 and self.Menu~=nil then for idx, ally in ipairs(GetAllyHeroes()) do self.Menu:addParam(ally.charName.."Q", ally.charName.." (Q)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(ally.charName.."W", ally.charName.." (W)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(ally.charName.."E", ally.charName.." (E)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(ally.charName.."R", ally.charName.." (R)", SCRIPT_PARAM_ONOFF, false) end self.Menu:addParam("Time", "Time Limit to Initiate", SCRIPT_PARAM_SLICE, 2.5, 0, 8, 0) if AddProcessSpellCallback then AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end) end AddTickCallback( function() if #self.ActiveSpells > 0 then for i = #self.ActiveSpells, 1, -1 do local spell = self.ActiveSpells[i] if os.clock() + Latency() - spell.Time <= self.Menu.Time then self:TriggerCallbacks(spell.Unit) else table.remove(self.ActiveSpells, i) end end end end ) end end function _Initiator:OnProcessSpell(unit, spell) if not myHero.dead and unit and spell and spell.name and not unit.isMe and unit.type and unit.team and GetDistanceSqr(myHero, unit) < 2000 * 2000 then if unit.type == myHero.type and unit.team == myHero.team and unit.charName then local spelltype = "" local spellName = tostring(spell.name) if tostring(unit:GetSpellData(_Q).name):find(spellName) then spelltype = "Q" elseif tostring(unit:GetSpellData(_W).name):find(spellName) then spelltype = "W" elseif tostring(unit:GetSpellData(_E).name):find(spellName) then spelltype = "E" elseif tostring(unit:GetSpellData(_R).name):find(spellName) then spelltype = "R" end if spelltype ~= "" then if self.Menu[tostring(unit.charName)..spelltype] then table.insert(self.ActiveSpells, {Time = os.clock() - Latency(), Unit = unit}) end end --[[ local spelltype, casttype = getSpellType(unit, spell.name) if spelltype == "Q" or spelltype == "W" or spelltype == "E" or spelltype == "R" then if self.Menu[unit.charName..spelltype] then table.insert(self.ActiveSpells, {Time = os.clock() - Latency(), Unit = unit}) end end]] end end end function _Initiator:CheckChannelingSpells() if #GetAllyHeroes() > 0 then for idx, enemy in ipairs(GetEnemyHeroes()) do if CHANELLING_SPELLS[enemy.charName] then for i, spell in pairs(CHANELLING_SPELLS[enemy.charName]) do self.Menu[enemy.charName..spell] = true end end end end return self end function _Initiator:CheckGapcloserSpells() if #GetAllyHeroes() > 0 then for idx, enemy in ipairs(GetEnemyHeroes()) do if GAPCLOSER_SPELLS[enemy.charName] then for i, spell in pairs(GAPCLOSER_SPELLS[enemy.charName]) do self.Menu[enemy.charName..spell] = true end end end end return self end function _Initiator:AddCallback(cb) table.insert(self.Callbacks, cb) return self end function _Initiator:TriggerCallbacks(unit) for i, callback in ipairs(self.Callbacks) do callback(unit) end end --CLASS EVADER function _Evader:__init(menu) assert(menu, "_Evader: menu is invalid!") self.Callbacks = {} self.ActiveSpells = {} self.Menu = menu if #GetEnemyHeroes() > 0 and self.Menu~=nil then for idx, enemy in ipairs(GetEnemyHeroes()) do self.Menu:addParam(enemy.charName.."Q", enemy.charName.." (Q)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(enemy.charName.."W", enemy.charName.." (W)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(enemy.charName.."E", enemy.charName.." (E)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(enemy.charName.."R", enemy.charName.." (R)", SCRIPT_PARAM_ONOFF, false) end self.Menu:addParam("Time", "Time Limit to Evade", SCRIPT_PARAM_SLICE, 0.7, 0, 4, 1) self.Menu:addParam("Humanizer", "% of Humanizer", SCRIPT_PARAM_SLICE, 0, 0, 100) AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end) AddTickCallback( function() if myHero.dead then return end if #self.ActiveSpells > 0 then for i = #self.ActiveSpells, 1, -1 do local sp = self.ActiveSpells[i] if os.clock() + Latency() - sp.Time <= self.Menu.Time then local unit = sp.Unit local spell = sp.Spell local spelltype = sp.SpellType self:CheckHitChampion(unit, spell, spelltype) else table.remove(self.ActiveSpells, i) end end end end ) end return self end function _Evader:OnProcessSpell(unit, spell) if unit and spell and spell.name and not unit.isMe and unit.type and unit.team and spell.windUpTime and GetDistanceSqr(myHero, unit) < 2000 * 2000 then if unit.type == myHero.type and unit.team ~= myHero.team and unit.charName then local spelltype = "" local spellName = tostring(spell.name) if tostring(unit:GetSpellData(_Q).name):find(spellName) then spelltype = "Q" elseif tostring(unit:GetSpellData(_W).name):find(spellName) then spelltype = "W" elseif tostring(unit:GetSpellData(_E).name):find(spellName) then spelltype = "E" elseif tostring(unit:GetSpellData(_R).name):find(spellName) then spelltype = "R" end if spelltype ~= "" then if self.Menu[tostring(unit.charName)..spelltype] then if spell.windUpTime * self.Menu.Humanizer/100 > 0 then DelayAction( function(unit, spell) table.insert(self.ActiveSpells, {Time = os.clock() - Latency(), Unit = unit, Spell = spell, SpellType = spelltype}) self:CheckHitChampion(unit, spell, spelltype) end , spell.windUpTime * self.Menu.Humanizer/100 , {unit, spell} ) else table.insert(self.ActiveSpells, {Time = os.clock() - Latency(), Unit = unit, Spell = spell, SpellType = spelltype}) self:CheckHitChampion(unit, spell, spelltype) end end end --[[ local spelltype, casttype = getSpellType(unit, spell.name) if spelltype == "Q" or spelltype == "W" or spelltype == "E" or spelltype == "R" then if self.Menu[unit.charName..spelltype] then DelayAction( function() table.insert(self.ActiveSpells, {Time = os.clock() - Latency(), Unit = unit, Spell = spell, SpellType = spelltype}) self:CheckHitChampion(unit, spell, spelltype) end , math.max(spell.windUpTime * self.Menu.Humanizer/100 - 2 * Latency(), 0) ) end end]] end end end function _Evader:CheckHitChampion(unit, spell, spelltype, champion) if unit and unit.charName and spell and spelltype and unit.valid then local hitchampion = false local champion = champion ~= nil and champion or myHero local charName = tostring(unit.charName) if skillData[charName] ~= nil and skillData[charName][spelltype] ~= nil then local shottype = skillData[charName][spelltype].type local radius = skillData[charName][spelltype].radius local maxdistance = skillData[charName][spelltype].maxdistance if shottype == 0 then hitchampion = spell.target and spell.target.networkID == champion.networkID or false elseif shottype == 1 then hitchampion = checkhitlinepass(unit, spell.endPos, radius, maxdistance, champion, champion.boundingRadius) elseif shottype == 2 then hitchampion = checkhitlinepoint(unit, spell.endPos, radius, maxdistance, champion, champion.boundingRadius) elseif shottype == 3 then hitchampion = checkhitaoe(unit, spell.endPos, radius, maxdistance, champion, champion.boundingRadius) elseif shottype == 4 then hitchampion = checkhitcone(unit, spell.endPos, radius, maxdistance, champion, champion.boundingRadius) elseif shottype == 5 then hitchampion = checkhitwall(unit, spell.endPos, radius, maxdistance, champion, champion.boundingRadius) elseif shottype == 6 then hitchampion = checkhitlinepass(unit, spell.endPos, radius, maxdistance, champion, champion.boundingRadius) or checkhitlinepass(unit, Vector(unit)*2-spell.endPos, radius, maxdistance, champion, champion.boundingRadius) elseif shottype == 7 then hitchampion = checkhitcone(spell.endPos, unit, radius, maxdistance, champion, champion.boundingRadius) end else if spell.target ~= nil and spell.target.networkID == champion.networkID then hitchampion = true end if spell.endPos ~= nil then local pointSegment, pointLine, isOnSegment = VectorPointProjectionOnLineSegment(Vector(unit), Vector(spell.endPos.x, unit.y, spell.endPos.y), champion) if isOnSegment and GetDistanceSqr(pointSegment, champion) < math.pow(300, 2) then hitchampion = true end end end if hitchampion then self:TriggerCallbacks(unit, spell) end end end function _Evader:CheckCC() if #GetEnemyHeroes() > 0 then for idx, enemy in ipairs(GetEnemyHeroes()) do if CC_SPELLS[enemy.charName] then for i, spell in pairs(CC_SPELLS[enemy.charName]) do self.Menu[enemy.charName..spell] = true end end end end return self end function _Evader:CheckYasuoWall() if #GetEnemyHeroes() > 0 then for idx, enemy in ipairs(GetEnemyHeroes()) do if YASUO_WALL_SPELLS[enemy.charName] then for i, spell in pairs(YASUO_WALL_SPELLS[enemy.charName]) do self.Menu[enemy.charName..spell] = true end end end end return self end function _Evader:AddCallback(cb) table.insert(self.Callbacks, cb) return self end function _Evader:TriggerCallbacks(unit, spell) for i, callback in ipairs(self.Callbacks) do callback(unit, spell) end end function _Interrupter:__init(menu) self.Callbacks = {} assert(menu, "_Interrupter: menu is invalid!") self.Menu = menu self.ActiveSpells = {} if #GetEnemyHeroes() > 0 and self.Menu~=nil then for idx, enemy in ipairs(GetEnemyHeroes()) do self.Menu:addParam(enemy.charName.."Q", enemy.charName.." (Q)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(enemy.charName.."W", enemy.charName.." (W)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(enemy.charName.."E", enemy.charName.." (E)", SCRIPT_PARAM_ONOFF, false) self.Menu:addParam(enemy.charName.."R", enemy.charName.." (R)", SCRIPT_PARAM_ONOFF, false) end self.Menu:addParam("Time", "Time Limit to Interrupt", SCRIPT_PARAM_SLICE, 2.5, 0, 8, 1) if AddProcessSpellCallback then AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end) end AddTickCallback( function() if myHero.dead then return end if #self.ActiveSpells > 0 then for i = #self.ActiveSpells, 1, -1 do local spell = self.ActiveSpells[i] if os.clock() + Latency() - spell.Time <= self.Menu.Time then self:TriggerCallbacks(spell.Unit, spell.Spell) else table.remove(self.ActiveSpells, i) end end end end ) end return self end function _Interrupter:OnProcessSpell(unit, spell) if unit and spell and spell.name and not unit.isMe and unit.type and unit.team and GetDistanceSqr(myHero, unit) < 2000 * 2000 then if unit.type == myHero.type and unit.team ~= myHero.team and unit.charName then local spelltype = "" local spellName = tostring(spell.name) if tostring(unit:GetSpellData(_Q).name):find(spellName) then spelltype = "Q" elseif tostring(unit:GetSpellData(_W).name):find(spellName) then spelltype = "W" elseif tostring(unit:GetSpellData(_E).name):find(spellName) then spelltype = "E" elseif tostring(unit:GetSpellData(_R).name):find(spellName) then spelltype = "R" end if spelltype ~= "" then if self.Menu[tostring(unit.charName)..spelltype] then table.insert(self.ActiveSpells, {Time = os.clock() - Latency(), Unit = unit, Spell = spell}) end end --[[ local spelltype, casttype = getSpellType(unit, spell.name) if spelltype == "Q" or spelltype == "W" or spelltype == "E" or spelltype == "R" then if self.Menu[unit.charName..spelltype] then end end]] end end end function _Interrupter:CheckChannelingSpells() if #GetEnemyHeroes() > 0 then for idx, enemy in ipairs(GetEnemyHeroes()) do if CHANELLING_SPELLS[enemy.charName] then for i, spell in pairs(CHANELLING_SPELLS[enemy.charName]) do self.Menu[enemy.charName..spell] = true end end end end return self end function _Interrupter:CheckGapcloserSpells() if #GetEnemyHeroes() > 0 then for idx, enemy in ipairs(GetEnemyHeroes()) do if GAPCLOSER_SPELLS[enemy.charName] then for i, spell in pairs(GAPCLOSER_SPELLS[enemy.charName]) do self.Menu[enemy.charName..spell] = true end end end end return self end function _Interrupter:AddCallback(cb) table.insert(self.Callbacks, cb) return self end function _Interrupter:TriggerCallbacks(unit, spell) for i, callback in ipairs(self.Callbacks) do callback(unit, spell) end end -- CLASS: _ScriptUpdate function _ScriptUpdate:__init(tab) assert(tab and type(tab) == "table", "_ScriptUpdate: table is invalid!") self.LocalVersion = tab.LocalVersion assert(self.LocalVersion and type(self.LocalVersion) == "number", "_ScriptUpdate: LocalVersion is invalid!") local UseHttps = tab.UseHttps ~= nil and tab.UseHttps or true local VersionPath = tab.VersionPath assert(VersionPath and type(VersionPath) == "string", "_ScriptUpdate: VersionPath is invalid!") local ScriptPath = tab.ScriptPath assert(ScriptPath and type(ScriptPath) == "string", "_ScriptUpdate: ScriptPath is invalid!") local SavePath = tab.SavePath assert(SavePath and type(SavePath) == "string", "_ScriptUpdate: SavePath is invalid!") self.VersionPath = '/BoL/TCPUpdater/GetScript'..(UseHttps and '5' or '6')..'.php?script='..self:Base64Encode(VersionPath)..'&rand='..math.random(99999999) self.ScriptPath = '/BoL/TCPUpdater/GetScript'..(UseHttps and '5' or '6')..'.php?script='..self:Base64Encode(ScriptPath)..'&rand='..math.random(99999999) self.SavePath = SavePath self.CallbackUpdate = tab.CallbackUpdate self.CallbackNoUpdate = tab.CallbackNoUpdate self.CallbackNewVersion = tab.CallbackNewVersion self.CallbackError = tab.CallbackError --AddDrawCallback(function() self:OnDraw() end) self:CreateSocket(self.VersionPath) self.DownloadStatus = 'Connect to Server for VersionInfo' AddTickCallback(function() self:GetOnlineVersion() end) end function _ScriptUpdate:print(str) print(''..os.clock()..': '..str) end function _ScriptUpdate:OnDraw() if self.DownloadStatus ~= 'Downloading Script (100%)' then end end function _ScriptUpdate:CreateSocket(url) if not self.LuaSocket then self.LuaSocket = require("socket") else self.Socket:close() self.Socket = nil self.Size = nil self.RecvStarted = false end self.Socket = self.LuaSocket.tcp() if not self.Socket then print('Socket Error') else self.Socket:settimeout(0, 'b') self.Socket:settimeout(99999999, 't') self.Socket:connect('sx-bol.eu', 80) self.Url = url self.Started = false self.LastPrint = "" self.File = "" end end function _ScriptUpdate:Base64Encode(data) local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end function _ScriptUpdate:GetOnlineVersion() if self.GotScriptVersion then return end self.Receive, self.Status, self.Snipped = self.Socket:receive(1024) if self.Status == 'timeout' and not self.Started then self.Started = true self.Socket:send("GET "..self.Url.." HTTP/1.1\r\nHost: sx-bol.eu\r\n\r\n") end if (self.Receive or (#self.Snipped > 0)) and not self.RecvStarted then self.RecvStarted = true self.DownloadStatus = 'Downloading VersionInfo (0%)' end self.File = self.File .. (self.Receive or self.Snipped) if self.File:find('') then if not self.Size then self.Size = tonumber(self.File:sub(self.File:find('')+6,self.File:find('')-1)) end if self.File:find('') then local _,ScriptFind = self.File:find('') local ScriptEnd = self.File:find('') if ScriptEnd then ScriptEnd = ScriptEnd - 1 end local DownloadedSize = self.File:sub(ScriptFind+1,ScriptEnd or -1):len() self.DownloadStatus = 'Downloading VersionInfo ('..math.round(100/self.Size*DownloadedSize,2)..'%)' end end if self.File:find('') then self.DownloadStatus = 'Downloading VersionInfo (100%)' local a,b = self.File:find('\r\n\r\n') self.File = self.File:sub(a,-1) self.NewFile = '' for line,content in ipairs(self.File:split('\n')) do if content:len() > 5 then self.NewFile = self.NewFile .. content end end local HeaderEnd, ContentStart = self.File:find('') local ContentEnd, _ = self.File:find('') if not ContentStart or not ContentEnd then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else self.OnlineVersion = (Base64Decode(self.File:sub(ContentStart + 1,ContentEnd-1))) if self.OnlineVersion ~= nil then self.OnlineVersion = tonumber(self.OnlineVersion) if self.OnlineVersion ~= nil and self.LocalVersion ~= nil and type(self.OnlineVersion) == "number" and type(self.LocalVersion) == "number" and self.OnlineVersion > self.LocalVersion then if self.CallbackNewVersion and type(self.CallbackNewVersion) == 'function' then self.CallbackNewVersion(self.OnlineVersion,self.LocalVersion) end self:CreateSocket(self.ScriptPath) self.DownloadStatus = 'Connect to Server for ScriptDownload' AddTickCallback(function() self:DownloadUpdate() end) else if self.CallbackNoUpdate and type(self.CallbackNoUpdate) == 'function' then self.CallbackNoUpdate(self.LocalVersion) end end end end self.GotScriptVersion = true end end function _ScriptUpdate:DownloadUpdate() if self.GotScriptUpdate then return end self.Receive, self.Status, self.Snipped = self.Socket:receive(1024) if self.Status == 'timeout' and not self.Started then self.Started = true self.Socket:send("GET "..self.Url.." HTTP/1.1\r\nHost: sx-bol.eu\r\n\r\n") end if (self.Receive or (#self.Snipped > 0)) and not self.RecvStarted then self.RecvStarted = true self.DownloadStatus = 'Downloading Script (0%)' end self.File = self.File .. (self.Receive or self.Snipped) if self.File:find('') then if not self.Size then self.Size = tonumber(self.File:sub(self.File:find('')+6,self.File:find('')-1)) end if self.File:find('') then local _,ScriptFind = self.File:find('') local ScriptEnd = self.File:find('') if ScriptEnd then ScriptEnd = ScriptEnd - 1 end local DownloadedSize = self.File:sub(ScriptFind+1,ScriptEnd or -1):len() self.DownloadStatus = 'Downloading Script ('..math.round(100/self.Size*DownloadedSize,2)..'%)' end end if self.File:find('') then self.DownloadStatus = 'Downloading Script (100%)' local a,b = self.File:find('\r\n\r\n') self.File = self.File:sub(a,-1) self.NewFile = '' for line,content in ipairs(self.File:split('\n')) do if content:len() > 5 then self.NewFile = self.NewFile .. content end end local HeaderEnd, ContentStart = self.NewFile:find('') local ContentEnd, _ = self.NewFile:find('') if not ContentStart or not ContentEnd then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else local newf = self.NewFile:sub(ContentStart+1,ContentEnd-1) local newf = newf:gsub('\r','') if newf:len() ~= self.Size then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end return end local newf = Base64Decode(newf) if type(load(newf)) ~= 'function' then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else local f = io.open(self.SavePath,"w+b") f:write(newf) f:close() if self.CallbackUpdate and type(self.CallbackUpdate) == 'function' then self.CallbackUpdate(self.OnlineVersion,self.LocalVersion) end end end self.GotScriptUpdate = true end end --CLASS: _KeyManager function _KeyManager:__init() self.ComboKeys = {} self.Combo = false self.HarassKeys = {} self.Harass = false self.LastHitKeys = {} self.LastHit = false self.ClearKeys = {} self.Clear = false AddTickCallback(function() self:OnTick() end) end function _KeyManager:ModePressed() if self.Combo then return ORBWALK_MODE.COMBO elseif self.Harass then return ORBWALK_MODE.HARASS elseif self.Clear then return ORBWALK_MODE.CLEAR elseif self.LastHit then return ORBWALK_MODE.LASTHIT else return ORBWALK_MODE.NONE end end function _KeyManager:IsKeyPressed(list) if #list > 0 then for i = 1, #list do if list[i] then local key = list[i] if #key > 0 then local menu = key[1] local param = key[2] if menu and param and menu[param] then return true end end end end end return false end function _KeyManager:IsComboPressed() if OrbwalkManager.KeysMenu and OrbwalkManager.KeysMenu.Common then if OrbwalkManager.OrbLoaded == "AutoCarry" then if _G.AutoCarry.Keys.AutoCarry then return true end elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then if _G.SxOrb.isFight then return true end elseif OrbwalkManager.OrbLoaded == "SOW" then if _G.SOWi.Menu.Mode0 then return true end elseif OrbwalkManager.OrbLoaded == "MMA" then if _G.MMA_IsOrbwalking() then return true end elseif OrbwalkManager.OrbLoaded == "Big Fat Walk" then if _G["BigFatOrb_Mode"] == "Combo" then return true end elseif OrbwalkManager.OrbLoaded == "NOW" then if _G.NOWi.Config.k.Combo then return true end elseif OrbwalkManager.OrbLoaded == "Pewalk" then if _G._Pewalk.GetActiveMode().Carry then return true end elseif OrbwalkManager.OrbLoaded == "S1mpleOrbWalker" then if _G.S1.aamode == "sbtw" then return true end end end return self:IsKeyPressed(self.ComboKeys) end function _KeyManager:IsHarassPressed() if OrbwalkManager.KeysMenu and OrbwalkManager.KeysMenu.Common then if OrbwalkManager.OrbLoaded == "AutoCarry" then if _G.AutoCarry.Keys.MixedMode then return true end elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then if _G.SxOrb.isHarass then return true end elseif OrbwalkManager.OrbLoaded == "SOW" then if _G.SOWi.Menu.Mode1 then return true end elseif OrbwalkManager.OrbLoaded == "MMA" then if _G.MMA_IsDualCarrying() then return true end elseif OrbwalkManager.OrbLoaded == "Big Fat Walk" then if _G["BigFatOrb_Mode"] == "Harass" then return true end elseif OrbwalkManager.OrbLoaded == "NOW" then if _G.NOWi.Config.k.Harass then return true end elseif OrbwalkManager.OrbLoaded == "Pewalk" then if _G._Pewalk.GetActiveMode().Mixed then return true end elseif OrbwalkManager.OrbLoaded == "S1mpleOrbWalker" then if _G.S1.aamode == "harass" then return true end end end return self:IsKeyPressed(self.HarassKeys) end function _KeyManager:IsClearPressed() if OrbwalkManager.KeysMenu and OrbwalkManager.KeysMenu.Common then if OrbwalkManager.OrbLoaded == "AutoCarry" then if _G.AutoCarry.Keys.LaneClear then return true end elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then if _G.SxOrb.isLaneClear then return true end elseif OrbwalkManager.OrbLoaded == "SOW" then if _G.SOWi.Menu.Mode2 then return true end elseif OrbwalkManager.OrbLoaded == "MMA" then if _G.MMA_IsLaneClearing() then return true end elseif OrbwalkManager.OrbLoaded == "Big Fat Walk" then if _G["BigFatOrb_Mode"] == "LaneClear" then return true end elseif OrbwalkManager.OrbLoaded == "NOW" then if _G.NOWi.Config.k.LaneClear then return true end elseif OrbwalkManager.OrbLoaded == "Pewalk" then if _G._Pewalk.GetActiveMode().LaneClear then return true end elseif OrbwalkManager.OrbLoaded == "S1mpleOrbWalker" then if _G.S1.aamode == "laneclear" then return true end end end return self:IsKeyPressed(self.ClearKeys) end function _KeyManager:IsLastHitPressed() if OrbwalkManager.KeysMenu and OrbwalkManager.KeysMenu.Common then if OrbwalkManager.OrbLoaded == "AutoCarry" then if _G.AutoCarry.Keys.LastHit then return true end elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then if _G.SxOrb.isLastHit then return true end elseif OrbwalkManager.OrbLoaded == "SOW" then if _G.SOWi.Menu.Mode3 then return true end elseif OrbwalkManager.OrbLoaded == "MMA" then if _G.MMA_IsLastHitting() then return true end elseif OrbwalkManager.OrbLoaded == "Big Fat Walk" then if _G["BigFatOrb_Mode"] == "LastHit" then return true end elseif OrbwalkManager.OrbLoaded == "NOW" then if _G.NOWi.Config.k.LastHit then return true end elseif OrbwalkManager.OrbLoaded == "Pewalk" then if _G._Pewalk.GetActiveMode().Farm then return true end elseif OrbwalkManager.OrbLoaded == "S1mpleOrbWalker" then if _G.S1.aamode == "lasthit" then return true end end end return self:IsKeyPressed(self.LastHitKeys) end function _KeyManager:OnTick() self.Combo = self:IsComboPressed() self.Harass = self:IsHarassPressed() self.LastHit = self:IsLastHitPressed() self.Clear = self:IsClearPressed() end function _KeyManager:RegisterKey(menu, param, mode) if mode == ORBWALK_MODE.COMBO then table.insert(self.ComboKeys, {menu, param}) elseif mode == ORBWALK_MODE.HARASS then table.insert(self.HarassKeys, {menu, param}) elseif mode == ORBWALK_MODE.CLEAR then table.insert(self.ClearKeys, {menu, param}) elseif mode == ORBWALK_MODE.LASTHIT then table.insert(self.LastHitKeys, {menu, param}) end end function _KeyManager:RegisterKeys() local list = self.ComboKeys if #list > 0 then for i = 1, #list do if list[i] then local key = list[i] if #key > 0 then local menu = key[1] local param = key[2] --menu._param[menu:getParamIndex(param)].listTable[v] if menu and param then if OrbwalkManager.OrbLoaded == "AutoCarry" then _G.AutoCarry.Keys:RegisterMenuKey(menu, param, AutoCarry.MODE_AUTOCARRY) elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then _G.SxOrb:RegisterHotKey("fight", menu, param) elseif OrbwalkManager.OrbLoaded == "MMA" then if menu._param[menu:getParamIndex(param)].key then _G.MMA_AddKey(string.char(menu._param[menu:getParamIndex(param)].key), 'Orbwalking', menu._param[menu:getParamIndex(param)].pType) end end end end end end end local list = self.HarassKeys if #list > 0 then for i = 1, #list do if list[i] then local key = list[i] if #key > 0 then local menu = key[1] local param = key[2] if menu and param then if OrbwalkManager.OrbLoaded == "AutoCarry" then _G.AutoCarry.Keys:RegisterMenuKey(menu, param, AutoCarry.MODE_MIXEDMODE) elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then _G.SxOrb:RegisterHotKey("harass", menu, param) elseif OrbwalkManager.OrbLoaded == "MMA" then if menu._param[menu:getParamIndex(param)].key then _G.MMA_AddKey(string.char(menu._param[menu:getParamIndex(param)].key), 'Orbwalking', menu._param[menu:getParamIndex(param)].pType) end end end end end end end local list = self.ClearKeys if #list > 0 then for i = 1, #list do if list[i] then local key = list[i] if #key > 0 then local menu = key[1] local param = key[2] if menu and param then if OrbwalkManager.OrbLoaded == "AutoCarry" then _G.AutoCarry.Keys:RegisterMenuKey(menu, param, AutoCarry.MODE_LANECLEAR) elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then _G.SxOrb:RegisterHotKey("laneclear", menu, param) elseif OrbwalkManager.OrbLoaded == "MMA" then if menu._param[menu:getParamIndex(param)].key then _G.MMA_AddKey(string.char(menu._param[menu:getParamIndex(param)].key), 'Laneclearing', menu._param[menu:getParamIndex(param)].pType) end end end end end end end local list = self.LastHitKeys if #list > 0 then for i = 1, #list do if list[i] then local key = list[i] if #key > 0 then local menu = key[1] local param = key[2] if menu and param then if OrbwalkManager.OrbLoaded == "AutoCarry" then _G.AutoCarry.Keys:RegisterMenuKey(menu, param, AutoCarry.MODE_LASTHIT) elseif OrbwalkManager.OrbLoaded == "SxOrbWalk" then _G.SxOrb:RegisterHotKey("lasthit", menu, param) elseif OrbwalkManager.OrbLoaded == "MMA" then if menu._param[menu:getParamIndex(param)].key then _G.MMA_AddKey(string.char(menu._param[menu:getParamIndex(param)].key), 'Lasthitting', menu._param[menu:getParamIndex(param)].pType) end end end end end end end end --CLASS: _Required function _Required:__init() self.requirements = {} self.downloading = {} return self end function _Required:Add(t) assert(t and type(t) == "table", "_Required: table is invalid!") local name = t.Name assert(name and type(name) == "string", "_Required: name is invalid!") local url = t.Url assert(url and type(url) == "string", "_Required: url is invalid!") local extension = t.Extension ~= nil and t.Extension or "lua" local usehttps = t.UseHttps ~= nil and t.UseHttps or true table.insert(self.requirements, {Name = name, Url = url, Extension = extension, UseHttps = usehttps}) return self end function _Required:Check() for i, tab in pairs(self.requirements) do local name = tab.Name local url = tab.Url local extension = tab.Extension local usehttps = tab.UseHttps if not FileExist(LIB_PATH..name.."."..extension) then PrintMessage("Downloading a required library called "..name.. ". Please wait...") local d = _Downloader(tab) table.insert(self.downloading, d) end end if #self.downloading > 0 then for i = 1, #self.downloading, 1 do local d = self.downloading[i] AddTickCallback(function() d:Download() end) end self:CheckDownloads() else for i, tab in pairs(self.requirements) do local name = tab.Name local url = tab.Url local extension = tab.Extension local usehttps = tab.UseHttps if FileExist(LIB_PATH..name.."."..extension) and extension == "lua" then require(name) end end end return self end function _Required:CheckDownloads() if #self.downloading == 0 then PrintMessage("Required libraries downloaded. Please reload with 2x F9.") else for i = 1, #self.downloading, 1 do local d = self.downloading[i] if d.GotScript then table.remove(self.downloading, i) break end end DelayAction(function() self:CheckDownloads() end, 2) end return self end function _Required:IsDownloading() return self.downloading ~= nil and #self.downloading > 0 or false end -- CLASS: _Downloader function _Downloader:__init(t) local name = t.Name local url = t.Url local extension = t.Extension ~= nil and t.Extension or "lua" local usehttps = t.UseHttps ~= nil and t.UseHttps or true self.SavePath = LIB_PATH..name.."."..extension self.ScriptPath = '/BoL/TCPUpdater/GetScript'..(usehttps and '5' or '6')..'.php?script='..self:Base64Encode(url)..'&rand='..math.random(99999999) self:CreateSocket(self.ScriptPath) self.DownloadStatus = 'Connect to Server' self.GotScript = false end function _Downloader:CreateSocket(url) if not self.LuaSocket then self.LuaSocket = require("socket") else self.Socket:close() self.Socket = nil self.Size = nil self.RecvStarted = false end self.Socket = self.LuaSocket.tcp() if not self.Socket then print('Socket Error') else self.Socket:settimeout(0, 'b') self.Socket:settimeout(99999999, 't') self.Socket:connect('sx-bol.eu', 80) self.Url = url self.Started = false self.LastPrint = "" self.File = "" end end function _Downloader:Download() if self.GotScript then return end self.Receive, self.Status, self.Snipped = self.Socket:receive(1024) if self.Status == 'timeout' and not self.Started then self.Started = true self.Socket:send("GET "..self.Url.." HTTP/1.1\r\nHost: sx-bol.eu\r\n\r\n") end if (self.Receive or (#self.Snipped > 0)) and not self.RecvStarted then self.RecvStarted = true self.DownloadStatus = 'Downloading Script (0%)' end self.File = self.File .. (self.Receive or self.Snipped) if self.File:find('') then if not self.Size then self.Size = tonumber(self.File:sub(self.File:find('')+6,self.File:find('')-1)) end if self.File:find('') then local _,ScriptFind = self.File:find('') local ScriptEnd = self.File:find('') if ScriptEnd then ScriptEnd = ScriptEnd - 1 end local DownloadedSize = self.File:sub(ScriptFind+1,ScriptEnd or -1):len() self.DownloadStatus = 'Downloading Script ('..math.round(100/self.Size*DownloadedSize,2)..'%)' end end if self.File:find('') then self.DownloadStatus = 'Downloading Script (100%)' local a,b = self.File:find('\r\n\r\n') self.File = self.File:sub(a,-1) self.NewFile = '' for line,content in ipairs(self.File:split('\n')) do if content:len() > 5 then self.NewFile = self.NewFile .. content end end local HeaderEnd, ContentStart = self.NewFile:find('') local ContentEnd, _ = self.NewFile:find('') if not ContentStart or not ContentEnd then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else local newf = self.NewFile:sub(ContentStart+1,ContentEnd-1) local newf = newf:gsub('\r','') if newf:len() ~= self.Size then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end return end local newf = Base64Decode(newf) if type(load(newf)) ~= 'function' then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else local f = io.open(self.SavePath,"w+b") f:write(newf) f:close() if self.CallbackUpdate and type(self.CallbackUpdate) == 'function' then self.CallbackUpdate(self.OnlineVersion,self.LocalVersion) end end end self.GotScript = true end end function _Downloader:Base64Encode(data) local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end -- _SimpleTS function _SimpleTargetSelector:__init(mode, range, damageType) self.TS = TargetSelector(mode, range, damageType) self.target = nil self.range = range self.Menu = nil self.multiplier = 1.2 self.selected = nil AddTickCallback(function() self:update() end) AddMsgCallback( function(msg, key) if msg == WM_LBUTTONDOWN then local best = nil for i, enemy in ipairs(GetEnemyHeroes()) do if IsValidTarget(enemy) then if GetDistanceSqr(enemy, mousePos) < math.pow(150, 2) then local p = WorldToScreen(D3DXVECTOR3(enemy.x, enemy.y, enemy.z)) if OnScreen(p.x, p.y) then if best == nil then best = enemy elseif GetPriority(best) > GetPriority(enemy) then best = enemy end end end end end if best then if self.selected and self.selected.networkID == best.networkID then print("Target Selector: " .. "New target unselected: "..tostring(best.charName).. "") self.selected = nil else print("Target Selector: " .. "New target selected: "..tostring(best.charName).. "") self.selected = best end end end end ) end function _SimpleTargetSelector:update() self.TS.range = self.range self.TS:update() self.target = self.TS.target if IsValidTarget(self.selected, self.range * self.multiplier) and self.selected.type == myHero.type then self.target = self.selected end end function _SimpleTargetSelector:AddToMenu(Menu) if Menu then Menu:addSubMenu("Target Selector Settings", "TS") self.Menu = Menu.TS self.Menu:addTS(self.TS) _Circle({Menu = self.Menu, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.target end, Range = 120, Condition = function() return ValidTarget(self.target) end, Color = {255, 255, 0, 0}, Width = 4}) _Circle({Menu = self.Menu, Name = "Range", Text = "Draw circle for Range", Range = function() return self.range end, Color = {255, 255, 0, 0}, Enable = false}) end end --CREDIT TO EXTRAGOZ local spellsFile = LIB_PATH.."missedspells.txt" local spellslist = {} local textlist = "" local spellexists = false local spelltype = "Unknown" function writeConfigsspells() local file = io.open(spellsFile, "w") if file then textlist = "return {" for i=1,#spellslist do textlist = textlist.."'"..spellslist[i].."', " end textlist = textlist.."}" if spellslist[1] ~=nil then file:write(textlist) file:close() end end end if FileExist(spellsFile) then spellslist = dofile(spellsFile) end local Others = {"Recall","recall","OdinCaptureChannel","LanternWAlly","varusemissiledummy","khazixqevo","khazixwevo","khazixeevo","khazixrevo","braumedummyvoezreal","braumedummyvonami","braumedummyvocaitlyn","braumedummyvoriven","braumedummyvodraven","braumedummyvoashe","azirdummyspell"} local Items = {"RegenerationPotion","FlaskOfCrystalWater","ItemCrystalFlask","ItemMiniRegenPotion","PotionOfBrilliance","PotionOfElusiveness","PotionOfGiantStrength","OracleElixirSight","OracleExtractSight","VisionWard","SightWard","sightward","ItemGhostWard","ItemMiniWard","ElixirOfRage","ElixirOfIllumination","wrigglelantern","DeathfireGrasp","HextechGunblade","shurelyascrest","IronStylus","ZhonyasHourglass","YoumusBlade","randuinsomen","RanduinsOmen","Mourning","OdinEntropicClaymore","BilgewaterCutlass","QuicksilverSash","HextechSweeper","ItemGlacialSpike","ItemMercurial","ItemWraithCollar","ItemSoTD","ItemMorellosBane","ItemPromote","ItemTiamatCleave","Muramana","ItemSeraphsEmbrace","ItemSwordOfFeastAndFamine","ItemFaithShaker","OdynsVeil","ItemHorn","ItemPoroSnack","ItemBlackfireTorch","HealthBomb","ItemDervishBlade","TrinketTotemLvl1","TrinketTotemLvl2","TrinketTotemLvl3","TrinketTotemLvl3B","TrinketSweeperLvl1","TrinketSweeperLvl2","TrinketSweeperLvl3","TrinketOrbLvl1","TrinketOrbLvl2","TrinketOrbLvl3","OdinTrinketRevive","RelicMinorSpotter","RelicSpotter","RelicGreaterLantern","RelicLantern","RelicSmallLantern","ItemFeralFlare","trinketorblvl2","trinketsweeperlvl2","trinkettotemlvl2","SpiritLantern","RelicGreaterSpotter"} local MSpells = {"JayceStaticField","JayceToTheSkies","JayceThunderingBlow","Takedown","Pounce","Swipe","EliseSpiderQCast","EliseSpiderW","EliseSpiderEInitial","elisespidere","elisespideredescent","gnarbigq","gnarbigw","gnarbige","GnarBigQMissile"} local PSpells = {"CaitlynHeadshotMissile","RumbleOverheatAttack","JarvanIVMartialCadenceAttack","ShenKiAttack","MasterYiDoubleStrike","sonaqattackupgrade","sonawattackupgrade","sonaeattackupgrade","NocturneUmbraBladesAttack","NautilusRavageStrikeAttack","ZiggsPassiveAttack","QuinnWEnhanced","LucianPassiveAttack","SkarnerPassiveAttack","KarthusDeathDefiedBuff","AzirTowerClick","azirtowerclick","azirtowerclickchannel"} local QSpells = {"TrundleQ","LeonaShieldOfDaybreakAttack","XenZhaoThrust","NautilusAnchorDragMissile","RocketGrabMissile","VayneTumbleAttack","VayneTumbleUltAttack","NidaleeTakedownAttack","ShyvanaDoubleAttackHit","ShyvanaDoubleAttackHitDragon","frostarrow","FrostArrow","MonkeyKingQAttack","MaokaiTrunkLineMissile","FlashFrostSpell","xeratharcanopulsedamage","xeratharcanopulsedamageextended","xeratharcanopulsedarkiron","xeratharcanopulsediextended","SpiralBladeMissile","EzrealMysticShotMissile","EzrealMysticShotPulseMissile","jayceshockblast","BrandBlazeMissile","UdyrTigerAttack","TalonNoxianDiplomacyAttack","LuluQMissile","GarenSlash2","VolibearQAttack","dravenspinningattack","karmaheavenlywavec","ZiggsQSpell","UrgotHeatseekingHomeMissile","UrgotHeatseekingLineMissile","JavelinToss","RivenTriCleave","namiqmissile","NasusQAttack","BlindMonkQOne","ThreshQInternal","threshqinternal","QuinnQMissile","LissandraQMissile","EliseHumanQ","GarenQAttack","JinxQAttack","JinxQAttack2","yasuoq","xeratharcanopulse2","VelkozQMissile","KogMawQMis","BraumQMissile","KarthusLayWasteA1","KarthusLayWasteA2","KarthusLayWasteA3","karthuslaywastea3","karthuslaywastea2","karthuslaywastedeada1","MaokaiSapling2Boom","gnarqmissile","GnarBigQMissile","viktorqbuff"} local WSpells = {"KogMawBioArcaneBarrageAttack","SivirWAttack","TwitchVenomCaskMissile","gravessmokegrenadeboom","mordekaisercreepingdeath","DrainChannel","jaycehypercharge","redcardpreattack","goldcardpreattack","bluecardpreattack","RenektonExecute","RenektonSuperExecute","EzrealEssenceFluxMissile","DariusNoxianTacticsONHAttack","UdyrTurtleAttack","talonrakemissileone","LuluWTwo","ObduracyAttack","KennenMegaProc","NautilusWideswingAttack","NautilusBackswingAttack","XerathLocusOfPower","yoricksummondecayed","Bushwhack","karmaspiritbondc","SejuaniBasicAttackW","AatroxWONHAttackLife","AatroxWONHAttackPower","JinxWMissile","GragasWAttack","braumwdummyspell","syndrawcast","SorakaWParticleMissile"} local ESpells = {"KogMawVoidOozeMissile","ToxicShotAttack","LeonaZenithBladeMissile","PowerFistAttack","VayneCondemnMissile","ShyvanaFireballMissile","maokaisapling2boom","VarusEMissile","CaitlynEntrapmentMissile","jayceaccelerationgate","syndrae5","JudicatorRighteousFuryAttack","UdyrBearAttack","RumbleGrenadeMissile","Slash","hecarimrampattack","ziggse2","UrgotPlasmaGrenadeBoom","SkarnerFractureMissile","YorickSummonRavenous","BlindMonkEOne","EliseHumanE","PrimalSurge","Swipe","ViEAttack","LissandraEMissile","yasuodummyspell","XerathMageSpearMissile","RengarEFinal","RengarEFinalMAX","KarthusDefileSoundDummy2"} local RSpells = {"Pantheon_GrandSkyfall_Fall","LuxMaliceCannonMis","infiniteduresschannel","JarvanIVCataclysmAttack","jarvanivcataclysmattack","VayneUltAttack","RumbleCarpetBombDummy","ShyvanaTransformLeap","jaycepassiverangedattack", "jaycepassivemeleeattack","jaycestancegth","MissileBarrageMissile","SprayandPrayAttack","jaxrelentlessattack","syndrarcasttime","InfernalGuardian","UdyrPhoenixAttack","FioraDanceStrike","xeratharcanebarragedi","NamiRMissile","HallucinateFull","QuinnRFinale","lissandrarenemy","SejuaniGlacialPrisonCast","yasuordummyspell","xerathlocuspulse","tempyasuormissile","PantheonRFall"} local casttype2 = {"blindmonkqtwo","blindmonkwtwo","blindmonketwo","infernalguardianguide","KennenMegaProc","sonawattackupgrade","redcardpreattack","fizzjumptwo","fizzjumpbuffer","gragasbarrelrolltoggle","LeblancSlideM","luxlightstriketoggle","UrgotHeatseekingHomeMissile","xeratharcanopulseextended","xeratharcanopulsedamageextended","XenZhaoThrust3","ziggswtoggle","khazixwlong","khazixelong","renektondice","SejuaniNorthernWinds","shyvanafireballdragon2","shyvanaimmolatedragon","ShyvanaDoubleAttackHitDragon","talonshadowassaulttoggle","viktorchaosstormguide","zedw2","ZedR2","khazixqlong","AatroxWONHAttackLife","viktorqbuff"} local casttype3 = {"sonaeattackupgrade","bluecardpreattack","LeblancSoulShackleM","UdyrPhoenixStance","RenektonSuperExecute"} local casttype4 = {"FrostShot","PowerFist","DariusNoxianTacticsONH","EliseR","JaxEmpowerTwo","JaxRelentlessAssault","JayceStanceHtG","jaycestancegth","jaycehypercharge","JudicatorRighteousFury","kennenlrcancel","KogMawBioArcaneBarrage","LissandraE","MordekaiserMaceOfSpades","mordekaisercotgguide","NasusQ","Takedown","NocturneParanoia","QuinnR","RengarQ","HallucinateFull","DeathsCaressFull","SivirW","ThreshQInternal","threshqinternal","PickACard","goldcardlock","redcardlock","bluecardlock","FullAutomatic","VayneTumble","MonkeyKingDoubleAttack","YorickSpectral","ViE","VorpalSpikes","FizzSeastonePassive","GarenSlash3","HecarimRamp","leblancslidereturn","leblancslidereturnm","Obduracy","UdyrTigerStance","UdyrTurtleStance","UdyrBearStance","UrgotHeatseekingMissile","XenZhaoComboTarget","dravenspinning","dravenrdoublecast","FioraDance","LeonaShieldOfDaybreak","MaokaiDrain3","NautilusPiercingGaze","RenektonPreExecute","RivenFengShuiEngine","ShyvanaDoubleAttack","shyvanadoubleattackdragon","SyndraW","TalonNoxianDiplomacy","TalonCutthroat","talonrakemissileone","TrundleTrollSmash","VolibearQ","AatroxW","aatroxw2","AatroxWONHAttackLife","JinxQ","GarenQ","yasuoq","XerathArcanopulseChargeUp","XerathLocusOfPower2","xerathlocuspulse","velkozqsplitactivate","NetherBlade","GragasQToggle","GragasW","SionW","sionpassivespeed"} local casttype5 = {"VarusQ","ZacE","ViQ","SionQ"} local casttype6 = {"VelkozQMissile","KogMawQMis","RengarEFinal","RengarEFinalMAX","BraumQMissile","KarthusDefileSoundDummy2","gnarqmissile","GnarBigQMissile","SorakaWParticleMissile"} --,"PoppyDevastatingBlow"--,"Deceive" -- ,"EliseRSpider" function getSpellType(unit, spellName) spelltype = "Unknown" casttype = 1 if unit ~= nil and unit.type == "AIHeroClient" then if spellName == nil or unit:GetSpellData(_Q).name == nil or unit:GetSpellData(_W).name == nil or unit:GetSpellData(_E).name == nil or unit:GetSpellData(_R).name == nil then return "Error name nil", casttype end if spellName:find("SionBasicAttackPassive") or spellName:find("zyrapassive") then spelltype = "P" elseif (spellName:find("BasicAttack") and spellName ~= "SejuaniBasicAttackW") or spellName:find("basicattack") or spellName:find("JayceRangedAttack") or spellName == "SonaQAttack" or spellName == "SonaWAttack" or spellName == "SonaEAttack" or spellName == "ObduracyAttack" or spellName == "GnarBigAttackTower" then spelltype = "BAttack" elseif spellName:find("CritAttack") or spellName:find("critattack") then spelltype = "CAttack" elseif unit:GetSpellData(_Q).name:find(spellName) then spelltype = "Q" elseif unit:GetSpellData(_W).name:find(spellName) then spelltype = "W" elseif unit:GetSpellData(_E).name:find(spellName) then spelltype = "E" elseif unit:GetSpellData(_R).name:find(spellName) then spelltype = "R" elseif spellName:find("Summoner") or spellName:find("summoner") or spellName == "teleportcancel" then spelltype = "Summoner" else if spelltype == "Unknown" then for i=1,#Others do if spellName:find(Others[i]) then spelltype = "Other" end end end if spelltype == "Unknown" then for i=1,#Items do if spellName:find(Items[i]) then spelltype = "Item" end end end if spelltype == "Unknown" then for i=1,#PSpells do if spellName:find(PSpells[i]) then spelltype = "P" end end end if spelltype == "Unknown" then for i=1,#QSpells do if spellName:find(QSpells[i]) then spelltype = "Q" end end end if spelltype == "Unknown" then for i=1,#WSpells do if spellName:find(WSpells[i]) then spelltype = "W" end end end if spelltype == "Unknown" then for i=1,#ESpells do if spellName:find(ESpells[i]) then spelltype = "E" end end end if spelltype == "Unknown" then for i=1,#RSpells do if spellName:find(RSpells[i]) then spelltype = "R" end end end end for i=1,#MSpells do if spellName == MSpells[i] then spelltype = spelltype.."M" end end local spellexists = spelltype ~= "Unknown" if #spellslist > 0 and not spellexists then for i=1,#spellslist do if spellName == spellslist[i] then spellexists = true end end end if not spellexists then table.insert(spellslist, spellName) --writeConfigsspells() -- PrintChat("Skill Detector - Unknown spell: "..spellName) end end for i=1,#casttype2 do if spellName == casttype2[i] then casttype = 2 end end for i=1,#casttype3 do if spellName == casttype3[i] then casttype = 3 end end for i=1,#casttype4 do if spellName == casttype4[i] then casttype = 4 end end for i=1,#casttype5 do if spellName == casttype5[i] then casttype = 5 end end for i=1,#casttype6 do if spellName == casttype6[i] then casttype = 6 end end return spelltype, casttype end if _G.SimpleLibLoaded == nil then SpellManager = _SpellManager() Prediction = _Prediction() CircleManager = _CircleManager() AutoSmite = _AutoSmite() OrbwalkManager = _OrbwalkManager() if _Required():Add({Name = "VPrediction", Url = "raw.githubusercontent.com/SidaBoL/Scripts/master/Common/VPrediction.lua"}):Check():IsDownloading() then return end DelayAction(function() CheckUpdate() end, 1) YasuoWall = nil for i, enemy in ipairs(GetEnemyHeroes()) do EnemiesInGame[tostring(enemy.charName)] = true end if EnemiesInGame["Yasuo"] then --[[ AddProcessSpellCallback( function(unit, spell) if myHero.dead then return end if unit and spell and spell.name and unit.type == myHero.type and unit.charName then if tostring(unit.charName):lower():find("yasuo") and tostring(spell.name):lower():find("yasuow") then YasuoWall = {StartVector = Vector(unit), EndVector = Vector(spell.endPos.x, unit.y, spell.endPos.z)} DelayAction(function() YasuoWall = nil end, 4.5) end end end ) AddCreateObjCallback( function(obj) if obj and obj.name and obj.valid then if tostring(obj.name):lower():find("yasuo_base_w_windwall") and not tostring(obj.name):lower():find("activate") then if YasuoWall ~= nil then YasuoWall.Object = obj end end end end ) AddDeleteObjCallback( function(obj) if obj and obj.name then if tostring(obj.name):lower():find("yasuo_base_w_windwall") and not tostring(obj.name):lower():find("activate") then if YasuoWall ~= nil then YasuoWall = nil end end end end )]] end _G.SimpleLibLoaded = true end