/// 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; } } }
/// <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; } } }
/// <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); }
/// <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); }
/// <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); } } }