Skip to content

Commit

Permalink
Fix Reloading of Keybind Overrides
Browse files Browse the repository at this point in the history
  • Loading branch information
IntegerLimit committed Aug 10, 2024
1 parent de05824 commit a49b0cf
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/main/groovy-tests/keybindOverrideTests.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import static com.nomiceu.nomilabs.groovy.GroovyHelpers.KeyBindingHelpers.*
// 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)
// Change Default Sprint Keybind to 'W' (Same as forwards, essentially auto-sprint)
addOverride('key.sprint', Keyboard.KEY_W)

// Change Default Advancements Keybind to None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ public static void addOverride(String id, int keyCode) {
}

public static void addOverride(String id, KeyModifier modifier, int keyCode) {
KeyBindingHelper.addKeybindOverride(id, modifier, keyCode);
LabsVirtualizedRegistries.KEYBIND_OVERRIDES_MANAGER.addOverride(id, modifier, keyCode);
}
}

Expand Down
37 changes: 35 additions & 2 deletions src/main/java/com/nomiceu/nomilabs/groovy/KeyBindingHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,48 @@ public static void drawKeybindingTooltip(int mouseX, int mouseY, FontRenderer fo
fontRenderer.drawString(keybinding.getClass().getName(), mouseX + 10, mouseY + currentSpacing, 0x505050);
}

public static void addKeybindOverride(String id, KeyModifier modifier, int keyCode) {
public static boolean invalidID(String id) {
if (!KeyBindingAccessor.getKeybindRegistry().containsKey(id)) {
LabsGroovyHelper
.throwOrGroovyLog(new IllegalArgumentException("Keybind with ID " + id + " was not found!"));
NomiLabs.LOGGER.info("Available Keybind IDs: {}", KeyBindingAccessor.getKeybindRegistry().keySet());
GroovyLog.get().info("Available Keybind IDs: " + KeyBindingAccessor.getKeybindRegistry().keySet());
return;
return true;
}
return false;
}

public static KeybindOverrideSpecification getExisting(String id) {
var existing = KeyBindingAccessor.getKeybindRegistry().get(id);
return new KeybindOverrideSpecification(id, existing.getKeyModifierDefault(), existing.getKeyCodeDefault());
}

public static void addKeybindOverride(String id, KeyModifier modifier, int keyCode) {
((AccessibleKeyBinding) KeyBindingAccessor.getKeybindRegistry().get(id))
.setDefaultKeyModifierAndCode(modifier, keyCode);
}

public static class KeybindOverrideSpecification {
private final String id;
private final KeyModifier modifier;
private final int keyCode;

public KeybindOverrideSpecification(String id, KeyModifier modifier, int keyCode) {
this.id = id;
this.modifier = modifier;
this.keyCode = keyCode;
}

public String getId() {
return id;
}

public KeyModifier getModifier() {
return modifier;
}

public int getKeyCode() {
return keyCode;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,6 @@ public void onCompatLoaded(GroovyContainer<?> container) {

container.addProperty(LabsVirtualizedRegistries.REPLACE_RECYCLING_MANAGER);
container.addProperty(LabsVirtualizedRegistries.REPLACE_DECOMP_MANAGER);
container.addProperty(LabsVirtualizedRegistries.KEYBIND_OVERRIDES_MANAGER);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import static com.nomiceu.nomilabs.groovy.CompositionBuilder.CompositionSpecification;
import static com.nomiceu.nomilabs.util.LabsGroovyHelper.LABS_GROOVY_RUNNING;
import static com.nomiceu.nomilabs.groovy.KeyBindingHelper.KeybindOverrideSpecification;

import java.util.*;

import net.minecraft.item.ItemStack;

import net.minecraftforge.client.settings.KeyModifier;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.Nullable;

Expand All @@ -22,11 +24,12 @@
import gregtech.api.unification.stack.ItemMaterialInfo;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;

@SuppressWarnings("unused")
@SuppressWarnings({ "unused", "ClassCanBeRecord" })
public class LabsVirtualizedRegistries {

public static final ReplaceRecyclingManager REPLACE_RECYCLING_MANAGER = new ReplaceRecyclingManager();
public static final ReplaceCompositionManager REPLACE_DECOMP_MANAGER = new ReplaceCompositionManager();
public static final KeybindOverridesManager KEYBIND_OVERRIDES_MANAGER = new KeybindOverridesManager();

public static class ReplaceCompositionManager extends VirtualizedRegistry<CompositionSpecification> {

Expand All @@ -52,7 +55,7 @@ public void changeMaterialDecomp(CompositionSpecification spec) {
}
}

public static class ReplaceRecyclingManager extends VirtualizedRegistry<Pair<ItemMeta, ItemMaterialInfo>> {
public static class ReplaceRecyclingManager extends VirtualizedRegistry<RecyclingSpecification> {

public final Map<ItemMeta, ItemMaterialInfo> needReloading = new Object2ObjectOpenHashMap<>();

Expand All @@ -64,17 +67,17 @@ public static class ReplaceRecyclingManager extends VirtualizedRegistry<Pair<Ite

@Override
public void onReload() {
removeScripted().forEach((pair) -> {
removeScripted().forEach((spec) -> {
// These will be overrided by values in `restoreFromBackup` if they existed before.
OreDictUnifierAccessor.getMaterialUnificationInfo()
.remove(new ItemAndMetadata(pair.getLeft().toStack()));
needReloading.put(pair.getLeft(), null);
.remove(new ItemAndMetadata(spec.getItemMeta().toStack()));
needReloading.put(spec.getItemMeta(), null);
});
restoreFromBackup().forEach((pair) -> {
if (pair.getValue() != null) OreDictUnifier.registerOre(pair.getLeft().toStack(), pair.getRight());
restoreFromBackup().forEach((spec) -> {
if (spec.getInfo() != null) OreDictUnifier.registerOre(spec.getItemMeta().toStack(), spec.getInfo());
else OreDictUnifierAccessor.getMaterialUnificationInfo()
.remove(new ItemAndMetadata(pair.getLeft().toStack()));
needReloading.put(pair.getLeft(), pair.getRight());
.remove(new ItemAndMetadata(spec.getItemMeta().toStack()));
needReloading.put(spec.getItemMeta(), spec.getInfo());
});
addedNbtConditions.clear();
}
Expand All @@ -93,21 +96,21 @@ public void afterScriptLoad() {
}

@Override
protected AbstractReloadableStorage<Pair<ItemMeta, ItemMaterialInfo>> createRecipeStorage() {
protected AbstractReloadableStorage<RecyclingSpecification> createRecipeStorage() {
return new AbstractReloadableStorage<>() {

@Override
protected boolean compareRecipe(Pair<ItemMeta, ItemMaterialInfo> a,
Pair<ItemMeta, ItemMaterialInfo> b) {
return a.getKey().equals(b.getKey());
protected boolean compareRecipe(RecyclingSpecification a,
RecyclingSpecification b) {
return a.getItemMeta().equals(b.getItemMeta());
}
};
}

public void registerOre(ItemStack stack, ItemMaterialInfo info) {
var in = new ItemMeta(stack);
addBackup(Pair.of(in, OreDictUnifier.getMaterialInfo(stack)));
addScripted(Pair.of(in, info));
addBackup(new RecyclingSpecification(in, OreDictUnifier.getMaterialInfo(stack)));
addScripted(new RecyclingSpecification(in, info));
needReloading.put(in, info);
OreDictUnifier.registerOre(stack, info);
}
Expand All @@ -116,4 +119,36 @@ public void registerNBTHandling(ItemStack stack, NBTMatcher matcher, NBTConditio
addedNbtConditions.put(new ItemMeta(stack), Pair.of(matcher, condition));
}
}

public static class KeybindOverridesManager extends VirtualizedRegistry<KeybindOverrideSpecification> {

@Override
public void onReload() {
restoreFromBackup().forEach((spec) -> KeyBindingHelper.addKeybindOverride(spec.getId(), spec.getModifier(), spec.getKeyCode()));
}

public void addOverride(String id, KeyModifier modifier, int keyCode) {
if (KeyBindingHelper.invalidID(id)) return;
addBackup(KeyBindingHelper.getExisting(id));
KeyBindingHelper.addKeybindOverride(id, modifier, keyCode);
}
}

public static class RecyclingSpecification {
private final ItemMeta itemMeta;
private final ItemMaterialInfo info;

public RecyclingSpecification(ItemMeta itemMeta, ItemMaterialInfo info) {
this.itemMeta = itemMeta;
this.info = info;
}

public ItemMeta getItemMeta() {
return itemMeta;
}

public ItemMaterialInfo getInfo() {
return info;
}
}
}

0 comments on commit a49b0cf

Please sign in to comment.