Hehe, sehr aufmerksam beobachtet ![]()
Tatsächlich war die Formulierung in der Roadmap etwas irreführend... ich habe das jetzt abgeändert, damit sollte es eigentlich keine Unklarheiten mehr geben ![]()
Grundsätzlich wird Java weiterhin die Programmiersprache für Plugins bleiben. Ggf. werden wir langfristig noch JavaScript hinzufügen, aber das steht noch nicht ganz fest. Andere Sprachen wie C# werden leider nicht unterstützt (die neue Version des Spiels wird zwar überwiegend in C# geschrieben, aber der fertige Code wird durch IL2CPP in C++ umgewandelt)
Die neue Plugin API wird in weiten Teilen identisch zur bisherigen API bleiben, es wird aber aus technischen Gründen ein paar kleinere notwendige Änderungen geben (zB wird der Zugriff auf die Server und World Klassen statisch sein [d.h. z.B. nicht mehr getServer().getPlayer(); sondern direkt Server.getPlayer();], Events sind nur noch innerhalb der Eventfunktion gültig [d.h. Events können leider nicht in Listen gespeichert oder an andere Threads übergeben werden - in dem Fall müsste man sich die Daten aus einem Event vorher selber rauskopieren], EventMethod.Threaded wird entfernt [ich glaube das wurde eh nicht so oft verwendet, und ist in den meisten Fällen auch gar nicht nötig] und noch ein paar kleinere Syntaxänderungen). D.h. Plugins können zwar leider nicht 1:1 übernommen werden, doch die nötigen Anpassungen durch den Pluginersteller werden insgesamt überschaubar bleiben. Etwas größere Änderungen *könnten* lediglich bei der GUI stattfinden, da kann ich leider noch nicht ganz so viel zu sagen... auch kann es sein, dass sich der Workflow für Custom Items und so etwas ändert. Auch bei der WorldDatabase kann es sein, dass es etwas Probleme gibt.
Ich werde demnächst noch einen Thread erstellen, der die Änderungen an der API etwas genauer beleuchtet (zumindest die Änderungen, die nach jetzigem Stand feststehen). Generell spricht nichts dagegen, weiterhin Plugins zu schreiben, denn die später notwendigen Anpassungen sollten in den meisten Fällen recht zügig vonstatten gehen (lediglich in puncto GUI wäre es vll ratsam, sich vorerst aufs Wesentliche zu beschränken).
Also kurz gefasst könnte man folgendes schonmal berücksichtigen:
- Events nur innerhalb der Event Funktion nutzen (wenn sie getriggert werden), niemals in eine Liste reinschreiben oder an einen anderen Thread übergeben. An Funktionen übergeben ist hingegen ok, sofern diese sich an die selben Regeln hält
- EventMethod.Threaded sollte nicht mehr verwendet werden, da es wie gesagt rausfliegt. Meistens ist es eh nicht so sinnvoll, diesen Modus zu verwenden, da die meisten Events ohnehin aus verschiedenen Threads getriggert werden
- Man sollte vermeiden, zu viele Threads zu erzeugen. In den meisten Fällen sind Threads ohnehin nicht nötig, da der Server die API-Aufrufe bereits aus verschiedenen Threads tätigt. Wenn man wirklich eigene Threads braucht, sollte man vorsichtig sein wenn API Funktionen aus diesen Threads aufgerufen werden: Jeder erstmalige Aufruf einer API Funktion aus einem neuen Thread sorgt für viel Overhead! Wenn man nun zB einen Executer bzw. Scheduler verwendet, der unter der Haube immer wieder einen neuen Thread spawnt, kann das schon sehr ins Gewicht fallen
- Evtl. wäre es ratsam, die WorldDatabase erstmal nicht zu benutzen. Hier kann es sein, dass es einige Änderungen gibt (muss aber nicht). Das Problem ist, dass die Datenbank bereits vom Spiel gelocked wird, und der Zugriff über Java dann nicht mehr so einfach ist. Normale SQLite Datenbanken (also von Plugins erstellte Datenbanken) sind aber kein Problem
- Es wird vom Spiel generell keinen MySQL Support mehr geben. Dadurch werden möglicherweise auch die MySQL Funktionen aus der API entfallen. In Java gibts aber natürlich andere Lösungen dafür, d.h. wenn ein Plugin unbedingt MySQL Zugriff braucht, muss es notfalls selber den JDBC Treiber als Lib laden