Files
MoanS-Classic-Anniversary/MoanS.lua

127 lines
8.3 KiB
Lua

local addonName = "MoanS"
local defaults = {
active = true,
chat = true,
petEnabled = true,
healEnabled = true,
totalMoans = 0,
showCounter = true,
framePos = nil,
soundBaseName = "moan",
comboTimeout = 4.0,
locked = false,
}
local frame = CreateFrame("Frame")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
frame:RegisterEvent("ADDON_LOADED")
local lastSoundTime, comboCount, MAX_SOUNDS = 0, 0, 9
local function FormatNumber(amount)
if not amount or type(amount) ~= "number" then return amount or "0" end
if amount >= 1000000 then return string.format("%.1fM", amount / 1000000)
elseif amount >= 1000 then return string.format("%.1fK", amount / 1000)
else return tostring(amount) end
end
local CounterFrame = CreateFrame("Frame", "MoanSCounterFrame", UIParent, "BackdropTemplate")
CounterFrame:SetSize(130, 40)
CounterFrame:SetPoint("CENTER", 0, 0)
CounterFrame:SetMovable(true)
CounterFrame:EnableMouse(true)
CounterFrame:RegisterForDrag("LeftButton")
CounterFrame:SetClampedToScreen(true)
CounterFrame.bg = CounterFrame:CreateTexture(nil, "BACKGROUND")
CounterFrame.bg:SetAllPoints(); CounterFrame.bg:SetColorTexture(0, 0, 0, 0.6)
CounterFrame.Cooldown = CreateFrame("Cooldown", nil, CounterFrame, "CooldownFrameTemplate")
CounterFrame.Cooldown:SetAllPoints()
CounterFrame.text = CounterFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
CounterFrame.text:SetPoint("CENTER")
local function ShowCritText(amount)
local f = CreateFrame("Frame", nil, CounterFrame); f:SetSize(200, 30)
f:SetPoint("CENTER", CounterFrame, "CENTER", 0, 0)
local text = f:CreateFontString(nil, "OVERLAY", "NumberFontNormal")
text:SetPoint("CENTER"); text:SetText(FormatNumber(amount)); text:SetTextColor(1, 0.41, 0.7)
text:SetFont(text:GetFont(), 22, "OUTLINE")
local ag = f:CreateAnimationGroup()
local targetX, targetY = math.random(-120, 120), math.random(80, 150)
local scale = ag:CreateAnimation("Scale"); scale:SetScale(1.4, 1.4); scale:SetDuration(0.15); scale:SetOrder(1)
local translation = ag:CreateAnimation("Translation"); translation:SetOffset(targetX, targetY); translation:SetDuration(1.4); translation:SetSmoothing("OUT"); translation:SetOrder(2)
local alpha = ag:CreateAnimation("Alpha"); alpha:SetFromAlpha(1); alpha:SetToAlpha(0); alpha:SetStartDelay(0.7); alpha:SetDuration(0.7); alpha:SetOrder(2)
ag:SetScript("OnFinished", function() f:Hide() end); ag:Play()
end
local function UpdateCounterDisplay()
if not MoanSDB then return end
CounterFrame.text:SetText("Moans: " .. (MoanSDB.totalMoans or 0))
CounterFrame:SetShown(MoanSDB.showCounter and MoanSDB.active)
CounterFrame:EnableMouse(not MoanSDB.locked)
end
CounterFrame:SetScript("OnDragStart", CounterFrame.StartMoving)
CounterFrame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
local point, _, rel, x, y = self:GetPoint()
if MoanSDB then MoanSDB.framePos = { point, rel, x, y } end
end)
local function TriggerCombo()
local currentTime = GetTime()
local timeout = MoanSDB and MoanSDB.comboTimeout or 4.0
if (currentTime - lastSoundTime) > timeout or comboCount >= MAX_SOUNDS then comboCount = 1 else comboCount = comboCount + 1 end
lastSoundTime = currentTime
CounterFrame.Cooldown:SetCooldown(currentTime, timeout)
-- PFAD GEÄNDERT AUF MEDIA UNTERORDNER
return "Interface\\AddOns\\MoanS\\media\\" .. (comboCount == MAX_SOUNDS and "moan10" or (MoanSDB.soundBaseName or "moan") .. comboCount) .. ".ogg"
end
local MoanSPanel = CreateFrame("Frame", "MoanSConfigPanel", UIParent); MoanSPanel.name = addonName
local category
local function CreateCB(parent, label, x, y, dbKey)
local cb = CreateFrame("CheckButton", nil, parent, "InterfaceOptionsCheckButtonTemplate")
cb:SetPoint("TOPLEFT", x, y); cb.Text:SetText(label)
cb:SetScript("OnShow", function(self) if MoanSDB then self:SetChecked(MoanSDB[dbKey]) end end)
cb:SetScript("OnClick", function(self) MoanSDB[dbKey] = self:GetChecked(); UpdateCounterDisplay() end)
return cb
end
frame:SetScript("OnEvent", function(self, event, arg1)
if event == "ADDON_LOADED" and arg1 == addonName then
if not MoanSDB then MoanSDB = CopyTable(defaults) end
for k, v in pairs(defaults) do if MoanSDB[k] == nil then MoanSDB[k] = v end end
category = Settings.RegisterCanvasLayoutCategory(MoanSPanel, addonName)
Settings.RegisterAddOnCategory(category)
local title = MoanSPanel:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title:SetPoint("TOPLEFT", 16, -16); title:SetText("|cffFF69B4MoanS|r - Classic")
CreateCB(MoanSPanel, "Addon Aktiviert", 16, -50, "active")
CreateCB(MoanSPanel, "Fenster anzeigen", 16, -80, "showCounter")
CreateCB(MoanSPanel, "Fenster fixieren (Lock)", 16, -110, "locked")
if MoanSDB.framePos then
CounterFrame:ClearAllPoints()
CounterFrame:SetPoint(MoanSDB.framePos[1], UIParent, MoanSDB.framePos[2], MoanSDB.framePos[3], MoanSDB.framePos[4])
end
UpdateCounterDisplay()
elseif event == "COMBAT_LOG_EVENT_UNFILTERED" then
if not MoanSDB or not MoanSDB.active then return end
local _, sub, _, sGUID, _, _, _, _, _, _, _, arg12, _, _, _, arg15, _, arg17, arg18, _, arg21 = CombatLogGetCurrentEventInfo()
if sGUID == UnitGUID("player") or sGUID == UnitGUID("pet") then
local isCrit, amount = false, 0
if sub == "SWING_DAMAGE" then amount, isCrit = arg12, arg17
elseif sub:find("_DAMAGE") then amount, isCrit = arg15, arg21
elseif sub == "SPELL_HEAL" then amount, isCrit = arg15, arg18 end
if isCrit then
PlaySoundFile(TriggerCombo(), "Master")
ShowCritText(amount)
MoanSDB.totalMoans = MoanSDB.totalMoans + 1
UpdateCounterDisplay()
end
end
end
end)
SLASH_MOANS1 = "/moans"
SlashCmdList["MOANS"] = function() if category and category.GetID then Settings.OpenToCategory(category:GetID()) end end