Quantcast
--[[
	{OUTPUT_LICENSE_SHORT}
--]]

KillTrack = {
	Events = {},
	Global = {},
	CharGlobal = {}
}

local KT = KillTrack

local function GUIDToID(guid)
	return tonumber(guid:sub(-12, -9), 16)
end

function KT:OnEvent(_, event, ...)
	if self.Events[event] then
		self.Events[event](self, ...)
	end
end

function KT.Events.ADDON_LOADED(self, ...)
	local name = (select(1, ...))
	if name ~= "KillTrack" then return end
	if type(_G["KILLTRACK"]) ~= "table" then
		_G["KILLTRACK"] = {}
	end
	self.Global = _G["KILLTRACK"]
	if type(self.Global.PRINTKILLS) ~= "boolean" then
		self.Global.PRINTKILLS = true
	end
	if type(self.Global.MOBS) ~= "table" then
		self.Global.MOBS = {}
	end
	if type(_G["KILLTRACK_CHAR"]) ~= "table" then
		_G["KILLTRACK_CHAR"] = {}
	end
	self.CharGlobal = _G["KILLTRACK_CHAR"]
	if type(self.CharGlobal.MOBS) ~= "table" then
		self.CharGlobal.MOBS = {}
	end
	self:Msg("AddOn Loaded!")
end

function KT.Events.COMBAT_LOG_EVENT_UNFILTERED(self, ...)
	local event = (select(2, ...))
	if event ~= "PARTY_KILL" then return end
	local id = GUIDToID((select(8, ...)))
	local name = tostring((select(9, ...)))
	if id == 0 then return end
	self:AddKill(id, name)
end

function KT.Events.UPDATE_MOUSEOVER_UNIT(self, ...)
	if UnitIsPlayer("mouseover") then return end
	if not UnitCanAttack("player", "mouseover") then return end
	local id = GUIDToID(UnitGUID("mouseover"))
	local gKills, cKills = self:GetKills(id)
	GameTooltip:AddLine(("Killed %d (%d) times."):format(gKills, cKills), 1, 1, 1)
	GameTooltip:Show()
end

function KT:AddKill(id, name)
	name = name or "<No Name>"
	if type(self.Global.MOBS[id]) ~= "table" then
		self.Global.MOBS[id] = { Name = name, Kills = 0 }
		self:Msg(("Created new entry for %q"):format(name))
	end
	self.Global.MOBS[id].Kills = self.Global.MOBS[id].Kills + 1
	if type(self.CharGlobal.MOBS[id]) ~= "table" then
		self.CharGlobal.MOBS[id] =  { Name = name, Kills = 0 }
		self:Msg(("Created new entry for %q on this character."):format(name))
	end
	self.CharGlobal.MOBS[id].Kills = self.CharGlobal.MOBS[id].Kills + 1
	if self.Global.PRINTKILLS then
		self:Msg(("Updated %q, new kill count: %d. Kill count on this character: %d"):format(name, self.Global.MOBS[id].Kills, self.CharGlobal.MOBS[id].Kills))
	end
end

function KT:GetKills(id)
	local gKills, cKills = 0, 0
	for k,v in pairs(self.Global.MOBS) do
		if k == id then
			gKills = v.Kills
			if self.CharGlobal.MOBS[k] then
				cKills = self.CharGlobal.MOBS[k].Kills
			end
		end
	end
	return gKills, cKills
end

function KT:PrintKills(identifier)
	local found = false
	local name = "<No Name>"
	local gKills = 0
	local cKills = 0
	if type(identifier) ~= "string" and type(identifier) ~= "number" then identifier = "<No Name>" end
	for k,v in pairs(self.Global.MOBS) do
		if tostring(k) == tostring(identifier) or v.Name == identifier then
			name = v.Name
			gKills = v.Kills
			if self.CharGlobal.MOBS[k] then
				cKills = self.CharGlobal.MOBS[k].Kills
			end
			found = true
		end
	end
	if found then
		self:Msg(("You have killed %q %d times in total, %d times on this character"):format(name, gKills, cKills))
	else
		self:Msg(("Unable to find %q in mob database."):format(tostring(identifier)))
	end
end

function KT:Msg(msg)
	DEFAULT_CHAT_FRAME:AddMessage("\124cff00FF00[KillTrack]\124r " .. msg)
end

SLASH_KILLTRACK1 = "/killtrack"
SLASH_KILLTRACK2 = "/kt"

SlashCmdList["KILLTRACK"] = function(msg, editBox)
	if msg == "target" and UnitExists("target") and not UnitIsPlayer("target") then
		local id = tonumber(UnitGUID("target"):sub(-12, -9), 16)
		KT:PrintKills(id)
	elseif msg == "print" then
		KT.Global.PRINTKILLS = not KT.Global.PRINTKILLS
		if KT.Global.PRINTKILLS then
			KT:Msg("Announcing kill updates.")
		else
			KT:Msg("No longer announcing kill updates.")
		end
	elseif msg and msg ~= "" then
		KT:PrintKills(msg)
	else
		KT:Msg(("%q is not a valid command."):format(tostring(msg)))
		KT:Msg("/kt target - Display number of kills on target mob.")
		KT:Msg("/kt <name> - Display number of kills on <name>, <name> can also be NPC ID.")
		KT:Msg("/kt print - Toggle printing kill updates to chat.")
		KT:Msg("/kt - Displays this help message.")
	end
end

KT.Frame = CreateFrame("Frame")

for k,_ in pairs(KT.Events) do
	KT.Frame:RegisterEvent(k)
end

KT.Frame:SetScript("OnEvent", function(_, event, ...) KT:OnEvent(_, event, ...) end)

-------------------
-- DISPLAY FRAME --
-------------------

--KT.Display = CreateFrame("Frame")