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

@@ -59,6 +59,14 @@ namespace Content.Client.NodeContainer
Groups.Add(group.NetId, group);
}
foreach (var (groupId, debugData) in ev.GroupDataUpdates)
{
if (Groups.TryGetValue(groupId, out var group))
{
group.DebugData = debugData;
}
}
Entities = Groups.Values
.SelectMany(g => g.Nodes, (data, nodeData) => (data, nodeData))
.GroupBy(n => n.nodeData.Entity)

View File

@@ -1,14 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text;
using Content.Client.Resources;
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.ResourceManagement;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
using static Content.Shared.NodeContainer.NodeVis;
@@ -90,6 +86,7 @@ namespace Content.Client.NodeContainer
sb.Append($"node: {node.Name}\n");
sb.Append($"type: {node.Type}\n");
sb.Append($"grid pos: {gridTile}\n");
sb.Append(group.DebugData);
args.ScreenHandle.DrawString(_font, mousePos + (20, -20), sb.ToString());
}

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}";
}
}
}

View File

@@ -120,5 +120,21 @@ namespace Content.Server.Power.NodeGroups
{
netConnectorComponent.Net = this;
}
public override string? GetDebugData()
{
// This is just recycling the multi-tool examine.
var ps = _powerNetSystem.GetNetworkStatistics(NetworkNode);
float storageRatio = ps.InStorageCurrent / Math.Max(ps.InStorageMax, 1.0f);
float outStorageRatio = ps.OutStorageCurrent / Math.Max(ps.OutStorageMax, 1.0f);
return @$"Current Supply: {ps.SupplyCurrent:G3}
From Batteries: {ps.SupplyBatteries:G3}
Theoretical Supply: {ps.SupplyTheoretical:G3}
Ideal Consumption: {ps.Consumption:G3}
Input Storage: {ps.InStorageCurrent:G3} / {ps.InStorageMax:G3} ({storageRatio:P1})
Output Storage: {ps.OutStorageCurrent:G3} / {ps.OutStorageMax:G3} ({outStorageRatio:P1})";
}
}
}

View File

@@ -124,5 +124,20 @@ namespace Content.Server.Power.NodeGroups
Chargers.Remove(charger);
_powerNetSystem.QueueReconnectPowerNet(this);
}
public override string? GetDebugData()
{
// This is just recycling the multi-tool examine.
var ps = _powerNetSystem.GetNetworkStatistics(NetworkNode);
float storageRatio = ps.InStorageCurrent / Math.Max(ps.InStorageMax, 1.0f);
float outStorageRatio = ps.OutStorageCurrent / Math.Max(ps.OutStorageMax, 1.0f);
return @$"Current Supply: {ps.SupplyCurrent:G3}
From Batteries: {ps.SupplyBatteries:G3}
Theoretical Supply: {ps.SupplyTheoretical:G3}
Ideal Consumption: {ps.Consumption:G3}
Input Storage: {ps.InStorageCurrent:G3} / {ps.InStorageMax:G3} ({storageRatio:P1})
Output Storage: {ps.OutStorageCurrent:G3} / {ps.OutStorageMax:G3} ({outStorageRatio:P1})";
}
}
}

View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization;
namespace Content.Shared.NodeContainer
{
@@ -24,6 +20,7 @@ namespace Content.Shared.NodeContainer
{
public List<GroupData> Groups = new();
public List<int> GroupDeletions = new();
public Dictionary<int, string?> GroupDataUpdates = new();
}
[Serializable, NetSerializable]
@@ -33,6 +30,7 @@ namespace Content.Shared.NodeContainer
public string GroupId = "";
public Color Color;
public NodeDatum[] Nodes = Array.Empty<NodeDatum>();
public string? DebugData;
}
[Serializable, NetSerializable]