So after 3 seconds of standing still, everything like occasional healing, some particle effects, and drinking sounds are all done continuously on the server. Previously I was doing this in the client, sending packets every time there is a sound, every time there are particles, and every time the player should heal (since particles, healing, sounds, are all handled on the server). But I modified this after by just sending one packet, notifying the server that the player has stood still for 3 seconds, which will change a new boolean value in the player capability. Everything else is done from the server from there.
This way, it's just one packet when the player stood for 3 seconds, and one packet to send if the player moved after these 3 seconds (to stop the particles, healing, sounds, among other server-side actions on the player).
Hard to explain, but I hope it makes sense. Actually I like the approach I just described, minimal packets to send instead of sending 1 position packet every tick (which can be bad according to @warjort)