Project stopped
This commit is contained in:
parent
145986d5ae
commit
62d18c09b0
322
LibGUID.lua
322
LibGUID.lua
|
@ -1,12 +1,174 @@
|
|||
local lib = LibStub:NewLibrary("LibGUID", 1)
|
||||
local lib = LibStub:NewLibrary("LibGUID", 6)
|
||||
if not lib then return end
|
||||
local COMBATLOG_OBJECT_AFFILIATION_OUTSIDER = COMBATLOG_OBJECT_AFFILIATION_OUTSIDER
|
||||
local guid_methods = guid_methods or {}
|
||||
local mixins = {'CreateGUIDObject', 'RegisterPrune', 'PruneGUIDCache'}
|
||||
local mixins = {'CreateGUIDObject', 'RegisterPrune', 'PruneGUIDCache', 'UpdateGUID', 'IsGUID', 'GetGroupGuid'}
|
||||
--[[
|
||||
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 function assocOwner(guid, petguid)
|
||||
local gio = lib:CreateGUIDObject({guid})
|
||||
local gip = lib:CreateGUIDObject({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 lib:GetGroupGuid(guids)
|
||||
guids = guids or {}
|
||||
local grpguids = {}
|
||||
if(IsInRaid()) then
|
||||
grpguids = group_helper(grpguids, MAX_RAID_MEMBERS, 'raid')
|
||||
elseif(IsInGroup()) then
|
||||
grpguids = group_helper(grpguids, 4, 'party')
|
||||
local guid = UnitGUID('player')
|
||||
if(guid) then
|
||||
grpguids[guid] = true
|
||||
local petguid = UnitGUID('pet')
|
||||
if(petguid) then
|
||||
assocOwner(guid, petguid)
|
||||
grpguids[petguid] = true
|
||||
end
|
||||
end
|
||||
else
|
||||
local guid = UnitGUID('player')
|
||||
if(guid) then
|
||||
grpguids[guid] = true
|
||||
local petguid = UnitGUID('pet')
|
||||
if(petguid) then
|
||||
assocOwner(guid, petguid)
|
||||
grpguids[petguid] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
for guid, v in pairs(grpguids) do
|
||||
local plr = self:CreateGUIDObject(guid)
|
||||
plr['isParty'] = true
|
||||
guids[guid] = true
|
||||
end
|
||||
return guids
|
||||
end
|
||||
lib.events = lib.events or CreateFrame("FRAME")
|
||||
local events = lib.events
|
||||
local roster = {}
|
||||
function events:RAID_ROSTER_UPDATE(event,...)
|
||||
-- print(event)
|
||||
roster = lib:GetGroupGuid()
|
||||
end
|
||||
function events:GROUP_ROSTER_UPDATE(event,...)
|
||||
-- print(event)
|
||||
roster = lib:GetGroupGuid()
|
||||
end
|
||||
function events:UNIT_TARGET(event, unit)
|
||||
--print(event)
|
||||
local trg = format("%starget", unit)
|
||||
local guid = UnitGUID(trg)
|
||||
if(guid) then
|
||||
local _, class = UnitClass(trg)
|
||||
-- print(class)
|
||||
-- local fullName, realm = UnitFullName(trg)
|
||||
local gi = lib:CreateGUIDObject({guid,['class'] = class, ['unit'] = trg})
|
||||
if(gi['isBoss'] == nil) then
|
||||
local clf = UnitClassification(trg)
|
||||
-- print(trg, clf, UnitLevel(trg))
|
||||
gi['isBoss'] = false
|
||||
if(clf == 'elite') then
|
||||
if(UnitLevel(trg) == -1) then
|
||||
gi['isBoss'] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function events:UNIT_NAME_UPDATE(event, unit)
|
||||
if(strsub(unit,1,9) == 'nameplate') then
|
||||
return
|
||||
end
|
||||
print(event, unit, UnitName(unit),strsub(unit,1,9))
|
||||
local gi = lib:CreateGUIDObject(UnitGUID(unit))
|
||||
if(gi) then
|
||||
gi:SetName(UnitName(unit))
|
||||
end
|
||||
end
|
||||
for event, func in pairs(events) do
|
||||
-- if(not events:IsRegistered(event)) then
|
||||
if(type(func) == 'function') then
|
||||
events:RegisterEvent(event)
|
||||
end
|
||||
-- end
|
||||
end
|
||||
events:SetScript("OnEvent", function(self, event, ...)
|
||||
self[event](self, event, ...)
|
||||
end)
|
||||
local scanIds = { 1, 2, 3, 7, 9, 26, 29}
|
||||
lib.scanTip = lib.scanTip or CreateFrame("GameTooltip", "LibGUID_ScanTooltip", nil, "GameTooltipTemplate")
|
||||
local scanTip = lib.scanTip
|
||||
scanTip:SetOwner( WorldFrame, "ANCHOR_NONE" )
|
||||
lib.mixinTargets = lib.mixinTargets or {}
|
||||
lib.guidCache = lib.guidCache or {}
|
||||
lib.pruneInfo = lib.pruneInfo or {}
|
||||
lib.newGUID = lib.newGUID or {}
|
||||
local guidCache = lib.guidCache
|
||||
local pruneInfo = lib.pruneInfo
|
||||
local newGUID = lib.newGUID
|
||||
local guidTypes = {
|
||||
["Player"] = true,
|
||||
["Creature"] = true,
|
||||
|
@ -15,6 +177,29 @@ local guidTypes = {
|
|||
["Vehicle"] = true,
|
||||
["Vignette"] = true
|
||||
}
|
||||
local function scanTooltip(guid)
|
||||
local text = _G["LibGUID_ScanTooltipTextLeft2"]
|
||||
if(guid and text) then
|
||||
scanTip:SetOwner(WorldFrame, 'ANCHOR_NONE')
|
||||
scanTip:SetHyperlink('unit:' .. guid or '')
|
||||
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")
|
||||
if(string.find(text2, check)) then
|
||||
local a,b,c = string.find(text2, check)
|
||||
if(c) then
|
||||
local g = UnitGUID(c)
|
||||
if(g) then
|
||||
return g
|
||||
end
|
||||
end
|
||||
end
|
||||
-- print(text:GetText(), check, guid)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
local function isGUID(guid)
|
||||
if(guid) then
|
||||
local typ = strsplit("-", guid)
|
||||
|
@ -23,14 +208,57 @@ local function isGUID(guid)
|
|||
end
|
||||
end
|
||||
end
|
||||
lib.isGUID = isGUID
|
||||
local function fireNewGUID(guid)
|
||||
for k, v in pairs(newGUID) do
|
||||
k[v](k, guid)
|
||||
end
|
||||
end
|
||||
function guid_methods:Touch()
|
||||
self['lastModified'] = GetTime()
|
||||
end
|
||||
function guid_methods:SetUnit(unit)
|
||||
local unitName, unitRealm = UnitFullName(unit)
|
||||
local _, unitClass = UnitClass(unit)
|
||||
if(unitName) then
|
||||
self['name'] = unitName
|
||||
end
|
||||
if(unitRealm) then
|
||||
self['realm'] = unitRealm
|
||||
end
|
||||
if(unitClass) then
|
||||
self['class'] = unitClass
|
||||
end
|
||||
self['unit'] = unit
|
||||
end
|
||||
function guid_methods:SetName(newName)
|
||||
self[2] = newName
|
||||
local nameSplit, serverSplit = strsplit('-',self[2],2)
|
||||
if(not serverSplit) then
|
||||
serverSplit = GetNormalizedRealmName()
|
||||
end
|
||||
self['shortName'] = nameSplit
|
||||
self['shortRealm'] = serverSplit
|
||||
end
|
||||
function guid_methods:HasOwner()
|
||||
return self['ownerGuid'] and true or false
|
||||
end
|
||||
function guid_methods:SetOwner(gi)
|
||||
-- print("set owner", self['name'], gi['name'])
|
||||
|
||||
self['isPet'] = true
|
||||
if(gi) then
|
||||
self['ownerName'] = gi[2]
|
||||
self['ownerGuid'] = gi[1]
|
||||
if(gi:IsParty())then
|
||||
self['isParty'] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
function guid_methods:Refresh()
|
||||
if(self['type'] == 'Player') then
|
||||
local localizedClass, englishClass, localizedRace, englishRace, sex, name, realm = GetPlayerInfoByGUID(self[1])
|
||||
if(name and name ~= self['name']) then
|
||||
self[2] = name
|
||||
self['localizedClass'] = localizedClass
|
||||
self['englishClass'] = englishClass
|
||||
self['localizedRace'] = localizedRace
|
||||
|
@ -39,9 +267,47 @@ function guid_methods:Refresh()
|
|||
self['name'] = name
|
||||
self['realm'] = realm
|
||||
end
|
||||
else
|
||||
if(self['isPet'] == nil) then
|
||||
self['ownerGuid'] = scanTooltip(self[1])
|
||||
if(self['ownerGuid']) then
|
||||
self['isPet'] = true
|
||||
local owner = lib:CreateGUIDObject(self['ownerGuid'])
|
||||
if(owner) then
|
||||
self['ownerName'] = owner[2] or "<Unknown>"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
self:Touch()
|
||||
end
|
||||
function guid_methods:IsParty()
|
||||
if(not roster[self[1]] and self[3]) then
|
||||
-- print(self[2], self[3],bit.band(self[3], COMBATLOG_OBJECT_AFFILIATION_OUTSIDER))
|
||||
if(bit.band(self[3], COMBATLOG_OBJECT_AFFILIATION_OUTSIDER) == 0) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return roster[self[1]]
|
||||
end
|
||||
local namespace_methods = namespace_methods or {}
|
||||
function namespace_methods:GetNamespace(ns)
|
||||
ns = format("namespace_%s", ns)
|
||||
self[ns] = self[ns] or {}
|
||||
for k, v in pairs(namespace_methods) do
|
||||
self[ns][k] = v
|
||||
end
|
||||
end
|
||||
function namespace_methods:Get(setting)
|
||||
return self[setting]
|
||||
end
|
||||
function namespace_methods:Set(setting, value)
|
||||
self[setting] = value
|
||||
end
|
||||
guid_methods.GetNamespace = namespace_methods.GetNamespace
|
||||
function lib:IsGUID(guid)
|
||||
return isGUID(guid)
|
||||
end
|
||||
function lib:CreateGUIDObject(obj)
|
||||
if(obj) then
|
||||
if(type(obj) == 'string') then
|
||||
|
@ -57,35 +323,69 @@ function lib:CreateGUIDObject(obj)
|
|||
end
|
||||
obj:Refresh()
|
||||
guidCache[guid] = obj
|
||||
fireNewGUID(guid)
|
||||
end
|
||||
else
|
||||
return guidCache[guid]
|
||||
for k, v in pairs(obj) do
|
||||
if(type(v) ~= 'table') then
|
||||
guidCache[guid][k] = v
|
||||
end
|
||||
end
|
||||
obj = guidCache[guid]
|
||||
end
|
||||
return guidCache[guid]
|
||||
end
|
||||
end
|
||||
function lib:RegisterPrune(funcName)
|
||||
pruneInfo[self] = funcName
|
||||
function lib:RegisterNewGUID(func)
|
||||
newGUID[self] = func
|
||||
end
|
||||
function lib:RegisterPrune(func)
|
||||
pruneInfo[self] = func
|
||||
end
|
||||
function lib:UpdateGUID(guid, data)
|
||||
if(not data and type(guid) == 'table') then
|
||||
data = guid
|
||||
guid = data[1]
|
||||
end
|
||||
if(guid and data) then
|
||||
if(not guidCache[guid]) then
|
||||
guidCache[guid] = self:CreateGUIDObject(data)
|
||||
else
|
||||
for k, v in pairs(data) do
|
||||
guidCache[guid][k] = v
|
||||
end
|
||||
end
|
||||
return guidCache[guid]
|
||||
end
|
||||
end
|
||||
function lib:PruneGUIDCache(maxAge)
|
||||
for k, v in pairs(pruneInfo) do
|
||||
k[v]()
|
||||
-- print("pi",k,v)
|
||||
v(k)
|
||||
end
|
||||
local maxAge = maxAge or 360
|
||||
local t = GetTime() - maxAge
|
||||
local del = 0
|
||||
local cnt = 0
|
||||
for guid, obj in pairs(guidCache) do
|
||||
cnt = cnt + 1
|
||||
if(obj['lastModified'] < t) then
|
||||
guidCache[guid] = nil
|
||||
del = del + 1
|
||||
end
|
||||
end
|
||||
-- print("del", cnt, "/", del)
|
||||
end
|
||||
for guid, obj in pairs(guidCache)do
|
||||
obj:Refresh()
|
||||
end
|
||||
function lib:Embed(target)
|
||||
for _,name in pairs(mixins) do
|
||||
target[name] = lib[name]
|
||||
end
|
||||
lib.mixinTargets[target] = true
|
||||
target = target or CreateFrame("FRAME")
|
||||
for _,name in pairs(mixins) do
|
||||
target[name] = lib[name]
|
||||
end
|
||||
lib.mixinTargets[target] = true
|
||||
return target
|
||||
end
|
||||
for target, _ in pairs(lib.mixinTargets) do
|
||||
lib:Embed(target)
|
||||
|
|
Loading…
Reference in New Issue