package org.saturnclient.feature.features; import org.saturnclient.common.provider.Providers; import org.saturnclient.config.property.Property; import org.saturnclient.common.module.RenderModule; import org.saturnclient.common.provider.GLFWProvider; import org.saturnclient.feature.Feature; import org.saturnclient.feature.FeatureDetails; /** * FreelookFeature lets the player look around freely (in third-person) * without changing the direction their character walks. * * Camera perspective is controlled through {@link RenderModule} so * that the feature itself contains no direct Minecraft API calls. */ public class FreelookFeature extends Feature { private static final Property enabled = Property.bool(false); private static final Property toggle = Property.bool(true); public static final Property freelookKey = Property.keybinding(GLFWProvider.GLFW_KEY_H); /** Whether freelook is currently active (read by the camera mixin). */ public static boolean isFreeLooking = false; private static boolean wasFirstPerson = false; public FreelookFeature() { super( new FeatureDetails("Freelook", "freelook") .description("Look around freely without moving your character") .tags("Movement", "Camera") .version("v0.2.0"), enabled.named("Enabled"), toggle.named("Toggle freelook"), freelookKey.named("Freelook Keybinding")); } // --------------------------------------------------------------- // Feature contract // --------------------------------------------------------------- @Override public void tick() { if (toggle.value) { if (freelookKey.wasKeyPressed()) { if (isFreeLooking) stopFreelook(); else startFreelook(); } } else if (freelookKey.isKeyPressed()) { if (!isFreeLooking) startFreelook(); } else if (isFreeLooking) { stopFreelook(); } } @Override public void onEnabled(boolean e) { enabled.value = e; if (!e && isFreeLooking) stopFreelook(); } @Override public boolean isEnabled() { return enabled.value; } // --------------------------------------------------------------- // Helpers // --------------------------------------------------------------- private void startFreelook() { RenderModule render = Providers.module.render(); wasFirstPerson = render.isFirstPerson(); render.setThirdPersonBack(); isFreeLooking = true; } private void stopFreelook() { if (wasFirstPerson) { Providers.module.render().setFirstPerson(); } isFreeLooking = false; } }