You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
5.6 KiB
229 lines
5.6 KiB
-- Core v1.4
|
|
local ADDON, Addon = ...
|
|
|
|
local Listener = CreateFrame('Frame', ADDON .. 'Listener')
|
|
local EventListeners = {}
|
|
local function Addon_OnEvent(frame, event, ...)
|
|
if EventListeners[event] then
|
|
for callback, func in pairs(EventListeners[event]) do
|
|
if func == 0 then
|
|
callback[event](callback, ...)
|
|
else
|
|
callback[func](callback, event, ...)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Listener:SetScript('OnEvent', Addon_OnEvent)
|
|
function Addon:RegisterEvent(event, callback, func)
|
|
if func == nil then func = 0 end
|
|
if EventListeners[event] == nil then
|
|
Listener:RegisterEvent(event)
|
|
EventListeners[event] = { [callback]=func }
|
|
else
|
|
EventListeners[event][callback] = func
|
|
end
|
|
end
|
|
|
|
function Addon:UnregisterEvent(event, callback)
|
|
local listeners = EventListeners[event]
|
|
if listeners then
|
|
local count = 0
|
|
for index,_ in pairs(listeners) do
|
|
if index == callback then
|
|
listeners[index] = nil
|
|
else
|
|
count = count + 1
|
|
end
|
|
end
|
|
if count == 0 then
|
|
EventListeners[event] = nil
|
|
Listener:UnregisterEvent(event)
|
|
end
|
|
end
|
|
end
|
|
|
|
local AddOnListeners = {}
|
|
function Addon:ADDON_LOADED(name)
|
|
if AddOnListeners[name] then
|
|
for callback, func in pairs(AddOnListeners[name]) do
|
|
if func == 0 then
|
|
callback[name](callback)
|
|
else
|
|
callback[func](callback, name)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Addon:RegisterAddOnLoaded(name, callback, func)
|
|
if func == nil then func = 0 end
|
|
if IsAddOnLoaded(name) then
|
|
if func == 0 then
|
|
callback[name](callback)
|
|
else
|
|
callback[func](callback, name)
|
|
end
|
|
else
|
|
self:RegisterEvent('ADDON_LOADED', self)
|
|
if AddOnListeners[name] == nil then
|
|
AddOnListeners[name] = { [callback]=func }
|
|
else
|
|
AddOnListeners[name][callback] = func
|
|
end
|
|
end
|
|
end
|
|
|
|
function Addon:UnregisterAddOnLoaded(name, callback)
|
|
local listeners = AddOnListeners[name]
|
|
if listeners then
|
|
local count = 0
|
|
for index,_ in pairs(listeners) do
|
|
if index == callback then
|
|
listeners[index] = nil
|
|
else
|
|
count = count + 1
|
|
end
|
|
end
|
|
if count == 0 then
|
|
AddOnListeners[name] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
function Addon:UnregisterEvent(event, callback)
|
|
local listeners = EventListeners[event]
|
|
if listeners then
|
|
local count = 0
|
|
for index,_ in pairs(listeners) do
|
|
if index == callback then
|
|
listeners[index] = nil
|
|
else
|
|
count = count + 1
|
|
end
|
|
end
|
|
if count == 0 then
|
|
EventListeners[event] = nil
|
|
Listener:UnregisterEvent(event)
|
|
end
|
|
end
|
|
end
|
|
|
|
local CommStarted = false
|
|
local CommListeners = {}
|
|
function Addon:RegisterAddOnComm(prefix, callback, func)
|
|
if func == nil then func = 0 end
|
|
|
|
if not CommStarted then
|
|
C_ChatInfo.RegisterAddonMessagePrefix(Addon.ShortName)
|
|
self:RegisterEvent('CHAT_MSG_ADDON', self)
|
|
CommStarted = true
|
|
end
|
|
if CommListeners[prefix] == nil then
|
|
CommListeners[prefix] = { [callback]=func }
|
|
else
|
|
CommListeners[prefix][callback] = func
|
|
end
|
|
end
|
|
|
|
function Addon:UnregisterAddOnComm(prefix, callback)
|
|
local listeners = CommListeners[prefix]
|
|
if listeners then
|
|
local count = 0
|
|
for index,_ in pairs(listeners) do
|
|
if index == callback then
|
|
listeners[index] = nil
|
|
else
|
|
count = count + 1
|
|
end
|
|
end
|
|
if count == 0 then
|
|
CommListeners[prefix] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
function Addon:SendAddOnComm(prefix, message, type, target)
|
|
if (type == "PARTY" and not IsInGroup(LE_PARTY_CATEGORY_HOME))
|
|
or (type == "INSTANCE" and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE)) then
|
|
return false
|
|
end
|
|
local data = prefix.."|"..message
|
|
C_ChatInfo.SendAddonMessage(Addon.ShortName, data, type, target)
|
|
return true
|
|
end
|
|
|
|
function Addon:CHAT_MSG_ADDON(prefix, message, type, sender)
|
|
if prefix == Addon.ShortName then
|
|
for prefix,listeners in pairs(CommListeners) do
|
|
local matcher = prefix.."|"
|
|
if string.sub(message, 1, #matcher) == matcher then
|
|
local data = string.sub(message, #matcher + 1)
|
|
for callback,func in pairs(listeners) do
|
|
if func == 0 then
|
|
callback.ReceiveAddOnComm(callback, data, type, sender)
|
|
else
|
|
callback[func](callback, data, type, sender)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local ModulePrototype = {}
|
|
function ModulePrototype:RegisterEvent(event, func)
|
|
Addon:RegisterEvent(event, self, func)
|
|
end
|
|
function ModulePrototype:UnregisterEvent(event)
|
|
Addon:UnregisterEvent(event, self)
|
|
end
|
|
function ModulePrototype:RegisterAddOnComm(func)
|
|
Addon:RegisterAddOnComm(self.Name, self, func)
|
|
end
|
|
function ModulePrototype:UnregisterAddOnComm()
|
|
Addon:UnregisterAddOnComm(self.Name, self)
|
|
end
|
|
function ModulePrototype:SendAddOnComm(message, type, target)
|
|
Addon:SendAddOnComm(self.Name, message, type, target)
|
|
end
|
|
function ModulePrototype:RegisterAddOnLoaded(name, func)
|
|
Addon:RegisterAddOnLoaded(name, self, func)
|
|
end
|
|
function ModulePrototype:UnregisterAddOnLoaded(name)
|
|
Addon:UnregisterAddOnLoaded(name, self)
|
|
end
|
|
Addon.ModulePrototype = ModulePrototype
|
|
|
|
Addon.Modules = {}
|
|
function Addon:NewModule(name)
|
|
local object = {}
|
|
self.Modules[name] = object
|
|
table.insert(self.Modules, object)
|
|
setmetatable(object, {__index=ModulePrototype})
|
|
object.Name = name
|
|
return object
|
|
end
|
|
setmetatable(Addon, {__index = Addon.Modules})
|
|
|
|
function Addon:ForAllModules(event, ...)
|
|
for _, module in ipairs(Addon.Modules) do
|
|
if type(module) == 'table' and module[event] then
|
|
module[event](module, ...)
|
|
end
|
|
end
|
|
end
|
|
|
|
Addon:RegisterEvent('PLAYER_ENTERING_WORLD', Addon)
|
|
function Addon:PLAYER_ENTERING_WORLD()
|
|
self:ForAllModules('BeforeStartup')
|
|
self:ForAllModules('Startup')
|
|
self:ForAllModules('AfterStartup')
|
|
|
|
self:UnregisterEvent('PLAYER_ENTERING_WORLD', self)
|
|
end
|
|
|
|
Addon.Name = GetAddOnMetadata(ADDON, "Title")
|
|
Addon.ShortName = GetAddOnMetadata(ADDON, "X-Short-Name") or string.sub(ADDON, 1, 16)
|
|
Addon.Version = GetAddOnMetadata(ADDON, "X-Packaged-Version")
|
|
_G[ADDON] = Addon
|
|
|