Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[ Ultimate Lee Sin 1.5.2 by HeX
- Hot Keys:
- -Basic Combo: Space
- -Use ultimate in combo: C
- -Ward Jump: G
- -Jump Shield Combo: T
- -Ult Closest Enemy: X
- Features:
- -Basic Combo: Items-> Q-> Q-> AA-> E-> AA-> E
- -Full Combo(With Use Ulti in combo activated): Items-> Q-> R-> Q-> AA-> E-> AA-> E
- -Jump Shield Combo: Q-> Q-> W(To nearby minion or champion, champions should be priority)
- -Ultimate Closest Enemy.
- -Use ulti in combo ON/OFF option in ingame menu
- -Can now toggle Minion Collision
- -Mark killable target with a combo
- -Target configuration, Press shift to configure
- -Auto ignite and/or Ulti killable enemy ON/OFF option in ingame menu
- -Ward Jump (Ruby Sight Stone, Sight Stone, Green Wards, Pink Wards, Wriggles)
- -Ward Jump more responsive
- -Item Support: Blade of the Ruined King, Bligewater Cutlass, Tiamat, Ravenous Hydra, Randuin's Omen.
- Explanation of the marks:
- -Green circle: Your current target.
- -Blue circle: Killed with a combo, if all the skills were available.
- -Red circle: Killed using Items + 2 Attacks + Q + E + R + Ignite(if available).
- -2 Red circles: Killed using Items + 1 Attack + Q + Ignite(if available).
- -3 Red circles: Killed using R.
- To-Do:
- -Auto Ultimate on champions with GA, Zilean ult, Tryndamere ult, Kayle Ult, Spell Shields.
- ]]
- --[[=====================================Settings==========================================]]--
- if myHero.charName ~= "LeeSin" then return end
- --[[Locals]]--
- local attackrange = 130
- local qrange = 975
- local qwidth = 75 -- Increase if Q is hitting creep with collision ON.
- local ultirange = 375
- local wrange = 700
- local waittxt = {}
- local floattext = {"Skills on cooldown.","Killable","Easy kill","Ultimate him!"}
- local killable = {}
- local calculationenemy = 1
- local ignite = nil
- local BRKid, BWCid, TMTid, RAHid, RNDid = 3153, 3144, 3077, 3074, 3143
- local BRKSlot, DFGSlot, HXGSlot, BWCSlot, TMTSlot, RAHSlot, RNDSlot = nil, nil, nil, nil, nil, nil, nil
- local QREADY, WREADY, EREADY, RREADY, IREADY = false, false, false, false, false
- --[[Q Prediction]]--
- local delay = 250
- local qspeed = 1.5
- local travelDuration = 0
- local enemyMinions = {}
- local rCast = false
- --[[Auto Attacks]]--
- local lastBasicAttack = 0
- local swingDelay = 0.25
- local swing = 0
- --[[Q Dodge]]--
- local dodgeMinions = {}
- local qDelay = nil
- local qCast = false
- local dodgeMinion = nil
- local dodgeHero = nil
- local wDelay = 0
- local qMultiplier = 1.1 --Increase if Q-Shield combo is too fast
- --[[Ward Jump]]--
- local myObjectsTable = {}
- local wardRange = 600
- local jumpDelay = 0
- local lastJump = 0
- local SWard, VWard, SStone, RSStone, Wriggles = 2044, 2043, 2049, 2045, 3154
- local SWardSlot, VWardSlot, SStoneSlot, RSStoneSlot, WrigglesSlot = nil, nil, nil, nil, nil
- local jumpReady = false
- local jumpSlot = _W
- local jumpRange = 700
- local flashRange = 540
- local player = GetMyHero()
- --[[=====================================Script Config=====================================]]--
- function OnLoad()
- PrintChat("<font color='#CCCCCC'> >> Ultimate Lee Sin 1.5.2 loaded! <<</font>")
- LeeSinConfig = scriptConfig("LeeSin Config", "LeeSincombo")
- LeeSinConfig:addParam("scriptActive", "Combo", SCRIPT_PARAM_ONKEYDOWN, false, 32)
- LeeSinConfig:addParam("wardjump", "Ward Jump", SCRIPT_PARAM_ONKEYDOWN, false, 71)
- LeeSinConfig:addParam("qDodge", "Jump Shield Combo", SCRIPT_PARAM_ONKEYDOWN, false, 84)
- LeeSinConfig:addParam("rClose", "Ult Closest Enemy", SCRIPT_PARAM_ONKEYDOWN, false, 88)
- LeeSinConfig:addParam("drawcirclesEnemy", "DrawCircles - Enemies", SCRIPT_PARAM_ONOFF, false)
- LeeSinConfig:addParam("drawcirclesSelf", "DrawCircles - Self", SCRIPT_PARAM_ONOFF, false)
- LeeSinConfig:addParam("drawtext", "DrawText - Enemies", SCRIPT_PARAM_ONOFF, true)
- LeeSinConfig:addParam("useUlti", "Use Ult in combo", SCRIPT_PARAM_ONKEYTOGGLE, false, 67)
- LeeSinConfig:addParam("autoult", "Ult when killable", SCRIPT_PARAM_ONOFF, false)
- LeeSinConfig:addParam("autoignite", "Auto Ignite", SCRIPT_PARAM_ONOFF, true)
- LeeSinConfig:addParam("checkCollision", "Use minion collision", SCRIPT_PARAM_ONOFF, true)
- LeeSinConfig:permaShow("scriptActive")
- LeeSinConfig:permaShow("wardjump")
- LeeSinConfig:permaShow("qDodge")
- LeeSinConfig:permaShow("useUlti")
- LeeSinConfig:permaShow("autoult")
- for i = 0, objManager.maxObjects, 1 do
- local object = objManager:GetObject(i)
- if objectIsValid(object) then table.insert(myObjectsTable, object) end
- end
- for k = 1, objManager.maxObjects, 1 do
- local dMinion = objManager:getObject(k)
- if dMinion ~= nil and dMinion.dead ~= true and dMinion.name:find("Minion_") and dMinion.team == myHero.team then
- table.insert(dodgeMinions, dMinion)
- end
- end
- for i = 0, objManager.maxObjects, 1 do
- local object = objManager:GetObject(i)
- if CollisionCheck(object) then table.insert(enemyMinions, object) end
- end
- if myHero:GetSpellData(SUMMONER_1).name:find("SummonerDot") then ignite = SUMMONER_1
- elseif myHero:GetSpellData(SUMMONER_2).name:find("SummonerDot") then ignite = SUMMONER_2
- end
- for i=1, heroManager.iCount do waittxt[i] = i*3 end
- ts = TargetSelector(TARGET_LOW_HP,1250,DAMAGE_PHYSICAL)
- ts.name = "LeeSin"
- LeeSinConfig:addTS(ts)
- end
- --[[Basic Functions]]--
- --[[======================================Debug Functions==================================]]--
- function OnProcessSpell(unit, spell)
- if unit.isMe and (spell.name:find("Attack") ~= nil) then
- swing = 1
- lastBasicAttack = os.clock()
- end
- end
- --[[====================================Closest Enemy Check================================]]--
- --[[---------------------------------------Close Check-------------------------------------]]--
- function findClosestEnemy()
- local closestEnemy = nil
- local currentEnemy = nil
- for i=1, heroManager.iCount do
- currentEnemy = heroManager:GetHero(i)
- if currentEnemy.team ~= myHero.team and not currentEnemy.dead and currentEnemy.visible then
- if closestEnemy == nil then
- closestEnemy = currentEnemy
- elseif GetDistance(currentEnemy) < GetDistance(closestEnemy) then
- closestEnemy = currentEnemy
- end
- end
- end
- return closestEnemy
- end
- --[[=====================================Ward Jump Checks==================================]]--
- --[[-------------------------------------Ward Check----------------------------------------]]--
- function objectIsValid(object)
- return object and object.valid and (string.find(object.name, "Ward") ~= nil or string.find(object.name, "Wriggle") ~= nil)
- end
- --[[-------------------------------------Jump Function-------------------------------------]]--
- function jumpNowAlready()
- if jumpReady == true then
- for i,object in ipairs(myObjectsTable) do
- if object ~= nil and object.valid and math.sqrt((object.x-mousePos.x)^2+(object.z-mousePos.z)^2) < 150 then
- CastSpell(jumpSlot, object)
- jumpReady = false
- end
- end
- end
- end
- --[[====================================Collision Detection================================]]--
- --[[-------------------------------------Collision Check-----------------------------------]]--
- function CollisionCheck(object)
- return object and object.valid and object.name:find("Minion_") and object.team ~= myHero.team and object.dead == false
- end
- --[[------------------------------------Collision Function---------------------------------]]--
- function minionCollision(predic, width, enemyMinions, range)
- for _, minionObjectE in pairs(enemyMinions) do
- if minionObjectE ~= nil and string.find(minionObjectE.name,"Minion_") == 1 and minionObjectE.team ~= player.team and minionObjectE.dead == false and minionObjectE.valid then
- if predic ~= nil and player:GetDistance(minionObjectE) < range then
- ex = player.x
- ez = player.z
- tx = predic.x
- tz = predic.z
- dx = ex - tx
- dz = ez - tz
- if dx ~= 0 then
- m = dz/dx
- c = ez - m*ex
- end
- mx = minionObjectE.x
- mz = minionObjectE.z
- distanc = (math.abs(mz - m*mx - c))/(math.sqrt(m*m+1))
- if distanc < width and math.sqrt((tx - ex)*(tx - ex) + (tz - ez)*(tz - ez)) > math.sqrt((tx - mx)*(tx - mx) + (tz - mz)*(tz - mz)) then
- return true
- end
- end
- end
- end
- return false
- end
- --[[======================================Tick/Combo======================================]]--
- function OnTick()
- ts:update()
- if ts.target ~= nil and not myHero.dead then
- travelDuration = (delay + (GetDistance(myHero, ts.target)/qspeed))
- end
- ts:SetPrediction(travelDuration)
- if ts.target ~= nil and myHero:CanUseSpell(_Q) == READY then predic = ts.nextPosition end
- BWCSlot = GetInventorySlotItem(BWCid)
- BRKSlot = GetInventorySlotItem(BRKid)
- TMTSlot = GetInventorySlotItem(TMTid)
- RAHSlot = GetInventorySlotItem(RAHid)
- RNDSlot = GetInventorySlotItem(RNDid)
- QREADY = (myHero:CanUseSpell(_Q) == READY)
- WREADY = (myHero:CanUseSpell(_W) == READY)
- EREADY = (myHero:CanUseSpell(_E) == READY)
- RREADY = (myHero:CanUseSpell(_R) == READY)
- IREADY = (ignite ~= nil and myHero:CanUseSpell(ignite) == READY)
- if tick == nil or GetTickCount()-tick>=200 then
- tick = GetTickCount()
- SCDmgCalculation()
- end
- if swing == 1 and os.clock() > lastBasicAttack + 0.5 then
- swing = 0
- end
- --[[Combo Functions]]--
- for i, minion in pairs(enemyMinions) do
- if (minion ~= nil and not minion.valid) or (minion ~= nil and minion.valid and minion.dead) then
- table.remove(enemyMinions, i)
- i = i-1
- end
- end
- --[[-------------------------------------Ultimate Close------------------------------------]]--
- if LeeSinConfig.rClose then
- findClosestEnemy()
- if RREADY and findClosestEnemy() ~= nil and GetDistance(findClosestEnemy()) <= (ultirange+50) then
- CastSpell(_R, findClosestEnemy())
- end
- end
- --[[-------------------------------------Auto Ultimate-------------------------------------]]--
- local players = heroManager.iCount
- for i = 1, players, 1 do
- local target = heroManager:getHero(i)
- local rDmg = getDmg("R",target,myHero,1)
- if target ~= nil and target.visible == true and target.team ~= player.team and target.dead == false and target.health < rDmg and player:GetDistance(target) < ultirange and player:CanUseSpell(_R) == READY and LeeSinConfig.autoult then
- CastSpell(_R, target)
- end
- end
- --[[----------------------------------------Q Dodge----------------------------------------]]--
- --[[Remove Dead]]--
- for i, minion in pairs(dodgeMinions) do
- if (minion ~= nil and not minion.valid) or (minion ~= nil and minion.valid and minion.dead) then
- table.remove(dodgeMinions, i)
- dodgeMinion = nil
- end
- end
- if LeeSinConfig.qDodge and ts.target ~= nil then
- --[[Target Set]]--
- for i=1, heroManager.iCount do
- local allytarget = heroManager:GetHero(i)
- if allytarget.team == myHero.team and not allytarget.dead and GetDistance(allytarget, targetPosition) < 750 and allytarget.charName ~= myHero.charName then
- dodgeHero = allytarget
- end
- end
- for i,dMinion in pairs(dodgeMinions) do
- if dMinion ~= nil and dMinion.team == myHero.team and GetDistance(dMinion, ts.target) < 750 and dMinion ~= dead then
- dodgeMinion = dMinion
- end
- end
- --[[Ball Handling]]--
- if predic ~= nil and QREADY and GetDistance(ts.nextPosition) <= qrange and myHero:GetSpellData(_Q).name == "BlindMonkQOne" then
- if LeeSinConfig.checkCollision and not minionCollision(ts.nextPosition, qwidth, enemyMinions, qrange) then
- CastSpell(_Q, predic.x, predic.z)
- else if not LeeSinConfig.checkCollision then
- CastSpell(_Q, predic.x, predic.z)
- end
- end
- end
- if (dodgeMinion ~= nil and dodgeMinion ~= dead) or (dodgeHero ~= nil and dodgeHero ~= dead) then
- if GetDistance(ts.target) <= 1100 and myHero:GetSpellData(_Q).name == "blindmonkqtwo" and WREADY then
- CastSpell(_Q)
- qCast = true
- qDelay = os.clock()
- wDelay = ((GetDistance(ts.nextPosition)/1500) * qMultiplier)
- end
- end
- --[[Cast Shield]]--
- if qCast == true and not QREADY and dodgeMinion ~= nil then
- if os.clock() - qDelay > wDelay then
- CastSpell(_W, dodgeMinion)
- qCast = false
- end
- elseif qCast == true and not QREADY and dodgeHero ~= nil then
- if os.clock() - qDelay > wDelay then
- CastSpell(_W, dodgeHero)
- qCast = false
- end
- end
- end
- --[[-----------------------------------------Ball------------------------------------------]]--
- if LeeSinConfig.scriptActive and ts.target ~= nil then
- if predic ~= nil and QREADY and GetDistance(ts.nextPosition) <= qrange and myHero:GetSpellData(_Q).name == "BlindMonkQOne" then
- if LeeSinConfig.checkCollision and not minionCollision(ts.nextPosition, qwidth, enemyMinions, qrange) then
- CastSpell(_Q, predic.x, predic.z)
- rCast = true
- else
- if not LeeSinConfig.checkCollision then
- CastSpell(_Q, predic.x, predic.z)
- rCast = true
- end
- end
- end
- if myHero:GetDistance(ts.target) <= 1100 and LeeSinConfig.useUlti == false and QREADY then
- rCast = false
- CastSpell(_Q)
- elseif LeeSinConfig.useUlti and rCast == false and QREADY then
- rCast = false
- CastSpell(_Q)
- end
- --[[--------------------------------------Cripple------------------------------------------]]--
- if swing == 0 and GetDistance(ts.target) <= 425 then
- myHero:Attack(ts.target)
- if EREADY and GetDistance(ts.target) <= 250 and myHero:GetSpellData(_E).name == "blindmonketwo" then
- CastSpell(_E)
- end
- elseif swing == 1 then
- if EREADY and GetDistance(ts.target) <= 275 and myHero:GetSpellData(_E).name == "BlindMonkEOne" then
- CastSpell(_E)
- end
- end
- if EREADY and GetDistance(ts.target) >= 425 and myHero:GetSpellData(_E).name == "blindmonketwo" then
- CastSpell(_E)
- end
- --[[--------------------------------------Ultimate-----------------------------------------]]--
- if RREADY and GetDistance(ts.target) <= ultirange and LeeSinConfig.useUlti and QREADY and rCast == true then
- CastSpell(_R, ts.target)
- rCast = false
- if myHero:GetDistance(ts.target) > 600 and LeeSinConfig.useUlti and not RREADY then
- CastSpell(_Q)
- rCast = false
- end
- else rCast = false
- end
- --[[---------------------------------------Items-------------------------------------------]]--
- if BRKSlot ~= nil and CanUseSpell(BRKSlot) == READY then CastSpell(BRKSlot, ts.target) end
- if BWCSlot ~= nil and CanUseSpell(BWCSlot) == READY then CastSpell(BWCSlot, ts.target) end
- if TMTSlot ~= nil and CanUseSpell(TMTSlot) == READY and GetDistance(ts.target) <= 275 then CastSpell(TMTSlot) end
- if RAHSlot ~= nil and CanUseSpell(RAHSlot) == READY and GetDistance(ts.target) <= 275 then CastSpell(RAHSlot) end
- if RNDSlot ~= nil and CanUseSpell(RNDSlot) == READY and GetDistance(ts.target) <= 500 then CastSpell(RNDSlot) end
- end
- --[[---------------------------------------Ignite------------------------------------------]]--
- if LeeSinConfig.autoignite then
- if IREADY then
- local ignitedmg = 0
- for i = 1, heroManager.iCount, 1 do
- local enemyhero = heroManager:getHero(i)
- if ValidTarget(enemyhero,600) then
- ignitedmg = 50 + 20 * myHero.level
- if enemyhero.health <= ignitedmg then
- CastSpell(ignite, enemyhero)
- end
- end
- end
- end
- end
- --[[Ward Jump Functions]]--
- --[[--------------------------------------Ward Jump----------------------------------------]]--
- if jumpReady == true and GetTickCount() - lastJump > jumpDelay then
- jumpNowAlready()
- end
- if LeeSinConfig.wardjump then
- local x = mousePos.x
- local z = mousePos.z
- local dx = x - player.x
- local dz = z - player.z
- local rad1 = math.atan2(dz, dx)
- SWardSlot = GetInventorySlotItem(SWard)
- VWardSlot = GetInventorySlotItem(VWard)
- SStoneSlot = GetInventorySlotItem(SStone)
- RSStoneSlot = GetInventorySlotItem(RSStone)
- WrigglesSlot = GetInventorySlotItem(Wriggles)
- if RSStoneSlot ~= nil and CanUseSpell(RSStoneSlot) == READY then
- wardSlot = RSStoneSlot else
- if SStoneSlot ~= nil and CanUseSpell(SStoneSlot) == READY then
- wardSlot = SStoneSlot else
- if SWardSlot ~= nil then
- wardSlot = SWardSlot else
- if VWardSlot ~= nil then
- wardSlot = VWardSlot else
- if WrigglesSlot ~= nil then
- wardSlot = WrigglesSlot else
- wardSlot = nil
- end
- end
- end
- end
- end
- if wardSlot ~= nil and jumpSlot ~= nil then
- local dx1 = flashRange*math.cos(rad1)
- local dz1 = flashRange*math.sin(rad1)
- local x1 = x - dx1
- local z1 = z - dz1
- if player:CanUseSpell(jumpSlot) == READY and GetTickCount() - lastJump > 2000 and math.sqrt(dx*dx + dz*dz) <= 600 then
- CastSpell( wardSlot, x, z )
- jumpReady = true
- lastJump = GetTickCount()
- elseif player:CanUseSpell(jumpSlot) == READY then
- player:MoveTo(x1, z1)
- else myHero:StopPosition()
- end
- end
- end
- end
- --[[=====================================Damage Calulation=================================]]--
- --[[
- Explanation of the marks:
- -Green circle: Marks the current target to which you will do the combo
- -Blue circle: Killed with a combo, if all the skills were available
- -Red circle: Killed using items + 2 Hits + Q + E + R + Ignite(if available)
- -2 Red circles: Killed using items + 1 Hits + Q + Ignite(if available)
- -3 Red circles: Killed using R
- ]]
- function SCDmgCalculation()
- local enemy = heroManager:GetHero(calculationenemy)
- if ValidTarget(enemy) then
- local ignitedamage, bwcdamage, brkdamage = 0, 0, 0
- local qdamage = getDmg("Q",enemy,myHero)
- local edamage = getDmg("E",enemy,myHero)
- local rdamage = getDmg("R",enemy,myHero,1)
- local hitdamage = getDmg("AD",enemy,myHero)
- local ignitedamage = (ignite and getDmg("IGNITE",enemy,myHero) or 0)
- local bwcdamage = (BWCSlot and getDmg("BWC",enemy,myHero) or 0)
- local brkdamage = (BRKSlot and getDmg("RUINEDKING",enemy,myHero) or 0)
- local combo1 = hitdamage*2 + qdamage + edamage + rdamage
- local combo2 = hitdamage*2
- local combo3 = hitdamage*1
- local combo4 = 0
- if QREADY then
- combo2 = combo2 + qdamage
- combo3 = combo3 + qdamage
- end
- if EREADY then
- combo2 = combo2 + edamage
- end
- if RREADY then
- combo2 = combo2 + rdamage
- combo4 = combo4 + rdamage
- end
- if BWCREADY then
- combo1 = combo1 + bwcdamage
- combo2 = combo2 + bwcdamage
- combo3 = combo3 + bwcdamage
- end
- if BRKREADY then
- combo1 = combo1 + brkdamage
- combo2 = combo2 + brkdamage
- combo3 = combo3 + brkdamage
- end
- if IREADY then
- combo1 = combo1 + ignitedamage
- combo2 = combo2 + ignitedamage
- combo3 = combo3 + ignitedamage
- end
- if combo4 >= enemy.health then killable[calculationenemy] = 4
- elseif combo3 >= enemy.health then killable[calculationenemy] = 3
- elseif combo2 >= enemy.health then killable[calculationenemy] = 2
- elseif combo1 >= enemy.health then killable[calculationenemy] = 1
- else killable[calculationenemy] = 0 end
- end
- if calculationenemy == 1 then calculationenemy = heroManager.iCount
- else calculationenemy = calculationenemy-1
- end
- end
- --[[=====================================On Create=========================================]]--
- function OnCreateObj(object)
- if objectIsValid(object) then table.insert(myObjectsTable, object) end
- if object ~= nil and object.dead ~= true and object.name:find("Minion_") then
- table.insert(dodgeMinions, object)
- end
- if CollisionCheck(object) then table.insert(enemyMinions, object) end
- end
- --[[======================================Circles==========================================]]--
- function OnDraw()
- if LeeSinConfig.wardjump and not myHero.dead then
- DrawCircle(myHero.x, myHero.y, myHero.z, wrange, 0x0000FF)
- end
- if LeeSinConfig.drawcirclesSelf and not myHero.dead then
- DrawCircle(myHero.x, myHero.y, myHero.z, qrange, 0xCCFF33)
- DrawCircle(myHero.x, myHero.y, myHero.z, ultirange, 0xFF0000)
- DrawCircle(myHero.x, myHero.y, myHero.z, wrange, 0x0000FF)
- end
- if ts.target ~= nil and LeeSinConfig.drawcirclesEnemy then
- for e=0, 10 do
- DrawCircle(ts.target.x, ts.target.y, ts.target.z, 40 + e*1.5, 0x00FF00)
- end
- end
- for i=1, heroManager.iCount do
- local enemydraw = heroManager:GetHero(i)
- if ValidTarget(enemydraw) then
- if LeeSinConfig.drawcirclesEnemy then
- if killable[i] == 1 then
- for e=0, 15 do
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + e*1.5, 0x0000FF)
- end
- elseif killable[i] == 2 then
- for e=0, 10 do
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + e*1.5, 0xFF0000)
- end
- elseif killable[i] == 3 then
- for e=0, 10 do
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + e*1.5, 0xFF0000)
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 110 + e*1.5, 0xFF0000)
- end
- elseif killable[i] == 4 then
- for e=0, 10 do
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + e*1.5, 0xFF0000)
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 110 + e*1.5, 0xFF0000)
- DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 140 + e*1.5, 0xFF0000)
- end
- end
- end
- if LeeSinConfig.drawtext and waittxt[i] == 1 and killable[i] ~= 0 then
- PrintFloatText(enemydraw,0,floattext[killable[i]])
- end
- end
- if waittxt[i] == 1 then waittxt[i] = 30
- else waittxt[i] = waittxt[i]-1
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement