Движение игрока - хук в MovementInputFromOptions#updatePlayerMoveState.
Не злооупотребляй ими. Тут и без них можно обойтись.
Про управление камеры хз, но я сделал отключение перемещения через кастомный MovementInput. Я делал это на 1.7.10, но думаю что особых изменений код ниже не претерпел. Однако отключается только то движение что инициирует игрок. Различные силы мира вроде водяного течения все еще перемещают игрока.
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:
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:
// Для безопасности, т.к. клиент может хаками сменить MovementInput
@SubscribeEvent
public void onServerPlayerOverload(TickEvent.PlayerTickEvent event) {
if (!event.player.worldObj.isRemote
&& ...) { // Снова твое условие остановки движения
((EntityPlayerMP) event.player).setEntityActionState(0, 0, false, false);
}
}
Я особо не тестировал эту защиту, делал на глаз. Но думаю логика ясна.
Потом регни EventHandler и все.