mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-14 07:35:10 +01:00
MidnightControls 1.3.0 - Fixes and Improvements
- Merge #48 (Split rotation speed in X and Y, thanks to @ronniedude) - Merge #47 (Korean translations by @gyular) - Fix #50 (Stack pick-up problems in survival mode) - Add some compatibility measures for EMI (Will likely be improved further in the future) - Remove all REI-related code (not working anyway, EMI is better) - Possibly fix #41 (Random crashes when changing keybinds)
This commit is contained in:
@@ -8,7 +8,7 @@ yarn_mappings=1.19+build.1
|
|||||||
loader_version=0.14.7
|
loader_version=0.14.7
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.2.2
|
mod_version = 1.3.0
|
||||||
maven_group = eu.midnightdust
|
maven_group = eu.midnightdust
|
||||||
archives_base_name = midnightcontrols
|
archives_base_name = midnightcontrols
|
||||||
modrinth_id=bXX9h73M
|
modrinth_id=bXX9h73M
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
if (KeyBindingRegistryImplAccessor.getModdedKeyBindings() == null || KeyBindingRegistryImplAccessor.getModdedKeyBindings().isEmpty()) return;
|
if (KeyBindingRegistryImplAccessor.getModdedKeyBindings() == null || KeyBindingRegistryImplAccessor.getModdedKeyBindings().isEmpty()) return;
|
||||||
for (int i = 0; i < KeyBindingRegistryImplAccessor.getModdedKeyBindings().size(); ++i) {
|
for (int i = 0; i < KeyBindingRegistryImplAccessor.getModdedKeyBindings().size(); ++i) {
|
||||||
KeyBinding keyBinding = KeyBindingRegistryImplAccessor.getModdedKeyBindings().get(i);
|
KeyBinding keyBinding = KeyBindingRegistryImplAccessor.getModdedKeyBindings().get(i);
|
||||||
if (!keyBinding.getTranslationKey().contains("midnightcontrols")) {
|
if (!keyBinding.getTranslationKey().contains("midnightcontrols") && !keyBinding.getTranslationKey().contains("ok_zoomer") && !keyBinding.getTranslationKey().contains("okzoomer")) {
|
||||||
category = null;
|
category = null;
|
||||||
InputManager.streamCategories().forEach(buttonCategory -> {
|
InputManager.streamCategories().forEach(buttonCategory -> {
|
||||||
if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())))
|
if (buttonCategory.getIdentifier().equals(new org.aperlambda.lambdacommon.Identifier("minecraft", keyBinding.getCategory())))
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client;
|
package eu.midnightdust.midnightcontrols.client;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import eu.midnightdust.lib.config.MidnightConfig;
|
import eu.midnightdust.lib.config.MidnightConfig;
|
||||||
import eu.midnightdust.midnightcontrols.ControlsMode;
|
import eu.midnightdust.midnightcontrols.ControlsMode;
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControls;
|
|
||||||
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
import eu.midnightdust.midnightcontrols.client.controller.Controller;
|
||||||
@@ -51,9 +51,8 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
@Entry(name = "midnightcontrols.menu.left_dead_zone") public static double leftDeadZone = 0.25;
|
@Entry(name = "midnightcontrols.menu.left_dead_zone") public static double leftDeadZone = 0.25;
|
||||||
@Entry(name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false;
|
@Entry(name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false;
|
||||||
@Entry(name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false;
|
@Entry(name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false;
|
||||||
public static double DEFAULT_MAX_VALUE = 1;
|
|
||||||
@Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x axis, name kept for compatability
|
@Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x axis, name kept for compatability
|
||||||
@Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = 40.0;
|
@Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = rotationSpeed;
|
||||||
@Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0;
|
@Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0;
|
||||||
@Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
|
@Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
|
||||||
@Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
|
@Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
|
||||||
@@ -61,11 +60,11 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
@Entry(name = "Controller ID") public static Object controllerID = 0;
|
@Entry(name = "Controller ID") public static Object controllerID = 0;
|
||||||
@Entry(name = "2nd Controller ID") public static Object secondControllerID = -1;
|
@Entry(name = "2nd Controller ID") public static Object secondControllerID = -1;
|
||||||
@Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
|
@Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
|
||||||
@Entry(name = "Mouse screens") public static List<String> mouseScreens = List.of("me.jellysquid.mods.sodium.client.gui","net.coderbot.iris.gui","net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui");
|
@Entry(name = "Mouse screens") public static List<String> mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen");
|
||||||
@Entry(name = "Keybindings") public static Map<String, String> BINDINGS = Map.of();
|
@Entry(name = "Keybindings") public static Map<String, String> BINDINGS = new HashMap<>();
|
||||||
|
|
||||||
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
|
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
|
||||||
@Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE};
|
@Entry(name = "Max analog values") public static double[] maxAnalogValues = new double[]{1, 1, 1, 1};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the configuration
|
* Loads the configuration
|
||||||
@@ -156,7 +155,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
|
|
||||||
public static double getAxisMaxValue(int axis) {
|
public static double getAxisMaxValue(int axis) {
|
||||||
if (axis >= MidnightControlsConfig.maxAnalogValues.length)
|
if (axis >= MidnightControlsConfig.maxAnalogValues.length)
|
||||||
return DEFAULT_MAX_VALUE;
|
return 1;
|
||||||
return MidnightControlsConfig.maxAnalogValues[axis];
|
return MidnightControlsConfig.maxAnalogValues[axis];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,9 +272,8 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
leftDeadZone = 0.25;
|
leftDeadZone = 0.25;
|
||||||
invertRightYAxis = false;
|
invertRightYAxis = false;
|
||||||
invertRightXAxis = false;
|
invertRightXAxis = false;
|
||||||
DEFAULT_MAX_VALUE = 1;
|
|
||||||
rotationSpeed = 40.0;
|
rotationSpeed = 40.0;
|
||||||
yAxisRotationSpeed = 40.0;
|
yAxisRotationSpeed = rotationSpeed;
|
||||||
mouseSpeed = 25.0;
|
mouseSpeed = 25.0;
|
||||||
unfocusedInput = false;
|
unfocusedInput = false;
|
||||||
virtualMouse = false;
|
virtualMouse = false;
|
||||||
@@ -283,9 +281,9 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
controllerID = 0;
|
controllerID = 0;
|
||||||
secondControllerID = -1;
|
secondControllerID = -1;
|
||||||
controllerType = ControllerType.DEFAULT;
|
controllerType = ControllerType.DEFAULT;
|
||||||
mouseScreens = List.of("me.jellysquid.mods.sodium.client.gui","net.coderbot.iris.gui","net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui");
|
mouseScreens = Lists.newArrayList("me.jellysquid.mods.sodium.client.gui", "net.coderbot.iris.gui", "net.minecraft.client.gui.screen.advancement", "net.minecraft.client.gui.screen.pack.PackScreen", "net.minecraft.class_5375", "net.minecraft.class_457", "net.minecraft.class_408", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen");
|
||||||
BINDINGS = Map.of();
|
BINDINGS = new HashMap<>();
|
||||||
maxAnalogValues = new double[]{DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE, DEFAULT_MAX_VALUE};
|
maxAnalogValues = new double[]{1, 1, 1, 1};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -267,7 +267,7 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleButton(@NotNull MinecraftClient client, int button, int action, boolean state) {
|
public void handleButton(@NotNull MinecraftClient client, int button, int action, boolean state) {
|
||||||
if (this.controlsInput != null && this.controlsInput.focusedBinding != null) {
|
if (this.controlsInput != null && this.controlsInput.focusedBinding != null) {
|
||||||
if (action == 0 && !this.controlsInput.currentButtons.contains(button)) {
|
if (action == 0 && !this.controlsInput.currentButtons.contains(button)) {
|
||||||
this.controlsInput.currentButtons.add(button);
|
this.controlsInput.currentButtons.add(button);
|
||||||
@@ -549,7 +549,7 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) {
|
public boolean handleAButton(@NotNull Screen screen, @NotNull Element focused) {
|
||||||
if (focused instanceof PressableWidget widget) {
|
if (focused instanceof PressableWidget widget) {
|
||||||
widget.playDownSound(MinecraftClient.getInstance().getSoundManager());
|
widget.playDownSound(MinecraftClient.getInstance().getSoundManager());
|
||||||
widget.onPress();
|
widget.onPress();
|
||||||
|
|||||||
@@ -159,4 +159,12 @@ public class MidnightControlsCompat {
|
|||||||
public static boolean isReiPresent() {
|
public static boolean isReiPresent() {
|
||||||
return FabricLoader.getInstance().isModLoaded("roughlyenoughitems");
|
return FabricLoader.getInstance().isModLoaded("roughlyenoughitems");
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Returns whether EMI is present.
|
||||||
|
*
|
||||||
|
* @return true if EMI is present, else false
|
||||||
|
*/
|
||||||
|
public static boolean isEMIPresent() {
|
||||||
|
return FabricLoader.getInstance().isModLoaded("emi");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,10 +30,6 @@ public class MidnightControlsMixinPlugin implements IMixinConfigPlugin {
|
|||||||
private final HashMap<String, Boolean> conditionalMixins = new HashMap<>();
|
private final HashMap<String, Boolean> conditionalMixins = new HashMap<>();
|
||||||
|
|
||||||
public MidnightControlsMixinPlugin() {
|
public MidnightControlsMixinPlugin() {
|
||||||
this.putConditionalMixin("EntryListWidgetAccessor", MidnightControlsCompat.isReiPresent());
|
|
||||||
this.putConditionalMixin("EntryWidgetAccessor", MidnightControlsCompat.isReiPresent());
|
|
||||||
this.putConditionalMixin("RecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent());
|
|
||||||
this.putConditionalMixin("VillagerRecipeViewingScreenAccessor", MidnightControlsCompat.isReiPresent());
|
|
||||||
this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium"));
|
this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,355 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of midnightcontrols.
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license. For more information,
|
|
||||||
* see the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat;
|
|
||||||
|
|
||||||
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.mixin.EntryListWidgetAccessor;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.mixin.EntryWidgetAccessor;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.InputHandlers;
|
|
||||||
import eu.midnightdust.midnightcontrols.client.controller.PressAction;
|
|
||||||
import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry;
|
|
||||||
import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry;
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
|
||||||
import net.minecraft.client.gui.Element;
|
|
||||||
import net.minecraft.client.gui.Selectable;
|
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
|
||||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
|
||||||
import net.minecraft.client.gui.widget.EntryListWidget;
|
|
||||||
import net.minecraft.util.Identifier;
|
|
||||||
import net.minecraft.util.Pair;
|
|
||||||
import org.aperlambda.lambdacommon.utils.LambdaReflection;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import static eu.midnightdust.midnightcontrols.client.compat.CompatHandler.SlotPos.INVALID_SLOT;
|
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a compatibility handler for REI.
|
|
||||||
*
|
|
||||||
* @author LambdAurora
|
|
||||||
* @version 1.7.0
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
public class ReiCompat implements CompatHandler {
|
|
||||||
private static EntryListWidget ENTRY_LIST_WIDGET;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handle(@NotNull MidnightControlsClient mod) {
|
|
||||||
/*ButtonBinding.builder(new Identifier("rei", "category_back"))
|
|
||||||
.buttons(GLFW_GAMEPAD_BUTTON_LEFT_BUMPER)
|
|
||||||
.filter((client, binding) -> isViewingScreen(client.currentScreen))
|
|
||||||
.action(handleTab(false))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "category_next"))
|
|
||||||
.buttons(GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER)
|
|
||||||
.filter((client, binding) -> isViewingScreen(client.currentScreen))
|
|
||||||
.action(handleTab(true))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "page_back"))
|
|
||||||
.buttons(ButtonBinding.axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_X, false))
|
|
||||||
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
|
|
||||||
.action(handlePage(false))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "page_next"))
|
|
||||||
.buttons(ButtonBinding.axisAsButton(GLFW_GAMEPAD_AXIS_RIGHT_X, true))
|
|
||||||
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
|
|
||||||
.action(handlePage(true))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "recipe_back"))
|
|
||||||
.buttons(GLFW_GAMEPAD_BUTTON_DPAD_UP)
|
|
||||||
.filter((client, binding) -> isViewingScreen(client.currentScreen))
|
|
||||||
.action(handleRecipe(false))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "recipe_next"))
|
|
||||||
.buttons(GLFW_GAMEPAD_BUTTON_DPAD_DOWN)
|
|
||||||
.filter((client, binding) -> isViewingScreen(client.currentScreen))
|
|
||||||
.action(handleRecipe(true))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
|
|
||||||
// For some reasons this is broken.
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "show_usage"))
|
|
||||||
.buttons(GLFW_GAMEPAD_BUTTON_RIGHT_THUMB)
|
|
||||||
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
|
|
||||||
.action(handleShowRecipeUsage(true))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
|
|
||||||
ButtonBinding.builder(new Identifier("rei", "show_recipe"))
|
|
||||||
.buttons(GLFW_GAMEPAD_BUTTON_LEFT_THUMB)
|
|
||||||
.filter((client, binding) -> InputHandlers.inInventory(client, binding) || isViewingScreen(client.currentScreen))
|
|
||||||
.action(handleShowRecipeUsage(false))
|
|
||||||
.cooldown(true)
|
|
||||||
.register();
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean requireMouseOnScreen(Screen screen) {
|
|
||||||
return isViewingScreen(screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable CompatHandler.SlotPos getSlotAt(@NotNull Screen screen, int mouseX, int mouseY) {
|
|
||||||
|
|
||||||
ScreenOverlayImpl overlay = ScreenOverlayImpl.getInstance();
|
|
||||||
if (overlay.isInside(mouseX, mouseY)) {
|
|
||||||
EntryListWidget widget = getEntryListWidget();
|
|
||||||
if (widget == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return this.getSlotAt(widget, mouseX, mouseY, false);
|
|
||||||
} else if (isViewingScreen(screen)) {
|
|
||||||
for (Element element : screen.children()) {
|
|
||||||
var slot = this.getSlotAt(element, mouseX, mouseY, true);
|
|
||||||
if (slot != null)
|
|
||||||
return slot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private @Nullable CompatHandler.SlotPos getSlotAt(@NotNull Element element, int mouseX, int mouseY, boolean allowEmpty) {
|
|
||||||
if (element instanceof EntryWidget) {
|
|
||||||
EntryWidget entry = (EntryWidget) element;
|
|
||||||
if (entry.containsMouse(mouseX, mouseY)) {
|
|
||||||
if (!allowEmpty && entry.getEntries().isEmpty())
|
|
||||||
return INVALID_SLOT;
|
|
||||||
return new SlotPos(entry.getBounds().getX() + 1, entry.getBounds().getY() + 1);
|
|
||||||
}
|
|
||||||
} else if (element instanceof EntryListWidget) {
|
|
||||||
List<EntryListEntryWidget> entries = ((EntryListWidgetAccessor) element).getEntries();
|
|
||||||
for (EntryListEntryWidget entry : entries) {
|
|
||||||
var slot = this.getSlotAt(entry, mouseX, mouseY, allowEmpty);
|
|
||||||
if (slot != null && slot != INVALID_SLOT)
|
|
||||||
return slot;
|
|
||||||
}
|
|
||||||
} else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds widgetWithBounds) {
|
|
||||||
for (var child : widgetWithBounds.children()) {
|
|
||||||
var slot = this.getSlotAt(child, mouseX, mouseY, allowEmpty);
|
|
||||||
if (slot != null && slot != INVALID_SLOT)
|
|
||||||
return slot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isViewingScreen(Screen screen) {
|
|
||||||
return screen instanceof DefaultDisplayViewingScreen || screen instanceof CompositeDisplayViewingScreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handleMenuBack(@NotNull MinecraftClient client, @NotNull Screen screen) {
|
|
||||||
if (!isViewingScreen(screen))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
MinecraftClient.getInstance().setScreen(REIRuntimeImpl.getInstance().getPreviousContainerScreen());
|
|
||||||
REIRuntimeImpl.getInstance().getLastOverlay().init();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static EntryListWidget getEntryListWidget() {
|
|
||||||
if (ENTRY_LIST_WIDGET == null) {
|
|
||||||
ENTRY_LIST_WIDGET = LambdaReflection.getFirstFieldOfType(ContainerScreenOverlay.class, EntryListWidget.class)
|
|
||||||
.map(field -> (EntryListWidget) LambdaReflection.getFieldValue(null, field))
|
|
||||||
.orElse(null);
|
|
||||||
}
|
|
||||||
return ENTRY_LIST_WIDGET;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static @Nullable AbstractEntryStack getCurrentStack(@NotNull MinecraftClient client) {
|
|
||||||
double x = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
|
|
||||||
double y = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
|
|
||||||
|
|
||||||
if (isViewingScreen(client.currentScreen)) {
|
|
||||||
for (Element element : client.currentScreen.children()) {
|
|
||||||
EntryStack stack = getCurrentStack(element, x, y);
|
|
||||||
if (stack != null)
|
|
||||||
return stack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Optional<ContainerScreenOverlay> overlay = REIRuntimeImpl.getInstance().getOverlay(false,false);
|
|
||||||
if (!overlay.isPresent())
|
|
||||||
return RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen);
|
|
||||||
EntryListWidget widget = getEntryListWidget();
|
|
||||||
if (widget == null)
|
|
||||||
return ScreenOverlayImpl.getInstance().getInstance().getOverlayMenu()..getScreenFocusedStack(client.currentScreen);
|
|
||||||
|
|
||||||
return getCurrentStack(widget, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static @Nullable EntryStack getCurrentStack(@NotNull Element element, double mouseX, double mouseY) {
|
|
||||||
if (element instanceof EntryWidget) {
|
|
||||||
EntryWidget entry = (EntryWidget) element;
|
|
||||||
if (entry.containsMouse(mouseX, mouseY))
|
|
||||||
return ((EntryWidgetAccessor) entry).lambdacontrols_getCurrentEntry();
|
|
||||||
} else if (element instanceof EntryListWidget) {
|
|
||||||
List<EntryListEntryWidget> entries = ((EntryListWidgetAccessor) element).getEntries();
|
|
||||||
for (EntryListEntryWidget entry : entries) {
|
|
||||||
if (entry.containsMouse(mouseX, mouseY)) {
|
|
||||||
return ((EntryWidgetAccessor) entry).lambdacontrols_getCurrentEntry();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!(element instanceof ButtonWidget) && element instanceof WidgetWithBounds) {
|
|
||||||
for (Element child : ((WidgetWithBounds) element).children()) {
|
|
||||||
EntryStack stack = getCurrentStack(child, mouseX, mouseY);
|
|
||||||
if (stack != null)
|
|
||||||
return stack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static PressAction handleShowRecipeUsage(boolean usage) {
|
|
||||||
return (client, button, value, action) -> {
|
|
||||||
if (action.isUnpressed())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(client.currentScreen);
|
|
||||||
if (stack == null) {
|
|
||||||
stack = getCurrentStack(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack != null && !stack.isEmpty()) {
|
|
||||||
stack = stack.copy();
|
|
||||||
if (usage) {
|
|
||||||
return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory());
|
|
||||||
} else {
|
|
||||||
return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static PressAction handlePage(boolean next) {
|
|
||||||
return (client, button, value, action) -> {
|
|
||||||
if (action == ButtonState.RELEASE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
Optional<ContainerScreenOverlay> overlay = ScreenHelper.getOptionalOverlay();
|
|
||||||
if (!overlay.isPresent())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
EntryListWidget widget = getEntryListWidget();
|
|
||||||
if (widget == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (next)
|
|
||||||
widget.nextPage();
|
|
||||||
else
|
|
||||||
widget.previousPage();
|
|
||||||
widget.updateEntriesPosition();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the handler for category tabs buttons.
|
|
||||||
*
|
|
||||||
* @param next True if the action is to switch to the next tab.
|
|
||||||
* @return The handler.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
private static PressAction handleTab(boolean next) {
|
|
||||||
return (client, button, value, action) -> {
|
|
||||||
if (action != ButtonState.RELEASE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (client.currentScreen instanceof RecipeViewingScreen) {
|
|
||||||
RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen;
|
|
||||||
if (next)
|
|
||||||
screen.getCategoryNext().onClick();
|
|
||||||
else
|
|
||||||
screen.getCategoryBack().onClick();
|
|
||||||
return true;
|
|
||||||
} else if (client.currentScreen instanceof VillagerRecipeViewingScreen) {
|
|
||||||
VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen;
|
|
||||||
List<RecipeCategory<?>> categories = screen.getCategories();
|
|
||||||
int currentTab = screen.getSelectedCategoryIndex();
|
|
||||||
screen.setSelectedCategoryIndex(getNextIndex(currentTab, categories.size(), next));
|
|
||||||
screen.setSelectedRecipeIndex(0);
|
|
||||||
screen.lambdacontrols_init();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static PressAction handleRecipe(boolean next) {
|
|
||||||
return (client, button, value, action) -> {
|
|
||||||
if (action.isUnpressed())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (client.currentScreen instanceof RecipeViewingScreen) {
|
|
||||||
RecipeViewingScreenAccessor screen = (RecipeViewingScreenAccessor) client.currentScreen;
|
|
||||||
if (next)
|
|
||||||
screen.getRecipeNext().onClick();
|
|
||||||
else
|
|
||||||
screen.getRecipeBack().onClick();
|
|
||||||
return true;
|
|
||||||
} else if (client.currentScreen instanceof VillagerRecipeViewingScreen) {
|
|
||||||
VillagerRecipeViewingScreenAccessor screen = (VillagerRecipeViewingScreenAccessor) client.currentScreen;
|
|
||||||
List<RecipeCategory<?>> categories = screen.getCategories();
|
|
||||||
int currentTab = screen.getSelectedCategoryIndex();
|
|
||||||
List<RecipeDisplay> recipes = screen.getCategoryMap().get(categories.get(currentTab));
|
|
||||||
|
|
||||||
if (recipes.size() == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
int currentRecipe = screen.getSelectedRecipeIndex();
|
|
||||||
int nextRecipe = getNextIndex(currentRecipe, recipes.size(), next);
|
|
||||||
|
|
||||||
if (nextRecipe == 0) {
|
|
||||||
screen.getScrolling().scrollTo(0.0, true);
|
|
||||||
} else if (nextRecipe == recipes.size() - 1) {
|
|
||||||
screen.getScrolling().scrollTo(screen.getScrolling().getMaxScroll(), true);
|
|
||||||
} else {
|
|
||||||
double scrollAmount = screen.getScrolling().getMaxScroll() / (float) recipes.size();
|
|
||||||
screen.getScrolling().offset(next ? scrollAmount : -scrollAmount, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
screen.setSelectedRecipeIndex(nextRecipe);
|
|
||||||
screen.lambdacontrols_init();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getNextIndex(int currentIndex, int size, boolean next) {
|
|
||||||
int nextIndex = currentIndex + (next ? 1 : -1);
|
|
||||||
if (nextIndex < 0)
|
|
||||||
nextIndex = size - 1;
|
|
||||||
else if (nextIndex >= size)
|
|
||||||
nextIndex = 0;
|
|
||||||
return nextIndex;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of midnightcontrols.
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license. For more information,
|
|
||||||
* see the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.client.gui.Element;
|
|
||||||
import net.minecraft.client.gui.widget.EntryListWidget;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an accessor to REI's EntryListWidget.
|
|
||||||
*
|
|
||||||
* @author LambdAurora
|
|
||||||
* @version 1.5.0
|
|
||||||
* @since 1.5.0
|
|
||||||
*/
|
|
||||||
@Mixin(value = EntryListWidget.class, remap = false)
|
|
||||||
public interface EntryListWidgetAccessor {
|
|
||||||
@Accessor(value = "children")
|
|
||||||
List<Element> getEntries();
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of midnightcontrols.
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license. For more information,
|
|
||||||
* see the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat.mixin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an accessor to REI's EntryWidget.
|
|
||||||
*
|
|
||||||
* @author LambdAurora
|
|
||||||
* @version 1.5.0
|
|
||||||
* @since 1.5.0
|
|
||||||
*/
|
|
||||||
//@Mixin(value = EntryWidget.class, remap = false)
|
|
||||||
public interface EntryWidgetAccessor {
|
|
||||||
/*@Invoker("getCurrentEntry")
|
|
||||||
EntryStack midnightcontrols_getCurrentEntry();*/
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of midnightcontrols.
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license. For more information,
|
|
||||||
* see the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat.mixin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an accessor to REI's RecipeViewingScreen.
|
|
||||||
*
|
|
||||||
* @author LambdAurora
|
|
||||||
* @version 1.7.0
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
//@Mixin(value = DefaultDisplayViewingScreen.class, remap = false)
|
|
||||||
public interface RecipeViewingScreenAccessor {
|
|
||||||
/*@Accessor("categoryBack")
|
|
||||||
Button getCategoryBack();
|
|
||||||
|
|
||||||
@Accessor("categoryNext")
|
|
||||||
Button getCategoryNext();
|
|
||||||
|
|
||||||
@Accessor("recipeBack")
|
|
||||||
Button getRecipeBack();
|
|
||||||
|
|
||||||
@Accessor("recipeNext")
|
|
||||||
Button getRecipeNext();*/
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2021 LambdAurora <aurora42lambda@gmail.com>
|
|
||||||
*
|
|
||||||
* This file is part of midnightcontrols.
|
|
||||||
*
|
|
||||||
* Licensed under the MIT license. For more information,
|
|
||||||
* see the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.compat.mixin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents an accessor to REI's VillagerRecipeViewingScreen.
|
|
||||||
*
|
|
||||||
* @author LambdAurora
|
|
||||||
* @version 1.7.0
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
//@Mixin(CompositeDisplayViewingScreen.class)
|
|
||||||
public interface VillagerRecipeViewingScreenAccessor {
|
|
||||||
/*@Accessor(value = "categoryMap", remap = false)
|
|
||||||
Map<DisplayCategory<?>, List<Display>> getCategoryMap();
|
|
||||||
|
|
||||||
@Accessor(value = "categories", remap = false)
|
|
||||||
List<DisplayCategory<?>> getCategories();
|
|
||||||
|
|
||||||
@Accessor(value = "selectedCategoryIndex", remap = false)
|
|
||||||
int getSelectedCategoryIndex();
|
|
||||||
|
|
||||||
@Accessor(value = "selectedCategoryIndex", remap = false)
|
|
||||||
void setSelectedCategoryIndex(int selectedCategoryIndex);
|
|
||||||
|
|
||||||
@Accessor(value = "selectedRecipeIndex", remap = false)
|
|
||||||
int getSelectedRecipeIndex();
|
|
||||||
|
|
||||||
@Accessor(value = "selectedRecipeIndex", remap = false)
|
|
||||||
void setSelectedRecipeIndex(int selectedRecipeIndex);
|
|
||||||
|
|
||||||
@Accessor(value = "scrolling", remap = false)
|
|
||||||
ScrollingContainer getScrolling();
|
|
||||||
|
|
||||||
@Invoker("init")
|
|
||||||
void midnightcontrols_init();*/
|
|
||||||
}
|
|
||||||
@@ -28,6 +28,7 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
|||||||
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
|
||||||
import net.minecraft.client.util.ScreenshotRecorder;
|
import net.minecraft.client.util.ScreenshotRecorder;
|
||||||
import net.minecraft.item.ItemGroup;
|
import net.minecraft.item.ItemGroup;
|
||||||
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import net.minecraft.screen.slot.SlotActionType;
|
import net.minecraft.screen.slot.SlotActionType;
|
||||||
import org.aperlambda.lambdacommon.utils.Pair;
|
import org.aperlambda.lambdacommon.utils.Pair;
|
||||||
@@ -142,22 +143,29 @@ public class InputHandlers {
|
|||||||
|
|
||||||
int slotId;
|
int slotId;
|
||||||
if (slot == null) {
|
if (slot == null) {
|
||||||
if (client.player.currentScreenHandler.getCursorStack().isEmpty())
|
if (button.getName().equals("take_all")) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
slotId = accessor.midnightcontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1;
|
slotId = accessor.midnightcontrols$isClickOutsideBounds(x, y, accessor.getX(), accessor.getY(), GLFW_MOUSE_BUTTON_1) ? -999 : -1;
|
||||||
} else {
|
} else {
|
||||||
slotId = slot.id;
|
slotId = slot.id;
|
||||||
}
|
}
|
||||||
var actionType = SlotActionType.PICKUP;
|
var actionType = SlotActionType.PICKUP;
|
||||||
int clickData = GLFW.GLFW_MOUSE_BUTTON_1;
|
int clickData = GLFW.GLFW_MOUSE_BUTTON_1;
|
||||||
|
|
||||||
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
||||||
switch (button.getName()) {
|
switch (button.getName()) {
|
||||||
case "take_all":
|
case "take_all":
|
||||||
if (accessor instanceof CreativeInventoryScreen)
|
if (accessor instanceof CreativeInventoryScreen) {
|
||||||
if (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot))
|
if (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot))
|
||||||
actionType = SlotActionType.CLONE;
|
actionType = SlotActionType.CLONE;
|
||||||
if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot)))
|
if (slot != null && MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot)))
|
||||||
actionType = SlotActionType.CLONE;
|
actionType = SlotActionType.CLONE;
|
||||||
|
} else {
|
||||||
|
if (slot != null && screen.getScreenHandler().getCursorStack() != null) {
|
||||||
|
return screen.mouseReleased(x, y, GLFW.GLFW_MOUSE_BUTTON_1);
|
||||||
|
} else actionType = SlotActionType.PICKUP_ALL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "take":
|
case "take":
|
||||||
clickData = GLFW_MOUSE_BUTTON_2;
|
clickData = GLFW_MOUSE_BUTTON_2;
|
||||||
|
|||||||
@@ -72,8 +72,8 @@ public class MidnightControlsHud extends Hud {
|
|||||||
this.dropItemButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.DROP_ITEM);
|
this.dropItemButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.DROP_ITEM);
|
||||||
this.attackButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.ATTACK);
|
this.attackButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.ATTACK);
|
||||||
this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE);
|
this.useButtonWidth = MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.USE);
|
||||||
if (client.options.getGuiScale().getValue() >= 4) {
|
if (client.getWindow().getScaleFactor() >= 4) {
|
||||||
scale = 0.75f * (client.options.getGuiScale().getValue() -3);
|
scale = (float) (0.75f * (client.getWindow().getScaleFactor()-3));
|
||||||
} else scale = 1f;
|
} else scale = 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import eu.midnightdust.midnightcontrols.ControlsMode;
|
|||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
import eu.midnightdust.midnightcontrols.client.MidnightInput;
|
||||||
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
|
||||||
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@@ -20,9 +21,11 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen;
|
|||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.screen.slot.Slot;
|
import net.minecraft.screen.slot.Slot;
|
||||||
import net.minecraft.screen.slot.SlotActionType;
|
import net.minecraft.screen.slot.SlotActionType;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -34,6 +37,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|||||||
*/
|
*/
|
||||||
@Mixin(HandledScreen.class)
|
@Mixin(HandledScreen.class)
|
||||||
public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
||||||
|
@Unique private static float scale = 1f;
|
||||||
|
|
||||||
@Accessor("x")
|
@Accessor("x")
|
||||||
public abstract int getX();
|
public abstract int getX();
|
||||||
@@ -55,16 +59,26 @@ public abstract class HandledScreenMixin implements HandledScreenAccessor {
|
|||||||
public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
public void onRender(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
||||||
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) {
|
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER) {
|
||||||
var client = MinecraftClient.getInstance();
|
var client = MinecraftClient.getInstance();
|
||||||
int x = 2, y = client.getWindow().getScaledHeight() - 2 - MidnightControlsRenderer.ICON_SIZE;
|
if (client.getWindow().getScaleFactor() >= 4) {
|
||||||
|
scale = (float) (0.75f * (client.getWindow().getScaleFactor()-3));
|
||||||
|
} else scale = 1f;
|
||||||
|
if (scale != 1f) matrices.scale(scale,scale,scale);
|
||||||
|
int x = 2, y = (int) (client.getWindow().getScaledHeight() * (1 / scale) - 2 - MidnightControlsRenderer.ICON_SIZE);
|
||||||
|
if (MidnightControlsCompat.isEMIPresent()) {
|
||||||
|
x += 40 * (1 / scale);
|
||||||
|
}
|
||||||
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "midnightcontrols.action.pickup_all", true, client) + 2;
|
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_A}, "midnightcontrols.action.pickup_all", true, client) + 2;
|
||||||
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "midnightcontrols.action.exit", true, client) + 2;
|
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_B}, "midnightcontrols.action.exit", true, client) + 2;
|
||||||
if (MidnightControlsCompat.isReiPresent()) {
|
if (MidnightControlsCompat.isReiPresent()) {
|
||||||
x = 2;
|
x = 2;
|
||||||
y -= 24;
|
y -= 24;
|
||||||
}
|
}
|
||||||
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "midnightcontrols.action.pickup", true, client) + 2;
|
if (MidnightControlsCompat.isEMIPresent()) {
|
||||||
|
x = (int) (client.getWindow().getScaledWidth() * (1 / scale) - 55 - client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.pickup")) * (1 / scale) - client.textRenderer.getWidth(Text.translatable("midnightcontrols.action.quick_move")) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.TAKE) - MidnightControlsRenderer.getBindingIconWidth(ButtonBinding.QUICK_MOVE));
|
||||||
|
}
|
||||||
|
x = MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_X}, "midnightcontrols.action.pickup", true, client);
|
||||||
MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "midnightcontrols.action.quick_move", true, client);
|
MidnightControlsRenderer.drawButtonTip(matrices, x, y, new int[]{GLFW.GLFW_GAMEPAD_BUTTON_Y}, "midnightcontrols.action.quick_move", true, client);
|
||||||
|
if (scale != 1f) matrices.scale(1,1,1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user