#define MCP_JOYSTICK_DIR_LEFT 0 #define MCP_JOYSTICK_DIR_CENTER 1 #define MCP_JOYSTICK_DIR_RIGHT 2 #define MCP_LEVEL_CENTER 0 #define MCP_LEVEL_FORWARDS 1 #define MCP_LEVEL_BACKWARDS 2 #define MCP_FIRING_END 0 #define MCP_FIRING_START 1 #define MCP_FIRING_FIRING 2 // LEGS = left arm - thumb // HEAD = right arm // TORSO = thumb object vehicle_mcp_cockpit : vehicle_basic_cockpit { void destroy(); void AnimThread(); void OnEntered(); }; void vehicle_mcp_cockpit::OnEntered() { thread AnimThread(); } void vehicle_mcp_cockpit::AnimThread() { sys.threadName( "vehicle_mcp_cockpit::AnimThread" ); float length = playAnim( ANIMCHANNEL_LEGS, "into" ); playAnim( ANIMCHANNEL_HEAD, "into" ); playAnim( ANIMCHANNEL_TORSO, "into" ); sys.wait( length ); float stickDirection = MCP_JOYSTICK_DIR_CENTER; float leverDirection = MCP_LEVEL_CENTER; float firingStatus = MCP_FIRING_END; float fireStartEndTime; while ( true ) { entity driver = myVehicle.getDriver(); vector move; boolean fire; if ( driver != $null_entity ) { move = driver.getMove(); fire = driver.getButton( PK_ATTACK ); } else { move = '0 0 0'; fire = false; } if ( move_y < 0 ) { if ( stickDirection != MCP_JOYSTICK_DIR_LEFT ) { playAnimBlended( ANIMCHANNEL_LEGS, "left", 0.2f ); stickDirection = MCP_JOYSTICK_DIR_LEFT; } } else if ( move_y > 0 ) { if ( stickDirection != MCP_JOYSTICK_DIR_RIGHT ) { playAnimBlended( ANIMCHANNEL_LEGS, "right", 0.2f ); stickDirection = MCP_JOYSTICK_DIR_RIGHT; } } else { if ( stickDirection != MCP_JOYSTICK_DIR_CENTER ) { playAnimBlended( ANIMCHANNEL_LEGS, "center", 0.2f ); stickDirection = MCP_JOYSTICK_DIR_CENTER; } } if ( move_x > 0 ) { if ( leverDirection != MCP_LEVEL_FORWARDS ) { playAnimBlended( ANIMCHANNEL_HEAD, "forwards", 0.2f ); leverDirection = MCP_LEVEL_FORWARDS; } } else if ( move_x < 0 ) { if ( leverDirection != MCP_LEVEL_BACKWARDS ) { playAnimBlended( ANIMCHANNEL_HEAD, "reverse", 0.2f ); leverDirection = MCP_LEVEL_BACKWARDS; } } else { if ( leverDirection != MCP_LEVEL_CENTER ) { playAnimBlended( ANIMCHANNEL_HEAD, "center", 0.2f ); leverDirection = MCP_LEVEL_CENTER; } } if ( fire ) { if ( firingStatus == MCP_FIRING_END ) { fireStartEndTime = sys.getTime() + playAnimBlended( ANIMCHANNEL_TORSO, "fire_start", 0.001f ); firingStatus = MCP_FIRING_START; } else if ( firingStatus == MCP_FIRING_START ) { if ( sys.getTime() > fireStartEndTime ) { playAnimBlended( ANIMCHANNEL_TORSO, "fire", 0.001f ); firingStatus = MCP_FIRING_FIRING; } } } else { if ( firingStatus != MCP_FIRING_END ) { playAnimBlended( ANIMCHANNEL_TORSO, "fire_end", 0.1f ); firingStatus = MCP_FIRING_END; } } sys.waitFrame(); } } void vehicle_mcp_cockpit::destroy() { sys.killThread( "vehicle_mcp_cockpit::AnimThread" ); }