Detached Free Camera (Freecam / FreeLook)
Влияние на механику Minecraft
В Minecraft точка обзора игрока жестко привязана к сущности персонажа. На каждом кадре метод Camera.update() обновляет положение и углы поворота камеры на основе координат игрока, высоты глаз и направления взгляда, а метод clipToSpace() предотвращает прохождение камеры сквозь блоки в режиме от третьего лица.
Freecam_Camera_Detached выявляет модификации, внедряющиеся в Camera (class_4184) для отвязки камеры от тела персонажа. В исследованном чит-клиенте (com.larpclient.mixin.CameraFreecamMixin) аннотация @Inject встраивается в конец метода Camera.update() (method_19321). При активном модуле FreecamModule миксин перезаписывает ориентацию камеры через this.method_19325(yaw, pitch) и координаты через this.method_19322(pos).
Это позволяет игроку свободно перемещать бесплотную камеру сквозь непрозрачные стены и блоки для разведки баз, тайников и подземных пещер, в то время как физическое тело персонажа остается неподвижным на сервере.
Анализируемые функции и API
@Mixin(Camera.class / class_4184)
Внедрение Mixin в класс камеры Minecraft (net.minecraft.class_4184).
Camera.setRotation / method_19325
Принудительно задает углы наклона и поворота камеры независимо от взгляда игрока (method_19325).
Camera.setPos / method_19322
Задает координаты камеры в пространстве, позволяя точке обзора перемещаться сквозь блоки (method_19322).
Декомпилированный вид (Vineflower)
@Inject(method = "method_19321", at = @At("TAIL"))
private void larpclient$freecam(class_1937 level, class_1297 entity, boolean detached, boolean thirdPersonReverse, float partialTick, CallbackInfo ci) {
FreecamModule freecam = FreecamModule.get();
if (freecam != null && freecam.isActive()) {
this.method_19325(freecam.getInterpolatedYaw(partialTick), freecam.getInterpolatedPitch(partialTick));
this.method_19322(freecam.getInterpolatedPos(partialTick));
}
}
Сигнатура байткода и статический детект
Детектор анализирует аннотации класса и вызовы методов, требуя одновременного выполнения двух условий:
- Аннотацию
@Mixin, нацеленную на класс камеры:net.minecraft.client.render.Cameraили Intermediarynet.minecraft.class_4184. - Вызов методов манипуляции камерой:
setPos(Intermediarymethod_19322илиmethod_19325),setRotation(Intermediarymethod_19325илиmethod_19327) или метода проверки коллизий со стенамиclipToSpace(method_19318).
Правило выявляет вмешательство в класс камеры на уровне движка. Если свободный обзор реализован без изменения класса Camera (например, через переключение точки обзора на фейковую сущность-наблюдателя с помощью ванильного вызова MinecraftClient.setCameraEntity()), данная сигнатура не сработает.