static void GenTaskCallback( SchedulerTask task ) {
GenTaskParams args = (GenTaskParams)task.UserState;
// Generate!
Map map;
try {
map = args.GenState.Generate();
} catch( Exception ex ) {
// Report a generator crash
Logger.LogAndReportCrash( "Generation error",
args.GenState.GetType().AssemblyQualifiedName,
ex,
false );
args.Player.Message( "&wAn error occurred while trying to generate the map: {0} {1}",
ex.GetType().Name,
ex.Message );
return;
}
// Make sure generator returned a proper map, as expected.
if( map == null ) {
string message =
String.Format( "{0}.Generate() returned null in GenTaskCallback for these parameters: {1}",
args.GenState.GetType(),
args.GenState.Parameters );
throw new NullReferenceException( message );
}
// Save the map file, either into a world or a file.
if( args.World != null ) {
args.Player.Message( "Generation done. Changing map on {0}&S...", args.World.ClassyName );
var playersToAlert = args.World.Players.Except( args.Player );
args.World.ChangeMap( map, args.Player.Name );
playersToAlert.Message( "&SPlayer {0}&S generated a new map for this world.", args.Player.ClassyName );
Logger.Log( LogType.UserActivity,
"Player {0} generated a new map for world {1}: {2}",
args.Player.Name,
args.World.Name,
args.GenState.Parameters );
} else {
if( map.Save( args.FullFileName ) ) {
args.Player.Message( "Generation done. Saved to {0}", args.FileName );
args.Player.Message( "You may now use &H/WLoad&S to create a world from this map file." );
Logger.Log( LogType.UserActivity,
"Player {0} saved a newly-generated new map to file \"{1}\": {2}",
args.Player.Name,
args.FullFileName,
args.GenState.Parameters );
} else {
args.Player.Message( "&WAn error occurred while saving generated map to {0}", args.FileName );
}
}
Server.RequestGC();
}