IW4-Dump-Files/animscripts/animmode.gsc

126 lines
3.2 KiB
Plaintext

main()
{
self endon( "death" );
self endon( "stop_animmode" );
self notify( "killanimscript" );
self._tag_entity endon( self._anime );
if ( isdefined( self._custom_anim_thread ) )
{
self thread [[ self._custom_anim_thread ]]();
self._custom_anim_thread = undefined;
}
loop = isdefined( self._custom_anim_loop ) && self._custom_anim_loop;
if ( loop )
{
self endon( "stop_loop" );
self._custom_anim_loop = undefined;
}
else
{
thread notify_on_end( self._anime );
}
anime = self._anime;
self._anime = undefined;
arraySize = 0;
if ( loop )
{
arraySize = level.scr_anim[ self._animname ][ anime ].size;
animationName = level.scr_anim[ self._animname ][ anime ][ randomint( arraySize ) ];
}
else
{
animationName = level.scr_anim[ self._animname ][ anime ];
}
origin = getstartOrigin( self._tag_entity.origin, self._tag_entity.angles, animationName );
angles = getstartAngles( self._tag_entity.origin, self._tag_entity.angles, animationName );
newOrigin = self getDropToFloorPosition( origin );
if ( isdefined( newOrigin ) )
origin = newOrigin;
else
println( "Custom animation may be playing in solid for entity '" + self getentnum() + "'\n" );
if ( !isdefined( self.noTeleport ) )
self teleport( origin, angles );
self.pushable = 0;
clear_time = 0.3;
blend_time = 0.2;
if ( isdefined( self.anim_blend_time_override ) )
{
clear_time = self.anim_blend_time_override;
blend_time = self.anim_blend_time_override;
}
self animMode( self._animmode );
self clearAnim( self.root_anim, clear_time );
// self setAnim( %body, 1, 0 ); // The %body node should always have weight 1.
self OrientMode( "face angle", angles[ 1 ] );
anim_string = "custom_animmode";
self setflaggedanimrestart( anim_string, animationName, 1, blend_time, 1 );
self._tag_entity thread maps\_anim::start_notetrack_wait( self, anim_string, anime, self._animname );
self._tag_entity thread maps\_anim::animscriptDoNoteTracksThread( self, anim_string, anime );
//thread maps\_debug::drawArrowForever( self._tag_entity.origin, self._tag_entity.angles );
tag_entity = self._tag_entity;
self._tag_entity = undefined;
self._animmode = undefined;
self endon( "killanimscript" );
endMarker = "end";
if ( !loop )
{
if ( animHasNoteTrack( animationName, "finish" ) )
endMarker = "finish";
else if ( animHasNoteTrack( animationName, "stop anim" ) )
endMarker = "stop anim";
}
while ( 1 )
{
self waittillmatch( anim_string, endMarker );
if ( loop )
{
animationName = level.scr_anim[ self._animname ][ anime ][ randomint( arraySize ) ];
self SetFlaggedAnimKnobLimitedRestart( anim_string, animationName, 1, 0.2, 1 );
if ( isdefined( tag_entity ) )
{
tag_entity thread maps\_anim::start_notetrack_wait( self, anim_string, anime, self._animname );
tag_entity thread maps\_anim::animscriptDoNoteTracksThread( self, anim_string, anime );
}
}
else
{
break;
}
}
if ( endMarker != "end" )
self OrientMode( "face motion" );
self notify( "finished_custom_animmode" + anime );
}
notify_on_end( msg )
{
self endon( "death" );
self endon( "finished_custom_animmode" + msg );
self waittill( "killanimscript" );
self notify( "finished_custom_animmode" + msg );
}