1
0
forked from Clones/Controlify

Take screenshot + pick block with nbt bindings

This commit is contained in:
isXander
2023-08-19 19:58:18 +01:00
parent f2e8fc1187
commit b38f392bd7
8 changed files with 90 additions and 6 deletions

View File

@ -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)

View File

@ -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;
};

View File

@ -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() {

View File

@ -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));
}

View File

@ -0,0 +1,7 @@
package dev.isxander.controlify.ingame;
public interface PickBlockAccessor {
void controlify$pickBlock();
void controlify$pickBlockWithNbt();
}

View File

@ -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;
}
}