232 lines
6.4 KiB
Plaintext
232 lines
6.4 KiB
Plaintext
#include maps\_anim;
|
|
#include maps\_utility;
|
|
#include common_scripts\utility;
|
|
|
|
prop_notetrack_exist( animname, name )
|
|
{
|
|
if ( !isdefined( level.prop_notetracks ) )
|
|
level.prop_notetracks = [];
|
|
if ( !isdefined( level.prop_notetracks[ animname ] ) )
|
|
level.prop_notetracks[ animname ] = [];
|
|
|
|
if ( isdefined( level.prop_notetracks[ animname ][ name ] ) )
|
|
return true;
|
|
|
|
level.prop_notetracks[ animname ][ name ] = 1;
|
|
return false;
|
|
}
|
|
|
|
add_smoking_notetracks( animname )
|
|
{
|
|
if ( prop_notetrack_exist( animname, "add_smoking_notetracks" ) )
|
|
return;
|
|
|
|
addNotetrack_customFunction( animname, "attach cig", ::attach_cig );
|
|
addNotetrack_customFunction( animname, "detach cig", ::detach_cig );
|
|
addNotetrack_customFunction( animname, "puff", ::smoke_puff );
|
|
addNotetrack_customFunction( animname, "exhale", ::smoke_exhale );
|
|
|
|
level._effect[ "cigar_glow" ] = loadfx( "fire/cigar_glow_far" );
|
|
level._effect[ "cigar_glow_puff" ] = loadfx( "fire/cigar_glow_puff" );
|
|
level._effect[ "cigar_smoke_puff" ] = loadfx( "smoke/cigarsmoke_puff_far" );
|
|
level._effect[ "cigar_exhale" ] = loadfx( "smoke/cigarsmoke_exhale_far" );
|
|
|
|
level.scr_model[ "cigar" ] = "prop_price_cigar";
|
|
}
|
|
|
|
detach_idle_clip( guy )
|
|
{
|
|
if ( isdefined( guy.clip ) )
|
|
guy.clip delete();
|
|
}
|
|
|
|
add_sit_load_ak_notetracks( animname )
|
|
{
|
|
if ( prop_notetrack_exist( animname, "add_cellphone_notetracks" ) )
|
|
return;
|
|
|
|
addNotetrack_customFunction( animname, "attach clip left", ::attach_clip );
|
|
addNotetrack_customFunction( animname, "detach clip left", ::detach_idle_clip );
|
|
|
|
level.scr_model[ "clip" ] = "weapon_ak47_clip";
|
|
}
|
|
|
|
|
|
attach_clip( guy )
|
|
{
|
|
guy notify( "new_prop_rotation" ); // runs a thread to cleanup the cigar if the anim is cut off, this starts the thread over again
|
|
|
|
clip = spawn( "script_model", ( 0, 0, 0 ) );
|
|
clip linkto( guy, "tag_inhand", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
clip setmodel( getModel( "clip" ) );
|
|
guy.clip = clip;
|
|
|
|
self thread prop_delete( clip, guy );
|
|
}
|
|
|
|
add_cellphone_notetracks( animname )
|
|
{
|
|
if ( prop_notetrack_exist( animname, "add_cellphone_notetracks" ) )
|
|
return;
|
|
|
|
addNotetrack_customFunction( animname, "attach phone", ::attach_phone );
|
|
addNotetrack_customFunction( animname, "detach phone", ::detach_phone );
|
|
|
|
level.scr_model[ "cellphone" ] = "com_cellphone_off";
|
|
}
|
|
|
|
attach_phone( guy )
|
|
{
|
|
guy notify( "new_phone_rotation" ); // runs a thread to cleanup the cigar if the anim is cut off, this starts the thread over again
|
|
|
|
phone = spawn( "script_model", ( 0, 0, 0 ) );
|
|
phone linkto( guy, "tag_inhand", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
phone setmodel( getModel( "cellphone" ) );
|
|
guy.phone = phone;
|
|
|
|
self thread prop_delete( phone, guy );
|
|
}
|
|
|
|
detach_phone( guy )
|
|
{
|
|
if ( isdefined( guy.phone ) )
|
|
guy.phone delete();
|
|
}
|
|
|
|
attach_cig( guy )
|
|
{
|
|
guy notify( "new_cigar_rotation" ); // runs a thread to cleanup the cigar if the anim is cut off, this starts the thread over again
|
|
|
|
cigar = spawn( "script_model", ( 0, 0, 0 ) );
|
|
cigar linkto( guy, "tag_inhand", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
cigar setmodel( getModel( "cigar" ) );
|
|
playfxontag( getfx( "cigar_glow" ), cigar, "tag_cigarglow" );
|
|
guy.cigar = cigar;
|
|
|
|
self thread prop_delete_cig( cigar, guy );
|
|
}
|
|
|
|
detach_cig( guy )
|
|
{
|
|
if ( isdefined( guy.cigar ) )
|
|
guy.cigar thread prop_cig_throw();
|
|
}
|
|
|
|
prop_delete( prop, guy )
|
|
{
|
|
guy notify( "new_prop_rotation" + prop.model );// kill the old prop
|
|
guy endon( "new_prop_rotation" + prop.model );
|
|
prop endon( "death" );
|
|
|
|
guy add_endon( "new_prop_rotation" + prop.model );// adds this endon to any of the waits, so we dont get thread leak
|
|
prop add_endon( "death" );// adds this endon to any of the waits, so we dont get thread leak
|
|
self add_wait( ::waittill_msg, "stop_loop" );
|
|
guy add_wait( ::waittill_msg, "death" );
|
|
do_wait_any();// waits for any of the above to occur
|
|
|
|
prop delete();
|
|
}
|
|
|
|
prop_delete_cig( prop, guy )
|
|
{
|
|
guy notify( "new_prop_rotation" + prop.model );// kill the old prop
|
|
guy endon( "new_prop_rotation" + prop.model );
|
|
prop endon( "death" );
|
|
|
|
guy add_endon( "new_prop_rotation" + prop.model );// adds this endon to any of the waits, so we dont get thread leak
|
|
prop add_endon( "death" );// adds this endon to any of the waits, so we dont get thread leak
|
|
self add_wait( ::waittill_msg, "stop_loop" );
|
|
guy add_wait( ::waittill_msg, "death" );
|
|
do_wait_any();// waits for any of the above to occur
|
|
|
|
prop thread prop_cig_throw();
|
|
}
|
|
|
|
prop_cig_throw()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
if ( isdefined( self.cig_throwing ) && self.cig_throwing )
|
|
return;
|
|
self.cig_throwing = true;
|
|
|
|
stopfxontag( getfx( "cigar_glow" ), self, "tag_cigarglow" );
|
|
|
|
time = 3;
|
|
vec = anglestoforward( self.angles );
|
|
self unlink();
|
|
self movegravity( vec * 100, time );
|
|
self rotatevelocity( (400, 0, 0), time, 0, time );
|
|
wait time;
|
|
self delete();
|
|
}
|
|
|
|
smoke_puff( guy )
|
|
{
|
|
if ( !isdefined( guy.cigar ) )
|
|
return;
|
|
|
|
guy endon( "death" );
|
|
guy.cigar endon( "death" );
|
|
playfxOnTag( getfx( "cigar_glow_puff" ), guy.cigar, "tag_cigarglow" );
|
|
wait 1;
|
|
playfxOnTag( getfx( "cigar_smoke_puff" ), guy, "tag_eye" );
|
|
}
|
|
|
|
smoke_exhale( guy )
|
|
{
|
|
if ( !isdefined( guy.cigar ) )
|
|
return;
|
|
playfxOnTag( getfx( "cigar_exhale" ), guy, "tag_eye" );
|
|
}
|
|
|
|
ghillie_leaves()
|
|
{
|
|
bones = [];
|
|
bones[ bones.size ] = "J_MainRoot";
|
|
bones[ bones.size ] = "J_CoatFront_LE";
|
|
bones[ bones.size ] = "J_Hip_LE";
|
|
bones[ bones.size ] = "J_CoatRear_RI";
|
|
bones[ bones.size ] = "J_CoatRear_LE";
|
|
bones[ bones.size ] = "J_CoatFront_RI";
|
|
bones[ bones.size ] = "J_Cheek_RI";
|
|
bones[ bones.size ] = "J_Brow_LE";
|
|
bones[ bones.size ] = "J_Shoulder_RI";
|
|
bones[ bones.size ] = "J_Head";
|
|
bones[ bones.size ] = "J_ShoulderRaise_LE";
|
|
bones[ bones.size ] = "J_Neck";
|
|
bones[ bones.size ] = "J_Clavicle_RI";
|
|
bones[ bones.size ] = "J_Ball_LE";
|
|
bones[ bones.size ] = "J_Knee_Bulge_LE";
|
|
bones[ bones.size ] = "J_Ankle_RI";
|
|
bones[ bones.size ] = "J_Ankle_LE";
|
|
bones[ bones.size ] = "J_SpineUpper";
|
|
bones[ bones.size ] = "J_Knee_RI";
|
|
bones[ bones.size ] = "J_Knee_LE";
|
|
bones[ bones.size ] = "J_HipTwist_RI";
|
|
bones[ bones.size ] = "J_HipTwist_LE";
|
|
bones[ bones.size ] = "J_SpineLower";
|
|
bones[ bones.size ] = "J_Hip_RI";
|
|
bones[ bones.size ] = "J_Elbow_LE";
|
|
bones[ bones.size ] = "J_Wrist_RI";
|
|
|
|
self endon( "death" );
|
|
for ( ;; )
|
|
{
|
|
while ( self.movemode != "run" )
|
|
{
|
|
wait( 0.2 );
|
|
continue;
|
|
}
|
|
|
|
playfxontag( level._effect[ "ghillie_leaves" ], self, random( bones ) );
|
|
wait( randomfloatrange( 0.1, 2.5 ) );
|
|
}
|
|
}
|
|
|
|
attach_cig_self()
|
|
{
|
|
attach_cig( self );
|
|
} |