boiii-scripts/shared/weapons/_hacker_tool.csc
2023-04-13 17:30:38 +02:00

244 lines
15 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\duplicaterender_mgr;
#using scripts\shared\math_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\visionset_mgr_shared;
#using scripts\shared\weapons\_flashgrenades;
#namespace hacker_tool;
function init_shared()
{
clientfield::register( "toplayer", "hacker_tool", 1, 2, "int", &player_hacking, !true, !true );
level.hackingSoundId = [];
level.hackingSweetSpotId = [];
level.friendlyHackingSoundId = [];
callback::on_localplayer_spawned( &on_localplayer_spawned );
}
function on_localplayer_spawned( localClientNum )
{
if( self != GetLocalPlayer( localClientNum ) )
return;
player = self;
if ( isdefined( level.hackingSoundId[localclientnum] ) )
{
player stopLoopSound( level.hackingSoundId[localclientnum] );
level.hackingSoundId[localclientnum] = undefined;
}
if ( isdefined( level.hackingSweetSpotId[localclientnum] ) )
{
player stopLoopSound(level.hackingSweetSpotId[localclientnum] );
level.hackingSweetSpotId[localclientnum] = undefined;
}
if ( isdefined( level.friendlyHackingSoundId[localclientnum] ) )
{
player stopLoopSound( level.friendlyHackingSoundId[localclientnum] );
level.friendlyHackingSoundId[localclientnum] = undefined;
}
}
function player_hacking( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self notify( "player_hacking_callback" );
player = self;
if ( isdefined( level.hackingSoundId[localclientnum] ) )
{
player stopLoopSound( level.hackingSoundId[localclientnum] );
level.hackingSoundId[localclientnum] = undefined;
}
if ( isdefined( level.hackingSweetSpotId[localclientnum] ) )
{
player stopLoopSound(level.hackingSweetSpotId[localclientnum] );
level.hackingSweetSpotId[localclientnum] = undefined;
}
if ( isdefined( level.friendlyHackingSoundId[localclientnum] ) )
{
player stopLoopSound( level.friendlyHackingSoundId[localclientnum] );
level.friendlyHackingSoundId[localclientnum] = undefined;
}
if ( isdefined( player.targetEnt ) )
{
player.targetEnt duplicate_render::set_hacker_tool_hacking( localClientNum, false );
player.targetEnt duplicate_render::set_hacker_tool_breaching( localClientNum,false );
player.targetEnt.isbreachingfirewall = false;
player.targetEnt = undefined;
}
if ( newVal == 2 )
{
player thread watchHackSpeed( localClientNum, false );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.status" ), 2 );
}
else if ( newVal == 3 )
{
player thread watchHackSpeed( localClientNum, true );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.status" ), 1 );
}
else if ( newVal == 1 )
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.status" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.perc" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.offsetShaderValue" ), 0 + " " + 0 + " 0 0" );
self thread watchForEMP( localClientNum );
}
else
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.status" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.perc" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.offsetShaderValue" ), 0 + " " + 0 + " 0 0" );
}
}
function watchHackSpeed( localClientNum, isBreachingFirewall )
{
self endon( "entityshutdown" );
self endon( "player_hacking_callback" );
player = self;
for ( ;; )
{
targetEntArray = self GetTargetLockEntityArray();
if ( targetEntArray.size > 0 )
{
targetEnt = targetEntArray[0];
break;
}
wait ( 0.02 );
}
targetEnt watchTargetHack( localclientNum, player, isBreachingFirewall );
}
function watchTargetHack( localclientnum, player, isBreachingFirewall )
{
self endon( "entityshutdown" );
player endon( "entityshutdown" );
self endon( "player_hacking_callback" );
targetEnt = self;
player.targetEnt = targetEnt;
if ( isBreachingFirewall )
{
targetEnt.isbreachingfirewall = true;
targetEnt duplicate_render::set_hacker_tool_breaching( localclientnum, true );
}
targetEnt thread watchHackerPlayerShutdown( localclientnum, player, targetEnt );
for( ;; )
{
distanceFromCenter = targetent getDistanceFromScreenCenter( localClientNum );
inverse = 40 - distancefromcenter;
ratio = inverse / 40;
heatVal = GetWeaponHackRatio( localclientnum );
ratio = ratio * ratio * ratio * ratio;
if ( ratio > 1.0 || ratio < 0.001 )
{
ratio = 0;
horizontal = 0;
}
else
{
horizontal = targetent getHorizontalOffsetFromScreenCenter( localClientNum, 40 );
}
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.offsetShaderValue" ), horizontal + " " + ratio + " 0 0" );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.perc" ), heatVal );
if ( ratio > 0.8 )
{
if ( !isdefined( level.hackingSweetSpotId[localclientnum] ) )
{
level.hackingSweetSpotId[localclientnum] = player playloopsound( "evt_hacker_hacking_sweet" );
}
}
else
{
if ( isdefined( level.hackingSweetSpotId[localclientnum] ) )
{
player stopLoopSound( level.hackingSweetSpotId[localclientnum] );
level.hackingSweetSpotId[localclientnum] = undefined;
}
if ( !isdefined( level.hackingSoundId[localclientnum] ) )
{
level.hackingSoundId[localclientnum] = player playloopsound( "evt_hacker_hacking_loop" );
}
if ( isdefined( level.hackingSoundId[localclientnum] ) )
{
setSoundPitch( level.hackingSoundId[localclientnum], ratio );
}
}
if ( !isBreachingFirewall )
{
friendlyHacking = WeaponFriendlyHacking( localclientnum );
if ( friendlyHacking && !isdefined( level.friendlyHackingSoundId[localclientnum] ) )
{
level.friendlyHackingSoundId[localclientnum] = player playloopsound( "evt_hacker_hacking_loop_mult" );
}
else if ( !friendlyHacking && isdefined( level.friendlyHackingSoundId[localclientnum] ) )
{
player stopLoopSound( level.friendlyHackingSoundId[localclientnum] );
level.friendlyHackingSoundId[localclientnum] = undefined;
}
}
wait ( 0.1 );
}
}
function watchHackerPlayerShutdown( localClientNum, hackerPlayer, targetEnt )
{
self endon( "entityshutdown" );
killstreakEntity = self;
hackerPlayer endon( "player_hacking_callback" );
hackerPlayer waittill( "entityshutdown" );
if ( isdefined( targetEnt ) )
{
targetEnt.isbreachingfirewall = true;
}
killstreakEntity duplicate_render::set_hacker_tool_hacking( localClientNum, false );
killstreakEntity duplicate_render::set_hacker_tool_breaching( localClientNum, false );
}
function watchForEMP( localClientNum )
{
self endon( "entityshutdown" );
self endon( "player_hacking_callback" );
while ( 1 )
{
if ( self IsEMPJammed() )
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.status" ), 3 );
}
else
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "hudItems.blackhat.status" ), 0 );
}
wait( 0.1 );
}
}