Compare commits

..

6 Commits

Author SHA1 Message Date
Motschen
308b41094f MidnightControls 1.7.2 - Port to 1.19.3, various new options
- Update to 1.19.3 (Tabbing through creative tabs behaves the same as before, that was hard)
- Add an option to move the chat input field to the top of the screen for better input on devices using an on-screen keyboard
- Add an option to make the left joystick behave like a mouse in every screen
- Add a button to more easily access the Advanced Config
2022-12-09 20:02:59 +01:00
Martin Prokoph
bf7209083a Merge pull request #140 from eric122804/patch-1
Create zh_tw
2022-12-09 13:19:55 +00:00
eric122804
aa75a58a4d Create zh_tw 2022-12-07 20:30:51 +08:00
Motschen
1f675622f0 Use MidnightLib 22w43a version from Modrinth 2022-10-27 20:51:17 +02:00
Motschen
2d902bbf3c Port to 22w43a 2022-10-27 20:25:26 +02:00
Motschen
9cc5393703 More mod compatibility & Add missing contributor names 2022-10-27 20:00:14 +02:00
23 changed files with 510 additions and 91 deletions

View File

@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '0.12-SNAPSHOT'
id 'fabric-loom' version '1.0-SNAPSHOT'
id 'java-library'
id 'maven-publish'
id 'com.github.johnrengelman.shadow' version '7.0.0'
@@ -32,7 +32,7 @@ boolean isMCVersionNonRelease() {
}
String getMCVersionString() {
if (isMCVersionNonRelease()) {
if (isMCVersionNonRelease() || project.minecraft_version == "1.19.3") {
return project.minecraft_version
}
def version = project.minecraft_version.split('\\.')
@@ -102,7 +102,7 @@ dependencies {
}
include 'org.aperlambda:lambdajcommon:1.8.1'
modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}"
modCompileOnlyApi "com.terraformersmc:modmenu:${project.modmenu_version}"
// Compatibility mods
@@ -110,15 +110,15 @@ dependencies {
// modImplementation("maven.modrinth:ok-zoomer:${project.ok_zoomer_version}")
// modImplementation "io.github.ennuil:LibZoomer:${project.libzoomer_version}"
modImplementation "io.github.cottonmc:LibGui:${project.libgui_version}"
modImplementation "org.quiltmc:quilt-json5:1.0.0"
modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}"
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
modImplementation("maven.modrinth:emi:${project.emi_version}")
modImplementation "maven.modrinth:emotecraft:${project.emotecraft_version}"
modImplementation "io.github.kosmx:bendy-lib:${project.bendylib_version}"
modImplementation "dev.isxander:yet-another-config-lib:${project.yacl_version}"
modImplementation "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
modImplementation "maven.modrinth:bedrockify:${project.bedrockify_version}"
modImplementation "maven.modrinth:emi:${project.emi_version}"
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
modCompileOnlyApi "dev.isxander:yet-another-config-lib:${project.yacl_version}"
modCompileOnlyApi "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
modCompileOnlyApi "maven.modrinth:bedrockify:${project.bedrockify_version}"
// Required for Inventory Tabs
modApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") {
exclude(group: "net.fabricmc.fabric-api")

View File

@@ -3,26 +3,26 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://fabricmc.net/use
minecraft_version=1.19.2
yarn_mappings=1.19.2+build.9
loader_version=0.14.9
minecraft_version=1.19.3
yarn_mappings=1.19.3+build.2
loader_version=0.14.11
# Mod Properties
mod_version = 1.7.0
mod_version = 1.7.2
maven_group = eu.midnightdust
archives_base_name = midnightcontrols
modrinth_id=bXX9h73M
# Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version=0.60.0+1.19.2
fabric_version=0.68.1+1.19.3
sodium_version=mc1.19.2-0.4.4
spruceui_version=4.0.0+1.19
midnightlib_version=0.6.1
modmenu_version=4.0.6
spruceui_version=4.1.0+1.19.3
midnightlib_version=1.1.0-fabric
modmenu_version=5.0.1
emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric
bendylib_version=2.0.+
emi_version=0.4.0+1.19
emi_version=0.5.0+1.19.3
libgui_version=6.0.0+1.19
inventorytabs_version=inventorytabs-0.9.beta-1.19.x
clothconfig_version=7.0.72

View File

@@ -15,6 +15,7 @@ import eu.midnightdust.midnightcontrols.MidnightControls;
import eu.midnightdust.midnightcontrols.MidnightControlsConstants;
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat;
import eu.midnightdust.midnightcontrols.client.compat.VoxelMapCompat;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
import eu.midnightdust.midnightcontrols.client.controller.Controller;
@@ -22,6 +23,7 @@ import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsHud;
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor;
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingRegistryImplAccessor;
import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction;
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
@@ -57,6 +59,7 @@ import java.util.TimerTask;
*/
public class MidnightControlsClient extends MidnightControls implements ClientModInitializer {
public static boolean lateInitDone = false;
public static boolean voxelmapInitDone = false;
private static MidnightControlsClient INSTANCE;
public static final KeyBinding BINDING_LOOK_UP = InputManager.makeKeyBinding(new Identifier(MidnightControlsConstants.NAMESPACE, "look_up"),
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement");
@@ -163,6 +166,12 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
* This method is called to initialize keybindings
*/
public void initKeybindings() {
if (!voxelmapInitDone && FabricLoader.getInstance().isModLoaded("voxelmap") && KeyBindingIDAccessor.getKEYS_BY_ID().containsKey("key.minimap.toggleingamewaypoints")) {
this.log("Adding VoxelMap compatibility...");
new VoxelMapCompat().handle(this);
InputManager.loadButtonBindings();
voxelmapInitDone = true;
}
if (lateInitDone) return;
if (KeyBindingRegistryImplAccessor.getModdedKeyBindings() == null || KeyBindingRegistryImplAccessor.getModdedKeyBindings().isEmpty()) return;
for (int i = 0; i < KeyBindingRegistryImplAccessor.getModdedKeyBindings().size(); ++i) {

View File

@@ -18,6 +18,7 @@ import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.controller.Controller;
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ChatScreen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.lwjgl.glfw.GLFW;
@@ -40,6 +41,7 @@ public class MidnightControlsConfig extends MidnightConfig {
// HUD
@Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true;
@Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT;
@Entry(name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false;
// Gameplay
@Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true;
@Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true;
@@ -60,6 +62,7 @@ public class MidnightControlsConfig extends MidnightConfig {
@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 = rotationSpeed;
@Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0;
@Entry(name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = 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.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
@@ -68,9 +71,11 @@ public class MidnightControlsConfig extends MidnightConfig {
@Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
@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",
"net.minecraft.class_457", "net.minecraft.class_408", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen",
"hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen",
"me.shedaniel.clothconfig2.gui.ClothConfigScreen");
"me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap");
@Entry(name = "Arrow screens") public static List<String> arrowScreens = Lists.newArrayList(ChatScreen.class.getCanonicalName());
@Entry(name = "WASD screens") public static List<String> wasdScreens = Lists.newArrayList("com.ultreon.devices.core.Laptop");
@Entry(name = "Keybindings") public static Map<String, String> BINDING = new HashMap<>();
private static final Pattern BUTTON_BINDING_PATTERN = Pattern.compile("(-?\\d+)\\+?");
@@ -325,7 +330,7 @@ public class MidnightControlsConfig extends MidnightConfig {
controllerID = 0;
secondControllerID = -1;
controllerType = ControllerType.DEFAULT;
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", "me.shedaniel.clothconfig2.gui.ClothConfigScreen");
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", "net.minecraft.class_3872", "me.flashyreese.mods.reeses_sodium_options.client.gui", "dev.emi.emi.screen", "me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap");
BINDING = new HashMap<>();
maxAnalogValues = new double[]{1, 1, 1, 1};
triggerFix = true;
@@ -347,7 +352,7 @@ public class MidnightControlsConfig extends MidnightConfig {
else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX;
else if (controller.contains("steam deck")) return ControllerType.STEAM_DECK;
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
else if (controller.contains("dualsense")) return ControllerType.DUALSENSE;
else if (controller.contains("dualsense") || controller.contains("ps5")) return ControllerType.DUALSENSE;
else if (controller.contains("dualshock") || controller.contains("ps4") || controller.contains("sony")) return ControllerType.DUALSHOCK;
else if (controller.contains("switch") || controller.contains("joy-con") || controller.contains("wii") || controller.contains("nintendo")) return ControllerType.SWITCH;
else if (controller.contains("ouya")) return ControllerType.OUYA;

View File

@@ -49,6 +49,8 @@ import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
import net.minecraft.client.gui.screen.world.WorldListWidget;
import net.minecraft.client.gui.widget.*;
import net.minecraft.client.input.Input;
import net.minecraft.client.util.InputUtil;
import net.minecraft.screen.slot.Slot;
import net.minecraft.text.TranslatableTextContent;
import net.minecraft.util.math.MathHelper;
@@ -74,6 +76,7 @@ public class MidnightInput {
// Cooldowns
public int actionGuiCooldown = 0;
public boolean ignoreNextARelease = false;
public boolean ignoreNextXRelease = false;
private double targetYaw = 0.0;
private double targetPitch = 0.0;
private float prevXAxis = 0.f;
@@ -317,12 +320,33 @@ public class MidnightInput {
return;
}
if (action == 0 || action == 2) {
if (client.currentScreen != null && (action == 0 || action == 2) && button == GLFW_GAMEPAD_BUTTON_Y &&
MidnightControlsConfig.arrowScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
pressKeyboardKey(client, GLFW.GLFW_KEY_ENTER);
this.screenCloseCooldown = 5;
}
else if (action == 0 || action == 2) {
if (client.currentScreen != null
&& (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN
|| button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT)) {
if (this.actionGuiCooldown == 0) {
if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP) {
if (MidnightControlsConfig.arrowScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
switch (button) {
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> pressKeyboardKey(client, GLFW.GLFW_KEY_UP);
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> pressKeyboardKey(client, GLFW.GLFW_KEY_DOWN);
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> pressKeyboardKey(client, GLFW.GLFW_KEY_LEFT);
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_RIGHT);
}
}
else if (MidnightControlsConfig.wasdScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
switch (button) {
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> pressKeyboardKey(client, GLFW.GLFW_KEY_W);
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> pressKeyboardKey(client, GLFW.GLFW_KEY_S);
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> pressKeyboardKey(client, GLFW.GLFW_KEY_A);
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_D);
}
}
else if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP) {
this.changeFocus(client.currentScreen, NavigationDirection.UP);
} else if (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN) {
this.changeFocus(client.currentScreen, NavigationDirection.DOWN);
@@ -356,17 +380,54 @@ public class MidnightInput {
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
if (action == 0) {
Screen.wrapScreenError(() -> client.currentScreen.mouseClicked(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1),
Screen.wrapScreenError(() -> {
((MouseAccessor) client.mouse).setLeftButtonClicked(false);
client.currentScreen.mouseClicked(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1);
},
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
} else if (action == 1) {
Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1),
Screen.wrapScreenError(() -> {
((MouseAccessor) client.mouse).setLeftButtonClicked(false);
client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_1);
},
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
} else if (action == 2) {
Screen.wrapScreenError(() -> {
client.currentScreen.setDragging(true);
((MouseAccessor) client.mouse).setLeftButtonClicked(true);
((MouseAccessor) client.mouse).midnightcontrols$onCursorPos(client.getWindow().getHandle(), client.mouse.getX(), client.mouse.getY());
client.currentScreen.setDragging(false);
},
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
}
this.screenCloseCooldown = 5;
} else {
this.ignoreNextARelease = false;
}
}
else if (button == GLFW.GLFW_GAMEPAD_BUTTON_X && client.currentScreen != null && !isScreenInteractive(client.currentScreen)
&& this.actionGuiCooldown == 0) {
if (client.currentScreen instanceof HandledScreen<?> handledScreen && ((HandledScreenAccessor) handledScreen).midnightcontrols$getSlotAt(
client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth(),
client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()) != null) return;
if (!this.ignoreNextXRelease) {
double mouseX = client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth();
double mouseY = client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight();
if (action == 0) {
Screen.wrapScreenError(() -> client.currentScreen.mouseClicked(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_2),
"mouseClicked event handler", client.currentScreen.getClass().getCanonicalName());
} else if (action == 1) {
Screen.wrapScreenError(() -> client.currentScreen.mouseReleased(mouseX, mouseY, GLFW.GLFW_MOUSE_BUTTON_2),
"mouseReleased event handler", client.currentScreen.getClass().getCanonicalName());
}
this.screenCloseCooldown = 5;
} else {
this.ignoreNextXRelease = false;
}
}
}
public void pressKeyboardKey(MinecraftClient client, int key) {
client.keyboard.onKey(client.getWindow().getHandle(), key, 0, 1, 0);
}
/**
@@ -797,7 +858,7 @@ public class MidnightInput {
}
public static boolean isScreenInteractive(@NotNull Screen screen) {
return !(screen instanceof HandledScreen || MidnightControlsConfig.mouseScreens.stream().anyMatch(a -> screen.getClass().toString().contains(a))
return !(screen instanceof HandledScreen || MidnightControlsConfig.joystickAsMouse || MidnightControlsConfig.mouseScreens.stream().anyMatch(a -> screen.getClass().toString().contains(a))
|| (screen instanceof SpruceScreen && ((SpruceScreen) screen).requiresCursor())
|| MidnightControlsCompat.requireMouseOnScreen(screen));
}

View File

@@ -1,6 +1,6 @@
package eu.midnightdust.midnightcontrols.client.compat;
import dev.emi.emi.EmiConfig;
import dev.emi.emi.config.EmiConfig;
import dev.emi.emi.screen.EmiScreen;
import dev.emi.emi.screen.EmiScreenManager;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
@@ -14,9 +14,9 @@ import org.lwjgl.glfw.GLFW;
public class EMICompat implements CompatHandler {
public static boolean handleTabs(boolean direction) {
if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.searchLeft != null && EmiScreenManager.searchRight != null) {
if (direction) EmiScreenManager.searchRight.onPress();
else EmiScreenManager.searchLeft.onPress();
if (isEMIEnabled() && MidnightControlsClient.get().input.actionGuiCooldown == 0 && EmiScreenManager.getSearchPanel() != null && EmiScreenManager.getSearchPanel().pageLeft != null && EmiScreenManager.getSearchPanel().pageRight != null) {
if (direction) EmiScreenManager.getSearchPanel().pageRight.onPress();
else EmiScreenManager.getSearchPanel().pageLeft.onPress();
MidnightControlsClient.get().input.actionGuiCooldown = 5;
return true;
}

View File

@@ -0,0 +1,95 @@
/*
* Copyright © 2022 Motschen <motschen@midnightdust.eu>
*
* 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.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding;
import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory;
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor;
import net.minecraft.client.option.KeyBinding;
import org.aperlambda.lambdacommon.Identifier;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
/**
* Represents a compatibility handler for VoxelMap.
*
* @author Motschen
* @version 1.8.0
* @since 1.8.0
*/
public class VoxelMapCompat implements CompatHandler {
private final KeyBinding voxelMapZoomKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.zoom", null);
private final KeyBinding voxelmapFullscreenKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.togglefullscreen", null);
private final KeyBinding voxelmapMenuKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.voxelmapmenu", null);;
private final KeyBinding voxelmapWaypointMenuKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.waypointmenu", null);;
private final KeyBinding voxelmapWaypointKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.waypointhotkey", null);
private final KeyBinding voxelmapMobToggleKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.togglemobs", null);
private final KeyBinding voxelmapWaypointToggleKey = KeyBindingIDAccessor.getKEYS_BY_ID().getOrDefault("key.minimap.toggleingamewaypoints", null);
private static final ButtonCategory VOXELMAP_CATEGORY = InputManager.registerCategory(new Identifier("minecraft","controls.minimap.title"));
@Override
public void handle(@NotNull MidnightControlsClient mod) {
if (MidnightControlsConfig.debug && KeyBindingIDAccessor.getKEYS_BY_ID() != null) KeyBindingIDAccessor.getKEYS_BY_ID().forEach((a, b) -> System.out.println(a + " - " + b));
new ButtonBinding.Builder("key.minimap.zoom")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_X)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelMapZoomKey)
.register();
new ButtonBinding.Builder("key.minimap.togglefullscreen")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_Y)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelmapFullscreenKey)
.register();
new ButtonBinding.Builder("key.minimap.voxelmapmenu")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_START)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelmapMenuKey)
.register();
new ButtonBinding.Builder("key.minimap.waypointmenu")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_GUIDE)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelmapWaypointMenuKey)
.register();
new ButtonBinding.Builder("key.minimap.waypointhotkey")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_BACK)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelmapWaypointKey)
.register();
new ButtonBinding.Builder("key.minimap.togglemobs")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_A)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelmapMobToggleKey)
.register();
new ButtonBinding.Builder("key.minimap.toggleingamewaypoints")
.buttons(GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN, GLFW.GLFW_GAMEPAD_BUTTON_B)
.onlyInGame()
.cooldown(true)
.category(VOXELMAP_CATEGORY)
.linkKeybind(voxelmapWaypointToggleKey)
.register();
}
}

View File

@@ -22,6 +22,10 @@ import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAcce
import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor;
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
import net.fabricmc.fabric.impl.client.itemgroup.CreativeGuiExtensions;
import net.fabricmc.fabric.impl.client.itemgroup.FabricCreativeGuiComponents;
import net.fabricmc.fabric.impl.itemgroup.FabricItemGroup;
import net.fabricmc.fabric.impl.itemgroup.ItemGroupHelper;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.TitleScreen;
@@ -31,16 +35,18 @@ import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
import net.minecraft.client.gui.widget.PressableWidget;
import net.minecraft.client.util.ScreenshotRecorder;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemGroups;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.util.math.MathHelper;
import org.aperlambda.lambdacommon.utils.Pair;
import org.jetbrains.annotations.NotNull;
import org.lwjgl.glfw.GLFW;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
@@ -52,32 +58,68 @@ import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
* @version 1.7.0
* @since 1.1.0
*/
@SuppressWarnings("UnstableApiUsage")
public class InputHandlers {
private InputHandlers() {
}
private static List<ItemGroup> getVisibleGroups(CreativeInventoryScreen screen) {
return ItemGroupHelper.sortedGroups.stream()
.filter(itemGroup -> {
if (FabricCreativeGuiComponents.COMMON_GROUPS.contains(itemGroup)) return true;
return ((CreativeGuiExtensions)screen).fabric_currentPage() == ((FabricItemGroup)itemGroup).getPage() && itemGroup.shouldDisplay() && (!itemGroup.equals(ItemGroups.OPERATOR) || ItemGroups.operatorEnabled);
}).toList();
}
public static PressAction handleHotbar(boolean next) {
return (client, button, value, action) -> {
if (action == ButtonState.RELEASE)
return false;
// When ingame
// When in-game
if (client.currentScreen == null && client.player != null) {
if (next)
client.player.getInventory().scrollInHotbar(-1.0);
else
client.player.getInventory().scrollInHotbar(1.0);
if (!client.player.isSpectator()) {
if (next)
client.player.getInventory().scrollInHotbar(-1.0);
else
client.player.getInventory().scrollInHotbar(1.0);
}
else {
if (client.inGameHud.getSpectatorHud().isOpen()) {
client.inGameHud.getSpectatorHud().cycleSlot(next ? -1 : 1);
} else {
float g = MathHelper.clamp(client.player.getAbilities().getFlySpeed() + (next ? 1 : -1) * 0.005F, 0.0F, 0.2F);
client.player.getAbilities().setFlySpeed(g);
}
}
return true;
} else if (client.currentScreen instanceof RingScreen) {
MidnightControlsClient.get().ring.cyclePage(next);
} else if (client.currentScreen instanceof CreativeInventoryScreenAccessor inventory) {
int currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
int nextTab = currentTab + (next ? 1 : -1);
if (nextTab < 0)
nextTab = ItemGroup.GROUPS.length - 1;
else if (nextTab >= ItemGroup.GROUPS.length)
nextTab = 0;
inventory.midnightcontrols$setSelectedTab(ItemGroup.GROUPS[nextTab]);
ItemGroup currentTab = CreativeInventoryScreenAccessor.getSelectedTab();
int currentColumn = currentTab.getColumn();
ItemGroup.Row currentRow = currentTab.getRow();
ItemGroup newTab = null;
List<ItemGroup> visibleTabs = getVisibleGroups((CreativeInventoryScreen) client.currentScreen);
for (ItemGroup tab : visibleTabs) {
if (tab.getRow().equals(currentRow) && ((newTab == null && ((next && tab.getColumn() > currentColumn) ||
(!next && tab.getColumn() < currentColumn))) || (newTab != null && ((next && tab.getColumn() > currentColumn && tab.getColumn() < newTab.getColumn()) ||
(!next && tab.getColumn() < currentColumn && tab.getColumn() > newTab.getColumn())))))
newTab = tab;
}
if (newTab == null)
for (ItemGroup tab : visibleTabs) {
if ((tab.getRow().compareTo(currentRow)) != 0 && ((next && newTab == null || next && newTab.getColumn() > tab.getColumn()) || (!next && newTab == null) || (!next && newTab.getColumn() < tab.getColumn())))
newTab = tab;
}
if (newTab == null) {
for (ItemGroup tab : visibleTabs) {
if ((next && tab.getRow() == ItemGroup.Row.TOP && tab.getColumn() == 0) ||
!next && tab.getRow() == ItemGroup.Row.BOTTOM && (newTab == null || tab.getColumn() > newTab.getColumn()))
newTab = tab;
}
}
if (newTab == null || newTab.equals(currentTab)) newTab = ItemGroups.getDefaultTab();
inventory.midnightcontrols$setSelectedTab(newTab);
return true;
} else if (client.currentScreen instanceof InventoryScreen || client.currentScreen instanceof CraftingScreen || client.currentScreen instanceof AbstractFurnaceScreen<?>) {
RecipeBookWidget recipeBook;
@@ -102,7 +144,7 @@ public class InputHandlers {
recipeBookAccessor.midnightcontrols$refreshResults(true);
return true;
} else if (client.currentScreen instanceof AdvancementsScreenAccessor screen) {
var tabs = screen.getTabs().values().stream().distinct().collect(Collectors.toList());
var tabs = screen.getTabs().values().stream().distinct().toList();
var tab = screen.getSelectedTab();
if (tab == null)
return false;

View File

@@ -38,7 +38,7 @@ import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.Util;
import net.minecraft.util.math.Matrix4f;
import org.joml.Matrix4f;
import org.lwjgl.glfw.GLFW;
import java.awt.*;
@@ -57,8 +57,10 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
private final SpruceOption rotationSpeedOption;
private final SpruceOption yAxisRotationSpeedOption;
private final SpruceOption mouseSpeedOption;
private final SpruceOption joystickAsMouseOption;
private final SpruceOption virtualMouseOption;
private final SpruceOption resetOption;
private final SpruceOption advancedConfigOption;
// Gameplay options
private final SpruceOption analogMovementOption;
private final SpruceOption doubleTapToSprintOption;
@@ -75,6 +77,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
private final SpruceOption virtualMouseSkinOption;
private final SpruceOption hudEnableOption;
private final SpruceOption hudSideOption;
private final SpruceOption moveChatOption;
// Controller options
private final SpruceOption controllerOption =
new SpruceCyclingOption("midnightcontrols.menu.controller",
@@ -184,12 +187,16 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
this.mouseSpeedOption = new SpruceDoubleOption("midnightcontrols.menu.mouse_speed", 0.0, 150.0, .5f,
() -> MidnightControlsConfig.mouseSpeed,
value -> MidnightControlsConfig.mouseSpeed = value, option -> option.getDisplayText(Text.literal(String.valueOf(option.get()))),
Text.translatable("midnightcontrols.tooltip.mouse_speed"));
Text.translatable("midnightcontrols.tooltip.joystick_as_mouse"));
this.joystickAsMouseOption = new SpruceToggleBooleanOption("midnightcontrols.menu.joystick_as_mouse",
() -> MidnightControlsConfig.joystickAsMouse, value -> MidnightControlsConfig.joystickAsMouse = value,
Text.translatable("midnightcontrols.tooltip.joystick_as_mouse"));
this.resetOption = SpruceSimpleActionOption.reset(btn -> {
MidnightControlsConfig.reset();
var client = MinecraftClient.getInstance();
this.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
});
this.advancedConfigOption = SpruceSimpleActionOption.of("midnightcontrols.midnightconfig.title", button -> client.setScreen(MidnightControlsConfig.getScreen(this, "midnightcontrols")));
// Gameplay options
this.analogMovementOption = new SpruceToggleBooleanOption("midnightcontrols.menu.analog_movement",
() -> MidnightControlsConfig.analogMovement, value -> MidnightControlsConfig.analogMovement = value,
@@ -232,6 +239,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
amount -> MidnightControlsConfig.hudSide = MidnightControlsConfig.hudSide.next(),
option -> option.getDisplayText(MidnightControlsConfig.hudSide.getTranslatedText()),
Text.translatable("midnightcontrols.tooltip.hud_side"));
this.moveChatOption = new SpruceToggleBooleanOption("midnightcontrols.menu.move_chat", () -> MidnightControlsConfig.moveChat,
value -> MidnightControlsConfig.moveChat = value, Text.translatable("midnightcontrols.tooltip.move_chat"));
// Controller options
this.toggleControllerProfileOption = new SpruceToggleBooleanOption("midnightcontrols.menu.separate_controller_profile", () -> MidnightControlsConfig.controllerBindingProfiles.containsKey(MidnightControlsConfig.getController().getGuid()), value -> {
if (value) {
@@ -290,8 +299,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
this.buildTabs();
this.addDrawableChild(this.resetOption.createWidget(Position.of(this.width / 2 - 155, this.height - 29), 150));
this.addDrawableChild(new ButtonWidget(this.width / 2 - 155 + 160, this.height - 29, 150, 20, SpruceTexts.GUI_DONE,
btn -> this.client.setScreen(this.parent)));
this.addDrawableChild(ButtonWidget.builder(SpruceTexts.GUI_DONE, btn -> this.client.setScreen(this.parent))
.dimensions(this.width / 2 - 155 + 160, this.height - 29, 150, 20).build());
}
public void buildTabs() {
@@ -329,6 +338,8 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
list.addSingleOptionEntry(this.yAxisRotationSpeedOption);
list.addSingleOptionEntry(this.mouseSpeedOption);
list.addSingleOptionEntry(this.virtualMouseOption);
list.addSingleOptionEntry(this.joystickAsMouseOption);
list.addSingleOptionEntry(this.advancedConfigOption);
return list;
}
@@ -356,6 +367,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
list.addSingleOptionEntry(new SpruceSeparatorOption("midnightcontrols.menu.title.hud", true, null));
list.addSingleOptionEntry(this.hudEnableOption);
list.addSingleOptionEntry(this.hudSideOption);
list.addSingleOptionEntry(this.moveChatOption);
return list;
}
@@ -437,13 +449,13 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
RenderSystem.enableBlend();
RenderSystem.disableTexture();
RenderSystem.defaultBlendFunc();
RenderSystem.setShader(GameRenderer::getPositionColorShader);
RenderSystem.setShader(GameRenderer::getPositionColorProgram);
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
bufferBuilder.vertex(matrix, (float)x1, (float)y2, 0.0F).color(r, g, b, t).next();
bufferBuilder.vertex(matrix, (float)x2, (float)y2, 0.0F).color(r, g, b, t).next();
bufferBuilder.vertex(matrix, (float)x2, (float)y1, 0.0F).color(r, g, b, t).next();
bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t).next();
BufferRenderer.drawWithShader(bufferBuilder.end());
BufferRenderer.drawWithGlobalProgram(bufferBuilder.end());
RenderSystem.enableTexture();
RenderSystem.disableBlend();
matrixStack.pop();

View File

@@ -10,7 +10,6 @@
package eu.midnightdust.midnightcontrols.client.gui;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
import eu.midnightdust.midnightcontrols.client.ring.RingButtonMode;
import eu.midnightdust.midnightcontrols.client.ring.RingPage;
import net.minecraft.client.gui.screen.Screen;
@@ -37,8 +36,8 @@ public class RingScreen extends Screen {
protected void init() {
super.init();
if (mod.ring.getMaxPages() > 1) {
this.addDrawableChild(new ButtonWidget(5, 5, 20, 20, Text.of(""), button -> this.mod.ring.cyclePage(false)));
this.addDrawableChild(new ButtonWidget(width - 25, 5, 20, 20, Text.of(""), button -> this.mod.ring.cyclePage(true)));
this.addDrawableChild(ButtonWidget.builder(Text.of(""), button -> this.mod.ring.cyclePage(false)).dimensions(5, 5, 20, 20).build());
this.addDrawableChild(ButtonWidget.builder(Text.of(""), button -> this.mod.ring.cyclePage(true)).dimensions(width - 25, 5, 20, 20).build());
}
}

View File

@@ -0,0 +1,35 @@
package eu.midnightdust.midnightcontrols.client.mixin;
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ChatScreen.class)
public abstract class ChatScreenMixin extends Screen {
@Shadow protected TextFieldWidget chatField;
protected ChatScreenMixin(Text title) {
super(title);
}
@Inject(at = @At("TAIL"), method = "init")
private void midnightcontrols$moveInputField(CallbackInfo ci) {
if (MidnightControlsConfig.moveChat) chatField.setY(4);
}
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;setTextFieldFocused(Z)V", shift = At.Shift.AFTER))
private void midnightcontrols$moveInputFieldBackground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (MidnightControlsConfig.moveChat) matrices.translate(0f, -this.height + 16, 0f);
}
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = At.Shift.BEFORE))
private void midnightcontrols$dontMoveOtherStuff(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (MidnightControlsConfig.moveChat) matrices.translate(0f, this.height - 16, 0f);
}
}

View File

@@ -38,8 +38,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
private boolean midnightcontrols$driftingPrevented = false;
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile, @Nullable PlayerPublicKey publicKey) {
super(world, profile, publicKey);
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
super(world, profile);
}
@Shadow

View File

@@ -11,16 +11,13 @@ package eu.midnightdust.midnightcontrols.client.mixin;
import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget;
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.ControlsOptionsScreen;
import net.minecraft.client.gui.screen.option.GameOptionsScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.option.GameOptions;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -30,27 +27,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
*/
@Mixin(ControlsOptionsScreen.class)
public abstract class ControlsOptionsScreenMixin extends GameOptionsScreen {
@Unique private final boolean showAlternativeButton = FabricLoader.getInstance().isModLoaded("crawl");
public ControlsOptionsScreenMixin(Screen parent, GameOptions gameOptions, Text text) {
super(parent, gameOptions, text);
}
@Inject(method = "init", at = @At(value = "INVOKE", ordinal = 1, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/option/ControlsOptionsScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;"))
private void addAlternativeControllerButton(CallbackInfo ci) {
if (showAlternativeButton) {
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20,0,0,20, new Identifier("midnightcontrols", "textures/gui/midnightcontrols_button.png"), 32, 64, (button) -> {
this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
}, Text.translatable("midnightcontrols.menu.title.controller")));
}
}
@Inject(method = "init", at = @At(value = "INVOKE", ordinal = 4, shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/option/ControlsOptionsScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;"))
private void addControllerButton(CallbackInfo ci) {
if (!showAlternativeButton) {
int i = this.width / 2 - 155;
int j = i + 160;
int k = this.height / 6 - 12 + 48;
this.addDrawableChild(new ButtonWidget(j, k, 150, 20, Text.translatable("midnightcontrols.menu.title.controller").append("..."), (button) -> {
this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
}));
}
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20,0,0,20, new Identifier("midnightcontrols", "textures/gui/midnightcontrols_button.png"), 32, 64, (button) -> {
this.client.setScreen(new MidnightControlsSettingsScreen(this, false));
}, Text.translatable("midnightcontrols.menu.title.controller")));
}
}

View File

@@ -11,6 +11,7 @@ package eu.midnightdust.midnightcontrols.client.mixin;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemGroups;
import net.minecraft.screen.slot.Slot;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -29,8 +30,8 @@ public interface CreativeInventoryScreenAccessor {
* @return the selected tab index
*/
@Accessor("selectedTab")
static int getSelectedTab() {
return 0;
static ItemGroup getSelectedTab() {
return ItemGroups.getDefaultTab();
}
/**

View File

@@ -0,0 +1,14 @@
package eu.midnightdust.midnightcontrols.client.mixin;
import net.minecraft.client.option.KeyBinding;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map;
@Mixin(KeyBinding.class)
public interface KeyBindingIDAccessor {
@Accessor @Final
static Map<String, KeyBinding> getKEYS_BY_ID() {return null;};
}

View File

@@ -22,8 +22,8 @@ import net.minecraft.item.ItemPlacementContext;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.Matrix4f;
import net.minecraft.util.shape.VoxelShape;
import org.joml.Matrix4f;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

View File

@@ -140,6 +140,7 @@
"midnightcontrols.menu.hud_side": "HUD Side",
"midnightcontrols.menu.invert_right_x_axis": "Invert Right X",
"midnightcontrols.menu.invert_right_y_axis": "Invert Right Y",
"midnightcontrols.menu.joystick_as_mouse": "Always use left stick as mouse",
"midnightcontrols.menu.keyboard_controls": "Keyboard Controls...",
"midnightcontrols.menu.left_dead_zone": "Left Stick Dead Zone",
"midnightcontrols.menu.mappings.open_input_str": "Open Mappings File Editor",
@@ -148,6 +149,7 @@
"midnightcontrols.menu.max_right_x_value": "Right X Axis Max Value",
"midnightcontrols.menu.max_right_y_value": "Right Y Axis Max Value",
"midnightcontrols.menu.mouse_speed": "Mouse Speed",
"midnightcontrols.menu.move_chat": "Move chat input box to top",
"midnightcontrols.menu.reacharound.horizontal": "Front Block Placing",
"midnightcontrols.menu.reacharound.vertical": "Vertical Reacharound",
"midnightcontrols.menu.reload_controller_mappings": "Reload Controller Mappings",
@@ -181,12 +183,14 @@
"midnightcontrols.tooltip.fly_drifting_vertical": "While flying, enables Vanilla vertical drifting/intertia.",
"midnightcontrols.tooltip.hud_enable": "Toggles the on-screen controller button indicator.",
"midnightcontrols.tooltip.hud_side": "The position of the HUD.",
"midnightcontrols.tooltip.joystick_as_mouse": "Make the joystick behave like a mouse in every menu.",
"midnightcontrols.tooltip.left_dead_zone": "The dead zone for the controller's left analog stick.",
"midnightcontrols.tooltip.max_left_x_value": "Changes what the mod considers the highest value for the left X axis. Useful if your axis does not use the full range and seems slow.",
"midnightcontrols.tooltip.max_left_y_value": "Changes what the mod considers the highest value for the left Y axis. Useful if your axis does not use the full range and seems slow.",
"midnightcontrols.tooltip.max_right_x_value": "Changes what the mod considers the highest value for the right X axis. Useful if your axis does not use the full range and seems slow.",
"midnightcontrols.tooltip.max_right_y_value": "Changes what the mod considers the highest value for the right Y axis. Useful if your axis does not use the full range and seems slow.",
"midnightcontrols.tooltip.mouse_speed": "The controller's emulated mouse speed.",
"midnightcontrols.tooltip.move_chat": "Moves the chat input field to the top, for better input on devices with on-screen keyboards.",
"midnightcontrols.tooltip.reacharound.horizontal": "Enables front block placing, §cmight be considered cheating on some servers§r.",
"midnightcontrols.tooltip.reacharound.vertical": "Enables vertical reacharound, §cmight be considered cheating on some servers§r.",
"midnightcontrols.tooltip.reload_controller_mappings": "Reloads the controller mappings file.",

View File

@@ -0,0 +1,152 @@
{
"key.midnightcontrols.look_down": "視角下移",
"key.midnightcontrols.look_left": "視角左移",
"key.midnightcontrols.look_right": "視角右移",
"key.midnightcontrols.look_up": "視角上移",
"key.midnightcontrols.ring": "顯示額外按鍵菜單",
"midnightcontrols.action.attack": "攻擊",
"midnightcontrols.action.back": "向後移動",
"midnightcontrols.action.chat": "打開聊天欄",
"midnightcontrols.action.drop_item": "丟棄所選物品",
"midnightcontrols.action.exit": "退出",
"midnightcontrols.action.forward": "向前移動",
"midnightcontrols.action.hit": "挖掘",
"midnightcontrols.action.hotbar_left": "向左循環選擇快捷欄",
"midnightcontrols.action.hotbar_right": "向右循環選擇快捷欄",
"midnightcontrols.action.inventory": "物品欄",
"midnightcontrols.action.jump": "跳躍",
"midnightcontrols.action.left": "向左移動",
"midnightcontrols.action.pause_game": "暫停遊戲",
"midnightcontrols.action.pick_block": "選取方塊",
"midnightcontrols.action.pickup": "拿取一個/拿取一半",
"midnightcontrols.action.pickup_all": "拿取一組/拿取全部",
"midnightcontrols.action.place": "放置方塊",
"midnightcontrols.action.player_list": "玩家列表",
"midnightcontrols.action.quick_move": "快速移動物品",
"midnightcontrols.action.right": "向右移動",
"midnightcontrols.action.screenshot": "截圖",
"midnightcontrols.action.sneak": "潛行",
"midnightcontrols.action.sprint": "疾跑",
"midnightcontrols.action.swap_hands": "與副手交換",
"midnightcontrols.action.toggle_perspective": "切換視角",
"midnightcontrols.action.toggle_smooth_camera": "切換電影視角",
"midnightcontrols.action.use": "使用物品/放置方塊",
"midnightcontrols.action.zoom": "視野縮放",
"midnightcontrols.action.zoom_in": "縮放時將視野推近",
"midnightcontrols.action.zoom_out": "縮放時將視野拉遠",
"midnightcontrols.action.zoom_reset": "縮放時重置縮放距離",
"midnightcontrols.button.a": "A",
"midnightcontrols.button.b": "B",
"midnightcontrols.button.x": "X",
"midnightcontrols.button.y": "Y",
"midnightcontrols.button.left_bumper": "LB 鍵",
"midnightcontrols.button.right_bumper": "RB 鍵",
"midnightcontrols.button.back": "選擇鍵",
"midnightcontrols.button.start": "開始鍵",
"midnightcontrols.button.guide": "功能鍵",
"midnightcontrols.button.left_thumb": "左搖桿(按壓)",
"midnightcontrols.button.right_thumb": "右搖桿(按壓)",
"midnightcontrols.button.dpad_up": "十字鍵上",
"midnightcontrols.button.dpad_right": "十字鍵右",
"midnightcontrols.button.dpad_down": "十字鍵下",
"midnightcontrols.button.dpad_left": "十字鍵左",
"midnightcontrols.axis.left_x+": "左搖桿右X軸正向",
"midnightcontrols.axis.left_y+": "左搖桿上Y軸正向",
"midnightcontrols.axis.right_x+": "右搖桿右X軸正向",
"midnightcontrols.axis.right_y+": "右搖桿上Y軸正向",
"midnightcontrols.axis.left_trigger": "左扳機鍵",
"midnightcontrols.axis.right_trigger": "右扳機鍵",
"midnightcontrols.axis.left_x-": "左搖桿左X軸負向",
"midnightcontrols.axis.left_y-": "左搖桿下Y軸負向",
"midnightcontrols.axis.right_x-": "右搖桿左X軸負向",
"midnightcontrols.axis.right_y-": "右搖桿下Y軸負向",
"midnightcontrols.button.unknown": "未知(%d",
"midnightcontrols.controller.connected": "手把 %d 已連接。",
"midnightcontrols.controller.disconnected": "手把 %d 已斷開。",
"midnightcontrols.controller.mappings.1": "請使用 %s 配置手把按鍵映射",
"midnightcontrols.controller.mappings.3": "並將按鍵映射文件放入此路徑:`%s.minecraft/config/gamecontrollerdb.txt%s`。",
"midnightcontrols.controller.mappings.error": "發生錯誤,無法讀取按鍵映射文件。",
"midnightcontrols.controller.mappings.error.write": "發生錯誤,無法保存按鍵映射文件。",
"midnightcontrols.controller.mappings.updated": "按鍵映射已更新!",
"midnightcontrols.controller_type.default": "默認",
"midnightcontrols.controller_type.dualshock": "DualShock",
"midnightcontrols.controller_type.switch": "Switch",
"midnightcontrols.controller_type.xbox": "Xbox",
"midnightcontrols.controller_type.steam": "Steam",
"midnightcontrols.controller_type.ouya": "OUYA",
"midnightcontrols.controls_mode.default": "鍵鼠",
"midnightcontrols.controls_mode.controller": "手把",
"midnightcontrols.controls_mode.touchscreen": "觸摸屏",
"midnightcontrols.hud_side.left": "左側",
"midnightcontrols.hud_side.right": "右側",
"midnightcontrols.menu.analog_movement": "識別搖桿輸入的精確值",
"midnightcontrols.menu.auto_switch_mode": "自動切換模式",
"midnightcontrols.menu.controller": "手把",
"midnightcontrols.menu.controller2": "額外手把",
"midnightcontrols.menu.controller_type": "手把類型",
"midnightcontrols.menu.controls_mode": "模式",
"midnightcontrols.menu.fast_block_placing": "方塊快速放置",
"midnightcontrols.menu.fly_drifting": "水平方向飛行慣性",
"midnightcontrols.menu.fly_drifting_vertical": "垂直方向飛行慣性",
"midnightcontrols.menu.hud_enable": "啟用HUD",
"midnightcontrols.menu.hud_side": "HUD位置",
"midnightcontrols.menu.invert_right_x_axis": "反轉右搖桿X軸",
"midnightcontrols.menu.invert_right_y_axis": "反轉右搖桿Y軸",
"midnightcontrols.menu.keyboard_controls": "鍵盤控制…",
"midnightcontrols.menu.left_dead_zone": "左搖桿死區",
"midnightcontrols.menu.mappings.open_input_str": "編輯按鍵映射文件",
"midnightcontrols.menu.max_left_x_value": "左搖桿X軸最大值識別範圍",
"midnightcontrols.menu.max_left_y_value": "左搖桿Y軸最大值識別範圍",
"midnightcontrols.menu.max_right_x_value": "右搖桿X軸最大值識別範圍",
"midnightcontrols.menu.max_right_y_value": "右搖桿Y軸最大值識別範圍",
"midnightcontrols.menu.mouse_speed": "鼠標移動速度",
"midnightcontrols.menu.reacharound.horizontal": "水平方向方塊放置輔助",
"midnightcontrols.menu.reacharound.vertical": "垂直方向方塊放置輔助",
"midnightcontrols.menu.reload_controller_mappings": "重新加載手把按鍵映射",
"midnightcontrols.menu.right_dead_zone": "右搖桿死區",
"midnightcontrols.menu.rotation_speed": "鏡頭旋轉速度 (X)",
"midnightcontrols.menu.y_axis_rotation_speed": "鏡頭旋轉速度 (Y)",
"midnightcontrols.menu.separator.controller": "手把",
"midnightcontrols.menu.separator.general": "通用",
"midnightcontrols.menu.title": "midnightcontrols — 設置",
"midnightcontrols.menu.title.controller": "手把選項",
"midnightcontrols.menu.title.controller_controls": "手把控制",
"midnightcontrols.menu.title.gameplay": "遊戲內容選項",
"midnightcontrols.menu.title.general": "通用選項",
"midnightcontrols.menu.title.hud": "HUD選項",
"midnightcontrols.menu.title.mappings.string": "編輯按鍵映射文件",
"midnightcontrols.menu.title.visual": "界面選項",
"midnightcontrols.menu.unfocused_input": "非活動狀態輸入",
"midnightcontrols.menu.virtual_mouse": "虛擬鼠標",
"midnightcontrols.menu.virtual_mouse.skin": "虛擬鼠標指針樣式",
"midnightcontrols.narrator.unbound": "取消綁定 %s",
"midnightcontrols.not_bound": "未綁定",
"midnightcontrols.tooltip.analog_movement": "若遊戲機制允許,則可根據推動搖桿的力度與幅度決定移動的速度。",
"midnightcontrols.tooltip.auto_switch_mode": "如果已有手把連接,則自動切換為手把操作模式。",
"midnightcontrols.tooltip.controller2": "使用額外的手把,比如將一左一右的兩個 Joy-Con 合為一個功能完全的手把。",
"midnightcontrols.tooltip.controller_type": "選擇手把類型,以顯示對應的按鍵圖標。",
"midnightcontrols.tooltip.controls_mode": "操作模式",
"midnightcontrols.tooltip.fast_block_placing": "在創造模式中處於飛行狀態時,可以根據你飛行的速度快速放置方塊。\n§c在部分服務器可能會被認定為作弊。",
"midnightcontrols.tooltip.fly_drifting": "處於飛行狀態時,啟用原版的水平方向飛行慣性(緩停滑行)。",
"midnightcontrols.tooltip.fly_drifting_vertical": "處於飛行狀態時,啟用原版的垂直方向飛行慣性(緩停滑行)。",
"midnightcontrols.tooltip.hud_enable": "顯示手把按鍵操作提示。",
"midnightcontrols.tooltip.hud_side": "HUD的位置位於畫面的哪一側。",
"midnightcontrols.tooltip.left_dead_zone": "左搖桿配置的死區。\n死區決定搖桿要偏離中心位置多遠才能讓搖桿的輸入有效。",
"midnightcontrols.tooltip.max_left_x_value": "更改左搖桿X軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值導致在識別搖桿輸入的精確值的情況下左右移動較為緩慢等問題本項可能會有所幫助。",
"midnightcontrols.tooltip.max_left_y_value": "更改左搖桿Y軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值導致在識別搖桿輸入的精確值的情況下前後移動較為緩慢等問題本項可能會有所幫助。",
"midnightcontrols.tooltip.max_right_x_value": "更改右搖桿X軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值導致鏡頭左右旋轉較為緩慢等問題本項可能會有所幫助。",
"midnightcontrols.tooltip.max_right_y_value": "更改右搖桿Y軸最大值的識別範圍。\n若感覺即便推滿搖桿也未達到最大的輸入值導致鏡頭上下旋轉較為緩慢等問題本項可能會有所幫助。",
"midnightcontrols.tooltip.mouse_speed": "手把模擬的鼠標的移動速度。",
"midnightcontrols.tooltip.reacharound.horizontal": "啟用水平方向方塊放置輔助,可在腳下方塊的前方放置方塊。\n§c在部分服務器可能會被認定為作弊。",
"midnightcontrols.tooltip.reacharound.vertical": "啟用垂直方向方塊放置輔助,可在腳下方塊的下方放置方塊。\n§c在部分服務器可能會被認定為作弊。",
"midnightcontrols.tooltip.reload_controller_mappings": "重新加載手把的按鍵映射文件。",
"midnightcontrols.tooltip.right_dead_zone": "右搖桿配置的死區。\n死區決定搖桿要偏離中心位置多遠才能讓搖桿的輸入有效。",
"midnightcontrols.tooltip.rotation_speed": "手把操作模式下的鏡頭旋轉速度。(X)",
"midnightcontrols.tooltip.y_axis_rotation_speed": "手把操作模式下的鏡頭旋轉速度。(Y)",
"midnightcontrols.tooltip.unfocused_input": "即使遊戲窗口處於非活動狀態,也允許手把進行按鍵輸入。",
"midnightcontrols.tooltip.virtual_mouse": "啟用虛擬鼠標,在分屏的情況下很有用。",
"midnightcontrols.virtual_mouse.skin.default_light": "默認樣式(白色)",
"midnightcontrols.virtual_mouse.skin.default_dark": "默認樣式(黑色)",
"midnightcontrols.virtual_mouse.skin.second_light": "額外樣式(白色)",
"midnightcontrols.virtual_mouse.skin.second_dark": "額外樣式(黑色)"
}

View File

@@ -11,15 +11,20 @@
"contributors": [
"akemin-dayo",
"DioEgizio",
"Ivanoks",
"KiskaUWU",
"RaptaG",
"Madis0",
"FlashyReese",
"Hambaka",
"joaoh1",
"dogtopus",
"egeesin",
"EnnuiL",
"egeesin"
"FlashyReese",
"gyular",
"Hambaka",
"Ivanoks",
"joaoh1",
"KiskaUWU",
"Madis0",
"RaptaG",
"ronniedude",
"spudpiggy",
"TrueHorse"
],
"contact": {
"homepage": "https://modrinth.com/mod/midnightcontrols",

View File

@@ -15,9 +15,11 @@
"KeyBindingMixin",
"MinecraftClientMixin",
"MouseMixin",
"ChatScreenMixin",
"RecipeBookWidgetAccessor",
"WorldRendererMixin",
"KeyBindingRegistryImplAccessor",
"KeyBindingIDAccessor",
"ScreenAccessor"
],
"injectors": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -1,6 +1,6 @@
{
"pack": {
"pack_format": 9,
"pack_format": 12,
"description": "Makes controller tooltips use similar icons to Bedrock Edition"
}
}

View File

@@ -1,6 +1,6 @@
{
"pack": {
"pack_format": 9,
"pack_format": 12,
"description": "Makes controller icons look similar to Legacy Console Edit."
}
}