# Test for approximate rotation

So lets say you have an entity which happens to be of `type=Player`.
Such that a command block, when powered

``````testfor @e[r=15,type=Player] {}
``````

will output true.

Now, lets teleport this player

``````tp @e[r=15,type=Player] ~ ~ ~ -90 45
``````

They should now be facing due east and at the ground.

Now if I test for this:

``````testfor @e[r=15,type=Player] {Rotation:[0:-90f,1:45f]}
``````

I'll output true as well.

Now the player turns around. the same command block will now output false (Proving that the command block has successfully tested for a players rotation)

but the rotation is a floating point number, having many decimals of accuracy, and the only way to have it tested and it be true (unless you get realllllly lucky and land on exactly -90.000000000) is to tp the player to have that rotation.

I'd like to be able to test for a player's rotation, but in a natural state.

So the fundamental question is... Can i test for a data tag which is Close to a given value?

Ideally it would look like this:

``````testfor @e[type=Player,r=15] {Rotation:[0:{min:-45,max:-125}]}
``````

but I know this is wrong. So anyone, has anyone found a solution to testing for approximate data tags?

• There is a way to test for between values. I'll post details when I can. (Approx. 6 hours) unless someone beats me to it. – aytimothy Oct 24 '14 at 4:36
• Sidenote: `@e[type=Player]` should be equal to `@a`, so there's no reason to use the former. – MrLemon Oct 24 '14 at 8:43
• I narrowed your question title down to rotation, since that is what you are asking for, and I am 95% sure that there's no general answer that encompasses checking approximately for every value. – MrLemon Oct 24 '14 at 8:56
• @aytimothy I know this question is old, but an explanation on how to test between values would be nice. – Daffy Aug 20 '16 at 2:29

Here's a video by MNSweet demonstrating rotational direction detection:

Rather than checking the NBT data (i.e. using `{}`), rotation can be tested for using the target selector arguments `ry`, `rym`, `rx`, and `rxm`, denoting the maximum and minimum view angle in the horizontal (east, south, etc.) and vertical (up, down) direction, respectively.

For example, to test for someone looking South (=0±22), use

``````testfor @a[ry=22,rym=-22]
``````

To test for someone looking 45° upwards (±10) and to the northeast (=135±22)

``````testfor @a[ry=-113,rym=-157,rx=55,rxm=35]
``````

I like a function which returns one of the 8 directions. As a standard keypad has 8 directions from the 5 in the middle, and as maps usually show North at the top, I assign 8 to North, 2 to South, 3 to Southeast, etc. BUT, I also like to know if I am looking up or down. If I am looking up, that is a 5 and looking down is 0. That makes it easy to place a block right where I am looking (of course if it is UP you'd want to place it up 2 blocks so you won't clunk your head. /testfor will return a list of targets matching the condition, so check if what returns is the target you are interested in (your player name).

``````First I check for up/down:
UP /testfor @a[rxm=-90,rx=-66] if true return 5
DN /testfor @a[rxm=66,rx=90] if true return 0

Now do a general check to find out a quadrant using two tests:
/testfor @a[rym=-22.5,ry=157.5]
/testfor @a[rym=-112.5,ry=67.5]
Depending on whether the target was found for both tests:
0 0 89 /testfor @a[rym=-157.5,ry=-112.5] if true return 9 else return 8
0 1 63 /testfor @a[rym=-67.5,ry=-22.5] if true return 3 else return 6
1 0 74 /testfor @a[rym=112.5,ry=157.5] if true return 7 else return 4
1 1 12 /testfor @a[rym=22.5,ry=67.5] if true return 1 else return 2
``````

/testfor with a username and parameters didn't seem to work for me.