Quicklog/GuidInfo.lua

335 lines
9.9 KiB
Lua

local name, addon = ...
local GetPlayerInfoByGUID, UnitFullName, UnitClassification, UnitGUID, GetNormalizedRealmName, UnitClass = GetPlayerInfoByGUID, UnitFullName, UnitClassification, UnitGUID, GetNormalizedRealmName, UnitClass
local MAX_RAID_MEMBERS, COMBATLOG_OBJECT_TYPE_PLAYER = MAX_RAID_MEMBERS, COMBATLOG_OBJECT_TYPE_PLAYER
local guidInfo = {}
--[[
UNITNAME_SUMMON_TITLE1 = "Begleiter von %s";
UNITNAME_SUMMON_TITLE10 = "Reittier von %s";
UNITNAME_SUMMON_TITLE11 = "Lichtbrunnen von %s";
UNITNAME_SUMMON_TITLE12 = "Butler von %s";
UNITNAME_SUMMON_TITLE13 = "%s'aka";
UNITNAME_SUMMON_TITLE14 = "Portal von %s";
UNITNAME_SUMMON_TITLE15 = "Hass von %s";
UNITNAME_SUMMON_TITLE16 = "Statue von %s";
UNITNAME_SUMMON_TITLE17 = "Geist von %s";
UNITNAME_SUMMON_TITLE18 = "Kriegsbanner von %s";
UNITNAME_SUMMON_TITLE19 = "Herzerwärmer von %s";
UNITNAME_SUMMON_TITLE2 = "Wächter von %s";
UNITNAME_SUMMON_TITLE20 = "Angeheuert von %s";
UNITNAME_SUMMON_TITLE21 = "Gekauft von %s";
UNITNAME_SUMMON_TITLE22 = "Stolz von %s";
UNITNAME_SUMMON_TITLE23 = "Verzerrtes Abbild von %s";
UNITNAME_SUMMON_TITLE24 = "Nudelwagen von %s";
UNITNAME_SUMMON_TITLE25 = "Innerer Dämon von %s";
UNITNAME_SUMMON_TITLE26 = "Leibwächter von %s";
UNITNAME_SUMMON_TITLE27 = "%s";
UNITNAME_SUMMON_TITLE28 = "Knappe von %s";
UNITNAME_SUMMON_TITLE29 = "Champion von %s";
UNITNAME_SUMMON_TITLE3 = "Diener von %s";
UNITNAME_SUMMON_TITLE30 = "Der Verräter";
UNITNAME_SUMMON_TITLE31 = "Eruptive Reflexion von %s";
UNITNAME_SUMMON_TITLE32 = "Hoffnungslose Reflexion von %s";
UNITNAME_SUMMON_TITLE33 = "Bösartige Reflexion von %s";
UNITNAME_SUMMON_TITLE34 = "Klagende Reflexion von %s";
UNITNAME_SUMMON_TITLE35 = "Assistentin von %s";
UNITNAME_SUMMON_TITLE36 = "Vollstrecker von %s";
UNITNAME_SUMMON_TITLE37 = "Rekrut von %s";
UNITNAME_SUMMON_TITLE38 = "Fan von %s";
UNITNAME_SUMMON_TITLE39 = "Böser Zwilling von %s";
UNITNAME_SUMMON_TITLE4 = "Totem von %s";
UNITNAME_SUMMON_TITLE40 = "Gier von %s";
UNITNAME_SUMMON_TITLE41 = "Verlorener Verstand von %s";
UNITNAME_SUMMON_TITLE42 = "Paktgebundener Beschützer von %s";
UNITNAME_SUMMON_TITLE43 = "Mechanoid von %s";
UNITNAME_SUMMON_TITLE44 = "%s, Diener von N'Zoth";
UNITNAME_SUMMON_TITLE45 = "Assassine von %s";
UNITNAME_SUMMON_TITLE46 = "Wildsamen von %s";
UNITNAME_SUMMON_TITLE47 = "Provost von %s";
UNITNAME_SUMMON_TITLE48 = "Repariert von %s";
UNITNAME_SUMMON_TITLE5 = "Gefährte von %s";
UNITNAME_SUMMON_TITLE6 = "Runenklinge von %s";
UNITNAME_SUMMON_TITLE7 = "Konstrukt von %s";
UNITNAME_SUMMON_TITLE8 = "Gegner von %s";
UNITNAME_SUMMON_TITLE9 = "Fahrzeug von %s";
]]
local methods_guid = {}
local scanIds = { 1, 2, 3, 7, 9, 26, 29}
local scanTip = CreateFrame("GameTooltip", format("%s_ScanTooltip",name), nil, "GameTooltipTemplate")
scanTip:SetOwner( WorldFrame, "ANCHOR_NONE" )
function methods_guid:scanTooltip()
if(self:HasOwner()) then return end
local guid = self['guid']
local text = _G[format("%s_ScanTooltipTextLeft2",name)]
scanTip:SetOwner(WorldFrame, 'ANCHOR_NONE')
scanTip:SetHyperlink('unit:' .. guid or '')
if(text) then
local text2 = text:GetText()
if(text2) then
for i = 1, #scanIds do
local check = _G[format("UNITNAME_SUMMON_TITLE%i",scanIds[i])]:gsub("%%s", "(.+)"):gsub("[%[%]]", "%%%1")
self['tooltip'] = text2
if(string.find(text2, check)) then
self['tooltip'] = text2
local a,b,c = string.find(text2, check)
if(c) then
local g = UnitGUID(c)
if(g) then
local gio = addon:GetGuidInfo(g)
-- local gip = addon:GetGuidInfo(guid)
self:SetOwner(gio)
return
-- print('found',c,gio['name'], gip['name'])
end
end
end
-- print(text:GetText(), check, guid)
end
end
end
end
local function GetGuid(unit)
if(unit) then
local guid = UnitGUID(unit)
if(guid and guid ~= "") then
return guid
end
end
end
function methods_guid:IsParty()
return self['isParty']
end
function methods_guid:SetName(newName)
self['name'] = newName
local nameSplit, serverSplit = strsplit('-',self['name'],2)
if(not serverSplit) then
serverSplit = GetNormalizedRealmName()
end
self['shortName'] = nameSplit
self['shortRealm'] = serverSplit
end
function methods_guid:IsPet()
return self['isPet']
end
function methods_guid:HasOwner()
return self['ownerName'] or false
end
function methods_guid:SetOwner(gi)
-- print("set owner", self['name'], gi['name'])
self['isPet'] = true
if(gi) then
self['ownerName'] = gi['name']
self['ownerGuid'] = gi['guid']
if(gi:IsParty())then
self['isParty'] = true
end
end
end
local function checkPet(unit)
local guid = GetGuid(unit)
if(guid) then
local unitName, unitRealm = UnitFullName(unit)
local _, unitClass = UnitClass(unit)
local o = addon:GetGuidInfo(guid, nil, unitRealm and format("%s-%s", unitName, unitRealm) or unitName, unitClass)
o['isParty'] = true
local pet = format("%sPET", unit)
local pguid = GetGuid(pet)
if(pguid) then
local p = addon:GetGuidInfo(pguid)
p['isParty'] = true
p:SetOwner(o)
end
return guid
end
end
local function assocOwner(guid, petguid)
local gio = addon:GetGuidInfo(guid)
local gip = addon:GetGuidInfo(petguid)
gip:SetOwner(gio)
end
local function group_helper(guids, endcount, unitbase)
for i = 1, endcount do
local guid = UnitGUID(format("%s%i", unitbase, i))
if(guid) then
guids[guid] = true
local petguid = UnitGUID(format("%s%ipet", unitbase, i))
if(petguid) then
assocOwner(guid, petguid)
guids[petguid] = true
end
end
end
return guids
end
function addon:GetGroupGuid(guids)
guids = guids or {}
if(IsInRaid()) then
guids = group_helper(guids, MAX_RAID_MEMBERS, 'raid')
elseif(IsInGroup()) then
guids = group_helper(guids, 4, 'party')
local guid = UnitGUID('player')
if(guid) then
guids[guid] = true
local petguid = UnitGUID('pet')
if(petguid) then
assocOwner(guid, petguid)
guids[petguid] = true
end
end
else
local guid = UnitGUID('player')
if(guid) then
guids[guid] = true
local petguid = UnitGUID('pet')
if(petguid) then
assocOwner(guid, petguid)
guids[petguid] = true
end
end
end
return guids
end
function addon:CheckUnit(unit)
if(unit) then
return checkPet(unit)
end
end
function addon:UNIT_TARGET(event, unit)
local trg = format("%starget", unit)
local guid = GetGuid(trg)
if(guid) then
local _, class = UnitClass(trg)
local fullName, realm = UnitFullName(trg)
local gi = addon:GetGuidInfo(guid, nil, realm and format("%s-%s", fullName, realm) or fullName, class)
local clf = UnitClassification(trg)
-- print(trg, clf, UnitLevel(trg))
if(clf == 'elite') then
if(UnitLevel(trg) == -1) then
gi['isBoss'] = true
end
end
-- print('gi',gi['class'])
if(not gi['class']) then
-- print('find class')
local _, class = UnitClass(trg)
if(class) then
print('found class',class)
gi['class'] = class
end
end
end
end
local function purgeGroupMember()
-- if(true) then return end -- dont purge to keep data intact
local guids = addon:GetGroupGuid()
guids = addon:GetSegmentsGuid(guids)
for guid, v in pairs(guidInfo) do
if(not guids[k]) then
guidInfo[guid]['isParty'] = nil
end
end
end
function addon:RAID_ROSTER_UPDATE()
purgeGroupMember()
for i = 1, MAX_RAID_MEMBERS do
checkPet(format("raid%i", i))
end
end
function addon:GROUP_ROSTER_UPDATE()
purgeGroupMember()
for i = 1, 4 do
checkPet(format('party%i', i))
end
checkPet('player')
end
local purgeTime = {
['Player'] = 3600 * 24,
['Pet'] = 3600,
['Creature'] = 3600
}
function addon:PurgeGuidInfo()
local guids = addon:GetGroupGuid()
--[[ for k, v in pairs(guids) do
local gi = addon:GetGuidInfo(k)
if(gi) then
local localizedClass, englishClass, localizedRace, englishRace, sexGuid, nameGuid, realmGuid = GetPlayerInfoByGUID(k)
-- print(nameGuid, englishClass, k, gi:IsPet())
end
end]]
guids = addon:GetSegmentsGuid(guids)
for k, v in pairs(guidInfo) do
if(not guids[k]) then
-- print(guidInfo[k]['name'],'purged')
guidInfo[k] = nil
end
end
return guidInfo
end
function addon:GetGuidInfoDB()
return guidInfo
end
function addon:SetGuidInfoDB(db)
if(db and type(db) == 'table') then
guidInfo = db
end
return guidInfo
end
function addon:GetGuidInfo(guid, unitFlag, unitName, unitClass)
if(guid and guid ~= '') then
if(not guidInfo[guid] or not guidInfo[guid]['name']) then
if(guid == 'Unknown') then
guidInfo[guid] = {
['added'] = time(),
['isParty'] = false,
['isPet'] = false,
['name'] = "<Unknown>",
['guid'] = guid,
['class'] = 'WARRIOR',
}
else --if(UnitFlag and bit.band(UnitFlag, COMBATLOG_OBJECT_TYPE_PLAYER) ~= 0) then
local localizedClass, englishClass, localizedRace, englishRace, sexGuid, nameGuid, realmGuid = GetPlayerInfoByGUID(guid)
-- print("gg",guid, unitFlag, unitName, " = ", nameGuid, realmGuid)
-- print(UnitName, nameGuid, realmGuid,format("%s-%s", nameGuid, realmGuid),format("%s-%s", nameGuid, realmGuid) ~= UnitName)
if(nameGuid) then
if(not realmGuid or realmGuid=='') then
realmGuid = GetNormalizedRealmName()
end
guidInfo[guid] = {
['added'] = time(),
['name'] = realmGuid and format("%s-%s", nameGuid, realmGuid) or nameGuid,
['guid'] = guid,
['class'] = englishClass,
['classLocal'] = localizedClass,
['race'] = englishRace,
['raceLocal'] = localizedRace,
}
end
end
if(not guidInfo[guid]) then
guidInfo[guid] = {
['added'] = time(),
['name'] = unitName,
['guid'] = guid,
['flags'] = unitFlag
}
end
end
for k, v in pairs(methods_guid) do
guidInfo[guid][k] = v
end
if(unitClass and not guidInfo[guid]['class']) then
guidInfo[guid]['class'] = unitClass
end
if(guidInfo[guid]['name'] and not guidInfo[guid]['shortName']) then
guidInfo[guid]:SetName(guidInfo[guid]['name'])
end
if(not guidInfo[guid]['classColor']) then
guidInfo[guid]['classColor'] = addon:GetClassColors(guidInfo[guid]['class'])
end
-- guidInfo[guid]:scanTooltip()
return guidInfo[guid]
end
end