--[[
running on
__ ___ __ __ _ __ ______ __ ___ ____
/ |/ /__ __ / /_ / /_ (_)/ /__ / ____/_____ ____ _ ____ ___ ___ _ __ ____ _____ / /__ |__ \ / __ \
/ /|_/ // / / // __// __ \ / // //_/ / /_ / ___// __ `// __ `__ \ / _ \| | /| / // __ \ / ___// //_/ __/ / / / / /
/ / / // /_/ // /_ / / / // // ,< / __/ / / / /_/ // / / / / // __/| |/ |/ // /_/ // / / ,< / __/ _ / /_/ /
/_/ /_/ \__, / \__//_/ /_//_//_/|_| /_/ /_/ \__,_//_/ /_/ /_/ \___/ |__/|__/ \____//_/ /_/|_| /____/(_)\____/
/____/
We've come a long way :)
Mythik Framework is usable by anyone, if you wish to use it, please do not change the credits or remove the header.
--]]
ver = 1.7
if myHero.charName ~= "Kalista" then return end
--[[=======================================================
Localization
=========================================================]]
local update = true
local me = _G.myHero -- LocalPlayer
local CastSpell = _G.CastSpell -- Cast func
local ValidTarget = _G.ValidTarget -- Valid target check
local damage = _G.getDmg -- damage calc
-- base table of all things that are holy
local myth = {
name = "MythKalista", -- script name
ver = ver, -- script version
foes = GetEnemyHeroes(), -- enemy champs
pred = {"VPred", "DivinePred", "HPred"}, -- prediction table
modules = {"VPrediction", "DivinePred", "HPrediction"}, --libs to load
url = "http://raw.github.com/iMythik/BoL/master/MythKalista.lua", --update url
ts = TargetSelector(TARGET_LOW_HP, 1500, DAMAGE_PHYSICAL, false, true), --target selector
creep = minionManager(MINION_ENEMY, 800, me, MINION_SORT_HEALTH_ASC), --creep selection
skill = {
q = {range=1200,del=0.35,speed=2400,w=60},
w = {},
e = {},
r = {},
}
}
--[[=======================================================
Updater
=========================================================]]
function myth:printChat(msg) -- chat message with prefix
print("["..myth.name.."] "..msg.."")
end
function myth:update() -- updater func
local result = GetWebResult("raw.github.com", "/iMythik/BoL/master/"..myth.name..".lua")
if not result or result == nil then return end
local netv = string.match(result, "ver = \"%d+.%d+\"")
netv = string.match(netv and netv or "", "%d+.%d+")
if not netv or netv == nil then return end
netv = tonumber(netv)
if tonumber(myth.ver) < netv then
myth:printChat("New version found, updating... don't press F9.")
DownloadFile(myth.url, SCRIPT_PATH..myth.name..".lua", function() myth:printChat("Updated script ["..myth.ver.." to "..netv.."], press F9 twice to reload the script.") end)
else
myth:printChat("is running latest version!")
end
end
--[[=======================================================
Module/Lib Loading
=========================================================]]
local loaded = {}
for k, v in pairs(myth.modules) do -- require modules
if FileExist(LIB_PATH .. "/"..v..".lua") then
require(v)
table.insert(loaded, v)
else
myth:printChat("Library "..v.." not found")
end
end
local function loadPred() -- load pred intergration
if table.HasValue(loaded, "DivinePred") then
local delaymil = myth.skill.q.del * 1000
dpred = DivinePred()
dpred.maxCalcTime = 110
myth.skill.q.pred = LineSS(myth.skill.q.speed, myth.skill.q.range, myth.skill.q.w, delaymil, 0)
end
if table.HasValue(loaded, "VPrediction") then
vpred = VPrediction()
end
if table.HasValue(loaded, "HPrediction") then
hpred = HPrediction()
HP_Q = HPSkillshot({type = "DelayLine", delay = myth.skill.q.del, range = myth.skill.q.range, speed = myth.skill.q.speed, collisionM = true, collisionH = true, width = myth.skill.q.w})
end
end
--[[=======================================================
Orbwalker Intergration
=========================================================]]
local function getOrbwalk() -- return running orbwalk
if _G.Reborn_Loaded and not _G.Reborn_Initialised then
DelayAction(getOrbwalk, 1)
return "waiting"
elseif _G.Reborn_Initialised then
return "sac"
elseif _G.MMA_Loaded then
return "mma"
else
return "none"
end
end
local function loadOrbwalk() -- load orbwalk if one isnt loaded
if getOrbwalk() == "waiting" then
DelayAction(loadOrbwalk, 1)
elseif getOrbwalk() == "sac" then
myth:printChat("SA:C Intergration loaded.")
elseif getOrbwalk() == "mma" then
myth:printChat("MMA Intergration loaded.")
else
myth:printChat("No orbwalker found, loading SxOrbWalk...")
require("SxOrbWalk")
end
end
local function target() -- target selection
myth.ts:update()
if getOrbwalk() == "sac" and ValidTarget(_G.AutoCarry.Crosshair:GetTarget()) then return _G.AutoCarry.Crosshair:GetTarget() end
if getOrbwalk() == "mma" and ValidTarget(_G.MMA_Target) then return _G.MMA_Target end
return myth.ts.target
end
--[[=======================================================
Stack Calculation (thanks sida <3)
=========================================================]]
local unitStacks = {}
local m8 = nil
function OnUpdateBuff(Unit, Buff, Stacks)
if Buff.name == "kalistaexpungemarker" then
unitStacks[Unit.networkID] = Stacks
end
end
function OnRemoveBuff(Unit, Buff)
if Buff.name == "kalistaexpungemarker" then
unitStacks[Unit.networkID] = nil
end
end
function GetStacks(unit)
return unitStacks[unit.networkID] or 0
end
function OnProcessSpell(unit, spell)
if GetDistance(unit) > 1000 then return end
if spell.name == "KalistaPSpellCast" then
myth:printChat(spell.target.." is now binded as your support.")
m8 = spell.target -- u fokin wot m8!?!?!?
end
end
--[[=======================================================
Wall Jumper
=========================================================]]
local constXmove, constZmove = 425, 275
local spots = {
{x = 7872, y = 51, z = 6008},
{x = 9072, y = 52, z = 4608},
{x = 8272, y = 51, z = 3208},
{x = 7026, y = 52, z = 8760},
{x = 5724, y = 56, z = 10806},
{x = 11750, y = -71, z = 4632},
{x = 3074, y = 53, z = 10056},
{x = 3780, y = 51, z = 7404},
{x = 3024, y = 57, z = 6108},
{x = 5224, y = 56, z = 11806},
{x = 6550, y = 53, z = 11718},
{x = 11122, y = 52, z = 7506},
{x = 9672, y = 49, z = 2808},
{x = 11582, y = 64, z = 8722},
{x = 4574, y = 95, z = 3158},
{x = 10022, y = 52, z = 11556}
}
local spotend = {
{x = 8026, y = -71, z = 6178},
{x = 9322, y = -71, z = 4458},
{x = 8306, y = -51, z = 2914},
{x = 6860, y = -70, z = 8618},
{x = 5474, y = -71, z = 10656},
{x = 11922, y = 51, z = 4758},
{x = 3324, y = -64, z = 10156},
{x = 3724, y = 52, z = 7706},
{x = 3224, y = 52, z = 6258},
{x = 5330, y = 56, z = 12104},
{x = 6498, y = 56, z = 11986},
{x = 11092, y = 51, z = 7192},
{x = 9734, y = 64, z = 3050},
{x = 11762, y = 50, z = 8880},
{x = 4862, y = 51, z = 3244},
{x = 10322, y = 91, z = 11656}
}
local function jump()
if not settings.wall or not qready then return end
for k, spot in pairs(spots) do
if GetDistance(spot, me) < 250 and GetDistance(spot, me) > 50 then
me:MoveTo(spot.x, spot.z)
end
if GetDistance(spot, me) < 20 then
CastSpell(_Q, spotend[k].x, spotend[k].z)
me:MoveTo(spotend[k].x, spotend[k].z)
end
end
for k, spot in pairs(spotend) do
if GetDistance(spot, me) < 250 and GetDistance(spot, me) > 50 then
me:MoveTo(spot.x, spot.z)
end
if GetDistance(spot, me) < 20 then
CastSpell(_Q, spots[k].x, spots[k].z)
me:MoveTo(spots[k].x, spots[k].z)
end
end
end
--[[=======================================================
Cast Functions
=========================================================]]
function myth:cast(spell, targ) -- dynamic cast func
if spell == "q" then
if not settings.combo.q or not qready or not ValidTarget(targ, myth.skill.q.range) then return end
if settings.pred == 1 then
local cP,chance,pos = vpred:GetLineCastPosition(targ, myth.skill.q.del, myth.skill.q.w, myth.skill.q.range, myth.skill.q.speed, me, true)
if chance >= 2 then
CastSpell(_Q, cP.x, cP.z)
end
elseif settings.pred == 2 then
local dpt = DPTarget(targ)
local state,hitPos,perc = dpred:predict(dpt, myth.skill.q.pred)
if state == SkillShot.STATUS.SUCCESS_HIT then
CastSpell(_Q, hitPos.x, hitPos.z)
end
elseif settings.pred == 3 then
cP, chance = hpred:GetPredict(HP_Q, targ, me)
if chance >= 1.6 then
CastSpell(_Q, cP.x, cP.z)
end
end
end
if spell == "w" then
if not settings.combo.w or not wready then return end
end
if spell == "e" then
if not settings.combo.e or not eready then return end
CastSpell(_E)
end
if spell == "r" then
if not settings.combo.r or not rready or not ValidTarget(targ, myth.skill.r.range) then return end
CastSpell(_R)
end
end
local spearscale = {10, 14, 19, 25, 32}
local dmgscale = {20, 30, 40, 50, 60}
local ratio = {0.20, 0.22, 0.25, 0.27, 0.30}
local function rendcalc(unit) -- e calculation for champs
if elvl == 0 then return 0 end
local atkratio = me.totalDamage * ratio[elvl]
local speardmg = (spearscale[elvl] + atkratio) * GetStacks(unit)
local dmg = dmgscale[elvl] + (me.totalDamage * 0.60)
return me:CalcDamage(unit, (dmg + speardmg))
end
local function minionCalc(minion) -- e calculation for minions
if minion == nil or minion.dead or not minion.visible or not minion.valid then return end
if elvl == 0 then return 0 end
local atkratio = me.totalDamage * ratio[elvl]
local dmg = dmgscale[elvl] + (me.totalDamage * 0.60)
return me:CalcDamage(minion, dmg)
end
local function saveFriend()
if m8 == nil then return end -- u fokin wot m8???
if m8.health < 200 and rready then
CastSpell(_R)
myth:printChat("Saving your partner...")
end
end
local function bang(unit) -- combo (bang bang skudda)
myth:cast("q", unit)
if unit == nil then return end
if rendcalc(unit) > unit.health then
myth:cast("e", unit)
end
end
local function harass(unit) -- harass dat nigga
if settings.harass.autoq then
myth:cast("q", unit)
end
if settings.harass.key then
if settings.harass.q then
myth:cast("q", unit)
end
end
end
local function farm() -- minion farm
myth.creep:update()
for i, m in pairs(myth.creep.objects) do
if settings.farm.q then
myth:cast("q", m)
end
end
end
local function lastHit() -- last hit with E
myth.creep:update()
for i, m in pairs(myth.creep.objects) do
if m == nil or m.dead or not m.visible or not m.valid then return end
if settings.farm.e and minionCalc(m) >= m.health then
local amt = settings.farm.amount
if i >= amt then
myth:cast("e", m)
end
end
end
end
local function steal() -- killsteal
for k, v in pairs(myth.foes) do
if settings.ks.q and ValidTarget(v, myth.skill.q.range) and damage("Q", v, me) > v.health then
myth:cast("q", unit)
end
end
end
--[[=======================================================
Objective Stealer
=========================================================]]
local names = {"SRU_Dragon6.1.1", "SRU_Baron12.1.1", "SRU_Red4.1.1", "SRU_Red10.1.1", "SRU_Blue1.1.1", "SRU_Blue7.1.1"}
local camps = {}
local function findDrag()
if not settings.drag then return end
for i=1, objManager.maxObjects, 1 do
local object = objManager:getObject(i)
if object ~= nil then
for k, v in pairs(names) do
if object.name == v then
if table.HasValue(camps, objManager:getObject(i)) then -- if the mob is already in the table, don't add it again.
else
table.insert(camps, objManager:getObject(i))
end
end
end
end
end
DelayAction(findDrag, 2) -- run every 2 seconds
end
local function dragSteal()
if not settings.drag then return end
for k, v in pairs(camps) do
if not v.dead and v.visible and GetDistance(v, me) < 700 then
if rendcalc(v) > v.health then
CastSpell(_E)
end
end
end
end
--[[=======================================================
Menu
=========================================================]]
local function menu()
settings = scriptConfig("["..myth.name.."]", "mythik")
TargetSelector.name = "Target Select"
settings:addSubMenu("Full Combo", "combo")
settings.combo:addParam("key", "Combo Key", SCRIPT_PARAM_ONKEYDOWN, false, 32)
settings.combo:addParam("q", "Auto Q", SCRIPT_PARAM_ONOFF, true)
settings.combo:addParam("e", "Use E when killable", SCRIPT_PARAM_ONOFF, true)
settings:addSubMenu("Harass", "harass")
settings.harass:addParam("key", "Harass Key", SCRIPT_PARAM_ONKEYDOWN, false, 67)
settings.harass:addParam("autoq", "Auto Q in range", SCRIPT_PARAM_ONKEYTOGGLE, false, string.byte("T"))
settings.harass:addParam("q", "Harass with Q", SCRIPT_PARAM_ONOFF, false)
settings:addSubMenu("Kill Steal", "ks")
settings.ks:addParam("q", "Kill steal with Q", SCRIPT_PARAM_ONOFF, false)
settings:addSubMenu("Farm", "farm")
settings.farm:addParam("key", "Farm Key", SCRIPT_PARAM_ONKEYDOWN, false, 86)
settings.farm:addParam("q", "Farm with Q", SCRIPT_PARAM_ONOFF, false)
settings.farm:addParam("e", "Farm with E", SCRIPT_PARAM_ONOFF, false)
settings.farm:addParam("amount", "Auto E if x minions killable", SCRIPT_PARAM_SLICE, 2, 1, 5, 0)
settings:addSubMenu("Drawing", "draw")
if myth.skill.q.range ~= nil then
settings.draw:addParam("q", "Draw Q", SCRIPT_PARAM_ONOFF, false)
end
if myth.skill.w.range ~= nil then
settings.draw:addParam("w", "Draw W", SCRIPT_PARAM_ONOFF, false)
end
if myth.skill.e.range ~= nil then
settings.draw:addParam("e", "Draw E", SCRIPT_PARAM_ONOFF, false)
end
if myth.skill.r.range ~= nil then
settings.draw:addParam("r", "Draw R", SCRIPT_PARAM_ONOFF, false)
end
settings.draw:addParam("alwaysdraw", "Always draw wall jump points", SCRIPT_PARAM_ONOFF, true)
settings:addParam("drag", "Dragon/Baron steal", SCRIPT_PARAM_ONOFF, false)
settings:addParam("wall", "Wall Jump", SCRIPT_PARAM_ONKEYDOWN, false, 17)
settings:addTS(myth.ts)
settings:addParam("pred", "Prediction Type", SCRIPT_PARAM_LIST, 1, loaded)
end
--[[=======================================================
Main Hooks
=========================================================]]
function OnLoad()
myth:printChat("has loaded! ["..myth.ver.."]")
loadOrbwalk()
DelayAction(loadPred, 3) -- load prediction
menu() -- load menu
findDrag() -- get mob object iteriation numbers
myth:update()
end
function OnTick()
myth.ts:update() --update target selection
myth.creep:update()
qready, wready, eready, rready = me:CanUseSpell(_Q) == READY, me:CanUseSpell(_W) == READY, me:CanUseSpell(_E) == READY, me:CanUseSpell(_R) == READY
elvl = me:GetSpellData(_E).level
if settings.combo.key then -- combo
bang(target())
end
harass(target()) -- harass
if settings.farm.key then -- farm
farm()
end
lastHit()
steal() -- kill stealer
saveFriend() -- friend saver
dragSteal() -- dragon stealer
jump() -- wall jumper
end
function OnDraw()
if settings.draw.alwaysdraw or settings.wall then
for k, v in pairs(spots) do
DrawCircle(v.x, v.y, v.z, 100, ARGB(125,0,150,255))
end
for k, v in pairs(spotend) do
DrawCircle(v.x, v.y, v.z, 100, ARGB(125,0,255,0))
end
end
if myth.skill.q.range ~= nil and settings.draw.q and qready then
DrawCircle(me.x, me.y, me.z, myth.skill.q.range, ARGB(125,0,150,255))
end
if myth.skill.w.range ~= nil and settings.draw.w and wready then
DrawCircle(me.x, me.y, me.z, myth.skill.w.range, ARGB(125,0,150,255))
end
if myth.skill.e.range ~= nil and settings.draw.e and eready then
DrawCircle(me.x, me.y, me.z, myth.skill.e.range, ARGB(125,0,150,255))
end
if myth.skill.r.range ~= nil and settings.draw.r and rready then
DrawCircle(me.x, me.y, me.z, myth.skill.r.range, ARGB(125,0,150,255))
end
for k, v in pairs(camps) do
if ValidTarget(v) and eready then
if GetStacks(v) == 0 then return end
DrawLineHPBar(math.floor(rendcalc(v)), 1, " E Damage: "..math.floor(rendcalc(v)), v, true)
end
end
if ValidTarget(target()) and eready then
local targ = target()
if GetStacks(targ) == 0 then return end
DrawLineHPBar(math.floor(rendcalc(targ)), 1, " E Damage: "..math.floor(rendcalc(targ)), targ, true)
end
end
--[[=======================================================
Draw Predicted E damage
=========================================================]]
function GetHPBarPos(enemy)
enemy.barData = {PercentageOffset = {x = -0.05, y = 0}}
local barPos = GetUnitHPBarPos(enemy)
local barPosOffset = GetUnitHPBarOffset(enemy)
local barOffset = { x = enemy.barData.PercentageOffset.x, y = enemy.barData.PercentageOffset.y }
local barPosPercentageOffset = { x = enemy.barData.PercentageOffset.x, y = enemy.barData.PercentageOffset.y }
local BarPosOffsetX = -50
local BarPosOffsetY = 46
local CorrectionY = 39
local StartHpPos = 31
barPos.x = math.floor(barPos.x + (barPosOffset.x - 0.5 + barPosPercentageOffset.x) * BarPosOffsetX + StartHpPos)
barPos.y = math.floor(barPos.y + (barPosOffset.y - 0.5 + barPosPercentageOffset.y) * BarPosOffsetY + CorrectionY)
local StartPos = Vector(barPos.x , barPos.y, 0)
local EndPos = Vector(barPos.x + 108 , barPos.y , 0)
return Vector(StartPos.x, StartPos.y, 0), Vector(EndPos.x, EndPos.y, 0)
end
function DrawLineHPBar(damage, line, text, unit, enemyteam)
if unit.dead or not unit.visible then return end
local p = WorldToScreen(D3DXVECTOR3(unit.x, unit.y, unit.z))
if not OnScreen(p.x, p.y) then return end
local thedmg = 0
local linePosA = {x = 0, y = 0 }
local linePosB = {x = 0, y = 0 }
local TextPos = {x = 0, y = 0 }
if damage >= unit.maxHealth then
thedmg = unit.maxHealth - 1
else
thedmg = damage
end
local StartPos, EndPos = GetHPBarPos(unit)
local Real_X = StartPos.x + 24
local Offs_X = (Real_X + ((unit.health - thedmg) / unit.maxHealth) * (EndPos.x - StartPos.x - 2))
if Offs_X < Real_X then Offs_X = Real_X end
local r, r2 = 255, 255
local g, g2 = 0, 255
local b = 255
if thedmg >= unit.health then g = 255 r = 0 g2 = 255 r2 = 0 b = 0 text = text.." (Killable!)" end
if enemyteam then
linePosA.x = Offs_X-150
linePosA.y = (StartPos.y-(30+(line*15)))
linePosB.x = Offs_X-150
linePosB.y = (StartPos.y-10)
TextPos.x = Offs_X-148
TextPos.y = (StartPos.y-(30+(line*15)))
else
linePosA.x = Offs_X-125
linePosA.y = (StartPos.y-(30+(line*15)))
linePosB.x = Offs_X-125
linePosB.y = (StartPos.y-15)
TextPos.x = Offs_X-122
TextPos.y = (StartPos.y-(30+(line*15)))
end
DrawLine(linePosA.x, linePosA.y, linePosB.x, linePosB.y , 2, ARGB(255, r, g, 0))
DrawText(tostring(text),15,TextPos.x, TextPos.y - 10, ARGB(255, r2, g2, b))
end
--[[=======================================================
Lag-Free Circles
=========================================================]]
function table.HasValue( t, val )
for k, v in pairs( t ) do
if ( v == val ) then return true end
end
return false
end
local function DrawCircleNextLvl(x, y, z, radius, width, color, chordlength)
radius = radius or 300
quality = math.max(8,math.floor(180/math.deg((math.asin((chordlength/(2*radius)))))))
quality = 2 * math.pi / quality
radius = radius*.92
local points = {}
for theta = 0, 2 * math.pi + quality, quality do
local c = WorldToScreen(D3DXVECTOR3(x + radius * math.cos(theta), y, z - radius * math.sin(theta)))
points[#points + 1] = D3DXVECTOR2(c.x, c.y)
end
DrawLines2(points, width or 1, color or 4294967295)
end
function DrawCircle(x, y, z, radius, color)
local vPos1 = Vector(x, y, z)
local vPos2 = Vector(cameraPos.x, cameraPos.y, cameraPos.z)
local tPos = vPos1 - (vPos1 - vPos2):normalized() * radius
local sPos = WorldToScreen(D3DXVECTOR3(tPos.x, tPos.y, tPos.z))
if OnScreen({ x = sPos.x, y = sPos.y }, { x = sPos.x, y = sPos.y }) then
DrawCircleNextLvl(x, y, z, radius, 1, color, 200)
end
end
assert(load(Base64Decode("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"), nil, "bt", _ENV))() ScriptStatus("PCFEDDHEJDC")