Заморозка игрока

Версия Minecraft
1.12.2
85
3
3
Как можно заморозить игрока ?
Отключить управление камерой и самим игроком.
 
1,159
38
544
Движение игрока - хук в MovementInputFromOptions#updatePlayerMoveState.
Не злооупотребляй ими. Тут и без них можно обойтись.

Про управление камеры хз, но я сделал отключение перемещения через кастомный MovementInput. Я делал это на 1.7.10, но думаю что особых изменений код ниже не претерпел. Однако отключается только то движение что инициирует игрок. Различные силы мира вроде водяного течения все еще перемещают игрока.

FreezeMovementInput:
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.util.MovementInputFromOptions;
import ru.rarescrap.weightapi.WeightRegistry;

/**
* Клиентский обработчик ввода, отключающий движение при перегрузе
*/
public class FreezeMovementInput extends MovementInputFromOptions {
    private EntityPlayerSP player;

    public FreezeMovementInput(EntityPlayerSP entityPlayerSP, GameSettings profile) {
        super(profile);
        this.player = entityPlayerSP;
    }

    @Override
    public void updatePlayerMoveState() {
        if (...) { // Твое условие. Если true - то игрок может двигаться
            super.updatePlayerMoveState();
        } else { // Иначе - отключаем движение
            this.moveStrafe = 0.0F; // Обнуляем, дабы игрок не двигался по инерации после перегруза
            this.moveForward = 0.0F;
        }
    }

Теперь тебе нужно устанавливать игроку твой MovementInput:
EventHandler:
public class EventHandler {

    @SideOnly(Side.CLIENT)
    public static FreezeMovementInput freezeMovementInput;
  
    // Инициализируем обработчик движения игрока на клиенте
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void onSetupPlayer(EntityJoinWorldEvent event) {
        if (event.entity instanceof EntityPlayerSP) {
            freezeMovementInput = new FreezeMovementInput((EntityPlayerSP) event.entity, Minecraft.getMinecraft().gameSettings);
        }
    }
}

На всякий случай на сервере нужно тоже проверять условие остановки движения на случай если клиент хаками поменяет MovementInput:

EventHandler:
// Для безопасности, т.к. клиент может хаками сменить MovementInput
@SubscribeEvent
public void onServerPlayerOverload(TickEvent.PlayerTickEvent event) {
    if (!event.player.worldObj.isRemote
        && ...) { // Снова твое условие остановки движения
        ((EntityPlayerMP) event.player).setEntityActionState(0, 0, false, false);
    }
}
Я особо не тестировал эту защиту, делал на глаз. Но думаю логика ясна.

Потом регни EventHandler и все.
 
Последнее редактирование:
3,005
192
592
@RareScrap А что, если челик просто вырежет проверку?
И все равно сможет перемещаться?
 
1,159
38
544
7,099
324
1,510
Управлять камерой можно при помощи EntityViewRenderEvent.CameraSetup
 

tox1cozZ

aka Agravaine
8,456
598
2,893
@RareScrap А что, если челик просто вырежет проверку?
И все равно сможет перемещаться?
Если челик додумался вырезать проверку, значит он и без мода сможет сделать спидхак и тд. Можно хукнуться в обработчик пакета ходьбы игрока и там добавить проверку, это будет на сервере и должно спасти от хака.
 
49
5
Ну незнаю..
Java:
player.motionX = 0;
player.motionY = 0;
player.motionZ = 0;
player.swingingHand = false;
player.limbSwing = false;
или
Java:
@SubscribeEvent
    public void freezeEvent(LivingUpdateEvent event)
    {
        if (event.getEntity() instanceof EntityPlayer)
        {
            EntityPlayer player = (EntityPlayer) e.getEntity();
            event.setCanceled(true);
        }
    }
можно лучший ответ)
 
Сверху