Untitled

 avatar
unknown
csharp
a year ago
5.0 kB
4
Indexable
Index: Assets/Plugins/Mirror/Core/Attributes.cs
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/Assets/Plugins/Mirror/Core/Attributes.cs b/Assets/Plugins/Mirror/Core/Attributes.cs
--- a/Assets/Plugins/Mirror/Core/Attributes.cs	(revision 541cb8f70ffe86029cf95cc5a7a6a3b723c60f2c)
+++ b/Assets/Plugins/Mirror/Core/Attributes.cs	(date 1706020484572)
@@ -11,6 +11,7 @@
     public class SyncVarAttribute : PropertyAttribute
     {
         public string hook;
+        public bool initialOnly;
     }
 
     /// <summary>
Index: Assets/Plugins/Mirror/Editor/Weaver/Processors/SyncVarAttributeProcessor.cs
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/Assets/Plugins/Mirror/Editor/Weaver/Processors/SyncVarAttributeProcessor.cs b/Assets/Plugins/Mirror/Editor/Weaver/Processors/SyncVarAttributeProcessor.cs
--- a/Assets/Plugins/Mirror/Editor/Weaver/Processors/SyncVarAttributeProcessor.cs	(revision 541cb8f70ffe86029cf95cc5a7a6a3b723c60f2c)
+++ b/Assets/Plugins/Mirror/Editor/Weaver/Processors/SyncVarAttributeProcessor.cs	(date 1706021031121)
@@ -45,7 +45,18 @@
 
             return FindHookMethod(td, syncVar, hookFunctionName, ref WeavingFailed);
         }
+        
+        // Get initialOnly if any
+        public bool GetInitialOnly(FieldDefinition syncVar)
+        {
+            CustomAttribute syncVarAttr = syncVar.GetCustomAttribute<SyncVarAttribute>();
 
+            if (syncVarAttr == null)
+                return false;
+
+            return syncVarAttr.GetField("initialOnly", false);
+        }
+
         // Create a field definition for a field that will store the Action<T, T> delegate instance for the syncvar hook method (only instantiate delegate once)
         public FieldDefinition CreateNewActionFieldDefinitionFromHookMethod(FieldDefinition syncVarField)
         {
@@ -251,7 +262,29 @@
 
             return get;
         }
+        
+        MethodDefinition GenerateSyncVarSetterInitialOnly(FieldDefinition fd, string originalName)
+        {
+            var set = new MethodDefinition($"set_Network{originalName}", MethodAttributes.Public |
+                                                                        MethodAttributes.SpecialName |
+                                                                        MethodAttributes.HideBySig,
+                weaverTypes.Import(typeof(void)));
 
+            var valueParam = new ParameterDefinition("value", ParameterAttributes.None, fd.FieldType);
+            set.Parameters.Add(valueParam);
+            set.SemanticsAttributes = MethodSemanticsAttributes.Setter;
+
+            ILProcessor worker = set.Body.GetILProcessor();
+            var fr = fd.DeclaringType.HasGenericParameters ? fd.MakeHostInstanceGeneric() : fd;
+            
+            worker.Emit(OpCodes.Ldarg_0);
+            worker.Emit(OpCodes.Ldarg, valueParam);
+            worker.Emit(OpCodes.Stfld, fr);
+            worker.Emit(OpCodes.Ret);
+            
+            return set;
+        }
+        
         // for [SyncVar] health, weaver generates
         //
         //   NetworkHealth
@@ -390,6 +423,7 @@
         public void ProcessSyncVar(TypeDefinition td, FieldDefinition fd, Dictionary<FieldDefinition, FieldDefinition> syncVarNetIds, Dictionary<FieldDefinition, (FieldDefinition hookDelegateField, MethodDefinition hookMethod)> syncVarHookDelegates, long dirtyBit, ref bool WeavingFailed)
         {
             string originalName = fd.Name;
+            bool initialOnly = GetInitialOnly(fd);
 
             // GameObject/NetworkIdentity SyncVars have a new field for netId
             FieldDefinition netIdField = null;
@@ -416,7 +450,9 @@
             }
 
             MethodDefinition get = GenerateSyncVarGetter(fd, originalName, netIdField);
-            MethodDefinition set = GenerateSyncVarSetter(td, fd, originalName, dirtyBit, netIdField, syncVarHookDelegates, ref WeavingFailed);
+            MethodDefinition set = initialOnly
+                    ? GenerateSyncVarSetterInitialOnly(fd, originalName)
+                    : GenerateSyncVarSetter(td, fd, originalName, dirtyBit, netIdField, syncVarHookDelegates, ref WeavingFailed);
 
             //NOTE: is property even needed? Could just use a setter function?
             //create the property
@@ -430,7 +466,10 @@
             td.Methods.Add(get);
             td.Methods.Add(set);
             td.Properties.Add(propertyDefinition);
-            syncVarAccessLists.replacementSetterProperties[fd] = set;
+            if (!initialOnly)
+            { 
+                syncVarAccessLists.replacementSetterProperties[fd] = set;
+            }
 
             // replace getter field if GameObject/NetworkIdentity so it uses
             // netId instead
Editor is loading...
Leave a Comment