Как задать движение игроку

Версия Minecraft
1.16.5
API
Forge
39
8
5
Хочу сделать дэш на кнопке бега. Код следующий:
Java:
@SubscribeEvent
public static void onEvent(InputEvent.KeyInputEvent event){
    KeyBinding runBinding = Minecraft.getInstance().gameSettings.keyBindSprint;
    int key = event.getKey();
    int runKey = runBinding.getKey().getKeyCode();
    ClientPlayerEntity player = Minecraft.getInstance().player;
    if (key == runKey){
        //ещё несколько проверок, в итоге:
        float yaw = player.rotationYaw;
        float x = -MathHelper.sin(yaw * 0.017453292F);
        float z = MathHelper.cos(yaw * 0.017453292F);
        double groundMotion = 5, airMotion = 2;
        if (player.isOnGround())
            player.setMotion(new Vector3d(x * groundMotion, 0, z * groundMotion));
        else
            player.setMotion(new Vector3d(x * airMotion, 0, z * airMotion));
    }
}
Он как бы работает и игрок летит по направлению взгляда, но есть проблема - движение очень дёрганое и фпс проседает с 60 до 40-50. Видимо, что-то я делаю не так и двигать энтитей нужно как-то хитрее, вопрос - как?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ты игрока двигаешь только на клиенте, а на сервере ничего не происходит (ну кроме бега) - получается рассинхронизация того, что думают о позиции игрока сервер и клиент - сервер минимум раз в секунду (вроде) синхронизирует позицию у себя на клиент (потому-что сервер всегда прав), вот тебя и дёргает назад на место.

И да, в синглплеере тоже есть так называемый Integrated Server, и всё то же самое происходит

Тебе надо отсылать пакет о нажатии кнопки на сервер, и с серверного кода и с клиентского (перед отсылкой пакета) вызывать метод, в котором будет твой код движения (который там принимает агрумент в виде игрока, и от сервера будет ServerPlayerEntity, а от клиента твой ClientPlayerEntity, то бишь агрумент просто будет общим PlayerEntity).

Как делаются пакеты ресурсы есть, минимальный (если тебе надо полтора пакета) от меня, и развёрнутый от других
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Вообще-то, в майне всем движением игрока руководит клиент. Сервер лишь делает небольшие проверки, чтобы совсем нагло его не обманывали.
И как раз клиент каждую секунду отсылает свои координаты серверу (если изменились).
Странно, почему у тебя не работает...
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Оу, разве? Окей, пхд бред написал, давно туда смотрел
Но в любом случае тут очевидно какой-то рассинхрон - обычно сервер ещё в консоль спамит moved wrongly! иди там too quickly!, нету такого?

Не может быть такого что этот твой on(InputEvent.KeyInputEvent вызывается кучу раз подряд, а ты не заметил?
 
Сверху