Struktur bereinigt: Sounddateien in media/ Unterordner verschoben und Pfade in der Lua angepasst
This commit is contained in:
240
MoanS.lua
240
MoanS.lua
@@ -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
|
|
||||||
|
|||||||
BIN
moan10.ogg
BIN
moan10.ogg
Binary file not shown.
Reference in New Issue
Block a user