--[[
Name: Rating Buster
Revision: $Revision: 2 $
Developed by: Whitetooth@Cenarius (hotdogee@巴哈姆特baha)
Description: Converts combat ratings in tooltips into normal percentages.
]]
-----------------
-- Addon Setup --
-----------------
-- Version Info
local MAJOR_VERSION = "0.7.1"
--local MINOR_VERSION = tonumber((string.gsub("$Revision: 2 $", "^.-(%d+).-$", "%1")))
-- Librarys
local Compost = AceLibrary("Compost-2.0")
local L = AceLibrary("AceLocale-2.2"):new("RatingBuster")
-- AceAddon Initialization
RatingBuster = AceLibrary("AceAddon-2.0"):new("AceDB-2.0", "AceConsole-2.0", "AceEvent-2.0", "AceDebug-2.0")
RatingBuster.title = "Rating Buster"
RatingBuster.version = MAJOR_VERSION
--RatingBuster.date = string.gsub("$Date: 2006-11-05 15:10:31 -0700 (Sun, 03 Sep 2006) $", "^.-(%d%d%d%d%-%d%d%-%d%d).-$", "%1")
-- Set Debugging
RatingBuster:SetDebugging(false)
---------------------
-- Saved Variables --
---------------------
-- Register DB
RatingBuster:RegisterDB("RatingBusterDB")
-- Default values
RatingBuster.DBDefaults = {
showItemLevel = true,
showItemID = false,
useRequiredLevel = true,
}
-- Register Defaults
RatingBuster:RegisterDefaults("profile", RatingBuster.DBDefaults)
---------------------------
-- Slash Command Options --
---------------------------
local consoleOptions = {
type='group',
args = {
itemid = {
type = 'toggle',
name = L["Show Item ID"],
desc = L["Toggle display of Item ID in tooltip"],
get = function() return RatingBuster.db.profile.showItemID end,
set = function(v) RatingBuster.db.profile.showItemID = v end,
},
itemlevel = {
type = 'toggle',
name = L["Show Item Level"],
desc = L["Toggle display of Item Level in tooltip"],
get = function() return RatingBuster.db.profile.showItemLevel end,
set = function(v) RatingBuster.db.profile.showItemLevel = v end,
},
usereqlv = {
type = 'toggle',
name = L["Use Required Level"],
desc = L["Toggle calculate using the required level if you are below the required level"],
get = function() return RatingBuster.db.profile.useRequiredLevel end,
set = function(v) RatingBuster.db.profile.useRequiredLevel = v end,
},
targetlevel = {
type = 'range',
name = L["Target Level"],
desc = L["Changes the Target Level used in rating calculations"],
get = function() return RatingBuster.targetLevel end,
set = function(v) RatingBuster.targetLevel = v end,
min = 10,
max = 73, -- set to level cap + 3
step = 1,
},
},
}
RatingBuster:RegisterChatCommand({"/rb", "/ratingbuster"}, consoleOptions)
---------------------
-- Initializations --
---------------------
function RatingBuster:OnInitialize()
-- Build the RatingNameToID table from L["ratingNames"] table
self:BuildRatingNameToID()
-- Hook tooltip SetX methods
self:HookTooltipMethods()
end
function RatingBuster:BuildRatingNameToID()
RatingBuster.RatingNameToID = {}
for _, v in ipairs(L["ratingNames"]) do
self.RatingNameToID[v[1]] = v[2]
end
end
function RatingBuster:OnEnable()
-- Initialize targetLevel
RatingBuster.targetLevel = UnitLevel("player")
-- Check player level for lowbies
if RatingBuster.targetLevel < 10 then
RatingBuster.targetLevel = 10
end
-- for setting a new level
self:RegisterEvent("PLAYER_LEVEL_UP")
end
function RatingBuster:OnDisable()
end
-- event = PLAYER_LEVEL_UP
-- arg1 = New player level
function RatingBuster:PLAYER_LEVEL_UP()
RatingBuster.targetLevel = arg1
end
------------------------------------------
-- Hook Tooltip OnTooltipSetItem Script --
------------------------------------------
RatingBuster.TooltipList = {
ItemRefTooltip,
GameTooltip,
ShoppingTooltip1,
ShoppingTooltip2,
--EquipCompare support
ComparisonTooltip1,
ComparisonTooltip2,
--EQCompare support
EQCompareTooltip1,
EQCompareTooltip2,
-- socketing interface
--ItemSocketingDescription, -- commented out cause can't get it to work
-- LinkWrangler support
IRR_ItemRefTooltip1,
IRR_ItemCompTooltip1,
IRR_ItemCompTool11,
IRR_ItemRefTooltip2,
IRR_ItemCompTooltip2,
IRR_ItemCompTool12,
IRR_ItemRefTooltip3,
IRR_ItemCompTooltip3,
IRR_ItemCompTool13,
IRR_ItemRefTooltip4,
IRR_ItemCompTooltip4,
IRR_ItemCompTool14,
IRR_ItemRefTooltip5,
IRR_ItemCompTooltip5,
IRR_ItemCompTool15,
-- MultiTips support
ItemRefTooltip2,
ItemRefTooltip3,
ItemRefTooltip4,
ItemRefTooltip5,
}
-- OnTooltipSetItem handler
function RatingBuster.SetItem(tooltip)
local _, link = tooltip:GetItem()
RatingBuster.ProcessTooltip(tooltip, link)
end
function RatingBuster:HookTooltipMethods()
for _, tooltip in pairs(self.TooltipList) do
if tooltip then
-- Use new script handler: OnTooltipSetItem: function(self) - Triggered when a Tooltip shows an item *2.0.3*
-- name, link = Tooltip:GetItem() *2.0.3*
if tooltip:HasScript("OnTooltipSetItem") then
if tooltip:GetScript("OnTooltipSetItem") then
local oldScript = tooltip:GetScript("OnTooltipSetItem")
tooltip:SetScript("OnTooltipSetItem", function(tooltip)
oldScript(tooltip)
RatingBuster.SetItem(tooltip)
end)
else
tooltip:SetScript("OnTooltipSetItem", RatingBuster.SetItem)
end
end
end
end
end
--------------------------
-- Process Tooltip Core --
--------------------------
--[[
Method 1
"+15 Crit Rating"
-> "+15(1.20%) Crit Rating"
"Equip: Increases your hit rating by 10."
-> "Equip: Increases your hit rating by 10(1.20%)."
Method 2
"+15 Crit Rating"
-> "+15 Crit Rating (1.20%)"
"Equip: Increases your hit rating by 10."
-> "Equip: Increases your hit rating by 10. (1.20%)"
Method 3
"+15 Crit Rating"
-> "+15 Crit Rating (1.20%)"
"Equip: Increases your hit rating by 10."
-> "Equip: +10 Hit Rating (1.20%)"
Method 4
+10 Sta (100HP)
Equip: Adds 15 critical hit rating (.85% )
Equip: Adds 12 resilience (-.58% crit, -1.16% crit damage)
--]]
function RatingBuster.ProcessTooltip(tooltip, link)
-- check if in standby mode
if not RatingBuster:IsActive() then return end
-- Get Required Level
local requiredLevel
if RatingBuster.db.profile.useRequiredLevel and link then
_, _, _, _, requiredLevel = GetItemInfo(link)
--RatingBuster:Print(link..", "..requiredLevel)
if requiredLevel and requiredLevel <= RatingBuster.targetLevel then
requiredLevel = nil
end
end
--Anlegen: Erhöht die Chance aller Gruppenmitglieder, die sich im Umkreis von 30 befinden, auf einen kritischen Treffer mit Zaubern um 28%.
for i = 2, tooltip:NumLines() do
local fontString = getglobal(tooltip:GetName().."TextLeft"..i)
local lineText = fontString:GetText()
if lineText and strfind(lineText, "%d") then -- do nothing if we don't find a number
for _, p in ipairs(L["numberPatterns"]) do
local text = lineText
local lowerText = string.lower(text) -- convert to lower so we don't have to worry about same ratings with different cases
-- Capture the increased amount
local s, e, amount = strfind(lowerText, p.pattern)
if amount then
-- Check for separators
local separator
for _, s in ipairs(p.separators) do
if strfind(lineText, s) then
separator = s
-- Replace separator strings found in lineText with a single character "/", so we can use strsplit()
lineText = string.gsub(lineText, s, "/")
-- only need support for 1 kind of separator per line, we will use the first one found, so break out here
break
end
end
-- If this line has a separator, then we do the split and combine algorithm
if separator then
local splitText = Compost:Acquire(strsplit("/", lineText))
--RatingBuster:Debug(p.pattern)
for i, text in ipairs(splitText) do
--RatingBuster:Debug(text)
local lowerText = string.lower(text) -- convert to lower so we don't have to worry about same ratings with different cases
-- Capture the increased amount
local s, e, amount = strfind(lowerText, p.pattern)
if amount then
-- Capture the rating name
local ratingID
for _, v in ipairs(L["ratingNames"]) do
if strfind(lowerText, v[1]) then
ratingID = RatingBuster.RatingNameToID[v[1]]
break
end
end
if ratingID then
-- calculate reverse value
local reversedAmount = ReverseRating(tonumber(amount), ratingID, requiredLevel or RatingBuster.targetLevel)
--RatingBuster:Debug(reversedAmount..", "..amount..", "..ratingID..", "..RatingBuster.targetLevel)-- debug
-- build reversed string
local reversedString
-- check if rating is a skill type
if ratingID == 1 or ratingID == 2 then
reversedString = "("..format("%.2f", reversedAmount)..")"
-- check if rating is resilience
elseif ratingID == 15 then
reversedString = "(-"..format("%.2f", reversedAmount).."%%%%)"
else
reversedString = "("..format("%.2f", reversedAmount).."%%%%)"
end
-- build converted string
splitText[i] = string.gsub(text, p.pattern, string.gsub(strsub(text, s, e), "%d+", "%0 "..reversedString), 1)
end
end
end -- for i, text in ipairs(splitText)
lineText = strjoin(separator, unpack(splitText))
Compost:Reclaim(splitText)
else
-- Capture the rating name
local ratingID
for _, v in ipairs(L["ratingNames"]) do
if strfind(lowerText, v[1]) then
ratingID = RatingBuster.RatingNameToID[v[1]]
break
end
end
if ratingID then
-- calculate reverse value
local reversedAmount = ReverseRating(tonumber(amount), ratingID, requiredLevel or RatingBuster.targetLevel)
--RatingBuster:Debug(reversedAmount..", "..amount..", "..ratingID..", "..RatingBuster.targetLevel)-- debug
-- build reversed string
local reversedString
-- check if rating is a skill type
if ratingID == 1 or ratingID == 2 then
reversedString = "("..format("%.2f", reversedAmount)..")"
-- check if rating is resilience
elseif ratingID == 15 then
reversedString = "(-"..format("%.2f", reversedAmount).."%%%%)"
else
reversedString = "("..format("%.2f", reversedAmount).."%%%%)"
end
-- build converted string
lineText = string.gsub(text, p.pattern, string.gsub(strsub(text, s, e), "%d+", "%0 "..reversedString), 1)
end
end
end
end
-- SetText
fontString:SetText(lineText)
end -- if text then
end -- for i = 2, tooltip:NumLines() do
-- Item Level and Item ID
-- Check for ItemLevel addon, do nothing if found
if not ItemLevel_AddInfo and (RatingBuster.db.profile.showItemLevel or RatingBuster.db.profile.showItemID)then
local id, level
-- Get the Item ID from the link string
if link then
_, link, _, level = GetItemInfo(link)
if link then
_, _, id = strfind(link, "item:(%d+)")
end
local newLine = ""
if level and RatingBuster.db.profile.showItemLevel then
newLine = newLine..L["ItemLevel: "]..level
end
if id and RatingBuster.db.profile.showItemID then
if newLine ~= "" then
newLine = newLine..", "
end
newLine = newLine..L["ItemID: "]..id
end
if newLine ~= "" then
tooltip:AddLine(newLine)
end
end
end
tooltip:Show()
end