local AUTOUPDATES = false
local SCRIPTSTATUS = false
local ScriptName = "iCreative's AIO"
local version = 1.084
local champions = {
["Riven"] = true,
["Xerath"] = true,
["Orianna"] = true,
["Draven"] = true,
["Lissandra"] = true,
["Irelia"] = true,
["Heimerdinger"] = true,
["Kennen"] = true,
["Fiora"] = true,
["Yasuo"] = true
}
if champions[myHero.charName] == nil then return end
local igniteslot, flashslot, smiteslot = nil
local Ignite = { Range = 600, IsReady = function() return (igniteslot ~= nil and myHero:CanUseSpell(igniteslot) == READY) end, Damage = function(target) return getDmg("IGNITE", target, myHero)*0.95 end}
local Flash = { Range = 400, IsReady = function() return (flashslot ~= nil and myHero:CanUseSpell(flashslot) == READY) end, LastCastTime = 0}
local Smite = { Range = 780, IsReady = function() return (smiteslot ~= nil and myHero:CanUseSpell(smiteslot) == READY) end}
local CastableItems = {
Tiamat = { Range = 400 , Slot = function() return FindItemSlot("TiamatCleave") end, reqTarget = false, IsReady = function() return (FindItemSlot("TiamatCleave") ~= nil and myHero:CanUseSpell(FindItemSlot("TiamatCleave")) == READY) end, Damage = function(target) return getDmg("TIAMAT", target, myHero) end},
Bork = { Range = 450 , Slot = function() return FindItemSlot("SwordOfFeastAndFamine") end, reqTarget = true, IsReady = function() return (FindItemSlot("SwordOfFeastAndFamine") ~= nil and myHero:CanUseSpell(FindItemSlot("SwordOfFeastAndFamine")) == READY) end, Damage = function(target) return getDmg("RUINEDKING", target, myHero) end},
Bwc = { Range = 400 , Slot = function() return FindItemSlot("BilgewaterCutlass") end, reqTarget = true, IsReady = function() return (FindItemSlot("BilgewaterCutlass") ~= nil and myHero:CanUseSpell(FindItemSlot("BilgewaterCutlass")) == READY) end, Damage = function(target) return getDmg("BWC", target, myHero) end},
Hextech = { Range = 400 , Slot = function() return FindItemSlot("HextechGunblade") end, reqTarget = true, IsReady = function() return (FindItemSlot("HextechGunblade") ~= nil and myHero:CanUseSpell(FindItemSlot("HextechGunblade")) == READY) end, Damage = function(target) return getDmg("HXG", target, myHero) end},
Blackfire = { Range = 750 , Slot = function() return FindItemSlot("BlackfireTorch") end, reqTarget = true, IsReady = function() return (FindItemSlot("BlackfireTorch") ~= nil and myHero:CanUseSpell(FindItemSlot("BlackfireTorch")) == READY) end, Damage = function(target) return getDmg("BLACKFIRE", target, myHero) end},
Youmuu = { Range = myHero.range + myHero.boundingRadius + 350 , Slot = function() return FindItemSlot("YoumusBlade") end, reqTarget = false, IsReady = function() return (FindItemSlot("YoumusBlade") ~= nil and myHero:CanUseSpell(FindItemSlot("YoumusBlade")) == READY) end, Damage = function(target) return 0 end},
Randuin = { Range = 500 , Slot = function() return FindItemSlot("RanduinsOmen") end, reqTarget = false, IsReady = function() return (FindItemSlot("RanduinsOmen") ~= nil and myHero:CanUseSpell(FindItemSlot("RanduinsOmen")) == READY) end, Damage = function(target) return 0 end},
TwinShadows = { Range = 1000, Slot = function() return FindItemSlot("ItemWraithCollar") end, reqTarget = false, IsReady = function() return (FindItemSlot("ItemWraithCollar") ~= nil and myHero:CanUseSpell(FindItemSlot("ItemWraithCollar")) == READY) end, Damage = function(target) return 0 end},
}
local DefensiveItems = {
Zhonyas = { Slot = function() return FindItemSlot("ZhonyasHourglass") end, IsReady = function() return (FindItemSlot("ZhonyasHourglass") ~= nil and myHero:CanUseSpell(FindItemSlot("ZhonyasHourglass")) == READY) end}
}
local Colors = {
-- O R G B
Green = ARGB(255, 0, 180, 0),
Yellow = ARGB(255, 255, 215, 00),
Red = ARGB(255, 255, 0, 0),
White = ARGB(255, 255, 255, 255),
Blue = ARGB(255, 0, 0, 255),
}
function CheckUpdate()
if AUTOUPDATES then
local ToUpdate = {}
ToUpdate.LocalVersion = version
ToUpdate.VersionPath = "raw.githubusercontent.com/jachicao/BoL/master/version/iAIO.version"
ToUpdate.ScriptPath = "raw.githubusercontent.com/jachicao/BoL/master/iAIO.lua"
ToUpdate.SavePath = SCRIPT_PATH.._ENV.FILE_NAME
ToUpdate.CallbackUpdate = function(NewVersion,OldVersion) PrintMessage(ScriptName, "Updated to "..NewVersion..". Please reload with 2x F9.") end
ToUpdate.CallbackNoUpdate = function(OldVersion) PrintMessage(ScriptName, "No Updates Found.") end
ToUpdate.CallbackNewVersion = function(NewVersion) PrintMessage(ScriptName, "New Version found ("..NewVersion.."). Please wait...") end
ToUpdate.CallbackError = function(NewVersion) PrintMessage(ScriptName, "Error while trying to check update.") end
_ScriptUpdate(ToUpdate)
end
end
function TargetHaveBuffType(buffType, target)
local target = target or myHero
for i = 1, target.buffCount do
local tBuff = target:getBuff(i)
if BuffIsValid(tBuff) then
if tBuff.type == buffType then return true end
end
end
return false
end
function EnemiesWithBuffType(buffType, range) --29
local enemies = {}
if #GetEnemyHeroes() > 0 then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, range) and TargetHaveBuffType(buffType, enemy) then
table.insert(enemies, enemy)
end
end
end
return enemies
end
function OnLoad()
local r = _Required()
r:Add({Name = "SimpleLib", Url = "raw.githubusercontent.com/jachicao/BoL/master/SimpleLib.lua"})
r:Check()
if r:IsDownloading() then return end
if OrbwalkManager == nil then print("Check your SimpleLib file, isn't working... The script can't load without SimpleLib. Try to copy-paste the entire SimpleLib.lua on your common folder.") return end
DelayAction(function() _arrangePriorities() end, 10)
DelayAction(function() CheckUpdate() end, 5)
igniteslot = FindSummonerSlot("summonerdot")
smiteslot = FindSummonerSlot("smite")
flashslot = FindSummonerSlot("flash")
if myHero.charName == "Riven" then
champ = _Riven()
elseif myHero.charName == "Xerath" then
champ = _Xerath()
elseif myHero.charName == "Orianna" then
champ = _Orianna()
elseif myHero.charName == "Draven" then
champ = _Draven()
elseif myHero.charName == "Lissandra" then
champ = _Lissandra()
elseif myHero.charName == "Irelia" then
champ = _Irelia()
elseif myHero.charName == "Heimerdinger" then
champ = _Heimerdinger()
elseif myHero.charName == "Kennen" then
champ = _Kennen()
elseif myHero.charName == "Fiora" then
champ = _Fiora()
elseif myHero.charName == "Yasuo" then
champ = _Yasuo()
end
if champ ~= nil then
PrintMessage(ScriptName, champ.ScriptName.." by "..champ.Author.." loaded, Have Fun!.")
end
end
class "_Yasuo"
function _Yasuo:__init()
self.ScriptName = "Master of the Wind"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self:LoadVariables()
self:LoadMenu()
end
function _Yasuo:LoadVariables()
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, 1100, DAMAGE_PHYSICAL)
self.EnemyMinions = minionManager(MINION_ENEMY, 1100, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 1100, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."30062015")
self.IsDashing = false
self.QState = 1
self.QSpell = _Spell({Slot = _Q, DamageName = "Q", Range = 475, Width = 55, Delay = 0, Speed = 1500, Aoe = true, Type = SPELL_TYPE.LINEAR}):AddDraw():SetAccuracy(55)
--EQ RANGE = 270, Delay = 0.36, Range2 = 400
--Q1 Range = 475, Delay = 0 or 0.37, Speed = 1500
--Q3 Delay 0.35, Speed = 1200, Width = 90, Range = 1100
--EQ3 Delay = 0.147
self.WSpell = _Spell({Slot = _W, DamageName = "W", Range = 400, Delay = 0, Type = SPELL_TYPE.SELF})
self.ESpell = _Spell({Slot = _E, DamageName = "E", Range = 475, Delay = 0, Speed = 1300, Type = SPELL_TYPE.TARGETTED}):AddDraw()
self.RSpell = _Spell({Slot = _R, DamageName = "R", Range = 2500, Type = SPELL_TYPE.SELF}):AddDraw()
self.Q = { IsReady = function() return self.QSpell:IsReady() end}
self.W = { IsReady = function() return self.WSpell:IsReady() end}
self.E = { IsReady = function() return self.ESpell:IsReady() end}
self.R = { IsReady = function() return self.RSpell:IsReady() end}
self.DashedUnits = {}
end
function _Yasuo:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
self.Menu.TS:addParam("Combo", "Range for Combo", SCRIPT_PARAM_SLICE, 1200, 150, 1200, 0)
self.Menu.TS:addParam("Harass", "Range for Harass", SCRIPT_PARAM_SLICE, 1000, 150, 1200, 0)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = true})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("Q", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("E", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("MinERange", "Min E Range", SCRIPT_PARAM_SLICE, 275, 150, 475, 0)
self.Menu.Combo:addParam("R1", "Use R If Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("R2", "Use R If Knocked >= ", SCRIPT_PARAM_SLICE, 2, 0, 5)
self.Menu.Combo:addParam("Items","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("Ignite", "Use Ignite", SCRIPT_PARAM_LIST, 1, {"Never", "If Killable" , "Always"})
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("Q", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("E", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("MinERange", "Min E Range", SCRIPT_PARAM_SLICE, 150, 0, 475, 0)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("Q", "Use Q If Hit >= ", SCRIPT_PARAM_SLICE, 2, 0, 10)
self.Menu.LaneClear:addParam("E", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("Q", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("E", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("Q", "Use Q", SCRIPT_PARAM_LIST, 3, {"Never", "Smart", "Always"})
self.Menu.LastHit:addParam("E", "Use E", SCRIPT_PARAM_LIST, 2, {"Never", "Smart", "Always"})
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("Q", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("E", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("R", "Use R", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("Ignite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addParam("R", "Auto R If Knocked >= ", SCRIPT_PARAM_SLICE, 3, 0, 5)
self.Menu.Auto:addSubMenu("Use W To Evade", "W")
_Evader(self.Menu.Auto.W):CheckCC():AddCallback(
function(target)
if self.WSpell:IsReady() then
local FixedPos = Vector(myHero) + Vector(Vector(target) - Vector(myHero)):normalized() * self.WSpell.Range
CastSpell(self.WSpell.Slot, FixedPos.x, FixedPos.z)
end
end
)
self.Menu.Auto:addSubMenu("Use Q3 To Interrupt", "Q3")
_Interrupter(self.Menu.Auto.Q3):CheckChannelingSpells():CheckGapcloserSpells():AddCallback(
function(target, spell)
if self.QState == 3 then
self.QSpell:Cast(target)
--[[local spelltype, casttype = getSpellType(target, spell.name)
if IsChanelling(target, spelltype) then
local object = self:SearchEObject(target)
if IsValidTarget(object) and GetDistanceSqr(target, self:EEndPos(object)) < GetDistanceSqr(target, myHero) then
self.ESpell:Cast(object)
end
end]]
end
end
)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu.Misc:addParam("Avoid", "Avoid dive turret", SCRIPT_PARAM_LIST, 2, {"Never", "If not Killable", "Always"})
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("Damage", "Draw Damage Calculation Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("StackQ", "Stack Q With Minions (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, true, string.byte("L"))
self.Menu.Keys:permaShow("StackQ")
self.Menu.Keys:addParam("Run", "Run", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
self.Menu.Keys.Run = false
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.TS.range = self:GetRange()
self.TS:update()
if self.IsDashing then
self.QSpell.Type = SPELL_TYPE.SELF
self.QSpell.Range = 270
self.QSpell.Width = 270
self.QSpell.Delay = 0.147
self.QSpell.Speed = math.huge
elseif self.QState == 3 then
self.QSpell.Type = SPELL_TYPE.LINEAR
self.QSpell.Range = 1100
self.QSpell.Width = 90
self.QSpell.Delay = 0.25
self.QSpell.Speed = 1200
else
self.QSpell.Type = SPELL_TYPE.LINEAR
self.QSpell.Range = 475
self.QSpell.Width = 20
self.QSpell.Delay = 0.35
self.QSpell.Speed = 8700
end
if self.Menu.Auto.R > 0 and #EnemiesWithBuffType(29, self.RSpell.Range) >= self.Menu.Auto.R then
self.RSpell:Cast(self.TS.target)
end
if self.Menu.Keys.StackQ and not OrbwalkManager:IsCombo() and self.QSpell:IsReady() and OrbwalkManager:CanMove() and self.QState < 3 and not self.Menu.Keys.Run then
self.EnemyMinions:update()
for i, object in ipairs(self.EnemyMinions.objects) do
if self.QSpell:IsReady() and self.QSpell:ValidTarget(object) then
self.QSpell:Cast(object)
end
end
self.JungleMinions:update()
for i, object in ipairs(self.JungleMinions.objects) do
if self.QSpell:IsReady() and self.QSpell:ValidTarget(object) then
self.QSpell:Cast(object)
end
end
end
if self.Menu.KillSteal.Q or self.Menu.KillSteal.E or self.Menu.KillSteal.R or self.Menu.KillSteal.Ignite then self:KillSteal() end
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.Keys.Run then
self:Run()
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.Damage then DrawPredictedDamage() end
end
)
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or not self.MenuLoaded then return end
if unit and spell and spell.name and unit.isMe then
if spell.name:lower() == "yasuoqw" then
elseif spell.name:lower() == "yasuoq2" then
elseif spell.name:lower() == "yasuoq3" then
elseif spell.name:lower() == "yasuodashwrapper" then
if spell.target ~= nil and spell.target.networkID ~= nil and self.DashedUnits[spell.target.networkID] == nil then
self.IsDashing = true
self.DashedUnits[spell.target.networkID] = true
DelayAction(function(target) if target ~= nil and self.DashedUnits[target.networkID] ~= nil then self.DashedUnits[target.networkID] = nil end end, 11 - self.ESpell:GetSpellData().level, {spell.target})
end
elseif spell.name:lower():find("recall") then
end
end
end
)
AddCreateObjCallback(
function(obj)
if obj and obj.name and obj.valid then
if obj.name:lower():find("q_wind_ready_buff") and GetDistanceSqr(myHero, obj) < 80 * 80 then
self.QState = 3
elseif obj.name:lower():find("yasuo_base_e_dash_hit") and self.IsDashing then
self.IsDashing = true
end
end
end
)
AddDeleteObjCallback(
function(obj)
if obj and obj.name and obj.valid then
if obj.name:lower():find("q_wind_ready_buff") and GetDistanceSqr(myHero, obj) < 80 * 80 then
self.QState = 1
elseif obj.name:lower():find("yasuo_base_e_dash_hit") and self.IsDashing then
self.IsDashing = false
end
end
end
)
self.MenuLoaded = true
end
function _Yasuo:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.3 and ValidTarget(enemy, self.TS.range) and enemy.visible then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
if self.Menu.KillSteal.Q and ( q or self.QSpell:Damage(enemy) > enemy.health) then
self.QSpell:Cast(enemy)
local object = self:SearchEObject(enemy)
if IsValidTarget(object) and GetDistanceSqr(enemy, self:EEndPos(object)) < GetDistanceSqr(enemy, myHero) then
self:CastE(object)
end
end
if self.Menu.KillSteal.E and ( e or self.ESpell:Damage(enemy) > enemy.health) then
self:CastE(enemy)
local object = self:SearchEObject(enemy)
if IsValidTarget(object) and GetDistanceSqr(enemy, self:EEndPos(object)) < GetDistanceSqr(enemy, myHero) then
self:CastE(object)
end
end
if self.Menu.KillSteal.R and ( r or self.RSpell:Damage(enemy) > enemy.health) then
self:CastR(enemy)
end
end
if self.Menu.KillSteal.Ignite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health then CastIgnite(enemy) end
end
end
end
function _Yasuo:Harass()
local target = self.TS.target
if IsValidTarget(target) then
if self.Menu.Harass.E and GetDistanceSqr(myHero, target) > math.pow(myHero.range + myHero.boundingRadius + 50, 2) then
local object = self:SearchEObject(target)
if IsValidTarget(object) and GetDistanceSqr(target, self:EEndPos(object)) < GetDistanceSqr(target, myHero) then
if object.networkID ~= target.networkID then
self:CastE(object)
elseif GetDistanceSqr(myHero, target) > math.pow(self.Menu.Harass.MinERange, 2) then
self:CastE(object)
end
end
end
if self.Menu.Harass.Q then self.QSpell:Cast(target) end
end
end
function _Yasuo:Clear()
self.QSpell:LaneClear({ NumberOfHits = self.Menu.LaneClear.Q})
if self.Menu.LaneClear.E then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if self.ESpell:IsReady() then
self:CastE(minion)
end
end
end
if self.Menu.JungleClear.Q then
self.QSpell:JungleClear()
end
if self.Menu.JungleClear.E then
self.JungleMinions:update()
for i, minion in pairs(self.JungleMinions.objects) do
if self.ESpell:IsReady() then
self:CastE(minion)
end
end
end
local minion = self.ESpell:LastHit({ Mode = self.Menu.LastHit.E, UseCast = false})
self:CastE(minion)
self.QSpell:LastHit({ Mode = self.Menu.LastHit.Q})
end
function _Yasuo:LastHit()
self.ESpell:LastHit({ Mode = self.Menu.LastHit.E})
self.QSpell:LastHit({ Mode = self.Menu.LastHit.Q})
end
function _Yasuo:Combo()
local target = self.TS.target
if IsValidTarget(target) then
local q, w, e, r, dmg = GetBestCombo(target)
if self.Menu.Combo.Items then UseItems(target) end
if self.Menu.Combo.Ignite > 1 and Ignite.IsReady() then
if self.Menu.Combo.useIgnite == 2 then
if dmg / self:GetOverkill() > target.health then CastIgnite(target) end
else
CastIgnite(target)
end
end
if self.Menu.Combo.R2 > 0 and #EnemiesWithBuffType(29, self.RSpell.Range) >= self.Menu.Combo.R2 then
self.RSpell:Cast(self.TS.target)
end
if self.Menu.Combo.R1 and dmg >= target.health and r then
self:CastR(target)
end
if self.Menu.Combo.E and GetDistanceSqr(myHero, target) > math.pow(myHero.range + myHero.boundingRadius + 50, 2) then
local object = self:SearchEObject(target)
if IsValidTarget(object) then
if object.networkID ~= target.networkID then
self:CastE(object)
elseif GetDistanceSqr(myHero, target) > math.pow(self.Menu.Combo.MinERange, 2) then
self:CastE(object)
end
end
end
if self.Menu.Combo.Q then self.QSpell:Cast(target) end
end
end
function _Yasuo:CastE(target)
if self.ESpell:IsReady() and IsValidTarget(target) and not self:HaveEBuff(target) then
if self.Menu.Misc.Avoid > 1 and not self.Menu.Keys.Run then
local endPos = self:EEndPos(target)
for name, turret in pairs(GetTurrets()) do
if turret ~= nil and GetDistance(myHero, turret) < 2000 then
if turret.team ~= myHero.team and GetDistanceSqr(endPos, turret) < math.pow(turret.range, 2) and GetDistanceSqr(myHero, turret) > math.pow(turret.range, 2) then
if IsValidTarget(self.TS.target) then
if self.Menu.Misc.Avoid == 2 then
local q, w, e, r, dmg = GetBestCombo(self.TS.target)
if dmg < self.TS.target.health then
return
end
elseif self.Menu.Misc.Avoid == 3 then
return
end
else
local counter = 0
self.EnemyMinions:update()
for i, object in ipairs(self.EnemyMinions.objects) do
if IsValidTarget(object) and GetDistanceSqr(object, turret) < math.pow(turret.range, 2) then
counter = counter + 1
break
end
end
if counter == 0 then return end
end
end
end
end
end
self.ESpell:Cast(target)
end
end
function _Yasuo:CastR(target)
if self.RSpell:IsReady() and IsValidTarget(target) and TargetHaveBuffType(29, target) then
self.RSpell:Cast(target)
end
end
function _Yasuo:Run()
local object = self:SearchEObject(mousePos)
if IsValidTarget(object) then
self:CastE(object)
else
myHero:MoveTo(mousePos.x, mousePos.z)
end
end
function _Yasuo:SearchEObject(vector)
if vector ~= nil and self.ESpell:IsReady() then
local best = nil
self.EnemyMinions:update()
for i, object in ipairs(self.EnemyMinions.objects) do
if self.ESpell:ValidTarget(object) and not self:HaveEBuff(object) and GetDistanceSqr(vector, self:EEndPos(object)) < GetDistanceSqr(vector, myHero) then
if best == nil then best = object
elseif GetDistanceSqr(vector, self:EEndPos(best)) > GetDistanceSqr(vector, self:EEndPos(object)) then best = object end
end
end
if IsValidTarget(best) then
return best
end
self.JungleMinions:update()
for i, object in ipairs(self.JungleMinions.objects) do
if self.ESpell:ValidTarget(object) and not self:HaveEBuff(object) and GetDistanceSqr(vector, self:EEndPos(object)) < GetDistanceSqr(vector, myHero) then
if best == nil then best = object
elseif GetDistanceSqr(vector, self:EEndPos(best)) > GetDistanceSqr(vector, self:EEndPos(object)) then best = object end
end
end
if IsValidTarget(best) then
return best
end
for i, object in ipairs(GetEnemyHeroes()) do
if self.ESpell:ValidTarget(object) and not self:HaveEBuff(object) and GetDistanceSqr(vector, self:EEndPos(object)) < GetDistanceSqr(vector, myHero) then
if best == nil then best = object
elseif GetDistanceSqr(vector, self:EEndPos(best)) > GetDistanceSqr(vector, self:EEndPos(object)) then best = object end
end
end
if IsValidTarget(best) then
return best
end
end
return nil
end
function _Yasuo:EEndPos(target)
return Vector(myHero) + Vector(Vector(target) - Vector(myHero)):normalized() * self.ESpell.Range
end
function _Yasuo:HaveEBuff(target)
return self.DashedUnits[target.networkID] ~= nil
end
function _Yasuo:GetRange()
if OrbwalkManager:IsCombo() then return self.Menu.TS.Combo
elseif OrbwalkManager:IsHarass() then return self.Menu.TS.Harass
else return self.Menu.TS.Combo
end
end
function _Yasuo:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.QSpell:Damage(target) * (4 - self.QState)
end
if w then
end
if e then
comboDamage = comboDamage + self.ESpell:Damage(target)
end
if r then
comboDamage = comboDamage + self.RSpell:Damage(target)
end
comboDamage = comboDamage + getDmg("AD", target, myHero) * 3
comboDamage = comboDamage + DamageItems(target)
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Yasuo:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Fiora"
function _Fiora:__init()
self.ScriptName = "Headmistress Fiora"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self:LoadVariables()
self:LoadMenu()
end
function _Fiora:LoadVariables()
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, 950, DAMAGE_PHYSICAL)
self.EnemyMinions = minionManager(MINION_ENEMY, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 700, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."19062015")
self.QSpell = _Spell({Slot = _Q, DamageName = "Q", Range = 600, Delay = 0, Speed = 2200, Type = SPELL_TYPE.TARGETTED}):AddDraw()
self.WSpell = _Spell({Slot = _W, DamageName = "W", Range = 900, Type = SPELL_TYPE.SELF})
self.ESpell = _Spell({Slot = _E, DamageName = "E", Range = myHero.range + myHero.boundingRadius + 150, Type = SPELL_TYPE.SELF})
self.RSpell = _Spell({Slot = _R, DamageName = "R", Range = 400, Type = SPELL_TYPE.TARGETTED}):AddDraw()
self.Q = { IsReady = function() return self.QSpell:IsReady() end, LastCastTime = 0}
self.W = { IsReady = function() return self.WSpell:IsReady() end}
self.E = { IsReady = function() return self.ESpell:IsReady() end}
self.R = { IsReady = function() return self.RSpell:IsReady() end}
self.Attacks = {}
end
function _Fiora:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
self.Menu.TS:addParam("Combo", "Range for Combo", SCRIPT_PARAM_SLICE, 900, 150, 1100, 0)
self.Menu.TS:addParam("Harass", "Range for Harass", SCRIPT_PARAM_SLICE, 350, 150, 900, 0)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = true})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useQ1", "Min. Q1 Range", SCRIPT_PARAM_SLICE, 350, 0, 600)
self.Menu.Combo:addParam("useQ2", "Min. Q2 Range", SCRIPT_PARAM_SLICE, 350, 0, 600)
self.Menu.Combo:addParam("useQObject", "Use Q On Object To GapClose", SCRIPT_PARAM_LIST, 2, {"Never", "If Killable" , "Always"})
self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR","Use R", SCRIPT_PARAM_LIST, 2, {"Never", "If Killable" , "Always"})
self.Menu.Combo:addParam("useR2","Use R if HP % <", SCRIPT_PARAM_SLICE, 15, 0, 100)
self.Menu.Combo:addParam("useItems","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_LIST, 1, {"Never", "If Killable" , "Always"})
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useQ1", "Min. Q1 Range", SCRIPT_PARAM_SLICE, 0, 0, 600)
self.Menu.Harass:addParam("useQ2", "Min. Q2 Range", SCRIPT_PARAM_SLICE, 350, 0, 600)
self.Menu.Harass:addParam("useQObject","Use Q On Object To GapClose", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("useQ", "Use Q", SCRIPT_PARAM_LIST, 2, {"Never", "Smart", "Always"})
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addParam("useW", "Use W on AA", SCRIPT_PARAM_ONOFF, true)
self.Menu.Auto:addSubMenu("Use R To Evade", "useR")
_Evader(self.Menu.Auto.useR):CheckCC():AddCallback(function(target) self.RSpell:Cast(target) end)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.TS.range = self:GetRange()
self.TS:update()
if self.Menu.KillSteal.useQ or self.Menu.KillSteal.useE or self.Menu.KillSteal.useR or self.Menu.KillSteal.useIgnite then self:KillSteal() end
if self.Menu.Auto.useW then self:CheckAA("hero") end
if not OrbwalkManager:IsNone() and not self:IsQ1() and os.clock() - self.Q.LastCastTime > 3.8 and os.clock() - self.Q.LastCastTime < 4.5 then
local target = OrbwalkManager:ObjectInRange(self.QSpell.Range)
self.QSpell:Cast(target)
end
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
end
)
AddProcessSpellCallback(
function(unit, spell)
if unit and spell and spell.target and ValidTarget(unit) then
if spell.name:lower():find("attack") and spell.target.isMe then
table.insert(self.Attacks, {Unit = unit, WindUpTime = spell.windUpTime, Time = os.clock() - GetLatency()/2000, VectorUnit = Vector(unit), Spell = spell})
if self.Menu.Auto.useW then self:CheckAA("hero") end
end
end
end
)
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if iSpell == self.QSpell.Slot then
self.Q.LastCastTime = os.clock()
end
end
)
self.MenuLoaded = true
end
function _Fiora:GetRange()
if OrbwalkManager:IsCombo() then return self.Menu.TS.Combo
elseif OrbwalkManager:IsHarass() then return self.Menu.TS.Harass
else return self.Menu.TS.Combo
end
end
function _Fiora:CheckAA(type)
if #self.Attacks > 0 then
for i = #self.Attacks, 1, -1 do
local spell = self.Attacks[i]
if os.clock() + GetLatency()/2000 - spell.Time <= spell.WindUpTime + GetDistance(myHero, spell.VectorUnit)/Prediction.VP:GetProjectileSpeed(spell.Unit) then
if os.clock() + GetLatency()/2000 - spell.Time >= (spell.WindUpTime + GetDistance(myHero, spell.VectorUnit)/Prediction.VP:GetProjectileSpeed(spell.Unit)) * 0.3 then
if spell.Unit and spell.Unit.type:lower():find(type) then
self.WSpell:Cast(spell.Unit)
end
end
else
table.remove(self.Attacks, i)
end
end
end
end
function _Fiora:IsQ1()
return os.clock() - self.Q.LastCastTime > 5
end
function _Fiora:SearchQObject(target)
local best = nil
if ValidTarget(target) and GetDistanceSqr(myHero, target) > math.pow(self.QSpell.Range, 2) then
for i, object in ipairs(GetEnemyHeroes()) do
if self.QSpell:ValidTarget(object) and target.networkID ~= object.networkID then
if best == nil then best = object
elseif GetDistanceSqr(target, best) > GetDistanceSqr(target, object) then best = object end
end
end
if ValidTarget(best) and GetDistanceSqr(myHero, target) > GetDistanceSqr(best, target) then
self.QSpell:Cast(best)
end
self.EnemyMinions:update()
for i, object in ipairs(self.EnemyMinions.objects) do
if self.QSpell:ValidTarget(object) and target.networkID ~= object.networkID then
if best == nil then best = object
elseif GetDistanceSqr(target, best) > GetDistanceSqr(target, object) then best = object end
end
end
if ValidTarget(best) and GetDistanceSqr(myHero, target) > GetDistanceSqr(best, target) then
self.QSpell:Cast(best)
end
end
end
function _Fiora:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.4 and ValidTarget(enemy, self.TS.range) and enemy.visible then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
if self.Menu.KillSteal.useQ and ( q or self.QSpell:Damage(enemy) * 2 > enemy.health) and not enemy.dead then self.QSpell:Cast(enemy) end
if self.Menu.KillSteal.useE and ( e or self.ESpell:Damage(enemy) > enemy.health) and not enemy.dead then self.ESpell:Cast(enemy) end
if self.Menu.KillSteal.useR and ( r or self.RSpell:Damage(enemy, 3) > enemy.health) and not enemy.dead then self.RSpell:Cast(enemy) end
end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead then CastIgnite(enemy) end
end
end
end
function _Fiora:Combo()
local target = self.TS.target
if ValidTarget(target) then
local q, w, e, r, dmg = GetBestCombo(target)
if self.Menu.Combo.useItems then UseItems(target) end
if self.Menu.Combo.useIgnite > 1 and Ignite.IsReady() then
if self.Menu.Combo.useIgnite == 2 then
if dmg / self:GetOverkill() > target.health then CastIgnite(target) end
else
CastIgnite(target)
end
end
if self.Menu.Combo.useR > 1 then
if self.Menu.Combo.useR == 2 then
if dmg > target.health and r then
self.RSpell:Cast(target)
end
elseif self.Menu.Combo.useR == 3 then
self.RSpell:Cast(target)
end
end
if self.Menu.Combo.useR2 >= myHero.health / myHero.maxHealth * 100 then
local best = nil
for i, object in ipairs(GetEnemyHeroes()) do
if self.RSpell:ValidTarget(object) then
if best == nil then best = object
elseif GetPriority(best) > GetPriority(object) then best = object end
end
end
if ValidTarget(best) then
self.RSpell:Cast(best)
end
end
if self.Menu.Combo.useW then
self:CheckAA("hero")
end
if self.Menu.Combo.useE then
self.ESpell:Cast(target)
end
if self.Menu.Combo.useQ then
if self:IsQ1() then
if GetDistanceSqr(myHero, target) > math.pow(self.Menu.Combo.useQ1, 2) then
self.QSpell:Cast(target)
end
else
if GetDistanceSqr(myHero, target) > math.pow(self.Menu.Combo.useQ2, 2) then
self.QSpell:Cast(target)
end
end
if self.Menu.Combo.useQObject > 1 then
if self.Menu.Combo.useQObject == 2 then
if dmg > target.health then
self:SearchQObject(target)
end
elseif self.Menu.Combo.useQObject == 3 then
self:SearchQObject(target)
end
end
end
end
end
function _Fiora:Harass()
local target = self.TS.target
if ValidTarget(target) then
if myHero.mana / myHero.maxMana * 100 >= self.Menu.Harass.Mana then
if self.Menu.Harass.useW then
self:CheckAA("hero")
end
if self.Menu.Harass.useQ then
if self:IsQ1() then
if GetDistanceSqr(myHero, target) > math.pow(self.Menu.Harass.useQ1, 2) then
self.QSpell:Cast(target)
end
else
if GetDistanceSqr(myHero, target) > math.pow(self.Menu.Harass.useQ2, 2) then
self.QSpell:Cast(target)
end
end
if self.Menu.Harass.useQObject then
self:SearchQObject(target)
end
end
if self.Menu.Harass.useE then
self.ESpell:Cast(target)
end
end
end
end
function _Fiora:Clear()
if myHero.mana / myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
if self.Menu.LaneClear.useQ then
self.QSpell:LaneClear()
end
self.QSpell:LastHit({ Mode = self.Menu.LastHit.useQ})
if self.Menu.LaneClear.useE then
self.ESpell:LaneClear()
end
if self.Menu.LaneClear.useW then
if OrbwalkManager:GetClearMode() ~= nil and OrbwalkManager:GetClearMode():lower():find("lane") then
self:CheckAA("minion")
end
end
end
if self.Menu.JungleClear.useQ then
self.QSpell:JungleClear()
end
if self.Menu.JungleClear.useE then
self.ESpell:JungleClear()
end
if self.Menu.JungleClear.useW then
if OrbwalkManager:GetClearMode() ~= nil and OrbwalkManager:GetClearMode():lower():find("jungle") then
self:CheckAA("minion")
end
end
end
function _Fiora:LastHit()
if myHero.mana / myHero.maxMana * 100 >= self.Menu.LastHit.Mana then
self.QSpell:LastHit({ Mode = self.Menu.LastHit.useQ})
end
end
function _Fiora:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.QSpell:Damage(target) * 2
currentManaWasted = currentManaWasted + self.QSpell:Mana()
end
if w then
comboDamage = comboDamage + self.WSpell:Damage(target)
currentManaWasted = currentManaWasted + self.WSpell:Mana()
end
if e then
comboDamage = comboDamage + self.ESpell:Damage(target)
currentManaWasted = currentManaWasted + self.ESpell:Mana()
comboDamage = comboDamage + getDmg("AD", target, myHero) * 3
end
if r then
comboDamage = comboDamage + self.RSpell:Damage(target, 3)
currentManaWasted = currentManaWasted + self.RSpell:Mana()
end
comboDamage = comboDamage + getDmg("AD", target, myHero)
comboDamage = comboDamage + DamageItems(target)
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Fiora:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Kennen"
function _Kennen:__init()
self.ScriptName = "iKennen"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.AA = { Range = function(target) local int1 = 50 if ValidTarget(target) then int1 = GetDistance(target.minBBox, target)/2 end return myHero.range + GetDistance(myHero, myHero.minBBox) + int1 end, Damage = function(target) return getDmg("AD", target, myHero) end }
self:LoadVariables()
self:LoadMenu()
end
function _Kennen:LoadVariables()
self.LastMarkRequest = 0
self.EnemiesMarked = {}
for idx, enemy in ipairs(GetEnemyHeroes()) do
self.EnemiesMarked[enemy.charName] = false
end
self.EnemySoonStunned = {}
for idx, enemy in ipairs(GetEnemyHeroes()) do
self.EnemySoonStunned[enemy.charName] = false
end
self.AutoAttackMarkObject = nil
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, 950, DAMAGE_MAGIC)
self.EnemyMinions = minionManager(MINION_ENEMY, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 700, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."20052015")
self.QSpell = _Spell({Slot = _Q, DamageName = "Q", Range = 950, Width = 50, Delay = 0.175, Speed = 1700, Collision = true, Aoe = false, Type = SPELL_TYPE.LINEAR}):AddDraw()
self.WSpell = _Spell({Slot = _W, DamageName = "W", Range = 900, Type = SPELL_TYPE.SELF}):AddDraw()
self.ESpell = _Spell({Slot = _E, DamageName = "E", Range = 950, Type = SPELL_TYPE.SELF})
self.RSpell = _Spell({Slot = _R, DamageName = "R", Range = 500, Type = SPELL_TYPE.SELF}):AddDraw()
self.Q = { IsReady = function() return self.QSpell:IsReady() end}
self.W = { IsReady = function() return self.WSpell:IsReady() end}
self.E = { IsReady = function() return self.ESpell:IsReady() end}
self.R = { IsReady = function() return self.RSpell:IsReady() end}
end
function _Kennen:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_LIST, 2, {"Never", "Only On Target", "On Any Enemy"})
--self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_LIST, 2, {"Never", "If Target Have Mark", "On Any Enemy"})
self.Menu.Combo:addParam("useW2","Wait until % markeds >=", SCRIPT_PARAM_SLICE, 60, 0, 100)
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR","Use R If Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5, 0)
self.Menu.Combo:addParam("useR2","Use R If Target Is Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("Zhonyas","Use Zhonyas if %hp <= ", SCRIPT_PARAM_SLICE, 15, 0, 100)
self.Menu.Combo:addParam("useItems","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_LIST, 2, {"Never", "Only On Target", "On Any Enemy"})
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_LIST, 2, {"Never", "If Target Have Mark", "On Any Enemy"})
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("Mana", "Min. Energy Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addParam("useQ", "Auto Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.Auto:addParam("useW", "Auto W If Marked Enemies >=", SCRIPT_PARAM_SLICE, 2, 0, 5)
self.Menu.Auto:addParam("useW2", "Auto W If Range >=", SCRIPT_PARAM_SLICE, 600, 600, 800)
self.Menu.Auto:addParam("useQStun", "Auto Q If Will Stun", SCRIPT_PARAM_ONOFF, true)
self.Menu.Auto:addParam("useWStun", "Auto W If Will Stun", SCRIPT_PARAM_ONOFF, true)
self.Menu.Auto:addParam("Zhonyas", "Auto Zhonyas If R Casted", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("Mark","Circle on Enemies with Mark", SCRIPT_PARAM_ONOFF, true)
self.Menu.Draw:addParam("MarkReady","Text if Mark is Ready", SCRIPT_PARAM_ONOFF, true)
--self.Menu.Draw:addParam("Stunnable","Text if is Stunnable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("HarassToggle", "Harass (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("L"))
self.Menu.Keys:addParam("Run", "Run", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
self.Menu.Keys:permaShow("HarassToggle")
self.Menu.Keys.HarassToggle = false
self.Menu.Keys.Run = false
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.TS:update()
self:Auto()
self:KillSteal()
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.Keys.Run then self:Run() end
if self.Menu.Keys.HarassToggle then self:Harass() end
end
)
--[[
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or not self.MenuLoaded then return end
if unit and spell and spell.name and unit.isMe then
if spell.name:lower():find("kennenshurikenstorm") then
if self.Menu.Auto.Zhonyas and DefensiveItems.Zhonyas.IsReady() then DelayAction(function() CastSpell(DefensiveItems.Zhonyas.Slot()) end, 0.3) end
end
end
end
)]]
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if myHero.dead or not self.MenuLoaded then return end
if iSpell == self.RSpell.Slot then
if self.Menu.Auto.Zhonyas and DefensiveItems.Zhonyas.IsReady() then DelayAction(function() CastSpell(DefensiveItems.Zhonyas.Slot()) end, 0.3) end
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
if self.Menu.Draw.MarkReady then
if self:HaveAutoAttackMark() then
local pos = WorldToScreen(D3DXVECTOR3(myHero.x, myHero.y, myHero.z))
DrawText("Mark Ready", 20, pos.x, pos.y, Colors.White)
end
end
if self.Menu.Draw.Stunnable then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy) then
if self.EnemySoonStunned[enemy.charName] == true then
local pos = WorldToScreen(D3DXVECTOR3(enemy.x, enemy.y, enemy.z))
DrawText("STUNNABLE", 20, pos.x, pos.y, Colors.Blue)
end
end
end
end
if self.Menu.Draw.Mark then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy) then
if self:EnemyIsMarked(enemy) then
DrawCircle3D(enemy.x, enemy.y, enemy.z, 80, 2, Colors.Blue, 20)
end
end
end
end
end
)
AddCreateObjCallback(
function(obj)
if obj and obj.name and obj.valid then
if obj.name:lower():find("kennen_ds_proc.troy") and GetDistanceSqr(myHero, obj) < 100 * 100 then
self.AutoAttackMarkObject = obj
elseif obj.name:lower() == "kennen_mos1.troy" or obj.name:lower() == "kennen_mos2.troy" then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, 1200) then
if GetDistanceSqr(Vector(enemy.x, 0, enemy.z), Vector(obj.x, 0, obj.z)) < Prediction.VP:GetHitBox(enemy) * Prediction.VP:GetHitBox(enemy) then
self.EnemiesMarked[enemy.charName] = true
if obj.name:lower() == "kennen_mos2.troy" then
self.EnemySoonStunned[enemy.charName] = true
else
self.EnemySoonStunned[enemy.charName] = false
end
DelayAction(function() self.EnemiesMarked[enemy.charName] = false end, 6.3)
break
end
end
end
end
end
end
)
AddDeleteObjCallback(
function(obj)
if obj and obj.name and obj.valid then
if obj.name:lower():find("kennen_ds_proc.troy") and self.AutoAttackMarkObject~=nil and GetDistanceSqr(myHero, obj) < 100 * 100 then
self.AutoAttackMarkObject = nil
elseif obj.name:lower() == "kennen_mos1.troy" or obj.name:lower() == "kennen_mos2.troy" then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, 1200) then
if GetDistanceSqr(Vector(enemy.x, 0, enemy.z), Vector(obj.x, 0, obj.z)) < Prediction.VP:GetHitBox(enemy) * Prediction.VP:GetHitBox(enemy) then
self.EnemiesMarked[enemy.charName] = false
break
end
end
end
end
end
end
)
self.MenuLoaded = true
end
function _Kennen:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.4 and ValidTarget(enemy, self.TS.range) then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
if self.Menu.KillSteal.useQ and ( q or self.QSpell:Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.Menu.KillSteal.useW and ( w or self.WSpell:Damage(enemy) > enemy.health) and not enemy.dead then self:CastW(enemy) end
if self.Menu.KillSteal.useE and ( e or self.ESpell:Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.Menu.KillSteal.useR and ( r or self.RSpell:Damage(enemy) > enemy.health) and not enemy.dead then self:CastR(enemy) end
end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead then CastIgnite(enemy) end
end
end
end
function _Kennen:Auto()
if self.WSpell:IsReady() and self.Menu.Auto.useW <= #self:EnemyMarkeds() and self.Menu.Auto.useW > 0 then CastSpell(self.WSpell.Slot) end
if self.WSpell:IsReady() and self.WSpell:ValidTarget(self.TS.target) and GetDistanceSqr(myHero, self.TS.target) >= self.Menu.Auto.useW2 * self.Menu.Auto.useW2 then CastSpell(self.WSpell.Slot) end
if self.WSpell:IsReady() and self.Menu.Auto.useWStun then
for i, enemy in ipairs(GetEnemyHeroes()) do
if self.WSpell:ValidTarget(enemy) then
if self.EnemySoonStunned[enemy.charName] == true then
CastSpell(self.WSpell.Slot)
end
end
end
end
if self.QSpell:IsReady() and self.Menu.Auto.useQ then self:CastQ(ts.target, 3) end
if self.QSpell:IsReady() and self.Menu.Auto.useQStun then
for i, enemy in ipairs(GetEnemyHeroes()) do
if self.QSpell:ValidTarget(enemy) then
if self.EnemySoonStunned[enemy.charName] == true then
self:CastQ(enemy)
end
end
end
end
end
function _Kennen:Combo()
local target = self.TS.target
if not ValidTarget(target) then return end
if myHero.health / myHero.maxHealth * 100 < self.Menu.Combo.Zhonyas and DefensiveItems.Zhonyas.IsReady() then CastSpell(DefensiveItems.Zhonyas.Slot()) end
if self.Menu.Combo.useItems then UseItems(target) end
if self.RSpell:IsReady() and self.Menu.Combo.useR2 then
local q, w, e, r, dmg = GetBestCombo(target)
if r and dmg >= target.health then self:CastR(target) end
end
if self.RSpell:IsReady() and self.Menu.Combo.useR <= #self.RSpell:ObjectsInArea(GetEnemyHeroes()) and self.Menu.Combo.useR > 0 then CastSpell(self.RSpell.Slot) end
if self.Menu.Combo.useE then self:CastE(target) end
if self.Menu.Combo.useQ > 1 then self:CastQ(target, self.Menu.Combo.useQ) end
if self.WSpell:IsReady() and self.Menu.Combo.useW2 <= 100 * #self:EnemyMarkeds()/#self.WSpell:ObjectsInArea(GetEnemyHeroes()) then CastSpell(self.WSpell.Slot) end
end
function _Kennen:Harass()
local target = self.TS.target
if not ValidTarget(target) or myHero.mana/myHero.maxMana * 100 < self.Menu.Harass.Mana then return end
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Harass.useQ > 1 then self:CastQ(target, self.Menu.Harass.useQ) end
if self.Menu.Harass.useW > 1 then self:CastW(target, self.Menu.Harass.useW) end
end
function _Kennen:Clear()
self.EnemyMinions:update()
self.JungleMinions:update()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
for i, minion in pairs(self.EnemyMinions.objects) do
if self.Menu.LaneClear.useQ and self.QSpell:ValidTarget(minion) and self.QSpell:IsReady() and not minion.dead then
self:CastQ(minion)
end
if self.Menu.LaneClear.useE and self.ESpell:ValidTarget(minion) and self.ESpell:IsReady() and not minion.dead then
self:CastE(minion)
end
if self.Menu.LaneClear.useW and self.WSpell:ValidTarget(minion) and self.WSpell:IsReady() and not minion.dead then
if not self:IsE1() then return end
CastSpell(self.WSpell.Slot)
end
end
end
for i, minion in pairs(self.JungleMinions.objects) do
if self.Menu.JungleClear.useQ and self.QSpell:ValidTarget(minion) and self.QSpell:IsReady() and not minion.dead then
self:CastQ(minion)
end
if self.Menu.JungleClear.useE and self.ESpell:ValidTarget(minion) and self.ESpell:IsReady() and not minion.dead then
self:CastE(minion)
end
if self.Menu.JungleClear.useW and self.WSpell:ValidTarget(minion) and self.WSpell:IsReady() and not minion.dead then
if not self:IsE1() then return end
CastSpell(self.WSpell.Slot)
end
end
end
function _Kennen:LastHit()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LastHit.Mana then
if self.Menu.LastHit.useQ then
self.QSpell:LastHit()
end
end
end
function _Kennen:CastQ(target, mod)
local mode = mod or 2
if self.QSpell:IsReady() then
if mode == 2 then
self.QSpell:Cast(target)
elseif mode == 3 then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if self.QSpell:ValidTarget(enemy) then
self.QSpell:Cast(enemy)
return
end
end
end
end
end
function _Kennen:CastW(target, mod)
local mode = mod or 2
if self.WSpell:IsReady() then
if mode == 2 then
if self:EnemyIsMarked(target) and self.WSpell:ValidTarget(target) then
CastSpell(self.WSpell.Slot)
end
elseif mode == 3 then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if self:EnemyIsMarked(enemy) and self.WSpell:ValidTarget(enemy) then
CastSpell(self.WSpell.Slot)
return
end
end
end
end
end
function _Kennen:CastE(target)
if self.ESpell:IsReady() then
if self.ESpell:ValidTarget(target) then
if self:IsE1() then
self.ESpell:Cast(target)
end
end
end
end
function _Kennen:CastR(target)
self.RSpell:Cast(target)
end
function _Kennen:Run()
myHero:MoveTo(mousePos.x, mousePos.z)
if self.ESpell:IsReady() then
if self:IsE1() then
CastSpell(self.ESpell.Slot)
else
end
end
end
function _Kennen:HaveAutoAttackMark()
return self.AutoAttackMarkObject ~= nil and self.AutoAttackMarkObject.valid
end
function _Kennen:EnemyIsMarked(enemy)
if self.EnemiesMarked[enemy.charName] ~= nil then
return self.EnemiesMarked[enemy.charName]
end
return false
end
function _Kennen:IsE1()
return self.ESpell:GetSpellData().name:lower():find("kennenlightningrush")
end
function _Kennen:EnemyMarkeds()
local asd = {}
for i, enemy in ipairs(GetEnemyHeroes()) do
if self.WSpell:ValidTarget(enemy) then
if self.EnemiesMarked[enemy.charName] == true then
table.insert(asd, enemy)
end
end
end
return asd
end
function _Kennen:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.QSpell:Damage(target)
currentManaWasted = currentManaWasted + self.QSpell:Mana()
end
if w then
comboDamage = comboDamage + self.WSpell:Damage(target)
currentManaWasted = currentManaWasted + self.WSpell:Mana()
end
if e then
comboDamage = comboDamage + self.ESpell:Damage(target)
currentManaWasted = currentManaWasted + self.ESpell:Mana()
comboDamage = comboDamage + self.AA.Damage(target)
end
if r then
comboDamage = comboDamage + self.RSpell:Damage(target)
currentManaWasted = currentManaWasted + self.RSpell:Mana()
comboDamage = comboDamage + self.WSpell:Damage(target)
comboDamage = comboDamage + self.AA.Damage(target) * 2
end
comboDamage = comboDamage + self.AA.Damage(target) * 2
comboDamage = comboDamage + DamageItems(target)
local iDmg = Ignite.IsReady() and Ignite.Damage(target) or 0
comboDamage = comboDamage + iDmg
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Kennen:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Heimerdinger"
function _Heimerdinger:__init()
self.ScriptName = "Heisendinger"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.Passive = { Damage = function(target) return getDmg("P", target, myHero) end, IsReady = false}
self.Turret = { Range = 525, Width = 525}
self.AA = { Range = function(target) local int1 = 50 if ValidTarget(target) then int1 = GetDistance(target.minBBox, target)/2 end return myHero.range + GetDistance(myHero, myHero.minBBox) + int1 end, Damage = function(target) return getDmg("AD", target, myHero) end }
self.Q = { Slot = _Q, DamageName = "Q", Range = 450, Width = self.Turret.Range, Delay = 0.5, Speed = math.huge, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.CIRCULAR, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Mana = function() return myHero:GetSpellData(_Q).mana end, Damage = function(target, stage) return getDmg("Q", target, myHero, stage) end}
self.W = { Slot = _W, DamageName = "W", Range = 1150, Width = 40, Delay = 0, Speed = 3000, LastCastTime = 0, Collision = true, Aoe = true, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_W) == READY end, Mana = function() return myHero:GetSpellData(_W).mana end, Damage = function(target, stage) return getDmg("W", target, myHero, stage) end}
self.E = { Slot = _E, DamageName = "E", Range = 925, Width = 120, Delay = 0.25, Speed = 2500, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.CIRCULAR, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Mana = function() return myHero:GetSpellData(_E).mana end, Damage = function(target, stage) return getDmg("E", target, myHero, stage) end}
self.R = { Slot = _R, DamageName = "R", Range = 0, Width = 420, Delay = 0.3, Speed = math.huge, LastCastTime = 0, Collision = false, NextSpell = "", HaveBuff = false, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Mana = function() return myHero:GetSpellData(_R).mana end, Damage = function(target, stage) return getDmg("R", target, myHero, stage) end}
self:LoadVariables()
self:LoadMenu()
end
function _Heimerdinger:LoadVariables()
self.LastFarmRequest = 0
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, 1100, DAMAGE_MAGIC)
self.EnemyMinions = minionManager(MINION_ENEMY, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 700, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."28042015")
self.QSpell = _Spell(self.Q):AddDraw()
self.WSpell = _Spell(self.W):AddDraw()
self.ESpell = _Spell(self.E):AddDraw()
self.RSpell = _Spell(self.R)
end
function _Heimerdinger:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useRQ", "Use RQ If Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5, 0)
self.Menu.Combo:addParam("useRW", "Use RW If Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useRE", "Use RE If Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("Zhonyas", "Use Zhonyas if %hp <", SCRIPT_PARAM_SLICE, 15, 0, 100)
self.Menu.Combo:addParam("Zhonyas2", "Use Zhonyas After RQ", SCRIPT_PARAM_SLICE, 15, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q If Hit >= ", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.LastHit:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useRQ", "Use RQ", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useRW", "Use RW", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useRE", "Use RE", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addSubMenu("Use E To Interrupt", "useE")
_Interrupter(self.Menu.Auto.useE):CheckChannelingSpells():CheckGapcloserSpells():AddCallback(function(target) self:CastE(target) end)
self.Menu.Auto:addSubMenu("Use Q To Evade", "useQ")
_Evader(self.Menu.Auto.useQ):CheckCC():AddCallback(function(target) self:EvadeQ(target) end)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("HarassToggle", "Harass (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("L"))
self.Menu.Keys:permaShow("HarassToggle")
self.Menu.Keys.HarassToggle = false
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.TS:update()
self:KillSteal()
if self.R.HaveBuff and self.R.NextSpell ~= "" and ValidTarget(self.TS.target) then
if self.R.NextSpell == "Q" and self.Q.IsReady() then
self:CastQ(self.TS.target)
return
elseif self.R.NextSpell == "W" and self.W.IsReady() then
self:CastW(self.TS.target)
return
elseif self.R.NextSpell == "E" and self.E.IsReady() then
self:CastE(self.TS.target)
return
else
end
end
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.Keys.HarassToggle then self:Harass() end
end
)
--[[
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or not self.MenuLoaded then return end
if unit and spell and spell.name and unit.isMe then
if spell.name:lower() == "" then
elseif spell.name:lower() == "heimerdingerq" then
self.Q.LastCastTime = os.clock()
DelayAction(
function()
if self.R.HaveBuff and DefensiveItems.Zhonyas.IsReady() and ValidTarget(self.TS.target) and self.Menu.Combo.Zhonyas2 and not OrbwalkManager:IsNone() then
CastSpell(DefensiveItems.Zhonyas.Slot())
end
end
, self.Q.Delay)
elseif spell.name:lower() == "heimerdingerw" then
self.W.LastCastTime = os.clock()
elseif spell.name:lower() == "heimerdingere" then
self.E.LastCastTime = os.clock()
elseif spell.name:lower() == "Heimerdingerr" then
self.R.LastCastTime = os.clock()
end
end
end
)]]
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if iSpell == self.QSpell.Slot then
self.Q.LastCastTime = os.clock()
DelayAction(
function()
if self.R.HaveBuff and DefensiveItems.Zhonyas.IsReady() and ValidTarget(self.TS.target) and self.Menu.Combo.Zhonyas2 and not OrbwalkManager:IsNone() then
CastSpell(DefensiveItems.Zhonyas.Slot())
end
end
, self.Q.Delay)
elseif iSpell == self.WSpell.Slot then
self.W.LastCastTime = os.clock()
elseif iSpell == self.ESpell.Slot then
self.E.LastCastTime = os.clock()
elseif iSpell == self.RSpell.Slot then
self.R.LastCastTime = os.clock()
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
end
)
AddCreateObjCallback(
function(obj)
--if obj and obj.name and obj.name:lower():find("heimer") then print("Created "..obj.name) end
if obj and obj.name and obj.name:lower():find("heimerdinger") and obj.name:lower():find("_r_beam") then self.R.HaveBuff = true end
end
)
AddDeleteObjCallback(
function(obj)
--if obj and obj.name and obj.name:lower():find("heimer") then print("Deleted "..obj.name) end
if obj and obj.name and obj.name:lower():find("heimerdinger") and obj.name:lower():find("_r_beam") then
self.R.NextSpell = ""
self.R.HaveBuff = false
end
end
)
self.MenuLoaded = true
end
function _Heimerdinger:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.4 and ValidTarget(enemy, self.TS.range) and enemy.visible then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health and enemy.health > 0 then
if self.Q.IsReady() and self.Menu.KillSteal.useQ and (q or self.Q.Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.W.IsReady() and self.Menu.KillSteal.useW and (w or self.W.Damage(enemy) > enemy.health) and not enemy.dead then self:CastW(enemy) end
if self.E.IsReady() and self.Menu.KillSteal.useE and (e or self.E.Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.Menu.KillSteal.useRQ and self.R.Damage(enemy, 1) > enemy.health and not enemy.dead then self:CastRQ(enemy) end
if self.Menu.KillSteal.useRW and self.R.Damage(enemy, 2) * 4 > enemy.health and not enemy.dead then self:CastRW(enemy) end
if self.Menu.KillSteal.useRE and self.R.Damage(enemy, 3) * 3 > enemy.health and not enemy.dead then self:CastRE(enemy) end
end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead and ValidTarget(enemy, Ignite.Range) then CastSpell(igniteslot, enemy) end
end
end
end
function _Heimerdinger:Combo()
local target = self.TS.target
if not ValidTarget(target) then return end
if myHero.health/myHero.maxHealth*100 < self.Menu.Combo.Zhonyas and DefensiveItems.Zhonyas.IsReady() then CastSpell(DefensiveItems.Zhonyas.Slot()) end
if self.Menu.Combo.useRQ > 0 and self.Q.IsReady() and self.R.IsReady() and self.Menu.Combo.useRQ <= CountEnemies(myHero, self.Q.Range + self.Turret.Range) then self:CastRQ(target) end
if self.Menu.Combo.useRE and self.E.IsReady() and self.R.IsReady() and self.R.Damage(target, 3) * 3 > target.health then self:CastRE(target) end
if self.Menu.Combo.useRW and self.W.IsReady() and self.R.IsReady() and self.R.Damage(target, 2) * 4 > target.health then self:CastRW(target) end
if self.Menu.Combo.useItems then UseItems(target) end
if self.Menu.Combo.useE then self:CastE(target) end
if self.Menu.Combo.useW then self:CastW(target) end
if self.Menu.Combo.useQ then self:CastQ(target) end
end
function _Heimerdinger:Harass()
local target = self.TS.target
if not ValidTarget(target) or myHero.mana/myHero.maxMana * 100 < self.Menu.Harass.Mana then return end
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Harass.useW then self:CastW(target) end
if self.Menu.Harass.useQ then self:CastQ(target) end
end
function _Heimerdinger:Clear()
self.EnemyMinions:update()
self.JungleMinions:update()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
for i, minion in pairs(self.EnemyMinions.objects) do
if self.Menu.LaneClear.useQ > 0 and os.clock() - self.LastFarmRequest > 0.2 and ValidTarget(minion, self.Q.Range + self.Turret.Range*2/3) and self.Q.IsReady() and not minion.dead then
local BestPos, Count = GetBestCircularFarmPosition(self.Q.Range, self.Turret.Range, self.EnemyMinions.objects)
if Count >= self.Menu.LaneClear.useQ then
self:CastQ(BestPos)
end
self.LastFarmRequest = os.clock()
end
if self.Menu.LaneClear.useE and ValidTarget(minion, self.E.Range) and self.E.IsReady() and not minion.dead then
self:CastE(minion)
end
if self.Menu.LaneClear.useW and ValidTarget(minion, self.W.Range) and self.W.IsReady() and not minion.dead then
self:CastW(minion)
end
end
end
for i, minion in pairs(self.JungleMinions.objects) do
if self.Menu.JungleClear.useQ and ValidTarget(minion, self.Q.Range + self.Turret.Range*2/3) and self.Q.IsReady() and not minion.dead then
self:CastQ(minion)
end
if self.Menu.JungleClear.useE and ValidTarget(minion, self.E.Range) and self.E.IsReady() and not minion.dead then
self:CastE(minion)
end
if self.Menu.JungleClear.useW and ValidTarget(minion, self.W.Range) and self.W.IsReady() and not minion.dead then
self:CastW(minion)
end
end
end
function _Heimerdinger:LastHit()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LastHit.Mana and os.clock() - self.LastFarmRequest > 0.05 then
if self.Menu.LastHit.useW then
self.WSpell:LastHit()
end
if self.Menu.LastHit.useE then
self.ESpell:LastHit()
end
self.LastFarmRequest = os.clock()
end
end
function _Heimerdinger:CastQ(target)
if ValidTarget(target) then
self.QSpell:Cast(target)
end
end
function _Heimerdinger:CastW(target)
if ValidTarget(target) then
self.WSpell:Cast(target)
end
end
function _Heimerdinger:CastE(target)
if ValidTarget(target) then
self.ESpell:Cast(target)
end
end
function _Heimerdinger:CastRQ(target)
if self.R.IsReady() and ValidTarget(target, self.TS.range) then
CastSpell(self.R.Slot)
self.R.NextSpell = "Q"
end
if self.Q.IsReady() then DelayAction(function() self:CastQ(target) end, self.R.Delay) end
end
function _Heimerdinger:CastRW(target)
if self.R.IsReady() and ValidTarget(target, self.TS.range) then
CastSpell(self.R.Slot)
self.R.NextSpell = "W"
end
if self.W.IsReady() then DelayAction(function() self:CastW(target) end, self.R.Delay) end
end
function _Heimerdinger:CastRE(target)
if self.R.IsReady() and ValidTarget(target, self.TS.range) then
CastSpell(self.R.Slot)
self.R.NextSpell = "E"
end
if self.E.IsReady() then DelayAction(function() self:CastE(target) end, self.R.Delay) end
end
function _Heimerdinger:EvadeQ(target)
if self.Q.IsReady() and ValidTarget(target, 800) then
local linear = Vector(myHero) + Vector(Vector(target) - Vector(myHero)):normalized():perpendicular() * 100
CastSpell(self.Q.Slot, linear.x, linear.z)
end
end
function _Heimerdinger:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.Q.Mana()
end
if w then
comboDamage = comboDamage + self.W.Damage(target) * 4
currentManaWasted = currentManaWasted + self.W.Mana()
end
if e then
comboDamage = comboDamage + self.E.Damage(target)
currentManaWasted = currentManaWasted + self.E.Mana()
comboDamage = comboDamage + self.AA.Damage(target)
end
if r then
comboDamage = comboDamage + self.R.Damage(target, 2) * 4
currentManaWasted = currentManaWasted + self.R.Mana()
end
comboDamage = comboDamage + self.AA.Damage(target) * 2
comboDamage = comboDamage + DamageItems(target)
local iDmg = Ignite.IsReady() and Ignite.Damage(target) or 0
comboDamage = comboDamage + iDmg
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Heimerdinger:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Irelia"
function _Irelia:__init()
self.ScriptName = "Dat Butt Irelia"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.Passive = { Damage = function(target) return getDmg("P", target, myHero) end, IsReady = false}
self.AA = { Range = function(target) local int1 = 50 if ValidTarget(target) then int1 = GetDistance(target.minBBox, target)/2 end return myHero.range + GetDistance(myHero, myHero.minBBox) + int1 end, Damage = function(target) return getDmg("AD", target, myHero) end }
self.Q = { Slot = _Q, DamageName = "Q", Range = 650, Width = 0, Delay = 0, Speed = 2200, LastCastTime = 0, Collision = true, Type = SPELL_TYPE.TARGETTED, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Mana = function() return myHero:GetSpellData(_Q).mana end, Damage = function(target) return getDmg("Q", target, myHero) + getDmg("AD", target, myHero) end}
self.W = { Slot = _W, DamageName = "W", Range = myHero.range + GetDistance(myHero, myHero.minBBox) + 50, Width = 315, Delay = 0, Speed = math.huge, LastCastTime = 0, Collision = false, Type = SPELL_TYPE.SELF, IsReady = function() return myHero:CanUseSpell(_W) == READY end, Mana = function() return myHero:GetSpellData(_W).mana end, Damage = function(target) return getDmg("W", target, myHero) end}
self.E = { Slot = _E, DamageName = "E", Range = 350, Width = 160, Delay = 0.25, Speed = math.huge, LastCastTime = 0, Collision = false, Type = SPELL_TYPE.TARGETTED, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Mana = function() return myHero:GetSpellData(_E).mana end, Damage = function(target) return getDmg("E", target, myHero) end}
self.R = { Slot = _R, DamageName = "R", Range = 1000, Width = 120, Delay = 0, Speed = 1600, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Mana = function() return myHero:GetSpellData(_R).mana end, Damage = function(target) return getDmg("R", target, myHero) end}
self:LoadVariables()
self:LoadMenu()
end
function _Irelia:LoadVariables()
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, 900, DAMAGE_PHYSICAL)
self.EnemyMinions = minionManager(MINION_ENEMY, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 700, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."20062015")
self.QSpell = _Spell(self.Q):AddDraw()
self.WSpell = _Spell(self.W)
self.ESpell = _Spell(self.E):AddDraw()
self.RSpell = _Spell(self.R):AddDraw()
end
function _Irelia:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
self.Menu.TS:addParam("Combo", "Range for Combo", SCRIPT_PARAM_SLICE, 900, 150, 1100, 0)
self.Menu.TS:addParam("Harass", "Range for Harass", SCRIPT_PARAM_SLICE, 350, 150, 900, 0)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = true})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("minQRange", "Min. Q Range", SCRIPT_PARAM_SLICE, 250, 0, 650)
self.Menu.Combo:addParam("useQMinion","Use Q On Minion To GapClose", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_LIST, 3, { "Never", "To Stun", "Smart", "Always"})
self.Menu.Combo:addParam("useR","Use R", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useRMinion","Use R On Minion To GapClose", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useItems","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_LIST, 1, {"Never", "If Killable" , "Always"})
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("minQRange", "Min. Q Range", SCRIPT_PARAM_SLICE, 250, 0, 650)
self.Menu.Harass:addParam("useQMinion","Use Q on Minion To GapClose", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - Clear Settings", "Clear")
self.Menu.Clear:addParam("useQ", "Use Q", SCRIPT_PARAM_LIST, 2, { "Never", "Smart", "Always"})
self.Menu.Clear:addParam("minQRange", "Min. Q Range", SCRIPT_PARAM_SLICE, 0, 0, 650)
self.Menu.Clear:addParam("maxQRange", "Max. Q Range", SCRIPT_PARAM_SLICE, 450, 0, 650)
self.Menu.Clear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Clear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Clear:addParam("Mana", "Min. Mana Percent", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - Last Hit Settings", "LastHit")
self.Menu.LastHit:addParam("useQ", "Use Q", SCRIPT_PARAM_LIST, 3, { "Never", "Smart", "Always"})
self.Menu.LastHit:addParam("minQRange", "Min. Q Range", SCRIPT_PARAM_SLICE, 0, 0, 650)
self.Menu.LastHit:addParam("maxQRange", "Max. Q Range", SCRIPT_PARAM_SLICE, 450, 0, 650)
self.Menu.LastHit:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addSubMenu("Use QE To Interrupt", "useQE")
_Interrupter(self.Menu.Auto.useQE):CheckChannelingSpells():AddCallback(function(target) self:ForceQE(target) end)
self.Menu.Auto:addSubMenu("Use E To Interrupt", "useE")
_Interrupter(self.Menu.Auto.useE):CheckChannelingSpells():CheckGapcloserSpells():AddCallback(function(target) self:CastE(target, 2) end)
--self.Menu.Auto:addSubMenu("Use Q To Evade", "useQ")
--_Evader(self.Menu.Auto.useQ):CheckCC():AddCallback(function(target) self:EvadeQ(target) end)
self.Menu.Auto:addParam("AutoE", "Auto E to Stun", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu.Misc:addParam("developer", "Developer Mode", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("Run", "Run", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.TS.range = self:GetRange()
self.TS:update()
if not OrbwalkManager:IsNone() or self.Menu.Keys.Run then self.EnemyMinions:update() self.JungleMinions:update() end
if self.Menu.Auto.AutoE and self.E.IsReady() then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy) and self:CanStun(enemy) and ValidTarget(enemy, self.E.Range) then
self:CastE(enemy, 2)
end
end
end
if self.Menu.KillSteal.useQ or self.Menu.KillSteal.useE or self.Menu.KillSteal.useR or self.Menu.KillSteal.useIgnite then self:KillSteal() end
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.Keys.Run then self:Run() end
end
)
--[[
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or not self.MenuLoaded then return end
if unit and spell and spell.name and unit.isMe then
if spell.name:lower() == "ireliagatotsu" then self.Q.LastCastTime = os.clock()
elseif spell.name:lower() == "ireliahitenstyle" then self.E.LastCastTime = os.clock()
elseif spell.name:lower() == "ireliaequilibriumstrike" then self.W.LastCastTime = os.clock()
elseif spell.name:lower() == "ireliatranscendentblades" then self.R.LastCastTime = os.clock()
end
end
end
)]]
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if myHero.dead or not self.MenuLoaded then return end
if iSpell == self.QSpell.Slot then
self.Q.LastCastTime = os.clock()
elseif iSpell == self.WSpell.Slot then
self.W.LastCastTime = os.clock()
elseif iSpell == self.ESpell.Slot then
self.E.LastCastTime = os.clock()
elseif iSpell == self.RSpell.Slot then
self.R.LastCastTime = os.clock()
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
end
)
self.MenuLoaded = true
end
function _Irelia:GetRange()
if OrbwalkManager:IsCombo() then return self.Menu.TS.Combo
elseif OrbwalkManager:IsHarass() then return self.Menu.TS.Harass
else return self.Menu.TS.Combo
end
end
function _Irelia:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.4 and ValidTarget(enemy, self.R.Range) and enemy.visible then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
if self.Menu.KillSteal.useQ and ( q or self.Q.Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.Menu.KillSteal.useE and ( e or self.E.Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.Menu.KillSteal.useR and ( r or self.R.Damage(enemy) > enemy.health) and not enemy.dead then self:CastR(enemy) end
end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead then CastIgnite(enemy) end
end
end
end
function _Irelia:Run()
myHero:MoveTo(mousePos.x, mousePos.z)
if self.E.IsReady() then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy) and enemy.visible and self:CanStun(enemy) and ValidTarget(enemy, self.E.Range) then
self:CastE(enemy, 2)
end
end
end
if ValidTarget(self.TS.target) and self.Q.IsReady() then
for i, minion in pairs(self.EnemyMinions.objects) do
if GetDistanceSqr(self.TS.target, minion) > GetDistanceSqr(self.TS.target, myHero) then self:CastQ(minion) end
end
end
end
function _Irelia:Combo()
local target = self.TS.target
if ValidTarget(target, self.TS.range) then
if self.Menu.Combo.useIgnite > 1 and Ignite.IsReady() then
if self.Menu.Combo.useIgnite == 2 then
local q, w, e, r, dmg = GetBestCombo(target)
if dmg > target.health then CastIgnite(target) end
else
CastIgnite(target)
end
end
if self.Menu.Combo.useItems then UseItems(target) end
--if TargetHaveBuff("sheen", myHero) then return end
if ValidTarget(target, self.Q.Range) and self.Menu.Combo.useQ and GetDistanceSqr(myHero, target) > self.Menu.Combo.minQRange * self.Menu.Combo.minQRange then
self:CastQ(target)
elseif self.Q.IsReady() and (self.Menu.Combo.useQMinion or self.Menu.Combo.useRMinion) and not ValidTarget(target, self.Q.Range) and self.Menu.Combo.useQ and GetDistanceSqr(myHero, target) > self.Menu.Combo.minQRange * self.Menu.Combo.minQRange then
local QMinion = self:CastQMinion()
local RMinion = self:CastRMinion()
if QMinion ~= nil and ValidTarget(QMinion) and GetDistanceSqr(QMinion, target) < GetDistanceSqr(myHero, target) and self.Menu.Combo.useQMinion then CastSpell(_Q, QMinion)
elseif RMinion ~= nil and ValidTarget(RMinion) and self.Menu.Combo.useRMinion and GetDistanceSqr(RMinion, target) < GetDistanceSqr(myHero, target) then
local CastPosition, HitChance, Position = self.RSpell:GetPrediction(RMinion)
CastSpell(self.R.Slot, CastPosition.x, CastPosition.z)
DelayAction(function() CastSpell(self.Q.Slot, RMinion) end, GetDistance(myHero, RMinion)/self.R.Speed + 0.1)
end
end
if self.Menu.Combo.useE > 0 then self:CastE(target, self.Menu.Combo.useE) end
if self.Menu.Combo.useW then self:CastW(target) end
if self.Menu.Combo.useR and myHero.health/myHero.maxHealth < 0.95 then self:CastR(target) end
end
end
function _Irelia:Harass()
local target = self.TS.target
if ValidTarget(target, self.TS.range) and 100 * myHero.mana / myHero.maxMana >= self.Menu.Harass.Mana then
if ValidTarget(target, self.Q.Range) and self.Menu.Harass.useQ and GetDistanceSqr(myHero, target) > self.Menu.Harass.minQRange * self.Menu.Harass.minQRange then
self:CastQ(target)
elseif self.Menu.Harass.useQMinion and self.Menu.Harass.useQ and GetDistanceSqr(myHero, target) > self.Menu.Harass.minQRange * self.Menu.Harass.minQRange then
local QMinion = self:CastQMinion()
if QMinion ~= nil and ValidTarget(QMinion) and GetDistanceSqr(QMinion, target) < GetDistanceSqr(myHero, target) then CastSpell(self.Q.Slot, QMinion) end
end
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Harass.useW then self:CastW(target) end
end
end
function _Irelia:Clear()
if 100 * myHero.mana / myHero.maxMana >= self.Menu.Clear.Mana then
if self.Menu.Clear.useQ then
local minion = self.QSpell:LastHit({ Mode = self.Menu.Clear.useQ, UseCast = false})
if ValidTarget(minion) and GetDistanceSqr(myHero, minion) > self.Menu.Clear.minQRange * self.Menu.Clear.minQRange and GetDistanceSqr(myHero, minion) < self.Menu.Clear.maxQRange * self.Menu.Clear.maxQRange then
self:CastQ(minion)
end
end
if self.Menu.Clear.useQ or self.Menu.LastHit.useW or self.Menu.LastHit.useE then
for i, minion in pairs(self.EnemyMinions.objects) do
if self.Menu.Clear.useW then self:CastW(minion) end
if self.Menu.Clear.useE then self:CastE(minion) end
end
for i, minion in pairs(self.JungleMinions.objects) do
if self.Menu.Clear.useW then self:CastW(minion) end
if self.Menu.Clear.useQ and GetDistanceSqr(myHero, minion) < self.Menu.Clear.maxQRange * self.Menu.Clear.maxQRange then self:CastQ(minion) end
if self.Menu.Clear.useE then self:CastE(minion) end
end
end
end
end
function _Irelia:LastHit()
if 100 * myHero.mana / myHero.maxMana >= self.Menu.LastHit.Mana then
if self.Menu.LastHit.useQ then
local minion = self.QSpell:LastHit({ Mode = self.Menu.LastHit.useQ, UseCast = false})
if ValidTarget(minion) and GetDistanceSqr(myHero, minion) > self.Menu.LastHit.minQRange * self.Menu.LastHit.minQRange and GetDistanceSqr(myHero, minion) < self.Menu.LastHit.maxQRange * self.Menu.LastHit.maxQRange then
self:CastQ(minion)
end
end
if self.Menu.LastHit.useE then
self.ESpell:LastHit({ Mode = LASTHIT_MODE.ALWAYS})
end
end
end
function _Irelia:CastQ(target)
if self.Q.IsReady() and ValidTarget(target, self.Q.Range) then
CastSpell(self.Q.Slot, target)
end
end
function _Irelia:CastW(target)
if self.W.IsReady() and ValidTarget(target, self.AA.Range(target) + 100) then
CastSpell(self.W.Slot)
end
end
function _Irelia:CastE(target, mod)
local mode = mod or 4
if self.E.IsReady() and ValidTarget(target, self.E.Range) then
if mode == 2 then
if self:CanStun(target) then CastSpell(self.E.Slot, target) end
elseif mode == 3 then
if self:CanStun(target) then
CastSpell(self.E.Slot, target)
elseif GetDistanceSqr(myHero, target) > (self.AA.Range(target) + (self.E.Range - self.AA.Range(target))/3) * (self.AA.Range(target) + (self.E.Range - self.AA.Range(target))/3) and GetDistanceSqr(myHero, target) <= self.E.Range * self.E.Range then
CastSpell(self.E.Slot, target)
else
local q, w, e, r, dmg = GetBestCombo(target)
if e and dmg > target.health then CastSpell(self.E.Slot, target) end
end
elseif mode == 4 then
CastSpell(self.E.Slot, target)
end
end
end
function _Irelia:CastR(target)
if ValidTarget(target) then
self.RSpell:Cast(target)
end
end
function _Irelia:CastQMinion()
if self.Q.IsReady() then
local minion = self.QSpell:LastHit({ Mode = LASTHIT_MODE.ALWAYS, UseCast = false})
return minion
end
return nil
end
function _Irelia:CastRMinion()
if self.R.IsReady() then
for i, minion in pairs(self.EnemyMinions.objects) do
if not minion.dead and ValidTarget(minion, self.Q.Range) and minion.valid and minion.health > self.R.Damage(minion) and minion.health < self.Q.Damage(minion) + self.R.Damage(minion) then
return minion
end
end
end
return nil
end
function _Irelia:EvadeQ(target)
if ValidTarget(target, self.Q.Range + 500) and self.Q.IsReady() then
for i, minion in pairs(self.EnemyMinions.objects) do
if GetDistanceSqr(target, minion) > GetDistanceSqr(target, myHero) and self.Q.IsReady() then self:CastQ(minion) end
end
end
end
function _Irelia:CanStun(target)
return ValidTarget(target) and target.health/target.maxHealth * 100 >= myHero.health/myHero.maxHealth*100
end
function _Irelia:ForceQE(target)
if self.E.IsReady() and ValidTarget(target, self.E.Range) then
self:CastE(target, 2)
elseif self.Q.IsReady() and ValidTarget(target, self.Q.Range) and self:CanStun(target) then
self:CastQ(target)
end
end
function _Irelia:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.Q.Mana()
end
if w then
comboDamage = comboDamage + self.W.Damage(target)
currentManaWasted = currentManaWasted + self.W.Mana()
comboDamage = comboDamage + self.AA.Damage(target)
end
if e then
comboDamage = comboDamage + self.E.Damage(target)
currentManaWasted = currentManaWasted + self.E.Mana()
if self:CanStun(target) then comboDamage = comboDamage + self.AA.Damage(target) * 2 end
end
if r and os.clock() - self.R.LastCastTime > 15 then
comboDamage = comboDamage + self.R.Damage(target) * 4
currentManaWasted = currentManaWasted + self.R.Mana()
end
comboDamage = comboDamage + self.AA.Damage(target)
comboDamage = comboDamage + DamageItems(target)
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Irelia:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Lissandra"
function _Lissandra:__init()
self.ScriptName = "The Ice Witch"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.Passive = { Damage = function(target) return getDmg("P", target, myHero) end, IsReady = false}
self.AA = { Range = function(target) local int1 = 0 if ValidTarget(target) then int1 = GetDistance(target.minBBox, target)/2 end return myHero.range + GetDistance(myHero, myHero.minBBox) + int1 end, Damage = function(target) return getDmg("AD", target, myHero) end }
self.Q = { Slot = _Q, DamageName = "Q", Range = 715, MinRange = 725, MaxRange = 825, Width = 75, MinWidth = 75, MaxWidth = 100, Delay = 0.25, Speed = 2250, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.LINEAR, LastRequest2 = 0, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Mana = function() return myHero:GetSpellData(_Q).mana end, Damage = function(target) return getDmg("Q", target, myHero) end, LastRange = 0}
self.W = { Slot = _W, DamageName = "W", Range = 450, Width = 440, Delay = 0.25, Speed = math.huge, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.SELF, IsReady = function() return (myHero:CanUseSpell(_W) == 3 or myHero:CanUseSpell(_W) == READY) end, Mana = function() return myHero:GetSpellData(_W).mana end, Damage = function(target) return getDmg("W", target, myHero) end}
self.E = { Slot = _E, DamageName = "E", Range = 1050, Width = 110, Delay = 0.25, Speed = 850, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Mana = function() return myHero:GetSpellData(_E).mana end, Damage = function(target) return getDmg("E", target, myHero) end, CastObj = nil, EndObj = nil, MissileObj = nil}
self.R = { Slot = _R, DamageName = "R", Range = 550, Width = 550, Delay = 0.25, Speed = math.huge, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.SELF, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Mana = function() return myHero:GetSpellData(_R).mana end, Damage = function(target) return getDmg("R", target, myHero) end}
self:LoadVariables()
self:LoadMenu()
end
function _Lissandra:LoadVariables()
self.LastFarmRequest = 0
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, self.E.Range, DAMAGE_MAGIC)
self.EnemyMinions = minionManager(MINION_ENEMY, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 700, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."25042015")
self.QSpell = _Spell(self.Q):AddDraw():AddRangeFunction(function() return self.Q.Range end)
self.WSpell = _Spell(self.W):AddDraw()
self.ESpell = _Spell(self.E):AddDraw():SetAccuracy(35)
self.RSpell = _Spell(self.R):AddDraw()
end
function _Lissandra:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_LIST, 2, { "Never", "If Needed" ,"Always"})
self.Menu.Combo:addParam("useR","Use R If Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5, 0)
self.Menu.Combo:addParam("useR2","Use R In Target If Is Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("Zhonyas","Use Zhonyas if %hp <", SCRIPT_PARAM_SLICE, 15, 0, 100)
self.Menu.Combo:addParam("useItems","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q If Hit >= ", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useW", "Use W If Hit >=", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useE", "Use E If Hit >=", SCRIPT_PARAM_SLICE, 8, 0, 10)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.LastHit:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.LastHit:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addSubMenu("Use R To Interrupt", "useR")
_Interrupter(self.Menu.Auto.useR):CheckChannelingSpells():AddCallback(function(target) self:CastR(target) end)
self.Menu.Auto:addSubMenu("Use W To Interrupt", "useW")
_Interrupter(self.Menu.Auto.useW):CheckChannelingSpells():CheckGapcloserSpells():AddCallback(function(target) self:CastW(target) end)
self.Menu.Auto:addParam("useW","Use W If Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5, 0)
self.Menu.Auto:addParam("useWTurret","Use W In Turret", SCRIPT_PARAM_ONOFF, true)
self.Menu.Auto:addParam("useRTurret","Use R In Turret", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
if #GetEnemyHeroes() > 0 then
self.Menu.Misc:addSubMenu("Don't Use R On: ", "DontR")
for idx, enemy in ipairs(GetEnemyHeroes()) do
self.Menu.Misc.DontR:addParam(enemy.charName, enemy.charName, SCRIPT_PARAM_ONOFF, false)
end
end
self.Menu.Misc:addParam("developer", "Developer Mode", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("Passive", "Text if Passive Ready", SCRIPT_PARAM_ONOFF, true)
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("HarassToggle", "Harass (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("L"))
self.Menu.Keys:addParam("Flee", "Flee", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
self.Menu.Keys:permaShow("HarassToggle")
self.Menu.Keys.Flee = false
self.Menu.Keys.HarassToggle = false
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.Q.Range = self:QRange(self.TS.target)
self.TS.range = self.E.IsReady() and self.E.Range or self.Q.Range
self.TS:update()
self:CheckAuto()
self:KillSteal()
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.Keys.HarassToggle then self:Harass() end
if self.Menu.Keys.Flee then self:Flee() end
end
)
--[[
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or not self.MenuLoaded then return end
if unit and spell and spell.name and unit.isMe then
if spell.name:lower():find("lissandraq") then self.Q.LastCastTime = os.clock()
elseif spell.name:lower():find("lissandraw") then self.W.LastCastTime = os.clock()
elseif spell.name:lower():find("lissandraemissile") then self.E.LastCastTime = os.clock()
elseif spell.name:lower():find("lissandrar") then self.R.LastCastTime = os.clock() end
end
end
)]]
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if myHero.dead or not self.MenuLoaded then return end
if iSpell == self.QSpell.Slot then
self.Q.LastCastTime = os.clock()
elseif iSpell == self.WSpell.Slot then
self.W.LastCastTime = os.clock()
elseif iSpell == self.ESpell.Slot then
self.E.LastCastTime = os.clock()
self.E.MissileObj = nil
elseif iSpell == self.RSpell.Slot then
self.R.LastCastTime = os.clock()
end
end
)
AddCreateObjCallback(
function(obj)
if obj == nil then return end
if obj.name:lower():find("lissandra") and obj.name:lower():find("passive_ready") then
self.Passive.IsReady = true
elseif obj.name:lower():find("missile") and self.E.MissileObj == nil and (obj.spellOwner and obj.spellOwner.isMe or GetDistanceSqr(myHero, obj) < 50 * 50) and os.clock() - self.E.LastCastTime < 0.35 then
self.E.MissileObj = obj
elseif obj.name:lower():find("lissandra") and obj.name:lower():find("e_cast.troy") and os.clock() - self.E.LastCastTime < 0.5 then
self.E.CastObj = obj
elseif obj.name:lower():find("lissandra") and obj.name:lower():find("e_end.troy") and os.clock() - self.E.LastCastTime < 0.5 then
self.E.EndObj = obj
end
end
)
AddDeleteObjCallback(
function(obj)
if obj.name:lower():find("lissandra") and obj.name:lower():find("passive_ready") then
self.Passive.IsReady = false
elseif self.E.MissileObj ~= nil and obj.name:lower():find("missile") and (obj.spellOwner and obj.spellOwner.isMe or GetDistanceSqr(self.E.MissileObj, obj) < 80 * 80) then
self.E.MissileObj = nil
elseif self.E.CastObj ~= nil and obj.name:lower():find("lissandra") and obj.name:lower():find("e_cast.troy") and GetDistanceSqr(obj, self.E.CastObj) < 80 * 80 then
self.E.CastObj = nil
elseif self.E.EndObj ~= nil and obj.name:lower():find("lissandra") and obj.name:lower():find("e_end.troy") and GetDistanceSqr(obj, self.E.EndObj) < 80 * 80 then
self.E.EndObj = nil
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
if self.Menu.Draw.Passive and self.Passive.IsReady then
local target = self.TS.target
if ValidTarget(target, self.TS.range) then
local pos = WorldToScreen(D3DXVECTOR3(target.x, target.y, target.z))
DrawText("Harass Him!", 16, pos.x, pos.y, Colors.White)
end
end
end
)
self.MenuLoaded = true
end
function _Lissandra:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth <= 0.4 and ValidTarget(enemy, self.TS.range) and enemy.visible and enemy.health > 0 then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health and enemy.health > 0 then
if self.Q.IsReady() and self.Menu.KillSteal.useQ and (q or self.Q.Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.W.IsReady() and self.Menu.KillSteal.useW and (w or self.W.Damage(enemy) > enemy.health) and not enemy.dead then self:CastW(enemy) end
if self.E.IsReady() and self.Menu.KillSteal.useE and (e or self.E.Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.R.IsReady() and self.Menu.KillSteal.useR and (r or self.R.Damage(enemy) > enemy.health) and not enemy.dead then self:CastR(enemy) end
end
if self.Menu.KillSteal.useIgnite and Ignite.Damage(enemy) > enemy.health and enemy.health > 0 then CastIgnite(enemy) end
end
end
end
function _Lissandra:Flee()
myHero:MoveTo(mousePos.x, mousePos.z)
if self.E.IsReady() and self:IsE1() then
CastSpell(self.E.Slot, mousePos.x, mousePos.z)
elseif self.E.IsReady() and not self:IsE1() then
if self.E.EndObj~= nil then
self:CastE2(self.E.EndObj)
end
end
end
function _Lissandra:CheckAuto()
if self.W.IsReady() and self.Menu.Auto.useW > 0 and self.Menu.Auto.useW <= #self.WSpell:ObjectsInArea(GetEnemyHeroes()) then CastSpell(self.W.Slot) end
if self.Menu.Auto.useWTurret and self.W.IsReady() then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.W.Range) then
if EnemyInMyTurret(enemy, self.W.Range) then
self:CastW(enemy)
end
end
end
end
if self.Menu.Auto.useRTurret and self.R.IsReady() then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.R.Range) then
if EnemyInMyTurret(enemy, self.R.Range) then
self:CastR(enemy)
end
end
end
end
end
function _Lissandra:Combo()
local target = self.TS.target
if not ValidTarget(target) then return end
if myHero.health/myHero.maxHealth *100 < self.Menu.Combo.Zhonyas and DefensiveItems.Zhonyas.IsReady() then CastSpell(DefensiveItems.Zhonyas.Slot()) end
if self.Menu.Combo.useItems then UseItems(target) end
if self.Menu.Combo.useR2 then
local q, w, e, r, dmg = GetBestCombo(target)
if r and dmg >= target.health then self:CastR(target) end
end
if self.R.IsReady() and self.Menu.Combo.useR > 0 and self.Menu.Combo.useR <= #self.RSpell:ObjectsInArea(GetEnemyHeroes()) then self:CastR(myHero) end
if self.Menu.Combo.useE > 1 then self:CastE(target, self.Menu.Combo.useE) end
if self.Menu.Combo.useW then self:CastW(target) end
if self.Menu.Combo.useQ then self:CastQ(target) end
end
function _Lissandra:Harass()
local target = self.TS.target
if ValidTarget(target, self.TS.range) and 100 * myHero.mana / myHero.maxMana >= self.Menu.Harass.Mana then
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Harass.useQ then self:CastQ(target) end
if self.Menu.Harass.useW then self:CastW(target) end
end
end
function _Lissandra:Clear()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if ValidTarget(minion, 900) and os.clock() - self.LastFarmRequest > 0.2 then
if self.Menu.LaneClear.useE > 0 and self.E.IsReady() then
local BestPos, Count = GetBestLineFarmPosition(self.E.Range, self.E.Width, self.EnemyMinions.objects)
if BestPos~=nil and Count >= self.Menu.LaneClear.useE then self:CastE(BestPos) end
end
if self.Menu.LaneClear.useQ > 0 and self.Q.IsReady() then
local BestPos, Count = GetBestLineFarmPosition(self.Q.Range, self.Q.Width, self.EnemyMinions.objects)
if BestPos~=nil and Count >= self.Menu.LaneClear.useQ then self:CastQ(BestPos) end
end
if self.Menu.LaneClear.useW > 0 and self.W.IsReady() and #self.WSpell:ObjectsInArea(self.EnemyMinions.objects) >= self.Menu.LaneClear.useW then
CastSpell(self.W.Slot)
end
self.LastFarmRequest = os.clock()
end
end
end
self.JungleMinions:update()
for i, minion in pairs(self.JungleMinions.objects) do
if ValidTarget(minion, 900) then
if self.Menu.JungleClear.useE and self.E.IsReady() then
self:CastE(minion)
end
if self.Menu.JungleClear.useQ and self.Q.IsReady() then
self:CastQ(minion)
end
if self.Menu.JungleClear.useW and self.W.IsReady() then
self:CastW(minion)
end
end
end
end
function _Lissandra:LastHit()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LastHit.Mana and os.clock() - self.LastFarmRequest > 0.05 then
if self.Menu.LastHit.useQ then
self.QSpell:LastHit()
end
if self.Menu.LastHit.useW then
self.WSpell:LastHit()
end
if self.Menu.LastHit.useE then
self.ESpell:LastHit()
end
self.LastFarmRequest = os.clock()
end
end
function _Lissandra:CastQ(target)
if self.Q.IsReady() and ValidTarget(target, self.Q.Range) then
self.QSpell:Cast(target)
end
end
function _Lissandra:CastW(target)
if self.W.IsReady() and ValidTarget(target) then
self.WSpell:Cast(target)
end
end
function _Lissandra:CastE(target, m)
local mode = m ~= nil and m or 3
if self.E.IsReady() then
if self:IsE1() then
self:CastE1(target, mode)
else
local pos = Prediction:GetPredictedPos(target, {Delay = GetDistance(myHero, target)/self.E.Speed})
self:CastE2(pos)
end
end
end
function _Lissandra:CastE1(target, m)
local mode = m ~= nil and m or 3
if self.E.IsReady() and self:IsE1() then
if mode == 2 then
local q, w, e, r, dmg = GetBestCombo(target)
local CastPosition, HitChance, Position = nil, nil, nil
if dmg >= target.health and e then
self:CastE1(target, 3)
else
local pos = Prediction:GetPredictedPos(target, {Delay = self.E.Delay})
if GetDistanceSqr(myHero, pos) > (self.E.Range * 2/3) * (self.E.Range * 2/3) then
local CastPosition, HitChance, Position = self.ESpell:GetPrediction(target)
if CastPosition~=nil then
CastSpell(self.E.Slot, CastPosition.x, CastPosition.z)
end
end
end
elseif mode == 3 then
self.ESpell:Cast(target)
end
end
end
function _Lissandra:CastE2(Position)
if self.E.EndObj ~= nil and self.E.CastObj ~= nil and self.E.MissileObj ~=nil and Position ~= nil then
local vectorNearToPos = VectorPointProjectionOnLine(self.E.CastObj, self.E.EndObj, Position)
if GetDistanceSqr(self.E.EndObj, self.E.MissileObj) < 80 * 80 then
CastSpell(self.E.Slot)
elseif GetDistanceSqr(vectorNearToPos, self.E.MissileObj) < 80 * 80 then
CastSpell(self.E.Slot)
end
end
end
function _Lissandra:CastR(champion)
if self.R.IsReady() then
if champion.team == myHero.team then
CastSpell(self.R.Slot, champion)
elseif ValidTarget(champion, self.R.Range) and not self.Menu.Misc.DontR[champion.charName] then
CastSpell(self.R.Slot, champion)
end
end
end
function _Lissandra:QRange(target)
local range = self.Q.MinRange
if ValidTarget(target, self.Q.MaxRange + 50) and os.clock() - self.Q.LastRequest2 > 0.1 then
local CastPosition, HitChance, Position = Prediction.VP:GetLineCastPosition(target, self.Q.Delay, self.Q.Width, self.Q.Range, self.Q.Speed, myHero, self.Q.Collision)
if CastPosition~=nil then
local function CountObjectsOnLineSegment(StartPos, EndPos, range, width, objects)
local n = 0
for i, object in ipairs(objects) do
if ValidTarget(object, range) and target.networkID ~= object.networkID then
local Position, WillHit = Prediction:GetPredictedPos(object, {Delay = self.Q.Delay + GetDistance(StartPos, object)/self.Q.Speed})
local pointSegment, pointLine, isOnSegment = VectorPointProjectionOnLineSegment(StartPos, EndPos, Position)
local w = width --+ Prediction.VP:GetHitBox(object) / 3
if isOnSegment and WillHit and GetDistanceSqr(pointSegment, Position) < w * w and GetDistanceSqr(StartPos, EndPos) > GetDistanceSqr(StartPos, Position) then
n = n + 1
if n > 0 then return n end
end
end
end
return n
end
local EndPos = Vector(myHero) + range * (Vector(CastPosition) - Vector(myHero)):normalized()
self.EnemyMinions:update()
local n = CountObjectsOnLineSegment(myHero, EndPos, range, self.Q.Width, self.EnemyMinions.objects)
if n > 0 then
range = self.Q.MaxRange
else
local n2 = CountObjectsOnLineSegment(myHero, EndPos, range, self.Q.Width, GetEnemyHeroes())
if n2 > 0 then
range = self.Q.MaxRange
end
end
end
self.Q.LastRequest2 = os.clock()
self.Q.LastRange = range
elseif os.clock() - self.Q.LastRequest2 <= 0.1 then
if self.Q.LastRange == self.Q.MinRange then
self.QSpell.Range = self.Q.MinRange
self.QSpell.Width = self.Q.MinWidth
else
self.QSpell.Range = self.Q.MaxRange
self.QSpell.Width = self.Q.MaxWidth
end
return self.Q.LastRange > 0 and self.Q.LastRange or range
end
if range == self.Q.MinRange then
self.QSpell.Range = self.Q.MinRange
self.QSpell.Width = self.Q.MinWidth
else
self.QSpell.Range = self.Q.MaxRange
self.QSpell.Width = self.Q.MaxWidth
end
return range
end
function _Lissandra:IsE1()
return self.E.MissileObj == nil
end
function _Lissandra:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.Q.Mana()
end
if w then
comboDamage = comboDamage + self.W.Damage(target)
currentManaWasted = currentManaWasted + self.W.Mana()
end
if e then
comboDamage = comboDamage + self.E.Damage(target)
currentManaWasted = currentManaWasted + self.E.Mana()
end
if r then
comboDamage = comboDamage + self.R.Damage(target)
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.R.Mana()
end
comboDamage = comboDamage + self.AA.Damage(target) * 2
comboDamage = comboDamage + DamageItems(target)
local iDmg = Ignite.IsReady() and Ignite.Damage(target) or 0
comboDamage = comboDamage + iDmg
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Lissandra:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Orianna"
function _Orianna:__init()
self.ScriptName = "The Ball Is Angry"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.Passive = { Damage = function(target) return getDmg("P", target, myHero) end, IsReady = false}
self.AA = { Range = function(target) return 620 end, Damage = function(target) return getDmg("AD", target, myHero) end }
self.Q = { Slot = _Q, DamageName = "Q", Range = 815, Width = 130, Delay = 0, Speed = 1200, Type = SPELL_TYPE.CIRCULAR, LastCastTime = 0, Collision = false, Aoe = true, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Mana = function() return myHero:GetSpellData(_Q).mana end, Damage = function(target) return getDmg("Q", target, myHero) end}
self.W = { Slot = _W, DamageName = "W", Range = 255, Width = 255, Delay = 0.25, Speed = math.huge, Type = SPELL_TYPE.SELF, LastCastTime = 0, Collision = false, Aoe = true, IsReady = function() return myHero:CanUseSpell(_W) == READY end, Mana = function() return myHero:GetSpellData(_W).mana end, Damage = function(target) return getDmg("W", target, myHero) end}
self.E = { Slot = _E, DamageName = "E", Range = 1095, Width = 85, Delay = 0, Speed = 1800, Type = SPELL_TYPE.TARGETTED_ALLY, LastCastTime = 0, Collision = false, Aoe = true, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Mana = function() return myHero:GetSpellData(_E).mana end, Damage = function(target) return getDmg("E", target, myHero) end, Missile = nil}
self.R = { Slot = _R, DamageName = "R", Range = 410, Width = 410, Delay = 0.5, Speed = math.huge, Type = SPELL_TYPE.SELF, LastCastTime = 0, Collision = false, Aoe = true, ControlPressed = false, Sent = 0, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Mana = function() return myHero:GetSpellData(_R).mana end, Damage = function(target) return getDmg("R", target, myHero) end}
self:LoadVariables()
self:LoadMenu()
end
function _Orianna:LoadVariables()
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, self.Q.Range + self.Q.Width, DAMAGE_MAGIC)
self.EnemyMinions = minionManager(MINION_ENEMY, self.Q.Range + self.Q.Width, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 600, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."06072015")
self.LastFarmRequest = 0
self.Position = myHero
self.TimeLimit = 0.1
self.ValidDistance = 2000
for i = 1, objManager.maxObjects do
local object = objManager:getObject(i)
if object and object.name and object.valid and object.name:lower():find("doomball") then
self.Position = object
end
end
self.QSpell = _Spell(self.Q):AddDraw():AddSourceFunction(function() return self.Position end):AddDrawSourceFunction(function() return myHero end)
self.WSpell = _Spell(self.W):AddDraw():AddSourceFunction(function() return self.Position end)
self.ESpell = _Spell(self.E):AddDraw():AddSourceFunction(function() return self.Position end):AddDrawSourceFunction(function() return myHero end)
self.RSpell = _Spell(self.R):AddDraw():AddSourceFunction(function() return self.Position end)
end
function _Orianna:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useW", "Use W If Enemies >= ", SCRIPT_PARAM_SLICE, 1, 0, 5)
self.Menu.Combo:addParam("useE","Use E If Hit >=", SCRIPT_PARAM_SLICE, 1, 0, 5)
self.Menu.Combo:addParam("useE2","Use E If % Health <=", SCRIPT_PARAM_SLICE, 40, 0, 100, 0)
self.Menu.Combo:addParam("useR","Use R If Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR2","Use R If Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5)
self.Menu.Combo:addParam("useIgnite","Use Ignite If Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useE","Use E For Damage", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE2","Use E If % Health <=", SCRIPT_PARAM_SLICE, 40, 0, 100, 0)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q If Hit >= ", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useW", "Use W If Hit >=", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useE", "Use E If Hit >=", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("UseQ", "Use Q", SCRIPT_PARAM_LIST, 2, {"Never", "Smart", "Always"})
self.Menu.LastHit:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.LastHit:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addSubMenu("Use R To Interrupt", "useR")
_Interrupter(self.Menu.Auto.useR):CheckChannelingSpells():AddCallback(function(target) self:ForceR(target) end)
self.Menu.Auto:addSubMenu("Use E To Initiate", "useE")
_Initiator(self.Menu.Auto.useE):CheckGapcloserSpells():AddCallback(function(unit) if ValidTarget(self.TS.target) then self:CastE(unit) end end)
self.Menu.Auto:addParam("useW", "Use W If Enemies >= ", SCRIPT_PARAM_SLICE, 3, 0, 5)
self.Menu.Auto:addParam("useR", "Use R If Enemies >= ", SCRIPT_PARAM_SLICE, 4, 0, 5)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
if VIP_USER then self.Menu.Misc:addParam("BlockR", "Block R If Will Not Hit", SCRIPT_PARAM_ONOFF, false) end
self.Menu.Misc:addParam("developer", "Developer Mode", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
_Circle({Menu = self.Menu.Draw, Name = "BallPosition", Text = "Ball Position", Source = function() return self.Position end, Range = 130, Color = { 255, 0, 0, 255 }, Width = 4})
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("HarassToggle", "Harass (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("L"))
self.Menu.Keys:addParam("Run", "Run", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
self.Menu.Keys:permaShow("HarassToggle")
self.Menu.Keys.HarassToggle = false
self.Menu.Keys.Run = false
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.TS.range = self.Q.Range + self.Q.Width
self.TS.target = _GetTarget()
self.TS:update()
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.KillSteal.useQ or self.Menu.KillSteal.useW or self.Menu.KillSteal.useE or self.Menu.KillSteal.useR or self.Menu.KillSteal.useIgnite then self:KillSteal() end
if ValidTarget(self.TS.target) and (self.Menu.Auto.useW > 0 or self.Menu.Auto.useR > 0) then self:Auto() end
if self.Menu.Keys.HarassToggle then self:Harass() end
if self.Menu.Keys.Run then self:Run() end
end
)
--[[
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or unit == nil or not self.MenuLoaded then return end
if not unit.isMe then return end
if spell.name:lower():find("oriana") and spell.name:lower():find("izuna") and spell.name:lower():find("command") then self.Q.LastCastTime = os.clock()
elseif spell.name:lower():find("oriana") and spell.name:lower():find("dissonance") and spell.name:lower():find("command") then self.W.LastCastTime = os.clock()
elseif spell.name:lower():find("oriana") and spell.name:lower():find("redact") and spell.name:lower():find("command") then self.E.LastCastTime = os.clock()
elseif spell.name:lower():find("oriana") and spell.name:lower():find("detonate") and spell.name:lower():find("command") then self.R.LastCastTime = os.clock()
end
if unit and spell and unit.isMe and spell.name:lower():find("oriana") and spell.name:lower():find("redact") and spell.name:lower():find("command") then
DelayAction(function(pos) self.Position = pos end, self.E.Delay + GetDistance(spell.endPos, self.Position) / self.E.Speed, {spell.target})
end
end
)]]
--BALL MANAGER
AddAnimationCallback(
function(unit, animation)
if unit.isMe and animation == 'Prop' then
self.Position = myHero
end
end
)
AddCreateObjCallback(
function(obj)
if not obj then return end
if obj.name:lower():find("orianna") and obj.name:lower():find("yomu") and obj.name:lower():find("ring") and obj.name:lower():find("green") then
self.Position = obj
elseif obj.name:lower():find("orianna") and obj.name:lower():find("ball") and obj.name:lower():find("flash") then
self.Position = myHero
elseif obj.name:lower() == "missile" and (obj.spellOwner and obj.spellOwner.isMe or GetDistanceSqr(self.Position, obj) < 50 * 50) and (os.clock() - self.Q.LastCastTime < 0.1 or os.clock() - self.E.LastCastTime < 0.1) then
self.Position = obj
end
end
)
AddDeleteObjCallback(
function(obj)
if not obj then return end
if obj and obj.name:lower():find("orianna") and obj.name:lower():find("yomu") and obj.name:lower():find("ring") and obj.name:lower():find("green") and GetDistanceSqr(myHero, obj) < 150 * 150 then
self.Position = myHero
end
end
)
AddTickCallback(
function()
if not self.Position.valid or GetDistanceSqr(myHero, self.Position) > self.ValidDistance * self.ValidDistance then
self.Position = myHero
end
end
)
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
end
)
if VIP_USER then
HookPackets()
end
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if iSpell == self.R.Slot and #self.RSpell:ObjectsInArea(GetEnemyHeroes()) == 0 then
self.R.Sent = os.clock() - GetLatency()/2000
end
if iSpell == self.QSpell.Slot then
self.Q.LastCastTime = os.clock()
elseif iSpell == self.WSpell.Slot then
self.W.LastCastTime = os.clock()
elseif iSpell == self.ESpell.Slot then
self.E.LastCastTime = os.clock()
if targetUnit then
DelayAction(function(pos) self.Position = pos end, self.E.Delay + GetDistance(endPos, self.Position) / self.E.Speed, {targetUnit})
end
elseif iSpell == self.RSpell.Slot then
self.R.LastCastTime = os.clock()
end
end
)
if VIP_USER then
AddSendPacketCallback(
function(p)
p.pos = 2
if myHero.networkID == p:DecodeF() then
if self.Menu.Misc.BlockR and os.clock() - self.R.Sent < self.TimeLimit and self.R.Sent > 0 and self.R.IsReady() then
Packet(p):block()
end
end
end
)
end
self.MenuLoaded = true
end
function _Orianna:ObjectsInArea(range, delay, array)
local objects2 = {}
local delay = delay or 0
if array ~= nil then
for i, object in ipairs(array) do
if ValidTarget(object, self.Q.Range * 2.5) then
local Position, WillHit = Prediction:GetPredictedPos(object, {Delay = delay})
if GetDistanceSqr(self.Position, Position) <= range * range and WillHit then
table.insert(objects2, object)
end
end
end
end
return objects2
end
function _Orianna:CastQ(target)
if ValidTarget(target, self.Q.Range) and self.Q.IsReady() then
self.QSpell:Cast(target, {Source = self.Position})
end
end
function _Orianna:CastW(target)
if self.W.IsReady() and ValidTarget(target, self.Q.Range + self.W.Width/2) then
if self.Position and self.Position.name and self.Position.name:lower():find("missile") then return end
self.WSpell:Cast(target)
end
end
function _Orianna:CastE(unit)
if unit ~= nil then
if self.E.IsReady() and unit.valid and unit.team == myHero.team and GetDistanceSqr(myHero, unit) < self.E.Range * self.E.Range then
CastSpell(self.E.Slot, unit)
elseif self.E.IsReady() and unit.valid and unit.team ~= myHero.team then
local table = nil
if unit.type:lower():find("hero") then
table = GetEnemyHeroes()
else
self.EnemyMinions:update()
if #self.EnemyMinions.objects > 0 then
table = self.EnemyMinions.objects
else
self.JungleMinions:update()
if #self.JungleMinions.objects > 0 then
table = self.JungleMinions.objects
end
end
end
if table~= nil then
local BestPos, BestHit = self:BestHitE(table)
if BestHit~=nil and BestHit > 0 and BestPos~=nil and BestPos.team == myHero.team then
self:CastE(BestPos)
end
end
end
end
end
function _Orianna:CastR(target)
if self.R.IsReady() and ValidTarget(target, self.Q.Range + self.R.Range) then
if self.Position and self.Position.name and self.Position.name:lower():find("missile") then return end
self.RSpell:Cast(target)
end
end
function _Orianna:Combo()
local target = self.TS.target
if ValidTarget(target) then
if self.Menu.Combo.useIgnite and Ignite.IsReady() and ValidTarget(target, Ignite.Range) then
local q, w, e, r, dmg = GetBestCombo(target)
if dmg >= target.health and target.health > 0 then
CastIgnite(target)
end
end
if self.Menu.Combo.useQ then
self:CastQ(target)
end
if self.W.IsReady() and self.Menu.Combo.useW > 0 and #self.WSpell:ObjectsInArea(GetEnemyHeroes()) >= self.Menu.Combo.useW then
CastSpell(self.W.Slot)
end
if self.Menu.Combo.useR and self.R.IsReady() and #self:ObjectsInArea(self.Q.Range, self.R.Delay, GetEnemyHeroes()) <= 3 then
local q, w, e, r, dmg = GetBestCombo(target)
if dmg >= target.health and r then
self:CastR(target)
end
end
if self.R.IsReady() and self.Menu.Combo.useR2 > 0 and self.Menu.Combo.useR2 <= #self.RSpell:ObjectsInArea(GetEnemyHeroes()) then
CastSpell(self.R.Slot)
end
if self.Menu.Combo.useE > 0 then
local BestPos, Count = self:BestHitE(GetEnemyHeroes())
if BestHit~=nil and BestHit >= self.Menu.Combo.useE and BestPos~=nil and BestPos.team == myHero.team then
self:CastE(BestPos)
end
end
if self.Menu.Combo.useE2 > 0 and myHero.health/myHero.maxHealth * 100 <= self.Menu.Combo.useE2 then
self:CastE(myHero)
end
end
end
function _Orianna:Harass()
local target = self.TS.target
if ValidTarget(target) and myHero.mana/myHero.maxMana * 100 >= self.Menu.Harass.Mana then
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Harass.useE2 > 0 and myHero.health/myHero.maxHealth * 100 <= self.Menu.Harass.useE2 and ValidTarget(target, GetAARange(target)) then self:CastE(myHero) end
if self.Menu.Harass.useW then self:CastW(target) end
if self.Menu.Harass.useQ then self:CastQ(target) end
end
end
function _Orianna:Clear()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if ValidTarget(minion, self.Q.Range + self.Q.Width) and os.clock() - self.LastFarmRequest > 0.2 then
if self.Menu.LaneClear.useQ > 0 and self.Q.IsReady() then
local BestPos, Count = self:BestHitQ(self.EnemyMinions.objects)
if BestPos~=nil and self.Menu.LaneClear.useQ <= Count then
self:CastQ(BestPos)
end
end
if self.Menu.LaneClear.useW > 0 and self.W.IsReady() then
local Count = #self.WSpell:ObjectsInArea(self.EnemyMinions.objects)
if self.Menu.LaneClear.useW <= Count then
CastSpell(self.W.Slot)
end
end
if self.Menu.LaneClear.useE > 0 and self.E.IsReady() then
local BestPos, Count = self:BestHitE(self.EnemyMinions.objects)
if BestPos~=nil and self.Menu.LaneClear.useE <= Count then
self:CastE(BestPos)
end
end
self.LastFarmRequest = os.clock()
end
end
if self.Menu.LastHit.UseQ > 1 then
self.QSpell:LastHit({ Mode = self.Menu.LastHit.UseQ})
end
end
self.JungleMinions:update()
for i, minion in pairs(self.JungleMinions.objects) do
if ValidTarget(minion, self.Q.Range + self.Q.Width) then
if self.Menu.JungleClear.useQ and self.Q.IsReady() then
CastSpell(self.Q.Slot, minion.x, minion.z)
end
if self.Menu.JungleClear.useW and self.W.IsReady() then
self:CastW(minion)
end
if self.Menu.JungleClear.useE and self.E.IsReady() then
self:CastE(minion)
end
end
end
end
function _Orianna:ThrowBallTo(target, width)
local EAlly = nil
if self.E.IsReady() and GetDistanceSqr(self.Position, target) > width * width then
local Position = Prediction:GetPredictedPos(target, {Delay = self.E.Delay + GetDistance(self.Position, target)/self.E.Speed})
for i = 1, heroManager.iCount do
local ally = heroManager:GetHero(i)
if ally.team == player.team and GetDistanceSqr(myHero, ally) < self.E.Range * self.E.Range and GetDistanceSqr(self.Position, ally) > 50 * 50 then
local Position3 = Prediction:GetPredictedPos(ally, {Delay = self.E.Delay + GetDistance(self.Position, ally)/self.E.Speed})
if GetDistanceSqr(Position3, Position) <= width * width then
if EAlly == nil then
EAlly = ally
else
local Position2 = Prediction:GetPredictedPos(EAlly, {Delay = self.E.Delay + GetDistance(self.Position, EAlly)/self.E.Speed})
if GetDistanceSqr(Position, Position2) > GetDistanceSqr(Position, Position3) then
EAlly = ally
end
end
end
end
end
end
if EAlly~=nil and GetDistanceSqr(EAlly, target) <= width * width then
self:CastE(EAlly)
elseif self.Q.IsReady() then
self:CastQ(target)
end
end
function _Orianna:BestHitQ(objects)
local BestPos
local BestHit = 0
local function CountObjectsOnLineSegment(StartPos, EndPos, width, objects2)
local n = 0
for i, object in ipairs(objects2) do
local Position = Prediction:GetPredictedPos(object, {Delay = self.Q.Delay + GetDistance(StartPos, object)/self.Q.Speed})
local pointSegment, pointLine, isOnSegment = VectorPointProjectionOnLineSegment(StartPos, EndPos, Position)
local w = width --+ Prediction.VP:GetHitBox(object) / 3
if isOnSegment and GetDistanceSqr(pointSegment, Position) < w * w and GetDistanceSqr(StartPos, EndPos) > GetDistanceSqr(StartPos, Position) then
n = n + 1
end
end
return n
end
for i, object in ipairs(objects) do
if ValidTarget(object, self.Q.Range) then
local Position = Prediction:GetPredictedPos(object, {Delay = self.Q.Delay + GetDistance(self.Position, object)/self.Q.Speed})
local hit = CountObjectsOnLineSegment(self.Position, Position, self.Q.Width, objects) + 1
if hit > BestHit then
BestHit = hit
BestPos = object--Vector(object)
if BestHit == #objects then
break
end
end
end
end
return BestPos, BestHit
end
function _Orianna:BestHitE(objects)
local function HitE(StartPos, EndPos, width, objects)
local n = 0
--StartPos = Vector(StartPos.x, 0, StartPos.z)
for i, object in ipairs(objects) do
local Position = Prediction:GetPredictedPos(object, {Delay = self.E.Delay + GetDistance(StartPos, object)/self.E.Speed})
local pointSegment, pointLine, isOnSegment = VectorPointProjectionOnLineSegment(StartPos, EndPos, Position)
local w = width --+ Prediction.VP:GetHitBox(object) / 3
if isOnSegment and GetDistanceSqr(pointSegment, object) < w * w and GetDistanceSqr(StartPos, EndPos) > GetDistanceSqr(StartPos, object) then
n = n + 1
end
end
return n
end
local tab = {}
local BestAlly = nil
local BestHit = 0
for i = 1, heroManager.iCount do
local hero = heroManager:GetHero(i)
if hero.team == player.team and hero.health > 0 then
--print(GetDistance(Vector(ball.Position.x, 0 , ball.Position.z), Vector(hero.x, 0 , hero.z)))
if GetDistanceSqr(myHero, hero) < self.E.Range * self.E.Range and GetDistanceSqr(self.Position, hero) > 50 * 50 then
local Position = Prediction:GetPredictedPos(hero, {Delay = self.E.Delay + GetDistance(self.Position, hero)/self.E.Speed})
local hit = HitE(self.Position, Position, self.E.Width, objects)
if hit > BestHit then
BestHit = hit
BestAlly = hero--Vector(hero)
if BestHit == #objects then
break
end
end
end
end
end
return BestAlly, BestHit
-- body
end
function _Orianna:LastHit()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LastHit.Mana and os.clock() - self.LastFarmRequest > 0.05 then
self.EnemyMinions:update()
if self.Menu.LastHit.useW then
self.WSpell:LastHit()
end
if self.Menu.LastHit.UseQ > 1 then
self.QSpell:LastHit({ Mode = self.Menu.LastHit.UseQ})
end
for i, minion in pairs(self.EnemyMinions.objects) do
if ((not ValidTarget(minion, self.AA.Range(minion))) or (ValidTarget(minion, self.AA.Range(minion)) and GetDistanceSqr(minion, OrbwalkManager.LastTarget) > 80 * 80 and not OrbwalkManager:CanAttack() and OrbwalkManager:CanMove())) and not minion.dead then
if self.Menu.LastHit.useE and self.E.IsReady() and GetDistanceSqr(myHero, self.Position) > 50 * 50 and GetDistanceSqr(myHero, self.Position) > GetDistanceSqr(myHero, minion) and not minion.dead then
local dmg = self.E.Damage(minion)
local time = self.E.Delay + GetDistance(minion, self.Position) / self.E.Speed + GetLatency() / 2000 - 100/1000
local predHealth, a, b = Prediction.VP:GetPredictedHealth(minion, time, 0)
if dmg > predHealth and predHealth > -40 then
local Position = Prediction:GetPredictedPos(minion, {Delay = self.E.Delay + GetDistance(minion, self.Position) / self.E.Speed})
local pointSegment, pointLine, isOnSegment = VectorPointProjectionOnLineSegment(self.Position, myHero, Position)
if isOnSegment and GetDistanceSqr(pointSegment, object) < self.E.Width * self.E.Width then
self:CastE(myHero)
end
end
end
end
end
self.LastFarmRequest = os.clock()
end
end
function _Orianna:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth <= 0.4 and ValidTarget(enemy, self.TS.range) and enemy.visible and enemy.health > 0 then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health and enemy.health > 0 then
if self.Q.IsReady() and self.Menu.KillSteal.useQ and (q or self.Q.Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.W.IsReady() and self.Menu.KillSteal.useW and (w or self.W.Damage(enemy) > enemy.health) and not enemy.dead then self:CastW(enemy) end
if self.E.IsReady() and self.Menu.KillSteal.useE and (e or self.E.Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.R.IsReady() and self.Menu.KillSteal.useR and (r or self.R.Damage(enemy) > enemy.health) and not enemy.dead then self:CastR(enemy) end
if (((w or self.W.Damage(enemy) > enemy.health) and self.Menu.KillSteal.useW) or ((r or self.R.Damage(enemy) > enemy.health) and self.Menu.KillSteal.useR)) and (self.Menu.KillSteal.useQ or self.Menu.KillSteal.useE) and not enemy.dead then self:ThrowBallTo(enemy, self.R.Width) end
end
if self.Menu.KillSteal.useIgnite and Ignite.Damage(enemy) > enemy.health and enemy.health > 0 then CastIgnite(enemy) end
end
end
end
function _Orianna:Auto()
if self.W.IsReady() and self.Menu.Auto.useW > 0 and #self.WSpell:ObjectsInArea(GetEnemyHeroes()) >= self.Menu.Auto.useW then
CastSpell(self.W.Slot)
end
if self.R.IsReady() and self.Menu.Auto.useR > 0 and #self.RSpell:ObjectsInArea(GetEnemyHeroes()) >= self.Menu.Auto.useR then
CastSpell(self.R.Slot)
end
end
function _Orianna:Run()
myHero:MoveTo(mousePos.x, mousePos.z)
if self.E.IsReady() and GetDistanceSqr(self.Position, myHero) > self.W.Width * self.W.Width then
self:CastE(myHero)
elseif self.Q.IsReady() and GetDistanceSqr(self.Position, myHero) > self.W.Width * self.W.Width then
CastSpell(self.Q.Slot, myHero.x, myHero.z)
end
if self.W.IsReady() and GetDistanceSqr(self.Position, myHero) < self.W.Width * self.W.Width then
CastSpell(self.W.Slot)
end
end
function _Orianna:ForceR(target)
if self.R.IsReady() and GetDistanceSqr(target, self.Position) < self.R.Range * self.R.Range then
self:CastR(target)
elseif self.Q.IsReady() and GetDistanceSqr(target, self.Position) < (self.Q.Range + self.R.Width) * (self.Q.Range + self.R.Width) then
self:ThrowBallTo(target, self.R.Width)
end
end
function _Orianna:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.Q.Mana()
end
if w then
comboDamage = comboDamage + self.W.Damage(target)
currentManaWasted = currentManaWasted + self.W.Mana()
end
if e then
comboDamage = comboDamage + self.E.Damage(target)
currentManaWasted = currentManaWasted + self.E.Mana()
end
if r then
comboDamage = comboDamage + self.R.Damage(target)
currentManaWasted = currentManaWasted + self.R.Mana()
end
comboDamage = comboDamage + self.AA.Damage(target)
comboDamage = comboDamage + DamageItems(target)
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Orianna:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Xerath"
function _Xerath:__init()
self.ScriptName = "Lightning Does Strike Twice"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.P = { Damage = function(target) return getDmg("P", target, myHero) end, IsReady = false}
self.AA = { Range = 580 , Damage = function(target) return getDmg("AD", target, myHero) end }
self.Q = { Slot = _Q, DamageName = "Q", Range = 1400, MinRange = 750, MaxRange = 1400, Offset = 0, Width = 100, Delay = 0.55, Speed = math.huge, LastCastTime = 0, LastCastTime2 = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Mana = function() return myHero:GetSpellData(_Q).mana end, Damage = function(target) return getDmg("Q", target, myHero) end, IsCharging = false, TimeToStopIncrease = 1.5 , End = 3, SentTime = 0, LastFarmCheck = 0, Sent = false}
self.W = { Slot = _W, DamageName = "W", Range = 1100, Width = 125, Delay = 0.675, Speed = math.huge, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.CIRCULAR, IsReady = function() return myHero:CanUseSpell(_W) == READY end, Mana = function() return myHero:GetSpellData(_W).mana end, Damage = function(target) return getDmg("W", target, myHero) end, LastFarmCheck = 0}
self.E = { Slot = _E, DamageName = "E", Range = 1050, Width = 60, Delay = 0.25, Speed = 1400, LastCastTime = 0, Collision = true, Aoe = false, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Mana = function() return myHero:GetSpellData(_E).mana end, Damage = function(target) return getDmg("E", target, myHero) end, Missile = nil}
self.R = { Slot = _R, DamageName = "R", Range = 3200, Width = 120, Delay = 0.675, Speed = math.huge, LastCastTime = 0, LastCastTime2 = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.CIRCULAR, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Mana = function() return myHero:GetSpellData(_R).mana end, Damage = function(target) return getDmg("R", target, myHero) end, IsCasting = false, Stacks = 3, ResetTime = 10, MaxStacks = 3, Target = nil, SentTime = 0, Sent = false}
self:LoadVariables()
self:LoadMenu()
end
function _Xerath:LoadVariables()
self.TimeLimit = 0.1
self.QPacket = 49
self.DataUpdated = false
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, self.Q.MaxRange + self.Q.Offset, DAMAGE_MAGIC)
self.EnemyMinions = minionManager(MINION_ENEMY, self.Q.MaxRange + self.Q.Offset, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 750, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."19052015")
self.QSpell = _Spell(self.Q):AddDraw():AddRangeFunction(function() return self.Q.Range end)
self.WSpell = _Spell(self.W):AddDraw()
self.ESpell = _Spell(self.E):AddDraw()
self.RSpell = _Spell(self.R):AddDraw():AddRangeFunction(function() return 2000 + 1200 * myHero:GetSpellData(self.R.Slot).level end)
end
function _Xerath:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR","Use R If Killable", SCRIPT_PARAM_LIST, 1, { "Never", "If Necessary", "Always"})
self.Menu:addSubMenu(myHero.charName.." - Ultimate Settings", "Ultimate")
self.Menu.Ultimate:addParam("rMode","R Mode", SCRIPT_PARAM_LIST, 1, {"AutoShoot", "Using Key"})
self.Menu.Ultimate:addParam("Delay", "Delay between shoots", SCRIPT_PARAM_SLICE, 0, 0, 1.5, 1)
self.Menu.Ultimate:addParam("TapKey", "R Key", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
self.Menu.Ultimate:addSubMenu("Near Mouse Settings", "NearMouse")
self.Menu.Ultimate.NearMouse:addParam("Enable","Only Near Mouse", SCRIPT_PARAM_ONOFF, false)
self.Menu.Ultimate.NearMouse:addParam("MouseRadius", "Near Mouse Radius", SCRIPT_PARAM_SLICE, 500, 100, 1500)
self.Menu.Ultimate.NearMouse:addParam("DrawRadius", "Draw Near Mouse Radius", SCRIPT_PARAM_ONOFF, true)
self.Menu.Ultimate:addParam("KillableR","Draw Text If Killable with R", SCRIPT_PARAM_ONOFF, true)
if VIP_USER then self.Menu.Ultimate:addParam("BlockMove", "Block Movement When Casting R", SCRIPT_PARAM_ONOFF, true) end
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q If Hit >= ", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useW", "Use W If Hit >=", SCRIPT_PARAM_SLICE, 3, 0, 10)
self.Menu.LaneClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 30, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, false)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addSubMenu("Use E To Interrupt", "useE")
_Interrupter(self.Menu.Auto.useE):CheckGapcloserSpells():CheckChannelingSpells():AddCallback(function(target) self:CastE(target) end)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill", "Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu.Misc:addParam("SmartCast", "Using Smart Cast", SCRIPT_PARAM_ONOFF, true)
self.Menu.Misc:addParam("Bugsplat", "Q is Crashing?", SCRIPT_PARAM_ONOFF, false)
self.Menu.Misc:addParam("developer", "Developer Mode", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
OrbwalkManager:AddKey({Name = "UseE", Text = "Cast E", Type = SCRIPT_PARAM_ONKEYDOWN, Key = string.byte("E"), Mode = ORBWALK_MODE.COMBO})
self.Menu.Keys:addParam("WaitE", "Start with E (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("Z"))
self.Menu.Keys:permaShow("WaitE")
if not VIP_USER then
PrintMessage(self.ScriptName, "Hi! This script for free users doesn't start the Q correctly, but you can charge the Q by yourself and the script will shoot the Q.")
end
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self:UpdateValues()
if self.R.IsCasting then self:CheckCastingR() return end
if not self.R.IsCasting and self.Menu.Ultimate.TapKey then self:CastR() end
self:KillSteal()
if OrbwalkManager:IsCombo() then
if OrbwalkManager.KeysMenu.UseE then
local target = nil
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.E.Range) then
if target == nil then target = enemy
elseif GetDistanceSqr(myHero, target) > GetDistanceSqr(myHero, enemy) then target = enemy
end
end
end
if ValidTarget(target, self.E.Range) then
self:CastE(target)
end
else
self:Combo()
end
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then
end
end
)
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or self.Menu == nil or not self.MenuLoaded or unit == nil or not unit.isMe then return end
if spell.name:lower():find("xeratharcanopulsechargeup") then
self.Q.LastCastTime = os.clock()
self.Q.IsCharging = true
OrbwalkManager:DisableAttacks()
elseif spell.name:lower():find("xeratharcanopulse2") then
self.Q.LastCastTime2 = os.clock()
self.Q.IsCharging = false
OrbwalkManager:EnableAttacks()
elseif spell.name:lower():find("xeratharcanebarrage2") then
self.W.LastCastTime = os.clock()
elseif spell.name:lower():find("xerathmagespear") then
self.E.LastCastTime = os.clock()
self.E.Missile = nil
elseif spell.name:lower():find("xerathlocusofpower2") then
self.R.LastCastTime = os.clock()
self.R.IsCasting = true
self.R.LastCastTime2 = os.clock()
OrbwalkManager:DisableMovement()
OrbwalkManager:DisableAttacks()
DelayAction(function() self.R.Stacks = self.R.MaxStacks self.R.Target = nil self.R.IsCasting = false end, self.R.ResetTime)
elseif spell.name:lower():find("xerathrmissilewrapper") then
elseif spell.name:lower():find("xerathlocuspulse") then
self.R.LastCastTime2 = os.clock()
self.R.Stacks = self.R.Stacks - 1
OrbwalkManager:DisableAttacks()
end
end
)
AddMsgCallback(
function(msg, key)
if self.Menu == nil or not self.MenuLoaded then return end
if msg == KEY_UP then
if self.Q.IsReady() and self.Q.IsCharging and key == string.byte("Q") and self.Menu.Misc.SmartCast and not IsKeyDown(17) then
self:CastQ2(mousePos)
end
elseif msg == KEY_DOWN then
if self.Q.IsReady() and not self.Q.IsCharging and key == string.byte("Q") and not IsKeyDown(17) then
self:CastQ1(mousePos)
end
elseif msg == WM_LBUTTONUP then
if self.Q.IsReady() and self.Q.IsCharging and not IsKeyDown(17) then
self:CastQ2(mousePos)
end
elseif msg == WM_RBUTTONUP then
if self.R.IsReady() and self.R.IsCasting and self.R.Stacks > 0 and not ValidTarget(self:FindBestKillableTarget()) then
self.R.IsCasting = false
end
end
end
)
AddCreateObjCallback(
function(obj)
if obj and os.clock() - self.E.LastCastTime < 0.35 and self.E.Missile == nil and obj.name:lower():find("missile") and ( obj.spellOwner and obj.spellOwner.isMe or GetDistanceSqr(myHero, obj) < 50 * 50) then
self.E.Missile = obj
DelayAction(function() self.E.Missile = nil end, self.E.Delay + (self.E.Range / self.E.Speed) * 1.5)
elseif obj and obj.name:lower():find("xerath") and obj.name:lower():find("_q") and obj.name:lower():find("_cas") and obj.name:lower():find("_charge") then
self.Q.IsCharging = true
elseif obj and obj.name:lower():find("xerath") and obj.name:lower():find("_r") and obj.name:lower():find("_buf") then
self.R.IsCasting = true
end
end
)
AddDeleteObjCallback(
function(obj)
if obj and self.E.Missile ~= nil and obj == self.E.Missile then
self.E.Missile = nil
elseif obj and obj.name:lower():find("xerath") and obj.name:lower():find("_q") and obj.name:lower():find("_cas") and obj.name:lower():find("_charge") then
self.Q.IsCharging = false
elseif obj and obj.name:lower():find("xerath") and obj.name:lower():find("_r") and obj.name:lower():find("_buf") then
self.R.IsCasting = false
end
end
)
if VIP_USER then HookPackets() end
if VIP_USER then
AddSendPacketCallback(
function(p)
p.pos = 2
if myHero.networkID == p:DecodeF() then
if not self.DataUpdated and self.Q.IsCharging and self.Q.Sent then
--if self.QPacket ~= p.header then PrintMessage("qPacket is "..p.header..", you can change this value manually on the top of this script. To prevent bad Q's.") end
self.QPacket = p.header
self.DataUpdated = true
end
if self.Q.IsCharging and not self.Q.Sent and (p.header == self.QPacket or not self.DataUpdated) and not self.Menu.Misc.Bugsplat then
--if self.Menu.Misc.developer then PrintMessage("Blocking Q") end
Packet(p):block()
end
if self.R.IsCasting and not self.R.Sent and self.Menu.Ultimate.BlockMove and ValidTarget(self:FindBestTarget(myHero, self.R.Range)) then
Packet(p):block()
end
end
end
)
end
if VIP_USER then
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if iSpell == self.R.Slot then
self.R.Sent = true
DelayAction(function() self.R.Sent = false end, self.TimeLimit + GetLatency()/2000)
end
end
)
end
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
if self.Menu.Ultimate.NearMouse.Enable and self.Menu.Ultimate.NearMouse.DrawRadius then
if self.R.IsCasting then
DrawCircle3D(mousePos.x, mousePos.y, mousePos.z, self.Menu.Ultimate.NearMouse.MouseRadius, width, Colors.Blue, 30)
end
end
if self.Menu.Ultimate.KillableR and (self.R.IsReady() or self.R.IsCasting) then
local count = 0
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.R.Range) then
if self.R.Damage(enemy) * self.R.Stacks >= enemy.health then
local p = WorldToScreen(D3DXVECTOR3(enemy.x, enemy.y, enemy.z))
if OnScreen(p.x, p.y) then
DrawText("R KILL", 25, p.x, p.y, Colors.Red)
end
DrawText(enemy.charName:upper().." KILLABLE", 35, 100, 50 + 50 * count, Colors.Red)
count = count + 1
end
end
end
end
end
)
self.MenuLoaded = true
end
function _Xerath:UpdateValues()
if self.Q.IsCharging then
self.Q.Range = math.min((self.Q.MaxRange - self.Q.MinRange) / self.Q.TimeToStopIncrease * (os.clock() - self.Q.LastCastTime), self.Q.MaxRange - self.Q.MinRange) + self.Q.MinRange + math.min(self.Q.Offset * (os.clock() - self.Q.LastCastTime)/self.Q.TimeToStopIncrease, self.Q.Offset)
else
self.Q.Range = self.Q.MaxRange + self.Q.Offset
end
self.R.Range = 2000 + 1200 * myHero:GetSpellData(self.R.Slot).level
self.TS.range = self:GetRange()
self.TS.target = _GetTarget()
self.TS:update()
if self.R.IsReady() or self.R.IsCasting then
self.R.Target = self:FindBestKillableTarget()
end
if self:CanMove() then OrbwalkManager:EnableMovement() else OrbwalkManager:DisableMovement() end
if self:CanAttack() then OrbwalkManager:EnableAttacks() else OrbwalkManager:DisableAttacks() end
end
function _Xerath:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health > 0 and enemy.health/enemy.maxHealth < 0.3 and GetDistanceSqr(myHero, enemy) < self.R.Range * self.R.Range then
if ValidTarget(enemy) then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
if self.Menu.KillSteal.useQ and (q or self.Q.Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.Menu.KillSteal.useW and (w or self.W.Damage(enemy) > enemy.health) and not enemy.dead then self:CastW(enemy) end
if self.Menu.KillSteal.useE and (e or self.E.Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.Menu.KillSteal.useR and (r or self.R.Damage(enemy) * self.R.Stacks > enemy.health) and not enemy.dead then self:CastR() end
end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead then CastIgnite(enemy) end
elseif not enemy.visible and not enemy.dead and not self.Q.IsCharging and not self.R.IsCasting then
if myHero:GetSpellData(ITEM_7).name:lower():find("trinketorblvl") and myHero:CanUseSpell(ITEM_7) == READY then
CastSpell(ITEM_7, enemy.x, enemy.z)
elseif myHero:GetSpellData(SUMMONER_1).name:lower():find("clairvoyance") and myHero:CanUseSpell(SUMMONER_1) == READY then
CastSpell(SUMMONER_1, enemy.x, enemy.z)
elseif myHero:GetSpellData(SUMMONER_2).name:lower():find("clairvoyance") and myHero:CanUseSpell(SUMMONER_2) == READY then
CastSpell(SUMMONER_2, enemy.x, enemy.z)
end
end
end
end
end
function _Xerath:Combo()
local target = self.TS.target
if ValidTarget(target) then
if self.Menu.Combo.useR > 1 then
if self.Menu.Combo.useR == 2 then
local q, w, e, r, dmg = GetBestCombo(target)
if self.R.Damage(target) * self.R.Stacks >= target.health and (r or GetDistanceSqr(myHero, target) > self.W.Range * self.W.Range) then
self:CastR()
end
elseif self.Menu.Combo.useR == 3 then
if self.R.Damage(target) * self.R.Stacks >= target.health then
self:CastR()
end
end
end
if self.Menu.Combo.useE then self:CastE(target) end
if self.Menu.Keys.WaitE and self.E.IsReady() then return end
if os.clock() - self.E.LastCastTime < 0.35 or (self.E.Missile ~= nil and GetDistanceSqr(myHero, self.E.Missile) <= GetDistanceSqr(myHero, target)) then return end
if self.Menu.Combo.useW then self:CastW(target) end
if self.Menu.Combo.useQ then self:CastQ(target) end
end
end
function _Xerath:Harass()
local target = self.TS.target
if ValidTarget(target) and myHero.mana/myHero.maxMana * 100 >= self.Menu.Harass.Mana then
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Keys.WaitE and self.E.IsReady() then return end
if os.clock() - self.E.LastCastTime < 0.35 or (self.E.Missile ~= nil and GetDistanceSqr(myHero, self.E.Missile) <= GetDistanceSqr(myHero, target)) then return end
if self.Menu.Harass.useW then self:CastW(target) end
if self.Menu.Harass.useQ then self:CastQ(target) end
end
if ValidTarget(target) and self.Q.IsCharging then self:CastQ(target) end
end
function _Xerath:Clear()
if myHero.mana/myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if ValidTarget(minion, self.Q.MaxRange + self.Q.Offset) then
if self.Menu.LaneClear.useE and self.E.IsReady() then
self:CastE(minion)
end
if self.Menu.LaneClear.useQ > 0 and self.Q.IsReady() and os.clock() - self.Q.LastFarmCheck > 0.1 then
local BestPos, Count = GetBestLineFarmPosition(self.Q.Range, self.Q.Width, self.EnemyMinions.objects)
self.Q.LastFarmCheck = os.clock()
if not self.Q.IsCharging then
if self.Menu.LaneClear.useQ <= Count then
self:CastQ(BestPos)
end
elseif self.Q.IsCharging then
if self.Menu.LaneClear.useQ <= Count then
self:CastQ(BestPos)
elseif os.clock() - self.Q.LastCastTime > 0.9 * self.Q.End then
self:CastQ(BestPos)
end
end
end
if self.Menu.LaneClear.useW > 0 and self.W.IsReady() and os.clock() - self.W.LastFarmCheck > 0.1 then
local BestPos, Count = GetBestCircularFarmPosition(self.W.Range, self.W.Width + 50, self.EnemyMinions.objects)
self.W.LastFarmCheck = os.clock()
if BestPos ~= nil and self.Menu.LaneClear.useW <= Count then self:CastW(BestPos) end
end
end
end
end
self.JungleMinions:update()
for i, minion in pairs(self.JungleMinions.objects) do
if ValidTarget(minion, self.Q.MaxRange + self.Q.Offset) then
if self.Menu.JungleClear.useE and self.E.IsReady() then
self:CastE(minion)
end
if self.Menu.JungleClear.useQ and self.Q.IsReady() then
self:CastQ(minion)
end
if self.Menu.JungleClear.useW and self.W.IsReady() then
self:CastW(minion)
end
end
end
end
function _Xerath:CheckCastingR()
if os.clock() - self.R.LastCastTime2 > self.Menu.Ultimate.Delay then
if self.Menu.Ultimate.rMode == 1 then
self:CastR()
elseif self.Menu.Ultimate.rMode == 2 then
if self.Menu.Ultimate.TapKey then
self:CastR()
end
end
end
end
function _Xerath:CastQ(target)
if self.Q.IsReady() and ValidTarget(target) then
if not self.Q.IsCharging then
local delay = math.max(GetDistance(myHero, target) - self.Q.MinRange, 0) / ((self.Q.MaxRange - self.Q.MinRange) / self.Q.TimeToStopIncrease) + self.Q.Delay
local Position, WillHit = Prediction:GetPredictedPos(target, {Delay = delay})
if Position~=nil and WillHit and GetDistanceSqr(myHero, Position) < self.Q.MaxRange * self.Q.MaxRange then
self:CastQ1(Position)
end
elseif self.Q.IsCharging and ValidTarget(target, self.Q.Range) then
local CastPosition, WillHit, Position = self.QSpell:GetPrediction(target)
if CastPosition~=nil and WillHit then
self:CastQ2(CastPosition)
elseif os.clock() - self.Q.LastCastTime >= 0.9 * self.Q.End and GetDistanceSqr(myHero, target) <= self.Q.Range * self.Q.Range then
self:CastQ2(CastPosition)
end
end
end
end
function _Xerath:CastQ1(Position)
if self.Q.IsReady() and Position and not self.Q.IsCharging and VIP_USER then --
CastSpell(self.Q.Slot, Position.x, Position.z)
end
end
function _Xerath:CastQ2(Position)
if self.Q.IsReady() and Position and self.Q.IsCharging and not self.Menu.Misc.Bugsplat and not OrbwalkManager:Evade() then
local d3vector = D3DXVECTOR3(Position.x, Position.y, Position.z)
self.Q.Sent = true
CastSpell2(self.Q.Slot, d3vector)
self.Q.Sent = false
end
end
function _Xerath:CastW(target)
if self.W.IsReady() and ValidTarget(target, self.W.Range) then
self.WSpell:Cast(target)
end
end
function _Xerath:CastE(target)
if self.E.IsReady() and ValidTarget(target, self.E.Range) then
self.ESpell:Cast(target)
end
end
function _Xerath:CastR()
if self.R.IsReady() and ValidTarget(self.R.Target, self.R.Range) then
if not self.R.IsCasting then
self:CastR1()
else
self:CastR2()
end
end
end
function _Xerath:CastR1()
if not self.R.IsCasting and self.R.IsReady() then CastSpell(self.R.Slot) end
end
function _Xerath:CastR2()
if self.R.IsCasting and self.R.IsReady() then
local target = nil
if self.Menu.Ultimate.NearMouse.Enable then
target = self:FindBestTarget(mousePos, self.Menu.Ultimate.NearMouse.MouseRadius)
else
target = self.R.Target
end
if ValidTarget(target) then
self.RSpell:Cast(target)
end
end
end
function _Xerath:GetRange()
local r = 0
if self.Q.IsReady() then r = self.Q.Range end
if self.Q.IsReady() and self.Q.IsCharging then r = self.Q.MaxRange end
local range = math.max(r, self.W.IsReady() and self.W.Range or 0, self.E.IsReady() and self.E.Range or 0, self.AA.Range)
return range
end
function _Xerath:FindBestKillableTarget()
local bestTarget = nil
for i, enemy in ipairs(GetEnemyHeroes()) do
if self.R.Damage(enemy) * self.R.Stacks * self:GetOverkill() >= enemy.health and ValidTarget(enemy, self.R.Range) then
if bestTarget == nil then
bestTarget = enemy
elseif (enemy.health - self.R.Damage(enemy) * self.R.Stacks) / enemy.maxHealth < (bestTarget.health - self.R.Damage(bestTarget) * self.R.Stacks) / bestTarget.maxHealth then
bestTarget = enemy
end
end
end
return bestTarget
end
function _Xerath:FindBestTarget(from, range)
local bestTarget = nil
for i, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.R.Range) and GetDistanceSqr(from, enemy) <= range * range then
if bestTarget == nil then
bestTarget = enemy
elseif (enemy.health - self.R.Damage(enemy) * self.R.Stacks) / enemy.maxHealth < (bestTarget.health - self.R.Damage(bestTarget) * self.R.Stacks) / bestTarget.maxHealth then
bestTarget = enemy
end
end
end
return bestTarget
end
function _Xerath:CanMove()
if self.R.IsCasting then return false end
return true
end
function _Xerath:CanAttack()
if self.R.IsCasting then return false
elseif self.Q.IsCharging then return false
end
return true
end
function _Xerath:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.Q.Mana()
end
if w then
comboDamage = comboDamage + self.W.Damage(target)
currentManaWasted = currentManaWasted + self.W.Mana()
end
if e then
comboDamage = comboDamage + self.E.Damage(target)
currentManaWasted = currentManaWasted + self.E.Mana()
end
if r then
comboDamage = comboDamage + self.R.Damage(target) * self.R.Stacks
currentManaWasted = currentManaWasted + self.R.Mana()
end
comboDamage = comboDamage + self.AA.Damage(target)
comboDamage = comboDamage + DamageItems(target)
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Xerath:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_Riven"
function _Riven:__init()
self.ScriptName = "Mighty Riven"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.P = { Damage = function(target) return getDmg("P", target, myHero) end, Stacks = 0, LastCastTime = 0}
self.R = { TS = nil, Slot = _R, DamageName = "R", Range = 1100, Width = 200, Delay = 0.25, Speed = 1600, LastCastTime = 0, Type = SPELL_TYPE.CONE, Collision = false, Aoe = true, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Damage = function(target) return getDmg("R", target, myHero) end, State = false}
self.AA = { Range = function(target) local int1 = 0 if ValidTarget(target) then int1 = GetDistance(target.minBBox, target)/2 end return myHero.range + GetDistance(myHero, myHero.minBBox) + int1 + 50 end, Reset = false, OffsetRange = 120 ,Damage = function(target) return getDmg("AD", target, myHero) end, LastCastTime = 0}
self.Q = { TS = nil, Slot = _Q, DamageName = "Q", Range = 250, Width = 100, Delay = 0.25, Speed = 1400, LastCastTime = 0, Type = SPELL_TYPE.CIRCULAR, Collision = false, Aoe = true, TimeReset = 4, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Damage = function(target) return getDmg("Q", target, myHero) end, State = 0}
self.W = { TS = nil, Slot = _W, DamageName = "W", Range = 260, Width = 250, Delay = 0.25, Speed = 1500, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.SELF, IsReady = function() return myHero:CanUseSpell(_W) == READY end, Damage = function(target) return getDmg("W", target, myHero) end}
self.E = { TS = nil, Slot = _E, DamageName = "E", Range = 325, Width = 250, Delay = 0, Speed = 1450, LastCastTime = 0, Type = SPELL_TYPE.LINEAR, Collision = false, Aoe = true, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Damage = function(target) return getDmg("E", target, myHero) end}
self:LoadVariables()
self.queue = _Queue()
self:LoadMenu()
self.wallJump = WallJump()
end
function _Riven:LoadVariables()
OrbwalkManager:RegisterAfterAttackCallback(function() self:AfterAttack() end)
OrbwalkManager:TakeControl()
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, self.R.Range, DAMAGE_PHYSICAL)
self.R.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, self.R.Range, DAMAGE_PHYSICAL)
self.W.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, self.W.Range, DAMAGE_PHYSICAL)
self.AllyMinions = minionManager(MINION_ALLY, 600, myHero, MINION_SORT_HEALTH_ASC)
self.EnemyMinions = minionManager(MINION_ENEMY, 600, myHero, MINION_SORT_HEALTH_ASC)
self.JungleMinions = minionManager(MINION_JUNGLE, 600, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."1.001")
self.QSpell = _Spell(self.Q):AddDraw():SetAccuracy(50)
self.WSpell = _Spell(self.W):AddDraw({Enable = false})
self.ESpell = _Spell(self.E):AddDraw({Enable = false}):SetAccuracy(35)
self.RSpell = _Spell(self.R):AddDraw():SetAccuracy(35)
end
function _Riven:LoadMenu()
if self.Menu == nil then return end
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
self.Menu.TS:addParam("Combo", "Range for Combo", SCRIPT_PARAM_SLICE, 900, 150, 1100, 0)
self.Menu.TS:addParam("Harass", "Range for Harass", SCRIPT_PARAM_SLICE, 350, 150, 900, 0)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR1","Use R1: ", SCRIPT_PARAM_LIST, 2, {"Never", "If Needed", "Always"})
self.Menu.Combo:addParam("useR2","Use R2: ", SCRIPT_PARAM_LIST, 2, {"Never", "If Killable", "Between Q2 - Q3"})
self.Menu.Combo:addParam("useItems","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useTiamat", "Use Tiamat", SCRIPT_PARAM_LIST, 1, {"To Cancel Animation", "To Make Damage"})
self.Menu.Combo:addParam("useIgnite","Use Ignite If Killable", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, false)
--self.Menu.Harass:addParam("harassMode","Harass Mode", SCRIPT_PARAM_LIST, 1, {"Typical", "Q1 Q2 W Q3 E"}) --, "E W Q1 Q2 Q3", "E Q1 W Q2 Q3"
self.Menu.Harass:addParam("useTiamat","Use Tiamat or Hydra", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useTiamat","Use Tiamat or Hydra", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useTiamat","Use Tiamat or Hydra", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useR2","Use R2", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addParam("AutoStackQ", "Don't lose Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Auto:addParam("AutoW", "Use W if Enemies >=", SCRIPT_PARAM_SLICE, 2, 0, 5, 0)
self.Menu.Auto:addParam("AutoEW", "Use EW if Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5, 0)
self.Menu.Auto:addSubMenu("Use Q3 To Interrupt", "useQ")
_Interrupter(self.Menu.Auto.useQ):CheckChannelingSpells():AddCallback(function(target) self:ForceQ3(target) end)
self.Menu.Auto:addSubMenu("Use W To Interrupt", "useW")
_Interrupter(self.Menu.Auto.useW):CheckChannelingSpells():CheckGapcloserSpells():AddCallback(function(target) self:CastW(target) end)
self.Menu.Auto:addSubMenu("Use EW To Interrupt", "useEW")
_Interrupter(self.Menu.Auto.useEW):CheckChannelingSpells():AddCallback(function(target) self:ForceEW(target) end)
self.Menu.Auto:addSubMenu("Use E To Evade", "useE")
_Evader(self.Menu.Auto.useE):CheckCC():AddCallback(function(target) self:EvadeE(target) end)
self.Menu:addSubMenu(myHero.charName.." - WallJump Settings", "WallJump")
self.Menu.WallJump:addParam("MinRange", "Min. Width of Wall", SCRIPT_PARAM_SLICE, 120, 50, 380)
self.Menu.WallJump:addParam("MaxRange", "Max. Width of Wall", SCRIPT_PARAM_SLICE, 380, 50, 380)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("useCancelAnimation","Use Cancel Animation", SCRIPT_PARAM_LIST, 2, {"Never", "Mouse", "Joke", "Taunt", "Dance", "Laugh"})
self.Menu.Misc:addParam("cancelR","Cancel R Animation", SCRIPT_PARAM_ONOFF, true)
self.Menu.Misc:addParam("overkill","Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu.Misc:addParam("enemyTurret","Don't cast on enemy turret", SCRIPT_PARAM_ONOFF, false)
self.Menu.Misc:addParam("developer","Developer mode", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Draw Settings", "Draw")
self.Menu.Draw:addParam("TimeQ", "Show Time Left for Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.Draw:addParam("dmgCalc", "Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("FlashCombo","Use R Flash (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("L"))
self.Menu.Keys:addParam("Run", "Run", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
self.Menu.Keys:addParam("WallJump", "Wall Jump (Beta)", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("J"))
--self.Menu.Keys:permaShow("FlashCombo")
self.Menu.Keys.FlashCombo = false
self.Menu.Keys.Run = false
self.Menu.Keys.WallJump = false
PrintMessage(self.ScriptName, "If the Orbwalker cancel your AA, go to Orbwalk Manager and modify the value of Extra WindUpTime")
AddDrawCallback(function() self:OnDraw() end)
AddTickCallback(function() self:OnTick() end)
AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end)
self.LastStack = 0
AddApplyBuffCallback(
function(source, unit, buff)
if unit and source and buff and unit.isMe and buff.name:lower():find("rivenpassiveaaboost") then
self.LastStack = 1
end
end
)
AddUpdateBuffCallback(
function(unit, buff, stacks)
if unit and buff and stacks and unit.isMe and buff.name:lower():find("rivenpassiveaaboost") then
if self.LastStack == stacks + 1 then
if not OrbwalkManager:CanMove() then
OrbwalkManager:ResetMove()
end
end
self.LastStack = stacks
end
end
)
AddRemoveBuffCallback(
function(unit, buff)
if unit and buff and unit.isMe and buff.name:lower():find("rivenpassiveaaboost") then
if self.LastStack == 1 then
if not OrbwalkManager:CanMove() then
OrbwalkManager:ResetMove()
end
end
self.LastStack = 0
end
end
)
AddAnimationCallback(
function(unit, animationName)
if unit.isMe then
if animationName:lower():find("idle") then
elseif animationName:lower():find("attack") then
elseif animationName:lower():find("idle1") then
elseif animationName:lower():find("spell1a") then
self.Q.State = 1
elseif animationName:lower():find("spell1b") then
self.Q.State = 2
elseif animationName:lower():find("spell1c") then
self.Q.State = 3
DelayAction(function() self.Q.State = 0 end, 1)
end
end
end
)
AddCreateObjCallback(
function(obj)
--if obj and GetDistance(obj, myHero) < 1000 then print("Created: "..obj.name) end
if obj and obj.name and obj.name:lower():find("_q") and obj.name:lower():find("_trail") then
if obj.name:lower():find("01") then
self.Q.State = 1
elseif obj.name:lower():find("02") then
self.Q.State = 2
elseif obj.name:lower():find("03") then
self.Q.State = 3
end
elseif obj and obj.name and obj.name:lower():find("riven") and obj.name:lower():find("_r") and obj.name:lower():find("_buff.troy") then
self.R.State = true
DelayAction(function() self.R.State = false end, 15)
end
end
)
AddDeleteObjCallback(
function(obj)
--if obj and GetDistance(obj, myHero) < 1000 then print("Deleted: "..obj.name) end
if obj and obj.name and obj.name:lower():find("_p") and obj.name:lower():find("_buff") then
self.P.Stacks = 0
elseif obj and obj.name and obj.name:lower():find("_q") and obj.name:lower():find("_detonate") and obj.name:lower():find("03") then
self.Q.State = 0
elseif obj and obj.name and obj.name:lower():find("riven") and obj.name:lower():find("_r") and obj.name:lower():find("_buff.troy") then
self.R.State = false
end
end
)
self.MenuLoaded = true
end
function _Riven:ForceQ3(target)
if self.Q.IsReady() and self.Q.State == 2 and ValidTarget(target, self.Q.Range + self.Q.Width / 2) then
self:CastQ(target)
end
end
function _Riven:ForceEW(target)
if self.E.IsReady() and ValidTarget(target, self.E.Range + self.W.Width / 2) and GetDistanceSqr(myHero, target) > self.W.Width * self.W.Width then
self:CastE(target)
elseif self.W.IsReady() and ValidTarget(target, self.W.Range) then
self:CastW(target)
end
end
function _Riven:EvadeE(target)
if self.E.IsReady() and ValidTarget(target, self.E.Range + 800) then
local perpendicular = Vector(myHero) + Vector(Vector(target) - Vector(myHero)):normalized():perpendicular() * self.E.Range
CastSpell(self.E.Slot, perpendicular.x, perpendicular.z)
end
end
function _Riven:UpdateValues()
self.TS.range = self:GetRange()
self.TS:update()
if self.W.IsReady() then self.W.TS:update() end
if self.R.IsReady() then self.R.TS:update() end
if os.clock() - self.R.LastCastTime < 15 and not self.R.LastCastTime == 0 then
if self.Q.State == 2 then
self.Q.Width = 180
else
self.Q.Width = 150
end
self.W.Width = 270
self.W.Range = 270
else
if self.Q.State == 2 then
self.Q.Width = 150
else
self.Q.Width = 100
end
self.W.Width = 250
self.W.Range = 250
end
self.QSpell.Width = self.Q.Width
self.QSpell.Range = self.Q.Range
self.WSpell.Width = self.W.Width
self.WSpell.Range = self.W.Range
end
function _Riven:ShouldUseAA()
if (OrbwalkManager.GotReset or self.P.Stacks > 2) and not OrbwalkManager:IsNone() then
local target = OrbwalkManager:ObjectInRange(self.AA.OffsetRange)
if ValidTarget(target) then
if self:RequiresAA(target) and (OrbwalkManager:IsCombo() or OrbwalkManager:IsHarass()) then
return true
elseif (OrbwalkManager:IsLastHit() or OrbwalkManager:IsClear()) then
return true
end
end
end
return false
end
function _Riven:OnTick()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self:UpdateValues()
if self.Menu.Keys.Run then self:Run()
elseif self.Menu.Keys.WallJump then self:Jump() end
if self.Menu.KillSteal.useQ or self.Menu.KillSteal.useW or self.Menu.KillSteal.useIgnite or self.Menu.KillSteal.useR2 or self.Menu.Combo.useR2 == 2 then
self:KillSteal()
end
if not OrbwalkManager:CanCast() then return end
if self.Menu.Misc.enemyTurret and UnitAtTurret(self.TS.target, 0) and UnitAtTurret(myHero, self.Q.Range) then return end
if self:ShouldUseAA() then return end
self:CheckAuto()
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit() end
if self.Q.IsReady() and self.Q.State > 0 and os.clock() - self.Q.LastCastTime >= self.Q.TimeReset * 0.9 and os.clock() - self.Q.LastCastTime < self.Q.TimeReset and self.Q.LastCastTime > 0 and not OrbwalkManager:IsNone() then
CastSpell(self.Q.Slot, mousePos.x, mousePos.z)
end
end
function _Riven:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.4 and ValidTarget(enemy, self.R.Range) and enemy.visible then
if self.Menu.KillSteal.useQ and self.Q.Damage(enemy) > enemy.health and not enemy.dead then self:CastQ(enemy) end
if self.Menu.KillSteal.useW and self.W.Damage(enemy) > enemy.health and not enemy.dead then self:CastW(enemy) end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead then CastIgnite(enemy) end
if (self.Menu.KillSteal.useR2 or self.Menu.Combo.useR2 == 2 or self.Menu.Combo.useR2 == 4) and self.R.Damage(enemy) > enemy.health and not enemy.dead then self:CastR2(enemy) end
end
end
end
function _Riven:CheckAuto()
if self.Menu.Auto.AutoW > 0 and self.W.IsReady() and CountEnemies(myHero, self.W.Range) >= self.Menu.Auto.AutoW then
CastSpell(self.W.Slot)
end
if self.W.IsReady() and self.Menu.Auto.AutoEW > 0 and self.E.IsReady() then
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.E.Range + self.W.Width/2) and self.E.IsReady() and self.W.IsReady() and self.Menu.Auto.AutoEW > 0 then
local CastPosition, HitChance, Count = Prediction.VP:GetCircularAOECastPosition(enemy, self.W.Delay, self.W.Width, self.E.Range, self.E.Speed, myHero)
if Count ~= nil and Count >= self.Menu.Auto.AutoEW then
CastSpell(self.E.Slot, CastPosition.x, CastPosition.z)
DelayAction(function() CastSpell(self.W.Slot) end, 0.2)
break
end
end
end
end
end
function _Riven:Combo()
local target = self.TS.target
if ValidTarget(target, self.TS.range) then
if self.Menu.Combo.useItems then UseItems(self.TS.target) end
if self.Menu.Combo.useIgnite and Ignite.IsReady() then
local p, aa, q, w, e, r1, r2, items = self:GetBestCombo(target)
local dmg, mana = self:GetComboDamage(target, p, aa, q, w, e, r1, r2, items)
if dmg > target.health then CastIgnite(target) end
end
if self.Menu.Combo.useR1 > 1 or self.Menu.Combo.useR2 > 1 then self:CastR() end
if self.queue:Size() > 0 then
if self.Menu.Combo.useW then self:CastW() end
self.queue:Execute()
else
if self.Menu.Combo.useTiamat > 1 then self:CastTiamat(target) end
if self.Menu.Combo.useW then self:CastW() end
if self.Menu.Combo.useE then self:CastE() end
if self.Menu.Combo.useQ then self:CastQ() end
end
end
end
function _Riven:Harass()
local target = self.TS.target
if ValidTarget(target, self.TS.range) then
if self.queue:Size() > 0 then
if self.Menu.Harass.useTiamat then self:CastTiamat(target) end
self.queue:Execute()
else
if self.Menu.Harass.useW then self:CastW() end
if self.Menu.Harass.useE then self:CastE() end
if self.Menu.Harass.useQ then self:CastQ() end
if self.Menu.Harass.useTiamat then self:CastTiamat(target) end
end
end
end
function _Riven:Clear()
if self.queue:Size() > 0 then
self.queue:Execute()
else
self.EnemyMinions:update()
if self.Menu.LaneClear.useQ and self.Q.IsReady() then
local minion, count = GetBestCircularFarmPosition(self.Q.Range, self.Q.Width, self.EnemyMinions.objects)
if ValidTarget(minion, self.Q.Range) and not minion.dead then
self:CastQ(minion)
end
end
if self.Menu.LaneClear.useE and self.E.IsReady() then
local minion, count = GetBestCircularFarmPosition(self.E.Range, self.W.Width, self.EnemyMinions.objects)
if ValidTarget(minion, self.E.Range) and not minion.dead then
CastSpell(self.E.Slot, minion.x, minion.z)
end
end
if self.Menu.LaneClear.useW or self.Menu.LaneClear.useTiamat then
local count = 0
for i, minion in pairs(self.EnemyMinions.objects) do
if self.Menu.LaneClear.useW and ValidTarget(minion, self.W.Range) and self.W.IsReady() and not minion.dead then
count = count +1
end
if self.Menu.LaneClear.useTiamat then self:CastTiamat(minion) end
end
if count > 0 then CastSpell(self.W.Slot) end
end
if self.Menu.JungleClear.useQ or self.Menu.JungleClear.useW or self.Menu.JungleClear.useE or self.Menu.JungleClear.useTiamat then
self.JungleMinions:update()
for i, minion in pairs(self.JungleMinions.objects) do
if minion ~= nil and not minion.dead and self.Menu.JungleClear.useQ and ValidTarget(minion, self.Q.Range) and self.Q.IsReady() then
self:CastQ(minion)
end
if minion ~= nil and not minion.dead and self.Menu.JungleClear.useW and ValidTarget(minion, self.W.Range) and self.W.IsReady() then
CastSpell(self.W.Slot)
end
if minion ~= nil and not minion.dead and self.Menu.JungleClear.useE and ValidTarget(minion, self.E.Range) and self.E.IsReady() then
CastSpell(self.E.Slot, minion.x, minion.z)
end
if self.Menu.JungleClear.useTiamat then self:CastTiamat(minion) end
end
end
end
end
function _Riven:LastHit()
if (self.Menu.LastHit.useQ or self.Menu.LastHit.useW or self.Menu.LastHit.useE) and not OrbwalkManager:CanAttack() then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if self.Menu.LastHit.useQ and ValidTarget(minion, self.Q.Range) and self.Q.IsReady() and not minion.dead and self.Q.Damage(minion) > minion.health then
CastSpell(self.Q.Slot, minion.x, minion.z)
end
if self.Menu.LastHit.useW and ValidTarget(minion, self.W.Range) and self.W.IsReady() and not minion.dead and self.W.Damage(minion) > minion.health then
CastSpell(self.W.Slot)
end
if self.Menu.LastHit.useE and OrbwalkManager:InRange(minion, self.E.Range) and self.E.IsReady() and not minion.dead and self.AA.Damage(minion) + self.P.Damage(minion) > minion.health then
CastSpell(self.E.Slot, minion.x, minion.z)
end
if self.Menu.LastHit.useTiamat and CastableItems.Tiamat.Damage(minion) > minion.health and not minion.dead then self:CastTiamat(minion) end
end
end
end
function _Riven:CastQFast(targ)
local target = ValidTarget(targ, self.Q.Range) and targ or self.TS.target
if self.Q.IsReady() then
if ValidTarget(target, self.Q.Range) then
local CastPosition, WillHit = self.QSpell:GetPrediction(target)
if CastPosition~=nil then
CastSpell(self.Q.Slot, CastPosition.x, CastPosition.z)
end
else
CastSpell(self.Q.Slot, mousePos.x, mousePos.z)
end
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("Q"):lower() then
self.queue:RemoveAt(1)
end
end
end
function _Riven:CastQ(targ)
local target = ValidTarget(targ, self.Q.Range) and targ or self.TS.target
if self.Q.IsReady() and ValidTarget(target) then
local CastPosition, WillHit = self.QSpell:GetPrediction(target)
if ValidTarget(target, self.Q.Range) then
if OrbwalkManager:InRange(target, self.AA.OffsetRange) and self.Q.State == 0 and OrbwalkManager:CanAttack() and self:RequiresAA(target) then return end
if self:ShouldUseAA() then return end
if CastPosition~=nil then
CastSpell(self.Q.Slot, CastPosition.x, CastPosition.z)
return
end
elseif CastPosition~=nil then
CastSpell(self.Q.Slot, CastPosition.x, CastPosition.z)
return
end
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("Q"):lower() then
self.queue:RemoveAt(1)
end
end
end
function _Riven:CastW(targ)
local target = ValidTarget(targ, self.W.Range) and targ or self.W.TS.target
if self.W.IsReady() and ValidTarget(target, self.W.Range) then
self.WSpell:Cast(target)
return
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("W"):lower() then
self.queue:RemoveAt(1)
end
end
end
function _Riven:CastE(targ)
local target = ValidTarget(targ, self.E.Range) and targ or self.TS.target
if self.E.IsReady() and ValidTarget(target, self.TS.range) then -- and (GetDistanceSqr(myHero, target) > self.E.Range * self.E.Range or (not self.Q.IsReady()) )
CastSpell(self.E.Slot, target.x, target.z)
return
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("E"):lower() then
self.queue:RemoveAt(1)
end
end
end
function _Riven:CastR(targ)
local target = ValidTarget(targ, self.R.Range) and targ or self.R.TS.target
if self.R.IsReady() and ValidTarget(target, self.R.Range) then
if not self.R.State then
if self.Menu.Combo.useR1 == 3 then
self:CastR1(target)
elseif self.Menu.Combo.useR1 == 2 then
if self:RequiresR(target) then
self:CastR1(target)
end
end
else
if self.Menu.Combo.useR2 == 2 and self.R.Damage(target) > target.health and not target.dead then
self:CastR2(target)
elseif self.Menu.Combo.useR2 == 3 and self.Q.State == 2 and self.Q.IsReady() and not target.dead then
self:CastR2(target)
end
end
end
end
function _Riven:CastR1(targ)
local target = ValidTarget(targ, self.R.Range) and targ or self.R.TS.target
if self.R.IsReady() and not self.R.State and ValidTarget(target, self.R.Range) then
if self.E.IsReady() and self.Menu.Misc.cancelR then
CastSpell(self.E.Slot, target.x, target.z)
local boolean, count, highestPriority = self.queue:Contains("R1")
if not boolean then
self.queue:Insert(function() self:CastR1(target) end, "R1", 4)
end
return
end
CastSpell(self.R.Slot)
return
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("R1"):lower() then
self.queue:RemoveAt(1)
end
end
end
function _Riven:CastR2(targ)
local target = ValidTarget(targ, self.R.Range) and targ or self.R.TS.target
if self.R.IsReady() and self.R.State and ValidTarget(target, self.R.Range) then
local CastPosition, WillHit = self.RSpell:GetPrediction(target)
if CastPosition~=nil and WillHit then
if self.E.IsReady() and self.Menu.Misc.cancelR then
CastSpell(self.E.Slot, CastPosition.x, CastPosition.z)
local boolean, count, highestPriority = self.queue:Contains("R2")
if not boolean then
self.queue:Insert(function() self:CastR2(target) end, "R2", 4)
end
end
CastSpell(self.R.Slot, CastPosition.x, CastPosition.z)
return
end
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("R2"):lower() then
self.queue:RemoveAt(1)
end
end
end
function _Riven:CastTiamat(targ)
local target = ValidTarget(targ) and targ or self.TS.target
if OrbwalkManager:IsCombo() and self.Menu.Combo.useTiamat == 1 then
if CastableItems.Tiamat.IsReady() and ValidTarget(target) then
CastSpell(CastableItems.Tiamat.Slot())
return
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("TIAMAT"):lower() then
self.queue:RemoveAt(1)
end
end
else
if CastableItems.Tiamat.IsReady() and ValidTarget(target, CastableItems.Tiamat.Range) then
CastSpell(CastableItems.Tiamat.Slot())
return
elseif self.queue:Size() > 0 then
local func, key, priority = self.queue:Get(1)
if key:lower() == tostring("TIAMAT"):lower() then
self.queue:RemoveAt(1)
end
end
end
end
function _Riven:AfterAttack()
self:RemoveStack()
end
function _Riven:AddStack()
if self.P.Stacks < 3 then self.P.Stacks = self.P.Stacks + 1 end
end
function _Riven:RemoveStack()
if self.P.Stacks > 0 then self.P.Stacks = self.P.Stacks - 1 end
end
function _Riven:OnProcessSpell(unit, spell)
if unit and spell and unit.isMe and spell.name then
if spell.name:lower():find("attack") then
self.AA.LastCastTime = os.clock()
elseif spell.name:lower():find("riventricleave") then
self:AddStack()
self:CancelAnimation()
self.Q.LastCastTime = os.clock()
elseif spell.name:lower():find("rivenmartyr") then
self:AddStack()
self:CancelAnimation()
self.W.LastCastTime = os.clock()
elseif spell.name:lower():find("rivenfeint") then
self:AddStack()
self:CancelAnimation()
self.E.LastCastTime = os.clock()
elseif spell.name:lower():find("engine") then
self:AddStack()
self:CancelAnimation()
self.R.LastCastTime = os.clock()
DelayAction(
function()
if ValidTarget(self.R.TS.target) and OrbwalkManager:IsCombo() and self.Menu.Keys.FlashCombo then
CastFlash(self.R.TS.target)
end
end, 0.2)
DelayAction(
function()
if ValidTarget(self.R.TS.target) and OrbwalkManager:IsCombo() and self.Menu.Keys.FlashCombo then
CastFlash(self.R.TS.target)
end
end, 0.4)
elseif spell.name:lower():find("izunablade") then
self:AddStack()
self:CancelAnimation()
DelayAction(
function()
if ValidTarget(self.R.TS.target) and OrbwalkManager:IsCombo() and self.Menu.Keys.FlashCombo then
--CastFlash(self.R.TS.target)
end
end, 0.2)
elseif spell.name:lower():find("tiamat") or spell.name:lower():find("hydra") then
self:CancelAnimation()
elseif spell.name:lower():find("flash") then
end
end
end
function _Riven:GetRange()
if OrbwalkManager:IsCombo() then return self.Menu.TS.Combo
elseif OrbwalkManager:IsHarass() then return self.Menu.TS.Harass
else return self.Menu.TS.Combo
end
end
function _Riven:GetSafePlace(target)
self.AllyMinions:update()
local bestPlace = nil
if bestPlace == nil then
for idx, champion in ipairs(GetAllyHeroes()) do
if champion.valid and champion.visible then
if GetDistanceSqr(myHero, champion) <= 800 * 800 and GetDistanceSqr(champion, target) > GetDistanceSqr(myHero, target) then
if bestPlace == nil then bestPlace = champion
elseif GetDistanceSqr(myHero, bestPlace) < GetDistanceSqr(myHero, champion) then bestPlace = champion end
end
end
end
end
if bestPlace == nil then
for i, turret in pairs(GetTurrets()) do
if turret ~= nil then
if turret.team == myHero.team and GetDistanceSqr(turret, target) > GetDistanceSqr(myHero, target) then
if bestPlace == nil then bestPlace = turret
elseif GetDistanceSqr(myHero, bestPlace) < GetDistanceSqr(myHero, turret) then bestPlace = turret end
end
end
end
end
if bestPlace == nil then
for i, minion in pairs(self.AllyMinions.objects) do
if GetDistanceSqr(minion, target) > GetDistanceSqr(myHero, target) then
if bestPlace == nil then bestPlace = minion
elseif GetDistanceSqr(myHero, bestPlace) < GetDistanceSqr(myHero, minion) then bestPlace = minion end
end
end
end
return bestPlace
end
function _Riven:RequiresAA(target)
if ValidTarget(target) then
local q = 0
if self.Q.IsReady() then q = (3 - self.Q.State) end
local d, m = self:GetComboDamage(target, 0, 0, q, self.W.IsReady(), self.E.IsReady(), false, false, false)
if d > target.health then return false end
local d, m = self:GetComboDamage(target, 0, 0, q, self.W.IsReady(), self.E.IsReady(), self.R.IsReady() or self.R.State, self.R.IsReady(), false)
if d > target.health then return false end
end
return true
end
function _Riven:RequiresR(target)
local q = 0
if self.Q.IsReady() then q = (3 - self.Q.State) end
local p = 0
if q > 0 then p = p + q end
if self.W.IsReady() then p = p + 1 end
if self.E.IsReady() then p = p + 1 end
if self.R.IsReady() then p = p + 1 end
p = math.min(p, 3)
if ValidTarget(target) then
local d, m = self:GetComboDamage(target, p, p + 1, q, self.W.IsReady(), self.E.IsReady(), false, false, false)
if d > target.health then return false end
end
return true
end
function _Riven:GetBestCombo(target)
if not ValidTarget(target) then return 0, 0, 0, false, false, false, false, false end
local q = 0
if self.Q.IsReady() then q = (3 - self.Q.State) end
local p = 0
if q > 0 then p = p + q end
if self.W.IsReady() then p = p + 1 end
if self.E.IsReady() then p = p + 1 end
if self.R.IsReady() then p = p + 1 end
p = math.min(p, 3)
local d, m = self:GetComboDamage(target, 0, 0, q, self.W.IsReady(), self.E.IsReady(), false, false, false)
if d > target.health then
return 0, 0, q, self.W.IsReady(), self.E.IsReady(), false, false, false
end
local d, m = self:GetComboDamage(target, 0, 0, q, self.W.IsReady(), self.E.IsReady(), self.R.IsReady() or self.R.State, self.R.IsReady(), false)
if d > target.health then
return 0, 0, q, self.W.IsReady(), self.E.IsReady(), self.R.IsReady() or self.R.State, self.R.IsReady(), false
else
local p = 0
if q > 0 then p = p + q end
if self.W.IsReady() then p = p + 1 end
if self.E.IsReady() then p = p + 1 end
if self.R.IsReady() then p = p + 1 end
p = math.min(p, 3)
local item = CastableItems.Tiamat.IsReady()
local dmg = self:GetComboDamage(target, p, p, q, self.W.IsReady(), self.E.IsReady(), self.R.IsReady() or self.R.State, self.R.IsReady(), item)
return p, p + 1, q, self.W.IsReady(), self.E.IsReady(), self.R.IsReady() or self.R.State, self.R.IsReady(), item
end
end
function _Riven:GetComboDamage(target, p, aa, q, w, e, r1, r2, items)
local comboDamage = 0
local currentManaWasted = 0
if target ~= nil and target.valid then
comboDamage = comboDamage + self.P.Damage(target) * p
comboDamage = comboDamage + self.AA.Damage(target) * aa
if q > 0 then
comboDamage = comboDamage + self.Q.Damage(target) * q
comboDamage = comboDamage + self.P.Damage(target) * 1
comboDamage = comboDamage + self.AA.Damage(target) * 1
end
if w then
comboDamage = comboDamage + self.W.Damage(target)
comboDamage = comboDamage + self.P.Damage(target) * 1
comboDamage = comboDamage + self.AA.Damage(target) * 1
end
if e then
end
if r1 then
comboDamage = comboDamage + self.AA.Damage(target) * aa * 0.2
comboDamage = comboDamage + self.P.Damage(target) * p * 0.2
end
if r2 then
comboDamage = comboDamage + self.R.Damage(target)
end
if items then
comboDamage = comboDamage + DamageItems(target)
end
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Riven:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
function _Riven:DrawPredictedDamage()
for i, enemy in ipairs(GetEnemyHeroes()) do
local point = WorldToScreen(D3DXVECTOR3(enemy.x, enemy.y, enemy.z))
if ValidTarget(enemy) and enemy.visible and OnScreen(point.x, point.y) then
local p, aa, q, w, e, r1, r2, items = self:GetBestCombo(enemy)
local dmg, mana = self:GetComboDamage(enemy, p, aa, q, w, e, r1, r2, items)
local spells = ""
if p > 0 then spells = spells .." P" end
if q > 0 then spells = spells .." Q" end
if w then spells = spells .. " W" end
if e then spells = spells .. " E" end
if r1 or r2 then spells = spells .. " R" end
DrawLineHPBar(dmg, spells, enemy, true)
end
end
end
function _Riven:OnDraw()
-- body
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then self:DrawPredictedDamage() end
if self.Menu.Misc.developer then
local pos = WorldToScreen(D3DXVECTOR3(myHero.x , myHero.y, myHero.z))
--local string = "P: ".." ".. self.P.Stacks
local string = "CanMove "..tostring(OrbwalkManager:CanMove()).." CanAttack "..tostring(OrbwalkManager:CanAttack())
DrawText(string, 25, pos.x, pos.y + 50, ARGB(255,255,255,255))
if self.queue:Size() > 0 then
for i = 1, self.queue:Size(), 1 do
local X = myHero.x + 600
local CountY = myHero.y + 400 - i*50
local CountZ = myHero.z + 400 - i*50
local pos = WorldToScreen(D3DXVECTOR3(X , CountY, CountZ))
local func, key, priority = self.queue:Get(i)
local string = key .." "..priority
DrawText(string, 25, pos.x, pos.y, ARGB(255,255,255,255))
end
end
end
if self.Q.State > 0 and self.Menu.Draw.TimeQ then
local pos = WorldToScreen(D3DXVECTOR3(myHero.x , myHero.y, myHero.z))
local function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
local color = Colors.Green
local timeLeft = self.Q.TimeReset - (os.clock() - self.Q.LastCastTime)
if timeLeft > 0 then
if timeLeft > 2/3 * self.Q.TimeReset then
color = Colors.Green
elseif timeLeft > 1/3 * self.Q.TimeReset and timeLeft <= 2/3 * self.Q.TimeReset then
color = Colors.Yellow
else
color = Colors.Red
end
local string = "Q Time Left".." "..tostring(round(timeLeft, 1))
DrawText(string, 20, pos.x - 50, pos.y, color)
end
end
end
function _Riven:CancelAnimation()
local mode = self.Menu.Misc~=nil and self.Menu.Misc.useCancelAnimation or 1
local target = OrbwalkManager:ObjectInRange( self.AA.OffsetRange * 2)
if ValidTarget(target) and mode > 1 then
if mode == 1 then
elseif mode == 2 then
local MovePos = myHero + Vector(Vector(myHero) - Vector(target)):normalized() * Prediction.VP:GetHitBox(myHero) * 1.5
myHero:MoveTo(MovePos.x, MovePos.z)
elseif mode == 3 then
SendChat("/j")
elseif mode == 4 then
SendChat("/t")
elseif mode == 5 then
SendChat("/d")
elseif mode == 6 then
SendChat("/l")
end
end
end
function _Riven:Run()
if not OrbwalkManager:IsAttacking() then myHero:MoveTo(mousePos.x, mousePos.z) end
if self.E.IsReady() and os.clock() - self.Q.LastCastTime > 0.25 + GetLatency()/2000 then
CastSpell(self.E.Slot, mousePos.x, mousePos.z)
self.E.LastCastTime = os.clock()
return
end
if self.Q.IsReady() and os.clock() - self.E.LastCastTime > 0.25 + GetLatency()/2000 then
CastSpell(self.Q.Slot, mousePos.x, mousePos.z)
self.Q.LastCastTime = os.clock()
return
end
end
function _Riven:Jump()
local wall, wall2 = self.wallJump:GetWallNear()
local stop = 60
if wall ~= nil and wall2 ~= nil then
if GetDistanceSqr(myHero, wall) > stop * stop then
myHero:MoveTo(wall.x, wall.z)
end
if GetDistanceSqr(wall, myHero) < ((3 - self.Q.State) * self.Q.Range + self.E.Range) * ((3 - self.Q.State) * self.Q.Range + self.E.Range) then
if self.E.IsReady() and self.Q.State >= 2 and os.clock() - self.Q.LastCastTime > 0.4 then
CastSpell(self.E.Slot, wall2.x, wall2.z)
return
end
if self.Q.IsReady() then
if self.Q.State < 2 then
if GetDistanceSqr(myHero, wall) > (self.Q.Range + 50) * (self.Q.Range + 50) then
CastSpell(self.Q.Slot, wall.x, wall.z)
return
else
local pos = wall - Vector(wall.x - myHero.x, 0, wall.z - myHero.z):normalized() * self.Q.Range
CastSpell(self.Q.Slot, pos.x, pos.z)
return
end
elseif GetDistanceSqr(myHero, wall) <= stop * stop then
if GetDistanceSqr(myHero, wall) < GetDistanceSqr(myHero, wall2) and os.clock() - self.Q.LastCastTime > 0.8 and os.clock() - self.E.LastCastTime > 0.3 then
CastSpell(self.Q.Slot, wall2.x, wall2.z)
return
end
end
end
end
else
myHero:MoveTo(mousePos.x, mousePos.z)
end
end
class "_Draven"
function _Draven:__init()
self.ScriptName = "Draven Me Crazy"
self.Author = "iCreative"
self.MenuLoaded = false
self.Menu = nil
self.P = { Damage = function(target) return getDmg("P", target, myHero) end, IsReady = false}
self.AA = { Range = function(target) local int1 = 0 if ValidTarget(target) then int1 = GetDistance(target.minBBox, target)/2 end return myHero.range + GetDistance(myHero, myHero.minBBox) + int1 + 50 end, Damage = function(target) return getDmg("AD", target, myHero) end }
self.Q = { Slot = _Q, DamageName = "Q", Range = 1075, Width = 60, Delay = 0.5, Speed = 1200, LastCastTime = 0, Collision = true, Aoe = false, Type = SPELL_TYPE.SELF, IsReady = function() return myHero:CanUseSpell(_Q) == READY end, Mana = function() return myHero:GetSpellData(_Q).mana end, Damage = function(target) return getDmg("P", target, myHero) end, IsCatching = false, Stacks = 0}
self.W = { Slot = _W, DamageName = "W", Range = 950, Width = 315, Delay = 0.5, Speed = math.huge, LastCastTime = 0, Collision = false, Aoe = false, Type = SPELL_TYPE.SELF, IsReady = function() return myHero:CanUseSpell(_W) == READY end, Mana = function() return myHero:GetSpellData(_W).mana end, Damage = function(target) return 0 end, HaveMoveSpeed = false, HaveAttackSpeed = false}
self.E = { Slot = _E, DamageName = "E", Range = 1050, Width = 130, Delay = 0.25, Speed = 1600, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_E) == READY end, Mana = function() return myHero:GetSpellData(_E).mana end, Damage = function(target) return getDmg("E", target, myHero) end}
self.R = { Slot = _R, DamageName = "R", Range = 20000, Width = 155, Delay = 0.5, Speed = 2000, LastCastTime = 0, Collision = false, Aoe = true, Type = SPELL_TYPE.LINEAR, IsReady = function() return myHero:CanUseSpell(_R) == READY end, Mana = function() return myHero:GetSpellData(_R).mana end, Damage = function(target) return getDmg("R", target, myHero) end, Obj = nil}
self:LoadVariables()
self:LoadMenu()
end
function _Draven:LoadVariables()
self.ProjectileSpeed = myHero.range > 300 and Prediction.VP:GetProjectileSpeed(myHero) or math.huge
self.TS = TargetSelector(TARGET_LESS_CAST_PRIORITY, 900, DAMAGE_PHYSICAL)
self.EnemyMinions = minionManager(MINION_ENEMY, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.JungleMinions = minionManager(MINION_JUNGLE, 900, myHero, MINION_SORT_MAXHEALTH_DEC)
self.Menu = scriptConfig(self.ScriptName.." by "..self.Author, self.ScriptName.."1.000")
self.AxesCatcher = _AxesCatcher()
self.QSpell = _Spell(self.Q)
self.WSpell = _Spell(self.W)
self.ESpell = _Spell(self.E):AddDraw()
self.RSpell = _Spell(self.R):AddDraw()
--OrbwalkManager:TakeControl()
end
function _Draven:LoadMenu()
self.Menu:addSubMenu(myHero.charName.." - Target Selector Settings", "TS")
self.Menu.TS:addTS(self.TS)
_Circle({Menu = self.Menu.TS, Name = "Draw", Text = "Draw circle on Target", Source = function() return self.TS.target end, Range = 120, Condition = function() return ValidTarget(self.TS.target, self.TS.range) end, Color = {255, 255, 0, 0}, Width = 4})
_Circle({Menu = self.Menu.TS, Name = "Range", Text = "Draw circle for Range", Range = function() return self.TS.range end, Color = {255, 255, 0, 0}, Enable = false})
self.Menu:addSubMenu(myHero.charName.." - Combo Settings", "Combo")
self.Menu.Combo:addParam("useQ","Use Q", SCRIPT_PARAM_LIST, 3, { "Zero Spins", "One Spin", "Two Spins"})
self.Menu.Combo:addParam("useW","Use W", SCRIPT_PARAM_LIST, 2, { "Never", "If is not in range", "Always"})
self.Menu.Combo:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR1","Use R if Killable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Combo:addParam("useR2","Use R If Enemies >=", SCRIPT_PARAM_SLICE, 3, 0, 5, 0)
self.Menu.Combo:addParam("useItems","Use Items", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Harass Settings", "Harass")
self.Menu.Harass:addParam("useQ","Use Q", SCRIPT_PARAM_LIST, 2, { "Zero Spins", "One Spin", "Two Spins"})
self.Menu.Harass:addParam("useW","Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("useE","Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.Harass:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 20, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - LaneClear Settings", "LaneClear")
self.Menu.LaneClear:addParam("useQ", "Use Q", SCRIPT_PARAM_LIST, 2, { "Zero Spins", "One Spin", "Two Spins"})
self.Menu.LaneClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LaneClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 20, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - JungleClear Settings", "JungleClear")
self.Menu.JungleClear:addParam("useQ", "Use Q", SCRIPT_PARAM_LIST, 2, { "Zero Spins", "One Spin", "Two Spins"})
self.Menu.JungleClear:addParam("useW", "Use W", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.JungleClear:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 20, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - LastHit Settings", "LastHit")
self.Menu.LastHit:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, false)
self.Menu.LastHit:addParam("Mana", "Min. Mana Percent: ", SCRIPT_PARAM_SLICE, 20, 0, 100, 0)
self.Menu:addSubMenu(myHero.charName.." - KillSteal Settings", "KillSteal")
self.Menu.KillSteal:addParam("useQ", "Use Q", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useE", "Use E", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useR", "Use R", SCRIPT_PARAM_ONOFF, true)
self.Menu.KillSteal:addParam("useIgnite", "Use Ignite", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Auto Settings", "Auto")
self.Menu.Auto:addSubMenu("Use E To Interrupt", "useE")
_Interrupter(self.Menu.Auto.useE):CheckGapcloserSpells():CheckChannelingSpells():AddCallback(function(target) self:CastE(target) end)
self.Menu:addSubMenu(myHero.charName.." - Axe Settings", "Axe")
self.AxesCatcher:LoadMenu(self.Menu.Axe)
self.Menu:addSubMenu(myHero.charName.." - Misc Settings", "Misc")
self.Menu.Misc:addParam("overkill","Overkill % for Dmg Predict..", SCRIPT_PARAM_SLICE, 10, 0, 100, 0)
self.Menu.Misc:addParam("rRange","R Range", SCRIPT_PARAM_SLICE, 1800, 300, 6000, 0)
self.Menu.Misc:addParam("developer", "Developer Mode", SCRIPT_PARAM_ONOFF, false)
self.Menu:addSubMenu(myHero.charName.." - Drawing Settings", "Draw")
self.Menu.Draw:addParam("dmgCalc","Damage Prediction Bar", SCRIPT_PARAM_ONOFF, true)
self.Menu:addSubMenu(myHero.charName.." - Key Settings", "Keys")
OrbwalkManager:LoadCommonKeys(self.Menu.Keys)
self.Menu.Keys:addParam("Flee", "Flee", SCRIPT_PARAM_ONKEYDOWN, false, string.byte("T"))
AddTickCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
self.R.Range = self.Menu.Misc.rRange
self.TS:update()
self.AxesCatcher:CheckCatch()
self:KillSteal()
if OrbwalkManager:IsCombo() then self:Combo()
elseif OrbwalkManager:IsHarass() then self:Harass()
elseif OrbwalkManager:IsClear() then self:Clear()
elseif OrbwalkManager:IsLastHit() then self:LastHit()
end
if self.Menu.Keys.Flee then self:Flee() end
end
)
AddCastSpellCallback(
function(iSpell, startPos, endPos, targetUnit)
if myHero.dead or not self.MenuLoaded then return end
if iSpell == self.QSpell.Slot then
self.Q.LastCastTime = os.clock()
elseif iSpell == self.WSpell.Slot then
self.W.LastCastTime = os.clock()
self.W.HaveMoveSpeed = true
self.W.HaveAttackSpeed = true
elseif iSpell == self.ESpell.Slot then
self.E.LastCastTime = os.clock()
elseif iSpell == self.RSpell.Slot then
self.R.LastCastTime = os.clock()
end
end
)
--[[
AddProcessSpellCallback(
function(unit, spell)
if myHero.dead or not self.MenuLoaded then return end
if unit and spell and spell.name and unit.isMe then
if spell.name:lower() == "dravenspinning" then self.Q.LastCastTime = os.clock()
elseif spell.name:lower() == "dravendoubleshot" then self.E.LastCastTime = os.clock()
elseif spell.name:lower():find("fury") then
self.W.LastCastTime = os.clock()
self.W.HaveMoveSpeed = true
self.W.HaveAttackSpeed = true
elseif spell.name:lower() == "dravenrcast" then self.R.LastCastTime = os.clock()
end
end
end
)]]
AddDrawCallback(
function()
if myHero.dead or self.Menu == nil or not self.MenuLoaded then return end
if self.Menu.Draw.dmgCalc then DrawPredictedDamage() end
end
)
AddCreateObjCallback(
function(obj)
if obj and os.clock() - self.R.LastCastTime < 0.5 and obj.name:lower():find("missile") and ( obj.spellOwner and obj.spellOwner.isMe or GetDistanceSqr(myHero, obj) < 100 * 100) then
self.R.Obj = obj
end
end
)
AddDeleteObjCallback(
function(obj)
if obj and obj.valid and obj.name and self.R.Obj ~= nil and GetDistanceSqr(self.R.Obj, obj) < 100 * 100 and obj.name == self.R.Obj.name then
self.R.Obj = nil
elseif obj and obj.valid and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("_w")and obj.name:lower():find("_buf") then
if obj.name:lower():find("move") then
self.W.HaveMoveSpeed = false
elseif obj.name:lower():find("attack") then
self.W.HaveAttackSpeed = false
end
end
end
)
self.MenuLoaded = true
end
function _Draven:KillSteal()
for idx, enemy in ipairs(GetEnemyHeroes()) do
if enemy.health/enemy.maxHealth < 0.4 and ValidTarget(enemy, self.R.Range) and enemy.visible then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
if self.Menu.KillSteal.useQ and ( q or self.Q.Damage(enemy) > enemy.health) and not enemy.dead then self:CastQ(enemy) end
if self.Menu.KillSteal.useE and ( e or self.E.Damage(enemy) > enemy.health) and not enemy.dead then self:CastE(enemy) end
if self.Menu.KillSteal.useR and ( r or self.R.Damage(enemy) > enemy.health) and not enemy.dead then self:CastR(enemy) end
end
if self.Menu.KillSteal.useIgnite and Ignite.IsReady() and Ignite.Damage(enemy) > enemy.health and not enemy.dead then CastIgnite(enemy) end
end
end
end
function _Draven:Flee()
if not OrbwalkManager:IsAttacking() then myHero:MoveTo(mousePos.x, mousePos.z) end
if self.W.IsReady() then CastSpell(self.W.Slot) end
if self.E.IsReady() then
local target = nil
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.E.Range) then
if target == nil then target = enemy
elseif GetDistanceSqr(myHero, target) > GetDistanceSqr(myHero, enemy) then target = enemy
end
end
end
if ValidTarget(target, self.E.Range) then
self:CastE(target)
end
end
end
function _Draven:GetLastRTarget()
local last = nil
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, self.R.Range) and enemy.visible then
if last == nil then last = enemy
elseif GetDistanceSqr(myHero, last) < GetDistanceSqr(myHero, enemy) then last = enemy end
end
end
return last
end
function _Draven:Combo()
local target = self.TS.target
if ValidTarget(target, self.TS.range) then
if self.Menu.Combo.useItems then UseItems(target) end
if self.Menu.Combo.useE then self:CastE(target) end
if self.Menu.Combo.useQ then self:CastQ(target, self.Menu.Combo.useQ) end
if self.Menu.Combo.useW > 1 then self:CastW(target, self.Menu.Combo.useW) end
if self.Menu.Combo.useR1 then
local q, w, e, r, dmg = GetBestCombo(target)
if r and dmg >= target.health then self:CastR(target) end
end
if self.Menu.Combo.useR2 > 0 and self.R.IsReady() then
local BestCastPosition, BestHitChance, BestCount = nil, nil, 0
for idx, enemy in ipairs(GetEnemyHeroes()) do
if self.R.IsReady() and ValidTarget(enemy, self.R.Range) then
local CastPosition, HitChance, Count = Prediction.VP:GetLineAOECastPosition(enemy, self.R.Delay, self.R.Width, GetDistance(myHero, self:GetLastRTarget()) + 200, self.R.Speed, myHero)
if BestCount == 0 then BestCastPosition = CastPosition BestHitChance = HitChance BestCount = Count
elseif BestCount < Count then BestCastPosition = CastPosition BestHitChance = HitChance BestCount = Count end
end
end
if BestCount >= self.Menu.Combo.useR2 and BestCastPosition ~= nil and BestHitChance ~=nil and BestHitChance >= 2 then
CastSpell(self.R.Slot, BestCastPosition.x, BestCastPosition.z)
end
end
end
end
function _Draven:Harass()
if myHero.mana / myHero.maxMana * 100 >= self.Menu.Harass.Mana then
if self.Menu.Harass.useQ and self.Q.IsReady() then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if ValidTarget(minion, self.AA.Range(minion)) then
self:CastQ(minion, self.Menu.Harass.useQ)
end
end
end
local target = self.TS.target
if ValidTarget(target) then
if self.Menu.Harass.useE then self:CastE(target) end
if self.Menu.Harass.useQ and self.Q.IsReady() then self:CastQ(target, self.Menu.Harass.useQ) end
if self.Menu.Harass.useW then self:CastW(target) end
end
end
end
function _Draven:Clear()
if myHero.mana / myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if ValidTarget(minion) and myHero.mana / myHero.maxMana * 100 >= self.Menu.LaneClear.Mana then
if self.Menu.LaneClear.useE and self.E.IsReady() then
local BestPos = GetBestLineFarmPosition(self.E.Range, self.E.Width, self.EnemyMinions.objects)
if BestPos ~= nil then CastSpell(self.E.Slot, BestPos.x, BestPos.z) end
end
if self.Menu.LaneClear.useQ and self.Q.IsReady() then
self:CastQ(minion, self.Menu.LaneClear.useQ)
end
if self.Menu.LaneClear.useW and self.W.IsReady() then
self:CastW(minion)
end
end
end
end
if myHero.mana / myHero.maxMana * 100 >= self.Menu.JungleClear.Mana then
self.JungleMinions:update()
for i, minion in pairs(self.JungleMinions.objects) do
if ValidTarget(minion) and myHero.mana / myHero.maxMana * 100 >= self.Menu.JungleClear.Mana then
if self.Menu.JungleClear.useE and self.E.IsReady() then
CastSpell(self.E.Slot, minion.x, minion.z)
end
if self.Menu.JungleClear.useQ and self.Q.IsReady() then
self:CastQ(minion, self.Menu.JungleClear.useQ)
end
if self.Menu.JungleClear.useW and self.W.IsReady() then
self:CastW(minion)
end
end
end
end
end
function _Draven:LastHit()
self.EnemyMinions:update()
for i, minion in pairs(self.EnemyMinions.objects) do
if ValidTarget(minion, self.AA.Range(minion)) and self.Menu.LastHit.useQ and self.Q.IsReady() then
local time = OrbwalkManager:WindUpTime() - OrbwalkManager:ExtraWindUp() + GetLatency()/2000 + GetDistance(myHero.pos, minion.pos) / self.ProjectileSpeed - 100/1000
local predHealth = Prediction.VP:GetPredictedHealth(minion, time, 0)
local axedmg = self.AxesCatcher:GetCountAxes() > 0 and self.Q.Damage(minion) or 0
if Prediction.VP:CalcDamageOfAttack(myHero, minion, {name = "Basic"}, 0) + axedmg > predHealth and predHealth > -40 then
if self.AxesCatcher:GetCountAxes() == 0 then
self:CastQ(minion, 2)
end
end
end
if self.Menu.LastHit.useE then
self.ESpell:LastHit()
end
end
end
function _Draven:CastQ(target, m)
local mode = m ~= nil and m or 3
if self.Q.IsReady() and ValidTarget(target, self.TS.range) and self.AxesCatcher:GetCountAxes() < 2 and OrbwalkManager:CanAttack() then
-- 2 spins
if mode == 3 then
CastSpell(self.Q.Slot)
-- 1 spins
elseif mode == 2 then
if self.AxesCatcher:GetCountAxes() < 1 then CastSpell(self.Q.Slot) end
-- 0 spins
elseif mode == 1 then
end
end
end
function _Draven:CastW(target, m)
local mode = m ~= nil and m or 3
if self.W.IsReady() and ValidTarget(target, self.TS.range) and not self.W.HaveAttackSpeed then
if mode == 2 then
if not ValidTarget(target, self.AA.Range(target)) then
CastSpell(self.W.Slot)
end
elseif mode == 3 then
CastSpell(self.W.Slot)
end
end
end
function _Draven:CastE(target)
if self.E.IsReady() and ValidTarget(target, self.E.Range) then
self.ESpell:Cast(target)
end
end
function _Draven:CastR(target)
if self.R.IsReady() and ValidTarget(target, self.R.Range) then
if self.R.Obj == nil then
self.RSpell:Cast(target)
elseif self.R.Obj ~= nil then
if GetDistanceSqr(myHero, self.R.Obj) > GetDistanceSqr(myHero, self:GetLastRTarget()) then
CastSpell(self.R.Slot)
end
end
end
end
function _Draven:GetComboDamage(target, q, w, e, r)
local comboDamage = 0
local currentManaWasted = 0
if ValidTarget(target) then
if q then
comboDamage = comboDamage + self.Q.Damage(target)
currentManaWasted = currentManaWasted + self.Q.Mana()
end
if w then
currentManaWasted = currentManaWasted + self.W.Mana()
comboDamage = comboDamage + self.AA.Damage(target) * 2
end
if e then
comboDamage = comboDamage + self.E.Damage(target)
currentManaWasted = currentManaWasted + self.E.Mana()
end
if r then
comboDamage = comboDamage + self.R.Damage(target)
currentManaWasted = currentManaWasted + self.R.Mana()
end
comboDamage = comboDamage + self.AA.Damage(target) * 2
comboDamage = comboDamage + DamageItems(target)
end
comboDamage = comboDamage * self:GetOverkill()
return comboDamage, currentManaWasted
end
function _Draven:GetOverkill()
return (100 + self.Menu.Misc.overkill)/100
end
class "_AxesCatcher"
function _AxesCatcher:__init()
self.AxesAvailables = {}
self.CurrentAxes = 0
self.Stack = 0
self.AxeRadius = 100
self.LimitTime = 1.2
self.Menu = nil
self.ProjectileSpeed = myHero.range > 300 and Prediction.VP:GetProjectileSpeed(myHero) or math.huge
end
function _AxesCatcher:LoadMenu(m)
self.Menu = m
if self.Menu ~= nil then
self.Menu:addParam("Catch", "Catch Axes (Toggle)", SCRIPT_PARAM_ONKEYTOGGLE, true, string.byte("Z"))
self.Menu.Catch = true
self.Menu:addParam("CatchMode", "Catch Condition", SCRIPT_PARAM_LIST, 1, { "When Orbwalking", "AutoCatch"})
self.Menu:addParam("OrbwalkMode", "Catch Mode", SCRIPT_PARAM_LIST, 2, { "Mouse In Radius", "MyHero In Radius"})
self.Menu:addParam("UseW", "Use W to Catch (Smart)", SCRIPT_PARAM_ONOFF, false)
self.Menu:addParam("Turret", "Dont Catch Under Turret", SCRIPT_PARAM_ONOFF, true)
self.Menu:addParam("DelayCatch", "% of Delay to Catch", SCRIPT_PARAM_SLICE, 100, 0, 100)
self.Menu:addSubMenu("Catch Radius", "CatchRadius")
self.Menu.CatchRadius:addParam("Combo", "Combo Radius", SCRIPT_PARAM_SLICE, 250, 150, 600, 0)
self.Menu.CatchRadius:addParam("Harass", "Harass Radius", SCRIPT_PARAM_SLICE, 350, 150, 600, 0)
self.Menu.CatchRadius:addParam("Clear", "Clear Radius", SCRIPT_PARAM_SLICE, 400, 150, 800, 0)
self.Menu.CatchRadius:addParam("LastHit", "LastHit Radius", SCRIPT_PARAM_SLICE, 400, 150, 800, 0)
self.Menu:addSubMenu("Draw Catch Radius", "Draw")
self.Menu.Draw:addParam("Enable", "Enable", SCRIPT_PARAM_ONOFF, true)
self.Menu.Draw:addParam("Color", "Color", SCRIPT_PARAM_COLOR, { 255, 0, 0, 255 })
self.Menu.Draw:addParam("Width", "Width", SCRIPT_PARAM_SLICE, 1, 1, 5)
self.Menu.Draw:addParam("Quality", "Quality", SCRIPT_PARAM_SLICE, 25, 10, 100)
self.Menu:permaShow("Catch")
self.Menu:permaShow("CatchMode")
self.Menu:permaShow("OrbwalkMode")
--self.Menu:permaShow("DelayCatch")
AddDrawCallback(
function()
if self.Menu ~= nil and not myHero.dead then
if self.Menu.Draw.Enable then
if #self.AxesAvailables > 0 then
for i = 1, #self.AxesAvailables, 1 do
local axe, time = self.AxesAvailables[i][1], self.AxesAvailables[i][2]
if axe~= nil and axe.valid then
local color = self.Menu.Draw.Color
local width = self.Menu.Draw.Width
local quality = self.Menu.Draw.Quality
DrawCircle3D(axe.x, axe.y, axe.z, self:GetRadius(), width, ARGB(color[1], color[2], color[3], color[4]), quality)
end
end
end
end
end
end
)
AddCreateObjCallback(
function(obj)
if self.Menu == nil then return end
if obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_reticle_self.troy") and GetDistanceSqr(myHero, obj) <= (self.LimitTime * myHero.ms) * (self.LimitTime * myHero.ms) then
table.insert(self.AxesAvailables, {obj, os.clock() - GetLatency() / 2000})
--DelayAction(function(i) table.remove(self.AxesAvailables, i) end, self.LimitTime + 0.05, {#self.AxesAvailable + 1} )
DelayAction(function() self:RemoveAxe(obj) end, self.LimitTime + 0.2)
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_buf.troy") then
self.CurrentAxes = self.CurrentAxes + 1
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_tar.troy") then
--self.CurrentAxes = self.CurrentAxes + 1
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("reticlecatchsuccess.troy") then
--print(GetDistance(myHero, obj))
self:RemoveAxe(obj)
end
end
)
AddDeleteObjCallback(
function(obj)
if self.Menu == nil then return end
--if obj and obj.name and obj.name:lower():find("draven") then print("Deleted: "..obj.name) end
--if obj and obj.team and obj.team ~= myHero.team then return end
if obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_reticle.troy") then
self:RemoveAxe(obj)
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_reticle_self.troy") then
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_buf.troy") then
if self.CurrentAxes > 0 then self.CurrentAxes = self.CurrentAxes - 1 end
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("q_tar.troy") then
--if self.CurrentAxes > 0 then self.CurrentAxes = self.CurrentAxes - 1 end
elseif obj and obj.name and obj.name:lower():find("draven") and obj.name:lower():find("reticlecatchsuccess.troy") then
end
end
)
end
end
function _AxesCatcher:GetCountAxes()
return #self.AxesAvailables + self.CurrentAxes
end
function _AxesCatcher:GetDelayCatch()
return (self.Menu~=nil and (self.Menu.DelayCatch / 100)) or 1
end
function _AxesCatcher:GetRadius()
if OrbwalkManager:IsCombo() then
return self.Menu.CatchRadius.Combo
elseif OrbwalkManager:IsHarass() then
return self.Menu.CatchRadius.Harass
elseif OrbwalkManager:IsClear() then
return self.Menu.CatchRadius.Clear
elseif OrbwalkManager:IsLastHit() then
return self.Menu.CatchRadius.LastHit
elseif self.Menu~=nil then
return self.Menu.CatchRadius.Clear
end
end
function _AxesCatcher:InTurret(obj)
local offset = Prediction.VP:GetHitBox(myHero) / 2
if obj ~= nil and obj.valid and self.Menu ~= nil and self.Menu.Turret then
if GetTurrets() ~= nil then
for name, turret in pairs(GetTurrets()) do
if turret ~= nil and turret.valid and GetDistanceSqr(obj, turret) <= (turret.range + offset) * (turret.range + offset) then
if turret.team ~= myHero.team then
return true
end
end
end
end
end
return false
end
function _AxesCatcher:GetBonusSpeed()
return myHero:GetSpellData(champ.W.Slot).level > 0 and (100 + 35 + myHero:GetSpellData(champ.W.Slot).level * 5)/100 or 1
end
function _AxesCatcher:GetSource()
return self.Menu.OrbwalkMode == 1 and Vector(mousePos) or Vector(myHero)
end
function _AxesCatcher:InRadius(axe)
return axe ~= nil and axe.valid and GetDistanceSqr(self:GetSource(), axe) < self:GetRadius() * self:GetRadius()
end
function _AxesCatcher:InAxeRadius(axe)
local AxeRadius = 1 / 1 * self.AxeRadius
return axe ~= nil and axe.valid and GetDistanceSqr(myHero.pos, axe) < AxeRadius * AxeRadius
end
function _AxesCatcher:GetBestAxe()
local List = self.AxesAvailables
local BestAxe, BestTime = nil, 0
if #List > 0 then
for i = 1, #List, 1 do
if List[i] then
local axe, time = List[i][1], List[i][2]
if axe~=nil and axe.valid then
local timeLeft = self.LimitTime - (os.clock() - time)
local AxeRadius = 1 / 1 * self.AxeRadius
if timeLeft >= 0 and GetDistance(myHero, axe) - math.min(AxeRadius, GetDistance(myHero, axe)) + AxeRadius <= myHero.ms * timeLeft * self:GetDelayCatch() then
if BestAxe == nil then BestAxe = axe BestTime = time
else
if (GetDistance(myHero, axe) - math.min(AxeRadius, GetDistance(myHero, axe)) )/time > (GetDistance(myHero, BestAxe) - math.min(AxeRadius, GetDistance(myHero, BestAxe)) )/BestTime then
BestAxe = axe BestTime = time
end
end
end
if timeLeft <= 0 then
self:RemoveAxe(axe)
end
end
end
end
end
return BestAxe, BestTime
end
function _AxesCatcher:CheckAxe(axe, time)
local CanMove = false
local CanAttack = false
if axe ~= nil and axe.valid and os.clock() + GetLatency()/2000 - time <= self.LimitTime and self:InRadius(axe) and not self:InTurret(axe) then
local timeLeft = self.LimitTime - (os.clock() + GetLatency()/2000 - time)
local AxeRadius = 1 / 1 * self.AxeRadius
local AxeCatchPositionFromHero = Vector(axe) + Vector(Vector(myHero) - Vector(axe)):normalized() * math.min(AxeRadius, GetDistance(myHero, axe))
local AxeCatchPositionFromMouse = Vector(axe) + Vector(Vector(mousePos) - Vector(axe)):normalized() * math.min(AxeRadius, GetDistance(mousePos, axe))
local OrbwalkPosition = Vector(myHero) + Vector(Vector(mousePos) - Vector(axe)):normalized() * AxeRadius
local time = timeLeft - ((GetDistance(myHero, AxeCatchPositionFromHero)) / myHero.ms) - (OrbwalkManager:WindUpTime() + GetLatency()/2000
--+ champ.AA.Range(champ.TS.target) / self.ProjectileSpeed
- 100/1000)
--Is in AxeRange
if self:InAxeRadius(axe) then
CanAttack = true
--Can Attack Meanwhile
elseif time >= 0 and OrbwalkManager:CanAttack() then --+ orbwalker:WindUpTime() -
CanAttack = true
if champ.Menu.Misc.developer then print("Can Attack Meanwhile") end
else
CanAttack = false
end
if GetDistance(myHero, AxeCatchPositionFromHero) + 100 > myHero.ms * timeLeft * self:GetDelayCatch() then
CanMove = false
--can catch without W and self:GetCountAxes() > 1
if not self:InAxeRadius(axe) and GetDistanceSqr(myHero, AxeCatchPositionFromHero) > (myHero.ms * timeLeft * 1.5) * (myHero.ms * timeLeft * 1.5) and GetDistanceSqr(myHero, AxeCatchPositionFromHero) < (myHero.ms * timeLeft * self:GetBonusSpeed()) * (myHero.ms * timeLeft * self:GetBonusSpeed()) then
if self.Menu.UseW and champ.W.IsReady() then
CastSpell(champ.W.Slot)
end
end
--can orbwalk
else
CanMove = true
end
else
CanAttack = true
CanMove = true
end
if os.clock() - time > self.LimitTime + 0.2 then
self:RemoveAxe(axe)
end
return CanMove, CanAttack
end
function _AxesCatcher:CheckCatch()
local List = self.AxesAvailables--self:GetSortedList()
if #List > 0 then
if self.Menu~=nil and self.Menu.Catch and (( self.Menu.CatchMode == 1 and not OrbwalkManager:IsNone()) or self.Menu.CatchMode == 2 ) then
local CanMove, CanAttack = true, true
for i = 1, #List, 1 do
if List[i] and List[i][1] then
local axe, time = List[i][1], List[i][2]
if axe and time then
local CanMove1, CanAttack1 = self:CheckAxe(axe, time)
if not CanMove1 then
CanMove = false
end
if not CanAttack1 then
CanAttack = false
end
end
end
end
if List[1] and List[1][1] then
if CanAttack then
OrbwalkManager:EnableAttacks()
else
OrbwalkManager:DisableAttacks()
end
if CanMove then
OrbwalkManager:EnableMovement()
else
OrbwalkManager:DisableMovement()
if not self:InAxeRadius(List[1][1]) and OrbwalkManager:CanMove(0.2) and not OrbwalkManager:IsAttacking() then
if champ.Menu.Misc.developer then PrintMessage("Moving to Axe") end
myHero:MoveTo(List[1][1].x, List[1][1].z)
end
end
end
else
OrbwalkManager:EnableAttacks()
OrbwalkManager:EnableMovement()
end
else
OrbwalkManager:EnableAttacks()
OrbwalkManager:EnableMovement()
end
end
function _AxesCatcher:RemoveAxe(obj)
if #self.AxesAvailables > 0 and obj ~= nil then
for i = 1, #self.AxesAvailables, 1 do
local axe, time = self.AxesAvailables[i][1], self.AxesAvailables[i][2]
if axe ~= nil and GetDistanceSqr(axe, obj) < 30 * 30 and axe.name == obj.name then
table.remove(self.AxesAvailables, i)
break
end
end
end
end
class "_Queue"
function _Queue:__init()
self.list = {}
self.LastKeyPressed = 0
AddProcessSpellCallback(function(unit, spell) self:OnProcessSpell(unit, spell) end)
AddTickCallback(function() self:OnTick() end)
end
function _Queue:Size()
return #self.list
end
function _Queue:Get(i)
if self:Size() > 0 then
return self.list[i][1], self.list[i][2], self.list[i][3]
end
return nil, nil, nil
-- body
end
function _Queue:Insert(func, key, priority)
if type(func) == "function" then
if self:Size() > 0 then
local boolean, count, highestPriority = self:Contains(key)
if (key:find(tostring("AA"):lower()) or key:find(tostring("Q"):lower())) and count > 2 then return
elseif not (key:find(tostring("AA"):lower()) or key:find(tostring("Q"):lower())) and count > 0 then
else
local count2 = 1
for i = 1, self:Size(), 1 do
if self.list[i] then
local func1, key1, priority1 = self.list[i][1], self.list[i][2], self.list[i][3]
if priority <= priority1 then
count2 = count2 + 1
elseif priority > priority1 then
break
end
end
end
table.insert(self.list, count2, {func, key, priority})
end
else
table.insert(self.list, 1, {func, key, priority})
end
end
end
function _Queue:OnTick()
if not OrbwalkManager:IsNone() then
self.LastKeyPressed = os.clock()
else
if os.clock() - self.LastKeyPressed > 5 then
self:RemoveAll()
end
end
end
function _Queue:RemoveAt(i)
if self:Size() and i~=nil then
table.remove(self.list, i)
end
end
function _Queue:RemoveAll()
self.list = {}
end
function _Queue:Remove(key, quantity)
local counter = 0
local quantity = quantity or 1
if self:Size() > 0 then
for i = 1, self:Size(), 1 do
if self.list[i] then
local func1, key1, priority1 = self.list[i][1], self.list[i][2], self.list[i][3]
if key:lower() == key1:lower() and counter < quantity then
self:RemoveAt(i)
counter = counter + 1 end
if counter >= quantity then break end
end
end
end
end
function _Queue:Contains(key)
local boolean, count, highestPriority = false, 0, 0
if self:Size() > 0 then
for i = 1, self:Size(), 1 do
if self.list[i] then
local func1, key1, priority1 = self.list[i][1], self.list[i][2], self.list[i][3]
if key:lower() == key1:lower() then
boolean = true
count = count + 1
if highestPriority == 0 then highestPriority = priority1 end
end
end
end
end
return boolean, count, highestPriority
end
function _Queue:OnProcessSpell(unit, spell)
if unit and spell and spell.name and unit.isMe then
local range = 600
if spell.name:lower():find("attack") then
DelayAction(
function()
local target = OrbwalkManager:ObjectInRange(champ.AA.OffsetRange)
if ValidTarget(target) and champ.Q.IsReady() then
self:Insert(function() champ:CastQ() end, "Q", 2)
end
end
,spell.windUpTime - GetLatency()/2000 * 2)
elseif spell.name:lower():find("riventricleave") then
self:Remove("Q", 1)
elseif spell.name:lower():find("rivenmartyr") then
self:Remove("W", 1)
local target = OrbwalkManager:ObjectInRange(champ.TS.range)
if ValidTarget(target) then
self:Insert(function() champ:CastTiamat(target) end, "TIAMAT", 1)
end
self:Insert(function() champ:CastQ() end, "Q", 1)
elseif spell.name:lower():find("rivenfeint") then
self:Remove("E", 1)
local target = OrbwalkManager:ObjectInRange(champ.TS.range)
if ValidTarget(target) then
self:Insert(function() champ:CastTiamat(target) end, "TIAMAT", 1)
end
self:Insert(function() champ:CastQ() end, "Q", 1)
self:Insert(function() champ:CastW() end, "W", 1)
elseif spell.name:lower():find("engine") then
self:Remove("R1", 1)
if champ.Menu.Misc.cancelR then
self:Insert(function() champ:CastQFast() end, "Q", 3)
end
if champ.Menu.Combo.useR2 > 1 then
DelayAction(function()
self:Insert(function() champ:CastR2() end, "R2", 4)
end, 14)
end
elseif spell.name:lower():find("izunablade") then
self:Remove("R2", 1)
if champ.Menu.Misc.cancelR then
self:Insert(function() champ:CastQFast() end, "Q", 3)
end
elseif spell.name:lower():find("tiamat") or spell.name:lower():find("hydra") then
self:Remove("TIAMAT", 1)
self:Insert(function() champ:CastW() end, "W", 2)
elseif spell.name:lower():find("flash") then
end
end
end
function _Queue:IsValidCast(key)
if OrbwalkManager:IsCombo() then
if key:lower() == tostring("Q"):lower() then
return champ.Menu.Combo.useQ
elseif key:lower() == tostring("W"):lower() then
return champ.Menu.Combo.useW
elseif key:lower() == tostring("E"):lower() then
return champ.Menu.Combo.useE
elseif key:lower() == tostring("R1"):lower() then
return champ.Menu.Combo.useR1 > 1
elseif key:lower() == tostring("R2"):lower() then
return champ.Menu.Combo.useR2 > 1
elseif key:lower() == tostring("TIAMAT"):lower() then
return champ.Menu.Combo.useTiamat == 1
end
elseif OrbwalkManager:IsHarass() then
if key:lower() == tostring("Q"):lower() then
return champ.Menu.Harass.useQ
elseif key:lower() == tostring("W"):lower() then
return champ.Menu.Harass.useW
elseif key:lower() == tostring("E"):lower() then
return champ.Menu.Harass.useE
elseif key:lower() == tostring("TIAMAT"):lower() then
return champ.Menu.Harass.useTiamat
end
elseif OrbwalkManager:IsClear() then
local tipo = OrbwalkManager:GetClearMode()
if tipo ~= nil then
if key:lower() == tostring("Q"):lower() then
if tipo:lower() == tostring("lane"):lower() then
return champ.Menu.LaneClear.useQ
else
return champ.Menu.JungleClear.useQ
end
elseif key:lower() == tostring("W"):lower() then
if tipo:lower() == tostring("lane"):lower() then
return champ.Menu.LaneClear.useW
else
return champ.Menu.JungleClear.useW
end
elseif key:lower() == tostring("E"):lower() then
if tipo:lower() == tostring("lane"):lower() then
return champ.Menu.LaneClear.useE
else
return champ.Menu.JungleClear.usee
end
elseif key:lower() == tostring("TIAMAT"):lower() then
if tipo:lower() == tostring("lane"):lower() then
return champ.Menu.LaneClear.useTiamat
else
return champ.Menu.JungleClear.useTiamat
end
end
end
elseif OrbwalkManager:IsLastHit() then
if key:lower() == tostring("Q"):lower() then
return champ.Menu.LastHit.useQ
elseif key:lower() == tostring("W"):lower() then
return champ.Menu.LastHit.useW
elseif cast:lower() == tostring("E"):lower() then
return champ.Menu.LastHit.useE
end
end
return false
end
function _Queue:Execute()
if self:Size() > 0 then
if OrbwalkManager:CanCast() and not OrbwalkManager:IsNone() then
if champ:ShouldUseAA() then return end
local i = 1
local func, key, priority = self:Get(i)
if self:IsValidCast(key) and not OrbwalkManager:IsNone() then
--if champ.Menu.Misc.developer then print("ValidCast "..key.." Priority: "..priority) end
func()
else
--if champ.Menu.Misc.developer then print("NOT ValidCast " ..key.." Priority: "..priority) end
self:RemoveAt(i)
end
end
end
end
local Jumps = {
}
function WriteJumps()
local string = "local Jumps = {\n\t"
for i, jump in pairs(Jumps) do
local temp = ""
local from = jump.p1
local to = jump.p2
string = string .. " { " .. "p1 = { x = " .. from.x..", y = "..from.y..", z = "..from.z.."}, p2 = { x = " .. to.x..", y = "..to.y..", z = "..to.z .."} }, \n\t"
end
string = string .."\n}"
print(string)
local file = io.open(LIB_PATH.."jumps.txt", "w")
if file then
file:write(string)
file:close()
end
end
function AddJump(p1, p2)
local minDistanceSqr1 = 0
if #Jumps > 0 then
for i, jump in pairs(Jumps) do
if minDistanceSqr1 == 0 then
minDistanceSqr1 = GetDistanceSqr(p1, jump.p1)
elseif minDistanceSqr1 > GetDistanceSqr(p1, jump.p1) then
minDistanceSqr1 = GetDistanceSqr(p1, jump.p1)
end
end
end
local minDistanceSqr2 = 0
if #Jumps > 0 then
for i, jump in pairs(Jumps) do
if minDistanceSqr2 == 0 then
minDistanceSqr2 = GetDistanceSqr(p2, jump.p2)
elseif minDistanceSqr2 > GetDistanceSqr(p2, jump.p2) then
minDistanceSqr2 = GetDistanceSqr(p2, jump.p2)
end
end
end
if (minDistanceSqr2 > 100 * 100 or minDistanceSqr1 > 100 * 100) or (#Jumps == 0) then
table.insert(Jumps, {p1 = p1, p2 = p2})
end
end
class "WallJump"
function WallJump:__init()
self.range = 380
self.p1 = nil
self.p2 = nil
self.step = 10
self.lastWall = 0
AddDrawCallback(function() self:OnDraw() end)
end
function WallJump:OnDraw()
if self.p1 ~= nil and self.p2 ~= nil and champ.Menu.Keys.WallJump then
local vec = Vector(self.p1) --myHero + Vector(mousePos.x - myHero.x, 0, mousePos.z - myHero.z):normalized() * self.range
local p1 = WorldToScreen(D3DXVECTOR3(vec.x, vec.y, vec.z))
local p2 = WorldToScreen(D3DXVECTOR3(myHero.x, myHero.y, myHero.z))
DrawLine(p1.x, p1.y, p2.x, p2.y, 4, Colors.Blue)
local p1 = self.p1
local p2 = self.p2
DrawCircle3D(p1.x, p1.y, p1.z, Prediction.VP:GetHitBox(myHero), 1, Colors.Blue, 10)
DrawCircle3D(p2.x, p2.y, p2.z, Prediction.VP:GetHitBox(myHero), 1, Colors.Blue, 10)
end
end
function WallJump:GetStartEnd()
local distance = 1000
local increase = self.step
local start = nil
local final = nil
for i = 0, distance, increase do
local vec = myHero + Vector(mousePos.x - myHero.x, 0, mousePos.z - myHero.z):normalized() * i
if IsWall(D3DXVECTOR3(vec.x, vec.y, vec.z)) then
if start == nil then
start = vec
end
else
if start ~= nil then
final = vec
break
end
end
end
return start, final
end
function WallJump:GetWallNear()
local distance = GetDistance(myHero, mousePos)
local increase = self.step
local start, finish = self:GetStartEnd()
self.p1 = nil
self.p2 = nil
if start ~= nil and finish ~= nil then
if GetDistanceSqr(start, finish) <= champ.Menu.WallJump.MaxRange * champ.Menu.WallJump.MaxRange and GetDistanceSqr(start, finish) >= champ.Menu.WallJump.MinRange * champ.Menu.WallJump.MinRange then
output = start
local vec = start + Vector(finish.x - start.x, 0, finish.z - start.z):normalized() * (self.range + Prediction.VP:GetHitBox(myHero) / 2)
if not IsWall(D3DXVECTOR3(vec.x, vec.y, vec.z)) then
self.p1 = start
self.p2 = vec
end
end
end
return self.p1, self.p2
end
function WallJump:GetWallNearWithoutChecks()
local distance = GetDistance(myHero, mousePos)
local increase = self.step
local output = nil
for i = 0, distance, increase do
local vec = myHero + Vector(mousePos.x - myHero.x, 0, mousePos.z - myHero.z):normalized() * i
if IsWall(D3DXVECTOR3(vec.x, vec.y, vec.z)) then
output = vec
break
end
end
return output
end
function GetAARange(unit)
return ValidTarget(unit) and unit.range + unit.boundingRadius + myHero.boundingRadius / 2 or 0
end
function _GetTarget()
local bestTarget = nil
local range = champ.TS.range
if ValidTarget(GetTarget(), range) then
if GetTarget().type:lower():find("hero") or GetTarget().type:lower():find("minion") then
return GetTarget()
end
end
for i, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy, range) then
if bestTarget == nil then
bestTarget = enemy
else
local q, w, e, r, dmgEnemy = GetBestCombo(enemy)
local q, w, e, r, dmgBest = GetBestCombo(bestTarget)
local percentageEnemy = (enemy.health - dmgEnemy) / enemy.maxHealth
local percentageBest = (bestTarget.health - dmgBest) / bestTarget.maxHealth
if percentageEnemy * GetPriority(enemy) < percentageBest * GetPriority(bestTarget) then
bestTarget = enemy
end
end
end
end
return bestTarget
end
function DrawPredictedDamage()
for idx, enemy in ipairs(GetEnemyHeroes()) do
local p = WorldToScreen(D3DXVECTOR3(enemy.x, enemy.y, enemy.z))
if ValidTarget(enemy) and enemy.visible and OnScreen(p.x, p.y) then
local q, w, e, r, dmg = GetBestCombo(enemy)
if dmg >= enemy.health then
DrawLineHPBar(dmg, "KILLABLE", enemy, true)
else
local spells = ""
if q then spells = "Q" end
if w then spells = spells .. "W" end
if e then spells = spells .. "E" end
if r then spells = spells .. "R" end
DrawLineHPBar(dmg, spells, enemy, true)
end
end
end
end
local PredictedDamage = {}
local RefreshTime = 0.4
function GetBestCombo(target)
if not ValidTarget(target) or champ == nil then return false, false, false, false, 0 end
local q = {false}
local w = {false}
local e = {false}
local r = {false}
local damagetable = PredictedDamage[target.networkID]
if damagetable ~= nil then
local time = damagetable[6]
if os.clock() - time <= RefreshTime then
return damagetable[1], damagetable[2], damagetable[3], damagetable[4], damagetable[5]
else
if champ.Q.IsReady() then q = {false, true} end
if champ.W.IsReady() then w = {false, true} end
if champ.E.IsReady() then e = {false, true} end
if champ.R.IsReady() then r = {false, true} end
local bestdmg = 0
local best = {champ.Q.IsReady(), champ.W.IsReady(), champ.E.IsReady(), champ.R.IsReady()}
local dmg, mana = champ:GetComboDamage(target, champ.Q.IsReady(), champ.W.IsReady(), champ.E.IsReady(), champ.R.IsReady())
bestdmg = dmg
if dmg > target.health then
for qCount = 1, #q do
for wCount = 1, #w do
for eCount = 1, #e do
for rCount = 1, #r do
local d, m = champ:GetComboDamage(target, q[qCount], w[wCount], e[eCount], r[rCount])
if d >= target.health and myHero.mana >= m then
if d < bestdmg then
bestdmg = d
best = {q[qCount], w[wCount], e[eCount], r[rCount]}
end
end
end
end
end
end
--return best[1], best[2], best[3], best[4], bestdmg
damagetable[1] = best[1]
damagetable[2] = best[2]
damagetable[3] = best[3]
damagetable[4] = best[4]
damagetable[5] = bestdmg
damagetable[6] = os.clock()
else
local table2 = {false,false,false,false}
local bestdmg, mana = champ:GetComboDamage(target, false, false, false, false)
for qCount = 1, #q do
for wCount = 1, #w do
for eCount = 1, #e do
for rCount = 1, #r do
local d, m = champ:GetComboDamage(target, q[qCount], w[wCount], e[eCount], r[rCount])
if d > bestdmg and myHero.mana >= m then
table2 = {q[qCount],w[wCount],e[eCount],r[rCount]}
bestdmg = d
end
end
end
end
end
--return table2[1],table2[2],table2[3],table2[4], bestdmg
damagetable[1] = table2[1]
damagetable[2] = table2[2]
damagetable[3] = table2[3]
damagetable[4] = table2[4]
damagetable[5] = bestdmg
damagetable[6] = os.clock()
end
return damagetable[1], damagetable[2], damagetable[3], damagetable[4], damagetable[5]
end
else
PredictedDamage[target.networkID] = {false, false, false, false, 0, os.clock() - RefreshTime * 2}
return GetBestCombo(target)
end
end
function EnemyInMyTurret(enemy, range)
if ValidTarget(enemy, range) then
for name, turret in pairs(GetTurrets()) do
if turret ~= nil then
if turret.team == myHero.team and GetDistanceSqr(enemy, turret) < turret.range * turret.range then
return true
end
end
end
end
return false
end
function UnitAtTurret(unit, offset)
if unit ~= nil and unit.valid then
for name, turret in pairs(GetTurrets()) do
if turret ~= nil and GetDistanceSqr(myHero, turret) < 2000 * 2000 then
if turret.team ~= myHero.team and GetDistanceSqr(unit, turret) < (turret.range + offset) * (turret.range + offset) then
return true
end
end
end
end
return false
end
function CastFlash(vector)
if Flash.IsReady() then
CastSpell(flashslot, vector.x, vector.z)
end
end
function CastIgnite(target)
if Ignite.IsReady() and ValidTarget(target, Ignite.Range) then
CastSpell(igniteslot, target)
end
end
function CastSmite(target)
if Smite.IsReady() and ValidTarget(target, Smite.Range) then
CastSpell(smiteslot, target)
end
end
function DamageItems(unit)
local dmg = 0
if ValidTarget(unit) then
for _, item in pairs(CastableItems) do
if item.IsReady() then
dmg = dmg + item.Damage(unit)
end
end
end
return dmg
end
function Cast_Item(item, target)
if item.IsReady() and ValidTarget(target, item.Range) then
if item.reqTarget then
CastSpell(item.Slot(), target)
else
CastSpell(item.Slot())
end
end
end
function UseItems(unit)
if ValidTarget(unit) then
for _, item in pairs(CastableItems) do
Cast_Item(item, unit)
end
end
end
function CountEnemies(point, range)
local ChampCount = 0
for idx, enemy in ipairs(GetEnemyHeroes()) do
if ValidTarget(enemy) then
if GetDistanceSqr(enemy, point) <= range*range then
ChampCount = ChampCount + 1
end
end
end
return ChampCount
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})
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
print("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
end
function _Required:CheckDownloads()
if #self.downloading == 0 then
print("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
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