if myHero.charName ~= "Sona" then return end local version = "1.05" local enemyHeroes = GetEnemyHeroes() local basePos = {[100] = Vector(2088, 0, 2222), [200] = Vector(12759, 0, 12861)} function OnLoad() Variables() Menu() ScriptPrint("Version "..version.." Loaded") end function OnTick() if Sona == nil then return end Target = GetTarget(1050) qTarget = GetTarget(850) if exhaust then eTarget = GetTarget(650) end checkPressed() tickChecks() end function OnDraw() if AARange == nil then return end if Sona.Draws.Rbox then drawUlt() end if Target then DrawCircle3D(Target.x, Target.y, Target.z, 20, 2, ARGB(255, 0, 0, 255)) end drawRange() end function ScriptPrint(msg) print("Poke Machine Sona: " .. msg) end function DebugPrint(msg) if Sona.Sett.Debug then print("Debug: " .. msg) end end function Menu() Sona = scriptConfig("Poke Machine Sona", "SonaLOL") if Sona.button then Sona.button = false end Sona:addSubMenu("Settings!", "Sett") Sona.Sett:addParam("info22","General Settings", SCRIPT_PARAM_INFO, "") Sona.Sett:addParam("Orb", "Enable Orbwalk", SCRIPT_PARAM_ONOFF, true) Sona.Sett:addParam("info22","", SCRIPT_PARAM_INFO, "") Sona.Sett:addParam("info22", "Harass Settings", SCRIPT_PARAM_INFO, "") Sona.Sett:addParam("HarassMana", "Do not use Q if mana % is < ", SCRIPT_PARAM_SLICE, 30, 0, 100, 1) Sona.Sett:addParam("WMana", "Do not use W if mana % is < ", SCRIPT_PARAM_SLICE, 20, 0, 100, 1) Sona.Sett:addParam("WH", "Heal if attacked and health <", SCRIPT_PARAM_SLICE, 70, 0, 100, 1) Sona.Sett:addParam("fast", "Get to lane faster", SCRIPT_PARAM_ONOFF, true) Sona:addSubMenu("Drawings","Draws") Sona.Draws:addParam("AA", "Draw AA Range", SCRIPT_PARAM_ONOFF, true) Sona.Draws:addParam("Q", "Draw Q Range", SCRIPT_PARAM_ONOFF, true) Sona.Draws:addParam("R", "Draw R Range", SCRIPT_PARAM_ONOFF, false) Sona.Draws:addParam("Rbox", "Draw R Range", SCRIPT_PARAM_ONOFF, true) Sona:addSubMenu("Key Bindings","Binds") Sona.Binds:addParam("Combo", "Combo", SCRIPT_PARAM_ONKEYDOWN, false, 32) Sona.Binds:addParam("Panic", "Panic Ult", SCRIPT_PARAM_ONKEYDOWN, false, GetKey("T")) Sona.Binds:addParam("Flee", "Flee Key", SCRIPT_PARAM_ONKEYDOWN, false, GetKey("G")) Sona.Binds:addParam("Harass", "Harass", SCRIPT_PARAM_ONKEYDOWN, false, GetKey("C")) if exhaust then Sona.Binds:addParam("exh", "Exhaust", SCRIPT_PARAM_ONKEYDOWN, false, exhaust.key) end Sona:addParam("info22","", SCRIPT_PARAM_INFO, "") Sona:addParam("info22","Ultimate Settings", SCRIPT_PARAM_INFO, "") Sona:addParam("button", "Click For Ult Info", SCRIPT_PARAM_ONOFF, false) Sona.button = false Sona:addParam("comboMinEnemies", "Min Combo Ult", SCRIPT_PARAM_SLICE, 2, 1, 5, 1) Sona:addParam("autoMinEnemies", "Min Auto Ult", SCRIPT_PARAM_SLICE, 3, 1, 5, 1) end function GetTarget(range) local tH, hp = nil, 1000000 for index, h in pairs(enemyHeroes) do if h and not h.isMe and h.team ~= myHero.team and h.visible and not h.dead and h.health > 0 and d(h.pos, myHero.pos) < range * 0.95 and h.health < hp then tH = h hp = h.health end end return tH end function PopUp() ScriptPrint("Panic Ult Key will ult the highest priority target in range. Great for flash ulting or getting an assassin that pops out.") end function OnNewPath(unit, startPos, endPos, isDash, dashSpeed, dashGravity, dashDistance) if unit.isMe and Sona.Sett.fast then DelayAction(function() if SpellEready and GetInGameTimer() < 1400 then if InFountain() and GetDistance(myHero.endPath) > 2000 then CastSpell(2) elseif GetGame().map.shortName == "summonerRift" and GetDistance(basePos[myHero.team]) < 2000 and GetDistance(myHero.endPath) > 4000 then CastSpell(2) end end end, 1) end end function Variables() SpellQ = { range = 845, delay = 0.02, speed = 1500, width = nil, ready = false, pos = nil, dmg = 0 } SpellR = { range = 1000, delay = 0.1, speed = 2400, width = 140, ready = false, pos = nil, dmg = 0 } --[[if myHero:GetSpellData(4).name:find("exhaust") then exhaust = { slot = 4, key = GetKey("D"), range = 650, ready = false } elseif myHero:GetSpellData(5).name:find("exhaust") then exhaust = { slot = 5, key = GetKey("F"), range = 650, ready = false } end]] end function tickChecks() AARange = myHero.range + myHero.boundingRadius SpellQ.ready = (myHero:CanUseSpell(0) == 0) SpellWready = (myHero:CanUseSpell(1) == 0) SpellEready = (myHero:CanUseSpell(2) == 0) SpellR.ready = (myHero:CanUseSpell(3) == 0) if exhaust ~= nil then if exhaust.slot ~= nil then exhaust.ready = (myHero:CanUseSpell(exhaust.slot) == 0) end end if not Sona.Binds.Combo then CastR(Target, Sona.autoMinEnemies) end if Sona.button then PopUp() Sona.button = false end end function checkPressed() if Sona.Binds.Combo then Combo(Target) elseif Sona.Binds.Harass then Harass(qTarget) end Flee() if exhaust then if Sona.Binds.exh then exhFunction(eTarget) end end if Sona.Binds.Panic then CastR(Target, 1) end end function drawUlt() if not SpellR.ready then return false end if Target and DrawRec then DrawRec() DrawRec = nil end end function drawRange() if not myHero.dead then if Sona.Draws.AA then DrawCircle3D(myHero.pos.x, myHero.pos.y, myHero.pos.z, AARange, 2, ARGB(80, 32,178,100)) end if Sona.Draws.Q and SpellQ.ready then DrawCircle3D(myHero.pos.x, myHero.pos.y, myHero.pos.z, SpellQ.range, 2, ARGB(255,0,128,255)) end if Sona.Draws.R and SpellR.ready then DrawCircle3D(myHero.pos.x, myHero.pos.y, myHero.pos.z, SpellR.range, 2, ARGB(255, 230,230,170)) end end end function exhFunction(unit) myHero:MoveTo(mousePos.x, mousePos.z) if ValidTarget(unit) and exhaust.ready then DebugPrint(tostring(exhaust.slot).." Trying to exhaust "..tostring(unit.charName)) CastSpell(exhaust.slot, unit) end end function Combo(unit) --sbtw Walk() if unit then Attack(GetTarget(AARange+65)) CastR(unit, Sona.comboMinEnemies) CastQ(qTarget) end end function Flee() if Sona.Binds.Flee then if SpellEready then CastSpell(2) end local slot = CheckItem("itemwraithcollar") if slot then CastSpell(slot) end end end function CheckItem(ItemName) for i = 6, 12 do local item = myHero:GetSpellData(i).name if item and item:lower() == ItemName then if myHero:CanUseSpell(i) == 0 then return i end end end end function Harass(unit) Walk() if unit then Attack(GetTarget(AARange+65)) if (myHero.mana/myHero.maxMana)*100 < tonumber(Sona.Sett.HarassMana) then return false end CastQ(unit) end end function CastQ(unit) if not ValidTarget(unit) or not SpellQ.ready or d(myHero.pos, unit.pos) >= SpellQ.range - 3 then return false end CastSpell(0) end function CastR(unit, count) count = tonumber(count) if not ValidTarget(unit) or not SpellR.ready or d(myHero.pos, unit.pos) >= SpellR.range + 100 then return false end local pos = prediction(unit, SpellR.delay, SpellR.speed) if CountEnemiesInUlt(myHero.pos, pos) >= count then CastSpell(3, pos.x, pos.z) end end function prediction(unit, delay, speed) assert(unit, "Prediction:Prediction -> unit can't be nil") if unit.hasMovePath then local pathPot = (unit.ms*((GetDistance(unit.pos)/speed)+delay))*.99 for i = unit.path.curPath, unit.path.count do local pStart = i == unit.path.curPath and unit.pos or unit.path:Path(i-1) local pEnd = unit.path:Path(i) local iPathDist = d(pStart, pEnd) if pathPot > iPathDist then pathPot = pathPot-iPathDist else local v = Vector(pStart) + (Vector(pEnd) - Vector(pStart)):normalized()* pathPot return v, 2 end end return unit.path.endPath, 1 end return unit.path.endPath, 2 end function CountEnemiesInUlt(startPos, endPos) local count = 0 for _, enemy in ipairs(enemyHeroes) do if not enemy.dead and enemy.visible then local pos = prediction(enemy, SpellR.delay, SpellR.speed) if Rectangle(startPos, endPos, enemy.pos) then count = count + 1 end end end DebugPrint("Count: "..tostring(count)) return count end function Rectangle(startPos, endPos, unitpos) local realEndPos = Vector(startPos) + (Vector(endPos) - Vector(startPos)):normalized()*SpellR.range local x2, y2 = realEndPos.x, realEndPos.z local x1, y1 = startPos.x, startPos.z local o = { x = -(y2 - y1), y = x2 - x1 } local len = math.sqrt((o.x * o.x) + (o.y * o.y)) local p = (SpellR.width)*2 o.x, o.y = o.x / len * p / 2, o.y / len * p / 2 local p1 = D3DXVECTOR2(x1 + o.x, y1 + o.y) local p2 = D3DXVECTOR2(x1 - o.x, y1 - o.y) local p3 = D3DXVECTOR2(x2 - o.x, y2 - o.y) local p4 = D3DXVECTOR2(x2 + o.x, y2 + o.y) DrawRec = function() DrawLineBorder3D(startPos.x, startPos.y, startPos.z, realEndPos.x, realEndPos.y, realEndPos.z, SpellR.width*2, ARGB(255, 255, 255, 0), 4) end local points = { p1, p2, p3, p4 } polygon = Polygon(Point(points[1].x, points[1].y), Point(points[2].x, points[2].y), Point(points[3].x, points[3].y), Point(points[4].x, points[4].y)) return polygon:contains(Point(unitpos.x, unitpos.z)) end function ValidTarget(object, distance, enemyTeam) if object and object.valid and not object.dead and object.visible then return true end end local BaseWindUpTime = 3 local BaseAnimationTime = 0.65 local LastAA = 0 function OnAnimation(unit, action) if unit.isMe then --print(action) if action:lower():find("attack") or action:lower():find("crit") then LastAA = os.clock() end end end function OnProcessSpell(unit, spell) if spell.name:lower():find("attack") then --kOrbwalk if unit.isMe then BaseAnimationTime = 1 / (spell.animationTime * myHero.attackSpeed) BaseWindUpTime = 1 / (spell.windUpTime * myHero.attackSpeed) end end if spell.target and spell.target == myHero and unit.team ~= myHero.team then if not SpellWready or (myHero.mana/myHero.maxMana)*100 < tonumber(Sona.Sett.WMana) or (myHero.health/myHero.maxHealth)*100 > tonumber(Sona.Sett.WH)then return false end if Sona.Binds.Combo or Sona.Binds.Harass then if myHero.health/myHero.maxHealth < 0.8 and d(unit.pos, myHero.pos) < 850 then CastSpell(1) end end end end function Walk() if Sona.Sett.Orb and CanMove() then if d(mousePos, myHero.pos) < 2500 then myHero:MoveTo(mousePos.x, mousePos.z) else local MouseMove = Vector(myHero.x, myHero.y, myHero.z) + (Vector(mousePos.x, mousePos.y, mousePos.z) - Vector(myHero.x, myHero.y, myHero.z)):normalized() * 500 myHero:MoveTo(MouseMove.x, MouseMove.z) end end end function Attack(unit) if Sona.Sett.Orb and ValidTarget(unit, AARange) and CanAttack() then myHero:Attack(unit) --LastAA = os.clock() + GetWindUpTime() + (GetLatency()/1000) end end function CanMove() if os.clock() > ((LastAA or 0) + GetWindUpTime()) then return true else return false end end function CanAttack() if os.clock() > ((LastAA or 0) + GetAnimationTime() - (GetLatency()/1000)) then return true else return false end end function GetWindUpTime() local k = 1 / (myHero.attackSpeed * BaseWindUpTime) --print(k) return k end function GetAnimationTime() return 1 / (myHero.attackSpeed * BaseAnimationTime) end function d(p1, p2) return GetDistance(p1, p2) end