public PrecompiledPacket(List<PacketFromServer> packets) { if (packets.Count == 0) throw new ArgumentException("Empty list"); using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(EndianBitConverter.Big, ms)) { foreach (var m in packets) { //Buffer to memory stream if (m.PacketBuffer == null) m.Prepare(); Packet.WriteVarInt(w, m.PacketBuffer.Length); w.Write(m.PacketBuffer); } w.Flush(); SetPacketBuffer(ms.ToArray()); } if (PacketBuffer.Length == 0) throw new ArgumentException("Empty compiled packet"); }
public static void PackSng(Stream input, Stream output, Platform platform) { EndianBitConverter conv = platform.GetBitConverter; Int32 platformHeader = (conv == EndianBitConverter.Big)? 1 : 3; using( var w = new EndianBinaryWriter(conv, output) ) using( var zData = new MemoryStream() ) using( var plain = new MemoryStream() ) using( var encrypted = new MemoryStream() ) using( var encw = new EndianBinaryWriter(conv, plain) ) { w.Write((Int32) 0x4A); w.Write(platformHeader); // pack with zlib TODO: better packing required! RijndaelEncryptor.Zip(input, zData, input.Length); if (platformHeader == 3) { // write size of uncompressed data and packed data itself | already there encw.Write((Int32)input.Length); encw.Write(zData.GetBuffer()); encw.Flush(); // choose key byte[] key; switch (platform.platform) { case GamePlatform.Mac: key = RijndaelEncryptor.SngKeyMac; break; default: //PC key = RijndaelEncryptor.SngKeyPC; break; } // encrypt (writes 16B IV and encrypted data) plain.Position = 0; RijndaelEncryptor.EncryptSngData(plain, encrypted, key); w.Write(encrypted.GetBuffer()); w.Write(new Byte[56]); // append zero signature } else { // unencrypted and unsigned w.Write((Int32)input.Length); w.Write(zData.GetBuffer()); } output.Flush(); } }
public MemoryStream CopyStruct(object obj) { EndianBitConverter conv = EndianBitConverter.Little; MemoryStream data = new MemoryStream(); var w = new EndianBinaryWriter(conv, data); bool mode = this.consoleMode; this.consoleMode = false; writeStruct(w, obj); this.consoleMode = mode; w.Flush(); data.Position = 0; return data; }
public static string GenerateSoundBank(string soundbankName, Stream audioStream, Stream outStream, float volume, Platform platform) { string eventName = PLAY + soundbankName; string previewName = PLAY30SEC + soundbankName; string bankName = SONG + soundbankName; var id = RandomGenerator.NextInt(); byte[] soundbank = null; switch (platform.version) { case GameVersion.RS2012: switch (platform.platform) { case GamePlatform.Pc: soundbank = Resources.PC_soundbank; break; case GamePlatform.XBox360: case GamePlatform.PS3: soundbank = Resources.Console_soundbank; break; default: throw new InvalidOperationException("Unexpected game platform value"); } break; default: throw new InvalidOperationException("Unexpected game version value"); } var bitConverter = platform.GetBitConverter; using (var bankStream = new MemoryStream(soundbank)) using (var bankReader = new EndianBinaryReader(bitConverter, bankStream)) { var audioReader = new EndianBinaryReader(bitConverter, audioStream); var bankWriter = new EndianBinaryWriter(bitConverter, outStream); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[0])); bankReader.ReadInt32(); bankWriter.Write(id); bankWriter.Write(bankReader.ReadInt32()); int dataSize = bankReader.ReadInt32(); bankWriter.Write(dataSize); bankWriter.Write(bankReader.ReadInt32()); bankWriter.Write(bankReader.ReadInt32()); bankWriter.Write(audioReader.ReadBytes(dataSize)); bankReader.BaseStream.Seek(dataSize, SeekOrigin.Current); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[1])); bankWriter.Write(id); bankWriter.Write(id); bankReader.BaseStream.Seek(8, SeekOrigin.Current); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[2])); bankWriter.Write((float)volume); bankReader.ReadInt32(); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[3])); bankReader.ReadInt32(); bankWriter.Write(HashString(eventName)); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[4])); bankReader.ReadInt32(); bankWriter.Write(HashString(previewName)); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[5])); bankWriter.Write(12 + bankName.Length + 1); bankReader.ReadInt32(); bankWriter.Write(bankReader.ReadBytes(platform.GetOffsets()[6])); bankWriter.Write((byte)bankName.Length); bankWriter.Write(Encoding.ASCII.GetBytes(bankName)); bankWriter.Flush(); } return id.ToString(); }
public static string GenerateSoundBank(string soundbankName, Stream audioStream, Stream outStream, float volume, Platform platform, bool preview = false, bool same = false) { bitConverter = platform.GetBitConverter; int soundbankID = RandomGenerator.NextInt(); int fileID = same ? oldFileID : RandomGenerator.NextInt(); int soundID = same ? oldSoundID : RandomGenerator.NextInt(); oldSoundID = soundID; oldFileID = fileID; var audioReader = new EndianBinaryReader(bitConverter, audioStream); byte[] dataChunk = audioReader.ReadBytes(51200); // wwise is based on audio length, we'll just make it up(prefethc lookup is 100ms) byte[] dataIndexChunk = DataIndex(fileID, dataChunk.Length); byte[] headerChunk = Header(soundbankID, dataIndexChunk.Length, platform.IsConsole); byte[] stringIdChunk = StringID(soundbankID, soundbankName); byte[] hierarchyChunk = Hierarchy(soundbankID, soundID, fileID, soundbankName, volume, preview, platform.IsConsole); var bankWriter = new EndianBinaryWriter(bitConverter, outStream); WriteChunk(bankWriter, "BKHD", headerChunk); WriteChunk(bankWriter, "DIDX", dataIndexChunk); WriteChunk(bankWriter, "DATA", dataChunk); WriteChunk(bankWriter, "HIRC", hierarchyChunk); WriteChunk(bankWriter, "STID", stringIdChunk); //Flush bankWriter.Flush(); audioStream.Flush(); outStream.Flush(); audioStream.Position = 0; outStream.Position = 0; return fileID.ToString(); }
public static void PackSng(Stream input, Stream output, Platform platform) { EndianBitConverter conv; Int32 platformHeader; switch (platform.platform) { case GamePlatform.Pc: case GamePlatform.Mac: // Desktop conv = EndianBitConverter.Little; platformHeader = 3; break; case GamePlatform.XBox360: case GamePlatform.PS3: // Console conv = EndianBitConverter.Big; platformHeader = 1; break; default: conv = EndianBitConverter.Little; platformHeader = 3; break; } using (EndianBinaryWriter w = new EndianBinaryWriter(conv, output)) { w.Write((Int32) 0x4A); w.Write(platformHeader); byte[] inputChartData = null; using (var mStream = new MemoryStream()) { input.CopyTo(mStream); inputChartData = mStream.ToArray(); } // pack with zlib MemoryStream zData = new MemoryStream(); ZOutputStream zOut = new ZOutputStream(zData, zlib.zlibConst.Z_BEST_COMPRESSION); zOut.Write(inputChartData, 0, inputChartData.Length); zOut.finish(); byte[] packed = zData.ToArray(); if (platformHeader == 3) { MemoryStream encrypted = new MemoryStream(); MemoryStream plain = new MemoryStream(); var encw = new EndianBinaryWriter(conv, plain); // write size of uncompressed data and packed data itself encw.Write((Int32)inputChartData.Length); encw.Write(packed); encw.Flush(); MemoryStream inputPlainStream = new MemoryStream(plain.ToArray()); // choose key byte[] key; switch (platform.platform) { case GamePlatform.Mac: key = RijndaelEncryptor.SngKeyMac; break; default: //PC key = RijndaelEncryptor.SngKeyPC; break; } // encrypt (writes 16B IV and encrypted data) RijndaelEncryptor.EncryptSngData(inputPlainStream, encrypted, key); w.Write(encrypted.ToArray()); // append zero signature w.Write(new Byte[56]); } else { // unencrypted and unsigned w.Write((Int32)inputChartData.Length); w.Write(packed); } output.Flush(); } }
public void MakeACO(string folder) { MemoryStream memory = new MemoryStream(); EndianBinaryWriter bwriterWriter = new EndianBinaryWriter(EndianBitConverter.Big,memory); const UInt16 separator = 0; UInt16 sectionCounter = 0; var colorlist = ColorArea.AllColors().ToList(); UInt16 numberOfColors = UInt16.Parse(colorlist.Count.ToString()); sectionCounter++; using (memory) { using (bwriterWriter) { bwriterWriter.Write(sectionCounter); bwriterWriter.Write(numberOfColors); // write the number of colors foreach (Color color in colorlist) { ColorStructureWriter(bwriterWriter, color); } sectionCounter++; bwriterWriter.Write(sectionCounter); bwriterWriter.Write(numberOfColors); var encoding = new UnicodeEncoding(true,true,true); foreach (var color in colorlist) { ColorStructureWriter(bwriterWriter,color); var tmpcol = ColorArea.List.FirstOrDefault(c => c.Color == color); var bytes = (encoding.GetBytes(tmpcol.Name)); bwriterWriter.Write((ushort)tmpcol.Name.Length+1); bwriterWriter.Write(bytes); bwriterWriter.Write((ushort)0); } bwriterWriter.Flush(); using (FileStream output = new FileStream(Path.Combine(folder, "palette.ACO"), FileMode.Create)) { memory.WriteTo(output); } } } }