From cb384b82429f270ac6e2ea377be194df7b813f12 Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Mon, 19 Jan 2026 11:41:24 -0800 Subject: [PATCH] Make VV work with structs in components (#6377) * Make VV work with structs in components * Fix missing imports --- Robust.Client/ViewVariables/ViewVariableControlFactory.cs | 2 +- Robust.Server/ViewVariables/IViewVariablesSession.cs | 1 + Robust.Server/ViewVariables/ServerViewVariablesManager.cs | 7 ++++--- .../ViewVariables/Traits/ViewVariablesTraitMembers.cs | 3 ++- Robust.Server/ViewVariables/ViewVariablesSession.cs | 4 +++- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Robust.Client/ViewVariables/ViewVariableControlFactory.cs b/Robust.Client/ViewVariables/ViewVariableControlFactory.cs index 75cf7ebef..28ffe765f 100644 --- a/Robust.Client/ViewVariables/ViewVariableControlFactory.cs +++ b/Robust.Client/ViewVariables/ViewVariableControlFactory.cs @@ -56,7 +56,7 @@ internal sealed class ViewVariableControlFactory : IViewVariableControlFactory RegisterForType(_ => new VVPropEditorTimeSpan()); RegisterWithCondition( - type => type != typeof(ViewVariablesBlobMembers.ServerValueTypeToken) && !type.IsValueType, + type => type != typeof(ViewVariablesBlobMembers.ServerValueTypeToken), _ => new VVPropEditorReference() ); RegisterWithCondition( diff --git a/Robust.Server/ViewVariables/IViewVariablesSession.cs b/Robust.Server/ViewVariables/IViewVariablesSession.cs index 50908f22e..ee97090c4 100644 --- a/Robust.Server/ViewVariables/IViewVariablesSession.cs +++ b/Robust.Server/ViewVariables/IViewVariablesSession.cs @@ -12,5 +12,6 @@ namespace Robust.Server.ViewVariables object Object { get; } uint SessionId { get; } Type ObjectType { get; } + Action? ObjectChangeDelegate { get; } } } diff --git a/Robust.Server/ViewVariables/ServerViewVariablesManager.cs b/Robust.Server/ViewVariables/ServerViewVariablesManager.cs index 610efe4c4..d03881e64 100644 --- a/Robust.Server/ViewVariables/ServerViewVariablesManager.cs +++ b/Robust.Server/ViewVariables/ServerViewVariablesManager.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Robust.Server.Console; using Robust.Server.Player; -using Robust.Shared.Audio; using Robust.Shared.Enums; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -138,6 +137,7 @@ namespace Robust.Server.ViewVariables } object theObject; + Action? objectChangeDelegate = null; switch (message.Selector) { @@ -200,13 +200,14 @@ namespace Robust.Server.ViewVariables return; } - if (value == null || value.GetType().IsValueType) + if (value == null) { Deny(ViewVariablesResponseCode.NoObject); return; } theObject = value; + objectChangeDelegate = obj => relSession.Modify(sessionRelativeSelector.PropertyIndex, obj); break; } case ViewVariablesIoCSelector ioCSelector: @@ -250,7 +251,7 @@ namespace Robust.Server.ViewVariables } var sessionId = _nextSessionId++; - var session = new ViewVariablesSession(message.MsgChannel.UserId, theObject, sessionId, this, + var session = new ViewVariablesSession(message.MsgChannel.UserId, theObject, objectChangeDelegate, sessionId, this, _robustSerializer, _entityManager, Sawmill); _sessions.Add(sessionId, session); diff --git a/Robust.Server/ViewVariables/Traits/ViewVariablesTraitMembers.cs b/Robust.Server/ViewVariables/Traits/ViewVariablesTraitMembers.cs index 62255aa8a..59dad33ac 100644 --- a/Robust.Server/ViewVariables/Traits/ViewVariablesTraitMembers.cs +++ b/Robust.Server/ViewVariables/Traits/ViewVariablesTraitMembers.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; -using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Prototypes; @@ -198,6 +197,8 @@ namespace Robust.Server.ViewVariables.Traits try { field.SetValue(Session.Object, value); + Session.ObjectChangeDelegate?.Invoke(Session.Object); + return true; } catch (Exception e) diff --git a/Robust.Server/ViewVariables/ViewVariablesSession.cs b/Robust.Server/ViewVariables/ViewVariablesSession.cs index 8eada3e7b..cf38b1882 100644 --- a/Robust.Server/ViewVariables/ViewVariablesSession.cs +++ b/Robust.Server/ViewVariables/ViewVariablesSession.cs @@ -22,6 +22,7 @@ namespace Robust.Server.ViewVariables public object Object { get; } public uint SessionId { get; } public Type ObjectType { get; } + public Action? ObjectChangeDelegate { get; } /// The session ID of the player who opened this session. /// The object we represent. @@ -29,13 +30,14 @@ namespace Robust.Server.ViewVariables /// The session ID for this session. This is what the server and client use to talk about this session. /// /// The view variables host owning this session. - public ViewVariablesSession(NetUserId playerUser, object o, uint sessionId, IServerViewVariablesInternal host, + public ViewVariablesSession(NetUserId playerUser, object o, Action? objectChangeDelegate, uint sessionId, IServerViewVariablesInternal host, IRobustSerializer robustSerializer, IEntityManager entMan, ISawmill logger) { PlayerUser = playerUser; Object = o; SessionId = sessionId; ObjectType = o.GetType(); + ObjectChangeDelegate = objectChangeDelegate; Host = host; RobustSerializer = robustSerializer; EntityManager = entMan;