mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-14 07:35:10 +01:00
Even more touchscreen improvements
- Fixed #222 Touch-specific improvements - Interactive items can now be used correctly - Drop button now works - Most Keybinds will now work correctly while in touchscreen mode - Added Touch category to simple options screen
This commit is contained in:
@@ -83,12 +83,15 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
@Entry(category = "screens", name = "Arrow screens") public static List<String> arrowScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName());
|
@Entry(category = "screens", name = "Arrow screens") public static List<String> arrowScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName());
|
||||||
@Entry(category = "screens", name = "WASD screens") public static List<String> wasdScreens = Lists.newArrayList("com.ultreon.devices.core.Laptop");
|
@Entry(category = "screens", name = "WASD screens") public static List<String> wasdScreens = Lists.newArrayList("com.ultreon.devices.core.Laptop");
|
||||||
@Entry(category = "touch", name = "Screens with close button") public static List<String> closeButtonScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName(), AdvancementsScreen.class.getCanonicalName(), RingScreen.class.getCanonicalName());
|
@Entry(category = "touch", name = "Screens with close button") public static List<String> closeButtonScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName(), AdvancementsScreen.class.getCanonicalName(), RingScreen.class.getCanonicalName());
|
||||||
@Entry(category = "touch", name = "midnightcontrols.menu.touch_speed", isSlider = true, min = 0, max = 150, precision = 10) public static double touchSpeed = 25.0;
|
@Entry(category = "touch", name = "midnightcontrols.menu.touch_speed", isSlider = true, min = 0, max = 150, precision = 10) public static double touchSpeed = 50.0;
|
||||||
|
@Entry(category = "touch", name = "midnightcontrols.menu.invert_touch") public static boolean invertTouch = false;
|
||||||
@Entry(category = "touch", name = "midnightcontrols.menu.touch_mode") public static TouchMode touchMode = TouchMode.CROSSHAIR;
|
@Entry(category = "touch", name = "midnightcontrols.menu.touch_mode") public static TouchMode touchMode = TouchMode.CROSSHAIR;
|
||||||
|
@Entry(category = "touch", name = "midnightcontrols.menu.touch_break_delay", isSlider = true, min = 50, max = 500) public static int touchBreakDelay = 120;
|
||||||
@Entry(category = "touch", name = "midnightcontrols.menu.touch_transparency", isSlider = true, min = 0, max = 100) public static int touchTransparency = 75;
|
@Entry(category = "touch", name = "midnightcontrols.menu.touch_transparency", isSlider = true, min = 0, max = 100) public static int touchTransparency = 75;
|
||||||
@Entry(category = "touch", name = "Touch Outline Color", isColor = true) public static String touchOutlineColorHex = "#ffffff";
|
@Entry(category = "touch", name = "Touch Outline Color", isColor = true) public static String touchOutlineColorHex = "#ffffff";
|
||||||
@Entry(category = "touch", name = "Touch Outline Alpha", isSlider = true, min = 0, max = 255) public static int touchOutlineColorAlpha = 150;
|
@Entry(category = "touch", name = "Touch Outline Alpha", isSlider = true, min = 0, max = 255) public static int touchOutlineColorAlpha = 150;
|
||||||
@Entry(category = "touch", name = "Left Touch button bindings") public static List<String> leftTouchBinds = Lists.newArrayList("controls_ring","debug_screen");
|
@Entry(category = "touch", name = "Left Touch button bindings") public static List<String> leftTouchBinds = Lists.newArrayList("debug_screen", "screenshot","toggle_perspective");
|
||||||
|
@Entry(category = "touch", name = "Right Touch button bindings") public static List<String> rightTouchBinds = Lists.newArrayList("screenshot","toggle_perspective", "use");
|
||||||
|
|
||||||
@Entry @Hidden public static Map<String, String> BINDING = new HashMap<>();
|
@Entry @Hidden public static Map<String, String> BINDING = new HashMap<>();
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,8 @@ public class InputHandlers {
|
|||||||
}
|
}
|
||||||
public static PressAction handlePage(boolean next) {
|
public static PressAction handlePage(boolean next) {
|
||||||
return (client, button, value, action) -> {
|
return (client, button, value, action) -> {
|
||||||
|
if (action == ButtonState.RELEASE)
|
||||||
|
return false;
|
||||||
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
||||||
try {
|
try {
|
||||||
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
||||||
|
|||||||
@@ -143,6 +143,12 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
Text.translatable(key.concat(".tooltip"))
|
Text.translatable(key.concat(".tooltip"))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// Touch options
|
||||||
|
private final SpruceOption touchSpeedOption;
|
||||||
|
private final SpruceOption touchBreakDelayOption;
|
||||||
|
private final SpruceOption invertTouchOption;
|
||||||
|
private final SpruceOption touchTransparencyOption;
|
||||||
|
private final SpruceOption touchModeOption;
|
||||||
|
|
||||||
private final MutableText controllerMappingsUrlText = Text.literal("(")
|
private final MutableText controllerMappingsUrlText = Text.literal("(")
|
||||||
.append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
|
.append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD))
|
||||||
@@ -191,7 +197,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f,
|
this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f,
|
||||||
() -> MidnightControlsConfig.mouseSpeed,
|
() -> MidnightControlsConfig.mouseSpeed,
|
||||||
value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
||||||
Text.translatable("midnightcontrols.menu.joystick_as_mouse.tooltip"));
|
Text.translatable("midnightcontrols.menu.mouse_speed.tooltip"));
|
||||||
this.joystickAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.joystick_as_mouse",
|
this.joystickAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.joystick_as_mouse",
|
||||||
() -> MidnightControlsConfig.joystickAsMouse, value -> MidnightControlsConfig.joystickAsMouse = value,
|
() -> MidnightControlsConfig.joystickAsMouse, value -> MidnightControlsConfig.joystickAsMouse = value,
|
||||||
Text.translatable("midnightcontrols.menu.joystick_as_mouse.tooltip"));
|
Text.translatable("midnightcontrols.menu.joystick_as_mouse.tooltip"));
|
||||||
@@ -284,6 +290,25 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
value -> MidnightControlsConfig.virtualMouse = value, Text.translatable("midnightcontrols.menu.virtual_mouse.tooltip"));
|
value -> MidnightControlsConfig.virtualMouse = value, Text.translatable("midnightcontrols.menu.virtual_mouse.tooltip"));
|
||||||
this.hideCursorOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hide_cursor", () -> MidnightControlsConfig.hideNormalMouse,
|
this.hideCursorOption = new SpruceToggleBooleanOption("midnightcontrols.menu.hide_cursor", () -> MidnightControlsConfig.hideNormalMouse,
|
||||||
value -> MidnightControlsConfig.hideNormalMouse = value, Text.translatable("midnightcontrols.menu.hide_cursor.tooltip"));
|
value -> MidnightControlsConfig.hideNormalMouse = value, Text.translatable("midnightcontrols.menu.hide_cursor.tooltip"));
|
||||||
|
// Touch options
|
||||||
|
this.touchModeOption = new SpruceCyclingOption("midnightcontrols.menu.touch_mode",
|
||||||
|
amount -> MidnightControlsConfig.touchMode = MidnightControlsConfig.touchMode.next(),
|
||||||
|
option -> option.getDisplayText(MidnightControlsConfig.touchMode.getTranslatedText()),
|
||||||
|
Text.translatable("midnightcontrols.menu.touch_mode.tooltip"));
|
||||||
|
this.touchSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.touch_speed", 0.0, 150.0, .5f,
|
||||||
|
() -> MidnightControlsConfig.touchSpeed,
|
||||||
|
value -> MidnightControlsConfig.touchSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
||||||
|
Text.translatable("midnightcontrols.menu.touch_speed.tooltip"));
|
||||||
|
this.touchBreakDelayOption = new SpruceDoubleOption("midnightcontrols.menu.touch_break_delay", 50, 500, 1f,
|
||||||
|
() -> (double) MidnightControlsConfig.touchBreakDelay,
|
||||||
|
value -> MidnightControlsConfig.touchBreakDelay = value.intValue(), option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
||||||
|
Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip"));
|
||||||
|
this.touchTransparencyOption = new SpruceDoubleOption("midnightcontrols.menu.touch_transparency", 0, 100, 1f,
|
||||||
|
() -> (double) MidnightControlsConfig.touchTransparency,
|
||||||
|
value -> MidnightControlsConfig.touchTransparency = value.intValue(), option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
|
||||||
|
Text.translatable("midnightcontrols.menu.touch_break_delay.tooltip"));
|
||||||
|
this.invertTouchOption = new SpruceToggleBooleanOption("midnightcontrols.menu.invert_touch", () -> MidnightControlsConfig.invertTouch,
|
||||||
|
value -> MidnightControlsConfig.invertTouch = value, Text.translatable("midnightcontrols.menu.invert_touch.tooltip"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -337,6 +362,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.controller"));
|
tabs.addSeparatorEntry(Text.translatable("midnightcontrols.menu.separator.controller"));
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller"), null,
|
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.controller"), null,
|
||||||
this::buildControllerTab);
|
this::buildControllerTab);
|
||||||
|
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.touch"), null,
|
||||||
|
this::buildTouchTab);
|
||||||
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.mappings.string"), null,
|
tabs.addTabEntry(Text.translatable("midnightcontrols.menu.title.mappings.string"), null,
|
||||||
this::buildMappingsStringEditorTab);
|
this::buildMappingsStringEditorTab);
|
||||||
}
|
}
|
||||||
@@ -431,6 +458,17 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
root.addChild(labels);
|
root.addChild(labels);
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
public SpruceOptionListWidget buildTouchTab(int width, int height) {
|
||||||
|
var list = new SpruceOptionListWidget(Position.origin(), width, height);
|
||||||
|
list.setBackground(new MidnightControlsBackground(130));
|
||||||
|
list.addSingleOptionEntry(this.touchSpeedOption);
|
||||||
|
list.addSingleOptionEntry(this.invertTouchOption);
|
||||||
|
list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null));
|
||||||
|
list.addSingleOptionEntry(this.touchModeOption);
|
||||||
|
list.addSingleOptionEntry(this.touchBreakDelayOption);
|
||||||
|
list.addSingleOptionEntry(this.touchTransparencyOption);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
public SpruceContainerWidget buildMappingsStringEditorTab(int width, int height) {
|
public SpruceContainerWidget buildMappingsStringEditorTab(int width, int height) {
|
||||||
return new MappingsStringInputWidget(Position.origin(), width, height);
|
return new MappingsStringInputWidget(Position.origin(), width, height);
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ package eu.midnightdust.midnightcontrols.client.gui;
|
|||||||
import dev.lambdaurora.spruceui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
import eu.midnightdust.lib.util.PlatformFunctions;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.HudSide;
|
import eu.midnightdust.midnightcontrols.client.HudSide;
|
||||||
@@ -21,35 +20,33 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|||||||
import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.widget.SilentTexturedButtonWidget;
|
import eu.midnightdust.midnightcontrols.client.touch.gui.ItemUseButtonWidget;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.touch.gui.SilentTexturedButtonWidget;
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.KeyBindingAccessor;
|
||||||
import io.github.kosmx.emotes.arch.gui.EmoteMenuImpl;
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.gui.screen.*;
|
import net.minecraft.client.gui.screen.*;
|
||||||
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
||||||
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
import net.minecraft.client.gui.widget.TextIconButtonWidget;
|
||||||
import net.minecraft.client.option.KeyBinding;
|
import net.minecraft.client.option.KeyBinding;
|
||||||
|
import net.minecraft.client.texture.MissingSprite;
|
||||||
|
import net.minecraft.client.texture.Sprite;
|
||||||
import net.minecraft.client.util.InputUtil;
|
import net.minecraft.client.util.InputUtil;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.*;
|
||||||
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.Arm;
|
import net.minecraft.util.*;
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
import net.minecraft.util.hit.HitResult;
|
import net.minecraft.util.hit.HitResult;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
|
|
||||||
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X;
|
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X;
|
||||||
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y;
|
import static org.lwjgl.glfw.GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y;
|
||||||
@@ -63,6 +60,7 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
private SilentTexturedButtonWidget inventoryButton;
|
private SilentTexturedButtonWidget inventoryButton;
|
||||||
private SilentTexturedButtonWidget swapHandsButton;
|
private SilentTexturedButtonWidget swapHandsButton;
|
||||||
private SilentTexturedButtonWidget dropButton;
|
private SilentTexturedButtonWidget dropButton;
|
||||||
|
private ItemUseButtonWidget useButton;
|
||||||
private SilentTexturedButtonWidget jumpButton;
|
private SilentTexturedButtonWidget jumpButton;
|
||||||
private SilentTexturedButtonWidget flyButton;
|
private SilentTexturedButtonWidget flyButton;
|
||||||
private SilentTexturedButtonWidget flyUpButton;
|
private SilentTexturedButtonWidget flyUpButton;
|
||||||
@@ -118,6 +116,7 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
private void updateJumpButtons() {
|
private void updateJumpButtons() {
|
||||||
assert this.client != null;
|
assert this.client != null;
|
||||||
assert this.client.player != null;
|
assert this.client.player != null;
|
||||||
|
float transparency = MidnightControlsConfig.touchTransparency / 100f;
|
||||||
|
|
||||||
if (this.client.player.getAbilities().flying) {
|
if (this.client.player.getAbilities().flying) {
|
||||||
boolean oldStateFly = this.flyButton.isVisible();
|
boolean oldStateFly = this.flyButton.isVisible();
|
||||||
@@ -125,6 +124,9 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
this.flyButton.setVisible(true);
|
this.flyButton.setVisible(true);
|
||||||
this.flyUpButton.setVisible(true);
|
this.flyUpButton.setVisible(true);
|
||||||
this.flyDownButton.setVisible(true);
|
this.flyDownButton.setVisible(true);
|
||||||
|
this.flyButton.setAlpha(transparency);
|
||||||
|
this.flyUpButton.setAlpha(transparency);
|
||||||
|
this.flyDownButton.setAlpha(transparency);
|
||||||
if (oldStateFly != this.flyButton.isVisible()) {
|
if (oldStateFly != this.flyButton.isVisible()) {
|
||||||
this.flyButtonEnableTicks = 5;
|
this.flyButtonEnableTicks = 5;
|
||||||
this.setJump(false);
|
this.setJump(false);
|
||||||
@@ -135,6 +137,7 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
this.flyButton.setVisible(false);
|
this.flyButton.setVisible(false);
|
||||||
this.flyUpButton.setVisible(false);
|
this.flyUpButton.setVisible(false);
|
||||||
this.flyDownButton.setVisible(false);
|
this.flyDownButton.setVisible(false);
|
||||||
|
this.jumpButton.setAlpha(transparency);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,8 +220,14 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
}
|
}
|
||||||
},0, 160, 20, WIDGETS_LOCATION));
|
},0, 160, 20, WIDGETS_LOCATION));
|
||||||
// Drop
|
// Drop
|
||||||
this.addDrawableChild(this.dropButton = new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.empty(), btn ->
|
this.addDrawableChild(this.dropButton = new SilentTexturedButtonWidget(Position.of(swapHandsX, sneakButtonY + 5 + 20), 20, 20, Text.empty(), btn -> {
|
||||||
client.player.getInventory().dropSelectedItem(false), 20, 160, 20, WIDGETS_LOCATION));
|
if (btn.isActive() && !client.player.isSpectator() && client.player.dropSelectedItem(false)) {
|
||||||
|
client.player.swingHand(Hand.MAIN_HAND);
|
||||||
|
}
|
||||||
|
}, 20, 160, 20, WIDGETS_LOCATION));
|
||||||
|
// Use
|
||||||
|
this.addDrawableChild(this.useButton = new ItemUseButtonWidget(Position.of(width/2-25, height - 70), 50, 17, Text.translatable(MidnightControlsConstants.NAMESPACE+".action.eat"), btn ->
|
||||||
|
client.interactionManager.interactItem(client.player, client.player.getActiveHand())));
|
||||||
// Jump keys
|
// Jump keys
|
||||||
this.addDrawableChild(this.jumpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(), this::handleJump, 0, 40, 20, WIDGETS_LOCATION));
|
this.addDrawableChild(this.jumpButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(), this::handleJump, 0, 40, 20, WIDGETS_LOCATION));
|
||||||
this.addDrawableChild(this.flyButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(),btn -> {
|
this.addDrawableChild(this.flyButton = new SilentTexturedButtonWidget(Position.of(jumpButtonX, sneakButtonY), 20, 20, Text.empty(),btn -> {
|
||||||
@@ -277,29 +286,37 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
this.addDrawableChild(this.leftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.empty(),
|
this.addDrawableChild(this.leftButton = new SilentTexturedButtonWidget(Position.of(sneakButtonX - 20 - 5, sneakButtonY), 20, 20, Text.empty(),
|
||||||
btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION
|
btn -> ((KeyBindingAccessor) this.client.options.leftKey).midnightcontrols$handlePressState(btn.isActive()), 60, 80, 20, WIDGETS_LOCATION
|
||||||
));
|
));
|
||||||
Identifier emptySprite = new Identifier(MidnightControlsConstants.NAMESPACE, "touch/empty");
|
initCustomButtons(true);
|
||||||
for (int i = 0; i < MidnightControlsConfig.leftTouchBinds.size(); i++) {
|
initCustomButtons(false);
|
||||||
String bindName = MidnightControlsConfig.leftTouchBinds.get(i);
|
|
||||||
ButtonBinding binding = InputManager.getBinding(bindName);
|
|
||||||
if (binding == null) continue;
|
|
||||||
boolean hasTexture = client.getTextureManager().getOrDefault(new Identifier(MidnightControlsConstants.NAMESPACE, "textures/gui/sprites/icon/"+bindName+".png"), null) != null;
|
|
||||||
var button = TextIconButtonWidget.builder(Text.translatable(binding.getTranslationKey()), b -> binding.handle(client, 1, ButtonState.PRESS), false)
|
|
||||||
.texture(hasTexture ? new Identifier(MidnightControlsConstants.NAMESPACE, "icon/"+bindName) : emptySprite, 20, 20).dimension(20, 20).build();
|
|
||||||
button.setPosition(i > 1 ? 3 : 3+(i*23), 3);
|
|
||||||
button.setAlpha(MidnightControlsConfig.touchTransparency / 100f);
|
|
||||||
this.addDrawableChild(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setButtonProperties(MidnightControlsConfig.touchTransparency / 100f);
|
this.setButtonProperties(MidnightControlsConfig.touchTransparency / 100f);
|
||||||
TouchscreenOverlay.instance = this;
|
TouchscreenOverlay.instance = this;
|
||||||
}
|
}
|
||||||
|
private void initCustomButtons(boolean left) {
|
||||||
|
assert client != null;
|
||||||
|
Identifier emptySprite = new Identifier(MidnightControlsConstants.NAMESPACE, "touch/empty");
|
||||||
|
List<String> list = left ? MidnightControlsConfig.leftTouchBinds : MidnightControlsConfig.rightTouchBinds;
|
||||||
|
Sprite missingSprite = client.getGuiAtlasManager().getSprite(MissingSprite.getMissingSpriteId());
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
String bindName = list.get(i);
|
||||||
|
ButtonBinding binding = InputManager.getBinding(bindName);
|
||||||
|
if (binding == null) continue;
|
||||||
|
boolean hasTexture = client.getGuiAtlasManager().getSprite(new Identifier(MidnightControlsConstants.NAMESPACE, "binding/"+bindName)) != missingSprite;
|
||||||
|
if (MidnightControlsConfig.debug) System.out.println(left +" "+new Identifier(MidnightControlsConstants.NAMESPACE, "binding/"+bindName)+" "+ hasTexture);
|
||||||
|
var button = TextIconButtonWidget.builder(Text.translatable("binding.getTranslationKey()"), b -> binding.handle(client, 1, ButtonState.PRESS), hasTexture)
|
||||||
|
.texture(hasTexture ? new Identifier(MidnightControlsConstants.NAMESPACE, "binding/"+bindName) : emptySprite, 20, 20).dimension(20, 20).build();
|
||||||
|
button.setPosition(left ? (3+(i*23)) : this.width-(23+(i*23)), 3);
|
||||||
|
button.setAlpha(MidnightControlsConfig.touchTransparency / 100f);
|
||||||
|
this.addDrawableChild(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
private void setButtonProperties(float transparency) {
|
private void setButtonProperties(float transparency) {
|
||||||
this.inventoryButton.setAlpha(transparency);
|
this.inventoryButton.setAlpha(transparency);
|
||||||
this.dropButton.setAlpha(transparency);
|
this.dropButton.setAlpha(transparency);
|
||||||
this.swapHandsButton.setAlpha(transparency);
|
this.swapHandsButton.setAlpha(transparency);
|
||||||
this.jumpButton.setAlpha(transparency);
|
this.jumpButton.setAlpha(transparency);
|
||||||
this.flyButton.setAlpha(transparency);
|
this.flyButton.setAlpha(transparency);
|
||||||
this.flyUpButton.setAlpha(transparency);
|
this.flyUpButton.setAlpha(transparency);this.useButton.setAlpha(Math.min(transparency+0.1f, 1.0f));
|
||||||
this.flyDownButton.setAlpha(transparency);
|
this.flyDownButton.setAlpha(transparency);
|
||||||
this.startSneakButton.setAlpha(transparency);
|
this.startSneakButton.setAlpha(transparency);
|
||||||
this.endSneakButton.setAlpha(transparency);
|
this.endSneakButton.setAlpha(transparency);
|
||||||
@@ -309,6 +326,7 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
this.leftButton.setAlpha(transparency);
|
this.leftButton.setAlpha(transparency);
|
||||||
this.rightButton.setAlpha(transparency);
|
this.rightButton.setAlpha(transparency);
|
||||||
this.backButton.setAlpha(transparency);
|
this.backButton.setAlpha(transparency);
|
||||||
|
this.useButton.setAlpha(Math.min(transparency+0.1f, 1.0f));
|
||||||
this.endSneakButton.setVisible(false);
|
this.endSneakButton.setVisible(false);
|
||||||
this.forwardLeftButton.setVisible(false);
|
this.forwardLeftButton.setVisible(false);
|
||||||
this.forwardRightButton.setVisible(false);
|
this.forwardRightButton.setVisible(false);
|
||||||
@@ -318,6 +336,7 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
public void tick() {
|
public void tick() {
|
||||||
assert this.client != null;
|
assert this.client != null;
|
||||||
assert this.client.interactionManager != null;
|
assert this.client.interactionManager != null;
|
||||||
|
assert this.client.player != null;
|
||||||
|
|
||||||
if (this.forwardButtonTick > 0) {
|
if (this.forwardButtonTick > 0) {
|
||||||
--this.forwardButtonTick;
|
--this.forwardButtonTick;
|
||||||
@@ -325,10 +344,11 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
this.forwardLeftButton.setVisible(false);
|
this.forwardLeftButton.setVisible(false);
|
||||||
this.forwardRightButton.setVisible(false);
|
this.forwardRightButton.setVisible(false);
|
||||||
}
|
}
|
||||||
|
this.useButton.setVisible(client.player.getMainHandStack() != null && (client.player.getMainHandStack().getUseAction() != UseAction.NONE || client.player.getMainHandStack().getItem() instanceof ArmorItem) && !TouchUtils.hasInWorldUseAction(client.player.getMainHandStack()));
|
||||||
this.updateJumpButtons();
|
this.updateJumpButtons();
|
||||||
|
|
||||||
double scaleFactor = client.getWindow().getScaleFactor();
|
double scaleFactor = client.getWindow().getScaleFactor();
|
||||||
if (clickStartTime > 0 && System.currentTimeMillis() - clickStartTime >= 100) this.mouseHeldDown(client.mouse.getX() / scaleFactor, client.mouse.getY() / scaleFactor);
|
if (clickStartTime > 0 && System.currentTimeMillis() - clickStartTime >= MidnightControlsConfig.touchBreakDelay) this.mouseHeldDown(client.mouse.getX() / scaleFactor, client.mouse.getY() / scaleFactor);
|
||||||
else client.interactionManager.cancelBlockBreaking();
|
else client.interactionManager.cancelBlockBreaking();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,9 +381,15 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
assert client.world != null;
|
assert client.world != null;
|
||||||
assert client.interactionManager != null;
|
assert client.interactionManager != null;
|
||||||
clickStartTime = -1;
|
clickStartTime = -1;
|
||||||
|
|
||||||
|
if (client.player.getMainHandStack() != null && TouchUtils.hasInWorldUseAction(client.player.getMainHandStack())) {
|
||||||
|
client.interactionManager.stopUsingItem(client.player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
||||||
if (result == null) return false;
|
if (result == null) return false;
|
||||||
|
|
||||||
|
|
||||||
if (result instanceof BlockHitResult blockHit) {
|
if (result instanceof BlockHitResult blockHit) {
|
||||||
BlockPos blockPos = blockHit.getBlockPos().offset(blockHit.getSide());
|
BlockPos blockPos = blockHit.getBlockPos().offset(blockHit.getSide());
|
||||||
BlockState state = client.world.getBlockState(blockPos);
|
BlockState state = client.world.getBlockState(blockPos);
|
||||||
@@ -385,6 +411,7 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
}
|
}
|
||||||
if (result instanceof EntityHitResult entityHit) {
|
if (result instanceof EntityHitResult entityHit) {
|
||||||
client.interactionManager.attackEntity(client.player, entityHit.getEntity());
|
client.interactionManager.attackEntity(client.player, entityHit.getEntity());
|
||||||
|
client.player.swingHand(Hand.MAIN_HAND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clickStartTime = -1;
|
clickStartTime = -1;
|
||||||
@@ -395,15 +422,24 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
assert client.player != null;
|
assert client.player != null;
|
||||||
assert client.interactionManager != null;
|
assert client.interactionManager != null;
|
||||||
if (!isDragging()) {
|
if (!isDragging()) {
|
||||||
|
if (client.player.getMainHandStack() != null && TouchUtils.hasInWorldUseAction(client.player.getMainHandStack())) {
|
||||||
|
client.interactionManager.interactItem(client.player, client.player.getActiveHand());
|
||||||
|
return;
|
||||||
|
}
|
||||||
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
HitResult result = TouchUtils.getTargettedObject(mouseX, mouseY);
|
||||||
if (result == null || firstHitResult == null) return;
|
if (result == null || firstHitResult == null) return;
|
||||||
|
|
||||||
if (result instanceof BlockHitResult blockHit && firstHitResult instanceof BlockHitResult firstBlock && blockHit.getBlockPos().equals(firstBlock.getBlockPos())) {
|
if (result instanceof BlockHitResult blockHit && firstHitResult instanceof BlockHitResult firstBlock && blockHit.getBlockPos().equals(firstBlock.getBlockPos())) {
|
||||||
if (MidnightControlsConfig.debug) System.out.println(blockHit.getBlockPos().toString());
|
if (MidnightControlsConfig.debug) System.out.println(blockHit.getBlockPos().toString());
|
||||||
client.interactionManager.updateBlockBreakingProgress(blockHit.getBlockPos(), blockHit.getSide());
|
if (client.interactionManager.updateBlockBreakingProgress(blockHit.getBlockPos(), blockHit.getSide())) {
|
||||||
|
client.player.swingHand(Hand.MAIN_HAND);
|
||||||
|
} else client.interactionManager.cancelBlockBreaking();
|
||||||
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
||||||
}
|
}
|
||||||
else if (result instanceof EntityHitResult entityHit && firstHitResult instanceof EntityHitResult firstEntity && entityHit.getEntity().getUuid().compareTo(firstEntity.getEntity().getUuid()) == 0) {
|
else if (result instanceof EntityHitResult entityHit && firstHitResult instanceof EntityHitResult firstEntity && entityHit.getEntity().getUuid().compareTo(firstEntity.getEntity().getUuid()) == 0) {
|
||||||
client.interactionManager.interactEntity(client.player, entityHit.getEntity(), client.player.getActiveHand());
|
if (client.interactionManager.interactEntity(client.player, entityHit.getEntity(), client.player.getActiveHand()) == ActionResult.SUCCESS) {
|
||||||
|
client.player.swingHand(Hand.MAIN_HAND);
|
||||||
|
}
|
||||||
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
firstHitResult = TouchUtils.getTargettedObject(mouseX, mouseY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,6 +448,10 @@ public class TouchscreenOverlay extends Screen {
|
|||||||
@Override
|
@Override
|
||||||
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
|
||||||
if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
|
if (button == GLFW.GLFW_MOUSE_BUTTON_1 && this.client != null) {
|
||||||
|
if (!MidnightControlsConfig.invertTouch) {
|
||||||
|
deltaX = -deltaX;
|
||||||
|
deltaY = -deltaY;
|
||||||
|
}
|
||||||
if (deltaY > 0.01)
|
if (deltaY > 0.01)
|
||||||
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 2);
|
this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 2);
|
||||||
else this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
else this.mod.input.handleLook(this.client, GLFW_GAMEPAD_AXIS_RIGHT_Y, (float) Math.abs((deltaY / 3.0)*MidnightControlsConfig.touchSpeed/100), 1);
|
||||||
|
|||||||
@@ -14,14 +14,11 @@ import eu.midnightdust.midnightcontrols.ControlsMode;
|
|||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
import eu.midnightdust.midnightcontrols.client.touch.TouchUtils;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.render.GameRenderer;
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import net.minecraft.client.util.Window;
|
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import org.joml.Matrix4f;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
|
||||||
|
import net.minecraft.client.Keyboard;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
|
|
||||||
|
@Mixin(Keyboard.class)
|
||||||
|
public class KeyboardMixin {
|
||||||
|
@Redirect(method = "onKey", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;"))
|
||||||
|
private Screen midnightcontrols$ignoreTouchOverlay(MinecraftClient instance) {
|
||||||
|
if (instance.currentScreen instanceof TouchscreenOverlay) return null;
|
||||||
|
return instance.currentScreen;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,21 +9,15 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawContext;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.network.ClientPlayerEntity;
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||||
import net.minecraft.client.render.BufferBuilderStorage;
|
import net.minecraft.client.render.BufferBuilderStorage;
|
||||||
import net.minecraft.client.render.GameRenderer;
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
|
||||||
import net.minecraft.client.world.ClientWorld;
|
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.util.ActionResult;
|
||||||
@@ -35,7 +29,6 @@ import net.minecraft.util.math.Direction;
|
|||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
import org.objectweb.asm.Opcodes;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
@@ -157,4 +150,10 @@ public abstract class MinecraftClientMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// This is always supposed to be located at before the line 'this.profiler.swap("Keybindings");'
|
||||||
|
// @Redirect(method = "tick", at = @At(value = "FIELD",target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", ordinal = 6))
|
||||||
|
// private Screen midnightcontrols$ignoreTouchOverlay(MinecraftClient instance) {
|
||||||
|
// if (instance.currentScreen instanceof TouchscreenOverlay) return null;
|
||||||
|
// return instance.currentScreen;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import eu.midnightdust.midnightcontrols.client.ButtonState;
|
|||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputHandlers;
|
import eu.midnightdust.midnightcontrols.client.controller.InputHandlers;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.widget.SilentTexturedButtonWidget;
|
import eu.midnightdust.midnightcontrols.client.touch.gui.SilentTexturedButtonWidget;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.Drawable;
|
import net.minecraft.client.gui.Drawable;
|
||||||
import net.minecraft.client.gui.Element;
|
import net.minecraft.client.gui.Element;
|
||||||
@@ -31,10 +31,8 @@ public abstract class ScreenMixin {
|
|||||||
@Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("TAIL"))
|
@Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("TAIL"))
|
||||||
public void midnightcontrols$addCloseButton(MinecraftClient client, int width, int height, CallbackInfo ci) {
|
public void midnightcontrols$addCloseButton(MinecraftClient client, int width, int height, CallbackInfo ci) {
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN && (MidnightControlsConfig.closeButtonScreens.stream().anyMatch(s -> this.getClass().getName().startsWith(s) || ((Object)this) instanceof HandledScreen<?>))) {
|
if (MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN && (MidnightControlsConfig.closeButtonScreens.stream().anyMatch(s -> this.getClass().getName().startsWith(s) || ((Object)this) instanceof HandledScreen<?>))) {
|
||||||
SilentTexturedButtonWidget closeButton = new SilentTexturedButtonWidget(Position.of(this.width - 30, 10), 20, 20, Text.empty(), btn ->
|
this.addDrawableChild(new SilentTexturedButtonWidget(Position.of(this.width - 30, 10), 20, 20, Text.empty(), btn ->
|
||||||
InputHandlers.handleExit().press(client, ButtonBinding.BACK, 0f, ButtonState.PRESS), 20, 160, 20, WIDGETS_LOCATION);
|
InputHandlers.handleExit().press(client, ButtonBinding.BACK, 0f, ButtonState.PRESS), 20, 160, 20, WIDGETS_LOCATION));
|
||||||
closeButton.setAlpha(MidnightControlsConfig.touchTransparency / 100f);
|
|
||||||
this.addDrawableChild(closeButton);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.touch;
|
package eu.midnightdust.midnightcontrols.client.touch;
|
||||||
|
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public enum TouchMode {
|
public enum TouchMode {
|
||||||
CROSSHAIR, FINGER_POS
|
CROSSHAIR, FINGER_POS;
|
||||||
|
public Text getTranslatedText() {
|
||||||
|
return Text.translatable("midnightcontrols.midnightconfig.enum."+this.getClass().getSimpleName()+"."+this.name());
|
||||||
|
}
|
||||||
|
public @NotNull TouchMode next() {
|
||||||
|
var v = values();
|
||||||
|
if (v.length == this.ordinal() + 1)
|
||||||
|
return v[0];
|
||||||
|
return v[this.ordinal() + 1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
|||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.render.Camera;
|
import net.minecraft.client.render.Camera;
|
||||||
import net.minecraft.entity.projectile.ProjectileUtil;
|
import net.minecraft.entity.projectile.ProjectileUtil;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.UseAction;
|
||||||
import net.minecraft.util.hit.BlockHitResult;
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
import net.minecraft.util.hit.HitResult;
|
import net.minecraft.util.hit.HitResult;
|
||||||
@@ -57,4 +59,8 @@ public class TouchUtils {
|
|||||||
|
|
||||||
return new Vec3d(target.x, target.y, target.z).add(camera.getPos());
|
return new Vec3d(target.x, target.y, target.z).add(camera.getPos());
|
||||||
}
|
}
|
||||||
|
public static boolean hasInWorldUseAction(ItemStack stack) {
|
||||||
|
UseAction action = stack.getUseAction();
|
||||||
|
return action == UseAction.BOW || action == UseAction.BRUSH || action == UseAction.SPEAR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.touch.gui;
|
||||||
|
|
||||||
|
import dev.lambdaurora.spruceui.Position;
|
||||||
|
import dev.lambdaurora.spruceui.widget.SpruceButtonWidget;
|
||||||
|
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
|
import net.minecraft.item.ArmorItem;
|
||||||
|
import net.minecraft.item.PotionItem;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.UseAction;
|
||||||
|
|
||||||
|
public class ItemUseButtonWidget extends SpruceButtonWidget {
|
||||||
|
|
||||||
|
public ItemUseButtonWidget(Position position, int width, int height, Text message, PressAction action) {
|
||||||
|
super(position, width, height, message, action);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void onRelease(double mouseX, double mouseY) {
|
||||||
|
assert client.player != null;
|
||||||
|
assert client.interactionManager != null;
|
||||||
|
UseAction action = client.player.getMainHandStack().getUseAction();
|
||||||
|
if (action == UseAction.SPYGLASS || action == UseAction.TOOT_HORN) client.interactionManager.stopUsingItem(client.player);
|
||||||
|
super.onRelease(mouseX, mouseY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVisible(boolean visible) {
|
||||||
|
if (visible && client.player != null && client.player.getMainHandStack() != null) {
|
||||||
|
UseAction action = client.player.getMainHandStack().getUseAction();
|
||||||
|
if (action == UseAction.EAT) {
|
||||||
|
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.eat"));
|
||||||
|
} else if (action == UseAction.DRINK) {
|
||||||
|
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.drink"));
|
||||||
|
} else if (client.player.getMainHandStack().getItem() instanceof ArmorItem) {
|
||||||
|
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.equip"));
|
||||||
|
} else if (!action.equals(UseAction.NONE)) {
|
||||||
|
this.setMessage(Text.translatable(MidnightControlsConstants.NAMESPACE+".action.use"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.setAlpha(MidnightControlsConfig.touchTransparency / 100f);
|
||||||
|
super.setVisible(visible);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package eu.midnightdust.midnightcontrols.client.gui.widget;
|
package eu.midnightdust.midnightcontrols.client.touch.gui;
|
||||||
|
|
||||||
import dev.lambdaurora.spruceui.Position;
|
import dev.lambdaurora.spruceui.Position;
|
||||||
import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget;
|
import dev.lambdaurora.spruceui.widget.SpruceTexturedButtonWidget;
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
"midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "Touchscreen (WIP)",
|
"midnightcontrols.midnightconfig.enum.ControlsMode.TOUCHSCREEN": "Touchscreen (WIP)",
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.LEFT": "Left",
|
"midnightcontrols.midnightconfig.enum.HudSide.LEFT": "Left",
|
||||||
"midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "Right",
|
"midnightcontrols.midnightconfig.enum.HudSide.RIGHT": "Right",
|
||||||
|
"midnightcontrols.midnightconfig.enum.TouchMode.CROSSHAIR": "At Crosshair",
|
||||||
|
"midnightcontrols.midnightconfig.enum.TouchMode.FINGER_POS": "Finger Position",
|
||||||
"key.midnightcontrols.look_down": "Look down",
|
"key.midnightcontrols.look_down": "Look down",
|
||||||
"key.midnightcontrols.look_left": "Look left",
|
"key.midnightcontrols.look_left": "Look left",
|
||||||
"key.midnightcontrols.look_right": "Look right",
|
"key.midnightcontrols.look_right": "Look right",
|
||||||
@@ -30,6 +32,9 @@
|
|||||||
"midnightcontrols.action.controls_ring": "Open Unbound Keybind Ring",
|
"midnightcontrols.action.controls_ring": "Open Unbound Keybind Ring",
|
||||||
"midnightcontrols.action.debug_screen": "Open Debug HUD (F3)",
|
"midnightcontrols.action.debug_screen": "Open Debug HUD (F3)",
|
||||||
"midnightcontrols.action.drop_item": "Drop Item",
|
"midnightcontrols.action.drop_item": "Drop Item",
|
||||||
|
"midnightcontrols.action.drink": "Drink",
|
||||||
|
"midnightcontrols.action.eat": "Eat",
|
||||||
|
"midnightcontrols.action.equip": "Equip",
|
||||||
"midnightcontrols.action.exit": "Exit Screen",
|
"midnightcontrols.action.exit": "Exit Screen",
|
||||||
"midnightcontrols.action.forward": "Forward",
|
"midnightcontrols.action.forward": "Forward",
|
||||||
"midnightcontrols.action.hit": "Hit",
|
"midnightcontrols.action.hit": "Hit",
|
||||||
@@ -195,7 +200,13 @@
|
|||||||
"midnightcontrols.menu.title.general": "General Options",
|
"midnightcontrols.menu.title.general": "General Options",
|
||||||
"midnightcontrols.menu.title.hud": "HUD Options",
|
"midnightcontrols.menu.title.hud": "HUD Options",
|
||||||
"midnightcontrols.menu.title.mappings.string": "Mappings File Editor",
|
"midnightcontrols.menu.title.mappings.string": "Mappings File Editor",
|
||||||
|
"midnightcontrols.menu.title.touch": "Touch Options",
|
||||||
"midnightcontrols.menu.title.visual": "Appearance Options",
|
"midnightcontrols.menu.title.visual": "Appearance Options",
|
||||||
|
"midnightcontrols.menu.touch_break_delay": "Touch Break Delay",
|
||||||
|
"midnightcontrols.menu.touch_speed": "Touch Speed",
|
||||||
|
"midnightcontrols.menu.invert_touch": "Invert Touch Direction",
|
||||||
|
"midnightcontrols.menu.touch_mode": "Touch Interaction Mode",
|
||||||
|
"midnightcontrols.menu.touch_transparency": "Touch HUD Transparency",
|
||||||
"midnightcontrols.menu.unfocused_input": "Unfocused Input",
|
"midnightcontrols.menu.unfocused_input": "Unfocused Input",
|
||||||
"midnightcontrols.menu.unfocused_input.tooltip": "Allows controller input when the window is not focused.",
|
"midnightcontrols.menu.unfocused_input.tooltip": "Allows controller input when the window is not focused.",
|
||||||
"midnightcontrols.menu.virtual_mouse": "Virtual Mouse",
|
"midnightcontrols.menu.virtual_mouse": "Virtual Mouse",
|
||||||
@@ -213,6 +224,7 @@
|
|||||||
"midnightcontrols.midnightconfig.category.misc": "Miscellaneous",
|
"midnightcontrols.midnightconfig.category.misc": "Miscellaneous",
|
||||||
"midnightcontrols.midnightconfig.category.screens": "Screens",
|
"midnightcontrols.midnightconfig.category.screens": "Screens",
|
||||||
"midnightcontrols.midnightconfig.category.gameplay": "Gameplay",
|
"midnightcontrols.midnightconfig.category.gameplay": "Gameplay",
|
||||||
|
"midnightcontrols.midnightconfig.category.touch": "Touch",
|
||||||
"midnightcontrols.midnightconfig.category.visual": "Visual",
|
"midnightcontrols.midnightconfig.category.visual": "Visual",
|
||||||
"modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
|
"modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 182 B |
@@ -20,7 +20,8 @@
|
|||||||
"KeyBindingRegistryImplAccessor",
|
"KeyBindingRegistryImplAccessor",
|
||||||
"KeyBindingIDAccessor",
|
"KeyBindingIDAccessor",
|
||||||
"TabNavigationWidgetAccessor",
|
"TabNavigationWidgetAccessor",
|
||||||
"ScreenMixin"
|
"ScreenMixin",
|
||||||
|
"KeyboardMixin"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|||||||
Reference in New Issue
Block a user