![Цитата](images/wow-circle/misc/quote_icon.png)
Сообщение от
pavvvel
ну и какой же сделал аддон великий
Там методы поиска унылые, вот и прыгают ауры либо вызывают фризы когда много обработаных плейтов.
- - - Updated - - -
![Цитата](images/wow-circle/misc/quote_icon.png)
Сообщение от
pavvvel
можешь ли ты сделать аддон, который бы помещал писечку над фреймами ретриков? ))
Та изи , веришь, нет?
- - - Updated - - -
Крольчонок если увидишь , что быстрее работать будет?
PHP код:
local handler = CreateFrame"frame"
local Modules, module = {}, {__index = {}}
local new, del
do
local cache = setmetatable({}, {__mode='k'})
new = function(...)
local t = next(cache)
if t then
cache[t] = nil
for i = 1, select('#', ...) do
t[i] = select(i, ...)
end
return t
else
return {...}
end
end
del = function(t)
for k in pairs(t) do
t[k] = nil
end
cache[t] = true
return nil
end
end
function module.__index:RegisterEvent(event, method)
if not method then
method = event
end
if type(method) == "string" and type(self[method]) ~= "function" then
error("Не возможно зарегистрировать событие %s для метода %s", event, method)
else
assert(type(method) == "function" or type(method) == "string")
end
if not handler[event] then
handler[event] = new()
handler:RegisterEvent(event)
end
handler[event][self] = method
end
function module.__index:UnregisterEvent(event)
if handler[event] and handler[event][self] then
handler[event][self] = nil
if not next(handler[event]) then
handler[event] = del(handler[event])
handler:UnregisterEvent(event)
end
else
error("Не удается отменить регистрацию события %s. %s не зарегистрирован с ним.", event, self)
end
end
function module.__index:UnregisterAllEvents()
for event, data in pairs(handler) do
local x = data[self]
data[self] = nil
if x then
if not next(data) then
handler[event] = del(handler[event])
handler:UnregisterEvent(event)
end
end
end
end
handler:SetScript("OnEvent", function(self, event, ...)
if not self[event] or not next(self[event]) then
return
end
local tmp = new()
if self[event] then
for obj, method in pairs(self[event]) do
tmp[obj] = method
end
local obj = next(tmp)
while obj do
local method = tmp[obj]
local t = type(method)
if t == "string" then
local obj_method = obj[method]
if obj_method then
local success, err = pcall(obj_method, obj, ...)
if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end
end
elseif t == "function" then
local success, err = pcall(method, obj, event, ...)
if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end
else
-- error("Не возможно обработать событие %s , %s, это не метод и не функция (%s).", event, obj, method, t)
end
tmp[obj] = nil
obj = next(tmp)
end
end
tmp = del(tmp)
end)
Или
PHP код:
do
local RegisterEvent = frame_metatable.__index.RegisterEvent
function frame_metatable.__index:RegisterEvent(event, func)
if(type(func) == 'string' and type(self[func]) == 'function') then
func = self[func]
end
local curev = self.events[event]
if(not curev) then
self.events[event] = {}
table.insert(self.events[event], func)
elseif(type(curev) == 'table') then
table.insert(self.events[event], func)
end
if not self:IsEventRegistered(event) then
RegisterEvent(self, event)
end
end
local UnregisterEvent = frame_metatable.__index.UnregisterEvent
function frame_metatable.__index:UnregisterEvent(event, func)
local curev = self.events[event]
if(curev and func) then
for k, infunc in next, curev do
if(infunc == func) then
curev[k] = nil
if(#curev == 0) then
table.remove(curev, k)
UnregisterEvent(self, event)
end
break
end
end
end
end
end
local OnEvent = function(self, event, ...)
local tbl = self.events[event]
if tbl then
for i = 1, #tbl do
tbl[i](self, event, ...)
end
end
end
Или же полность через метаметоды делать ... Цель получить обратные вызовы с возможностью регистрировать бесконечное множество методов на обработчик 1 ивента.