Jump to content

Thrustmaster T-flight HOTAS X Review


34 replies to this topic

#21 Garamanus

    Member

  • PipPipPip
  • Legendary Founder
  • Legendary Founder
  • 63 posts
  • Location260+ Ping, Australia

Posted 17 October 2012 - 10:12 PM

6 screens, no wonder i get shot from the other side of the battle field...

#22 Garamanus

    Member

  • PipPipPip
  • Legendary Founder
  • Legendary Founder
  • 63 posts
  • Location260+ Ping, Australia

Posted 21 October 2012 - 07:51 PM

How is the joy stick at aimming? finding the G940 hard work.

#23 Mason Grimm

    Com Guard / Technician

  • PipPipPipPipPipPipPipPipPip
  • Bad Company
  • Bad Company
  • 2,886 posts
  • Facebook: Link
  • LocationToronto, ON

Posted 22 October 2012 - 04:08 AM

I'd be interested in this as well. This stick was recommended to me and the price is right in my range. I am a mouse/keyboard person as well but the immersion is just too much to pass up.

#24 knight-of-ni

    Member

  • PipPipPipPipPipPipPipPip
  • Overlord
  • Overlord
  • 1,627 posts
  • Location/dev/null

Posted 26 October 2012 - 03:56 PM

Excellent review. After reading this, I went out and bought one off Amazon.
While I don't regret buying the joystick, it did help to convince me to just use the mouse and keyboard... at least when I'm in a light mech.
I could just be me, but I could not get the hang of it... I was constantly overcompensating my aim and running into stuff. Yeah, it's probably user error, but at least now I have learned what I am more comfortable using.

I might try it again when the joystick code is finalized.

#25 Artificer

    Member

  • PipPipPip
  • 53 posts

Posted 01 November 2012 - 04:55 AM

6 screens...your monitor frames are right where the torso crosshair is. I'm not sure this is such a good idea.

#26 DeathsTouch

    Member

  • PipPip
  • Bad Company
  • Bad Company
  • 30 posts
  • LocationSalem,Or

Posted 01 November 2012 - 12:13 PM

View PostAllGamer, on 11 October 2012 - 03:11 PM, said:

just picked up one of these last night, working great!

here's the profile for it to work properly:

user.cfg
cl_joystick_sensitivity = 0
cl_joystick_throttle_range = 0
cl_joystick_invert_throttle = 1
cl_joystick_invert_pitch = 1


actionmaps.xml
<ActionMaps Version="10">
<actionmap name="hud">
  <action name="toggle_Weapon_Group">
   <rebind device="joystick" input="" index="1" defaultInput="j0_button4"/>
  </action>
</actionmap>
<actionmap name="mech">
  <action name="m_toggle_night_vision">
   <rebind device="joystick" input="j0_button6" index="1" defaultInput="j1_pov1_left"/>
  </action>
  <action name="m_toggle_thermal_vision">
   <rebind device="joystick" input="j0_button5" index="1" defaultInput="j1_pov1_up"/>
  </action>
  <action name="powerToggle">
   <rebind device="joystick" input="j0_button11" index="1" defaultInput="j1_button11"/>
  </action>
  <action name="m_freelook">
   <rebind device="joystick" input="" index="1" defaultInput="j0_button7"/>
  </action>
  <action name="m_wg_as">
   <rebind device="joystick" input="" index="1" defaultInput="j0_button1"/>
  </action>
  <action name="m_wg6">
   <rebind device="joystick" input="" index="1" defaultInput="j1_button9"/>
  </action>
  <action name="m_wg5">
   <rebind device="joystick" input="" index="1" defaultInput="j1_button8"/>
  </action>
  <action name="m_wg4">
   <rebind device="joystick" input="j0_button2" index="0" defaultInput="j1_button7"/>
  </action>
  <action name="m_wg3">
   <rebind device="joystick" input="j0_button3" index="0" defaultInput="j1_button6"/>
  </action>
  <action name="m_wg2">
   <rebind device="joystick" input="j0_button1" index="0" defaultInput="j1_button5"/>
  </action>
  <action name="m_wg1">
   <rebind device="joystick" input="j0_button0" index="1" defaultInput="j1_button4"/>
  </action>
  <action name="joy_turn">
   <rebind device="joystick" input="j0_axis_x" index="0" defaultInput="j0_rot_z"/>
  </action>
  <action name="m_jump_jet">
   <rebind device="joystick" input="j0_button9" index="1" defaultInput="j0_button5"/>
  </action>
  <action name="m_fullStop">
   <rebind device="joystick" input="" index="1" defaultInput="j1_button2"/>
  </action>
  <action name="shutdownOverride">
   <rebind device="joystick" input="j0_button10" index="1" defaultInput="j1_button10"/>
  </action>
  <action name="joy_invert_throttle">
   <rebind device="joystick" input="" index="0" defaultInput="j1_button1"/>
  </action>
  <action name="joy_throttle">
   <rebind device="joystick" input="j0_axis_z" index="0" defaultInput="j0_slider0"/>
  </action>
  <action name="joy_torso_rotateyaw">
   <rebind device="joystick" input="j0_rot_z" index="0" defaultInput="j0_axis_x"/>
  </action>
  <action name="m_next_target">
   <rebind device="joystick" input="j0_button4" index="1" defaultInput="j0_button5"/>
  </action>
  <action name="m_torso_centre">
   <rebind device="joystick" input="j0_button7" index="1" defaultInput="j1_button3"/>
  </action>
  <action name="m_toggle_zoom_mode">
   <rebind device="joystick" input="j0_button8" index="0" defaultInput="j1_pov_right"/>
  </action>
  <action name="attack1">
   <rebind device="joystick" input="" index="3" defaultInput="j0_button0"/>
  </action>
</actionmap>
</ActionMaps>


I'm running windows 7. Where exactly are these files located in?

#27 Drennin

    Rookie

  • 1 posts

Posted 02 November 2012 - 04:37 AM

I'm curious about this as well. I've still been unable to get any of the buttons/throttle mapped correctly.

#28 CandyJesus

    Member

  • Pip
  • 15 posts
  • LocationOregon

Posted 11 November 2012 - 04:53 PM

If you did the default install, the files are located C:\Games\Piranha Games\MechWarrior Online\
That is where the user.cfg is. The actionmap.xml file is \USER\Profiles\whatever

For myself, I have replaced the user.cfg and both actionmap.xml files (default and my UserName) but still it does nothing.

#29 Hakkukakt

    Member

  • PipPipPipPipPipPip
  • 264 posts
  • LocationSuisse / Lausanne

Posted 11 November 2012 - 07:14 PM

hum normaly, with Thrustmaster joystick .. it's target script that do the mapping ...

i'm using a warthog and that's how i use the mapping through the target script .. and it's work well


so when i play MWO ... i fisrt start the script, then launch mwo and mapping is ok

perhaps if you adapt this script for your model, that's can help a little ?

//**************************************************************************
//  UNOFFICIAL MECHWARRIOR JOYSTICK SUPPORT
//	    - For the Thrustmaster Warthog
//
//
//	    Written by Jason 'Crescent Fresh' Knobler
//   (http://mwomercs.com/forums/user/164331-crescent-fresh/)
//
//  MechWarrior Online Joystick -> Mouse/Keyboard override
//
//**************************************************************************
include "target.tmh"
float fJOYAXIS_LIMIT = 32767.0;
float fDEFAULT_SENSITIVITY = 10.0;
define UPDATE_RATE 20   // In miliseconds
int  g_iAxisXDir;	   // X-Axis input direction. '-1' = inverted X axis; '1' = normal X axis
int  g_iAxisYDir;	   // Y-Axis input direction. '-1' = inverted Y axis; '1' = normal Y axis
int  g_bIsShutdown;	  // While true, Warthog throttle considers the mech shutdown, and must use Throttle[EORIGN] to power on.
											    // While false, Warthog thottle considers the mech powered up, and must use Throttle[EORMOTOR] to shut down.
float g_fSensMod;		  // Sensitivity modifier on FC Throttle.
int   g_iSlugStage;	  // What stage [1-5] on how to apply procedural sensitiviy. Indicated by LED lights.
float g_fDeadZone;	    // User setting centering deadzone variable
struct sMWOAxis
{
	    //
	    // All the below data members belong to each X and Y axis
	    //
	    float fJoy;			  // The basic (converted) input value from the joystick
	    float fJoyPrev;  // 'fJoy's previous value in the last update
 
	    int iMouse;			  // The emulated, absolute coordinate of the mouse
	    float fSlugPerc;	    // Procedural sensitivity that gains as input persists when in 'JOYSTATE_SLUGGISH'
	    int bSnapDir;	  // Determines whether the joystick is moving away or towards the center when in 'JOYSTATE_SNAP' state. [1 == away; 0 == centering]
 
	    int bHasPulseCenter;// Used in 'JOYSTATE_ABSOLUTE' to determine when to center torso
}
define AXIS_X 0
define AXIS_Y 1
define NUM_AXIS 2
sMWOAxis g_AxisData[NUM_AXIS]; // Stores per axis data used to manipulate raw joystick input (X and Y axis)
define SLUG_INCREMENTS 0.01 // Sluggish inc/dec amount per stage. Defaults at stage/LED '3'
define SLUG_DEFAULT_STAGE 5
//////////////////////////
// JOYSTICK STATES
//  - NORM:	  Simply taking raw joystick values and converting them 1:1 to "MWO Units".
//  - SLUGGISH: Over a specified duration, a linearly increasing percentage of the input is applied. This resets anytime the joystick is centered.
//  - SNAP:	  Input motions moving away from joystick center are accelerated, and moving back towards center are slowed.
//  - ABSOLUTE: The current input of the joystick maps directly to the yaw/pitch of the torso
//
// NOTE: All joystick states can be tweeked by applying a global sensitiviy modifer using Throttle[THR_FC].
//////////////////////////
define JOYSTATE_NORM  (1 << 0) // = 1
define JOYSTATE_SLUGGISH (1 << 1) // = 2
define JOYSTATE_SNAP  (1 << 2) // = 4
define JOYSTATE_ABSOLUTE (1 << 3) // = 8
// The negates of the states above. (no '~' operator?)
define JOYSTATE_NORM_OFF			    4294967294  // = ~JOYSTATE_NORM
define JOYSTATE_SLUGGISH_OFF    4294967293  // = ~JOYSTATE_SLUGGISH
define JOYSTATE_SNAP_OFF			    4294967291  // = ~JOYSTATE_SNAP
define JOYSTATE_ABSOLUTE_OFF    4294967287  // = ~JOYSTATE_ABSOLUTE
int g_iJoyStates; // A bitmask to represent what JOYSTATE_*'s are enabled
int InitAxis(int iIndex)
{
	    g_AxisData[iIndex].fJoy = 0.0;
	    g_AxisData[iIndex].fJoyPrev = 0.0;
 
	    g_AxisData[iIndex].iMouse = 0;
	    g_AxisData[iIndex].fSlugPerc = 0.01;
	    g_AxisData[iIndex].bSnapDir = 0;
 
	    g_AxisData[iIndex].bHasPulseCenter = 0;
}
// Program Startup
int main()
{
	    if(Init(&EventHandle)) return 1; // declare the event handler, return on error
 
	    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	    // Initialization code is below:
	    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
	    g_iAxisXDir = 1; // X-Axis defaults to NOT inverted
	    g_iAxisYDir = -1; // Y-Axis defaults to inverted
 
	    g_iJoyStates = JOYSTATE_NORM;
 
	    // Start, assuming mech is not shutdown
	    g_bIsShutdown = 0;
 
	    g_fSensMod = fDEFAULT_SENSITIVITY;
 
	    g_iSlugStage = SLUG_DEFAULT_STAGE;
 
	    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1-LED2-LED3-LED4-LED5));
 
	    g_fDeadZone = 0.25;
 
	    InitAxis(AXIS_X);
	    InitAxis(AXIS_Y);
 
 
	    //--------------------------------------------
	    // AXIS MAPPINGS
	    //--------------------------------------------
	    // We only need to assign the main throttle to be interpreted by MWO, which will control the mech's velocity.
	    // The joystick and THR_FC will be handled in (this) software. Joystick values are converted and used to move mouse.
 
	    MapAxis(&Throttle, THR_RIGHT, DX_Z_AXIS);
 
 
	    //--------------------------------------------
	    // JOYSTICK MAPPINGS
	    //--------------------------------------------
 
	    // Firing weapons
	    MapKey(&Joystick, TG1, '1');   // Wep. group #1
	    MapKey(&Joystick, H2U, '2');   // Wep. group #2
	    MapKey(&Joystick, H2D, '3');   // Wep. group #3
	    MapKey(&Joystick, H2R, '4');   // Wep. group #4
	    MapKey(&Joystick, H2L, '5');   // Wep. group #5
	    MapKey(&Joystick, S1, '6');   // Wep. group #6
	    MapKey(&Joystick, S2, PULSE+BSP);   // MapKey(&Joystick, S2, '') or MapKey(&Joystick, S2, PULSE+BSP);
 
    // Hold for cockpit look
	    MapKey(&Joystick, S3, L_CTL);
	  
	    // Weapon group toggles
	    MapKey(&Joystick, H4U, PULSE+USB[0x52]);  // Up
	    MapKey(&Joystick, H4R, PULSE+USB[0x4F]);  // Right
	    MapKey(&Joystick, H4D, PULSE+USB[0x51]);  // Down
	    MapKey(&Joystick, H4L, PULSE+USB[0x50]);  // Left
	    MapKey(&Joystick, H4P, PULSE+R_CTL);   // Press -TOGGLE-
 
	    // Jump Jets
	    // MapKey(&Joystick, S4, USB[0x2C]); // Spacebar
	    MapKey(&Joystick, S4, SPC); // Spacebar
 
	    // Digital aimmer --Joystick round HAT
	    MapKey(&Joystick, H1U, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_Y].iMouse = g_AxisData[AXIS_Y].iMouse + (g_iAxisYDir * g_fSensMod * 0.5); DXAxis(MOUSE_Y_AXIS, g_AxisData[AXIS_Y].iMouse);"));
	    MapKey(&Joystick, H1D, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_Y].iMouse = g_AxisData[AXIS_Y].iMouse - (g_iAxisYDir * g_fSensMod * 0.5); DXAxis(MOUSE_Y_AXIS, g_AxisData[AXIS_Y].iMouse);"));
	    MapKey(&Joystick, H1L, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_X].iMouse = g_AxisData[AXIS_X].iMouse - (g_iAxisXDir * g_fSensMod * 0.5); DXAxis(MOUSE_X_AXIS, g_AxisData[AXIS_X].iMouse);"));
	    MapKey(&Joystick, H1R, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_X].iMouse = g_AxisData[AXIS_X].iMouse + (g_iAxisXDir * g_fSensMod * 0.5); DXAxis(MOUSE_X_AXIS, g_AxisData[AXIS_X].iMouse);"));
 
	    // Fine percision aimmer  --Joystick DPAD
	    MapKey(&Joystick, H3U, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_Y].iMouse = g_AxisData[AXIS_Y].iMouse + g_iAxisYDir; DXAxis(MOUSE_Y_AXIS, g_AxisData[AXIS_Y].iMouse);"));
	    MapKey(&Joystick, H3D, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_Y].iMouse = g_AxisData[AXIS_Y].iMouse - g_iAxisYDir; DXAxis(MOUSE_Y_AXIS, g_AxisData[AXIS_Y].iMouse);"));
	    MapKey(&Joystick, H3L, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_X].iMouse = g_AxisData[AXIS_X].iMouse - g_iAxisXDir; DXAxis(MOUSE_X_AXIS, g_AxisData[AXIS_X].iMouse);"));
	    MapKey(&Joystick, H3R, REXEC(3, UPDATE_RATE, "g_AxisData[AXIS_X].iMouse = g_AxisData[AXIS_X].iMouse + g_iAxisXDir; DXAxis(MOUSE_X_AXIS, g_AxisData[AXIS_X].iMouse);"));
 
 
	    //--------------------------------------------
	    // THROTTLE MAPPINGS
	    //--------------------------------------------
 
	    // Map Throttle Turning the mech  --Throttle side HAT
	    MapKey(&Throttle, MSL, 'a'); // left
	    MapKey(&Throttle, MSR, 'd'); // right
	   
	    // Map Throttle up - down  --Throttle side HAT
	    // MapKey(&Throttle, MSU, ''); // up
	    // MapKey(&Throttle, MSD, ''); // down
	   
	    // Map Throttle push  --Throttle side HAT-- pip zoom
	    MapKey(&Throttle, MSP, PULSE+'v'); // push
	   
	    // Target Enemy
	    MapKey(&Throttle, SC, PULSE+'r'); // push to target
 
	    // Torso Center
	    MapKey(&Throttle, LTB, PULSE+'c');
 
	    // Toggle zoom
	    MapKey(&Throttle, CSD, PULSE+'z');
 
	    // TEAM SPEAK chat toggle (F8)
	    MapKey(&Throttle, CSU, USB[0x41]); // F8
 
	    // Show scores
	    MapKey(&Throttle, SPDF, USB[0x2B]);
 
	    // Show map
	    MapKey(&Throttle, SPDB, PULSE+'b');
 
	    // Map Throttle CHB, Toggle Friend Name Info
	    MapKey(&Throttle, CHB, 'q');
	   
	    // Map Throttle CHM Push alpha strike
	    // MapKey(&Throttle, CHM, PULSE+USB[0x31]);
	   
	    // Map Throttle CHF, reset UAC5 macro
	    MapKey(&Throttle, CHF, PULSE+R_CTL+R_CTL+RARROW);
 
	    // Thermal vision toggle
	    MapKey(&Throttle, BSF, PULSE+'h');
	    MapKeyR(&Throttle, BSF, PULSE+'h');
	   
	    // Map Throttle BSM Push
	    MapKey(&Throttle, BSM, PULSE+'/');
		 
	    // Night vision toggle
	    MapKey(&Throttle, BSB, PULSE+'n');
	    MapKeyR(&Throttle, BSB, PULSE+'n');
	   
	    // Map Throttle Switch EAC and RDR
	    // MapKey(&Throttle, EACON, PULSE+''); // Default
	    // MapKey(&Throttle, EACOFF, PULSE+''); // Default
	    // MapKey(&Throttle, RDRNRM, PULSE+''); // Default
	    // MapKey(&Throttle, RDRDIS, PULSE+''); // Default
 
	    // Shutdown switch toggle
	    MapKey(&Throttle, EORMOTOR, EXEC("if(!g_bIsShutdown){ ActKey(PULSE+KEYON+'p'); g_bIsShutdown = 1; }"));
	    MapKey(&Throttle, EORIGN, EXEC("if(g_bIsShutdown){ ActKey(PULSE+KEYON+'p'); g_bIsShutdown = 0; }"));
 
	    // Activate 'Shutdown Override' repeat (**** down for always 'ON')
	    ActKey(PULSE+KEYON+REXEC(1, 700, "ActKey(PULSE+KEYON+'o');"));
	    MapKey(&Throttle, EFROVER, REXEC(0, 700, "ActKey(PULSE+KEYON+'o');"));
	    MapKey(&Throttle, EFRNORM, EXEC("StopHeatOverrideRepeat();"));
 
	    // Toggle 'JOYSTATE_SLUGGISH' indicated by shutting off all LED sluggish state lights.
	    MapKey(&Throttle, EFLNORM, EXEC("SlugToggle(1);"));
	    MapKey(&Throttle, EFLOVER, EXEC("SlugToggle(0);"));
 
	    // Cycle 'JOYSTATE_SLUGGISH's duration parameter, indicated by LED lights.
	    MapKey(&Throttle, LDGH, EXEC("SlugDuration(1);"));
 
	    // Set text chat COMMS to associate with auto-pilot controls.
	    MapKey(&Throttle, APENG, SEQ('y', ENT)); // Default
	    MapKey(&Throttle, APPAT, EXEC("MapKey(&Throttle, APENG, SEQ('g', ENT));"));
	    MapKey(&Throttle, APAH, EXEC("MapKey(&Throttle, APENG, SEQ('t', ENT));"));
	    // MapKey(&Throttle, APALT, EXEC("MapKey(&Throttle, APENG, SEQ('u', ENT));"));
	   
	    // User settings for how much "deadzone" when stick is centered.
	    MapKey(&Throttle, PSF, EXEC("g_fDeadZone = 0.3;"));
	    MapKey(&Throttle, PSM, EXEC("g_fDeadZone = 0.25;"));
	    MapKey(&Throttle, PSB, EXEC("g_fDeadZone = 0.15;"));
 
	    // User settings for which JOYSTATE's to enable
	    MapKey(&Throttle, FLAPU, EXEC("SetJoyState(JOYSTATE_SNAP);"));
	    MapKey(&Throttle, FLAPM, EXEC("SetJoyState(JOYSTATE_NORM);"));
	    MapKey(&Throttle, FLAPD, EXEC("SetJoyState(JOYSTATE_ABSOLUTE);"));
 
	    // User settings for Joystick Axis directions
	    MapKey(&Throttle, EOLMOTOR, EXEC("g_iAxisYDir = 1;")); // Set Y-Axis to normal direction
	    MapKey(&Throttle, EOLNORM, EXEC("g_iAxisYDir = -1;")); // Set Y-Axis to inverted diection
	    MapKey(&Throttle, EOLIGN, EXEC("g_iAxisXDir = g_iAxisXDir * -1;")); // Toggle/**** X-Axis direction
 
	    //--------------------------------------------
	    // START UPDATE LOOP
	    //--------------------------------------------
	    // Enable Joystick->Mouse  - Throttle[APU]
	    MapKey(&Throttle, APUON, REXEC(2, UPDATE_RATE, "UpdateJoystick();"));
 
 
	    printf("All systems nominal!");
}
int SetJoyState(int iState)
{
	    if(0 != (iState & JOYSTATE_NORM))// Throttle[FLAPM]
	    {
			    // Disable JOYSTATE_SNAP and JOYSTATE_ABSOLUTE
			    g_iJoyStates = g_iJoyStates & JOYSTATE_SNAP_OFF;
			    g_iJoyStates = g_iJoyStates & JOYSTATE_ABSOLUTE_OFF;
		 
			    // Enable JOYSTATE_NORM
			    g_iJoyStates = g_iJoyStates | JOYSTATE_NORM;
	    }
	    else if(iState == JOYSTATE_SNAP)// Throttle[FLAPU]
	    {
			    // Disable JOYSTATE_ABSOLUTE
			    g_iJoyStates = g_iJoyStates & JOYSTATE_ABSOLUTE_OFF;
		 
			    // Enable JOYSTATE_SNAP and JOYSTATE_NORM
			    g_iJoyStates = g_iJoyStates | JOYSTATE_SNAP | JOYSTATE_NORM;
	    }
 
	    if(iState == JOYSTATE_ABSOLUTE)// Throttle[FLAPD]
	    {
			    // Disable JOYSTATE_NORM and JOYSTATE_SNAP
			    g_iJoyStates = g_iJoyStates & JOYSTATE_NORM_OFF;
			    g_iJoyStates = g_iJoyStates & JOYSTATE_SNAP_OFF;
		 
			    // Enable JOYSTATE_ABSOLUTE
			    g_iJoyStates = g_iJoyStates | JOYSTATE_ABSOLUTE;
		 
			    g_AxisData[AXIS_X].bHasPulseCenter = 0;
			    g_AxisData[AXIS_Y].bHasPulseCenter = 0;
	    }
}
int SlugDuration(int iStageOffset)
{
	    g_iSlugStage = g_iSlugStage + iStageOffset;
 
	    // Loop stages
	    if(g_iSlugStage > 5)
			    g_iSlugStage = 1;
		 
	    if(0 != (g_iJoyStates & JOYSTATE_SLUGGISH))
	    {
			    // Set appropriate LED light indicator // No 'switch' statement available in TARGET ;)
			    if(1 == g_iSlugStage)
					    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1-LED2-LED3-LED4+LED5));
			    else if(2 == g_iSlugStage)
					    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1-LED2-LED3+LED4+LED5));
			    else if(3 == g_iSlugStage)
					    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1-LED2+LED3+LED4+LED5));
			    else if(4 == g_iSlugStage)
					    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1+LED2+LED3+LED4+LED5));
			    else
					    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT+LED1+LED2+LED3+LED4+LED5));
	    }
}
int SlugToggle(int bEnable)
{
	    if(bEnable == 1)
	    {
			    g_iJoyStates = g_iJoyStates | JOYSTATE_SLUGGISH;
		 
			    SlugDuration(0);
	    }
	    else
	    {
			    // Disable the Sluggish effect and turn off all LED's
			    g_iJoyStates = g_iJoyStates & JOYSTATE_SLUGGISH_OFF;
			    ActKey(PULSE+KEYON+LED(&Throttle, LED_ONOFF, LED_CURRENT-LED1-LED2-LED3-LED4-LED5));
	    }
}
int StopHeatOverrideRepeat()
{
	    StopAutoRepeat(1);
}
int UpdateJoystick()
{
	    UpdateJoystickAxis(AXIS_X);
	    UpdateJoystickAxis(AXIS_Y);
 
	    // Store current fJoy into fJoyPrev to be used next Update()
	    g_AxisData[AXIS_X].fJoyPrev = g_AxisData[AXIS_X].fJoy;
	    g_AxisData[AXIS_Y].fJoyPrev = g_AxisData[AXIS_Y].fJoy;
}
int UpdateJoystickAxis(int iIndex)
{
	    // Whether or not to apply this Update()
	    int bUpdateAxis = 1;
 
	    // How much to move the mouse this Update()
	    float fMouseDelta = 0.0;
 
	    //--------------------------------------------
	    // Check to see if this axis's input value (fJoy)
	    // is lower than the user specified deadzone (g_fDeadZone)
	    //--------------------------------------------
	    if(abs(g_AxisData[iIndex].fJoy) < g_fDeadZone)
	    {
			    g_AxisData[iIndex].fSlugPerc = 0.01;
			    g_AxisData[iIndex].bSnapDir = 0;
		 
			    if(0 != (g_iJoyStates & JOYSTATE_ABSOLUTE))
			    {
					    // Only center torso if both X and Y axis hasn't Pulsed and both X and Y are centered
					    if(g_AxisData[AXIS_X].bHasPulseCenter == 0 & g_AxisData[AXIS_Y].bHasPulseCenter == 0)
					    {
							    if(abs(g_AxisData[AXIS_X].fJoy) < g_fDeadZone & abs(g_AxisData[AXIS_Y].fJoy) < g_fDeadZone)
							    {
									    ActKey(PULSE+KEYON+'c');
								 
									    g_AxisData[AXIS_X].bHasPulseCenter = 1;
									    g_AxisData[AXIS_Y].bHasPulseCenter = 1;
							    }
					    }
			    }
		 
			    bUpdateAxis = 0;
	    }
	    else
	    {
			    //--------------------------------------------
			    // Apply 'SLUGGISH' if state enabled
			    //--------------------------------------------
			    if(0 != (g_iJoyStates & JOYSTATE_SLUGGISH))
			    {
					    g_AxisData[iIndex].fSlugPerc = g_AxisData[iIndex].fSlugPerc + SLUG_INCREMENTS + (g_iSlugStage * SLUG_INCREMENTS);
					    if(g_AxisData[iIndex].fSlugPerc > 1.0)
					    {
							    g_AxisData[iIndex].fSlugPerc = 1.0; // clamp proc sens at 1.0
					    }
					    fMouseDelta = fMouseDelta + (g_AxisData[iIndex].fJoy * g_AxisData[iIndex].fSlugPerc);
			    }
			    else if(0 != (g_iJoyStates & JOYSTATE_NORM))
					    fMouseDelta = fMouseDelta + g_AxisData[iIndex].fJoy;
				 
			    //--------------------------------------------
			    // Apply 'SNAP' if state enabled
			    //--------------------------------------------
			    if(0 != (g_iJoyStates & JOYSTATE_SNAP))
			    { 
					    if(g_AxisData[iIndex].fJoy > 0.0)
					    {
							    if(g_AxisData[iIndex].fJoy >= g_AxisData[iIndex].fJoyPrev)
									    g_AxisData[iIndex].bSnapDir = 1; // Moving away from center
							    else
									    g_AxisData[iIndex].bSnapDir = 0; // Moving towards from center
					    }
					    else
					    {
							    if(g_AxisData[iIndex].fJoy <= g_AxisData[iIndex].fJoyPrev)
									    g_AxisData[iIndex].bSnapDir = 1; // Moving away from center
							    else
									    g_AxisData[iIndex].bSnapDir = 0; // Moving towards from center
					    }
				 
					    if(g_AxisData[iIndex].bSnapDir == 1)
							    fMouseDelta = fMouseDelta * 2.0;
					    else
							    fMouseDelta = fMouseDelta * 0.5;
			    }
		 
			    //--------------------------------------------
			    // Apply 'ABSOLUTE' if state enabled
			    //--------------------------------------------
			    if(0 != (g_iJoyStates & JOYSTATE_ABSOLUTE))
			    {
					    g_AxisData[iIndex].bHasPulseCenter = 0;
				 
					    fMouseDelta = g_AxisData[iIndex].fJoy - g_AxisData[iIndex].fJoyPrev;
					    fMouseDelta = fMouseDelta * 100.0;
			    }
	    }
 
	    // Manually set mouse position if passes above checks
	    if(bUpdateAxis)
	    {
			    g_AxisData[iIndex].iMouse = g_AxisData[iIndex].iMouse + fMouseDelta;
		 
			    if(iIndex == AXIS_X)
					    DXAxis(MOUSE_X_AXIS, g_AxisData[iIndex].iMouse);
			    else
					    DXAxis(MOUSE_Y_AXIS, g_AxisData[iIndex].iMouse);
	    }
 
	    return 0;
}
//event handler
int EventHandle(int type, alias o, int x)
{
	    if(&o == &Joystick & (x == JOYX | x == JOYY)) // if the event came from Joystick X or Y axis
	    {
			    g_AxisData[AXIS_X].fJoy = Joystick[JOYX] * g_iAxisXDir;
			    g_AxisData[AXIS_X].fJoy = g_AxisData[AXIS_X].fJoy / fJOYAXIS_LIMIT;
			    g_AxisData[AXIS_X].fJoy = g_AxisData[AXIS_X].fJoy * g_fSensMod;
		 
			    g_AxisData[AXIS_Y].fJoy = Joystick[JOYY] * g_iAxisYDir;
			    g_AxisData[AXIS_Y].fJoy = g_AxisData[AXIS_Y].fJoy / fJOYAXIS_LIMIT;
			    g_AxisData[AXIS_Y].fJoy = g_AxisData[AXIS_Y].fJoy * g_fSensMod;
	    }
	    else if(&o == &Throttle & x == THR_FC) // if the event came from the Throttle's friction control trim wheel
	    {
			    g_fSensMod = -Throttle[THR_FC];
			    g_fSensMod = g_fSensMod / fJOYAXIS_LIMIT;
			    g_fSensMod = (g_fSensMod * fDEFAULT_SENSITIVITY) + fDEFAULT_SENSITIVITY;
	    }
	    // Allow the system to handle incoming events and do its thing.
	    DefaultMapping(&o, x);
}

Edited by Hakkukakt, 11 November 2012 - 07:17 PM.


#30 ODonovan

    Member

  • PipPipPipPipPipPip
  • 377 posts
  • LocationMWO is still incomplete, after YEARS!

Posted 11 November 2012 - 09:28 PM

To start with, the SPEEDLINK Black Widow IS available and very inexpensive on amazon.com.

HERE

The main problems I have with the Thrustmaster T-Flight are:

1) No thumb button on the left side of the joystick. I use that to center the torso and not having it is a major inconvenience.

2) Only two buttons on the joystick other than the trigger and hat. The Logitech Extreme 3D Pro has five buttons other than the trigger and hat. (What? You say it would be too expensive to put in a couple more thumb buttons?)

3) With the two halves of the device joined together, if you rotate the stick counterclockwise and push it forward (target down and to the left), your right thumb is in the way of the throttle. (What, they couldn't make the base a bit larger so the sticks don't almost hit each other???)

Still, if you're going to separate the halves of the Thrustmaster, #3 is a non-issue.

For you mouse users, have you tried a trackball? I'm using a joystick and throttle, but turning the mouse speed all the way down in Windows control panel and using the trackball for fine aiming. I have a Kensington Expert Mouse trackball with four buttons, but I just saw something that blew me away...a Kensington Turbo Mouse trackball with TEN buttons and a scroll wheel. HERE Wow! It might be worth a look for all you serious mechjocks out there.



-Irish

#31 Aristo_

    Member

  • PipPip
  • Ace Of Spades
  • Ace Of Spades
  • 44 posts
  • LocationEast Coast, USA

Posted 29 November 2012 - 07:39 PM

I tried to use mine in MWO and assigned the stick to the torso. It moves extremely slowly - the reticule is very sluggish, compared to the mouse, which is a bit over-sensitive for me.

#32 knight-of-ni

    Member

  • PipPipPipPipPipPipPipPip
  • Overlord
  • Overlord
  • 1,627 posts
  • Location/dev/null

Posted 30 November 2012 - 04:53 AM

View PostAristocrap, on 29 November 2012 - 07:39 PM, said:

I tried to use mine in MWO and assigned the stick to the torso. It moves extremely slowly - the reticule is very sluggish, compared to the mouse, which is a bit over-sensitive for me.


My hotas is currently collecting dust so maybe someone else can help you with that.

However, have you tried lowering the sensitivity of your mouse?
Some mice have a button right on them that can adjust the dpi (sensitivity) or have profile software to let you do the same thing but only while playing the game. If you do not have such a fancy mouse then just lower the sensitivity in the windows mouse control panel.

#33 defcon won

    Member

  • PipPip
  • The Dragoon
  • The Dragoon
  • 45 posts

Posted 26 February 2013 - 04:57 PM

Old topic, I know, but I'd like to hear if HOTAS options will somehow improve to make the stick more viable.
As it is, I'm using the the stick in this thread, but just the throttle along with my mouse. For now, that's the best set up, since targeting with the stick is just too awkward. The yaw rocker is the mech turn, which seems to be just as fast as keyboard.
Will there be some kind of auto-targeting modules with sub system targeting added to the mechs to make the flight stick itself more useful?

#34 zq8blazer

    Rookie

  • 5 posts

Posted 22 March 2013 - 05:40 PM

Can someone please explain to me how to get this setup to work? I've also copied the text that AllGamer put in his post to user.cfg and both actionmaps.xml. All I can get the mech to do is turn to the left

Edited by zq8blazer, 22 March 2013 - 05:56 PM.


#35 ronin

    Member

  • PipPip
  • Bad Company
  • Bad Company
  • 20 posts
  • LocationChicago, IL

Posted 23 March 2013 - 07:53 AM

Since the addition of additional joystick support do I still need to add the referenced settings to the user.cfg and the actionmaps.xml file to use my Thrustmaster ?





17 user(s) are reading this topic

0 members, 17 guests, 0 anonymous users