Struktur bereinigt: Sounddateien in media/ Unterordner verschoben und Pfade in der Lua angepasst

This commit is contained in:
2025-12-31 09:57:37 +01:00
parent 2e5d64e611
commit d14b0d35f5
9 changed files with 70 additions and 170 deletions

240
MoanS.lua
View File

@@ -1,11 +1,9 @@
local addonName = "MoanS" local addonName = "MoanS"
local defaults = { local defaults = {
active = true, active = true,
chat = true, chat = true,
petEnabled = true, petEnabled = true,
healEnabled = true, healEnabled = true,
color = "|cffFF69B4",
totalMoans = 0, totalMoans = 0,
showCounter = true, showCounter = true,
framePos = nil, framePos = nil,
@@ -18,11 +16,8 @@ local frame = CreateFrame("Frame")
frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
frame:RegisterEvent("ADDON_LOADED") frame:RegisterEvent("ADDON_LOADED")
local lastSoundTime = 0 local lastSoundTime, comboCount, MAX_SOUNDS = 0, 0, 9
local comboCount = 0
local MAX_SOUNDS = 9
-- Hilfsfunktion: Zahlen kürzen
local function FormatNumber(amount) local function FormatNumber(amount)
if not amount or type(amount) ~= "number" then return amount or "0" end if not amount or type(amount) ~= "number" then return amount or "0" end
if amount >= 1000000 then return string.format("%.1fM", amount / 1000000) if amount >= 1000000 then return string.format("%.1fM", amount / 1000000)
@@ -30,7 +25,6 @@ if not amount or type(amount) ~= "number" then return amount or "0" end
else return tostring(amount) end else return tostring(amount) end
end end
-- 1. GRAFISCHER COUNTER
local CounterFrame = CreateFrame("Frame", "MoanSCounterFrame", UIParent, "BackdropTemplate") local CounterFrame = CreateFrame("Frame", "MoanSCounterFrame", UIParent, "BackdropTemplate")
CounterFrame:SetSize(130, 40) CounterFrame:SetSize(130, 40)
CounterFrame:SetPoint("CENTER", 0, 0) CounterFrame:SetPoint("CENTER", 0, 0)
@@ -38,189 +32,95 @@ if not amount or type(amount) ~= "number" then return amount or "0" end
CounterFrame:EnableMouse(true) CounterFrame:EnableMouse(true)
CounterFrame:RegisterForDrag("LeftButton") CounterFrame:RegisterForDrag("LeftButton")
CounterFrame:SetClampedToScreen(true) CounterFrame:SetClampedToScreen(true)
CounterFrame.bg = CounterFrame:CreateTexture(nil, "BACKGROUND") CounterFrame.bg = CounterFrame:CreateTexture(nil, "BACKGROUND")
CounterFrame.bg:SetAllPoints() CounterFrame.bg:SetAllPoints(); CounterFrame.bg:SetColorTexture(0, 0, 0, 0.6)
CounterFrame.bg:SetColorTexture(0, 0, 0, 0.6)
CounterFrame.Cooldown = CreateFrame("Cooldown", nil, CounterFrame, "CooldownFrameTemplate") CounterFrame.Cooldown = CreateFrame("Cooldown", nil, CounterFrame, "CooldownFrameTemplate")
CounterFrame.Cooldown:SetAllPoints() CounterFrame.Cooldown:SetAllPoints()
CounterFrame.Cooldown:SetDrawEdge(false)
CounterFrame.Cooldown:SetSwipeColor(1, 0.41, 0.7, 0.5)
CounterFrame.text = CounterFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge") CounterFrame.text = CounterFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
CounterFrame.text:SetPoint("CENTER") CounterFrame.text:SetPoint("CENTER")
CounterFrame.text:SetText("Moans: 0")
-- 2. FEUERWERK ANIMATION
local function ShowCritText(amount) local function ShowCritText(amount)
local f = CreateFrame("Frame", nil, CounterFrame) local f = CreateFrame("Frame", nil, CounterFrame); f:SetSize(200, 30)
f:SetSize(200, 30)
f:SetPoint("CENTER", CounterFrame, "CENTER", 0, 0) f:SetPoint("CENTER", CounterFrame, "CENTER", 0, 0)
local text = f:CreateFontString(nil, "OVERLAY", "NumberFontNormal") local text = f:CreateFontString(nil, "OVERLAY", "NumberFontNormal")
text:SetPoint("CENTER") text:SetPoint("CENTER"); text:SetText(FormatNumber(amount)); text:SetTextColor(1, 0.41, 0.7)
text:SetText(FormatNumber(amount))
text:SetTextColor(1, 0.41, 0.7)
text:SetFont(text:GetFont(), 22, "OUTLINE") text:SetFont(text:GetFont(), 22, "OUTLINE")
local ag = f:CreateAnimationGroup() local ag = f:CreateAnimationGroup()
local targetX = math.random(-120, 120) local targetX, targetY = math.random(-120, 120), math.random(80, 150)
local targetY = 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 scale = ag:CreateAnimation("Scale") local alpha = ag:CreateAnimation("Alpha"); alpha:SetFromAlpha(1); alpha:SetToAlpha(0); alpha:SetStartDelay(0.7); alpha:SetDuration(0.7); alpha:SetOrder(2)
scale:SetScale(1.4, 1.4) ag:SetScript("OnFinished", function() f:Hide() end); ag:Play()
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 end
-- 3. UPDATES & OPTIONEN
local function UpdateCounterDisplay() local function UpdateCounterDisplay()
if not MoanSDB then return end if not MoanSDB then return end
CounterFrame.text:SetText("Moans: " .. (MoanSDB.totalMoans or 0)) CounterFrame.text:SetText("Moans: " .. (MoanSDB.totalMoans or 0))
if MoanSDB.showCounter and MoanSDB.active then CounterFrame:Show() else CounterFrame:Hide() end CounterFrame:SetShown(MoanSDB.showCounter and MoanSDB.active)
CounterFrame:EnableMouse(not MoanSDB.locked) 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 end
CounterFrame:SetScript("OnDragStart", CounterFrame.StartMoving) local MoanSPanel = CreateFrame("Frame", "MoanSConfigPanel", UIParent); MoanSPanel.name = addonName
CounterFrame:SetScript("OnDragStop", function(self) local category
self:StopMovingOrSizing()
local point, _, relativePoint, x, y = self:GetPoint()
if MoanSDB then MoanSDB.framePos = { point, relativePoint, x, y } end
end)
local function TriggerCombo() local function CreateCB(parent, label, x, y, dbKey)
local currentTime = GetTime() local cb = CreateFrame("CheckButton", nil, parent, "InterfaceOptionsCheckButtonTemplate")
local timeout = MoanSDB and MoanSDB.comboTimeout or 4.0 cb:SetPoint("TOPLEFT", x, y); cb.Text:SetText(label)
local soundFile = "" 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
if (currentTime - lastSoundTime) > timeout or comboCount >= MAX_SOUNDS then frame:SetScript("OnEvent", function(self, event, arg1)
comboCount = 1 if event == "ADDON_LOADED" and arg1 == addonName then
else if not MoanSDB then MoanSDB = CopyTable(defaults) end
comboCount = comboCount + 1 for k, v in pairs(defaults) do if MoanSDB[k] == nil then MoanSDB[k] = v end end
end category = Settings.RegisterCanvasLayoutCategory(MoanSPanel, addonName)
Settings.RegisterAddOnCategory(category)
lastSoundTime = currentTime local title = MoanSPanel:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
CounterFrame.Cooldown:SetCooldown(currentTime, timeout) title:SetPoint("TOPLEFT", 16, -16); title:SetText("|cffFF69B4MoanS|r - Classic")
CreateCB(MoanSPanel, "Addon Aktiviert", 16, -50, "active")
if comboCount == MAX_SOUNDS then CreateCB(MoanSPanel, "Fenster anzeigen", 16, -80, "showCounter")
soundFile = "Interface\\AddOns\\MoanS\\moan10.ogg" CreateCB(MoanSPanel, "Fenster fixieren (Lock)", 16, -110, "locked")
else if MoanSDB.framePos then
soundFile = "Interface\\AddOns\\MoanS\\" .. (MoanSDB.soundBaseName or "moan") .. comboCount .. ".ogg" CounterFrame:ClearAllPoints()
CounterFrame:SetPoint(MoanSDB.framePos[1], UIParent, MoanSDB.framePos[2], MoanSDB.framePos[3], MoanSDB.framePos[4])
end end
return soundFile
end
-- 4. CONFIG PANEL
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() UpdateCounterDisplay()
end) elseif event == "COMBAT_LOG_EVENT_UNFILTERED" then
return cb if not MoanSDB or not MoanSDB.active then return end
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)
-- 5. HAUPT EVENT HANDLER SLASH_MOANS1 = "/moans"
frame:SetScript("OnEvent", function(self, event, arg1) SlashCmdList["MOANS"] = function() if category and category.GetID then Settings.OpenToCategory(category:GetID()) end end
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 Anniversary")
CreateCB(MoanSPanel, "Addon Aktiviert", 16, -50, "active")
CreateCB(MoanSPanel, "Fenster anzeigen", 16, -80, "showCounter")
CreateCB(MoanSPanel, "Fenster fixieren (Lock)", 16, -110, "locked")
CreateCB(MoanSPanel, "Chat Nachrichten", 16, -140, "chat")
local slider = CreateFrame("Slider", "MoanSTimeoutSlider", MoanSPanel, "OptionsSliderTemplate")
slider:SetPoint("TOPLEFT", 20, -190)
slider:SetMinMaxValues(0.5, 10.0)
slider:SetValueStep(0.5)
slider:SetWidth(180)
_G[slider:GetName().."Low"]:SetText("0.5s")
_G[slider:GetName().."High"]:SetText("10s")
local sliderVal = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
sliderVal:SetPoint("BOTTOM", slider, "TOP", 0, 5)
slider:SetScript("OnValueChanged", function(s, val)
val = math.floor(val * 2 + 0.5) / 2
MoanSDB.comboTimeout = val
sliderVal:SetText("Combo-Zeit: "..val.."s")
end)
slider:SetValue(MoanSDB.comboTimeout)
local btnTest = CreateFrame("Button", nil, MoanSPanel, "UIPanelButtonTemplate")
btnTest:SetPoint("TOPLEFT", 16, -240)
btnTest:SetSize(160, 25)
btnTest:SetText("Feuerwerk Testen")
btnTest:SetScript("OnClick", function()
PlaySoundFile(TriggerCombo(), "Master")
ShowCritText(math.random(100, 5000))
end)
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 info = {CombatLogGetCurrentEventInfo()}
local subevent, sourceGUID = info[2], info[4]
if sourceGUID == UnitGUID("player") or (sourceGUID == UnitGUID("pet") and MoanSDB.petEnabled) then
local isCrit, amount = false, 0
if subevent == "SWING_DAMAGE" then
amount, isCrit = info[12], info[18]
elseif subevent == "RANGE_DAMAGE" or subevent == "SPELL_DAMAGE" then
amount, isCrit = info[15], info[21]
elseif subevent == "SPELL_HEAL" and MoanSDB.healEnabled then
amount, isCrit = info[15], info[18]
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 then
Settings.OpenToCategory(category:GetID())
end
end

Binary file not shown.

BIN
moan3.ogg

Binary file not shown.

BIN
moan4.ogg

Binary file not shown.

BIN
moan5.ogg

Binary file not shown.

BIN
moan6.ogg

Binary file not shown.

BIN
moan7.ogg

Binary file not shown.

BIN
moan8.ogg

Binary file not shown.

BIN
moan9.ogg

Binary file not shown.