internal static void WorldLoad( Player player, Command cmd ) {
string fileName = cmd.Next();
string worldName = cmd.Next();
if( worldName == null && player.World == null ) {
player.Message( "When using /wload from console, you must specify the world name." );
return;
}
if( fileName == null ) {
// No params given at all
cdWorldLoad.PrintUsage( player );
return;
}
// Check if path contains missing drives or invalid characters
if( !Paths.IsValidPath( fileName ) ) {
player.Message( "Invalid filename or path." );
return;
}
player.MessageNow( "Looking for \"{0}\"...", fileName );
// Look for the file
string sourceFullFileName = Path.Combine( Paths.MapPath, fileName );
if( !File.Exists( sourceFullFileName ) && !Directory.Exists( sourceFullFileName ) ) {
if( File.Exists( sourceFullFileName + ".fcm" ) ) {
// Try with extension added
fileName += ".fcm";
sourceFullFileName += ".fcm";
} else if( MonoCompat.IsCaseSensitive ) {
try {
// If we're on a case-sensitive OS, try case-insensitive search
FileInfo[] candidates = Paths.FindFiles( sourceFullFileName + ".fcm" );
if( candidates.Length == 0 ) {
candidates = Paths.FindFiles( sourceFullFileName );
}
if( candidates.Length == 0 ) {
player.Message( "File/directory not found: {0}", fileName );
} else if( candidates.Length == 1 ) {
player.Message( "Filenames are case-sensitive! Did you mean to load \"{0}\"?", candidates[0].Name );
} else {
player.Message( "Filenames are case-sensitive! Did you mean to load one of these: {0}",
String.Join( ", ", candidates.Select( c => c.Name ).ToArray() ) );
}
} catch( DirectoryNotFoundException ex ) {
player.Message( ex.Message );
}
return;
} else {
// Nothing found!
player.Message( "File/directory not found: {0}", fileName );
return;
}
}
// Make sure that the given file is within the map directory
if( !Paths.Contains( Paths.MapPath, sourceFullFileName ) ) {
player.UnsafePathMessage();
return;
}
// Loading map into current world
if( worldName == null ) {
if( !cmd.IsConfirmed ) {
player.AskForConfirmation( cmd, "About to replace THIS MAP with \"{0}\".", fileName );
return;
}
Map map;
try {
map = MapUtility.Load( sourceFullFileName );
} catch( Exception ex ) {
player.MessageNow( "Could not load specified file: {0}: {1}", ex.GetType().Name, ex.Message );
return;
}
// Loading to current world
player.World.ChangeMap( map );
player.World.SendToAllExcept( "{0}&S loaded a new map for this world.", player,
player.GetClassyName() );
player.MessageNow( "New map loaded for the world {0}", player.World.GetClassyName() );
Logger.Log( "{0} loaded new map for world \"{1}\" from {2}", LogType.UserActivity,
player.Name, player.World.Name, fileName );
} else {
// Loading to some other (or new) world
if( !World.IsValidName( worldName ) ) {
player.MessageNow( "Invalid world name: \"{0}\".", worldName );
return;
}
lock( WorldManager.WorldListLock ) {
World world = WorldManager.FindWorldExact( worldName );
if( world != null ) {
// Replacing existing world's map
if( !cmd.IsConfirmed ) {
player.AskForConfirmation( cmd, "About to replace map for {0}&S with \"{1}\".",
world.GetClassyName(), fileName );
return;
}
Map map;
try {
map = MapUtility.Load( sourceFullFileName );
} catch( Exception ex ) {
player.MessageNow( "Could not load specified file: {0}: {1}", ex.GetType().Name, ex.Message );
return;
}
try {
world.ChangeMap( map );
} catch( WorldOpException ex ) {
Logger.Log( "Could not complete WorldLoad operation: {0}", LogType.Error, ex.Message );
player.Message( "&WWLoad: {0}", ex.Message );
return;
}
world.SendToAllExcept( "{0}&S loaded a new map for the world {1}", player,
player.GetClassyName(), world.GetClassyName() );
player.MessageNow( "New map for the world {0}&S has been loaded.", world.GetClassyName() );
Logger.Log( "{0} loaded new map for world \"{1}\" from {2}", LogType.UserActivity,
player.Name, world.Name, sourceFullFileName );
} else {
// Adding a new world
string targetFullFileName = Path.Combine( Paths.MapPath, worldName + ".fcm" );
if( !cmd.IsConfirmed &&
File.Exists( targetFullFileName ) && // target file already exists
!Paths.Compare( targetFullFileName, sourceFullFileName ) ) { // and is different from sourceFile
player.AskForConfirmation( cmd, "A map named \"{0}\" already exists, and will be overwritten with \"{1}\".",
Path.GetFileName( targetFullFileName ), Path.GetFileName( sourceFullFileName ) );
return;
}
Map map;
try {
map = MapUtility.Load( sourceFullFileName );
} catch( Exception ex ) {
player.MessageNow( "Could not load \"{0}\": {1}: {2}",
fileName, ex.GetType().Name, ex.Message );
return;
}
World newWorld;
try {
newWorld = WorldManager.AddWorld( player, worldName, map, false );
} catch( WorldOpException ex ) {
player.Message( "WLoad: {0}", ex.Message );
return;
}
if( newWorld != null ) {
newWorld.BuildSecurity.MinRank = RankManager.ParseRank( ConfigKey.DefaultBuildRank.GetString() );
Server.SendToAll( "{0}&S created a new world named {1}",
player.GetClassyName(), newWorld.GetClassyName() );
Logger.Log( "{0} created a new world named \"{1}\" (loaded from \"{2}\")", LogType.UserActivity,
player.Name, worldName, fileName );
WorldManager.SaveWorldList();
player.MessageNow( "Reminder: New world's access permission is {0}+&S, and build permission is {1}+",
newWorld.AccessSecurity.MinRank.GetClassyName(),
newWorld.BuildSecurity.MinRank.GetClassyName() );
} else {
player.MessageNow( "Failed to create a new world." );
}
}
}
}
Server.RequestGC();
}