chuck-norris-network / teeworlds

A retro multiplayer shooter
https://www.teeworlds.com
Other
2 stars 2 forks source link

improving FastFire check #1

Open derselbst opened 8 years ago

derselbst commented 8 years ago

Hey Jigglypuff here,

I'm not quite satisfied with the CheckFastFire(). What I hoped to test for is, if some player shoots every Server()->Tick() (should be 1ms). However I only got a minimum diff of 6ms between firings. This is too much, since it can also be manually achieved when trying hard. As a compromise I collect 30 samples and then test how much the timediffs differ from each other (not that correct :/ I know).

I'm also having a ping of 20ms when playing on localhost, so something is twisted with my machine. On occasion maybe you could test what's the smallest timediff for you...

black-roland commented 8 years ago

Hi.

I tested CheckFastFire() on many clients with rapidfire support. Also I tested fire with mouse wheel. Warning level does not increases so much in both cases.

If i used fire with mouse wheel warning level was = 0. On some clients with rapidfire it increased very slowly — maximum that I have seen = 20. In practice this is not a problem.

should be 1ms

As I understand 1 tick = 1s. But I am not sure. Whatever 1ms is too small to be true.

I'm also having a ping of 20ms

Try another client (DDnet for example).

black-roland commented 8 years ago

1 tick = 1s

Oh, my mistake. 1 tick = 1/50s (or 20ms).

black-roland commented 8 years ago

Finally I understood how it works :) It warns only when someone fires at regular intervals. For example last 30 shots should been every 20ms, or every 40/60/80ms. Human clicks not regulary.

Example ticks array for bot that fires every 40ms (2 ticks) and human:

[ 1  3  5  7  9 ]     [ 1  4  5  8  9 ]
[ 2  2  2  2  2 ]     [ 3  1  3  1  1 ]
[ 0  0  0  0  0 ]     [-2  2 -2  0  0 ]
abs(sum()) = 0        abs(sum()) = 2
0 < 1                 2 > 1

You need to click at least once per 20ms to warn. I can click only every 110ms.

derselbst commented 8 years ago

Also I tested fire with mouse wheel.

Hm, interesting, never thought about that. Do you know anyone actually using this?

Thx for that Tick() clarification, found it too ;)

Example ticks array for bot that fires every 40ms (2 ticks)

Is that a real-world example? Just asking, because firing every 2 ticks is pretty fast. So one could think about introducing another check that really tests for fast-fire (as originally intended), while preserving that test to check for regular fire.

black-roland commented 8 years ago

Hm, interesting, never thought about that. Do you know anyone actually using this?

I personally don't know, but Nibiru told me about this "hack".

Is that a real-world example? Just asking, because firing every 2 ticks is pretty fast.

It is from my head :) But you can define any frequency.

So one could think about introducing another check that really tests for fast-fire (as originally intended), while preserving that test to check for regular fire.

I don't want ban people for fast-fire. In my opinion it is not a serious cheat. And we can't differentiate cheats from manual rapid-fire.

derselbst commented 8 years ago

you can define any frequency.

That's the freq. on the client side. The question is, does it actually propagate to the server? It's a long way to the server, strange things can happen :)

In my opinion it is not a serious cheat.

Not a serious one, yeah. Well we can just keep it in mind, if such a check ever gets necessary in the future.

Thx for your mail btw ;)

black-roland commented 8 years ago

That's the freq. on the client side. The question is, does it actually propagate to the server? It's a long way to the server, strange things can happen :)

Yes, due to ping it can be a problem. However we need to collect 30 samples, which is just 20 * 30 = 600ms. Due to small time intervals detector works quite accurately.

Not a serious one, yeah. Well we can just keep it in mind, if such a check ever gets necessary in the future.

Yes, most likely.

I think makes sense to make a more accurate test for fast-aim (instead of removed CheckFastChange()). Now this check partially replaced with CheckInputPos(), but it does not work as fast as we would like.