public static void PopulateBindNodes(Node Instance) { List <MemberInfo> Members = MDStatics.GetTypeMemberInfos(Instance); foreach (MemberInfo Member in Members) { MDBindNode BindAttr = Member.GetCustomAttribute(typeof(MDBindNode)) as MDBindNode; if (BindAttr == null) { continue; } Type MemberType = null; FieldInfo Field = Member as FieldInfo; PropertyInfo Property = Member as PropertyInfo; if (Field != null) { MemberType = Field.FieldType; } else if (Property != null) { MemberType = Property.PropertyType; } if (!MDStatics.IsSameOrSubclass(MemberType, typeof(Node))) { MDLog.Error(LOG_CAT, $"Not Node-Type field [{Member.Name}] on Node {Instance.Name} with Type [{Instance.GetType().Name}] was marked with [MDBindNode()]"); continue; } string PathToNode = BindAttr.GetNodePath(Member.Name); Node BoundNode = FindNode(Instance, PathToNode); if (BoundNode == null) { continue; } if (Field != null) { Field.SetValue(Instance, BoundNode); } else if (Property != null) { Property.SetValue(Instance, BoundNode); } } }
private void ExtractMembers() { if (Members == null) { Members = new List <MemberInfo>(); DataConverters = new List <IMDDataConverter>(); List <MemberInfo> MemberInfos = MDStatics.GetTypeMemberInfos(typeof(T)); foreach (MemberInfo Member in MemberInfos) { MDReplicated RepAttribute = Member.GetCustomAttribute(typeof(MDReplicated)) as MDReplicated; if (RepAttribute == null) { continue; } Members.Add(Member); DataConverters.Add(MDStatics.GetConverterForType(Member.GetUnderlyingType())); } } }
/// <summary> /// Registers the given instance's fields marked with [MDReplicated()] /// </summary> /// <param name="Instance">The node to register</param> public void RegisterReplication(Node Instance) { List <MemberInfo> Members = MDStatics.GetTypeMemberInfos(Instance); List <MDReplicatedMember> NodeMembers = new List <MDReplicatedMember>(); foreach (MemberInfo Member in Members) { MDReplicated RepAttribute = Member.GetCustomAttribute(typeof(MDReplicated)) as MDReplicated; if (RepAttribute == null) { continue; } MDReplicatedSetting[] Settings = GetSettings(Member); MDReplicatedMember NodeMember = CreateReplicatedMember(Member, RepAttribute, Instance, Settings); NodeMembers.Add(NodeMember); ProcessSettingsForMember(NodeMember, ParseParameters(typeof(Settings), Settings)); GroupManager.AddReplicatedMember(NodeMember); MDLog.Debug(LOG_CAT, $"Adding Replicated Node {Instance.Name} Member {Member.Name}"); if (HasRPCModeSet(Member) == false) { Instance.RsetConfig(Member.Name, MultiplayerAPI.RPCMode.Puppet); } } if (NodeMembers.Count > 0) { NodeList.Add(new ReplicatedNode(Instance, NodeMembers)); List <object> networkIdUpdates = new List <object>(); foreach (MDReplicatedMember member in NodeMembers) { string MemberUniqueKey = member.GetUniqueKey(); KeyToMemberMap.Add(MemberUniqueKey, member); // Check if we have a buffer waiting for this member if (NetworkIdKeyMap.ContainsKey(MemberUniqueKey)) { NetworkIdKeyMap.CheckBuffer(NetworkIdKeyMap.GetValue(MemberUniqueKey), member); } if (MDStatics.IsServer()) { if (!NetworkIdKeyMap.ContainsKey(member.GetUniqueKey())) { uint networkid = GetReplicationId(); MDLog.Trace(LOG_CAT, $"Adding NetworkIdKeyMap key [{member.GetUniqueKey()}] with id [{networkid}]"); NetworkIdKeyMap.AddNetworkKeyIdPair(networkid, member.GetUniqueKey()); NetworkIdKeyMap.CheckBuffer(networkid, member); networkIdUpdates.Add(networkid); networkIdUpdates.Add(member.GetUniqueKey()); } } } if (MDStatics.IsNetworkActive() && networkIdUpdates.Count > 0) { Rpc(nameof(UpdateNetworkIdMap), networkIdUpdates); } } }