This is an old revision of the document!
Side
Minecraft使用Client-server model,即用户安装游戏客户端并连接到服务器以玩游戏。 Fabric允许mod既可以针对Minecraft客户端,也可以同时针对Minecraft服务器。
过去,过去曾经将客户端和服务器简单地划分为一个部分,但是随着单人游戏模式向内部专用服务器的转换,这种简单的模型不再适用。 因此,在Minecraft中区分客户端和服务器时,我们有两个维度。 这些是物理和逻辑方面。
对于这两种类型的双方,都有一个客户端
和服务器
。 但是,逻辑客户端不等同于物理客户端,逻辑服务器也不等同于物理服务器。 相反,逻辑客户端由物理客户端“托管”,而逻辑服务器由物理服务器或物理客户端托管。
逻辑方面在Minecraft的两个发行版的体系结构中都至关重要。 因此,了解逻辑方面对于使用Fabric进行任何mod开发至关重要。
物理方面
物理方面或环境是指Minecraft游戏的两个发行版(jars),客户端(Vanilla 启动器启动的版本)和服务器(可从https://minecraft.net免费下载)。 物理方面是指当前环境中可用的代码。
客户端和服务器环境是同一程序的精简发行版,仅包含代码的必需部分。
在Fabric中,您经常可以看到诸如@Environment(EnvType.CLIENT)
之类的注释。 这表明某些代码仅在一种环境中存在; 在此示例中,客户端。
在Fabric fabric.mod.json和mixin配置中,客户端/服务器引用环境。
每个物理端都附带其入口点使用的类以及入口点为net.minecraft.data.Main
的数据生成器类。
逻辑方面
逻辑方面是关于实际游戏逻辑的。 逻辑客户端进行渲染,将玩家输入发送到服务器,处理资源包并部分模拟游戏世界。 服务器处理核心游戏逻辑,数据包并维护游戏世界的真实状态。 客户端维护服务器环境的部分副本,其中包含对象的副本,例如:
net.minecraft.world.World net.minecraft.entity.Entity net.minecraft.block.entity.BlockEntity
这些复制的对象允许客户端和服务器执行一些常见的游戏逻辑。 客户端可以与这些对象进行交互,而服务器负责使它们保持同步。 通常,要将逻辑客户端上的对象与逻辑服务器上的对象区分开,请访问对象的环境并检查其isClient
字段。 这可用于在服务器上执行授权操作(例如生成实体),并在客户端上模拟操作。 该技术对于避免两个逻辑端之间的不同步是必需的。
深入了解所有方面
With an understanding of which sides there are and how to distingish between them, we can now look into every single side with a detailed look.
物理客户端
物理客户端是由原版启动器的minecraft jar。它包含一个逻辑客户端和一个逻辑服务器(集成服务器)。它的入口点是net.minecraft.client.main.Main
。
物理客户端可以在单独的逻辑服务器中加载多个不同的环境,但一次只能加载一个。
与物理服务器(专用服务器)的逻辑服务器相比,物理客户端(集成服务器)的逻辑服务器可以由物理客户端上的逻辑客户端控制(例如,F3 + T重新加载数据包并关闭客户端)同时关闭集成服务器)。它还可以将捆绑在一起的资源包加载到物理客户端上的逻辑客户端。
所有逻辑客户端内容都是物理客户端专有的。因此,您会在渲染,声音和其他逻辑客户端代码上看到许多环境注释。
一些模组专门针对物理客户端,例如Liteloader,Optifine和Minecraft PvP客户端(Badlion,Hyperium)。
物理服务器
物理服务器是java专用服务器。与物理客户端相比,它仅具有逻辑服务器(专用服务器)。它的入口点是“ net.minecraft.server.MinecraftServer”,物理服务器在运行时只能有一个世界。如果服务器应切换到另一个世界,则需要重新启动服务器。
它的逻辑服务器与物理客户端的逻辑服务器略有不同,因为当物理服务器运行时,仅存在一个逻辑服务器实例。此外,物理服务器的逻辑服务器可以通过Rcon进行远程控制,具有名为server.properties的配置文件,并且可以发送服务器资源包。
尽管存在这些差异,但是大多数mod都适用于存在问题的物理客户端和物理服务器的逻辑服务器,只要它们不引用逻辑客户端内容即可。
但是,其单一世界和资源包发送的功能使得与客户端相比,香草mod(数据包和资源包组合)的安装要容易得多,因为香草物理客户端会在自动连接到服务器时进行设置。
一些MOD专门针对物理服务器。例如,Bukkit及其衍生产品(Spigot,Paper,Cauldron,Xxx-Bukkit混合产品)始终在物理服务器上运行。
逻辑客户端
逻辑客户端是玩家的接口。 渲染(LWJGL),资源包,玩家输入处理和声音在逻辑客户端上发生。 它在物理服务器上不存在。
逻辑服务器
逻辑服务器是执行大多数游戏逻辑的地方。数据包,世界更新,阻止实体和实体滴答,怪物 AI,游戏/世界保存以及世界生成在逻辑服务器上发生。
物理客户端上的逻辑服务器称为“集成服务器”,而物理服务器上的逻辑服务器称为“专用服务器”(这也是物理服务器本身的名称)。
逻辑服务器甚至在物理服务器上也运行在其自己的主线程中,并具有一些工作线程。逻辑服务器的生存期取决于托管它的物理端。在物理服务器上,逻辑服务器的存在时间与进程运行的时间一样长。在物理客户端上,可以创建多个逻辑服务器,但一次只能存在一个逻辑服务器。当播放器加载本地保存时将创建一个新的逻辑服务器,并在播放器关闭本地保存时将其关闭。
大多数通用Mod都以逻辑服务器为目标,因此它们可以在单人和多人场景中使用。
通讯
通过交换数据包在逻辑客户端和服务器之间交换数据的唯一正确方法。 数据包(在https://wiki.vg上有记录)在逻辑客户端和逻辑服务器之间发送,而不是在物理端之间发送。 Mod可以添加数据包以在两个逻辑端之间传输自定义信息。 数据包在内存中为连接到其自己的集成服务器的逻辑客户端进行交换,否则通过网络协议进行交换。
逻辑客户端将C2S(客户端到服务器)数据包发送到逻辑服务器。 逻辑服务器向逻辑客户端发送S2C(服务器到客户端)数据包。 数据包通过网络线程中的写方法发送,并通过网络线程中的读方法的调用接收。
有关如何处理网络的更多详细信息,请参见本文。
逻辑客户端将C2S(客户端到服务器)数据包发送到逻辑服务器。 逻辑服务器向逻辑客户端发送S2C(服务器到客户端)数据包。 数据包通过网络线程中的写方法发送,并通过网络线程中的读方法的调用接收。
有关如何处理网络的更多详细信息,请参见本文。
关于逻辑服务器的常见误解
大多数情况下,专门针对物理服务器的mod还可在物理客户端内部的逻辑服务器上运行。
但是,物理服务器的修改器通常具有不适用于集成服务器的假设,包括但不限于:
- 一局游戏中只有一个逻辑服务器实例
- 世界和实体应始终计算游戏逻辑(即,世界对象的isClient字段始终为false)
- 提供远程控制,资源包发送和Favicon
为了使mods在逻辑服务器上运行,需要更正这些假设。
结论
Possible combinations of physical and logical sides:
Logical Client | Logical Server | |
---|---|---|
物理客户端 | 单例始终存在 | 在本地保存; 每次播放的新实例 |
物理服务器 | 不存在 | 单例始终存在 |
最终,主要困惑来自于靠物理客户端存在的逻辑服务器的事实。