Script:Files:script/vehicles/cockpits/husky.script
From Mod Wiki
object vehicle_husky_cockpit : vehicle_basic_cockpit { void preinit(); void destroy(); void OnEntered(); void AnimThread(); float HideSurface( string surfaceName ); void ShowSurface( float id ); string turnLeftAnim; string turnRightAnim; string centerAnim; string brakeAnim; float surfaceId0; float surfaceId1; float surfaceId2; float surfaceId3; } void vehicle_husky_cockpit::preinit() { surfaceId0 = -1; surfaceId1 = -1; surfaceId2 = -1; surfaceId3 = -1; turnLeftAnim = getKey( "turn_left_anim" ); turnRightAnim = getKey( "turn_right_anim" ); centerAnim = getKey( "base_anim" ); brakeAnim = getKey( "brake_anim" ); } void vehicle_husky_cockpit::OnEntered() { surfaceId0 = HideSurface( getKey( "surface_name0" ) ); surfaceId1 = HideSurface( getKey( "surface_name1" ) ); surfaceId2 = HideSurface( getKey( "surface_name2" ) ); surfaceId3 = HideSurface( getKey( "surface_name3" ) ); thread AnimThread(); } void vehicle_husky_cockpit::destroy() { ShowSurface( surfaceId0 ); ShowSurface( surfaceId1 ); ShowSurface( surfaceId2 ); ShowSurface( surfaceId3 ); sys.killThread( "vehicle_husky_cockpit::AnimThread" ); } #define HUSKY_STEER_LEFT 0 #define HUSKY_STEER_RIGHT 1 #define HUSKY_STEER_CENTER 2 void vehicle_husky_cockpit::AnimThread() { sys.threadName( "vehicle_husky_cockpit::AnimThread" ); playAnimBlended( ANIMCHANNEL_TORSO, centerAnim, 0.25f ); sys.wait( playAnim( ANIMCHANNEL_LEGS, "into" ) ); float steerState = HUSKY_STEER_CENTER; float newSteerState; boolean isBraking; float oldSteer = 0.f; while ( true ) { entity driver = myVehicle.getDriver(); vector move; boolean leaning = false; if ( driver != $null_entity ) { move = driver.getMove(); if ( driver.getButton( PK_LEANLEFT ) || driver.getButton( PK_LEANRIGHT ) ) { leaning = true; } } else { move = '0 0 0'; } boolean braking = leaning; if ( !braking ) { float vel = myVehicle.getLinearVelocity() * myVehicle.getWorldAxis( 0 ); if ( sys.fabs( vel ) > 10.f && move_x != 0.f ) { if ( ( move_x < 0.f ) != ( vel < 0.f ) ) { braking = true; } } } if ( isBraking != braking ) { isBraking = braking; if ( isBraking ) { playAnimBlended( ANIMCHANNEL_TORSO, brakeAnim, 0.25f ); } else { playAnimBlended( ANIMCHANNEL_TORSO, centerAnim, 0.25f ); } } if ( move_y < 0 ) { if ( move_y > oldSteer ) { newSteerState = HUSKY_STEER_CENTER; } else { newSteerState = HUSKY_STEER_LEFT; } } else if ( move_y > 0 ) { if ( move_y < oldSteer ) { newSteerState = HUSKY_STEER_CENTER; } else { newSteerState = HUSKY_STEER_RIGHT; } } else { newSteerState = HUSKY_STEER_CENTER; } if ( newSteerState != steerState ) { steerState = newSteerState; if ( steerState == HUSKY_STEER_CENTER ) { playAnimBlended( ANIMCHANNEL_LEGS, centerAnim, 0.25f ); } else if ( steerState == HUSKY_STEER_RIGHT ) { playAnimBlended( ANIMCHANNEL_LEGS, turnRightAnim, 0.25f ); } else if ( steerState == HUSKY_STEER_LEFT ) { playAnimBlended( ANIMCHANNEL_LEGS, turnLeftAnim, 0.25f ); } } oldSteer = move_y; sys.waitFrame(); } } float vehicle_husky_cockpit::HideSurface( string surfaceName ) { float id = -1; if ( surfaceName != "" ) { id = myVehicle.getSurfaceId( surfaceName ); myVehicle.hideSurface( id ); } return id; } void vehicle_husky_cockpit::ShowSurface( float id ) { if ( id != -1 ) { myVehicle.showSurface( id ); } }