public static ProcessSyncVarReturn ProcessSyncVars(TypeDefinition td) { List <FieldDefinition> syncVars = new List <FieldDefinition>(); Dictionary <FieldDefinition, FieldDefinition> syncVarNetIds = new Dictionary <FieldDefinition, FieldDefinition>(); // the mapping of dirtybits to sync-vars is implicit in the order of the fields here. this order is recorded in m_replacementProperties. // start assigning syncvars at the place the base class stopped, if any int dirtyBitCounter = Weaver.WeaveLists.GetSyncVarStart(td.BaseType.FullName); // find syncvars foreach (FieldDefinition fd in td.Fields) { if (fd.HasCustomAttribute <SyncVarAttribute>()) { if ((fd.Attributes & FieldAttributes.Static) != 0) { Weaver.Error($"{fd.Name} cannot be static", fd); continue; } if (fd.FieldType.IsArray) { Weaver.Error($"{fd.Name} has invalid type. Use SyncLists instead of arrays", fd); continue; } if (SyncObjectInitializer.ImplementsSyncObject(fd.FieldType)) { Weaver.Warning($"{fd.Name} has [SyncVar] attribute. SyncLists should not be marked with SyncVar", fd); } else { syncVars.Add(fd); ProcessSyncVar(td, fd, syncVarNetIds, 1L << dirtyBitCounter); dirtyBitCounter += 1; if (dirtyBitCounter == SyncVarLimit) { Weaver.Error($"{td.Name} has too many SyncVars. Consider refactoring your class into multiple components", td); continue; } } } } // add all the new SyncVar __netId fields foreach (FieldDefinition fd in syncVarNetIds.Values) { td.Fields.Add(fd); } Weaver.WeaveLists.SetNumSyncVars(td.FullName, syncVars.Count); return(new ProcessSyncVarReturn { syncVars = syncVars, syncVarNetIds = syncVarNetIds }); }
internal static void Register(TypeReference dataType, MethodReference methodReference) { string typeName = dataType.FullName; if (readFuncs.ContainsKey(typeName)) { Weaver.Warning($"Registering a Read method for {typeName} when one already exists", methodReference); } readFuncs[dataType.FullName] = methodReference; }
public static void Register(TypeReference dataType, MethodReference methodReference) { string typeName = dataType.FullName; if (writeFuncs.ContainsKey(typeName)) { Weaver.Warning($"Registering a Write method for {typeName} when one already exists", methodReference); } writeFuncs[typeName] = methodReference; }
internal static void Register(TypeReference dataType, MethodReference methodReference) { if (readFuncs.ContainsKey(dataType)) { Weaver.Warning($"Registering a Read method for {dataType.FullName} when one already exists", methodReference); } // we need to import type when we Initialize Readers so import here in case it is used anywhere else TypeReference imported = Weaver.CurrentAssembly.MainModule.ImportReference(dataType); readFuncs[imported] = methodReference; }
public static void ProcessSyncVars(TypeDefinition td, List <FieldDefinition> syncVars, List <FieldDefinition> syncObjects, Dictionary <FieldDefinition, FieldDefinition> syncVarNetIds) { int numSyncVars = 0; // the mapping of dirtybits to sync-vars is implicit in the order of the fields here. this order is recorded in m_replacementProperties. // start assigning syncvars at the place the base class stopped, if any int dirtyBitCounter = Weaver.GetSyncVarStart(td.BaseType.FullName); syncVarNetIds.Clear(); // find syncvars foreach (FieldDefinition fd in td.Fields) { if (fd.HasCustomAttribute(Weaver.SyncVarType)) { if ((fd.Attributes & FieldAttributes.Static) != 0) { Weaver.Error($"{fd.Name} cannot be static", fd); return; } if (fd.FieldType.IsArray) { Weaver.Error($"{fd.Name} has invalid type. Use SyncLists instead of arrays", fd); return; } if (SyncObjectInitializer.ImplementsSyncObject(fd.FieldType)) { Weaver.Warning($"{fd.Name} has [SyncVar] attribute. SyncLists should not be marked with SyncVar", fd); } else { syncVars.Add(fd); ProcessSyncVar(td, fd, syncVarNetIds, 1L << dirtyBitCounter); dirtyBitCounter += 1; numSyncVars += 1; if (dirtyBitCounter == SyncVarLimit) { Weaver.Error($"{td.Name} has too many SyncVars. Consider refactoring your class into multiple components", td); return; } } } if (fd.FieldType.Resolve().ImplementsInterface(Weaver.SyncObjectType)) { if (fd.IsStatic) { Weaver.Error($"{fd.Name} cannot be static", fd); return; } if (fd.FieldType.Resolve().HasGenericParameters) { Weaver.Error($"Cannot use generic SyncObject {fd.Name} directly in NetworkBehaviour. Create a class and inherit from the generic SyncObject instead", fd); return; } syncObjects.Add(fd); } } // add all the new SyncVar __netId fields foreach (FieldDefinition fd in syncVarNetIds.Values) { td.Fields.Add(fd); } Weaver.SetNumSyncVars(td.FullName, numSyncVars); }