SetupRappel()
{
// Press and hold ^3[{+activate}]^7 to rappel
//precacheString( &"MP_PRESS_TO_RAPPEL" );
trigs = getentarray( "rappeltrigger", "targetname" );
foreach ( trig in trigs )
{
org = getent( trig.target, "targetname" );
trig.rappelPoint = org.origin;
trig.dir = anglesToForward( org.angles );
org delete();
trig thread RappelThink();
}
foreach ( trig in trigs )
{
org = getent( trig.target, "targetname" );
if ( isdefined( org ) )
org delete();
}
}
RappelThink()
{
// Press and hold ^3[{+activate}]^7 to rappel
//self setHintString( &"MP_PRESS_TO_RAPPEL" );
while ( 1 )
{
self waittill( "trigger", player );
if ( !isPlayer( player ) )
continue;
if ( !player isOnGround() )
continue;
if ( isdefined( player.rapelling ) )
continue;
player thread Rappel( self );
}
}
Rappel( trig )
{
toRappelPoint = trig.rappelPoint - self.origin;
rappelPoint = self.origin + vectordot( toRappelPoint, trig.dir ) * trig.dir;
rappelPoint = ( rappelPoint[ 0 ], rappelPoint[ 1 ], trig.rappelPoint[ 2 ] );
upTime = .5;// sec
overTime = .75;// sec
downSpeed = 512;// units / sec
upPoint = self.origin;
upPoint = ( upPoint[ 0 ], upPoint[ 1 ], rappelPoint[ 2 ] );
overPoint = rappelPoint + trig.dir * 20;
tracePosition = playerPhysicsTrace( overPoint, overPoint + ( 0, 0, -10000 ), false, self );
downPoint = tracePosition + ( 0, 0, 16 );
org = spawn( "script_origin", self.origin );
org hide();
self.rapelling = true;
self _disableWeapon();
self linkto( org );
self PlayerLinkedOffsetEnable();
org moveto( upPoint, upTime, 0, 0 );
org waittill( "movedone" );
org moveto( overPoint, overTime, 0, 0 );
org waittill( "movedone" );
downTime = distance( overPoint, downPoint ) / downSpeed;
org moveto( downPoint, downTime, 0, 0 );
org waittill( "movedone" );
self _enableWeapon();
self unlink();
org delete();
self.rapelling = undefined;
}
Copyright © 2026, NextGenUpdate.
All Rights Reserved.