vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[

ntmysFixLoadingTimes (v13 /apr /06)
-----------------------------------

Improves loading-times between zoning (ie: switching continents, entering/leaving an instance).
This works by preventing numerous events from being processed by the event-handlers during zoning,
events that would otherwise update your interface with information that you simply won't need
when you are starring at a loading-screen. Depending on your system and installed addons, zoning
will be 5-10 times faster (no kidding: for me as an example, MC loads in 6-8s instead of over 1 minute).

use /nFLT to cycle between different modes:

on (with messages) - the default
on (without messages)
off (with messages)
off

With messages, it shows how long zoning took and how many events had been processed.
When using [off (with messages)] you can see how much time passes when all events are being processed,
so you can compare your loading times with and without FLT turned on.

A big Thankyou to Tigerheart for pointing out the events-slowering-loading-times-during-zoning-problem on the
official interface-forum.

Christopher "ntmy" Steglich (dantmy@gmx.net)


Version History
---------------
v13/apr/06
 - working on all frames now and thus blocking a few more events
 - code optimization

 v12/apr/06
 - fixed slashes in french localization
 - french localization by RaSk

 v11/apr/06
 - initial release

]]--
local Title = "ntmysFixLoadingTimes (v13 /apr /06)";

ntmysFLT_isActive = 1; -- default is on with messages

function ntmysFLT_OnLoad()
        DEFAULT_CHAT_FRAME:AddMessage(Title..NFLT_TITLEUSAGE,1,1,0.5);

        SlashCmdList["NFLT"] = function(msg)
                ntmysFLT_isActive = mod(ntmysFLT_isActive+1,4);
                DEFAULT_CHAT_FRAME:AddMessage(NFLT_SETTING[ntmysFLT_isActive+1],1,1,0.5);
                ntmysFLT_setMode();
        end
        SLASH_NFLT1 = "/nFLT";
        
        this:RegisterEvent("VARIABLES_LOADED");
end

local ntmysFLT_PLW_Time = nil;

function ntmysFLT_OnEvent()
        if(event == "VARIABLES_LOADED") then
                ntmysFLT_setMode();
        end
        if(event == "PLAYER_ENTERING_WORLD") then
                if(not ntmysFLT_PLW_Time) then return; end -- first time entering world
                
                if(ntmysFLT_isActive == 1 or ntmysFLT_isActive == 2) then
                        ntmysFLT_RestoreOnEvents();
                end
                
                if(ntmysFLT_isActive == 2) then return; end -- no messages
                
                local time = GetTime() - ntmysFLT_PLW_Time;
                DEFAULT_CHAT_FRAME:AddMessage(NFLT_ZONECHANGE..(floor(time*10)/10).."s",1,0.8,0.2);

                if(ntmysFLT_isActive == 3) then return; end -- off, no events counted
                                
                DEFAULT_CHAT_FRAME:AddMessage(NFLT_PROCEVENTS..ntmysFLT_PassedEvents.."/"..ntmysFLT_AllEvents,1,0.8,0.2);
        end
        if(event == "PLAYER_LEAVING_WORLD") then
                ntmysFLT_PLW_Time = GetTime();
                if(ntmysFLT_isActive == 3) then return; end -- off 
                
                ntmysFLT_KillOnEvents();
        end
end

function ntmysFLT_setMode()
        if(ntmysFLT_isActive > 0) then
                ntmysFLT_Frame:RegisterEvent("PLAYER_ENTERING_WORLD");
                ntmysFLT_Frame:RegisterEvent("PLAYER_LEAVING_WORLD");
        else
                ntmysFLT_Frame:UnregisterEvent("PLAYER_ENTERING_WORLD");
                ntmysFLT_Frame:UnregisterEvent("PLAYER_LEAVING_WORLD");
        end
end

function ntmysFLT_KillOnEvents()
        ntmysFLT_AllEvents = 0;
        ntmysFLT_PassedEvents = 0;
        local f = EnumerateFrames();
        local OnEvent;
        while f do
                OnEvent = f:GetScript("OnEvent");
                if(OnEvent) then
                        f.ntmysFLT_OnEvent = OnEvent;
                        -- some events still need to be checked
                        f:SetScript("OnEvent", function()
                                        if(event == "PLAYER_ENTERING_WORLD" or
                                                event == "PLAYER_TARGET_CHANGED" or
                                                event == "PLAYER_LOGOUT" or
                                                string.sub(event,0,4) == "CHAT") then
                                                this.ntmysFLT_OnEvent();
                                                ntmysFLT_PassedEvents = ntmysFLT_PassedEvents +1;
                                        end
                                        ntmysFLT_AllEvents = ntmysFLT_AllEvents +1;
                                end
                        );
                end
                f = EnumerateFrames(f);
        end     
end

function ntmysFLT_RestoreOnEvents()
        local f = EnumerateFrames();
        while f do
                if(f.ntmysFLT_OnEvent) then
                        f:SetScript("OnEvent",f.ntmysFLT_OnEvent);
                        f.ntmysFLT_OnEvent = nil;
                end
                f = EnumerateFrames(f);
        end
end

Generated by GNU Enscript 1.6.5.90.