local _, L = ...
local LMB, RMB = CreateAtlasMarkup("NPE_LeftClick", 18, 18), CreateAtlasMarkup("NPE_RightClick", 18,18)
local DefaultConfig = {
collapsed = false,
pinned = true,
events = {
[1] = { name = "Storm's Fury",
texture = "ElementalStorm-Boss-Water",
eventRegionOffset = {
[1] = 1670338860 + 3600,
[2] = 1670698860,
eventDuration = 7200,
eventInterval = 18000,
enable = true,
sound = false,
voice_before = true,
voice_active = true,
anim = true,
questID = 74378,
findEventOnMap = false,
coor = {2025, 59.84, 82.29},
datablock = {}
},
[2] = { name = "Trial of Elements",
texture = "VignetteLootElite",
eventRegionOffset = {
[1] = 1670342460,
[2] = 1670698860,
eventDuration = 600,
eventInterval = 3600,
enable = true,
sound = false,
voice_before = true,
voice_active = true,
anim = true,
questID = 71995,
findEventOnMap = false,
coor = {},
datablock = {
[0] = {name = "Trial of the Elements", enable = false, coor = {2085, 25.80, 25.84},},
[1] = {name = "Trial of the Elements", enable = false, coor = {2085, 25.80, 25.84},},
[2] = {name = "Trial of the Elements", enable = true, coor = {2085, 25.80, 25.84},},
},
},
},
}
EventsTrackerMixin = {}
local eventFrame = {}
function EventsTrackerMixin:FindEventOnMaps(eventName, maps)
for _, mapID in next, maps do
local areaPoiIDs = C_AreaPoiInfo.GetAreaPOIForMap(mapID);
for _, ids in pairs(areaPoiIDs) do
--areaPoiID,position,name,description,textureIndex,widgetSetID,atlasName,uiTextureKit,shouldGlow,factionID,isPrimaryMapForPOI,isAlwaysOnFlightmap,addPaddingAboveWidgets, highlightWorldQuestsOnHover, highlightVignettesOnHover
local poiInfo = C_AreaPoiInfo.GetAreaPOIInfo(mapID, ids);
if eventName == "all" then --and poiInfo.isPrimaryMapForPOI then
for k, v in pairs(poiInfo) do
print(k,v);
end
print("--------------------------------------");
end
if ((poiInfo.atlasName == "dreamsurge_hub-icon" and eventName == "Dreamsurge") or poiInfo.name == eventName) and poiInfo.isPrimaryMapForPOI then
local elementType = poiInfo.atlasName and strmatch(poiInfo.atlasName, "ElementalStorm%-Lesser%-(.+)") or "";
local x, y = poiInfo.position:GetXY();
return mapID, x*100, y*100, poiInfo.areaPoiID, poiInfo.atlasName, elementType
end
end
end
end
local function SetTextureForEventFrame(frame, texture)
if tonumber(texture) then
frame.icon:SetTexture(texture)
frame.icon:SetTexCoord(.08, .92, 0.08, 0.92)
else
local info = C_Texture.GetAtlasInfo(texture)
if info then
frame.icon:SetAtlas(texture)
else
frame.icon:SetTexture(texture)
end
end
end
function EventsTrackerMixin:CreateEvent(v, index)
local serverResetTime = GetServerTime() - (604800 - C_DateAndTime.GetSecondsUntilWeeklyReset())
local eFrame = CreateFrame("Button", nil, EventsTrackerHeader, "EventsTrackerButton")
local region = GetCurrentRegion()
-- ptr
if not region or region > 5 then
region = 1
end
eFrame.init = false
eFrame.notification = false
eFrame.timeTmp = nil
eFrame.index = index
eFrame.cfg = v
eFrame.cfg.tooltipTitle = v.name
eFrame.cfg.tooltipText = v.tooltipText or ""
eFrame.cfg.eventNewRegionOffset = v.eventRegionOffset[region] > 1600000000 and v.eventRegionOffset[region] or (serverResetTime + v.eventRegionOffset[region])
SetTextureForEventFrame(eFrame, v.texture)
if tonumber(v.questID) then
eFrame.icon:SetDesaturated(C_QuestLog.IsQuestFlaggedCompleted(v.questID))
end
eFrame:SetScript("OnUpdate", function(self, elapsed)
self.elapsed = (self.elapsed or 1) + elapsed
if self.elapsed < 1 then return end
self.elapsed = 0
if not self:IsShown() then return end
local timeFromFirstStart = GetServerTime() - self.cfg.eventNewRegionOffset
local timeToNextEvent = (self.cfg.eventInterval - timeFromFirstStart % self.cfg.eventInterval) + (self.timeTmp and self.timeTmp or 0)
local timeActiveEvent = self.timeTmp and timeToNextEvent or self.cfg.eventDuration - (self.cfg.eventInterval - timeToNextEvent)
local isEventActive = (self.cfg.eventInterval + (self.timeTmp and self.timeTmp or 0)) - timeToNextEvent <= self.cfg.eventDuration
local showedTime = isEventActive and timeActiveEvent or timeToNextEvent
if not self.init or (self.isEventActive and not isEventActive) then
if (self.isEventActive and not isEventActive) then self.isEventActive = false end
self.timer:SetTextColor(.9, .9, .9)
self.timeTmp = nil
-- hladam dalsi event v databloku ak je neaky disabled preskocim ho a pripocitam cas
if next(self.cfg.datablock) then
local index = math.floor(((timeFromFirstStart + (not isEventActive and self.cfg.eventInterval or 0)) / self.cfg.eventInterval) % (#self.cfg.datablock + 1))
-- ak su nasledujuce eventy v databloku vypnute najdem prvy aktivny a upravim cas
for i = 0, #self.cfg.datablock do
if not self.cfg.datablock[index].enable then
self.timeTmp = (self.timeTmp or 0) + self.cfg.eventInterval
else
break
end
index = index == #self.cfg.datablock and 0 or (index + 1)
end
self.cfg.tooltipTitle = self.cfg.datablock[index].name
self.cfg.coor = self.cfg.datablock[index].coor
elseif self.cfg.findEventOnMap then
self.cfg.tooltipTitle = self.cfg.name
SetTextureForEventFrame(self, self.cfg.texture)
self.icon:SetDesaturated(true)
wipe(self.cfg.coor)
end
end
if showedTime < 3600 then
self.timer:SetText(date("%M:%S", showedTime))
else
self.timer:SetText(date("%H", showedTime)-1 .. date("h%M", showedTime))
end
if not self.isEventActive and isEventActive then
if self.timeTmp then
if self.timeTmp > 0 then
self.timeTmp = self.timeTmp - self.cfg.eventInterval
end
elseif self.cfg.eventDuration > 0 then
if self.cfg.findEventOnMap then
local mapID, x, y, areaPoiID, atlasName, elementType = EventsTrackerMixin:FindEventOnMaps(self.cfg.name, {2022, 2023, 2024, 2025})
if mapID then
local mapName = C_Map.GetMapInfo(mapID).name
self.cfg.tooltipTitle = self.cfg.name .. " in " ..mapName
self.cfg.coor = {mapID, x, y}
if atlasName then
self.icon:SetAtlas(atlasName)
end
self.icon:SetDesaturated(false)
else
self.cfg.tooltipTitle = self.cfg.name
SetTextureForEventFrame(self, self.cfg.texture)
self.icon:SetDesaturated(true)
wipe(self.cfg.coor)
return
end
end
self.timer:SetTextColor(0, 1, 0)
if self.cfg.anim and not self.icon.Anim:IsPlaying() then
self.icon.Anim:Play()
end
if self.voice_active and self.init then
C_VoiceChat.SpeakText(0, self.cfg.name.." is active.", 1, 0, 100)
end
end
self.isEventActive = true
elseif not isEventActive then
if showedTime < 300 and not self.timeTmp then
if not self.notification then
if self.cfg.sound and self.init then
PlaySound(32585, "Master")
end
if self.cfg.voice_before and self.init then
C_VoiceChat.SpeakText(0, self.cfg.name.." event will start in a moment.", 1, 0, 100)
end
if self.cfg.anim and not self.icon.Anim:IsPlaying() then
self.icon.Anim:Play()
end
self.timer:SetTextColor(1, 1, 0)
self.notification = true
end
elseif self.notification then
self.notification = false
end
end
self.init = true
end)
return eFrame
end
function EventsTrackerMixin:ReloadAllEvents()
local firstEventFrame, previousEventFrame, showedEventCount
local rowCounter = 0
for i, v in ipairs(L.cfg.events) do
if v.enable and not L.cfg.collapsed then
if not eventFrame[i] then
eventFrame[i] = EventsTrackerMixin:CreateEvent(v, i)
eventFrame[i].init = false
eventFrame[i].notification = false
eventFrame[i].isEventActive = nil
end
eventFrame[i]:ClearAllPoints()
showedEventCount = (showedEventCount or 0) + 1
if not previousEventFrame then
eventFrame[i]:SetPoint("TOPLEFT", EventsTrackerHeader, "BOTTOMLEFT", 5, -2)
firstEventFrame = eventFrame[i]
rowCounter = 1
elseif showedEventCount == 8 or showedEventCount == 15 then
eventFrame[i]:SetPoint("TOP", firstEventFrame, "BOTTOM", 0, -12)
firstEventFrame = eventFrame[i]
rowCounter = rowCounter + 1
else
eventFrame[i]:SetPoint("LEFT", previousEventFrame, "RIGHT", 6, 0)
end
eventFrame[i].enable = true
eventFrame[i]:Show()
previousEventFrame = eventFrame[i]
elseif eventFrame[i] then
eventFrame[i]:Hide()
eventFrame[i]:SetScript("OnUpdate", nil)
eventFrame[i] = nil
end
end
if showedEventCount and showedEventCount > 0 then
EventsTrackerHeader.MinimizeButton:SetButtonState("NORMAL", false)
else
L.cfg.collapsed = true
EventsTrackerHeader.MinimizeButton:SetButtonState("PUSHED", true)
end
if EventsTrackerHeader.pinned then
EventsTrackerHeader:EnableMouse(false)
EventsTrackerHeader:ClearAllPoints()
EventsTrackerHeader:SetPoint("BOTTOM", ObjectiveTrackerBlocksFrame, "TOP", -10, rowCounter * 38)
EventsTrackerHeader:SetParent(ObjectiveTrackerBlocksFrame)
else
EventsTrackerHeader:EnableMouse(true)
EventsTrackerHeader:SetParent(UIParent)
end
end
function EventsTrackerMixin:GetLinkToEvent(index)
return L.cfg.events[index]
end
function EventsTrackerMixin:CreateEventsTracker()
if not _G["EventsTable"] then _G["EventsTable"] = DefaultConfig end
L.cfg = _G["EventsTable"]
for key, value in pairs(DefaultConfig) do
if L.cfg[key] == nil then
L.cfg[key] = value
end
end
for key, value in pairs(DefaultConfig.events) do
if L.cfg.events[key] == nil or L.cfg.events[key].name ~= DefaultConfig.events[key].name then
L.cfg.events[key] = value
else
L.cfg.events[key].texture = DefaultConfig.events[key].texture
L.cfg.events[key].eventRegionOffset = DefaultConfig.events[key].eventRegionOffset
L.cfg.events[key].eventDuration = DefaultConfig.events[key].eventDuration
L.cfg.events[key].eventInterval = DefaultConfig.events[key].eventInterval
L.cfg.events[key].questID = DefaultConfig.events[key].questID
L.cfg.events[key].findEventOnMap = DefaultConfig.events[key].findEventOnMap
L.cfg.events[key].coor = DefaultConfig.events[key].coor
L.cfg.events[key].datablock = nil;
L.cfg.events[key].datablock = DefaultConfig.events[key].datablock
L.cfg.events[key].regionEventStartTime = nil
end
end
EventsTrackerHeader.pinned = L.cfg.pinned
if L.cfg.pinned then
EventsTrackerHeader.PinnedButton:SetButtonState("PUSHED", true)
else
EventsTrackerHeader.PinnedButton:SetButtonState("NORMAL", false)
end
self:ReloadAllEvents()
EventsTrackerHeader.MinimizeButton:SetScript("OnClick", function(self, button)
if button == "LeftButton" then
if not L.cfg.collapsed then
L.cfg.collapsed = true
EventsTrackerMixin:ReloadAllEvents()
else
L.cfg.collapsed = false
EventsTrackerMixin:ReloadAllEvents()
end
elseif button == "RightButton"then
local menuFrame = CreateFrame("Frame", "EventsMenuFrame", UIParent, "UIDropDownMenuTemplate")
local menu = {}
local eventListMenu = {}
for i, v in ipairs(L.cfg.events) do
tinsert(eventListMenu,
{ text = v.name,
checked = function() return v.enable; end,
keepShownOnClick = 1,
tooltipOnButton = 1,
tooltipTitle = v.name,
tooltipText = "Enable or diasable this event.",
func = function() v.enable = not v.enable; EventsTrackerMixin:ReloadAllEvents(); end;
}
)
end
tinsert(menu, { text = "Enable events", hasArrow = true, notCheckable = 1, menuList = eventListMenu})
EasyMenu(menu, menuFrame, "cursor", 0 , 0, "MENU");
end
end)
EventsTrackerHeader.PinnedButton:SetScript("OnClick", function(self, button)
if button == "LeftButton" then
if L.cfg.pinned then
L.cfg.pinned = false
EventsTrackerHeader.pinned = false
EventsTrackerHeader.PinnedButton:SetButtonState("NORMAL", false)
local point, relativeTo, relativePoint, xOfs, yOfs = EventsTrackerHeader:GetPoint(1)
EventsTrackerHeader:SetPoint(point, relativeTo, relativePoint, xOfs, yOfs+20)
else
L.cfg.pinned = true
EventsTrackerHeader.pinned = true
EventsTrackerHeader.PinnedButton:SetButtonState("PUSHED", true)
end
EventsTrackerMixin:ReloadAllEvents()
end
end)
end
function EventsTrackerMixin:OnEvent(event, ...)
local arg1 = ...
if ( event == "ADDON_LOADED" ) then
if arg1 == _ then
self:CreateEventsTracker()
if IsAddOnLoaded(_) then
self:UnregisterEvent('ADDON_LOADED')
end
end
elseif ( event == "SCENARIO_UPDATE" ) then
--print(event, arg1)
if arg1 == false then
local bestMap = C_Map.GetBestMapForUnit("player")
if bestMap == 2085 then
if IsAddOnLoaded("Nameplates") then
textPanelMixin:ShowText("Nemas aktivne scenarko", 10)
else
print("You dont have active scenario, fly out and back from cave")
end
--https://github.com/Gethe/wow-ui-source/blob/live/Interface/SharedXML/SoundKitConstants.lua
PlaySound(SOUNDKIT.UI_RAID_BOSS_WHISPER_WARNING, "Master")
end
end
elseif ( event == "PLAYER_ENTERING_WORLD" or ( event == "UNIT_QUEST_LOG_CHANGED" and arg1 == "player")) or event == "QUEST_TURNED_IN" then
for i, v in ipairs(L.cfg.events) do
if v.enable and v.questID and eventFrame[i] and not v.findEventOnMap then
eventFrame[i].icon:SetDesaturated(C_QuestLog.IsQuestFlaggedCompleted(v.questID))
end
end
end
end
function EventsTrackerMixin:OnLoad()
for _, event in pairs({
"ADDON_LOADED",
"PLAYER_ENTERING_WORLD",
"UNIT_QUEST_LOG_CHANGED",
"QUEST_TURNED_IN",
"SCENARIO_UPDATE",
-- QUESTLINE_UPDATE, QUEST_POI_UPDATE, PVP_RATED_STATS_UPDATE AREA_POIS_UPDATED
}) do self:RegisterEvent(event) end
end