View Single Post
03-12-24, 08:19 AM   #10
Hubb777
A Flamescale Wyrmkin
 
Hubb777's Avatar
AddOn Author - Click to view addons
Join Date: Jan 2024
Posts: 115
I managed to find an addon that makes the required timer. But how can I apply this code to my code?
Lua Code:
  1. local _, L = ...
  2. local LMB, RMB = CreateAtlasMarkup("NPE_LeftClick", 18, 18), CreateAtlasMarkup("NPE_RightClick", 18,18)
  3.  
  4. local DefaultConfig = {
  5.     collapsed = false,
  6.     pinned = true,
  7.     events = {
  8.         [1] = { name = "Storm's Fury",
  9.             texture = "ElementalStorm-Boss-Water",
  10.             eventRegionOffset = {
  11.                 [1] = 1670338860 + 3600,
  12.                 [2] = 1670698860,
  13.             eventDuration = 7200,
  14.             eventInterval = 18000,
  15.             enable = true,
  16.             sound = false,
  17.             voice_before = true,
  18.             voice_active = true,
  19.             anim = true,
  20.             questID = 74378,
  21.             findEventOnMap = false,
  22.             coor = {2025, 59.84, 82.29},
  23.             datablock = {}
  24.         },
  25.         [2] = { name = "Trial of Elements",
  26.             texture = "VignetteLootElite",
  27.             eventRegionOffset = {
  28.                 [1] = 1670342460,
  29.                 [2] = 1670698860,
  30.             eventDuration = 600,
  31.             eventInterval = 3600,
  32.             enable = true,
  33.             sound = false,
  34.             voice_before = true,
  35.             voice_active = true,
  36.             anim = true,
  37.             questID = 71995,
  38.             findEventOnMap = false,
  39.             coor = {},
  40.             datablock = {
  41.                 [0] = {name = "Trial of the Elements", enable = false, coor = {2085, 25.80, 25.84},},
  42.                 [1] = {name = "Trial of the Elements", enable = false, coor = {2085, 25.80, 25.84},},
  43.                 [2] = {name = "Trial of the Elements", enable = true, coor = {2085, 25.80, 25.84},},
  44.             },
  45.         },
  46.     },
  47. }
  48.  
  49. EventsTrackerMixin = {}
  50. local eventFrame = {}
  51.  
  52. function EventsTrackerMixin:FindEventOnMaps(eventName, maps)
  53.     for _, mapID in next, maps do
  54.         local areaPoiIDs = C_AreaPoiInfo.GetAreaPOIForMap(mapID);
  55.         for _, ids in pairs(areaPoiIDs) do
  56.             --areaPoiID,position,name,description,textureIndex,widgetSetID,atlasName,uiTextureKit,shouldGlow,factionID,isPrimaryMapForPOI,isAlwaysOnFlightmap,addPaddingAboveWidgets, highlightWorldQuestsOnHover, highlightVignettesOnHover
  57.             local poiInfo = C_AreaPoiInfo.GetAreaPOIInfo(mapID, ids);
  58.             if eventName == "all" then --and poiInfo.isPrimaryMapForPOI then
  59.                 for k, v in pairs(poiInfo) do
  60.                     print(k,v);
  61.                 end
  62.                 print("--------------------------------------");
  63.             end
  64.            
  65.             if ((poiInfo.atlasName == "dreamsurge_hub-icon" and eventName == "Dreamsurge") or poiInfo.name == eventName) and poiInfo.isPrimaryMapForPOI then
  66.                 local elementType = poiInfo.atlasName and strmatch(poiInfo.atlasName, "ElementalStorm%-Lesser%-(.+)") or "";
  67.                 local x, y = poiInfo.position:GetXY();
  68.                
  69.                 return mapID, x*100, y*100, poiInfo.areaPoiID, poiInfo.atlasName, elementType
  70.             end
  71.         end
  72.     end
  73. end
  74.  
  75. local function SetTextureForEventFrame(frame, texture)
  76.     if tonumber(texture) then
  77.         frame.icon:SetTexture(texture)
  78.         frame.icon:SetTexCoord(.08, .92, 0.08, 0.92)
  79.     else
  80.         local info = C_Texture.GetAtlasInfo(texture)
  81.         if info then
  82.             frame.icon:SetAtlas(texture)
  83.         else
  84.             frame.icon:SetTexture(texture)
  85.         end
  86.     end
  87. end
  88.  
  89. function EventsTrackerMixin:CreateEvent(v, index)
  90.     local serverResetTime = GetServerTime() - (604800 - C_DateAndTime.GetSecondsUntilWeeklyReset())
  91.     local eFrame = CreateFrame("Button", nil, EventsTrackerHeader, "EventsTrackerButton")
  92.     local region = GetCurrentRegion()
  93.     -- ptr
  94.     if not region or region > 5 then
  95.         region = 1
  96.     end
  97.    
  98.     eFrame.init = false
  99.     eFrame.notification = false
  100.     eFrame.timeTmp = nil
  101.     eFrame.index = index
  102.    
  103.     eFrame.cfg = v
  104.     eFrame.cfg.tooltipTitle = v.name
  105.     eFrame.cfg.tooltipText = v.tooltipText or ""
  106.     eFrame.cfg.eventNewRegionOffset = v.eventRegionOffset[region] > 1600000000 and v.eventRegionOffset[region] or (serverResetTime + v.eventRegionOffset[region])
  107.    
  108.     SetTextureForEventFrame(eFrame, v.texture)
  109.            
  110.     if tonumber(v.questID) then
  111.         eFrame.icon:SetDesaturated(C_QuestLog.IsQuestFlaggedCompleted(v.questID))
  112.     end
  113.            
  114.     eFrame:SetScript("OnUpdate", function(self, elapsed)
  115.         self.elapsed = (self.elapsed or 1) + elapsed
  116.         if self.elapsed < 1 then return end
  117.         self.elapsed = 0
  118.         if not self:IsShown() then return end
  119.  
  120.         local timeFromFirstStart = GetServerTime() - self.cfg.eventNewRegionOffset
  121.         local timeToNextEvent = (self.cfg.eventInterval - timeFromFirstStart % self.cfg.eventInterval) + (self.timeTmp and self.timeTmp or 0)
  122.         local timeActiveEvent = self.timeTmp and timeToNextEvent or self.cfg.eventDuration - (self.cfg.eventInterval - timeToNextEvent)
  123.         local isEventActive = (self.cfg.eventInterval + (self.timeTmp and self.timeTmp or 0)) - timeToNextEvent <= self.cfg.eventDuration
  124.         local showedTime = isEventActive and timeActiveEvent or timeToNextEvent
  125.            
  126.         if not self.init or (self.isEventActive and not isEventActive) then
  127.             if (self.isEventActive and not isEventActive) then self.isEventActive = false end
  128.             self.timer:SetTextColor(.9, .9, .9)
  129.             self.timeTmp = nil
  130.                        
  131.             -- hladam dalsi event v databloku ak je neaky disabled preskocim ho a pripocitam cas
  132.             if next(self.cfg.datablock) then
  133.                 local index = math.floor(((timeFromFirstStart + (not isEventActive and self.cfg.eventInterval or 0)) / self.cfg.eventInterval) % (#self.cfg.datablock + 1))
  134.                                                
  135.                 -- ak su nasledujuce eventy v databloku vypnute najdem prvy aktivny a upravim cas
  136.                 for i = 0, #self.cfg.datablock do
  137.                     if not self.cfg.datablock[index].enable then
  138.                         self.timeTmp = (self.timeTmp or 0) + self.cfg.eventInterval
  139.                     else
  140.                         break
  141.                     end
  142.                     index = index == #self.cfg.datablock and 0 or (index + 1)
  143.                 end
  144.                
  145.                 self.cfg.tooltipTitle = self.cfg.datablock[index].name
  146.                 self.cfg.coor = self.cfg.datablock[index].coor
  147.            
  148.             elseif self.cfg.findEventOnMap then
  149.                 self.cfg.tooltipTitle = self.cfg.name
  150.                 SetTextureForEventFrame(self, self.cfg.texture)
  151.                 self.icon:SetDesaturated(true)
  152.                 wipe(self.cfg.coor)
  153.                
  154.             end
  155.         end
  156.        
  157.         if showedTime < 3600 then
  158.             self.timer:SetText(date("%M:%S", showedTime))
  159.         else
  160.             self.timer:SetText(date("%H", showedTime)-1 .. date("h%M", showedTime))
  161.         end
  162.        
  163.         if not self.isEventActive and isEventActive then
  164.             if self.timeTmp then
  165.                 if self.timeTmp > 0 then
  166.                     self.timeTmp = self.timeTmp - self.cfg.eventInterval
  167.                 end
  168.            
  169.             elseif self.cfg.eventDuration > 0 then
  170.                 if self.cfg.findEventOnMap then
  171.                     local mapID, x, y, areaPoiID, atlasName, elementType = EventsTrackerMixin:FindEventOnMaps(self.cfg.name, {2022, 2023, 2024, 2025})
  172.                     if mapID then
  173.                         local mapName = C_Map.GetMapInfo(mapID).name
  174.                         self.cfg.tooltipTitle = self.cfg.name .. " in " ..mapName
  175.                         self.cfg.coor = {mapID, x, y}
  176.                         if atlasName then
  177.                             self.icon:SetAtlas(atlasName)
  178.                         end
  179.                         self.icon:SetDesaturated(false)
  180.                     else
  181.                         self.cfg.tooltipTitle = self.cfg.name
  182.                         SetTextureForEventFrame(self, self.cfg.texture)
  183.                         self.icon:SetDesaturated(true)
  184.                         wipe(self.cfg.coor)
  185.                         return
  186.                     end
  187.                 end
  188.                
  189.                 self.timer:SetTextColor(0, 1, 0)
  190.                 if self.cfg.anim and not self.icon.Anim:IsPlaying() then
  191.                     self.icon.Anim:Play()
  192.                 end
  193.                 if self.voice_active and self.init then
  194.                     C_VoiceChat.SpeakText(0, self.cfg.name.." is active.", 1, 0, 100)
  195.                 end
  196.             end
  197.             self.isEventActive = true
  198.            
  199.         elseif not isEventActive then
  200.             if showedTime < 300 and not self.timeTmp then
  201.                 if not self.notification then
  202.                     if self.cfg.sound and self.init then
  203.                         PlaySound(32585, "Master")
  204.                     end
  205.                     if self.cfg.voice_before and self.init then
  206.                         C_VoiceChat.SpeakText(0, self.cfg.name.." event will start in a moment.", 1, 0, 100)
  207.                     end
  208.                     if self.cfg.anim and not self.icon.Anim:IsPlaying() then
  209.                         self.icon.Anim:Play()
  210.                     end
  211.                     self.timer:SetTextColor(1, 1, 0)
  212.                     self.notification = true
  213.                 end
  214.             elseif self.notification then
  215.                 self.notification = false
  216.             end
  217.         end
  218.    
  219.         self.init = true       
  220.     end)
  221.  
  222.     return eFrame
  223. end
  224.  
  225. function EventsTrackerMixin:ReloadAllEvents()
  226.     local firstEventFrame, previousEventFrame, showedEventCount
  227.     local rowCounter = 0
  228.    
  229.     for i, v in ipairs(L.cfg.events) do
  230.         if v.enable and not L.cfg.collapsed then
  231.             if not eventFrame[i] then
  232.                 eventFrame[i] = EventsTrackerMixin:CreateEvent(v, i)
  233.                 eventFrame[i].init = false
  234.                 eventFrame[i].notification = false
  235.                 eventFrame[i].isEventActive = nil
  236.             end
  237.            
  238.             eventFrame[i]:ClearAllPoints()
  239.             showedEventCount = (showedEventCount or 0) + 1
  240.             if not previousEventFrame then
  241.                 eventFrame[i]:SetPoint("TOPLEFT", EventsTrackerHeader, "BOTTOMLEFT", 5, -2)
  242.                 firstEventFrame = eventFrame[i]
  243.                 rowCounter = 1
  244.             elseif showedEventCount == 8 or showedEventCount == 15 then
  245.                 eventFrame[i]:SetPoint("TOP", firstEventFrame, "BOTTOM", 0, -12)
  246.                 firstEventFrame = eventFrame[i]
  247.                 rowCounter = rowCounter + 1
  248.             else
  249.                 eventFrame[i]:SetPoint("LEFT", previousEventFrame, "RIGHT", 6, 0)
  250.             end
  251.            
  252.             eventFrame[i].enable = true
  253.             eventFrame[i]:Show()
  254.             previousEventFrame = eventFrame[i]
  255.            
  256.         elseif eventFrame[i] then
  257.             eventFrame[i]:Hide()
  258.             eventFrame[i]:SetScript("OnUpdate", nil)
  259.             eventFrame[i] = nil
  260.         end
  261.     end
  262.    
  263.     if showedEventCount and showedEventCount > 0 then
  264.         EventsTrackerHeader.MinimizeButton:SetButtonState("NORMAL", false)
  265.     else
  266.         L.cfg.collapsed = true
  267.         EventsTrackerHeader.MinimizeButton:SetButtonState("PUSHED", true)
  268.     end
  269.    
  270.     if EventsTrackerHeader.pinned then
  271.         EventsTrackerHeader:EnableMouse(false)
  272.         EventsTrackerHeader:ClearAllPoints()
  273.         EventsTrackerHeader:SetPoint("BOTTOM", ObjectiveTrackerBlocksFrame, "TOP", -10, rowCounter * 38)
  274.         EventsTrackerHeader:SetParent(ObjectiveTrackerBlocksFrame)
  275.     else
  276.         EventsTrackerHeader:EnableMouse(true)
  277.         EventsTrackerHeader:SetParent(UIParent)
  278.     end
  279. end
  280.  
  281. function EventsTrackerMixin:GetLinkToEvent(index)
  282.     return L.cfg.events[index]
  283. end
  284.  
  285. function EventsTrackerMixin:CreateEventsTracker()
  286.     if not _G["EventsTable"] then _G["EventsTable"] = DefaultConfig end
  287.     L.cfg = _G["EventsTable"]
  288.    
  289.     for key, value in pairs(DefaultConfig) do
  290.         if L.cfg[key] == nil then
  291.             L.cfg[key] = value
  292.         end
  293.     end
  294.    
  295.     for key, value in pairs(DefaultConfig.events) do
  296.         if L.cfg.events[key] == nil or L.cfg.events[key].name ~= DefaultConfig.events[key].name then
  297.             L.cfg.events[key] = value
  298.         else
  299.             L.cfg.events[key].texture = DefaultConfig.events[key].texture
  300.             L.cfg.events[key].eventRegionOffset = DefaultConfig.events[key].eventRegionOffset
  301.             L.cfg.events[key].eventDuration = DefaultConfig.events[key].eventDuration
  302.             L.cfg.events[key].eventInterval = DefaultConfig.events[key].eventInterval
  303.             L.cfg.events[key].questID = DefaultConfig.events[key].questID
  304.             L.cfg.events[key].findEventOnMap = DefaultConfig.events[key].findEventOnMap
  305.             L.cfg.events[key].coor = DefaultConfig.events[key].coor
  306.             L.cfg.events[key].datablock = nil;
  307.             L.cfg.events[key].datablock = DefaultConfig.events[key].datablock
  308.             L.cfg.events[key].regionEventStartTime = nil
  309.         end
  310.     end
  311.    
  312.     EventsTrackerHeader.pinned = L.cfg.pinned
  313.     if L.cfg.pinned then
  314.         EventsTrackerHeader.PinnedButton:SetButtonState("PUSHED", true)
  315.     else
  316.         EventsTrackerHeader.PinnedButton:SetButtonState("NORMAL", false)
  317.     end
  318.     self:ReloadAllEvents()
  319.    
  320.     EventsTrackerHeader.MinimizeButton:SetScript("OnClick", function(self, button)
  321.         if button ==  "LeftButton" then
  322.             if not L.cfg.collapsed then
  323.                 L.cfg.collapsed = true
  324.                 EventsTrackerMixin:ReloadAllEvents()
  325.             else
  326.                 L.cfg.collapsed = false
  327.                 EventsTrackerMixin:ReloadAllEvents()
  328.             end
  329.            
  330.         elseif button == "RightButton"then
  331.             local menuFrame = CreateFrame("Frame", "EventsMenuFrame", UIParent, "UIDropDownMenuTemplate")
  332.             local menu = {}
  333.             local eventListMenu = {}
  334.            
  335.             for i, v in ipairs(L.cfg.events) do
  336.                 tinsert(eventListMenu,
  337.                     { text = v.name,
  338.                         checked = function() return v.enable; end,
  339.                         keepShownOnClick = 1,
  340.                         tooltipOnButton = 1,
  341.                         tooltipTitle = v.name,
  342.                         tooltipText = "Enable or diasable this event.",
  343.                         func = function() v.enable = not v.enable; EventsTrackerMixin:ReloadAllEvents(); end;
  344.                     }
  345.                 )
  346.             end
  347.        
  348.             tinsert(menu, { text = "Enable events", hasArrow = true, notCheckable = 1, menuList = eventListMenu})
  349.             EasyMenu(menu, menuFrame, "cursor", 0 , 0, "MENU");    
  350.         end
  351.     end)
  352.    
  353.     EventsTrackerHeader.PinnedButton:SetScript("OnClick", function(self, button)
  354.         if button ==  "LeftButton" then
  355.             if L.cfg.pinned then
  356.                 L.cfg.pinned = false
  357.                 EventsTrackerHeader.pinned = false
  358.                 EventsTrackerHeader.PinnedButton:SetButtonState("NORMAL", false)
  359.                 local point, relativeTo, relativePoint, xOfs, yOfs = EventsTrackerHeader:GetPoint(1)
  360.                 EventsTrackerHeader:SetPoint(point, relativeTo, relativePoint, xOfs, yOfs+20)
  361.             else
  362.                 L.cfg.pinned = true
  363.                 EventsTrackerHeader.pinned = true
  364.                 EventsTrackerHeader.PinnedButton:SetButtonState("PUSHED", true)
  365.             end
  366.             EventsTrackerMixin:ReloadAllEvents()
  367.         end
  368.     end)
  369. end
  370.  
  371. function EventsTrackerMixin:OnEvent(event, ...)
  372.     local arg1 = ...
  373.     if ( event == "ADDON_LOADED" ) then
  374.         if arg1 == _ then
  375.             self:CreateEventsTracker()
  376.             if IsAddOnLoaded(_) then
  377.                 self:UnregisterEvent('ADDON_LOADED')
  378.             end
  379.         end
  380.    
  381.     elseif ( event == "SCENARIO_UPDATE" ) then
  382.         --print(event, arg1)
  383.         if arg1 == false then
  384.             local bestMap = C_Map.GetBestMapForUnit("player")
  385.             if bestMap == 2085 then
  386.                 if IsAddOnLoaded("Nameplates") then
  387.                     textPanelMixin:ShowText("Nemas aktivne scenarko", 10)
  388.                 else
  389.                     print("You dont have active scenario, fly out and back from cave")
  390.                 end
  391.                 --https://github.com/Gethe/wow-ui-source/blob/live/Interface/SharedXML/SoundKitConstants.lua
  392.                 PlaySound(SOUNDKIT.UI_RAID_BOSS_WHISPER_WARNING, "Master")
  393.             end
  394.         end
  395.     elseif ( event == "PLAYER_ENTERING_WORLD" or ( event == "UNIT_QUEST_LOG_CHANGED" and arg1 == "player")) or event == "QUEST_TURNED_IN" then
  396.         for i, v in ipairs(L.cfg.events) do
  397.             if v.enable and v.questID and eventFrame[i] and not v.findEventOnMap then
  398.                 eventFrame[i].icon:SetDesaturated(C_QuestLog.IsQuestFlaggedCompleted(v.questID))
  399.             end
  400.         end
  401.    
  402.     end
  403. end
  404.  
  405. function EventsTrackerMixin:OnLoad()
  406.     for _, event in pairs({
  407.         "ADDON_LOADED",
  408.         "PLAYER_ENTERING_WORLD",
  409.         "UNIT_QUEST_LOG_CHANGED",
  410.         "QUEST_TURNED_IN",
  411.         "SCENARIO_UPDATE",
  412.         --  QUESTLINE_UPDATE, QUEST_POI_UPDATE, PVP_RATED_STATS_UPDATE AREA_POIS_UPDATED
  413.     }) do self:RegisterEvent(event) end
  414. end

Event A - Trial of Elements (interval 1 hour, duration 4 minutes, if event B occurs, event A does not occur)
Event B - Storm's Fury (interval 6 hours, duration 2 hours)

Last edited by Hubb777 : 03-12-24 at 08:22 AM.
  Reply With Quote