private static void SendVoxelData( ulong steamId, IMyEntity voxel ) { try { IMyVoxelMap voxelMap = (IMyVoxelMap)voxel; byte[ ] voxelData; voxelMap.Storage.Save( out voxelData ); VoxelHeaderData header = new VoxelHeaderData( ); header.EntityId = voxel.EntityId; header.HalfExtent = voxelMap.Storage.Size / 2; header.Position = voxel.GetPosition( ); header.Name = voxelMap.StorageName; header.DataLength = voxelData.Length; string headerString = MyAPIGateway.Utilities.SerializeToXML<VoxelHeaderData>( header ); ushort length = (ushort)headerString.Length; byte[ ] headerData = new byte[ 2 + headerString.Length ]; headerData[ 0 ] = (byte)length; headerData[ 1 ] = (byte)( length >> 8 ); for ( int r = 0; r < headerString.Length; r++ ) { headerData[ r + 2 ] = (byte)headerString[ r ]; } Essentials.Log.Debug( "Sending Voxel Header Data: {0} / {1} - {2} ({3})", voxelData.Length, headerData.Length, steamId, voxel.GetPosition( ) ); Communication.SendDataMessage( steamId, 5001, headerData ); int blockSize = 4096; for ( ushort r = 0; r < ( voxelData.Length / blockSize ) + 1; r++ ) { int partLength = voxelData.Length - ( r * blockSize ); if ( partLength > blockSize ) partLength = blockSize; byte[ ] outData = new byte[ partLength + 12 ]; for ( int s = 0; s < 8; s++ ) outData[ s ] = (byte)( header.EntityId >> ( s * 8 ) ); for ( int s = 0; s < 2; s++ ) outData[ s + 8 ] = (byte)( partLength >> ( s * 8 ) ); for ( int s = 0; s < 2; s++ ) outData[ s + 10 ] = (byte)( r >> ( s * 8 ) ); Buffer.BlockCopy( voxelData, r * blockSize, outData, 12, partLength ); Communication.SendDataMessage( steamId, 5002, outData ); } } catch ( Exception ex ) { Essentials.Log.Error( "{0}", ex ); } }
private static void SendVoxelData(ulong steamId, IMyEntity voxel) { try { IMyVoxelMap voxelMap = (IMyVoxelMap)voxel; byte[] voxelData; voxelMap.Storage.Save(out voxelData); VoxelHeaderData header = new VoxelHeaderData( ); header.EntityId = voxel.EntityId; header.HalfExtent = voxelMap.Storage.Size / 2; header.Position = voxel.GetPosition( ); header.Name = voxelMap.StorageName; header.DataLength = voxelData.Length; string headerString = MyAPIGateway.Utilities.SerializeToXML <VoxelHeaderData>(header); ushort length = (ushort)headerString.Length; byte[] headerData = new byte[2 + headerString.Length]; headerData[0] = (byte)length; headerData[1] = (byte)(length >> 8); for (int r = 0; r < headerString.Length; r++) { headerData[r + 2] = (byte)headerString[r]; } Essentials.Log.Debug("Sending Voxel Header Data: {0} / {1} - {2} ({3})", voxelData.Length, headerData.Length, steamId, voxel.GetPosition( )); Communication.SendDataMessage(steamId, 5001, headerData); int blockSize = 4096; for (ushort r = 0; r < (voxelData.Length / blockSize) + 1; r++) { int partLength = voxelData.Length - (r * blockSize); if (partLength > blockSize) { partLength = blockSize; } byte[] outData = new byte[partLength + 12]; for (int s = 0; s < 8; s++) { outData[s] = (byte)(header.EntityId >> (s * 8)); } for (int s = 0; s < 2; s++) { outData[s + 8] = (byte)(partLength >> (s * 8)); } for (int s = 0; s < 2; s++) { outData[s + 10] = (byte)(r >> (s * 8)); } Buffer.BlockCopy(voxelData, r * blockSize, outData, 12, partLength); Communication.SendDataMessage(steamId, 5002, outData); } } catch (Exception ex) { Essentials.Log.Error("{0}", ex); } }