Сети узлов

Это не моя система, это документация чужой системы.

Node, NodeContainer и INodeGroup представляют собой троицу частей, составляющих «слой связности» в SS14. Он используется для труб и проводов (питания).

Оглавление этой статьи должно дать общее представление о системе.

NodeContainer : компонент в сущностях, взаимодействующих с системой узлов

NodeContainer является компонентом, с которым будет взаимодействовать любое создаваемое вами устройство для доступа к системе узлов.

Content.Server.GameObjects.Components.Atmos.Piping.Pumps.BasePumpComponent следует считать «эталонным кодом» для компонента, которому нужно использовать узлы так, чтобы это не было слишком сложно, но требовало размышлений из-за того, что он не настолько «универсально подключён», как устройство WireNet.

Подклассы Node : определяют связность между собой и другими узлами

Node представляет собой конкретную точку подключения на сущности.

Экземпляр Node является конкретной точкой подключения, и поведение этого экземпляра определяет, как эта точка подключения соединяется с другими узлами.

Например, каждая сторона насоса представляет собой отдельный PipeNode, который соединяется только в этом направлении, но обе стороны трубы представляют собой один PipeNode, который соединяется в обоих направлениях.

Но у AdjacentNode нет способа задать такое направление, он просто соединяется со всеми соседними узлами того же типа.

У всех Node есть свойство под названием NodeGroupID, представленное в прототипе как nodeGroupID, которое определяет совместимость между Node и типом INodeGroup, который используется.

Реализация GetReachableNodes управляет обнаружением Node, а вызов RefreshNodeGroup представляет собой способ вручную принудительно обновить этот узел.

Обратите внимание, что код AdjacentNode на самом деле не проверяет NodeGroupID — эту проверку выполняет базовый класс Node в GetReachableCompatibleNodes. Это означает, что GetReachableNodes в целом не нужно выполнять эту проверку, поэтому выполняйте только необходимые проверки, как в случае с PipeNode, который может соединяться только с другими PipeNode, потому что.

Я не уверен, вызовет ли асимметричное соединение проблемы на практике, поэтому постарайтесь не создавать ситуацию, где это может произойти. (то есть что-то, что ведёт себя как PipeNode, рядом с AdjacentNode — AdjacentNode подключится к PipeNode, но не наоборот)

Чтобы действительно использовать Node для чего-то полезного, Node нужно либо снабдить информацией о его родительской сети через INodeGroup, который имеет переопределяемые функции на случай добавления и удаления узлов, либо тому, что обращается к нему, нужно использовать его свойство NodeGroup, у которого нет обратных вызовов обновления и который всегда имеет тип INodeGroup.

Хотя это уже должно быть ясно: Node внутри одной сущности не соединяются друг с другом автоматически, если только это не вызвано принудительно их поведением соединения (напрямую или косвенно, например через подключение игроком насоса к самому себе).

И наконец, ещё раз: если вам просто нужно поведение «подключайся к соседним сущностям той же группы», используйте AdjacentNode, как показано ниже:

  - type: NodeContainer
    nodes:
    - !type:AdjacentNode
      nodeGroupID: Apc
    - !type:AdjacentNode
      nodeGroupID: WireNet

INodeGroup : представляет связанную группу Node и содержит групповое поведение

Экземпляры INodeGroup представляют связанную группу Node.

Это означает, что любой Node в группе связан с любым другим Node. (Не обязательно напрямую, но и не проходя через какие-либо «явные разделители», такие как насосы в системе PipeNet.)

Реализация INodeGroup выбирается через NodeGroupID у Node. Подробнее см. NodeGroupFactory.cs (описан ниже).

Обратите внимание, что все реализации INodeGroup в настоящее время расширяют BaseNodeGroup.

NodeGroupFactory.cs : создаёт INodeGroup для Node и содержит перечисление NodeGroupID

NodeGroupFactory.cs содержит типы сетей в перечислении NodeGroupID.

NodeGroupID сопоставляются с реализациями INodeGroup через атрибут отражения NodeGroup (например, [NodeGroup(NodeGroupID.Pipe)] в IPipeNet.cs).

Несколько NodeGroupID могут быть сопоставлены с одной реализацией NodeGroup.

NodeGroupFactory (доступный через IoC как INodeGroupFactory) имеет один важный член, MakeNodeGroup. (Есть также Initialize, который вызывается из EntryPoint сервера и используется для поиска классов с помощью отражения.)

MakeNodeGroup создаёт новый INodeGroup из Node, получая тип из Node.NodeGroupID.

Приложение: некоторые ID энергетических групп:

  • Apc: кабели-удлинители ЛКП -> ApcNetNodeGroup
  • MVPower: СВ-кабель -> PowerNetNodeGroup
  • HVPower: ВВ-кабель -> PowerNetNodeGroup

Subpages