mirror of
https://codeberg.org/moonleay/Gimbal.git
synced 2025-07-06 23:25:46 +02:00
chore: moved group to net.moonleay
fix: fixed camera going meyhem when going 3rd person in NoClip
This commit is contained in:
parent
0cd271f139
commit
7383fa09e8
31 changed files with 125 additions and 107 deletions
66
src/main/java/net/moonleay/gimble/mixin/HudMixin.java
Normal file
66
src/main/java/net/moonleay/gimble/mixin/HudMixin.java
Normal file
|
@ -0,0 +1,66 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.hud.InGameHud;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.client.editor.modes.Mode;
|
||||
import net.moonleay.gimble.client.editor.modes.ModeModifier;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(InGameHud.class)
|
||||
public class HudMixin {
|
||||
|
||||
@Shadow @Final private MinecraftClient client;
|
||||
|
||||
@Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"))
|
||||
private void render(MatrixStack matrices, CallbackInfo ci) {
|
||||
Mode currentMode = ClientEditor.INSTANCE.getCurrentMode();
|
||||
StringBuilder displayText = getStringBuilder(currentMode);
|
||||
|
||||
MinecraftClient mc = MinecraftClient.getInstance();
|
||||
TextRenderer tr = mc.textRenderer;
|
||||
// int screenWidth = mc.getWindow().getWidth();
|
||||
// int screenHeight = mc.getWindow().getHeight();
|
||||
// int scale = (mc.options.getGuiScale().getValue() == 0 ? 1 : mc.options.getGuiScale().getValue());
|
||||
// int bottomY = screenHeight / scale - 4 - tr.fontHeight - 12;
|
||||
|
||||
tr.drawWithShadow(matrices,
|
||||
Text.of(displayText.toString()),
|
||||
4, 4,
|
||||
currentMode.getColor());
|
||||
}
|
||||
|
||||
@Unique
|
||||
private static @NotNull StringBuilder getStringBuilder(Mode currentMode) {
|
||||
List<ModeModifier> currentModifier = ClientEditor.INSTANCE.getCurrentModifier();
|
||||
StringBuilder displayText = new StringBuilder(currentMode.getDisplayName());
|
||||
if (!currentModifier.isEmpty()) {
|
||||
displayText.append(" [");
|
||||
for (int i = 0; i < currentModifier.size(); i++) {
|
||||
displayText.append(currentModifier.get(i).getDisplayName());
|
||||
if (i != currentModifier.size() - 1) {
|
||||
displayText.append(", ");
|
||||
}
|
||||
}
|
||||
displayText.append("]");
|
||||
}
|
||||
return displayText;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private int getXRight(String txt, int screenWidth) {
|
||||
return screenWidth / (MinecraftClient.getInstance().options.getGuiScale().getValue() == 0 ? 1 : MinecraftClient.getInstance().options.getGuiScale().getValue()) - 4 - MinecraftClient.getInstance().textRenderer.getWidth(Text.of(txt));
|
||||
}
|
||||
}
|
15
src/main/java/net/moonleay/gimble/mixin/KeyMixin.java
Normal file
15
src/main/java/net/moonleay/gimble/mixin/KeyMixin.java
Normal file
|
@ -0,0 +1,15 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.client.Keyboard;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(Keyboard.class)
|
||||
public class KeyMixin {
|
||||
// This Mixin is not registered. This will be used to handle key events with static Buttons.
|
||||
@Inject(method = "onKey", at = @At("TAIL"))
|
||||
private void onKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) {
|
||||
}
|
||||
}
|
21
src/main/java/net/moonleay/gimble/mixin/NoClipCameraFix.java
Normal file
21
src/main/java/net/moonleay/gimble/mixin/NoClipCameraFix.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.client.render.Camera;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.client.editor.modes.ModeModifier;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(Camera.class)
|
||||
public class NoClipCameraFix {
|
||||
|
||||
@Inject(method = "clipToSpace", at = @At("HEAD"), cancellable = true)
|
||||
private void fixCameraInNoClip(double desiredCameraDistance, CallbackInfoReturnable<Double> cir) {
|
||||
if (ClientEditor.INSTANCE.containsModifier(ModeModifier.NO_CLIP)){
|
||||
cir.setReturnValue(desiredCameraDistance);
|
||||
cir.cancel();
|
||||
}
|
||||
}
|
||||
}
|
32
src/main/java/net/moonleay/gimble/mixin/NoClipMixin.java
Normal file
32
src/main/java/net/moonleay/gimble/mixin/NoClipMixin.java
Normal file
|
@ -0,0 +1,32 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.client.editor.modes.ModeModifier;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(Entity.class)
|
||||
public class NoClipMixin {
|
||||
|
||||
@Shadow public boolean noClip;
|
||||
|
||||
@Inject(method = "tick", at = @At(value = "HEAD"))
|
||||
private void enoClip(CallbackInfo ci) {
|
||||
// TODO: Add player check, add multiplayer compat
|
||||
if(!((Entity)(Object)this instanceof PlayerEntity)) // Only check on player
|
||||
return;
|
||||
|
||||
if (!ClientEditor.INSTANCE.containsModifier(ModeModifier.NO_CLIP))
|
||||
return;
|
||||
PlayerEntity thePlayer = (PlayerEntity)(Object)this;
|
||||
if (!thePlayer.getAbilities().flying)
|
||||
return;
|
||||
|
||||
this.noClip = true;
|
||||
}
|
||||
}
|
45
src/main/java/net/moonleay/gimble/mixin/NormalModeMixin.java
Normal file
45
src/main/java/net/moonleay/gimble/mixin/NormalModeMixin.java
Normal file
|
@ -0,0 +1,45 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.option.GameOptions;
|
||||
import net.moonleay.gimble.client.editor.modes.Mode;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(MinecraftClient.class)
|
||||
public class NormalModeMixin {
|
||||
|
||||
@Shadow
|
||||
@Nullable
|
||||
public GameOptions options;
|
||||
|
||||
@Inject(method = "openPauseMenu", at = @At("HEAD"), cancellable = true)
|
||||
private void setNormalMode(boolean pause, CallbackInfo ci) {
|
||||
if (ClientEditor.INSTANCE.getCURRENT_MODE() != Mode.NORMAL){
|
||||
// Set the editor mode to normal
|
||||
ClientEditor.INSTANCE.setCURRENT_MODE(Mode.NORMAL);
|
||||
ClientEditor.INSTANCE.checkForIncompatibleModeModifiers();
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z"), cancellable = true)
|
||||
private void blockWorldManipulation(CallbackInfo ci) { // This could be replaced by net.minecraft.world.GameMode#isBlockBreakingRestricted
|
||||
if (ClientEditor.INSTANCE.getCURRENT_MODE() == Mode.NORMAL || ClientEditor.INSTANCE.getCURRENT_MODE() == Mode.VISUAL) {
|
||||
while(this.options.attackKey.wasPressed()) {
|
||||
}
|
||||
|
||||
while(this.options.useKey.wasPressed()) {
|
||||
}
|
||||
|
||||
while(this.options.pickItemKey.wasPressed()) {
|
||||
}
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
package net.moonleay.gimble.mixin;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.network.ClientPlayerEntity;
|
||||
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||
import net.minecraft.client.particle.ParticleManager;
|
||||
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.moonleay.gimble.client.editor.ClientEditor;
|
||||
import net.moonleay.gimble.client.editor.modes.Mode;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(MinecraftClient.class)
|
||||
public abstract class ReplaceModeMixin {
|
||||
|
||||
|
||||
@Shadow protected abstract void handleBlockBreaking(boolean breaking);
|
||||
|
||||
@Shadow @Nullable public ClientPlayerInteractionManager interactionManager;
|
||||
|
||||
@Shadow @Final public ParticleManager particleManager;
|
||||
|
||||
@Shadow @Nullable public ClientPlayerEntity player;
|
||||
|
||||
@Shadow @Nullable public HitResult crosshairTarget;
|
||||
|
||||
@Inject(method = "doItemUse", at = @At("HEAD"))
|
||||
private void replaceBlock(CallbackInfo ci) {
|
||||
// Check if should run
|
||||
if (!ClientEditor.INSTANCE.getCURRENT_MODE().equals(Mode.REPLACE))
|
||||
return; // Mode is not REPLACE, ignore
|
||||
MinecraftClient client = MinecraftClient.getInstance();
|
||||
assert this.interactionManager != null;
|
||||
if (!this.interactionManager.getCurrentGameMode().isCreative())
|
||||
return;
|
||||
if (!(this.crosshairTarget instanceof BlockHitResult blockHitResult))
|
||||
return;
|
||||
if (blockHitResult == null)
|
||||
return;
|
||||
|
||||
// Gather data
|
||||
BlockPos pos = blockHitResult.getBlockPos();
|
||||
Direction direction = blockHitResult.getSide();
|
||||
BlockState blockState = client.world.getBlockState(pos);
|
||||
|
||||
// Start sending shit
|
||||
client.getTutorialManager().onBlockBreaking(client.world, pos, blockState, 1.0F);
|
||||
this.interactionManager.sendSequencedPacket(client.world, sequence -> {
|
||||
this.interactionManager.breakBlock(pos);
|
||||
return new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, pos, direction, sequence);
|
||||
});
|
||||
this.player.swingHand(Hand.MAIN_HAND);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue