diff --git a/src/main/java/com/snowshock35/jeiintegration/JEIIntegration.java b/src/main/java/com/snowshock35/jeiintegration/JEIIntegration.java index 7f7ea38..72d5812 100644 --- a/src/main/java/com/snowshock35/jeiintegration/JEIIntegration.java +++ b/src/main/java/com/snowshock35/jeiintegration/JEIIntegration.java @@ -39,19 +39,24 @@ @Mod(JEIIntegration.MOD_ID) public class JEIIntegration { - public static final String MOD_ID = "jeiintegration"; + public static final String MOD_ID = "jeiintegration"; - public static Logger logger = LogManager.getLogger();; + public static final Logger logger = LogManager.getLogger(); - public JEIIntegration() { - ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, Config.clientSpec); - FMLJavaModLoadingContext.get().getModEventBus().register(Config.class); + public JEIIntegration() { + TooltipModuleManager tooltipModuleManager = TooltipModuleManager.create(); + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, tooltipModuleManager.getSpec()); + FMLJavaModLoadingContext.get().getModEventBus().register(tooltipModuleManager.getConfig()); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - MinecraftForge.EVENT_BUS.register(new TooltipEventHandler()); - }); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + MinecraftForge.EVENT_BUS.register(new TooltipEventHandler(tooltipModuleManager)); + }); - //Make sure the mod being absent on the other network side does not cause the client to display the server as incompatible - ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); - } + // Make sure the mod being absent on the other network side does not cause the client to display the server as + // incompatible + ModLoadingContext + .get() + .registerExtensionPoint(IExtensionPoint.DisplayTest.class, + () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); + } } diff --git a/src/main/java/com/snowshock35/jeiintegration/TooltipEventHandler.java b/src/main/java/com/snowshock35/jeiintegration/TooltipEventHandler.java index e18b39b..2b8812c 100644 --- a/src/main/java/com/snowshock35/jeiintegration/TooltipEventHandler.java +++ b/src/main/java/com/snowshock35/jeiintegration/TooltipEventHandler.java @@ -1,219 +1,57 @@ -/* - * MIT License - * - * Copyright (c) 2020 SnowShock35 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.snowshock35.jeiintegration; - -import com.mojang.blaze3d.platform.InputConstants; -import com.snowshock35.jeiintegration.config.Config; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.food.FoodProperties; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.registries.ForgeRegistries; -import org.apache.logging.log4j.Level; -import org.lwjgl.glfw.GLFW; - -import java.text.DecimalFormat; -import java.util.Collection; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -import static net.minecraftforge.common.ForgeHooks.getBurnTime; - -public class TooltipEventHandler { - - private Config.Client config = Config.CLIENT; - - private static boolean isDebugMode() { - return Minecraft.getInstance().options.advancedItemTooltips; - } - - private static boolean isShiftKeyDown() { - return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_LEFT_SHIFT) || - InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_RIGHT_SHIFT); - } - - private void registerTooltip(ItemTooltipEvent e, Component tooltip, String configOption) { - boolean isEnabled = false; - - if (Objects.equals(configOption, "enabled")) { - isEnabled = true; - } else if ( - Objects.equals(configOption, "onShift") - && isShiftKeyDown() - ) { - isEnabled = true; - } else if ( - Objects.equals(configOption, "onDebug") - && isDebugMode() - ) { - isEnabled = true; - } else if ( - Objects.equals(configOption, "onShiftAndDebug") - && isShiftKeyDown() - && isDebugMode() - ) { - isEnabled = true; - } - if (isEnabled) { - e.getToolTip().add(tooltip); - } - } - - private void registerTooltips(ItemTooltipEvent e, Collection tooltips, String configValue) { - for (Component tooltip : tooltips) { - registerTooltip(e, tooltip, configValue); - } - } - - @SubscribeEvent - public void onItemTooltip(ItemTooltipEvent e) { - - // Set number formatting to display large numbers more clearly - DecimalFormat decimalFormat = new DecimalFormat("#.##"); - decimalFormat.setGroupingUsed(true); - decimalFormat.setGroupingSize(3); - - // Retrieve the ItemStack and Item - ItemStack itemStack = e.getItemStack(); - Item item = itemStack.getItem(); - - // If item stack empty do nothing - if (e.getItemStack().isEmpty()) { - return; - } - - // Tooltip - Burn Time - int burnTime = 0; - try { - burnTime = getBurnTime(itemStack, RecipeType.SMELTING); - } catch (Exception ex) { - JEIIntegration.logger.log(Level.WARN, "):\n\nSomething went wrong!"); - } - - if (burnTime > 0) { - Component burnTooltip = Component.translatable("tooltip.jeiintegration.burnTime") - .append(Component.literal(" " + decimalFormat.format(burnTime) + " ")) - .append(Component.translatable("tooltip.jeiintegration.burnTime.suffix")) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, burnTooltip, config.burnTimeTooltipMode.get()); - } - - // Tooltip - Durability - int maxDamage = itemStack.getMaxDamage(); - int currentDamage = maxDamage - itemStack.getDamageValue(); - if (maxDamage > 0) { - Component durabilityTooltip = Component.translatable("tooltip.jeiintegration.durability") - .append(Component.literal(" " + currentDamage + "/" + maxDamage)) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, durabilityTooltip, config.durabilityTooltipMode.get()); - } - - // Tooltip - Enchantability - int enchantability = item.getEnchantmentValue(itemStack); - if (enchantability > 0) { - Component enchantabilityTooltip = Component.translatable("tooltip.jeiintegration.enchantability") - .append(Component.literal(" " + enchantability)) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, enchantabilityTooltip, config.enchantabilityTooltipMode.get()); - } - - // Tooltip - Hunger / Saturation - FoodProperties foodProperties = item.getFoodProperties(itemStack, Minecraft.getInstance().player); - if (item.isEdible() && foodProperties != null) { - int healVal = foodProperties.getNutrition(); - float satVal = healVal * (foodProperties.getSaturationModifier() * 2); - - Component foodTooltip = Component.translatable("tooltip.jeiintegration.hunger") - .append(Component.literal(" " + healVal + " ")) - .append(Component.translatable("tooltip.jeiintegration.saturation")) - .append(Component.literal(" " + decimalFormat.format(satVal))) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, foodTooltip, config.foodTooltipMode.get()); - } - - // Tooltip - NBT Data - CompoundTag nbtData = item.getShareTag(itemStack); - if (nbtData != null) { - Component nbtTooltip = Component.translatable("tooltip.jeiintegration.nbtTagData") - .append(Component.literal(" " + nbtData)) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, nbtTooltip, config.nbtTooltipMode.get()); - } - - // Tooltip - Registry Name - Component registryTooltip = Component.translatable("tooltip.jeiintegration.registryName") - .append(Component.literal(" " + ForgeRegistries.ITEMS.getKey(item))) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, registryTooltip, config.registryNameTooltipMode.get()); - - - // Tooltip - Max Stack Size - int stackSize = e.getItemStack().getMaxStackSize(); - if (stackSize > 0) { - Component stackSizeTooltip = Component.translatable("tooltip.jeiintegration.maxStackSize") - .append(Component.literal(" " + itemStack.getMaxStackSize())) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, stackSizeTooltip, config.maxStackSizeTooltipMode.get()); - } - - // Tooltip - Tags - if (itemStack.getTags().toList().size() > 0) { - Component tagsTooltip = Component.translatable("tooltip.jeiintegration.tags") - .withStyle(ChatFormatting.DARK_GRAY); - - Set tags = new HashSet<>(); - - for (ResourceLocation tag : itemStack.getTags().map(TagKey::location).toList()) { - tags.add(Component.literal(" " + tag).withStyle(ChatFormatting.DARK_GRAY)); - } - - registerTooltip(e, tagsTooltip, config.tagsTooltipMode.get()); - registerTooltips(e, tags, config.tagsTooltipMode.get()); - } - - // Tooltip - Translation Key - Component translationKeyTooltip = Component.translatable("tooltip.jeiintegration.translationKey") - .append(Component.literal(" " + itemStack.getDescriptionId())) - .withStyle(ChatFormatting.DARK_GRAY); - - registerTooltip(e, translationKeyTooltip, config.translationKeyTooltipMode.get()); - } -} +package com.snowshock35.jeiintegration; + +import com.mojang.blaze3d.platform.InputConstants; +import com.snowshock35.jeiintegration.config.OptionState; +import com.snowshock35.jeiintegration.modules.TooltipModuleHolder; +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.lwjgl.glfw.GLFW; + +public class TooltipEventHandler { + private final TooltipModuleManager tooltipModuleManager; + + public TooltipEventHandler(TooltipModuleManager tooltipModuleManager) { + this.tooltipModuleManager = tooltipModuleManager; + } + + + private static boolean isDebugMode() { + return Minecraft.getInstance().options.advancedItemTooltips; + } + + private static boolean isShiftKeyDown() { + return InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_LEFT_SHIFT) || + InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_RIGHT_SHIFT); + } + + private static boolean isEnabled(ForgeConfigSpec.ConfigValue configValue) { + OptionState configOption = configValue.get(); + boolean isEnabled = false; + + if (configOption == OptionState.ENABLED) { + isEnabled = true; + } else if (configOption == OptionState.ON_SHIFT && isShiftKeyDown()) { + isEnabled = true; + } else if (configOption == OptionState.ON_DEBUG && isDebugMode()) { + isEnabled = true; + } else if (configOption == OptionState.ON_SHIFT_AND_DEBUG && isShiftKeyDown() && isDebugMode()) { + isEnabled = true; + } + return isEnabled; + } + + @SubscribeEvent + public void onItemTooltip(ItemTooltipEvent e) { + if (e.getItemStack().isEmpty()) { + return; + } + + for (TooltipModuleHolder module : tooltipModuleManager.getEnabledModules()) { + if (isEnabled(module.config())) { + module.definition().apply(e); + } + } + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/TooltipModuleManager.java b/src/main/java/com/snowshock35/jeiintegration/TooltipModuleManager.java new file mode 100644 index 0000000..9e73a39 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/TooltipModuleManager.java @@ -0,0 +1,41 @@ +package com.snowshock35.jeiintegration; + +import com.snowshock35.jeiintegration.config.Config; +import com.snowshock35.jeiintegration.modules.*; +import net.minecraftforge.common.ForgeConfigSpec; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.List; + +public class TooltipModuleManager { + private final ForgeConfigSpec spec; + private final Config config; + + public static TooltipModuleManager create() { + List modules = List.of(new BurnTimeModule(), new DurabilityModule(), + new EnchantabilityModule(), new HungerModule(), new NbtDataModule(), new RegistryNameModule(), + new MaxStackSizeModule(), new TagsModule(), new TranslationModule()); + + Pair specPair = + new ForgeConfigSpec.Builder().configure(builder -> new Config(builder, modules)); + return new TooltipModuleManager(specPair.getRight(), specPair.getLeft()); + } + + private TooltipModuleManager(ForgeConfigSpec spec, Config config) { + this.spec = spec; + this.config = config; + this.config.updateCache(); + } + + public ForgeConfigSpec getSpec() { + return spec; + } + + public Config getConfig() { + return config; + } + + public List getEnabledModules() { + return config.getEnabledModules(); + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/config/Config.java b/src/main/java/com/snowshock35/jeiintegration/config/Config.java index 99bddb4..2831052 100644 --- a/src/main/java/com/snowshock35/jeiintegration/config/Config.java +++ b/src/main/java/com/snowshock35/jeiintegration/config/Config.java @@ -1,152 +1,101 @@ -/* - * MIT License - * - * Copyright (c) 2020 SnowShock35 - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.snowshock35.jeiintegration.config; - -import com.snowshock35.jeiintegration.JEIIntegration; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.event.config.ModConfigEvent; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Arrays; -import java.util.List; - -public class Config { - static final String CATEGORY_HANDLERS = "Handler Settings"; - static final String CATEGORY_TOOLTIPS = "Tooltip Settings"; - static final String CATEGORY_MISCELLANEOUS = "Miscellaneous Settings"; - - private static final String defaultBurnTimeTooltipMode = "disabled"; - private static final String defaultDurabilityTooltipMode = "disabled"; - private static final String defaultEnchantabilityTooltipMode = "disabled"; - private static final String defaultFoodTooltipMode = "disabled"; - private static final String defaultMaxStackSizeTooltipMode = "disabled"; - private static final String defaultNbtTooltipMode = "disabled"; - private static final String defaultRegistryNameTooltipMode = "disabled"; - private static final String defaultTagsTooltipMode = "disabled"; - private static final String defaultTranslationKeyTooltipMode = "disabled"; - - private static final List validOptions = List.of( - "disabled", "enabled", "onShift", "onDebug", "onShiftAndDebug" - ); - - public static class Client { - public final ConfigValue burnTimeTooltipMode; - public final ConfigValue durabilityTooltipMode; - public final ConfigValue enchantabilityTooltipMode; - public final ConfigValue foodTooltipMode; - public final ConfigValue maxStackSizeTooltipMode; - public final ConfigValue nbtTooltipMode; - public final ConfigValue registryNameTooltipMode; - public final ConfigValue tagsTooltipMode; - public final ConfigValue translationKeyTooltipMode; - - Client(ForgeConfigSpec.Builder builder) { - builder.comment(CATEGORY_HANDLERS) - .comment(" Handler Options") - .push("handler_options"); - - builder.pop(); - - builder.comment(CATEGORY_MISCELLANEOUS) - .comment(" Miscellaneous Options") - .push("misc_options"); - - builder.pop(); - - builder.comment(CATEGORY_TOOLTIPS) - .comment(" Tooltip Options") - .comment(" Configure the options below to one of the following: " + - "disabled, enabled, onShift, onDebug or onShiftAndDebug") - .push("tooltip_options"); - - burnTimeTooltipMode = builder - .comment(" Configure tooltip for burn time.") - .translation("config.jeiintegration.tooltips.burnTimeTooltipMode") - .define("burnTimeTooltipMode", defaultBurnTimeTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - durabilityTooltipMode = builder - .comment(" Configure tooltip for durability.") - .translation("config.jeiintegration.tooltips.durabilityTooltipMode") - .define("durabilityTooltipMode", defaultDurabilityTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - enchantabilityTooltipMode = builder - .comment(" Configure tooltip for enchantability") - .translation("config.jeiintegration.tooltips.enchantabilityTooltipMode") - .define("enchantabilityTooltipMode", defaultEnchantabilityTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - foodTooltipMode = builder - .comment(" Configure tooltip for hunger and saturation.") - .translation("config.jeiintegration.tooltips.foodTooltipMode") - .define("foodTooltipMode", defaultFoodTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - maxStackSizeTooltipMode = builder - .comment(" Configure tooltip for max stack size.") - .translation("config.jeiintegration.tooltips.maxStackSizeTooltipMode") - .define("maxStackSizeTooltipMode", defaultMaxStackSizeTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - nbtTooltipMode = builder - .comment(" Configure tooltip for NBT data.") - .translation("config.jeiintegration.tooltips.nbtTooltipMode") - .define("nbtTooltipMode", defaultNbtTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - registryNameTooltipMode = builder - .comment(" Configure tooltip for registry name. E.g. minecraft:stone") - .translation("config.jeiintegration.tooltips.registryNameTooltipMode") - .define("registryNameTooltipMode", defaultRegistryNameTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - tagsTooltipMode = builder - .comment(" Configure tooltip for tags. E.g. forge:ingot, minecraft:planks") - .translation("config.jeiintegration.tooltips.tagsTooltipMode") - .define("tagsTooltipMode", defaultTagsTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - translationKeyTooltipMode = builder - .comment(" Configure tooltip for translation key. E.g. block.minecraft.stone") - .translation("config.jeiintegration.tooltips.translationKeyTooltipMode") - .define("translationKeyTooltipMode", defaultTranslationKeyTooltipMode, o -> o instanceof String string && validOptions.contains(string)); - - builder.pop(); - } - } - - public static final ForgeConfigSpec clientSpec; - public static final Config.Client CLIENT; - static { - final Pair specPair = new ForgeConfigSpec.Builder().configure(Config.Client::new); - clientSpec = specPair.getRight(); - CLIENT = specPair.getLeft(); - } - - @SubscribeEvent - public static void onLoad(final ModConfigEvent.Loading configEvent) { - JEIIntegration.logger.debug("Loaded JEI Integration config file {}", configEvent.getConfig().getFileName()); - } - - @SubscribeEvent - public static void onFileChange(final ModConfigEvent.Reloading configEvent) { - JEIIntegration.logger.debug("JEI Integration config just got changed on the file system!"); - } +/* + * MIT License + * + * Copyright (c) 2020 SnowShock35 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.snowshock35.jeiintegration.config; + +import com.snowshock35.jeiintegration.JEIIntegration; +import com.snowshock35.jeiintegration.modules.TooltipModule; +import com.snowshock35.jeiintegration.modules.TooltipModuleHolder; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.event.config.ModConfigEvent; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Config { + private static final String CATEGORY_HANDLERS = "Handler Settings"; + private static final String CATEGORY_TOOLTIPS = "Tooltip Settings"; + private static final String CATEGORY_MISCELLANEOUS = "Miscellaneous Settings"; + + private final List modules = new ArrayList<>(); + private final List enabledModules = new ArrayList<>(); + + public Config(ForgeConfigSpec.Builder builder, List modules) { + builder.comment(CATEGORY_HANDLERS) + .comment(" Handler Options") + .push("handler_options"); + + builder.pop(); + + builder.comment(CATEGORY_MISCELLANEOUS) + .comment(" Miscellaneous Options") + .push("misc_options"); + + builder.pop(); + + builder.comment(CATEGORY_TOOLTIPS) + .comment(" Tooltip Options") + .comment(" Configure the options below to one of the following: " + + "disabled, enabled, on_shift, on_debug or on_shift_and_debug") + .push("tooltip_options"); + + for (TooltipModule module : modules) { + TooltipModuleHolder moduleHolder = new TooltipModuleHolder(module, module.createConfigValue(builder)); + this.modules.add(moduleHolder); + } + + builder.pop(); + } + + public List getModules() { + return Collections.unmodifiableList(modules); + } + + public List getEnabledModules() { + return Collections.unmodifiableList(enabledModules); + } + + public void updateCache() { + enabledModules.clear(); + for (TooltipModuleHolder module : modules) { + if (module.config().get() != OptionState.DISABLED) { + enabledModules.add(module); + } + } + } + + @SubscribeEvent + public void onLoad(final ModConfigEvent.Loading configEvent) { + JEIIntegration.logger.debug("Loaded JEI Integration config file {}", configEvent.getConfig().getFileName()); + updateCache(); + } + + @SubscribeEvent + public void onFileChange(final ModConfigEvent.Reloading configEvent) { + JEIIntegration.logger.debug("JEI Integration config just got changed on the file system!"); + updateCache(); + } } \ No newline at end of file diff --git a/src/main/java/com/snowshock35/jeiintegration/config/OptionState.java b/src/main/java/com/snowshock35/jeiintegration/config/OptionState.java new file mode 100644 index 0000000..644cd57 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/config/OptionState.java @@ -0,0 +1,5 @@ +package com.snowshock35.jeiintegration.config; + +public enum OptionState { + DISABLED, ENABLED, ON_SHIFT, ON_DEBUG, ON_SHIFT_AND_DEBUG +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/BurnTimeModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/BurnTimeModule.java new file mode 100644 index 0000000..c16b336 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/BurnTimeModule.java @@ -0,0 +1,51 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.JEIIntegration; +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import org.apache.logging.log4j.Level; + +import java.text.DecimalFormat; + +import static net.minecraftforge.common.ForgeHooks.getBurnTime; + +public class BurnTimeModule implements TooltipModule { + private static final ThreadLocal DECIMAL_FORMAT = ThreadLocal.withInitial(() -> { + // Set number formatting to display large numbers more clearly + DecimalFormat format = new DecimalFormat("#.##"); + format.setGroupingUsed(true); + format.setGroupingSize(3); + return format; + }); + + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for burn time.") + .translation("config.jeiintegration.tooltips.burnTimeTooltipMode") + .defineEnum("burnTimeTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + int burnTime = 0; + try { + burnTime = getBurnTime(e.getItemStack(), RecipeType.SMELTING); + } catch (Exception ex) { + JEIIntegration.logger.log(Level.WARN, "):\n\nSomething went wrong!"); + } + + if (burnTime <= 0) { + return; + } + + Component burnTooltip = + Component.translatable("tooltip.jeiintegration.burnTime", DECIMAL_FORMAT.get().format(burnTime)) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(burnTooltip); + } +} \ No newline at end of file diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/DurabilityModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/DurabilityModule.java new file mode 100644 index 0000000..38791e6 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/DurabilityModule.java @@ -0,0 +1,30 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public class DurabilityModule implements TooltipModule { + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for durability.") + .translation("config.jeiintegration.tooltips.durabilityTooltipMode") + .defineEnum("durabilityTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + ItemStack itemStack = e.getItemStack(); + int maxDamage = itemStack.getMaxDamage(); + int currentDamage = maxDamage - itemStack.getDamageValue(); + if (maxDamage > 0) { + Component durabilityTooltip = Component.translatable("tooltip.jeiintegration.durability", currentDamage, maxDamage) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(durabilityTooltip); + } + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/EnchantabilityModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/EnchantabilityModule.java new file mode 100644 index 0000000..2e312c0 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/EnchantabilityModule.java @@ -0,0 +1,27 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public class EnchantabilityModule implements TooltipModule { + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for enchantability") + .translation("config.jeiintegration.tooltips.enchantabilityTooltipMode") + .defineEnum("enchantabilityTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + int enchantability = e.getItemStack().getEnchantmentValue(); + if (enchantability > 0) { + Component enchantabilityTooltip = Component.translatable("tooltip.jeiintegration.enchantability", enchantability) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(enchantabilityTooltip); + } + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/HungerModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/HungerModule.java new file mode 100644 index 0000000..272731c --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/HungerModule.java @@ -0,0 +1,44 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.food.FoodProperties; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +import java.text.DecimalFormat; + +public class HungerModule implements TooltipModule { + private static final ThreadLocal DECIMAL_FORMAT = ThreadLocal.withInitial(() -> { + // Set number formatting to display large numbers more clearly + DecimalFormat format = new DecimalFormat("#.##"); + format.setGroupingUsed(true); + format.setGroupingSize(3); + return format; + }); + + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for hunger and saturation.") + .translation("config.jeiintegration.tooltips.foodTooltipMode") + .defineEnum("foodTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + FoodProperties foodProperties = e.getItemStack().getFoodProperties(Minecraft.getInstance().player); + if (e.getItemStack().getItem().isEdible() && foodProperties != null) { + int healVal = foodProperties.getNutrition(); + float satVal = healVal * (foodProperties.getSaturationModifier() * 2); + + Component foodTooltip = Component.translatable("tooltip.jeiintegration.hunger", healVal) + .append(Component.translatable("tooltip.jeiintegration.saturation", DECIMAL_FORMAT.get().format(satVal))) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(foodTooltip); + } + + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/MaxStackSizeModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/MaxStackSizeModule.java new file mode 100644 index 0000000..2098e87 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/MaxStackSizeModule.java @@ -0,0 +1,27 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public class MaxStackSizeModule implements TooltipModule { + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for max stack size.") + .translation("config.jeiintegration.tooltips.maxStackSizeTooltipMode") + .defineEnum("maxStackSizeTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + int stackSize = e.getItemStack().getMaxStackSize(); + if (stackSize > 0) { + Component stackSizeTooltip = Component.translatable("tooltip.jeiintegration.maxStackSize", stackSize) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(stackSizeTooltip); + } + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/NbtDataModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/NbtDataModule.java new file mode 100644 index 0000000..40148ce --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/NbtDataModule.java @@ -0,0 +1,28 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public class NbtDataModule implements TooltipModule { + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for NBT data.") + .translation("config.jeiintegration.tooltips.nbtTooltipMode") + .defineEnum("nbtTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + CompoundTag nbtData = e.getItemStack().getShareTag(); + if (nbtData != null) { + Component nbtTooltip = Component.translatable("tooltip.jeiintegration.nbtTagData", nbtData) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(nbtTooltip); + } + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/RegistryNameModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/RegistryNameModule.java new file mode 100644 index 0000000..149ed32 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/RegistryNameModule.java @@ -0,0 +1,25 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.registries.ForgeRegistries; + +public class RegistryNameModule implements TooltipModule { + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for registry name. E.g. minecraft:stone") + .translation("config.jeiintegration.tooltips.registryNameTooltipMode") + .defineEnum("registryNameTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + Component registryTooltip = Component.translatable("tooltip.jeiintegration.registryName", ForgeRegistries.ITEMS.getKey(e.getItemStack().getItem())) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(registryTooltip); + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/TagsModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/TagsModule.java new file mode 100644 index 0000000..c1f3161 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/TagsModule.java @@ -0,0 +1,36 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public class TagsModule implements TooltipModule { + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for tags. E.g. forge:ingot, minecraft:planks") + .translation("config.jeiintegration.tooltips.tagsTooltipMode") + .defineEnum("tagsTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + ItemStack itemStack = e.getItemStack(); + if (itemStack.getTags().findAny().isPresent()) { + Component tagsTooltip = Component.translatable("tooltip.jeiintegration.tags") + .withStyle(ChatFormatting.DARK_GRAY); + + e.getToolTip().add(tagsTooltip); + + itemStack.getTags() + .map(TagKey::location) + .distinct() + .map(tag -> Component.literal(" " + tag).withStyle(ChatFormatting.DARK_GRAY)) + .forEachOrdered(tooltip -> e.getToolTip().add(tooltip)); + } + } +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/TooltipModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/TooltipModule.java new file mode 100644 index 0000000..60ba15a --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/TooltipModule.java @@ -0,0 +1,10 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public interface TooltipModule { + ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder); + void apply(ItemTooltipEvent e); +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/TooltipModuleHolder.java b/src/main/java/com/snowshock35/jeiintegration/modules/TooltipModuleHolder.java new file mode 100644 index 0000000..0567fef --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/TooltipModuleHolder.java @@ -0,0 +1,7 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraftforge.common.ForgeConfigSpec; + +public record TooltipModuleHolder(TooltipModule definition, ForgeConfigSpec.ConfigValue config) { +} diff --git a/src/main/java/com/snowshock35/jeiintegration/modules/TranslationModule.java b/src/main/java/com/snowshock35/jeiintegration/modules/TranslationModule.java new file mode 100644 index 0000000..0822b21 --- /dev/null +++ b/src/main/java/com/snowshock35/jeiintegration/modules/TranslationModule.java @@ -0,0 +1,25 @@ +package com.snowshock35.jeiintegration.modules; + +import com.snowshock35.jeiintegration.config.OptionState; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; + +public class TranslationModule implements TooltipModule { + + @Override + public ForgeConfigSpec.ConfigValue createConfigValue(ForgeConfigSpec.Builder builder) { + return builder + .comment(" Configure tooltip for translation key. E.g. block.minecraft.stone") + .translation("config.jeiintegration.tooltips.translationKeyTooltipMode") + .defineEnum("translationKeyTooltipMode", OptionState.DISABLED); + } + + @Override + public void apply(ItemTooltipEvent e) { + Component translationKeyTooltip = Component.translatable("tooltip.jeiintegration.translationKey", e.getItemStack().getDescriptionId()) + .withStyle(ChatFormatting.DARK_GRAY); + e.getToolTip().add(translationKeyTooltip); + } +} diff --git a/src/main/resources/assets/jeiintegration/lang/en_us.json b/src/main/resources/assets/jeiintegration/lang/en_us.json index f6689af..cd6d2dd 100644 --- a/src/main/resources/assets/jeiintegration/lang/en_us.json +++ b/src/main/resources/assets/jeiintegration/lang/en_us.json @@ -17,15 +17,14 @@ "config.jeiintegration.tooltips.translationKeyTooltipMode": "Translation Key Tooltip", "_comment": "Tooltips", - "tooltip.jeiintegration.burnTime": "Burn Time:", - "tooltip.jeiintegration.burnTime.suffix": "ticks", - "tooltip.jeiintegration.durability": "Durability:", - "tooltip.jeiintegration.enchantability": "Enchantability:", - "tooltip.jeiintegration.hunger": "Hunger:", - "tooltip.jeiintegration.saturation": "Saturation:", - "tooltip.jeiintegration.maxStackSize": "Max Stack Size:", - "tooltip.jeiintegration.nbtTagData": "NBT:", - "tooltip.jeiintegration.registryName": "ID:", + "tooltip.jeiintegration.burnTime": "Burn Time: %s ticks", + "tooltip.jeiintegration.durability": "Durability: %s/%s", + "tooltip.jeiintegration.enchantability": "Enchantability: %s", + "tooltip.jeiintegration.hunger": "Hunger: %s", + "tooltip.jeiintegration.saturation": "Saturation: %s", + "tooltip.jeiintegration.maxStackSize": "Max Stack Size: %s", + "tooltip.jeiintegration.nbtTagData": "NBT: %s", + "tooltip.jeiintegration.registryName": "ID: %s", "tooltip.jeiintegration.tags": "Tags:", - "tooltip.jeiintegration.translationKey": "Translation Key:" + "tooltip.jeiintegration.translationKey": "Translation Key: %s" } \ No newline at end of file diff --git a/src/main/resources/assets/jeiintegration/lang/fr_fr.json b/src/main/resources/assets/jeiintegration/lang/fr_fr.json index 1040156..716eb79 100644 --- a/src/main/resources/assets/jeiintegration/lang/fr_fr.json +++ b/src/main/resources/assets/jeiintegration/lang/fr_fr.json @@ -16,14 +16,13 @@ "config.jeiintegration.tooltips.translationKeyTooltipMode": "Info-bulle de la clé de traduction", "_comment": "Tooltips", - "tooltip.jeiintegration.burnTime": "Temps de combustion :", - "tooltip.jeiintegration.burnTime.suffix": "ticks", - "tooltip.jeiintegration.durability": "Durabilité :", - "tooltip.jeiintegration.hunger": "Faim :", - "tooltip.jeiintegration.saturation": "Saturation :", - "tooltip.jeiintegration.maxStackSize": "Taille maximale de la pile :", - "tooltip.jeiintegration.nbtTagData": "NBT :", - "tooltip.jeiintegration.registryName": "ID :", + "tooltip.jeiintegration.burnTime": "Temps de combustion : %s ticks", + "tooltip.jeiintegration.durability": "Durabilité : %s/%s", + "tooltip.jeiintegration.hunger": "Faim : %s", + "tooltip.jeiintegration.saturation": "Saturation : %s", + "tooltip.jeiintegration.maxStackSize": "Taille maximale de la pile : %s", + "tooltip.jeiintegration.nbtTagData": "NBT : %s", + "tooltip.jeiintegration.registryName": "ID : %s", "tooltip.jeiintegration.tags": "Tags :", - "tooltip.jeiintegration.translationKey": "Clé de traduction :" + "tooltip.jeiintegration.translationKey": "Clé de traduction : %s" } \ No newline at end of file diff --git a/src/main/resources/assets/jeiintegration/lang/ru_ru.json b/src/main/resources/assets/jeiintegration/lang/ru_ru.json index 29faabc..daf2b7e 100644 --- a/src/main/resources/assets/jeiintegration/lang/ru_ru.json +++ b/src/main/resources/assets/jeiintegration/lang/ru_ru.json @@ -16,14 +16,13 @@ "config.jeiintegration.tooltips.translationKeyTooltipMode": "Подсказка ключа перевода", "_comment": "Tooltips", - "tooltip.jeiintegration.burnTime": "Время горения:", - "tooltip.jeiintegration.burnTime.suffix": "тактов", - "tooltip.jeiintegration.durability": "Прочность:", - "tooltip.jeiintegration.hunger": "Голод:", - "tooltip.jeiintegration.saturation": "Насыщение:", - "tooltip.jeiintegration.maxStackSize": "Макс. размер стака:", - "tooltip.jeiintegration.nbtTagData": "NBT:", - "tooltip.jeiintegration.registryName": "ID:", + "tooltip.jeiintegration.burnTime": "Время горения: %s тактов", + "tooltip.jeiintegration.durability": "Прочность: %s/%s", + "tooltip.jeiintegration.hunger": "Голод: %s", + "tooltip.jeiintegration.saturation": "Насыщение: %s", + "tooltip.jeiintegration.maxStackSize": "Макс. размер стака: %s", + "tooltip.jeiintegration.nbtTagData": "NBT: %s", + "tooltip.jeiintegration.registryName": "ID: %s", "tooltip.jeiintegration.tags": "Теги:", - "tooltip.jeiintegration.translationKey": "Ключ перевода:" + "tooltip.jeiintegration.translationKey": "Ключ перевода: %s" }