Power works with Anchorable (#1240)
Co-authored-by: py01 <pyronetics01@gmail.com>
This commit is contained in:
@@ -123,7 +123,8 @@ namespace Content.Server.GameObjects.Components.NodeContainer.NodeGroups
|
||||
public void RemoveConsumer(PowerConsumerComponent consumer)
|
||||
{
|
||||
Debug.Assert(_consumersByPriority[consumer.Priority].Contains(consumer));
|
||||
_consumersByPriority[consumer.Priority].Add(consumer);
|
||||
consumer.ReceivedPower = 0;
|
||||
_consumersByPriority[consumer.Priority].Remove(consumer);
|
||||
_drawByPriority[consumer.Priority] -= consumer.DrawRate;
|
||||
UpdateConsumerReceivedPower();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Content.Server.GameObjects.Components.NodeContainer.NodeGroups;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.ViewVariables;
|
||||
@@ -28,8 +29,19 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
||||
[ViewVariables]
|
||||
public IEntity Owner { get; private set; }
|
||||
|
||||
[ViewVariables]
|
||||
private bool _needsGroup = true;
|
||||
|
||||
/// <summary>
|
||||
/// If this node should be considered for connection by other nodes.
|
||||
/// </summary>
|
||||
private bool Connectable => !_deleting && Anchored;
|
||||
|
||||
private bool Anchored => !Owner.TryGetComponent<PhysicsComponent>(out var physics) || physics.Anchored;
|
||||
|
||||
/// <summary>
|
||||
/// Prevents a node from being used by other nodes while midway through removal.
|
||||
/// </summary>
|
||||
private bool _deleting = false;
|
||||
|
||||
|
||||
@@ -47,11 +59,21 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
||||
{
|
||||
TryAssignGroupIfNeeded();
|
||||
CombineGroupWithReachable();
|
||||
if (Owner.TryGetComponent<PhysicsComponent>(out var physics))
|
||||
{
|
||||
AnchorUpdate();
|
||||
physics.AnchoredChanged += AnchorUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnContainerRemove()
|
||||
{
|
||||
_deleting = true;
|
||||
if (Owner.TryGetComponent<PhysicsComponent>(out var physics))
|
||||
{
|
||||
AnchorUpdate();
|
||||
physics.AnchoredChanged -= AnchorUpdate;
|
||||
}
|
||||
NodeGroup.RemoveNode(this);
|
||||
}
|
||||
|
||||
@@ -75,7 +97,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
||||
public void SpreadGroup()
|
||||
{
|
||||
Debug.Assert(!_needsGroup);
|
||||
foreach (var node in GetReachableCompatibleNodes().Where(node => node._needsGroup == true))
|
||||
foreach (var node in GetReachableCompatibleNodes().Where(node => node._needsGroup))
|
||||
{
|
||||
node.NodeGroup = NodeGroup;
|
||||
node.SpreadGroup();
|
||||
@@ -97,12 +119,12 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
||||
private IEnumerable<Node> GetReachableCompatibleNodes()
|
||||
{
|
||||
return GetReachableNodes().Where(node => node.NodeGroupID == NodeGroupID)
|
||||
.Where(node => node._deleting == false);
|
||||
.Where(node => node.Connectable);
|
||||
}
|
||||
|
||||
private IEnumerable<INodeGroup> GetReachableCompatibleGroups()
|
||||
{
|
||||
return GetReachableCompatibleNodes().Where(node => node._needsGroup == false)
|
||||
return GetReachableCompatibleNodes().Where(node => !node._needsGroup)
|
||||
.Select(node => node.NodeGroup)
|
||||
.Where(group => group != NodeGroup);
|
||||
}
|
||||
@@ -127,5 +149,22 @@ namespace Content.Server.GameObjects.Components.NodeContainer.Nodes
|
||||
{
|
||||
return _nodeGroupFactory.MakeNodeGroup(NodeGroupID);
|
||||
}
|
||||
|
||||
private void AnchorUpdate()
|
||||
{
|
||||
if (Anchored)
|
||||
{
|
||||
if (_needsGroup)
|
||||
{
|
||||
TryAssignGroupIfNeeded();
|
||||
CombineGroupWithReachable();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NodeGroup.RemoveNode(this);
|
||||
ClearNodeGroup();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user