diff --git a/CHANGELOG.md b/CHANGELOG.md index 578d122b..f680b74d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [26.1.2.4-beta] + +### Added +* Added an API abstraction for keybind registration + * Specifically to handle the differences in how key modifiers are handled via NeoForge (builtin) and Fabric (via AMECS mod, maybe others in future) + +### Fixed +* Fixed an issue with `EditStringConfigOverlay` causing `accepted` to be `false` on callbacks when value unchanged, even if Accept is pressed + ## [26.1.2.3-beta] ### Fixed diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibrary.java b/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibrary.java index c0a5463f..c12eab4f 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibrary.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibrary.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary; +import com.mojang.brigadier.CommandDispatcher; import dev.ftb.mods.ftblibrary.config.FTBLibraryClientConfig; import dev.ftb.mods.ftblibrary.config.FTBLibraryServerConfig; import dev.ftb.mods.ftblibrary.config.FTBLibraryStartupConfig; @@ -15,7 +16,6 @@ import dev.ftb.mods.ftblibrary.util.ModUtils; import dev.ftb.mods.ftblibrary.util.text.ExtendableTextColor; import dev.ftb.mods.ftblibrary.util.text.RainbowTextColor; -import com.mojang.brigadier.CommandDispatcher; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibraryCommands.java b/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibraryCommands.java index f6205a61..3cea43f5 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibraryCommands.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/FTBLibraryCommands.java @@ -1,5 +1,10 @@ package dev.ftb.mods.ftblibrary; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.JsonOps; import dev.ftb.mods.ftblibrary.config.FTBLibraryClientConfig; import dev.ftb.mods.ftblibrary.config.FTBLibraryServerConfig; import dev.ftb.mods.ftblibrary.nbtedit.NBTEditResponseHandlers; @@ -11,11 +16,6 @@ import dev.ftb.mods.ftblibrary.platform.network.Server2PlayNetworking; import dev.ftb.mods.ftblibrary.util.ModUtils; import dev.ftb.mods.ftblibrary.util.RegistryHelper; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.serialization.JsonOps; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableColor.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableColor.java index 6b10ef16..650611e7 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableColor.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableColor.java @@ -1,13 +1,12 @@ package dev.ftb.mods.ftblibrary.client.config.editable; import dev.ftb.mods.ftblibrary.client.config.ConfigCallback; +import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.widget.ColorSelectorPanel; import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; -import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icon; import net.minecraft.network.chat.Component; -import org.jspecify.annotations.Nullable; public class EditableColor extends EditableConfigValue { private boolean allowAlphaEdit = false; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableEntityFace.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableEntityFace.java index 2ea354c4..77d041c3 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableEntityFace.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableEntityFace.java @@ -4,9 +4,9 @@ import dev.ftb.mods.ftblibrary.client.config.gui.resource.EntityFaceResource; import dev.ftb.mods.ftblibrary.client.config.gui.resource.SelectEntityFaceScreen; import dev.ftb.mods.ftblibrary.client.config.gui.resource.SelectableResource; +import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; -import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.util.TooltipList; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableImageResource.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableImageResource.java index 5ceceafe..3675d7c5 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableImageResource.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableImageResource.java @@ -5,9 +5,9 @@ import dev.ftb.mods.ftblibrary.client.config.gui.resource.ImageResource; import dev.ftb.mods.ftblibrary.client.config.gui.resource.SelectImageResourceScreen; import dev.ftb.mods.ftblibrary.client.config.gui.resource.SelectableResource; +import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; -import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.icon.IResourceIcon; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.util.TooltipList; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableItemStack.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableItemStack.java index 83ebacda..fb72c336 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableItemStack.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableItemStack.java @@ -3,8 +3,8 @@ import dev.ftb.mods.ftblibrary.client.config.ConfigCallback; import dev.ftb.mods.ftblibrary.client.config.gui.resource.SelectItemStackScreen; import dev.ftb.mods.ftblibrary.client.config.gui.resource.SelectableResource; -import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; +import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import org.apache.commons.lang3.Validate; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableNumber.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableNumber.java index 7d5a73c9..1d10ff28 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableNumber.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableNumber.java @@ -4,7 +4,6 @@ import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.util.StringUtils; import net.minecraft.network.chat.Component; -import org.jspecify.annotations.Nullable; public abstract class EditableNumber extends EditableStringifiedConfig { public static final Color4I COLOR = Color4I.rgb(0xAA5AE8); diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableStringifiedConfig.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableStringifiedConfig.java index 361ac7c4..64db4499 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableStringifiedConfig.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableStringifiedConfig.java @@ -2,9 +2,9 @@ import dev.ftb.mods.ftblibrary.client.config.ConfigCallback; import dev.ftb.mods.ftblibrary.client.config.gui.EditStringConfigOverlay; +import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.widget.BaseScreen; import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; -import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import net.minecraft.network.chat.Component; import org.jspecify.annotations.Nullable; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableVariantConfig.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableVariantConfig.java index 4ba4e7ce..1bb6b3c3 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableVariantConfig.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/editable/EditableVariantConfig.java @@ -1,8 +1,8 @@ package dev.ftb.mods.ftblibrary.client.config.editable; import dev.ftb.mods.ftblibrary.client.config.ConfigCallback; -import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; +import dev.ftb.mods.ftblibrary.client.gui.widget.Widget; /** * A config value with some well-defined options, which can be cycled through. diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigListScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigListScreen.java index ae779434..e1934f91 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigListScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigListScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.client.config.gui; +import com.mojang.blaze3d.platform.InputConstants; import dev.ftb.mods.ftblibrary.client.config.ConfigCallback; import dev.ftb.mods.ftblibrary.client.config.editable.EditableConfigValue; import dev.ftb.mods.ftblibrary.client.config.editable.EditableList; @@ -16,7 +17,6 @@ import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.util.TooltipList; -import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigScreen.java index 45d2cdb6..5dea4259 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditConfigScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.client.config.gui; +import com.mojang.blaze3d.platform.InputConstants; import dev.ftb.mods.ftblibrary.client.config.EditableConfigGroup; import dev.ftb.mods.ftblibrary.client.config.editable.EditableConfigValue; import dev.ftb.mods.ftblibrary.client.gui.input.Key; @@ -12,7 +13,6 @@ import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.util.TooltipList; -import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.resources.language.I18n; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditStringConfigOverlay.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditStringConfigOverlay.java index a8a1c366..0b824848 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditStringConfigOverlay.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/EditStringConfigOverlay.java @@ -100,7 +100,8 @@ public void drawBackground(GuiGraphicsExtractor graphics, Theme theme, int x, in protected void onAccepted(Button btn, MouseButton mb) { if (textBox.isTextValid()) { - callback.save(config.updateValue(currentValue)); + config.updateValue(currentValue); + callback.save(true); getGui().popModalPanel(); } } diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/resource/FluidStackResource.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/resource/FluidStackResource.java index b8a331a9..b3fd0adb 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/resource/FluidStackResource.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/config/gui/resource/FluidStackResource.java @@ -4,7 +4,6 @@ import dev.ftb.mods.ftblibrary.client.util.TextureAtlasSpriteRef; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icon; -import dev.ftb.mods.ftblibrary.icon.TextureAtlasSpriteIcon; import dev.ftb.mods.ftblibrary.platform.fluid.FluidStack; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentPatch; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/input/Key.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/input/Key.java index 50b2098f..bc2c66a3 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/input/Key.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/input/Key.java @@ -1,7 +1,7 @@ package dev.ftb.mods.ftblibrary.client.gui.input; -import dev.ftb.mods.ftblibrary.platform.Platform; import com.mojang.blaze3d.platform.InputConstants; +import dev.ftb.mods.ftblibrary.platform.client.PlatformClient; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.input.KeyEvent; @@ -23,7 +23,7 @@ public boolean esc() { public boolean escOrInventory() { // arch expect //noinspection ConstantValue - return esc() || matchesWithoutConflicts(Minecraft.getInstance().options.keyInventory, getInputMapping()); + return esc() || matches(Minecraft.getInstance().options.keyInventory); } public boolean enter() { @@ -58,7 +58,7 @@ public KeyModifiers modifiers() { return new KeyModifiers(event.modifiers()); } - private static boolean matchesWithoutConflicts(KeyMapping keyBinding, InputConstants.Key keyCode) { - return Platform.get().misc().matchesWithoutConflicts(keyBinding, keyCode); + public boolean matches(KeyMapping keyMapping) { + return PlatformClient.get().input().matches(keyMapping, event); } } diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractGroupedButtonListScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractGroupedButtonListScreen.java index 4b69637a..5059f6e8 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractGroupedButtonListScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractGroupedButtonListScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.client.gui.screens; +import com.mojang.blaze3d.platform.InputConstants; import dev.ftb.mods.ftblibrary.client.gui.input.Key; import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; @@ -11,7 +12,6 @@ import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.util.Lazy; -import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractThreePanelScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractThreePanelScreen.java index 21ae11a7..3d66afbb 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractThreePanelScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/AbstractThreePanelScreen.java @@ -1,5 +1,7 @@ package dev.ftb.mods.ftblibrary.client.gui.screens; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.datafixers.util.Pair; import dev.ftb.mods.ftblibrary.client.gui.input.Key; import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.gui.theme.ThemeManager; @@ -7,8 +9,6 @@ import dev.ftb.mods.ftblibrary.client.icon.IconHelper; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icons; -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.datafixers.util.Pair; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/KeyReferenceScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/KeyReferenceScreen.java index ba9a7e54..532791f9 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/KeyReferenceScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/screens/KeyReferenceScreen.java @@ -8,7 +8,9 @@ import dev.ftb.mods.ftblibrary.client.gui.widget.*; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icons; +import dev.ftb.mods.ftblibrary.platform.client.PlatformClient; import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; @@ -24,10 +26,16 @@ public class KeyReferenceScreen extends BaseScreen { private final Panel textPanel; private final PanelScrollBar scrollBar; private final SimpleTextButton closeButton; - private final String[] translationKeys; + private final List> lines; + private int widestLeft = 0; + private int widestOverall = 0; public KeyReferenceScreen(String... translationKeys) { - this.translationKeys = translationKeys; + lines = buildText(translationKeys); + for (var line : lines) { + widestLeft = Math.max(widestLeft, getGui().getTheme().getStringWidth(line.getLeft())); + widestOverall = Math.max(widestOverall, widestLeft + getGui().getTheme().getStringWidth(line.getRight())); + } textPanel = new TextPanel(this); @@ -40,7 +48,7 @@ public void onClicked(MouseButton button) { scrollBar = new PanelScrollBar(this, textPanel); } - private static List> buildText(String... translationKeys) { + private List> buildText(String... translationKeys) { List> res = new ArrayList<>(); for (String translationKey : translationKeys) { for (String line : I18n.get(translationKey).split("\\n")) { @@ -50,7 +58,7 @@ private static List> buildText(String... translationK case 1 -> res.add(Pair.of(Component.literal(parts[0]).withStyle(ChatFormatting.YELLOW, ChatFormatting.UNDERLINE), Component.empty())); default -> - res.add(Pair.of(Component.literal(parts[0]), Component.literal(parts[1]).withStyle(ChatFormatting.GRAY))); + res.add(substituteKeyMapping(parts[0], parts[1])); } } res.add(Pair.of(Component.empty(), Component.empty())); @@ -58,9 +66,31 @@ private static List> buildText(String... translationK return res; } + private static Pair substituteKeyMapping(String part0, String part1) { + int s = part0.indexOf('{'); + int e = part0.indexOf('}'); + if (s >= 0 && e >= 0 && e > s + 1) { + String key = part0.substring(s + 1, e); + var keyMapping = KeyMapping.get(key); + if (keyMapping != null) { + var c0 = Component.literal(part0.substring(0, s)) + .append(PlatformClient.get().input().getKeyMappingDisplayName(keyMapping)) + .append(part0.substring(e + 1)); + Component c1 = part1.isEmpty() ? Component.translatable(keyMapping.getName()) : Component.literal(part1); + return Pair.of(c0, c1.copy().withStyle(ChatFormatting.GRAY)); + } + } + return Pair.of(Component.literal(part0), Component.literal(part1).withStyle(ChatFormatting.GRAY)); + } + @Override public boolean onInit() { - return setSizeProportional(0.75f, 0.8f); + boolean ok = setSizeProportional(0.75f, 0.8f); + + setWidth(Math.min(getWidth(), widestOverall + GUTTER_SIZE * 3 + 10)); + setHeight(Math.min(getHeight(), (getGui().getTheme().getFontHeight() + 2) * lines.size() + 10)); + + return ok; } @Override @@ -104,8 +134,7 @@ protected void drawTextBackground(GuiGraphicsExtractor graphics, Theme theme, in theme.drawPanelBackground(graphics, x, y, w, h); } - private static class TwoColumnList extends Widget { - private final int widestL; + private class TwoColumnList extends Widget { private final List> data; private final List> reflowed = new ArrayList<>(); @@ -113,10 +142,6 @@ public TwoColumnList(Panel p, List> data) { super(p); this.data = data; - this.widestL = data.stream() - .map(e -> getGui().getTheme().getStringWidth(e.getLeft())) - .max(Integer::compareTo) - .orElse(0); } @Override @@ -137,7 +162,7 @@ private void reflowText() { reflowed.add(Pair.of(entry.getLeft(), FormattedCharSequence.EMPTY)); h += theme.getFontHeight() + 3; } else { - var l = theme.getFont().split(entry.getRight(), maxWidth - 10 - widestL); + var l = theme.getFont().split(entry.getRight(), maxWidth - 10 - widestLeft); if (!l.isEmpty()) { reflowed.add(Pair.of(entry.getLeft(), l.getFirst())); for (int i = 1; i < l.size(); i++) { @@ -158,10 +183,10 @@ public void draw(GuiGraphicsExtractor graphics, Theme theme, int x, int y, int w for (var entry : reflowed) { boolean header = entry.getRight() == FormattedCharSequence.EMPTY; int leftWidth = theme.getStringWidth(entry.getLeft()); - int xOff = header ? (width - leftWidth) / 2 : widestL - leftWidth - 2; + int xOff = header ? (width - leftWidth) / 2 : widestLeft - leftWidth - 2; theme.drawString(graphics, entry.getLeft(), x + xOff, yPos); if (!header) { - theme.drawString(graphics, entry.getRight(), x + widestL + 10, yPos); + theme.drawString(graphics, entry.getRight(), x + widestLeft + 10, yPos); } yPos += theme.getFontHeight() + (header ? 3 : 1); } @@ -174,7 +199,7 @@ private class TextPanel extends Panel { public TextPanel(Panel panel) { super(panel); - textWidget = new TwoColumnList(this, buildText(translationKeys)); + textWidget = new TwoColumnList(this, lines); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/BaseScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/BaseScreen.java index 12f19f8a..423e8a2b 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/BaseScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/BaseScreen.java @@ -1,5 +1,7 @@ package dev.ftb.mods.ftblibrary.client.gui.widget; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.platform.Window; import dev.ftb.mods.ftblibrary.client.gui.CursorType; import dev.ftb.mods.ftblibrary.client.gui.WidgetType; import dev.ftb.mods.ftblibrary.client.gui.input.Key; @@ -11,8 +13,6 @@ import dev.ftb.mods.ftblibrary.client.util.ClientUtils; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.util.TooltipList; -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.platform.Window; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ColorSelectorPanel.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ColorSelectorPanel.java index 543b7154..d2fc44a7 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ColorSelectorPanel.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ColorSelectorPanel.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.client.gui.widget; +import com.google.common.primitives.Ints; import dev.ftb.mods.ftblibrary.FTBLibrary; import dev.ftb.mods.ftblibrary.client.config.ConfigCallback; import dev.ftb.mods.ftblibrary.client.config.editable.EditableColor; @@ -11,7 +12,6 @@ import dev.ftb.mods.ftblibrary.config.FTBLibraryClientConfig; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icon; -import com.google.common.primitives.Ints; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/MultilineTextBox.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/MultilineTextBox.java index a050568a..8c774d27 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/MultilineTextBox.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/MultilineTextBox.java @@ -4,8 +4,8 @@ import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.icon.IconHelper; -import dev.ftb.mods.ftblibrary.mixin.common.MultilineTextFieldAccess; import dev.ftb.mods.ftblibrary.icon.Color4I; +import dev.ftb.mods.ftblibrary.mixin.common.MultilineTextFieldAccess; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.MultilineTextField; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Panel.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Panel.java index f0c9e012..5a7eec5d 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Panel.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Panel.java @@ -1,6 +1,8 @@ package dev.ftb.mods.ftblibrary.client.gui.widget; -import dev.ftb.mods.ftblibrary.client.gui.*; +import dev.ftb.mods.ftblibrary.client.gui.CursorType; +import dev.ftb.mods.ftblibrary.client.gui.GuiHelper; +import dev.ftb.mods.ftblibrary.client.gui.MismatchingParentPanelException; import dev.ftb.mods.ftblibrary.client.gui.input.Key; import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; import dev.ftb.mods.ftblibrary.client.gui.layout.WidgetLayout; @@ -15,7 +17,10 @@ import net.minecraft.util.Mth; import org.jspecify.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Collectors; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ScrollBar.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ScrollBar.java index fd64155c..02c69db2 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ScrollBar.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/ScrollBar.java @@ -1,8 +1,8 @@ package dev.ftb.mods.ftblibrary.client.gui.widget; -import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.gui.WidgetType; import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; +import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.math.MathUtils; import dev.ftb.mods.ftblibrary.util.TooltipList; import net.minecraft.ChatFormatting; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/TextBox.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/TextBox.java index e63e4307..df6c879b 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/TextBox.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/TextBox.java @@ -1,10 +1,10 @@ package dev.ftb.mods.ftblibrary.client.gui.widget; import dev.ftb.mods.ftblibrary.client.gui.CursorType; -import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.gui.WidgetType; import dev.ftb.mods.ftblibrary.client.gui.input.Key; import dev.ftb.mods.ftblibrary.client.gui.input.MouseButton; +import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.icon.IconHelper; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icon; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Widget.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Widget.java index 1750c007..aac93e7b 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Widget.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/Widget.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.client.gui.widget; +import com.mojang.blaze3d.platform.Window; import dev.ftb.mods.ftblibrary.client.gui.CursorType; import dev.ftb.mods.ftblibrary.client.gui.GuiHelper; import dev.ftb.mods.ftblibrary.client.gui.IScreenWrapper; @@ -9,7 +10,6 @@ import dev.ftb.mods.ftblibrary.client.gui.theme.Theme; import dev.ftb.mods.ftblibrary.client.util.PositionedIngredient; import dev.ftb.mods.ftblibrary.util.TooltipList; -import com.mojang.blaze3d.platform.Window; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.input.CharacterEvent; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/icon/BulletIconRenderer.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/icon/BulletIconRenderer.java index 3ddc61a2..ed54ed69 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/icon/BulletIconRenderer.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/icon/BulletIconRenderer.java @@ -1,10 +1,10 @@ package dev.ftb.mods.ftblibrary.client.icon; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.vertex.VertexConsumer; import dev.ftb.mods.ftblibrary.icon.BulletIcon; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.MutableColor4I; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.render.TextureSetup; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/config/serializer/Json5ConfigSerializer.java b/common/src/main/java/dev/ftb/mods/ftblibrary/config/serializer/Json5ConfigSerializer.java index dfe57740..f5848d6f 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/config/serializer/Json5ConfigSerializer.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/config/serializer/Json5ConfigSerializer.java @@ -1,11 +1,11 @@ package dev.ftb.mods.ftblibrary.config.serializer; +import com.mojang.serialization.Codec; +import de.marhali.json5.*; import dev.ftb.mods.ftblibrary.FTBLibrary; import dev.ftb.mods.ftblibrary.config.value.*; import dev.ftb.mods.ftblibrary.json5.Json5Ops; import dev.ftb.mods.ftblibrary.util.NameMap; -import com.mojang.serialization.Codec; -import de.marhali.json5.*; import net.minecraft.util.Util; import java.io.FileInputStream; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/icon/EntityIconLoader.java b/common/src/main/java/dev/ftb/mods/ftblibrary/icon/EntityIconLoader.java index 85aca412..0da58bfb 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/icon/EntityIconLoader.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/icon/EntityIconLoader.java @@ -1,9 +1,5 @@ package dev.ftb.mods.ftblibrary.icon; -import dev.ftb.mods.ftblibrary.FTBLibrary; -import dev.ftb.mods.ftblibrary.client.util.ClientUtils; -import dev.ftb.mods.ftblibrary.util.ModUtils; -import dev.ftb.mods.ftblibrary.util.RegistryHelper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; @@ -12,6 +8,10 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.ftb.mods.ftblibrary.FTBLibrary; +import dev.ftb.mods.ftblibrary.client.util.ClientUtils; +import dev.ftb.mods.ftblibrary.util.ModUtils; +import dev.ftb.mods.ftblibrary.util.RegistryHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.LivingEntityRenderer; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/icon/Icon.java b/common/src/main/java/dev/ftb/mods/ftblibrary/icon/Icon.java index 576253b2..a339ea64 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/icon/Icon.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/icon/Icon.java @@ -1,11 +1,11 @@ package dev.ftb.mods.ftblibrary.icon; -import dev.ftb.mods.ftblibrary.client.config.editable.EditableImageResource; -import dev.ftb.mods.ftblibrary.client.icon.IconRenderer; import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; +import dev.ftb.mods.ftblibrary.client.config.editable.EditableImageResource; +import dev.ftb.mods.ftblibrary.client.icon.IconRenderer; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.Identifier; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/nbtedit/NBTEditorScreen.java b/common/src/main/java/dev/ftb/mods/ftblibrary/nbtedit/NBTEditorScreen.java index 751579bb..d68ce213 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/nbtedit/NBTEditorScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/nbtedit/NBTEditorScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.nbtedit; +import com.mojang.blaze3d.platform.InputConstants; import dev.ftb.mods.ftblibrary.FTBLibrary; import dev.ftb.mods.ftblibrary.client.config.editable.*; import dev.ftb.mods.ftblibrary.client.config.gui.EditStringConfigOverlay; @@ -20,7 +21,6 @@ import dev.ftb.mods.ftblibrary.util.SerializationUtil; import dev.ftb.mods.ftblibrary.util.StringUtils; import dev.ftb.mods.ftblibrary.util.TooltipList; -import com.mojang.blaze3d.platform.InputConstants; import it.unimi.dsi.fastutil.bytes.ByteArrayList; import it.unimi.dsi.fastutil.ints.IntArrayList; import net.minecraft.ChatFormatting; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/Misc.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/Misc.java index 0aab2c93..c558291a 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/Misc.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/Misc.java @@ -12,6 +12,8 @@ import net.minecraft.world.level.material.MapColor; public interface Misc { + /// Use {@link dev.ftb.mods.ftblibrary.client.gui.input.Key#matches(KeyMapping)} + @Deprecated(forRemoval = true) boolean matchesWithoutConflicts(KeyMapping keyBinding, InputConstants.Key keyCode); Component componentWithLinks(String message); diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java index 66780add..037768f9 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftblibrary.platform.client; +import dev.ftb.mods.ftblibrary.platform.client.input.Input; import net.minecraft.client.KeyMapping; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.Identifier; @@ -8,6 +9,7 @@ import java.util.Map; import java.util.ServiceLoader; +/// This interface abstracts some common clientside actions which have differing NeoForge and Fabric implementations. public interface PlatformClient { PlatformClient INSTANCE = ServiceLoader.load(PlatformClient.class).findFirst().orElseThrow(); @@ -15,15 +17,35 @@ static PlatformClient get() { return INSTANCE; } + Input input(); + + /// Send a network packet to the server. + /// + /// @param payload the packet to send void sendToServer(CustomPacketPayload payload); + /// Register one or more resource pack reload listeners, to be called when client-side resource packs reload. + /// + /// @param modId your mod's unique ID + /// @param listeners a map of unique listener ID's to the listeners to register void addResourcePackReloadListeners(String modId, Map listeners); + /// Register a resource pack reload listener, to be called when client-side resource packs reload. + /// + /// @param modId your mod's unique ID + /// @param id the reload listener's unique ID + /// @param listener the listener to register default void addResourcePackReloadListener(String modId, Identifier id, PreparableReloadListener listener) { addResourcePackReloadListeners(modId, Map.of(id, listener)); } - KeyMapping.Category registerKeyMappingCategory(Identifier id); - - void registerKeyMapping(String modId, KeyMapping... keyMappings); + /** + * @param modId the mod + * @param keyMappings the mappings + * @deprecated use {@link Input#registerKeyMapping(String, KeyMapping...)} + */ + @Deprecated(forRemoval = true) + default void registerKeyMapping(String modId, KeyMapping... keyMappings) { + input().registerKeyMapping(modId, keyMappings); + } } diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/Input.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/Input.java new file mode 100644 index 00000000..0064ea5d --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/Input.java @@ -0,0 +1,42 @@ +package dev.ftb.mods.ftblibrary.platform.client.input; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; + +public interface Input { + /// Register one or more keymappings with vanilla. + /// + /// **IMPORTANT**: all keymappings for any single keymapping category _must_ be registered in a single call to this + /// method, or you will get a "Category is already registered" exception from vanilla. It is fine to call this method + /// multiple times, as long as the same category isn't passed to more than one invocation of this method. + /// + /// @param modId your mod's unique ID + /// @param keyMappings one or more keymapping objects + /// @throws IllegalArgumentException if the same category is passed to multiple cals of this method, or if the + /// method is called with no keymappings + void registerKeyMapping(String modId, KeyMapping... keyMappings); + + /// Create a `KeyMapping` object in a platform-independent fashion. The returned object may be some subclass + /// or extension of the vanilla `KeyMapping` object, but can be used as one. + /// + /// @param config defines the setup for the keymapping object + /// @return a new keymapping object + KeyMapping createKeyMapping(KeyMappingConfig config); + + /// Get a displayable string for the key and possible modifiers for a {@code KeyMapping} object + /// + /// @param keyMapping the keymapping object + Component getKeyMappingDisplayName(KeyMapping keyMapping); + + /// Check if the key event matches the given key mapping. This differs from [KeyMapping#matches(KeyEvent)] + /// in that modifiers, if supported in the current environment, are also checked. + /// + /// @param mapping the KeyMapping to check + /// @param event the event representing a keypress with possible modifier + /// @return true if there's a match + /// + /// @implNote modifiers are supported if the platform is NeoForge, or if the platform is Fabric with the Amecs + /// mod installed + boolean matches(KeyMapping mapping, KeyEvent event); +} diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyConflict.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyConflict.java new file mode 100644 index 00000000..301fdeab --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyConflict.java @@ -0,0 +1,7 @@ +package dev.ftb.mods.ftblibrary.platform.client.input; + +public enum KeyConflict { + EVERYWHERE, + ANY_GUI, + IN_GAME +} diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyMappingConfig.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyMappingConfig.java new file mode 100644 index 00000000..fbc517aa --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyMappingConfig.java @@ -0,0 +1,135 @@ +package dev.ftb.mods.ftblibrary.platform.client.input; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import org.jspecify.annotations.Nullable; + +public record KeyMappingConfig( + String id, + KeyMapping.Category category, + TypedKey key, + KeyModifier modifier, + @Nullable TypedKey noModifierFallbackKey, + KeyConflict conflictContext +) { + public String translationKey() { + return "key." + category.id().getNamespace() + "." + category.id().getPath() + "." + id; + } + + public InputConstants.Type type(boolean supportsModifiers) { + var selectedKey = !supportsModifiers && noModifierFallbackKey != null ? noModifierFallbackKey : key; + return selectedKey.type(); + } + + public int code(boolean supportsModifiers) { + var selectedKey = !supportsModifiers && noModifierFallbackKey != null ? noModifierFallbackKey : key; + return selectedKey.code(); + } + + public static Builder builder(String id, KeyMapping.Category category) { + return new Builder(id, category); + } + + public static class Builder { + private final String id; + private final KeyMapping.Category category; + + // We only support one modifier even though the Fabric library supports multiple because NeoForge's KeyModifier only supports one + // When on Vanilla / Fabric without a mod, this is completely ignored anyway. + private KeyModifier modifier = KeyModifier.NONE; + + private TypedKey key = TypedKey.fromKey(InputConstants.UNKNOWN); + + // If there is no modifier support on the current platform, this key will override the main key + // as there may be a case where a key with modifier makes sense but without the modifier, it doesn't and another key is preferred. + private @Nullable TypedKey noModifierFallbackKey = null; + + // This is ignored on Fabric even with the mod as this is a NeoForge concept. + private KeyConflict conflictContext = KeyConflict.EVERYWHERE; + + private Builder(String id, KeyMapping.Category category) { + this.id = id; + this.category = category; + } + + public Builder shift() { + return modifier(KeyModifier.SHIFT); + } + + public Builder control() { + return modifier(KeyModifier.CONTROL); + } + + public Builder superModifier() { + return modifier(KeyModifier.SUPER); + } + + public Builder alt() { + return modifier(KeyModifier.ALT); + } + + public Builder modifier(KeyModifier modifier) { + this.modifier = modifier; + return this; + } + + public Builder key(InputConstants.Type type, int code) { + this.key = new TypedKey(type, code); + return this; + } + + public Builder key(InputConstants.Key key) { + this.key = TypedKey.fromKey(key); + return this; + } + + public Builder keyboard(int keyCode) { + return key(InputConstants.Type.KEYSYM.getOrCreate(keyCode)); + } + + public Builder mouse(int buttonCode) { + return key(InputConstants.Type.MOUSE.getOrCreate(buttonCode)); + } + + public Builder scan(int buttonCode) { + return key(InputConstants.Type.SCANCODE.getOrCreate(buttonCode)); + } + + public Builder noModifierFallbackKey(InputConstants.Key noModifierFallbackKey) { + this.noModifierFallbackKey = TypedKey.fromKey(noModifierFallbackKey); + return this; + } + + public Builder noModifierFallbackKey(InputConstants.Type type, int code) { + this.noModifierFallbackKey = new TypedKey(type, code); + return this; + } + + public Builder noModifierFallbackKeyboard(int keyCode) { + return noModifierFallbackKey(InputConstants.Type.KEYSYM.getOrCreate(keyCode)); + } + + public Builder noModifierFallbackMouse(int buttonCode) { + return noModifierFallbackKey(InputConstants.Type.MOUSE.getOrCreate(buttonCode)); + } + + public Builder noModifierFallbackScan(int buttonCode) { + return noModifierFallbackKey(InputConstants.Type.SCANCODE.getOrCreate(buttonCode)); + } + + public Builder conflictContext(KeyConflict conflictContext) { + this.conflictContext = conflictContext; + return this; + } + + public KeyMappingConfig build() { + return new KeyMappingConfig(id, category, key, modifier, noModifierFallbackKey, conflictContext); + } + } + + public record TypedKey(InputConstants.Type type, int code) { + public static TypedKey fromKey(InputConstants.Key key) { + return new TypedKey(key.getType(), key.getValue()); + } + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyModifier.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyModifier.java new file mode 100644 index 00000000..b94bc61b --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/input/KeyModifier.java @@ -0,0 +1,9 @@ +package dev.ftb.mods.ftblibrary.platform.client.input; + +public enum KeyModifier { + NONE, + SHIFT, + CONTROL, + SUPER, + ALT, +} diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java index 1a6fc76c..c6d67612 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java @@ -5,7 +5,6 @@ import dev.ftb.mods.ftblibrary.icon.Icon; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; -import org.jspecify.annotations.NonNull; import java.util.List; import java.util.Optional; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/util/NetworkHelper.java b/common/src/main/java/dev/ftb/mods/ftblibrary/util/NetworkHelper.java index fd4bb74a..1ddd6f54 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/util/NetworkHelper.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/util/NetworkHelper.java @@ -1,10 +1,10 @@ package dev.ftb.mods.ftblibrary.util; -import dev.ftb.mods.ftblibrary.platform.Platform; -import dev.ftb.mods.ftblibrary.platform.network.NetworkRegistry; import com.mojang.datafixers.util.Function7; import com.mojang.datafixers.util.Function8; import com.mojang.datafixers.util.Function9; +import dev.ftb.mods.ftblibrary.platform.Platform; +import dev.ftb.mods.ftblibrary.platform.network.NetworkRegistry; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/util/TextComponentParser.java b/common/src/main/java/dev/ftb/mods/ftblibrary/util/TextComponentParser.java index 14d50500..ce332023 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/util/TextComponentParser.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/util/TextComponentParser.java @@ -3,12 +3,12 @@ import dev.ftb.mods.ftblibrary.util.text.RainbowTextColor; import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; import net.minecraft.ChatFormatting; -import net.minecraft.util.Util; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.TextColor; import net.minecraft.network.chat.contents.PlainTextContents; +import net.minecraft.util.Util; import org.jspecify.annotations.Nullable; import java.util.function.Function; diff --git a/common/src/main/resources/assets/ftblibrary/lang/zh_cn.json b/common/src/main/resources/assets/ftblibrary/lang/zh_cn.json index 98d58d8f..7a4bcb8d 100644 --- a/common/src/main/resources/assets/ftblibrary/lang/zh_cn.json +++ b/common/src/main/resources/assets/ftblibrary/lang/zh_cn.json @@ -19,30 +19,39 @@ "gui.inactive": "未激活", "gui.settings": "设置", "gui.rename": "重命名", - "gui.search_box": "搜索中...", + "gui.search_box": "搜索中…", "gui.move": "移动", "gui.copy": "复制", "gui.paste": "粘贴", "gui.cut": "剪切", "gui.other": "其他", - "gui.server_forced": "服务器强制加载: %s", + "gui.server_forced": "服务器强制加载:%s", "gui.online": "在线", "gui.offline": "离线", "gui.whitelist": "白名单", "gui.blacklist": "黑名单", "gui.color": "颜色", - "gui.downloading": "下载中...", + "gui.downloading": "下载中…", "gui.infinite": "无限", "delete_item": "你想要删除“%s”么?", "lat_support": "喜欢这个Mod吗?点击支持我的项目!", "ftblibrary.select_fluid.gui": "选择流体", "ftblibrary.select_item.list_mode": "列出模式", "ftblibrary.select_item.list_mode.all": "所有物品", + "ftblibrary.select_fluid.list_mode.all": "所有流体", "ftblibrary.select_item.list_mode.inv": "物品栏", + "ftblibrary.select_item.list_mode.jei": "JEI", + "ftblibrary.select_item.list_mode.rei": "REI", + "ftblibrary.select_item.list_mode.emi": "EMI", "ftblibrary.select_item.count": "设置大小", "ftblibrary.select_item.nbt": "编辑NBT", "ftblibrary.select_item.caps": "编辑功能", "ftblibrary.select_item.display_name": "设置显示名称", + "ftblibrary.select_image.scanning": "正在扫描图像:这可能需要几秒钟…", + "ftblibrary.select_image.rescan": "重新扫描图像", + "ftblibrary.select_image.all_images": "所有图像", + "ftblibrary.select_entity.all_entities": "所有生物实体", + "ftblibrary.unsaved_changes": "放弃未保存的更改?", "config.group.value": "参数", "sidebar_button.ftblibrary.toggle.gamemode": "切换游戏模式", "sidebar_button.ftblibrary.toggle.gamemode.tooltip": "在生存模式和创造模式间切换", @@ -51,5 +60,56 @@ "sidebar_button.ftblibrary.toggle.day": "设置为白天", "sidebar_button.ftblibrary.toggle.day.tooltip": "设置为白天", "sidebar_button.ftblibrary.toggle.night": "设置为黑夜", - "sidebar_button.ftblibrary.toggle.night.tooltip": "设置为黑夜" -} + "sidebar_button.ftblibrary.toggle.night.tooltip": "设置为黑夜", + "sidebar_button.ftblibrary.config": "FTB库客户端配置", + "sidebar_button.ftblibrary.config.tooltip": "打开FTB客户端库配置", + "sidebar_button.ftblibrary.config.enter_edit_mode": "右键单击以编辑侧边栏按钮", + "item.ftblibrary.fluid_container": "流体容器", + "item.ftblibrary.fluid_container.use": "右击储罐以清空容器", + "ftblibrary.mb": "%d mB / %s", + "ftblibrary.empty": "空", + "ftblibrary.read_only": "只读", + "ftblibrary.gui.listSize1": "1个物品", + "ftblibrary.gui.listSize": "%d个物品", + "ftblibrary.gui.error": "错误!", + "ftblibrary.gui.search": "搜索…", + "ftblibrary.gui.nbt_copied": "NBT已复制到剪贴板", + "ftblibrary.gui.edit_tag_name": "编辑标签名称", + "ftblibrary.gui.edit_tag_value": "编辑标签值", + "ftblibrary.gui.no_selection": "未选择任何内容", + "ftblibrary.gui.key_reference": "关键参考", + "ftblibrary.gui.enabled": "启用", + "ftblibrary.gui.disabled": "禁用", + "ftblibrary.client_settings": "客户端配置", + "ftblibrary.client_settings.tooltips": "提示", + "ftblibrary.client_settings.tooltips.item_modname": "在物品选择界面显示模组名称", + "ftblibrary.client_settings.tooltips.fluid_modname": "在流体选择界面显示模组名称", + "ftblibrary.client_settings.tooltips.image_modname": "在图像选择界面显示模组名称", + "ftblibrary.client_settings.tooltips.entity_modname": "在实体面选择界面显示模组名称", + "ftblibrary.client_settings.sidebar": "侧边栏按钮", + "ftblibrary.client_settings.sidebar.enabled": "启用侧边栏按钮", + "ftblibrary.client_settings.sidebar.position": "侧边栏按钮位置", + "ftblibrary.palette.chat": "聊天颜色", + "ftblibrary.palette.dye": "染料颜色", + "ftblibrary.palette.nord": "Nord主题", + "ftblibrary.palette.reds": "红色", + "ftblibrary.palette.greens": "绿色", + "ftblibrary.palette.blues": "蓝色", + "ftblibrary.palette.recent": "最近使用的颜色", + "ftblibrary.panel.position.top_left": "左上", + "ftblibrary.panel.position.top": "上", + "ftblibrary.panel.position.top_right": "右上", + "ftblibrary.panel.position.left": "左", + "ftblibrary.panel.position.right": "右", + "ftblibrary.panel.position.bottom_left": "左下", + "ftblibrary.panel.position.bottom": "下", + "ftblibrary.panel.position.bottom_right": "右下", + "ftblibrary.server_settings": "服务端配置", + "dimension.minecraft.overworld": "主世界", + "dimension.minecraft.the_nether": "下界", + "dimension.minecraft.the_end": "末地", + "dimension.hyperbox.hyperbox": "Hyperbox", + "dimension.ae2.spatial_storage": "AE2空间存储", + "itemGroup.ftbsuite.creative_tab": "FTB套件", + "item.ftblibrary.icon_item": "FTB图标" +} \ No newline at end of file diff --git a/common/src/main/resources/assets/ftblibrary/textures/icons/keyboard.png b/common/src/main/resources/assets/ftblibrary/textures/icons/keyboard.png index 12acb634..862d3380 100644 Binary files a/common/src/main/resources/assets/ftblibrary/textures/icons/keyboard.png and b/common/src/main/resources/assets/ftblibrary/textures/icons/keyboard.png differ diff --git a/fabric/build.gradle b/fabric/build.gradle index e045fbaa..4c73e618 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -26,6 +26,16 @@ loom { apply from: "https://raw.githubusercontent.com/FTBTeam/mods-meta/main/gradle/extra-local-mods.gradle" +repositories { + maven { + url = uri("https://maven.siphalor.de/") + } + + maven { + url = "https://maven.terraformersmc.com/" + } +} + dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" @@ -35,5 +45,10 @@ dependencies { compileOnly("mezz.jei:jei-${minecraft_version}-fabric-api:${jei_version}") localRuntime("mezz.jei:jei-${minecraft_version}-fabric:${jei_version}") + compileOnly "de.siphalor.amecs.amecs-key-modifiers:amecs-key-modifiers-${amecs_key_modifiers_version}" + localRuntime "de.siphalor.amecs.amecs-bundle:amecs-bundle-${amecs_key_bundle_version}" + + localRuntime "com.terraformersmc:modmenu:${modmenu_version}" + include(api("de.marhali:json5-java:${json5_version}")) } diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/core/mixin/fabric/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/core/mixin/fabric/package-info.java new file mode 100644 index 00000000..85f43d31 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/core/mixin/fabric/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.core.mixin.fabric; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabric.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabric.java index b951b067..14b20dae 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabric.java +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabric.java @@ -8,10 +8,8 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.creativetab.v1.CreativeModeTabEvents; -import net.fabricmc.fabric.api.creativetab.v1.FabricCreativeModeTabOutput; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.world.item.CreativeModeTab; public class FTBLibraryFabric implements ModInitializer { diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabricEvents.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabricEvents.java index 811cdf35..cef8bc3c 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabricEvents.java +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/FTBLibraryFabricEvents.java @@ -6,8 +6,6 @@ import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; -import java.util.Arrays; - public class FTBLibraryFabricEvents { public static Event CUSTOM_CLICK = EventFactory.createArrayBacked(CustomClickEvent.class, callbacks -> data -> { diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/AmecsKeyProvider.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/AmecsKeyProvider.java new file mode 100644 index 00000000..a3b5b6fa --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/AmecsKeyProvider.java @@ -0,0 +1,51 @@ +package dev.ftb.mods.ftblibrary.fabric.integrations.keys; + +import de.siphalor.amecs.key_modifiers.api.AmecsKeyMappingWithKeyModifiers; +import de.siphalor.amecs.key_modifiers.api.AmecsKeyModifierCombination; +import dev.ftb.mods.ftblibrary.platform.client.input.KeyMappingConfig; +import dev.ftb.mods.ftblibrary.platform.client.input.KeyModifier; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; + +public class AmecsKeyProvider implements KeyProvider { + @Override + public KeyMapping create(KeyMappingConfig config) { + return new AmecsKeyMappingWithKeyModifiers( + config.translationKey(), + config.type(true), + config.code(true), + config.category(), + fromModifier(config.modifier()) + ); + } + + @Override + public Component getKeyMappingDisplayName(KeyMapping keyMapping) { + return keyMapping.getTranslatedKeyMessage(); + } + + @Override + public boolean matchModifier(KeyMapping mapping, KeyEvent event) { + var modifiers = asAmecsMapping(mapping).getDefaultAmecsKeyModifiers(); + return (event.hasAltDown() || !modifiers.getAlt()) + && (event.hasControlDown() || !modifiers.getControl()) + && (event.hasShiftDown() || !modifiers.getShift()); + } + + private AmecsKeyMappingWithKeyModifiers asAmecsMapping(KeyMapping keyMapping) { + if (keyMapping instanceof AmecsKeyMappingWithKeyModifiers amecs) { + return amecs; + } + throw new IllegalStateException("using AmecsKeyProvider but keymapping is " + keyMapping.getClass()); + } + + private AmecsKeyModifierCombination fromModifier(KeyModifier modifier) { + return new AmecsKeyModifierCombination( + modifier == KeyModifier.ALT, + // I don't think this is really the correct behaviour tbh. + modifier == KeyModifier.CONTROL || modifier == KeyModifier.SUPER, + modifier == KeyModifier.SHIFT + ); + } +} diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/KeyProvider.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/KeyProvider.java new file mode 100644 index 00000000..c4a68fa3 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/KeyProvider.java @@ -0,0 +1,14 @@ +package dev.ftb.mods.ftblibrary.fabric.integrations.keys; + +import dev.ftb.mods.ftblibrary.platform.client.input.KeyMappingConfig; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; + +public interface KeyProvider { + KeyMapping create(KeyMappingConfig config); + + Component getKeyMappingDisplayName(KeyMapping keyMapping); + + boolean matchModifier(KeyMapping mapping, KeyEvent event); +} diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/VanillaKeyProvider.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/VanillaKeyProvider.java new file mode 100644 index 00000000..695f97b7 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/integrations/keys/VanillaKeyProvider.java @@ -0,0 +1,29 @@ +package dev.ftb.mods.ftblibrary.fabric.integrations.keys; + +import dev.ftb.mods.ftblibrary.platform.client.input.KeyMappingConfig; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; + +public class VanillaKeyProvider implements KeyProvider { + @Override + public KeyMapping create(KeyMappingConfig config) { + return new KeyMapping( + config.translationKey(), + config.type(false), + config.code(false), + config.category() + ); + } + + @Override + public Component getKeyMappingDisplayName(KeyMapping keyMapping) { + return keyMapping.getTranslatedKeyMessage(); + } + + @Override + public boolean matchModifier(KeyMapping mapping, KeyEvent event) { + // no modifiers supported by vanilla + return event.modifiers() == 0; + } +} diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/package-info.java new file mode 100644 index 00000000..2269305a --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/FabricMiscImpl.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/FabricMiscImpl.java index 4ac06ddc..0a011008 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/FabricMiscImpl.java +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/FabricMiscImpl.java @@ -1,10 +1,10 @@ package dev.ftb.mods.ftblibrary.fabric.platform; +import com.mojang.blaze3d.platform.InputConstants; import dev.ftb.mods.ftblibrary.core.mixin.fabric.KeyMappingAccess; import dev.ftb.mods.ftblibrary.core.mixin.fabric.PatchedDataComponentMapAccess; import dev.ftb.mods.ftblibrary.fabric.PlayerDisplayNameCache; import dev.ftb.mods.ftblibrary.platform.Misc; -import com.mojang.blaze3d.platform.InputConstants; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidConstants; import net.minecraft.client.KeyMapping; import net.minecraft.core.BlockPos; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricInputImpl.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricInputImpl.java new file mode 100644 index 00000000..6270c38d --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricInputImpl.java @@ -0,0 +1,55 @@ +package dev.ftb.mods.ftblibrary.fabric.platform.client; + +import dev.ftb.mods.ftblibrary.fabric.integrations.keys.AmecsKeyProvider; +import dev.ftb.mods.ftblibrary.fabric.integrations.keys.KeyProvider; +import dev.ftb.mods.ftblibrary.fabric.integrations.keys.VanillaKeyProvider; +import dev.ftb.mods.ftblibrary.platform.client.input.Input; +import dev.ftb.mods.ftblibrary.platform.client.input.KeyMappingConfig; +import dev.ftb.mods.ftblibrary.util.Lazy; +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; +import org.apache.commons.lang3.Validate; + +import java.util.HashSet; +import java.util.Set; + +public class FabricInputImpl implements Input { + private final Lazy keyProvider = Lazy.of(FabricInputImpl::initKeyProvider); + + private static KeyProvider initKeyProvider() { + if (FabricLoader.getInstance().isModLoaded("amecs")) { + return new AmecsKeyProvider(); + } else { + return new VanillaKeyProvider(); + } + } + + @Override + public void registerKeyMapping(String modId, KeyMapping... keyMappings) { + Validate.isTrue(keyMappings.length > 0, "must provide at least one keymapping"); + Set cats = new HashSet<>(); + for (var k : keyMappings) { + cats.add(k.getCategory()); + KeyMappingHelper.registerKeyMapping(k); + } + cats.forEach(c -> KeyMapping.Category.register(c.id())); + } + + @Override + public KeyMapping createKeyMapping(KeyMappingConfig config) { + return keyProvider.get().create(config); + } + + @Override + public Component getKeyMappingDisplayName(KeyMapping keyMapping) { + return keyProvider.get().getKeyMappingDisplayName(keyMapping); + } + + @Override + public boolean matches(KeyMapping mapping, KeyEvent event) { + return mapping.matches(event) && keyProvider.get().matchModifier(mapping, event); + } +} diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java index 8a47d39e..a0fcd54f 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java @@ -1,10 +1,9 @@ package dev.ftb.mods.ftblibrary.fabric.platform.client; import dev.ftb.mods.ftblibrary.platform.client.PlatformClient; -import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +import dev.ftb.mods.ftblibrary.platform.client.input.Input; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.resource.v1.ResourceLoader; -import net.minecraft.client.KeyMapping; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.PackType; @@ -13,6 +12,13 @@ import java.util.Map; public class FabricPlatformClientImpl implements PlatformClient { + private final Input keyMap = new FabricInputImpl(); + + @Override + public Input input() { + return keyMap; + } + @Override public void sendToServer(CustomPacketPayload payload) { ClientPlayNetworking.send(payload); @@ -23,16 +29,4 @@ public void addResourcePackReloadListeners(String modId, Map ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(id, listener)); } - - @Override - public KeyMapping.Category registerKeyMappingCategory(Identifier id) { - return KeyMapping.Category.register(id); - } - - @Override - public void registerKeyMapping(String modId, KeyMapping... keyMappings) { - for (var k : keyMappings) { - KeyMappingHelper.registerKeyMapping(k); - } - } } diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/package-info.java new file mode 100644 index 00000000..296bd850 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric.platform.client; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/networking/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/networking/package-info.java new file mode 100644 index 00000000..1e09642e --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/networking/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric.platform.networking; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/package-info.java new file mode 100644 index 00000000..717c78ff --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric.platform; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/registry/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/registry/package-info.java new file mode 100644 index 00000000..87dcf1a3 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/registry/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric.platform.registry; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/transfer/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/transfer/package-info.java new file mode 100644 index 00000000..adae3477 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/transfer/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric.platform.transfer; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/transfer/simple/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/transfer/simple/package-info.java new file mode 100644 index 00000000..814b9a35 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/transfer/simple/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.fabric.platform.transfer.simple; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/util/fabric/package-info.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/util/fabric/package-info.java new file mode 100644 index 00000000..f0ed85cf --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/util/fabric/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.util.fabric; + +import org.jspecify.annotations.NullMarked; diff --git a/fabric/src/main/resources/ftblibrary-fabric.mixins.json b/fabric/src/main/resources/ftblibrary-fabric.mixins.json index 6cf70372..49accd2b 100644 --- a/fabric/src/main/resources/ftblibrary-fabric.mixins.json +++ b/fabric/src/main/resources/ftblibrary-fabric.mixins.json @@ -3,8 +3,8 @@ "package": "dev.ftb.mods.ftblibrary.core.mixin.fabric", "compatibilityLevel": "JAVA_8", "mixins": [ - "PlayerMixin", - "PatchedDataComponentMapAccess" + "PatchedDataComponentMapAccess", + "PlayerMixin" ], "client": [ "KeyMappingAccess" diff --git a/gradle.properties b/gradle.properties index d8dff15c..508b5838 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.daemon=false # Mod mod_id=ftblibrary readable_name=FTB Library -mod_version=3 +mod_version=4 mod_author=FTB Team # Maven diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/api/neoforge/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/api/neoforge/package-info.java new file mode 100644 index 00000000..aeadad4e --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/api/neoforge/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.api.neoforge; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java index 1330300f..438b5a0f 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java @@ -19,7 +19,6 @@ import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.server.ServerAboutToStartEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; -import net.neoforged.neoforge.event.server.ServerStartingEvent; import net.neoforged.neoforge.event.server.ServerStoppedEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.network.registration.PayloadRegistrar; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/integrations/platform/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/integrations/platform/package-info.java new file mode 100644 index 00000000..1d647171 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/integrations/platform/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.integrations.platform; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/package-info.java new file mode 100644 index 00000000..cbb84ec4 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/NeoMiscImpl.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/NeoMiscImpl.java index 55764cf7..9de6ad7e 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/NeoMiscImpl.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/NeoMiscImpl.java @@ -1,7 +1,7 @@ package dev.ftb.mods.ftblibrary.neoforge.platform; -import dev.ftb.mods.ftblibrary.platform.Misc; import com.mojang.blaze3d.platform.InputConstants; +import dev.ftb.mods.ftblibrary.platform.Misc; import net.minecraft.client.KeyMapping; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoInputImpl.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoInputImpl.java new file mode 100644 index 00000000..b4752555 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoInputImpl.java @@ -0,0 +1,83 @@ +package dev.ftb.mods.ftblibrary.neoforge.platform.client; + +import dev.ftb.mods.ftblibrary.platform.client.input.KeyConflict; +import dev.ftb.mods.ftblibrary.platform.client.input.Input; +import dev.ftb.mods.ftblibrary.platform.client.input.KeyMappingConfig; +import dev.ftb.mods.ftblibrary.platform.client.input.KeyModifier; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.settings.IKeyConflictContext; +import net.neoforged.neoforge.client.settings.KeyConflictContext; +import org.apache.commons.lang3.Validate; + +import java.util.HashSet; +import java.util.Set; + +import static dev.ftb.mods.ftblibrary.neoforge.platform.client.NeoPlatformClientImpl.getModBusOrThrow; + +public class NeoInputImpl implements Input { + @Override + public void registerKeyMapping(String modId, KeyMapping... keyMappings) { + Validate.isTrue(keyMappings.length > 0, "must provide at least one keymapping"); + + getModBusOrThrow(modId).addListener(RegisterKeyMappingsEvent.class, event -> { + Set cats = new HashSet<>(); + for (var k : keyMappings) { + cats.add(k.getCategory()); + event.register(k); + } + cats.forEach(event::registerCategory); + }); + } + + @Override + public KeyMapping createKeyMapping(KeyMappingConfig config) { + return new KeyMapping( + config.translationKey(), + convertConflictContext(config.conflictContext()), + fromModifier(config.modifier()), + config.type(true), + config.code(true), + config.category() + ); + } + + @Override + public Component getKeyMappingDisplayName(KeyMapping keyMapping) { + return keyMapping.getKeyModifier().getCombinedName(keyMapping.getKey(), () -> keyMapping.getKey().getDisplayName()); + } + + @Override + public boolean matches(KeyMapping mapping, KeyEvent event) { + return mapping.matches(event) && matchModifier(mapping, event); + } + + private boolean matchModifier(KeyMapping mapping, KeyEvent event) { + return switch (mapping.getKeyModifier()) { + case CONTROL, CONTROL_OR_COMMAND -> event.hasControlDown(); + case SHIFT -> event.hasShiftDown(); + case ALT -> event.hasAltDown(); + case NONE -> event.modifiers() == 0; + }; + } + + private net.neoforged.neoforge.client.settings.KeyModifier fromModifier(KeyModifier modifier) { + return switch (modifier) { + case ALT -> net.neoforged.neoforge.client.settings.KeyModifier.ALT; + case SHIFT -> net.neoforged.neoforge.client.settings.KeyModifier.SHIFT; + case CONTROL -> net.neoforged.neoforge.client.settings.KeyModifier.CONTROL; + case SUPER -> net.neoforged.neoforge.client.settings.KeyModifier.CONTROL_OR_COMMAND; + case NONE -> net.neoforged.neoforge.client.settings.KeyModifier.NONE; + }; + } + + private IKeyConflictContext convertConflictContext(KeyConflict conflict) { + return switch (conflict) { + case IN_GAME -> KeyConflictContext.IN_GAME; + case ANY_GUI -> KeyConflictContext.GUI; + case EVERYWHERE -> KeyConflictContext.UNIVERSAL; + }; + } +} diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java index 90e75a53..500916e7 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java @@ -1,7 +1,7 @@ package dev.ftb.mods.ftblibrary.neoforge.platform.client; import dev.ftb.mods.ftblibrary.platform.client.PlatformClient; -import net.minecraft.client.KeyMapping; +import dev.ftb.mods.ftblibrary.platform.client.input.Input; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.PreparableReloadListener; @@ -9,15 +9,18 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; import net.neoforged.neoforge.client.event.AddClientReloadListenersEvent; -import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.client.network.ClientPacketDistributor; -import org.jspecify.annotations.NonNull; -import java.util.HashSet; import java.util.Map; -import java.util.Set; public class NeoPlatformClientImpl implements PlatformClient { + private final Input keymap = new NeoInputImpl(); + + @Override + public Input input() { + return keymap; + } + @Override public void sendToServer(CustomPacketPayload payload) { ClientPacketDistributor.sendToServer(payload); @@ -29,24 +32,7 @@ public void addResourcePackReloadListeners(String modId, Map { - Set cats = new HashSet<>(); - for (var k : keyMappings) { - cats.add(k.getCategory()); - event.register(k); - } - cats.forEach(event::registerCategory); - }); - } - - private static @NonNull IEventBus getModBusOrThrow(String modId) { + static IEventBus getModBusOrThrow(String modId) { return ModList.get().getModContainerById(modId) .map(ModContainer::getEventBus) .orElseThrow(); diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/package-info.java new file mode 100644 index 00000000..d01e770f --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.platform.client; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/networking/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/networking/package-info.java new file mode 100644 index 00000000..5b742308 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/networking/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.platform.networking; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/package-info.java new file mode 100644 index 00000000..7949dc91 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.platform; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/registry/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/registry/package-info.java new file mode 100644 index 00000000..ca392702 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/registry/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.platform.registry; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/transfer/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/transfer/package-info.java new file mode 100644 index 00000000..b35c67bc --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/transfer/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.platform.transfer; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/transfer/simple/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/transfer/simple/package-info.java new file mode 100644 index 00000000..85bf56ab --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/transfer/simple/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.neoforge.platform.transfer.simple; + +import org.jspecify.annotations.NullMarked; diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/util/neoforge/package-info.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/util/neoforge/package-info.java new file mode 100644 index 00000000..349b5801 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/util/neoforge/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package dev.ftb.mods.ftblibrary.util.neoforge; + +import org.jspecify.annotations.NullMarked;