vanilla-wow-addons – Rev 1
?pathlinks?
local _TOOLTIPTAB = 1
local _BUTTONTEXTTAB = 2
local _ADVANCEDTAB = 3
--local _MITIGATIONTAB = 4
local _, class = UnitClass("player")
TheoryCraft_NotStripped = true
TheoryCraft_SetUpButton = function (parentname, type, specialid)
oldbutton = getglobal(parentname)
if not oldbutton then return end
newbutton = getglobal(parentname.."_TCText")
if newbutton then return end
oldbutton:CreateFontString(parentname.."_TCText", "ARTWORK");
oldbutton.oldupdatescript = oldbutton:GetScript("OnUpdate")
oldbutton:SetScript("OnUpdate", TheoryCraft_ButtonUpdate)
newbutton = getglobal(parentname.."_TCText")
newbutton:SetFont("Fonts\\ARIALN.TTF", 12, "OUTLINE")
newbutton:SetPoint("TOPLEFT", oldbutton, "TOPLEFT", 0, 0)
newbutton:SetPoint("BOTTOMRIGHT", oldbutton, "BOTTOMRIGHT", 0, 0)
newbutton.type = type
newbutton.specialid = specialid
newbutton:Show()
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
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_GenBoxEditChange()
TheoryCraft_Settings["GenerateList"] = TheoryCraftGenBox_Text:GetText()
if string.find(TheoryCraft_Settings["GenerateList"], "ONDEMAND") then
TheoryCraft_Settings["GenerateList"] = "ONDEMAND"
end
end
function TheoryCraft_CustomizedEditChange()
TheoryCraft_Settings["Customized"] = TheoryCraftCustomized_Text:GetText()
end
local function UpdateCustomOutfit()
if TheoryCraft_Data.outfit == 2 then
TheoryCraftCustomOutfit:Show()
else
TheoryCraftCustomOutfit:Hide()
return
end
local i = 1
local i2 = 1
TheoryCraftCustomLeft:SetText()
TheoryCraftCustomRight:SetText()
TheoryCraftCustomLeft:SetHeight(1)
TheoryCraftCustomRight:SetHeight(1)
local text = 1
while (TheoryCraft_SlotNames[i]) do
if (TheoryCraftCustomLeft:GetText(text) == nil) or (string.find(TheoryCraftCustomLeft:GetText(text), TheoryCraft_SlotNames[i].slot) == nil) then
if string.find(TheoryCraft_SlotNames[i].slot, "%d+") then
text = string.sub(TheoryCraft_SlotNames[i].slot, 1, string.find(TheoryCraft_SlotNames[i].slot, "%d+")-1)
else
text = TheoryCraft_SlotNames[i].slot
end
if TheoryCraftCustomLeft:GetText() then
TheoryCraftCustomLeft:SetText(TheoryCraftCustomLeft:GetText().."\n"..text)
else
TheoryCraftCustomLeft:SetText(text)
end
if TheoryCraft_Settings["CustomOutfit"].slots[TheoryCraft_SlotNames[i].slot] then
text = TheoryCraft_Settings["CustomOutfit"].slots[TheoryCraft_SlotNames[i].slot]["name"]
else
text = " "
end
if TheoryCraftCustomRight:GetText() then
TheoryCraftCustomRight:SetText(TheoryCraftCustomRight:GetText().."\n"..text)
else
TheoryCraftCustomRight:SetText(text)
end
TheoryCraftCustomLeft:SetHeight(11+TheoryCraftCustomLeft:GetHeight())
TheoryCraftCustomRight:SetHeight(TheoryCraftCustomLeft:GetHeight())
end
i = i + 1
end
end
function TheoryCraft_TabHandler()
local name = this:GetName()
name = tonumber(string.sub(name, 15))
TheoryCraftSettingsTab:Hide()
TheoryCraftCustomOutfit:Hide()
TheoryCraftOutfitTab:Hide()
TheoryCraftButtonTextTab:Hide()
TheoryCraftCustomOutfit:Hide()
-- TheoryCraftMitigationTab:Hide()
if (name == _TOOLTIPTAB) then
TheoryCraftSettingsTab:Show()
elseif (name == _BUTTONTEXTTAB) then
TheoryCraftButtonTextTab:Show()
elseif (name == _ADVANCEDTAB) then
TheoryCraftOutfitTab:Show()
TheoryCraft_UpdateOutfitTab()
-- elseif (name == _MITIGATIONTAB) then
-- TheoryCraftMitigationTab:Show()
end
end
local function TheoryCraftAddStat(text, text2)
if (text == nil) or (text2 == nil) then return end
if TheoryCraftStatsLeft:GetText() then
TheoryCraftStatsLeft:SetText(TheoryCraftStatsLeft:GetText().."\n"..text)
TheoryCraftStatsRight:SetText(TheoryCraftStatsRight:GetText().."\n"..text2)
else
TheoryCraftStatsLeft:SetText(text)
TheoryCraftStatsRight:SetText(text2)
end
TheoryCraftStatsLeft:SetHeight(10+TheoryCraftStatsLeft:GetHeight())
TheoryCraftStatsRight:SetHeight(TheoryCraftStatsLeft:GetHeight())
end
local function TheoryCraftAddVital(text, text2)
if (text == nil) or (text2 == nil) then return end
if TheoryCraftVitalsLeft:GetText() then
TheoryCraftVitalsLeft:SetText(TheoryCraftVitalsLeft:GetText().."\n"..text)
TheoryCraftVitalsRight:SetText(TheoryCraftVitalsRight:GetText().."\n"..text2)
else
TheoryCraftVitalsLeft:SetText(text)
TheoryCraftVitalsRight:SetText(text2)
end
TheoryCraftVitalsLeft:SetHeight(10+TheoryCraftVitalsLeft:GetHeight())
TheoryCraftVitalsRight:SetHeight(TheoryCraftVitalsLeft:GetHeight())
end
local function TheoryCraftAddMod(text, text2)
if (text == nil) or (text2 == nil) then return end
if TheoryCraftModsLeft:GetText() then
TheoryCraftModsLeft:SetText(TheoryCraftModsLeft:GetText().."\n"..text)
else
TheoryCraftModsLeft:SetText(text)
end
if TheoryCraftModsRight:GetText() then
TheoryCraftModsRight:SetText(TheoryCraftModsRight:GetText().."\n"..text2)
else
TheoryCraftModsRight:SetText(text2)
end
end
local function AddMods(mult, mod, all, healing, damage, school, prefix, suffix, pre2)
local tmp = TheoryCraft_GetStat("All"..mod)*mult
if tmp ~= 0 then
if all ~= "DONT" then
TheoryCraftAddMod(all, prefix..tmp..suffix)
end
end
tmp = TheoryCraft_GetStat("Healing"..mod)*mult
if tmp ~= 0 then
TheoryCraftAddMod(healing, prefix..tmp..suffix)
end
tmp = TheoryCraft_GetStat("Damage"..mod)*mult
if tmp ~= 0 then
TheoryCraftAddMod(damage, prefix..tmp..suffix)
end
if pre2 == nil then pre2 = "" end
for k,v in pairs(TheoryCraft_PrimarySchools) do
tmp = TheoryCraft_GetStat(v.name..mod)*mult
if tmp ~= 0 then
TheoryCraftAddMod(pre2..v.name..school, prefix..tmp..suffix)
end
end
end
function TheoryCraft_UpdateOutfitTab()
if not TheoryCraftOutfitTab:IsVisible() then
return
end
local i = 1
local i2 = 1
while i < 4 do
i2 = 1
getglobal("TheoryCraftTalentTree"..i):SetText(" ")
while getglobal("TheoryCraftTalent"..i..i2) do
getglobal("TheoryCraftTalent"..i..i2):Hide()
i2 = i2+1
end
i = i+1
end
i2 = 1
local number
local title, rank, i3, _, currank
local highestnumber = 0
while i2 < 4 do
i = 1
number = 1
while (TheoryCraft_Talents[i]) do
if (class == TheoryCraft_Talents[i].class) and (TheoryCraft_Talents[i].dontlist == nil) and (((TheoryCraft_Talents[i].tree == i2) and (TheoryCraft_Talents[i].forcetree == nil)) or (TheoryCraft_Talents[i].forcetree == i2)) then
title = getglobal("TheoryCraftTalentTree"..i2)
rank = getglobal("TheoryCraftTalent"..i2..number)
i3 = 1
while (TheoryCraft_Locale.TalentTranslator[i3]) and (TheoryCraft_Locale.TalentTranslator[i3].id ~= TheoryCraft_Talents[i].name) do
i3 = i3 + 1
end
if (TheoryCraft_Locale.TalentTranslator[i3]) and (rank ~= nil) then
title:SetText(title:GetText()..TheoryCraft_Locale.TalentTranslator[i3].translated.."\n")
_, _, _, _, currank = GetTalentInfo(TheoryCraft_Talents[i].tree, TheoryCraft_Talents[i].number)
if ((TheoryCraft_Talents[i].forceto == nil) or (TheoryCraft_Talents[i].forceto == -1)) then
rank:SetText(currank)
else
rank:SetText(TheoryCraft_Talents[i].forceto)
end
rank:SetNormalTexture(nil)
rank:SetPushedTexture(nil)
rank:SetHighlightTexture(nil)
if (TheoryCraft_Talents[i].forceto) and (TheoryCraft_Talents[i].forceto ~= -1) and (TheoryCraft_Talents[i].forceto ~= currank) then
rank:SetTextColor(1,1,0.1)
else
rank:SetTextColor(0.1,1,0.1)
end
rank:Show()
number = number + 1
end
end
i = i+1
end
if highestnumber < number then highestnumber = number end
i2 = i2 + 1
end
TheoryCraftTalentTitle:SetPoint("BOTTOMLEFT", TheoryCraftOutfitTab, "BOTTOMLEFT", 20, 42+10*highestnumber)
TheoryCraftVitalsLeft:SetText()
TheoryCraftVitalsRight:SetText()
TheoryCraftVitalsLeft:SetHeight(2)
TheoryCraftVitalsRight:SetHeight(2)
TheoryCraftStatsLeft:SetText()
TheoryCraftStatsRight:SetText()
TheoryCraftStatsLeft:SetHeight(2)
TheoryCraftStatsRight:SetHeight(2)
TheoryCraftModsLeft:SetText()
TheoryCraftModsRight:SetText()
TheoryCraftModsLeft:SetHeight(2)
TheoryCraftModsRight:SetHeight(2)
local totalmana = TheoryCraft_GetStat("totalmana")+TheoryCraft_GetStat("manarestore")
TheoryCraftAddVital("Health", math.floor(TheoryCraft_GetStat("totalhealth")))
if class == "HUNTER" then
TheoryCraftAddVital("Mana", math.floor(TheoryCraft_GetStat("totalmana")))
TheoryCraftAddVital("Attack Power", math.floor(TheoryCraft_GetStat("attackpower")))
TheoryCraftAddVital("Ranged Attack Power", math.floor(TheoryCraft_GetStat("rangedattackpower")))
TheoryCraftAddVital("Crit Chance", round(TheoryCraft_GetStat("meleecritchancereal"), 2).."%")
TheoryCraftAddVital("Ranged Crit Chance", round(TheoryCraft_GetStat("rangedcritchance"), 2).."%")
TheoryCraftAddVital("Agi per Crit", round(TheoryCraft_agipercrit, 2))
TheoryCraftAddVital("Normal Regen", round(TheoryCraft_Data.Stats["regen"]*2, 2).." / Tick")
TheoryCraftAddVital("Regen Whilst Casting", round(TheoryCraft_Data.Stats["icregen"]*2, 2).." / Tick")
TheoryCraftAddStat("Stamina", math.floor(TheoryCraft_GetStat("stamina")))
TheoryCraftAddStat("Strength", math.floor(TheoryCraft_GetStat("strength")))
TheoryCraftAddStat("Agility", math.floor(TheoryCraft_GetStat("agility")))
TheoryCraftAddStat("Intellect", math.floor(TheoryCraft_GetStat("intellect")))
TheoryCraftAddStat("Spirit", math.floor(TheoryCraft_GetStat("spirit")))
elseif (class == "ROGUE") or (class == "WARRIOR") then
TheoryCraftAddVital("Attack Power", math.floor(TheoryCraft_GetStat("attackpower")))
TheoryCraftAddVital("Crit Chance", round(TheoryCraft_GetStat("meleecritchancereal"), 2).."%")
TheoryCraftAddVital("Agi per Crit", round(TheoryCraft_agipercrit, 2))
TheoryCraftAddStat("Stamina", math.floor(TheoryCraft_GetStat("stamina")))
TheoryCraftAddStat("Strength", math.floor(TheoryCraft_GetStat("strength")))
TheoryCraftAddStat("Agility", math.floor(TheoryCraft_GetStat("agility")))
elseif (class == "PALADIN") then
TheoryCraftAddVital("Mana", math.floor(TheoryCraft_GetStat("totalmana")))
TheoryCraftAddVital("Attack Power", math.floor(TheoryCraft_GetStat("attackpower")))
TheoryCraftAddVital("Crit Chance", round(TheoryCraft_GetStat("meleecritchancereal"), 2).."%")
TheoryCraftAddVital("Agi per Crit", round(TheoryCraft_agipercrit, 2))
TheoryCraftAddVital("Normal Regen", round(TheoryCraft_Data.Stats["regen"]*2, 2).." / Tick")
TheoryCraftAddVital("Regen Whilst Casting", round(TheoryCraft_Data.Stats["icregen"]*2, 2).." / Tick")
TheoryCraftAddStat("Stamina", math.floor(TheoryCraft_GetStat("stamina")))
TheoryCraftAddStat("Intellect", math.floor(TheoryCraft_GetStat("intellect")))
TheoryCraftAddStat("Strength", math.floor(TheoryCraft_GetStat("strength")))
TheoryCraftAddStat("Agility", math.floor(TheoryCraft_GetStat("agility")))
TheoryCraftAddStat("Spirit", math.floor(TheoryCraft_GetStat("spirit")))
elseif (class == "DRUID") then
if UnitManaMax("player") == 100 then
TheoryCraftAddVital("Attack Power", math.floor(TheoryCraft_GetStat("attackpower")))
TheoryCraftAddVital("Crit Chance", round(TheoryCraft_GetStat("meleecritchancereal"), 2).."%")
TheoryCraftAddVital("Agi per Crit", round(TheoryCraft_agipercrit, 2))
TheoryCraftAddStat("Stamina", math.floor(TheoryCraft_GetStat("stamina")))
TheoryCraftAddStat("Strength", math.floor(TheoryCraft_GetStat("strength")))
TheoryCraftAddStat("Agility", math.floor(TheoryCraft_GetStat("agility")))
else
TheoryCraftAddVital("Mana", math.floor(TheoryCraft_GetStat("totalmana")))
TheoryCraftAddVital("Normal Regen", round(TheoryCraft_Data.Stats["regen"]*2, 2).." / Tick")
TheoryCraftAddVital("Regen Whilst Casting", round(TheoryCraft_Data.Stats["icregen"]*2, 2).." / Tick")
TheoryCraftAddStat("Stamina", math.floor(TheoryCraft_GetStat("stamina")))
TheoryCraftAddStat("Intellect", math.floor(TheoryCraft_GetStat("intellect")))
TheoryCraftAddStat("Spirit", math.floor(TheoryCraft_GetStat("spirit")))
end
else
TheoryCraftAddVital("Mana", math.floor(TheoryCraft_GetStat("totalmana")))
TheoryCraftAddVital("Normal Regen", round(TheoryCraft_Data.Stats["regen"]*2, 2).." / Tick")
TheoryCraftAddVital("Regen Whilst Casting", round(TheoryCraft_Data.Stats["icregen"]*2, 2).." / Tick")
TheoryCraftAddStat("Stamina", math.floor(TheoryCraft_GetStat("stamina")))
TheoryCraftAddStat("Intellect", math.floor(TheoryCraft_GetStat("intellect")))
TheoryCraftAddStat("Spirit", math.floor(TheoryCraft_GetStat("spirit")))
end
TheoryCraftModsLeft:SetHeight(288-TheoryCraftStatsLeft:GetHeight()-TheoryCraftVitalsLeft:GetHeight()-10*highestnumber)
TheoryCraftModsRight:SetHeight(TheoryCraftModsLeft:GetHeight())
local proceffect
if TheoryCraft_GetStat("FrostboltNetherwind") ~= 0 then
proceffect = 1
end
if TheoryCraft_GetStat("Beastmanarestore") ~= 0 then
proceffect = 1
end
if TheoryCraft_Data.EquipEffects["procs"] then
if TheoryCraft_IsDifferent(TheoryCraft_Data.EquipEffects["procs"], { }) then
proceffect = 1
end
end
if proceffect then
TheoryCraftAddMod("Proc Effect", " ")
end
if TheoryCraft_GetStat("CritReport") ~= 0 then
TheoryCraftAddMod("Crit Chance", "+"..(TheoryCraft_GetStat("CritReport")).."%")
end
if (class ~= "HUNTER") and (class ~= "WARRIOR") and (class ~= "ROGUE") then
if TheoryCraft_GetStat("Allcritchance") ~= 0 then
TheoryCraftAddMod("Spell Crit Chance", round(TheoryCraft_Data.Stats["critchance"], 2).."% + "..(TheoryCraft_GetStat("Allcritchance")).."%")
else
TheoryCraftAddMod("Spell Crit Chance", round(TheoryCraft_Data.Stats["critchance"], 2).."%")
end
end
AddMods(1, "critchance", "DONT", "Heal Crit Chance", "Damage Spell Crit Chance", " Crit Chance", "+", "%")
AddMods(1, "", "+Damage and Healing", "+Healing", "+Spell Damage", " Damage", "", "", "+")
if TheoryCraft_GetStat("Undead") ~= 0 then
TheoryCraftAddMod("+Damage to Undead", TheoryCraft_GetStat("Undead"))
end
if TheoryCraft_GetStat("AttackPowerReport") ~= 0 then
TheoryCraftAddMod("Attack Power", "+"..(TheoryCraft_GetStat("AttackPowerReport")))
end
if TheoryCraft_GetStat("RangedAttackPowerReport") ~= 0 then
TheoryCraftAddMod("Ranged Attack Power", "+"..(TheoryCraft_GetStat("RangedAttackPowerReport")))
end
if TheoryCraft_GetStat("BlockValueReport") ~= 0 then
TheoryCraftAddMod("Shield Block Value", TheoryCraft_GetStat("BlockValueReport"))
end
AddMods(1, "hitchance", "Spell Hit Chance", "", "Damage Spell Hit Chance", " Hit Chance", "+", "%")
if TheoryCraft_GetStat("Meleehitchance") ~= 0 then
TheoryCraftAddMod("Hit Chance", "+"..(TheoryCraft_GetStat("Meleehitchance")).."%")
end
AddMods(1, "penetration", "Spell Penetration", "", "Damage Spell Penetration", " Penetration", "", "")
if TheoryCraft_GetStat("manaperfive") ~= 0 then
TheoryCraftAddMod("Mana Per Five", TheoryCraft_GetStat("manaperfive"))
end
if TheoryCraft_GetStat("ICPercent") ~= 0 then
TheoryCraftAddMod("Spirit In 5 Rule", (TheoryCraft_GetStat("ICPercent")*100).."%")
end
if TheoryCraft_GetStat("manarestore") ~= 0 then
TheoryCraftAddMod("Mana Restore", TheoryCraft_GetStat("manarestore"))
end
UpdateCustomOutfit()
end
function TheoryCraft_Combo1Click()
local optionID = this:GetID()
UIDropDownMenu_SetSelectedID(TheoryCrafttryfirst, optionID)
TheoryCraft_Settings["tryfirst"] = this.value
TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
end
function TheoryCraft_Combo2Click()
local optionID = this:GetID()
UIDropDownMenu_SetSelectedID(TheoryCrafttrysecond, optionID)
TheoryCraft_Settings["trysecond"] = this.value
TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
end
function TheoryCraft_Combo3Click()
local optionID = this:GetID()
UIDropDownMenu_SetSelectedID(TheoryCrafttryfirstsfg, optionID)
TheoryCraft_Settings["tryfirstsfg"] = this.value
TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
end
function TheoryCraft_Combo4Click()
local optionID = this:GetID()
UIDropDownMenu_SetSelectedID(TheoryCrafttrysecondsfg, optionID)
TheoryCraft_Settings["trysecondsfg"] = this.value
TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
end
function TheoryCraft_OutfitClick()
UIDropDownMenu_SetSelectedID(TheoryCraftoutfit, this:GetID())
TheoryCraft_Data["outfit"] = this.value
if this.value == 2 then
TheoryCraftCustomOutfit:Show()
else
TheoryCraftCustomOutfit:Hide()
end
TheoryCraft_UpdateGear("player", true)
TheoryCraft_LoadStats()
TheoryCraft_GenerateAll()
end
local info = {}
local function AddButton(i, text, value, func, remaining)
TheoryCraft_DeleteTable(info)
info.remaining = true
info.text = text
info.value = value
info.func = func
UIDropDownMenu_AddButton(info)
if (func == TheoryCraft_Combo1Click) and (TheoryCraft_Settings["tryfirst"] == value) then
UIDropDownMenu_SetSelectedID(TheoryCrafttryfirst, i)
end
if (func == TheoryCraft_Combo2Click) and (TheoryCraft_Settings["trysecond"] == value) then
UIDropDownMenu_SetSelectedID(TheoryCrafttrysecond, i)
end
if (func == TheoryCraft_Combo3Click) and (TheoryCraft_Settings["tryfirstsfg"] == value) then
UIDropDownMenu_SetSelectedID(TheoryCrafttryfirstsfg, i)
end
if (func == TheoryCraft_Combo4Click) and (TheoryCraft_Settings["trysecondsfg"] == value) then
UIDropDownMenu_SetSelectedID(TheoryCrafttrysecondsfg, i)
end
if (func == TheoryCraft_OutfitClick) and ((TheoryCraft_Data["outfit"] == value) or ((TheoryCraft_Data["outfit"] == nil) and (value == 1))) then
UIDropDownMenu_SetSelectedID(TheoryCraftoutfit, i)
end
return i + 1
end
function TheoryCraft_InitDropDown()
local a
local i = 1
if string.find(this:GetName(), "TheoryCraftoutfit") then
for k, v in pairs(TheoryCraft_Outfits) do
if ((v.class == nil) or (class == v.class)) then
i = AddButton(i, (v.shortname or v.name), k, TheoryCraft_OutfitClick)
end
end
return
end
if string.find(this:GetName(), "sfg") then
if string.find(this:GetName(), "TheoryCrafttryfirst") then
a = TheoryCraft_Combo3Click
else
a = TheoryCraft_Combo4Click
end
i = AddButton(i, "0.01", 2, a)
i = AddButton(i, "0.1", 1, a)
i = AddButton(i, "1", 0, a)
i = AddButton(i, "10", -1, a)
i = AddButton(i, "100", -2, a)
i = AddButton(i, "1000", -3, a)
return
end
if string.find(this:GetName(), "TheoryCrafttryfirst") then
a = TheoryCraft_Combo1Click
else
a = TheoryCraft_Combo2Click
end
i = AddButton(i, "Do Nothing", "donothing", a)
i = AddButton(i, "Min Damage", "mindamage", a)
i = AddButton(i, "Max Damage", "maxdamage", a)
i = AddButton(i, "Average Damage", "averagedam", a)
i = AddButton(i, "Ave Dam (no crits)", "averagedamnocrit", a)
i = AddButton(i, "DPS", "dps", a)
i = AddButton(i, "With Dot DPS", "withdotdps", a)
i = AddButton(i, "DPM", "dpm", a)
i = AddButton(i, "Total Damage", "maxoomdamfloored", a)
i = AddButton(i, "Total Damage (left)", "maxoomdamremaining", a)
i = AddButton(i, "Min Heal", "minheal", a)
i = AddButton(i, "Max Heal", "maxheal", a)
i = AddButton(i, "Average Heal", "averageheal", a)
i = AddButton(i, "Ave Heal (no crits)", "averagehealnocrit", a)
i = AddButton(i, "HPS", "hps", a)
i = AddButton(i, "With Hot HPS", "withhothps", a)
i = AddButton(i, "HPM", "hpm", a)
i = AddButton(i, "Total Healing", "maxoomhealfloored", a)
i = AddButton(i, "Total Healing (left)", "maxoomhealremaining", a)
i = AddButton(i, "Spellcasts remaining", "spellcasts", a)
end
function TheoryCraft_SetTalent(arg1)
local name = this:GetName()
local i = 1
local i2 = tonumber(string.sub(name, 18, 18))
local numberneeded = tonumber(string.sub(name, 19, 19))
local number = 1
local newrank = 0
local _, currank, maxRank
number = 1
while (TheoryCraft_Talents[i]) do
if (class == TheoryCraft_Talents[i].class) and (TheoryCraft_Talents[i].dontlist == nil) and (((TheoryCraft_Talents[i].tree == i2) and (TheoryCraft_Talents[i].forcetree == nil)) or (TheoryCraft_Talents[i].forcetree == i2)) then
if (number == numberneeded) then
nameneeded = TheoryCraft_Talents[i].name
_, _, _, _, currank, maxRank= GetTalentInfo(TheoryCraft_Talents[i].tree, TheoryCraft_Talents[i].number)
if (TheoryCraft_Talents[i].forceto == nil) or (TheoryCraft_Talents[i].forceto == -1) then
newrank = currank + 1
else
newrank = TheoryCraft_Talents[i].forceto + 1
end
if newrank > maxRank then
newrank = 0
end
break
end
number = number + 1
end
i = i+1
end
i = 1
while (TheoryCraft_Talents[i]) do
if (class == TheoryCraft_Talents[i].class) then
if (TheoryCraft_Talents[i].name == nameneeded) then
TheoryCraft_Talents[i].forceto = newrank
end
end
i = i+1
end
TheoryCraft_UpdateTalents()
end
function TheoryCraft_UpdateButtonTextPos()
TheoryCraft_Settings["buttontextx"] = (this:GetParent():GetLeft()-this:GetLeft())/3
TheoryCraft_Settings["buttontexty"] = (this:GetParent():GetTop()-this:GetTop())/3
TheoryCraftdummytext:GetParent():ClearAllPoints()
TheoryCraftdummytext:GetParent():SetPoint("TOPLEFT", TheoryCraftdummytext:GetParent():GetParent(), "TOPLEFT", -TheoryCraft_Settings["buttontextx"]*3, -TheoryCraft_Settings["buttontexty"]*3)
TheoryCraftdummytext:GetParent():SetPoint("BOTTOMRIGHT", TheoryCraftdummytext:GetParent():GetParent(), "BOTTOMRIGHT", -TheoryCraft_Settings["buttontextx"]*3, -TheoryCraft_Settings["buttontexty"]*3)
end
function TheoryCraft_UpdateDummyButtonText(dontupdate)
if not dontupdate then
TheoryCraftFontPath:SetText(TheoryCraft_Settings["FontPath"])
TheoryCraftColR:SetText(TheoryCraft_Settings["ColR"]*255)
TheoryCraftColG:SetText(TheoryCraft_Settings["ColG"]*255)
TheoryCraftColB:SetText(TheoryCraft_Settings["ColB"]*255)
TheoryCraftColR2:SetText(TheoryCraft_Settings["ColR2"]*255)
TheoryCraftColG2:SetText(TheoryCraft_Settings["ColG2"]*255)
TheoryCraftColB2:SetText(TheoryCraft_Settings["ColB2"]*255)
TheoryCraftFontSize:SetText(TheoryCraft_Settings["FontSize"])
end
TheoryCraftdummytext:GetParent():ClearAllPoints()
TheoryCraftdummytext:GetParent():SetPoint("TOPLEFT", TheoryCraftdummytext:GetParent():GetParent(), "TOPLEFT", -TheoryCraft_Settings["buttontextx"]*3, -TheoryCraft_Settings["buttontexty"]*3)
TheoryCraftdummytext:GetParent():SetPoint("BOTTOMRIGHT", TheoryCraftdummytext:GetParent():GetParent(), "BOTTOMRIGHT", -TheoryCraft_Settings["buttontextx"]*3, -TheoryCraft_Settings["buttontexty"]*3)
TheoryCraftdummytext:SetFont(TheoryCraft_Settings["FontPath"], TheoryCraft_Settings["FontSize"]*3, "OUTLINE")
TheoryCraftdummytext:SetTextColor(TheoryCraft_Settings["ColR"], TheoryCraft_Settings["ColG"], TheoryCraft_Settings["ColB"])
TheoryCraftdummytext:SetJustifyV("MIDDLE")
if TheoryCraft_Settings["alignleft"] then
TheoryCraftdummytext:SetJustifyH("LEFT")
elseif TheoryCraft_Settings["alignright"] then
TheoryCraftdummytext:SetJustifyH("RIGHT")
else
TheoryCraftdummytext:SetJustifyH("CENTER")
end
end
local function formattext(a, field, places)
if places == nil then
places = 0
end
if (field == "averagedam") or (field == "averageheal") then
if TheoryCraft_Settings["dontcrit"] then
field = field.."nocrit"
end
end
if a[field] == nil then
return nil
end
if (field == "maxoomdam") or (field == "maxoomdamremaining") or (field == "maxoomdamfloored") or
(field == "maxoomheal") or (field == "maxoomhealremaining") or (field == "maxoomhealfloored") then
return round(a[field]/1000*10^places)/10^places.."k"
end
return round(a[field]*10^places)/10^places
end
function TheoryCraft_GB_Spellbook_UpdatePage(start, finish)
TheoryCraft_Data["oldGBMSB"](start, finish)
local i2
for i = 1,40 do
i2 = getglobal("GB_MiniSpellbook_Spell_"..i.."_TCText")
if i2 then
i2.ID = i+start-1
end
TheoryCraft_UpdatedButtons["GB_MiniSpellbook_Spell_"..i.."_TCText"] = nil
end
end
function TheoryCraft_ButtonUpdate()
if this.oldupdatescript then
this.oldupdatescript()
end
if (TheoryCraft_Settings["framebyframe"] or UnitAffectingCombat("player")) and TheoryCraft_UpdatedThisRound then
return
end
local i = this:GetName().."_TCText"
local buttontext = getglobal(i)
if (buttontext.fontsize ~= TheoryCraft_Settings["FontSize"]) or
(buttontext.fontpath ~= TheoryCraft_Settings["FontPath"]) then
buttontext.fontsize = TheoryCraft_Settings["FontSize"]
buttontext.fontpath = TheoryCraft_Settings["FontPath"]
buttontext:SetFont(TheoryCraft_Settings["FontPath"], buttontext.fontsize, "OUTLINE")
end
if (buttontext.colr ~= TheoryCraft_Settings["ColR"]) or
(buttontext.colg ~= TheoryCraft_Settings["ColG"]) or
(buttontext.colb ~= TheoryCraft_Settings["ColB"]) or
(buttontext.colr2 ~= TheoryCraft_Settings["ColR2"]) or
(buttontext.colg2 ~= TheoryCraft_Settings["ColG2"]) or
(buttontext.colb2 ~= TheoryCraft_Settings["ColB2"]) then
buttontext.colr = TheoryCraft_Settings["ColR"]
buttontext.colg = TheoryCraft_Settings["ColG"]
buttontext.colb = TheoryCraft_Settings["ColB"]
buttontext.colr2 = TheoryCraft_Settings["ColR2"]
buttontext.colg2 = TheoryCraft_Settings["ColG2"]
buttontext.colb2 = TheoryCraft_Settings["ColB2"]
TheoryCraft_UpdatedButtons[i] = nil
end
if (buttontext.buttontextx ~= TheoryCraft_Settings["buttontextx"]) or (buttontext.buttontexty ~= TheoryCraft_Settings["buttontexty"]) then
buttontext.buttontextx = TheoryCraft_Settings["buttontextx"]
buttontext.buttontexty = TheoryCraft_Settings["buttontextx"]
buttontext:ClearAllPoints()
buttontext:SetPoint("TOPLEFT", this, "TOPLEFT", -TheoryCraft_Settings["buttontextx"], -TheoryCraft_Settings["buttontexty"])
buttontext:SetPoint("BOTTOMRIGHT", this, "BOTTOMRIGHT", -TheoryCraft_Settings["buttontextx"], -TheoryCraft_Settings["buttontexty"])
end
if (buttontext.align == nil) or
((buttontext.align == 1) and (not TheoryCraft_Settings["alignleft"])) or
((buttontext.align == 2) and (not TheoryCraft_Settings["alignright"])) or
((buttontext.align == 3) and (TheoryCraft_Settings["alignleft"] or TheoryCraft_Settings["alignright"])) then
buttontext:SetJustifyV("MIDDLE")
if TheoryCraft_Settings["alignleft"] then
buttontext.align = 1
buttontext:SetJustifyH("LEFT")
elseif TheoryCraft_Settings["alignright"] then
buttontext.align = 2
buttontext:SetJustifyH("RIGHT")
else
buttontext.align = 3
buttontext:SetJustifyH("CENTER")
end
end
if buttontext.type == "Discord" then
local actionid = this:GetActionID()
if buttontext.actionbutton ~= actionid then
TheoryCraft_UpdatedButtons[i] = nil
buttontext.actionbutton = actionid
end
end
if TheoryCraft_UpdatedButtons[i] then
if TheoryCraft_Data["reporttimes"] then
if TheoryCraft_Settings["framebyframe"] then
Print("As TC is set to frame by frame mode, only one tooltip needs to be regenerated per frame.")
local timetaken = round(TheoryCraft_Data["timetaken"]*1000)
Print("This takes approximately: "..timetaken.." milliseconds. One button will be generated per frame at this speed until all have been regenerated. It will not cause noticeable lag.")
else
Print("TheoryCraft has to generate: "..TheoryCraft_Data["buttonsgenerated"].." tooltips whenever you or your target change in a way that'll modify at least one tooltip.")
local timetaken = round(TheoryCraft_Data["timetaken"]*1000)
Print("This takes approximately: "..timetaken.." milliseconds. Keep in mind that WoW's timer is only accurate to 1ms, making this not entirely reliable.")
if tonumber(timetaken) < 50 then
Print("This will *not* result in noticeable frame skip, so it would be best to leave frame by frame disabled.")
else
Print("This will result in noticeable frame skip, and so you may want to consider setting TC to frame by frame mode. This mode is enabled by default whilst in combat. Alternatively you could reduce the number of buttons showing button text.")
end
end
TheoryCraft_Data["reporttimes"] = nil
end
return
else
TheoryCraft_UpdatedThisRound = true
-- Counter = (Counter or 0) + 1
-- Print(Counter)
TheoryCraft_UpdatedButtons[i] = true
if not TheoryCraft_Settings["buttontext"] then
buttontext:Hide()
return
end
local tryfirst, trysecond, spelldata
if buttontext.type == "SpellBook" then
local id = getglobal(this:GetName().."SpellName"):GetText()
local id2 = getglobal(this:GetName().."SubSpellName"):GetText()
if (not (getglobal(this:GetName().."SpellName"):IsShown())) or (id == nil) then
buttontext:Hide()
id = nil
end
if id then
id2 = tonumber(findpattern(id2, "%d+"))
if id2 == nil then id2 = 0 end
spelldata = TheoryCraft_GetSpellDataByName(id, id2)
end
elseif buttontext.type == "GBMiniSpellBook" then
local spellname, spellrank = GetSpellName(buttontext.ID, "BOOKTYPE_SPELL");
if spellname then
spellrank = tonumber(findpattern(spellrank, "%d+"))
if spellrank == nil then spellrank = 0 end
spelldata = TheoryCraft_GetSpellDataByName(spellname, spellrank)
end
elseif buttontext.type == "GBButton" then
local name = GB_Settings[GB_INDEX][buttontext:GetParent():GetParent().index].Button[buttontext:GetParent():GetID()].name;
local rank = GB_Settings[GB_INDEX][buttontext:GetParent():GetParent().index].Button[buttontext:GetParent():GetID()].rank;
if name then
rank = tonumber(findpattern(rank, "%d+"))
if rank == nil then rank = 0 end
spelldata = TheoryCraft_GetSpellDataByName(name, rank)
end
elseif buttontext.type == "Normal" then
TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
TCTooltip:SetAction(buttontext:GetParent():GetID())
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
elseif buttontext.type == "Flippable" then
TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
TCTooltip:SetAction(buttontext:GetParent():GetID()+(CURRENT_ACTIONBAR_PAGE-1)*NUM_ACTIONBAR_BUTTONS)
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
elseif buttontext.type == "Special" then
TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
TCTooltip:SetAction(buttontext.specialid)
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
elseif buttontext.type == "Discord" then
TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
TCTooltip:SetAction(buttontext.actionbutton)
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
elseif buttontext.type == "Gypsy" then
TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
TCTooltip:SetAction(Gypsy_ActionButton_GetPagedID (this))
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
elseif buttontext.type == "Bonus" then
TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
if ( CURRENT_ACTIONBAR_PAGE==1 ) then
TCTooltip:SetAction(this:GetID() + ((NUM_ACTIONBAR_PAGES+GetBonusBarOffset()-1)*NUM_ACTIONBAR_BUTTONS))
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
else
TCTooltip:SetAction(this:GetID() + ((CURRENT_ACTIONBAR_PAGE-1)*NUM_ACTIONBAR_BUTTONS))
spelldata = TheoryCraft_GetSpellDataByFrame(TCTooltip)
end
end
if spelldata then
tryfirst = formattext(spelldata, TheoryCraft_Settings["tryfirst"], TheoryCraft_Settings["tryfirstsfg"])
if tryfirst then
buttontext:SetText(tryfirst)
buttontext:SetTextColor(buttontext.colr, buttontext.colg, buttontext.colb)
buttontext:Show()
if getglobal(this:GetName().."Name") then getglobal(this:GetName().."Name"):Hide() end
if getglobal(buttontext:GetParent():GetName().."_Rank") then getglobal(buttontext:GetParent():GetName().."_Rank"):Hide() end
else
trysecond = formattext(spelldata, TheoryCraft_Settings["trysecond"], TheoryCraft_Settings["trysecondsfg"])
if trysecond then
buttontext:SetText(trysecond)
buttontext:SetTextColor(buttontext.colr2, buttontext.colg2, buttontext.colb2)
if getglobal(this:GetName().."Name") then getglobal(this:GetName().."Name"):Hide() end
if getglobal(buttontext:GetParent():GetName().."_Rank") then getglobal(buttontext:GetParent():GetName().."_Rank"):Hide() end
buttontext:Show()
else
if getglobal(this:GetName().."Name") then getglobal(this:GetName().."Name"):Show() end
if getglobal(buttontext:GetParent():GetName().."_Rank") then getglobal(buttontext:GetParent():GetName().."_Rank"):Show() end
buttontext:Hide()
end
end
else
if getglobal(this:GetName().."Name") then getglobal(this:GetName().."Name"):Show() end
buttontext:Hide()
end
end
end
function TheoryCraft_AddButtonText()
local newbutton, oldbutton
local setupbutton = TheoryCraft_SetUpButton
function TheoryCraft_Nurfed_ActionButton_OnUpdate(elapsed)
TheoryCraft_Data["oldNurfed"](elapsed)
setupbutton(this:GetName(), "Normal")
end
if SpellButton1 then
for i = 1,12 do setupbutton("SpellButton"..i, "SpellBook") end
end
if M1BarButton1 then
for i = 1,18 do setupbutton("M1BarButton"..i, "Normal") end
for i = 1,18 do setupbutton("M2BarButton"..i, "Normal") end
for i = 1,18 do setupbutton("M3BarButton"..i, "Normal") end
end
if DAB_ActionButton_1 then
for i = 1,120 do setupbutton("DAB_ActionButton_"..i, "Discord") end
end
if FlexBarButton1 then
for i = 1,120 do setupbutton("FlexBarButton"..i, "Normal") end
end
if Nurfed_ActionButton1 then
for i = 1,120 do setupbutton("Nurfed_ActionButton"..i, "Normal") end
end
if CT_ActionButton1 then
for i = 1,12 do setupbutton("CT_ActionButton"..i, "Special", 12+i) end
for i = 1,12 do setupbutton("CT2_ActionButton"..i, "Special", 24+i) end
for i = 1,12 do setupbutton("CT3_ActionButton"..i, "Special", 36+i) end
for i = 1,12 do setupbutton("CT4_ActionButton"..i, "Special", 48+i) end
end
if Gypsy_ActionButton1 then
for i = 1,12 do setupbutton("Gypsy_ActionButton"..i, "Gypsy") end
end
if GB_MiniSpellbook_Spell_1 then
for i = 1,40 do setupbutton("GB_MiniSpellbook_Spell_"..i, "GBMiniSpellBook") end
end
if GB_PlayerBar_Button_1 then
for i = 1,20 do setupbutton("GB_PlayerBar_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_PartyBar1_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_PartyBar2_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_PartyBar3_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_PartyBar4_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_FriendlyTargetBar_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_HostileTargetBar_Button_"..i, "GBButton") end
for i = 1,20 do setupbutton("GB_LowestHealthBar_Button_"..i, "GBButton") end
for i = 1,6 do setupbutton("GB_RaidBar_Button_"..i, "GBButton") end
end
if ActionButton1 then
for i = 1,12 do setupbutton("ActionButton"..i, "Flippable") end
for i = 1,12 do setupbutton("MultiBarRightButton"..i, "Special", 24+i) end
for i = 1,12 do setupbutton("MultiBarLeftButton"..i, "Special", 36+i) end
for i = 1,12 do setupbutton("MultiBarBottomRightButton"..i, "Special", 48+i) end
for i = 1,12 do setupbutton("MultiBarBottomLeftButton"..i, "Special", 60+i) end
for i = 1,12 do setupbutton("BonusActionButton"..i, "Bonus") end
end
end
Generated by GNU Enscript 1.6.5.90.