Skip to content

Commit

Permalink
Allow Setting of Default Keybinds
Browse files Browse the repository at this point in the history
  • Loading branch information
IntegerLimit committed Apr 1, 2024
1 parent 7c99dc8 commit 9f929d9
Show file tree
Hide file tree
Showing 26 changed files with 314 additions and 5 deletions.
7 changes: 7 additions & 0 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy-tests/customRecipeClassTests.groovy
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy-tests/forMaterialTests.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy-tests/jeiTests.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions src/main/groovy-tests/keybindOverrideTests.groovy
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 2 additions & 0 deletions src/main/groovy-tests/oreDictTests.groovy
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy-tests/recipeMapTests.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion src/main/groovy-tests/recipeRecyclingTests.groovy
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/main/groovy-tests/replaceCompositionTests.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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!

Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/nomiceu/nomilabs/LabsValues.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
20 changes: 20 additions & 0 deletions src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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!",
Expand Down Expand Up @@ -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;
}
}
}
3 changes: 2 additions & 1 deletion src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/nomiceu/nomilabs/groovy/GroovyHelpers.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
36 changes: 36 additions & 0 deletions src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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<CompositionSpecification> {
public final Deque<CompositionSpecification> needReloading = new ArrayDeque<>();
Expand Down Expand Up @@ -79,4 +83,19 @@ public void onReload() {
JEIPlugin.onReload();
}
}

public static class DefaultKeybindOverrideManager extends VirtualizedRegistry<String> {
@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();
}
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingAccessor.java
Original file line number Diff line number Diff line change
@@ -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<String, KeyBinding> getKeybindRegistry() {
throw new NotImplementedException("KeyBindingAccessor Failed to Apply!");
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/nomiceu/nomilabs/mixin/KeyBindingMixin.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Loading

0 comments on commit 9f929d9

Please sign in to comment.