You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
8.0 KiB
222 lines
8.0 KiB
|
5 years ago
|
local SLE, T, E, L = unpack(select(2, ...))
|
||
|
|
local DB = SLE.DataBars
|
||
|
|
local EDB = E.DataBars
|
||
|
|
|
||
|
|
--GLOBALS: hooksecurefunc
|
||
|
|
local _G = _G
|
||
|
|
local format, ipairs = format, ipairs
|
||
|
|
local NUM_CHAT_WINDOWS = NUM_CHAT_WINDOWS
|
||
|
|
local C_Reputation_IsFactionParagon = C_Reputation.IsFactionParagon
|
||
|
|
local C_Reputation_GetFactionParagonInfo = C_Reputation.GetFactionParagonInfo
|
||
|
|
local GetWatchedFactionInfo, GetFactionInfo, GetFriendshipReputation, GetNumFactions = GetWatchedFactionInfo, GetFactionInfo, GetFriendshipReputation, GetNumFactions
|
||
|
|
|
||
|
|
local FACTION_STANDING_INCREASED = FACTION_STANDING_INCREASED
|
||
|
|
local FACTION_STANDING_INCREASED_GENERIC = FACTION_STANDING_INCREASED_GENERIC
|
||
|
|
local FACTION_STANDING_INCREASED_BONUS = FACTION_STANDING_INCREASED_BONUS
|
||
|
|
local FACTION_STANDING_INCREASED_DOUBLE_BONUS = FACTION_STANDING_INCREASED_DOUBLE_BONUS
|
||
|
|
local FACTION_STANDING_INCREASED_ACH_BONUS = FACTION_STANDING_INCREASED_ACH_BONUS
|
||
|
|
local FACTION_STANDING_DECREASED = FACTION_STANDING_DECREASED
|
||
|
|
local FACTION_STANDING_DECREASED_GENERIC = FACTION_STANDING_DECREASED_GENERIC
|
||
|
|
local FactionStandingLabelUnknown = UNKNOWN
|
||
|
|
local FACTION_BAR_COLORS = FACTION_BAR_COLORS
|
||
|
|
|
||
|
|
local backupColor = FACTION_BAR_COLORS[1]
|
||
|
|
local a, b, c, d = '([%(%)%.%%%+%-%*%?%[%^%$])', '%%%1', '%%%%[ds]', '(.-)'
|
||
|
|
local formatFactionStanding = function(str) return str:gsub(a, b):gsub(c, d) end
|
||
|
|
local strMatchCombat = {}
|
||
|
|
|
||
|
|
DB.RepChatFrames = {}
|
||
|
|
DB.RepIncreaseStrings = {}
|
||
|
|
DB.RepDecreaseStrings = {}
|
||
|
|
DB.factionVars = {}
|
||
|
|
DB.factions = 0
|
||
|
|
DB.RepIncreaseStyles = {
|
||
|
|
STYLE1 = '|T'..DB.Icons.Rep..':%s|t %s: +%s.',
|
||
|
|
STYLE2 = '|T'..DB.Icons.Rep..':%s|t %s: |cff0CD809+%s|r.',
|
||
|
|
}
|
||
|
|
DB.RepDecreaseStyles = {
|
||
|
|
STYLE1 = '|T'..DB.Icons.Rep..':%s|t %s: %s.',
|
||
|
|
STYLE2 = '|T'..DB.Icons.Rep..':%s|t %s: |cffD80909%s|r.',
|
||
|
|
}
|
||
|
|
|
||
|
|
tinsert(strMatchCombat, (formatFactionStanding(FACTION_STANDING_INCREASED)))
|
||
|
|
tinsert(strMatchCombat, (formatFactionStanding(FACTION_STANDING_INCREASED_GENERIC)))
|
||
|
|
tinsert(strMatchCombat, (formatFactionStanding(FACTION_STANDING_INCREASED_BONUS)))
|
||
|
|
tinsert(strMatchCombat, (formatFactionStanding(FACTION_STANDING_INCREASED_DOUBLE_BONUS)))
|
||
|
|
tinsert(strMatchCombat, (formatFactionStanding(FACTION_STANDING_INCREASED_ACH_BONUS)))
|
||
|
|
|
||
|
|
local function GetValues(curValue, minValue, maxValue)
|
||
|
|
local maximum = maxValue - minValue
|
||
|
|
local current, diff = curValue - minValue, maximum
|
||
|
|
|
||
|
|
if diff == 0 then diff = 1 end -- prevent a division by zero
|
||
|
|
|
||
|
|
if current == maximum then
|
||
|
|
return 1, 1, 100, true
|
||
|
|
else
|
||
|
|
return current, maximum, current / diff * 100
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function ReputationBar_Update()
|
||
|
|
if not SLE.initialized or not E.db.sle.databars.reputation.longtext then return end
|
||
|
|
local bar = EDB.StatusBars.Reputation
|
||
|
|
|
||
|
|
if not bar.db.enable or bar:ShouldHide() then return end
|
||
|
|
|
||
|
|
local displayString, textFormat, label = '', EDB.db.reputation.textFormat
|
||
|
|
local name, reaction, minValue, maxValue, curValue, factionID = GetWatchedFactionInfo()
|
||
|
|
local friendshipID, _, _, _, _, _, standingText, _, nextThreshold = GetFriendshipReputation(factionID)
|
||
|
|
|
||
|
|
if friendshipID then
|
||
|
|
reaction, label = 5, standingText
|
||
|
|
|
||
|
|
if not nextThreshold then
|
||
|
|
minValue, maxValue, curValue = 0, 1, 1
|
||
|
|
end
|
||
|
|
elseif C_Reputation_IsFactionParagon(factionID) then
|
||
|
|
local current, threshold
|
||
|
|
current, threshold = C_Reputation_GetFactionParagonInfo(factionID)
|
||
|
|
|
||
|
|
if current and threshold then
|
||
|
|
label, minValue, maxValue, curValue, reaction = L["Paragon"], 0, threshold, current % threshold, 9
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not label then label = _G['FACTION_STANDING_LABEL'..reaction] or UNKNOWN end
|
||
|
|
|
||
|
|
bar:SetMinMaxValues(minValue, maxValue)
|
||
|
|
bar:SetValue(curValue)
|
||
|
|
|
||
|
|
local current, maximum, percent, capped = GetValues(curValue, minValue, maxValue)
|
||
|
|
|
||
|
|
if textFormat == 'PERCENT' then
|
||
|
|
displayString = format('%s: %d%% [%s]', name, percent, label)
|
||
|
|
elseif textFormat == 'CURMAX' then
|
||
|
|
displayString = format('%s: %s - %s [%s]', name, current, maximum, label)
|
||
|
|
elseif textFormat == 'CURPERC' then
|
||
|
|
displayString = format('%s: %s - %d%% [%s]', name, current, percent, label)
|
||
|
|
elseif textFormat == 'CUR' then
|
||
|
|
displayString = format('%s: %s [%s]', name, current, label)
|
||
|
|
elseif textFormat == 'REM' then
|
||
|
|
displayString = format('%s: %s [%s]', name, maximum - current, label)
|
||
|
|
elseif textFormat == 'CURREM' then
|
||
|
|
displayString = format('%s: %s - %s [%s]', name, current, maximum - current, label)
|
||
|
|
elseif textFormat == 'CURPERCREM' then
|
||
|
|
displayString = format('%s: %s - %d%% (%s) [%s]', name, current, percent, (maximum - current), label)
|
||
|
|
end
|
||
|
|
|
||
|
|
bar.text:SetText(displayString)
|
||
|
|
end
|
||
|
|
|
||
|
|
function DB:PopulateRepPatterns()
|
||
|
|
local symbols = {'%.$','%(','%)','|3%-7%%%(%%s%%%)','%%s([^%%])','%+','%%d','%%.1f','%%.','%%(','%%)','(.-)','(.-)%1','%%+','(%%d-)','(%%d-)'}
|
||
|
|
local pattern
|
||
|
|
pattern = T.rgsub(FACTION_STANDING_INCREASED, unpack(symbols))
|
||
|
|
tinsert(DB.RepIncreaseStrings, pattern)
|
||
|
|
|
||
|
|
pattern = T.rgsub(FACTION_STANDING_INCREASED_ACH_BONUS, unpack(symbols))
|
||
|
|
tinsert(DB.RepIncreaseStrings, pattern)
|
||
|
|
|
||
|
|
pattern = T.rgsub(FACTION_STANDING_DECREASED, unpack(symbols))
|
||
|
|
tinsert(DB.RepDecreaseStrings, pattern)
|
||
|
|
|
||
|
|
pattern = T.rgsub(FACTION_STANDING_DECREASED_GENERIC, unpack(symbols))
|
||
|
|
tinsert(DB.RepDecreaseStrings, pattern)
|
||
|
|
end
|
||
|
|
|
||
|
|
function DB:FilterReputation(_, message, ...)
|
||
|
|
if DB.db.reputation and DB.db.reputation.chatfilter.enable then
|
||
|
|
for i in ipairs(DB.RepIncreaseStrings) do
|
||
|
|
local faction = strmatch(message, DB.RepIncreaseStrings[i])
|
||
|
|
if faction then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for i in ipairs(DB.RepDecreaseStrings) do
|
||
|
|
local faction= strmatch(message, DB.RepDecreaseStrings[i])
|
||
|
|
if faction then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return false, message, ...
|
||
|
|
end
|
||
|
|
return false, message, ...
|
||
|
|
end
|
||
|
|
|
||
|
|
function DB:ScanFactions()
|
||
|
|
DB.factions = GetNumFactions()
|
||
|
|
for i = 1, DB.factions do
|
||
|
|
local name, _, standingID, _, _, barValue, _, _, isHeader, _, hasRep, _, _, factionID = GetFactionInfo(i)
|
||
|
|
|
||
|
|
if (not isHeader or hasRep) and name then
|
||
|
|
DB.factionVars[name] = DB.factionVars[name] or {}
|
||
|
|
DB.factionVars[name].Standing = standingID
|
||
|
|
if C_Reputation_IsFactionParagon(factionID) then
|
||
|
|
local currentValue = C_Reputation_GetFactionParagonInfo(factionID)
|
||
|
|
DB.factionVars[name].Value = currentValue
|
||
|
|
DB.factionVars[name].isParagon = true
|
||
|
|
else
|
||
|
|
DB.factionVars[name].Value = barValue
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function DB:NewRepString()
|
||
|
|
if not E.db.sle.databars.reputation or not E.db.sle.databars.reputation.chatfilter.enable then return end
|
||
|
|
local tempfactions = GetNumFactions()
|
||
|
|
if (tempfactions > DB.factions) then
|
||
|
|
DB:ScanFactions()
|
||
|
|
DB.factions = tempfactions
|
||
|
|
end
|
||
|
|
if E.db.sle.databars.reputation.chatfilter.chatframe == 'AUTO' then
|
||
|
|
wipe(DB.RepChatFrames)
|
||
|
|
for i = 1, NUM_CHAT_WINDOWS do
|
||
|
|
if SLE:SimpleTable(_G['ChatFrame'..i]['messageTypeList'], 'COMBAT_FACTION_CHANGE') then
|
||
|
|
tinsert(DB.RepChatFrames, 'ChatFrame'..i)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for factionIndex = 1, GetNumFactions() do
|
||
|
|
local StyleTable = nil
|
||
|
|
local name, _, _, _, _, barValue, _, _, isHeader, _, hasRep, _, _, factionID = GetFactionInfo(factionIndex)
|
||
|
|
|
||
|
|
if (not isHeader or hasRep) and DB.factionVars[name] then
|
||
|
|
if DB.factionVars[name].isParagon then
|
||
|
|
local currentValue = C_Reputation_GetFactionParagonInfo(factionID)
|
||
|
|
barValue = currentValue
|
||
|
|
end
|
||
|
|
local diff = barValue - DB.factionVars[name].Value
|
||
|
|
|
||
|
|
if diff > 0 then
|
||
|
|
StyleTable = 'RepIncreaseStyles'
|
||
|
|
elseif diff < 0 then
|
||
|
|
StyleTable = 'RepDecreaseStyles'
|
||
|
|
end
|
||
|
|
if StyleTable then
|
||
|
|
local repMessage = format(DB[StyleTable][E.db.sle.databars.reputation.chatfilter.style] , E.db.sle.databars.reputation.chatfilter.iconsize, name, diff)
|
||
|
|
local chatframe
|
||
|
|
if E.db.sle.databars.reputation.chatfilter.chatframe == 'AUTO' then
|
||
|
|
for n = 1, #(DB.RepChatFrames) do
|
||
|
|
chatframe = _G[DB.RepChatFrames[n]]
|
||
|
|
chatframe:AddMessage(repMessage)
|
||
|
|
end
|
||
|
|
else
|
||
|
|
chatframe = _G[E.db.sle.databars.reputation.chatfilter.chatframe]
|
||
|
|
chatframe:AddMessage(repMessage)
|
||
|
|
end
|
||
|
|
DB.factionVars[name].Value = barValue
|
||
|
|
|
||
|
|
if E.db.sle.databars.reputation.chatfilter.showAll then return end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function DB:RepInit()
|
||
|
|
DB:PopulateRepPatterns()
|
||
|
|
hooksecurefunc(EDB, 'ReputationBar_Update', ReputationBar_Update)
|
||
|
|
EDB:ReputationBar_Update()
|
||
|
|
end
|