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