Example #1
0
        public static void SerializeNetworkedGameState(
            BinaryWriter writer, NetworkedGameState networkedGameState, NetworkedGameState oldNetworkedGameState
            )
        {
            for (var i = 0; i < networkedGameState.NetworkedComponentInfoLists.Count; i++)
            {
                var networkedComponentTypeInfo = networkedGameState.NetworkedComponentTypeInfos[i];
                var componentInfos             = networkedGameState.NetworkedComponentInfoLists[i];
                var oldComponentInfos          = oldNetworkedGameState.NetworkedComponentInfoLists[i];

                Serialize(writer, componentInfos, (binaryWriter, componentInfo, index) =>
                {
                    var componentStateId = NetLib.GetIdFromState(networkedComponentTypeInfo, componentInfo.ComponentState);
                    binaryWriter.Write(componentStateId);

                    var oldComponentInfoIndex = oldComponentInfos
                                                .FindIndex(oci =>
                                                           NetLib.GetIdFromState(networkedComponentTypeInfo, oci.ComponentState) == componentStateId
                                                           );
                    var oldComponentState = (oldComponentInfoIndex >= 0)
                        ? oldComponentInfos[oldComponentInfoIndex].ComponentState
                        : null;

                    var changeMask = GetChangeMask(networkedComponentTypeInfo, componentInfo.ComponentState, oldComponentState);
                    binaryWriter.Write(changeMask);

                    SerializeGivenChangeMask(
                        binaryWriter, networkedComponentTypeInfo, componentInfo.ComponentState, changeMask
                        );
                });
            }
        }
Example #2
0
        public static NetworkedGameState DeserializeNetworkedGameState(
            BinaryReader reader, uint sequenceNumber, NetworkedGameState networkedGameStateRelativeTo
            )
        {
            var networkedComponentTypeInfos = networkedGameStateRelativeTo.NetworkedComponentTypeInfos;
            var networkedComponentInfoLists = networkedComponentTypeInfos
                                              .Select((networkedComponentTypeInfo, networkedComponentTypeInfosIndex) =>
            {
                var oldComponentInfos = networkedGameStateRelativeTo
                                        .NetworkedComponentInfoLists[networkedComponentTypeInfosIndex];
                var componentInfos = new List <NetworkedComponentInfo>();

                Deserialize(reader, componentInfos, (binaryReader, componentInfoIndex) =>
                {
                    var componentStateId = reader.ReadUInt32();

                    var oldComponentInfoIndex = oldComponentInfos
                                                .FindIndex(oci =>
                                                           NetLib.GetIdFromState(networkedComponentTypeInfo, oci.ComponentState) == componentStateId
                                                           );
                    NetworkedComponentInfo oldComponentInfo;

                    if (oldComponentInfoIndex < 0)
                    {
                        var stateType    = networkedComponentTypeInfo.StateType;
                        oldComponentInfo = new NetworkedComponentInfo
                        {
                            ComponentState = Activator.CreateInstance(stateType)
                        };
                    }
                    else
                    {
                        oldComponentInfo = oldComponentInfos[oldComponentInfoIndex];
                        oldComponentInfo = new NetworkedComponentInfo
                        {
                            ComponentState = ObjectExtensions.DeepCopy(oldComponentInfo.ComponentState)
                        };
                    }

                    DeserializeDelta(
                        binaryReader, networkedComponentTypeInfo, ref oldComponentInfo
                        );
                    return(oldComponentInfo);
                });

                return(componentInfos);
            })
                                              .ToList();

            return(new NetworkedGameState
            {
                SequenceNumber = sequenceNumber,
                NetworkedComponentTypeInfos = networkedComponentTypeInfos,
                NetworkedComponentInfoLists = networkedComponentInfoLists
            });
        }