Ejemplo n.º 1
0
        /// Process our settings
        private void ProcessSettingsForMember(MDReplicatedMember ReplicatedMember, MDReplicatedSetting[] Settings)
        {
            foreach (MDReplicatedSetting setting in Settings)
            {
                switch ((Settings)setting.Key)
                {
                case MDReplicator.Settings.ProcessWhilePaused:
                    ReplicatedMember.ProcessWhilePaused = (bool)setting.Value;
                    break;

                case MDReplicator.Settings.GroupName:
                    ReplicatedMember.ReplicationGroup = setting.Value.ToString();
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Removes the replicated member from any groups it is in
        /// </summary>
        /// <param name="Member">The member to remove</param>
        public void RemoveReplicatedMember(MDReplicatedMember Member)
        {
            if (Member.GetReplicatedType() != MDReplicatedType.Interval)
            {
                return;
            }

            foreach (HashSet <MDReplicatedMember> group in ReplicationGroups)
            {
                if (group.Contains(Member))
                {
                    group.Remove(Member);
                    break;
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Apply the buffer to a member if it exists
        /// </summary>
        /// <param name="ID">The ID to check the buffer for</param>
        /// <param name="Member">The member to apply this buffer to</param>
        public void CheckBuffer(uint ID, MDReplicatedMember Member)
        {
            if (!ClockedValueBuffer.ContainsKey(ID))
            {
                return;
            }

            Dictionary <uint, object[]> buffer = GetBufferForId(ID);

            foreach (uint tick in buffer.Keys)
            {
                object[] value = buffer[tick];
                MDLog.Trace(LOG_CAT, $"Updating value to {MDStatics.GetParametersAsString(value)} for {ID} on tick {tick}");
                Member.SetValues(tick, value);
            }

            buffer.Clear();
            ClockedValueBuffer.Remove(ID);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Adds a replicated member to the group manager
        /// </summary>
        /// <param name="Member">The member to add</param>
        public void AddReplicatedMember(MDReplicatedMember Member)
        {
            if (Member.GetReplicatedType() != MDReplicatedType.Interval)
            {
                return;
            }

            int Group = -1;

            if (Member.ReplicationGroup != null)
            {
                Group = GetReplicationGroupByName(Member.ReplicationGroup);
            }
            else
            {
                Group = GetGroupWithLeastMembers();
            }

            ReplicationGroups[Group].Add(Member);
        }
Ejemplo n.º 5
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);
                }
            }
        }