forked from Clones/Controlify
➕ Take screenshot + pick block with nbt bindings
This commit is contained in:
@ -60,9 +60,10 @@ public class ControllerBindings<T extends ControllerState> {
|
||||
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<T extends ControllerState> {
|
||||
.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<T extends ControllerState> {
|
||||
.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)
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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() {
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -0,0 +1,7 @@
|
||||
package dev.isxander.controlify.ingame;
|
||||
|
||||
public interface PickBlockAccessor {
|
||||
void controlify$pickBlock();
|
||||
|
||||
void controlify$pickBlockWithNbt();
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user