bool IsValidSyncVar(FieldDefinition field) { if (!field.HasCustomAttribute <SyncVarAttribute>()) { return(false); } if (field.FieldType.IsGenericParameter) { throw new SyncVarException($"{field.Name} cannot be synced since it's a generic parameter", field); } if ((field.Attributes & FieldAttributes.Static) != 0) { throw new SyncVarException($"{field.Name} cannot be static", field); } if (field.FieldType.IsArray) { // todo should arrays really be blocked? throw new SyncVarException($"{field.Name} has invalid type. Use SyncLists instead of arrays", field); } if (SyncObjectProcessor.ImplementsSyncObject(field.FieldType)) { throw new SyncVarException($"{field.Name} has [SyncVar] attribute. ISyncObject should not be marked with SyncVar", field); } return(true); }
public NetworkBehaviourProcessor(TypeDefinition td, Readers readers, Writers writers, PropertySiteProcessor propertySiteProcessor, IWeaverLogger logger) { Weaver.DebugLog(td, "NetworkBehaviourProcessor"); netBehaviourSubclass = td; this.logger = logger; serverRpcProcessor = new ServerRpcProcessor(netBehaviourSubclass.Module, readers, writers, logger); clientRpcProcessor = new ClientRpcProcessor(netBehaviourSubclass.Module, readers, writers, logger); syncVarProcessor = new SyncVarProcessor(netBehaviourSubclass.Module, readers, writers, propertySiteProcessor); syncObjectProcessor = new SyncObjectProcessor(readers, writers, logger); }
public NetworkBehaviourProcessor(TypeDefinition td, Readers readers, Writers writers, PropertySiteProcessor propertySiteProcessor, IWeaverLogger logger) { Weaver.DebugLog(td, "NetworkBehaviourProcessor"); netBehaviourSubclass = td; this.logger = logger; serverRpcProcessor = new ServerRpcProcessor(netBehaviourSubclass.Module, readers, writers, logger); clientRpcProcessor = new ClientRpcProcessor(netBehaviourSubclass.Module, readers, writers, logger); syncVarProcessor = new SyncVarProcessor(netBehaviourSubclass.Module, readers, writers, propertySiteProcessor); syncObjectProcessor = new SyncObjectProcessor(readers, writers, logger); // no max for rpcs, index is sent as var int, so more rpc just means bigger header size (still smaller than 4 byte hash) rpcCounter = new ConstFieldTracker("RPC_COUNT", td, int.MaxValue, "Rpc"); }
/// <summary> /// Check if Syncvar or SyncObject are used outside of NetworkBehaviour /// </summary> /// <param name="fd"></param> /// <param name="foundType"></param> void ProcessFields(FieldDefinition fd, FoundType foundType) { if (fd.HasCustomAttribute <SyncVarAttribute>()) { logger.Error($"SyncVar {fd.Name} must be inside a NetworkBehaviour. {foundType.TypeDefinition.Name} is not a NetworkBehaviour", fd); } // only check SyncObjects inside Monobehaviours if (foundType.IsMonoBehaviour && SyncObjectProcessor.ImplementsSyncObject(fd.FieldType)) { logger.Error($"{fd.Name} is a SyncObject and can not be used inside Monobehaviour. {foundType.TypeDefinition.Name} is not a NetworkBehaviour", fd); } }
void ProcessSyncVars(TypeDefinition td) { // find syncvars foreach (FieldDefinition fd in td.Fields) { if (fd.HasCustomAttribute <SyncVarAttribute>()) { logger.Error($"SyncVar {fd.Name} must be inside a NetworkBehaviour. {td.Name} is not a NetworkBehaviour", fd); } if (SyncObjectProcessor.ImplementsSyncObject(fd.FieldType)) { logger.Error($"{fd.Name} is a SyncObject and must be inside a NetworkBehaviour. {td.Name} is not a NetworkBehaviour", fd); } } }