UI als Script (eigenes Addon)

Moin moin,

ich mach das mal so kurz und knackig :).

Und zwar Klicke ich nach dem einloggen, meine F1-F12 tasten einmal durch um mein UI wie gewollt zu laden.

Verschiedene scripts drunter versteckt.

Jetzt würde ich mir das sehr gerne vereinfachen und mir Quasie selber ein Addon schreiben mit addon PUNKT bool PUNKT no nur funktioniert es irgendwie nicht ganz so wie gewollt, einzelne Elemente gehen, aber nicht wenn ich alles auf einmal Kombinieren möchte.

MainMenuBarArtFrame:ClearAllPoints()
MainMenuBarArtFrame:SetPoint(„CENTER“,2,2)
MainMenuBarArtFrame.SetPoint = function() end
MainMenuBarArtFrame:SetScale(1.1)
floatingCombatTextCombatDamageDirectionalScale 1
ActionButton1:ClearAllPoints()
ActionButton1:SetPoint(„CENTER“,-233,-2)
ActionButton1.SetPoint = function() end
ActionBarUpButton:Hide()
ActionBarDownButton:Hide()
MultiBarBottomRightButton7:ClearAllPoints()
MultiBarBottomRightButton7:SetPoint(„CENTER“,-650,41)
MultiBarBottomRightButton7.SetPoint = function() end
MultiBarBottomRightButton1:ClearAllPoints()
MultiBarBottomRightButton1:SetPoint(„CENTER“,-398,41)
MultiBarBottomRightButton1.SetPoint = function() end
MultiBarBottomLeftButton1:ClearAllPoints()
MainMenuBarArtFrameBackground:Hide()
MainMenuBarArtFrame.LeftEndCap:Hide()
MainMenuBarArtFrame.RightEndCap:Hide()
MainMenuBarArtFrame.PageNumber:Hide()
MicroButtonAndBagsBar.MicroBagBar:Hide()
MultiBarBottomLeftButton1:SetPoint(„CENTER“,-232,47)
MultiBarBottomLeftButton1.SetPoint = function() end
StanceButton1:ClearAllPoints()
StanceButton1:SetPoint(„CENTER“,-6000,0)
StanceButton1.SetPoint = function() end

Was genau geht denn nicht?
Hast Du Fehlermeldungen aktiviert (/console scriptErrors 1)?

Nein, die scripts funktionieren einwandfrei, ich finde es nur nervig immer alle 12 tasten zu drücken, bzw habe mir auch ein onebutton macro gebastelt der das alles automatisch drückt.

Ich würde sowas nur ganz gerne in ein eigenes Addon schreiben der das Automatisch macht beim einloggen. Somit hätte ich wieder mehr Space für Spells/anderen Macros.

Die Zeile erzeugt einen Fehler, weil das kein LUA-Befehl ist.
Korrekt müsste die Zeile lauten:

SetCVar("floatingCombatTextCombatDamageDirectionalScale", 1)

Beachte außerdem, das die Befehle direkt beim Laden des AddOns ausgeführt werden.
Für Frames und Funktionen, die zu diesem Zeitpunkt noch nicht erstellt wurden, werden Fehler auftreten.
Bei den oben gelisteten Frames sollte dies aber nicht passieren.

Ahhh danke dir.
gleich mal geändert.

Habe zumindest mit dem Micro Menu dieses script ins addon geschrieben, dass geht dann auch. Aber es funktioniert nicht mit den Actionsbars selber, er lädt es leider nicht.

Wollte halt damit bewirken das er die Sachen dann erst lädt sobald der „Player“ die Welt betritt, sprich das dann alles geladen ist.

local f = CreateFrame(„Frame“)
f:SetScript(„OnEvent“, function(self, event, …)
CharacterMicroButton:ClearAllPoints()
CharacterMicroButton:SetPoint(„RIGHT“,124, -37)
end)
f:RegisterEvent(„PLAYER_ENTERING_WORLD“)

Hast Du noch andere Addons (z.B. Bartender4), die etwas mit den ActionBars machen? Probier Dein Addon erst mal, während Du alle anderen Addons vorübergehend deaktivierst. Und die Fehlerausgabe zu aktivieren (wie gesagt /console scriptErrors 1), ist auch essentiell! Damit hättest Du den von Shinizu entdeckten Fehler gleich gemeldet bekommen. Es würden auch Fehler kommen, falls Dein Addon versucht, frames zu manipulieren, die noch nicht erstellt wurden. Also das solltest Du erst mal checken.

Da Lua Zeilenbasiert ausgewertet wird kann dein kleines Script so nicht funktionieren. Anders würde es aussehen wenn du eine Zeile so verschiebst das sie auch ausgewertet wird. Würde dann so aussehen:

local f = CreateFrame(„Frame“)
f:RegisterEvent(„PLAYER_ENTERING_WORLD“)
f:SetScript(„OnEvent“, function(self, event, …)
  CharacterMicroButton:ClearAllPoints()
  CharacterMicroButton:SetPoint(„RIGHT“,124, -37)
end)

Im Endeffekt muss das Script schon wissen auf welches Event es reagieren soll, daher nach dem erstellen des Frames direkt das / die Event(s) angegeben bevor das das SetScript() kommt.

Bist Du sicher? Ich hätte gedacht, dass die Reihenfolge der Zeilen hier egal ist, weil der erste „OnEvent“ des Frames ja erst kommt, nachdem schon die ganze Datei eingelesen wurde.

Jips bin ich.
Eine ähnliche Funktion habe ich auch in DuffedUI und sobald ich das Event ans Ende schiebe funktioniert das ganze nicht mehr. Selbige ist auch bei Funktionen die zu einem bestimmten Event geladen werden sollen, ist das gleiche.

Was man machen kann ist das man das was gemacht werden soll in eine eigene Funktion auslagert und erst später darauf zugreift, aber selbst da muss man dann auch erst die Events registrieren. Beispiel sieht du hier am Script für die Worldmap

https://github.com/liquidbase/DuffedUIv9/blob/master/DuffedUI/modules/maps/worldmap.lua#L94

Der Frame WorldMap wird in Zeile 4 definiert aber das entsprechende Event muss zuvor registriert werden (Zeile 106) bevor die entsprechende Funktion Enable() ausgeführt wird (Zeile 108).
Ohne das würde das Script nicht ausgeführt werden oder sogar einen Fehler produzieren.

Was man noch machen kann auf den Code vom TE bezogen wäre das man folgendes macht:

local f = CreateFrame('Frame')

f:SetScript('OnEvent', function(self, event, …)
  if event = 'PLAYER_ENTERING_WORLD' then
    CharacterMicroButton:ClearAllPoints()
    CharacterMicroButton:SetPoint(„RIGHT“,124, -37)
  elseif event = 'zweites Event' then
    ***[insert Code here]***  
  end
end)

Hm, OK… Warum gibt es dann die Funktion UnregisterEvent()? Das klingt für mich, als ob man auch zur Laufzeit noch Events entfernen könnte. Also warum nicht auch welche hinzufügen…?

(Sorry übrigens fürs Hijacken des Threads… :wink:)

Nimmt man dann wenn man Events nur für Funktionen braucht die direkt nach Ausführung wieder unnötig werden. Passendes Beispiel siehst du hier:

local DuffedUIOnLogon = CreateFrame('Frame')
DuffedUIOnLogon:RegisterEvent('PLAYER_ENTERING_WORLD')
DuffedUIOnLogon:SetScript('OnEvent', function(self, event)
    self:UnregisterEvent('PLAYER_ENTERING_WORLD')
    if DuffedUIData == nil then DuffedUIData = {} end
    if DuffedUIDataPerChar == nil then D['SetPerCharVariable']('DuffedUIDataPerChar', {}) end
    if D['ScreenWidth'] < 1200 then
        SetCVar('useUiScale', 0)
        D['ShowPopup']('DUFFEDUIDISABLE_UI')
    else
        if not DuffedUIDataPerChar.install then D['Install']() end
    end
end)

Einmal wird das Event PEW registriert und direkt danach wieder per Unregister rausgeworfen, da die Änderungen nicht bei jedem auslösen von PEW ausgelöst werden sollen.

Anderer Einsatz für UnregisterEvent() wäre auch das man von Blizzardframes Events entfernen will weil man in seinem eigenen Code das gleiche macht.

Also ich hab’s jetzt mal gerade ausprobiert und

local f = CreateFrame("Frame")
f:SetScript("OnEvent", function() print("hallo") end)
f:RegisterEvent("PLAYER_ENTERING_WORLD")

hat genau den gleichen Effekt wie

local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", function() print("hallo") end)

Bei so einem simplen Ablauf ist es durchaus möglich das es geht. Will man dahingehend die Frames von Blizzard bearbeiten / beeinflussen sollte man das vorher machen, da man dann auf der sicheren Seite ist das es auch funktioniert. So kann es dir halt auch passieren, dass das Script versucht den Frame zu beeinflussen und dieser ist noch gar nicht durch das UI geladen. Produziert dann halt einen Fehler wie auch bereits @Shinizu gesagt hatte.

Ich verstehe es so: Ob die Blizzard frames bereits existieren, wenn die Funktion ausgeführt wird, hängt davon ab, ob sie vor dem PLAYER_ENTERING_WORLD event existieren. Aber in welcher Reihenfolge ich SetScript() und RegisterEvent() aufrufe, ist egal. Hauptsache beide Zeilen wurden gelesen, bevor der PLAYER_ENTERING_WORLD event kommt, aber das geht gar nicht anders.

Das ist so nicht ganz korrekt.

Der Event-Handler kann sehr wohl vor der Event-Registrierung erstellt werden.
Sonst könnte man ja keine Events nach-registrieren.

Das Problem mit deinem WorldMap-Beispiel wird ein anderes ein.


@Stion:

Beachte, dass deine Modifikationen an den Standard-Frames taint verursacht.
Das kann zu unerwünschten Nebenwirkungen führen.

Genau deshalb nutzt man ja dann ActionBar-AddOns wie Dominos oder Bartender, die das sicher und vernünftig durchführen.

3 Likes

Dieses Thema wurde automatisch 180 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt.