iw6-scripts/destructible_scripts/toy_lv_trash_can_vegas.gsc
2024-02-13 13:20:49 +01:00

466 lines
13 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
if ( common_scripts\utility::issp() )
{
common_scripts\_destructible::destructible_create( "toy_lv_trash_can_vegas", "tag_origin", 0 );
common_scripts\_destructible::destructible_function( ::lv_trash_can_vegas );
main_sp();
}
else
{
common_scripts\_destructible::destructible_create( "toy_lv_trash_can_vegas", "tag_origin", 0 );
common_scripts\_destructible::destructible_state( "tag_origin", undefined, 100 );
common_scripts\_destructible::destructible_part( "tag_lid", "lv_trash_can_vegas_lid", 50 );
common_scripts\_destructible::destructible_physics( "tag_lid", ( 20, 0, 0 ) );
common_scripts\_destructible::destructible_state( undefined );
}
}
attachlid()
{
self attach( "lv_trash_can_vegas_lid", "tag_lid" );
}
main_sp()
{
var_0 = spawnstruct();
var_0.parts = [];
var_0.parts[0] = spawnstruct();
var_0.parts[0].states = [];
var_0.parts[0].states[0] = spawnstruct();
var_0.parts[0].states[0].model = undefined;
var_0.parts[0].states[0].health = undefined;
var_0.parts[0].states[0].damagecallback[0] = ::serverphysicsobj;
var_0.parts[0].states[0].damagecallback[1] = ::lv_trash_can_vegas_hitfloor;
var_0.parts[0].states[1] = spawnstruct();
var_0.parts[0].states[1].model = undefined;
var_0.parts[0].states[1].health = undefined;
var_0.parts[0].states[1].fx = [];
var_0.parts[0].states[1].fxtags = [];
var_0.parts[0].states[1].fx[0] = loadfx( "fx/props/trash_bottles" );
var_0.parts[0].states[1].fxtags[0] = "tag_fx";
var_0.parts[0].states[1].fx[1] = loadfx( "fx/misc/trash_spiral_runner" );
var_0.parts[0].states[1].fxtags[1] = "tag_fx";
var_0.parts[0].states[1].sound = "exp_trashcan_sweet";
var_0.parts[0].states[1].soundtag = "tag_fx";
var_0.parts[1] = spawnstruct();
var_0.parts[1].tag = "tag_lid";
var_0.parts[1].parent = 0;
var_0.parts[1].alsodamageparent = 1;
var_0.parts[1].states = [];
var_0.parts[1].states[0] = spawnstruct();
var_0.parts[1].states[0].model = undefined;
var_0.parts[1].states[0].showtag = 1;
var_0.parts[1].states[0].health = 50;
var_0.parts[1].states[1] = spawnstruct();
var_0.parts[1].states[1].physicsmodel = "lv_trash_can_vegas_lid";
var_0.parts[1].states[1].physicspush = ( 0, 0, 2000 );
var_0.parts[1].states[1].physicsmultiply = 40;
var_0.parts[1].states[1].physicsdefaultdamagepush = ( 0, 0, 0 );
var_0.parts[1].states[1].health = undefined;
var_0.impacttag = "tag_lid";
var_0.impactradius = 15;
var_0.parts[0].hitfloorstate = 1;
var_0.parts[1].hitfloorstate = 1;
var_0.clipmovementtolerance = 8;
if ( !isdefined( level._interactive ) )
level._interactive = [];
level._interactive["lv_trash_can_vegas"] = var_0;
}
lv_trash_can_vegas()
{
var_0 = spawnstruct();
var_0.obj = self;
var_0.type = "lv_trash_can_vegas";
interactive_fall_and_break( var_0 );
}
interactive_fall_and_break( var_0 )
{
var_1 = level._interactive[var_0.type];
var_0.partstates = [];
var_0.parthealths = [];
for ( var_2 = 0; var_2 < var_1.parts.size; var_2++ )
{
var_0.partstates[var_2] = 0;
var_0.parthealths[var_2] = var_1.parts[var_2].states[0].health;
}
foreach ( var_4 in var_1.parts )
{
foreach ( var_6 in var_4.states )
{
if ( isdefined( var_6.model ) )
precachemodel( var_6.model );
if ( isdefined( var_6.physicsmodel ) )
precachemodel( var_6.physicsmodel );
}
}
foreach ( var_4 in var_1.parts )
{
if ( isdefined( var_4.alsodamageparent ) )
{
}
}
var_0 fandb_handles_collision_brushes();
for (;;)
{
var_0.obj waittill( "damage", var_11, var_12, var_13, var_14, var_15, var_16, var_17, var_18 );
var_15 = destructible_modifydamagetype( var_15 );
var_11 = destructible_modifydamageamount( var_11, var_15, var_12 );
if ( isdefined( var_18 ) )
var_19 = fandb_findpartindex( var_0.type, var_18 );
else
var_19 = 0;
fandb_dodamage( var_0, var_19, var_11, var_12, var_13, var_14, var_15 );
}
}
destructible_modifydamagetype( var_0 )
{
var_1 = common_scripts\_destructible::getdamagetype( var_0 );
return var_1;
}
destructible_modifydamageamount( var_0, var_1, var_2 )
{
if ( common_scripts\utility::issp() )
var_0 = var_0 * 0.5;
else
var_0 = var_0 * 1.0;
if ( common_scripts\_destructible::is_shotgun_damage( var_2, var_1 ) )
{
if ( common_scripts\utility::issp() )
var_0 = var_0 * 8.0;
else
var_0 = var_0 * 4.0;
}
if ( var_1 == "splash" )
{
if ( common_scripts\utility::issp() )
var_0 = var_0 * 9.0;
else
var_0 = var_0 * 13.0;
}
return var_0;
}
fandb_dodamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 )
{
if ( var_6 == "splash" )
{
var_8 = [];
for ( var_9 = 0; var_9 < level._interactive[var_0.type].parts.size; var_9++ )
var_8[var_9] = var_9;
}
else
{
var_8 = [];
var_8[0] = var_1;
}
foreach ( var_11 in var_8 )
{
var_12 = level._interactive[var_0.type].parts[var_11];
var_13 = var_2;
while ( var_13 > 0 && isdefined( var_12.states[var_0.partstates[var_11]] ) )
{
if ( isdefined( var_12.states[var_0.partstates[var_11]].damagecallback ) )
{
foreach ( var_15 in var_12.states[var_0.partstates[var_11]].damagecallback )
var_0 [[ var_15 ]]( var_2, var_3, var_4, var_5, var_6 );
}
if ( isdefined( var_0.parthealths[var_11] ) )
{
var_0.parthealths[var_11] = var_0.parthealths[var_11] - var_13;
if ( var_0.parthealths[var_11] < 0 )
{
var_13 = -1 * var_0.parthealths[var_11];
var_0 fandb_gotostate( var_11, var_0.partstates[var_11] + 1, var_2, var_3, var_5, var_4, var_6 );
}
else
var_13 = 0;
continue;
}
var_13 = 0;
}
if ( var_6 != "splash" && ( isdefined( var_12.alsodamageparent ) && var_12.alsodamageparent > 0 ) && ( !isdefined( var_7 ) || var_12.parent != var_7 ) )
fandb_dodamage( var_0, var_12.parent, var_2 * var_12.alsodamageparent, var_3, var_4, var_5, var_6, var_11 );
}
}
fandb_gotostate( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_7 = level._interactive[self.type].parts[var_0];
var_8 = self.partstates[var_0];
self.partstates[var_0] = var_1;
var_9 = var_8 != var_1;
if ( isdefined( var_7.states[self.partstates[var_0]] ) )
{
if ( var_9 )
{
self.parthealths[var_0] = var_7.states[self.partstates[var_0]].health;
var_10 = var_7.states[self.partstates[var_0]];
if ( isdefined( var_2 ) )
var_2 = var_2 * var_10.physicsmultiply;
self.obj fandb_throwphysicsmodel( var_10.physicsmodel, var_7.tag, var_10.physicspush, var_10.physicsdefaultdamagepush, var_2, var_4, var_5 );
self.obj fandb_fx( var_10.fx, var_10.fxtags );
self.obj fandb_playsound( var_10.sound, var_10.soundtag );
}
self.obj fandb_hideshowtag( var_7.states[self.partstates[var_0]].showtag, var_7.tag );
}
}
fandb_hideshowtag( var_0, var_1, var_2 )
{
if ( isdefined( var_1 ) )
{
if ( isdefined( var_0 ) && var_0 )
{
if ( isdefined( var_2 ) )
self showpart( var_1, var_2 );
else
self showpart( var_1 );
}
else if ( isdefined( var_2 ) )
self hidepart( var_1, var_2 );
else
self hidepart( var_1 );
}
}
fandb_throwphysicsmodel( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
if ( isdefined( var_0 ) )
{
var_7 = spawn( "script_model", self gettagorigin( var_1 ) );
var_7.angles = self gettagangles( var_1 );
var_7 setmodel( var_0 );
if ( isdefined( var_5 ) )
var_8 = var_5;
else
var_8 = var_7.origin;
if ( ( !isdefined( var_6 ) || !isdefined( var_4 ) ) && isdefined( var_3 ) )
var_9 = var_3;
else
var_9 = ( 0, 0, 0 );
if ( isdefined( var_2 ) )
{
var_9 = var_9 + var_2;
var_8 = ( var_8 + var_7.origin ) / 2;
}
var_10 = var_9[0] * anglestoforward( var_7.angles );
var_11 = var_9[1] * anglestoright( var_7.angles );
var_12 = var_9[2] * anglestoup( var_7.angles );
var_9 = var_10 + var_11 + var_12;
if ( isdefined( var_6 ) && isdefined( var_4 ) )
var_9 = var_9 + var_6 * var_4;
var_7 physicslaunchclient( var_8, var_9 );
}
}
fandb_fx( var_0, var_1 )
{
if ( isdefined( var_0 ) )
{
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
{
var_3 = self gettagorigin( var_1[var_2] );
var_4 = self gettagangles( var_1[var_2] );
var_5 = anglestoforward( var_4 );
var_6 = anglestoup( var_4 );
playfx( var_0[var_2], var_3, var_5, var_6 );
}
}
}
fandb_playsound( var_0, var_1 )
{
if ( isdefined( var_0 ) )
thread common_scripts\_destructible::play_sound( var_0, var_1 );
}
fandb_findpartindex( var_0, var_1 )
{
var_2 = level._interactive[var_0];
for ( var_3 = 0; var_3 < var_2.parts.size; var_3++ )
{
if ( isdefined( var_2.parts[var_3].tag ) && var_2.parts[var_3].tag == var_1 )
return var_3;
}
return 0;
}
serverphysicsobj( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = spawn( "script_model", self.obj.origin );
var_5.angles = self.obj.angles;
var_5 setmodel( self.obj.model );
var_2 = vectornormalize( var_2 );
if ( var_4 != "splash" )
var_0 = var_0 * 10;
else
var_0 = var_0 * 2;
var_5 physicslaunchserver( var_3, var_0 * var_2 );
self.obj delete();
self.obj = var_5;
self.obj setcandamage( 1 );
for ( var_6 = 0; var_6 < level._interactive[self.type].parts.size; var_6++ )
fandb_gotostate( var_6, self.partstates[var_6] );
}
fandb_handles_collision_brushes()
{
if ( !isdefined( self.obj.target ) )
return;
var_0 = getentarray( self.obj.target, "targetname" );
var_1 = [];
var_1["pre"] = common_scripts\_destructible::collision_brush_pre_explosion;
foreach ( var_3 in var_0 )
{
if ( !isdefined( var_3.script_destruct_collision ) )
continue;
self thread [[ var_1[var_3.script_destruct_collision] ]]( var_3 );
}
}
lv_trash_can_vegas_hitfloor( var_0, var_1, var_2, var_3, var_4 )
{
if ( !isdefined( self.startedfallmonitor ) )
{
self.startedfallmonitor = 1;
thread lv_trash_can_vegas_hitfloor_internal();
}
}
lv_trash_can_vegas_hitfloor_internal()
{
var_0 = level._interactive["lv_trash_can_vegas"];
if ( !isdefined( self.impacttagstartpos ) )
{
self.impacttagstartpos = self.obj gettagorigin( var_0.impacttag );
self.groundheight = self.obj.origin[2];
}
var_1 = self.impacttagstartpos;
var_2 = var_1;
var_3 = 0;
var_4 = 1;
var_5 = "intact";
var_6 = level.time;
while ( var_4 || var_5 != "deleted" )
{
wait 0.05;
var_1 = self.obj gettagorigin( var_0.impacttag );
if ( distancesquared( var_1, var_2 ) < 0.0625 )
{
var_3++;
if ( var_3 > 20 )
{
self.startedfallmonitor = undefined;
break;
}
}
else
var_3 = 0;
var_2 = var_1;
if ( var_4 && var_1[2] - self.groundheight < var_0.impactradius )
{
var_4 = 0;
lv_trash_can_vegas_throwlid();
var_5 = "deleted";
self notify( "exploded" );
}
if ( var_5 != "deleted" )
{
if ( distancesquared( var_1, self.impacttagstartpos ) > var_0.clipmovementtolerance * var_0.clipmovementtolerance )
{
if ( var_5 == "intact" )
{
var_5 = "pending";
var_6 = gettime();
}
else
{
if ( var_6 > gettime() )
var_6 = gettime() - 1000;
if ( gettime() - var_6 >= 1000 )
{
var_5 = "deleted";
self notify( "exploded" );
}
}
continue;
}
var_5 = "intact";
}
}
}
lv_trash_can_vegas_throwlid()
{
var_0 = level._interactive["lv_trash_can_vegas"];
var_1 = spawn( "script_model", self.obj.origin );
var_1.angles = self.obj.angles;
var_1 setmodel( self.obj.model );
var_1 physicslaunchclient();
self.obj delete();
self.obj = var_1;
self.obj setcandamage( 1 );
for ( var_2 = 0; var_2 < var_0.parts.size; var_2++ )
fandb_gotostate( var_2, var_0.parts[var_2].hitfloorstate );
}