Posted November 2, 20231 yr Hi, Is it possible to simulate a shift press? I need to get hasShiftDown() true from Screen.class (try to get a tooltip with shift press and without from itemStack#getTooltipLines()). Also, I tried with follow, but it did not trigger: // Simulate holding down the shift key Minecraft.getInstance().player.setShiftKeyDown(true); Minecraft.getInstance().options.keyShift.setDown(true); KeyMapping.set(Minecraft.getInstance().options.keyShift.getKey(), true); Leave code here, maybe some still need it. ScreenMixin.class import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; 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; import ShiftStateUtility; @Mixin(Screen.class) public class ScreenMixin { @Inject(method = "hasShiftDown", at = @At("HEAD"), cancellable = true) private static void onHasShiftDown(CallbackInfoReturnable<Boolean> cir) { if(ShiftStateUtility.shouldShiftBeDown) { cir.setReturnValue(ShiftStateUtility.shouldShiftBeDown); } else { // Call a method that checks the actual key state. cir.setReturnValue(checkActualShiftState()); } } @Inject(method = "hasControlDown", at = @At("HEAD"), cancellable = true) private static void hasControlDown(CallbackInfoReturnable<Boolean> cir) { if(ShiftStateUtility.shouldControlBeDown) { cir.setReturnValue(ShiftStateUtility.shouldControlBeDown); } else { // Call a method that checks the actual key state. cir.setReturnValue(checkActualControlState()); } } @Inject(method = "hasAltDown", at = @At("HEAD"), cancellable = true) private static void hasAltDown(CallbackInfoReturnable<Boolean> cir) { if(ShiftStateUtility.shouldAltBeDown) { cir.setReturnValue(ShiftStateUtility.shouldAltBeDown); } else { // Call a method that checks the actual key state. cir.setReturnValue(checkActualAltState()); } } private static boolean checkActualShiftState() { return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 340) || InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 344); } private static boolean checkActualControlState() { if (Minecraft.ON_OSX) { return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 343) || InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 347); } else { return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 341) || InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 345); } } private static boolean checkActualAltState() { return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 342) || InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), 346); } } ShiftStateUtility.class public class ShiftStateUtility { public static boolean shouldShiftBeDown = false; public static boolean shouldControlBeDown = false; public static boolean shouldAltBeDown = false; } Usage: ShiftStateUtility.shouldShiftBeDown = true / false; ShiftStateUtility.shouldControlBeDown = true / false; ShiftStateUtility.shouldAltBeDown = true / false; The default behavior of hasShiftDown, hasAltDown, and hasControlDown still work as default, and you can control if want to simulate a press of any key. Edited November 3, 20231 yr by balex25 Fixed it using Mixin on the hasShiftDown method.
November 3, 20231 yr Did you tried to output your values in the console? Are the (mixin) methods called? Is your Mixin class registered?
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.