diff --git a/build.gradle b/build.gradle index e116af4..9e96765 100644 --- a/build.gradle +++ b/build.gradle @@ -46,6 +46,7 @@ minecraft { accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + // Default run configurations. // These can be tweaked, removed, or duplicated as needed. runs { @@ -98,6 +99,10 @@ dependencies { jarJar.ranged(it, "[0.3.2,)") } + // deps + implementation fg.deobf("curse.maven:jei-238222:${deps.jei}") + + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' } diff --git a/dependencies.properties b/dependencies.properties index 5caedaa..78e99ba 100644 --- a/dependencies.properties +++ b/dependencies.properties @@ -1 +1,2 @@ -forge=47.1.3 \ No newline at end of file +forge=47.1.3 +jei=4712868 diff --git a/src/main/java/org/violetmoon/zeta/Zeta.java b/src/main/java/org/violetmoon/zeta/Zeta.java index 0ddc239..4c1dd9f 100644 --- a/src/main/java/org/violetmoon/zeta/Zeta.java +++ b/src/main/java/org/violetmoon/zeta/Zeta.java @@ -5,7 +5,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.BlockHitResult; -import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; import org.violetmoon.zeta.advancement.AdvancementModifierRegistry; @@ -28,7 +27,6 @@ import org.violetmoon.zeta.util.RegistryUtil; import org.violetmoon.zeta.util.ZetaSide; import org.violetmoon.zeta.util.handler.FuelHandler; -import org.violetmoon.zeta.util.handler.RequiredModTooltipHandler; import org.violetmoon.zeta.util.zetalist.IZeta; import org.violetmoon.zeta.util.zetalist.ZetaList; import org.violetmoon.zeta.world.EntitySpawnHandler; @@ -45,7 +43,7 @@ public Zeta(String modid, Logger log, ZetaSide side, boolean isProduction) { this.modid = modid; this.side = side; - this.isProduction = isProduction; + this.isProduction = isProduction; //TODO: either have all these constants or static helpers here or in Utils. Not both this.modules = createModuleManager(); @@ -87,14 +85,13 @@ public Zeta(String modid, Logger log, ZetaSide side, boolean isProduction) { //registry public final ZetaRegistry registry; - public final RegistryUtil registryUtil = new RegistryUtil(this); //TODO: Delete this, only needed cause there's no way to get early registry names. + public final RegistryUtil registryUtil = new RegistryUtil(this); //TODO: !!Delete this, only needed cause there's no way to get early registry names. public final RenderLayerRegistry renderLayerRegistry; public final DyeablesRegistry dyeables; public final CraftingExtensionsRegistry craftingExtensions; public final BrewingRegistry brewingRegistry; public final AdvancementModifierRegistry advancementModifierRegistry; public final PottedPlantRegistry pottedPlantRegistry; - public final RequiredModTooltipHandler requiredModTooltipHandler = new RequiredModTooltipHandler(); //TODO, find better spot or remove this. public final VariantRegistry variantRegistry = new VariantRegistry(this); //extensions diff --git a/src/main/java/org/violetmoon/zeta/advancement/AdvancementModifier.java b/src/main/java/org/violetmoon/zeta/advancement/AdvancementModifier.java index d7c8f2a..bb51e2b 100644 --- a/src/main/java/org/violetmoon/zeta/advancement/AdvancementModifier.java +++ b/src/main/java/org/violetmoon/zeta/advancement/AdvancementModifier.java @@ -25,7 +25,7 @@ public AdvancementModifier setCondition(BooleanSupplier cond) { @Override public boolean isActive() { - return (module == null || module.enabled) && cond.getAsBoolean() && ZetaGeneralConfig.enableAdvancementModification; + return (module == null || module.isEnabled()) && cond.getAsBoolean() && ZetaGeneralConfig.enableAdvancementModification; } } diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaBlock.java index 7ce4396..47e8998 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaBlock.java @@ -23,9 +23,7 @@ public ZetaBlock(String regname, @Nullable ZetaModule module, Properties propert if(module == null) //auto registration below this line return; - module.zeta.registry.registerBlock(this, regname); - if(module.category.isAddon()) - module.zeta.requiredModTooltipHandler.map(this, module.category.requiredMod); + module.zeta().registry.registerBlock(this, regname); } @Override diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaBushBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaBushBlock.java index 09c2bca..259fcab 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaBushBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaBushBlock.java @@ -23,8 +23,8 @@ public ZetaBushBlock(String regname, @Nullable ZetaModule module, ResourceKey t if(module == null) throw new IllegalArgumentException("Can only create ZetaSlabBlock with blocks belonging to a module"); //for various reasons - String resloc = module.zeta.registryUtil.inheritQuark(parent, "%s_slab"); - parent.getModule().zeta.registry.registerBlock(this, resloc, true); - parent.getModule().zeta.renderLayerRegistry.mock(this, parent.getBlock()); + String resloc = module.zeta().registryUtil.inheritQuark(parent, "%s_slab"); + parent.getModule().zeta().registry.registerBlock(this, resloc, true); + parent.getModule().zeta().renderLayerRegistry.mock(this, parent.getBlock()); setCreativeTab(tab == null ? CreativeModeTabs.BUILDING_BLOCKS : tab, parent.getBlock(), false); } @Override public boolean isFlammableZeta(BlockState state, BlockGetter world, BlockPos pos, Direction face) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).isFlammableZeta(parentState, world, pos, face); + return parent.getModule().zeta().blockExtensions.get(parentState).isFlammableZeta(parentState, world, pos, face); } @Override public int getFlammabilityZeta(BlockState state, BlockGetter world, BlockPos pos, Direction face) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).getFlammabilityZeta(parentState, world, pos, face); + return parent.getModule().zeta().blockExtensions.get(parentState).getFlammabilityZeta(parentState, world, pos, face); } @Nullable @@ -68,11 +68,10 @@ public boolean doesConditionApply() { return enabledSupplier.getAsBoolean(); } - @Nullable @Override public float[] getBeaconColorMultiplierZeta(BlockState state, LevelReader world, BlockPos pos, BlockPos beaconPos) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).getBeaconColorMultiplierZeta(parentState, world, pos, beaconPos); + return parent.getModule().zeta().blockExtensions.get(parentState).getBeaconColorMultiplierZeta(parentState, world, pos, beaconPos); } @Override diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaStairsBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaStairsBlock.java index dedfc5a..1a06d84 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaStairsBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaStairsBlock.java @@ -33,22 +33,22 @@ public ZetaStairsBlock(IZetaBlock parent, @Nullable ResourceKey if(module == null) throw new IllegalArgumentException("Can only create ZetaStairsBlock with blocks belonging to a module"); //for various reasons - String resloc = module.zeta.registryUtil.inheritQuark(parent, "%s_stairs"); - parent.getModule().zeta.registry.registerBlock(this, resloc, true); - parent.getModule().zeta.renderLayerRegistry.mock(this, parent.getBlock()); + String resloc = module.zeta().registryUtil.inheritQuark(parent, "%s_stairs"); + parent.getModule().zeta().registry.registerBlock(this, resloc, true); + parent.getModule().zeta().renderLayerRegistry.mock(this, parent.getBlock()); setCreativeTab(tab == null ? CreativeModeTabs.BUILDING_BLOCKS : tab, parent.getBlock(), false); } @Override public boolean isFlammableZeta(BlockState state, BlockGetter world, BlockPos pos, Direction face) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).isFlammableZeta(parentState, world, pos, face); + return parent.getModule().zeta().blockExtensions.get(parentState).isFlammableZeta(parentState, world, pos, face); } @Override public int getFlammabilityZeta(BlockState state, BlockGetter world, BlockPos pos, Direction face) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).getFlammabilityZeta(parentState, world, pos, face); + return parent.getModule().zeta().blockExtensions.get(parentState).getFlammabilityZeta(parentState, world, pos, face); } @Nullable @@ -68,11 +68,10 @@ public boolean doesConditionApply() { return enabledSupplier.getAsBoolean(); } - @Nullable @Override public float[] getBeaconColorMultiplierZeta(BlockState state, LevelReader world, BlockPos pos, BlockPos beaconPos) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).getBeaconColorMultiplierZeta(parentState, world, pos, beaconPos); + return parent.getModule().zeta().blockExtensions.get(parentState).getBeaconColorMultiplierZeta(parentState, world, pos, beaconPos); } @Override diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaStandingSignBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaStandingSignBlock.java index 7a2e4f7..badf676 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaStandingSignBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaStandingSignBlock.java @@ -21,7 +21,7 @@ public ZetaStandingSignBlock(String regname, @Nullable ZetaModule module, WoodTy if(module == null) //auto registration below this line return; - module.zeta.registry.registerBlock(this, regname, false); + module.zeta().registry.registerBlock(this, regname, false); } @Override diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaTrapdoorBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaTrapdoorBlock.java index 1c0f4b0..73521a3 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaTrapdoorBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaTrapdoorBlock.java @@ -28,8 +28,8 @@ public ZetaTrapdoorBlock(BlockSetType setType, String regname, ZetaModule module if(module == null) //auto registration below this line throw new IllegalArgumentException("Must provide a module for ZetaTrapdoorBlock"); //isLadderZeta - module.zeta.renderLayerRegistry.put(this, RenderLayerRegistry.Layer.CUTOUT); - module.zeta.registry.registerBlock(this, regname, true); + module.zeta().renderLayerRegistry.put(this, RenderLayerRegistry.Layer.CUTOUT); + module.zeta().registry.registerBlock(this, regname, true); CreativeTabManager.addToCreativeTab(CreativeModeTabs.BUILDING_BLOCKS, this); CreativeTabManager.addToCreativeTab(CreativeModeTabs.REDSTONE_BLOCKS, this); } @@ -39,7 +39,7 @@ public boolean isLadderZeta(BlockState state, LevelReader level, BlockPos pos, L if(state.getValue(OPEN)) { BlockPos downPos = pos.below(); BlockState down = level.getBlockState(downPos); - return module.zeta.blockExtensions.get(down).makesOpenTrapdoorAboveClimbableZeta(down, level, downPos, state); + return module.zeta().blockExtensions.get(down).makesOpenTrapdoorAboveClimbableZeta(down, level, downPos, state); } else return false; } diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaVineBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaVineBlock.java index a1853b7..a6b1089 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaVineBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaVineBlock.java @@ -30,8 +30,8 @@ public ZetaVineBlock(@Nullable ZetaModule module, String name, boolean creative) if(module == null) //auto registration below this line return; - module.zeta.registry.registerBlock(this, name, true); - module.zeta.renderLayerRegistry.put(this, RenderLayerRegistry.Layer.CUTOUT); + module.zeta().registry.registerBlock(this, name, true); + module.zeta().renderLayerRegistry.put(this, RenderLayerRegistry.Layer.CUTOUT); if (creative) setCreativeTab(CreativeModeTabs.NATURAL_BLOCKS); diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaWallBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaWallBlock.java index 604b91a..f71f523 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaWallBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaWallBlock.java @@ -31,9 +31,9 @@ public ZetaWallBlock(IZetaBlock parent, @Nullable ResourceKey t if(module == null) throw new IllegalArgumentException("Can only create ZetaWallBlock with blocks belonging to a module"); //getBeaconColorMultiplierZeta - String resloc = module.zeta.registryUtil.inheritQuark(parent, "%s_wall"); - parent.getModule().zeta.registry.registerBlock(this, resloc, true); - parent.getModule().zeta.renderLayerRegistry.mock(this, parent.getBlock()); + String resloc = module.zeta().registryUtil.inheritQuark(parent, "%s_wall"); + parent.getModule().zeta().registry.registerBlock(this, resloc, true); + parent.getModule().zeta().renderLayerRegistry.mock(this, parent.getBlock()); setCreativeTab(tab == null ? CreativeModeTabs.BUILDING_BLOCKS : tab, parent.getBlock(), false); } @@ -54,11 +54,10 @@ public boolean doesConditionApply() { return enabledSupplier.getAsBoolean(); } - @Nullable @Override public float[] getBeaconColorMultiplierZeta(BlockState state, LevelReader world, BlockPos pos, BlockPos beaconPos) { BlockState parentState = parent.getBlock().defaultBlockState(); - return parent.getModule().zeta.blockExtensions.get(parentState).getBeaconColorMultiplierZeta(parentState, world, pos, beaconPos); + return parent.getModule().zeta().blockExtensions.get(parentState).getBeaconColorMultiplierZeta(parentState, world, pos, beaconPos); } @Override diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaWallHangingSignBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaWallHangingSignBlock.java index 418c95e..30c25b1 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaWallHangingSignBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaWallHangingSignBlock.java @@ -21,7 +21,7 @@ public ZetaWallHangingSignBlock(String regname, @Nullable ZetaModule module, Woo if(module == null) //auto registration below this line return; - module.zeta.registry.registerBlock(this, regname, false); + module.zeta().registry.registerBlock(this, regname, false); } @Override diff --git a/src/main/java/org/violetmoon/zeta/block/ZetaWallSignBlock.java b/src/main/java/org/violetmoon/zeta/block/ZetaWallSignBlock.java index 37d5748..f3f61be 100644 --- a/src/main/java/org/violetmoon/zeta/block/ZetaWallSignBlock.java +++ b/src/main/java/org/violetmoon/zeta/block/ZetaWallSignBlock.java @@ -21,7 +21,7 @@ public ZetaWallSignBlock(String regname, ZetaModule module, WoodType type, Prope if(module == null) //auto registration below this line return; - module.zeta.registry.registerBlock(this, regname, false); + module.zeta().registry.registerBlock(this, regname, false); } @Override diff --git a/src/main/java/org/violetmoon/zeta/client/config/screen/ZetaConfigHomeScreen.java b/src/main/java/org/violetmoon/zeta/client/config/screen/ZetaConfigHomeScreen.java index 43ff3b4..e145ab1 100644 --- a/src/main/java/org/violetmoon/zeta/client/config/screen/ZetaConfigHomeScreen.java +++ b/src/main/java/org/violetmoon/zeta/client/config/screen/ZetaConfigHomeScreen.java @@ -66,7 +66,7 @@ protected void init() { b -> Minecraft.getInstance().setScreen(new SectionScreen(zc, this, changeSet, categorySection)))); Button checkButton = addRenderableWidget(new CheckboxButton(zc, x + bWidth, y, changeSet, categoryEnabled)); - boolean active = category.requiredModsLoaded(z); + boolean active = category.requiredModsLoaded(); mainButton.active = active; checkButton.active = active; } else { diff --git a/src/main/java/org/violetmoon/zeta/config/ConfigFlagManager.java b/src/main/java/org/violetmoon/zeta/config/ConfigFlagManager.java index 47003ad..48021d1 100644 --- a/src/main/java/org/violetmoon/zeta/config/ConfigFlagManager.java +++ b/src/main/java/org/violetmoon/zeta/config/ConfigFlagManager.java @@ -55,14 +55,14 @@ public void clear() { } public void putFlag(ZetaModule module, String flag, boolean value) { - flags.put(flag, value && module.enabled); + flags.put(flag, value && module.isEnabled()); if(!allFlags.contains(flag)) { allFlags.add(flag); } } public void putModuleFlag(ZetaModule module) { - putFlag(module, module.lowercaseName, true); + putFlag(module, module.lowerCaseName(), true); } public boolean isValidFlag(String flag) { diff --git a/src/main/java/org/violetmoon/zeta/config/ConfigManager.java b/src/main/java/org/violetmoon/zeta/config/ConfigManager.java index 9559864..5cc7e27 100644 --- a/src/main/java/org/violetmoon/zeta/config/ConfigManager.java +++ b/src/main/java/org/violetmoon/zeta/config/ConfigManager.java @@ -18,7 +18,8 @@ public class ConfigManager { //for updating the values of @Config annotations to match the current state of the config // and other "listening for config load" purposes private final List> databindings = new ArrayList<>(); - private Consumer onConfigReloadJEI; + // its a map so it can work when adding stuff multiple time from game reloads + private final Map> onReloadListeners = new HashMap<>(); //ummmmmmm i think my abstraction isn't very good private final @Nullable SectionDefinition generalSection; @@ -69,29 +70,30 @@ public ConfigManager(Zeta z, Object rootPojo) { // module enablement option moduleEnabledOptions.put(module, categorySectionBuilder.addValue(moduleEnabledOptionBuilder -> moduleEnabledOptionBuilder - .name(module.displayName) - .englishDisplayName(module.displayName) - .comment(module.description) - .defaultValue(module.enabledByDefault))); + .name(module.displayName()) + .englishDisplayName(module.displayName()) + .comment(module.description()) + .defaultValue(module.enabledByDefault()))); // per-module options categorySectionBuilder.addSubsection(moduleSectionBuilder -> { moduleSectionBuilder - .name(module.lowercaseName) - .englishDisplayName(module.displayName) - .comment(module.description); + .name(module.lowerCaseName()) + .englishDisplayName(module.displayName()) + .comment(module.description()); // @Config options ConfigObjectMapper.readInto(moduleSectionBuilder, module, databindings, cfm); // anti overlap option - if (!module.antiOverlap.isEmpty()) { + var antiOverlap = module.antiOverlap(); + if (!antiOverlap.isEmpty()) { ignoreAntiOverlapOptions.put(module, moduleSectionBuilder.addValue(antiOverlapOptionBuilder -> { antiOverlapOptionBuilder.name("Ignore Anti Overlap") .comment("This feature disables itself if any of the following mods are loaded:") .defaultValue(false); - for (String modid : module.antiOverlap) + for (String modid : antiOverlap) antiOverlapOptionBuilder.comment(" - " + modid); antiOverlapOptionBuilder.comment("This is done to prevent content overlap.") @@ -111,7 +113,7 @@ public ConfigManager(Zeta z, Object rootPojo) { //Its Janky ! databindings.add(0, i -> { categoryEnabledOptions.forEach((category, option) -> setCategoryEnabled(category, i.get(option))); - ignoreAntiOverlapOptions.forEach((module, option) -> module.ignoreAntiOverlap = !ZetaGeneralConfig.useAntiOverlap || i.get(option)); + ignoreAntiOverlapOptions.forEach((module, option) -> module.setIgnoreAntiOverlap(!ZetaGeneralConfig.useAntiOverlap || i.get(option))); moduleEnabledOptions.forEach((module, option) -> { setModuleEnabled(module, i.get(option)); cfm.putModuleFlag(module); @@ -157,7 +159,7 @@ private void setCategoryEnabled(ZetaCategory cat, boolean enabled) { //TODO: hacky, just forcing setEnabled to rerun since it checks category enablement for (ZetaModule mod : z.modules.modulesInCategory(cat)) { - mod.setEnabled(z, mod.enabled); + mod.setEnabled(z, mod.isEnabled()); } } @@ -179,12 +181,11 @@ public void onReload() { IZetaConfigInternals internals = z.configInternals; databindings.forEach(c -> c.accept(internals)); - if (onConfigReloadJEI != null) - onConfigReloadJEI.accept(internals); + onReloadListeners.values().forEach(r -> r.accept(internals)); } - public void setJeiReloadListener(Consumer consumer) { - this.onConfigReloadJEI = consumer; + public void addOnReloadListener(String id, Consumer consumer) { + this.onReloadListeners.put(id, consumer); consumer.accept(z.configInternals); //run it now as well } } diff --git a/src/main/java/org/violetmoon/zeta/config/type/EntitySpawnConfig.java b/src/main/java/org/violetmoon/zeta/config/type/EntitySpawnConfig.java index a86f656..9a1cbdb 100644 --- a/src/main/java/org/violetmoon/zeta/config/type/EntitySpawnConfig.java +++ b/src/main/java/org/violetmoon/zeta/config/type/EntitySpawnConfig.java @@ -32,7 +32,7 @@ public EntitySpawnConfig(int spawnWeight, int minGroupSize, int maxGroupSize, IB @Override public void onReload(ZetaModule module, ConfigFlagManager flagManager) { - enabled = (module != null && module.enabled); + enabled = (module != null && module.isEnabled()); } public boolean isEnabled() { diff --git a/src/main/java/org/violetmoon/zeta/event/load/ZGatherHints.java b/src/main/java/org/violetmoon/zeta/event/load/ZGatherHints.java new file mode 100644 index 0000000..c869d80 --- /dev/null +++ b/src/main/java/org/violetmoon/zeta/event/load/ZGatherHints.java @@ -0,0 +1,20 @@ +package org.violetmoon.zeta.event.load; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.ItemLike; +import org.violetmoon.zeta.config.ConfigFlagManager; +import org.violetmoon.zeta.event.bus.IZetaLoadEvent; +import org.violetmoon.zeta.event.bus.IZetaPlayEvent; +import org.violetmoon.zeta.module.ZetaModule; + +public interface ZGatherHints extends IZetaLoadEvent { + + void accept(ItemLike itemLike, Component extra); + + void hintItem(ItemLike itemLike, Object... extra); + + void hintItem(ItemLike itemLike, String key, Object... extra); + + void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm); + +} diff --git a/src/main/java/org/violetmoon/zeta/event/play/loading/ZGatherHints.java b/src/main/java/org/violetmoon/zeta/event/play/loading/ZGatherHints.java index 724dea1..612e93a 100644 --- a/src/main/java/org/violetmoon/zeta/event/play/loading/ZGatherHints.java +++ b/src/main/java/org/violetmoon/zeta/event/play/loading/ZGatherHints.java @@ -22,6 +22,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; +@Deprecated(forRemoval = true) public interface ZGatherHints extends IZetaPlayEvent { void accept(ItemLike itemLike, Component extra); @@ -47,7 +48,7 @@ default void hintItem(Zeta zeta, ItemLike itemLike, String key, Object... extra) } default void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm) { - if(!module.enabled) + if(!module.isEnabled()) return; List fields = ConfigObjectMapper.walkModuleFields(module.getClass()); @@ -91,11 +92,11 @@ default void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm) { //Application if(target instanceof TagKey tkey) - applyTag(module.zeta, tkey, key, extra); + applyTag(module.zeta(), tkey, key, extra); else if(target instanceof Iterable iter) - applyIterable(module.zeta, iter, key, extra); + applyIterable(module.zeta(), iter, key, extra); else - applyObject(module.zeta, target, key, extra); + applyObject(module.zeta(), target, key, extra); } catch (Exception e) { throw new RuntimeException("Problem applying annotation hint " + f.getName() + diff --git a/src/main/java/org/violetmoon/zeta/integration/ZetaJeiPlugin.java b/src/main/java/org/violetmoon/zeta/integration/ZetaJeiPlugin.java new file mode 100644 index 0000000..1eba801 --- /dev/null +++ b/src/main/java/org/violetmoon/zeta/integration/ZetaJeiPlugin.java @@ -0,0 +1,275 @@ +package org.violetmoon.zeta.integration; + +import com.google.common.collect.Sets; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.registration.IRecipeRegistration; +import mezz.jei.api.runtime.IJeiRuntime; +import net.minecraft.client.Minecraft; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.TippedArrowItem; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.level.ItemLike; +import org.jetbrains.annotations.NotNull; +import org.violetmoon.zeta.Zeta; +import org.violetmoon.zeta.config.ConfigFlagManager; +import org.violetmoon.zeta.config.ConfigObjectMapper; +import org.violetmoon.zeta.config.ZetaGeneralConfig; +import org.violetmoon.zeta.event.load.ZGatherHints; +import org.violetmoon.zeta.mod.ZetaMod; +import org.violetmoon.zeta.module.ZetaModule; +import org.violetmoon.zeta.util.Hint; +import org.violetmoon.zeta.util.RegistryUtil; +import org.violetmoon.zeta.util.zetalist.ZetaList; + +import java.lang.reflect.Field; +import java.util.*; + +@JeiPlugin +public class ZetaJeiPlugin implements IModPlugin { + private static final ResourceLocation UID = new ResourceLocation(ZetaMod.ZETA_ID, ZetaMod.ZETA_ID); + + @NotNull + @Override + public ResourceLocation getPluginUid() { + return UID; + } + + @Override + public void onRuntimeAvailable(@NotNull final IJeiRuntime jeiRuntime) { + + ZetaMod.ZETA.configManager.addOnReloadListener("jei_plugin", configInternals -> { + removeDisabledIngredients(jeiRuntime, ZetaList.INSTANCE.getZetas()); + }); + // also registers it for all the zeta as both configs can influence this + ZetaList.INSTANCE.getZetas().forEach(z -> z.configManager.addOnReloadListener("jei_plugin", configInternals -> { + removeDisabledIngredients(jeiRuntime, List.of(z)); + })); + } + + private static void removeDisabledIngredients(@NotNull IJeiRuntime jeiRuntime, Iterable zetas) { + + for (Zeta z : zetas) { + + //needed? + + // List disabledItems = ZetaMod.ZETA.requiredModTooltipHandler.disabledItems(); + // if (!disabledItems.isEmpty()) + // jeiRuntime.getIngredientManager().removeIngredientsAtRuntime(VanillaTypes.ITEM_STACK, disabledItems); + + + if (!ZetaGeneralConfig.hideDisabledContent) + return; + + + Set hidePotions = Sets.newHashSet(); + NonNullList stacksToHide = NonNullList.create(); + + //we need to manually hide potions derivative items as these are vanilla and will be populated automatically + + for (var h : z.registry.getRegisteredObjects(Registries.POTION)) { + if (!ZetaMod.ZETA.brewingRegistry.isEnabled(h.get())) { + hidePotions.add(h.get()); + } + } + + if (!hidePotions.isEmpty()) { + for (Item item : BuiltInRegistries.ITEM) { + if (item instanceof PotionItem || item instanceof TippedArrowItem) { + NonNullList potionStacks = NonNullList.create(); + potionStacks.stream().filter(it -> hidePotions.contains(PotionUtils.getPotion(it))).forEach(stacksToHide::add); + } + } + } + + //TODO: remove? I have no clue if this should be added or not + /* + for (var h : z.registry.getRegisteredObjects(Registries.ITEM)) { + if (!IDisableable.isEnabled(h.get())) { + //TODO 1.20: this just enumerated the item's variants + //item.fillItemCategory(CreativeModeTab.TAB_SEARCH, stacksToHide); + } + }*/ + + if (!stacksToHide.isEmpty()) + Minecraft.getInstance().submitAsync(() -> jeiRuntime.getIngredientManager() + .removeIngredientsAtRuntime(VanillaTypes.ITEM_STACK, stacksToHide)); + + } + } + + @Override + public void registerRecipes(@NotNull IRecipeRegistration registration) { + + if (!ZetaGeneralConfig.enableJeiItemInfo) return; + + RegistryAccess registryAccess = Minecraft.getInstance().level.registryAccess(); + + List blacklist = RegistryUtil.massRegistryGet(ZetaGeneralConfig.suppressedInfo, BuiltInRegistries.ITEM); + for (Zeta z : ZetaList.INSTANCE.getZetas()) { + z.loadBus.fire(new GatherHintImpl(registration, z, registryAccess, blacklist), ZGatherHints.class); + } + } + + // feel free to move it as public outer class + private static class GatherHintImpl implements ZGatherHints { + + private final Zeta zeta; + private final RegistryAccess registryAccess; + private final IRecipeRegistration registration; + private final List blacklist; + private final MutableComponent externalPreamble; + + public GatherHintImpl(IRecipeRegistration registration, Zeta z, RegistryAccess registryAccess, List blacklist) { + this.zeta = z; + this.registryAccess = registryAccess; + this.registration = registration; + this.blacklist = blacklist; + + this.externalPreamble = Component.translatable(z.modid + ".jei.hint.preamble"); + externalPreamble.setStyle(externalPreamble.getStyle().withColor(0x0b5d4b)); + } + + @Override + public void accept(ItemLike itemLike, Component extra) { + Item item = itemLike.asItem(); + + if (blacklist.contains(item)) + return; + + MutableComponent compound = Component.literal(""); + if (!BuiltInRegistries.ITEM.getKey(item).getNamespace().equals(zeta.modid)) + compound = compound.append(externalPreamble); + compound = compound.append(extra); + + registration.addItemStackInfo(new ItemStack(item), compound); + } + + private void applyTag(TagKey tkey, String key, Object... extra) { + if (key.isEmpty()) + key = tkey.location().getPath(); + + try { + List tagItems = RegistryUtil.getTagValues(registryAccess, tkey); + applyIterable(tagItems, key, extra); + } catch (IllegalStateException e) { + throw new RuntimeException("TagKey " + tkey + " failed to load.", e); + } + } + + private void applyIterable(Iterable iter, String key, Object... extra) { + if (key.isEmpty()) + throw new RuntimeException("Multi-item @Hints need a defined key."); + + for (Object obj : iter) + applyObject(obj, key, extra); + } + + private void applyObject(Object obj, String key, Object... extra) { + if (obj instanceof ItemLike ilike) + applyItemLike(ilike, key, extra); + else + throw new RuntimeException("Not an ItemLike."); + } + + private void applyItemLike(ItemLike itemLike, String key, Object... extra) { + if (key.isEmpty()) + hintItem(itemLike, extra); + else + hintItem(itemLike, key, extra); + } + + @Override + public void hintItem(ItemLike itemLike, Object... extra) { + Item item = itemLike.asItem(); + ResourceLocation res = BuiltInRegistries.ITEM.getKey(item); + String ns = res.getNamespace(); + String path = res.getPath(); + if (ns.equals(zeta.modid)) + ns = ""; + else ns += "."; + + hintItem(itemLike, ns + path, extra); + } + + @Override + public void hintItem(ItemLike itemLike, String key, Object... extra) { + Item item = itemLike.asItem(); + String hint = zeta.modid + ".jei.hint." + key; + accept(item, Component.translatable(hint, extra)); + } + + @Override + public void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm) { + if (!module.isEnabled()) + return; + + List fields = ConfigObjectMapper.walkModuleFields(module.getClass()); + + Map fieldsByName = new HashMap<>(); + for (Field f : fields) + fieldsByName.put(f.getName(), f); + + for (Field f : fields) { + try { + Hint hint = f.getAnnotation(Hint.class); + if (hint == null) + continue; + f.setAccessible(true); + + //Target + Object target = ConfigObjectMapper.getField(module, f); + if (target == null) + continue; + + //Flag + String flag = hint.value(); + if (!flag.isEmpty() && cfm.getFlag(flag) == !hint.negate()) + continue; + + //Translation, & gathering extra content + String key = hint.key(); + List extraList = new ArrayList<>(hint.content().length); + for (String c : hint.content()) { + if (c.isEmpty()) + continue; + + Field extraField = fieldsByName.get(c); + if (extraField == null) + throw new RuntimeException("No field " + c + " referenced in @Hint " + f); + + Object yes = ConfigObjectMapper.getField(module, extraField); + extraList.add(yes); + } + Object[] extra = extraList.toArray(new Object[0]); + + //Application + if (target instanceof TagKey tkey) + applyTag(tkey, key, extra); + else if (target instanceof Iterable iter) + applyIterable(iter, key, extra); + else + applyObject(target, key, extra); + + } catch (Exception e) { + throw new RuntimeException("Problem applying annotation hint " + f.getName() + + " from module " + module.getClass().getName() + + ": " + e.getMessage(), e); + } + } + } + } + +} diff --git a/src/main/java/org/violetmoon/zeta/item/ZetaArrowItem.java b/src/main/java/org/violetmoon/zeta/item/ZetaArrowItem.java index 2c22262..b7a3946 100644 --- a/src/main/java/org/violetmoon/zeta/item/ZetaArrowItem.java +++ b/src/main/java/org/violetmoon/zeta/item/ZetaArrowItem.java @@ -28,7 +28,7 @@ public ZetaArrowItem(String name, @Nullable ZetaModule module) { if(module == null) //auto registration below this line return; - module.zeta.registry.registerItem(this, name); + module.zeta().registry.registerItem(this, name); CreativeTabManager.addToCreativeTab(CreativeModeTabs.COMBAT, this); } diff --git a/src/main/java/org/violetmoon/zeta/item/ZetaHangingSignItem.java b/src/main/java/org/violetmoon/zeta/item/ZetaHangingSignItem.java index 1bf2249..e74bae7 100644 --- a/src/main/java/org/violetmoon/zeta/item/ZetaHangingSignItem.java +++ b/src/main/java/org/violetmoon/zeta/item/ZetaHangingSignItem.java @@ -25,8 +25,8 @@ public ZetaHangingSignItem(@Nullable ZetaModule module, Block sign, Block wallSi if(module == null) //auto registration below this line return; - String resloc = module.zeta.registryUtil.inherit(sign, "%s"); - module.zeta.registry.registerItem(this, resloc); + String resloc = module.zeta().registryUtil.inherit(sign, "%s"); + module.zeta().registry.registerItem(this, resloc); CreativeTabManager.addToCreativeTabNextTo(CreativeModeTabs.FUNCTIONAL_BLOCKS, this, Items.CHEST, true); } diff --git a/src/main/java/org/violetmoon/zeta/item/ZetaItem.java b/src/main/java/org/violetmoon/zeta/item/ZetaItem.java index 78e72e7..eaf9922 100644 --- a/src/main/java/org/violetmoon/zeta/item/ZetaItem.java +++ b/src/main/java/org/violetmoon/zeta/item/ZetaItem.java @@ -20,9 +20,7 @@ public ZetaItem(String regname, @Nullable ZetaModule module, Properties properti if(module == null) //auto registration below this line return; - module.zeta.registry.registerItem(this, regname); - if(module.category.isAddon()) - module.zeta.requiredModTooltipHandler.map(this, module.category.requiredMod); + module.zeta().registry.registerItem(this, regname); } @Override diff --git a/src/main/java/org/violetmoon/zeta/item/ZetaMobBucketItem.java b/src/main/java/org/violetmoon/zeta/item/ZetaMobBucketItem.java index 410a868..2b74ae9 100644 --- a/src/main/java/org/violetmoon/zeta/item/ZetaMobBucketItem.java +++ b/src/main/java/org/violetmoon/zeta/item/ZetaMobBucketItem.java @@ -29,7 +29,7 @@ public ZetaMobBucketItem(Supplier> entity, Supplier> type, int primaryCol if(module == null) //auto registration below this line return; - module.zeta.registry.registerItem(this, regname); + module.zeta().registry.registerItem(this, regname); CreativeTabManager.addToCreativeTab(CreativeModeTabs.SPAWN_EGGS, this); } diff --git a/src/main/java/org/violetmoon/zeta/module/ZetaCategory.java b/src/main/java/org/violetmoon/zeta/module/ZetaCategory.java index 42f3161..8a548c6 100644 --- a/src/main/java/org/violetmoon/zeta/module/ZetaCategory.java +++ b/src/main/java/org/violetmoon/zeta/module/ZetaCategory.java @@ -2,12 +2,15 @@ import java.util.function.Supplier; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; import org.violetmoon.zeta.Zeta; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import org.violetmoon.zeta.mod.ZetaMod; /** * @see org.violetmoon.zeta.module.ZetaModuleManager for a good way to obtain these @@ -16,11 +19,13 @@ public class ZetaCategory { public final String name; public final Supplier icon; public final @Nullable String requiredMod; + private final boolean isRequiredModLoaded; public ZetaCategory(String name, Supplier icon, @Nullable String requiredMod) { this.name = name; this.icon = icon; this.requiredMod = requiredMod; + this.isRequiredModLoaded = requiredMod == null || ZetaMod.ZETA.isModLoaded(requiredMod); } public ZetaCategory(String name, Item icon, @Nullable String requiredMod) { @@ -36,11 +41,11 @@ public static ZetaCategory unknownCategory(String id) { } public boolean isAddon() { - return requiredMod != null && !requiredMod.isEmpty(); + return requiredMod != null; } - public boolean requiredModsLoaded(Zeta z) { - return !isAddon() || z.isModLoaded(requiredMod); + public boolean requiredModsLoaded() { + return isRequiredModLoaded; } @Override @@ -49,4 +54,10 @@ public String toString() { } //Intentionally does not override equals/hashcode (object identity comparison) + + // maybe this should be in a module class instead? is this supposed to be subclassed? + public Component getDisabledTooltip() { + return Component.translatable("zeta.misc.mod_disabled", requiredMod) + .withStyle(ChatFormatting.GRAY); + } } diff --git a/src/main/java/org/violetmoon/zeta/module/ZetaModule.java b/src/main/java/org/violetmoon/zeta/module/ZetaModule.java index 2e71ad5..4757f98 100644 --- a/src/main/java/org/violetmoon/zeta/module/ZetaModule.java +++ b/src/main/java/org/violetmoon/zeta/module/ZetaModule.java @@ -1,60 +1,116 @@ package org.violetmoon.zeta.module; -import java.util.Set; - +import org.jetbrains.annotations.ApiStatus; import org.violetmoon.zeta.Zeta; -import org.violetmoon.zeta.event.bus.PlayEvent; -import org.violetmoon.zeta.event.play.loading.ZGatherHints; +import org.violetmoon.zeta.event.bus.LoadEvent; +import org.violetmoon.zeta.event.load.ZGatherHints; + +import java.util.List; +import java.util.Set; public class ZetaModule { - public Zeta zeta; - public ZetaCategory category; - public String displayName = ""; - public String lowercaseName = ""; - public String description = ""; + //all these deprecated are just so one knows that these will become protected soon + @Deprecated(forRemoval = true) + protected Zeta zeta; + protected ZetaCategory category; - public Set antiOverlap = Set.of(); + protected String displayName = ""; + protected String lowercaseName = ""; + protected String description = ""; - public boolean enabled = false; - public boolean enabledByDefault = false; - public boolean disabledByOverlap = false; - public boolean ignoreAntiOverlap = false; + protected Set antiOverlap = Set.of(); - public void postConstruct() { - // NO-OP - } + //TODO: make these protected and provide accessors + protected boolean enabled = false; + protected boolean enabledByDefault = false; + protected boolean disabledByOverlap = false; + protected boolean ignoreAntiOverlap = false; + + + public void postConstruct() { + // NO-OP + } + + public final void setEnabled(Zeta z, boolean willEnable) { + //TODO: is this the right approach for handling category enablement :woozy_face: + if (z.configManager != null && !z.configManager.isCategoryEnabled(category)) + willEnable = false; + + if (category != null && !category.requiredModsLoaded()) + willEnable = false; + + if (!ignoreAntiOverlap && antiOverlap.stream().anyMatch(z::isModLoaded)) { + disabledByOverlap = true; + willEnable = false; + } else + disabledByOverlap = false; + + setEnabledAndManageSubscriptions(z, willEnable); + } - public final void setEnabled(Zeta z, boolean willEnable) { - //TODO: is this the right approach for handling category enablement :woozy_face: - if(z.configManager != null && !z.configManager.isCategoryEnabled(category)) - willEnable = false; + private void setEnabledAndManageSubscriptions(Zeta z, boolean nowEnabled) { + if (this.enabled == nowEnabled) + return; + this.enabled = nowEnabled; - if(category != null && !category.requiredModsLoaded(z)) - willEnable = false; + if (nowEnabled) + z.playBus.subscribe(this.getClass()).subscribe(this); + else + z.playBus.unsubscribe(this.getClass()).unsubscribe(this); + } - if(!ignoreAntiOverlap && antiOverlap.stream().anyMatch(z::isModLoaded)) { - disabledByOverlap = true; - willEnable = false; - } else - disabledByOverlap = false; + //TODO: why is this here + @LoadEvent + public final void addAnnotationHints(ZGatherHints event) { + event.gatherHintsFromModule(this, zeta.configManager.getConfigFlagManager()); + } - setEnabledAndManageSubscriptions(z, willEnable); + // new accessors. Use these and later make all fields protected. Mods aren't supposed to change those fileds at runtime.. + + + public Zeta zeta() { + return zeta; + } + + public List antiOverlap() { + return List.copyOf(antiOverlap); } - private void setEnabledAndManageSubscriptions(Zeta z, boolean nowEnabled) { - if(this.enabled == nowEnabled) - return; - this.enabled = nowEnabled; + public boolean disabledByOverlap() { + return disabledByOverlap; + } - if(nowEnabled) - z.playBus.subscribe(this.getClass()).subscribe(this); - else - z.playBus.unsubscribe(this.getClass()).unsubscribe(this); + public boolean ignoreAntiOverlap() { + return ignoreAntiOverlap; } - @PlayEvent - public final void addAnnotationHints(ZGatherHints event) { - event.gatherHintsFromModule(this, zeta.configManager.getConfigFlagManager()); + public ZetaCategory category() { + return category; + } + + public String description() { + return description; + } + + public String displayName() { + return displayName; + } + + public String lowerCaseName() { + return lowercaseName; + } + + public boolean isEnabled() { + return enabled; + } + + public boolean enabledByDefault() { + return enabledByDefault; } + + @ApiStatus.Internal + public void setIgnoreAntiOverlap(boolean b) { + ignoreAntiOverlap = b; + } } diff --git a/src/main/java/org/violetmoon/zeta/registry/BrewingRegistry.java b/src/main/java/org/violetmoon/zeta/registry/BrewingRegistry.java index df83152..c411d00 100644 --- a/src/main/java/org/violetmoon/zeta/registry/BrewingRegistry.java +++ b/src/main/java/org/violetmoon/zeta/registry/BrewingRegistry.java @@ -54,9 +54,9 @@ public void addPotionMix(String flag, Supplier reagent, MobEffect ef String baseName = loc.getPath(); boolean hasStrong = strongTime > 0; - Potion normalType = registerPotion(new MobEffectInstance(effect, normalTime), baseName, baseName); - Potion longType = registerPotion(new MobEffectInstance(effect, longTime), baseName, "long_" + baseName); - Potion strongType = !hasStrong ? null : registerPotion(new MobEffectInstance(effect, strongTime, 1), baseName, "strong_" + baseName); + Potion normalType = registerPotion(new MobEffectInstance(effect, normalTime), baseName, baseName, flag); + Potion longType = registerPotion(new MobEffectInstance(effect, longTime), baseName, "long_" + baseName, flag); + Potion strongType = !hasStrong ? null : registerPotion(new MobEffectInstance(effect, strongTime, 1), baseName, "strong_" + baseName, flag); addPotionMix(flag, reagent, normalType, longType, strongType); @@ -65,9 +65,9 @@ public void addPotionMix(String flag, Supplier reagent, MobEffect ef if (negationLoc != null) { String negationBaseName = negationLoc.getPath(); - Potion normalNegationType = registerPotion(new MobEffectInstance(negation, normalTime), negationBaseName, negationBaseName); - Potion longNegationType = registerPotion(new MobEffectInstance(negation, longTime), negationBaseName, "long_" + negationBaseName); - Potion strongNegationType = !hasStrong ? null : registerPotion(new MobEffectInstance(negation, strongTime, 1), negationBaseName, "strong_" + negationBaseName); + Potion normalNegationType = registerPotion(new MobEffectInstance(negation, normalTime), negationBaseName, negationBaseName, flag); + Potion longNegationType = registerPotion(new MobEffectInstance(negation, longTime), negationBaseName, "long_" + negationBaseName, flag); + Potion strongNegationType = !hasStrong ? null : registerPotion(new MobEffectInstance(negation, strongTime, 1), negationBaseName, "strong_" + negationBaseName, flag); addNegation(flag, normalType, longType, strongType, normalNegationType, longNegationType, strongNegationType); } @@ -102,10 +102,10 @@ public void addNegation(String flag, Potion normalType, Potion longType, @Nullab } - protected final Map flaggedPotions = Maps.newHashMap(); + // uglyyy + protected final Map modPotionsToConfigFlag = Maps.newHashMap(); protected void addFlaggedRecipe(String flag, Potion potion, Supplier reagent, Potion to) { - flaggedPotions.put(to, flag); Supplier flagIngredientSupplier = () -> new FlagIngredient( reagent.get(), flag, @@ -116,17 +116,19 @@ protected void addFlaggedRecipe(String flag, Potion potion, Supplier addBrewingRecipe(potion, flagIngredientSupplier, to); } - protected Potion registerPotion(MobEffectInstance eff, String baseName, String name) { - Potion effect = new Potion(zeta.modid + "." + baseName, eff); - zeta.registry.register(effect, name, Registries.POTION); + protected Potion registerPotion(MobEffectInstance eff, String baseName, String name, String configFlag) { + Potion potion = new Potion(zeta.modid + "." + baseName, eff); + zeta.registry.register(potion, name, Registries.POTION); - return effect; + modPotionsToConfigFlag.put(potion, configFlag); + + return potion; } public boolean isEnabled(Potion potion) { - if (!flaggedPotions.containsKey(potion)) - return true; - return zeta.configManager.getConfigFlagManager().getFlag(flaggedPotions.get(potion)); + String flag = modPotionsToConfigFlag.get(potion); + if (flag == null) return true; + return zeta.configManager.getConfigFlagManager().getFlag(flag); } public static Ingredient redstone() { diff --git a/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java b/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java index da4c529..976fbc9 100644 --- a/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java +++ b/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java @@ -71,7 +71,7 @@ public void register(Item item) { } public void register(Item item, ZetaModule module) { - register(item, () -> module.enabled); + register(item, module::isEnabled); } public void register(Item item, BooleanSupplier cond) { diff --git a/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java b/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java index 8fc463e..2106b37 100644 --- a/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java +++ b/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java @@ -10,6 +10,7 @@ import java.util.function.Function; import java.util.function.Supplier; +import org.checkerframework.checker.units.qual.A; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.violetmoon.zeta.Zeta; @@ -38,6 +39,8 @@ public abstract class ZetaRegistry { // the keys of this are things like "minecraft:block", "minecraft:item" and so on private final Multimap> defers = ArrayListMultimap.create(); + // my registered entries + private final Map>, List>> myRegisteredObjects = new HashMap<>(); // to support calling getRegistryName before the object actually gets registered for real protected final Map internalNames = new IdentityHashMap<>(); @@ -273,4 +276,15 @@ public void performDynamicRegistration(RegistryOps.RegistryInfoLookup lookup entry.lateBound.bind(thing, writable); }); } + + protected void trackRegisteredObject(ResourceKey> keyGeneric, Holder entry) { + myRegisteredObjects.computeIfAbsent((ResourceKey) keyGeneric, __ -> new ArrayList<>()).add(entry); + } + + /** + * Gets all the registered objects from this Zeta + */ + public Collection> getRegisteredObjects(ResourceKey> registry) { + return (Collection>) (Collection) myRegisteredObjects.get((ResourceKey) registry); + } } diff --git a/src/main/java/org/violetmoon/zeta/util/Utils.java b/src/main/java/org/violetmoon/zeta/util/Utils.java index 8d7ca87..8cfacce 100644 --- a/src/main/java/org/violetmoon/zeta/util/Utils.java +++ b/src/main/java/org/violetmoon/zeta/util/Utils.java @@ -3,9 +3,13 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.loading.FMLPaths; +import org.jetbrains.annotations.Nullable; +import org.violetmoon.zeta.Zeta; import java.nio.file.Path; +//TODO: either move all this stuff in Zeta o move all Zeta related stuff here (like isModLoaded, client ticker and stuff) +// Either remove or move zeta helper stuff here.Forge specific behavior can be done with Platform delegates public class Utils { public static Path configDir() { return FMLPaths.CONFIGDIR.get(); @@ -18,4 +22,13 @@ public static Path modsDir() { public static boolean isDevEnv() { return !FMLLoader.isProduction(); } + + // modloader services + public boolean isModLoaded(String modid){ + return ModList.get().isLoaded(modid); + } + + public @Nullable String getModDisplayName(String modid){ + return ModList.get().getModContainerById(modid).map(container -> container.getModInfo().getDisplayName()).orElse(null); + } } diff --git a/src/main/java/org/violetmoon/zeta/util/handler/RequiredModTooltipHandler.java b/src/main/java/org/violetmoon/zeta/util/handler/RequiredModTooltipHandler.java deleted file mode 100644 index c0957ea..0000000 --- a/src/main/java/org/violetmoon/zeta/util/handler/RequiredModTooltipHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.violetmoon.zeta.util.handler; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.violetmoon.zeta.Zeta; -import org.violetmoon.zeta.config.ZetaGeneralConfig; -import org.violetmoon.zeta.event.bus.PlayEvent; -import org.violetmoon.zeta.event.play.ZItemTooltip; - -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.fml.ModList; - -//TODO: janky -public class RequiredModTooltipHandler { - - private final Map items = new HashMap<>(); - private final Map blocks = new HashMap<>(); //TODO: only needed because it's called in constructors where Block.asItem isn't set up yet - - public void map(Item item, String mod) { - items.put(item, mod); - } - - public void map(Block block, String mod) { - blocks.put(block, mod); - } - - public List disabledItems() { - if(!ZetaGeneralConfig.hideDisabledContent) - return new ArrayList<>(); - - return items.entrySet().stream() - .filter((entry) -> !ModList.get().isLoaded(entry.getValue())) - .map((entry) -> new ItemStack(entry.getKey())) - .toList(); - } - - public static class Client { - private final Zeta z; - - public Client(Zeta z) { - this.z = z; - } - - @PlayEvent - public void onTooltip(ZItemTooltip event) { - Map ITEMS = z.requiredModTooltipHandler.items; - Map BLOCKS = z.requiredModTooltipHandler.blocks; - - if(!BLOCKS.isEmpty() && event.getEntity() != null && event.getEntity().level() != null) { - for(Block b : BLOCKS.keySet()) - ITEMS.put(b.asItem(), BLOCKS.get(b)); - BLOCKS.clear(); - } - - Item item = event.getItemStack().getItem(); - if(ITEMS.containsKey(item)) { - String mod = ITEMS.get(item); - if (!z.isModLoaded(mod)) { - event.getToolTip().add(Component.translatable("quark.misc.mod_disabled", mod).withStyle(ChatFormatting.GRAY)); - } - } - } - } -} diff --git a/src/main/java/org/violetmoon/zeta/util/handler/ToolInteractionHandler.java b/src/main/java/org/violetmoon/zeta/util/handler/ToolInteractionHandler.java index 8be4cfd..9d50239 100644 --- a/src/main/java/org/violetmoon/zeta/util/handler/ToolInteractionHandler.java +++ b/src/main/java/org/violetmoon/zeta/util/handler/ToolInteractionHandler.java @@ -75,7 +75,7 @@ public static void addModifiers(ZCommonSetup event) { } //TODO: what - module.zeta.advancementModifierRegistry.addModifier(new WaxModifier(module, unwaxed, waxed)); + module.zeta().advancementModifierRegistry.addModifier(new WaxModifier(module, unwaxed, waxed)); } }); } diff --git a/src/main/java/org/violetmoon/zeta/world/WorldGenHandler.java b/src/main/java/org/violetmoon/zeta/world/WorldGenHandler.java index a94b1ba..8464925 100644 --- a/src/main/java/org/violetmoon/zeta/world/WorldGenHandler.java +++ b/src/main/java/org/violetmoon/zeta/world/WorldGenHandler.java @@ -87,7 +87,7 @@ public static void generateChunk(FeaturePlaceContext c for(WeightedGenerator wgen : set) { Generator gen = wgen.generator(); - if(wgen.module().enabled && gen.canGenerate(region)) { + if(wgen.module().isEnabled() && gen.canGenerate(region)) { if(ZetaGeneralConfig.enableWorldgenWatchdog) { final int finalStageNum = stageNum; stageNum = watchdogRun(gen, () -> gen.generate(finalStageNum, seed, stage, region, generator, random, pos), 1, TimeUnit.MINUTES); diff --git a/src/main/java/org/violetmoon/zetaimplforge/event/ForgeEventsRemapper.java b/src/main/java/org/violetmoon/zetaimplforge/event/ForgeEventsRemapper.java index 5e8de89..2d397fc 100644 --- a/src/main/java/org/violetmoon/zetaimplforge/event/ForgeEventsRemapper.java +++ b/src/main/java/org/violetmoon/zetaimplforge/event/ForgeEventsRemapper.java @@ -137,6 +137,7 @@ private Consumer createForgeConsumer( } // for generic events + // auto register ones are deprecated. Register manually, its faster and requires no reflection hacks @Deprecated public void registerWrapperWithGeneric(Class baseZetaEventClass, Class forgeZetaEventClass, Class genericClass) { diff --git a/src/main/java/org/violetmoon/zetaimplforge/event/load/ForgeZGatherHints.java b/src/main/java/org/violetmoon/zetaimplforge/event/load/ForgeZGatherHints.java index a47556b..e589ece 100644 --- a/src/main/java/org/violetmoon/zetaimplforge/event/load/ForgeZGatherHints.java +++ b/src/main/java/org/violetmoon/zetaimplforge/event/load/ForgeZGatherHints.java @@ -2,45 +2,37 @@ import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.Component; -import net.minecraft.server.ReloadableServerResources; -import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.event.AddReloadListenerEvent; import net.minecraftforge.eventbus.api.Event; import org.violetmoon.zeta.Zeta; import org.violetmoon.zeta.config.ConfigFlagManager; -import org.violetmoon.zeta.event.play.loading.ZGatherHints; +import org.violetmoon.zeta.event.load.ZGatherHints; import org.violetmoon.zeta.module.ZetaModule; public class ForgeZGatherHints extends Event implements ZGatherHints { - private final ZGatherHints wrapped; - - public ForgeZGatherHints(ZGatherHints e) { - this.wrapped = e; - } - - @Override - public void accept(ItemLike itemLike, Component extra) { - wrapped.accept(itemLike, extra); - } - - @Override - public RegistryAccess getRegistryAccess() { - return wrapped.getRegistryAccess(); - } - - @Override - public void hintItem(Zeta zeta, ItemLike itemLike, Object... extra) { - wrapped.hintItem(zeta, itemLike, extra); - } - - @Override - public void hintItem(Zeta zeta, ItemLike itemLike, String key, Object... extra) { - wrapped.hintItem(zeta, itemLike, key, extra); - } - - @Override - public void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm) { - wrapped.gatherHintsFromModule(module, cfm); - } + private final ZGatherHints wrapped; + + public ForgeZGatherHints(ZGatherHints e) { + this.wrapped = e; + } + + @Override + public void accept(ItemLike itemLike, Component extra) { + wrapped.accept(itemLike, extra); + } + + @Override + public void hintItem(ItemLike itemLike, Object... extra) { + wrapped.hintItem(itemLike, extra); + } + + @Override + public void hintItem(ItemLike itemLike, String key, Object... extra) { + wrapped.hintItem(itemLike, key, extra); + } + + @Override + public void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm) { + wrapped.gatherHintsFromModule(module, cfm); + } } diff --git a/src/main/java/org/violetmoon/zetaimplforge/event/play/loading/ForgeZGatherHints.java b/src/main/java/org/violetmoon/zetaimplforge/event/play/loading/ForgeZGatherHints.java new file mode 100644 index 0000000..0115106 --- /dev/null +++ b/src/main/java/org/violetmoon/zetaimplforge/event/play/loading/ForgeZGatherHints.java @@ -0,0 +1,44 @@ +package org.violetmoon.zetaimplforge.event.play.loading; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.eventbus.api.Event; +import org.violetmoon.zeta.Zeta; +import org.violetmoon.zeta.config.ConfigFlagManager; +import org.violetmoon.zeta.event.play.loading.ZGatherHints; +import org.violetmoon.zeta.module.ZetaModule; + +@Deprecated(forRemoval = true) +public class ForgeZGatherHints extends Event implements ZGatherHints { + private final ZGatherHints wrapped; + + public ForgeZGatherHints(ZGatherHints e) { + this.wrapped = e; + } + + @Override + public void accept(ItemLike itemLike, Component extra) { + wrapped.accept(itemLike, extra); + } + + @Override + public RegistryAccess getRegistryAccess() { + return wrapped.getRegistryAccess(); + } + + @Override + public void hintItem(Zeta zeta, ItemLike itemLike, Object... extra) { + wrapped.hintItem(zeta, itemLike, extra); + } + + @Override + public void hintItem(Zeta zeta, ItemLike itemLike, String key, Object... extra) { + wrapped.hintItem(zeta, itemLike, key, extra); + } + + @Override + public void gatherHintsFromModule(ZetaModule module, ConfigFlagManager cfm) { + wrapped.gatherHintsFromModule(module, cfm); + } +} diff --git a/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModClientProxy.java b/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModClientProxy.java index b10fbdf..1a01e08 100644 --- a/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModClientProxy.java +++ b/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModClientProxy.java @@ -1,5 +1,7 @@ package org.violetmoon.zetaimplforge.mod; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraftforge.client.event.RenderGuiOverlayEvent; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderPlayerEvent; @@ -7,13 +9,18 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.SubscribeEvent; import org.violetmoon.zeta.Zeta; +import org.violetmoon.zeta.block.IZetaBlock; import org.violetmoon.zeta.client.ClientTicker; import org.violetmoon.zeta.client.event.load.*; import org.violetmoon.zeta.client.event.play.*; import org.violetmoon.zeta.event.bus.IZetaLoadEvent; import org.violetmoon.zeta.event.bus.IZetaPlayEvent; -import org.violetmoon.zeta.util.handler.RequiredModTooltipHandler; +import org.violetmoon.zeta.event.bus.PlayEvent; +import org.violetmoon.zeta.event.play.ZItemTooltip; +import org.violetmoon.zeta.item.IZetaItem; +import org.violetmoon.zeta.module.ZetaModule; import org.violetmoon.zeta.util.zetalist.ZetaList; import org.violetmoon.zetaimplforge.client.event.load.*; import org.violetmoon.zetaimplforge.client.event.play.*; @@ -27,16 +34,18 @@ public class ZetaModClientProxy extends ZetaModCommonProxy { @Override public void registerEvents(Zeta zeta){ super.registerEvents(zeta); - zeta.playBus - .subscribe(ClientTicker.INSTANCE) - .subscribe(new RequiredModTooltipHandler.Client(zeta)); + zeta.playBus.subscribe(ClientTicker.INSTANCE) + .subscribe(this); - MinecraftForge.EVENT_BUS.addListener(this::clientTick); + MinecraftForge.EVENT_BUS.register(this); } + //TODO: move these 2 events to a common class + // added once per zeta. Its fine as we then fire it on zeta load bos which is one per zeta too. boolean clientTicked = false; + @SubscribeEvent public void clientTick(TickEvent.ClientTickEvent e) { if (!clientTicked) { ZetaList.INSTANCE.fireLoadEvent(new ForgeZFirstClientTick()); @@ -44,6 +53,23 @@ public void clientTick(TickEvent.ClientTickEvent e) { } } + @PlayEvent + public void onTooltip(ZItemTooltip event) { + Item item = event.getItemStack().getItem(); + + ZetaModule module = null; + if (item instanceof IZetaItem zi) { + module = zi.getModule(); + } + if (item instanceof BlockItem bi && bi.getBlock() instanceof IZetaBlock zb) { + zb.getModule(); + } + + if (module != null && !module.isEnabled() && module.category().isAddon()) { + event.getToolTip().add(module.category().getDisabledTooltip()); + } + } + @Override public void addKnownZetaLoadEvents(ForgeEventsRemapper r) { super.addKnownZetaLoadEvents(r); diff --git a/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModCommonProxy.java b/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModCommonProxy.java index a2ad69e..48c0119 100644 --- a/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModCommonProxy.java +++ b/src/main/java/org/violetmoon/zetaimplforge/mod/ZetaModCommonProxy.java @@ -27,6 +27,7 @@ import org.violetmoon.zeta.event.play.entity.living.*; import org.violetmoon.zeta.event.play.entity.player.*; import org.violetmoon.zeta.event.play.loading.*; +import org.violetmoon.zeta.event.play.loading.ZGatherHints; import org.violetmoon.zeta.util.handler.RecipeCrawlHandler; import org.violetmoon.zeta.util.handler.ToolInteractionHandler; import org.violetmoon.zeta.world.EntitySpawnHandler; @@ -42,6 +43,7 @@ import org.violetmoon.zetaimplforge.event.play.entity.living.*; import org.violetmoon.zetaimplforge.event.play.entity.player.*; import org.violetmoon.zetaimplforge.event.play.loading.*; +import org.violetmoon.zetaimplforge.event.play.loading.ForgeZGatherHints; import org.violetmoon.zetaimplforge.world.ZetaBiomeModifier; import java.util.function.Function; @@ -93,6 +95,8 @@ public void addKnownZetaLoadEvents(ForgeEventsRemapper r) //zeta own r.registerWrapper(ZGatherAdvancementModifiers.class, ForgeZGatherAdvancementModifiers.class); r.registerWrapper(ZGatherAdditionalFlags.class, ForgeZGatherAdditionalFlags.class); + r.registerWrapper(org.violetmoon.zeta.event.load.ZGatherHints.class, org.violetmoon.zetaimplforge.event.load.ForgeZGatherHints.class); + } diff --git a/src/main/java/org/violetmoon/zetaimplforge/registry/ForgeZetaRegistry.java b/src/main/java/org/violetmoon/zetaimplforge/registry/ForgeZetaRegistry.java index c4fa885..6c19377 100644 --- a/src/main/java/org/violetmoon/zetaimplforge/registry/ForgeZetaRegistry.java +++ b/src/main/java/org/violetmoon/zetaimplforge/registry/ForgeZetaRegistry.java @@ -30,11 +30,15 @@ private void onRegisterEvent(RegisterEvent event) { for(Supplier supplier : ourEntries) { Object entry = supplier.get(); ResourceLocation name = internalNames.get(entry); - z.log.debug("Registering to " + registryRes + " - " + name); + z.log.debug("Registering to {} - {}", registryRes, name); event.register(keyGeneric, e-> e.register(name, entry)); + + trackRegisteredObject(keyGeneric, event.getVanillaRegistry().wrapAsHolder(entry)); } clearDeferCache(registryRes); } } + + } diff --git a/src/main/resources/assets/zeta/lang/en_us.json b/src/main/resources/assets/zeta/lang/en_us.json new file mode 100644 index 0000000..2e4ff5e --- /dev/null +++ b/src/main/resources/assets/zeta/lang/en_us.json @@ -0,0 +1,5 @@ +{ + "zeta.misc.mod_disabled": "Disabled. Install %s to enable.", + "zeta.jei.hint_preamble": "[Zeta]\n" +} +