Unterschied zwischen mod und plugins in rw

  • Die Grenzen zwischen Mods und Plugins sind manchmal fließend, und auch der "Mod" Begriff wird häufig weit gefasst. Auf RW bezogen kann man es sich aber so vorstellen:

    • Eine Mod wäre eine Modifikation der Spieldateien. D.h. irgendjemand würde zB das Spiel dekompilieren, irgendwas am Code ändern, und die geänderten Dateien dann quasi als "Mod" zur Verfügung stellen. Hier sind generell keine Grenzen gesetzt. Nachteil ist, dass mit nahezu jedem Update des Spiels die Mod inkompatibel wird (sofern die modifizierten Spieldateien vom Update betroffen sind). Außerdem muss für den Multiplayer jeder Spieler (sowie der Server) die gleiche Mod installiert haben. Mehrere Mods parallel zu benutzen ist auch immer etwas schwierig, vor allem, wenn die Mods die gleichen Spieldateien oder Stellen im Code verändern. Zudem ist das Erstellen einer Mod auch ziemlich kompliziert, da der dekompilierte Code schwer leserlich ist und über keinerlei Dokumentation verfügt
    • Plugins hingegen verwenden die vom Spiel bereitgestellte API. Die API ist quasi eine Schnittstelle, die bestimmte Spielfunktionen nach außen trägt (und Plugins auch über versch. Ereignisse informiert, zB wenn ein Spieler Schaden bekommt usw) und über die die Plugins dann mit dem Spiel kommunizieren können. Vorteil ist, dass Plugins nach Spiel-Updates in den allermeisten Fällen kompatibel bleiben (es sei denn die API verändert sich). Auch reicht es im Multiplayer aus, wenn das Plugin auf dem Server installiert ist, da es ohnehin nur dort ausgeführt wird (und der Server sich um die Synchronisierung mit den Clients kümmert). Mehrere Plugins zu verwenden ist auch weit weniger problematisch als bei Mods, und Plugins zu erstellen ist - im Vergleich um Erstellen einer Mod - tausendmal einfacher, da die API einfach aufgebaut, öffentlich einsehbar und gut dokumentiert ist. Nachteil von Plugins ist, dass nur Dinge gemacht werden können, die die API auch bereitstellt. Derzeit erlaubt die API zB Custom Items einzubinden, aber zB noch keine Custom NPCs. Die API wird aber mit jedem Update umfangreicher und bietet mehr Freiheiten. Auch haben wir dafür die Sektion im Forum "API Wünsche" eingerichtet, in welcher Plugin-Entwickler auf fehlende API-Funktionen aufmerksam machen können


    Modding (also klassisches Modding) war in RW schon immer möglich und wird auch immer möglich bleiben, aber hierfür sind fundierte Programmierkenntnisse, viel Zeit und Geduld sowie Nerven aus Stahl nötig. Daher ist unsere Priorität, die Plugin-API voranzutreiben.


    Die neue Version ist zwar in C# und C++ geschrieben, aber für die Plugin-API werden wir weiterhin auf Java setzen. Wir haben uns zwar lange Gedanken dazu gemacht, aber Java bietet in diesem konkreten Fall mit Abstand die meisten Vorteile:

    • Java ist schnell, also spürbar schneller als Skriptsprachen wie zB Lua. Zwar nicht ganz so schnell wie C++, aber mit einer C++-API hätten wir wohl die Büchse der Pandora geöffnet (einerseits ist der Umgang mit C++ schwieriger als mit Java, das würde vmtl. viele Leute abschrecken, andererseits können schon minimale Fehler in Plugins das Spiel zum crashen bringen - ohne, dass man herausfinden könnte, dass der Fehler von einem Plugin verursacht wurde)
    • Java läuft quasi in einer eigenen Umgebung, d.h. wenn ein Plugin Amok läuft, wird nicht sofort das Spiel in Mitleidenschaft gezogen (*natürlich kann ein Plugin das Spiel trotzdem durcheinander bringen, aber zwischen Spiel und Plugins ist quasi ein sehr großer "Sicherheitspuffer")
    • Die alte API kann weitestgehend übernommen werden und auch bestehende Plugins müssen nur minimal angepasst werden, damit sie mit der neuen Version kompatibel wird. Das gilt auch für die Dokumentation, die haben wir im Laufe der Zeit mit vielen Beispielen gefüllt, und es wäre doof, wenn man wieder bei 0 anfangen müsste
    • Java ist als vollwertige Programmiersprache deutlich mächtiger als die meisten Skriptsprachen. Es gibt richtiges Multi-Threading (was allein für das Spiel enorm wichtig ist), richtiges I/O Handling, Netzwerkfunktionalitäten, und wenn man es wirklich Ernst meint auch die Möglichkeit, Java mit C++ bzw. nativen Libraries zu koppeln und mit ihnen zu kommunizieren


    Über Java ist es grundsätzlich aber auch möglich, Skriptsprachen einzubinden. Wir haben damals begonnen, einen Lua-Wrapper als Plugin zu schreiben (damit wir Lua endlich hätten rauswerfen können, durch den Wrapper hätten Leute aber weiterhin Lua Skripte laden und benutzen können). Wenn man das benutzt fallen die Geschwindigkeitsvorteile natürlich wieder weg (denn die Skriptsprache wäre dann wieder der Flaschenhals), aber der Vorteil von Skriptsprachen ist natürlich, dass diese einfach zu bedienen sind

  • Danke erstmal für die umfangreiche Antwort.


    Das bedeutet der unterschied zwischen eine mod und einem Plugin nicht so groß, außer das mods schwieriger sind zu programmieren. Heißt es dann, dass ich mit einem Plugin ein Auto programmiere und das Plugin auf einem Server installieren kann wenn die API die Funktion dafür hat?

  • Heißt es dann, dass ich mit einem Plugin ein Auto programmiere und das Plugin auf einem Server installieren kann wenn die API die Funktion dafür hat?

    Wenn die API das unterstützt, dann ja ^^ Wobei es natürlich auch immer einen gewissen Spielraum gibt, den man dabei hat. Denn auch wenn es in der API keine direkte "FügeAutoHinzu()" Funktion gibt, so kann man versuchen, das anderweitig umzusetzen: In dem Fall könnte man zB das Modell eines Autos laden (das kann die API bereits) und darauf warten, dass ein Spieler damit interagiert. Das Plugin könnte sich nun für diesen Spieler merken, dass dieser in einem Auto sitzt, und die Spielerposition entsprechend regelmäßig updaten (an die Position des Fahrersitzes setzen). Wenn der Spieler nun zB die Vorwärtstaste betätigt, dann könnte man das Auto-Modell (mitsamt) Spieler nach vorne bewegen, beim Lenken entsprechend drehen usw. Bis hierhin ist alles auch mit der jetzigen API bereits möglich. Schwieriger wird es, das Auto an das Terrain anzupassen und Kollisionen richtig zu behandeln (wenn der Spieler zB gegen eine Wand fährt). Hier sind zwar einzelne Funktionen für sowas bereits in der API (zB raycast()), aber das wird trotzdem kompliziert - und stößt teilweise an die Grenzen. Neue Funktionen, die im Laufe der Zeit zur API hinzukommen, werden das sicherlich einfacher machen, aber es würde sich bei so einem Unterfangen trotzdem um ein sehr umfangreicheres Plugin handeln.


    Anders sieht es aus, wenn es bereits Fahrzeuge im Spiel gibt: Dann kann die API eher die Funktionen dazu bereitstellen (womit die Umsetzung eines solchen Plugins 100x einfacher wird). Dann könnte ein Plugin zB sein eigenes Modell einfügen, das Verhalten an das eines im Spiel bestehenden Autos anpassen, und das wars dann auch schon ;) So funktioniert das derzeit zB mit den Custom Items: Man kann recht einfach eine neue Spitzhacke oder ein neues Schwert einbauen (weil es sowas bereits im Spiel gibt), aber wenn man einen Flammenwerfer einbauen möchte, wird es kompliziert (weil es keine noch Mechanik für sowas im Spiel gibt).


    Du musst dir das immer so vorstellen, dass die API quasi nur bestehende Funktionen bereitstellen kann. Wenn du eine Funktion in der API aufrufst, kümmert sich das Spiel im Hintergrund um den Rest. Daher kann die API prinzipiell nur das bereitstellen, was das Spiel auch bereits kann.

    ZB über ein Plugin eigene Sounds abspielen ist möglich (weil das Spiel weiß, wie man Sounds abspielt), aber bspw. Gamepad-Support über ein Plugin einbinden ist nahezu unmöglich.


    Von den Dingen, die das Spiel kann und weiß, versuchen wir, so viel wie möglich über die API zugänglich zu machen, aber fehlende Funktionen fallen meist erst dann auf, wenn man selber ein Plugin schreibt (was wir aus Zeitgründen ja nicht so häufig machen). Dafür haben wir entsprechend die API-Wünsche Sektion^^

  • Wird es den Lua-Wrapper noch geben?

    Das kann ich nicht sagen, theoretisch möglich wäre das schon, kommt ein wenig auf die Nachfrage drauf an. Eigentlich wollen wir Lua aber nicht unbedingt als Skript-Sprache für RW pushen, da hier viel Performance verschenkt wird (Hauptproblem ist die fehlende Multi-Threading-Funktionalität, die für RW extrem wichtig ist). Aber auch wenn wir den Lua Wrapper anbieten, müssten bestehende Lua Skripte voraussichtlich trotzdem etwas angepasst werden, damit sie mit der neuen Version kompatibel sind :nerd:

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!