Minecraft использует модель клиент-сервер, то есть пользователи устанавливают игровой клиент и подключаются к серверу, чтобы играть. Fabric позволяет модам работать либо на клиенте Minecraft, либо на сервере Minecraft, а также на обоих одновременно.
Понятие клиент/сервер в Minecraft неоднозначно и может относиться как к физической, так и к логической сторонам. Термины клиент/сервер могут использоваться для различения различных дистрибутивов Minecraft (клиент Minecraft и выделенный сервер Minecraft), которые называются «физическими» сторонами. Однако клиент Minecraft содержит собственный интегрированный сервер для одиночной игры и сеансов локальной сети, а это означает, что клиент Minecraft также содержит логику сервера. Следовательно, клиент/сервер также может использоваться для различения частей игровой логики, которые называются «логическими» сторонами.
Для обоих типов сторон есть «клиент» и «сервер». Однако логический клиент не эквивалентен физическому клиенту, и логический сервер также не эквивалентен физическому серверу. Вместо этого логический клиент размещается на физическом клиенте, а логический сервер размещается либо на физическом сервере, либо на физическом клиенте.
Логические стороны занимают центральное место в архитектуре обоих дистрибутивов Minecraft. Поэтому понимание логических сторон жизненно важно для любой разработки модов с помощью Fabric.
Физические стороны или среда относятся к двум дистрибутивам (jar) Minecraft, клиенту (то, что запускает ванильный лаунчер) и серверу (бесплатная загрузка доступна на https://minecraft.net). Физическая сторона относится к тому, какой код доступен в текущей среде.
Клиентская и серверная среда представляют собой уменьшенные дистрибутивы одной и той же программы, содержащие только необходимые части кода.
В Fabric часто можно увидеть такие аннотации, как @Environment(EnvType.CLIENT)
. Это указывает на то, что некоторый код присутствует только в одной среде; в этом примере - клиент.
В Fabric fabric.mod.json и конфигурации миксина клиент/сервер относится к среде.
Каждая физическая сторона поставляет классы, используемые ее точкой входа, и классы дата-генераторы с точкой входа «net.minecraft.data.Main».
Логические стороны отвечают за собственно игровую логику. Логический клиент выполняет рендеринг, отправляет входные данные игрока на сервер, обрабатывает пакеты ресурсов и частично моделирует игровой мир. Сервер обрабатывает основную игровую логику, пакеты данных и поддерживает истинное состояние игрового мира.
Клиент поддерживает частичную копию мира сервера с копиями таких объектов, как:
net.minecraft.world.World net.minecraft.entity.Entity net.minecraft.block.entity.BlockEntity
Эти реплицированные объекты позволяют клиентам и серверам выполнять некоторую общую игровую логику. Клиент может взаимодействовать с этими объектами, в то время как сервер отвечает за их синхронизацию. Обычно, чтобы отличить объекты на логических клиентах от объектов на логическом сервере, вы обращаетесь к миру объекта и проверяете его поле isClient
. Это можно использовать для выполнения авторитетных действий на сервере, таких как размещение сущностей, и для имитации действий на клиенте. Этот метод необходим, чтобы избежать десинхронизации между двумя логическими сторонами.
Поняв, какие есть стороны и как их различать, теперь мы можем подробно рассмотреть каждую сторону.
Физический клиент — это jar-файл minecraft, загруженный программой запуска vanilla. Он содержит логический клиент и логический сервер (интегрированный сервер). Его точка входа — «net.minecraft.client.main.Main».
Физический клиент может загружать несколько разных миров, каждый в пределах отдельного логического сервера, но только по одному за раз.
По сравнению с логическим сервером физического сервера (выделенный сервер), логический сервер физического клиента (интегрированный сервер) может управляться логическим клиентом на физическом клиенте (например, F3+T перезагружает пакеты данных, а выключение клиента вместе в этим отключает интегрированный сервер). Он также может загружать пакеты ресурсов, связанные с миром, на логическом клиенте на физическом клиенте.
Весь логический клиентский контент является эксклюзивным для физического клиента, поэтому вы видите множество аннотаций среды для рендеринга, звука и другого логического клиентского кода.
Некоторые моды предназначены исключительно для физических клиентов, например, Liteloader, Optifine и PvP-клиенты Minecraft (Badlion, Hyperium).
Физический сервер — это выделенный сервер Java. По сравнению с физическим клиентом у него есть только логический сервер (выделенный сервер). Его точка входа — «net.minecraft.server.MinecraftServer», и физический сервер может иметь только один мир во время работы. Если сервер должен переключиться в другой мир, требуется перезагрузка сервера.
Его логический сервер немного отличается от сервера физического клиента, поскольку всегда присутствует только один экземпляр логического сервера, когда работает физический сервер. Кроме того, логический сервер физического сервера может управляться удаленно через Rcon, имеет файл конфигурации с именем server.properties и может отправлять пакеты ресурсов сервера.
Несмотря на эти различия, большинство модов без проблем применимы к логическим серверам как физического клиента, так и физического сервера, если они не относятся к содержимому логического клиента.
Однако его функции отправки единого мира и пакета ресурсов значительно упрощают установку ванильного мода (комбинации пакета данных и пакета ресурсов) по сравнению с клиентами, поскольку ванильные физические клиенты настраиваются при автоматическом подключении к серверу.
Некоторые моды нацелены исключительно на физический сервер. Например, Bukkit и его производные (Spigot, Paper, Cauldron, гибриды Xxx-Bukkit) всегда работают на физическом сервере.
Логический клиент — это интерфейс для игрока. Рендеринг (LWJGL), пакет ресурсов, обработка ввода игрока и звуки выполняются на логическом клиенте. Его нет на физическом сервере.
Логический сервер — это место, где выполняется большая часть игровой логики. Пакеты данных, обновления мира, блокировка сущностей и тики сущностей, ИИ мобов, сохранение игры/мира и генерация мира происходят на логическом сервере.
Логический сервер на физическом клиенте называется «Интегрированный сервер», а логический сервер на физическом сервере называется «Выделенный сервер» (это также имя самого физического сервера).
Логический сервер работает в своем собственном основном потоке, даже на физических серверах, и имеет несколько рабочих потоков. Срок службы логического сервера зависит от физической стороны, на которой он размещен. На физическом сервере логический сервер существует до тех пор, пока выполняется процесс. На физическом клиенте может быть создано несколько логических серверов, но одновременно может существовать только один логический сервер. Новый логический сервер создается, когда игрок загружает локальное сохранение, и закрывается, когда игрок закрывает локальное сохранение.
Большинство универсальных модов нацелены на логический сервер, поэтому они могут работать как в одиночной, так и в многопользовательской игре.
Единственно правильный способ обмена данными между логическими клиентами и серверами путем обмена пакетами. Пакеты (как описано на https://wiki.vg) отправляются между логическими клиентами и логическими серверами, а не между физическими сторонами. Моды могут добавлять пакеты для передачи пользовательской информации между двумя логическими сторонами. Обмен пакетами происходит в памяти для логического клиента, подключенного к его собственному интегрированному серверу, в противном случае обмен осуществляется по сетевому протоколу.
Логические клиенты отправляют пакеты C2S (Client-To-Server) на логический сервер. Логический сервер отправляет пакеты S2C (Server-To-Client) логическим клиентам. Пакеты отправляются методом записи в сетевом потоке и принимаются вызовом метода чтения в сетевом потоке.
Подробнее о работе с сетью описано здесь.
В большинстве случаев моды, предназначенные исключительно для физического сервера, также работают на логических серверах внутри физических клиентов.
Однако разработчики модов для физических серверов обычно имеют предположения, которые не применяются к интегрированным серверам, включая, помимо прочего:
Эти предположения необходимо исправить, чтобы моды работали на логических серверах.
Возможные комбинации физической и логической сторон:
Логический клиент | Логический сервер | |
---|---|---|
Физический клиент | Синглтон всегда существует | Существует при локальном сохранении; новый экземпляр для каждой игры |
Физический сервер | Не существует | Синглтон всегда существует |
В конечном счете, основная путаница возникает из-за того, что логические серверы существуют на физических клиентах.