if GetObjectName(GetMyHero()) ~= "Katarina" then return end require('Inspired') require('DeftLib') require('DamageLib') AutoUpdate("/DefinitelyScripting/GoS_Projects/master/Katarina.lua","/DefinitelyScripting/GoS_Projects/master/katarina.version","Katarina.lua",13) local KatarinaMenu = MenuConfig("Katarina", "Katarina") KatarinaMenu:Menu("Combo", "Combo") KatarinaMenu.Combo:Boolean("Q", "Use Q", true) KatarinaMenu.Combo:Boolean("W", "Use W", true) KatarinaMenu.Combo:Boolean("E", "Use E", true) KatarinaMenu.Combo:Boolean("R", "Use R", true) KatarinaMenu.Combo:Key("WardJumpkey", "Ward Jump!", string.byte("G")) KatarinaMenu.Combo:KeyBinding("AntiCombo", "Combo without IOW", string.byte("S")) KatarinaMenu:Menu("Harass", "Harass") KatarinaMenu.Harass:Boolean("Q", "Use Q", true) KatarinaMenu.Harass:Boolean("W", "Use W", true) KatarinaMenu.Harass:Boolean("E", "Use E", true) KatarinaMenu:Menu("Killsteal", "Killsteal") KatarinaMenu.Killsteal:Boolean("SmartKS", "Smart KS", true) KatarinaMenu.Killsteal:Boolean("UseWards", "Use Wards", true) if Ignite ~= nil then KatarinaMenu:Menu("Misc", "Misc") KatarinaMenu.Misc:Boolean("Autoignite", "Auto Ignite", true) end KatarinaMenu:Menu("JungleClear", "JungleClear") KatarinaMenu.JungleClear:Boolean("Q", "Use Q", true) KatarinaMenu.JungleClear:Boolean("W", "Use W", true) KatarinaMenu.JungleClear:Boolean("E", "Use E", true) KatarinaMenu:Menu("Lasthit", "Lasthit") KatarinaMenu.Lasthit:Boolean("Q", "Lasthit with Q", false) KatarinaMenu.Lasthit:Boolean("W", "Lasthit with W", false) KatarinaMenu.Lasthit:Boolean("E", "Lasthit with E", false) KatarinaMenu:Menu("Laneclear", "Laneclear") KatarinaMenu.Laneclear:Boolean("Q", "Use Q", false) KatarinaMenu.Laneclear:Boolean("W", "Use W", false) KatarinaMenu.Laneclear:Boolean("E", "Use E", false) KatarinaMenu:Menu("Drawings", "Drawings") KatarinaMenu.Drawings:Boolean("Q", "Draw Q Range", true) KatarinaMenu.Drawings:Boolean("W", "Draw W Range", true) KatarinaMenu.Drawings:Boolean("E", "Draw E Range", true) KatarinaMenu.Drawings:Boolean("R", "Draw R Range", true) KatarinaMenu.Drawings:Boolean("Text", "Draw Damage Text", true) OnDraw(function(myHero) local pos = GetOrigin(myHero) if KatarinaMenu.Drawings.Q:Value() then DrawCircle(pos,675,1,25,GoS.Pink) end if KatarinaMenu.Drawings.W:Value() then DrawCircle(pos,375,1,25,GoS.Yellow) end if KatarinaMenu.Drawings.E:Value() then DrawCircle(pos,700,1,25,GoS.Blue) end if KatarinaMenu.Drawings.R:Value() then DrawCircle(pos,550,1,25,GoS.Green) end if KatarinaMenu.Drawings.Text:Value() then for _, enemy in pairs(GetEnemyHeroes()) do if ValidTarget(enemy) then local drawpos = WorldToScreen(1,GetOrigin(enemy)) local enemyText, color = GetDrawText(enemy) DrawText(enemyText, 15, drawpos.x, drawpos.y, color) end end end end) local jumpTarget local wardLock local mousePos local wardpos local maxPos local spellObj local objectList = {} local wardItems = { { id = 3340, spellName = "TrinketTotemLvl1"}, { id = 3350, spellName = "TrinketTotemLvl2"}, { id = 3361, spellName = "TrinketTotemLvl3"}, { id = 3362, spellName = "TrinketTotemLvl3B"}, { id = 2045, spellName = "ItemGhostWard"}, { id = 2049, spellName = "ItemGhostWard"}, { id = 2050, spellName = "ItemMiniWard"}, { id = 2044, spellName = "sightward"}, { id = 2043, spellName = "VisionWard"} } local function IsInDistance2(r, p1, p2, fast) local fast = fast or false if fast then local p1y = p1.z or p1.y local p2y = p2.z or p2.y return (p1.x + r >= p2.x) and (p1.x - r <= p2.x) and (p1y + r >= p2y) and (p1y - r <= p2y) else return GetDistanceSqr(p1, p2) < r*r end end local function calcMaxPos(pos) local origin = GetOrigin(myHero) local vectorx = pos.x-origin.x local vectory = pos.y-origin.y local vectorz = pos.z-origin.z local dist= math.sqrt(vectorx^2+vectory^2+vectorz^2) return {x = origin.x + 600 * vectorx / dist ,y = origin.y + 600 * vectory / dist, z = origin.z + 600 * vectorz / dist} end local function ValidTarget2( object ) local objType = GetObjectType(object) return (objType == Obj_AI_Hero or objType == Obj_AI_Minion) and IsVisible(object) end local findWardSlot = function () local slot = 0 for i,wardItem in pairs(wardItems) do slot = GetItemSlot(myHero,wardItem.id) if slot > 0 and IsReady(slot) then return slot end end end local function putWard(pos0) local slot = findWardSlot() local pos = pos0 if not IsInDistance2(600, pos) then pos = calcMaxPos(pos) end if slot and slot > 0 then CastSkillShot(slot,pos) end end local spellLock = nil function wardJump( pos ) if not spellLock and IsReady(_E) then if jumpTarget then CastTargetSpell(jumpTarget, _E) spellLock = GetTickCount() elseif not wardLock then wardLock = GetTickCount() putWard(pos) end end end local function GetJumpTarget() local pos = mousePos if not IsInDistance2(600, mousePos, GetOrigin(myHero)) then pos = maxPos end for _,object in pairs(objectList) do if ValidTarget2(object) and IsInDistance2(200, GetOrigin(object), pos) then return object end end return nil end local CastingR = false local target1 = TargetSelector(675,TARGET_LESS_CAST_PRIORITY,DAMAGE_MAGIC,true,false) local target2 = TargetSelector(700,TARGET_LESS_CAST_PRIORITY,DAMAGE_MAGIC,true,false) OnAnimation(function(unit, animationName) if unit == GetMyHero() then if animationName == "Spell4" then CastingR = true IOW.attacksEnabled = false else CastingR = false if CastingR ~= true then IOW.movementEnabled = true IOW.attacksEnabled = true end end end end) OnProcessSpell(function(unit,spell) if unit == GetMyHero() and spell.name:lower():find("katarinar") then CastingR = true IOW.attacksEnabled = false end if unit == GetMyHero() and not spell.name:lower():find("katarina") then spellObj = spell wardpos = spellObj.endPos end end) OnUpdateBuff(function(object, buff) if object == GetMyHero() and buff.name == "katarinarsound" then IOW.attacksEnabled = false CastingR = true end end) OnRemoveBuff(function(object, buff) if object == GetMyHero() and buff.name == "katarinarsound" then CastingR = false end end) OnTick(function(myHero) local target = GetCurrentTarget() local Qtarget = target1:GetTarget() local Etarget = target2:GetTarget() if KatarinaMenu.Combo.AntiCombo:Value() and not CastingR then if IsReady(_Q) and KatarinaMenu.Combo.Q:Value() and ValidTarget(Qtarget, 675) and ValidTarget(Etarget, 700) and IOW.movementEnabled == true and IOW.attacksEnabled == true then CastTargetSpell(Qtarget, _Q) end if IsReady(_E) and KatarinaMenu.Combo.E:Value() and ValidTarget(Etarget, 700) and IOW.movementEnabled == true and IOW.attacksEnabled == true then CastTargetSpell(Etarget, _E) end if IsReady(_W) and KatarinaMenu.Combo.W:Value() and ValidTarget(target, 375) and ValidTarget(Etarget, 700) and IOW.movementEnabled == true and IOW.attacksEnabled == true then CastSpell(_W) end if KatarinaMenu.Combo.R:Value() and CanUseSpell(myHero, _Q) ~= READY and CanUseSpell(myHero, _W) ~= READY and CanUseSpell(myHero, _E) ~= READY and CanUseSpell(myHero, _R) ~= ONCOOLDOWN and ValidTarget(target, 550) and GetCastLevel(myHero,_R) > 0 then IOW.movementEnabled = false IOW.attacksEnabled = false if IOW.movementEnabled == false and IOW.attacksEnabled == false then CastSpell(_R) else IOW.movementEnabled = false IOW.attacksEnabled = false end end end if IOW:Mode() == "Harass" then if IsReady(_Q) and KatarinaMenu.Harass.Q:Value() and ValidTarget(Qtarget, 675) then CastTargetSpell(Qtarget, _Q) end if IsReady(_W) and KatarinaMenu.Harass.W:Value() and ValidTarget(target, 375) then CastSpell(_W) end if IsReady(_E) and KatarinaMenu.Harass.E:Value() and ValidTarget(Etarget, 700) then CastTargetSpell(Etarget, _E) end end for i,enemy in pairs(GetEnemyHeroes()) do if KatarinaMenu.Killsteal.SmartKS:Value() then if Ignite and KatarinaMenu.Misc.Autoignite:Value() then if IsReady(Ignite) and 20*GetLevel(myHero)+50 > GetHP(enemy)+GetHPRegen(enemy)*3 and ValidTarget(enemy, 600) then CastTargetSpell(enemy, Ignite) end end if IsReady(_W) and GetHP2(enemy) < getdmg("W",enemy) and ValidTarget(enemy, 375) and not CastingR then CastSpell(_W) end if IsReady(_Q) and GetHP2(enemy) < getdmg("Q",enemy) and ValidTarget(enemy, 675) and not CastingR then CastTargetSpell(enemy, _Q) end if IsReady(_E) and GetHP2(enemy) < getdmg("E",enemy) and ValidTarget(enemy, 700) and not CastingR then CastTargetSpell(enemy, _E) end if IsReady(_Q) and IsReady(_W) and GetHP2(enemy) < getdmg("Q",enemy) + getdmg("W",enemy) and ValidTarget(enemy, 375) then CastSpell(_W) DelayAction(function() CastTargetSpell(enemy, _Q) end, 250) end if IsReady(_E) and IsReady(_W) and GetHP2(enemy) < getdmg("W",enemy) + getdmg("W",enemy) and ValidTarget(enemy, 700) then CastTargetSpell(enemy, _E) DelayAction(function() CastSpell(_W) end, 250) if IsReady(_Q) and IsReady(_W) and IsReady(_E) and GetHP2(enemy) < getdmg("Q",enemy) + getdmg("W",enemy) + getdmg("E",enemy) and ValidTarget(enemy, 700) then CastTargetSpell(enemy, _E) DelayAction(function() CastTargetSpell(enemy, _Q) end, 250) DelayAction(function() CastSpell(_W) end, 250) end if KatarinaMenu.Killsteal.UseWards:Value() and ValidTarget(enemy, 1275) and GetDistance(enemy) > 700 and IsReady(_Q) and GetHP2(enemy) < getdmg("Q",enemy) then wardJump(GetOrigin(enemy)) DelayAction(function() CastTargetSpell(enemy, _Q) end, 250) end end end if IOW:Mode() == "LaneClear" then for _,mobs in pairs(minionManager.objects) do if GetTeam(mobs) == MINION_ENEMY then if IsReady(_Q) and KatarinaMenu.Laneclear.Q:Value() and ValidTarget(mobs, 675) then CastTargetSpell(mobs, _Q) end if IsReady(_W) and KatarinaMenu.Laneclear.W:Value() and ValidTarget(mobs, 375) then CastSpell(_W) end if IsReady(_E) and KatarinaMenu.Laneclear.E:Value() and ValidTarget(mobs, 700) then CastTargetSpell(mobs, _E) end elseif GetTeam(mobs) == 300 then if IsReady(_Q) and KatarinaMenu.JungleClear.Q:Value() and ValidTarget(mobs, 675) then CastTargetSpell(mobs, _Q) end if IsReady(_W) and KatarinaMenu.JungleClear.W:Value() and ValidTarget(mobs, 375) then CastSpell(_W) end if IsReady(_E) and KatarinaMenu.JungleClear.E:Value() and ValidTarget(mobs, 700) then CastTargetSpell(mobs, _E) end end end end if IOW:Mode() == "LastHit" then for _,mobs in pairs(minionManager.objects) do if GetTeam(mobs) == MINION_ENEMY then if IsReady(_W) and KatarinaMenu.Lasthit.W:Value() and ValidTarget(mobs, 375) and GetCurrentHP(mobs) < getdmg("W",mobs) then CastSpell(_W) elseif IsReady(_Q) and KatarinaMenu.Lasthit.Q:Value() and ValidTarget(mobs, 675) and GetCurrentHP(mobs) < getdmg("Q",mobs) then CastTargetSpell(mobs, _Q) elseif IsReady(_E) and KatarinaMenu.Lasthit.E:Value() and ValidTarget(mobs, 700) and GetCurrentHP(mobs) < getdmg("E",mobs) then CastTargetSpell(mobs, _E) end end end end end mousePos = GetMousePos() maxPos = calcMaxPos(mousePos) jumpTarget = GetJumpTarget() if not spellLock and wardLock and jumpTarget and IsReady(_E) then CastTargetSpell(jumpTarget, _E) spellLock = GetTickCount() end if KatarinaMenu.Combo.WardJumpkey:Value() then wardJump(mousePos) MoveToXYZ(mousePos) end if wardLock and (wardLock + 500) < GetTickCount() then wardLock = nil end if spellLock and (spellLock + 500) < GetTickCount() then spellLock = nil end jumpTarget = nil spellObj = nil wardpos = nil end) OnObjectLoad(function(object) local objType = GetObjectType(object) if objType == Obj_AI_Hero or objType == Obj_AI_Minion then objectList[object] = object end end) OnCreateObj(function(object) local objType = GetObjectType(object) if objType == Obj_AI_Hero or objType == Obj_AI_Minion then objectList[object] = object end end) OnDeleteObj(function(object) local objType = GetObjectType(object) if objType == Obj_AI_Hero or objType == Obj_AI_Minion then objectList[object] = nil end end) function GetDrawText(enemy) local IgniteDmg = 0 if Ignite and IsReady(Ignite) then IgniteDmg = IgniteDmg + 20*GetLevel(myHero)+50 end if IsReady(_Q) and GetHP2(enemy) < getdmg("Q",enemy) then return 'Q = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_W) and GetHP2(enemy) < getdmg("W",enemy) then return 'W = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_E) and GetHP2(enemy) < getdmg("E",enemy) then return 'E = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_Q) and IsReady(_W) and GetHP2(enemy) < getdmg("Q",enemy) + getdmg("W",enemy) then return 'W + Q = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_W) and IsReady(_E) and GetHP2(enemy) < getdmg("W",enemy) + getdmg("E",enemy) then return 'E + W = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_Q) and IsReady(_W) and IsReady(_E) and GetHP2(enemy) < getdmg("Q",enemy) + getdmg("W",enemy) + getdmg("E",enemy) then return 'Q + W + E = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_Q) and IsReady(_W) and IsReady(_E) and GetHP2(enemy) < getdmg("Q",enemy) + getdmg("Q",enemy,myHero,2) + getdmg("W",enemy) + getdmg("E",enemy) then return '(Q + Passive) + W +E = Kill!', ARGB(255, 200, 160, 0) elseif IgniteDmg > 0 and IsReady(_Q) and IsReady(_W) and IsReady(_E) and GetHP2(enemy) < IgniteDmg + getdmg("Q",enemy) + getdmg("Q",enemy,myHero,2) + getdmg("W",enemy) + getdmg("E",enemy) then return '(Q + Passive) + W + E + Ignite = Kill!', ARGB(255, 200, 160, 0) elseif IsReady(_Q) and IsReady(_W) and IsReady(_E) and IsReady(_R) and GetHP2(enemy) < getdmg("Q",enemy) + getdmg("W",enemy) + getdmg("E",enemy) + getdmg("R",enemy,myHero,3) then return 'Q + W + E + Ult ('.. string.format('%4.1f', (GetHP2(enemy) - getdmg("Q",enemy) - getdmg("W",enemy) - getdmg("E",enemy) - getdmg("R",enemy,myHero,3))/4) .. ' Secs) = Kill!', ARGB(255, 255, 69, 0) else return 'Cant Kill Yet', ARGB(255, 200, 160, 0) end end PrintChat(string.format("Deftsu's Katarina: with some funny stuff done to it by DefinitelyScripting... this is meant to be a quick-fix not a solution. ")) PrintChat("Same script, with a few tweaks for the ultimate handling. [Note: To combo, just hold the 'S' key down while moving manually with your mouse.]")