Node anchoring fix (#3448)

* replaces node linq

* Node anchoring fix
This commit is contained in:
collinlunn
2021-02-28 03:59:10 -07:00
committed by GitHub
parent 777a75b7a3
commit 81f807b26b

View File

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