Цитата Сообщение от pavvvel Посмотреть сообщение
ну и какой же сделал аддон великий
Там методы поиска унылые, вот и прыгают ауры либо вызывают фризы когда много обработаных плейтов.

- - - Updated - - -

Цитата Сообщение от pavvvel Посмотреть сообщение
можешь ли ты сделать аддон, который бы помещал писечку над фреймами ретриков? ))
Та изи , веришь, нет?

- - - Updated - - -

Крольчонок если увидишь , что быстрее работать будет?

PHP код:
local handler CreateFrame"frame"

local Modulesmodule = {}, {__index = {}}

local new, del
do
    
local cache setmetatable({}, {__mode='k'})
    new = function(...)
        
local t next(cache)
        if 
t then
            cache
[t] = nil
            
for 1select('#', ...) 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(eventmethod)
    if 
not method then
        method 
event
    end
    
    
if type(method) == "string" and type(self[method]) ~= "function" then
        error
("Не возможно зарегистрировать событие %s для метода %s"eventmethod)
    else
        
assert(type(method) == "function" or type(method) == "string")
    
end

    
if not handler[eventthen
        handler
[event] = new()
        
handler:RegisterEvent(event)
    
end

    handler
[event][self] = method
end

function module.__index:UnregisterEvent(event)
    if 
handler[event] and handler[event][selfthen
        handler
[event][self] = nil
        
if not next(handler[event]) then
            handler
[event] = del(handler[event])
            
handler:UnregisterEvent(event)
        
end
    
else
        
error("Не удается отменить регистрацию события %s. %s не зарегистрирован с ним."eventself)
    
end
end

function module.__index:UnregisterAllEvents()
    for 
eventdata in pairs(handler) do
        
local x data[self]
        
data[self] = nil
        
if x then
            
if not next(datathen
                handler
[event] = del(handler[event])
                
handler:UnregisterEvent(event)
            
end
        end
    end
end

handler
:SetScript("OnEvent", function(selfevent, ...)
    if 
not self[event] or not next(self[event]) then
        
return
    
end
    
    local tmp 
= new()
    
    if 
self[eventthen
        
for objmethod 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 
== "string" then
                local obj_method 
obj[method]
                if 
obj_method then
                    local success
err pcall(obj_methodobj, ...)
                    if 
not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. errend
                end
            
elseif == "function" then
                local success
err pcall(methodobjevent, ...)
                if 
not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. errend
            
else
                -- 
error("Не возможно обработать событие %s , %s, это не метод и не функция (%s)."eventobjmethodt)
            
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(eventfunc)
        if(
type(func) == 'string' and type(self[func]) == 'function'then
            func 
self[func]
        
end
        
        local curev 
self.events[event]
        if(
not curevthen
            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(eventthen
            RegisterEvent
(selfevent)
        
end
    end

    local UnregisterEvent 
frame_metatable.__index.UnregisterEvent
    
function frame_metatable.__index:UnregisterEvent(eventfunc)
        
local curev self.events[event]
        if(
curev and functhen
            
for kinfunc in nextcurev do
                if(
infunc == functhen
                    curev
[k] = nil

                    
if(#curev == 0) then
                        
table.remove(curevk)
                        
UnregisterEvent(selfevent)
                    
end

                    
break
                
end
            end
        end
    end
end

local OnEvent 
= function(selfevent, ...)
    
local tbl self.events[event]
    if 
tbl then
        
for 1#tbl do
            
tbl[i](selfevent, ...)
        
end
    end
end 
Или же полность через метаметоды делать ... Цель получить обратные вызовы с возможностью регистрировать бесконечное множество методов на обработчик 1 ивента.