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.

292 lines
8.5 KiB

-- ----------------------------------------------------------------------------
-- A persistent timer for World Bosses.
-- ----------------------------------------------------------------------------
-- addonName, addonTable = ...;
local _, WBT = ...;
local Util = WBT.Util;
local Sound = WBT.Sound;
local BossData = {};
WBT.BossData = BossData;
local function MinToSec(min)
return min * 60;
end
local MAX_RESPAWN = MinToSec(15) - 1; -- Minus 1, since they tend to spawn after 14:59.
-- Conservative guesses. Actual values are not known.
local MIN_RESPAWN_SHA = MinToSec(10);
local MAX_RESPAWN_SHA = MinToSec(20);
local MIN_RESPAWN_NALAK = MIN_RESPAWN_SHA;
local MAX_RESPAWN_NALAK = MAX_RESPAWN_SHA;
local MIN_RESPAWN_HUOLON = MinToSec(30);
local MAX_RESPAWN_HUOLON = MinToSec(60);
local MIN_RESPAWN_ZANDALARI_WARBRINGER = MinToSec(30);
local MAX_RESPAWN_ZANDALARI_WARBRINGER = MinToSec(60);
local SOUND_DIR = "Interface/AddOns/WorldBossTimers/resources/sound/";
local function IsSavedWorldBoss(id_wb)
local n_saved = GetNumSavedWorldBosses();
for i=1, n_saved do
local _, id = GetSavedWorldBossInfo(i);
if id == id_wb then
return true;
end
end
return false;
end
local function IsSavedDaily(questId)
return C_QuestLog.IsQuestFlaggedCompleted(questId);
end
local function NeverSaved()
return false;
end
local tracked_bosses = {
["Oondasta"] = {
name = "Oondasta",
color = "|cff21ffa3",
ids = {69161},
is_saved_fcn = function() return IsSavedWorldBoss(4); end,
soundfile = SOUND_DIR .. "oondasta3.mp3",
min_respawn = MAX_RESPAWN,
max_respawn = MAX_RESPAWN,
random_spawn_time = false,
auto_announce = true,
map_id = 507,
perimiter = {
origin = {
x = 0.49706578,
y = 0.56742978,
},
radius = 0.07,
},
},
["Rukhmar"] = {
name = "Rukhmar",
color = "|cfffa6e06",
ids = {83746},
is_saved_fcn = function() return IsSavedWorldBoss(9); end,
soundfile = SOUND_DIR .. "rukhmar1.mp3",
min_respawn = MAX_RESPAWN,
max_respawn = MAX_RESPAWN,
random_spawn_time = false,
auto_announce = true,
map_id = 542,
perimiter = {
origin = {
x = 0.37155128,
y = 0.38439554,
},
radius = 0.04,
},
},
["Galleon"] = {
name = "Galleon",
color = "|cffc1f973",
ids = {62346},
is_saved_fcn = function() return IsSavedWorldBoss(2); end,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MAX_RESPAWN,
max_respawn = MAX_RESPAWN,
random_spawn_time = false,
auto_announce = true,
map_id = 376,
perimiter = {
origin = {
x = 0.71155238,
y = 0.63839519,
},
radius = 0.04,
},
},
["Nalak"] = {
name = "Nalak",
color = "|cff0081cc",
ids = {69099},
is_saved_fcn = function() return IsSavedWorldBoss(3); end,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MIN_RESPAWN_NALAK,
max_respawn = MAX_RESPAWN_NALAK,
random_spawn_time = true,
auto_announce = true,
map_id = 504,
perimiter = {
origin = {
x = 0.60369474,
y = 0.37266934,
},
radius = 0.04,
},
},
["Sha of Anger"] = {
name = "Sha of Anger",
color = "|cff8a1a9f",
ids = {60491},
is_saved_fcn = function() return IsSavedWorldBoss(1); end,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MIN_RESPAWN_SHA,
max_respawn = MAX_RESPAWN_SHA,
random_spawn_time = true,
auto_announce = true,
map_id = 379,
perimiter = {
origin = {
x = 0.53787065,
y = 0.64697766,
},
radius = 0.03,
},
},
["Huolon"] = {
name = "Huolon",
color = "|cfff7f713",
ids = {73167},
is_saved_fcn = NeverSaved,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MIN_RESPAWN_HUOLON,
max_respawn = MAX_RESPAWN_HUOLON,
random_spawn_time = true,
auto_announce = true,
map_id = 554,
perimiter = {
origin = {
x = 0.66583741,
y = 0.58253992,
},
radius = 0.06,
},
},
["Rustfeather"] = {
name = "Rustfeather",
color = "|cffffe17d",
ids = {152182},
is_saved_fcn = function() return IsSavedDaily(55811); end,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MinToSec(15),
max_respawn = MinToSec(30),
random_spawn_time = true,
auto_announce = true,
map_id = 1462,
perimiter = {
origin = {
x = 0.65564358234406,
y = 0.78932404518127,
},
radius = 0.05,
},
},
["A. Harvester"] = {
name = "A. Harvester", -- Shortened to keep GUI text to one line.
color = "|cffe08748",
ids = {151934},
is_saved_fcn = function() return IsSavedDaily(55512); end,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MinToSec(20),
max_respawn = MinToSec(40),
random_spawn_time = true,
auto_announce = true,
map_id = 1462,
perimiter = {
origin = {
x = 0.52341330,
y = 0.40851349,
},
radius = 0.05,
},
},
}
local ZWB_STATIC_DATA = {
{zone = "JF", map_id = 371, color = "|cff2bce7a", perimiter = {origin = {x = 0.52551341, y = 0.18841952}, radius = 0.03}},
{zone = "KW", map_id = 418, color = "|cff27b4d1", perimiter = {origin = {x = 0.17448401, y = 0.52911037}, radius = 0.04}},
{zone = "DW", map_id = 422, color = "|cff8a1a9f", perimiter = {origin = {x = 0.47365963, y = 0.62041634}, radius = 0.03}},
{zone = "KS", map_id = 379, color = "|cffeab01e", perimiter = {origin = {x = 0.75076747, y = 0.67355406}, radius = 0.03}},
{zone = "TS", map_id = 388, color = "|cff0cd370", perimiter = {origin = {x = 0.36536807, y = 0.85731047}, radius = 0.03}},
};
local function ZWBName(zone)
return "ZWB (" .. zone .. ")";
end
local function ZandalariWarbringerFromTemplate(zone, map_id, color, perimiter)
return {
name = ZWBName(zone),
color = color,
ids = {69769, 69842, 69841},
is_saved_fcn = NeverSaved,
soundfile = Sound.SOUND_FILE_DEFAULT,
min_respawn = MIN_RESPAWN_ZANDALARI_WARBRINGER,
max_respawn = MAX_RESPAWN_ZANDALARI_WARBRINGER,
random_spawn_time = true,
auto_announce = false,
map_id = map_id,
perimiter = perimiter,
};
end
local function AddZandalariWarbringers()
for _, data in pairs(ZWB_STATIC_DATA) do
tracked_bosses[ZWBName(data.zone)] = ZandalariWarbringerFromTemplate(data.zone, data.map_id, data.color, data.perimiter);
end
end
AddZandalariWarbringers();
-- END OF STATIC DATA --
function BossData.Get(name)
return tracked_bosses[name];
end
function BossData.GetFromUnitGuid(guid, map_id)
local npc_id = select(6, strsplit("-", guid));
for _, data in pairs(tracked_bosses) do
for _, id in pairs(data.ids) do
if npc_id == tostring(id) and map_id == data.map_id then
return data;
end
end
end
return nil;
end
function BossData.NameFromUnitGuid(guid, map_id)
local data = BossData.GetFromUnitGuid(guid, map_id);
if data then
return data.name;
end
return nil;
end
function BossData.GetAll()
return tracked_bosses;
end
function BossData.BossExists(name)
for name2, _ in pairs(tracked_bosses) do
if name == name2 then
return true;
end
end
return false;
end
function BossData.IsSaved(name)
return BossData.Get(name).is_saved_fcn();
end
-- FIXME: This looks strange.
for name, data in pairs(tracked_bosses) do
data.name_colored = data.color .. data.name .. Util.COLOR_DEFAULT;
end