--[[
	Katarina Combo 2.13
		by eXtragoZ
		
	Features:
		- Full combo: DFG -> Q -> E -> W -> Items -> R
		- Auto Ignite in the Full combo (by default off)
		- Supports: Deathfire Grasp, Liandry's Torment, Blackfire Torch, Bilgewater Cutlass, Hextech Gunblade, Blade of the Ruined King, Sheen, Trinity, Lich Bane, Iceborn Gauntlet, Shard of True Ice, Randuin's Omen and Ignite
		- Harass mode: 
			- 0: Q 
			- 1: Q -> W
			- 2: Q -> E -> W
		- Delay in W to process the mark of Q unless it going to use R
		- Stops the Ult if you can kill your target with basic skills
		- Mark killable target with a combo
		- Target configuration
		- Press shift to configure
   
	Explanation of the marks:
		Green circle:  Marks the current target to which you will do the combo
		Blue circle:  Mark a target that can be killed with a combo, if all the skills were available
		Red circle:  Mark a target that can be killed using items + 1 hits + Q x2 + Qmark x2 + W x2 + E x2 + R (full duration) + ignite
		2 Red circles:  Mark a target that can be killed using items + 1 hits + Q + Qmark + W + E + R (7/10 duration) + ignite
		3 Red circles:  Mark a target that can be killed using items (without on hit items) + Q + Qmark(if e is not on cd) + W(if e is not on cd) + E + R (3/10 duration)(if e is not on cd)
		
	Stops the Ult: Q + Qmark + W + E
]]
if myHero.charName ~= "Katarina" then return end
--[[		Config		]]     
local HK = 32 --spacebar
local HHK = 84 --T
--[[            Code            ]]
local range = 730
local ULTK = 82 --R (security method)
local tick = nil
-- Active
local ultActive = false
local timeult = 0
local timeq = 0
local lastqmark = 0
local lastAnimation = ""
-- draw
local waittxt = {}
local calculationenemy = 1
local floattext = {"Skills are not available","Able to fight","Killable","Murder him!"}
local killable = {}
-- ts
local ts
local distancetarget = 0
--
local ID = {DFG = 3128, HXG = 3146, BWC = 3144, Sheen = 3057, Trinity = 3078, LB = 3100, IG = 3025, LT = 3151, BT = 3188, STI = 3092, RO = 3143, BRK = 3153}
local Slot = {Q = _Q, W = _W, E = _E, R = _R, I = nil, DFG = nil, HXG = nil, BWC = nil, Sheen = nil, Trinity = nil, LB = nil, IG = nil, LT = nil, BT = nil, STI = nil, RO = nil, BRK = nil}
local RDY = {Q = false, W = false, E = false, R = false, I = false, DFG = false, HXG = false, BWC = false, STI = false, RO = false, BRK = false}

function OnLoad()
	KCConfig = scriptConfig("卡特琳娜", "katarinacombo")
	KCConfig:addParam("scriptActive", "连招", SCRIPT_PARAM_ONKEYDOWN, false, HK)
	KCConfig:addParam("harass", "消耗", SCRIPT_PARAM_ONKEYDOWN, false, HHK)
	KCConfig:addParam("harasscombo", "消耗技能0=Q1=Q+W2=Q+W+E", SCRIPT_PARAM_SLICE, 2, 0, 2, 0)
	KCConfig:addParam("drawcircles", "技能范围", SCRIPT_PARAM_ONOFF, true)
	KCConfig:addParam("drawtext", "击杀文本提示", SCRIPT_PARAM_ONOFF, true)
	KCConfig:addParam("useult", "自动大招抢人头", SCRIPT_PARAM_ONOFF, true)
	KCConfig:addParam("delayw", "自动W技能", SCRIPT_PARAM_ONOFF, true)
	KCConfig:addParam("canstopult", "普通可杀死停放大招", SCRIPT_PARAM_ONOFF, true)
	KCConfig:addParam("autoIgnite", "自动点燃", SCRIPT_PARAM_ONOFF, false)
	KCConfig:permaShow("scriptActive")
	KCConfig:permaShow("harass")
	ts = TargetSelector(TARGET_LESS_CAST_PRIORITY,range,DAMAGE_MAGIC)
	ts.name = "Katarina"
	KCConfig:addTS(ts)
	if myHero:GetSpellData(SUMMONER_1).name:find("SummonerDot") then Slot.I = SUMMONER_1
	elseif myHero:GetSpellData(SUMMONER_2).name:find("SummonerDot") then Slot.I = SUMMONER_2 end
	for i=1, heroManager.iCount do waittxt[i] = i*3 end
	PrintChat(" >> Katarina Combo 2.13 loaded!")
end
function OnTick()
	ts:update()
	for name,number in pairs(ID) do Slot[name] = GetInventorySlotItem(number) end
	for name,state in pairs(RDY) do RDY[name] = (Slot[name] ~= nil and myHero:CanUseSpell(Slot[name]) == READY) end
	if tick == nil or GetTickCount()-tick >= 100 then
		tick = GetTickCount()
		KCDmgCalculation()
	end
	ultActive = GetTickCount() <= timeult+GetLatency()+50 or lastAnimation == "Spell4"
	if KCConfig.canstopult and ultActive and ts.target ~= nil then
		if KCDmgCalculation2(ts.target) > ts.target.health then ultActive, timeult = false, 0 end
	end	
	if ts.target ~= nil then distancetarget = GetDistance(ts.target) end
	if KCConfig.harass and ts.target ~= nil and not ultActive then	
		if RDY.Q then CastSpell(_Q, ts.target) end
		if KCConfig.harasscombo == 2 and RDY.E then CastSpell(_E,ts.target) end
		if KCConfig.harasscombo >= 1 then
			if RDY.W and distancetarget<375 and (((GetTickCount()-timeq>650 or GetTickCount()-lastqmark<650) and not RDY.Q) or not KCConfig.delayw) then CastSpell(_W) end
		end
	end
	if KCConfig.scriptActive and ts.target ~= nil and KCConfig.autoIgnite and RDY.I then
		local QWEDmg = KCDmgCalculation2(ts.target)
		local RDmg = (RDY.R and KCConfig.useult and distancetarget<=325) and getDmg("R",ts.target,myHero)*5 or 0
		local IDmg = getDmg("IGNITE",ts.target,myHero)
		if distancetarget<=600 and ts.target.health > QWEDmg+RDmg and ts.target.health <= IDmg+QWEDmg+RDmg then CastSpell(Slot.I, ts.target) end
	end
	if KCConfig.scriptActive and ts.target ~= nil and not ultActive then
		if RDY.DFG then CastSpell(Slot.DFG, ts.target) end
		if RDY.Q then CastSpell(_Q, ts.target) end
		if RDY.E then CastSpell(_E,ts.target) end
		if RDY.W and distancetarget<375 and (((GetTickCount()-timeq>650 or GetTickCount()-lastqmark<650) and not RDY.Q) or not KCConfig.delayw or (KCConfig.useult and RDY.R)) then CastSpell(_W) end
		if RDY.HXG then CastSpell(Slot.HXG, ts.target) end
		if RDY.BWC then CastSpell(Slot.BWC, ts.target) end
		if RDY.BRK then CastSpell(Slot.BRK, ts.target) end
		if RDY.STI and distancetarget<=380 then CastSpell(Slot.STI, myHero) end
		if RDY.RO and distancetarget<=500 then CastSpell(Slot.RO) end
		if RDY.R and KCConfig.useult and not RDY.Q and not RDY.W and not RDY.E and not RDY.DFG and not RDY.HXG and not RDY.BWC and not RDY.BRK and not RDY.STI and not RDY.RO and distancetarget<275 then
			timeult = GetTickCount()
			CastSpell(_R)
		end
	end
end
function KCDmgCalculation2(enemy)
	local distanceenemy = GetDistance(enemy)
	local qdamage = getDmg("Q",enemy,myHero)
	local qdamage2 = getDmg("Q",enemy,myHero,2)
	local wdamage = getDmg("W",enemy,myHero)
	local edamage = getDmg("E",enemy,myHero)
	local combo5 = 0
	if RDY.Q then
		combo5 = combo5 + qdamage
		if RDY.E or (distanceenemy<375 and RDY.W) then
			combo5 = combo5 + qdamage2
		end
	end
	if RDY.W and (RDY.E or distanceenemy<375) then
		combo5 = combo5 + wdamage
	end
	if RDY.E then
		combo5 = combo5 + edamage
	end
	return combo5
end
function KCDmgCalculation()
	local enemy = heroManager:GetHero(calculationenemy)
	if ValidTarget(enemy) then
		local qdamage = getDmg("Q",enemy,myHero)
		local qdamage2 = getDmg("Q",enemy,myHero,2)
		local wdamage = getDmg("W",enemy,myHero)
		local edamage = getDmg("E",enemy,myHero)
		local rdamage = getDmg("R",enemy,myHero) --xdagger (champion can be hit by a maximum of 10 daggers (2 sec))
		local hitdamage = getDmg("AD",enemy,myHero)
		local dfgdamage = (Slot.DFG and getDmg("DFG",enemy,myHero) or 0)--amplifies all magic damage they take by 20%
		local hxgdamage = (Slot.HXG and getDmg("HXG",enemy,myHero) or 0)
		local bwcdamage = (Slot.BWC and getDmg("BWC",enemy,myHero) or 0)
		local brkdamage = (Slot.BRK and getDmg("RUINEDKING",enemy,myHero,2) or 0)
		local ignitedamage = (Slot.I and getDmg("IGNITE",enemy,myHero) or 0)
		local onhitdmg = (Slot.Sheen and getDmg("SHEEN",enemy,myHero) or 0)+(Slot.Trinity and getDmg("TRINITY",enemy,myHero) or 0)+(Slot.LB and getDmg("LICHBANE",enemy,myHero) or 0)+(Slot.IG and getDmg("ICEBORN",enemy,myHero) or 0)
		local onspelldamage = (Slot.LT and getDmg("LIANDRYS",enemy,myHero) or 0)+(Slot.BT and getDmg("BLACKFIRE",enemy,myHero) or 0)
		local onspelldamage2 = 0
		local combo1 = hitdamage + (qdamage*2 + qdamage2*2 + wdamage*2 + edamage*2 + rdamage*10)*(RDY.DFG and 1.2 or 1) + onhitdmg + onspelldamage*4 --0 cd
		local combo2 = hitdamage + onhitdmg
		local combo3 = hitdamage + onhitdmg
		local combo4 = 0
		if RDY.Q then
			combo2 = combo2 + (qdamage + qdamage2)*(RDY.DFG and 2.2 or 2)
			combo3 = combo3 + (qdamage + qdamage2)*(RDY.DFG and 1.2 or 1)
			combo4 = combo4 + qdamage + (RDY.E and qdamage2 or 0)
			onspelldamage2 = onspelldamage2+1
		end
		if RDY.W then
			combo2 = combo2 + wdamage*(RDY.DFG and 2.2 or 2)
			combo3 = combo3 + wdamage*(RDY.DFG and 1.2 or 1)
			combo4 = combo4 + (RDY.E and wdamage or 0)
			onspelldamage2 = onspelldamage2+1
		end
		if RDY.E then
			combo2 = combo2 + edamage*(RDY.DFG and 2.2 or 2)
			combo3 = combo3 + edamage*(RDY.DFG and 1.2 or 1)
			combo4 = combo4 + edamage
			onspelldamage2 = onspelldamage2+1
		end
		if myHero:CanUseSpell(_R) ~= COOLDOWN and not myHero.dead then
			combo2 = combo2 + rdamage*10*(RDY.DFG and 1.2 or 1)
			combo3 = combo3 + rdamage*7*(RDY.DFG and 1.2 or 1)
			combo4 = combo4 + (RDY.E and rdamage*3 or 0)
			onspelldamage2 = onspelldamage2+1
		end
		if RDY.DFG then
			combo1 = combo1 + dfgdamage
			combo2 = combo2 + dfgdamage
			combo3 = combo3 + dfgdamage
			combo4 = combo4 + dfgdamage
		end
		if RDY.HXG then               
			combo1 = combo1 + hxgdamage*(RDY.DFG and 1.2 or 1)
			combo2 = combo2 + hxgdamage*(RDY.DFG and 1.2 or 1)
			combo3 = combo3 + hxgdamage*(RDY.DFG and 1.2 or 1)
			combo4 = combo4 + hxgdamage
		end
		if RDY.BWC then
			combo1 = combo1 + bwcdamage*(RDY.DFG and 1.2 or 1)
			combo2 = combo2 + bwcdamage*(RDY.DFG and 1.2 or 1)
			combo3 = combo3 + bwcdamage*(RDY.DFG and 1.2 or 1)
			combo4 = combo4 + bwcdamage
		end
		if RDY.BRK then
			combo1 = combo1 + brkdamage
			combo2 = combo2 + brkdamage
			combo3 = combo3 + brkdamage
			combo4 = combo4 + brkdamage
		end
		if RDY.I then
			combo1 = combo1 + ignitedamage 
			combo2 = combo2 + ignitedamage
			combo3 = combo3 + ignitedamage
		end
		combo2 = combo2 + onspelldamage*onspelldamage2
		combo3 = combo3 + onspelldamage/2 + onspelldamage*onspelldamage2/2
		combo4 = combo4 + onspelldamage
		if combo4 >= enemy.health then killable[calculationenemy] = 4
		elseif combo3 >= enemy.health then killable[calculationenemy] = 3
		elseif combo2 >= enemy.health then killable[calculationenemy] = 2
		elseif combo1 >= enemy.health then killable[calculationenemy] = 1
		else killable[calculationenemy] = 0 end   
	end
	if calculationenemy == 1 then calculationenemy = heroManager.iCount
	else calculationenemy = calculationenemy-1 end
end
function OnProcessSpell(unit, spell)
	if unit.isMe and spell.name == "KatarinaQ" then timeq = GetTickCount() end
end
function OnCreateObj(object)
	if object.name:find("katarina_daggered") then lastqmark = GetTickCount() end
end
function OnAnimation(unit,animationName)
	if unit.isMe and lastAnimation ~= animationName then lastAnimation = animationName end
end
function OnDraw()
	if KCConfig.drawcircles and not myHero.dead then
		DrawCircle(myHero.x, myHero.y, myHero.z, range, 0x19A712)
		if ts.target ~= nil then
			for j=0, 10 do
				DrawCircle(ts.target.x, ts.target.y, ts.target.z, 40 + j*1.5, 0x00FF00)
			end
		end
	end
	for i=1, heroManager.iCount do
		local enemydraw = heroManager:GetHero(i)
		if ValidTarget(enemydraw) then
			if KCConfig.drawcircles then
				if killable[i] == 1 then
					for j=0, 20 do
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + j*1.5, 0x0000FF)
					end
				elseif killable[i] == 2 then
					for j=0, 10 do
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + j*1.5, 0xFF0000)
					end
				elseif killable[i] == 3 then
					for j=0, 10 do
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + j*1.5, 0xFF0000)
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 110 + j*1.5, 0xFF0000)
					end
				elseif killable[i] == 4 then
					for j=0, 10 do
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 80 + j*1.5, 0xFF0000)
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 110 + j*1.5, 0xFF0000)
						DrawCircle(enemydraw.x, enemydraw.y, enemydraw.z, 140 + j*1.5, 0xFF0000)
					end
				end
			end
			if KCConfig.drawtext and waittxt[i] == 1 and killable[i] ~= 0 then
				PrintFloatText(enemydraw,0,floattext[killable[i]])
			end
		end
		if waittxt[i] == 1 then waittxt[i] = 30
		else waittxt[i] = waittxt[i]-1 end
	end
end
function OnWndMsg(msg,key)
	if key == ULTK and msg == KEY_DOWN then timeult = GetTickCount() end
end
function OnSendChat(msg)
	ts:OnSendChat(msg, "pri")
end