private static void MirrorHandler( Player player, Command cmd )
{
CopyState originalInfo = player.GetCopyInformation();
if ( originalInfo == null ) {
player.MessageNow( "Nothing to flip! Copy something first." );
return;
}
// clone to avoid messing up any paste-in-progress
CopyState info = new CopyState( originalInfo );
bool flipX = false, flipY = false, flipH = false;
string axis;
while ( ( axis = cmd.Next() ) != null ) {
foreach ( char c in axis.ToLower() ) {
if ( c == 'x' )
flipX = true;
if ( c == 'y' )
flipY = true;
if ( c == 'z' )
flipH = true;
}
}
if ( !flipX && !flipY && !flipH ) {
CdMirror.PrintUsage( player );
return;
}
Block block;
if ( flipX ) {
int left = 0;
int right = info.Dimensions.X - 1;
while ( left < right ) {
for ( int y = info.Dimensions.Y - 1; y >= 0; y-- ) {
for ( int z = info.Dimensions.Z - 1; z >= 0; z-- ) {
block = info.Buffer[left, y, z];
info.Buffer[left, y, z] = info.Buffer[right, y, z];
info.Buffer[right, y, z] = block;
}
}
left++;
right--;
}
}
if ( flipY ) {
int left = 0;
int right = info.Dimensions.Y - 1;
while ( left < right ) {
for ( int x = info.Dimensions.X - 1; x >= 0; x-- ) {
for ( int z = info.Dimensions.Z - 1; z >= 0; z-- ) {
block = info.Buffer[x, left, z];
info.Buffer[x, left, z] = info.Buffer[x, right, z];
info.Buffer[x, right, z] = block;
}
}
left++;
right--;
}
}
if ( flipH ) {
int left = 0;
int right = info.Dimensions.Z - 1;
while ( left < right ) {
for ( int x = info.Dimensions.X - 1; x >= 0; x-- ) {
for ( int y = info.Dimensions.Y - 1; y >= 0; y-- ) {
block = info.Buffer[x, y, left];
info.Buffer[x, y, left] = info.Buffer[x, y, right];
info.Buffer[x, y, right] = block;
}
}
left++;
right--;
}
}
if ( flipX ) {
if ( flipY ) {
if ( flipH ) {
player.Message( "Flipped copy along all axes." );
} else {
player.Message( "Flipped copy along X (east/west) and Y (north/south) axes." );
}
} else {
if ( flipH ) {
player.Message( "Flipped copy along X (east/west) and Z (vertical) axes." );
} else {
player.Message( "Flipped copy along X (east/west) axis." );
}
}
} else {
if ( flipY ) {
if ( flipH ) {
player.Message( "Flipped copy along Y (north/south) and Z (vertical) axes." );
} else {
player.Message( "Flipped copy along Y (north/south) axis." );
}
} else {
player.Message( "Flipped copy along Z (vertical) axis." );
}
}
player.SetCopyInformation( info );
}