304 lines
7.0 KiB
Plaintext
304 lines
7.0 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init_elevator( var_0 )
|
|
{
|
|
var_1 = getent( var_0.name, "targetname" );
|
|
var_1.unresolved_collision_func = ::handleunreslovedcollision;
|
|
var_1.doors = [];
|
|
|
|
foreach ( var_8, var_3 in var_0.doors )
|
|
{
|
|
var_4 = [];
|
|
|
|
foreach ( var_6 in var_3 )
|
|
{
|
|
var_4[var_4.size] = setupdoor( var_6 + "left", 0, var_0.doormovedist );
|
|
var_4[var_4.size] = setupdoor( var_6 + "right", 1, var_0.doormovedist );
|
|
}
|
|
|
|
var_1.doors[var_8] = var_4;
|
|
}
|
|
|
|
var_1.trigblock = getent( var_0.trigblockname, "targetname" );
|
|
var_1.curfloor = "floor1";
|
|
var_1.requestedfloor = var_1.curfloor;
|
|
var_1.doorstate = 0;
|
|
var_1.dooropentime = 2.0;
|
|
var_1.doorspeed = var_0.doormovedist / var_1.dooropentime;
|
|
var_1.movetime = 5.0;
|
|
var_1.autoclosetimeout = 10.0;
|
|
var_1.destinations = [];
|
|
var_1.pathblockers = [];
|
|
var_1.buttons = getentarray( var_0.buttons, "targetname" );
|
|
|
|
foreach ( var_10 in var_1.buttons )
|
|
var_10 setupbutton( var_1 );
|
|
|
|
var_12 = getentarray( "elevator_models", "targetname" );
|
|
|
|
foreach ( var_14 in var_12 )
|
|
var_14 linkto( var_1 );
|
|
|
|
var_1 thread elevatorthink();
|
|
var_1 thread openelevatordoors( var_1.curfloor, 0 );
|
|
}
|
|
|
|
setupdoor( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = getent( var_0, "targetname" );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
var_3.closepos = var_3.origin;
|
|
|
|
if ( isdefined( var_3.target ) )
|
|
{
|
|
var_4 = common_scripts\utility::getstruct( var_3.target, "targetname" );
|
|
var_3.openpos = var_4.origin;
|
|
}
|
|
else
|
|
{
|
|
var_5 = anglestoforward( var_3.angles ) * var_2;
|
|
var_3.openpos = var_3.origin + var_5;
|
|
}
|
|
|
|
return var_3;
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
|
|
setupbutton( var_0 )
|
|
{
|
|
self.owner = var_0;
|
|
|
|
if ( isdefined( self.target ) )
|
|
{
|
|
var_1 = common_scripts\utility::getstruct( self.target, "targetname" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_0.destinations[self.script_label] = var_1.origin;
|
|
|
|
if ( isdefined( var_1.target ) )
|
|
{
|
|
var_2 = getent( var_1.target, "targetname" );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_0.pathblockers[self.script_label] = var_2;
|
|
}
|
|
}
|
|
}
|
|
|
|
enablebutton();
|
|
}
|
|
|
|
enablebutton()
|
|
{
|
|
self sethintstring( &"MP_ELEVATOR_USE" );
|
|
self makeusable();
|
|
thread buttonthink();
|
|
}
|
|
|
|
disablebutton()
|
|
{
|
|
self makeunusable();
|
|
}
|
|
|
|
buttonthink()
|
|
{
|
|
var_0 = self.owner;
|
|
var_0 endon( "elevator_busy" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger" );
|
|
|
|
if ( self.script_label == "elevator" )
|
|
{
|
|
if ( var_0.curfloor == "floor1" )
|
|
var_0.requestedfloor = "floor2";
|
|
else
|
|
var_0.requestedfloor = "floor1";
|
|
}
|
|
else
|
|
var_0.requestedfloor = self.script_label;
|
|
|
|
var_0 notify( "elevator_called" );
|
|
}
|
|
}
|
|
|
|
elevatorthink()
|
|
{
|
|
for (;;)
|
|
{
|
|
self waittill( "elevator_called" );
|
|
|
|
foreach ( var_1 in self.buttons )
|
|
var_1 disablebutton();
|
|
|
|
if ( self.curfloor != self.requestedfloor )
|
|
{
|
|
if ( self.doorstate != 0 )
|
|
{
|
|
self notify( "elevator_stop_autoclose" );
|
|
thread closeelevatordoors( self.curfloor );
|
|
self waittill( "elevator_doors_closed" );
|
|
}
|
|
|
|
elevatormovetofloor( self.requestedfloor );
|
|
wait 0.25;
|
|
}
|
|
|
|
thread openelevatordoors( self.curfloor, 0 );
|
|
self waittill( "elevator_doors_open" );
|
|
|
|
foreach ( var_1 in self.buttons )
|
|
var_1 enablebutton();
|
|
}
|
|
}
|
|
|
|
elevatormovetofloor( var_0 )
|
|
{
|
|
self playsound( "scn_elevator_startup" );
|
|
self playloopsound( "scn_elevator_moving_lp" );
|
|
var_1 = self.destinations[var_0];
|
|
var_2 = var_1[2] - self.origin[2];
|
|
|
|
foreach ( var_4 in self.doors["elevator"] )
|
|
var_4 movez( var_2, self.movetime );
|
|
|
|
self movez( var_2, self.movetime );
|
|
wait( self.movetime );
|
|
self stoploopsound( "scn_elevator_moving_lp" );
|
|
self playsound( "scn_elevator_stopping" );
|
|
self playsound( "scn_elevator_beep" );
|
|
self.curfloor = self.requestedfloor;
|
|
}
|
|
|
|
openelevatordoors( var_0, var_1 )
|
|
{
|
|
var_2 = self.doors[var_0];
|
|
self.doorstate = 1;
|
|
var_3 = var_2[0];
|
|
var_4 = ( var_3.openpos[0], var_3.openpos[1], var_3.origin[2] );
|
|
var_5 = var_4 - var_3.origin;
|
|
var_6 = length( var_5 );
|
|
var_7 = var_6 / self.doorspeed;
|
|
var_8 = 0.25;
|
|
|
|
if ( var_7 == 0.0 )
|
|
{
|
|
var_7 = 0.05;
|
|
var_8 = 0.0;
|
|
}
|
|
else
|
|
{
|
|
self playsound( "scn_elevator_doors_opening" );
|
|
var_8 = min( var_8, var_7 );
|
|
}
|
|
|
|
foreach ( var_3 in var_2 )
|
|
var_3 moveto( ( var_3.openpos[0], var_3.openpos[1], var_3.origin[2] ), var_7, 0.0, var_8 );
|
|
|
|
wait( var_7 );
|
|
self.doorstate = 2;
|
|
self notify( "elevator_doors_open" );
|
|
elevatorclearpath( var_0 );
|
|
|
|
if ( var_1 )
|
|
thread elevatordoorsautoclose();
|
|
}
|
|
|
|
closeelevatordoors( var_0 )
|
|
{
|
|
self endon( "elevator_close_interrupted" );
|
|
thread watchcloseinterrupted( var_0 );
|
|
var_1 = self.doors[var_0];
|
|
self.doorstate = 3;
|
|
var_2 = var_1[0];
|
|
var_3 = ( var_2.closepos[0], var_2.closepos[1], var_2.origin[2] );
|
|
var_4 = var_3 - var_2.origin;
|
|
var_5 = length( var_4 );
|
|
|
|
if ( var_5 != 0.0 )
|
|
{
|
|
var_6 = var_5 / self.doorspeed;
|
|
|
|
foreach ( var_2 in var_1 )
|
|
var_2 moveto( ( var_2.closepos[0], var_2.closepos[1], var_2.origin[2] ), var_6, 0.0, 0.25 );
|
|
|
|
self playsound( "scn_elevator_doors_closing" );
|
|
wait( var_6 );
|
|
}
|
|
|
|
self.doorstate = 0;
|
|
elevatorblockpath( var_0 );
|
|
self notify( "elevator_doors_closed" );
|
|
}
|
|
|
|
watchcloseinterrupted( var_0 )
|
|
{
|
|
self endon( "elevator_doors_closed" );
|
|
var_1 = 1;
|
|
|
|
foreach ( var_3 in level.characters )
|
|
{
|
|
if ( var_3 istouchingtrigger( self.trigblock ) )
|
|
{
|
|
var_1 = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( var_1 )
|
|
self.trigblock waittill( "trigger" );
|
|
|
|
self notify( "elevator_close_interrupted" );
|
|
openelevatordoors( var_0, 1 );
|
|
}
|
|
|
|
istouchingtrigger( var_0 )
|
|
{
|
|
return isalive( self ) && self istouching( var_0 );
|
|
}
|
|
|
|
elevatordoorsautoclose()
|
|
{
|
|
self endon( "elevator_doors_closed" );
|
|
self endon( "elevator_stop_autoclose" );
|
|
wait( self.autoclosetimeout );
|
|
closeelevatordoors( self.curfloor );
|
|
}
|
|
|
|
handleunreslovedcollision( var_0 )
|
|
{
|
|
if ( !isplayer( var_0 ) )
|
|
var_0 dodamage( 1000, var_0.origin, self, self, "MOD_CRUSH" );
|
|
}
|
|
|
|
elevatorclearpath( var_0 )
|
|
{
|
|
var_1 = self.pathblockers[var_0];
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_1 connectpaths();
|
|
var_1 hide();
|
|
var_1 notsolid();
|
|
}
|
|
}
|
|
|
|
elevatorblockpath( var_0 )
|
|
{
|
|
var_1 = self.pathblockers[var_0];
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_1 show();
|
|
var_1 solid();
|
|
var_1 disconnectpaths();
|
|
}
|
|
}
|