Пример #1
0
        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 );
            }
        }
Пример #2
0
        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);
            }
        }