_G.SIUsage = true --[[ Summoner & Item Usage by Ralphlol ]]-- local version = 1.32 local sEnemies = GetEnemyHeroes() local sAllies = GetAllyHeroes() local lastRemove = 0 function Print(message) print("Summoner & Item Usage: " .. message) end require 'VPrediction' vPred = VPrediction() local function Slot(name) if myHero:GetSpellData(SUMMONER_1).name:lower():find(name) then return SUMMONER_1 elseif myHero:GetSpellData(SUMMONER_2).name:lower():find(name) then return SUMMONER_2 end end function OnLoad() local ToUpdate = {} ToUpdate.Version = version ToUpdate.UseHttps = true ToUpdate.Host = "raw.githubusercontent.com" ToUpdate.VersionPath = "/RalphLeague/BoL/master/SIUsage.version" ToUpdate.ScriptPath = "/RalphLeague/BoL/master/SIUsage.lua" ToUpdate.SavePath = SCRIPT_PATH.._ENV.FILE_NAME ToUpdate.CallbackUpdate = function(NewVersion,OldVersion) Print("Updated to v"..NewVersion) end ToUpdate.CallbackNoUpdate = function(OldVersion) Print("No Updates Found") end ToUpdate.CallbackNewVersion = function(NewVersion) Print("New Version found ("..NewVersion.."). Please wait until its downloaded") end ToUpdate.CallbackError = function(NewVersion) Print("Error while Downloading. Please try again.") end SIUsage_Update(ToUpdate.Version,ToUpdate.UseHttps, ToUpdate.Host, ToUpdate.VersionPath, ToUpdate.ScriptPath, ToUpdate.SavePath, ToUpdate.CallbackUpdate,ToUpdate.CallbackNoUpdate, ToUpdate.CallbackNewVersion,ToUpdate.CallbackError) ItemNames = { [3303] = "ArchAngelsDummySpell", [3007] = "ArchAngelsDummySpell", [3144] = "BilgewaterCutlass", [3188] = "ItemBlackfireTorch", [3153] = "ItemSwordOfFeastAndFamine", [3405] = "TrinketSweeperLvl1", [3411] = "TrinketOrbLvl1", [3166] = "TrinketTotemLvl1", [3450] = "OdinTrinketRevive", --[2041] = "ItemCrystalFlask", [2054] = "ItemKingPoroSnack", [2138] = "ElixirOfIron", [2137] = "ElixirOfRuin", [2139] = "ElixirOfSorcery", [2140] = "ElixirOfWrath", [3184] = "OdinEntropicClaymore", [2050] = "ItemMiniWard", [3401] = "HealthBomb", [3363] = "TrinketOrbLvl3", [3092] = "ItemGlacialSpikeCast", [3460] = "AscWarp", [3361] = "TrinketTotemLvl3", [3362] = "TrinketTotemLvl4", [3159] = "HextechSweeper", [2051] = "ItemHorn", --[2003] = "RegenerationPotion", [3146] = "HextechGunblade", [3187] = "HextechSweeper", [3190] = "IronStylus", --[2004] = "FlaskOfCrystalWater", [3139] = "ItemMercurial", [3222] = "ItemMorellosBane", [3042] = "Muramana", [3043] = "Muramana", [3180] = "OdynsVeil", [3056] = "ItemFaithShaker", [2047] = "OracleExtractSight", [3364] = "TrinketSweeperLvl3", [2052] = "ItemPoroSnack", [3140] = "QuicksilverSash", [3143] = "RanduinsOmen", [3074] = "ItemTiamatCleave", [5000] = "ItemTitanicHydraCleave", [3800] = "ItemRighteousGlory", [2045] = "ItemGhostWard", [3342] = "TrinketOrbLvl1", [3040] = "ItemSeraphsEmbrace", [3048] = "ItemSeraphsEmbrace", [2049] = "ItemGhostWard", [3345] = "OdinTrinketRevive", [2044] = "SightWard", [3341] = "TrinketSweeperLvl1", [3069] = "shurelyascrest", [3599] = "KalistaPSpellCast", [3185] = "HextechSweeper", [3077] = "ItemTiamatCleave", [2009] = "ItemMiniRegenPotion", [2010] = "ItemMiniRegenPotion", [3023] = "ItemWraithCollar", [3290] = "ItemWraithCollar", [2043] = "VisionWard", [3340] = "TrinketTotemLvl1", [3090] = "ZhonyasHourglass", [3154] = "wrigglelantern", [3142] = "YoumusBlade", [3157] = "ZhonyasHourglass", [3512] = "ItemVoidGate", [3131] = "ItemSoTD", [3137] = "ItemDervishBlade", [3352] = "RelicSpotter", [3350] = "TrinketTotemLvl2", [3085] = "AtmasImpalerDummySpell", } --[[Items = { ["QSS"] = { id = 3140, range = 2500 }, ["MercScim"] = { id = 3139, range = 2500 }, }]] Items = { ["ELIXIR"] = { id = 2140, range = 2140, target = false}, ["QSS"] = { id = 3140, range = 2500, target = false}, ["MercScim"] = { id = 3139, range = 2500, target = false}, ["BRK"] = { id = 3153, range = 550, target = true}, ["BWC"] = { id = 3144, range = 550, target = true}, --["DFG"] = { id = 3128, range = 750, target = false}, ["HXG"] = { id = 3146, range = 700, target = false}, ["ODYNVEIL"] = { id = 3180, range = 525, target = false}, ["DVN"] = { id = 3131, range = 200, target = false}, ["ENT"] = { id = 3184, range = 350, target = false}, ["HYDRA"] = { id = 3074, range = 350, target = false}, ["TIAMAT"] = { id = 3077, range = 350, target = false}, ["TITANIC"] = { id = 5000, range = 350, target = false}, ["RanduinsOmen"] = { id = 3143, range = 500, target = false}, ["YGB"] = { id = 3142, range = 600, target = false}, ["HEX"] = { id = 5555, range = 600, target = false}, } ___GetInventorySlotItem = rawget(_G, "GetInventorySlotItem") _G.GetInventorySlotItem = GetSlotItem if myHero:GetSpellData(4).name:lower():find("exhaust") then exhaust = { slot = 4, key = "D", range = 650, ready = false } elseif myHero:GetSpellData(5).name:lower():find("exhaust") then exhaust = { slot = 5, key = "F", range = 650, ready = false } end SummonerSlot = Slot("summonerboost") ignite = Slot("summonerdot") heal = HealSlot() ItemMenu() Debug = false TargetSelector = TargetSelector(TARGET_LESS_CAST_PRIORITY, 1250, DAMAGE_MAGIC) end function GetCustomTarget() TargetSelector:update() if ValidTarget(TargetSelector.target) and TargetSelector.target.type == myHero.type then return TargetSelector.target end end function ItemMenu() MainMenu = scriptConfig("Summoner & Item Usage", "SIUSE") MainMenu:addSubMenu("Health Potions", "potion") MainMenu.potion:addParam("Key", "Use While Pressed", SCRIPT_PARAM_ONKEYDOWN, false, 32) MainMenu.potion:addParam("Always", "Use Always", SCRIPT_PARAM_ONOFF, true) MainMenu.potion:addParam("enemy", "Use if no enemies", SCRIPT_PARAM_ONOFF, true) MainMenu.potion:addParam("health", "If My Health % is <", SCRIPT_PARAM_SLICE, 60, 0, 100, 0) -- MainMenu:addSubMenu("Mana Potions", "potionMana") -- MainMenu.potionMana:addParam("Key", "Use While Pressed", SCRIPT_PARAM_ONKEYDOWN, false, 32) -- MainMenu.potionMana:addParam("Always", "Use Always", SCRIPT_PARAM_ONOFF, false) -- MainMenu.potionMana:addParam("health", "If My Mana % is <", SCRIPT_PARAM_SLICE, 30, 0, 100, 0) MainMenu:addSubMenu("Remove CC", "cc") MainMenu.cc:addParam("Key", "Use While Pressed", SCRIPT_PARAM_ONKEYDOWN, false, 32) MainMenu.cc:addParam("Always", "Use Always", SCRIPT_PARAM_ONOFF, true) MainMenu.cc:addParam("Blind", "Remove Blind", SCRIPT_PARAM_ONOFF, false) if SummonerSlot then MainMenu.cc:addParam("Summoner", "Use Cleanse Summoner", SCRIPT_PARAM_ONOFF, true) end MainMenu.cc:addParam("delay", "Removal delay (ms)", SCRIPT_PARAM_SLICE, 0, 0, 400, 0) MainMenu:addSubMenu("Mikael's Settings", "mik") MainMenu.mik:addParam("health", "Use if ally health below", SCRIPT_PARAM_SLICE, 75, 0, 101, 0) MainMenu.mik:addParam("","", SCRIPT_PARAM_INFO, "") MainMenu.mik:addParam(""," ---Whitelist---", SCRIPT_PARAM_INFO, "") for i, ally in ipairs(sAllies) do MainMenu.mik:addParam(ally.charName, "Use on "..ally.charName, SCRIPT_PARAM_ONOFF, true) end MainMenu:addSubMenu("Normal Items/Smite", "nItems") MainMenu.nItems:addParam("comboItems", "Use Items", SCRIPT_PARAM_ONOFF, true) MainMenu.nItems:addParam("Key", "Use While Pressed", SCRIPT_PARAM_ONKEYDOWN, false, 32) MainMenu.nItems:addParam("Always", "Use Always", SCRIPT_PARAM_ONOFF, false) MainMenu.nItems:addParam("smite", "Also use champ Smite", SCRIPT_PARAM_ONOFF, true) MainMenu.nItems:addParam("zhon", "Use Zhonyas/Seraphs Before Death", SCRIPT_PARAM_ONOFF, true) MainMenu.nItems:addParam("ItemMe", "If My Health % is Less Than", SCRIPT_PARAM_SLICE, 90, 0, 100, 0) MainMenu.nItems:addParam("ItemTar", "If Target Health % is Less Than", SCRIPT_PARAM_SLICE, 90, 0, 100, 0) if ignite then MainMenu:addSubMenu("Ignite", "ignite") MainMenu.ignite:addParam("set", "Use Smart Ignite", SCRIPT_PARAM_LIST, 2, {"OFF", "Optimal", "Aggressive"}) end if exhaust then MainMenu:addSubMenu("Summoner Exhaust", "exhaust") MainMenu.exhaust:addParam("exh", "Exhaust Key", SCRIPT_PARAM_ONKEYDOWN, false, GetKey(exhaust.key)) TSex = TargetSelector(TARGET_PRIORITY, 600, DAMAGE_MAGIC) TSex.name = "EX" end if heal then MainMenu:addSubMenu("Summoner Heal/Barrier", "heal") MainMenu.heal:addParam("enable", "Use Summoner", SCRIPT_PARAM_ONOFF, true) MainMenu.heal:addParam("health", "If My Health % is Less Than", SCRIPT_PARAM_SLICE, 10, 0, 100, 0) if realheals then MainMenu.heal:addParam("ally", "Also use on ally", SCRIPT_PARAM_ONOFF, false) end end if AddProcessAttackCallback and heal and MainMenu.heal.enable then AddProcessAttackCallback(function(unit, spell) AProc(unit, spell) end) end end function findClosestAlly(obj) local closestAlly = nil local currentAlly = nil for i, currentAlly in pairs(sAllies) do if currentAlly and currentAlly.valid and not currentAlly.dead then if closestAlly == nil then closestAlly = currentAlly end if GetDistanceSqr(currentAlly.pos, obj) < GetDistanceSqr(closestAlly.pos, obj) then closestAlly = currentAlly end end end return closestAlly end function OnTick() if exhaust and MainMenu.exhaust.exh then if myHero:CanUseSpell(exhaust.slot) == 0 then TSex:update() if ValidTarget(TSex.target) and TSex.target.type == myHero.type then exhFunction(TSex.target) end end end if MainMenu.nItems.zhon then Zhonya() end if heal and ValidTarget(GetCustomTarget(), 1000) then if MainMenu.heal.enable and myHero:CanUseSpell(heal) == 0 then if myHero.level > 5 and myHero.health/myHero.maxHealth < MainMenu.heal.health/100 then CastSpell(heal) elseif myHero.level < 6 and myHero.health/myHero.maxHealth < (MainMenu.heal.health/100)*.75 then CastSpell(heal) end if realheals and MainMenu.heal.ally then local ally = findClosestAlly(myHero) if ally and not ally.dead and GetDistance(ally) < 850 then if ally.health/ally.maxHealth < MainMenu.heal.health/100 then CastSpell(heal) end end end end end if MainMenu.nItems.comboItems and (MainMenu.nItems.Key or MainMenu.nItems.Always) then if myHero.health / myHero.maxHealth <= MainMenu.nItems.ItemMe / 100 then local unit = GetCustomTarget() if ValidTarget(unit, 1000) then if unit.health / unit.maxHealth <= MainMenu.nItems.ItemTar / 100 then UseItems(unit) end end end end if not myHero.dead then if (MainMenu.potion.Key or MainMenu.potion.Always) and not potionOn and not InFountain() and (myHero.health/myHero.maxHealth)*100 < MainMenu.potion.health then UsePotion() --elseif (MainMenu.potionMana.Key or MainMenu.potionMana.Always) and not potionOnMana and not InFountain() and (myHero.mana/myHero.maxMana)*100 < MainMenu.potionMana.health then -- UsePotionMana() end end if ignite and MainMenu.ignite.set > 1 and (myHero:CanUseSpell(ignite) == READY) then AutoIgnite() end end function Zhonya() local h = myHero.health/myHero.maxHealth if myHero.level > 5 and h < .15 then CastZhonya() elseif myHero.level < 6 and h < .10 then CastZhonya() end end function checkSpecific(unit, buffname) if unit.buffCount then for i = 1, unit.buffCount do local buff = unit:getBuff(i) if buff and buff.valid and buff.name then if buff.name:lower():find(buffname) then return true end end end end end function CastZhonya() if not myHero.dead and not checkSpecific("kindredrnodeathbuff") and not checkSpecific("judicatorinter") then local item = CheckItem("zhonyashourglass") if item and myHero:CanUseSpell(item) == 0 then CastSpell(item) return true end if GetInventoryItemIsCastable(3040) then CastItem(3040) end end end function CheckItem(ItemName) for i = 6, 12 do local item = myHero:GetSpellData(i).name if item and item:lower() == ItemName then return i end end end function exhFunction(unit) moveToCursor() CastSpell(exhaust.slot, unit) end function moveToCursor() local MouseMove = Vector(myHero) + (Vector(mousePos) - Vector(myHero)):normalized() * 500 myHero:MoveTo(MouseMove.x, MouseMove.z) end function OnUpdateBuff(unit, buff, stacks) if not unit or not unit.valid or not buff then return end if unit.isMe then if buff.name:lower():find("regenerationpotion") or buff.name:lower():find("itemminiregenpotion") or buff.name:lower():find("crystalflask") then potionOn = true end end end function OnRemoveBuff(unit, buff) if not unit or not unit.valid or not buff then return end if unit.isMe then if buff.name:lower():find("regenerationpotion") or buff.name:lower():find("itemminiregenpotion") or buff.name:lower():find("crystalflask") then potionOn = false end end end local lastPotion = 0 function UsePotion() if os.clock() - lastPotion < 8 then return end if not MainMenu.potion.enemy then if CountEnemiesNearUnitReg(myHero, 750) == 0 then return end end local slot = GetSlotItemFromName("crystalflask") if not slot then slot = GetSlotItemFromName("RegenerationPotion") end if not slot then slot = GetSlotItemFromName("itemminiregenpotion") end if slot then CastSpell(slot) lastPotion = os.clock() end end local lastPotionMana = 0 function UsePotionMana() if CountEnemiesNearUnitReg(myHero, 1000) == 0 then return end if os.clock() - lastPotionMana < 8 then return end local slot = GetSlotItemFromName("crystalflask") if not slot then slot = GetSlotItemFromName("flaskofcrystalwater") end if slot then CastSpell(slot) lastPotionMana = os.clock() end end function GetSlotItemFromName(itemname) local slot for i = 6, 12 do local item = myHero:GetSpellData(i).name if item and item:lower():find(itemname:lower()) and myHero:CanUseSpell(i) == READY then slot = i end end return slot end function GetSlotItem(id, unit) unit = unit or myHero if (not ItemNames[id]) then return ___GetInventorySlotItem(id, unit) end local name = ItemNames[id] for slot = ITEM_1, ITEM_7 do local item = unit:GetSpellData(slot).name if item and item:lower() == name:lower() and myHero:CanUseSpell(slot) == READY then return slot end end end --[[ Buff Types 5-stun 6-stealth 7-silence 8-taunt 10-slow?? i think 10-name "fleeslow" = terrorize 11-root 12-DoT 13-healthregen 14-ms 15-morge, dunno what else 17-zhonya, dunno what else 19-truevision, i think? 23-poisons 24-suppresion 25-blind 27-armor/mr reduction 29-knockup 30-displacement 31-disarm ]] local lastTAttack = 0 local tDamage = 1 function AProc(unit, spell) if not unit or not unit.valid or not spell then return end if spell.target and spell.target.type == myHero.type and spell.target.team == myHero.team and (spell.name:lower():find("_turret_chaos") or spell.name:lower():find("_turret_order")) and not (spell.name:lower():find("4") or spell.name:lower():find("3")) then if GetDistance(unit) < 2000 then if os.clock() - lastTAttack < 1.75 then if tDamage < 1.75 then tDamage = tDamage + 0.375 else tDamage = tDamage + 0.250 tDamage = tDamage > 2.25 and 2.25 or tDamage end else tDamage = 1 end lastTAttack = os.clock() if myHero:CanUseSpell(heal) == 0 and spell.target.isMe then local realDamage = unit.totalDamage / (((myHero.armor * 0.7) / 100) + 1) if vPred:GetPredictedHealth(myHero, 0.5) + myHero.shield <= realDamage * tDamage then DelayAction(function() CastSpell(heal) Print("Saving from tower") end, 0.5) end end end end end function OnProcessSpell(unit, spell) if not unit or not unit.valid or not spell then return end if heal and MainMenu.heal.enable and myHero:CanUseSpell(heal) == 0 and spell.target and spell.target.isMe and unit.team ~= myHero.team and unit.type == myHero.type then if myHero.health/myHero.maxHealth <= (MainMenu.heal.health/100)*1.5 then CastSpell(heal) end end if spell.name:lower():find("zedr") and spell.target == myHero then DelayAction(function() --UseItemsCC(myHero, true) DelayAction(function() CastZhonya() end, 0.3) end, 1.7) end end function OnApplyBuff(source, unit, buff) if not buff or not source or not source.valid or not unit or not unit.valid then return end if unit.isMe and (MainMenu.cc.Always or MainMenu.cc.Key) then if (source.charName == "Rammus" and buff.type ~= 8) or source.charName == "Alistar" or source.charName:lower():find("baron") or source.charName:lower():find("spiderboss") or source.charName == "LeeSin" or (source.charName == "Hecarim" and not buff.name:lower():find("fleeslow")) then return end if buff.name and ((not cleanse and buff.type == 24) or buff.type == 5 or buff.type == 11 or buff.type == 22 or buff.type == 21 or buff.type == 8) or (buff.type == 25 and MainMenu.cc.Blind) or (buff.type == 10 and buff.name and buff.name:lower():find("fleeslow")) then --or (MainMenu.cc.Exhaust and buff.name and buff.name:lower():find("summonerexhaust")) then if buff.name and buff.name:lower():find("caitlynyor") and CountEnemiesNearUnitReg(myHero, 700) == 0 then return false elseif not source.charName:lower():find("blitzcrank") then UseItemsCC(myHero, true) end end elseif not unit.isMe and unit.team == myHero.team and MainMenu.mik[unit.charName] then if (source.charName == "Rammus" and buff.type ~= 8) or source.charName == "Alistar" or source.charName:lower():find("baron") or source.charName:lower():find("spiderboss") or source.charName == "LeeSin" or (source.charName == "Hecarim" and not buff.name:lower():find("fleeslow")) then return end if buff.name and ((not cleanse and buff.type == 24) or buff.type == 5 or buff.type == 11 or buff.type == 22 or buff.type == 21 or buff.type == 8) or (buff.type == 10 and buff.name and buff.name:lower():find("fleeslow")) then if buff.name and buff.name:lower():find("caitlynyor") and CountEnemiesNearUnitReg(myHero, 700) == 0 then return false elseif not source.charName:lower():find("blitzcrank") then UseMikael(unit) end end end end function UseMikael(unit) if GetDistance(unit) < 750 + myHero.boundingRadius and MainMenu.mik.health > unit.health/unit.maxHealth then local item = GetSlotItem(3222, myHero) if item then CastSpell(item, unit) end end end --[[function isCC(cleanse) for i = 1, myHero.buffCount, 1 do local buff = myHero:getBuff(i) --if buff.name and buff.valid then print(buff.type.." "..buff.name) end if buff.valid and buff.name and ((not cleanse and buff.type == 24) or buff.type == 5 or buff.type == 11 or buff.type == 22 or buff.type == 21 or buff.type == 8) or (buff.type == 10 and buff.name and buff.name:lower():find("fleeslow")) or (MainMenu.cc.Exhaust and buff.name and buff.name:lower():find("summonerexhaust")) then if buff.name and buff.name:lower():find("caitlynyor") and CountEnemiesNearUnitReg(myHero, 700) == 0 then else if not buff.name:lower():find("rocketgrab2") then return true end end end end end ]] function CountEnemiesNearUnitReg(unit, range) local count = 0 for i, enemy in pairs(sEnemies) do if enemy and enemy.valid and not enemy.dead and enemy.visible then if GetDistanceSqr(unit, enemy) < range * range then count = count + 1 end end end return count end function UseItemsCC(unit, scary) if os.clock() - lastRemove < 1 then return end for i, Item in pairs(Items) do local Item = Items[i] if GetInventoryItemIsCastable(Item.id) and GetDistanceSqr(unit) <= Item.range * Item.range then if Item.id == 3139 or Item.id == 3140 then if scary then DelayAction(function() CastItem(Item.id) end, MainMenu.cc.delay/1000) lastRemove = os.clock() return true end end end end if MainMenu.cc.Summoner and SummonerSlot and myHero:CanUseSpell(SummonerSlot) == 0 then DelayAction(function() CastSpell(SummonerSlot) end, MainMenu.cc.delay/1000) lastRemove = os.clock() end end function UseItems(unit, scary) if not ValidTarget(unit) and unit ~= myHero then return end if MainMenu.nItems.smite then local smiteSpell = Slot("summonersmiteduel") if not smiteSpell then smiteSpell = Slot("summonersmiteplayerganker") end if smiteSpell and myHero:CanUseSpell(smiteSpell) and GetDistance(unit) < 500 + myHero.boundingRadius + unit.boundingRadius then CastSpell(smiteSpell, unit) end end for i, Item in pairs(Items) do local Item = Items[i] if Item.id ~= 3140 and Item.id ~= 3139 then if GetInventoryItemIsCastable(Item.id) and GetDistanceSqr(unit) <= Item.range * Item.range then if Item.id == 3143 or Item.id == 3077 or Item.id == 3074 or 5000 == Item.id or Item.id == 3131 or Item.id == 3142 or Item.id == 2140 then CastItem(Item.id) --[[elseif Item.id == 3092 then local CastPosition, Hitchance, Position = vPred:GetLineCastPosition(unit, 0.25, 60, Item.range, 1400, myHero, true) if CastPosition and Hitchance >= 2 then CastItem(Item.id, CastPosition.x, CastPosition.z) end]] else CastItem(Item.id, unit) return true end end end end if GetDistance(unit) < 455 then local ite = CheckItem('itemsofboltspellbase') if ite then CastSpell(ite, mousePos.x, mousePos.z) end local ite = CheckItem('itemwillboltspellbase') if ite then CastSpell(ite, unit.x, unit.z) end end end function findClosestEnemy(obj) local closestEnemy = nil local currentEnemy = nil for i, currentEnemy in pairs(sEnemies) do if ValidTarget(currentEnemy) then if closestEnemy == nil then closestEnemy = currentEnemy end if GetDistanceSqr(currentEnemy.pos, obj) < GetDistanceSqr(closestEnemy.pos, obj) then closestEnemy = currentEnemy end end end return closestEnemy end Print("Version "..version.." loaded.") function HealSlot() if myHero:GetSpellData(SUMMONER_1).name:lower():find("summonerheal") or myHero:GetSpellData(SUMMONER_2).name:lower():find("summonerheal") then realheals = true end if myHero:GetSpellData(SUMMONER_1).name:lower():find("summonerheal") or myHero:GetSpellData(SUMMONER_1).name:lower():find("summonerbar") then return SUMMONER_1 elseif myHero:GetSpellData(SUMMONER_2).name:lower():find("summonerheal") or myHero:GetSpellData(SUMMONER_2).name:lower():find("summonerbar") then return SUMMONER_2 end end function AutoIgnite() local IgniteDmg = 50 + (20 * myHero.level) local aggro = MainMenu.ignite.set == 3 and 0.05 or 0 for i, enemy in pairs(sEnemies) do if ValidTarget(enemy, 600) then local spellDamage = 0 local adDamage = myHero:CalcDamage(enemy, myHero.totalDamage) spellDamage = spellDamage + adDamage if myHero.health < myHero.maxHealth*(0.35+aggro) and enemy.health < enemy.maxHealth*(0.34+aggro) and GetDistanceSqr(enemy) < 420 * 420 then CastSpell(ignite, enemy) if Debug then print("It's time to DDDDDDDUEL") end end local r = myHero.range+65 local trange = r < 575 and r or 575 if isFleeingFromMe(enemy, trange) then if enemy.health < IgniteDmg + spellDamage + 10 then if myHero.ms < enemy.ms then CastSpell(ignite, enemy) if Debug then print("We Got a Runner!") end else if Debug then print("not doing runner you can chase them down.") end end end end if (GetDistanceSqr(enemy) > 160000 and (myHero.health+myHero.shield) < myHero.maxHealth*0.3) then if enemy.health > spellDamage-(500*aggro) and enemy.health < IgniteDmg + spellDamage-(500*aggro) then CastSpell(ignite, enemy) if Debug then print("ignite Q") end end end end end end function CountAlliesNearUnit(unit, range) local count = 0 for i, ally in pairs(sAllies) do if GetDistanceSqr(ally, unit) <= range * range and not ally.dead then count = count + 1 end end return count end function isFleeingFromMe(target, range) local pos = vPred:GetPredictedPos(target, 0.26) if pos and GetDistanceSqr(pos) > range*range then return true end return false end function amIFleeing(target, range) local pos = vPred:GetPredictedPos(myHero, 0.26) if pos and GetDistanceSqr(pos, target) > range*range then return true end return false end class "SIUsage_Update" function SIUsage_Update:__init(LocalVersion,UseHttps, Host, VersionPath, ScriptPath, SavePath, CallbackUpdate, CallbackNoUpdate, CallbackNewVersion,CallbackError) self.LocalVersion = LocalVersion self.Host = Host self.VersionPath = '/BoL/TCPUpdater/GetScript'..(UseHttps and '5' or '6')..'.php?script='..self:Base64Encode(self.Host..VersionPath)..'&rand='..math.random(99999999) self.ScriptPath = '/BoL/TCPUpdater/GetScript'..(UseHttps and '5' or '6')..'.php?script='..self:Base64Encode(self.Host..ScriptPath)..'&rand='..math.random(99999999) self.SavePath = SavePath self.CallbackUpdate = CallbackUpdate self.CallbackNoUpdate = CallbackNoUpdate self.CallbackNewVersion = CallbackNewVersion self.CallbackError = CallbackError AddDrawCallback(function() self:OnDraw() end) self:CreateSocket(self.VersionPath) self.DownloadStatus = 'Connect to Server for VersionInfo' AddTickCallback(function() self:GetOnlineVersion() end) end function SIUsage_Update:print(str) print(''..os.clock()..': '..str) end function SIUsage_Update:OnDraw() if self.DownloadStatus ~= 'Downloading Script (100%)' and self.DownloadStatus ~= 'Downloading VersionInfo (100%)'then DrawText('Download Status: '..(self.DownloadStatus or 'Unknown'),50,10,50,ARGB(0xFF,0xFF,0xFF,0xFF)) end end function SIUsage_Update: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.LuaSocket = require("socket") self.Socket = self.LuaSocket.tcp() 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 function SIUsage_Update:Base64Encode(data) local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end function SIUsage_Update:GetOnlineVersion() if self.GotScriptVersion then return end self.Receive, self.Status, self.Snipped = self.Socket:receive(1024) if self.Status == 'timeout' and not self.Started then self.Started = true self.Socket:send("GET "..self.Url.." HTTP/1.1\r\nHost: sx-bol.eu\r\n\r\n") end if (self.Receive or (#self.Snipped > 0)) and not self.RecvStarted then self.RecvStarted = true self.DownloadStatus = 'Downloading VersionInfo (0%)' end self.File = self.File .. (self.Receive or self.Snipped) if self.File:find('') then if not self.Size then self.Size = tonumber(self.File:sub(self.File:find('')+6,self.File:find('')-1)) end if self.File:find('') then local _,ScriptFind = self.File:find('') local ScriptEnd = self.File:find('') if ScriptEnd then ScriptEnd = ScriptEnd - 1 end local DownloadedSize = self.File:sub(ScriptFind+1,ScriptEnd or -1):len() self.DownloadStatus = 'Downloading VersionInfo ('..math.round(100/self.Size*DownloadedSize,2)..'%)' end end if self.File:find('') then self.DownloadStatus = 'Downloading VersionInfo (100%)' local a,b = self.File:find('\r\n\r\n') self.File = self.File:sub(a,-1) self.NewFile = '' for line,content in ipairs(self.File:split('\n')) do if content:len() > 5 then self.NewFile = self.NewFile .. content end end local HeaderEnd, ContentStart = self.File:find('') local ContentEnd, _ = self.File:find('') if not ContentStart or not ContentEnd then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else self.OnlineVersion = (Base64Decode(self.File:sub(ContentStart + 1,ContentEnd-1))) self.OnlineVersion = tonumber(self.OnlineVersion) if self.OnlineVersion > self.LocalVersion then if self.CallbackNewVersion and type(self.CallbackNewVersion) == 'function' then self.CallbackNewVersion(self.OnlineVersion,self.LocalVersion) end self:CreateSocket(self.ScriptPath) self.DownloadStatus = 'Connect to Server for ScriptDownload' AddTickCallback(function() self:DownloadUpdate() end) else if self.CallbackNoUpdate and type(self.CallbackNoUpdate) == 'function' then self.CallbackNoUpdate(self.LocalVersion) end end end self.GotScriptVersion = true end end function SIUsage_Update:DownloadUpdate() if self.GotSIUsage_Update 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.GotSIUsage_Update = true end end