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