mirror of
https://github.com/TeamMidnightDust/MidnightControls.git
synced 2025-12-13 23:25:10 +01:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c086ecfcef | ||
|
|
66cdca30fe | ||
|
|
6e49667ada | ||
|
|
d4c3208cee | ||
|
|
35a4fbee1b | ||
|
|
2aac2ad4e7 | ||
|
|
4b2919bfca | ||
|
|
1c999137ba |
18
build.gradle
18
build.gradle
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.0-SNAPSHOT'
|
id 'fabric-loom' version '1.1-SNAPSHOT'
|
||||||
id 'java-library'
|
id 'java-library'
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
id 'com.github.johnrengelman.shadow' version '7.0.0'
|
||||||
@@ -32,7 +32,7 @@ boolean isMCVersionNonRelease() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String getMCVersionString() {
|
String getMCVersionString() {
|
||||||
if (isMCVersionNonRelease() || project.minecraft_version == "1.19.3") {
|
if (isMCVersionNonRelease() || project.minecraft_version == "1.19.4") {
|
||||||
return project.minecraft_version
|
return project.minecraft_version
|
||||||
}
|
}
|
||||||
def version = project.minecraft_version.split('\\.')
|
def version = project.minecraft_version.split('\\.')
|
||||||
@@ -94,7 +94,9 @@ dependencies {
|
|||||||
// Fabric API. This is technically optional, but you probably want it anyway.
|
// Fabric API. This is technically optional, but you probably want it anyway.
|
||||||
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
|
||||||
|
|
||||||
modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}"
|
modImplementation ("dev.lambdaurora:spruceui:${project.spruceui_version}") {
|
||||||
|
exclude(group: "net.fabricmc.fabric-api")
|
||||||
|
}
|
||||||
include "dev.lambdaurora:spruceui:${project.spruceui_version}"
|
include "dev.lambdaurora:spruceui:${project.spruceui_version}"
|
||||||
api('org.aperlambda:lambdajcommon:1.8.1') {
|
api('org.aperlambda:lambdajcommon:1.8.1') {
|
||||||
exclude group: 'com.google.code.gson'
|
exclude group: 'com.google.code.gson'
|
||||||
@@ -102,7 +104,9 @@ dependencies {
|
|||||||
}
|
}
|
||||||
include 'org.aperlambda:lambdajcommon:1.8.1'
|
include 'org.aperlambda:lambdajcommon:1.8.1'
|
||||||
|
|
||||||
modCompileOnlyApi "com.terraformersmc:modmenu:${project.modmenu_version}"
|
modCompileOnlyApi ("com.terraformersmc:modmenu:${project.modmenu_version}") {
|
||||||
|
exclude(group: "net.fabricmc.fabric-api")
|
||||||
|
}
|
||||||
|
|
||||||
// Compatibility mods
|
// Compatibility mods
|
||||||
|
|
||||||
@@ -113,14 +117,14 @@ dependencies {
|
|||||||
modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}"
|
modCompileOnlyApi "io.github.cottonmc:LibGui:${project.libgui_version}"
|
||||||
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
|
modCompileOnlyApi "org.quiltmc:quilt-json5:1.0.0"
|
||||||
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
|
modCompileOnly "maven.modrinth:sodium:${project.sodium_version}"
|
||||||
modImplementation "maven.modrinth:emi:${project.emi_version}"
|
modCompileOnlyApi "maven.modrinth:emi:${project.emi_version}"
|
||||||
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
modCompileOnlyApi "maven.modrinth:emotecraft:${project.emotecraft_version}"
|
||||||
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
|
modCompileOnlyApi "io.github.kosmx:bendy-lib:${project.bendylib_version}"
|
||||||
modImplementation "dev.isxander:yet-another-config-lib:${project.yacl_version}"
|
modCompileOnlyApi "dev.isxander:yet-another-config-lib:${project.yacl_version}"
|
||||||
modCompileOnlyApi "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
|
modCompileOnlyApi "maven.modrinth:inventory-tabs-updated:${project.inventorytabs_version}"
|
||||||
modCompileOnlyApi "maven.modrinth:bedrockify:${project.bedrockify_version}"
|
modCompileOnlyApi "maven.modrinth:bedrockify:${project.bedrockify_version}"
|
||||||
// Required for Inventory Tabs
|
// Required for Inventory Tabs
|
||||||
modApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") {
|
modCompileOnlyApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") {
|
||||||
exclude(group: "net.fabricmc.fabric-api")
|
exclude(group: "net.fabricmc.fabric-api")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,22 +3,22 @@ org.gradle.jvmargs=-Xmx1G
|
|||||||
|
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check these on https://fabricmc.net/use
|
# check these on https://fabricmc.net/use
|
||||||
minecraft_version=1.19.3
|
minecraft_version=1.19.4
|
||||||
yarn_mappings=1.19.3+build.5
|
yarn_mappings=1.19.4+build.1
|
||||||
loader_version=0.14.12
|
loader_version=0.14.17
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version = 1.7.3
|
mod_version = 1.8.1
|
||||||
maven_group = eu.midnightdust
|
maven_group = eu.midnightdust
|
||||||
archives_base_name = midnightcontrols
|
archives_base_name = midnightcontrols
|
||||||
modrinth_id=bXX9h73M
|
modrinth_id=bXX9h73M
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
|
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
|
||||||
fabric_version=0.71.0+1.19.3
|
fabric_version=0.75.3+1.19.4
|
||||||
sodium_version=mc1.19.2-0.4.4
|
sodium_version=mc1.19.2-0.4.4
|
||||||
spruceui_version=4.1.0+1.19.3
|
spruceui_version=4.2.0+1.19.4
|
||||||
midnightlib_version=1.1.0-fabric
|
midnightlib_version=1.2.1-fabric
|
||||||
modmenu_version=5.0.1
|
modmenu_version=5.0.1
|
||||||
emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric
|
emotecraft_version=2.1.3-SNAPSHOT-build.29-MC1.19-fabric
|
||||||
bendylib_version=2.0.+
|
bendylib_version=2.0.+
|
||||||
|
|||||||
@@ -144,6 +144,14 @@ public class MidnightControlsClient extends MidnightControls implements ClientMo
|
|||||||
public void onMcInit(@NotNull MinecraftClient client) {
|
public void onMcInit(@NotNull MinecraftClient client) {
|
||||||
ButtonBinding.init(client.options);
|
ButtonBinding.init(client.options);
|
||||||
MidnightControlsConfig.load();
|
MidnightControlsConfig.load();
|
||||||
|
if (MidnightControlsConfig.configVersion < 2) {
|
||||||
|
MidnightControlsConfig.mouseScreens.remove("me.jellysquid.mods.sodium.client.gui");
|
||||||
|
MidnightControlsConfig.mouseScreens.remove("net.coderbot.iris.gui");
|
||||||
|
MidnightControlsConfig.mouseScreens.remove("net.minecraft.class_5375");
|
||||||
|
MidnightControlsConfig.mouseScreens.remove("net.minecraft.client.gui.screen.pack.PackScreen");
|
||||||
|
MidnightControlsConfig.configVersion = 2;
|
||||||
|
MidnightControlsConfig.write("midnightcontrols");
|
||||||
|
}
|
||||||
this.hud.setVisible(MidnightControlsConfig.hudEnable);
|
this.hud.setVisible(MidnightControlsConfig.hudEnable);
|
||||||
Controller.updateMappings();
|
Controller.updateMappings();
|
||||||
GLFW.glfwSetJoystickCallback((jid, event) -> {
|
GLFW.glfwSetJoystickCallback((jid, event) -> {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ package eu.midnightdust.midnightcontrols.client;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.mojang.blaze3d.platform.GlDebugInfo;
|
||||||
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.MidnightControlsFeature;
|
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
|
||||||
@@ -33,58 +34,61 @@ import static org.lwjgl.glfw.GLFW.*;
|
|||||||
*/
|
*/
|
||||||
public class MidnightControlsConfig extends MidnightConfig {
|
public class MidnightControlsConfig extends MidnightConfig {
|
||||||
public static boolean isEditing = false;
|
public static boolean isEditing = false;
|
||||||
@Hidden @Entry public static int configVersion = 1;
|
@Hidden @Entry public static int configVersion = 2;
|
||||||
// General
|
// General
|
||||||
@Entry(name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT;
|
@Entry(category = "controller", name = "midnightcontrols.menu.controls_mode") public static ControlsMode controlsMode = ControlsMode.DEFAULT;
|
||||||
@Entry(name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true;
|
@Entry(category = "controller", name = "midnightcontrols.menu.auto_switch_mode") public static boolean autoSwitchMode = true;
|
||||||
@Entry(name = "Debug") public static boolean debug = false;
|
@Entry(category = "misc", name = "Debug") public static boolean debug = false;
|
||||||
// HUD
|
// HUD
|
||||||
@Entry(name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true;
|
@Entry(category = "visual", name = "midnightcontrols.menu.hud_enable") public static boolean hudEnable = true;
|
||||||
@Entry(name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT;
|
@Entry(category = "visual", name = "midnightcontrols.menu.hud_side") public static HudSide hudSide = HudSide.LEFT;
|
||||||
@Entry(name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false;
|
@Entry(category = "screens", name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false;
|
||||||
// Gameplay
|
// Gameplay
|
||||||
@Entry(name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true;
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.analog_movement") public static boolean analogMovement = true;
|
||||||
@Entry(name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true;
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.double_tap_to_sprint") public static boolean doubleTapToSprint = true;
|
||||||
@Entry(name = "midnightcontrols.menu.controller_toggle_sneak") public static boolean controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue();
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.controller_toggle_sneak") public static boolean controllerToggleSneak = MinecraftClient.getInstance().options.getSneakToggled().getValue();
|
||||||
@Entry(name = "midnightcontrols.menu.controller_toggle_sprint") public static boolean controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue();
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.controller_toggle_sprint") public static boolean controllerToggleSprint = MinecraftClient.getInstance().options.getSprintToggled().getValue();
|
||||||
@Entry(name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.fast_block_placing") public static boolean fastBlockPlacing = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods.
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.fly_drifting") public static boolean flyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers. It can also conflict with some other mods.
|
||||||
@Entry(name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers.
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.fly_drifting_vertical") public static boolean verticalFlyDrifting = true; // Enabled by default as disabling this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(name = "midnightcontrols.menu.reacharound.horizontal") public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.reacharound.horizontal") public static boolean horizontalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(name = "midnightcontrols.menu.reacharound.vertical") public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
@Entry(category = "gameplay", name = "midnightcontrols.menu.reacharound.vertical") public static boolean verticalReacharound = false; // Disabled by default as this behaviour can be considered cheating on multiplayer servers.
|
||||||
@Entry(name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true;
|
@Entry(category = "visual", name = "Reacharound Outline") public static boolean shouldRenderReacharoundOutline = true;
|
||||||
@Entry(name = "Reacharound Outline Color (WIP)", isColor = true) public static String reacharoundOutlineColorHex = "#ffffff";
|
@Entry(category = "visual", name = "Reacharound Outline Color", isColor = true) public static String reacharoundOutlineColorHex = "#ffffff";
|
||||||
@Entry(name = "Reacharound Outline Alpha", min = 0, max = 255) public static int reacharoundOutlineColorAlpha = 102;
|
@Entry(category = "visual", name = "Reacharound Outline Alpha", isSlider = true, min = 0, max = 255) public static int reacharoundOutlineColorAlpha = 102;
|
||||||
@Entry(name = "midnightcontrols.menu.right_dead_zone") public static double rightDeadZone = 0.25;
|
@Entry(category = "controller", name = "midnightcontrols.menu.right_dead_zone", isSlider = true, min = 0.05, max = 1) public static double rightDeadZone = 0.25;
|
||||||
@Entry(name = "midnightcontrols.menu.left_dead_zone") public static double leftDeadZone = 0.25;
|
@Entry(category = "controller", name = "midnightcontrols.menu.left_dead_zone", isSlider = true, min = 0.05, max = 1) public static double leftDeadZone = 0.25;
|
||||||
@Entry(name = "midnightcontrols.menu.invert_right_y_axis") public static boolean invertRightYAxis = false;
|
@Entry(category = "controller", 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(category = "controller", name = "midnightcontrols.menu.invert_right_x_axis") public static boolean invertRightXAxis = false;
|
||||||
@Entry(name = "midnightcontrols.menu.rotation_speed") public static double rotationSpeed = 40.0; //used for x-axis, name kept for compatability
|
@Entry(category = "controller", name = "midnightcontrols.menu.rotation_speed", isSlider = true, min = 0, max = 100, precision = 10) public static double rotationSpeed = 40.0; //used for x-axis, name kept for compatibility
|
||||||
@Entry(name = "midnightcontrols.menu.y_axis_rotation_speed") public static double yAxisRotationSpeed = rotationSpeed;
|
@Entry(category = "controller", name = "midnightcontrols.menu.y_axis_rotation_speed", isSlider = true, min = 0, max = 100, precision = 10) public static double yAxisRotationSpeed = rotationSpeed;
|
||||||
@Entry(name = "midnightcontrols.menu.mouse_speed") public static double mouseSpeed = 25.0;
|
@Entry(category = "screens", name = "midnightcontrols.menu.mouse_speed", isSlider = true, min = 0, max = 150, precision = 10) public static double mouseSpeed = 25.0;
|
||||||
@Entry(name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = false;
|
@Entry(category = "screens", name = "midnightcontrols.menu.joystick_as_mouse") public static boolean joystickAsMouse = false;
|
||||||
@Entry(name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
|
@Entry(category = "controller", name = "midnightcontrols.menu.unfocused_input") public static boolean unfocusedInput = false;
|
||||||
@Entry(name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
|
@Entry(category = "screens", name = "midnightcontrols.menu.virtual_mouse") public static boolean virtualMouse = false;
|
||||||
@Entry(name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
|
@Entry(category = "screens", name = "midnightcontrols.menu.virtual_mouse.skin") public static VirtualMouseSkin virtualMouseSkin = VirtualMouseSkin.DEFAULT_LIGHT;
|
||||||
@Entry(name = "Controller ID") public static Object controllerID = 0;
|
@Entry(category = "controller", name = "Controller ID") @Hidden public static Object controllerID = 0;
|
||||||
@Entry(name = "2nd Controller ID") public static Object secondControllerID = -1;
|
@Entry(category = "controller", name = "2nd Controller ID") @Hidden public static Object secondControllerID = -1;
|
||||||
@Entry(name = "midnightcontrols.menu.controller_type") public static ControllerType controllerType = ControllerType.DEFAULT;
|
@Entry(category = "visual", 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",
|
@Entry(category = "screens", name = "Mouse screens") public static List<String> mouseScreens = Lists.newArrayList("net.minecraft.client.gui.screen.advancement",
|
||||||
"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",
|
"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",
|
"hardcorequesting.client.interfaces.GuiQuestBook", "hardcorequesting.client.interfaces.GuiReward", "hardcorequesting.client.interfaces.EditTrackerScreen",
|
||||||
"me.shedaniel.clothconfig2.gui.ClothConfigScreen", "com.mamiyaotaru.voxelmap.gui.GuiWaypoints", "com.mamiyaotaru.voxelmap.gui.GuiPersistentMap");
|
"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(category = "screens", 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(category = "screens", 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<>();
|
@Entry @Hidden public static Map<String, String> BINDING = 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[]{1, 1, 1, 1};
|
@Deprecated @Hidden @Entry public static double[] maxAnalogValues = new double[]{1, 1, 1, 1};
|
||||||
@Entry(name = "Trigger button fix") public static boolean triggerFix = true;
|
@Entry(category = "controller", name = "Max analog value: Left X", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueLeftX = maxAnalogValues[0];
|
||||||
@Entry(name = "Enable Hints") public static boolean enableHints = true;
|
@Entry(category = "controller", name = "Max analog value: Left Y", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueLeftY = maxAnalogValues[1];
|
||||||
@Entry(name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true;
|
@Entry(category = "controller", name = "Max analog value: Right X", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueRightX = maxAnalogValues[2];
|
||||||
@Entry(name = "Ring Bindings (WIP)") public static List<String> ringBindings = new ArrayList<>();
|
@Entry(category = "controller", name = "Max analog value: Right Y", isSlider = true, min = .25f, max = 1.f) public static double maxAnalogValueRightY = maxAnalogValues[3];
|
||||||
@Entry(name = "Ignored Unbound Keys") public static List<String> ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab");
|
@Entry(category = "controller", name = "Trigger button fix") public static boolean triggerFix = true;
|
||||||
|
@Entry(category = "gameplay", name = "Enable Hints") public static boolean enableHints = true;
|
||||||
|
@Entry(category = "screens", name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true;
|
||||||
|
@Entry(category = "misc", name = "Ring Bindings (WIP)") public static List<String> ringBindings = new ArrayList<>();
|
||||||
|
@Entry(category = "misc", name = "Ignored Unbound Keys") public static List<String> ignoredUnboundKeys = Lists.newArrayList("inventorytabs.key.next_tab");
|
||||||
@Entry @Hidden public static Map<String, Map<String, String>> controllerBindingProfiles = new HashMap<>();
|
@Entry @Hidden public static Map<String, Map<String, String>> controllerBindingProfiles = new HashMap<>();
|
||||||
private static Map<String, String> currentBindingProfile = new HashMap<>();
|
private static Map<String, String> currentBindingProfile = new HashMap<>();
|
||||||
private static Controller prevController;
|
private static Controller prevController;
|
||||||
@@ -198,14 +202,21 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static double getAxisMaxValue(int axis) {
|
public static double getAxisMaxValue(int axis) {
|
||||||
if (axis >= MidnightControlsConfig.maxAnalogValues.length)
|
return switch (axis) {
|
||||||
return 1;
|
case GLFW_GAMEPAD_AXIS_LEFT_X -> MidnightControlsConfig.maxAnalogValueLeftX;
|
||||||
return MidnightControlsConfig.maxAnalogValues[axis];
|
case GLFW_GAMEPAD_AXIS_LEFT_Y -> MidnightControlsConfig.maxAnalogValueLeftY;
|
||||||
|
case GLFW_GAMEPAD_AXIS_RIGHT_X -> MidnightControlsConfig.maxAnalogValueRightX;
|
||||||
|
default -> MidnightControlsConfig.maxAnalogValueRightY;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setAxisMaxValue(int axis, double value) {
|
public static void setAxisMaxValue(int axis, double value) {
|
||||||
if (axis < MidnightControlsConfig.maxAnalogValues.length)
|
switch (axis) {
|
||||||
MidnightControlsConfig.maxAnalogValues[axis] = value;
|
case GLFW_GAMEPAD_AXIS_LEFT_X -> MidnightControlsConfig.maxAnalogValueLeftX = value;
|
||||||
|
case GLFW_GAMEPAD_AXIS_LEFT_Y -> MidnightControlsConfig.maxAnalogValueLeftY = value;
|
||||||
|
case GLFW_GAMEPAD_AXIS_RIGHT_X -> MidnightControlsConfig.maxAnalogValueRightX = value;
|
||||||
|
default -> MidnightControlsConfig.maxAnalogValueRightY = value;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -330,9 +341,12 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
controllerID = 0;
|
controllerID = 0;
|
||||||
secondControllerID = -1;
|
secondControllerID = -1;
|
||||||
controllerType = ControllerType.DEFAULT;
|
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", "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");
|
mouseScreens = Lists.newArrayList("net.minecraft.client.gui.screen.advancement", "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<>();
|
BINDING = new HashMap<>();
|
||||||
maxAnalogValues = new double[]{1, 1, 1, 1};
|
maxAnalogValueLeftX = 1;
|
||||||
|
maxAnalogValueLeftY = 1;
|
||||||
|
maxAnalogValueRightX = 1;
|
||||||
|
maxAnalogValueRightY = 1;
|
||||||
triggerFix = true;
|
triggerFix = true;
|
||||||
enableHints = true;
|
enableHints = true;
|
||||||
shortcutInControls = true;
|
shortcutInControls = true;
|
||||||
@@ -350,7 +364,7 @@ public class MidnightControlsConfig extends MidnightConfig {
|
|||||||
String controller = getController().getName().toLowerCase();
|
String controller = getController().getName().toLowerCase();
|
||||||
if (controller.contains("xbox 360")) return ControllerType.XBOX_360;
|
if (controller.contains("xbox 360")) return ControllerType.XBOX_360;
|
||||||
else if (controller.contains("xbox") || controller.contains("afterglow")) return ControllerType.XBOX;
|
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") && GlDebugInfo.getCpuInfo().contains("AMD Custom APU")) return ControllerType.STEAM_DECK;
|
||||||
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
|
else if (controller.contains("steam")) return ControllerType.STEAM_CONTROLLER;
|
||||||
else if (controller.contains("dualsense") || controller.contains("ps5")) 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("dualshock") || controller.contains("ps4") || controller.contains("sony")) return ControllerType.DUALSHOCK;
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ public class MidnightInput {
|
|||||||
private static final Map<Integer, Integer> BUTTON_COOLDOWNS = new HashMap<>();
|
private static final Map<Integer, Integer> BUTTON_COOLDOWNS = new HashMap<>();
|
||||||
// Cooldowns
|
// Cooldowns
|
||||||
public int actionGuiCooldown = 0;
|
public int actionGuiCooldown = 0;
|
||||||
|
public int joystickCooldown = 0;
|
||||||
public boolean ignoreNextARelease = false;
|
public boolean ignoreNextARelease = false;
|
||||||
public boolean ignoreNextXRelease = false;
|
public boolean ignoreNextXRelease = false;
|
||||||
private double targetYaw = 0.0;
|
private double targetYaw = 0.0;
|
||||||
@@ -126,6 +127,8 @@ public class MidnightInput {
|
|||||||
--this.actionGuiCooldown;
|
--this.actionGuiCooldown;
|
||||||
if (this.screenCloseCooldown > 0)
|
if (this.screenCloseCooldown > 0)
|
||||||
--this.screenCloseCooldown;
|
--this.screenCloseCooldown;
|
||||||
|
if (this.joystickCooldown > 0)
|
||||||
|
--this.joystickCooldown;
|
||||||
|
|
||||||
InputManager.updateStates();
|
InputManager.updateStates();
|
||||||
|
|
||||||
@@ -327,15 +330,13 @@ public class MidnightInput {
|
|||||||
&& (button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_DOWN
|
&& (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)) {
|
|| button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT || button == GLFW.GLFW_GAMEPAD_BUTTON_DPAD_RIGHT)) {
|
||||||
if (this.actionGuiCooldown == 0) {
|
if (this.actionGuiCooldown == 0) {
|
||||||
if (MidnightControlsConfig.arrowScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
|
switch (button) {
|
||||||
switch (button) {
|
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> this.changeFocus(client.currentScreen, NavigationDirection.UP);
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> pressKeyboardKey(client, GLFW.GLFW_KEY_UP);
|
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> this.changeFocus(client.currentScreen, NavigationDirection.DOWN);
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN -> pressKeyboardKey(client, GLFW.GLFW_KEY_DOWN);
|
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> this.handleLeftRight(client.currentScreen, false);
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT -> pressKeyboardKey(client, GLFW.GLFW_KEY_LEFT);
|
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> this.handleLeftRight(client.currentScreen, true);
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_RIGHT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (MidnightControlsConfig.wasdScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
|
if (MidnightControlsConfig.wasdScreens.contains(client.currentScreen.getClass().getCanonicalName())) {
|
||||||
switch (button) {
|
switch (button) {
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_UP -> pressKeyboardKey(client, GLFW.GLFW_KEY_W);
|
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_DOWN -> pressKeyboardKey(client, GLFW.GLFW_KEY_S);
|
||||||
@@ -343,11 +344,6 @@ public class MidnightInput {
|
|||||||
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT -> pressKeyboardKey(client, GLFW.GLFW_KEY_D);
|
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);
|
|
||||||
} else this.handleLeftRight(client.currentScreen, button != GLFW.GLFW_GAMEPAD_BUTTON_DPAD_LEFT);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -426,6 +422,9 @@ public class MidnightInput {
|
|||||||
public void pressKeyboardKey(MinecraftClient client, int key) {
|
public void pressKeyboardKey(MinecraftClient client, int key) {
|
||||||
client.keyboard.onKey(client.getWindow().getHandle(), key, 0, 1, 0);
|
client.keyboard.onKey(client.getWindow().getHandle(), key, 0, 1, 0);
|
||||||
}
|
}
|
||||||
|
public void pressKeyboardKey(Screen screen, int key) {
|
||||||
|
screen.keyPressed(key, 0, 1);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -571,9 +570,8 @@ public class MidnightInput {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (client.currentScreen != null) {
|
} else if (client.currentScreen != null) {
|
||||||
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone) {
|
float finalValue = value;
|
||||||
float finalValue = value;
|
if (axis == GLFW_GAMEPAD_AXIS_RIGHT_Y && absValue >= deadZone && client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
|
||||||
if (client.currentScreen.children().stream().filter(element -> element instanceof SpruceEntryListWidget)
|
|
||||||
.map(element -> (SpruceEntryListWidget<?>) element)
|
.map(element -> (SpruceEntryListWidget<?>) element)
|
||||||
.filter(AbstractSpruceWidget::isFocusedOrHovered)
|
.filter(AbstractSpruceWidget::isFocusedOrHovered)
|
||||||
.noneMatch(element -> {
|
.noneMatch(element -> {
|
||||||
@@ -591,7 +589,20 @@ public class MidnightInput {
|
|||||||
{
|
{
|
||||||
client.currentScreen.mouseScrolled(0.0, 0.0, -(value * 1.5f));
|
client.currentScreen.mouseScrolled(0.0, 0.0, -(value * 1.5f));
|
||||||
}
|
}
|
||||||
|
else if (isScreenInteractive(client.currentScreen) && absValue >= deadZone) {
|
||||||
|
if (value > 0 && joystickCooldown == 0) {
|
||||||
|
switch (axis) {
|
||||||
|
case GLFW_GAMEPAD_AXIS_LEFT_Y -> this.changeFocus(client.currentScreen, NavigationDirection.UP);
|
||||||
|
case GLFW_GAMEPAD_AXIS_LEFT_X -> this.handleLeftRight(client.currentScreen, true);
|
||||||
|
}
|
||||||
|
if (axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X) joystickCooldown = 4;
|
||||||
|
} else if (value < 0 && joystickCooldown == 0) {
|
||||||
|
switch (axis) {
|
||||||
|
case GLFW_GAMEPAD_AXIS_LEFT_Y -> this.changeFocus(client.currentScreen, NavigationDirection.DOWN);
|
||||||
|
case GLFW_GAMEPAD_AXIS_LEFT_X -> this.handleLeftRight(client.currentScreen, false);
|
||||||
|
}
|
||||||
|
if (axis == GLFW_GAMEPAD_AXIS_LEFT_Y || axis == GLFW_GAMEPAD_AXIS_LEFT_X) joystickCooldown = 4;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -695,6 +706,7 @@ public class MidnightInput {
|
|||||||
} else if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) {
|
} else if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else pressKeyboardKey(screen, GLFW_KEY_ENTER);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,11 +740,13 @@ public class MidnightInput {
|
|||||||
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
|
return !spruceElement.onNavigation(right ? NavigationDirection.RIGHT : NavigationDirection.LEFT, false);
|
||||||
}
|
}
|
||||||
if (element instanceof SliderWidget slider) {
|
if (element instanceof SliderWidget slider) {
|
||||||
slider.keyPressed(right ? 262 : 263, 0, 0);
|
if (slider.active) {
|
||||||
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
slider.keyPressed(right ? 262 : 263, 0, 0);
|
||||||
return false;
|
this.actionGuiCooldown = 2; // Prevent to press too quickly the focused element, so we have to skip 5 ticks.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
} else if (element instanceof AlwaysSelectedEntryListWidget) {
|
} else if (element instanceof AlwaysSelectedEntryListWidget) {
|
||||||
((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP);
|
//TODO((EntryListWidgetAccessor) element).midnightcontrols$moveSelection(right ? EntryListWidget.MoveDirection.DOWN : EntryListWidget.MoveDirection.UP);
|
||||||
return false;
|
return false;
|
||||||
} else if (element instanceof ParentElement entryList) {
|
} else if (element instanceof ParentElement entryList) {
|
||||||
var focused = entryList.getFocused();
|
var focused = entryList.getFocused();
|
||||||
@@ -781,81 +795,14 @@ public class MidnightInput {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (FabricLoader.getInstance().isModLoaded("sodium"))
|
switch (direction) {
|
||||||
SodiumCompat.handleInput(screen, direction.isLookingForward());
|
case UP -> pressKeyboardKey(screen, GLFW.GLFW_KEY_UP);
|
||||||
// This still needs some work
|
case DOWN -> pressKeyboardKey(screen, GLFW.GLFW_KEY_DOWN);
|
||||||
// ScreenAccessor accessor = (ScreenAccessor) screen;
|
case LEFT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_LEFT);
|
||||||
// if (accessor.getSelected() != null && accessor.getSelected() instanceof ClickableWidget selected && accessor.getSelectables() != null) {
|
case RIGHT -> pressKeyboardKey(screen, GLFW.GLFW_KEY_RIGHT);
|
||||||
// //System.out.println(direction);
|
|
||||||
// if (accessor.getSelectables().size() >= 2) {
|
|
||||||
// //System.out.println(direction + " 2");
|
|
||||||
// int xDifference = Integer.MAX_VALUE;
|
|
||||||
// int yDifference = Integer.MAX_VALUE;
|
|
||||||
// ClickableWidget newWidget = null;
|
|
||||||
// for (int i = 0; i < accessor.getSelectables().size(); ++i) {
|
|
||||||
// if (accessor.getSelectables().get(i) instanceof ClickableWidget candidate) {
|
|
||||||
// if (!(candidate.x == selected.x && candidate.y == selected.y)) {
|
|
||||||
// int canXDifference = Math.abs(candidate.x - selected.x);
|
|
||||||
// int canYDifference = Math.abs(candidate.y - selected.y);
|
|
||||||
// if (direction.isHorizontal()) {
|
|
||||||
// if (direction.isLookingForward()) {
|
|
||||||
// if (candidate.x >= selected.x && canYDifference <= yDifference && canXDifference <= xDifference) {
|
|
||||||
// System.out.println(direction + " forward horizontal " + candidate);
|
|
||||||
// newWidget = candidate;
|
|
||||||
// xDifference = canXDifference;
|
|
||||||
// yDifference = canYDifference;
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// if (candidate.x <= selected.x && canYDifference <= yDifference && canXDifference >= xDifference) {
|
|
||||||
// System.out.println(direction + " backward horizontal " + candidate);
|
|
||||||
// newWidget = candidate;
|
|
||||||
// xDifference = canXDifference;
|
|
||||||
// yDifference = canYDifference;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// if (direction.isLookingForward()) {
|
|
||||||
// if (candidate.y >= selected.y && canYDifference <= yDifference && canXDifference <= xDifference) {
|
|
||||||
// System.out.println(direction + " forward vertical " + candidate);
|
|
||||||
// newWidget = candidate;
|
|
||||||
// xDifference = canXDifference;
|
|
||||||
// yDifference = canYDifference;
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// if (candidate.y <= selected.y && canYDifference >= yDifference && canXDifference <= xDifference) {
|
|
||||||
// System.out.println(direction + " backward vertical " + candidate);
|
|
||||||
// newWidget = candidate;
|
|
||||||
// xDifference = canXDifference;
|
|
||||||
// yDifference = canYDifference;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (newWidget != null) {
|
|
||||||
// //selected.changeFocus(true);
|
|
||||||
// ((ClickableWidgetAccessor) selected).setFocused(false);
|
|
||||||
// ((ClickableWidgetAccessor) newWidget).setFocused(true);
|
|
||||||
// screen.setFocused(newWidget);
|
|
||||||
// screen.changeFocus(false);
|
|
||||||
// screen.changeFocus(true);
|
|
||||||
// this.actionGuiCooldown = 5;
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
if (!screen.changeFocus(direction.isLookingForward())) {
|
|
||||||
if (screen.changeFocus(direction.isLookingForward())) {
|
|
||||||
this.actionGuiCooldown = 5;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
this.actionGuiCooldown = 5;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
this.actionGuiCooldown = 5;
|
||||||
|
return false;
|
||||||
} catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);}
|
} catch (Exception exception) {MidnightControls.get().warn("Unknown exception encountered while trying to change focus: "+exception);}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,31 +120,39 @@ public class MidnightReacharound {
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS
|
if (client.player != null && client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.MISS
|
||||||
&& client.player.isOnGround() && client.player.getPitch(0.f) > 35.f) {
|
&& client.player.isOnGround() && client.player.getPitch(0.f) >= 35.f) {
|
||||||
if (client.player.isRiding())
|
if (client.player.isRiding())
|
||||||
return null;
|
return null;
|
||||||
var playerPos = client.player.getBlockPos().down();
|
// Temporary pos, do not use
|
||||||
|
Vec3d playerPosi = client.player.getPos();
|
||||||
|
|
||||||
|
// Imitates var playerPos = client.player.getBlockPos().down();
|
||||||
|
Vec3d playerPos = new Vec3d(playerPosi.getX(), playerPosi.getY() - 1.0, playerPosi.getZ());
|
||||||
if (client.player.getY() - playerPos.getY() - 1.0 >= 0.25) {
|
if (client.player.getY() - playerPos.getY() - 1.0 >= 0.25) {
|
||||||
playerPos = playerPos.up();
|
// Imitates playerPos = playerPos.up();
|
||||||
|
playerPos = playerPosi;
|
||||||
this.onSlab = true;
|
this.onSlab = true;
|
||||||
} else {
|
} else {
|
||||||
this.onSlab = false;
|
this.onSlab = false;
|
||||||
}
|
}
|
||||||
var targetPos = new BlockPos(client.crosshairTarget.getPos()).subtract(playerPos);
|
var targetPos = new Vec3d(client.crosshairTarget.getPos().getX(), client.crosshairTarget.getPos().getY(), client.crosshairTarget.getPos().getZ()).subtract(playerPos);
|
||||||
var vector = new BlockPos.Mutable(MathHelper.clamp(targetPos.getX(), -1, 1), 0, MathHelper.clamp(targetPos.getZ(), -1, 1));
|
var vector = new Vec3d(MathHelper.clamp(targetPos.getX(), -1, 1), 0, MathHelper.clamp(targetPos.getZ(), -1, 1));
|
||||||
var blockPos = playerPos.add(vector);
|
var blockPos = playerPos.add(vector);
|
||||||
|
|
||||||
|
// Some functions still need BlockPos, so this is here to let that happen
|
||||||
|
var blockyPos = BlockPos.ofFloored(blockPos);
|
||||||
|
|
||||||
var direction = client.player.getHorizontalFacing();
|
var direction = client.player.getHorizontalFacing();
|
||||||
|
|
||||||
var state = client.world.getBlockState(blockPos);
|
var state = client.world.getBlockState(blockyPos);
|
||||||
if (!state.isAir())
|
if (!state.isAir())
|
||||||
return null;
|
return null;
|
||||||
var adjacentBlockState = client.world.getBlockState(blockPos.offset(direction.getOpposite()));
|
var adjacentBlockState = client.world.getBlockState(blockyPos.offset(direction.getOpposite()));
|
||||||
if (adjacentBlockState.isAir() || adjacentBlockState.getBlock() instanceof FluidBlock || (vector.getX() == 0 && vector.getZ() == 0)) {
|
if (adjacentBlockState.isAir() || adjacentBlockState.getBlock() instanceof FluidBlock || (vector.getX() == 0 && vector.getZ() == 0)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new BlockHitResult(new Vec3d(blockPos.getX(),blockPos.getY(),blockPos.getZ()), direction, blockPos, false);
|
return new BlockHitResult(blockPos, direction, blockyPos, false);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ 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("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium"));
|
//this.putConditionalMixin("SodiumOptionsGUIAccessor", FabricLoader.getInstance().isModLoaded("sodium"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void putConditionalMixin(@NotNull String path, boolean condition) {
|
private void putConditionalMixin(@NotNull String path, boolean condition) {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.controller;
|
package eu.midnightdust.midnightcontrols.client.controller;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
import eu.midnightdust.midnightcontrols.client.ButtonState;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
|
||||||
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
|
||||||
@@ -21,6 +22,7 @@ import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
|
|||||||
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor;
|
import eu.midnightdust.midnightcontrols.client.mixin.RecipeBookWidgetAccessor;
|
||||||
|
import eu.midnightdust.midnightcontrols.client.mixin.TabNavigationWidgetAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.HandledScreenAccessor;
|
||||||
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
import eu.midnightdust.midnightcontrols.client.util.MouseAccessor;
|
||||||
import net.fabricmc.fabric.impl.client.itemgroup.CreativeGuiExtensions;
|
import net.fabricmc.fabric.impl.client.itemgroup.CreativeGuiExtensions;
|
||||||
@@ -33,7 +35,9 @@ import net.minecraft.client.gui.screen.TitleScreen;
|
|||||||
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
import net.minecraft.client.gui.screen.advancement.AdvancementsScreen;
|
||||||
import net.minecraft.client.gui.screen.ingame.*;
|
import net.minecraft.client.gui.screen.ingame.*;
|
||||||
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
|
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
|
||||||
|
import net.minecraft.client.gui.tab.TabManager;
|
||||||
import net.minecraft.client.gui.widget.PressableWidget;
|
import net.minecraft.client.gui.widget.PressableWidget;
|
||||||
|
import net.minecraft.client.gui.widget.TabNavigationWidget;
|
||||||
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.ItemGroups;
|
import net.minecraft.item.ItemGroups;
|
||||||
@@ -67,7 +71,7 @@ public class InputHandlers {
|
|||||||
return ItemGroupHelper.sortedGroups.stream()
|
return ItemGroupHelper.sortedGroups.stream()
|
||||||
.filter(itemGroup -> {
|
.filter(itemGroup -> {
|
||||||
if (FabricCreativeGuiComponents.COMMON_GROUPS.contains(itemGroup)) return true;
|
if (FabricCreativeGuiComponents.COMMON_GROUPS.contains(itemGroup)) return true;
|
||||||
return ((CreativeGuiExtensions)screen).fabric_currentPage() == ((FabricItemGroup)itemGroup).getPage() && itemGroup.shouldDisplay() && (!itemGroup.equals(ItemGroups.OPERATOR) || ItemGroups.operatorEnabled);
|
return ((CreativeGuiExtensions)screen).fabric_currentPage() == ((FabricItemGroup)itemGroup).getPage() && itemGroup.shouldDisplay();
|
||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +165,19 @@ public class InputHandlers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
} else if (client.currentScreen != null && client.currentScreen.children().stream().anyMatch(e -> e instanceof TabNavigationWidget)) {
|
||||||
|
return Lists.newCopyOnWriteArrayList(client.currentScreen.children()).stream().anyMatch(e -> {
|
||||||
|
if (e instanceof TabNavigationWidget tabs) {
|
||||||
|
TabNavigationWidgetAccessor accessor = (TabNavigationWidgetAccessor) tabs;
|
||||||
|
int tabIndex = accessor.getTabs().indexOf(accessor.getTabManager().getCurrentTab());
|
||||||
|
if (next ? tabIndex+1 < accessor.getTabs().size() : tabIndex > 0) {
|
||||||
|
if (next) tabs.selectTab(tabIndex + 1, true);
|
||||||
|
else tabs.selectTab(tabIndex - 1, true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
if (FabricLoader.getInstance().isModLoaded("sodium"))
|
if (FabricLoader.getInstance().isModLoaded("sodium"))
|
||||||
SodiumCompat.handleTabs(client.currentScreen, next);
|
SodiumCompat.handleTabs(client.currentScreen, next);
|
||||||
@@ -174,31 +191,20 @@ public class InputHandlers {
|
|||||||
public static PressAction handlePage(boolean next) {
|
public static PressAction handlePage(boolean next) {
|
||||||
return (client, button, value, action) -> {
|
return (client, button, value, action) -> {
|
||||||
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
if (client.currentScreen instanceof CreativeInventoryScreen) {
|
||||||
var screen = (HandledScreenAccessor) client.currentScreen;
|
|
||||||
try {
|
try {
|
||||||
if (next) {
|
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
||||||
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
.map(element -> (PressableWidget) element)
|
||||||
.map(element -> (PressableWidget) element)
|
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
|
||||||
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
|
.anyMatch(element -> {
|
||||||
.anyMatch(element -> {
|
if (next && element.getMessage().getString().equals(">")) {
|
||||||
if (element.getMessage().getString().equals(">")) {
|
element.onPress();
|
||||||
element.onPress();
|
return true;
|
||||||
return true;
|
} else if (element.getMessage().getString().equals("<")) {
|
||||||
}
|
element.onPress();
|
||||||
return false;
|
return true;
|
||||||
});
|
}
|
||||||
} else {
|
return false;
|
||||||
return client.currentScreen.children().stream().filter(element -> element instanceof PressableWidget)
|
});
|
||||||
.map(element -> (PressableWidget) element)
|
|
||||||
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
|
|
||||||
.anyMatch(element -> {
|
|
||||||
if (element.getMessage().getString().equals("<")) {
|
|
||||||
element.onPress();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
}
|
}
|
||||||
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next);
|
if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next);
|
||||||
@@ -246,23 +252,21 @@ public class InputHandlers {
|
|||||||
|
|
||||||
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
MidnightControlsClient.get().input.inventoryInteractionCooldown = 5;
|
||||||
switch (button.getName()) {
|
switch (button.getName()) {
|
||||||
case "take_all": {
|
case "take_all" -> {
|
||||||
if (screen instanceof CreativeInventoryScreen) {
|
if (screen instanceof CreativeInventoryScreen) {
|
||||||
if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))))
|
if (slot != null && (((CreativeInventoryScreenAccessor) accessor).midnightcontrols$isCreativeInventorySlot(slot) || MidnightControlsCompat.streamCompatHandlers().anyMatch(handler -> handler.isCreativeSlot(screen, slot))))
|
||||||
actionType = SlotActionType.CLONE;
|
actionType = SlotActionType.CLONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "take" -> {
|
||||||
|
clickData = GLFW_MOUSE_BUTTON_2;
|
||||||
|
}
|
||||||
|
case "quick_move" -> {
|
||||||
|
actionType = SlotActionType.QUICK_MOVE;
|
||||||
|
}
|
||||||
|
default -> {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "take": {
|
|
||||||
clickData = GLFW_MOUSE_BUTTON_2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "quick_move": {
|
|
||||||
actionType = SlotActionType.QUICK_MOVE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType);
|
accessor.midnightcontrols$onMouseClick(slot, slotId, clickData, actionType);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -424,20 +424,20 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
public void renderTitle(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
drawCenteredText(matrices, this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 16777215);
|
drawCenteredTextWithShadow(matrices, this.textRenderer, I18n.translate("midnightcontrols.menu.title"), this.width / 2, 8, 16777215);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MidnightControlsBackground implements Background {
|
public static class MidnightControlsBackground implements Background {
|
||||||
private int transparency = 160;
|
private static int transparency = 160;
|
||||||
public MidnightControlsBackground() {}
|
public MidnightControlsBackground() {}
|
||||||
public MidnightControlsBackground(int transparency) {
|
public MidnightControlsBackground(int transparency) {
|
||||||
this.transparency = transparency;
|
MidnightControlsBackground.transparency = transparency;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void render(MatrixStack matrixStack, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) {
|
public void render(MatrixStack matrixStack, SpruceWidget widget, int vOffset, int mouseX, int mouseY, float delta) {
|
||||||
fill(matrixStack, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000"));
|
fill(matrixStack, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight(), MidnightColorUtil.hex2Rgb("#000000"));
|
||||||
}
|
}
|
||||||
private void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) {
|
private static void fill(MatrixStack matrixStack, int x2, int y2, int x1, int y1, Color color) {
|
||||||
matrixStack.push();
|
matrixStack.push();
|
||||||
|
|
||||||
Matrix4f matrix = matrixStack.peek().getPositionMatrix();
|
Matrix4f matrix = matrixStack.peek().getPositionMatrix();
|
||||||
@@ -447,7 +447,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
float t = (float)(transparency) / 255.0F;
|
float t = (float)(transparency) / 255.0F;
|
||||||
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
|
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
|
||||||
RenderSystem.enableBlend();
|
RenderSystem.enableBlend();
|
||||||
RenderSystem.disableTexture();
|
|
||||||
RenderSystem.defaultBlendFunc();
|
RenderSystem.defaultBlendFunc();
|
||||||
RenderSystem.setShader(GameRenderer::getPositionColorProgram);
|
RenderSystem.setShader(GameRenderer::getPositionColorProgram);
|
||||||
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
||||||
@@ -456,7 +455,6 @@ public class MidnightControlsSettingsScreen extends SpruceScreen {
|
|||||||
bufferBuilder.vertex(matrix, (float)x2, (float)y1, 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();
|
bufferBuilder.vertex(matrix, (float)x1, (float)y1, 0.0F).color(r, g, b, t).next();
|
||||||
BufferRenderer.drawWithGlobalProgram(bufferBuilder.end());
|
BufferRenderer.drawWithGlobalProgram(bufferBuilder.end());
|
||||||
RenderSystem.enableTexture();
|
|
||||||
RenderSystem.disableBlend();
|
RenderSystem.disableBlend();
|
||||||
matrixStack.pop();
|
matrixStack.pop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,18 +65,18 @@ public class RingScreen extends Screen {
|
|||||||
RingPage.selected = -1;
|
RingPage.selected = -1;
|
||||||
this.removed();
|
this.removed();
|
||||||
}
|
}
|
||||||
@Override
|
// @Override
|
||||||
public boolean changeFocus(boolean lookForwards) {
|
// public boolean changeFocus(boolean lookForwards) {
|
||||||
if (lookForwards) {
|
// if (lookForwards) {
|
||||||
if (RingPage.selected < 7) ++RingPage.selected;
|
// if (RingPage.selected < 7) ++RingPage.selected;
|
||||||
else RingPage.selected = -1;
|
// else RingPage.selected = -1;
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
if (RingPage.selected > -1) --RingPage.selected;
|
// if (RingPage.selected > -1) --RingPage.selected;
|
||||||
else RingPage.selected = 7;
|
// else RingPage.selected = 7;
|
||||||
}
|
// }
|
||||||
return true;
|
// return true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
public boolean mouseReleased(double mouseX, double mouseY, int button) {
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class ControllerControlsWidget extends SpruceContainerWidget {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
public void renderWidget(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
drawCenteredText(matrices, this.client.textRenderer, Text.translatable("midnightcontrols.menu.title.controller_controls"),
|
drawCenteredTextWithShadow(matrices, this.client.textRenderer, Text.translatable("midnightcontrols.menu.title.controller_controls"),
|
||||||
this.getX() + this.width / 2, this.getY() + 4, 16777215);
|
this.getX() + this.width / 2, this.getY() + 4, 16777215);
|
||||||
this.resetButton.setActive(InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault)));
|
this.resetButton.setActive(InputManager.streamBindings().anyMatch(Predicates.not(ButtonBinding::isDefault)));
|
||||||
super.renderWidget(matrices, mouseX, mouseY, delta);
|
super.renderWidget(matrices, mouseX, mouseY, delta);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public abstract class ChatScreenMixin extends Screen {
|
|||||||
private void midnightcontrols$moveInputField(CallbackInfo ci) {
|
private void midnightcontrols$moveInputField(CallbackInfo ci) {
|
||||||
if (MidnightControlsConfig.moveChat) chatField.setY(4);
|
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))
|
@Inject(method = "render", at = @At("HEAD"))
|
||||||
private void midnightcontrols$moveInputFieldBackground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
private void midnightcontrols$moveInputFieldBackground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
|
||||||
if (MidnightControlsConfig.moveChat) matrices.translate(0f, -this.height + 16, 0f);
|
if (MidnightControlsConfig.moveChat) matrices.translate(0f, -this.height + 16, 0f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,13 @@
|
|||||||
|
|
||||||
package eu.midnightdust.midnightcontrols.client.mixin;
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.navigation.NavigationDirection;
|
||||||
import net.minecraft.client.gui.widget.EntryListWidget;
|
import net.minecraft.client.gui.widget.EntryListWidget;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
|
|
||||||
@Mixin(EntryListWidget.class)
|
@Mixin(EntryListWidget.class)
|
||||||
public interface EntryListWidgetAccessor {
|
public interface EntryListWidgetAccessor {
|
||||||
@Invoker("moveSelection")
|
//@Invoker("getNeighbouringEntry")
|
||||||
void midnightcontrols$moveSelection(EntryListWidget.MoveDirection direction);
|
//void midnightcontrols$getNeighbouringEntry(NavigationDirection direction);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package eu.midnightdust.midnightcontrols.client.mixin;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import net.minecraft.client.gui.tab.Tab;
|
||||||
|
import net.minecraft.client.gui.tab.TabManager;
|
||||||
|
import net.minecraft.client.gui.widget.TabNavigationWidget;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
|
@Mixin(TabNavigationWidget.class)
|
||||||
|
public interface TabNavigationWidgetAccessor {
|
||||||
|
@Accessor
|
||||||
|
TabManager getTabManager();
|
||||||
|
@Accessor
|
||||||
|
ImmutableList<Tab> getTabs();
|
||||||
|
}
|
||||||
@@ -64,8 +64,8 @@ public final class MidnightRing {
|
|||||||
for (String binding : configBindings) {
|
for (String binding : configBindings) {
|
||||||
ButtonBinding buttonBinding = InputManager.getBinding(binding);
|
ButtonBinding buttonBinding = InputManager.getBinding(binding);
|
||||||
if (buttonBinding != null) {
|
if (buttonBinding != null) {
|
||||||
RingPage page = this.pages.get(MathHelper.fastFloor(bindingIndex / 8f));
|
RingPage page = this.pages.get(MathHelper.floor(bindingIndex / 8f));
|
||||||
page.actions[bindingIndex - 8 * (MathHelper.fastFloor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
|
page.actions[bindingIndex - 8 * (MathHelper.floor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
|
||||||
++bindingIndex;
|
++bindingIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,8 +88,8 @@ public final class MidnightRing {
|
|||||||
|
|
||||||
for (ButtonBinding buttonBinding : unboundBindings) {
|
for (ButtonBinding buttonBinding : unboundBindings) {
|
||||||
if (buttonBinding != null) {
|
if (buttonBinding != null) {
|
||||||
RingPage page = this.pages.get(MathHelper.fastFloor(bindingIndex / 8f));
|
RingPage page = this.pages.get(MathHelper.floor(bindingIndex / 8f));
|
||||||
page.actions[bindingIndex - 8 * (MathHelper.fastFloor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
|
page.actions[bindingIndex - 8 * (MathHelper.floor(bindingIndex / 8f))] = (new ButtonBindingRingAction(buttonBinding));
|
||||||
++bindingIndex;
|
++bindingIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public class RingPage extends DrawableHelper {
|
|||||||
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta) {
|
public void render(@NotNull MatrixStack matrices, @NotNull TextRenderer textRenderer, int width, int height, int mouseX, int mouseY, float tickDelta) {
|
||||||
int centerX = width / 2;
|
int centerX = width / 2;
|
||||||
int centerY = height / 2;
|
int centerY = height / 2;
|
||||||
if (MidnightControlsClient.get().ring.getMaxPages() > 1) drawCenteredText(matrices, textRenderer, name, centerX, 5, 0xffffff);
|
if (MidnightControlsClient.get().ring.getMaxPages() > 1) drawCenteredTextWithShadow(matrices, textRenderer, name, centerX, 5, 0xffffff);
|
||||||
|
|
||||||
int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
|
int offset = MidnightRing.ELEMENT_SIZE + (MidnightRing.ELEMENT_SIZE / 2) + 5;
|
||||||
|
|
||||||
|
|||||||
@@ -203,5 +203,10 @@
|
|||||||
"midnightcontrols.virtual_mouse.skin.default_dark": "Default Dark",
|
"midnightcontrols.virtual_mouse.skin.default_dark": "Default Dark",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_light": "Second Light",
|
"midnightcontrols.virtual_mouse.skin.second_light": "Second Light",
|
||||||
"midnightcontrols.virtual_mouse.skin.second_dark": "Second Dark",
|
"midnightcontrols.virtual_mouse.skin.second_dark": "Second Dark",
|
||||||
|
"midnightcontrols.midnightconfig.category.controller": "Controller",
|
||||||
|
"midnightcontrols.midnightconfig.category.misc": "Miscellaneous",
|
||||||
|
"midnightcontrols.midnightconfig.category.screens": "Screens",
|
||||||
|
"midnightcontrols.midnightconfig.category.gameplay": "Gameplay",
|
||||||
|
"midnightcontrols.midnightconfig.category.visual": "Visual",
|
||||||
"modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
|
"modmenu.descriptionTranslation.midnightcontrols": "Adds controller support and enhanced controls overall.\nForked from LambdaControls, which sadly got discontinued."
|
||||||
}
|
}
|
||||||
|
|||||||
184
src/main/resources/assets/midnightcontrols/lang/uk_ua.json
Normal file
184
src/main/resources/assets/midnightcontrols/lang/uk_ua.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"midnightcontrols.midnightconfig.title": "Розширена конфігурація MidnightControls",
|
||||||
|
"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.debug_screen": "Відкрити налагодження (F3)",
|
||||||
|
"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.slot_up": "Двинути на слот вгору",
|
||||||
|
"midnightcontrols.action.slot_down": "Повернути на слот вниз",
|
||||||
|
"midnightcontrols.action.slot_left": "Двинути на слот вліво",
|
||||||
|
"midnightcontrols.action.slot_right": "Повернути на слот вправо",
|
||||||
|
"midnightcontrols.action.sneak": "Крастися",
|
||||||
|
"midnightcontrols.action.sprint": "Біг",
|
||||||
|
"midnightcontrols.action.swap_hands": "Змінити руку",
|
||||||
|
"midnightcontrols.action.toggle_perspective": "Переключити перспективу",
|
||||||
|
"midnightcontrols.action.toggle_smooth_camera": "Переключити кінематографічну камеру",
|
||||||
|
"midnightcontrols.action.page_back": "Попередня сторінка",
|
||||||
|
"midnightcontrols.action.page_next": "Наступна сторінка",
|
||||||
|
"midnightcontrols.action.tab_back": "Попередня секція",
|
||||||
|
"midnightcontrols.action.tab_next": "Наступна секція",
|
||||||
|
"midnightcontrols.action.take": "Взяти предмет",
|
||||||
|
"midnightcontrols.action.take_all": "Взяти стак",
|
||||||
|
"midnightcontrols.action.use": "Використовувати",
|
||||||
|
"midnightcontrols.action.zoom": "Наблизити",
|
||||||
|
"midnightcontrols.action.zoom_in": "Збільшити масштаб",
|
||||||
|
"midnightcontrols.action.zoom_out": "Зменшити масштаб",
|
||||||
|
"midnightcontrols.action.zoom_reset": "Скинути масштаб",
|
||||||
|
"midnightcontrols.action.emi_page_left": "Попередня сторінка",
|
||||||
|
"midnightcontrols.action.emi_page_right": "Наступна сторінка",
|
||||||
|
"midnightcontrols.category.emi": "ЕМІ",
|
||||||
|
"midnightcontrols.button.a": "A",
|
||||||
|
"midnightcontrols.button.b": "B",
|
||||||
|
"midnightcontrols.button.x": "X",
|
||||||
|
"midnightcontrols.button.y": "Y",
|
||||||
|
"midnightcontrols.button.left_bumper": "Лівий бампер",
|
||||||
|
"midnightcontrols.button.right_bumper": "Правий бампер",
|
||||||
|
"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.button.l4": "L4",
|
||||||
|
"midnightcontrols.button.l5": "L5",
|
||||||
|
"midnightcontrols.button.r4": "R4",
|
||||||
|
"midnightcontrols.button.r5": "L5",
|
||||||
|
"midnightcontrols.axis.left_x+": "Лівий cтік X+",
|
||||||
|
"midnightcontrols.axis.left_y+": "Лівий cтік Y+",
|
||||||
|
"midnightcontrols.axis.right_x+": "Правий cтік X+",
|
||||||
|
"midnightcontrols.axis.right_y+": "Правий cтік 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": "і вставте ваш підсумок у редактор файлів розкладок.",
|
||||||
|
"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.dualsense": "DualSense",
|
||||||
|
"midnightcontrols.controller_type.switch": "Switch",
|
||||||
|
"midnightcontrols.controller_type.xbox": "Xbox",
|
||||||
|
"midnightcontrols.controller_type.xbox_360": "Xbox 360",
|
||||||
|
"midnightcontrols.controller_type.steam_controller": "Steam Controller",
|
||||||
|
"midnightcontrols.controller_type.steam_deck": "Steam Deck",
|
||||||
|
"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.double_tap_to_sprint": "Двічі відвести лівий стік, щоб почати бігти",
|
||||||
|
"midnightcontrols.menu.fast_block_placing": "Швидка постачання блоків",
|
||||||
|
"midnightcontrols.menu.fly_drifting": "Інерція при польоті",
|
||||||
|
"midnightcontrols.menu.fly_drifting_vertical": "Вертикальна інерція при польоті",
|
||||||
|
"midnightcontrols.menu.hud_enable": "Увімкнути іконоки контролера",
|
||||||
|
"midnightcontrols.menu.hud_side": "Розташування інтерфейсу",
|
||||||
|
"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": "Налаштування інтерфейсу",
|
||||||
|
"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": "Додатковий контролер, наприклад для джой-конів.",
|
||||||
|
"midnightcontrols.tooltip.controller_type": "Тип контролера, щоб правильно зіставити іконки кнопок.",
|
||||||
|
"midnightcontrols.tooltip.controls_mode": "Тип контролю за грою.",
|
||||||
|
"midnightcontrols.tooltip.double_tap_to_sprint": "При подвійному переміщенні на лівий стик, персонаж починає бігти.",
|
||||||
|
"midnightcontrols.tooltip.fast_block_placing": "Під час польоту в творчому режимі дозволяє швидко розміщувати блоки в залежності від вашої швидкості. §cНа деяких серверах це може розцінюватися як читерство.§r",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting": "Під час польоту включає ванільну інерцію.",
|
||||||
|
"midnightcontrols.tooltip.fly_drifting_vertical": "Під час польоту включає ванільну вертикальну інерцію.",
|
||||||
|
"midnightcontrols.tooltip.hud_enable": "Переключає бачення іконок кнопок контролера на екрані.",
|
||||||
|
"midnightcontrols.tooltip.hud_side": "Розташування інтерфейсу у певний бік.",
|
||||||
|
"midnightcontrols.tooltip.left_dead_zone": "Мертва зона для лівого аналогового стику контролера.",
|
||||||
|
"midnightcontrols.tooltip.max_left_x_value": "Змінює те, що мод в результаті вважає максимальним значенням для лівої осі X. Корисно, якщо ваша вісь не використовує весь діапазон і здається повільною.",
|
||||||
|
"midnightcontrols.tooltip.max_left_y_value": "Змінює те, що мод в результаті вважає максимальним значенням для лівої осі Y. Корисно, якщо ваша вісь не використовує весь діапазон і здається повільною.",
|
||||||
|
"midnightcontrols.tooltip.max_right_x_value": "Змінює те, що мод в результаті вважає максимальним значенням для правої осі X. Корисно, якщо ваша вісь не використовує весь діапазон і здається повільною.",
|
||||||
|
"midnightcontrols.tooltip.max_right_y_value": "Змінює те, що мод в результаті вважає максимальним значенням для правої осі Y. Корисно, якщо ваша вісь не використовує весь діапазон і здається повільною.",
|
||||||
|
"midnightcontrols.tooltip.mouse_speed": "Швидкість миші, що емульується контролером.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.horizontal": "Дозволяє розміщувати передній блок перед собою. §cМоже розглядатися як читерство на деяких серверах§r.",
|
||||||
|
"midnightcontrols.tooltip.reacharound.vertical": "Забезпечує вертикальне охоплення. §cМоже розглядатися як шахрайство на деяких серверах§r.",
|
||||||
|
"midnightcontrols.tooltip.reload_controller_mappings": "Перезавантажує файл розкладки контролерів.",
|
||||||
|
"midnightcontrols.tooltip.right_dead_zone": "Мертва зона для правого аналогового стику контролера.",
|
||||||
|
"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": "Додатковий темний",
|
||||||
|
"modmenu.descriptionTranslation.midnightcontrols": "Додавання підтримки контролера та покращення елементів керування в цілому.\nРозгалужений від LambdaControls, підтримка якого, на жаль, припинена..",
|
||||||
|
"midnightcontrols.menu.joystick_as_mouse": "Завжди використовуйте лівий стік як мишку",
|
||||||
|
"midnightcontrols.tooltip.joystick_as_mouse": "Джойстик поводиться як миша в кожному меню.",
|
||||||
|
"midnightcontrols.menu.controller_toggle_sneak": "Перемикач присідання на контролері",
|
||||||
|
"midnightcontrols.menu.controller_toggle_sprint": "Перемикач бігу на контролері",
|
||||||
|
"midnightcontrols.menu.move_chat": "Перемістити поле введення чату вгору",
|
||||||
|
"midnightcontrols.action.controls_ring": "Показати кільце Управління",
|
||||||
|
"midnightcontrols.menu.separate_controller_profile": "Окремий профіль контролера"
|
||||||
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
accessWidener v1 named
|
accessWidener v1 named
|
||||||
|
|
||||||
accessible class net/minecraft/client/gui/widget/EntryListWidget$MoveDirection
|
#accessible class net/minecraft/client/gui/widget/EntryListWidget$MoveDirection
|
||||||
@@ -20,7 +20,8 @@
|
|||||||
"WorldRendererMixin",
|
"WorldRendererMixin",
|
||||||
"KeyBindingRegistryImplAccessor",
|
"KeyBindingRegistryImplAccessor",
|
||||||
"KeyBindingIDAccessor",
|
"KeyBindingIDAccessor",
|
||||||
"ScreenAccessor"
|
"ScreenAccessor",
|
||||||
|
"TabNavigationWidgetAccessor"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"pack": {
|
"pack": {
|
||||||
"pack_format": 12,
|
"pack_format": 13,
|
||||||
"description": "Makes controller tooltips use similar icons to Bedrock Edition"
|
"description": "Makes controller tooltips use similar icons to Bedrock Edition"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"pack": {
|
"pack": {
|
||||||
"pack_format": 12,
|
"pack_format": 13,
|
||||||
"description": "Makes controller icons look similar to Legacy Console Edit."
|
"description": "Makes controller icons look similar to Legacy Console Edit."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user