stoneharry

Untitled

Nov 12th, 2013
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.40 KB | None | 0 0
  1.  
  2. local pairs, wipe, select, pcall = pairs, wipe, select, pcall
  3. local GetFramesRegisteredForEvent = GetFramesRegisteredForEvent
  4. local enteredOnce, listenForUnreg
  5.  
  6. local occured = {}
  7. local events = {
  8.     SPELLS_CHANGED = {},
  9.     USE_GLYPH = {},
  10.     PET_TALENT_UPDATE = {},
  11.     WORLD_MAP_UPDATE = {},
  12.     UPDATE_WORLD_STATES = {},
  13.     CRITERIA_UPDATE = {},
  14.     RECEIVED_ACHIEVEMENT_LIST = {},
  15.     ACTIONBAR_SLOT_CHANGED = {},
  16. }
  17.  
  18. local t = {GetFramesRegisteredForEvent("PLAYER_ENTERING_WORLD")}
  19. for i, frame in ipairs(t) do
  20.     frame:UnregisterEvent("PLAYER_ENTERING_WORLD")
  21. end
  22.  
  23. local f = CreateFrame("Frame")
  24. f:RegisterEvent("PLAYER_ENTERING_WORLD")
  25.  
  26. for i, frame in ipairs(t) do
  27.     frame:RegisterEvent("PLAYER_ENTERING_WORLD")
  28. end
  29. wipe(t)
  30. t = nil
  31.  
  32. local function unregister(event, ...)
  33.     for i = 1, select("#", ...) do
  34.         local frame = select(i, ...)
  35.         frame:UnregisterEvent(event)
  36.         events[event][frame] = 1
  37.     end
  38. end
  39.  
  40. if PetStableFrame then
  41.     PetStableFrame:UnregisterEvent("SPELLS_CHANGED")
  42. end
  43.  
  44. f:SetScript("OnEvent", function(self, event)
  45.         if event == "PLAYER_ENTERING_WORLD" then
  46.         collectgarbage("restart")
  47.             if not enteredOnce then
  48.                 f:RegisterEvent("PLAYER_LEAVING_WORLD")
  49.  
  50.                 hooksecurefunc(getmetatable(f).__index, "UnregisterEvent", function(frame, event)
  51.                         if listenForUnreg then
  52.                             local frames = events[event]
  53.                             if frames then
  54.                                 frames[frame] = nil
  55.                             end
  56.                         end
  57.                 end)
  58.                 enteredOnce = 1
  59.             else
  60.                 listenForUnreg = nil
  61.                 for event, frames in pairs(events) do
  62.                     for frame in pairs(frames) do
  63.                         frame:RegisterEvent(event)
  64.                         local OnEvent = occured[event] and frame:GetScript("OnEvent")
  65.                         if OnEvent then
  66.                             local arg1
  67.                             if event == "ACTIONBAR_SLOT_CHANGED" then
  68.                                 arg1 = 0
  69.                             end
  70.                             local success, err = pcall(OnEvent, frame, event, arg1)
  71.                             if not success then
  72.                                 geterrorhandler()(err, 1)
  73.                             end
  74.                         end
  75.                         frames[frame] = nil
  76.                     end
  77.                 end
  78.                 wipe(occured)
  79.             end
  80.         elseif event == "PLAYER_LEAVING_WORLD" then
  81.             wipe(occured)
  82.             for event in pairs(events) do
  83.                 unregister(event, GetFramesRegisteredForEvent(event))
  84.                 f:RegisterEvent(event)
  85.             end
  86.             listenForUnreg = 1
  87.             collectgarbage("stop")
  88.         else
  89.             occured[event] = 1
  90.             f:UnregisterEvent(event)
  91.         end
  92. end)
  93.  
  94. -- Improves loading time by 40-70%
  95. -- stops garbage collection during loading screens & tweaks events
Advertisement
Add Comment
Please, Sign In to add comment