Upvote Upvoted 0 Downvote Downvoted
Libinput(linux) sensitivity randomizer
posted in Customization
1
#1
0 Frags +

Not explicitly a TF2 customization, but I've been using it in pugs and finally got it about where I want it. There's some limitations because it entirely leverages the libinput flat acceleration profile which has bounds of 0 and 1 with a precision of 6 decimal places, but I think it's solidly good enough now.

https://pastebin.com/9mQ4GVvb is the link to the randomizer script.
This only works with raw input disabled ingame.

Main notes are:
1) I do not know the actual factor of the libinput sens multiplication on the flat accel profile. It wasn't on https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html and I couldn't be assed to look further. There is more to it than (dx * factor, dy * factor) because 0 still works, my gut says something like the "accel speed" is actually a 1:1 additive increase of the vector based on the existing vector multiplied by factor added to the initial vector, but I feel like the sens variance might also be too high for that? I'm not a math brain and I didn't bother to find the relevant bits in the actual libinput source, so at the end of the day I simply don't know.
2) This does not reset your libinput accel speed at the end. You just ctrl+c out of the script and set it back to your preferred base setting using xinput.
3) Keep things integer. Bash no like decimals :(
4) The double brackets may not be portable to all systems, so the if statements on lines 13 and 24 may break. You just want to "and" that the "increment" variable is either true or false *and* that the bounding high/low variables are the relevant number, otherwise the incrementing and decrementing will break.

I'm sure someone will have some idea to improve it because I'm a very stupid dumbass. The first thing would be probably be bothering to do a portable anding of the if statement. It's 2AM though and that requires thought that I am currently not capable of.

Just one more note. The reason I didn't use the coordinate transformation matrix instead is that it breaks 3d games, otherwise I'd have decoupled my Y sens from my X sens globally long before I even considered sens randomizer.

Not explicitly a TF2 customization, but I've been using it in pugs and finally got it about where I want it. There's some limitations because it entirely leverages the libinput flat acceleration profile which has bounds of 0 and 1 with a precision of 6 decimal places, but I think it's solidly good enough now.

https://pastebin.com/9mQ4GVvb is the link to the randomizer script.
This only works with raw input disabled ingame.

Main notes are:
1) I do not know the actual factor of the libinput sens multiplication on the flat accel profile. It wasn't on https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html and I couldn't be assed to look further. There is more to it than (dx * factor, dy * factor) because 0 still works, my gut says something like the "accel speed" is actually a 1:1 additive increase of the vector based on the existing vector multiplied by factor added to the initial vector, but I feel like the sens variance might also be too high for that? I'm not a math brain and I didn't bother to find the relevant bits in the actual libinput source, so at the end of the day I simply don't know.
2) This does not reset your libinput accel speed at the end. You just ctrl+c out of the script and set it back to your preferred base setting using xinput.
3) Keep things integer. Bash no like decimals :(
4) The double brackets may not be portable to all systems, so the if statements on lines 13 and 24 may break. You just want to "and" that the "increment" variable is either true or false *and* that the bounding high/low variables are the relevant number, otherwise the incrementing and decrementing will break.

I'm sure someone will have some idea to improve it because I'm a very stupid dumbass. The first thing would be probably be bothering to do a portable anding of the if statement. It's 2AM though and that requires thought that I am currently not capable of.

Just one more note. The reason I didn't use the coordinate transformation matrix instead is that it breaks 3d games, otherwise I'd have decoupled my Y sens from my X sens globally long before I even considered sens randomizer.
2
#2
12 Frags +

Forgive my ignorance: why would anyone ever want a sensitivity randomizer for anything other than destroying their aim?

Forgive my ignorance: why would anyone ever want a sensitivity randomizer for anything other than destroying their aim?
3
#3
2 Frags +
turbochad69Forgive my ignorance: why would anyone ever want a sensitivity randomizer for anything other than destroying their aim?

the muscle memory meme is just that, a meme. Aim is almost entirely a factor of motor control, comfort, and being warm on the current sensitivity. A randomizer sacrifices warmth and some comfort to focus solely on improving the underlying motor control. In particular, the reason for the frequent but generally small sens bumps as currently designed is to keep the fine motor control as a focus while not changing from 6 inches to 18 inches in 1 second and simply being unreasonable.
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4747782/ has some info, but iirc there were other studies done which showed greater overall task accuracy improvement overtime with frequent small adjustments as well.

I didn't entirely believe it at first either until I tried very rough prototype versions of what became this sens randomizer and simply left it on for multiple days straight. At some point, the adjustment becomes almost seamless. As I said, I've been pugging with this and I am not the kind of pugger who intentionally throws often. If it was really as big as a problem as most people think it would be I wouldn't pug soldier or scout on it.

I am also a proponent/sometimes user of mouse acceleration, although xorg pointeraccel is kind of dogshit and I strongly advise Rawaccel on Windows as the single best accel app available on any platform. I can't use it on linux, but I did use it to make my work computer's trackball more comfortable.

[quote=turbochad69]Forgive my ignorance: why would anyone ever want a sensitivity randomizer for anything other than destroying their aim?[/quote]
the muscle memory meme is just that, a meme. Aim is almost entirely a factor of motor control, comfort, and being warm on the current sensitivity. A randomizer sacrifices warmth and some comfort to focus solely on improving the underlying motor control. In particular, the reason for the frequent but generally small sens bumps as currently designed is to keep the fine motor control as a focus while not changing from 6 inches to 18 inches in 1 second and simply being unreasonable.
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4747782/ has some info, but iirc there were other studies done which showed greater overall task accuracy improvement overtime with frequent small adjustments as well.

I didn't entirely believe it at first either until I tried very rough prototype versions of what became this sens randomizer and simply left it on for multiple days straight. At some point, the adjustment becomes almost seamless. As I said, I've been pugging with this and I am not the kind of pugger who intentionally throws often. If it was really as big as a problem as most people think it would be I wouldn't pug soldier or scout on it.

I am also a proponent/sometimes user of mouse acceleration, although xorg pointeraccel is kind of dogshit and I strongly advise Rawaccel on Windows as the single best accel app available on any platform. I can't use it on linux, but I did use it to make my work computer's trackball more comfortable.
4
#4
7 Frags +

Have you considered changing the sens directly in tf2 via rcon instead of changing it system wide in libinput? You could easily make it crossplatform that way, and also keep m_rawinput on. The game client serves rcon if you launch with

-usercon +rcon_password "whatever" +ip 127.0.0.1 +net_start

You could use something like https://github.com/n0la/rcon or https://python-valve.readthedocs.io/en/latest/rcon.html in your script, or, if you deem those clients too bloated, cap a packet, look at how it changes when you send a different value in the sensitivity command, and just send the raw bytes with nc.

Have you considered changing the sens directly in tf2 via rcon instead of changing it system wide in libinput? You could easily make it crossplatform that way, and also keep m_rawinput on. The game client serves rcon if you launch with [code]-usercon +rcon_password "whatever" +ip 127.0.0.1 +net_start[/code] You could use something like https://github.com/n0la/rcon or https://python-valve.readthedocs.io/en/latest/rcon.html in your script, or, if you deem those clients too bloated, cap a packet, look at how it changes when you send a different value in the sensitivity command, and just send the raw bytes with nc.
5
#5
1 Frags +

If there was a non system wide version I might add it to The Config. I think if you did it though rcon you could have changing sens as a twitch chat command.

If there was a non system wide version I might add it to The Config. I think if you did it though rcon you could have changing sens as a twitch chat command.
6
#6
1 Frags +
turbochad69Have you considered changing the sens directly in tf2 via rcon instead of changing it system wide in libinput? You could easily make it crossplatform that way, and also keep m_rawinput on. The game client serves rcon if you launch with
-usercon +rcon_password "whatever" +ip 127.0.0.1 +net_start
You could use something like https://github.com/n0la/rcon or https://python-valve.readthedocs.io/en/latest/rcon.html in your script, or, if you deem those clients too bloated, cap a packet, look at how it changes when you send a different value in the sensitivity command, and just send the raw bytes with nc.

I forgot that was an option, but the big thing is I wanted it systemwide so I could use it in other games, kovaaks, etc. as well. In regards to doing it via rcon, note specifically that all of this goes to a singular input, "accel speed", so if you had a tolerable sensitivity range you could modify the sensitivity function to point your commands at your local rcon and simply adjust the number scales accordingly.

Essentially, 90% of the work is already done as most of what really needs changing is number scaling and the command/target input location.

[quote=turbochad69]Have you considered changing the sens directly in tf2 via rcon instead of changing it system wide in libinput? You could easily make it crossplatform that way, and also keep m_rawinput on. The game client serves rcon if you launch with [code]-usercon +rcon_password "whatever" +ip 127.0.0.1 +net_start[/code] You could use something like https://github.com/n0la/rcon or https://python-valve.readthedocs.io/en/latest/rcon.html in your script, or, if you deem those clients too bloated, cap a packet, look at how it changes when you send a different value in the sensitivity command, and just send the raw bytes with nc.[/quote]

I forgot that was an option, but the big thing is I wanted it systemwide so I could use it in other games, kovaaks, etc. as well. In regards to doing it via rcon, note specifically that all of this goes to a singular input, "accel speed", so if you had a tolerable sensitivity range you could modify the sensitivity function to point your commands at your local rcon and simply adjust the number scales accordingly.

Essentially, 90% of the work is already done as most of what really needs changing is number scaling and the command/target input location.
7
#7
5 Frags +
sunderkeeninturbochad69Forgive my ignorance: why would anyone ever want a sensitivity randomizer for anything other than destroying their aim?the muscle memory meme is just that, a meme. Aim is almost entirely a factor of motor control, comfort, and being warm on the current sensitivity. A randomizer sacrifices warmth and some comfort to focus solely on improving the underlying motor control. In particular, the reason for the frequent but generally small sens bumps as currently designed is to keep the fine motor control as a focus while not changing from 6 inches to 18 inches in 1 second and simply being unreasonable.
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4747782/ has some info, but iirc there were other studies done which showed greater overall task accuracy improvement overtime with frequent small adjustments as well.

You are too far ahead for aiming concepts in tf2 community, majority of tf2 players believe aim training is a waste of time.
https://youtu.be/u2m2UbxkHHE?t=395

[quote=sunderkeenin][quote=turbochad69]Forgive my ignorance: why would anyone ever want a sensitivity randomizer for anything other than destroying their aim?[/quote]
the muscle memory meme is just that, a meme. Aim is almost entirely a factor of motor control, comfort, and being warm on the current sensitivity. A randomizer sacrifices warmth and some comfort to focus solely on improving the underlying motor control. In particular, the reason for the frequent but generally small sens bumps as currently designed is to keep the fine motor control as a focus while not changing from 6 inches to 18 inches in 1 second and simply being unreasonable.
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4747782/ has some info, but iirc there were other studies done which showed greater overall task accuracy improvement overtime with frequent small adjustments as well.

[/quote]

You are too far ahead for aiming concepts in tf2 community, majority of tf2 players believe aim training is a waste of time.
https://youtu.be/u2m2UbxkHHE?t=395
8
#8
0 Frags +

I love this concept.

I love this concept.
9
#9
0 Frags +
ZestyIf there was a non system wide version I might add it to The Config. I think if you did it though rcon you could have changing sens as a twitch chat command.

I used something like this a while ago:

Show Content
alias sens_content1 "sensitivity 7.92845934808808"
alias sens0 "alias randomsens_apply sens_content1;alias randomsens sens1"
alias sens_content2 "sensitivity 12.786109388717"
alias sens1 "alias randomsens_apply sens_content2;alias randomsens sens2"
alias sens_content3 "sensitivity 1.95900961260913"
alias sens2 "alias randomsens_apply sens_content3;alias randomsens sens3"
alias sens_content4 "sensitivity 1.50882433286576"
alias sens3 "alias randomsens_apply sens_content4;alias randomsens sens4"
alias sens_content5 "sensitivity 1.93862411001482"
alias sens4 "alias randomsens_apply sens_content5;alias randomsens sens5"
alias sens_content6 "sensitivity 2.51103749728102"
alias sens5 "alias randomsens_apply sens_content6;alias randomsens sens6"
alias sens_content7 "sensitivity 10.55635700442"
alias sens6 "alias randomsens_apply sens_content7;alias randomsens sens7"
alias sens_content8 "sensitivity 6.89415670243616"
alias sens7 "alias randomsens_apply sens_content8;alias randomsens sens8"
alias sens_content9 "sensitivity 3.41966731585731"
alias sens8 "alias randomsens_apply sens_content9;alias randomsens sens9"
alias sens_content10 "sensitivity 6.48040290526163"
alias sens9 "alias randomsens_apply sens_content10;alias randomsens sens10"
alias sens_content11 "sensitivity 2.28365502038433"
alias sens10 "alias randomsens_apply sens_content11;alias randomsens sens11"
alias sens_content12 "sensitivity 1.61710276283784"
alias sens11 "alias randomsens_apply sens_content12;alias randomsens sens12"
alias sens_content13 "sensitivity 1.27484537277059"
alias sens12 "alias randomsens_apply sens_content13;alias randomsens sens13"
alias sens_content14 "sensitivity 14.4872175362188"
alias sens13 "alias randomsens_apply sens_content14;alias randomsens sens14"
alias sens_content15 "sensitivity 6.96532101901362"
alias sens14 "alias randomsens_apply sens_content15;alias randomsens sens15"
alias sens_content16 "sensitivity 2.10498230274851"
alias sens15 "alias randomsens_apply sens_content16;alias randomsens sens16"
alias sens_content17 "sensitivity 10.7433779250799"
alias sens16 "alias randomsens_apply sens_content17;alias randomsens sens17"
alias sens_content18 "sensitivity 1.88303236301377"
alias sens17 "alias randomsens_apply sens_content18;alias randomsens sens18"
alias sens_content19 "sensitivity 4.17696221952783"
alias sens18 "alias randomsens_apply sens_content19;alias randomsens sens19"
alias sens_content0 "sensitivity 1.32731583097159"
alias sens19 "alias randomsens_apply sens_content0;alias randomsens sens0"
sens0

//Number: 20
//Base Sensitivity: 4
//Deviation: 4

alias +fo "+forward;randomsens"
alias -fo -forward
alias +ba "+back;randomsens;randomsens;randomsens"
alias -ba -back
alias +ri "+moveright;randomsens;randomsens"
alias -ri -moveright
alias +le "+moveleft;randomsens;randomsens;randomsens;randomsens"
alias -le -moveleft
alias randomsens_use "randomsens;randomsens_apply"
bind w +fo;bind a +le;bind s +ba;bind d +ri
//bind [Key] randomsens_use

Here's the (pearl) script that generates it:

Show Content
print "File?\n";
my $fn=<>;
print "Number?\n";
my $n=<>;
print "Base Sensitivity?\n";
my $s=<>;
print "Deviation? (>1)\n";
my $rd=<>;
$rd=2 if($rd<=1);
chomp $fn;
chomp $n;
chomp $s;
chomp $rd;

open(my $f, ">", $fn);
my $a=0;
my $b;
my $d;
while($a<$n)
{
$b=$s*$rd**(2*rand()-1);
$d=($a!=$n-1?$a+1:0);
print $f "alias sens_content$d \"sensitivity $b\"\nalias sens$a \"alias randomsens_apply sens_content$d;alias randomsens sens$d\"\n";
$a++;
}
print $f <<eeeee;
sens0

//Number: ${n}
//Base Sensitivity: ${s}
//Deviation: ${rd}

alias +fo "+forward;randomsens"
alias -fo -forward
alias +ba "+back;randomsens;randomsens;randomsens"
alias -ba -back
alias +ri "+moveright;randomsens;randomsens"
alias -ri -moveright
alias +le "+moveleft;randomsens;randomsens;randomsens;randomsens"
alias -le -moveleft
alias randomsens_use "randomsens;randomsens_apply"
bind w +fo;bind a +le;bind s +ba;bind d +ri
//bind [Key] randomsens_use
eeeee
[quote=Zesty]If there was a non system wide version I might add it to The Config. I think if you did it though rcon you could have changing sens as a twitch chat command.[/quote]

I used something like this a while ago:
[spoiler]alias sens_content1 "sensitivity 7.92845934808808"
alias sens0 "alias randomsens_apply sens_content1;alias randomsens sens1"
alias sens_content2 "sensitivity 12.786109388717"
alias sens1 "alias randomsens_apply sens_content2;alias randomsens sens2"
alias sens_content3 "sensitivity 1.95900961260913"
alias sens2 "alias randomsens_apply sens_content3;alias randomsens sens3"
alias sens_content4 "sensitivity 1.50882433286576"
alias sens3 "alias randomsens_apply sens_content4;alias randomsens sens4"
alias sens_content5 "sensitivity 1.93862411001482"
alias sens4 "alias randomsens_apply sens_content5;alias randomsens sens5"
alias sens_content6 "sensitivity 2.51103749728102"
alias sens5 "alias randomsens_apply sens_content6;alias randomsens sens6"
alias sens_content7 "sensitivity 10.55635700442"
alias sens6 "alias randomsens_apply sens_content7;alias randomsens sens7"
alias sens_content8 "sensitivity 6.89415670243616"
alias sens7 "alias randomsens_apply sens_content8;alias randomsens sens8"
alias sens_content9 "sensitivity 3.41966731585731"
alias sens8 "alias randomsens_apply sens_content9;alias randomsens sens9"
alias sens_content10 "sensitivity 6.48040290526163"
alias sens9 "alias randomsens_apply sens_content10;alias randomsens sens10"
alias sens_content11 "sensitivity 2.28365502038433"
alias sens10 "alias randomsens_apply sens_content11;alias randomsens sens11"
alias sens_content12 "sensitivity 1.61710276283784"
alias sens11 "alias randomsens_apply sens_content12;alias randomsens sens12"
alias sens_content13 "sensitivity 1.27484537277059"
alias sens12 "alias randomsens_apply sens_content13;alias randomsens sens13"
alias sens_content14 "sensitivity 14.4872175362188"
alias sens13 "alias randomsens_apply sens_content14;alias randomsens sens14"
alias sens_content15 "sensitivity 6.96532101901362"
alias sens14 "alias randomsens_apply sens_content15;alias randomsens sens15"
alias sens_content16 "sensitivity 2.10498230274851"
alias sens15 "alias randomsens_apply sens_content16;alias randomsens sens16"
alias sens_content17 "sensitivity 10.7433779250799"
alias sens16 "alias randomsens_apply sens_content17;alias randomsens sens17"
alias sens_content18 "sensitivity 1.88303236301377"
alias sens17 "alias randomsens_apply sens_content18;alias randomsens sens18"
alias sens_content19 "sensitivity 4.17696221952783"
alias sens18 "alias randomsens_apply sens_content19;alias randomsens sens19"
alias sens_content0 "sensitivity 1.32731583097159"
alias sens19 "alias randomsens_apply sens_content0;alias randomsens sens0"
sens0

//Number: 20
//Base Sensitivity: 4
//Deviation: 4


alias +fo "+forward;randomsens"
alias -fo -forward
alias +ba "+back;randomsens;randomsens;randomsens"
alias -ba -back
alias +ri "+moveright;randomsens;randomsens"
alias -ri -moveright
alias +le "+moveleft;randomsens;randomsens;randomsens;randomsens"
alias -le -moveleft
alias randomsens_use "randomsens;randomsens_apply"
bind w +fo;bind a +le;bind s +ba;bind d +ri
//bind [Key] randomsens_use[/spoiler]

Here's the (pearl) script that generates it: [spoiler]print "File?\n";
my $fn=<>;
print "Number?\n";
my $n=<>;
print "Base Sensitivity?\n";
my $s=<>;
print "Deviation? (>1)\n";
my $rd=<>;
$rd=2 if($rd<=1);
chomp $fn;
chomp $n;
chomp $s;
chomp $rd;

open(my $f, ">", $fn);
my $a=0;
my $b;
my $d;
while($a<$n)
{
$b=$s*$rd**(2*rand()-1);
$d=($a!=$n-1?$a+1:0);
print $f "alias sens_content$d \"sensitivity $b\"\nalias sens$a \"alias randomsens_apply sens_content$d;alias randomsens sens$d\"\n";
$a++;
}
print $f <<eeeee;
sens0

//Number: ${n}
//Base Sensitivity: ${s}
//Deviation: ${rd}


alias +fo "+forward;randomsens"
alias -fo -forward
alias +ba "+back;randomsens;randomsens;randomsens"
alias -ba -back
alias +ri "+moveright;randomsens;randomsens"
alias -ri -moveright
alias +le "+moveleft;randomsens;randomsens;randomsens;randomsens"
alias -le -moveleft
alias randomsens_use "randomsens;randomsens_apply"
bind w +fo;bind a +le;bind s +ba;bind d +ri
//bind [Key] randomsens_use
eeeee[/spoiler]
10
#10
1 Frags +

@Zesty please add to The Config and let twitch chat change your sens, crosshair, and vertical/horizontal yaw

@Zesty please add to The Config and let twitch chat change your sens, crosshair, and vertical/horizontal yaw
11
#11
0 Frags +
ZestyIf there was a non system wide version I might add it to The Config. I think if you did it though rcon you could have changing sens as a twitch chat command.

ok I just got off work and based on the syntax in https://github.com/n0la/rcon it could literally be as simple as this - https://pastebin.com/utVXZBRy
As you can probably see, it's literally just some number shifting so it's in a range of 1 to 4 sensitivity incrementing .5 at a time, for example. You can change that to some other more sane range if you'd like, and I haven't tested it to be sure rcon actually plays nice with this, but as I noted, just number shuffling and switching xinput out for rcon is all you'll need.

Also, the sleep changes how many seconds, so right now it's at 3-5 seconds per increment.

[quote=Zesty]If there was a non system wide version I might add it to The Config. I think if you did it though rcon you could have changing sens as a twitch chat command.[/quote]
ok I just got off work and based on the syntax in https://github.com/n0la/rcon it could literally be as simple as this - https://pastebin.com/utVXZBRy
As you can probably see, it's literally just some number shifting so it's in a range of 1 to 4 sensitivity incrementing .5 at a time, for example. You can change that to some other more sane range if you'd like, and I haven't tested it to be sure rcon actually plays nice with this, but as I noted, just number shuffling and switching xinput out for rcon is all you'll need.

Also, the sleep changes how many seconds, so right now it's at 3-5 seconds per increment.
Please sign in through STEAM to post a comment.