Изменение motionX, Y, Z

Версия Minecraft
1.7.10
Изменяю скорость персонажа следующим образом:
Java:
player.motionX *= walkSpeed;
player.motionZ *= walkSpeed;
Но при попытке ходьбы улетаю на край карты. Насколько я понимаю, с каждым тиком motionX увеличивает себя в несколько раз и образуется геометрическая прогрессия. Есть ли способы её избежать?

P.S. Мне нужно редактировать ИМЕННО motion'ы, так как в будущем буду менять скорость по отдельным осям
 
Ну так сделай проверку на мошион лол, не?
Делал проверку так:
Java:
            if (player.motionX > (0.699999 * walkSpeed)) {
                player.motionX = 0.699999 * walkSpeed;
            }

            if (player.motionX < (-0.699999 * walkSpeed)) {
                player.motionX = -0.699999 * walkSpeed;
            }

            if (player.motionZ > (0.699999 * walkSpeed)) {
                player.motionZ = 0.699999 * walkSpeed;
            }

            if (player.motionZ < (-0.699999 * walkSpeed)) {
                player.motionZ = -0.699999 * walkSpeed;
            }
После малейшего шага игрока тянет вперёд и остановиться не получается.
 

Icosider

Kotliner
Администратор
3,603
99
664
Делал проверку так:
Java:
            if (player.motionX > (0.699999 * walkSpeed)) {
                player.motionX = 0.699999 * walkSpeed;
            }

            if (player.motionX < (-0.699999 * walkSpeed)) {
                player.motionX = -0.699999 * walkSpeed;
            }

            if (player.motionZ > (0.699999 * walkSpeed)) {
                player.motionZ = 0.699999 * walkSpeed;
            }

            if (player.motionZ < (-0.699999 * walkSpeed)) {
                player.motionZ = -0.699999 * walkSpeed;
            }
После малейшего шага игрока тянет вперёд и остановиться не получается.
Лол, нафига каждый тик пересчитывать овер дохрена раз скорость?! Один раз не умножить: 0.699999 * walkSpeed, а затем переиспользовать?
Есть вариант как предложил @Agravaine, а можно использовать moveEntity:
Kotlin:
val speed = 0.69 * walkSpeed
entity.moveEntity(motionX + speed, motionY, motionZ + speed)
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Ты нарошно мои сообщения игноришь? Я тебе объяснил уже, что ты делаешь это каждый тик, естественно у тебя наслаивается motions и игрок улетает.
ТЕБЕ НУЖНО ВЫЗЫВАТЬ МЕТОД ТОЛЬКО КОГДА ИГРОК НАЖАЛ КНОПКУ. Чтобы не возиться с кучей проверок, просто хукнись лучше в этот метод и домножь аргументы на входе.
 
Сделал хуком так:

Java:
public static final double testWalkSpeed = 2.0D;

    @Hook
    public static void moveEntity(Entity entity, double x, double y, double z) {

        if (entity instanceof EntityPlayer) {
            x *= testWalkSpeed;
            z *= testWalkSpeed;
        }
    }

Пробовал так же вот так:
Java:
    @Hook
    public static void moveEntity(Entity entity, double x, double y, double z) {

        if (entity instanceof EntityPlayer) {
            double p_70091_1 = x * testWalkSpeed;
            //double p_70091_3 = 2.0D;
            double p_70091_5 = z * testWalkSpeed;
            System.out.println("Old " + x + " - " + z);
            System.out.println("new " + p_70091_1 + " - " + p_70091_5);
        }
    }

Скорость игрока остаётся та же самая
 
126
6
33
Если я всё правильно понял, ты хочешь в зависимости от walkSpeed менять скорость движения игрока. Если всё так то может сработать:
Java:
player.moveEntity(player.motionX + (Math.sin(Math.toRadians(player.rotationYaw)) * walkSpeed), player.motionY, player.motionZ + (Math.cos(Math.toRadians(player.rotationYaw)) * walkSpeed));

P.s.: Это пример добавочной скорости, т.е. если walkSpeed = 0 , то движение будет стандартным. Если нужно, чтобы движение напрямую зависело от переменной, можно убрать player.motionX и player.motionZ.
 
Последнее редактирование:
Если всё так то может сработать
Не сработало, игрока несёт в сторону в зависимости от того, куда он смотрит

Вот такое сработало:
Java:
if (player.capabilities.getWalkSpeed() != defaultWalkSpeed * walkSpeed) {
            player.capabilities.setPlayerWalkSpeed(defaultWalkSpeed * walkSpeed);
}
Но я изменяю скорость ходьбы, а не по отдельной оси.
Насчет полёта, пытался сделать так:
Java:
if (player.capabilities.isFlying && player.capabilities.isCreativeMode && !player.isRiding()) {
            if (player.getEntityData().getFloat("flySpeed") != defaultFlySpeed * flySpeed) {
                System.out.println("SetFloat Flyspeed");

                player.getEntityData().setFloat("flySpeed",defaultFlySpeed * flySpeed);
            }
            player.moveEntity(0, player.motionY * flySpeed - player.motionY, 0);
            //System.out.println("Flying");
}
Но оно работает как-то странно, через раз. Надо выяснять, дебажить
 
Сверху