diff --git a/dependencies.gradle b/dependencies.gradle index 509c46e4..72e3a10c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -122,6 +122,9 @@ dependencies { // Better Questing Unofficial (from CurseForge) compileOnly rfg.deobf("curse.maven:better-questing-unofficial-629629:5183601") // Version 4.2.2 + // Controlling (from CurseForge) + compileOnly rfg.deobf("curse.maven:controlling-250398:5165715") // Version 3.0.12.3 + /* -------------------------------- Soft Deps, Multiple Runtime Declaration -------------------------------- */ if (project.enable_draconic.toBoolean() || project.enable_thermal.toBoolean()) { runtimeOnly "curse.maven:redstone-flux-270789:2920436" // Version 2.1.1.1 @@ -195,6 +198,10 @@ dependencies { runtimeOnly "curse.maven:better-questing-unofficial-629629:5183601" // Version 4.2.2 } + if (project.enable_controlling.toBoolean()) { + runtimeOnly "curse.maven:controlling-250398:5165715" // Version 3.0.12.3 + } + if (project.enable_ender_storage.toBoolean()) { // Ender Storage, runtime only, integrated in remappers (from CurseForge) runtimeOnly "curse.maven:ender-storage-245174:2755787" // Version 2.4.6.137 diff --git a/gradle.properties b/gradle.properties index 440f53fd..e34398f6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -151,7 +151,8 @@ curseForgeRelations = requiredDependency:codechicken-lib-1-8;\ optionalDependency:advanced-rocketry;\ optionalDependency:architecturecraft-tridev;\ optionalDependency:effortless-building;\ - optionalDependency:better-questing-unofficial; + optionalDependency:better-questing-unofficial;\ + optionalDependency:controlling; # This project's release type on CurseForge and/or Modrinth # Alternatively this can be set with the 'RELEASE_TYPE' environment variable. @@ -256,6 +257,9 @@ enable_effortless_building = false # Whether to enable BQu in runtime. Enables Labs Tier Helper. enable_bqu = false +# Whether to enable Controlling in runtime. Enables Controlling compat. +enable_controlling = true + # Whether to enable Ender Storage in runtime. Enables remappers to remap items in ender storage. # If this is set to false, the remappers will not apply there. enable_ender_storage = false diff --git a/src/main/groovy-tests/customRecipeClassTests.groovy b/src/main/groovy-tests/customRecipeClassTests.groovy index 5aa4e3a1..fcebff54 100644 --- a/src/main/groovy-tests/customRecipeClassTests.groovy +++ b/src/main/groovy-tests/customRecipeClassTests.groovy @@ -1,5 +1,7 @@ import com.nomiceu.nomilabs.groovy.ShapedConversionRecipe +// Custom Recipe Classes. Goes in Post Init. + // Use a Custom Recipe Class in Shaped Recipes! // Using Key Based Matrix diff --git a/src/main/groovy-tests/forMaterialTests.groovy b/src/main/groovy-tests/forMaterialTests.groovy index 67c0d5b1..146f6282 100644 --- a/src/main/groovy-tests/forMaterialTests.groovy +++ b/src/main/groovy-tests/forMaterialTests.groovy @@ -2,6 +2,8 @@ import net.minecraftforge.fluids.Fluid import static com.nomiceu.nomilabs.groovy.GroovyHelpers.MaterialHelpers.* +// Material Removers and Loopers. (Goes in Post Init) + // Actions on Items include all material items and blocks, and buckets containing any material fluid. // Actions on Fluids include liquids, gasses, solids, and addon fluids (such as molten fluids, added by GCYM) diff --git a/src/main/groovy-tests/jeiTests.groovy b/src/main/groovy-tests/jeiTests.groovy index eaa912bf..5e6f9594 100644 --- a/src/main/groovy-tests/jeiTests.groovy +++ b/src/main/groovy-tests/jeiTests.groovy @@ -3,6 +3,8 @@ import net.minecraft.util.text.TextFormatting import static com.nomiceu.nomilabs.groovy.GroovyHelpers.JEIHelpers.* import static com.nomiceu.nomilabs.groovy.GroovyHelpers.TranslationHelpers.* +// JEI Helpers. (Goes in Post Init) + /* Description Pages. Each entry is seperated by double new lines. */ // Add a description page for a stack diff --git a/src/main/groovy-tests/keybindOverrideTests.groovy b/src/main/groovy-tests/keybindOverrideTests.groovy new file mode 100644 index 00000000..1e47d0b0 --- /dev/null +++ b/src/main/groovy-tests/keybindOverrideTests.groovy @@ -0,0 +1,20 @@ +import com.nomiceu.nomilabs.util.LabsSide +import net.minecraftforge.client.settings.KeyModifier +import org.lwjgl.input.Keyboard + +import static com.nomiceu.nomilabs.groovy.GroovyHelpers.KeyBindingHelpers.* + +// Override Default Keybinds! (Goes in Post Init) + +// Doesn't matter on Server +// IMPORTANT! This stops the script from crashing on servers! +if (LabsSide.isDedicatedServer()) return + +// Change Default Sprint Keybind to 'W' (Same as forwards, essentially toggle-sprint) +addOverride('key.sprint', Keyboard.KEY_W) + +// Change Default Advancements Keybind to None +addOverride('key.advancements', Keyboard.KEY_NONE) + +// Change Drop key to 'CTRL + Q' +addOverride('key.drop', KeyModifier.CONTROL, Keyboard.KEY_Q) diff --git a/src/main/groovy-tests/oreDictTests.groovy b/src/main/groovy-tests/oreDictTests.groovy index 371253eb..f172b457 100644 --- a/src/main/groovy-tests/oreDictTests.groovy +++ b/src/main/groovy-tests/oreDictTests.groovy @@ -1,3 +1,5 @@ +// Ore Dict Helpers. Goes in Post Init. + // Note that just like groovy's default, removing Ore Dictionaries that apply to all metas of a item // is quite buggy. diff --git a/src/main/groovy-tests/recipeMapTests.groovy b/src/main/groovy-tests/recipeMapTests.groovy index 468180f9..535ccefb 100644 --- a/src/main/groovy-tests/recipeMapTests.groovy +++ b/src/main/groovy-tests/recipeMapTests.groovy @@ -6,6 +6,8 @@ import gregtech.api.recipes.ingredients.nbtmatch.NBTMatcher import static com.nomiceu.nomilabs.groovy.GroovyHelpers.GTRecipeHelpers.* +// Find and Removing GT Recipe Helpers. Goes in Post Init. + // Building Test Recipes mods.gregtech.arc_furnace.recipeBuilder().inputs(metaitem('nomilabs:dustImpureOsmiridium8020')).outputs(item('minecraft:apple') * 64, item('minecraft:apple') * 64).EUt(50).duration(30).buildAndRegister() mods.gregtech.arc_furnace.recipeBuilder().inputs(item('minecraft:stick')).outputs(item('minecraft:apple') * 64).EUt(50).duration(30).buildAndRegister() diff --git a/src/main/groovy-tests/recipeRecyclingTests.groovy b/src/main/groovy-tests/recipeRecyclingTests.groovy index 43987d04..ae12aab1 100644 --- a/src/main/groovy-tests/recipeRecyclingTests.groovy +++ b/src/main/groovy-tests/recipeRecyclingTests.groovy @@ -1,7 +1,7 @@ // Imports all static functions from the recycling section of the groovy helpers import static com.nomiceu.nomilabs.groovy.GroovyHelpers.RecipeRecyclingHelpers.* -// This should be placed in PostInit! +// Crafting Recipe Recycling Helpers. Goes in Post Init. // All Replace Recipes only works for replacing recipes where: // output item, ignoring count, including meta, is the same as the old output item, ignoring count, including meta diff --git a/src/main/groovy-tests/replaceCompositionTests.groovy b/src/main/groovy-tests/replaceCompositionTests.groovy index a5da67b3..24aed694 100644 --- a/src/main/groovy-tests/replaceCompositionTests.groovy +++ b/src/main/groovy-tests/replaceCompositionTests.groovy @@ -5,7 +5,7 @@ import static com.nomiceu.nomilabs.groovy.GroovyHelpers.ChangeCompositionHelpers // Imports Mixer Specification, needed to specify Mixer Specification if specifying how to change Mixer import static com.nomiceu.nomilabs.groovy.CompositionBuilder.MixerSpecification -// Replace Composition (changes specified) +// Replace Composition (changes specified). Goes in Post Init. // THESE DO NOT APPLY UNTIL AFTER ALL POST INIT SCRIPTS ARE RUN! diff --git a/src/main/java/com/nomiceu/nomilabs/LabsValues.java b/src/main/java/com/nomiceu/nomilabs/LabsValues.java index bf9103d6..d7276f0f 100644 --- a/src/main/java/com/nomiceu/nomilabs/LabsValues.java +++ b/src/main/java/com/nomiceu/nomilabs/LabsValues.java @@ -33,4 +33,5 @@ public class LabsValues { public static final String ARCHITECTURE_MODID = "architecturecraft"; public static final String EFFORTLESS_MODID = "effortlessbuilding"; public static final String BQU_MODID = "betterquesting"; + public static final String CONTROLLING_MODID = "controlling"; } diff --git a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java index 4078ddb4..ee1faefe 100644 --- a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java +++ b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java @@ -348,6 +348,12 @@ public static class Advanced { @Config.Name("tier settings") public final TierSettings tierSettings = new TierSettings(); + @Config.Comment({"Control Menu Tooltip Settings, which are used to help with default keybind overrides..", + "The actual override setting occurs in GroovyScript!"}) + @Config.LangKey("config.nomilabs.advanced.controls_tooltips") + @Config.Name("control menu tooltip settings") + public final ControlMenuTooltipSettings controlMenuTooltipSettings = new ControlMenuTooltipSettings(); + @Config.Comment({"List of Regex Patterns to ignore if they are included in the ITEM missing registry list.", "Do not change unless you know what you are doing!", "This can be very inefficient with lots of patterns and lots of missing registries. Try to condense it into one pattern!", @@ -475,5 +481,19 @@ public enum DefaultModeType { EXPERT } } + + public static class ControlMenuTooltipSettings { + @Config.Comment({"Whether to show the keybind ID, if hovering over a keybind and pressing SHIFT.", + "The ID is used in default keybind overriding, as the ID specifies which keybind to override.", + "[default: true]"}) + @Config.LangKey("config.nomilabs.advanced.controls_tooltips.show_id") + public boolean showID = true; + + @Config.Comment({"Whether to show the keybind's Class, if hovering over a keybind and pressing CTRL.", + "If the class is not 'net.minecraft.client.settings.KeyBinding', default keybind overriding may not work for that keybind!", + "[default: false]"}) + @Config.LangKey("config.nomilabs.advanced.controls_tooltips.show_class") + public boolean showClass = false; + } } } diff --git a/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java b/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java index 07e1a5c7..a01ead07 100644 --- a/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java +++ b/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java @@ -31,7 +31,8 @@ public class LabsLateMixin implements ILateMixinLoader { LabsConfig.modIntegration.enableArchitectureCraftIntegration), new AbstractMap.SimpleImmutableEntry<>(LabsValues.EFFORTLESS_MODID, LabsConfig.modIntegration.effortlessBuildingIntegration.enableEffortlessBuildingIntegration), - new AbstractMap.SimpleImmutableEntry<>(LabsValues.GROOVY_MODID, true) + new AbstractMap.SimpleImmutableEntry<>(LabsValues.GROOVY_MODID, true), + new AbstractMap.SimpleImmutableEntry<>(LabsValues.CONTROLLING_MODID, true) ) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); diff --git a/src/main/java/com/nomiceu/nomilabs/groovy/GroovyHelpers.java b/src/main/java/com/nomiceu/nomilabs/groovy/GroovyHelpers.java index 10673302..508356b1 100644 --- a/src/main/java/com/nomiceu/nomilabs/groovy/GroovyHelpers.java +++ b/src/main/java/com/nomiceu/nomilabs/groovy/GroovyHelpers.java @@ -23,6 +23,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.client.settings.KeyModifier; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.Loader; @@ -249,6 +250,16 @@ public static ChancedFluidOutput chanced(FluidStack fluid, int chance, int chanc } } + public static class KeyBindingHelpers { + public static void addOverride(String id, int keyCode) { + addOverride(id, KeyModifier.NONE, keyCode); + } + + public static void addOverride(String id, KeyModifier modifier, int keyCode) { + KeyBindingHelper.addKeybindOverride(id, modifier, keyCode); + } + } + public static class MiscHelpers { public static void removeDraconicFusionRecipe(ItemStack catalyst, ItemStack result) { if (!Loader.isModLoaded(LabsValues.DRACONIC_MODID)) return; diff --git a/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java b/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java new file mode 100644 index 00000000..f64e438a --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java @@ -0,0 +1,36 @@ +package com.nomiceu.nomilabs.groovy; + +import com.cleanroommc.groovyscript.api.GroovyBlacklist; +import com.nomiceu.nomilabs.config.LabsConfig; +import com.nomiceu.nomilabs.groovy.mixinhelper.AccessibleKeyBinding; +import com.nomiceu.nomilabs.mixin.KeyBindingAccessor; +import com.nomiceu.nomilabs.tooltip.LabsTooltipHelper; +import com.nomiceu.nomilabs.util.LabsGroovyHelper; +import com.nomiceu.nomilabs.util.LabsTranslate; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.settings.KeyBinding; +import net.minecraftforge.client.settings.KeyModifier; + +@GroovyBlacklist +public class KeyBindingHelper { + public static void drawKeybindingTooltip(int mouseX, int mouseY, FontRenderer fontRenderer, KeyBinding keybinding) { + fontRenderer.drawString(LabsTranslate.translate(keybinding.getKeyCategory()), mouseX + 10, mouseY, 0xFFFFFF); + var spacing = fontRenderer.FONT_HEIGHT; + var currentSpacing = spacing; + if (LabsTooltipHelper.isShiftDown() && LabsConfig.advanced.controlMenuTooltipSettings.showID) { + fontRenderer.drawString(keybinding.getKeyDescription(), mouseX + 10, mouseY + spacing, 0x808080); + currentSpacing += spacing; + } + if (LabsTooltipHelper.isCtrlDown() && LabsConfig.advanced.controlMenuTooltipSettings.showClass) + fontRenderer.drawString(keybinding.getClass().getName(), mouseX + 10, mouseY + currentSpacing, 0x505050); + } + + public static void addKeybindOverride(String id, KeyModifier modifier, int keyCode) { + if (!KeyBindingAccessor.getKeybindRegistry().containsKey(id)) { + LabsGroovyHelper.throwOrGroovyLog(new IllegalArgumentException("Keybind with ID " + id + " was not found!")); + return; + } + ((AccessibleKeyBinding) KeyBindingAccessor.getKeybindRegistry().get(id)) + .setDefaultKeyModifierAndCode(modifier, keyCode); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/groovy/LabsVirtualizedRegistries.java b/src/main/java/com/nomiceu/nomilabs/groovy/LabsVirtualizedRegistries.java index c687ed15..7171861e 100644 --- a/src/main/java/com/nomiceu/nomilabs/groovy/LabsVirtualizedRegistries.java +++ b/src/main/java/com/nomiceu/nomilabs/groovy/LabsVirtualizedRegistries.java @@ -2,13 +2,16 @@ import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.cleanroommc.groovyscript.registry.VirtualizedRegistry; +import com.nomiceu.nomilabs.NomiLabs; import com.nomiceu.nomilabs.integration.jei.JEIPlugin; import com.nomiceu.nomilabs.util.ItemMeta; import com.nomiceu.nomilabs.util.ItemTagMeta; +import com.nomiceu.nomilabs.util.LabsSide; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.stack.ItemMaterialInfo; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.client.FMLClientHandler; import org.apache.commons.lang3.tuple.Pair; import java.util.*; @@ -21,6 +24,7 @@ public class LabsVirtualizedRegistries { public static final ReplaceRecyclingManager REPLACE_RECYCLING_MANAGER = new ReplaceRecyclingManager(); public static final ReplaceCompositionManager REPLACE_DECOMP_MANAGER = new ReplaceCompositionManager(); public static final JEIManager JEI_MANAGER = new JEIManager(); + public static final DefaultKeybindOverrideManager DEFAULT_KEYBIND_OVERRIDE_MANAGER = new DefaultKeybindOverrideManager(); public static class ReplaceCompositionManager extends VirtualizedRegistry { public final Deque needReloading = new ArrayDeque<>(); @@ -79,4 +83,19 @@ public void onReload() { JEIPlugin.onReload(); } } + + public static class DefaultKeybindOverrideManager extends VirtualizedRegistry { + @Override + public void onReload() { + + } + + // Re-read Options File to re-apply set Keybindings + @Override + public void afterScriptLoad() { + if (LabsSide.isDedicatedServer()) return; + NomiLabs.LOGGER.info("Reloading Options File."); + FMLClientHandler.instance().getClient().gameSettings.loadOptions(); + } + } } diff --git a/src/main/java/com/nomiceu/nomilabs/groovy/mixinhelper/AccessibleKeyBinding.java b/src/main/java/com/nomiceu/nomilabs/groovy/mixinhelper/AccessibleKeyBinding.java new file mode 100644 index 00000000..e5402388 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/groovy/mixinhelper/AccessibleKeyBinding.java @@ -0,0 +1,7 @@ +package com.nomiceu.nomilabs.groovy.mixinhelper; + +import net.minecraftforge.client.settings.KeyModifier; + +public interface AccessibleKeyBinding { + void setDefaultKeyModifierAndCode(KeyModifier modifier, int keyCode); +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListAccessor.java b/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListAccessor.java new file mode 100644 index 00000000..080f1884 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListAccessor.java @@ -0,0 +1,12 @@ +package com.nomiceu.nomilabs.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiKeyBindingList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GuiKeyBindingList.class) +public interface GuiKeyBindingListAccessor { + @Accessor(value = "mc") + Minecraft getMc(); +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListKeyEntryMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListKeyEntryMixin.java new file mode 100644 index 00000000..b618f39d --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/GuiKeyBindingListKeyEntryMixin.java @@ -0,0 +1,34 @@ +package com.nomiceu.nomilabs.mixin; + +import com.nomiceu.nomilabs.groovy.KeyBindingHelper; +import net.minecraft.client.gui.GuiKeyBindingList; +import net.minecraft.client.settings.KeyBinding; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Allows a tooltip over each keybind, stating the category and id. + */ +@Mixin(GuiKeyBindingList.KeyEntry.class) +public abstract class GuiKeyBindingListKeyEntryMixin { + @Shadow(aliases = "this$0") + @Final + GuiKeyBindingList this$0; + + @Shadow + @Final + private KeyBinding keybinding; + + @Inject(method = "drawEntry", at = @At("TAIL")) + public void drawTooltips(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected, float partialTicks, CallbackInfo ci) { + if (mouseY >= y && mouseY <= y + slotHeight) { + var fontRenderer = ((GuiKeyBindingListAccessor) this$0).getMc().fontRenderer; + + KeyBindingHelper.drawKeybindingTooltip(mouseX, mouseY, fontRenderer, keybinding); + } + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java b/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java new file mode 100644 index 00000000..570ca7b9 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java @@ -0,0 +1,16 @@ +package com.nomiceu.nomilabs.mixin; + +import net.minecraft.client.settings.KeyBinding; +import org.apache.commons.lang3.NotImplementedException; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(KeyBinding.class) +public interface KeyBindingAccessor { + @Accessor(value = "KEYBIND_ARRAY") + static Map getKeybindRegistry() { + throw new NotImplementedException("KeyBindingAccessor Failed to Apply!"); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java new file mode 100644 index 00000000..9f555c83 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java @@ -0,0 +1,33 @@ +package com.nomiceu.nomilabs.mixin; + +import com.nomiceu.nomilabs.groovy.mixinhelper.AccessibleKeyBinding; +import net.minecraft.client.settings.KeyBinding; +import net.minecraftforge.client.settings.KeyModifier; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +/** + * Allows Setting of Default Key Codes and Modifies. + */ +@Mixin(KeyBinding.class) +public abstract class KeyBindingMixin implements AccessibleKeyBinding { + @Shadow + @Final + @Mutable + private int keyCodeDefault; + + @Shadow + private KeyModifier keyModifierDefault; + + @Shadow + public abstract void setKeyModifierAndCode(KeyModifier keyModifier, int keyCode); + + @Override + public void setDefaultKeyModifierAndCode(KeyModifier modifier, int keyCode) { + keyCodeDefault = keyCode; + keyModifierDefault = modifier; + setKeyModifierAndCode(modifier, keyCode); + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/controlling/GuiNewKeyBindingListAccessor.java b/src/main/java/com/nomiceu/nomilabs/mixin/controlling/GuiNewKeyBindingListAccessor.java new file mode 100644 index 00000000..3ad0bd65 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/controlling/GuiNewKeyBindingListAccessor.java @@ -0,0 +1,18 @@ +package com.nomiceu.nomilabs.mixin.controlling; + +import net.minecraft.client.Minecraft; +import org.apache.commons.lang3.NotImplementedException; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import us.getfluxed.controlsearch.client.gui.GuiNewKeyBindingList; + +@Mixin(value = GuiNewKeyBindingList.class, remap = false) +public interface GuiNewKeyBindingListAccessor { + @Accessor(value = "wrapped") + static int getWrapped() { + throw new NotImplementedException("GuiNewKeyBindingListAccessor failed to apply!"); + } + + @Accessor(value = "mc") + Minecraft getMc(); +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/controlling/GuiNewKeyBindingListKeyEntryMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/controlling/GuiNewKeyBindingListKeyEntryMixin.java new file mode 100644 index 00000000..723ae5cd --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/controlling/GuiNewKeyBindingListKeyEntryMixin.java @@ -0,0 +1,38 @@ +package com.nomiceu.nomilabs.mixin.controlling; + +import com.nomiceu.nomilabs.groovy.KeyBindingHelper; +import net.minecraft.client.settings.KeyBinding; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import us.getfluxed.controlsearch.client.gui.GuiNewKeyBindingList; + +/** + * Allows a tooltip over each keybind, stating the id. + *

+ * Also fixes tooltips not rendering correctly. + */ +@Mixin(value = GuiNewKeyBindingList.KeyEntry.class, remap = false) +public class GuiNewKeyBindingListKeyEntryMixin { + @Shadow + @Final + private KeyBinding keybinding; + + @Shadow + @Final + GuiNewKeyBindingList this$0; + + // This injects after the second call to DrawButton in the method. (Just before drawing tooltips) + @Inject(method = "drawEntry", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiButton;drawButton(Lnet/minecraft/client/Minecraft;IIF)V", shift = At.Shift.AFTER, ordinal = 1), cancellable = true, require = 1, remap = true) + public void addTooltip(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected, float p_192634_9_, CallbackInfo ci) { + int wrapped = GuiNewKeyBindingListAccessor.getWrapped() + 1; // Wrapped is -1 less than the amount of slot heights, so we need wrapped + 1. + var fontRenderer = ((GuiNewKeyBindingListAccessor) this$0).getMc().fontRenderer; + if (mouseY >= y && mouseY <= y + slotHeight * wrapped) { + KeyBindingHelper.drawKeybindingTooltip(mouseX, mouseY, fontRenderer, keybinding); + } + ci.cancel(); + } +} diff --git a/src/main/resources/assets/nomilabs/lang/en_us.lang b/src/main/resources/assets/nomilabs/lang/en_us.lang index e61296fd..b001a70a 100644 --- a/src/main/resources/assets/nomilabs/lang/en_us.lang +++ b/src/main/resources/assets/nomilabs/lang/en_us.lang @@ -90,6 +90,10 @@ config.nomilabs.advanced.fluid_registry.tooltip=Fluid Registry Settings config.nomilabs.advanced.fluid_registry.default_fluids=Default Fluids config.nomilabs.advanced.fluid_registry.log_conflicting_fluids=Log Conflicting Fluids +config.nomilabs.advanced.controls_tooltips=Controls Menu Tooltips Settings +config.nomilabs.advanced.controls_tooltips.show_id=Show ID Tooltip +config.nomilabs.advanced.controls_tooltips.show_class=Show Class Tooltip + # GUI gui.nomilabs.recipes.tooltip.ct_recipe=CraftTweaker Recipe. gui.nomilabs.recipes.tooltip.gs_recipe=GroovyScript Recipe. diff --git a/src/main/resources/mixins.nomilabs.controlling.json b/src/main/resources/mixins.nomilabs.controlling.json new file mode 100644 index 00000000..65ab6c8c --- /dev/null +++ b/src/main/resources/mixins.nomilabs.controlling.json @@ -0,0 +1,13 @@ +{ + "package": "com.nomiceu.nomilabs.mixin.controlling", + "refmap": "mixins.nomilabs.refmap.json", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": [], + "client": [ + "GuiNewKeyBindingListAccessor", + "GuiNewKeyBindingListKeyEntryMixin" + ], + "server": [] +} diff --git a/src/main/resources/mixins.nomilabs.json b/src/main/resources/mixins.nomilabs.json index b43bd622..cb9801e1 100644 --- a/src/main/resources/mixins.nomilabs.json +++ b/src/main/resources/mixins.nomilabs.json @@ -11,6 +11,11 @@ "NarratorMixin", "WorldLoadHandler" ], - "client": [], + "client": [ + "GuiKeyBindingListAccessor", + "GuiKeyBindingListKeyEntryMixin", + "KeyBindingAccessor", + "KeyBindingMixin" + ], "server": [] }