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.

386 lines
12 KiB

5 years ago
-------------------------------------------------------------------------------
-- 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