[JAVA] [Modding] Ein wichtiges Nebenkonzept in Minecraft

Süchtig sein

Als ich "world.createExplosion ()" ausführte, trat das sogenannte "Ghost Block" -Phänomen auf, das nicht angezeigt wurde, sondern nur das Trefferurteil blieb. Nach vielen Recherchen scheint das Konzept der ** Seite **, Server und Client, in Forge zu existieren. Also stellte ich fest, dass das Programm auf jeder Seite lief. Ich habe auf die Referenz in [hier] verwiesen (https://mcforge.readthedocs.io/en/latest/concepts/sides/).

Über die Art der Seite

Die allgemeine Wahrnehmung ist, dass der Client den Spieler beeinflusst und der Server derjenige ist, der beim Spielen im Mehrspielermodus eine Verbindung herstellt.

Lassen Sie uns nun die Mehrdeutigkeit dieser beiden Seiten erklären.

Physischer Server

Ein physischer Server wird häufig als * dedizierter Server * bezeichnet. Ein dedizierter Server ist ein ganzes Programm eines Typs wie "minecraft_server.jar" und verfügt nicht über einen Bildschirm, der bedient werden kann.

Physischer Client

Ein physischer Client ist das gesamte Programm, das Minecraft vom Launcher aus startet. Es kann gesagt werden, dass alle Threads, Prozesse und Dienste, die für das Zeichnen von Spielen und Bedienbildschirmen verantwortlich sind, Teil des physischen Clients sind.

Logischer Server

Der logische Server steuert das Spiel. Es ist für alle Mechanismen des Spiels verantwortlich, einschließlich Mob-Laichen, Wetter, Inventar-Updates und Mob-Intelligenz. Der logische Server befindet sich innerhalb des physischen Servers, kann jedoch im Einzelspiel mit dem logischen Client innerhalb des physischen Clients ausgeführt werden. Dies geschieht unter dem Namen "Server Thread".

Logischer Client

Der logische Client ist dafür verantwortlich, Eingaben vom Player zu empfangen und an den logischen Server zu senden. Außerdem empfängt der logische Client Informationen vom logischen Server und zeigt die Informationen auf dem Bildschirm an, damit der Spieler sie sehen kann. Dies geschieht mit dem Namen "Client Thread".

Ausführung des Programms nach Seite

world.isRemote Dieser boolesche Wert prüft, auf welcher Seite das Programm ausgeführt wird. Dieser Boolesche Wert kann überprüft werden, um festzustellen, ob es sich um einen ** logischen ** Server oder einen ** logischen ** Client handelt. Wenn es sich um einen logischen Client handelt, wird "true" zurückgegeben, und wenn es sich um einen logischen Server handelt, wird "false" zurückgegeben. Dies liegt daran, dass der physische Server immer "false" zurückgibt, sodass der Wert vom logischen Server des physischen Clients abgedeckt wird. Im Prinzip können Sie anhand dieses Werts nicht erkennen, ob es sich um einen physischen oder einen logischen Server handelt. Die Verwendung dieses booleschen Werts ist, wenn Sie Spielregeln und andere Mechanismen ausführen möchten. Zum Beispiel

――Während Sie einen bestimmten Block berühren, erleiden Sie weiterhin Schaden

Und so weiter. Dies sollte erfolgen, wenn der Wert von "world.isRemote" "false" ist. Wenn diese von einem logischen Client ausgeführt werden, ist dies nicht mit dem logischen Server vereinbar. Im Falle eines kleinen Fehlers tritt ein Geisterphänomen von Mobs und eine Nichtübereinstimmung der physischen Stärke auf. Schwere Fehler können zum Absturz des Spiels führen.

getEffectiveSide FMLCommonHandler.getEffectiveSide () wird verwendet, wenn world.isRemote aus irgendeinem Grund nicht verwendet werden kann. ** Ratet mal ** welche Seite das ist. Der Grund dafür ist, dass hiermit bestimmt wird, welche Seite vom Thread-Namen ("Server-Thread" oder "Client-Thread") stammt. Wenn "world" verfügbar ist, versuchen Sie, "world.isRemote" so oft wie möglich zu verwenden. Dies sollte als Alternative verwendet werden, wenn diese Methode nicht verfügbar ist.

Lösung

Ich sehe, es scheint, dass es der logische Server ist, der die Blöcke der Welt verwaltet. Wenn Sie also "world.createExplosion ()" auf dem logischen Client und dem logischen Server ausführen, die Blockinformationen auf dem Server und den Block auf dem Client Es scheint, dass das Ghost-Block-Phänomen auftreten wird, weil die Informationen inkonsistent sind. Da die durch die Explosion zu zerstörenden Blöcke zufällig bestimmt werden, sind die Blöcke, die vom Client zerstört werden sollen, möglicherweise der Explosion durch den Server entkommen. Hier wurde ein Trefferurteil für einen Block getroffen, der nicht existierte. Daher ist die Lösung für dieses Problem

if (!world.isRemote)
    world.createExplosion(...);

Wird sein. Modder, der sich Sorgen um Trefferurteile und Geisterentitäten macht, wird sich freuen, wenn er versucht, es nur einmal auf dem logischen Server und nur auf dem logischen Client auszuführen.

Recommended Posts

[Modding] Ein wichtiges Nebenkonzept in Minecraft
Minecraft Modding 1.12.2
Site-Zusammenfassung, die beim Minecraft-Modding 1.12.2 hilfreich sein wird