AddOn Zeitsteuerung

Aus morphosi.net wiki

Wechseln zu: Navigation, Suche
AddOns

Inhaltsverzeichnis

Zeitsteuerung

AddOns für den WoW-Client sind entweder zeitgesteuert oder eventgesteuert. Das bedeutet ein AddOn wird tätig nach Ablauf einer gewissen Zeit oder bei eintreten eines bestimmten Ereignisses.

Ordner Zeitsteuerung

Auch hier brauchen wir wieder einen Ordner, der passender Weise Zeitsteuerung heissen soll.

Datei Zeitsteuerung.toc

Unsere TOC-Datei weicht auch nicht von der im ersten Beispiel ab

## Interface: 30300
## Title: Zeitsteuerung 
## Notes: Timer in World of Warcraft.
## Notes-deDE: Zeitsteuerung in World of Warcraft.
## Author: Rilgamon
## Version: 1

Zeitsteuerung.lua

Datei Zeitsteuerung.lua

local frame = CreateFrame("Frame","Zeitsteuerung_1")
local frame2 = CreateFrame("Frame","Zeitsteuerung_2")
 
local zeitIntervall = 5
local zeitIntervall2 = 4
local naechstesUpdate = GetTime() + zeitIntervall
local vergangeneZeit = 0
local abbruch = 4
local zaehler = 0
 
local function Zeitsteuerung_OnUpdate(self)
  if naechstesUpdate > GetTime() then return end
  naechstesUpdate = GetTime() + zeitIntervall 
  print(format("Wieder sind %i Sekunden f\195\188r den Frame %s vergangen.", zeitIntervall, self:GetName()))
end
 
local function Zeitsteuerung_OnUpdate2(self, verstricheneZeit)
  vergangeneZeit = vergangeneZeit + verstricheneZeit
  if vergangeneZeit > zeitIntervall2 then
    if zaehler > abbruch then
      print(format("Abbruchzeit f\195\188r %s erreicht.",self:GetName()))
      self:Hide()
    else
      zaehler = zaehler + 1
      print(format("%i. Update f\195\188r Frame %s. Setze Zeit zur\195\188ck.",zaehler,self:GetName()))
      vergangeneZeit = 0
    end
  end
end
 
frame:SetScript("OnUpdate", Zeitsteuerung_OnUpdate)
frame2:SetScript("OnUpdate", Zeitsteuerung_OnUpdate2)

Erklärung


local frame = CreateFrame("Frame","Zeitsteuerung_1")
local frame2 = CreateFrame("Frame","Zeitsteuerung_2")

Für unser Beispiel erstellen wir uns diesmal zwei Frames. Der Aufruf von CreateFrame unterscheidet sich von unserem Ereignisse-Beispiel durch Angabe eines Namens für unsere Frames als zweites Argument. Dieser Name sollte sehr eindeutig und einzigartig sein da er als globalen Variable gespeichert wird.


local zeitIntervall = 5
local zeitIntervall2 = 4
local naechstesUpdate = GetTime() + zeitIntervall
local vergangeneZeit = 0
local abbruch = 4
local zaehler = 0

Hier definieren wir einige Ausgangswerte für lokale Variablen.


local function Zeitsteuerung_OnUpdate(self)
  if naechstesUpdate > GetTime() then return end
  naechstesUpdate = GetTime() + zeitIntervall
  print(format("Wieder sind %i Sekunden f\195\188r den Frame %s vergangen.", zeitIntervall, self:GetName()))
end

Wir erstellen eine Funktion Zeitsteuerung_OnUpdate. Sie überprüft ob naechstesUpdate größer als die Systemzeit ist und verläßt die Funktion wenn dem so ist. Wenn nicht wird die Zeit für naechstesUpdate durch addieren von zeitInterval zur Systemzeit festgelegt und eine Ausgabe erfolgt über print. Da Umlaute je nach Editor immer ein Problem darstellen habe ich sie hier direkt in UTF-8-Kodierung angegeben. So steht zb \195\188 für ein "ü".


local function Zeitsteuerung_OnUpdate2(self, verstricheneZeit)
  vergangeneZeit = vergangeneZeit + verstricheneZeit
  if vergangeneZeit > zeitIntervall2 then
    vergangeneZeit = 0
    if zaehler > abbruch then
      print(format("Abbruchzeit f\195\188r %s erreicht.",self:GetName()))
      self:Hide()
    else
      zaehler = zaehler + 1
      print(format("%i. Update f\195\188r Frame %s. Setze Zeit zur\195\188ck.",zaehler,self:GetName()))
    end
  end
end

Unsere zweite Funktion Zeitsteuerung_OnUpdate2 macht sich das zweite Argument zu nutze, dass an eine OnUpdate-Funktion übergeben wird. Das Argument (hier verstricheneZeit) liefert die Zeit, die seit dem letzten Aufruf der OnUpdate-Funktion für diesen Frame verstrichen ist.

Wir addieren diesen Wert von verstricheneZeit zu unserer Variable vergangeneZeit und können so frei definierte Intervalle abfragen. Sobald zeitIntervall2 erreicht ist setzen wir die vergangeneZeit zurück um so periodisch unsere Updates zu erhalten.

Unser zaehler merkt sich wie oft unser zeitIntervall2 eingetreten ist und nach überschreiten von abbruch wird unser Frame mit self:Hide() versteckt. Versteckte Frames werden nicht mehr geupdated. Darum sollte man OnUpdate-Frames immer verstecken wenn man sie nicht benötigt oder die OnUpdate-Funktion deaktivieren.


frame:SetScript("OnUpdate", Zeitsteuerung_OnUpdate)
frame2:SetScript("OnUpdate", Zeitsteuerung_OnUpdate2)

Und schliesslich müssen wir unsere Funktionen noch zuweisen. Nun sollte unser Skript nach dem einloggen alle 5 Sekunden eine Meldung für "Zeitsteuerung_1" absetzen und solange für "Zeitsteuerung_2" bis zaehler den Wert von abbruch überschritten hat.

Datei Zeitsteuerung.zip

Und hier das Ergebnis als Download: Zeitsteuerung.zip

AddOn-Beispiele: Hallo Welt, Ereignisse, Zeitsteuerung, Lade-Prozess

Persönliche Werkzeuge