vanilla-wow-addons – Rev 1
?pathlinks?
-- 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&qu
ot;) 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.