自由视角

自由视角

允许你自由地将摄像机围绕角色旋转!

冒险

自由视角模组(Freelook Mod)

允许你围绕角色自由旋转摄像机!


功能特性

  • 多种摄像机视角
  • 可自定义的触发方式
  • 摄像机循环集成
  • 平滑过渡效果

服务器选择退出机制(Server Opt-Out)

部分服务器可能认为自由视角属于不公平竞技优势。从 2.0.0 版本起,Freelook 包含一个简单的选择退出协议。

工作原理

  1. 当玩家加入时,客户端发送一个 freelook:handshake 数据包。
  2. 如果服务器想要禁用自由视角,它会响应一个 freelook:disable 数据包。
  3. 之后该玩家在当前回话中将无法使用自由视角。
点击展开代码示例
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;
        }
    }
}

代码基于 LGPL 3.0 协议许可。