Jump to content

Recommended Posts

Posted

In my mod I've made a "timestop" effect where all entities are supposed to stop moving and keep their velocity after the effect is undone. Everything currently works perfectly except the rendering of certain entities(arrows, item entities, etc.), they appear to continue moving and continuously snap back to their original position, but when I disable the effect their position and velocity are correct. Is there a way to fix this rendering issue, if so how? The mod's code can be found here, on GitHub, the event fires each tick from a custom entity.

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

Posted (edited)

I'm thinking it's probably because they don't sync the velocity every tick (called update interval or velocity update... not sure), therefore the client does not know the entity has stopped it's motion... you may need to do that yourself

Edited by poopoodice
Posted (edited)
8 hours ago, poopoodice said:

you may need to do that yourself

What should I send SEntityVelocityPacket to, PacketDistributor#TRACKING_ENTITY? I haven't found much info online on how to send packets to entities.

Edited by Novârch

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

Posted (edited)
13 hours ago, Novârch said:

In my mod I've made a "timestop" effect where all entities are supposed to stop moving and keep their velocity after the effect is undone. Everything currently works perfectly except the rendering of certain entities(arrows, item entities, etc.), they appear to continue moving and continuously snap back to their original position, but when I disable the effect their position and velocity are correct. Is there a way to fix this rendering issue, if so how? The mod's code can be found here, on GitHub, the event fires each tick from a custom entity.

You will have to cancel the velocity on the client side too.

Where are you doing this? If it is in a tile entity or a tickable object then you could get away with canceling the velocity of nearby objects on the client side in tick, otherwise you can create a stop time packet containing the range (coverage of the effect in the world) of the stop time effect, and send that to the client (as sending individual update velocity packets is both inefficient and considered a bad practice).

Edited by DavidM

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted
1 minute ago, DavidM said:

Where are you doing this?

In a tick event.

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

Posted (edited)

Oh hey you are making a JoJo mod!

 

21 minutes ago, Novârch said:

In a tick event.

So the effect is global? In that case just send a packet to all clients that is in the same dimension (or else, depending on the coverage of the effect), and cancel all velocity of entities. The same works with continuing the time (except you will need to also include the initial velocity of all entities).

Edited by DavidM

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted (edited)
1 hour ago, DavidM said:

In that case just send a packet to all clients that is in the same dimension

Thanks for the help, I think I've made some progress on this, the packet should in theory set an entities velocity on the client to it's velocity on the server, but I'm still getting the same graphical issues, I have the effect down, everything stops, but some entities like arrows look glitchy. Here's a gif of the glitch, and no that is not a continuous loop of an arrow falling, it just stays like that until I undo the effect.

1 hour ago, DavidM said:

Oh hey you are making a JoJo mod!

Yeah, I am. I'm pretty disappointed will all the current ones, they're rarely updated and a certain 1.12 ones creator is incompetent at modding.

Edited by Novârch

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

Posted (edited)
51 minutes ago, Novârch said:

I think I've made some progress on this, the packet should in theory set an entities velocity on the client to it's velocity on the server

That would send a packet for every entity in the world, which is rather inefficient considering that when the time stops, all the values in the velocity would be 0. I would suggest making a separate packet for time stopping and time continuing.

Moreover, I would suggest to send a list of all affect entities in one packet. However, if you really want to update the velocity individually, change the velocity of the entity directly and call Entity#markVelocityChanged. This will make the game sync the entity's velocity on the next tick (therefore custom packets are not necessary) (this would send a packet for each marked entity, which would be inefficient on a large scale).

 

I'll check the arrow problem out, but I think it might be caused by the arrow's still picking up downward velocity from gravity every tick. In one of my mod I implemented a similar time stopping concept, and circumvented similar problems by keep setting the velocity of affected entities to 0. The client logic is similar to:

 

listEntity <- a list of entities affected by the time stop;

onStopPacketReceive: add specified entities to the list;

onContinuePacketReceive: remove entities from the list;

onTickEvent: set the velocity of all entities in the list to 0;

Edited by DavidM
  • Thanks 1

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted
On 6/12/2020 at 9:56 AM, DavidM said:

it might be caused by the arrow's still picking up downward velocity from gravity every tick

It seems that was the issue, setting the arrows velocity to 0 instead of setting it's position every tick fixed the issue, but now I have a new issue, all arrows face south during timestop.

 

On 6/12/2020 at 9:56 AM, DavidM said:

I would suggest to send a list of all affect entities in one packet.

I've been trying to do that, but to no avail, how am I supposed to send ALL the velocities in one packet and map them to the correct entity?

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

Posted

Maybe there's a better way of doing this but maybe store the entity UUIDs in a hashmap or something and also pass the length (size) of the map to the packet.

Or just check the distance between the entity and the player is in a suitable distance, like the sendToAllNearExcept in PlayerList.

Posted
6 hours ago, Novârch said:

It seems that was the issue, setting the arrows velocity to 0 instead of setting it's position every tick fixed the issue, but now I have a new issue, all arrows face south during timestop.

In my previous mod where I attempted the time stop, I didn't cancel the velocity completely. I set them to 0.05 of the original value. This allows projectiles like arrows to maintain its direction, but might not be suitable in your case. I'm not aware of any better ways, but if you would like to sacrifice the "total time stop" in favor of having correct rendering of arrows then it may be worth a try.

 

6 hours ago, Novârch said:

I've been trying to do that, but to no avail, how am I supposed to send ALL the velocities in one packet and map them to the correct entity?

Make an array (length N) of UUIDs containing all the N entities in the world.

Make another array (length 3 * N) containing the velocity of entities in the same order as the entity array.

Some tips:

Spoiler

Modder Support:

Spoiler

1. Do not follow tutorials on YouTube, especially TechnoVision (previously called Loremaster) and HarryTalks, due to their promotion of bad practice and usage of outdated code.

2. Always post your code.

3. Never copy and paste code. You won't learn anything from doing that.

4. 

Quote

Programming via Eclipse's hotfixes will get you nowhere

5. Learn to use your IDE, especially the debugger.

6.

Quote

The "picture that's worth 1000 words" only works if there's an obvious problem or a freehand red circle around it.

Support & Bug Reports:

Spoiler

1. Read the EAQ before asking for help. Remember to provide the appropriate log(s).

2. Versions below 1.11 are no longer supported due to their age. Update to a modern version of Minecraft to receive support.

 

 

Posted
37 minutes ago, diesieben07 said:

Use Entity#getEntityId and World#getEntityByID instead of UUIDs for syncing.

I'm already using it, wouldn't have if it wasn't for the helpful code comment above it.

It's sad how much time mods spend saying "x is no longer supported on this forum. Please update to a modern version of Minecraft to receive support".

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.

Announcements



×
×
  • Create New...

Important Information

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