Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions common/src/main/java/com/lambda/mixin/render/CameraMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.lambda.interaction.request.rotation.RotationManager;
import com.lambda.module.modules.player.Freecam;
import com.lambda.module.modules.render.CameraTweaks;
import com.lambda.module.modules.render.FreeLook;
import net.minecraft.client.render.Camera;
import net.minecraft.entity.Entity;
import net.minecraft.world.BlockView;
Expand All @@ -28,8 +29,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.ModifyArgs;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.invoke.arg.Args;

@Mixin(Camera.class)
public abstract class CameraMixin {
Expand Down Expand Up @@ -74,6 +77,8 @@ private void injectQuickPerspectiveSwap(BlockView area, Entity focusedEntity, bo
private void onClipToSpace(float desiredCameraDistance, CallbackInfoReturnable<Float> info) {
if (CameraTweaks.INSTANCE.isEnabled() && CameraTweaks.getNoClipCam()) {
info.setReturnValue(desiredCameraDistance);
} else if (FreeLook.INSTANCE.isEnabled()) {
info.setReturnValue(desiredCameraDistance);
}
}

Expand All @@ -93,8 +98,18 @@ private void onClipToSpace(float desiredCameraDistance, CallbackInfoReturnable<F
private float onDistanceUpdate(float desiredCameraDistance) {
if (CameraTweaks.INSTANCE.isEnabled()) {
return CameraTweaks.getCamDistance();
} else if (FreeLook.INSTANCE.isEnabled()) {
return 4.0F;
}

return desiredCameraDistance;
}

@ModifyArgs(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setRotation(FF)V"))
private void onUpdateSetRotationArgs(Args args) {
if (FreeLook.INSTANCE.isEnabled()) {
args.set(0, FreeLook.INSTANCE.getCamera().getYawF());
args.set(1, FreeLook.INSTANCE.getCamera().getPitchF());
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a snippet of the modified method ? Check other mixins for an example
This is crucial for mixin updates on new versions

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean the original source?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, look at other mixins for an example

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* Copyright 2025 Lambda
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.lambda.module.modules.render

import com.lambda.Lambda
import com.lambda.event.events.PlayerEvent
import com.lambda.event.listener.SafeListener.Companion.listen
import com.lambda.interaction.request.rotation.Rotation
import com.lambda.module.Module
import com.lambda.module.tag.ModuleTag
import com.lambda.util.extension.rotation
import net.minecraft.client.option.Perspective


object FreeLook : Module(
name = "FreeLook",
description = "Allows you to look around freely while moving",
defaultTags = setOf(ModuleTag.PLAYER)
) {
val enableYaw by setting("Enable Yaw", false, "Don't effect pitch if enabled")
val enablePitch by setting("Enable Pitch", false, "Don't effect yaw if enabled")
val togglePerspective by setting("Toggle Perspective", true, "Toggle perspective when enabling FreeLook")

var camera: Rotation = Rotation.ZERO
var previousPerspective: Perspective = Perspective.FIRST_PERSON

/**
* @see net.minecraft.entity.Entity.changeLookDirection
*/
private const val SENSITIVITY_FACTOR = 0.15

@JvmStatic
fun updateCam() {
Lambda.mc.gameRenderer.apply {
camera.setRotation(FreeLook.camera.yawF, FreeLook.camera.pitchF)
}
}

init {
previousPerspective = Lambda.mc.options.perspective

onEnable {
camera = player.rotation
previousPerspective = mc.options.perspective
if (togglePerspective) mc.options.perspective = Perspective.THIRD_PERSON_BACK
}

onDisable {
updateCam()
mc.options.perspective = previousPerspective
}

listen<PlayerEvent.ChangeLookDirection> {
if (!isEnabled) return@listen
camera = camera.withDelta(
it.deltaYaw * SENSITIVITY_FACTOR,
it.deltaPitch * SENSITIVITY_FACTOR
)
if (enablePitch) {
player.pitch = camera.pitchF
}
if (enableYaw) {
player.yaw = camera.yawF
}
it.cancel()
}
}
}
Loading