etqw-sdk/base/script/vehicles/cockpits/gpmg.script
2008-05-29 00:00:00 +00:00

100 lines
2.4 KiB
Text

object vehicle_gpmg_cockpit : vehicle_basic_cockpit {
void preinit();
void destroy();
void OnEntered();
void AnimThread();
float surfaceId;
string muzzleJoint;
}
void vehicle_gpmg_cockpit::preinit() {
surfaceId = -1;
muzzleJoint = getKey( "joint_muzzle" );
thread AnimThread();
}
void vehicle_gpmg_cockpit::OnEntered() {
string surfaceName = getKey( "surface_name" );
if ( surfaceName == "" ) {
myVehicle.vOnCockpitCreated();
} else {
surfaceId = myVehicle.getSurfaceId( surfaceName );
myVehicle.hideSurface( surfaceId );
}
}
void vehicle_gpmg_cockpit::destroy() {
if ( myVehicle != $null_entity ) {
if ( surfaceId == -1 ) {
myVehicle.vOnCockpitDestroyed();
} else {
myVehicle.showSurface( surfaceId );
}
}
sys.killThread( "vehicle_gpmg_cockpit::AnimThread" );
}
#define VEHICLE_GPMG_STATE_IDLE 0
#define VEHICLE_GPMG_STATE_ATTACK 1
#define VEHICLE_GPMG_STATE_ATTACK_END 2
void vehicle_gpmg_cockpit::AnimThread() {
sys.threadName( "vehicle_gpmg_cockpit::AnimThread" );
player myPlayer = myVehicle.getPositionPlayer( passengerId );
if ( myPlayer != $null_entity ) {
if ( !myPlayer.proxyFiringWeaponStart ) {
sys.wait( playAnim( ANIMCHANNEL_ALL, "raise" ) );
}
}
float idleTime;
float state = VEHICLE_GPMG_STATE_IDLE;
float newState;
playCycle( ANIMCHANNEL_ALL, "idle" );
while ( true ) {
boolean proxyFiringWeaponStart = false;
if ( myPlayer != $null_entity ) {
proxyFiringWeaponStart = myPlayer.proxyFiringWeaponStart;
}
if ( proxyFiringWeaponStart ) {
newState = VEHICLE_GPMG_STATE_ATTACK;
} else {
if ( state == VEHICLE_GPMG_STATE_ATTACK ) {
newState = VEHICLE_GPMG_STATE_ATTACK_END;
} else {
if ( sys.getTime() > idleTime ) {
newState = VEHICLE_GPMG_STATE_IDLE;
}
}
}
if ( state != newState ) {
if ( state == VEHICLE_GPMG_STATE_ATTACK ) {
stopEffect( "fx_muzzle" );
}
state = newState;
if ( state == VEHICLE_GPMG_STATE_IDLE ) {
playCycle( ANIMCHANNEL_ALL, "idle" );
} else if ( state == VEHICLE_GPMG_STATE_ATTACK ) {
playCycle( ANIMCHANNEL_ALL, "fire" );
playEffect( "fx_muzzle", muzzleJoint, 1 );
} else if ( state == VEHICLE_GPMG_STATE_ATTACK_END ) {
idleTime = sys.getTime() + playAnim( ANIMCHANNEL_ALL, "fire_end" );
}
}
sys.waitFrame();
}
}