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

95 lines
10 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\weapons\_weaponobjects;
#using scripts\shared\postfx_shared;
// 200 * 200
#precache( "client_fx", "weapon/fx_prox_grenade_scan_blue" );
#precache( "client_fx", "weapon/fx_prox_grenade_wrn_grn" );
#precache( "client_fx", "weapon/fx_prox_grenade_scan_orng" );
#precache( "client_fx", "weapon/fx_prox_grenade_wrn_red" );
#precache( "client_fx", "weapon/fx_prox_grenade_impact_player_spwner" );
#namespace proximity_grenade;
function init_shared()
{
clientfield::register( "toplayer", "tazered", 1, 1, "int", undefined, !true, !true );
level._effect["prox_grenade_friendly_default"] = "weapon/fx_prox_grenade_scan_blue";
level._effect["prox_grenade_friendly_warning"] = "weapon/fx_prox_grenade_wrn_grn";
level._effect["prox_grenade_enemy_default"] = "weapon/fx_prox_grenade_scan_orng";
level._effect["prox_grenade_enemy_warning"] = "weapon/fx_prox_grenade_wrn_red";
level._effect["prox_grenade_player_shock"] = "weapon/fx_prox_grenade_impact_player_spwner";
callback::add_weapon_type( "proximity_grenade", &proximity_spawned );
level thread watchForProximityExplosion();
}
function proximity_spawned( localClientNum )
{
if ( self isGrenadeDud() )
return;
self.equipmentFriendFX = level._effect["prox_grenade_friendly_default"];
self.equipmentEnemyFX = level._effect["prox_grenade_enemy_default"];
self.equipmentTagFX = "tag_fx";
self thread weaponobjects::equipmentTeamObject( localClientNum );
}
function watchForProximityExplosion()
{
if ( GetActiveLocalClients() > 1 )
return;
weapon_proximity = GetWeapon( "proximity_grenade" );
while ( true )
{
level waittill( "explode", localClientNum, position, mod, weapon, owner_cent );
if ( weapon.rootWeapon != weapon_proximity )
{
continue;
}
localPlayer = GetLocalPlayer( localClientNum );
if ( ( !localPlayer util::is_player_view_linked_to_entity( localClientNum ) ) )
{
explosionRadius = weapon.explosionRadius;
if ( DistanceSquared( localPlayer.origin, position ) < explosionRadius * explosionRadius )
{
if ( isdefined( owner_cent ) )
{
if ( ( owner_cent == localPlayer ) || !( owner_cent util::friend_not_foe( localClientNum, true ) ) )
{
//localPlayer thread taserHUDFX( localClientNum, position );
localPlayer thread postfx::PlayPostfxBundle( "pstfx_shock_charge" );
}
}
}
}
}
}