You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
385 lines
12 KiB
385 lines
12 KiB
-------------------------------------------------------------------------------
|
|
-- Module Declaration
|
|
--
|
|
|
|
local plugin = BigWigs:NewPlugin("AutoReply")
|
|
if not plugin then return end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Database
|
|
--
|
|
|
|
plugin.defaultDB = {
|
|
disabled = true,
|
|
mode = 2,
|
|
modeOther = 1,
|
|
exitCombat = 3,
|
|
exitCombatOther = 2,
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Locals
|
|
--
|
|
|
|
local SendChatMessage, GetTime = BigWigsLoader.SendChatMessage, GetTime
|
|
local L = BigWigsAPI:GetLocale("BigWigs: Plugins")
|
|
plugin.displayName = L.autoReply
|
|
local curDiff = 0
|
|
local curModule = nil
|
|
local throttle, throttleBN, friendlies = {}, {}, {}
|
|
local hogger = EJ_GetEncounterInfo(464)
|
|
local healthPools, healthPoolNames = {}, {}
|
|
local timer = nil
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Options
|
|
--
|
|
|
|
do
|
|
local disabled = function() return plugin.db.profile.disabled end
|
|
local modeTbl = {
|
|
type = "select",
|
|
name = L.responseType,
|
|
order = 1,
|
|
values = {
|
|
L.autoReplyBasic,
|
|
L.autoReplyNormal:format(hogger),
|
|
L.autoReplyAdvanced:format(hogger, GetDifficultyInfo(2), 12, 20),
|
|
L.autoReplyExtreme:format(hogger, GetDifficultyInfo(2), 12, 20, L.healthFormat:format(hogger, 42)),
|
|
},
|
|
width = "full",
|
|
style = "radio",
|
|
}
|
|
local exitCombatTbl = {
|
|
type = "select",
|
|
name = L.autoReplyFinalReply,
|
|
order = 2,
|
|
values = {
|
|
L.none,
|
|
L.autoReplyLeftCombatBasic,
|
|
"|cFF00FF00".. L.autoReplyLeftCombatNormalWin:format(hogger) .."|r |cFFFF0000".. L.autoReplyLeftCombatNormalWipe:format(hogger) .. "|r",
|
|
"|cFF00FF00".. L.autoReplyLeftCombatAdvancedWin:format(hogger, 1, 20) .."|r |cFFFF0000".. L.autoReplyLeftCombatAdvancedWipe:format(hogger, L.healthFormat:format(hogger, 0.1)) .."|r",
|
|
},
|
|
width = "full",
|
|
style = "radio",
|
|
}
|
|
|
|
plugin.pluginOptions = {
|
|
name = "|TInterface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\AutoReply:20|t ".. L.autoReply,
|
|
desc = L.autoReplyDesc,
|
|
type = "group",
|
|
childGroups = "tab",
|
|
order = 9,
|
|
get = function(info)
|
|
return plugin.db.profile[info[#info]]
|
|
end,
|
|
set = function(info, value)
|
|
local entry = info[#info]
|
|
plugin.db.profile[entry] = value
|
|
end,
|
|
args = {
|
|
heading = {
|
|
type = "description",
|
|
name = L.autoReplyDesc.. "\n\n",
|
|
order = 1,
|
|
width = "full",
|
|
fontSize = "medium",
|
|
},
|
|
disabled = {
|
|
type = "toggle",
|
|
name = L.disabled,
|
|
width = "full",
|
|
order = 2,
|
|
},
|
|
friendly = {
|
|
name = L.guildAndFriends,
|
|
type = "group",
|
|
order = 3,
|
|
disabled = disabled,
|
|
args = {mode = modeTbl, exitCombat = exitCombatTbl},
|
|
},
|
|
other = {
|
|
name = L.everyoneElse,
|
|
type = "group",
|
|
order = 4,
|
|
disabled = disabled,
|
|
args = {modeOther = modeTbl, exitCombatOther = exitCombatTbl},
|
|
},
|
|
},
|
|
}
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Initialization
|
|
--
|
|
|
|
do
|
|
local function updateProfile()
|
|
local db = plugin.db.profile
|
|
|
|
for k, v in next, db do
|
|
local defaultType = type(plugin.defaultDB[k])
|
|
if defaultType == "nil" then
|
|
db[k] = nil
|
|
elseif type(v) ~= defaultType then
|
|
db[k] = plugin.defaultDB[k]
|
|
end
|
|
end
|
|
|
|
if db.mode < 1 or db.mode > 4 then
|
|
db.mode = plugin.defaultDB.mode
|
|
end
|
|
if db.modeOther < 1 or db.modeOther > 4 then
|
|
db.modeOther = plugin.defaultDB.modeOther
|
|
end
|
|
if db.exitCombat < 1 or db.exitCombat > 4 then
|
|
db.exitCombat = plugin.defaultDB.exitCombat
|
|
end
|
|
if db.exitCombatOther < 1 or db.exitCombatOther > 4 then
|
|
db.exitCombatOther = plugin.defaultDB.exitCombatOther
|
|
end
|
|
end
|
|
|
|
function plugin:OnPluginEnable()
|
|
self:RegisterMessage("BigWigs_OnBossEngage")
|
|
self:RegisterMessage("BigWigs_OnBossWin", "WinOrWipe")
|
|
self:RegisterMessage("BigWigs_OnBossWipe", "WinOrWipe")
|
|
self:RegisterMessage("BigWigs_ProfileUpdate", updateProfile)
|
|
updateProfile()
|
|
end
|
|
end
|
|
|
|
function plugin:OnPluginDisable()
|
|
curModule = nil
|
|
throttle, throttleBN, friendlies = {}, {}, {}
|
|
healthPools, healthPoolNames = {}, {}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Event Handlers
|
|
--
|
|
|
|
function plugin:BigWigs_OnBossEngage(event, module, difficulty)
|
|
if not self.db.profile.disabled and module and module.journalId and not module.worldBoss then
|
|
curDiff = difficulty
|
|
curModule = module
|
|
throttle, throttleBN, friendlies = {}, {}, {}
|
|
self:RegisterEvent("CHAT_MSG_WHISPER")
|
|
self:RegisterEvent("CHAT_MSG_BN_WHISPER")
|
|
end
|
|
end
|
|
|
|
do
|
|
local function CreateAdvancedFinalReply(win)
|
|
if win then
|
|
local playersTotal, playersAlive = 0, 0
|
|
for unit in curModule:IterateGroup() do
|
|
playersTotal = playersTotal + 1
|
|
if not UnitIsDeadOrGhost(unit) then
|
|
playersAlive = playersAlive + 1
|
|
end
|
|
end
|
|
return L.autoReplyLeftCombatAdvancedWin:format(curModule.displayName, playersAlive, playersTotal)
|
|
else
|
|
local totalHp = ""
|
|
for i = 1, 5 do
|
|
local hp = healthPools[i]
|
|
local name = healthPoolNames[i]
|
|
if hp then
|
|
if totalHp == "" then
|
|
totalHp = L.healthFormat:format(name, hp*100)
|
|
else
|
|
totalHp = totalHp .. L.comma .. L.healthFormat:format(name, hp*100)
|
|
end
|
|
end
|
|
end
|
|
return L.autoReplyLeftCombatAdvancedWipe:format(curModule.displayName, totalHp)
|
|
end
|
|
end
|
|
|
|
function plugin:WinOrWipe(event, module)
|
|
if not self.db.profile.disabled and module and module == curModule then
|
|
curDiff = 0
|
|
self:UnregisterEvent("CHAT_MSG_WHISPER")
|
|
self:UnregisterEvent("CHAT_MSG_BN_WHISPER")
|
|
if timer then
|
|
self:CancelTimer(timer)
|
|
timer = nil
|
|
end
|
|
|
|
local exitCombat, exitCombatOther = self.db.profile.exitCombat, self.db.profile.exitCombatOther
|
|
local win = event == "BigWigs_OnBossWin"
|
|
if exitCombat > 1 then
|
|
for k in next, throttleBN do
|
|
local msg
|
|
if exitCombat == 3 then
|
|
msg = (win and L.autoReplyLeftCombatNormalWin or L.autoReplyLeftCombatNormalWipe):format(curModule.displayName)
|
|
elseif exitCombat == 4 then
|
|
msg = CreateAdvancedFinalReply(win)
|
|
else
|
|
msg = L.autoReplyLeftCombatBasic
|
|
end
|
|
BNSendWhisper(k, "[BigWigs] ".. msg)
|
|
end
|
|
for k in next, friendlies do
|
|
local msg
|
|
if exitCombat == 3 then
|
|
msg = (win and L.autoReplyLeftCombatNormalWin or L.autoReplyLeftCombatNormalWipe):format(curModule.displayName)
|
|
elseif exitCombat == 4 then
|
|
msg = CreateAdvancedFinalReply(win)
|
|
else
|
|
msg = L.autoReplyLeftCombatBasic
|
|
end
|
|
SendChatMessage("[BigWigs] ".. msg, "WHISPER", nil, k)
|
|
end
|
|
end
|
|
if exitCombatOther > 1 then
|
|
for k in next, throttle do
|
|
if not friendlies[k] then
|
|
local msg
|
|
if exitCombatOther == 3 then
|
|
msg = (win and L.autoReplyLeftCombatNormalWin or L.autoReplyLeftCombatNormalWipe):format(curModule.displayName)
|
|
elseif exitCombatOther == 4 then
|
|
msg = CreateAdvancedFinalReply(win)
|
|
else
|
|
msg = L.autoReplyLeftCombatBasic
|
|
end
|
|
SendChatMessage("[BigWigs] ".. msg, "WHISPER", nil, k)
|
|
end
|
|
end
|
|
end
|
|
|
|
curModule = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local units = {"boss1", "boss2", "boss3", "boss4", "boss5"}
|
|
|
|
local UnitHealth, UnitHealthMax, IsEncounterInProgress = UnitHealth, UnitHealthMax, IsEncounterInProgress
|
|
local function StoreHealth()
|
|
if IsEncounterInProgress() then
|
|
for i = 1, 5 do
|
|
local unit = units[i]
|
|
local rawHealth = UnitHealth(unit)
|
|
if rawHealth > 0 then
|
|
local maxHealth = UnitHealthMax(unit)
|
|
local health = rawHealth / maxHealth
|
|
healthPools[i] = health
|
|
healthPoolNames[i] = plugin:UnitName(unit)
|
|
elseif healthPools[i] then
|
|
healthPools[i] = nil
|
|
healthPoolNames[i] = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function CreateResponse(mode)
|
|
if mode == 2 then
|
|
return L.autoReplyNormal:format(curModule.displayName) -- In combat with encounterName
|
|
elseif mode == 3 then
|
|
local playersTotal, playersAlive = 0, 0
|
|
for unit in curModule:IterateGroup() do
|
|
playersTotal = playersTotal + 1
|
|
if not UnitIsDeadOrGhost(unit) then
|
|
playersAlive = playersAlive + 1
|
|
end
|
|
end
|
|
-- In combat with encounterName, difficulty, playersAlive
|
|
return L.autoReplyAdvanced:format(curModule.displayName, GetDifficultyInfo(curDiff), playersAlive, playersTotal)
|
|
elseif mode == 4 then
|
|
local playersTotal, playersAlive = 0, 0
|
|
for unit in curModule:IterateGroup() do
|
|
playersTotal = playersTotal + 1
|
|
if not UnitIsDeadOrGhost(unit) then
|
|
playersAlive = playersAlive + 1
|
|
end
|
|
end
|
|
local totalHp = ""
|
|
for i = 1, 5 do
|
|
local unit = units[i]
|
|
local hp = UnitHealth(unit)
|
|
local name = plugin:UnitName(unit)
|
|
if hp > 0 then
|
|
hp = hp / UnitHealthMax(unit)
|
|
if totalHp == "" then
|
|
totalHp = L.healthFormat:format(name, hp*100)
|
|
else
|
|
totalHp = totalHp .. L.comma .. L.healthFormat:format(name, hp*100)
|
|
end
|
|
end
|
|
end
|
|
-- In combat with encounterName, difficulty, playersAlive, bossHealth
|
|
return L.autoReplyExtreme:format(curModule.displayName, GetDifficultyInfo(curDiff), playersAlive, playersTotal, totalHp)
|
|
else
|
|
return L.autoReplyBasic -- In combat
|
|
end
|
|
end
|
|
|
|
function plugin:CHAT_MSG_WHISPER(event, _, sender, _, _, _, flag, _, _, _, _, _, guid)
|
|
if curDiff > 0 and flag ~= "GM" and flag ~= "DEV" then
|
|
local trimmedPlayer = Ambiguate(sender, "none")
|
|
if UnitInRaid(trimmedPlayer) or UnitInParty(trimmedPlayer) then -- Player is in our group
|
|
local _, _, _, myInstanceId = UnitPosition("player")
|
|
local _, _, _, tarInstanceId = UnitPosition(trimmedPlayer)
|
|
if myInstanceId == tarInstanceId then -- Player is also in our instance
|
|
return
|
|
end
|
|
end
|
|
if not throttle[sender] or (GetTime() - throttle[sender]) > 30 then
|
|
throttle[sender] = GetTime()
|
|
local isBnetFriend = C_BattleNet.GetGameAccountInfoByGUID(guid)
|
|
local msg
|
|
if isBnetFriend or IsGuildMember(guid) or C_FriendList.IsFriend(guid) then
|
|
friendlies[sender] = true
|
|
msg = CreateResponse(self.db.profile.mode)
|
|
if not timer and self.db.profile.exitCombat == 4 then
|
|
timer = self:ScheduleRepeatingTimer(StoreHealth, 2)
|
|
end
|
|
else
|
|
msg = CreateResponse(self.db.profile.modeOther)
|
|
if not timer and self.db.profile.exitCombatOther == 4 then
|
|
timer = self:ScheduleRepeatingTimer(StoreHealth, 2)
|
|
end
|
|
end
|
|
SendChatMessage("[BigWigs] ".. msg, "WHISPER", nil, sender)
|
|
end
|
|
end
|
|
end
|
|
|
|
function plugin:CHAT_MSG_BN_WHISPER(event, _, playerName, _, _, _, _, _, _, _, _, _, _, bnSenderID)
|
|
if curDiff > 0 and not BNIsSelf(bnSenderID) then
|
|
if not throttleBN[bnSenderID] or (GetTime() - throttleBN[bnSenderID]) > 30 then
|
|
throttleBN[bnSenderID] = GetTime()
|
|
local index = BNGetFriendIndex(bnSenderID)
|
|
local gameAccs = C_BattleNet.GetFriendNumGameAccounts(index)
|
|
for i=1, gameAccs do
|
|
local gameAccountInfo = C_BattleNet.GetFriendGameAccountInfo(index, i)
|
|
local player = gameAccountInfo.characterName
|
|
local realmName = gameAccountInfo.realmName -- Short name "ServerOne"
|
|
local realmDisplayName = gameAccountInfo.realmDisplayName -- Full name "Server One"
|
|
if gameAccountInfo.clientProgram == "WoW" and gameAccountInfo.wowProjectID == 1 and realmName and realmDisplayName and player then
|
|
if realmDisplayName ~= GetRealmName() then
|
|
player = player .. "-" .. realmName
|
|
end
|
|
if UnitInRaid(player) or UnitInParty(player) then -- Player is in our group
|
|
local _, _, _, myInstanceId = UnitPosition("player")
|
|
local _, _, _, tarInstanceId = UnitPosition(player)
|
|
if myInstanceId == tarInstanceId then -- Player is also in our instance
|
|
throttleBN[bnSenderID] = nil
|
|
return
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local msg = CreateResponse(self.db.profile.mode)
|
|
BNSendWhisper(bnSenderID, "[BigWigs] ".. msg)
|
|
if not timer and self.db.profile.exitCombat == 4 then
|
|
timer = self:ScheduleRepeatingTimer(StoreHealth, 2)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|