That's the code I used 3 years ago in a project of mine ... the number of the level to load is stored in a skill of the entity that uses this action.

Code:
DEFINE _levelNr,SKILL1;
DEFINE _levelPos,SKILL2;

bmap loading_level_bmap = <loading_level.tga>;
panel loading_level_panel {
	bmap = loading_level_bmap;
	flags = refresh,d3d,overlay;
}

function load_new_level (lName,entPosName) {
	loading_level_panel.pos_x = (screen_size.x - bmap_width(loading_level_bmap))/2;
	loading_level_panel.pos_y = (screen_size.y - bmap_height(loading_level_bmap))/2;
	loading_level_panel.visible = on;		
	wait(2);
	my = null; // make this action a global function
	gid01_level_state = gid01_level_not_loaded;	
	
	level_load(lName);
	wait(2);
	
	you = ptr_for_name (entPosName);
	me = ptr_for_name ("gfinal");
	if (me != null && you != null) {	  		
	  vec_set(me.x, you.x);
    vec_set(me.pan, you.pan);   
    vec_set(plBiped01_force_vec,nullvector);
	  vec_set(plBiped01_ang_force_vec,nullvector);
	  vec_set(plBiped01_flag_array,nullvector); 
	  panAtStart = 0;
	  playerTargetPan = you.pan;
	  lastPlayerTargetPan = playerTargetPan;
	}	
	if (me != null) {
	  if(str_cmpi (currentPlayerModel, "punk") == 1) {
      ent_morph(me,punk_model);
    }
  }
	
	getInFront();
	
	gid01_level_state = gid01_level_loaded;	
	wait(2);
	loading_level_panel.visible = off;
	bmap_purge(loading_level_bmap);	
}

string levelString[30]; 
string levelNumber[30];
string entPosString[30]; 
string entPosNumber[30];

function load_level_events {
	if(EVENT_TYPE == event_impact) {
		if (you == plSelect_curr_ent) {	
			my.enable_impact = off;
			my.passable = on;
		  
		  str_cpy(levelString,"level_");
		  if (my._levelNr < 100) {
		  	str_cat(levelString,"0");
		  }
		  if (my._levelNr < 10) {
		  	str_cat(levelString,"0");
		  }
		  str_for_num(levelNumber,my._levelNr);		    
      str_cat(levelString,levelNumber);
      str_cat(levelString,".wmb");
      
      str_cpy(entPosString,"levelPos_");
		  if (my._levelPos < 100) {
		  	str_cat(entPosString,"0");
		  }
		  if (my._levelPos < 10) {
		  	str_cat(entPosString,"0");
		  }
		  str_for_num(entPosNumber,my._levelPos);		    
      str_cat(entPosString,entPosNumber);
      
			load_new_level(levelString,entPosString);			
		}
	}
}

action level_warper {
	my.polygon = on; 	
	while(plSelect_curr_ent == NULL) {
		wait(1);
	}
	my.event = load_level_events;	
	my.enable_impact = on;		
}



Last edited by pegamode; 01/09/09 08:50.