------------------------------------------------------------------------------- -- Locals -- ------------------------------------------------------------------------------- local L = AceLibrary("AceLocale-2.2"):new("BanzaiAlert") local lastAggroAlert = nil local isFlashing = nil --local lastUnitTable = nil ------------------------------------------------------------------------------- -- Localization -- ------------------------------------------------------------------------------- L:RegisterTranslations("enUS", function() return { ["Sound alert"] = true, ["Plays a sound alert when you get aggro."] = true, ["Text alert"] = true, ["Displays a message on the screen when you get aggro."] = true, ["Only in group"] = true, ["Only alert for aggro when you are grouped."] = true, ["Health frame flash"] = true, ["Flash the health frame when you get aggro."] = true, ["Lost aggro"] = true, ["Alerts you when you lose aggro."] = true, ["Aggro from %s!"] = true, ["Lost aggro!"] = true, -- oRA2 module ["aggroalert"] = true, ["Participant/AggroAlert"] = true, ["aggro"] = true, ["Aggro alert"] = true, ["Options for aggro notifications."] = true, ["Display"] = true, ["Set where messages are displayed."] = true, ["Default Frame"] = "Default", ["BigWigs frame"] = "BigWigs", ["Mik's Scrolling Battle Text"] = "MSBT", ["Scrolling Combat Text"] = "SCT", } end) L:RegisterTranslations("koKR", function() return { ["Sound alert"] = "경고 효과음", ["Plays a sound alert when you get aggro."] = "어그로 획득시 경고 효과음을 재생합니다.", ["Text alert"] = "경고 텍스트", ["Displays a message on the screen when you get aggro."] = "어그로 획득시 화면에 메세지를 표시합니다.", ["Only in group"] = "파티만 사용", ["Only alert for aggro when you are grouped."] = "파티에 속해 있을 때에만 경고를 사용합니다.", ["Health frame flash"] = "화면 번쩍임", ["Flash the health frame when you get aggro."] = "어그로 획득시 생명력 프레임(화면 외곽)을 번쩍입니다.", ["Lost aggro"] = "어그로 손실", ["Alerts you when you lose aggro."] = "어그로 손실시 알립니다.", ["Aggro from %s!"] = "%s의 어그로 획득!", ["Lost aggro!"] = "어그로 손실!", -- oRA2 module -- ["aggroalert"] = "어그로경고", -- ["Participant/AggroAlert"] = true, -- ["aggro"] = "어그로", ["Aggro alert"] = "어그로 경고", ["Options for aggro notifications."] = "어그로 경고에 대해 설정합니다.", ["Display"] = "디스플레이", ["Set where messages are displayed."] = "메세지가 표시되는 곳을 설정합니다.", } end) L:RegisterTranslations("zhTW", function() return { ["Sound alert"] = "聲音警告", ["Plays a sound alert when you get aggro."] = "當你得到Aggro時發出聲音警告", ["Text alert"] = "文字警告", ["Displays a message on the screen when you get aggro."] = "當你得到Aggro時在螢幕顯示文字警告", ["Only in group"] = "隊伍模式", ["Only alert for aggro when you are grouped."] = "只有當你在隊伍裡時發出Aggro警告", ["Health frame flash"] = "全螢幕閃光警告", ["Flash the health frame when you get aggro."] = "在你得到Aggro後發出全螢幕閃光警告", ["Lost aggro"] = "失去Aggro", ["Alerts you when you lose aggro."] = "當你失去Aggro時發出警告", ["Aggro from %s!"] = "得到 %s 的 Aggro!", ["Lost aggro!"] = "失去 Aggro!", -- oRA2 module ["aggroalert"] = "Aggro警報", ["Participant/AggroAlert"] = "Participant/AggroAlert", ["aggro"] = "aggro", ["Aggro alert"] = "Aggro警報", ["Options for aggro notifications."] = "Aggro 通知選項", ["Display"] = "顯示", ["Set where messages are displayed."] = "設定訊息將會顯示在哪裡", ["Default Frame"] = "預設", ["BigWigs frame"] = "BigWigs", ["Mik's Scrolling Battle Text"] = "MSBT", ["Scrolling Combat Text"] = "SCT", } end) ------------------------------------------------------------------------------- -- Addon declaration -- ------------------------------------------------------------------------------- BanzaiAlert = AceLibrary("AceAddon-2.0"):new("AceConsole-2.0", "AceDB-2.0", "AceEvent-2.0") BanzaiAlert:RegisterDB("BanzaiAlertDB") BanzaiAlert:RegisterDefaults("profile", { sound = true, message = true, onlyInGroup = true, flash = true, lost = false, display = L["Default Frame"], }) local options = { type = "group", name = L["Aggro alert"], desc = L["Options for aggro notifications."], args = { sound = { type = "toggle", name = L["Sound alert"], desc = L["Plays a sound alert when you get aggro."], get = function() return BanzaiAlert.db.profile.sound end, set = function(v) BanzaiAlert.db.profile.sound = v end, }, message = { type = "toggle", name = L["Text alert"], desc = L["Displays a message on the screen when you get aggro."], get = function() return BanzaiAlert.db.profile.message end, set = function(v) BanzaiAlert.db.profile.message = v end, }, onlyInGroup = { type = "toggle", name = L["Only in group"], desc = L["Only alert for aggro when you are grouped."], get = function() return BanzaiAlert.db.profile.onlyInGroup end, set = function(v) BanzaiAlert.db.profile.onlyInGroup = v end, }, flash = { type = "toggle", name = L["Health frame flash"], desc = L["Flash the health frame when you get aggro."], get = function() return BanzaiAlert.db.profile.flash end, set = function(v) BanzaiAlert.db.profile.flash = v end, }, lost = { type = "toggle", name = L["Lost aggro"], desc = L["Alerts you when you lose aggro."], get = function() return BanzaiAlert.db.profile.lost end, set = function(v) BanzaiAlert.db.profile.lost = v end, }, display = { type = "text", name = L["Display"], desc = L["Set where messages are displayed."], get = function() return BanzaiAlert.db.profile.display end, set = function(v) BanzaiAlert.db.profile.display = v end, validate = { L["Default Frame"], L["BigWigs frame"], L["Scrolling Combat Text"], L["Mik's Scrolling Battle Text"] }, disabled = function() return BanzaiAlert.db.profile.message ~= true end, } }, } BanzaiAlert:RegisterChatCommand({"/banzaialert", "/banzai"}, options, "BANZAIALERT") ------------------------------------------------------------------------------- -- Initialization -- ------------------------------------------------------------------------------- local function _InitoRA() if oRA and not oRAPAggroAlert then oRAPAggroAlert = oRA:NewModule(L["aggroalert"]) oRAPAggroAlert.participant = true oRAPAggroAlert.name = L["Participant/AggroAlert"] oRAPAggroAlert.consoleCmd = L["aggro"] oRAPAggroAlert.consoleOptions = options end end function BanzaiAlert:ADDON_LOADED() if arg1 == "oRA2" then _InitoRA() end end function BanzaiAlert:OnEnable() lastAggroAlert = nil _InitoRA() self:RegisterEvent("Banzai_PlayerGainedAggro") self:RegisterEvent("Banzai_PlayerLostAggro") self:RegisterEvent("ADDON_LOADED") end ------------------------------------------------------------------------------- -- Addon methods -- ------------------------------------------------------------------------------- function BanzaiAlert:Alert( gainedAggro, unitId ) local text = nil if gainedAggro then text = string.format(L["Aggro from %s!"], UnitName(unitId)) else text = L["Lost aggro!"] end if self.db.profile.display == L["BigWigs frame"] and BigWigs then -- Big Wigs self:TriggerEvent("BigWigs_Message", text, "Red", true, nil) elseif self.db.profile.display == L["Scrolling Combat Text"] and SCT then -- SCT 5.x SCT_MSG_FRAME:AddMessage(text, 1.0, 0.0, 0.0, 1) elseif self.db.profile.display == L["Mik's Scrolling Battle Text"] and MikSBT then -- MSBT MikSBT.DisplayMessage(text, MikSBT.DISPLAYTYPE_NOTIFICATION, false, 255, 0, 0) elseif CombatText_AddMessage then -- Blizzards FCT CombatText_AddMessage(text, COMBAT_TEXT_SCROLL_FUNCTION, 1.0, 0.0, 0.0, "sticky", nil) else -- Fallback UIErrorsFrame:AddMessage(text, 1.0, 0.0, 0.0, 1, UIERRORS_HOLD_TIME) end end ------------------------------------------------------------------------------- -- Events -- ------------------------------------------------------------------------------- function BanzaiAlert:Banzai_PlayerGainedAggro( unitTable ) if (self.db.profile.onlyInGroup and GetNumPartyMembers() == 0) or not unitTable then return end if not lastAggroAlert or (GetTime() - lastAggroAlert) > 5 then if self.db.profile.sound then PlaySoundFile("Interface\\AddOns\\BanzaiAlert\\aggro.wav") end if unitTable[1] then if self.db.profile.message then self:Alert(true, unitTable[1]) end if self.db.profile.flash and not isFlashing then self:StartFlashing() end end lastAggroAlert = GetTime() end end function BanzaiAlert:Banzai_PlayerLostAggro( unitId ) if self.db.profile.flash or isFlashing then self:StopFlashing() end if self.db.profile.onlyInGroup and GetNumPartyMembers() == 0 then return end if self.db.profile.lost and self.db.profile.message then self:Alert() end end ------------------------------------------------------------------------------- -- Frame flashing -- ------------------------------------------------------------------------------- function BanzaiAlert:StartFlashing() if self:IsEventScheduled("banzaiflash") or isFlashing then return end UIFrameFlash(LowHealthFrame, 0.2, 0.8, 10, nil, .5, 0) self:ScheduleRepeatingEvent("banzaiflash", function() UIFrameFlash(LowHealthFrame, 0.2, 0.8, 10, nil, .5, 0) end, .5) isFlashing = true end function BanzaiAlert:StopFlashing() if not isFlashing then return end if self:IsEventScheduled("banzaiflash") then self:CancelScheduledEvent("banzaiflash") end UIFrameFlashRemoveFrame(LowHealthFrame) UIFrameFadeRemoveFrame(LowHealthFrame) UIFrameFadeOut(LowHealthFrame, 0.5, LowHealthFrame:GetAlpha(), 0) isFlashing = nil end