282 lines
8.8 KiB
Lua
282 lines
8.8 KiB
Lua
local pairs = pairs
|
|
local floor = math.floor
|
|
|
|
local GetSpellInfo = GetSpellInfo
|
|
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
|
|
local GetTime = GetTime
|
|
local SendChatMessage = SendChatMessage
|
|
local RaidNotice_AddMessage = RaidNotice_AddMessage
|
|
local RaidBossEmoteFrame = RaidBossEmoteFrame
|
|
local IsAddOnLoaded = IsAddOnLoaded
|
|
local IsInGroup = IsInGroup
|
|
local LE_PARTY_CATEGORY_HOME = LE_PARTY_CATEGORY_HOME
|
|
local LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_INSTANCE
|
|
local CombatText_AddMessage = CombatText_AddMessage
|
|
local UnitName = UnitName
|
|
|
|
local Gladdy = LibStub("Gladdy")
|
|
local L = Gladdy.L
|
|
local Announcements = Gladdy:NewModule("Announcements", nil, {
|
|
announcements = {
|
|
drinks = true,
|
|
resurrections = true,
|
|
enemy = false,
|
|
spec = false,
|
|
health = false,
|
|
healthThreshold = 20,
|
|
trinketUsed = true,
|
|
trinketReady = false,
|
|
dest = "self",
|
|
},
|
|
})
|
|
|
|
function Announcements:Initialize()
|
|
self.enemy = {}
|
|
self.throttled = {}
|
|
|
|
self.DRINK_AURA = GetSpellInfo(46755)
|
|
self.RES_SPELLS = {
|
|
[GetSpellInfo(20770)] = true,
|
|
[GetSpellInfo(20773)] = true,
|
|
[GetSpellInfo(20777)] = true,
|
|
}
|
|
|
|
self:RegisterMessage("CAST_START")
|
|
self:RegisterMessage("ENEMY_SPOTTED")
|
|
self:RegisterMessage("UNIT_SPEC")
|
|
self:RegisterMessage("UNIT_HEALTH")
|
|
self:RegisterMessage("TRINKET_USED")
|
|
self:RegisterMessage("TRINKET_READY")
|
|
end
|
|
|
|
function Announcements:Reset()
|
|
self.enemy = {}
|
|
self.throttled = {}
|
|
end
|
|
|
|
function Announcements:Test(unit)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button) then
|
|
return
|
|
end
|
|
|
|
if (unit == "arena1") then
|
|
self:UNIT_SPEC(unit, button.testSpec)
|
|
elseif (unit == "arena2") then
|
|
self:CheckDrink(unit, self.DRINK_AURA)
|
|
elseif (unit == "arena3") then
|
|
self:UNIT_HEALTH(unit, button.health, button.healthMax)
|
|
self:ENEMY_SPOTTED(unit)
|
|
end
|
|
end
|
|
|
|
function Announcements:CAST_START(unit, spell)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.resurrections) then
|
|
return
|
|
end
|
|
|
|
if (self.RES_SPELLS[spell]) then
|
|
self:Send(L["RESURRECTING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
|
|
end
|
|
end
|
|
|
|
function Announcements:ENEMY_SPOTTED(unit)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.enemy) then
|
|
return
|
|
end
|
|
|
|
if (not self.enemy[unit]) then
|
|
if button.name == "Unknown" then
|
|
button.name = UnitName(unit)
|
|
end
|
|
self:Send("ENEMY SPOTTED:" .. ("%s (%s)"):format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
|
|
self.enemy[unit] = true
|
|
end
|
|
end
|
|
|
|
function Announcements:UNIT_SPEC(unit, spec)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.spec) then
|
|
return
|
|
end
|
|
if button.name == "Unknown" then
|
|
button.name = UnitName(unit)
|
|
end
|
|
self:Send(L["SPEC DETECTED: %s - %s (%s)"]:format(button.name, spec, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
|
|
end
|
|
|
|
function Announcements:UNIT_HEALTH(unit, health, healthMax)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.health) then
|
|
return
|
|
end
|
|
|
|
local healthPercent = floor(health * 100 / healthMax)
|
|
if (healthPercent < Gladdy.db.announcements.healthThreshold) then
|
|
self:Send(L["LOW HEALTH: %s (%s)"]:format(button.name, button.classLoc), 10, RAID_CLASS_COLORS[button.class])
|
|
end
|
|
end
|
|
|
|
function Announcements:TRINKET_USED(unit)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.trinketUsed) then
|
|
return
|
|
end
|
|
|
|
self:Send(L["TRINKET USED: %s (%s)"]:format(button.name, button.classLoc), 0, RAID_CLASS_COLORS[button.class])
|
|
end
|
|
|
|
function Announcements:TRINKET_READY(unit)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.trinketReady) then
|
|
return
|
|
end
|
|
|
|
self:Send(L["TRINKET READY: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
|
|
end
|
|
|
|
function Announcements:CheckDrink(unit, aura)
|
|
local button = Gladdy.buttons[unit]
|
|
if (not button or not Gladdy.db.announcements.drinks) then
|
|
return
|
|
end
|
|
|
|
if (aura == self.DRINK_AURA) then
|
|
self:Send(L["DRINKING: %s (%s)"]:format(button.name, button.classLoc), 3, RAID_CLASS_COLORS[button.class])
|
|
end
|
|
end
|
|
|
|
function Announcements:Send(msg, throttle, color)
|
|
if (throttle and throttle > 0) then
|
|
if (not self.throttled[msg]) then
|
|
self.throttled[msg] = GetTime() + throttle
|
|
elseif (self.throttled[msg] < GetTime()) then
|
|
self.throttled[msg] = nil
|
|
else
|
|
return
|
|
end
|
|
end
|
|
|
|
local dest = Gladdy.db.announcements.dest
|
|
color = color or { r = 0, g = 1, b = 0 }
|
|
|
|
if (dest == "self") then
|
|
Gladdy:Print(msg)
|
|
elseif (dest == "party" and IsInGroup(LE_PARTY_CATEGORY_HOME)) then --(GetNumSubgroupMembers() > 0 or GetNumGroupMembers() > 0)) then
|
|
SendChatMessage(msg, "PARTY")
|
|
elseif dest == "party" and IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
|
|
SendChatMessage(msg, "INSTANCE_CHAT")
|
|
elseif (dest == "rw") then
|
|
RaidNotice_AddMessage(RaidBossEmoteFrame, msg, color)
|
|
elseif (dest == "fct" and IsAddOnLoaded("Blizzard_CombatText")) then
|
|
CombatText_AddMessage(msg, nil, color.r, color.g, color.b, "crit", 1)
|
|
--[[elseif (dest == "msbt" and IsAddOnLoaded("MikScrollingBattleText")) then
|
|
MikSBT.DisplayMessage(msg, MikSBT.DISPLAYTYPE_NOTIFICATION, true, color.r * 255, color.g * 255, color.b * 255)
|
|
elseif (dest == "sct" and IsAddOnLoaded("sct")) then
|
|
SCT:DisplayText(msg, color, true, "event", 1)
|
|
elseif (dest == "parrot" and IsAddOnLoaded("parrot")) then
|
|
Parrot:ShowMessage(msg, "Notification", true, color.r, color.g, color.b)--]]
|
|
end
|
|
end
|
|
|
|
local function option(params)
|
|
local defaults = {
|
|
get = function(info)
|
|
local key = info.arg or info[#info]
|
|
return Gladdy.dbi.profile.announcements[key]
|
|
end,
|
|
set = function(info, value)
|
|
local key = info.arg or info[#info]
|
|
Gladdy.dbi.profile.announcements[key] = value
|
|
end,
|
|
}
|
|
|
|
for k, v in pairs(params) do
|
|
defaults[k] = v
|
|
end
|
|
|
|
return defaults
|
|
end
|
|
|
|
function Announcements:GetOptions()
|
|
local destValues = {
|
|
["self"] = L["Self"],
|
|
["party"] = L["Party"],
|
|
["rw"] = L["Raid Warning"],
|
|
["fct"] = L["Blizzard's Floating Combat Text"],
|
|
--["msbt"] = L["MikScrollingBattleText"],
|
|
--["sct"] = L["Scrolling Combat Text"],
|
|
--["parrot"] = L["Parrot"],
|
|
}
|
|
|
|
return {
|
|
headerAnnouncements = {
|
|
type = "header",
|
|
name = L["Announcements"],
|
|
order = 2,
|
|
},
|
|
trinketUsed = option({
|
|
type = "toggle",
|
|
name = L["Trinket used"],
|
|
desc = L["Announce when an enemy's trinket is used"],
|
|
order = 3,
|
|
}),
|
|
trinketReady = option({
|
|
type = "toggle",
|
|
name = L["Trinket ready"],
|
|
desc = L["Announce when an enemy's trinket is ready again"],
|
|
order = 4,
|
|
}),
|
|
drinks = option({
|
|
type = "toggle",
|
|
name = L["Drinking"],
|
|
desc = L["Announces when enemies sit down to drink"],
|
|
order = 5,
|
|
}),
|
|
resurrections = option({
|
|
type = "toggle",
|
|
name = L["Resurrection"],
|
|
desc = L["Announces when an enemy tries to resurrect a teammate"],
|
|
order = 6,
|
|
}),
|
|
enemy = option({
|
|
type = "toggle",
|
|
name = L["New enemies"],
|
|
desc = L["Announces when new enemies are discovered"],
|
|
order = 7,
|
|
}),
|
|
spec = option({
|
|
type = "toggle",
|
|
name = L["Spec Detection"],
|
|
desc = L["Announces when the spec of an enemy was detected"],
|
|
order = 8,
|
|
}),
|
|
health = option({
|
|
type = "toggle",
|
|
name = L["Low health"],
|
|
desc = L["Announces when an enemy drops below a certain health threshold"],
|
|
order = 9,
|
|
}),
|
|
healthThreshold = option({
|
|
type = "range",
|
|
name = L["Low health threshold"],
|
|
desc = L["Choose how low an enemy must be before low health is announced"],
|
|
order = 10,
|
|
min = 1,
|
|
max = 100,
|
|
step = 1,
|
|
disabled = function()
|
|
return not Gladdy.dbi.profile.announcements.health
|
|
end,
|
|
}),
|
|
dest = option({
|
|
type = "select",
|
|
name = L["Destination"],
|
|
desc = L["Choose how your announcements are displayed"],
|
|
order = 11,
|
|
values = destValues,
|
|
}),
|
|
}
|
|
end |