
Freelook
Мод Freelook для Майнкрафт: свободный обзор вокруг персонажа. Удобно для строительства, разведки и PvP. Настраиваемый режим активации, плавные переходы, поддержка серверов с opt-out.
Freelook - Mод для свободного обзора
Freelook - это небольшой, но крайне полезный мод для Майнкрафт, который позволяет тебе вращать камеру вокруг персонажа, не меняя направления взгляда. Если в ванильной игре, чтобы посмотреть по сторонам, нужно разворачивать персонажа (и менять направление движения), то с этим модом можно спокойно оглядываться, осматривать местность или строить детали, не теряя ориентации. Особенно пригодится в PvP, при исследовании пещер или просто для красивых скриншотов.
Особенности
- Несколько режимов камеры - можешь настроить, как именно будет работать обзор (зажать кнопку, переключение и т.д.)
- Гибкая настройка активации - выбери удобную клавишу и способ переключения
- Цикл камер - если у тебя есть другие моды, меняющие камеру, Freelook умеет с ними дружить
- Плавные переходы - картинка не дёргается, взгляд скользит естественно
Как мод работает на серверах?
Некоторые серверы считают свободный обзор читерством (например, чтобы заглядывать за углы). Начиная с версии 2.0.0, Freelook поддерживает простой протокол отказа. Когда ты заходишь на сервер, клиент отправляет пакет freelook:handshake. Если сервер хочет запретить мод, он отвечает пакетом freelook:disable, и весь сеанс мод будет отключён. Честно и удобно.
Вот пример того, как можно реализовать такую защиту на стороне сервера (код на Java):
Код примера (нажми, чтобы развернуть)
public class Example implements ModInitializer {
@Override
public void onInitialize() {
PayloadTypeRegistry.clientboundPlay().register(DisableModPayload.TYPE, DisableModPayload.CODEC);
PayloadTypeRegistry.serverboundPlay().register(HandshakePayload.TYPE, HandshakePayload.CODEC);
ServerPlayNetworking.registerGlobalReceiver(HandshakePayload.TYPE,
(payload, ctx) -> ServerPlayNetworking.send(ctx.player(), new DisableModPayload())
);
}
public record DisableModPayload() implements CustomPacketPayload {
public static final Type<DisableModPayload> TYPE = new Type<>(Identifier.parse("freelook:disable"));
public static final StreamCodec<RegistryFriendlyByteBuf, DisableModPayload> CODEC = StreamCodec.unit(new DisableModPayload());
@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}
}
public record HandshakePayload() implements CustomPacketPayload {
public static final Type<HandshakePayload> TYPE = new Type<>(Identifier.parse("freelook:handshake"));
public static final StreamCodec<RegistryFriendlyByteBuf, HandshakePayload> CODEC = StreamCodec.unit(new HandshakePayload());
@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}
}
}
