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

150
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,176 +32,86 @@ 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 end
CounterFrame:SetScript("OnDragStart", CounterFrame.StartMoving) CounterFrame:SetScript("OnDragStart", CounterFrame.StartMoving)
CounterFrame:SetScript("OnDragStop", function(self) CounterFrame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing() self:StopMovingOrSizing()
local point, _, relativePoint, x, y = self:GetPoint() local point, _, rel, x, y = self:GetPoint()
if MoanSDB then MoanSDB.framePos = { point, relativePoint, x, y } end if MoanSDB then MoanSDB.framePos = { point, rel, x, y } end
end) end)
local function TriggerCombo() local function TriggerCombo()
local currentTime = GetTime() local currentTime = GetTime()
local timeout = MoanSDB and MoanSDB.comboTimeout or 4.0 local timeout = MoanSDB and MoanSDB.comboTimeout or 4.0
local soundFile = "" if (currentTime - lastSoundTime) > timeout or comboCount >= MAX_SOUNDS then comboCount = 1 else comboCount = comboCount + 1 end
if (currentTime - lastSoundTime) > timeout or comboCount >= MAX_SOUNDS then
comboCount = 1
else
comboCount = comboCount + 1
end
lastSoundTime = currentTime lastSoundTime = currentTime
CounterFrame.Cooldown:SetCooldown(currentTime, timeout) CounterFrame.Cooldown:SetCooldown(currentTime, timeout)
-- PFAD GEÄNDERT AUF MEDIA UNTERORDNER
if comboCount == MAX_SOUNDS then return "Interface\\AddOns\\MoanS\\media\\" .. (comboCount == MAX_SOUNDS and "moan10" or (MoanSDB.soundBaseName or "moan") .. comboCount) .. ".ogg"
soundFile = "Interface\\AddOns\\MoanS\\moan10.ogg"
else
soundFile = "Interface\\AddOns\\MoanS\\" .. (MoanSDB.soundBaseName or "moan") .. comboCount .. ".ogg"
end
return soundFile
end end
-- 4. CONFIG PANEL local MoanSPanel = CreateFrame("Frame", "MoanSConfigPanel", UIParent); MoanSPanel.name = addonName
local MoanSPanel = CreateFrame("Frame", "MoanSConfigPanel", UIParent)
MoanSPanel.name = addonName
local category local category
local function CreateCB(parent, label, x, y, dbKey) local function CreateCB(parent, label, x, y, dbKey)
local cb = CreateFrame("CheckButton", nil, parent, "InterfaceOptionsCheckButtonTemplate") local cb = CreateFrame("CheckButton", nil, parent, "InterfaceOptionsCheckButtonTemplate")
cb:SetPoint("TOPLEFT", x, y) cb:SetPoint("TOPLEFT", x, y); cb.Text:SetText(label)
cb.Text:SetText(label)
cb:SetScript("OnShow", function(self) if MoanSDB then self:SetChecked(MoanSDB[dbKey]) end end) cb:SetScript("OnShow", function(self) if MoanSDB then self:SetChecked(MoanSDB[dbKey]) end end)
cb:SetScript("OnClick", function(self) cb:SetScript("OnClick", function(self) MoanSDB[dbKey] = self:GetChecked(); UpdateCounterDisplay() end)
MoanSDB[dbKey] = self:GetChecked()
UpdateCounterDisplay()
end)
return cb return cb
end end
-- 5. HAUPT EVENT HANDLER
frame:SetScript("OnEvent", function(self, event, arg1) frame:SetScript("OnEvent", function(self, event, arg1)
if event == "ADDON_LOADED" and arg1 == addonName then if event == "ADDON_LOADED" and arg1 == addonName then
if not MoanSDB then MoanSDB = CopyTable(defaults) end 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 for k, v in pairs(defaults) do if MoanSDB[k] == nil then MoanSDB[k] = v end end
category = Settings.RegisterCanvasLayoutCategory(MoanSPanel, addonName) category = Settings.RegisterCanvasLayoutCategory(MoanSPanel, addonName)
Settings.RegisterAddOnCategory(category) Settings.RegisterAddOnCategory(category)
local title = MoanSPanel:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") local title = MoanSPanel:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
title:SetPoint("TOPLEFT", 16, -16) title:SetPoint("TOPLEFT", 16, -16); title:SetText("|cffFF69B4MoanS|r - Classic")
title:SetText("|cffFF69B4MoanS|r - Classic Anniversary")
CreateCB(MoanSPanel, "Addon Aktiviert", 16, -50, "active") CreateCB(MoanSPanel, "Addon Aktiviert", 16, -50, "active")
CreateCB(MoanSPanel, "Fenster anzeigen", 16, -80, "showCounter") CreateCB(MoanSPanel, "Fenster anzeigen", 16, -80, "showCounter")
CreateCB(MoanSPanel, "Fenster fixieren (Lock)", 16, -110, "locked") 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 if MoanSDB.framePos then
CounterFrame:ClearAllPoints() CounterFrame:ClearAllPoints()
CounterFrame:SetPoint(MoanSDB.framePos[1], UIParent, MoanSDB.framePos[2], MoanSDB.framePos[3], MoanSDB.framePos[4]) CounterFrame:SetPoint(MoanSDB.framePos[1], UIParent, MoanSDB.framePos[2], MoanSDB.framePos[3], MoanSDB.framePos[4])
end end
UpdateCounterDisplay() UpdateCounterDisplay()
elseif event == "COMBAT_LOG_EVENT_UNFILTERED" then elseif event == "COMBAT_LOG_EVENT_UNFILTERED" then
if not MoanSDB or not MoanSDB.active then return end if not MoanSDB or not MoanSDB.active then return end
local info = {CombatLogGetCurrentEventInfo()} local _, sub, _, sGUID, _, _, _, _, _, _, _, arg12, _, _, _, arg15, _, arg17, arg18, _, arg21 = CombatLogGetCurrentEventInfo()
local subevent, sourceGUID = info[2], info[4] if sGUID == UnitGUID("player") or sGUID == UnitGUID("pet") then
if sourceGUID == UnitGUID("player") or (sourceGUID == UnitGUID("pet") and MoanSDB.petEnabled) then
local isCrit, amount = false, 0 local isCrit, amount = false, 0
if subevent == "SWING_DAMAGE" then if sub == "SWING_DAMAGE" then amount, isCrit = arg12, arg17
amount, isCrit = info[12], info[18] elseif sub:find("_DAMAGE") then amount, isCrit = arg15, arg21
elseif subevent == "RANGE_DAMAGE" or subevent == "SPELL_DAMAGE" then elseif sub == "SPELL_HEAL" then amount, isCrit = arg15, arg18 end
amount, isCrit = info[15], info[21]
elseif subevent == "SPELL_HEAL" and MoanSDB.healEnabled then
amount, isCrit = info[15], info[18]
end
if isCrit then if isCrit then
PlaySoundFile(TriggerCombo(), "Master") PlaySoundFile(TriggerCombo(), "Master")
ShowCritText(amount) ShowCritText(amount)
@@ -219,8 +123,4 @@ if not amount or type(amount) ~= "number" then return amount or "0" end
end) end)
SLASH_MOANS1 = "/moans" SLASH_MOANS1 = "/moans"
SlashCmdList["MOANS"] = function() SlashCmdList["MOANS"] = function() if category and category.GetID then Settings.OpenToCategory(category:GetID()) end end
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.