IW4-Dump-Files/maps/_wood.gsc

167 lines
4.6 KiB
Plaintext

#include common_scripts\utility;
/*###################################################
CREATES BREAKABLE WOOD
1) Each trigger_damage has a targetname of "wood_splinter"
2) Each trigger_damage targets the script_brushmodel of the pieces of wood to break
3) Each piece of wood to break targets the script_brushmodels of the broken pieces that will show when it's broken
4) Give the trigger_damage a 'script_noteworthy' to wait for a notify to be given before the wood can break
example: 'script_noteworthy' of 'wood_time' will wait for 'level notify ("wood_time");' before pieces are breakable
5) Exec this script at the start of your level - "maps\_wood::main();"
###################################################*/
main()
{
maps\_utility::precache( "woodgib_medium" );
maps\_utility::precache( "woodgib_big" );
maps\_utility::precache( "woodgib_small1" );
maps\_utility::precache( "woodgib_small2" );
maps\_utility::precache( "wood_plank2" );
maps\_utility::precache( "gib_woodplank" );
wood = getentarray( "wood_splinter", "targetname" );
maps\_utility::array_thread( wood, ::wood_think );
}
wood_think()
{
if ( !isdefined( self.target ) )
{
println( "Wood at ", self getorigin(), " has no target" );
return;
}
mainpiece = getentarray( self.target, "targetname" );
for ( i = 0;i < mainpiece.size;i++ )
{
if ( ( isdefined( mainpiece[ i ].script_noteworthy ) ) && ( mainpiece[ i ].script_noteworthy == "notsolid" ) )
mainpiece[ i ] notsolid();
if ( !isdefined( mainpiece[ i ].target ) )
continue;
mainpiece[ i ].brokenpiece = getentarray( mainpiece[ i ].target, "targetname" );
for ( j = 0;j < mainpiece[ i ].brokenpiece.size;j++ )
{
if ( isdefined( mainpiece[ i ].brokenpiece[ j ] ) )
mainpiece[ i ].brokenpiece[ j ] hide();
}
}
if ( isdefined( self.script_noteworthy ) )
level waittill( self.script_noteworthy );
self waittill( "trigger", other );
if ( isplayer( other ) )
org = other getorigin();
else
org = other.origin;
for ( i = 0;i < mainpiece.size;i++ )
{
if ( !isdefined( mainpiece[ i ].target ) )
continue;
mainpiece[ i ].brokenpiece = getentarray( mainpiece[ i ].target, "targetname" );
for ( j = 0;j < mainpiece[ i ].brokenpiece.size;j++ )
{
if ( isdefined( mainpiece[ i ].brokenpiece[ j ] ) )
mainpiece[ i ].brokenpiece[ j ] show();
}
}
for ( i = 0;i < mainpiece.size;i++ )
{
if ( !isdefined( mainpiece[ i ] ) )
continue;
mainpiece[ i ] playsound( "wood_break" );
mainpiece[ i ] thread splinter( org );
mainpiece[ i ] delete();
}
}
splinter( org )
{
splinter = spawn( "script_model", ( 0, 0, 0 ) );
if ( randomint( 100 ) > 25 )
{
if ( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "dark" ) )
{
if ( randomint( 100 ) > 50 )
splinter setmodel( "wood_plank2" );
else
splinter setmodel( "gib_woodplank" );
}
else
{
if ( randomint( 100 ) > 50 )
splinter setmodel( "woodgib_big" );
else
splinter setmodel( "woodgib_medium" );
}
}
splinter.origin = self getorigin();
splinter thread go( org );
if ( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "dark" ) )
return;
small_gibs( splinter.origin, org );
}
go( org )
{
temp_vec = vectornormalize( self.origin - org );
temp_vec = vector_multiply( temp_vec, 250 + randomint( 100 ) );
// println ("start ", self.origin , " end ", org, " vector ", temp_vec, " player origin ", level.player getorigin());
// x = -80 - (randomint(40));
x = temp_vec[ 0 ];
y = temp_vec[ 1 ];
z = 200 + randomint( 100 );
if ( x > 0 )
self rotateroll( ( 1500 + randomfloat( 2500 ) ) * - 1, 5, 0, 0 );
else
self rotateroll( 1500 + randomfloat( 2500 ), 5, 0, 0 );
self moveGravity( ( x, y, z ), 12 );
wait( 6 );
self delete();
}
small_gibs( org, startorg )
{
splinter = [];
for ( i = 0;i < randomint( 6 ) + 1;i++ )
{
splinter[ i ] = spawn( "script_model", org );
splinter[ i ].origin += ( randomfloat( 10 ) - 5, 0, randomfloat( 30 ) - 15 );
if ( randomint( 100 ) > 50 )
splinter[ i ] setmodel( "woodgib_small1" );
else
splinter[ i ] setmodel( "woodgib_small2" );
startorg += ( 50 - randomint( 100 ), 50 - randomint( 100 ), 0 );
temp_vec = vectornormalize( org - startorg );
temp_vec = vector_multiply( temp_vec, 300 + randomint( 150 ) );
x = temp_vec[ 0 ];
y = temp_vec[ 1 ];
z = 120 + randomint( 200 );
splinter[ i ] moveGravity( ( x, y, z ), 12 );
// splinter[i] rotateroll(1500 + randomfloat (2500), 5,0,0);
if ( x > 0 )
splinter[ i ] rotateroll( ( 1500 + randomfloat( 2500 ) ) * - 1, 5, 0, 0 );
else
splinter[ i ] rotateroll( 1500 + randomfloat( 2500 ), 5, 0, 0 );
}
wait( 6 );
for ( i = 0;i < splinter.size;i++ )
splinter[ i ] delete();
}