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