Alles anzeigenDieser Post ist eine Übersetzung meines Posts aus dem englischen Forum: https://community.nanos.io/index.php?/top…tion-explained/
Hallo zukünftige nanos JC3:MP Serverbesitzer und Scripter!
Heute möchte ich mir die Zeit nehmen und euch erklären, wie die Kommunikation zwischen unterschiedlichen Packages, dem Client und der CEF-Integration funktioniert. Jedoch wird sich vermutlich bis zum ersten "richtigen Release" (sprich nicht STP1) noch einiges ändern, besonders in Bezug auf die Client <> CEF-Kommunikation.
Ich habe euch ein Diagramm gemalt, das den kompletten Kommunikationsfluss darstellt:
Externer Inhalt in.fkn.spaceInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.Das sieht zu erst vielleicht nach viel aus, ist es aber eigentlich gar nicht. Ich werde euch nun das Diagramm in kleineren Teilbereichen erklären.
Inter-Package Kommunikation
Externer Inhalt in.fkn.spaceInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
Bei der Inter-Package Kommunikation handelt es sich um den Informationsfluss zwischen mehreren verschiedenen Packages innerhalb einer Applikation, also Server Package <> Server Package oder Client Package <> Client Package.
Bei nJC3:MP wird dazu das selbstentwickelte Event-System verwendet:
- events.Add(String name, Function handler) um auf ein bestimmtes Event zu reagieren
- events.Call(String name, args...) um ein Event mit den gegebenen Argumenten aufzurufen
Wie bereits erwaehnt erlauben diese beiden Funktionen nur einen Informationsfluss zwischen zwei Packages innerhalb der selben Anwendung. Das Event-System ist nicht an irgendeine Programmiersprache gebunden. Das Event System wird auch intern bei JC3:MP verwendet. Einige dieser Events werden auch an das Scripting weitergegeben:
CodeClientConnected, ClientDisconnected, PlayerCreated, PlayerDestroyed, PlayerRespawn, PlayerDeath, ChatMessage, ChatCommand
Das sind jetzt nicht alle Events, aber das ist mal eine grobe Übersicht. Eine Liste mit allen Events wird soon(tm) auf das scripting-docs repo hochgeladen.
Kommunikation zwischen Server und Client
Ich hoffe ihr habt inzwischen das Event-System nicht komplett verdrängt. Wir werden es jetzt in leicht abgewandelter Form erneut betrachten:Externer Inhalt in.fkn.spaceInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
Wir sehen, das Event-System wird erneut verwendet, nur mit anderen Funktionen:
- Um auf ein vernetztes Event zu reagieren wird events.AddRemoteCallable(String name, Function handler) verwendet.
- Um vom Server aus ein Client-Event (was über oben genannte Funktion gehandhabt wird) aufzurufen, wird events.CallRemote(String name, Player target(null = an alle), args...) verwendet
- Um vom Client aus ein Remote-Event im Server aufzurufen wird events.CallRemote(String name, args...) verwendet.
Wie bereits gesagt kann mit CallRemote nur ein Event aufgerufen werden, das ueber AddRemoteCallable registriert wurde.
Kommunikation zwischen dem Server und CEF
Ha! Das geht nicht. Wer sich das Diagramm angeguckt hat wird gemerkt haben, dass diese Art von Kommunikation nicht möglich ist, das der Server keinen direkten Einfluss auf CEF haben soll. Das war eine bewusste Entscheidung bei der Entwicklung unseres Frameworks.
Kommunikation zwischen dem Client und CEF
Die derzeitige Kommunikation zwischen diesen beiden Komponenten ist wie erwähnt noch nicht zu 100% fertig und wird sich vermutlich noch ändern.Externer Inhalt in.fkn.spaceInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
- CEF kann from Client aus mit invokeCEF(String eventName, String data) aufgerufen werden.
- CEF kann auf eingehende Events mit addEventHandler(function(String eventName, String data) {}); reagieren.
- Client-Packages können von CEF aus mit invoke(String eventName, String data) aufgerufen werden.
- Das Client-Package kann eingehende Events von CEF über events.Add('CEFCommand', function(String eventName, String data) {}); handhaben.
Derzeit ist es nur möglich, Strings umherzuschicken. Der interne workaround für das ist derzeit, einfach alles mit JSON.stringify zu encoden und anschliessend auf der anderen Seite JSON.parse zu verwenden.
Zeit für Beispiele!
Ich habe für jedes der genannten Szenarios (+ ein Beispiel für Server <> Client <> CEF) Beispiele erstellt. Ihr könnt sie hier bewundern: jc3mp/communication-explained
Das jc3mp/server-default-package und jc3mp/client-default-package zeigen auch ein funktionierendes Beispiel der Kommunikation zum Linksklick-Spawnen von Objekten.
Fragen?
Antworten kriegst du so schnell wie moeglich hier im Thema.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!