Сетевые сущности

Краткое руководство

Если вы используете sourcegen-состояния компонентов (AutoGenerateComponentState / AutoNetworkField), то большая часть этого делается за вас.

Если вам нужно передать по сети EntityUid, вам следует вызвать GetNetEntity на стороне отправителя (обычно сервера) и TryGetEntity / EnsureEntity на стороне клиента. Если вы внутри состояния компонента, это должно быть EnsureEntity<TComp>, а если это сообщение, вам следует использовать TryGetEntity.

Есть вероятность, что клиенту не удастся разрешить сущность (как было бы с любым решением PVS), отправленную через сообщение, поэтому если вы хотите устойчивость к этому, вам следует использовать состояния компонентов или иным образом переработать свой код.

Почему EntityUid и NetEntity различаются

У клиента и сервера могут быть разные сущности. Клиент создаёт свои собственные сущности для таких эффектов, как хитскан-лазеры, подбираемые предметы и т. д.

Раньше мы помечали эту сущность 28-м битовым флагом, однако в интересах производительности мы хотим вместо этого помещать сущности в массив, что означает, что для этого потребовалось бы значительное количество памяти.

Поэтому локальный EntityUid и сетевая версия естественным образом рассинхронизируются, так как клиент и сервер знают о разных сущностях, и именно здесь в игру вступает NetEntity.

Миграция

Сетевое взаимодействие

EntityUid больше не помечается как NetSerializable. Каждый раз, когда он попытается быть сериализованным, NetSerializer теперь выбросит исключение.

Если вы хотите передать по сети EntityUid или EntityCoordinates, то EntityManager содержит методы для этого:

  • GetEntity
  • GetNetEntity
  • GetCoordinates
  • GetNetCoordinates
  • TryGetEntity
  • TryGetNetEntity
  • EnsureEntity<T> (где T — соответствующий компонент).

У него также есть версия для HashSet и List. У EntitySystems также есть прокси-методы для них.

Вам следует избегать долговременного хранения NetEntity в компонентах и вместо этого использовать EntityUid. NetEntity также не будет сериализоваться в yaml.

Если у вас есть существующая структура данных, которую сложно мигрировать (например, DoAfterEvents), то размещение и EntityUid DataField, и NetEntity на событии (с пометкой EntityUid как NonSerialized) является подходящим промежуточным решением.

Команды

Команды следует обновить для использования NetEntity, так как целые числа будут парситься как NetEntity, а не EntityUid.

Subpages