Сети узлов
Это не моя система, это документация чужой системы.
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: кабели-удлинители ЛКП ->ApcNetNodeGroupMVPower: СВ-кабель ->PowerNetNodeGroupHVPower: ВВ-кабель ->PowerNetNodeGroup