public static Map CreateFlatgrass( int width, int length, int height ) { Map map = new Map( width, length, height ); map.Blocks.MemSet( (byte)Block.Stone, 0, width*length*(height/2 - 5) ); map.Blocks.MemSet( (byte)Block.Dirt, width*length*(height/2 - 5), width*length*4 ); map.Blocks.MemSet( (byte)Block.Grass, width*length*(height/2 - 1), width*length ); if( Config.Physics ) { map.EnablePhysics(); } return map; }
public static Map CreateFlatgrass(int width, int length, int height) { Map map = new Map(width, length, height); map.Blocks.MemSet((byte)Block.Stone, 0, width * length * (height / 2 - 5)); map.Blocks.MemSet((byte)Block.Dirt, width * length * (height / 2 - 5), width * length * 4); map.Blocks.MemSet((byte)Block.Grass, width * length * (height / 2 - 1), width * length); if (Config.Physics) { map.EnablePhysics(); } return(map); }
public static Map Load([NotNull] string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } using (FileStream mapStream = File.OpenRead(fileName)) { using (GZipStream gs = new GZipStream(mapStream, CompressionMode.Decompress)) { BinaryReader bs = new BinaryReader(gs); // Read in the magic number if (bs.ReadUInt16() != 0x752) { throw new Exception("Could not load map (incorrect header)."); } // Read in the map dimensions int width = bs.ReadInt16(); int length = bs.ReadInt16(); int height = bs.ReadInt16(); Map map = new Map(width, length, height); // Read in the spawn location map.Spawn = new Position { X = (short)(bs.ReadInt16() * 32 + 16), Z = (short)(bs.ReadInt16() * 32 + 16), Y = (short)(bs.ReadInt16() * 32 + 16), R = bs.ReadByte(), L = bs.ReadByte(), }; // Write the VisitPermission and BuildPermission bytes ushort magic = bs.ReadUInt16(); bool isFemto = (magic == MagicNumber); // Read map data int bytesRead = 0; int bytesLeft = map.Blocks.Length; while (bytesLeft > 0) { int readPass = bs.Read(map.Blocks, bytesRead, bytesLeft); if (readPass == 0) { throw new EndOfStreamException(); } bytesRead += readPass; bytesLeft -= readPass; } if (!isFemto) { // Map custom MCSharp+ blocktypes to standard/presentation blocktypes map.ConvertBlockTypes(Mapping); } if (Config.Physics) { map.EnablePhysics(); } return(map); } } }
public static Map Load([NotNull] string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } using (FileStream mapStream = File.OpenRead(fileName)) { byte[] temp = new byte[8]; Map map = null; mapStream.Seek(-4, SeekOrigin.End); mapStream.Read(temp, 0, 4); mapStream.Seek(0, SeekOrigin.Begin); int uncompressedLength = BitConverter.ToInt32(temp, 0); byte[] data = new byte[uncompressedLength]; using (GZipStream reader = new GZipStream(mapStream, CompressionMode.Decompress, true)) { reader.Read(data, 0, uncompressedLength); } for (int i = 0; i < uncompressedLength - 1; i++) { if (data[i] != 0xAC || data[i + 1] != 0xED) { continue; } // bypassing the header crap int pointer = i + 6; Array.Copy(data, pointer, temp, 0, 2); pointer += IPAddress.HostToNetworkOrder(BitConverter.ToInt16(temp, 0)); pointer += 13; int headerEnd; // find the end of serialization listing for (headerEnd = pointer; headerEnd < data.Length - 1; headerEnd++) { if (data[headerEnd] == 0x78 && data[headerEnd + 1] == 0x70) { headerEnd += 2; break; } } // start parsing serialization listing int offset = 0; int width = 0, length = 0, height = 0; Position spawn = new Position(); while (pointer < headerEnd) { switch ((char)data[pointer]) { case 'Z': offset++; break; case 'F': case 'I': offset += 4; break; case 'J': offset += 8; break; } pointer += 1; Array.Copy(data, pointer, temp, 0, 2); short skip = IPAddress.HostToNetworkOrder(BitConverter.ToInt16(temp, 0)); pointer += 2; // look for relevant variables Array.Copy(data, headerEnd + offset - 4, temp, 0, 4); if (MemCmp(data, pointer, "width")) { width = (ushort)IPAddress.HostToNetworkOrder(BitConverter.ToInt32(temp, 0)); } else if (MemCmp(data, pointer, "depth")) { height = (ushort)IPAddress.HostToNetworkOrder(BitConverter.ToInt32(temp, 0)); } else if (MemCmp(data, pointer, "height")) { length = (ushort)IPAddress.HostToNetworkOrder(BitConverter.ToInt32(temp, 0)); } else if (MemCmp(data, pointer, "xSpawn")) { spawn.X = (short)(IPAddress.HostToNetworkOrder(BitConverter.ToInt32(temp, 0)) * 32 + 16); } else if (MemCmp(data, pointer, "ySpawn")) { spawn.Z = (short)(IPAddress.HostToNetworkOrder(BitConverter.ToInt32(temp, 0)) * 32 + 16); } else if (MemCmp(data, pointer, "zSpawn")) { spawn.Y = (short)(IPAddress.HostToNetworkOrder(BitConverter.ToInt32(temp, 0)) * 32 + 16); } pointer += skip; } map = new Map(width, length, height) { Spawn = spawn }; // find the start of the block array bool foundBlockArray = false; offset = Array.IndexOf <byte>(data, 0x00, headerEnd); while (offset != -1 && offset < data.Length - 2) { if (data[offset] == 0x00 && data[offset + 1] == 0x78 && data[offset + 2] == 0x70) { foundBlockArray = true; pointer = offset + 7; } offset = Array.IndexOf <byte>(data, 0x00, offset + 1); } // copy the block array... or fail if (!foundBlockArray) { throw new Exception("DatMapConverter: Could not locate block array."); } Array.Copy(data, pointer, map.Blocks, 0, map.Blocks.Length); // Map survivaltest/indev blocktypes to standard/presentation blocktypes map.ConvertBlockTypes(Mapping); if (Config.Physics) { map.EnablePhysics(); } break; } if (map == null) { throw new Exception("DatMapConverter: Error loading map."); } return(map); } }
public static Map Load( [NotNull] string fileName ) { if( fileName == null ) throw new ArgumentNullException( "fileName" ); using( FileStream mapStream = File.OpenRead( fileName ) ) { byte[] temp = new byte[8]; Map map = null; mapStream.Seek( -4, SeekOrigin.End ); mapStream.Read( temp, 0, 4 ); mapStream.Seek( 0, SeekOrigin.Begin ); int uncompressedLength = BitConverter.ToInt32( temp, 0 ); byte[] data = new byte[uncompressedLength]; using( GZipStream reader = new GZipStream( mapStream, CompressionMode.Decompress, true ) ) { reader.Read( data, 0, uncompressedLength ); } for( int i = 0; i < uncompressedLength - 1; i++ ) { if( data[i] != 0xAC || data[i + 1] != 0xED ) continue; // bypassing the header crap int pointer = i + 6; Array.Copy( data, pointer, temp, 0, 2 ); pointer += IPAddress.HostToNetworkOrder( BitConverter.ToInt16( temp, 0 ) ); pointer += 13; int headerEnd; // find the end of serialization listing for( headerEnd = pointer; headerEnd < data.Length - 1; headerEnd++ ) { if( data[headerEnd] == 0x78 && data[headerEnd + 1] == 0x70 ) { headerEnd += 2; break; } } // start parsing serialization listing int offset = 0; int width = 0, length = 0, height = 0; Position spawn = new Position(); while( pointer < headerEnd ) { switch( (char)data[pointer] ) { case 'Z': offset++; break; case 'F': case 'I': offset += 4; break; case 'J': offset += 8; break; } pointer += 1; Array.Copy( data, pointer, temp, 0, 2 ); short skip = IPAddress.HostToNetworkOrder( BitConverter.ToInt16( temp, 0 ) ); pointer += 2; // look for relevant variables Array.Copy( data, headerEnd + offset - 4, temp, 0, 4 ); if( MemCmp( data, pointer, "width" ) ) { width = (ushort)IPAddress.HostToNetworkOrder( BitConverter.ToInt32( temp, 0 ) ); } else if( MemCmp( data, pointer, "depth" ) ) { height = (ushort)IPAddress.HostToNetworkOrder( BitConverter.ToInt32( temp, 0 ) ); } else if( MemCmp( data, pointer, "height" ) ) { length = (ushort)IPAddress.HostToNetworkOrder( BitConverter.ToInt32( temp, 0 ) ); } else if( MemCmp( data, pointer, "xSpawn" ) ) { spawn.X = (short)(IPAddress.HostToNetworkOrder( BitConverter.ToInt32( temp, 0 ) )*32 + 16); } else if( MemCmp( data, pointer, "ySpawn" ) ) { spawn.Z = (short)(IPAddress.HostToNetworkOrder( BitConverter.ToInt32( temp, 0 ) )*32 + 16); } else if( MemCmp( data, pointer, "zSpawn" ) ) { spawn.Y = (short)(IPAddress.HostToNetworkOrder( BitConverter.ToInt32( temp, 0 ) )*32 + 16); } pointer += skip; } map = new Map( width, length, height ) { Spawn = spawn }; // find the start of the block array bool foundBlockArray = false; offset = Array.IndexOf<byte>( data, 0x00, headerEnd ); while( offset != -1 && offset < data.Length - 2 ) { if( data[offset] == 0x00 && data[offset + 1] == 0x78 && data[offset + 2] == 0x70 ) { foundBlockArray = true; pointer = offset + 7; } offset = Array.IndexOf<byte>( data, 0x00, offset + 1 ); } // copy the block array... or fail if( !foundBlockArray ) { throw new Exception( "DatMapConverter: Could not locate block array." ); } Array.Copy( data, pointer, map.Blocks, 0, map.Blocks.Length ); // Map survivaltest/indev blocktypes to standard/presentation blocktypes map.ConvertBlockTypes( Mapping ); if( Config.Physics ) map.EnablePhysics(); break; } if( map == null ) { throw new Exception( "DatMapConverter: Error loading map." ); } return map; } }
public static Map Load( [NotNull] string fileName ) { if( fileName == null ) throw new ArgumentNullException( "fileName" ); using( FileStream mapStream = File.OpenRead( fileName ) ) { using( GZipStream gs = new GZipStream( mapStream, CompressionMode.Decompress ) ) { BinaryReader bs = new BinaryReader( gs ); // Read in the magic number if( bs.ReadUInt16() != 0x752 ) { throw new Exception( "Could not load map (incorrect header)." ); } // Read in the map dimensions int width = bs.ReadInt16(); int length = bs.ReadInt16(); int height = bs.ReadInt16(); Map map = new Map( width, length, height ); // Read in the spawn location map.Spawn = new Position { X = (short)( bs.ReadInt16() * 32 + 16 ), Z = (short)( bs.ReadInt16() * 32 + 16 ), Y = (short)( bs.ReadInt16() * 32 + 16 ), R = bs.ReadByte(), L = bs.ReadByte(), }; // Write the VisitPermission and BuildPermission bytes ushort magic = bs.ReadUInt16(); bool isFemto = (magic == MagicNumber); // Read map data int bytesRead = 0; int bytesLeft = map.Blocks.Length; while( bytesLeft > 0 ) { int readPass = bs.Read( map.Blocks, bytesRead, bytesLeft ); if( readPass == 0 ) throw new EndOfStreamException(); bytesRead += readPass; bytesLeft -= readPass; } if( !isFemto ) { // Map custom MCSharp+ blocktypes to standard/presentation blocktypes map.ConvertBlockTypes( Mapping ); } if( Config.Physics ) map.EnablePhysics(); return map; } } }