The following is a pretty safe set of steps to following if you are loading a new world from an old one.
// hide the entire interface
HideAllForms();
// delete any main game scripts
DeleteGameScripts();
// flush the current world from memory
NewWorld();
// pause the game (stops any controller scripts / dynamics advance etc)
GetGameManager().SetPaused( true);
// do the actual load
// show the loading screen
ShowForm( "LoadingScreen");
StartLoadingWorld( "MyNewWorld.wld");
while (!DoneLoadingWorld())
Delay( 0.001f);
// run the new game script
LoadGameScript( "MyNewGameScript.gsl", "MainGame");
// hide the loading screen
HideForm( "LoadingScreen");
// clear the background image (if we have one)
ClearBackdrop();
// unpause the game
GetGameManager().SetPaused( false);
}
The number one reason that things would crash from one world to another is that you are trying to access an invalid object handle either during the load or after the load.