Skip to content

Commit 5c911e7

Browse files
committed
feat: perspective
1 parent adb0cfd commit 5c911e7

8 files changed

Lines changed: 282 additions & 10 deletions

File tree

src/main/java/org/blackum/blackaddons/client/BlackaddonsClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.blackum.blackaddons.feature.cheat.AutoTNT;
3232
import org.blackum.blackaddons.feature.cheat.FastLeap;
3333
import org.blackum.blackaddons.feature.cheat.Freecam;
34+
import org.blackum.blackaddons.feature.cheat.Perspective;
3435
import org.blackum.blackaddons.core.util.LocationUtils;
3536
import org.blackum.blackaddons.core.util.AlignUtils;
3637
import org.blackum.blackaddons.core.util.Scheduler;
@@ -57,6 +58,7 @@ public void onInitializeClient() {
5758
AutoSS.register();
5859
AutoBM.register();
5960
Freecam.register();
61+
Perspective.register();
6062
Scheduler.register();
6163
LocationUtils.register();
6264
AlignUtils.register();

src/main/java/org/blackum/blackaddons/core/config/ConfigManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,12 @@ public static class ConfigData {
372372
public int freecamKeyCode = -1;
373373
public boolean freecamHoldMode = false;
374374

375+
public boolean perspectiveEnabled = false;
376+
public float perspectiveDistance = 4.0f;
377+
public int perspectiveKeyCode = -1;
378+
public boolean perspectiveHoldMode = false;
379+
public float perspectiveSensitivity = 1.0f;
380+
375381
public boolean AutoSSEnabled = false;
376382
public int AutoSSDelay = 2;
377383
public float AutoSSDistanceLimit = 4.5f;

src/main/java/org/blackum/blackaddons/feature/cheat/Freecam.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ public void activate() {
7777
Minecraft mc = Minecraft.getInstance();
7878
if (mc.player == null || mc.level == null) return;
7979

80+
Perspective.getInstance().deactivate();
81+
8082
active = true;
8183
ConfigManager.data.freecamEnabled = true;
8284

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package org.blackum.blackaddons.feature.cheat;
2+
3+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
4+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
5+
import com.mojang.blaze3d.platform.InputConstants;
6+
import net.minecraft.client.CameraType;
7+
import net.minecraft.client.Minecraft;
8+
import net.minecraft.util.Mth;
9+
import org.blackum.blackaddons.core.config.ConfigManager;
10+
import org.blackum.blackaddons.core.util.KeyBindingAccessor;
11+
import org.lwjgl.glfw.GLFW;
12+
13+
import java.util.HashSet;
14+
import java.util.Set;
15+
16+
public final class Perspective {
17+
private static final Perspective INSTANCE = new Perspective();
18+
private static final int MOUSE_BIND_OFFSET = 1000;
19+
20+
private final Set<Integer> pressedMouseButtons = new HashSet<>();
21+
22+
private float yaw;
23+
private float pitch;
24+
private float lastYaw;
25+
private float lastPitch;
26+
27+
private boolean active;
28+
private boolean keybindPressedLastTick;
29+
private boolean holdKeyActive;
30+
private CameraType previousCameraType;
31+
32+
private Perspective() {
33+
}
34+
35+
public static Perspective getInstance() {
36+
return INSTANCE;
37+
}
38+
39+
public static void register() {
40+
ClientTickEvents.END_CLIENT_TICK.register(client -> getInstance().onTick());
41+
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> getInstance().deactivate());
42+
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> getInstance().deactivate());
43+
}
44+
45+
public void setMouseButtonState(int button, boolean pressed) {
46+
if (pressed) {
47+
pressedMouseButtons.add(button);
48+
} else {
49+
pressedMouseButtons.remove(button);
50+
}
51+
}
52+
53+
public void toggle() {
54+
if (active) {
55+
deactivate();
56+
} else {
57+
activate();
58+
}
59+
}
60+
61+
public void activate() {
62+
if (active) return;
63+
Minecraft mc = Minecraft.getInstance();
64+
if (mc.player == null) return;
65+
66+
Freecam.getInstance().deactivate();
67+
68+
active = true;
69+
ConfigManager.data.perspectiveEnabled = true;
70+
71+
previousCameraType = mc.options.getCameraType();
72+
mc.options.setCameraType(CameraType.THIRD_PERSON_BACK);
73+
74+
yaw = mc.player.getYRot();
75+
pitch = mc.player.getXRot();
76+
lastYaw = yaw;
77+
lastPitch = pitch;
78+
}
79+
80+
public void deactivate() {
81+
active = false;
82+
holdKeyActive = false;
83+
keybindPressedLastTick = false;
84+
ConfigManager.data.perspectiveEnabled = false;
85+
86+
Minecraft mc = Minecraft.getInstance();
87+
if (previousCameraType != null) {
88+
mc.options.setCameraType(previousCameraType);
89+
previousCameraType = null;
90+
}
91+
}
92+
93+
private void onTick() {
94+
handleKeybind();
95+
lastYaw = yaw;
96+
lastPitch = pitch;
97+
}
98+
99+
private void handleKeybind() {
100+
Minecraft mc = Minecraft.getInstance();
101+
if (mc.player == null) {
102+
keybindPressedLastTick = false;
103+
holdKeyActive = false;
104+
return;
105+
}
106+
107+
int keyCode = ConfigManager.data.perspectiveKeyCode;
108+
if (keyCode == GLFW.GLFW_KEY_UNKNOWN || keyCode < 0) {
109+
keybindPressedLastTick = false;
110+
if (holdKeyActive) {
111+
holdKeyActive = false;
112+
}
113+
return;
114+
}
115+
116+
boolean pressed = isBindPressed(mc, keyCode);
117+
if (ConfigManager.data.perspectiveHoldMode) {
118+
if (pressed && !keybindPressedLastTick && !active) {
119+
activate();
120+
holdKeyActive = active;
121+
} else if (!pressed && holdKeyActive) {
122+
deactivate();
123+
}
124+
} else if (pressed && !keybindPressedLastTick) {
125+
toggle();
126+
}
127+
128+
keybindPressedLastTick = pressed;
129+
}
130+
131+
private boolean isBindPressed(Minecraft mc, int keyCode) {
132+
if (keyCode >= MOUSE_BIND_OFFSET) {
133+
return pressedMouseButtons.contains(keyCode - MOUSE_BIND_OFFSET);
134+
}
135+
return InputConstants.isKeyDown(mc.getWindow(), keyCode);
136+
}
137+
138+
public void changeLookDirection(double deltaX, double deltaY) {
139+
yaw += (float) deltaX * 0.15f * ConfigManager.data.perspectiveSensitivity;
140+
pitch += (float) deltaY * 0.15f * ConfigManager.data.perspectiveSensitivity;
141+
pitch = Mth.clamp(pitch, -90.0f, 90.0f);
142+
}
143+
144+
public boolean isActive() {
145+
return active;
146+
}
147+
148+
public float getYaw(float tickDelta) {
149+
return Mth.rotLerp(tickDelta, lastYaw, yaw);
150+
}
151+
152+
public float getPitch(float tickDelta) {
153+
return Mth.lerp(tickDelta, lastPitch, pitch);
154+
}
155+
156+
public float getDistance() {
157+
return ConfigManager.data.perspectiveDistance;
158+
}
159+
160+
public void onMouseScroll(double amount) {
161+
if (!active) return;
162+
ConfigManager.data.perspectiveDistance -= (float) amount * 0.25f;
163+
ConfigManager.data.perspectiveDistance = Mth.clamp(ConfigManager.data.perspectiveDistance, 1.0f, 20.0f);
164+
ConfigManager.save();
165+
}
166+
}

src/main/java/org/blackum/blackaddons/gui/screen/tabs/CheatsTabController.java

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.blackum.blackaddons.gui.screen.BlackAddonsGUI;
88
import org.blackum.blackaddons.Blackaddons;
99
import org.blackum.blackaddons.feature.cheat.Freecam;
10+
import org.blackum.blackaddons.feature.cheat.Perspective;
1011
import org.blackum.blackaddons.gui.widget.*;
1112

1213
import java.util.ArrayList;
@@ -20,6 +21,7 @@ public class CheatsTabController extends SimpleTabController {
2021
private ResizableCard rotationCard;
2122
private ResizableCard autoBMCard;
2223
private ResizableCard freecamCard;
24+
private ResizableCard perspectiveCard;
2325
private Dropdown s1Dropdown;
2426
private Dropdown s2Dropdown;
2527
private Dropdown s3Dropdown;
@@ -117,7 +119,7 @@ public void init(TabPanel.Tab cheatsTab) {
117119
}
118120

119121
Button resetLayout = new Button(contentX + 10, contentY, contentWidth - 20, "Reset Layout", () -> {
120-
screen.resetCardStates("autoTnt", "autoSS", "fastLeap", "rotationSet", "autoBM", "freecam");
122+
screen.resetCardStates("autoTnt", "autoSS", "fastLeap", "rotationSet", "autoBM", "freecam", "perspective");
121123
});
122124
cheatsTab.addWidget(resetLayout);
123125

@@ -144,6 +146,8 @@ public void init(TabPanel.Tab cheatsTab) {
144146
cards.add(autoBMCard);
145147
freecamCard = createFreecamCard(0, 0);
146148
cards.add(freecamCard);
149+
perspectiveCard = createPerspectiveCard(0, 0);
150+
cards.add(perspectiveCard);
147151

148152
for (ResizableCard card : cards) {
149153
int shortestCol = 0;
@@ -162,6 +166,7 @@ public void init(TabPanel.Tab cheatsTab) {
162166
cheatsCardContainer.addCard(rotationCard);
163167
cheatsCardContainer.addCard(autoBMCard);
164168
cheatsCardContainer.addCard(freecamCard);
169+
cheatsCardContainer.addCard(perspectiveCard);
165170
}
166171

167172
private ResizableCard createAutoTntCard(int x, int y) {
@@ -466,16 +471,13 @@ private void collapseOtherDropdowns(Dropdown active) {
466471
}
467472

468473
private ResizableCard createAutoBM(int x, int y) {
469-
// 1. Initialize the correct variable
470474
autoBMCard = screen.createResizableCard("autoBM", x, y, 300, 310, "Auto Ballista Mechanic");
471475

472476
int contentX = autoBMCard.getContentX();
473477
int contentY = autoBMCard.getContentY();
474478

475-
// Use a ListView to handle the multiple sliders/labels
476479
ListView listView = new ListView(contentX, contentY, 260, 260);
477480

478-
// Toggle
479481
ToggleSwitch enabled = new ToggleSwitch(0, 0, 260,
480482
"Enabled",
481483
"Enabled and disables auto BM",
@@ -486,7 +488,6 @@ private ResizableCard createAutoBM(int x, int y) {
486488
);
487489
listView.addItem(enabled);
488490

489-
// Min FC Delay
490491
Label min_fc_label = new Label(0, 0,
491492
String.format("Min first click delay: %.0fms", ConfigManager.data.autoBMConfig.min_fc_delay),
492493
Label.Style.BODY);
@@ -500,7 +501,6 @@ private ResizableCard createAutoBM(int x, int y) {
500501
});
501502
listView.addItem(min_fc_slider);
502503

503-
// Max FC Delay
504504
Label max_fc_label = new Label(0, 0,
505505
String.format("Max first click delay: %.0fms", ConfigManager.data.autoBMConfig.max_fc_delay),
506506
Label.Style.BODY);
@@ -514,7 +514,6 @@ private ResizableCard createAutoBM(int x, int y) {
514514
});
515515
listView.addItem(max_fc_slider);
516516

517-
// Min Between Click
518517
Label min_between_click_label = new Label(0, 0,
519518
String.format("Min between click delay: %.0fms", ConfigManager.data.autoBMConfig.min_between_click_delay),
520519
Label.Style.BODY);
@@ -528,7 +527,6 @@ private ResizableCard createAutoBM(int x, int y) {
528527
});
529528
listView.addItem(min_between_click_slider);
530529

531-
// Max Between Click
532530
Label max_between_click_label = new Label(0, 0,
533531
String.format("Max between click delay: %.0fms", ConfigManager.data.autoBMConfig.max_between_click_delay),
534532
Label.Style.BODY);
@@ -542,7 +540,6 @@ private ResizableCard createAutoBM(int x, int y) {
542540
});
543541
listView.addItem(max_between_click_slider);
544542

545-
// Add the list to the card and update
546543
autoBMCard.addChild(listView);
547544
autoBMCard.updateLayout();
548545

@@ -749,6 +746,77 @@ private ResizableCard createFreecamCard(int x, int y) {
749746
freecamCard.updateLayout();
750747
return freecamCard;
751748
}
749+
750+
private ResizableCard createPerspectiveCard(int x, int y) {
751+
perspectiveCard = screen.createResizableCard("perspective", x, y, 300, 300, "Perspective");
752+
int contentX = perspectiveCard.getContentX();
753+
int contentY = perspectiveCard.getContentY();
754+
755+
ListView listView = new ListView(contentX, contentY, 260, 250);
756+
757+
ToggleSwitch enableToggle = new ToggleSwitch(0, 0, 260,
758+
"Enabled",
759+
"Orbits camera around player",
760+
ConfigManager.data.perspectiveEnabled, value -> {
761+
if (value) {
762+
Perspective.getInstance().activate();
763+
} else {
764+
Perspective.getInstance().deactivate();
765+
}
766+
ConfigManager.data.perspectiveEnabled = Perspective.getInstance().isActive();
767+
ConfigManager.save();
768+
});
769+
listView.addItem(enableToggle);
770+
771+
KeybindButton keybindButton = new KeybindButton(0, 0, 260,
772+
"Keybind",
773+
ConfigManager.data.perspectiveKeyCode,
774+
keyCode -> {
775+
ConfigManager.data.perspectiveKeyCode = keyCode;
776+
ConfigManager.save();
777+
});
778+
listView.addItem(keybindButton);
779+
780+
Dropdown activationModeDropdown = new Dropdown(0, 0, 260,
781+
"Activation Mode",
782+
List.of("Toggle On/Off", "Hold Key"),
783+
mode -> {
784+
ConfigManager.data.perspectiveHoldMode = mode.equals("Hold Key");
785+
ConfigManager.save();
786+
});
787+
activationModeDropdown.setSelectedIndex(ConfigManager.data.perspectiveHoldMode ? 1 : 0);
788+
listView.addItem(activationModeDropdown);
789+
790+
Label distLabel = new Label(0, 0,
791+
String.format(Locale.ROOT, "Distance: %.1f", ConfigManager.data.perspectiveDistance),
792+
Label.Style.BODY);
793+
listView.addItem(distLabel);
794+
795+
Slider distSlider = new Slider(0, 0, 260, 1.0f, 20.0f,
796+
ConfigManager.data.perspectiveDistance, val -> {
797+
ConfigManager.data.perspectiveDistance = val;
798+
distLabel.setText(String.format(Locale.ROOT, "Distance: %.1f", val));
799+
ConfigManager.save();
800+
});
801+
listView.addItem(distSlider);
802+
803+
Label sensitivityLabel = new Label(0, 0,
804+
String.format(Locale.ROOT, "Sensitivity: %.1f", ConfigManager.data.perspectiveSensitivity),
805+
Label.Style.BODY);
806+
listView.addItem(sensitivityLabel);
807+
808+
Slider sensitivitySlider = new Slider(0, 0, 260, 0.1f, 5.0f,
809+
ConfigManager.data.perspectiveSensitivity, val -> {
810+
ConfigManager.data.perspectiveSensitivity = val;
811+
sensitivityLabel.setText(String.format(Locale.ROOT, "Sensitivity: %.1f", val));
812+
ConfigManager.save();
813+
});
814+
listView.addItem(sensitivitySlider);
815+
816+
perspectiveCard.addChild(listView);
817+
perspectiveCard.updateLayout();
818+
return perspectiveCard;
819+
}
752820
private static String delayLabel(int ticks) {
753821
String base = "Action Delay: " + ticks + (ticks == 1 ? " tick" : " ticks");
754822
return ticks <= 1 ? base + " (can be broken)" : base;

src/main/java/org/blackum/blackaddons/mixin/core/EntityMixin.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import net.minecraft.world.entity.Entity;
55
import org.blackum.blackaddons.core.util.AlignUtils;
66
import org.blackum.blackaddons.feature.cheat.Freecam;
7+
import org.blackum.blackaddons.feature.cheat.Perspective;
78
import org.blackum.blackaddons.feature.waypoint.WaypointActionManager;
89
import org.spongepowered.asm.mixin.Mixin;
910
import org.spongepowered.asm.mixin.injection.At;
@@ -19,6 +20,9 @@ private void onTurn(double yRot, double xRot, CallbackInfo ci) {
1920
if (Freecam.getInstance().isActive()) {
2021
Freecam.getInstance().changeLookDirection(yRot, xRot);
2122
ci.cancel();
23+
} else if (Perspective.getInstance().isActive()) {
24+
Perspective.getInstance().changeLookDirection(yRot, xRot);
25+
ci.cancel();
2226
} else if (AlignUtils.shouldBlockMovementInput()) {
2327
ci.cancel();
2428
}

0 commit comments

Comments
 (0)