mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-10 02:17:56 -05:00
346 lines
11 KiB
Plaintext
346 lines
11 KiB
Plaintext
|
||
setFaceRoot( root )
|
||
{
|
||
if( !IsDefined( level.faceStates ) )
|
||
{
|
||
level.faceStates = [];
|
||
}
|
||
if( !IsDefined( level.faceStates[self.face_anim_tree] ) )
|
||
{
|
||
level.faceStates[self.face_anim_tree] = [];
|
||
}
|
||
level.faceStates[self.face_anim_tree]["face_root"] = root;
|
||
}
|
||
buildFaceState( face_state, looping, timer, priority, statetype, animation )
|
||
{
|
||
if( !IsDefined( level.faceStates ) )
|
||
{
|
||
level.faceStates = [];
|
||
}
|
||
if( !IsDefined( level.faceStates[self.face_anim_tree] ) )
|
||
{
|
||
level.faceStates[self.face_anim_tree] = [];
|
||
}
|
||
level.faceStates[self.face_anim_tree][face_state][ "looping" ] = looping;
|
||
level.faceStates[self.face_anim_tree][face_state][ "timer" ] = timer;
|
||
level.faceStates[self.face_anim_tree][face_state][ "priority" ] = priority;
|
||
level.faceStates[self.face_anim_tree][face_state][ "statetype" ] = statetype;
|
||
level.faceStates[self.face_anim_tree][face_state][ "animation" ] = [];
|
||
level.faceStates[self.face_anim_tree][face_state][ "animation" ][0] = animation;
|
||
}
|
||
addAnimToFaceState( face_state, animation )
|
||
{
|
||
Assert( IsDefined( level.faceStates[self.face_anim_tree][face_state] ) );
|
||
Assert( IsDefined( level.faceStates[self.face_anim_tree][face_state]["animation"] ) );
|
||
curr_size = level.faceStates[self.face_anim_tree][face_state][ "animation" ].size;
|
||
level.faceStates[self.face_anim_tree][face_state][ "animation" ][curr_size] = animation;
|
||
}
|
||
isHigherPriority( new_state, old_state )
|
||
{
|
||
if( new_state == old_state && level.faceStates[self.face_anim_tree][old_state]["looping"] )
|
||
{
|
||
return false;
|
||
}
|
||
if( level.faceStates[self.face_anim_tree][new_state]["priority"] >= level.faceStates[self.face_anim_tree][old_state]["priority"] )
|
||
{
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "FaceState "+new_state+" is higher priority than "+old_state+" for entity "+self GetEntityNumber() );
|
||
}
|
||
return true;
|
||
}
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "FaceState "+new_state+" is not higher priority than "+old_state+" for entity "+self GetEntityNumber() );
|
||
}
|
||
return false;
|
||
}
|
||
faceFrameEndNotify()
|
||
{
|
||
self endon( "entityshutdown" );
|
||
self endon( "stop_facial_anims" );
|
||
level endon( "save_restore" );
|
||
waittillframeend;
|
||
self notify( "face", "frameend" );
|
||
}
|
||
waitForAnyPriorityReturn( prevState )
|
||
{
|
||
self endon( "entityshutdown" );
|
||
self endon( "stop_facial_anims" );
|
||
level endon( "save_restore" );
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Waiting for priority return for "+prevState+" for entity "+self GetEntityNumber() );
|
||
}
|
||
while( true )
|
||
{
|
||
self waittill( "face", newState );
|
||
if( isHigherPriority( newState, prevState ) )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
self thread faceFrameEndNotify();
|
||
while( true )
|
||
{
|
||
self waittill( "face", tempState );
|
||
if( tempState == "frameend" )
|
||
{
|
||
break;
|
||
}
|
||
if( isHigherPriority( tempState, newState ) )
|
||
{
|
||
newState = tempState;
|
||
}
|
||
}
|
||
return newState;
|
||
}
|
||
waitForFaceEventRepeat( base_time )
|
||
{
|
||
self endon( "entityshutdown" );
|
||
self endon( "stop_face_anims" );
|
||
self endon( "new_face_event" );
|
||
self endon( "face_timer_expired" );
|
||
level endon( "save_restore" );
|
||
state = self.face_curr_event;
|
||
while( true )
|
||
{
|
||
self waittill( "face", newState );
|
||
if( newState == state )
|
||
{
|
||
self.face_timer = base_time;
|
||
}
|
||
}
|
||
}
|
||
waitForFaceEventComplete()
|
||
{
|
||
self endon( "entityshutdown" );
|
||
self endon( "stop_face_anims" );
|
||
self endon( "new_face_event" );
|
||
level endon( "save_restore" );
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Trying to get animation for state "+self.face_curr_event+" # "+self.face_curr_event_idx+" for entity "+self GetEntityNumber() );
|
||
}
|
||
Assert( IsDefined( level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx] ) );
|
||
if( IsDefined( level.faceStates[self.face_anim_tree][self.face_curr_event]["timer"] ) )
|
||
{
|
||
self.face_timer = level.faceStates[self.face_anim_tree][self.face_curr_event]["timer"];
|
||
}
|
||
else
|
||
{
|
||
self.face_timer = GetAnimLength( level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx] );
|
||
}
|
||
base_time = self.face_timer;
|
||
if( level.faceStates[self.face_anim_tree][self.face_curr_event]["looping"] )
|
||
{
|
||
self thread waitForFaceEventRepeat( self.face_timer );
|
||
}
|
||
while( true )
|
||
{
|
||
if( self.face_timer <= 0 )
|
||
{
|
||
break;
|
||
}
|
||
wait( 0.05 );
|
||
self.face_timer -= 0.05;
|
||
}
|
||
self notify( "face_timer_expired" );
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Timing out face state "+self.face_curr_event+" # "+self.face_curr_event_idx+" for entity "+self GetEntityNumber()+" after "+base_time );
|
||
}
|
||
self.face_curr_event = undefined;
|
||
self.face_curr_event_idx = undefined;
|
||
self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.1, 1.0 );
|
||
self notify( "face", "face_advance" );
|
||
}
|
||
processFaceEvents( localClientNum )
|
||
{
|
||
self endon( "entityshutdown" );
|
||
level endon( "save_restore" );
|
||
state = "face_alert";
|
||
self.face_curr_base = "face_alert";
|
||
numAnims = level.faceStates[self.face_anim_tree][state]["animation"].size;
|
||
self.face_curr_base_idx = RandomInt( numAnims );
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Starting entity "+ self GetEntityNumber() +" in state face_alert" );
|
||
PrintLn( "Found "+numAnims+" anims for state face_alert for entity "+self GetEntityNumber() );
|
||
PrintLn( "Selected anim "+self.face_curr_base_idx+" for entity "+self GetEntityNumber() );
|
||
}
|
||
self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.0, 1.0 );
|
||
if ( isdefined( self.face_death ) && self.face_death )
|
||
state = "face_death";
|
||
self.face_state = state;
|
||
self thread showState();
|
||
self thread watchfor_death();
|
||
while ( true )
|
||
{
|
||
if( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
if( !IsDefined( level.faceStates ) )
|
||
{
|
||
PrintLn( "No face state array!\n" );
|
||
}
|
||
else if( !IsDefined( self.face_anim_tree ) )
|
||
{
|
||
PrintLn( "No face anim tree for entity "+self GetEntityNumber() );
|
||
}
|
||
else if( !IsDefined( state ) )
|
||
{
|
||
PrintLn( "No face state for entity "+self GetEntityNumber() );
|
||
}
|
||
else if( !IsDefined( level.faceStates[self.face_anim_tree] ) )
|
||
{
|
||
PrintLn( "No face state array for anim tree "+self.face_anim_tree+" used by entity "+self GetEntityNumber() );
|
||
}
|
||
else if( !IsDefined( level.faceStates[self.face_anim_tree][state] ) )
|
||
{
|
||
PrintLn( "No face state array entry for state "+state+" in anim tree "+self.face_anim_tree+" for entity "+self GetEntityNumber() );
|
||
}
|
||
}
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Found "+numAnims+" anims for state "+state+" for entity "+self GetEntityNumber() );
|
||
}
|
||
if( IsDefined( self.face_disable ) && self.face_disable )
|
||
{
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Disabling face anims for entity "+self GetEntityNumber() );
|
||
}
|
||
setFaceState( "face_disabled" );
|
||
self ClearAnim( level.faceStates[self.face_anim_tree][ "face_root" ], 0 );
|
||
self notify( "stop_face_anims" );
|
||
self.face_curr_event = undefined;
|
||
self.face_curr_event_idx = undefined;
|
||
while( self.face_disable )
|
||
{
|
||
wait( 0.05 );
|
||
}
|
||
}
|
||
numAnims = level.faceStates[self.face_anim_tree][state]["animation"].size;
|
||
setFaceState( state );
|
||
if( level.faceStates[self.face_anim_tree][state]["statetype"] == "nullstate" )
|
||
{
|
||
if( IsDefined( self.face_curr_event ) )
|
||
{
|
||
self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx], 1.0, 0.1, 1.0 );
|
||
}
|
||
else if( IsDefined( self.face_curr_base ) )
|
||
{
|
||
self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.1, 1.0 );
|
||
}
|
||
}
|
||
else if( level.faceStates[self.face_anim_tree][state]["statetype"] == "exitstate" )
|
||
{
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "Exitstate found, returning for entity "+self GetEntityNumber() );
|
||
}
|
||
self SetAnimKnob( level.faceStates[self.face_anim_tree][state]["animation"][RandomInt(numAnims)], 1.0, 0.1, 1.0 );
|
||
self notify( "stop_face_anims" );
|
||
self.face_curr_event = undefined;
|
||
self.face_curr_event_idx = undefined;
|
||
return;
|
||
}
|
||
else if( level.faceStates[self.face_anim_tree][state]["statetype"] == "basestate" )
|
||
{
|
||
if( !IsDefined( self.face_curr_base ) || self.face_curr_base != state )
|
||
{
|
||
self.face_curr_base = state;
|
||
self.face_curr_base_idx = RandomInt( numAnims );
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "New base face anim state "+self.face_curr_base+" anim # "+self.face_curr_base_idx+" for entity "+self GetEntityNumber() );
|
||
}
|
||
if( !IsDefined( self.face_curr_event ) )
|
||
{
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "trying to play animation for state "+self.face_curr_base+" w/ index "+self.face_curr_base_idx+" for entity "+self GetEntityNumber() );
|
||
}
|
||
self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.1, 1.0 );
|
||
}
|
||
}
|
||
}
|
||
else if( level.faceStates[self.face_anim_tree][state]["statetype"] == "eventstate" )
|
||
{
|
||
if( !IsDefined( self.face_curr_event ) || !level.faceStates[self.face_anim_tree][self.face_curr_event]["looping"] || self.face_curr_event != state )
|
||
{
|
||
self.face_curr_event= state;
|
||
self.face_curr_event_idx = RandomInt( numAnims );
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
PrintLn( "New face anim event "+self.face_curr_event+" anim # "+self.face_curr_event_idx+" for entity "+self GetEntityNumber() );
|
||
}
|
||
self SetFlaggedAnimKnob( "face_event", level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx], 1.0, 0.1, 1.0 );
|
||
self thread waitForFaceEventComplete();
|
||
}
|
||
}
|
||
if( IsDefined( self.face_curr_event ) )
|
||
{
|
||
state = self waitForAnyPriorityReturn( self.face_curr_event );
|
||
}
|
||
else
|
||
{
|
||
state = self waitForAnyPriorityReturn( self.face_curr_base );
|
||
}
|
||
}
|
||
}
|
||
showState( state )
|
||
{
|
||
self endon( "entityshutdown" );
|
||
level endon( "save_restore" );
|
||
while ( true )
|
||
{
|
||
if ( GetDvarInt( #"cg_debugFace" ) != 0 )
|
||
{
|
||
if ( isdefined( self.face_state ) && isdefined( self.origin ) )
|
||
{
|
||
entNum = self getentitynumber();
|
||
if ( !isdefined( entNum ) )
|
||
entNum = "?";
|
||
if ( isdefined( self.face_disable ) && self.face_disable )
|
||
disableChar = "-";
|
||
else
|
||
disableChar = "+";
|
||
if ( isdefined( self.face_death ) && self.face_death )
|
||
deathChar = "D";
|
||
else
|
||
deathChar = "A";
|
||
Print3d( self.origin + ( 0, 0, 72 ), disableChar + deathChar + "["+ entNum +"]" + self.face_state, (1,1,1), 1, 0.25 );
|
||
}
|
||
}
|
||
wait( 0.01667 );
|
||
}
|
||
}
|
||
setFaceState( state )
|
||
{
|
||
if( state == "face_advance" )
|
||
{
|
||
if( IsDefined( self.face_curr_event ) )
|
||
{
|
||
self.face_state = self.face_curr_event;
|
||
}
|
||
else if( IsDefined( self.face_curr_base ) )
|
||
{
|
||
self.face_state = self.face_curr_base;
|
||
}
|
||
return;
|
||
}
|
||
self.face_state = state;
|
||
}
|
||
watchfor_death()
|
||
{
|
||
self endon( "entityshutdown" );
|
||
level endon( "save_restore" );
|
||
if ( !isdefined( self.face_death ) )
|
||
{
|
||
self waittillmatch( "face", "face_death" );
|
||
self.face_death = true;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|