iw6-scripts-dev/maps/mp/_zipline.gsc
2024-12-11 11:28:08 +01:00

136 lines
3.3 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" );
}
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();
}