vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

--Kills To Level : Titan Enabled
--Craig Willis
--17/05/05

local TITAN_KTL_ID = "KTL";

KTL_Version="0.53";
usingT = 0;        --for Titan check
usingF = 0;              --for Fubar check
KTL_XP = 0;
KTL_MAXXP = 0;         --Needed to remove calc error when leveling
KTL_LITTLE_R = 0;  --Needed to remove calc error when low rested.
KTL_COMBAT = 0;
KTL_SMALL = 0;

--Loading Functs
function TitanPanelKTLButton_OnLoad()
        this.registry = {
                id = TITAN_KTL_ID,
                menuText = TITAN_KTL_MENU_TEXT,
                buttonTextFunction = "TitanPanelKTLButton_GetButtonText", 
                tooltipTitle = TITAN_KTL_TOOLTIP, 
                savedVariables = {
                        ShowLabelText = 1,
                }
        };      
        usingT=1;                       --Set to 1 when titan is available, 0 when no titan
end

function TitanPanelKTLButton_OnEvent()
        TitanPanelButton_UpdateButton(TITAN_KTL_ID);            
end

function Fubar_OnLoad()
        
        KillsToLevelFu = FuBarPlugin:new {
                name = "FuBar - KillsToLevelFu",
                desc = "Simple calculation mod that used the xp gained, to calculate kills to level",
                version = KTL_VERSION,
                aceCompatible = 103,
                fuCompatible = 102, 
                author = "Willister",
                email = "willister@hotmail.com",
                website = "http://ui.worldofwar.net/ui.php?id=746",
                category = "others",            
                db= AceDatabase:new("KillsToLevelFu"),
                hasIcon = false,
            textFrame = "",
        }               

        function KillsToLevelFu:UpdateText(string)
                if (string~=null) then
                         self:SetText(string)
                else
                     local label, text = KTL_TextUpdate();
                     self:SetText(label..text)
                end
        end
        
        function KillsToLevelFu:OnClick()
                 KTL_LabelChange();
                 local label, text = KTL_TextUpdate();
             KillsToLevelFu:UpdateText(label..text);
        end
        
        KillsToLevelFu:RegisterForLoad()
        usingF = 1;
end

function KillMod_OnLoad()
        KTLOnLoad();
end

function KillMod_OnEvent()
   KTLOnEvent();   
end

--Titan Functs
function TitanPanelKTLButton_GetButtonText(id)
        local labelText, valueText = KTL_TextUpdate();
        return labelText, TitanUtils_GetHighlightText(valueText);
end


function TitanPanelRightClickMenu_PrepareKTLMenu()
        TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_KTL_ID].menuText);
        TitanPanelRightClickMenu_AddToggleLabelText(TITAN_KTL_ID);
        TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_KTL_ID, TITAN_PANEL_MENU_FUNC_HIDE);
end

function TitanPanelKTLButton_OnClick()
        KTL_LabelChange();
    TitanPanelButton_UpdateButton(TITAN_KTL_ID);       
end


--KTL functions
function KTLOnLoad()
   SlashCmdList["KILLCOMMAND"] = KillMod_SlashHandler;
   SLASH_KILLCOMMAND1 = "/Kill";
   SLASH_KILLCOMMAND1 = "/ktl";

        
  this:RegisterEvent("VARIABLES_LOADED");  --Set hook if needed and check chat frame
  this:RegisterEvent("PLAYER_XP_UPDATE");
  this:RegisterEvent("QUEST_FINISHED");
  this:RegisterEvent("PLAYER_LEAVE_COMBAT");
  this:RegisterEvent("PLAYER_LOGIN");
        
  if( DEFAULT_CHAT_FRAME ) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_LOADED,KTL_Version));
  end
  if FuBar then                 --Checks on Load for FuBar
      Fubar_OnLoad();
  end
  
  if (not KTL_ARRAY) then KTL_ARRAY = {}; end  --If the array doesnt exist, make it
  
end

function KTLOnEvent()
        if(event == "VARIABLES_LOADED") then
         KTL_LoadConfig();
                 StatusShow();           
        elseif(event == "PLAYER_XP_UPDATE") then
                KillMod_XPChange();                                                                     
        elseif(event == "QUEST_FINISHED") then
                if(KTL_ARRAY["KTL_QUEST_STATE"]==0) then                                                        --If we are checking for quests, then do the QTL maths
           KillMod_QuestDone();
        else
        end
        elseif(event == "PLAYER_LEAVE_COMBAT") then
                if(KTL_ARRAY["KTL_QUEST_STATE"]==0) then
           KillMod_CombatDone();                            --Idea behind this is that after a quest finished event
        else                                                                                        --Stay in quest mode, until the next time combnat is finished
        end
        elseif(event == "PLAYER_LOGIN") then
                KTL_XP = UnitXP("player");
                if (KTL_ARRAY["KTL_STATE"] == 6) then
                 DEFAULT_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "old xp", KTL_XP));          
                end
        else
                DEFAULT_CHAT_FRAME:AddMessage("Unregistered event: "..event);
        end
end

function KTL_LoadConfig()
     if (not KTL_ARRAY["INITIALIZED"]) then  --if init isnt true, there is a problem with the array, clear and reset it
                KTL_ARRAY = {};
                KTL_ARRAY["INITIALIZED"] = true;
                KTL_ARRAY["KTL_FRAME"] = 2;
                KTL_ARRAY["KTL_STATE"] = 1;
                KTL_ARRAY["KTL_LABEL"] = TITAN_KTL_BUTTON_LABEL; 
                KTL_ARRAY["KTL_QUEST_STATE"] =  1;              
                KTL_ARRAY["KTL_RK"] = 0;        --KTL storage
                KTL_ARRAY["KTL_NK"] = 0;
                KTL_ARRAY["KTL_Q"] = 0;
         end    
         
         KTL_CHAT_FRAME = getglobal("ChatFrame"..KTL_ARRAY["KTL_FRAME"]);  --Once saved variables loaded, then hook to the correct chat frame
     KTL_XP = UnitXP("player");                           --Load these when all variables are loaded
     KTL_MAXXP = UnitXPMax("player");
         if (KTL_ARRAY["KTL_STATE"] == 6) then
             DEFAULT_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "old xp", KTL_XP));
             DEFAULT_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "old ktl",KTL_ARRAY["KTL_NK"]));
                 DEFAULT_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "old Rktl",KTL_ARRAY["KTL_RK"]));
         end
         if (usingT==1) then TitanPanelButton_UpdateButton(TITAN_KTL_ID); end
         if (usingF==1) then 
             local label, text = KTL_TextUpdate();
             KillsToLevelFu:UpdateText(label..text);
         end
end

function KTL_TextUpdate()
     local count, labelText, valueText;
         labelText = KTL_ARRAY["KTL_LABEL"];        
     if (KTL_COMBAT == 0) then  
        if (KTL_ARRAY["KTL_RK"] == 0) then
           --No rested kills
           if (KTL_ARRAY["KTL_NK"] == 0) then
            --No Normal Kills, No Rested, Blank Info
            valueText = "Blank";
          else
            --Normal Only
            valueText = format(TITAN_KTL_BUTTON_TEXT_N,KTL_ARRAY["KTL_NK"]);
          end
        else
          --Rested Kills
          if (KTL_ARRAY["KTL_NK"] == 0) then
            --No Normal Kills, Rested Only
            valueText = format(TITAN_KTL_BUTTON_TEXT_R,KTL_ARRAY["KTL_RK"]);
          else
            --Normal and Rested Kills
            valueText = format(TITAN_KTL_BUTTON_TEXT_R_N,KTL_ARRAY["KTL_RK"],KTL_ARRAY["KTL_NK"]);
          end
        end;
     elseif (KTL_COMBAT == 1) then
        valueText = format(TITAN_KTL_BUTTON_TEXT_Q, KTL_ARRAY["KTL_Q"]);
     end
        if (KTL_ARRAY["KTL_STATE"] == 6) then
                DEFAULT_CHAT_FRAME:AddMessage("Done a Button Text Update");
        end
        return labelText, valueText;
end

function KTL_LabelChange()
        if(KTL_SMALL == 0) then
                --Large Lables
                KTL_SMALL = 1; 
                if(KTL_COMBAT == 0) then
                        --Combat labels  
                    KTL_ARRAY["KTL_LABEL"] = TITAN_KTL_BUTTON_LABEL;          
                elseif(KTL_COMBAT == 1) then
                        --Quest Labels
                    KTL_ARRAY["KTL_LABEL"] = TITAN_KTL_BUTTON_QUEST_LABEL;  
                end             
        elseif(KTL_SMALL == 1) then
                --Small Lables
                KTL_SMALL = 2;
                if(KTL_COMBAT == 0) then
                        --Combat labels
                    KTL_ARRAY["KTL_LABEL"] = TITAN_KTL_BUTTON_SMALL_LABEL;             
                elseif(KTL_COMBAT == 1) then
                        --Quest Labels
                    KTL_ARRAY["KTL_LABEL"] = TITAN_KTL_BUTTON_SMALL_QUEST_LABEL;
                end
                                
        elseif(KTL_SMALL == 2) then
                --No Lables
                KTL_SMALL = 0;
                KTL_ARRAY["KTL_LABEL"] = "";
                                        
        end
    if (usingT==1) then TitanPanelButton_UpdateButton(TITAN_KTL_ID); end
        if (usingF==1) then 
             local label, text = KTL_TextUpdate();
             KillsToLevelFu:UpdateText(label..text);
        end
end


function KillMod_QuestDone()
   KTL_COMBAT=1;
end

function KillMod_CombatDone()
   KTL_COMBAT=0;
end

function KillMod_XPChange()
   
   local cXp;    
   cXp = UnitXP("player");  --cXp Current xp
   if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "old xp", KTL_XP));
   end
   if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "current xp", cXp));
   end
   if (KTL_ARRAY["KTL_STATE"] > 0) then  --State 0 == off
     local xpDif;
     local xp2level;
     local restedKill;
     local ktl;
     local rested;
     local typestring;

     if (KTL_ARRAY["KTL_STATE"] == 2) then
         typestring = KTL_AVG;
     elseif (KTL_ARRAY["KTL_STATE"] == 6) then
                 typestring = KTL_DEB;
     else
                 typestring = KTL_EXACT;
     end;     --That just told the mod which text to display, depending on the mode your in
     
     xpDif = cXp - KTL_XP;  --Easy to understand, new xp minus old xp.
         if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "xp diff", xpDif));
     end
     if (xpDif == 0) then
             --Something has called me, and there has been no xp change, dont do anything
                 --xpDif = (KTL_MAXXP - KTL_XP) + cXp; --Should be correct xp change now.
     else
     if (xpDif < 0) then
                 xpDif = (KTL_MAXXP - KTL_XP) + cXp; --Should be correct xp change now.
                 if (KTL_ARRAY["KTL_STATE"] == 6) then
             KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "new xp difference", xpDif));
         end
     end         
     if (KTL_LITTLE_R > 0) then
         if (KTL_COMBAT == 0) then
                         xpDif = xpDif - KTL_LITTLE_R;
             KTL_LITTLE_R = 0;
        end
     end

     xp2level = UnitXPMax("player") - cXp;  --Easy again.
     if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "xp to level", xp2level));
     end
         restedKill = xpDif/2;  --Half the change is always rested, even in a group.  Only case where it isn't, is when
         if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "rested xp from this kill", restedKill));
     end         
     ktl = xp2level/xpDif;  --Simple again
         if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "kills to level", ktl));
     end
     if(KTL_COMBAT == 1) then
         KTL_ARRAY["KTL_Q"] = ktl;
                 --Quests To Level Update
         if (KTL_ARRAY["KTL_STATE"] == 3) then
               --Titan Bar only, dont update to channel
         else
                 KTL_CHAT_FRAME:AddMessage(format(KTL_QUEST, ktl), 1.0, 1.0, 0.0);
       end;
     else

     rested = GetXPExhaustion();
         
     if (rested == nil) then rested = 0; 
     end
     if (KTL_ARRAY["KTL_STATE"] == 6) then
        KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "rested xp", rested));
     end
     if (rested > 0) then
         if (restedKill*ktl > rested) then  --if the rested amount from this kill, times the number of kills to level is greater than the current
                                            --rested amount, there will be normal kills and rested to level              
                 if (rested < xpDif) then       
                         KTL_LITTLE_R = rested;     --If you have less rested than half the xp, then the game added a different amount of rested- little_r
                                     if (KTL_ARRAY["KTL_STATE"] == 6) then
                                             KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "little r", KTL_LITTLE_R));
                                         end
                 end
             local normxp = UnitXPMax("player") - (cXp+rested);  --How much normal xp you need to level
                         if (KTL_ARRAY["KTL_STATE"] == 6) then
                                 KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "normal xp to level", normxp));
                         end                     
                 local numrkills = rested/xpDif;
                         
                KTL_ARRAY["KTL_RK"] = ceil(numrkills);
                KTL_ARRAY["KTL_NK"] = normxp/restedKill;
                KTL_ARRAY["KTL_NK"] = ceil(KTL_ARRAY["KTL_NK"]);
                         if (KTL_ARRAY["KTL_STATE"] == 6) then
                KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "number of rested kills",KTL_ARRAY["KTL_RK"]));
             end
             if (KTL_ARRAY["KTL_STATE"] == 6) then
                KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "number of normal kills",KTL_ARRAY["KTL_NK"]));
             end
                         --Normal and Rested Kills Update
                 if (KTL_ARRAY["KTL_STATE"] == 3) then
                         --Titan Bar only, dont update to channel
                 else
                                 KTL_CHAT_FRAME:AddMessage(format(KTL_REST_NORM, KTL_ARRAY["KTL_RK"], KTL_ARRAY["KTL_NK"], typestring), 1.0, 1.0, 0.0);
                 end;
                 --remainingxp divided by half of the xp you recieved gives you the normal kills
                 else            
                KTL_ARRAY["KTL_RK"]=ceil(ktl);
                KTL_ARRAY["KTL_NK"]=0;
                         if (KTL_ARRAY["KTL_STATE"] == 6) then
                KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "number of rested kills",KTL_ARRAY["KTL_RK"]));
             end                         
                         --Rested Kills Only Update
                 if (KTL_ARRAY["KTL_STATE"] == 3) then
                 --Titan Bar only, dont update to channel
                 else
                                 KTL_CHAT_FRAME:AddMessage(format(KTL_REST, KTL_ARRAY["KTL_RK"], typestring), 1.0, 1.0, 0.0);
                 end
                 end
     
         else
        KTL_ARRAY["KTL_RK"]=0;
            KTL_ARRAY["KTL_NK"]=ceil(ktl);
                 if (KTL_ARRAY["KTL_STATE"] == 6) then
             KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "number of normal kills",KTL_ARRAY["KTL_NK"]));
         end             
                 --Normal Kills Only Update
                 if (KTL_ARRAY["KTL_STATE"] == 3) then
               --Titan Bar only, dont update to channel
             else
             KTL_CHAT_FRAME:AddMessage(format(KTL_NORM,KTL_ARRAY["KTL_NK"], typestring), 1.0, 1.0, 0.0);
             end
         end
     end
     end         
     end 
     if (usingT==1) then TitanPanelButton_UpdateButton(TITAN_KTL_ID); end
         if (usingF==1) then 
             local label, text = KTL_TextUpdate();
             KillsToLevelFu:UpdateText(label..text);
         end
    KTL_XP = cXp;
    if (KTL_ARRAY["KTL_STATE"] == 6) then
         KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "current xp", KTL_XP));
    end
    KTL_MAXXP = UnitXPMax("player");
        if (KTL_ARRAY["KTL_STATE"] == 6) then
         KTL_CHAT_FRAME:AddMessage(format(KTL_DEBUG_STRING, "max xp", KTL_MAXXP));
    end
        
end

function StatusShow()
        DEFAULT_CHAT_FRAME:AddMessage(format(KTL_VERSION..".",KTL_Version));
        local frametype;
        if (KTL_ARRAY["KTL_FRAME"] == 2) then
          frametype = KTL_COMBAT_FRAME;
        elseif (KTL_ARRAY["KTL_FRAME"] == 1) then
          frametype = KTL_GENERAL_FRAME;
        end
        DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_FRAME,frametype));
        if (KTL_ARRAY["KTL_STATE"] == 0) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_OFF));
        elseif (KTL_ARRAY["KTL_STATE"] == 1) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_ON));
        elseif (KTL_ARRAY["KTL_STATE"] == 2) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_AVERAGE));
        elseif (KTL_ARRAY["KTL_STATE"] == 3) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_TITAN));
        elseif (KTL_ARRAY["KTL_STATE"] == 6) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_DEBUG));
        end
        if (KTL_ARRAY["KTL_QUEST_STATE"] == 0) then
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_QUEST_ON));
        else
                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_QUEST_OFF));
        end
                
end

function KillMod_SlashHandler(msg)
        local index, value;
        if (not msg or msg == "") then --Show Help
                for index, value in KTL_HELP_TEXT do
                        DEFAULT_CHAT_FRAME:AddMessage(value);
                end             
        else
                local command=strlower(msg);
                if (command == KTL_STATUS) then
                        StatusShow();
                elseif (command == KTL_ON) then
                        KTL_ARRAY["KTL_STATE"] = 1;
                        DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_ON));
                elseif (command == KTL_OFF) then
                        KTL_ARRAY["KTL_STATE"] = 0;
                        DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_OFF));
                elseif (command == KTL_HELP) then  --Show Help, again
                        for index, value in KTL_HELP_TEXT do
                            DEFAULT_CHAT_FRAME:AddMessage(value);
                        end
                elseif (command == KTL_SLASH_FRAME) then  --Change KTl Frame
                        --Dunno how to yet, so just toggling
                        if (KTL_ARRAY["KTL_FRAME"] == 2) then
                                KTL_ARRAY["KTL_FRAME"] = 1;
                                KTL_CHAT_FRAME = getglobal("ChatFrame"..KTL_ARRAY["KTL_FRAME"]);
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_FRAME,KTL_GENERAL_FRAME));
                        else
                                KTL_CHAT_FRAME = getglobal("ChatFrame"..KTL_ARRAY["KTL_FRAME"]);
                                KTL_ARRAY["KTL_FRAME"] = 2;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_FRAME,KTL_COMBATL_FRAME));
                        end
                elseif (command == KTL_DEBUG) then  --toggle debug
                        if (KTL_ARRAY["KTL_STATE"] == 6) then
                                KTL_ARRAY["KTL_STATE"] = 1;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_ON));
                        else
                                KTL_ARRAY["KTL_STATE"] = 6;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_DEBUG));
                        end
                elseif (command == KTL_AVERAGE) then --toggle average
                        if (KTL_ARRAY["KTL_STATE"] == 2) then
                                KTL_ARRAY["KTL_STATE"] = 1;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_ON));
                        else
                                KTL_ARRAY["KTL_STATE"] = 2;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_AVERAGE));
                        end
                elseif (command == KTL_TITAN) then --toggle Titan only mode
                        if (KTL_ARRAY["KTL_STATE"] == 3) then
                                KTL_ARRAY["KTL_STATE"] = 1;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_ON));
                        else
                                KTL_ARRAY["KTL_STATE"] = 3;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_TITAN));
                        end
                elseif (command == KTL_QUEST_O) then --toggle Titan Quest mode
                        if (KTL_ARRAY["KTL_QUEST_STATE"] == 1) then
                                KTL_ARRAY["KTL_QUEST_STATE"] = 0;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_QUEST_ON));
                        else
                                KTL_ARRAY["KTL_QUEST_STATE"] = 1;
                                DEFAULT_CHAT_FRAME:AddMessage(format(KTL_HELP_QUEST_OFF));
                        end
                end                     
        end
end