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(); TryAssignGroupIfNeeded();
CombineGroupWithReachable(); CombineGroupWithReachable();
if (Owner.TryGetComponent<IPhysicsComponent>(out var physics))
{
AnchorUpdate();
}
} }
public void AnchorUpdate() public void AnchorUpdate()
{ {
if (Anchored) if (Anchored)
{
if (_needsGroup)
{ {
TryAssignGroupIfNeeded(); TryAssignGroupIfNeeded();
CombineGroupWithReachable(); 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,12 +93,15 @@ 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())
{
if (node._needsGroup)
{ {
node.NodeGroup = NodeGroup; node.NodeGroup = NodeGroup;
node.SpreadGroup(); node.SpreadGroup();
} }
} }
}
public void ClearNodeGroup() public void ClearNodeGroup()
{ {
@@ -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();
}
} }
} }