s1-scripts-dev/raw/maps/mp/_zipline.gsc
2025-05-21 16:23:17 +02:00

400 lines
10 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
// prototype for generic zipline / rappel
// - player can use their weapon while travelling on line
// - player can drop off line by jumping
// SETUP:
// - trigger_touch marks the area where the player will be prompted to use the zipline (suggest 32x32x32 trigger touching ground)
// - script_origin marked as the target of the trigger_use_touch is the destination
init()
{
visuals = [];
triggers = getentarray("zipline", "targetname");
for( i = 0; i < triggers.size; i++ )
{
zipline = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", triggers[i], visuals, (0,0,0) );
zipline maps\mp\gametypes\_gameobjects::allowUse( "any" );
zipline maps\mp\gametypes\_gameobjects::setUseTime( 0.25 );
zipline maps\mp\gametypes\_gameobjects::setUseText( &"MP_ZIPLINE_USE" );
zipline maps\mp\gametypes\_gameobjects::setUseHintText( &"MP_ZIPLINE_USE" );
zipline maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
zipline.onBeginUse = ::onBeginUse;
zipline.onUse = ::onUse;
targets = [];
target = getEnt( triggers[i].target, "targetname");
if ( !isDefined( target ) )
assertmsg( "No target found for zipline trigger located at: ( " + triggers[i].origin[0] + ", " + triggers[i].origin[1] + ", " + triggers[i].origin[2] + " )" );
while ( isDefined( target ) )
{
targets[targets.size] = target;
if ( isDefined( target.target ) )
target = getEnt( target.target, "targetname");
else
break;
}
zipline.targets = targets;
}
precacheModel( "tag_player" );
// elevator test
init_elevator();
}
onBeginUse( player )
{
player playSound( "scrambler_pullout_lift_plr" );
}
onUse( player )
{
player thread zip( self );
}
zip( useObj )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "zipline_drop" );
level endon( "game_ended" );
// make the carrier
carrier = spawn( "script_origin", useObj.trigger.origin );
carrier.origin = useObj.trigger.origin;
carrier.angles = self.angles;
carrier setModel( "tag_player" );
// link the player
self playerLinkToDelta( carrier, "tag_player", 1, 180, 180, 180, 180 );
// monitor player
self thread watchDeath( carrier );
self thread watchDrop( carrier );
// loop through the path of targets
targets = useObj.targets;
for( i=0; i < targets.size; i++ )
{
// time
// JDS TODO: look into LDs specifying speed, accelleration, deceleration on the nodes
time = distance( carrier.origin, targets[i].origin ) / 600;
// send it on its way
acceleration = 0.0;
if ( i==0 )
acceleration = time*0.2;
carrier moveTo( targets[i].origin, time, acceleration );
if ( carrier.angles != targets[i].angles )
carrier rotateTo( targets[i].angles, time*0.8 );
// wait
wait( time );
}
// all done
self notify( "destination" );
self unlink();
carrier delete();
}
watchDrop( carrier )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "destination" );
level endon( "game_ended" );
self notifyOnPlayerCommand( "zipline_drop", "+gostand" );
self waittill( "zipline_drop" );
self unlink();
carrier delete();
}
watchDeath( carrier )
{
self endon( "disconnect" );
self endon( "destination" );
self endon( "zipline_drop" );
level endon( "game_ended" );
self waittill( "death" );
self unlink();
carrier delete();
}
// ELEVATOR TEST
// JDS TODO: make this more generic to handle multiple elevators in a level
init_elevator()
{
visuals = [];
triggers = getEntArray("elevator_button", "targetname");
level.elevator = spawnStruct();
level.elevator.location = "floor1";
level.elevator.states = [];
level.elevator.states["elevator"] = "closed";
level.elevator.destinations = [];
for( i = 0; i < triggers.size; i++ )
{
button = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", triggers[i], visuals, (0,0,0) );
button maps\mp\gametypes\_gameobjects::allowUse( "any" );
button maps\mp\gametypes\_gameobjects::setUseTime( 0.25 );
button maps\mp\gametypes\_gameobjects::setUseText( &"MP_ZIPLINE_USE" );
button maps\mp\gametypes\_gameobjects::setUseHintText( &"MP_ZIPLINE_USE" );
button maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
button.onBeginUse = ::onBeginUse_elevator;
button.onUse = ::onUse_elevator;
button.location = triggers[i].script_label;
level.elevator.states[triggers[i].script_label] = "closed";
if ( isDefined( triggers[i].target ) )
{
destination = getStruct( triggers[i].target, "targetname" );
if ( isDefined( destination ) )
level.elevator.destinations[triggers[i].script_label] = destination;
}
}
}
onBeginUse_elevator( player )
{
// ding!
}
// self = elevator button
onUse_elevator( player )
{
switch( self.location )
{
case "floor1":
{
if ( level.elevator.states["floor1"] == "closed" )
{
if ( level.elevator.location == "floor1" )
{
if ( level.elevator.states["elevator"] == "closed" )
{
level thread open( "floor1" );
level thread open( "elevator" );
}
}
else if ( level.elevator.location == "floor2" )
{
if ( level.elevator.states["elevator"] == "opened" )
{
level notify( "stop_autoClose" );
level thread close( "floor2" );
level close( "elevator" );
}
if ( level.elevator.states["elevator"] == "closed" )
{
level move();
level thread open( "floor1" );
level thread open( "elevator" );
}
}
}
break;
}
case "floor2":
{
if ( level.elevator.states["floor2"] == "closed" )
{
if ( level.elevator.location == "floor2" )
{
if ( level.elevator.states["elevator"] == "closed" )
{
level thread open( "floor2" );
level thread open( "elevator" );
}
}
else if ( level.elevator.location == "floor1" )
{
if ( level.elevator.states["elevator"] == "opened" )
{
level notify( "stop_autoClose" );
level thread close( "floor1" );
level close( "elevator" );
}
if ( level.elevator.states["elevator"] == "closed" )
{
level move();
level thread open( "floor2" );
level thread open( "elevator" );
}
}
}
break;
}
case "elevator":
{
if ( level.elevator.states["elevator"] == "opened" )
{
level notify( "stop_autoClose" );
level thread close( level.elevator.location );
level close( "elevator" );
}
if ( level.elevator.states["elevator"] == "closed" )
{
level move();
level thread open( level.elevator.location );
level thread open( "elevator" );
}
break;
}
}
}
open( label )
{
level.elevator.states[label] = "opening";
doorL = getEnt( "e_door_" + label + "_left", "targetname" );
doorR = getEnt( "e_door_" + label + "_right", "targetname" );
//Changing script to accommodate both mp_fahrenheit and mp_vault - Mary
if ( isDefined ( doorL.script_noteworthy ) && doorL.script_noteworthy == "fahrenheit" )
{
//Mary door move
doorL moveTo( doorL.origin - anglesToForward( doorL.angles ) * 35, 2 );
doorR moveTo( doorR.origin + anglesToForward( doorR.angles ) * 35, 2 );
doorL PlaySound( "elev_door_open" );
}
else
{
//Sahas door move
doorL moveTo( doorL.origin - anglesToRight( doorL.angles ) * 35, 2 );
doorR moveTo( doorR.origin + anglesToRight( doorR.angles ) * 35, 2 );
}
wait( 2 );
level.elevator.states[label] = "opened";
if ( label == "elevator" )
level thread autoClose();
}
close( label )
{
level.elevator.states[label] = "closing";
doorL = getEnt( "e_door_" + label + "_left", "targetname" );
doorR = getEnt( "e_door_" + label + "_right", "targetname" );
if ( isDefined ( doorL.script_noteworthy ) && doorL.script_noteworthy == "fahrenheit" )
{
//Mary door move
doorL moveTo( doorL.origin + anglesToForward( doorL.angles ) * 35, 2 );
doorR moveTo( doorR.origin - anglesToForward( doorR.angles ) * 35, 2 );
doorL PlaySound ( "elev_door_close" );
}
else
{
//Sahas door move
doorL moveTo( doorL.origin + anglesToRight( doorL.angles ) * 35, 2 );
doorR moveTo( doorR.origin - anglesToRight( doorR.angles ) * 35, 2 );
}
wait( 2 );
level.elevator.states[label] = "closed";
}
autoClose()
{
level endon( "stop_autoClose" );
wait( 10 );
level thread close( level.elevator.location );
level thread close( "elevator" );
}
// JDS TODO: get nodes for doors or link them (get rid of delta calcs)
move()
{
level.elevator.states["elevator"] = "moving";
doorL = getEnt( "e_door_elevator_left", "targetname" );
doorR = getEnt( "e_door_elevator_right", "targetname" );
elevator = getEnt( "elevator", "targetname" );
// elevator_models = getEntArray( "elevator_models", "targetname");
// Elevator now supports script_models that move with it
// foreach( emodels_piece in elevator_models )
// {
// emodels_piece linkto( elevator );
// }
if ( level.elevator.location == "floor1" )
{
level.elevator.location = "floor2";
delta = doorL.origin[2] - level.elevator.destinations["floor1"].origin[2];
doorL moveTo( (doorL.origin[0], doorL.origin[1], level.elevator.destinations["floor2"].origin[2]+delta), 5 );
delta = doorR.origin[2] - level.elevator.destinations["floor1"].origin[2];
doorR moveTo( (doorR.origin[0], doorR.origin[1], level.elevator.destinations["floor2"].origin[2]+delta), 5 );
elevator moveTo( level.elevator.destinations["floor2"].origin, 5 );
}
else
{
level.elevator.location = "floor1";
delta = doorL.origin[2] - level.elevator.destinations["floor2"].origin[2];
doorL moveTo( (doorL.origin[0], doorL.origin[1], level.elevator.destinations["floor1"].origin[2]+delta), 5 );
delta = doorR.origin[2] - level.elevator.destinations["floor2"].origin[2];
doorR moveTo( (doorR.origin[0], doorR.origin[1], level.elevator.destinations["floor1"].origin[2]+delta), 5 );
elevator moveTo( level.elevator.destinations["floor1"].origin, 5 );
}
wait( 5 );
//Added elevator bell ding (doesn't work correctly with onBeginUse_elevator) - Mary
elevator PlaySound ( "elev_bell_ding" );
level.elevator.states["elevator"] = "closed";
}