Add extra debug data to nodevis (#6684)

This commit is contained in:
Leon Friedrich
2022-02-15 23:19:32 +13:00
committed by GitHub
parent 3d5781422c
commit a4aacaef5e
8 changed files with 95 additions and 33 deletions

View File

@@ -36,11 +36,15 @@ namespace Content.Server.NodeContainer.EntitySystems
private readonly HashSet<IPlayerSession> _visPlayers = new();
private readonly HashSet<BaseNodeGroup> _toRemake = new();
private readonly HashSet<BaseNodeGroup> _nodeGroups = new();
private readonly HashSet<Node> _toRemove = new();
private readonly List<Node> _toReflood = new();
private ISawmill _sawmill = default!;
private const float VisDataUpdateInterval = 1;
private float _accumulatedFrameTime;
public bool VisEnabled => _visPlayers.Count != 0;
private int _gen = 1;
@@ -99,6 +103,11 @@ namespace Content.Server.NodeContainer.EntitySystems
{
QueueReflood(node);
}
if (group.NodeCount == 0)
{
_nodeGroups.Remove(group);
}
}
public void QueueReflood(Node node)
@@ -130,7 +139,7 @@ namespace Content.Server.NodeContainer.EntitySystems
base.Update(frameTime);
DoGroupUpdates();
VisDoUpdate();
VisDoUpdate(frameTime);
}
private void DoGroupUpdates()
@@ -235,6 +244,7 @@ namespace Content.Server.NodeContainer.EntitySystems
oldGroup.Removed = true;
oldGroup.AfterRemake(newGrouped);
_nodeGroups.Remove(oldGroup);
if (VisEnabled)
_visDeletes.Add(oldGroup.NetId);
}
@@ -288,6 +298,8 @@ namespace Content.Server.NodeContainer.EntitySystems
newGroup.LoadNodes(groupNodes);
_nodeGroups.Add(newGroup);
if (VisEnabled)
_visSends.Add(newGroup);
@@ -340,9 +352,16 @@ namespace Content.Server.NodeContainer.EntitySystems
}
}
private void VisDoUpdate()
private void VisDoUpdate(float frametime)
{
if (_visSends.Count == 0 && _visDeletes.Count == 0)
if (_visPlayers.Count == 0)
return;
_accumulatedFrameTime += frametime;
if (_accumulatedFrameTime < VisDataUpdateInterval
&& _visSends.Count == 0
&& _visDeletes.Count == 0)
return;
var msg = new NodeVis.MsgData();
@@ -350,6 +369,18 @@ namespace Content.Server.NodeContainer.EntitySystems
msg.GroupDeletions.AddRange(_visDeletes);
msg.Groups.AddRange(_visSends.Select(VisMakeGroupState));
if (_accumulatedFrameTime > VisDataUpdateInterval)
{
_accumulatedFrameTime -= VisDataUpdateInterval;
foreach (var group in _nodeGroups)
{
if (_visSends.Contains(group))
continue;
msg.GroupDataUpdates.Add(group.NetId, group.GetDebugData());
}
}
_visSends.Clear();
_visDeletes.Clear();
@@ -363,14 +394,7 @@ namespace Content.Server.NodeContainer.EntitySystems
{
var msg = new NodeVis.MsgData();
var allNetworks = EntityManager
.EntityQuery<NodeContainerComponent>()
.SelectMany(nc => nc.Nodes.Values)
.Select(n => (BaseNodeGroup?) n.NodeGroup)
.Where(n => n != null)
.Distinct();
foreach (var network in allNetworks)
foreach (var network in _nodeGroups)
{
msg.Groups.Add(VisMakeGroupState(network!));
}
@@ -392,7 +416,8 @@ namespace Content.Server.NodeContainer.EntitySystems
Reachable = n.ReachableNodes.Select(r => r.NetId).ToArray(),
Entity = n.Owner,
Type = n.GetType().Name
}).ToArray()
}).ToArray(),
DebugData = group.GetDebugData()
};
}

View File

@@ -33,8 +33,10 @@ namespace Content.Server.NodeContainer.NodeGroups
// In theory, the SS13 curse ensures this method will never be called.
void AfterRemake(IEnumerable<IGrouping<INodeGroup?, Node>> newGroups);
// TODO: Why is this method needed?
void QueueRemake();
/// <summary>
/// Return any additional data to display for the node-visualizer debug overlay.
/// </summary>
string? GetDebugData();
}
[NodeGroup(NodeGroupID.Default, NodeGroupID.WireNet)]
@@ -111,9 +113,9 @@ namespace Content.Server.NodeContainer.NodeGroups
/// <param name="newGroups">A list of new groups for this group's former nodes.</param>
public virtual void AfterRemake(IEnumerable<IGrouping<INodeGroup?, Node>> newGroups) { }
public void QueueRemake()
public virtual string? GetDebugData()
{
EntitySystem.Get<NodeGroupSystem>().QueueRemakeGroup(this);
return null;
}
}
}

View File

@@ -1,16 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Server.Atmos;
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Server.NodeContainer.Nodes;
using Content.Shared.Atmos;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
namespace Content.Server.NodeContainer.NodeGroups
{
@@ -23,7 +17,7 @@ namespace Content.Server.NodeContainer.NodeGroups
}
[NodeGroup(NodeGroupID.Pipe)]
public class PipeNet : BaseNodeGroup, IPipeNet
public sealed class PipeNet : BaseNodeGroup, IPipeNet
{
[ViewVariables] public GasMixture Air { get; set; } = new() {Temperature = Atmospherics.T20C};
@@ -95,5 +89,12 @@ namespace Content.Server.NodeContainer.NodeGroups
DebugTools.AssertNotNull(_atmosphereSystem);
_atmosphereSystem?.RemovePipeNet(this);
}
public override string GetDebugData()
{
return @$"Pressure: { Air.Pressure:G3}
Temperature: {Air.Temperature:G3}
Volume: {Air.Volume:G3}";
}
}
}