vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- This lua file is mostly used for initialization

TheoryCraft_TooltipData = {}
TheoryCraft_OldText = {}
TheoryCraft_Data = {}
TheoryCraft_Data.armormult = 1
TheoryCraft_Data.armormultinternal = 1
TheoryCraft_Data.Target = {}
TheoryCraft_Data.BaseData = {}
TheoryCraft_Data.BaseData["Allcritbonus"] = 0.5
TheoryCraft_Data.BaseData["Allthreat"] = 1
TheoryCraft_Data.BaseData["Allmodifier"] = 1
TheoryCraft_Data.BaseData["Allbaseincrease"] = 1
TheoryCraft_Data.BaseData["Huntercritbonus"] = 0.5
TheoryCraft_Data.BaseData["Rangedcritbonus"] = 1
TheoryCraft_Data.BaseData["Rangedmodifier"] = 1
TheoryCraft_Data.BaseData["Rangedbaseincrease"] = 1
TheoryCraft_Data.BaseData["Meleecritbonus"] = 1
TheoryCraft_Data.BaseData["Meleemodifier"] = 1
TheoryCraft_Data.BaseData["Meleebaseincrease"] = 1
TheoryCraft_Data.BaseData["AllUpFrontmodifier"] = 1
TheoryCraft_Data.BaseData["AllUpFrontbaseincrease"] = 1
TheoryCraft_Data.BaseData["manacostall"] = 1
TheoryCraft_Data.Talents = {}
TheoryCraft_Data.Talents["strmultiplier"] = 1
TheoryCraft_Data.Talents["agimultiplier"] = 1
TheoryCraft_Data.Talents["stammultiplier"] = 1
TheoryCraft_Data.Talents["intmultiplier"] = 1
TheoryCraft_Data.Talents["spiritmultiplier"] = 1
TheoryCraft_Data.Talents["manamultiplier"] = 1
TheoryCraft_Data.Talents["healthmultiplier"] = 1
local _, class = UnitClass("player")
local _, race = UnitRace("player")
if (race == "Gnome") then
        TheoryCraft_Data.Talents["intmultiplier"] = 1.05
end
if (race == "Human") then
        TheoryCraft_Data.Talents["spiritmultiplier"] = 1.05
end
if (race == "Tauren") then
        TheoryCraft_Data.Talents["healthmultiplier"] = 1.05
end
TheoryCraft_Data.Talents["strmultiplierreal"] = 1
TheoryCraft_Data.Talents["agimultiplierreal"] = 1
TheoryCraft_Data.Talents["stammultiplierreal"] = 1
TheoryCraft_Data.Talents["intmultiplierreal"] = TheoryCraft_Data.Talents["intmultiplier"]
TheoryCraft_Data.Talents["spiritmultiplierreal"] = TheoryCraft_Data.Talents["spiritmultiplier"]
TheoryCraft_Data.Talents["manamultiplierreal"] = 1
TheoryCraft_Data.Talents["healthmultiplierreal"] = TheoryCraft_Data.Talents["healthmultiplier"]
TheoryCraft_Data.Stats = {}

TheoryCraft_UpdatedButtons = {}

function Print(text, begin, spaces)
        if spaces and string.len(spaces) > 10 then
                return
        end
        if text == nil then text = "nil" end
        if text == true then text = "true" end
        if text == false then text = "false" end
        if type(text) == "function" then
                text = "function ("..tostring(text)..")"
        end
        if type(text) == "table" then
                for k, v in pairs(text) do
                        if type(v) == "table" then
                                Print(k..": (Table)", "", (spaces or "").."    ")
                        end
                        Print(v, k..": ", (spaces or "").."    ")
                end
                return
        end
        text = (spaces or "")..(begin or "")..text
        DEFAULT_CHAT_FRAME:AddMessage(text)
end

function TheoryCraft_CopyTable(tab1, tab2)
        for k, v in pairs(tab1) do
                if type(v) == "table" then
                        tab2[k] = {}
                        TheoryCraft_CopyTable(v, tab2[k])
                else
                        tab2[k] = v
                end
        end
end

function TheoryCraft_DeleteTable(tab1)
        for k, v in pairs(tab1) do
                if type(v) == "table" then
                        TheoryCraft_DeleteTable(v)
                else
                        tab1[k] = nil
                end
        end
end

function TheoryCraftCast(spellname, overheal)
        if UnitHealthMax("target") == 100 then
                CastSpellByName(spellname)
                return
        end
        if overheal == nil then overheal = 1 end
        local u, highest, s = UnitHealthMax("target")-UnitHealth("target"), 1
        u = u * overheal
        for i = 1,20 do
                s = TheoryCraft_GetSpellDataByName(spellname, i)
                if (s) and (s.averagehealnocrit) and (s.averagehealnocrit > u) then
                        CastSpellByName(spellname.."(Rank "..i..")")
                        return
                end
        end
        CastSpellByName(spellname)
end

local function round(arg1, decplaces)
        if (decplaces == nil) then decplaces = 0 end
        if arg1 == nil then arg1 = 0 end
        return string.format ("%."..decplaces.."f", arg1)
end

function TheoryCraft_WatchCritRate(arg1)
        local _, _, hit = strfind(arg1, "Your (.+) heals ")
        local _, _, crit= strfind(arg1, "Your (.+) critically")
        if (not hit) and (not crit) then return end
        if crit then hit = crit end
        local foundcc
        for k = 1,20 do
                if TheoryCraft_TooltipData[hit.."("..k..")"] then
                        foundcc = TheoryCraft_TooltipData[TheoryCraft_TooltipData[hit.."("..k..")"]]["crithealchance"]
                end
        end
        if foundcc == nil then
                return
        end
        if not TheoryCraft_Settings["critchancedata"] then
                TheoryCraft_Settings["critchancedata"] = {}
        end
        if (TheoryCraft_Data.outfit) and (TheoryCraft_Data.outfit ~= -1) and (TheoryCraft_Data.outfit ~= 1) then
                return
        end
        local _, tmp2 = UnitStat("player", 4)
        local tmp = tmp2..":"..(foundcc-TheoryCraft_Data.Stats["critchance"])
        if not TheoryCraft_Settings["critchancedata"][tmp] then
                TheoryCraft_Settings["critchancedata"][tmp] = {}
                TheoryCraft_Settings["critchancedata"][tmp].casts = 0
                TheoryCraft_Settings["critchancedata"][tmp].crits = 0
        end
        TheoryCraft_Settings["critchancedata"][tmp].casts = TheoryCraft_Settings["critchancedata"][tmp].casts+1
        if crit then
                TheoryCraft_Settings["critchancedata"][tmp].crits = TheoryCraft_Settings["critchancedata"][tmp].crits+1
        end
        if class == "PALADIN" then
                if (TheoryCraft_Settings["critchancedata"][tmp].casts == 15000) or ((TheoryCraft_Settings["critchancedata"][tmp].casts > 15000) and (math.floor(TheoryCraft_Settings["critchancedata"][tmp].casts/100) == TheoryCraft_Settings["critchancedata"][tmp].casts/100)) then
                        if TheoryCraft_Settings["hidecritdata"] then return end
                        local cc = (TheoryCraft_Settings["critchancedata"][tmp].crits/TheoryCraft_Settings["critchancedata"][tmp].casts-(foundcc-TheoryCraft_Data.Stats["critchance"])/100)*100
                        Print("You've cast "..TheoryCraft_Settings["critchancedata"][tmp].casts.." heals with "..tmp2.." intellect and +"..(foundcc-TheoryCraft_Data.Stats["critchance"]).." crit chance.")
                        Print("Over this you had a base crit rate of "..round((TheoryCraft_Settings["critchancedata"][tmp].crits/TheoryCraft_Settings["critchancedata"][tmp].casts-(foundcc-TheoryCraft_Data.Stats["critchance"])/100)*100,4).."%")
                        Print("TC was expecting a base crit rate of "..TheoryCraft_Data.Stats["critchance"].."%")
                        Print("*Please* post this info on the Curse Gaming message board for TheoryCraft, as this is a very significant amount of casts,")
                        Print("and currently the correct crit formula for Paladins is not known.")
                        Print("This message will show every 100 heals from now on.  To hide it, type")
                        Print("/tc hidecritdata")
                end
        end
end

local function findpattern(text, pattern, start)
        if (text and pattern and (string.find(text, pattern, start))) then
                return string.sub(text, string.find(text, pattern, start))
        else
                return ""
        end
end

function TheoryCraft_UpdateArmor()
        local oldmit = TheoryCraft_Data.armormultinternal
        TheoryCraft_Data.armormultinternal = 1
        local armor
        if UnitIsPlayer("target") then
                if (TheoryCraft_MitigationPlayers[UnitName("target")]) and (TheoryCraft_MitigationPlayers[UnitName("target")][1]) then
                        armor = TheoryCraft_MitigationPlayers[UnitName("target")][1]-TheoryCraft_GetStat("Sunder")
                else
                        local unitlevel = UnitLevel("target")
                        if unitlevel == -1 then unitlevel = 60 end
                        local uc = UnitClass("target")
                        if UnitClass("target") == nil then
                                return
                        end
                        for i = 0,60 do
                                if (TheoryCraft_MitigationPlayers[uc..":"..unitlevel+i]) and (TheoryCraft_MitigationPlayers[uc..":"..unitlevel+i][1]) then
                                        armor = TheoryCraft_MitigationPlayers[uc..":"..unitlevel+i][1]-TheoryCraft_GetStat("Sunder")
                                        break
                                end
                                if (TheoryCraft_MitigationPlayers[uc..":"..unitlevel-i]) and (TheoryCraft_MitigationPlayers[uc..":"..unitlevel-i][1]) then
                                        armor = TheoryCraft_MitigationPlayers[uc..":"..unitlevel-i][1]-TheoryCraft_GetStat("Sunder")
                                        break
                                end
                        end
                end
        else
                if (TheoryCraft_MitigationMobs[UnitName("target")]) and (TheoryCraft_MitigationMobs[UnitName("target")][1]) then
                        armor = TheoryCraft_MitigationMobs[UnitName("target")][1]-TheoryCraft_GetStat("Sunder")
                end
        end
        if armor then
                if armor < 0 then armor = 0 end
                TheoryCraft_Data.armormultinternal = 1 - (armor / (85 * UnitLevel("player") + 400 + armor))
        end
        if TheoryCraft_Data.armormultinternal ~= oldmit then
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        end
end

local old = {}

function TheoryCraft_UpdateTarget(dontgen)
        if UnitName("target") == nil and TheoryCraft_Settings["useglock"] then
                TheoryCraft_Settings["resistscores"]["Arcane"] = 0
                TheoryCraft_Settings["resistscores"]["Fire"] = 0
                TheoryCraft_Settings["resistscores"]["Nature"] = 0
                TheoryCraft_Settings["resistscores"]["Frost"] = 0
                TheoryCraft_Settings["resistscores"]["Shadow"] = 0
                TheoryCraftresistArcane:SetText(TheoryCraft_Settings["resistscores"]["Arcane"])
                TheoryCraftresistFire:SetText(TheoryCraft_Settings["resistscores"]["Fire"])
                TheoryCraftresistNature:SetText(TheoryCraft_Settings["resistscores"]["Nature"])
                TheoryCraftresistFrost:SetText(TheoryCraft_Settings["resistscores"]["Frost"])
                TheoryCraftresistShadow:SetText(TheoryCraft_Settings["resistscores"]["Shadow"])
        end
        TheoryCraft_DeleteTable(old)
        TheoryCraft_CopyTable(TheoryCraft_Data.Target, old)
        TheoryCraft_DeleteTable(TheoryCraft_Data.Target)
        local race, raceen = UnitRace("player")
        local racetar = UnitCreatureType("target")
        if (raceen == "Troll") and (racetar == TheoryCraft_Locale.ID_Beast) then
                TheoryCraft_Data.Target["Allbaseincrease"] = 0.05
                TheoryCraft_Data.Target["Rangedmodifier"] = 0.05
                TheoryCraft_Data.Target["Meleemodifier"] = 0.05
        end
        local slaying = 0
        if (racetar == TheoryCraft_Locale.ID_Humanoid) then
                slaying = TheoryCraft_GetStat("humanoidslaying")
        end
        if (racetar == TheoryCraft_Locale.ID_Beast) or (racetar == TheoryCraft_Locale.ID_Giant) or (racetar == TheoryCraft_Locale.ID_Dragonkin) then
                slaying = TheoryCraft_GetStat("monsterslaying")
        end
        if racetar then
                TheoryCraft_Data.Target["All"] = TheoryCraft_GetStat(racetar)
        end
        TheoryCraft_Data.Target["Allbaseincrease"] = (TheoryCraft_Data.Target["Allbaseincrease"] or 0)+slaying
        TheoryCraft_Data.Target["Rangedmodifier"] = (TheoryCraft_Data.Target["Rangedmodifier"] or 0)+slaying
        TheoryCraft_Data.Target["Meleemodifier"] = (TheoryCraft_Data.Target["Meleemodifier"] or 0)+slaying
        TheoryCraft_Data.Target["Allcritbonus"] = slaying
        TheoryCraft_Data.Target["Rangedcritbonus"] = slaying
        TheoryCraft_Data.Target["Meleecritbonus"] = slaying
        if (dontgen == nil) and (TheoryCraft_IsDifferent(old, TheoryCraft_Data.Target)) then
                TheoryCraft_GenerateAll()
        end
        if TheoryCraft_Settings["dontresist"] then
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        end
        TheoryCraft_UpdateArmor()
end

--- IsDifferent, returns true if the two tables are different else nil ---

function TheoryCraft_IsDifferent(oldtable, newtable)
        if newtable == nil then return true end
        if oldtable == nil then return true end
        for k,v in pairs(oldtable) do
                if type(v) == "table" then
                        if TheoryCraft_IsDifferent(v, newtable[k]) then
                                return true
                        end
                elseif newtable[k] ~= v then
                        if not (((v == nil) and (newtable[k] == 0)) or ((newtable[k] == nil) and (v == 0))) then
                                return true
                        end
                end
        end
        for k,v in pairs(newtable) do
                if type(v) == "table" then
                        if TheoryCraft_IsDifferent(v, oldtable[k]) then
                                return true
                        end
                elseif (oldtable[k] ~= v) then
                        if not (((v == nil) and (oldtable[k] == 0)) or ((oldtable[k] == nil) and (v == 0))) then
                                return true
                        end
                end
        end
end

--- OnLoad ---

local function SetDefaults()
        TheoryCraft_Settings = {}
        TheoryCraft_Settings["embed"] = true
        TheoryCraft_Settings["combinedot"] = true
        TheoryCraft_Settings["procs"] = true
        TheoryCraft_Settings["healanddamage"] = true
        TheoryCraft_Settings["embedstyle1"] = true
        TheoryCraft_Settings["buttontext"] = true
        if TheoryCraft_NotStripped then
                TheoryCraft_Settings["mitigation"] = true
        end
        TheoryCraft_Settings["tryfirst"] = "averagedam"
        TheoryCraft_Settings["trysecond"] = "averagehealnocrit"
        TheoryCraft_Settings["tryfirstsfg"] = 0
        TheoryCraft_Settings["trysecondsfg"] = -1
        TheoryCraft_Settings["dataversion"] = TheoryCraft_DataVersion
        TheoryCraft_Settings["GenerateList"] = ""
        TheoryCraft_Settings["dontresist"] = true
        if (MobResistDB) and type(MobResistDB) == "table" then
                TheoryCraft_Settings["useglock"] = true
        end
        TheoryCraft_Settings["resistscores"] = {}
        TheoryCraft_Settings["resistscores"]["Arcane"] = 0
        TheoryCraft_Settings["resistscores"]["Fire"] = 0
        TheoryCraft_Settings["resistscores"]["Nature"] = 0
        TheoryCraft_Settings["resistscores"]["Frost"] = 0
        TheoryCraft_Settings["resistscores"]["Shadow"] = 0
end

function TheoryCraft_SetItemRef(link, text, button)
        if (IsAltKeyDown()) and (string.sub(link, 1, 4) == "item") then
                TheoryCraft_AddToCustom(link)
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
        else
                TheoryCraft_Data["SetItemRef"](link, text, button)
        end
end

function TheoryCraft_ContainerFrameItemButton_OnClick(button, ignoremodifiers)
        if (IsAltKeyDown()) and (button == "LeftButton") and (not ignoremodifiers) and ((AuctionFrame == nil) or (not AuctionFrame:IsVisible())) then
                TheoryCraft_AddToCustom(GetContainerItemLink(this:GetParent():GetID(), this:GetID()))
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
        end
        TheoryCraft_Data["ContainerFrameItemButton_OnClick"](button, ignoremodifiers)
end

function TheoryCraft_PaperDollItemSlotButton_OnClick(arg1)
        if (arg1 == "LeftButton") and (IsAltKeyDown()) then
                TheoryCraft_AddToCustom(GetInventoryItemLink("player", this:GetID()))
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
        end
        TheoryCraft_Data["PaperDollItemSlotButton_OnClick"](arg1)
end

function TheoryCraft_SuperInspect_InspectPaperDollItemSlotButton_OnClick(arg1)
        if (arg1 == "LeftButton") and (IsAltKeyDown()) then
                TheoryCraft_AddToCustom(GetInventoryItemLink("target", GetInventorySlotInfo(string.sub(this:GetName(), 21))))
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
        end
        TheoryCraft_Data["SuperInspect_InspectPaperDollItemSlotButton_OnClick"](arg1)
end


function TheoryCraft_InspectPaperDollItemSlotButton_OnClick(arg1)
        if (arg1 == "LeftButton") and (IsAltKeyDown()) then
                Print(this:GetName())
                TheoryCraft_AddToCustom(GetInventoryItemLink("target", this:GetID()))
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
        end
        TheoryCraft_Data["InspectPaperDollItemSlotButton_OnClick"](arg1)
end

function TheoryCraft_ISyncButtonClick(arg1, sButton)
        if (sButton == "LeftButton") and (IsAltKeyDown()) then
                TheoryCraft_AddToCustom("item:"..this.storeID)
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
        end
        TheoryCraft_Data["ISync:ButtonClick"](arg1, sButton)
end

function TheoryCraft_OnLoad()
        if not TheoryCraft_NotStripped then
                TheoryCraft_Locale.LoadText = string.gsub(TheoryCraft_Locale.LoadText, TheoryCraft_Version, TheoryCraft_Version.." STRIPPED")
                TheoryCraft_DataVersion = TheoryCraft_DataVersion.." STRIPPED"
                TheoryCraft_Version = TheoryCraft_Version.." STRIPPED"
        end
        TheoryCraft_MitigationMobs = {}
        TheoryCraft_MitigationPlayers = {}
        tinsert(UISpecialFrames,"TheoryCraft")
        SLASH_TheoryCraft1 = "/theorycraft"
        SLASH_TheoryCraft2 = "/tc"
        SlashCmdList["TheoryCraft"] = TheoryCraft_Command
        this:RegisterEvent("VARIABLES_LOADED")
        this:RegisterEvent("PLAYER_LOGIN")
        SetDefaults()

        -- Translates and expands out "schoolname" fields

        local s
        local function bothcase(a)
                return "["..string.upper(a)..string.lower(a).."]"
        end
        for k, v in pairs(TheoryCraft_PrimarySchools) do
                if (type(v) == "table") and v.text then
                        v.text = string.gsub(v.text, "(.)", bothcase)
                end
        end

        local i = 1
        local s2 = 1
        local i3 = 1
        local newones = {}
        while (TheoryCraft_EquipEveryLine[i]) do
                s2 = TheoryCraft_EquipEveryLine[i].text
                if (strfind(TheoryCraft_EquipEveryLine[i].text, "schoolname")) then
                        local i2 = 1
                        local type = 1
                        local s3 = 1
                        while TheoryCraft_PrimarySchools[i2] do
                                s3 = s2
                                
                                s3 = string.gsub(s2, "schoolname", TheoryCraft_PrimarySchools[i2].text)
                                if i2 == 1 then
                                        TheoryCraft_EquipEveryLine[i].text = s3
                                        TheoryCraft_EquipEveryLine[i].type = TheoryCraft_PrimarySchools[i2].name
                                else
                                        newones[i3] = {}
                                        newones[i3].me = TheoryCraft_EquipEveryLine[i].me
                                        newones[i3].amount = TheoryCraft_EquipEveryLine[i].amount
                                        newones[i3].text = s3
                                        newones[i3].type = TheoryCraft_PrimarySchools[i2].name
                                        i3 = i3 + 1
                                end
                                i2 = i2 + 1
                        end
                end
                i = i + 1
        end
        i2 = 1
        while newones[i2] do
                TheoryCraft_EquipEveryLine[i] = {}
                TheoryCraft_EquipEveryLine[i].me = newones[i2].me
                TheoryCraft_EquipEveryLine[i].amount = newones[i2].amount
                TheoryCraft_EquipEveryLine[i].text = newones[i2].text
                TheoryCraft_EquipEveryLine[i].type = newones[i2].type
                i2 = i2 + 1
                i = i + 1
        end

        local i = 1
        local s2 = 1
        local i3 = 1
        local newones = {}
        while (TheoryCraft_EquipEveryRight[i]) do
                s2 = TheoryCraft_EquipEveryRight[i].text
                if (strfind(TheoryCraft_EquipEveryRight[i].text, "schoolname")) then
                        local i2 = 1
                        local type = 1
                        local s3 = 1
                        while TheoryCraft_PrimarySchools[i2] do
                                s3 = s2
                                s3 = string.gsub(s2, "schoolname", TheoryCraft_PrimarySchools[i2].text)
                                if i2 == 1 then
                                        TheoryCraft_EquipEveryRight[i].text = s3
                                        TheoryCraft_EquipEveryRight[i].type = TheoryCraft_PrimarySchools[i2].name
                                else
                                        newones[i3] = {}
                                        newones[i3].me = TheoryCraft_EquipEveryRight[i].me
                                        newones[i3].amount = TheoryCraft_EquipEveryRight[i].amount
                                        newones[i3].text = s3
                                        newones[i3].type = TheoryCraft_PrimarySchools[i2].name
                                        i3 = i3 + 1
                                end
                                i2 = i2 + 1
                        end
                end
                i = i + 1
        end
        i2 = 1
        while newones[i2] do
                TheoryCraft_EquipEveryRight[i] = {}
                TheoryCraft_EquipEveryRight[i].me = newones[i2].me
                TheoryCraft_EquipEveryRight[i].amount = newones[i2].amount
                TheoryCraft_EquipEveryRight[i].text = newones[i2].text
                TheoryCraft_EquipEveryRight[i].type = newones[i2].type
                i2 = i2 + 1
                i = i + 1
        end

        local i = 1
        local s2 = 1
        local i3 = 1
        local newones = {}
        while (TheoryCraft_Equips[i]) do
                s2 = TheoryCraft_Equips[i].text
                if (strfind(TheoryCraft_Equips[i].text, "schoolname")) then
                        local i2 = 1
                        local type = 1
                        local s3 = 1
                        while TheoryCraft_PrimarySchools[i2] do
                                s3 = string.gsub(s2, "schoolname", TheoryCraft_PrimarySchools[i2].text)
                                if i2 == 1 then
                                        TheoryCraft_Equips[i].text = s3
                                        TheoryCraft_Equips[i].type = TheoryCraft_PrimarySchools[i2].name
                                else
                                        newones[i3] = {}
                                        newones[i3].me = TheoryCraft_Equips[i].me
                                        newones[i3].amount = TheoryCraft_Equips[i].amount
                                        newones[i3].text = s3
                                        newones[i3].type = TheoryCraft_PrimarySchools[i2].name
                                        i3 = i3 + 1
                                end
                                i2 = i2 + 1
                        end
                end
                i = i + 1
        end
        i2 = 1
        while newones[i2] do
                TheoryCraft_Equips[i] = {}
                TheoryCraft_Equips[i].me = newones[i2].me
                TheoryCraft_Equips[i].amount = newones[i2].amount
                TheoryCraft_Equips[i].text = newones[i2].text
                TheoryCraft_Equips[i].type = newones[i2].type
                i2 = i2 + 1
                i = i + 1
        end

        i = 1
        while TheoryCraft_Spells[class][i] do
                if TheoryCraft_Spells[class][i].id then
                        if TheoryCraft_Spells[class][i].id == "Aimed Shot" then
                                TheoryCraft_Locale.MinMax.aimedshotname = TheoryCraft_Locale.SpellTranslator[TheoryCraft_Spells[class][i].id]
                        elseif TheoryCraft_Spells[class][i].id == "Multi-Shot" then
                                TheoryCraft_Locale.MinMax.multishotname = TheoryCraft_Locale.SpellTranslator[TheoryCraft_Spells[class][i].id]
                        elseif TheoryCraft_Spells[class][i].id == "Arcane Shot" then
                                TheoryCraft_Locale.MinMax.arcaneshotname = TheoryCraft_Locale.SpellTranslator[TheoryCraft_Spells[class][i].id]
                        elseif TheoryCraft_Spells[class][i].id == "Auto Shot" then
                                TheoryCraft_Locale.MinMax.autoshotname = TheoryCraft_Locale.SpellTranslator[TheoryCraft_Spells[class][i].id]
                        end
                        if TheoryCraft_Locale.SpellTranslator[TheoryCraft_Spells[class][i].id] then
                                TheoryCraft_Spells[class][i].name = TheoryCraft_Locale.SpellTranslator[TheoryCraft_Spells[class][i].id]
                        else
                                Print("TheoryCraft error, no translation found for: "..TheoryCraft_Spells[class][i].id)
                                TheoryCraft_Spells[class][i].name = TheoryCraft_Spells[class][i].id
                        end
                end
                i = i + 1
        end

        Print(TheoryCraft_Locale.LoadText)
end

--- OnShow ---

function TheoryCraft_OnShow()
        TheoryCraft_AddTooltipInfo(GameTooltip)
        if (TheoryCraft_OnShow_Save) then
                TheoryCraft_OnShow_Save()
        end
end

function TheoryCraft_GLOCK_UpdateResist(this, arg1)
        this:OldSetText(arg1)
        if not TheoryCraft_Settings["useglock"] then
                return
        end
        if strfind(arg1, "I") then
                TheoryCraft_Settings["resistscores"][this.TCType] = "~"
        elseif strfind(arg1, "V") then
                TheoryCraft_Settings["resistscores"][this.TCType] = -50
        else
                TheoryCraft_Settings["resistscores"][this.TCType] = tonumber(arg1) or 0
        end
        getglobal("TheoryCraftresist"..this.TCType):SetText(TheoryCraft_Settings["resistscores"][this.TCType])
end

        if BActionButton and type(BActionButton) == "table" then
                TheoryCraft_Data["oldBongo"] = BActionButton.Create
                function TheoryCraft_BActionButtonCreate(index, bar)
                        local tmp = TheoryCraft_Data["oldBongo"](index, bar)
                        TheoryCraft_SetUpButton(tmp:GetName(), "Normal")
                        return tmp
                end
                BActionButton.Create = TheoryCraft_BActionButtonCreate
        end

function TheoryCraft_OnEvent()
        local UIMem = gcinfo()
        if event == "VARIABLES_LOADED" then
                if TheoryCraft_AddButtonText then TheoryCraft_AddButtonText() end
                TheoryCraft_Mitigation = nil
                TheoryCraft_Data["SetItemRef"] = SetItemRef
                SetItemRef = TheoryCraft_SetItemRef

                if (MobResistDB) and (GLOCK_UIschools) and type(MobResistDB) == "table" then
                        for k, v in TheoryCraft_PrimarySchools do
                                for k, v2 in GLOCK_UIschools do
                                        if v2 == v.name then
                                                if getglobal("GMin"..v.name.."TxT") and getglobal("GMin"..v.name.."TxT").SetText then
                                                        getglobal("GMin"..v.name.."TxT").TCType = v.name
                                                        getglobal("GMin"..v.name.."TxT").OldSetText = getglobal("GMin"..v.name.."TxT").SetText
                                                        getglobal("GMin"..v.name.."TxT").SetText = TheoryCraft_GLOCK_UpdateResist
                                                        break
                                                end
                                        end
                                end
                        end
                end

                -- Hooking Nurfed Action Bars onUpdate event for button text purposes
                TheoryCraft_Data["oldGBMSB"] = GB_Spellbook_UpdatePage
                GB_Spellbook_UpdatePage = TheoryCraft_GB_Spellbook_UpdatePage

                TheoryCraft_Data["oldNurfed"] = Nurfed_ActionButton_OnUpdate
                Nurfed_ActionButton_OnUpdate = TheoryCraft_Nurfed_ActionButton_OnUpdate

                TheoryCraft_Data["PaperDollItemSlotButton_OnClick"] = PaperDollItemSlotButton_OnClick
                PaperDollItemSlotButton_OnClick = TheoryCraft_PaperDollItemSlotButton_OnClick

                TheoryCraft_Data["InspectPaperDollItemSlotButton_OnClick"] = InspectPaperDollItemSlotButton_OnClick
                InspectPaperDollItemSlotButton_OnClick = TheoryCraft_InspectPaperDollItemSlotButton_OnClick

                TheoryCraft_Data["SuperInspect_InspectPaperDollItemSlotButton_OnClick"] = SuperInspect_InspectPaperDollItemSlotButton_OnClick
                SuperInspect_InspectPaperDollItemSlotButton_OnClick = TheoryCraft_SuperInspect_InspectPaperDollItemSlotButton_OnClick

                TheoryCraft_Data["ContainerFrameItemButton_OnClick"] = ContainerFrameItemButton_OnClick
                ContainerFrameItemButton_OnClick = TheoryCraft_ContainerFrameItemButton_OnClick

                if ISync then
                        TheoryCraft_Data["ISync:ButtonClick"] = ISync.ButtonClick
                        ISync.ButtonClick = TheoryCraft_ISyncButtonClick
                end

                if TheoryCraft_OnShow_Save ~= nil then
                        return
                end

                --hooking GameTooltip's OnShow
                TheoryCraft_OnShow_Save = GameTooltip:GetScript("OnShow")
                GameTooltip:SetScript( "OnShow", TheoryCraft_OnShow )
                if TheoryCraft_Mitigation == nil then
                        TheoryCraft_Mitigation = {}
                end
                if (TheoryCraft_Settings["dataversion"] ~= TheoryCraft_DataVersion) then
                        SetDefaults()
                end
                if TheoryCraft_Settings["ColR2"] == nil then
                        TheoryCraft_Settings["buttontextx"] = 1.111
                        TheoryCraft_Settings["buttontexty"] = 10.22
                        TheoryCraft_Settings["ColR"] = 1
                        TheoryCraft_Settings["ColG"] = 1
                        TheoryCraft_Settings["ColB"] = 1
                        TheoryCraft_Settings["ColR2"] = 1
                        TheoryCraft_Settings["ColG2"] = 1
                        TheoryCraft_Settings["ColB2"] = 175/255
                        TheoryCraft_Settings["FontSize"] = 12
                        TheoryCraft_Settings["FontPath"] = "Fonts\\ArialN.TTF"
                end
                if TheoryCraftGenBox_Text then TheoryCraftGenBox_Text:SetText(TheoryCraft_Settings["GenerateList"]) end
                if TheoryCraft_Settings["off"] then
                        Print("TheoryCraft is currently switched off, type in '/tc on' to enabled")
                end
        elseif event == "PLAYER_LOGIN" then
                this:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
                this:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
                this:RegisterEvent("SPELLS_CHANGED")
                this:RegisterEvent("UNIT_AURA")
                this:RegisterEvent("UNIT_INVENTORY_CHANGED")
                this:RegisterEvent("PLAYER_TARGET_CHANGED")
                this:RegisterEvent("UNIT_MANA")
                this:RegisterEvent("CHARACTER_POINTS_CHANGED")
                this:RegisterEvent("PLAYER_LEAVING_WORLD")
                this:RegisterEvent("PLAYER_ENTERING_WORLD")
                this:RegisterEvent("PLAYER_COMBO_POINTS")
                this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE")
                this:RegisterEvent("PLAYER_REGEN_ENABLED")
                this:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF")
        elseif event == "PLAYER_LEAVING_WORLD" then
                this:UnregisterEvent("ACTIONBAR_PAGE_CHANGED")
                this:UnregisterEvent("ACTIONBAR_SLOT_CHANGED")
                this:UnregisterEvent("SPELLS_CHANGED")
                this:UnregisterEvent("UNIT_AURA")
                this:UnregisterEvent("UNIT_INVENTORY_CHANGED")
                this:UnregisterEvent("PLAYER_TARGET_CHANGED")
                this:UnregisterEvent("UNIT_MANA")
                this:UnregisterEvent("CHARACTER_POINTS_CHANGED")
                this:UnregisterEvent("PLAYER_LEAVING_WORLD")
                this:UnregisterEvent("PLAYER_COMBO_POINTS")
                this:UnregisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE")
                this:UnregisterEvent("PLAYER_REGEN_ENABLED")
                this:UnregisterEvent("CHAT_MSG_SPELL_SELF_BUFF")
        elseif event == "PLAYER_ENTERING_WORLD" then
                TheoryCraft_UpdateTalents(true)
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_UpdateBuffs("player", true)
                TheoryCraft_UpdateBuffs("target", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
                this:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
                this:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
                this:RegisterEvent("SPELLS_CHANGED")
                this:RegisterEvent("UNIT_AURA")
                this:RegisterEvent("UNIT_INVENTORY_CHANGED")
                this:RegisterEvent("PLAYER_TARGET_CHANGED")
                this:RegisterEvent("UNIT_MANA")
                this:RegisterEvent("CHARACTER_POINTS_CHANGED")
                this:RegisterEvent("PLAYER_LEAVING_WORLD")
                this:RegisterEvent("PLAYER_COMBO_POINTS")
                this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE")
                this:RegisterEvent("PLAYER_REGEN_ENABLED")
                this:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF")
        elseif event == "CHAT_MSG_SPELL_SELF_DAMAGE" then
                if TheoryCraft_ParseCombat then
                        TheoryCraft_ParseCombat(arg1)
                end
        elseif event == "CHAT_MSG_SPELL_SELF_BUFF" then
                TheoryCraft_WatchCritRate(arg1)
        elseif event == "UNIT_INVENTORY_CHANGED" then
                TheoryCraft_UpdateGear(arg1)
        elseif event == "PLAYER_REGEN_ENABLED" then
                if TheoryCraft_Data.regenaftercombat then
                        TheoryCraft_Data.regenaftercombat = nil
                        TheoryCraft_UpdateGear("player", nil, true)
                end
        elseif event == "SPELLS_CHANGED" then
                local autoshotname = TheoryCraft_Locale.SpellTranslator["Auto Shot"]
                if autoshotname then
                        local olddesc = TheoryCraft_TooltipData[autoshotname.."(0)"]
                        if olddesc then
                                TheoryCraft_TooltipData[autoshotname.."(0)"] = nil
                                TheoryCraft_TooltipData[olddesc] = nil
                        end
                end
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        elseif event == "ACTIONBAR_PAGE_CHANGED" then
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        elseif event == "ACTIONBAR_SLOT_CHANGED" then
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        elseif event == "UNIT_AURA" then
                TheoryCraft_UpdateBuffs(arg1)
        elseif event == "CHARACTER_POINTS_CHANGED" then
                TheoryCraft_UpdateTalents()
        elseif event == "PLAYER_TARGET_CHANGED" then
                TheoryCraft_UpdateTarget()
                TheoryCraft_UpdateBuffs("target")
        elseif event == "PLAYER_COMBO_POINTS" then
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        elseif (event == "UNIT_MANA") and (arg1 == "player") then
                if UnitClass("player") == "DRUID" then
                        local _, _, catform = GetShapeshiftFormInfo(3)
                        if catform then
                                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
                        end
                end
                if ((string.find(TheoryCraft_Settings["tryfirst"], "remaining")) or (string.find(TheoryCraft_Settings["trysecond"], "remaining"))) or
                   ((TheoryCraft_Settings["tryfirst"] == "spellcasts") or (TheoryCraft_Settings["trysecond"] == "spellcasts")) then
                        TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
                end
        end
        if TheoryCraft_Settings["showmem"] then
                Print(event..": "..gcinfo()-UIMem)
        end
end

function TheoryCraft_CheckBoxShowDescription(arg1)
        local name = this:GetName()
        name = string.sub(name, 12)
        if (TheoryCraft_CheckButtons[name] == nil) then
                return
        end
        local text = 1
        if (TheoryCraft_CheckButtons[name].descriptionmelee) and ((class == "ROGUE") or (class == "WARRIOR")) then
                text = TheoryCraft_CheckButtons[name].descriptionmelee
        else
                text = TheoryCraft_CheckButtons[name].description
        end
        if string.find(text, "$cr") then
                text = string.gsub(text, "$cr", round(TheoryCraft_intpercrit(), 2))
        end
        GameTooltip_SetDefaultAnchor( GameTooltip, UIParent )
        if TheoryCraft_CheckButtons[name].tooltiptitle then
                GameTooltip:AddLine(TheoryCraft_CheckButtons[name].tooltiptitle, 1,1,1)
        else
                GameTooltip:AddLine(TheoryCraft_CheckButtons[name].short, 1,1,1)
        end
        GameTooltip:AddLine(text, 1,1,0)
        GameTooltip:Show()
end

function TheoryCraft_SetCheckBox(variablename)
        if getglobal("TheoryCraft"..variablename) then
                getglobal("TheoryCraft"..variablename):SetChecked(TheoryCraft_Settings[variablename])
        end
end

function TheoryCraft_CheckBoxSetText(arg1)
        local name = this:GetName()
        name = string.sub(name, 12)
        if TheoryCraft_CheckButtons[name] == nil then return end
        if TheoryCraft_CheckButtons[name].hide then
                for k,v in pairs(TheoryCraft_CheckButtons[name].hide) do
                        if (class == v) or ((v == "STRIPPED") and (not TheoryCraft_NotStripped)) then
                                getglobal(this:GetName()):Disable()
                                getglobal(this:GetName().."Text"):SetTextColor(0.5, 0.5, 0.5)
                        end
                end
        end
        getglobal(this:GetName().."Text"):SetText(TheoryCraft_CheckButtons[name].short)
end

function TheoryCraft_CheckBoxToggle(arg1)
        local onoff
        if (this:GetChecked()) then
                onoff = true
        end
        local name = this:GetName()
        name = string.sub(name, 12)
        if (name == "embedstyle1") or (name == "embedstyle2") or (name == "embedstyle3") then
                TheoryCraft_Settings["embedstyle1"] = nil
                TheoryCraft_Settings["embedstyle2"] = nil
                TheoryCraft_Settings["embedstyle3"] = nil
                TheoryCraft_Settings[name] = onoff
                TheoryCraft_SetCheckBox("embedstyle1")
                TheoryCraft_SetCheckBox("embedstyle2")
                TheoryCraft_SetCheckBox("embedstyle3")
        elseif (name == "alignleft") or (name == "alignright") then
                TheoryCraft_Settings["alignleft"] = nil
                TheoryCraft_Settings["alignright"] = nil
                TheoryCraft_Settings[name] = onoff
                TheoryCraft_SetCheckBox("alignleft")
                TheoryCraft_SetCheckBox("alignright")
                TheoryCraft_UpdateDummyButtonText()
        elseif name == "useglock" then
                if (MobResistDB) and (type(MobResistDB) == "table") and (onoff == true) then
                        TheoryCraft_Settings[name] = onoff
                elseif (not MobResistDB) then
                        TheoryCraft_Settings[name] = nil
                        this:SetChecked(false)
                        Print("GLOCK can be found at Curse Gaming. (TC couldn't find it installed)")
                end
        else
                TheoryCraft_Settings[name] = onoff
        end
        if name == "dontresist" then
                if TheoryCraft_Settings["dontresist"] then
                        TheoryCraftresistArcane:Show()
                        TheoryCraftresistFire:Show()
                        TheoryCraftresistNature:Show()
                        TheoryCraftresistFrost:Show()
                        TheoryCraftresistShadow:Show()
                        TheoryCraftuseglock:Show()
                else
                        TheoryCraftresistArcane:Hide()
                        TheoryCraftresistFire:Hide()
                        TheoryCraftresistNature:Hide()
                        TheoryCraftresistFrost:Hide()
                        TheoryCraftresistShadow:Hide()
                        TheoryCraftuseglock:Hide()
                end
        end
        if (name == "procs") or (name == "rollignites") or (name == "sepignites") or (name == "combinedot") or (name == "dotoverct") or (name == "dontcrit") then
                TheoryCraft_GenerateAll()
        end
        if (name == "buttontext") or (name == "tryfirstlarge") or (name == "trysecondlarge") or (name == "dontresist") or (name == "useglock")  then
                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
        end
end

function TheoryCraft_Command(cmd)
        if (cmd == "") then
                if TheoryCraft_Data["firstrun"] == nil then
                        if TheoryCraft_NotStripped then
                                PanelTemplates_SetNumTabs(TheoryCraft, 3)
                                TheoryCraft.selectedTab=1
                                PanelTemplates_UpdateTabs(TheoryCraft)
                        end
                end
                TheoryCraft_Data["firstrun"] = 1

                TheoryCraft_SetCheckBox("embedstyle1")
                TheoryCraft_SetCheckBox("embedstyle2")
                TheoryCraft_SetCheckBox("embedstyle3")
                TheoryCraft_SetCheckBox("titles")
                TheoryCraft_SetCheckBox("embed")
                TheoryCraft_SetCheckBox("crit")
                TheoryCraft_SetCheckBox("critdam")
                TheoryCraft_SetCheckBox("sepignite")
                TheoryCraft_SetCheckBox("rollignites")
                TheoryCraft_SetCheckBox("dps")
                TheoryCraft_SetCheckBox("combinedot")
                TheoryCraft_SetCheckBox("dotoverct")
                TheoryCraft_SetCheckBox("hps")
                TheoryCraft_SetCheckBox("dpsdam")
                TheoryCraft_SetCheckBox("averagedam")
                TheoryCraft_SetCheckBox("procs")
                TheoryCraft_SetCheckBox("mitigation")
                TheoryCraft_SetCheckBox("resists")
                TheoryCraft_SetCheckBox("averagethreat")
                TheoryCraft_SetCheckBox("plusdam")
                TheoryCraft_SetCheckBox("damcoef")
                TheoryCraft_SetCheckBox("dameff")
                TheoryCraft_SetCheckBox("damfinal")
                TheoryCraft_SetCheckBox("healanddamage")
                TheoryCraft_SetCheckBox("nextagi")
                TheoryCraft_SetCheckBox("nextstr")
                TheoryCraft_SetCheckBox("nextcrit")
                TheoryCraft_SetCheckBox("nexthit")
                TheoryCraft_SetCheckBox("nextpen")
                TheoryCraft_SetCheckBox("mana")
                TheoryCraft_SetCheckBox("dpm")
                TheoryCraft_SetCheckBox("hpm")
                TheoryCraft_SetCheckBox("max")
                TheoryCraft_SetCheckBox("maxevoc")
                TheoryCraft_SetCheckBox("lifetap")
                TheoryCraft_SetCheckBox("dontcrit")
                TheoryCraft_SetCheckBox("dontresist")
                TheoryCraft_SetCheckBox("useglock")
                TheoryCraft_SetCheckBox("buttontext")
                TheoryCraft_SetCheckBox("tryfirstlarge")
                TheoryCraft_SetCheckBox("trysecondlarge")
                TheoryCraft_SetCheckBox("framebyframe")

                TheoryCraftresistArcane:SetText(TheoryCraft_Settings["resistscores"]["Arcane"])
                TheoryCraftresistFire:SetText(TheoryCraft_Settings["resistscores"]["Fire"])
                TheoryCraftresistNature:SetText(TheoryCraft_Settings["resistscores"]["Nature"])
                TheoryCraftresistFrost:SetText(TheoryCraft_Settings["resistscores"]["Frost"])
                TheoryCraftresistShadow:SetText(TheoryCraft_Settings["resistscores"]["Shadow"])

                if TheoryCraft_Settings["dontresist"] then
                        TheoryCraftresistArcane:Show()
                        TheoryCraftresistFire:Show()
                        TheoryCraftresistNature:Show()
                        TheoryCraftresistFrost:Show()
                        TheoryCraftresistShadow:Show()
                        TheoryCraftuseglock:Show()
                else
                        TheoryCraftresistArcane:Hide()
                        TheoryCraftresistFire:Hide()
                        TheoryCraftresistNature:Hide()
                        TheoryCraftresistFrost:Hide()
                        TheoryCraftresistShadow:Hide()
                        TheoryCraftuseglock:Hide()
                end

                if (TheoryCraft:IsVisible()) then
                        TheoryCraft:Hide()
                else
                        if TheoryCraft_UpdateDummyButtonText then TheoryCraft_UpdateDummyButtonText() end
                        TheoryCraft:Show()
                end
        end
        local onoff = nil
        if strfind(cmd, " ") then
                onoff = string.sub(cmd, strfind(cmd, " ")+1)
                cmd = string.sub(cmd, 1, strfind(cmd, " ")-1)
        end
        if (cmd == "custom") then
                local linkid = string.sub(onoff, string.find(onoff, "item:%d+:%d+:%d+:%d+"))
                TheoryCraft_Settings["CustomOutfitName"] = "Custom"
                TheoryCraft_AddToCustom(linkid)
        end
        if (cmd == "calccrits") then
                if TheoryCraft_Settings["critchancedata"] == nil then
                        Print("No crits found - this feature works for heals only")
                        return
                end
                local _, critrate, int, gear
                local crittable = {}
                for k, v in pairs(TheoryCraft_Settings["critchancedata"]) do
                        _, _, int, gear = strfind(k, "(.+):(.+)")
                        if crittable[int] == nil then
                                crittable[int] = {}
                        end
                        critrate = v.crits/v.casts-gear/100
                        crittable[int].casts = v.casts+(crittable[int].casts or 0)
                        crittable[int].critrate = v.casts*(v.crits/v.casts-gear/100)/crittable[int].casts
                end
                local minint = 1000
                local maxint = 0
                local mincrit = 0
                local maxcrit = 0
                for k, v in pairs(crittable) do
                        if (tonumber(k) < minint) and (v.casts > 400) then
                                minint = tonumber(k)
                                mincrit = v.critrate
                        end
                        if (tonumber(k) > maxint) and (v.casts > 400) then
                                maxint = tonumber(k)
                                maxcrit = v.critrate
                        end
                end
                mincrit = mincrit * 100
                maxcrit = maxcrit * 100
                Print("Int | Casts | Crit Chance")
                for k, v in crittable do
                        Print(k.." | "..v.casts.." | "..round(v.critrate*100,4).."%")
                end
                if minint == 1000 then
                        Print("Insufficient data to calculate crit rates")
                elseif minint == maxint then
                        Print("Insufficient range to calculate base crit, assuming 0")
                        Print("Int Per Crit = "..round(maxint/maxcrit,3))
                        Print("Base Crit = 0")
                else
                        Print("Using this data:")
                        Print("Int Per Crit = "..round((maxint-minint)/(maxcrit-mincrit),3))
                        Print("Base Crit = "..round((mincrit-minint/((maxint-minint)/(maxcrit-mincrit))),3).."%")
                end
        end
        if (cmd == "armor") or (cmd == "playerarmor") then
                if onoff == nil then onoff = "" end
                onoff = string.upper(onoff)
                local test = {}
                local i = 1
                local ul = UnitLevel("player")
                Print(" ")
                if cmd == "armor" then
                        for k, v in pairs(TheoryCraft_MitigationMobs) do
                                if strfind(string.upper(k), onoff) then
                                        test[i] = round((v[1] / (85 * ul + 400 + v[1]))*100,1).." | "..v[1].." | "..k
                                        i = i + 1
                                        if i > 250 then
                                                Print("Please limit your search - more than 250 mobs were found")
                                                return
                                        end
                                end
                        end
                        Print("DR | Armor | Mob Name")
                else
                        local classname, level, _
                        for k, v in pairs(TheoryCraft_MitigationPlayers) do
                                if strfind(string.upper(k), onoff) and strfind(string.upper(k), ":") then
                                        _, _, classname, level = strfind(k, "(.+):(.+)")
                                        test[i] = classname.." | "..level.." | "..v[1].." | "..round((v[1] / (85 * ul + 400 + v[1]))*100,1)
                                        i = i + 1
                                        if i > 250 then
                                                Print("Please limit your search - more than 250 mobs were found")
                                                return
                                        end
                                end
                        end
                        Print(" ")
                        Print("Class | Lvl | Armor | DR")
                        table.sort(test)
                        for k, v in pairs(test) do
                                Print(v)
                        end
                        test = {}
                        for k, v in pairs(TheoryCraft_MitigationPlayers) do
                                if strfind(string.upper(k), onoff) and (not strfind(k, ":")) then
                                        test[i] = round((v[1] / (85 * ul + 400 + v[1]))*100,1).." | "..v[1].." | "..k
                                        i = i + 1
                                        if i > 250 then
                                                Print("Please limit your search - more than 250 mobs were found")
                                                return
                                        end
                                end
                        end
                        Print(" ")
                        Print("DR | Armor | Player Name")
                end
                table.sort(test)
                for k, v in pairs(test) do
                        Print(v)
                end
        end
        if (cmd == "off") then
                Print("TheoryCraft is now switched OFF")
                TheoryCraft_Settings["off"] = true
        end
        if (cmd == "on") then
                Print("TheoryCraft is now switched ON")
                TheoryCraft_Settings["off"] = nil
        end
        if (cmd == "more") then
                Print("/tc showmem")
                Print("    Debug infomation, shows the memory usage (in bytes) as each event occurs")
                Print("/tc damtodouble")
                Print("    Shows how much +damage/+heal is required to double a spells base damage")
                Print("/tc dpsmana")
                Print("    Adds a dps/mana field to the tooltip")
                Print("/tc armorchanges")
                Print("    Prints whenever the armor value of the target changes")
                Print("/tc armor (mob name)")
                Print("    Prints the mobs armor. Leave blank for all.")
                Print("/tc playerarmor (player name, or class)")
                Print("    Prints a players armor. Leave blank for all.")
                Print("/tc calccrits")
                Print("    Shows your actual crit rate, from combat. Only works for healers.")
                Print("Macro Tooltips")
                Print("    If you name a macro the same as the name of the spell, in the format: Pyroblast(x), where x is the rank (or 0 if N/A), TC will show the correct tooltip. If the spell name does not fit, only use as many characters as can fit without leaving the rank off.")
                Print('/script TheoryCraftCast("Greater Heal", 1)')
                Print("    Casts the lowest rank Greater Heal that'll bring your target to full health.  The 1 represents overheal amount, eg change to 1.2 to attempt to overheal by 20% (to account for damage while casting). Can be used in macros.")
        end
        if (cmd == "titles") or (cmd == "dpsmana") or (cmd == "damtodouble") or (cmd == "hidecritdata") or (cmd == "dpsdampercent") or (cmd == "armorchanges") or (cmd == "procs") or (cmd == "hideadvanced") or (cmd == "showregenheal") or (cmd == "showregendam") or (cmd == "hpm") or (cmd == "dpm") or (cmd == "dontcritdpm") or (cmd == "dontcrithpm") or (cmd == "nextagi") or (cmd == "nextpen") or (cmd == "embed") or (cmd == "dam") or (cmd == "averagedam") or (cmd == "averagedamnocrit") or (cmd == "crit") or (cmd == "critdam") or (cmd == "sepignite") or (cmd == "rollignites") or (cmd == "dps") or (cmd == "dpsdam") or (cmd == "resists") or (cmd == "timeit") or (cmd == "plusdam") or (cmd == "damcoef") or (cmd == "dameff&quot;) or (cmd == "damfinal") or (cmd == "nextcrit") or (cmd == "nexthit") or (cmd == "mana") or (cmd == "max") or (cmd == "maxevoc") or (cmd == "maxtime") or (cmd == "averagethreat") or (cmd == "healanddamage") or (cmd == "lifetap") or (cmd == "showmore") or (cmd == "showmem") then
                if (TheoryCraft_Settings[cmd]) then
                        onoff = nil
                else
                        onoff = true
                end
                if onoff then
                        DEFAULT_CHAT_FRAME:AddMessage(cmd.." is now set to 'on'")
                else
                        DEFAULT_CHAT_FRAME:AddMessage(cmd.." is now set to 'off'")
                end
                TheoryCraft_Settings[cmd] = onoff
        end
end

function TheoryCraft_OutfitChange(arg1)
        local id = this:GetName()
        local name = this:GetText()
        if (id == "TheoryCraftSetToAll") then
                TheoryCraftGenBox_Text:SetText("")
                local spellname, spellrank
                local i, i2 = 1
                local first = true
                while (true) do
                        spellname, spellrank = GetSpellName(i,BOOKTYPE_SPELL)
                        if spellname == nil then break end
                        spellrank = tonumber(findpattern(spellrank, "%d+"))
                        if spellrank == nil then spellrank = 0 end
                        i2 = 1
                        while (TheoryCraft_Spells[class][i2]) and (spellname ~= TheoryCraft_Spells[class][i2].name) do
                                i2 = i2 + 1
                        end
                        if (TheoryCraft_Spells[class][i2] ~= nil) then
                                if first then
                                        TheoryCraftGenBox_Text:SetText(spellname.."("..spellrank..")")
                                        first = false
                                else
                                        TheoryCraftGenBox_Text:SetText(TheoryCraftGenBox_Text:GetText().."\n"..spellname.."("..spellrank..")")
                                end
                        end
                        i = i + 1
                end
                return
        end
        if (id == "TheoryCraftGenAll") then
                local timer = GetTime()
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                timer = round((GetTime()-timer)*1000)
                Print(" ")
                Print("TheoryCraft takes: "..timer.."ms to read your gear. This will only occur out of combat, and only when your gear changes.")
                TheoryCraft_Data["reporttimes"] = true
                TheoryCraft_Data["buttonsgenerated"] = 0
                TheoryCraft_Data["timetaken"] = 0
                TheoryCraft_GenerateAll()
                return
        end
        if (id == "TheoryCraftResetButton") then
                TheoryCraft_Data["outfit"] = 1
                local i = 1
                while (TheoryCraft_Talents[i]) do
                        TheoryCraft_Talents[i].forceto = -1
                        i = i + 1
                end
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_UpdateTalents(true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
                UIDropDownMenu_SetSelectedID(TheoryCraftoutfit, 1)
                TheoryCraftCustomOutfit:Hide()
                return
        end
        if (id == "TheoryCraftClearButton") then
                TheoryCraft_Settings["CustomOutfitName"] = "Custom"
                TheoryCraft_Settings["CustomOutfit"] = nil
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
                return
        end
        if (id == "TheoryCraftClose") then
                TheoryCraft:Hide()
                return
        end
        if (id == "TheoryCraftEquipTargetButton") then
                TheoryCraft_Settings["CustomOutfitName"] = UnitName("target")
                TheoryCraft_Settings["CustomOutfit"] = nil
                TheoryCraft_Data["outfit"] = 2
                TheoryCraft_UpdateGear("player", true)
                local i = 20
                while i > 0 do
                        TheoryCraft_AddToCustom(GetInventoryItemLink("target", i))
                        i=i-1
                end
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
                return
        end
        if (id == "TheoryCraftEquipSelfButton") then
                TheoryCraft_Settings["CustomOutfitName"] = "Self"
                TheoryCraft_Settings["CustomOutfit"] = nil
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
                TheoryCraft_Data["outfit"] = 2
                local i = 20
                while i > 0 do
                        TheoryCraft_AddToCustom(GetInventoryItemLink("player", i))
                        i=i-1
                end
                TheoryCraft_UpdateGear("player", true)
                TheoryCraft_LoadStats()
                TheoryCraft_GenerateAll()
                return
        end
end

function TheoryCraft_UpdateEditBox()
        local s = string.gsub(this:GetName(), "TheoryCraft", "")
        local text = this:GetText()
        if s ~= "FontPath" then
                if text == "~" and strfind(s, "resist") then
                        TheoryCraft_Settings["resistscores"][string.gsub(s, "resist", "")] = "~"
                        TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
                        return
                end
                text = tonumber(text)
                if text == nil then
                        if strfind(s, "resist") then
                                TheoryCraft_Settings["resistscores"][string.gsub(s, "resist", "")] = 0
                                TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
                        end
                        return
                end
                if strfind(s, "Col") then
                        if text > 255 then
                                text = 255
                        end
                        if text < 0 then
                                text = 0
                        end
                        text = text/255
                end
        end
        if strfind(s, "resist") then
                TheoryCraft_Settings["resistscores"][string.gsub(s, "resist", "")] = text
                if TheoryCraft_Settings["dontresist"] then
                        TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
                end
        else
                TheoryCraft_Settings[s] = text
                if TheoryCraft_UpdateDummyButtonText then
                        TheoryCraft_UpdateDummyButtonText(true)
                end
        end
end

Generated by GNU Enscript 1.6.5.90.