Skip to content

Commit 0018535

Browse files
committed
Added Perspective Mod
1 parent ed53f47 commit 0018535

File tree

31 files changed

+358
-22
lines changed

31 files changed

+358
-22
lines changed

changelog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
## SimpleClient %version%
2-
- Added Biome Mod
2+
- Added Perspective Mod

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ org.gradle.jvmargs=-Xmx2G
33
org.gradle.parallel=true
44

55
# SimpleClient
6-
simpleclient_version=0.2.3
6+
simpleclient_version=0.2.4

simpleclient-1.19.4/src/main/java/simpleclient/feature/FeatureManagerImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void init() {
2626
addFeature(new Lowfire());
2727
addFeature(new Motionblur());
2828
addFeature(new PerformanceBoost());
29+
addFeature(new Perspective());
2930
addFeature(new Ping());
3031
addFeature(new Zoom());
3132
super.init();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package simpleclient.feature;
2+
3+
import com.mojang.blaze3d.platform.InputConstants;
4+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
5+
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
6+
import net.minecraft.client.CameraType;
7+
import net.minecraft.client.KeyMapping;
8+
import org.lwjgl.glfw.GLFW;
9+
10+
public class Perspective extends Feature {
11+
public static boolean ACTIVE = false;
12+
public static float YAW = 0;
13+
public static float PITCH = 0;
14+
private CameraType previousPerspective;
15+
16+
public Perspective() {
17+
super(FeatureType.PERSPECTIVE);
18+
KeyMapping key = KeyBindingHelper.registerKeyBinding(new KeyMapping("simpleclient.perspective", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_LEFT_ALT, "simpleclient.category"));
19+
ClientTickEvents.END_CLIENT_TICK.register(minecraft -> {
20+
if (key.isDown() && !ACTIVE) {
21+
ACTIVE = true;
22+
previousPerspective = minecraft.options.getCameraType();
23+
minecraft.options.setCameraType(CameraType.THIRD_PERSON_BACK);
24+
} else if (!key.isDown() && ACTIVE) {
25+
ACTIVE = false;
26+
if (previousPerspective != null) minecraft.options.setCameraType(previousPerspective);
27+
previousPerspective = null;
28+
}
29+
});
30+
}
31+
}

simpleclient-1.19.4/src/main/java/simpleclient/mixin/MinecraftMixin.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,47 @@
11
package simpleclient.mixin;
22

3+
import com.mojang.blaze3d.platform.Window;
34
import net.minecraft.SharedConstants;
45
import net.minecraft.client.Minecraft;
6+
import net.minecraft.client.main.GameConfig;
57
import net.minecraft.resources.ResourceLocation;
8+
import net.minecraft.server.packs.PackResources;
9+
import net.minecraft.server.packs.VanillaPackResources;
610
import net.minecraft.server.packs.resources.IoSupplier;
11+
import org.spongepowered.asm.mixin.Final;
712
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
814
import org.spongepowered.asm.mixin.injection.At;
915
import org.spongepowered.asm.mixin.injection.Inject;
16+
import org.spongepowered.asm.mixin.injection.Redirect;
17+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1018
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1119
import simpleclient.SimpleClient;
1220

21+
import java.io.IOException;
1322
import java.io.InputStream;
1423

1524
@Mixin(Minecraft.class)
1625
public abstract class MinecraftMixin {
26+
@Shadow @Final private Window window;
27+
28+
@Shadow protected abstract IoSupplier<InputStream> getIconFile(String... par1) throws IOException;
29+
1730
@Inject(at = @At("HEAD"), method = "createTitle", cancellable = true)
1831
public void createTitle(CallbackInfoReturnable<String> cir) {
1932
cir.setReturnValue("Minecraft " + SharedConstants.getCurrentVersion().getName() + " | SimpleClient " + SimpleClient.VERSION);
2033
}
2134

35+
@Redirect(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/Window;setIcon(Lnet/minecraft/server/packs/resources/IoSupplier;Lnet/minecraft/server/packs/resources/IoSupplier;)V"), method = "<init>")
36+
public void setIcon(Window instance, IoSupplier ioSupplier, IoSupplier ioSupplier2) {}
37+
38+
@Inject(at = @At("TAIL"), method = "<init>")
39+
public void init(GameConfig gameConfig, CallbackInfo ci) {
40+
try {
41+
window.setIcon(getIconFile("icons", "icon_16x16.png"), getIconFile("icons", "icon_32x32.png"));
42+
} catch (Exception e) {e.printStackTrace();}
43+
}
44+
2245
@Inject(at = @At("HEAD"), method = "getIconFile", cancellable = true)
2346
public void getIconFile(String[] strings, CallbackInfoReturnable<IoSupplier<InputStream>> cir) {
2447
cir.setReturnValue(() -> Minecraft.getInstance().getResourceManager().open(new ResourceLocation("simpleclient", "textures/" + String.join("/", strings))));

simpleclient-1.20.1/src/main/java/simpleclient/mixin/OptionsMixin.java renamed to simpleclient-1.19.4/src/main/java/simpleclient/mixin/feature/fullbright/OptionsMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package simpleclient.mixin;
1+
package simpleclient.mixin.feature.fullbright;
22

33
import net.minecraft.client.Minecraft;
44
import net.minecraft.client.OptionInstance;

simpleclient-1.20/src/main/java/simpleclient/mixin/ScreenEffectRendererMixin.java renamed to simpleclient-1.19.4/src/main/java/simpleclient/mixin/feature/lowfire/ScreenEffectRendererMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package simpleclient.mixin;
1+
package simpleclient.mixin.feature.lowfire;
22

33
import com.mojang.blaze3d.vertex.PoseStack;
44
import net.minecraft.client.Minecraft;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package simpleclient.mixin.feature.perspective;
2+
3+
import net.minecraft.client.Camera;
4+
import net.minecraft.world.entity.Entity;
5+
import net.minecraft.world.level.BlockGetter;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.ModifyArgs;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
import org.spongepowered.asm.mixin.injection.invoke.arg.Args;
13+
import simpleclient.feature.Perspective;
14+
15+
@Mixin(Camera.class)
16+
public abstract class CameraMixin {
17+
@Shadow private float yRot;
18+
@Shadow private float xRot;
19+
20+
@Inject(at = @At(value = "INVOKE", target = "net/minecraft/client/Camera.move(DDD)V", ordinal = 0), method = "setup")
21+
public void setRotation1(BlockGetter blockGetter, Entity entity, boolean thirdPerson, boolean inverseView, float tickDelta, CallbackInfo info) {
22+
if (Perspective.ACTIVE) {
23+
xRot = Perspective.PITCH;
24+
yRot = Perspective.YAW;
25+
}
26+
}
27+
28+
@ModifyArgs(at = @At(value = "INVOKE", target = "net/minecraft/client/Camera.setRotation(FF)V", ordinal = 0), method = "setup")
29+
public void setRotation(Args args) {
30+
if (Perspective.ACTIVE) {
31+
args.set(0, Perspective.YAW);
32+
args.set(1, Perspective.PITCH);
33+
}
34+
}
35+
36+
@Inject(at = @At(value = "INVOKE", target = "net/minecraft/client/Camera.setRotation(FF)V", ordinal = 0, shift = At.Shift.AFTER), method = "setup")
37+
public void setRotation2(BlockGetter blockGetter, Entity entity, boolean thirdPerson, boolean inverseView, float tickDelta, CallbackInfo info) {
38+
if (!Perspective.ACTIVE) {
39+
Perspective.YAW = entity.getYRot();
40+
Perspective.PITCH = entity.getXRot();
41+
}
42+
}
43+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package simpleclient.mixin.feature.perspective;
2+
3+
import net.minecraft.client.MouseHandler;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
9+
import simpleclient.feature.Perspective;
10+
11+
@Mixin(MouseHandler.class)
12+
public class MouseMixin {
13+
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/tutorial/Tutorial;onMouse(DD)V"), method = "turnPlayer", locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true)
14+
private void onMouse(CallbackInfo ci, double d, double e, double k, double l, double f, double g, double h, int m) {
15+
if (Perspective.ACTIVE) {
16+
Perspective.YAW = (float) (Perspective.YAW + k / 8.0D);
17+
Perspective.PITCH = (float) Math.max(-90, Math.min(Perspective.PITCH + l * m / 8.0D, 90));
18+
System.out.println(Perspective.YAW + " " + Perspective.PITCH);
19+
ci.cancel();
20+
}
21+
}
22+
23+
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;turn(DD)V"), method = "turnPlayer", cancellable = true)
24+
private void turn(CallbackInfo ci) {
25+
if (Perspective.ACTIVE) ci.cancel();
26+
}
27+
}

simpleclient-1.19.4/src/main/java/simpleclient/mixin/GameRendererMixin.java renamed to simpleclient-1.19.4/src/main/java/simpleclient/mixin/feature/zoom/GameRendererMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package simpleclient.mixin;
1+
package simpleclient.mixin.feature.zoom;
22

33
import net.minecraft.client.Camera;
44
import net.minecraft.client.renderer.GameRenderer;

0 commit comments

Comments
 (0)