Power works with Anchorable (#1240)

Co-authored-by: py01 <pyronetics01@gmail.com>
This commit is contained in:
py01
2020-07-02 04:02:29 -06:00
committed by GitHub
parent 7291c318e4
commit 7b17698336
9 changed files with 118 additions and 8 deletions

View File

@@ -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();
}

View File

@@ -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();
}
}
}
}