internal static void WorldSave( Player player, Command cmd ) {
string p1 = cmd.Next(), p2 = cmd.Next();
if( p1 == null ) {
cdWorldSave.PrintUsage( player );
return;
}
World world = player.World;
string fileName;
if( p2 == null ) {
fileName = p1;
if( world == null ) {
player.Message( "When called from console, /save requires WorldName. See \"/help save\" for details." );
return;
}
} else {
world = WorldManager.FindWorldOrPrintMatches( player, p1 );
if( world == null ) return;
fileName = p2;
}
// normalize the path
fileName = fileName.Replace( Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar );
if( fileName.EndsWith( "/" ) && fileName.EndsWith( @"\" ) ) {
fileName += world.Name + ".fcm";
} else if( !fileName.ToLower().EndsWith( ".fcm", StringComparison.OrdinalIgnoreCase ) ) {
fileName += ".fcm";
}
string fullFileName = Path.Combine( Paths.MapPath, fileName );
if( !Paths.IsValidPath( fullFileName ) ) {
player.Message( "Invalid filename." );
return;
}
if( !Paths.Contains( Paths.MapPath, fullFileName ) ) {
player.UnsafePathMessage();
return;
}
// Ask for confirmation if overwriting
if( File.Exists( fullFileName ) ) {
FileInfo targetFile = new FileInfo( fullFileName );
FileInfo sourceFile = new FileInfo( world.GetMapName() );
if( !targetFile.FullName.Equals( sourceFile.FullName, StringComparison.OrdinalIgnoreCase ) ) {
if( !cmd.IsConfirmed ) {
player.AskForConfirmation( cmd, "Target file \"{0}\" already exists, and will be overwritten.", targetFile.Name );
return;
}
}
}
// Create the target directory if it does not exist
string dirName = fullFileName.Substring( 0, fullFileName.LastIndexOf( Path.DirectorySeparatorChar ) );
if( !Directory.Exists( dirName ) ) {
Directory.CreateDirectory( dirName );
}
player.MessageNow( "Saving map to {0}", fileName );
const string mapSavingErrorMessage = "Map saving failed. See server logs for details.";
Map map = world.Map;
if( map == null ) {
if( File.Exists( world.GetMapName() ) ) {
try {
File.Copy( world.GetMapName(), fullFileName, true );
} catch( Exception ex ) {
Logger.Log( "StandardCommands.Save: Error occured while trying to copy an unloaded map: {0}", LogType.Error, ex );
player.Message( mapSavingErrorMessage );
}
} else {
Logger.Log( "StandardCommands.Save: Map for world \"{0}\" is unloaded, and file does not exist.", LogType.Error, world.Name );
player.Message( mapSavingErrorMessage );
}
} else if( map.Save( fullFileName ) ) {
player.Message( "Map saved succesfully." );
} else {
Logger.Log( "StandardCommands.Save: Saving world \"{0}\" failed.", LogType.Error, world.Name );
player.Message( mapSavingErrorMessage );
}
}