diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index 7ad6549..2292635 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -60,9 +60,10 @@ public class ControllerBindings { GUI_PRESS, GUI_BACK, GUI_NEXT_TAB, GUI_PREV_TAB, GUI_ABSTRACT_ACTION_1, GUI_ABSTRACT_ACTION_2, - PICK_BLOCK, + PICK_BLOCK, PICK_BLOCK_NBT, TOGGLE_HUD_VISIBILITY, SHOW_PLAYER_LIST, + TAKE_SCREENSHOT, RADIAL_MENU, RADIAL_AXIS_UP, RADIAL_AXIS_DOWN, RADIAL_AXIS_LEFT, RADIAL_AXIS_RIGHT, VMOUSE_MOVE_UP, VMOUSE_MOVE_DOWN, VMOUSE_MOVE_LEFT, VMOUSE_MOVE_RIGHT, VMOUSE_LCLICK, VMOUSE_RCLICK, VMOUSE_SHIFT_CLICK, @@ -294,7 +295,13 @@ public class ControllerBindings { .category(GAMEPLAY_CATEGORY) .context(BindContexts.INGAME) .radialCandidate(RadialIcons.getItem(Items.STICK)) - .vanillaOverride(options.keyPickItem, () -> false) + .build()); + register(PICK_BLOCK_NBT = ControllerBindingBuilder.create(controller) + .identifier("controlify", "pick_block_nbt") + .defaultBind(new EmptyBind<>()) + .category(GAMEPLAY_CATEGORY) + .context(BindContexts.INGAME) + .radialCandidate(RadialIcons.getItem(Items.DEBUG_STICK)) .build()); register(TOGGLE_HUD_VISIBILITY = ControllerBindingBuilder.create(controller) .identifier("controlify", "toggle_hud_visibility") @@ -310,6 +317,13 @@ public class ControllerBindings { .context(BindContexts.INGAME) .radialCandidate(RadialIcons.getItem(Items.PLAYER_HEAD)) .build()); + register(TAKE_SCREENSHOT = ControllerBindingBuilder.create(controller) + .identifier("controlify", "take_screenshot") + .defaultBind(new EmptyBind<>()) + .category(MISC_CATEGORY) + .context(BindContexts.INGAME) + .radialCandidate(RadialIcons.getItem(Items.SPYGLASS)) + .build()); register(RADIAL_MENU = ControllerBindingBuilder.create(controller) .identifier("controlify", "radial_menu") .defaultBind(GamepadBinds.DPAD_RIGHT) diff --git a/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java b/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java index 41afde5..1ac312f 100644 --- a/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java +++ b/src/main/java/dev/isxander/controlify/controller/ControllerConfig.java @@ -80,7 +80,7 @@ public abstract class ControllerConfig implements Serializable { case 3 -> bindings.OPEN_CHAT.id(); case 4 -> bindings.SWAP_HANDS.id(); case 5 -> bindings.PICK_BLOCK.id(); - case 6 -> bindings.PAUSE.id(); + case 6 -> bindings.TAKE_SCREENSHOT.id(); case 7 -> bindings.SHOW_PLAYER_LIST.id(); default -> RadialMenuScreen.EMPTY_ACTION; }; diff --git a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java index f4b3f3b..21cbaf0 100644 --- a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java +++ b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java @@ -241,6 +241,11 @@ public class InGameButtonGuide implements IngameGuideRegistry { return Optional.of(Component.translatable("controlify.guide.ingame.pick_block")); return Optional.empty(); }); + registerGuideAction(controller.bindings().PICK_BLOCK_NBT, ActionLocation.RIGHT, (ctx) -> { + if (ctx.hitResult().getType() == HitResult.Type.BLOCK && ctx.player().isCreative()) + return Optional.of(Component.translatable("controlify.binding.controlify.pick_block_nbt")); + return Optional.empty(); + }); } private HitResult calculateHitResult() { diff --git a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index fe49484..f1a50af 100644 --- a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java +++ b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java @@ -8,19 +8,22 @@ import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.gui.screen.RadialMenuScreen; +import dev.isxander.controlify.server.ServerPolicies; import dev.isxander.controlify.utils.Animator; import dev.isxander.controlify.utils.Easings; import dev.isxander.controlify.utils.NavigationHelper; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; +import net.minecraft.client.Screenshot; import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.client.player.KeyboardInput; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; import java.util.concurrent.atomic.AtomicReference; @@ -50,8 +53,6 @@ public class InGameInputHandler { } protected void handleKeybinds() { - shouldShowPlayerList = false; - if (minecraft.screen != null) return; @@ -110,6 +111,21 @@ public class InGameInputHandler { shouldShowPlayerList = !shouldShowPlayerList; } + if (controller.bindings().TAKE_SCREENSHOT.justPressed()) { + Screenshot.grab( + this.minecraft.gameDirectory, + this.minecraft.getMainRenderTarget(), + component -> this.minecraft.execute(() -> this.minecraft.gui.getChat().addMessage(component)) + ); + } + + if (controller.bindings().PICK_BLOCK.justPressed()) { + ((PickBlockAccessor) minecraft).controlify$pickBlock(); + } + if (controller.bindings().PICK_BLOCK_NBT.justPressed()) { + ((PickBlockAccessor) minecraft).controlify$pickBlockWithNbt(); + } + if (controller.bindings().RADIAL_MENU.justPressed()) { minecraft.setScreen(new RadialMenuScreen(controller, false, null)); } diff --git a/src/main/java/dev/isxander/controlify/ingame/PickBlockAccessor.java b/src/main/java/dev/isxander/controlify/ingame/PickBlockAccessor.java new file mode 100644 index 0000000..09c780d --- /dev/null +++ b/src/main/java/dev/isxander/controlify/ingame/PickBlockAccessor.java @@ -0,0 +1,7 @@ +package dev.isxander.controlify.ingame; + +public interface PickBlockAccessor { + void controlify$pickBlock(); + + void controlify$pickBlockWithNbt(); +} diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/input/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/input/MinecraftMixin.java new file mode 100644 index 0000000..0210249 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/input/MinecraftMixin.java @@ -0,0 +1,39 @@ +package dev.isxander.controlify.mixins.feature.input; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import dev.isxander.controlify.ingame.PickBlockAccessor; +import net.minecraft.client.Minecraft; +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; + +@Mixin(Minecraft.class) +public abstract class MinecraftMixin implements PickBlockAccessor { + @Unique + private boolean useNbtPick; + + @Shadow + protected abstract void pickBlock(); + + @Override + public void controlify$pickBlock() { + useNbtPick = false; + pickBlock(); + } + + @Override + public void controlify$pickBlockWithNbt() { + useNbtPick = true; + pickBlock(); + } + + @ModifyExpressionValue(method = "pickBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;hasControlDown()Z")) + private boolean shouldUseNbtPick(boolean hasControlDown) { + if (useNbtPick) { + useNbtPick = false; + return true; + } + return hasControlDown; + } +} diff --git a/src/main/resources/assets/controlify/lang/en_us.json b/src/main/resources/assets/controlify/lang/en_us.json index 533eac6..cec22f0 100644 --- a/src/main/resources/assets/controlify/lang/en_us.json +++ b/src/main/resources/assets/controlify/lang/en_us.json @@ -219,6 +219,8 @@ "controlify.binding.controlify.drop": "Drop Item", "controlify.binding.controlify.drop_stack": "Drop Stack", "controlify.binding.controlify.pick_block": "Pick Block", + "controlify.binding.controlify.pick_block_nbt": "Pick Block (with NBT)", + "controlify.binding.controlify.take_screenshot": "Take Screenshot", "controlify.binding.controlify.toggle_hud_visibility": "Toggle HUD Visibility", "controlify.binding.controlify.show_player_list": "Show Player List", "controlify.binding.controlify.radial_menu": "Radial Menu", diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index 5cfbcf5..cafcbc7 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -43,6 +43,7 @@ "feature.guide.screen.AbstractContainerScreenAccessor", "feature.guide.screen.AbstractWidgetMixin", "feature.guide.screen.TabNavigationBarMixin", + "feature.input.MinecraftMixin", "feature.oofinput.GameRendererMixin", "feature.reacharound.GameRendererMixin", "feature.rumble.blockbreak.MultiPlayerGameModeMixin",