Jump to content

[1.8] Check if player moved.


Ernio

Recommended Posts

Player starts casting skill, if certain movement occurs casting is interrupted. Now:

Smartest way to check:

- If player himself trigerred movement (movement = make acceleration, not slowing down, because that would require you to totally stop to zero before casting skill).

- If something else triggered movement (knockback/water).

 

My only idea is to save acceleration (x,y,z) every tick and compare, but how to track source? Maybe catch movement packcets, but I have no idea how.

 

Also: i could use some light on positioning fields.

there is posX, lastTickPosX, prevPosX, motionX, nextStepDistance, newPosX, damn, probably even more.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

I'll just note: If you can think of it in 30sec or less, I alredy did/tried that. I need something creative, or rather "from experience". *wink*

Position != movement.

I need to track down SOURCE of movement, not the position changes. As said in main post - the fact that player is moving doesn't mean he's accellerating. And I mostly care about acceleration.

 

Offtopic:

@deadrecon98 - I'd write this in other thread, but since this one is mine I'm personally asking you to stop writing false/impolite stuff on support forums. If you don't plan on helping, don't trash people looking for help. It happens often when you appear on forums (look at your karma). And no, this is not about this thread, I am just politely pointing out.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

You want to know if the player has moved while the spell is being cast, correct?  Because checking for a change in your X, Y and Z coordinates greater than k units is how you can do that, just take the initial position during spell cast and compare.  Otherwise, please elaborate, because you stated that you want casting to stop if movement occurs. 

Link to comment
Share on other sites

Player starts casting skill, if certain movement occurs casting is interrupted. Now:

Smartest way to check:

- If player himself trigerred movement (movement = make acceleration, not slowing down, because that would require you to totally stop to zero before casting skill).

- If something else triggered movement (knockback/water).

 

My only idea is to save acceleration (x,y,z) every tick and compare, but how to track source? Maybe catch movement packcets, but I have no idea how.

 

Also: i could use some light on positioning fields.

there is posX, lastTickPosX, prevPosX, motionX, nextStepDistance, newPosX, damn, probably even more.

 

It is really pity that this is impossible in minecraft system...

You cannot get the 'source' of a movement, Since it could just be from addVelocity or sth.

 

Actually I also wanted to do something similar for altering gravitation,

but LexManos said that even a PR on it would be rejected...

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

entity.motionX/Y/Z would generally work for your needs, as that is the current motion of any entity (if any motion > 0, stop casting); however, for EntityPlayer, there is the problem that sometimes player.motionX/Y/Z is different on the client side (which is where player motion usually begins via player input) or even never sent to the server (i.e. by mods), making it less than ideal.

 

entity.posY/X/Z is always the current position of the entity, and even for players this should always be the same between client <-> server due to update packets.

 

Those are the most important and most often used of the movement/position fields; the others, like lastTickPosX/Y/Z, are generally used for a specific internal use and not that useful to modders, though I'm sure there are some use cases.

 

Anyway, as the first reply to your topic suggested, your best bet here is to store the player's initial position when they begin casting, and each tick check the player's distance to that point; if it's greater than whatever threshold you decide, then the player has 'moved' and the casting cancelled.

 

Whether you need to use TickEvent or not depends on how your casting is handled, e.g. if you have access to any ticking method (usually #onUpdate of some sort), then you can check it from there instead.

 

EDIT: To clarify since you seem to want "acceleration" instead of "position" - how that makes sense at all when your title is 'Check if player moved' is your call - store the initial motionX/Y/Z instead of posX/Y/Z and keep track of the difference each tick, but keep in mind the note about EntityPlayer's motion as well as the fact that motion values (as well as position values) can be negative, so you'll probably want to get Pythagorean on them.

Link to comment
Share on other sites

1. Player is running.

2. Stops running, but is sliding on ice.

* Movement occurs, but there is no player-made acceleration.

* Therefore I have to wait until I stop sliding before I can even start casting skill.

 

- That's what I mean by acceleration. You are moving but not because someone is pushing you, knockback, or your own movement, but because there is a leftover of your speed.

- Obviously I understand that I can save initial acceleration and just check if curent is bigger than initial, but that might allow caster to do "micro-steps" as long as he is in range of max acceleration. Well, unless I will update previous acceleration fields on every tick - in that case - it's perfect system.

 

Anyway, looking at it now I might be able to have some fun with distance from point 0 (where started casting) and actually make it close to "neat". This weekend's gonna be fun :)

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

check if

moveStrafing

and

moveForward

are between 0.01F and -0.01F. Those determine the acceleration (strafing => acc. left & right; forward => acc. forward & backward)

 

Why check between values? Because both are floating point numbers and you can't check

float == value

reliably

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.