Nein, da braucht nichts zwischen zwei Makroaufrufen übergeben werden. Die Form zu Canceln triggert den Global Cooldown nicht. Deshalb funktioniert auch
/cancelform
/cast Bearform
ohne Probleme.
Das ganze wird einmal ausgeführt (mit nur einmal drauf klicken) und dann ist man schon wieder in der entsprechenden Form.
Und als globale Variable sollte es meinem Verständnis nach eh auch so lange im Speicher sein, bis das UI neugeladen wird. Es sei denn jedes Makro hat quasi nochmal seinen eigenen Scope. Das kann sein, hab ich jetzt keine Lust zu testen.
Lange Rede kurzer Sinn: in lua gibt es keine Möglichkeit die Form zu ändern und rein mit Makro ohne lua kann man an entsprechender Stelle nicht mehr wissen, welche Form aktiv war. Ergo: geht nicht.
Du willst aber einen „Button“ der dich aus der aktuellen Form cancelt und dann wieder in die vorherige bringt oder? Oder willst du für jede Form einen eigenen „Button“?
Was funktioniert:
Click: Cancel ODER Cast einer Form
Was nicht funktioniert:
Click: Cancel von Form 1
Click: Cast von Form 1
→ Formwechsel
Click: Cancel von Form 3
Click Cast von Form 3
->Formwechsel usw.
und das alles über EIN Macro.
Ehm ja das sag ich doch die ganze Zeit. Ein Macro konnte in 1.12 nicht speichern ZWISCHEN einzelnen Anwendungen des Macros. Es gehen nur einfache if then Befehle, wenn die in der Macro-API erlaubt sind, und alle nur während nach dem einen Click das Script 1 Mal läuft! Und in der neuen Macro-API geht nichtmal das mehr.
Sorry aber ich glaube du verstehst mich nicht.
Das ganze läuft nur während einer Makroausführung ab. Nochmal: das canceln der Form triggert NICHT den Globalen Cooldown. Deshalb wird die Makroausführung danach auch nicht unterbrochen und deswegen geht es sehr wohl die Form zu canceln und dann wieder zu casten. Und deshalb muss auch nichts zwischen zwei Makroaufrufen übergeben werden.
Mal ganz simpel als Pseudocode:
aktuelleForm = aktuelleFormAuslesen();
FormCanceln();
if aktuelleForm == 1 then FormCasten(Bearform); end
if aktuelleForm == 2 then FormCasten(Waterform); end
if aktuelleForm == 3 then FormCasten(Catform); end
if aktuelleForm == 4 then FormCasten(Travelform); end
Wie gesagt, das Makro wird nicht nach FormCanceln(); abgebrochen. Das ganze ist auch keine Castsequenz. Es passiert alles auf dem ersten Klick.
Das einzige Problem dabei ist, dass es halt einfach keine nutzbaren Funktionen für FormCanceln() und FormCasten() gibt.
Da brauchen wir uns aber jetzt auch nicht weiter drüber streiten, führt eh zu nichts. Am Ende des Tages bringt und das auch keine Funktionalität, die das macht, was ich will.
Edit: und ja, ich will nur EINEN Button für alle Formen. Für jede Form einen seperaten Button habe ich ja bereits, das ist wie gesagt einfach nur:
/cancelform
/cast Bearform (oder halt entsprechend eine andere)
Theoretisch wäre das über einen SecureActionButton lösbar, da wir ja SecureStateHeader bzw -Attribute nutzen können.
Man muss lediglich das Verhalten bzw. die Logik vor einem Kampf definieren.
Doch, das geht weil die /run-Befehle ja via loadstring in das LUA-Environment geladen werden und globale Variablen dann in der globalen Tabelle auftauchen (_G oder getglobal())
Das klingt interessant, da muss ich mich bei Gelegenheit mal reinlesen. Das Problem was ich jetzt schon sehe: wenn ich den Kampf als Bär starte, dann aber während des Kampfes zur Katze wechsel, würde mich diese Lösung aber zum Bär powershiften, oder? Das wäre auch nicht wirklich optimal.
Dann definierst du ein state-attribute, das die stanceIDs händelt, bspw.: (die Makrobedingungen [stance] und [form] sind identisch)
RegisterStateDriver(frame, "stance", "[stance:1] 1; [stance:2] 2 [...] ")
frame:SetAttribute("_onstate-stance", [[ --args: self, stateid, newstate
local form
if newstate == 1 then
form = "Bear Form"
elseif newstate == 2 then
form = "Cat Form"
[...]
end
self:SetAttribute("macrotext", "/cancelform\n/cast "..form)
]])
Sorry falls ich nerve aber ich will kurz nochmal sicher sein, dass ich das alles richtig verstanden habe, bevor ich Zeit in das basteln eines entsprechenden Addons investiere. Ich muss mich dazu, wie gesagt, nochmal intensiver mit der ganzen API auseinandersetzen…
Frage1: Ist ein SecureActionButton ein Element wie z.B. ein Makro oder ein Spell, was ich in meine Actionbars ziehen kann? Oder ist es quasi erstmal nur ein normales Interface Element wie z.B. die Buttons im ESC-Menü? In letzterem Fall müsste ich vermutlich selber dafür sorgen, dass eine Keybind Option dafür vorhanden ist? (sollte ja machbar sein)
Frage2: der StateDriver ermöglicht es, dass sich das Attribut “macrotext” auch während des Kampfes ändern kann, nur die Logik dafür muss vor dem Kampf schon existieren? (sollte ja quasi dann direkt nach einloggen eh der Fall sein)
Das ist ein eigenständiger Frame, der als Knopf/Taster fungiert (=Button).
SecureFrames sollten immer einen Namen erhalten, dann kannst den SecureButton via /click <Name> addressieren.