* Implement device networking * Implement device configuration menu * Fix device network * Implement disposal mailing unit * Implement base network connection Implement wired and wireless network connection Implement device network metadata * Fix dereference null error * Fix wired network null checks * Change BaseNetworks enum to NetworkUtils class Add PingResponse function to NetworkUtils Change device network file structure * Add doc comments * Apply suggestions from code review Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com> * Add tag validation to disposal mailing unit * Add tag validation to the mailing unit component * Address reviews Change WiredNetwork can connect check Change device networking string literals to constants * Address reviews Revert changes to PowerProvider and PowerReceiver Add new NodeGroup WELP * Fix recursive access to Owner property * Integrate suggested changes * Fix TryGetWireNet acting on NullPowerProvider Fix network connections not checking if their owner has been deleted * Close device network connection when the owning entity got deleted Fix mailing unit not closing the device network connection on remove * Remove GetWireNet from NullPowerProvider Co-authored-by: Julian Giebel <j.giebel@netrocks.info> Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
116 lines
3.4 KiB
C#
116 lines
3.4 KiB
C#
using System.Collections.Generic;
|
|
using Content.Server.GameObjects.Components.NodeContainer.Nodes;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Server.GameObjects.Components.NodeContainer.NodeGroups
|
|
{
|
|
/// <summary>
|
|
/// Maintains a collection of <see cref="Node"/>s, and performs operations requiring a list of
|
|
/// all connected <see cref="Node"/>s.
|
|
/// </summary>
|
|
public interface INodeGroup
|
|
{
|
|
IReadOnlyList<Node> Nodes { get; }
|
|
|
|
void Initialize(Node sourceNode);
|
|
|
|
void AddNode(Node node);
|
|
|
|
void RemoveNode(Node node);
|
|
|
|
void CombineGroup(INodeGroup newGroup);
|
|
|
|
void RemakeGroup();
|
|
}
|
|
|
|
[NodeGroup(NodeGroupID.Default, NodeGroupID.WireNet)]
|
|
public class BaseNodeGroup : INodeGroup
|
|
{
|
|
[ViewVariables]
|
|
public IReadOnlyList<Node> Nodes => _nodes;
|
|
private readonly List<Node> _nodes = new List<Node>();
|
|
|
|
[ViewVariables]
|
|
public int NodeCount => Nodes.Count;
|
|
|
|
public static readonly INodeGroup NullGroup = new NullNodeGroup();
|
|
|
|
protected GridId GridId { get; private set;}
|
|
|
|
public virtual void Initialize(Node sourceNode)
|
|
{
|
|
GridId = sourceNode.Owner.Transform.GridID;
|
|
}
|
|
|
|
public void AddNode(Node node)
|
|
{
|
|
_nodes.Add(node);
|
|
OnAddNode(node);
|
|
}
|
|
|
|
public void RemoveNode(Node node)
|
|
{
|
|
_nodes.Remove(node);
|
|
OnRemoveNode(node);
|
|
IoCManager.Resolve<INodeGroupManager>().AddDirtyNodeGroup(this);
|
|
}
|
|
|
|
public void CombineGroup(INodeGroup newGroup)
|
|
{
|
|
if (newGroup.Nodes.Count < Nodes.Count)
|
|
{
|
|
newGroup.CombineGroup(this);
|
|
return;
|
|
}
|
|
OnGivingNodesForCombine(newGroup);
|
|
foreach (var node in Nodes)
|
|
{
|
|
node.NodeGroup = newGroup;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Causes all <see cref="Node"/>s to remake their groups. Called when a <see cref="Node"/> is removed
|
|
/// and may have split a group in two, so multiple new groups may need to be formed.
|
|
/// </summary>
|
|
public void RemakeGroup()
|
|
{
|
|
foreach (var node in Nodes)
|
|
{
|
|
node.ClearNodeGroup();
|
|
}
|
|
var newGroups = new List<INodeGroup>();
|
|
foreach (var node in Nodes)
|
|
{
|
|
if (node.TryAssignGroupIfNeeded())
|
|
{
|
|
node.SpreadGroup();
|
|
newGroups.Add(node.NodeGroup);
|
|
}
|
|
}
|
|
AfterRemake(newGroups);
|
|
}
|
|
|
|
protected virtual void OnAddNode(Node node) { }
|
|
|
|
protected virtual void OnRemoveNode(Node node) { }
|
|
|
|
protected virtual void OnGivingNodesForCombine(INodeGroup newGroup) { }
|
|
|
|
protected virtual void AfterRemake(IEnumerable<INodeGroup> newGroups) { }
|
|
|
|
private class NullNodeGroup : INodeGroup
|
|
{
|
|
public IReadOnlyList<Node> Nodes => _nodes;
|
|
private readonly List<Node> _nodes = new List<Node>();
|
|
public void Initialize(Node sourceNode) { }
|
|
public void AddNode(Node node) { }
|
|
public void CombineGroup(INodeGroup newGroup) { }
|
|
public void RemoveNode(Node node) { }
|
|
public void RemakeGroup() { }
|
|
}
|
|
}
|
|
}
|