Lua/API-Probleme bzgl. Makros

Hallo,

Leider gibt es für die ingame API kein eigenes Diskussionsforum, lediglich für die neue Online-API. Daher versuche ich es mal hier.

Ich programmiere seit einer Weile schon Addons und immer wenn ich mit Makros arbeite, stoße ich auf Probleme, die hauptsächlich durch ambivalente Interface-Methoden auftreten.

Das kann ich direkt an einem konkreten Beispiel zeigen: Die Methode PickupMacro(id or name) nimmt entweder einen Makro-Namen oder eine Makro-ID (Position in der Makro-Liste in alphabetischer Reihenfolge) als Argument und legt das Makro in den Cursor, um damit dann ggf. weitere Aktionen auszuführen. Das erste Problem fällt sofort auf: Wenn der Makro-Name rein numerisch ist - zum Beispiel „13“ -, wird die Methode versuchen, das Makro an Position 13 zu finden.

Nun könnte man ja auf die Idee kommen, die ID zur Identifikation der Makros zu nutzen. Allerdings ist die ID eines Makros, wie eingangs schon erwähnt, zwar einzigartig (Position in alphabetischer Reihenfolge), aber leider nicht persistent, d.h. sobald man Makros hinzufügt oder umbenennt, ändert sich die Reihenfolge und somit auch die ID. Die ID ist also generell ungeeignet zur Bestimmung eines Makros.

Recherchiert man ein wenig, könnte man meinen, das Problem ließe sich mitigieren, indem man GetMacroIndexByName(name) vorschaltet, sodass der Name in eine ID umgewandelt wird. So kann man statt der sich potentiell ständig ändernden ID den Namen verwenden - einmal vorausgesetzt der Nutzer ändert ihn nicht. Ambivalenz ausgeräumt… oder?

Nein. Denn wer aufgepasst hat, stellt schnell fest: Gibt es zwei Makros mit identischem Namen, werden beide der bereits genannten Methoden zu einem unvorhersehbaren Ergebnis führen.

Mal ganz abgesehen davon, dass der Makroname im Normalfall wahrscheinlich auch hier und da mal geändert wird, nachdem er vielleicht vom Addon für irgend eine weitere Verwendung gespeichert wurde. Für diesen Fall habe ich eine sehr aufwendige Methode entwickelt, um die Nutzung des Makro-Fensters zu tracken und die Erstellung/Umbenennung eines Makros zu tracken und dementsprechend die ganze Addon-Datenbank anzupassen. Das sollte eigentlich nicht notwendig sein und das räumt auch immer noch nicht das Problem mit doppelten oder mehrfachen Makro-Namen aus dem Weg.

Was möchte ich erreichen, bzw. warum mache ich mir hier die Mühe?

  1. Ich programmiere gerne Addons und würde meine Addons gerne in bester Qualität abliefern.
  2. Vielleicht habe ich etwas übersehen und man kann mich in die richtige Richtung weisen.
  3. Sollte das nicht der Fall sein und ich habe die API-Situation so korrekt erfasst, wünsche ich mir eine Verbesserung der entsprechenden API-Funktionen oder wenigstens einen Bluepost mit einem vernünftigen Kommentar dazu (kein „vielen Dank, wir geben das weiter“ und dann hört man nie wieder davon), denn
  4. ich bin wahrscheinlich nicht der einzige, der vielleicht schon mal darüber gestolpert ist und sich entweder durch die Diskussion hier oder durch eine Verbesserung der API bereichert fühlt.

Grüße und ich wünsche schon mal ein schönes Wochenende.
Saruun

Dieses Thema solltest du vielleicht im Entwickler-Discord zur Sprache bringen: https://discord.gg/Pz6nh7Zn
Da stolpern auch Blizzard-Entwickler rein.

Oder du erstellst hier einen entsprechenden Eintrag: https://github.com/Stanzilla/WoWUIBugs/issues?page=1&q=is%3Aissue+is%3Aopen
Was da aufgelistet ist, wir durch Blizzard wahrgenommen. Ob es geändert wird, ist eine andere Frage. :slight_smile:

Das Problem mit PickupMacro(id or name) und Makronamen die nur aus Zahlen bestehen kannst du btw umgehen, indem du den übergebenen Wert vorher explizit in einen String umwandelst:
local tMacroName = 13
PickupMacro(tostring(tMacroName))

[e] Aus purer Neugier … um welches Addon handelt es sich?
Und wozu bzw. wie verwendest du PickupMacro?

local tMacroName = 13
PickupMacro(tostring(tMacroName))

Natürlich habe ich solche Spielereien vorher schon durchgetestet. Kurzgefasst:
PickupMacro("13") und PickupMacro(13) führen zum selben Ergebnis.

Danke für die Links, ich werde mich dort mal umsehen.

In diesem Fall geht es um mein TBC Classic Addon „GearQuipper“. Konkret um eine Funktion, die mit Wechsel eines Ausrüstungs-Sets auch die Action Bars (auf denen Makros liegen können) wechselt.

Tatsächlich. Ist ja ätzend. :confused:
Das würde ich dann tatsächlich als Bug ansehen. Da ist dann wohl mit der Api-Funktion nicht in Ordnung, wenn du explizit einen String übergibst und die Api daraus eine Zahl macht.
Die Api-Funktion führt eine unerwünsche bzw. nicht dokumentierte Typenumwandlung durch.

Erstaunlicherweise kommt das Blizzard-UI mit identischen Namen und verschobenen IDs klar.
Wenn ich zwei Makros namens „test“ erstelle, die in die Leiste ziehe, und dann noch zwei weitere namens „test“ erstellt, dann ist die Makroreihenfolge im Makrofenster zwar total durcheinandergewürfelt, aber die beiden Makros auf den Leisten sind noch korrekt.
Wie machen die das?
Was schreiben die denn bei einem ReceiveDrag in ihre Action-Buttons? Die verwenden doch auch nur Buttons, die von SecureActionButton erben, oder?
Schreiben die überhaupt Makro-IDs in die Action-Buttons? Oder verwenden die die Attribute „macro“ und „macrotext“?

Die gesamte API, die uns zur Verfügung steht, ist ja nur eine Sammlung von nach außen zur Verfügung stehenden Funktionen, die dann ggf. Methoden ausführen, die für uns nicht verfügbar sind. Blizzard wird davon keine einzige für die nativen Features benutzen. Intern wird es für jedes Makro wahrscheinlich schon eine unique id geben, ähnlich wie die GUIDs bei den NPC IDs. Beim Design der API-Funktionen für Makros wurde das aus irgendwelchen Gründen nicht übernommen. Welche das sind, weiß nur Blizzard selbst. :wink:

Dem ist nicht so. Das Blizzard-UI basiert ausschließlich auf den verfügbaren API-Funktionen. Einige sind für nicht native Addons in bestimmten Formen eingeschränkt. Das ist auch schon der gesamte Unterschied.

[e] Es gibt btw tatsächlich eine eindeutige ID für jedes Makro. Man kann sie sehen, wenn man in den WTF-Ordner und dann in den Makro-Cache schaut. Die wird nur nicht im Blizzard-UI verwendet, weil sie da nicht verfügbar ist. :slight_smile:

Es ist natürlich trotzdem nicht ausgeschlossen, dass das Blizzard-UI da serverseitig irgenwelche geheimen Sachen nutzt. Immerhin sind Standard-Makros und -Actionbuttons serverseitig. Trotzdem ist es extrem unwahrscheinlich.

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