[JAVA] [Modding] Un concept Side important dans Minecraft

Être accro

Quand j'ai exécuté world.createExplosion (), le phénomène dit ** de bloc fantôme ** qui n'était pas affiché mais seul le jugement de coup restait survenu. Après de nombreuses recherches, il semble que le concept de ** côté **, «Serveur» et «Client», existe dans Forge. J'ai donc constaté que le programme fonctionnait de chaque côté. J'ai fait référence à la référence dans ici.

À propos du type de côté

La perception générale est que le client affecte le joueur et le serveur est celui qui se connecte lors de la lecture multijoueur.

Maintenant, expliquons l'ambiguïté de ces deux côtés.

Serveur physique

Un serveur physique est souvent appelé * serveur dédié *. Un serveur dédié est un programme entier d'un type tel que minecraft_server.jar et n'a pas d'écran qui puisse être utilisé.

Client physique

Un client physique est l'ensemble du programme qui lance Minecraft à partir du lanceur. On peut dire que tous les threads, processus et services responsables du dessin des jeux et des écrans d'exploitation font partie du client physique.

Serveur logique

Le serveur logique contrôle le jeu. Il est responsable de tous les mécanismes du jeu, y compris le frai des foules, la météo, la mise à jour de l'inventaire et l'intelligence des foules. Le serveur logique se trouve à l'intérieur du serveur physique, mais en lecture unique, il peut être exécuté avec le client logique à l'intérieur du client physique. Cela se fait sous le nom de «Server Thread».

Client logique

Le client logique est chargé de recevoir les entrées du lecteur et de les envoyer au serveur logique. De plus, le client logique reçoit des informations du serveur logique et affiche les informations à l'écran afin que le joueur puisse les voir. Ceci est fait avec le nom «Client Thread».

Exécution du programme selon le côté

world.isRemote Cette valeur booléenne vérifie de quel côté le programme s'exécute. Ce booléen peut être vérifié pour voir s'il s'agit d'un serveur ** logique ** ou d'un client ** logique **. S'il s'agit d'un client logique, il renvoie «true», et s'il s'agit d'un serveur logique, il renvoie «false». Ceci est dû au fait que le serveur physique renvoie toujours «false», donc la valeur est couverte par le serveur logique du client physique. En principe, vous ne pouvez pas dire à partir de cette valeur s'il s'agit d'un serveur physique ou d'un serveur logique. L'utilisation de cette valeur booléenne est lorsque vous souhaitez exécuter des règles de jeu et d'autres mécanismes. Par exemple

―― En touchant un certain bloc, vous continuerez à subir des dégâts

Etc. Celles-ci doivent être effectuées lorsque la valeur de «world.isRemote» est «false». Si ceux-ci sont exécutés par un client logique, ce sera incompatible avec le serveur logique, et dans le cas d'un bug mineur, un phénomène fantôme de mobs et une discordance de force physique se produiront. De gros bugs peuvent provoquer le crash du jeu.

getEffectiveSide FMLCommonHandler.getEffectiveSide () est utilisé lorsque world.isRemote ne peut pas être utilisé pour une raison quelconque. ** Devinez ** de quel côté il s'agit. La raison en est que cela est dû au fait que le nom du thread (Server Thread ou Client Thread) détermine de quel côté il se trouve. Lorsque «world» est disponible, essayez d'utiliser «world.isRemote» autant que possible, et cela devrait être utilisé comme alternative lorsque cette méthode n'est pas disponible.

Solution

Je vois, il semble que c'est le serveur logique qui gère les blocs du monde, donc si vous exécutez world.createExplosion () sur le client logique et le serveur logique, les informations de bloc sur le serveur et le bloc sur le client Il semble que le phénomène de bloc fantôme se produira parce que les informations seront incohérentes. Les blocs à détruire par l'explosion étant déterminés aléatoirement, les blocs censés être détruits par le client peuvent avoir échappé à l'explosion du serveur. Ici, un jugement positif a été fait pour un bloc qui n'existait pas. Par conséquent, la solution à ce problème est

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

Sera. Modder, qui s'inquiète des jugements de hit et des entités fantômes, sera heureux s'il essaie de l'exécuter uniquement sur le serveur logique et une seule fois sur le client logique.

Recommended Posts

[Modding] Un concept Side important dans Minecraft
Minecraft Modding 1.12.2
Résumé du site qui sera utile dans Minecraft Modding 1.12.2