protected override void ProcessForwardHostData(byte[] data) { // [8: CMD] [8:seq] [16: SessionID] [4: UserID] [12: SessionSecret] UserConn[0].LastResponse = MonoSAMGame.CurrentTime.TotalElapsedSeconds; bool err = false; using (BinaryReader reader = new BinaryReader(new MemoryStream(data))) { reader.ReadByte(); // CMD reader.ReadByte(); // SEQ reader.ReadByte(); // SID reader.ReadByte(); // SID reader.ReadByte(); // SSC reader.ReadByte(); // SSC LevelID = new Guid(reader.ReadBytes(16)); var bspeed = reader.ReadByte(); MusicIndex = reader.ReadByte(); ServerGameVersion = reader.ReadUInt64(); ServerLevelHash = reader.ReadUInt64(); if (ServerGameVersion == GDConstants.IntVersion) { Speed = GameSpeedModeHelper.FromByte(bspeed); if (bspeed != 0x70 && bspeed != 0x78 && bspeed != 0x80 && bspeed != 0x88 && bspeed != 0x90) { err = true; } if (MusicIndex > MainGame.Inst.GDSound.LevelMusic.Length) { err = true; } } } if (ServerGameVersion != GDConstants.IntVersion) { ErrorStop(ErrorType.GameVersionMismatch, null); return; } if (err) { SAMLog.Error("SNSC::PFHD", "data error\r\nData:\n" + ByteUtils.CompressBytesForStorage(data)); } RecieveMsg(0, data[1]); LevelBlueprint blueprint; if (!Levels.LEVELS.TryGetValue(LevelID.Value, out blueprint)) { LevelID = null; } }
public byte[] GetLobbySyncData() { using (var ms = new MemoryStream()) using (var bw = new BinaryWriter(ms)) { bw.Write(LevelID.ToByteArray()); bw.Write(GameSpeedModeHelper.ToByte(Speed)); bw.Write((byte)MusicIndex); bw.Write(GDConstants.IntVersion); bw.Write(Levels.LEVELS[LevelID].CalcCheckSum()); return(ms.ToArray()); } }
protected override void ProcessForwardLobbySync(byte[] data) { // [8: CMD] [8:seq] [16: SessionID] [4: UserID] [12: SessionSecret] UserConn[0].LastResponse = MonoSAMGame.CurrentTime.TotalElapsedSeconds; var err = false; using (BinaryReader reader = new BinaryReader(new MemoryStream(data))) { reader.ReadByte(); // CMD reader.ReadByte(); // SEQ reader.ReadByte(); // SID reader.ReadByte(); // SID reader.ReadByte(); // SSC reader.ReadByte(); // SSC LevelID = new Guid(reader.ReadBytes(16)); var bspeed = reader.ReadByte(); MusicIndex = reader.ReadByte(); ServerGameVersion = reader.ReadUInt64(); ServerLevelHash = reader.ReadUInt64(); if (ServerGameVersion == GDConstants.IntVersion) { Speed = GameSpeedModeHelper.FromByte(bspeed); if (bspeed != 0x70 && bspeed != 0x78 && bspeed != 0x80 && bspeed != 0x88 && bspeed != 0x90) { err = true; } if (MusicIndex > MainGame.Inst.GDSound.LevelMusic.Length) { err = true; } } } if (err) { SAMLog.Error("SNSC::PFLS", "data error\r\nData:\n" + ByteUtils.CompressBytesForStorage(data)); } SAMLog.Debug($"[[CMD_FORWARDLOBBYSYNC]]: {LevelID} | {Speed} | {MusicIndex}"); if (ServerGameVersion != GDConstants.IntVersion) { ErrorStop(ErrorType.GameVersionMismatch, null); return; } LevelBlueprint blueprint; if (!Levels.LEVELS.TryGetValue(LevelID.Value, out blueprint)) { ErrorStop(ErrorType.LevelNotFound, null); SAMLog.Error("GDMC::LNF", "ProcessForwardLobbySync -> LevelNotFound: " + LevelID + "\r\nData:\n" + ByteUtils.CompressBytesForStorage(data)); return; } var correctCS = blueprint.CalcCheckSum(); if (ServerLevelHash != correctCS) { ErrorStop(ErrorType.LevelVersionMismatch, null); SAMLog.Error("GDMC::LVM", "ProcessForwardLobbySync -> LevelVersionMismatch: " + ServerLevelHash + " <> " + correctCS + "\r\nData:\n" + ByteUtils.CompressBytesForStorage(data)); return; } RecieveMsg(0, data[1]); byte[] answer = new byte[8]; answer[0] = ANS_FORWARDLOBBYSYNC; SetSequenceCounter(ref answer[1]); answer[2] = (byte)((SessionID >> 8) & 0xFF); answer[3] = (byte)(SessionID & 0xFF); answer[4] = (byte)(((SessionUserID & 0xF) << 4) | ((SessionSecret >> 8) & 0x0F)); answer[5] = (byte)(SessionSecret & 0xFF); answer[6] = (byte)SessionUserID; Send(answer); }