AddOn Zeitsteuerung
Aus morphosi.net wiki
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
