Files
Nitrox/NitroxClient/Debuggers/EntityDebugger.cs
2025-07-06 00:23:46 +02:00

121 lines
4.1 KiB
C#

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using NitroxClient.MonoBehaviours;
using NitroxModel.DataStructures;
using UnityEngine;
namespace NitroxClient.Debuggers
{
[ExcludeFromCodeCoverage]
public class EntityDebugger : BaseDebugger
{
private static Color labelBgColor = new Color(0.2f, 0.2f, 0.2f, 0.5f);
private static Color labelFgColor = Color.white;
private static float textXOffset = 20f;
private static Texture2D lineTex;
private static List<Rect> rects;
public EntityDebugger() : base(200, null, KeyCode.E, true, false, false, GUISkinCreationOptions.DERIVEDCOPY)
{
ActiveTab = AddTab("EntityDebugger", RenderEntityDebugger);
rects = new List<Rect>();
}
private void RenderEntityDebugger()
{
}
public override void OnGUI()
{
if (!Enabled)
{
return;
}
rects.Clear();
foreach (KeyValuePair<NitroxId, GameObject> gameObjectPairs in NitroxEntity.GetGameObjects())
{
NitroxId id = gameObjectPairs.Key;
GameObject gameObject = gameObjectPairs.Value;
if (gameObject == null || gameObject == Player.mainObject)
{
continue;
}
Vector3 screenPos = Player.main.viewModelCamera.WorldToScreenPoint(gameObject.transform.position);
if (screenPos.z > 0 && screenPos.z < 20 &&
screenPos.x >= 0 && screenPos.x < Screen.width &&
screenPos.y >= 0 && screenPos.y < Screen.height)
{
GUIStyle style = GUI.skin.label;
GUIContent textContent = new($"ID {id} NAME {gameObject.name}");
Vector2 size = style.CalcSize(textContent);
size += new Vector2(10f, 0f); //for box edges
Vector2 pointLocation = new Vector2(screenPos.x, Screen.height - screenPos.y);
Rect drawSize = new Rect(screenPos.x + textXOffset, Screen.height - screenPos.y, size.x, size.y);
while (true)
{
bool finished = true;
foreach (Rect rect in rects)
{
if (rect.Overlaps(drawSize))
{
drawSize.x = rect.x;
drawSize.y = rect.y + rect.height;
finished = false;
break;
}
}
if (finished)
{
break;
}
}
DrawLine(pointLocation, new Vector2(drawSize.x, drawSize.y + size.y / 2), labelFgColor, 2f);
rects.Add(drawSize);
Color oldBgColor = GUI.backgroundColor;
GUI.backgroundColor = labelBgColor;
GUI.color = labelFgColor;
GUI.Box(drawSize, textContent);
GUI.backgroundColor = oldBgColor;
}
}
}
private static void DrawLine(Vector2 pointA, Vector2 pointB, Color color, float width)
{
Matrix4x4 matrix = GUI.matrix;
if (!lineTex)
{
lineTex = new Texture2D(1, 1);
}
Color savedColor = GUI.color;
GUI.color = color;
float angle = Vector3.Angle(pointB - pointA, Vector2.right);
if (pointA.y > pointB.y)
{
angle = -angle;
}
GUIUtility.ScaleAroundPivot(new Vector2((pointB - pointA).magnitude, width), new Vector2(pointA.x, pointA.y + 0.5f));
GUIUtility.RotateAroundPivot(angle, pointA);
GUI.DrawTexture(new Rect(pointA.x, pointA.y, 1, 1), lineTex);
GUI.matrix = matrix;
GUI.color = savedColor;
}
}
}