@@ -59,26 +59,18 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
|||||||
{
|
{
|
||||||
TryAssignGroupIfNeeded();
|
TryAssignGroupIfNeeded();
|
||||||
CombineGroupWithReachable();
|
CombineGroupWithReachable();
|
||||||
if (Owner.TryGetComponent<IPhysicsComponent>(out var physics))
|
|
||||||
{
|
|
||||||
AnchorUpdate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AnchorUpdate()
|
public void AnchorUpdate()
|
||||||
{
|
{
|
||||||
if (Anchored)
|
if (Anchored)
|
||||||
{
|
{
|
||||||
if (_needsGroup)
|
TryAssignGroupIfNeeded();
|
||||||
{
|
CombineGroupWithReachable();
|
||||||
TryAssignGroupIfNeeded();
|
|
||||||
CombineGroupWithReachable();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NodeGroup.RemoveNode(this);
|
RemoveSelfFromGroup();
|
||||||
ClearNodeGroup();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +82,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
|||||||
|
|
||||||
public bool TryAssignGroupIfNeeded()
|
public bool TryAssignGroupIfNeeded()
|
||||||
{
|
{
|
||||||
if (!_needsGroup)
|
if (!_needsGroup || !Connectable)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -101,10 +93,13 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
|||||||
public void SpreadGroup()
|
public void SpreadGroup()
|
||||||
{
|
{
|
||||||
Debug.Assert(!_needsGroup);
|
Debug.Assert(!_needsGroup);
|
||||||
foreach (var node in GetReachableCompatibleNodes().Where(node => node._needsGroup))
|
foreach (var node in GetReachableCompatibleNodes())
|
||||||
{
|
{
|
||||||
node.NodeGroup = NodeGroup;
|
if (node._needsGroup)
|
||||||
node.SpreadGroup();
|
{
|
||||||
|
node.NodeGroup = NodeGroup;
|
||||||
|
node.SpreadGroup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,8 +111,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
|||||||
|
|
||||||
protected void RefreshNodeGroup()
|
protected void RefreshNodeGroup()
|
||||||
{
|
{
|
||||||
NodeGroup.RemoveNode(this);
|
RemoveSelfFromGroup();
|
||||||
ClearNodeGroup();
|
|
||||||
TryAssignGroupIfNeeded();
|
TryAssignGroupIfNeeded();
|
||||||
CombineGroupWithReachable();
|
CombineGroupWithReachable();
|
||||||
}
|
}
|
||||||
@@ -130,20 +124,35 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
|||||||
|
|
||||||
private IEnumerable<Node> GetReachableCompatibleNodes()
|
private IEnumerable<Node> GetReachableCompatibleNodes()
|
||||||
{
|
{
|
||||||
return GetReachableNodes().Where(node => node.NodeGroupID == NodeGroupID)
|
foreach (var node in GetReachableNodes())
|
||||||
.Where(node => node.Connectable);
|
{
|
||||||
|
if (node.NodeGroupID == NodeGroupID && node.Connectable)
|
||||||
|
{
|
||||||
|
yield return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<INodeGroup> GetReachableCompatibleGroups()
|
private IEnumerable<INodeGroup> GetReachableCompatibleGroups()
|
||||||
{
|
{
|
||||||
return GetReachableCompatibleNodes().Where(node => !node._needsGroup)
|
foreach (var node in GetReachableCompatibleNodes())
|
||||||
.Select(node => node.NodeGroup)
|
{
|
||||||
.Where(group => group != NodeGroup);
|
if (!node._needsGroup)
|
||||||
|
{
|
||||||
|
var group = node.NodeGroup;
|
||||||
|
if (group != NodeGroup)
|
||||||
|
{
|
||||||
|
yield return group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CombineGroupWithReachable()
|
private void CombineGroupWithReachable()
|
||||||
{
|
{
|
||||||
Debug.Assert(!_needsGroup);
|
if (_needsGroup || !Connectable)
|
||||||
|
return;
|
||||||
|
|
||||||
foreach (var group in GetReachableCompatibleGroups())
|
foreach (var group in GetReachableCompatibleGroups())
|
||||||
{
|
{
|
||||||
NodeGroup.CombineGroup(group);
|
NodeGroup.CombineGroup(group);
|
||||||
@@ -161,5 +170,11 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
|||||||
{
|
{
|
||||||
return IoCManager.Resolve<INodeGroupFactory>().MakeNodeGroup(this);
|
return IoCManager.Resolve<INodeGroupFactory>().MakeNodeGroup(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RemoveSelfFromGroup()
|
||||||
|
{
|
||||||
|
NodeGroup.RemoveNode(this);
|
||||||
|
ClearNodeGroup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user