From f6964d1713c2ca48116bfcf5dafc1f42fcc4c4d5 Mon Sep 17 00:00:00 2001 From: Caedis Date: Sat, 17 Aug 2024 22:50:48 -0500 Subject: [PATCH 1/8] compat with ModernKeybinding --- dependencies.gradle | 4 +- gradle.properties | 4 +- .../blamejared/controlling/Controlling.java | 4 ++ .../client/gui/GuiNewControls.java | 43 ++++++++++++++++--- .../client/gui/GuiNewKeyBindingList.java | 31 +++++++++---- 5 files changed, 70 insertions(+), 16 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index c773c51..20309cd 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1 +1,3 @@ -dependencies {} +dependencies { + devOnlyNonPublishable(rfg.deobf("curse.maven:modern-keybinding-686846:4034362")) +} diff --git a/gradle.properties b/gradle.properties index d399ee0..b5f074a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -41,11 +41,11 @@ developmentEnvironmentUserName = Developer # Enables using modern Java syntax (up to version 17) via Jabel, while still targeting JVM 8. # See https://github.com/bsideup/jabel for details on how this works. -enableModernJavaSyntax = false +enableModernJavaSyntax = true # Enables injecting missing generics into the decompiled source code for a better coding experience. # Turns most publicly visible List, Map, etc. into proper List, Map types. -enableGenericInjection = false +enableGenericInjection = true # Generate a class with a String field for the mod version named as defined below. # If generateGradleTokenClass is empty or not missing, no such class will be generated. diff --git a/src/main/java/com/blamejared/controlling/Controlling.java b/src/main/java/com/blamejared/controlling/Controlling.java index 28e1328..fb4d4b2 100644 --- a/src/main/java/com/blamejared/controlling/Controlling.java +++ b/src/main/java/com/blamejared/controlling/Controlling.java @@ -1,5 +1,6 @@ package com.blamejared.controlling; +import cpw.mods.fml.common.Loader; import net.minecraftforge.common.MinecraftForge; import com.blamejared.controlling.events.ClientEventHandler; @@ -9,10 +10,13 @@ @Mod(modid = "controlling", name = "Controlling", version = "GRADLETOKEN_VERSION", acceptableRemoteVersions = "*") public class Controlling { + public static boolean isModernKeybindingInstalled = false; @Mod.EventHandler private void init(final FMLInitializationEvent event) { if (event.getSide().isClient()) { + isModernKeybindingInstalled = Loader.isModLoaded("mkb"); + MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); } } diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java index 3d11529..efafc81 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java @@ -5,6 +5,9 @@ import java.util.List; import java.util.function.Predicate; +import com.blamejared.controlling.Controlling; +import committee.nova.mkb.api.IKeyBinding; +import committee.nova.mkb.keybinding.KeyModifier; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiControls; @@ -216,9 +219,16 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { boolean flag = false; for (KeyBinding keybinding : this.options.keyBindings) { - if (keybinding.getKeyCode() != keybinding.getKeyCodeDefault()) { - flag = true; - break; + if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB){ + if (!((IKeyBinding) keybinding).isSetToDefaultValue()) { + flag = true; + break; + } + } else { + if (keybinding.getKeyCode() != keybinding.getKeyCodeDefault()) { + flag = true; + break; + } } } @@ -266,7 +276,11 @@ protected void actionPerformed(GuiButton button) { button.displayString = StatCollector.translateToLocal("controls.resetAll"); for (KeyBinding keyBinding : mc.gameSettings.keyBindings) { - keyBinding.setKeyCode(keyBinding.getKeyCodeDefault()); + if (Controlling.isModernKeybindingInstalled){ + ((IKeyBinding) keyBinding).setToDefault(); + } else { + keyBinding.setKeyCode(keyBinding.getKeyCodeDefault()); + } } KeyBinding.resetKeyBindingArrayAndHash(); } else if (button.id == SHOW_UNBOUD_BUTTON_ID) { @@ -307,6 +321,9 @@ protected void actionPerformed(GuiButton button) { @Override public void mouseClicked(int mx, int my, int mb) { if (this.buttonId != null) { + if (Controlling.isModernKeybindingInstalled){ + ((IKeyBinding) this.buttonId).setKeyModifierAndCode(KeyModifier.getActiveModifier(), -100 + mb); + } this.options.setOptionKeyBinding(this.buttonId, -100 + mb); this.buttonId = null; KeyBinding.resetKeyBindingArrayAndHash(); @@ -374,6 +391,17 @@ protected void superSuperMouseReleased(int mouseX, int mouseY, int state) { @Override public void keyTyped(char typedChar, int keyCode) { if (this.buttonId != null) { + if (Controlling.isModernKeybindingInstalled){ + IKeyBinding modernKB = ((IKeyBinding) this.buttonId); + if (keyCode == Keyboard.KEY_ESCAPE) { + modernKB.setKeyModifierAndCode(KeyModifier.NONE, Keyboard.KEY_NONE); + } else if (keyCode != Keyboard.KEY_NONE) { + modernKB.setKeyModifierAndCode(KeyModifier.getActiveModifier(), keyCode); + } else if (typedChar > 0) { + modernKB.setKeyModifierAndCode(KeyModifier.getActiveModifier(), typedChar + 256); + } + } + if (keyCode == Keyboard.KEY_ESCAPE) { this.options.setOptionKeyBinding(this.buttonId, Keyboard.KEY_NONE); } else if (keyCode != Keyboard.KEY_NONE) { @@ -381,7 +409,12 @@ public void keyTyped(char typedChar, int keyCode) { } else if (typedChar > 0) { this.options.setOptionKeyBinding(this.buttonId, typedChar + 256); } - this.buttonId = null; + + // logic - if modern keybinding is not installed, or the key pressed was not a modifier + if (!Controlling.isModernKeybindingInstalled || !KeyModifier.isKeyCodeModifier(keyCode)) { + this.buttonId = null; + } + this.field_152177_g = Minecraft.getSystemTime(); KeyBinding.resetKeyBindingArrayAndHash(); } else { diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java index 4032372..5062198 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java @@ -4,6 +4,8 @@ import java.util.Arrays; import java.util.List; +import com.blamejared.controlling.Controlling; +import committee.nova.mkb.api.IKeyBinding; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiButton; @@ -126,6 +128,8 @@ private boolean shouldHighlightKeyName() { || controlsScreen.getSearchType() == SearchType.KEY_NAME); } + + @SideOnly(Side.CLIENT) public class CategoryEntry implements IGuiListEntry { @@ -197,20 +201,26 @@ public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight this.btnChangeKeyBinding.xPosition = x + 105; this.btnChangeKeyBinding.yPosition = y; - this.btnChangeKeyBinding.displayString = GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); + this.btnChangeKeyBinding.displayString = Controlling.isModernKeybindingInstalled ? ((IKeyBinding) keybinding).getDisplayName() : GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); boolean hasConflict = false; + boolean modConflict = true; // less severe form of conflict, like SHIFT conflicting with SHIFT+G if (this.keybinding.getKeyCode() != 0) { for (KeyBinding key : mc.gameSettings.keyBindings) { - if (key != this.keybinding && this.keybinding.getKeyCode() == key.getKeyCode()) { - hasConflict = true; - break; + if (key != this.keybinding) { + if (Controlling.isModernKeybindingInstalled && ((IKeyBinding) key).conflicts(keybinding)) { + hasConflict = true; + modConflict &= ((IKeyBinding) keybinding).hasKeyCodeModifierConflict(key); + } else if (this.keybinding.getKeyCode() == key.getKeyCode()) { + hasConflict = true; + break; + } } } } - final String displayText = GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); + final String displayText = this.btnChangeKeyBinding.displayString; final String searchString = controlsScreen.getSearchString(); final int index = this.btnChangeKeyBinding.displayString.toLowerCase().indexOf(searchString.toLowerCase()); final int indexEndHighlight = index + controlsScreen.getSearchString().length(); @@ -230,8 +240,9 @@ public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight prefix = EnumChatFormatting.YELLOW + "> " + EnumChatFormatting.RESET + EnumChatFormatting.UNDERLINE; suffix = EnumChatFormatting.RESET.toString() + EnumChatFormatting.YELLOW + " <"; } else if (hasConflict) { - prefix = EnumChatFormatting.RED + "[ " + EnumChatFormatting.RESET; - suffix = EnumChatFormatting.RED + " ]"; + EnumChatFormatting clr = modConflict ? EnumChatFormatting.GOLD : EnumChatFormatting.RED; + prefix = clr + "[ " + EnumChatFormatting.RESET; + suffix = clr + " ]"; } this.btnChangeKeyBinding.displayString = prefix + this.btnChangeKeyBinding.displayString + suffix; @@ -273,7 +284,11 @@ public boolean mousePressed(int slotIndex, int mouseX, int mouseY, int mouseEven controlsScreen.buttonId = this.keybinding; return true; } else if (this.btnResetKeyBinding.mousePressed(mc, mouseX, mouseY)) { - this.keybinding.setKeyCode(this.keybinding.getKeyCodeDefault()); + if (Controlling.isModernKeybindingInstalled){ + ((IKeyBinding) this.keybinding).setToDefault(); + } else { + this.keybinding.setKeyCode(this.keybinding.getKeyCodeDefault()); + } mc.gameSettings.setOptionKeyBinding(this.keybinding, this.keybinding.getKeyCodeDefault()); KeyBinding.resetKeyBindingArrayAndHash(); return true; From 5b6fc91c4820d881a817e8a0e2db3ce8a6c1b329 Mon Sep 17 00:00:00 2001 From: Caedis Date: Sat, 17 Aug 2024 22:51:27 -0500 Subject: [PATCH 2/8] spotless --- .../com/blamejared/controlling/Controlling.java | 3 ++- .../controlling/client/gui/GuiNewControls.java | 15 ++++++++------- .../client/gui/GuiNewKeyBindingList.java | 13 +++++++------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/blamejared/controlling/Controlling.java b/src/main/java/com/blamejared/controlling/Controlling.java index fb4d4b2..a748898 100644 --- a/src/main/java/com/blamejared/controlling/Controlling.java +++ b/src/main/java/com/blamejared/controlling/Controlling.java @@ -1,15 +1,16 @@ package com.blamejared.controlling; -import cpw.mods.fml.common.Loader; import net.minecraftforge.common.MinecraftForge; import com.blamejared.controlling.events.ClientEventHandler; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; @Mod(modid = "controlling", name = "Controlling", version = "GRADLETOKEN_VERSION", acceptableRemoteVersions = "*") public class Controlling { + public static boolean isModernKeybindingInstalled = false; @Mod.EventHandler diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java index efafc81..de126f2 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java @@ -5,9 +5,6 @@ import java.util.List; import java.util.function.Predicate; -import com.blamejared.controlling.Controlling; -import committee.nova.mkb.api.IKeyBinding; -import committee.nova.mkb.keybinding.KeyModifier; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiControls; @@ -22,6 +19,10 @@ import org.lwjgl.input.Keyboard; +import com.blamejared.controlling.Controlling; +import committee.nova.mkb.api.IKeyBinding; +import committee.nova.mkb.keybinding.KeyModifier; + import cpw.mods.fml.client.config.GuiCheckBox; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -219,7 +220,7 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { boolean flag = false; for (KeyBinding keybinding : this.options.keyBindings) { - if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB){ + if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB) { if (!((IKeyBinding) keybinding).isSetToDefaultValue()) { flag = true; break; @@ -276,7 +277,7 @@ protected void actionPerformed(GuiButton button) { button.displayString = StatCollector.translateToLocal("controls.resetAll"); for (KeyBinding keyBinding : mc.gameSettings.keyBindings) { - if (Controlling.isModernKeybindingInstalled){ + if (Controlling.isModernKeybindingInstalled) { ((IKeyBinding) keyBinding).setToDefault(); } else { keyBinding.setKeyCode(keyBinding.getKeyCodeDefault()); @@ -321,7 +322,7 @@ protected void actionPerformed(GuiButton button) { @Override public void mouseClicked(int mx, int my, int mb) { if (this.buttonId != null) { - if (Controlling.isModernKeybindingInstalled){ + if (Controlling.isModernKeybindingInstalled) { ((IKeyBinding) this.buttonId).setKeyModifierAndCode(KeyModifier.getActiveModifier(), -100 + mb); } this.options.setOptionKeyBinding(this.buttonId, -100 + mb); @@ -391,7 +392,7 @@ protected void superSuperMouseReleased(int mouseX, int mouseY, int state) { @Override public void keyTyped(char typedChar, int keyCode) { if (this.buttonId != null) { - if (Controlling.isModernKeybindingInstalled){ + if (Controlling.isModernKeybindingInstalled) { IKeyBinding modernKB = ((IKeyBinding) this.buttonId); if (keyCode == Keyboard.KEY_ESCAPE) { modernKB.setKeyModifierAndCode(KeyModifier.NONE, Keyboard.KEY_NONE); diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java index 5062198..b399ec4 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java @@ -4,8 +4,6 @@ import java.util.Arrays; import java.util.List; -import com.blamejared.controlling.Controlling; -import committee.nova.mkb.api.IKeyBinding; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiButton; @@ -18,6 +16,9 @@ import org.apache.commons.lang3.ArrayUtils; +import com.blamejared.controlling.Controlling; +import committee.nova.mkb.api.IKeyBinding; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -128,8 +129,6 @@ private boolean shouldHighlightKeyName() { || controlsScreen.getSearchType() == SearchType.KEY_NAME); } - - @SideOnly(Side.CLIENT) public class CategoryEntry implements IGuiListEntry { @@ -201,7 +200,9 @@ public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight this.btnChangeKeyBinding.xPosition = x + 105; this.btnChangeKeyBinding.yPosition = y; - this.btnChangeKeyBinding.displayString = Controlling.isModernKeybindingInstalled ? ((IKeyBinding) keybinding).getDisplayName() : GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); + this.btnChangeKeyBinding.displayString = Controlling.isModernKeybindingInstalled + ? ((IKeyBinding) keybinding).getDisplayName() + : GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); boolean hasConflict = false; boolean modConflict = true; // less severe form of conflict, like SHIFT conflicting with SHIFT+G @@ -284,7 +285,7 @@ public boolean mousePressed(int slotIndex, int mouseX, int mouseY, int mouseEven controlsScreen.buttonId = this.keybinding; return true; } else if (this.btnResetKeyBinding.mousePressed(mc, mouseX, mouseY)) { - if (Controlling.isModernKeybindingInstalled){ + if (Controlling.isModernKeybindingInstalled) { ((IKeyBinding) this.keybinding).setToDefault(); } else { this.keybinding.setKeyCode(this.keybinding.getKeyCodeDefault()); From ab6358d233dca922d62ecaa1333680fc9d47a107 Mon Sep 17 00:00:00 2001 From: Caedis Date: Sat, 17 Aug 2024 23:21:20 -0500 Subject: [PATCH 3/8] update bs --- gradle.properties | 13 ++++++++++++- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index b5f074a..c9264da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -85,6 +85,11 @@ accessTransformersFile = controlling_at.cfg # Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! usesMixins = false +# Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main. +# This can speed up compile times thanks to not running the mixin annotation processor on all input sources. +# Mixin classes will have access to "main" classes, but not the other way around. +separateMixinSourceSet = + # Adds some debug arguments like verbose output and class export. usesMixinDebug = false @@ -117,9 +122,15 @@ minimizeShadowedDependencies = true # If disabled, won't rename the shadowed classes. relocateShadowedDependencies = true -# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories. +# Adds CurseMaven, Modrinth, and some more well-known 1.7.10 repositories. includeWellKnownRepositories = true +# A list of repositories to exclude from the includeWellKnownRepositories setting. Should be a space separated +# list of strings, with the acceptable keys being(case does not matter): +# cursemaven +# modrinth +excludeWellKnownRepositories = + # Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven. # Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables. # If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..09523c0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle index 6fe010c..242692e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.23' + id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.26' } From 5a99fe7075c49337df27f8d6f63b3cedd281695f Mon Sep 17 00:00:00 2001 From: Caedis Date: Sat, 17 Aug 2024 23:37:41 -0500 Subject: [PATCH 4/8] fix java8 --- dependencies.gradle | 2 +- .../com/blamejared/controlling/client/gui/GuiNewControls.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 20309cd..6085505 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,3 +1,3 @@ dependencies { - devOnlyNonPublishable(rfg.deobf("curse.maven:modern-keybinding-686846:4034362")) + compileOnly(rfg.deobf("curse.maven:modern-keybinding-686846:4034362")) { transitive = false } } diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java index de126f2..0911cbd 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java @@ -220,7 +220,7 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { boolean flag = false; for (KeyBinding keybinding : this.options.keyBindings) { - if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB) { + if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding) { if (!((IKeyBinding) keybinding).isSetToDefaultValue()) { flag = true; break; From 33b05bb04b27e09b1564a04566b455f1fab5778c Mon Sep 17 00:00:00 2001 From: Caedis Date: Sat, 17 Aug 2024 23:39:11 -0500 Subject: [PATCH 5/8] change to non mixinless dep version --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 6085505..1c7d7d2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,3 +1,3 @@ dependencies { - compileOnly(rfg.deobf("curse.maven:modern-keybinding-686846:4034362")) { transitive = false } + compileOnly(rfg.deobf("curse.maven:modern-keybinding-686846:4034361")) { transitive = false } } From 5720f0c003d4820ab9f2d45b02ffab599097a85c Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Sun, 18 Aug 2024 09:30:19 +0200 Subject: [PATCH 6/8] update --- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43504 bytes gradlew | 5 ++++- gradlew.bat | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 8703 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 Ojj7^59?Sdh$^Qpp*~F>< delta 8662 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 diff --git a/gradlew b/gradlew index b740cf1..f5feea6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30d..9d21a21 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## From f50b38ed21e3ce1954d4fe81059a3852f4b81fea Mon Sep 17 00:00:00 2001 From: Caedis Date: Wed, 21 Aug 2024 09:45:46 -0500 Subject: [PATCH 7/8] add more checks --- .../controlling/client/gui/GuiNewControls.java | 15 +++++++-------- .../client/gui/GuiNewKeyBindingList.java | 13 +++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java index 0911cbd..8f3ca83 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewControls.java @@ -220,8 +220,8 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { boolean flag = false; for (KeyBinding keybinding : this.options.keyBindings) { - if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding) { - if (!((IKeyBinding) keybinding).isSetToDefaultValue()) { + if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB) { + if (!modernKB.isSetToDefaultValue()) { flag = true; break; } @@ -277,8 +277,8 @@ protected void actionPerformed(GuiButton button) { button.displayString = StatCollector.translateToLocal("controls.resetAll"); for (KeyBinding keyBinding : mc.gameSettings.keyBindings) { - if (Controlling.isModernKeybindingInstalled) { - ((IKeyBinding) keyBinding).setToDefault(); + if (Controlling.isModernKeybindingInstalled && keyBinding instanceof IKeyBinding modernKB) { + modernKB.setToDefault(); } else { keyBinding.setKeyCode(keyBinding.getKeyCodeDefault()); } @@ -322,8 +322,8 @@ protected void actionPerformed(GuiButton button) { @Override public void mouseClicked(int mx, int my, int mb) { if (this.buttonId != null) { - if (Controlling.isModernKeybindingInstalled) { - ((IKeyBinding) this.buttonId).setKeyModifierAndCode(KeyModifier.getActiveModifier(), -100 + mb); + if (Controlling.isModernKeybindingInstalled && this.buttonId instanceof IKeyBinding modernKB) { + modernKB.setKeyModifierAndCode(KeyModifier.getActiveModifier(), -100 + mb); } this.options.setOptionKeyBinding(this.buttonId, -100 + mb); this.buttonId = null; @@ -392,8 +392,7 @@ protected void superSuperMouseReleased(int mouseX, int mouseY, int state) { @Override public void keyTyped(char typedChar, int keyCode) { if (this.buttonId != null) { - if (Controlling.isModernKeybindingInstalled) { - IKeyBinding modernKB = ((IKeyBinding) this.buttonId); + if (Controlling.isModernKeybindingInstalled && this.buttonId instanceof IKeyBinding modernKB) { if (keyCode == Keyboard.KEY_ESCAPE) { modernKB.setKeyModifierAndCode(KeyModifier.NONE, Keyboard.KEY_NONE); } else if (keyCode != Keyboard.KEY_NONE) { diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java index b399ec4..decb5ad 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java @@ -201,8 +201,8 @@ public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight this.btnChangeKeyBinding.xPosition = x + 105; this.btnChangeKeyBinding.yPosition = y; this.btnChangeKeyBinding.displayString = Controlling.isModernKeybindingInstalled - ? ((IKeyBinding) keybinding).getDisplayName() - : GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); + && keybinding instanceof IKeyBinding modernKB ? modernKB.getDisplayName() + : GameSettings.getKeyDisplayString(this.keybinding.getKeyCode()); boolean hasConflict = false; boolean modConflict = true; // less severe form of conflict, like SHIFT conflicting with SHIFT+G @@ -210,9 +210,10 @@ public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight if (this.keybinding.getKeyCode() != 0) { for (KeyBinding key : mc.gameSettings.keyBindings) { if (key != this.keybinding) { - if (Controlling.isModernKeybindingInstalled && ((IKeyBinding) key).conflicts(keybinding)) { + if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB + && modernKB.conflicts(keybinding)) { hasConflict = true; - modConflict &= ((IKeyBinding) keybinding).hasKeyCodeModifierConflict(key); + modConflict &= modernKB.hasKeyCodeModifierConflict(key); } else if (this.keybinding.getKeyCode() == key.getKeyCode()) { hasConflict = true; break; @@ -285,8 +286,8 @@ public boolean mousePressed(int slotIndex, int mouseX, int mouseY, int mouseEven controlsScreen.buttonId = this.keybinding; return true; } else if (this.btnResetKeyBinding.mousePressed(mc, mouseX, mouseY)) { - if (Controlling.isModernKeybindingInstalled) { - ((IKeyBinding) this.keybinding).setToDefault(); + if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB) { + modernKB.setToDefault(); } else { this.keybinding.setKeyCode(this.keybinding.getKeyCodeDefault()); } From 34198165d17f7064da65bce6296ecc9eadc67c62 Mon Sep 17 00:00:00 2001 From: Caedis Date: Wed, 21 Aug 2024 09:48:28 -0500 Subject: [PATCH 8/8] fix logic --- .../controlling/client/gui/GuiNewKeyBindingList.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java index decb5ad..a71afed 100644 --- a/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java +++ b/src/main/java/com/blamejared/controlling/client/gui/GuiNewKeyBindingList.java @@ -210,10 +210,11 @@ public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight if (this.keybinding.getKeyCode() != 0) { for (KeyBinding key : mc.gameSettings.keyBindings) { if (key != this.keybinding) { - if (Controlling.isModernKeybindingInstalled && keybinding instanceof IKeyBinding modernKB + if (Controlling.isModernKeybindingInstalled && key instanceof IKeyBinding modernKB + && keybinding instanceof IKeyBinding modernKB2 && modernKB.conflicts(keybinding)) { hasConflict = true; - modConflict &= modernKB.hasKeyCodeModifierConflict(key); + modConflict &= modernKB2.hasKeyCodeModifierConflict(key); } else if (this.keybinding.getKeyCode() == key.getKeyCode()) { hasConflict = true; break;