Esempio n. 1
0
        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()));
         }
     }
 }
Esempio n. 3
0
        /// <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);
                }
            }
        }