From f301088182cefef236465f3a8204c3131685b1ca Mon Sep 17 00:00:00 2001 From: Keridos <2742845+Keridos@users.noreply.github.com> Date: Thu, 29 Oct 2026 14:41:46 +0100 Subject: [PATCH] Upgrade and addon switches: config sections upgrades and addons Each upgrade (turret base and generator) and addon item can be switched off in the config. A disabled one stays in its slot but counts as not installed (TurretBaseLogic counts through LogicSettings.upgradeEnabled / addonEnabled, GeneratorBlockEntity.getMultiplierUpgrades), and its recipe and unlock advancement do not load: the resource condition openmodularturrets:module_enabled, registered per loader (Fabric, NeoForge, Forge) and added by datagen to every upgrade and addon recipe. The client marks disabled ones with the synced config: a red frame and tint behind their machine slot, vanilla's barrier sprite over the icon in every GUI (Fabric client mixin on renderItemDecorations, NeoForge/Forge item decorators) and a red first tooltip line. Tests: DisabledModules unit tests, ModuleToggleGameTests. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 4 + CLAUDE.md | 7 +- docs/architecture.md | 2 + .../client/mixin/GuiGraphicsMixin.java | 25 ++++ .../client/platform/forge/OMTForgeClient.java | 7 + .../platform/neoforge/OMTNeoForgeClient.java | 7 + .../client/render/DisabledModuleOverlay.java | 77 ++++++++++ .../client/screen/GeneratorScreen.java | 2 + .../client/screen/TurretBaseScreen.java | 2 + .../client/tooltip/ModuleTooltip.java | 5 + .../gametest/ModuleToggleGameTests.java | 136 ++++++++++++++++++ src/gametest/resources/fabric.mod.json | 1 + .../misc/GeneratorBlockEntity.java | 6 +- .../compat/ModuleEnabledCondition.java | 26 ++++ .../openmodularturrets/config/ConfigData.java | 77 ++++++++++ .../config/ConfigLogicSettings.java | 12 ++ .../core/base/TurretBaseLogic.java | 6 +- .../core/settings/LogicSettings.java | 8 ++ .../datagen/OMTRecipeProvider.java | 12 +- .../item/ModuleToggles.java | 58 ++++++++ .../fabric/FabricModuleEnabledCondition.java | 107 ++++++++++++++ .../platform/fabric/OMTFabric.java | 1 + .../forge/ForgeModuleEnabledCondition.java | 55 +++++++ .../platform/forge/OMTForge.java | 5 + .../NeoForgeModuleEnabledCondition.java | 31 ++++ .../platform/neoforge/OMTNeoForge.java | 4 + .../assets/openmodularturrets/lang/de_de.json | 3 +- .../assets/openmodularturrets/lang/en_gb.json | 3 +- .../assets/openmodularturrets/lang/en_us.json | 3 +- .../assets/openmodularturrets/lang/pt_br.json | 3 +- .../assets/openmodularturrets/lang/ru_ru.json | 3 +- .../assets/openmodularturrets/lang/zh_cn.json | 3 +- .../openmodularturrets.client.mixins.json | 1 + .../core/base/FakeSettings.java | 15 ++ .../core/base/TurretBaseLogicTest.java | 77 ++++++++++ .../recipes/misc/addon_concealer.json | 8 ++ .../recipes/misc/addon_damage_amp.json | 8 ++ .../recipes/misc/addon_fake_drops.json | 8 ++ .../recipes/misc/addon_recycler.json | 8 ++ .../recipes/misc/addon_redstone_reactor.json | 8 ++ .../recipes/misc/addon_solar_panel.json | 8 ++ .../recipes/misc/upgrade_accuracy.json | 8 ++ .../recipes/misc/upgrade_efficiency.json | 8 ++ .../misc/upgrade_energy_multiplier.json | 8 ++ .../recipes/misc/upgrade_fire_rate.json | 8 ++ .../recipes/misc/upgrade_range.json | 8 ++ .../recipes/misc/upgrade_scatter_shot.json | 8 ++ .../recipes/addon_concealer.json | 8 ++ .../recipes/addon_damage_amp.json | 8 ++ .../recipes/addon_fake_drops.json | 8 ++ .../recipes/addon_recycler.json | 8 ++ .../recipes/addon_redstone_reactor.json | 8 ++ .../recipes/addon_solar_panel.json | 8 ++ .../recipes/upgrade_accuracy.json | 8 ++ .../recipes/upgrade_efficiency.json | 8 ++ .../recipes/upgrade_energy_multiplier.json | 8 ++ .../recipes/upgrade_fire_rate.json | 8 ++ .../recipes/upgrade_range.json | 8 ++ .../recipes/upgrade_scatter_shot.json | 8 ++ .../recipes/misc/addon_concealer.json | 8 ++ .../recipes/misc/addon_damage_amp.json | 8 ++ .../recipes/misc/addon_fake_drops.json | 8 ++ .../recipes/misc/addon_recycler.json | 8 ++ .../recipes/misc/addon_redstone_reactor.json | 8 ++ .../recipes/misc/addon_solar_panel.json | 8 ++ .../recipes/misc/upgrade_accuracy.json | 8 ++ .../recipes/misc/upgrade_efficiency.json | 8 ++ .../misc/upgrade_energy_multiplier.json | 8 ++ .../recipes/misc/upgrade_fire_rate.json | 8 ++ .../recipes/misc/upgrade_range.json | 8 ++ .../recipes/misc/upgrade_scatter_shot.json | 8 ++ .../recipe/addon_concealer.json | 8 ++ .../recipe/addon_damage_amp.json | 8 ++ .../recipe/addon_fake_drops.json | 8 ++ .../recipe/addon_recycler.json | 8 ++ .../recipe/addon_redstone_reactor.json | 8 ++ .../recipe/addon_solar_panel.json | 8 ++ .../recipe/upgrade_accuracy.json | 8 ++ .../recipe/upgrade_efficiency.json | 8 ++ .../recipe/upgrade_energy_multiplier.json | 8 ++ .../recipe/upgrade_fire_rate.json | 8 ++ .../recipe/upgrade_range.json | 8 ++ .../recipe/upgrade_scatter_shot.json | 8 ++ .../recipes/misc/addon_concealer.json | 8 ++ .../recipes/misc/addon_damage_amp.json | 8 ++ .../recipes/misc/addon_fake_drops.json | 8 ++ .../recipes/misc/addon_recycler.json | 8 ++ .../recipes/misc/addon_redstone_reactor.json | 8 ++ .../recipes/misc/addon_solar_panel.json | 8 ++ .../recipes/misc/upgrade_accuracy.json | 8 ++ .../recipes/misc/upgrade_efficiency.json | 8 ++ .../misc/upgrade_energy_multiplier.json | 8 ++ .../recipes/misc/upgrade_fire_rate.json | 8 ++ .../recipes/misc/upgrade_range.json | 8 ++ .../recipes/misc/upgrade_scatter_shot.json | 8 ++ .../recipe/addon_concealer.json | 8 ++ .../recipe/addon_damage_amp.json | 8 ++ .../recipe/addon_fake_drops.json | 8 ++ .../recipe/addon_recycler.json | 8 ++ .../recipe/addon_redstone_reactor.json | 8 ++ .../recipe/addon_solar_panel.json | 8 ++ .../recipe/upgrade_accuracy.json | 8 ++ .../recipe/upgrade_efficiency.json | 8 ++ .../recipe/upgrade_energy_multiplier.json | 8 ++ .../recipe/upgrade_fire_rate.json | 8 ++ .../recipe/upgrade_range.json | 8 ++ .../recipe/upgrade_scatter_shot.json | 8 ++ 107 files changed, 1356 insertions(+), 14 deletions(-) create mode 100644 src/client/java/omtteam/openmodularturrets/client/mixin/GuiGraphicsMixin.java create mode 100644 src/client/java/omtteam/openmodularturrets/client/render/DisabledModuleOverlay.java create mode 100644 src/gametest/java/omtteam/openmodularturrets/gametest/ModuleToggleGameTests.java create mode 100644 src/main/java/omtteam/openmodularturrets/compat/ModuleEnabledCondition.java create mode 100644 src/main/java/omtteam/openmodularturrets/item/ModuleToggles.java create mode 100644 src/main/java/omtteam/openmodularturrets/platform/fabric/FabricModuleEnabledCondition.java create mode 100644 src/main/java/omtteam/openmodularturrets/platform/forge/ForgeModuleEnabledCondition.java create mode 100644 src/main/java/omtteam/openmodularturrets/platform/neoforge/NeoForgeModuleEnabledCondition.java diff --git a/CHANGELOG.md b/CHANGELOG.md index b2efce2ad..5909bffa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Before a release, `./gradlew releaseChangelog` turns *Unreleased* into the relea ## [Unreleased] +### Added + +- Config sections `upgrades` and `addons` switch each upgrade and addon off: it loses its recipe and does nothing in a machine, which shows it with a red slot frame, a "no" symbol over the icon and a red tooltip line + ## [4.0.0] - 2026-11-03 ### Added diff --git a/CLAUDE.md b/CLAUDE.md index bf98b402e..a84daef1f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -628,6 +628,11 @@ The built-in turrets use the same path, so there is no special casing per turret - **Upgrades are per machine:** `core.item.UpgradeType` is the common interface, each machine has its own enum (`TurretBaseUpgradeType`, `GeneratorUpgradeType`) and item subclass of `item.UpgradeItem` (`TurretBaseUpgradeItem`, `GeneratorUpgradeItem`). A machine's upgrade slots accept only its own subclass. A new machine gets its own enum and item subclass. +- **Upgrade and addon switches** (requested by the user on 2026-10-29, branch `1.20.1+-module-toggles`, for a later release): the config sections `upgrades` and `addons` have one boolean per upgrade (both machines) and addon item (`ConfigData.Upgrades` / `Addons`, `isEnabled`; `item.ModuleToggles` for stacks and item ids). + A disabled one stays in its slot but counts as not installed (`TurretBaseLogic.getUpgradeCount` / `getAddonCount` through `LogicSettings.upgradeEnabled` / `addonEnabled`, `GeneratorBlockEntity.getMultiplierUpgrades`), and its recipe and unlock advancement do not load: the resource condition `openmodularturrets:module_enabled` (`compat.ModuleEnabledCondition`, `"items"`: item id paths; registered per loader like OpenModularLighting's `block_enabled`: `FabricModuleEnabledCondition`, `NeoForgeModuleEnabledCondition`, `ForgeModuleEnabledCondition`), added by datagen to every upgrade and addon recipe. + Recipes follow the config only when data loads (restart). + The client shows it with the synced config (`client.render.DisabledModuleOverlay`): a red frame and tint behind the machine slots holding one (base and generator `renderBg`), vanilla's barrier sprite over the icon in every GUI (Fabric: client mixin `GuiGraphicsMixin` at the end of `renderItemDecorations`; NeoForge and Forge: `RegisterItemDecorationsEvent`), and a red first tooltip line (`ModuleTooltip`, `tooltip.openmodularturrets.module_disabled`). + Game tests: `ModuleToggleGameTests`. - **Config versions:** `configVersion` in the config file; `ConfigMigration` (OMLib) runs the `ConfigMigrationSteps.STEPS` newer than the file, replacing old default values (only if unchanged) when a file of an older version is loaded. Bump `CURRENT_VERSION` and add a step when a default changes. @@ -766,7 +771,7 @@ Update this checklist as work progresses. - [x] Item transfer: turret base ammo slots and generator fuel slots through `ItemAccess` (`getItemAccess(side)`); Fabric lookups via `FabricItemStorages`; hopper game tests (`ItemTransferGameTests`); the NeoForge capabilities come with the registration step - [x] Use `LoaderInfo` (config folder in `OMTConfig`) and `Fuel` (generator: `isFuel(stack)`, burn time, stack-aware remainder) instead of `FabricLoader` / `FuelRegistry`; game test for the lava bucket remainder (the plugin entrypoints in `TurretRegistry` / `TurretModels` stay for "Turret API plugin discovery") - [x] Registration: `OMTStartup.init(plugins)` + `OMTStartup.registrationSteps()` (sounds, blocks, items, block entities, entity types, creative tab, menus), NeoForge per `RegisterEvent` with the common-setup check; capabilities (items, energy); shared handlers `InteractiveBlock.handleUse`, `ConfigSync.onPlayerJoin`, `KillCounter.onDeath` (NeoForge `LivingDeathEvent` at lowest priority); `VersionCompat.creativeTabBuilder()` / `fakePlayer()`; plain `c:` tags; `RayShotCallback` as a plain listener list; Fabric render data behind `CompatBlockEntity.renderData()`; `ModSounds` registers in `init()` (the turret definitions use the sounds earlier). - OMT has no recipe conditions. + OMT had no recipe conditions until the upgrade and addon switches (see "Power & items"). NeoForge now compiles all of `main` except `datagen` (Fabric-only by design). - [x] Mixins on NeoForge: the same `openmodularturrets.mixins.json` under `[[mixins]]` in `neoforge.mods.toml`; both `LivingEntityMixin` injection points exist in NeoForge's patched `LivingEntity` (checked once with `mixin.debug.export` on the NeoForge game test server) - [x] Client: `OMTClient` lists the content (screens, model layers, block entity and entity renderers, item renderers via `ItemStackRenderer`, cutout blocks, tooltips, disconnect); `OMTFabricClient` / `OMTNeoForgeClient` register it and wire ticks, disconnect and the ray rendering; fence models carry `"render_type": "minecraft:cutout"`; camo models `FabricCamoModel` (Renderer API) / `NeoForgeCamoModel` (`ModelData` + forwarding colour provider), `CompatBlockEntity.remesh()` refreshes the model data. diff --git a/docs/architecture.md b/docs/architecture.md index 48119a5a6..49e9bdb50 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -214,6 +214,8 @@ The full list is in [turret-api.md](turret-api.md); a game test per turret belon Upgrades belong to one machine. Add a constant to the machine's enum (`core.item.TurretBaseUpgradeType` or `GeneratorUpgradeType`), register the item in `ModItems` with the matching item class (`TurretBaseUpgradeItem`, `GeneratorUpgradeItem`), and implement the effect in the machine's logic. A new machine gets its own enum and item subclass of `UpgradeItem`; its slots accept only those. +Give it a switch in `ConfigData.Upgrades` (field and `isEnabled` case): a disabled upgrade counts as not installed (`TurretBaseLogic.getUpgradeCount` asks `LogicSettings.upgradeEnabled`; another machine asks `item.ModuleToggles`), and its recipe needs the `module_enabled` condition (`OMTRecipeProvider` adds it to the upgrades and addons). +The client marks disabled ones by itself (`client.render.DisabledModuleOverlay`). ### A config value diff --git a/src/client/java/omtteam/openmodularturrets/client/mixin/GuiGraphicsMixin.java b/src/client/java/omtteam/openmodularturrets/client/mixin/GuiGraphicsMixin.java new file mode 100644 index 000000000..816e95fbb --- /dev/null +++ b/src/client/java/omtteam/openmodularturrets/client/mixin/GuiGraphicsMixin.java @@ -0,0 +1,25 @@ +package omtteam.openmodularturrets.client.mixin; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.item.ItemStack; +import omtteam.openmodularturrets.client.render.DisabledModuleOverlay; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Fabric only (the client mixin config is listed in {@code fabric.mod.json} alone): draws the "no" symbol over disabled + * upgrades and addons after the item decorations, as NeoForge's and Forge's item decorators do there. + */ +@Mixin(GuiGraphics.class) +public abstract class GuiGraphicsMixin { + @Inject(method = "renderItemDecorations(Lnet/minecraft/client/gui/Font;Lnet/minecraft/world/item/ItemStack;IILjava/lang/String;)V", + at = @At("TAIL")) + private void openmodularturrets$disabledModule(Font font, ItemStack stack, int x, int y, @Nullable String text, + CallbackInfo ci) { + DisabledModuleOverlay.renderItemOverlay((GuiGraphics) (Object) this, stack, x, y); + } +} diff --git a/src/client/java/omtteam/openmodularturrets/client/platform/forge/OMTForgeClient.java b/src/client/java/omtteam/openmodularturrets/client/platform/forge/OMTForgeClient.java index 5381d3125..99c7a419a 100644 --- a/src/client/java/omtteam/openmodularturrets/client/platform/forge/OMTForgeClient.java +++ b/src/client/java/omtteam/openmodularturrets/client/platform/forge/OMTForgeClient.java @@ -5,6 +5,7 @@ import net.minecraftforge.client.event.ClientPlayerNetworkEvent; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterColorHandlersEvent; +import net.minecraftforge.client.event.RegisterItemDecorationsEvent; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; @@ -14,6 +15,7 @@ import omtteam.openmodularturrets.client.OMTClient; import omtteam.openmodularturrets.client.api.OMTClientPlugin; import omtteam.openmodularturrets.client.model.TurretModels; +import omtteam.openmodularturrets.client.render.DisabledModuleOverlay; import omtteam.openmodularturrets.client.render.effect.RayRenderer; import omtteam.openmodularturrets.client.render.outline.TurretPlacementOutline; import omtteam.omlib.platform.Platform; @@ -40,6 +42,11 @@ public OMTForgeClient(IEventBus modBus) { OMTClient.registerBlockEntityRenderers(event::registerBlockEntityRenderer); OMTClient.registerEntityRenderers(event::registerEntityRenderer); }); + modBus.addListener((RegisterItemDecorationsEvent event) -> DisabledModuleOverlay.moduleItems().forEach(item -> + event.register(item, (graphics, font, stack, x, y) -> { + DisabledModuleOverlay.renderItemOverlay(graphics, stack, x, y); + return false; + }))); modBus.addListener((RegisterColorHandlersEvent.Block event) -> event.register(ForgeCamoModel::color, OMTClient.camoBlocks())); MinecraftForge.EVENT_BUS.addListener((ItemTooltipEvent event) -> diff --git a/src/client/java/omtteam/openmodularturrets/client/platform/neoforge/OMTNeoForgeClient.java b/src/client/java/omtteam/openmodularturrets/client/platform/neoforge/OMTNeoForgeClient.java index 5eb5e11e5..5350c0203 100644 --- a/src/client/java/omtteam/openmodularturrets/client/platform/neoforge/OMTNeoForgeClient.java +++ b/src/client/java/omtteam/openmodularturrets/client/platform/neoforge/OMTNeoForgeClient.java @@ -8,6 +8,7 @@ import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; +import net.neoforged.neoforge.client.event.RegisterItemDecorationsEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; //? if >=1.21.11 { @@ -22,6 +23,7 @@ import omtteam.openmodularturrets.client.OMTClient; import omtteam.openmodularturrets.client.api.OMTClientPlugin; import omtteam.openmodularturrets.client.model.TurretModels; +import omtteam.openmodularturrets.client.render.DisabledModuleOverlay; import omtteam.openmodularturrets.client.render.effect.RayRenderer; import omtteam.openmodularturrets.client.render.outline.TurretPlacementOutline; import omtteam.omlib.platform.Platform; @@ -54,6 +56,11 @@ public OMTNeoForgeClient(IEventBus modBus) { modBus.addListener((RegisterClientExtensionsEvent event) -> OMTClient.registerItemRenderers((item, renderer) -> event.registerItem(NeoForgeItemRenderer.extensions(renderer), item))); //?} + modBus.addListener((RegisterItemDecorationsEvent event) -> DisabledModuleOverlay.moduleItems().forEach(item -> + event.register(item, (graphics, font, stack, x, y) -> { + DisabledModuleOverlay.renderItemOverlay(graphics, stack, x, y); + return false; + }))); modBus.addListener((RegisterColorHandlersEvent.Block event) -> event.register(NeoForgeCamoModel::color, OMTClient.camoBlocks())); NeoForge.EVENT_BUS.addListener((ItemTooltipEvent event) -> diff --git a/src/client/java/omtteam/openmodularturrets/client/render/DisabledModuleOverlay.java b/src/client/java/omtteam/openmodularturrets/client/render/DisabledModuleOverlay.java new file mode 100644 index 000000000..735ff2fe8 --- /dev/null +++ b/src/client/java/omtteam/openmodularturrets/client/render/DisabledModuleOverlay.java @@ -0,0 +1,77 @@ +package omtteam.openmodularturrets.client.render; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import omtteam.omlib.compat.VersionCompat; +import omtteam.openmodularturrets.item.AddonItem; +import omtteam.openmodularturrets.item.ModuleToggles; +import omtteam.openmodularturrets.item.UpgradeItem; + +import java.util.ArrayList; +import java.util.List; +//? if >=1.21.11 { +/*import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.data.AtlasIds; +*///?} else { +import net.minecraft.client.renderer.texture.TextureAtlas; +//?} + +/** + * Marks upgrades and addons that are disabled in the config ({@link ModuleToggles}): a red frame around their slot in + * the machine GUIs, and vanilla's barrier sprite (a red "no" symbol) over their icon wherever an item is drawn in a GUI. + * The icon overlay runs after the item decorations: a client mixin on Fabric, an item decorator on NeoForge and Forge. + */ +public final class DisabledModuleOverlay { + private static final ResourceLocation SYMBOL = VersionCompat.id("minecraft", "item/barrier"); + private static final int FRAME_COLOR = 0xFFE01010; + private static final int TINT_COLOR = 0x50FF0000; + + private DisabledModuleOverlay() { + } + + /** Every upgrade and addon item, for the loaders' item decorator registration. */ + public static List moduleItems() { + List items = new ArrayList<>(); + for (Item item : BuiltInRegistries.ITEM) { + if (item instanceof UpgradeItem || item instanceof AddonItem) items.add(item); + } + return items; + } + + /** + * A red frame and tint behind every machine slot (not the player's inventory) that holds a disabled upgrade or + * addon; call it from {@code renderBg}, after the background, so the item is drawn over it. + */ + public static void renderSlotFrames(GuiGraphics graphics, AbstractContainerMenu menu, int left, int top) { + for (Slot slot : menu.slots) { + if (slot.container instanceof Inventory || !slot.isActive() || !ModuleToggles.isDisabled(slot.getItem())) { + continue; + } + int x = left + slot.x; + int y = top + slot.y; + graphics.fill(x, y, x + 16, y + 16, TINT_COLOR); + graphics.renderOutline(x - 1, y - 1, 18, 18, FRAME_COLOR); + } + } + + /** The "no" symbol over the icon of a disabled upgrade or addon at {@code x, y}; nothing for other stacks. */ + public static void renderItemOverlay(GuiGraphics graphics, ItemStack stack, int x, int y) { + if (!ModuleToggles.isDisabled(stack)) return; + //? if >=1.21.11 { + /*TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().getAtlasOrThrow(AtlasIds.ITEMS).getSprite(SYMBOL); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, sprite, x, y, 16, 16); + *///?} else { + TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(SYMBOL); + // above the item (drawn around z 150), like the stack count + graphics.blit(x, y, 200, 16, 16, sprite); + //?} + } +} diff --git a/src/client/java/omtteam/openmodularturrets/client/screen/GeneratorScreen.java b/src/client/java/omtteam/openmodularturrets/client/screen/GeneratorScreen.java index 158a3403a..79045e876 100644 --- a/src/client/java/omtteam/openmodularturrets/client/screen/GeneratorScreen.java +++ b/src/client/java/omtteam/openmodularturrets/client/screen/GeneratorScreen.java @@ -6,6 +6,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import omtteam.openmodularturrets.OMT; +import omtteam.openmodularturrets.client.render.DisabledModuleOverlay; import omtteam.omlib.client.compat.ClientCompat; import omtteam.openmodularturrets.menu.GeneratorMenu; @@ -59,5 +60,6 @@ protected void renderBg(GuiGraphics graphics, float partialTick, int mouseX, int long capacity = menu.getCapacity(); int filled = (int) (menu.getEnergy() * ENERGY_HEIGHT / (capacity == 0 ? 1 : capacity)); ClientCompat.blit(graphics, TEXTURE, leftPos + 153, topPos + 17 + ENERGY_HEIGHT - filled, 196, 68 - filled, 14, filled); + DisabledModuleOverlay.renderSlotFrames(graphics, menu, leftPos, topPos); } } diff --git a/src/client/java/omtteam/openmodularturrets/client/screen/TurretBaseScreen.java b/src/client/java/omtteam/openmodularturrets/client/screen/TurretBaseScreen.java index 490444e03..1bc49512b 100644 --- a/src/client/java/omtteam/openmodularturrets/client/screen/TurretBaseScreen.java +++ b/src/client/java/omtteam/openmodularturrets/client/screen/TurretBaseScreen.java @@ -10,6 +10,7 @@ import net.minecraft.world.entity.player.Inventory; import omtteam.openmodularturrets.OMT; import omtteam.openmodularturrets.blockentity.TurretBaseBlockEntity; +import omtteam.openmodularturrets.client.render.DisabledModuleOverlay; import omtteam.omlib.client.compat.ClientCompat; import omtteam.omlib.client.compat.ClientNetworkCompat; import omtteam.openmodularturrets.core.base.TargetingSettings; @@ -161,6 +162,7 @@ protected void renderBg(GuiGraphics graphics, float partialTick, int mouseX, int ClientCompat.blit(graphics, texture, leftPos + 153, topPos + 17, 178, 17, 14, 51); int u = ENERGY_FILL_U[random.nextInt(ENERGY_FILL_U.length)]; ClientCompat.blit(graphics, texture, leftPos + 153, topPos + 17 + 51 - filled, u, 68 - filled, 14, filled); + DisabledModuleOverlay.renderSlotFrames(graphics, menu, leftPos, topPos); } @Override diff --git a/src/client/java/omtteam/openmodularturrets/client/tooltip/ModuleTooltip.java b/src/client/java/omtteam/openmodularturrets/client/tooltip/ModuleTooltip.java index 24759eeaa..2810247ae 100644 --- a/src/client/java/omtteam/openmodularturrets/client/tooltip/ModuleTooltip.java +++ b/src/client/java/omtteam/openmodularturrets/client/tooltip/ModuleTooltip.java @@ -9,6 +9,7 @@ import omtteam.openmodularturrets.config.OMTConfig; import omtteam.openmodularturrets.item.AddonItem; import omtteam.openmodularturrets.item.GeneratorUpgradeItem; +import omtteam.openmodularturrets.item.ModuleToggles; import omtteam.openmodularturrets.item.TurretBaseUpgradeItem; import omtteam.openmodularturrets.item.UpgradeItem; @@ -29,6 +30,10 @@ public static void append(ItemStack stack, TooltipFlag flag, List lin boolean upgrade = stack.getItem() instanceof UpgradeItem; boolean addon = stack.getItem() instanceof AddonItem; if (!upgrade && !addon) return; + // switched off in the (server's) config: the item stays, but does nothing + if (ModuleToggles.isDisabled(stack)) { + lines.add(translated("module_disabled").withStyle(ChatFormatting.RED)); + } // which machine an upgrade fits into, also without shift (each machine has its own upgrades) if (stack.getItem() instanceof TurretBaseUpgradeItem) { lines.add(text("upgrade.machine.turret_base")); diff --git a/src/gametest/java/omtteam/openmodularturrets/gametest/ModuleToggleGameTests.java b/src/gametest/java/omtteam/openmodularturrets/gametest/ModuleToggleGameTests.java new file mode 100644 index 000000000..441de88da --- /dev/null +++ b/src/gametest/java/omtteam/openmodularturrets/gametest/ModuleToggleGameTests.java @@ -0,0 +1,136 @@ +package omtteam.openmodularturrets.gametest; + +//? if neoforge && <1.21.11 { +/*import net.neoforged.neoforge.gametest.GameTestHolder; +import net.neoforged.neoforge.gametest.PrefixGameTestTemplate; +*///?} +//? if forge { +/*import net.minecraftforge.gametest.GameTestHolder; +import net.minecraftforge.gametest.PrefixGameTestTemplate; +*///?} +import net.minecraft.core.BlockPos; +//? if <1.21.11 { +import net.minecraft.gametest.framework.GameTest; +//?} +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.Blocks; +//? if >=1.21.11 { +/*import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +*///?} +import omtteam.openmodularturrets.OMT; +import omtteam.openmodularturrets.blockentity.TurretBaseBlockEntity; +import omtteam.openmodularturrets.blockentity.misc.GeneratorBlockEntity; +import omtteam.openmodularturrets.compat.ModuleEnabledCondition; +import omtteam.openmodularturrets.config.ConfigData; +import omtteam.openmodularturrets.config.OMTConfig; +import omtteam.openmodularturrets.core.item.AddonType; +import omtteam.openmodularturrets.core.item.TurretBaseUpgradeType; +import omtteam.openmodularturrets.inventory.TurretBaseInventory; +import omtteam.openmodularturrets.item.ModuleToggles; +import omtteam.openmodularturrets.registry.ModBlocks; +import omtteam.openmodularturrets.registry.ModItems; + +import java.util.List; + +/** + * The config switches of upgrades and addons: their recipes load with the default config (the + * {@code module_enabled} condition is registered and passes), the condition follows the config, and a disabled upgrade + * or addon stays in its slot but does nothing in a turret base or generator. The config is changed and restored inside + * one test call, so no other test sees it. + */ +//? if (neoforge && <1.21.11) || forge { +/*@GameTestHolder(OMT.MOD_ID) +@PrefixGameTestTemplate(false) +*///?} +@SuppressWarnings({"unused", "RedundantCast"}) +public class ModuleToggleGameTests implements OMTGameTests { + /** Every upgrade and addon with a recipe (the creative upgrade has none). */ + private static final List RECIPES = List.of("upgrade_accuracy", "upgrade_efficiency", "upgrade_fire_rate", + "upgrade_range", "upgrade_scatter_shot", "upgrade_energy_multiplier", "addon_concealer", "addon_damage_amp", + "addon_recycler", "addon_redstone_reactor", "addon_solar_panel", "addon_fake_drops"); + private static final BlockPos BASE = new BlockPos(1, 1, 1); + private static final BlockPos GENERATOR = new BlockPos(3, 1, 1); + + @GameTest(template = EMPTY_STRUCTURE) + public void moduleRecipesLoadWithTheDefaultConfig(GameTestHelper helper) { + RecipeManager recipes = helper.getLevel().getServer().getRecipeManager(); + for (String recipe : RECIPES) { + //? if >=1.21.11 { + /*boolean loaded = recipes.byKey(ResourceKey.create(Registries.RECIPE, OMT.id(recipe))).isPresent(); + *///?} else { + boolean loaded = recipes.byKey(OMT.id(recipe)).isPresent(); + //?} + helper.assertTrue(loaded, "recipe " + recipe + " loaded"); + } + helper.succeed(); + } + + @GameTest(template = EMPTY_STRUCTURE) + public void conditionFollowsTheConfig(GameTestHelper helper) { + ConfigData config = OMTConfig.get(); + boolean range = config.upgrades.range; + boolean multiplier = config.upgrades.energyMultiplier; + boolean amp = config.addons.damageAmp; + try { + for (String recipe : RECIPES) { + helper.assertTrue(ModuleEnabledCondition.anyEnabled(List.of(recipe)), recipe + " enabled by default"); + } + config.upgrades.range = false; + config.upgrades.energyMultiplier = false; + config.addons.damageAmp = false; + helper.assertFalse(ModuleEnabledCondition.anyEnabled(List.of("upgrade_range")), "range upgrade disabled"); + helper.assertFalse(ModuleEnabledCondition.anyEnabled(List.of("upgrade_energy_multiplier")), + "generator upgrade disabled"); + helper.assertFalse(ModuleEnabledCondition.anyEnabled(List.of("addon_damage_amp")), "damage amp disabled"); + helper.assertTrue(ModuleEnabledCondition.anyEnabled(List.of("upgrade_accuracy")), "the others stay enabled"); + helper.assertTrue(ModuleToggles.isDisabled(new ItemStack(ModItems.UPGRADE_RANGE)), "the stack is disabled"); + helper.assertFalse(ModuleToggles.isDisabled(new ItemStack(ModItems.UPGRADE_ACCURACY)), "the stack is enabled"); + } finally { + config.upgrades.range = range; + config.upgrades.energyMultiplier = multiplier; + config.addons.damageAmp = amp; + } + helper.succeed(); + } + + @GameTest(template = EMPTY_STRUCTURE, batch = "module_toggles_machines") + public void disabledModulesDoNothingInMachines(GameTestHelper helper) { + helper.setBlock(BASE, ModBlocks.TURRET_BASES.get(4)); + TurretBaseBlockEntity base = (TurretBaseBlockEntity) helper.getLevel().getBlockEntity(helper.absolutePos(BASE)); + base.getInventory().setItem(TurretBaseInventory.UPGRADE_START, new ItemStack(ModItems.UPGRADE_RANGE, 2)); + base.getInventory().setItem(TurretBaseInventory.ADDON_START, new ItemStack(ModItems.ADDON_DAMAGE_AMP, 3)); + helper.setBlock(GENERATOR, ModBlocks.GENERATOR); + GeneratorBlockEntity generator = (GeneratorBlockEntity) helper.getLevel().getBlockEntity(helper.absolutePos(GENERATOR)); + generator.getUpgradeContainer().setItem(0, new ItemStack(ModItems.UPGRADE_ENERGY_MULTIPLIER, 2)); + ConfigData config = OMTConfig.get(); + boolean range = config.upgrades.range; + boolean multiplier = config.upgrades.energyMultiplier; + boolean amp = config.addons.damageAmp; + try { + helper.assertTrue(base.getLogic().getUpgradeCount(TurretBaseUpgradeType.RANGE) == 2, "range upgrades count"); + helper.assertTrue(base.getLogic().getAddonCount(AddonType.DAMAGE_AMP) == 3, "damage amps count"); + helper.assertTrue(generator.getMultiplierUpgrades() == 2, "multiplier upgrades count"); + config.upgrades.range = false; + config.upgrades.energyMultiplier = false; + config.addons.damageAmp = false; + helper.assertTrue(base.getLogic().getUpgradeCount(TurretBaseUpgradeType.RANGE) == 0, + "a disabled range upgrade still counts"); + helper.assertTrue(base.getLogic().getAddonCount(AddonType.DAMAGE_AMP) == 0, "a disabled damage amp still counts"); + helper.assertTrue(generator.getMultiplierUpgrades() == 0, "a disabled multiplier upgrade still counts"); + helper.assertTrue(base.getInventory().getItem(TurretBaseInventory.UPGRADE_START).getCount() == 2, + "the disabled upgrades stay in their slot"); + } finally { + config.upgrades.range = range; + config.upgrades.energyMultiplier = multiplier; + config.addons.damageAmp = amp; + } + base.getInventory().clearContent(); + generator.getUpgradeContainer().clearContent(); + helper.setBlock(BASE, Blocks.AIR); + helper.setBlock(GENERATOR, Blocks.AIR); + helper.succeed(); + } +} diff --git a/src/gametest/resources/fabric.mod.json b/src/gametest/resources/fabric.mod.json index 1fdb393fd..2b42aa61b 100644 --- a/src/gametest/resources/fabric.mod.json +++ b/src/gametest/resources/fabric.mod.json @@ -14,6 +14,7 @@ "omtteam.openmodularturrets.gametest.ProjectileTurretGameTests", "omtteam.openmodularturrets.gametest.ApiTurretGameTests", "omtteam.openmodularturrets.gametest.GeneratorGameTests", + "omtteam.openmodularturrets.gametest.ModuleToggleGameTests", "omtteam.openmodularturrets.gametest.BaseGuiGameTests", "omtteam.openmodularturrets.gametest.ItemTransferGameTests", "omtteam.openmodularturrets.gametest.CamoGameTests", diff --git a/src/main/java/omtteam/openmodularturrets/blockentity/misc/GeneratorBlockEntity.java b/src/main/java/omtteam/openmodularturrets/blockentity/misc/GeneratorBlockEntity.java index 8852babc0..04abc3be2 100644 --- a/src/main/java/omtteam/openmodularturrets/blockentity/misc/GeneratorBlockEntity.java +++ b/src/main/java/omtteam/openmodularturrets/blockentity/misc/GeneratorBlockEntity.java @@ -29,6 +29,7 @@ import omtteam.omlib.inventory.ItemAccess; import omtteam.openmodularturrets.inventory.FuelContainer; import omtteam.openmodularturrets.item.GeneratorUpgradeItem; +import omtteam.openmodularturrets.item.ModuleToggles; import omtteam.omlib.platform.Platform; import omtteam.openmodularturrets.registry.ModBlockEntities; import org.jetbrains.annotations.Nullable; @@ -148,11 +149,12 @@ private void scanExpanders(Level level) { expanderTiers = List.copyOf(tiers); } - /** Number of energy multiplier upgrades in the upgrade slot. */ + /** Number of energy multiplier upgrades in the upgrade slot; 0 while the upgrade is disabled in the config. */ public int getMultiplierUpgrades() { ItemStack stack = upgrades.getItem(0); return stack.getItem() instanceof GeneratorUpgradeItem upgrade - && upgrade.getUpgradeType() == GeneratorUpgradeType.ENERGY_MULTIPLIER ? stack.getCount() : 0; + && upgrade.getUpgradeType() == GeneratorUpgradeType.ENERGY_MULTIPLIER + && ModuleToggles.isEnabled(upgrade.getUpgradeType()) ? stack.getCount() : 0; } /** Energy as exposed to automation on all sides (extract only). */ diff --git a/src/main/java/omtteam/openmodularturrets/compat/ModuleEnabledCondition.java b/src/main/java/omtteam/openmodularturrets/compat/ModuleEnabledCondition.java new file mode 100644 index 000000000..882e6851c --- /dev/null +++ b/src/main/java/omtteam/openmodularturrets/compat/ModuleEnabledCondition.java @@ -0,0 +1,26 @@ +package omtteam.openmodularturrets.compat; + +import net.minecraft.resources.ResourceLocation; +import omtteam.openmodularturrets.OMT; +import omtteam.openmodularturrets.item.ModuleToggles; + +import java.util.List; + +/** + * Resource condition {@code openmodularturrets:module_enabled}: the recipe of an upgrade or addon loads only if the + * upgrade or addon is enabled in the config ({@code upgrades.}, {@code addons.}). Each loader registers it + * with its own condition API ({@code platform/}), as OpenModularLighting's {@code block_enabled}. + */ +public final class ModuleEnabledCondition { + public static final ResourceLocation ID = OMT.id("module_enabled"); + /** JSON field with the registry paths of the upgrade and addon items. */ + public static final String ITEMS = "items"; + + private ModuleEnabledCondition() { + } + + /** Whether any of the items is enabled in the config in effect. */ + public static boolean anyEnabled(List items) { + return items.stream().anyMatch(ModuleToggles::isItemEnabled); + } +} diff --git a/src/main/java/omtteam/openmodularturrets/config/ConfigData.java b/src/main/java/omtteam/openmodularturrets/config/ConfigData.java index fa171ffd9..45fe24f87 100644 --- a/src/main/java/omtteam/openmodularturrets/config/ConfigData.java +++ b/src/main/java/omtteam/openmodularturrets/config/ConfigData.java @@ -11,6 +11,10 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import omtteam.openmodularturrets.OMT; +import omtteam.openmodularturrets.core.item.AddonType; +import omtteam.openmodularturrets.core.item.GeneratorUpgradeType; +import omtteam.openmodularturrets.core.item.TurretBaseUpgradeType; +import omtteam.openmodularturrets.core.item.UpgradeType; import omtteam.openmodularturrets.core.settings.TurretStats; import omtteam.openmodularturrets.core.turret.TurretType; @@ -42,6 +46,12 @@ public class ConfigData { public PassiveDefense passiveDefense = new PassiveDefense(); @Comment("Inventory expanders per tier.") public Expanders expanders = new Expanders(); + @Comment("Enable or disable upgrades. A disabled upgrade has no recipe (needs a restart) and does nothing in a " + + "machine; machines and tooltips mark it.") + public Upgrades upgrades = new Upgrades(); + @Comment("Enable or disable addons. A disabled addon has no recipe (needs a restart) and does nothing in a turret " + + "base; bases and tooltips mark it.") + public Addons addons = new Addons(); /** Clamps annotated ranges, then validates and parses the lists. */ void validate(ConfigValidator v) { @@ -398,4 +408,71 @@ public ExpanderSetting tier(int tier) { }; } } + + /** Switches of the upgrades of every machine (turret base and generator). */ + public static class Upgrades { + @Comment("Accuracy upgrade (turret base).") + public boolean accuracy = true; + @Comment("Efficiency upgrade (turret base).") + public boolean efficiency = true; + @Comment("Fire rate upgrade (turret base).") + public boolean fireRate = true; + @Comment("Range upgrade (turret base).") + public boolean range = true; + @Comment("Scattershot upgrade (turret base).") + public boolean scatterShot = true; + @Comment("Creative upgrade (turret base).") + public boolean creative = true; + @Comment("Energy multiplier upgrade (generator).") + public boolean energyMultiplier = true; + + /** Whether the upgrade works and can be crafted. */ + public boolean isEnabled(UpgradeType type) { + if (type instanceof TurretBaseUpgradeType upgrade) { + return switch (upgrade) { + case ACCURACY -> accuracy; + case EFFICIENCY -> efficiency; + case FIRE_RATE -> fireRate; + case RANGE -> range; + case SCATTERSHOT -> scatterShot; + case CREATIVE -> creative; + }; + } + if (type instanceof GeneratorUpgradeType upgrade) { + return switch (upgrade) { + case ENERGY_MULTIPLIER -> energyMultiplier; + }; + } + return true; + } + } + + /** Switches of the turret base addons (those with an item). */ + public static class Addons { + @Comment("Concealer addon.") + public boolean concealer = true; + @Comment("Damage amplifier addon.") + public boolean damageAmp = true; + @Comment("Recycler addon.") + public boolean recycler = true; + @Comment("Redstone reactor addon.") + public boolean redstoneReactor = true; + @Comment("Solar panel addon.") + public boolean solarPanel = true; + @Comment("Fake drops addon.") + public boolean fakeDrops = true; + + /** Whether the addon works and can be crafted; addons without an item have no switch. */ + public boolean isEnabled(AddonType type) { + return switch (type) { + case CONCEALER -> concealer; + case DAMAGE_AMP -> damageAmp; + case RECYCLER -> recycler; + case REDSTONE_REACTOR -> redstoneReactor; + case SOLAR_PANEL -> solarPanel; + case FAKE_DROPS -> fakeDrops; + case POTENTIA, SERIAL_PORT -> true; + }; + } + } } diff --git a/src/main/java/omtteam/openmodularturrets/config/ConfigLogicSettings.java b/src/main/java/omtteam/openmodularturrets/config/ConfigLogicSettings.java index 2bbda8763..437f2c2ee 100644 --- a/src/main/java/omtteam/openmodularturrets/config/ConfigLogicSettings.java +++ b/src/main/java/omtteam/openmodularturrets/config/ConfigLogicSettings.java @@ -1,6 +1,8 @@ package omtteam.openmodularturrets.config; import net.minecraft.resources.ResourceLocation; +import omtteam.openmodularturrets.core.item.AddonType; +import omtteam.openmodularturrets.core.item.TurretBaseUpgradeType; import omtteam.openmodularturrets.core.settings.BaseTierStats; import omtteam.openmodularturrets.core.settings.LogicSettings; import omtteam.openmodularturrets.core.settings.TurretStats; @@ -91,6 +93,16 @@ public int expanderStacks(int tier) { return OMTConfig.get().expanders.tier(tier).stacks; } + @Override + public boolean upgradeEnabled(TurretBaseUpgradeType type) { + return OMTConfig.get().upgrades.isEnabled(type); + } + + @Override + public boolean addonEnabled(AddonType type) { + return OMTConfig.get().addons.isEnabled(type); + } + @Override public int solarPanelGeneration() { return OMTConfig.get().miscellaneous.solarPanelAddonGen; diff --git a/src/main/java/omtteam/openmodularturrets/core/base/TurretBaseLogic.java b/src/main/java/omtteam/openmodularturrets/core/base/TurretBaseLogic.java index 3c61a47a0..ec5305bd3 100644 --- a/src/main/java/omtteam/openmodularturrets/core/base/TurretBaseLogic.java +++ b/src/main/java/omtteam/openmodularturrets/core/base/TurretBaseLogic.java @@ -336,8 +336,9 @@ private List usableAddonSlots() { return slots.subList(0, Math.min(slots.size(), BaseTier.addonSlots(tier))); } - /** Number of upgrade items of a type (stack sizes count). */ + /** Number of upgrade items of a type (stack sizes count); 0 if the type is disabled in the config. */ public int getUpgradeCount(TurretBaseUpgradeType type) { + if (!settings.upgradeEnabled(type)) return 0; int count = 0; for (ItemSlot slot : usableUpgradeSlots()) { if (slot.getUpgrade().filter(type::equals).isPresent()) count += slot.getCount(); @@ -345,8 +346,9 @@ public int getUpgradeCount(TurretBaseUpgradeType type) { return count; } - /** Number of addon items of a type (stack sizes count). */ + /** Number of addon items of a type (stack sizes count); 0 if the type is disabled in the config. */ public int getAddonCount(AddonType type) { + if (!settings.addonEnabled(type)) return 0; int count = 0; for (ItemSlot slot : usableAddonSlots()) { if (slot.getAddon().filter(type::equals).isPresent()) count += slot.getCount(); diff --git a/src/main/java/omtteam/openmodularturrets/core/settings/LogicSettings.java b/src/main/java/omtteam/openmodularturrets/core/settings/LogicSettings.java index 6be5af80c..965cc054c 100644 --- a/src/main/java/omtteam/openmodularturrets/core/settings/LogicSettings.java +++ b/src/main/java/omtteam/openmodularturrets/core/settings/LogicSettings.java @@ -1,5 +1,7 @@ package omtteam.openmodularturrets.core.settings; +import omtteam.openmodularturrets.core.item.AddonType; +import omtteam.openmodularturrets.core.item.TurretBaseUpgradeType; import omtteam.openmodularturrets.core.turret.TurretType; import java.util.Set; @@ -23,6 +25,12 @@ public interface LogicSettings { */ int expanderStacks(int tier); + /** {@code upgrades.}: a disabled upgrade does nothing (counts as not installed). */ + boolean upgradeEnabled(TurretBaseUpgradeType type); + + /** {@code addons.}: a disabled addon does nothing (counts as not installed). */ + boolean addonEnabled(AddonType type); + /** {@code miscellaneous.solarPanelAddonGen}. */ int solarPanelGeneration(); diff --git a/src/main/java/omtteam/openmodularturrets/datagen/OMTRecipeProvider.java b/src/main/java/omtteam/openmodularturrets/datagen/OMTRecipeProvider.java index 6b6bba841..3272ddc8d 100644 --- a/src/main/java/omtteam/openmodularturrets/datagen/OMTRecipeProvider.java +++ b/src/main/java/omtteam/openmodularturrets/datagen/OMTRecipeProvider.java @@ -2,6 +2,7 @@ import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.tags.ItemTags; @@ -11,7 +12,9 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import omtteam.omlib.compat.CommonTags; +import omtteam.openmodularturrets.compat.ModuleEnabledCondition; import omtteam.openmodularturrets.core.turret.TurretType; +import omtteam.openmodularturrets.platform.fabric.FabricModuleEnabledCondition; import omtteam.openmodularturrets.registry.ModItems; import java.util.List; @@ -30,7 +33,8 @@ /** * Crafting recipes, ported from the 1.12.2 {@code *_vanilla.json} recipes (ore dictionary entries become {@code c:} - * tags). The EnderIO/Mekanism variants are not ported. + * tags). The EnderIO/Mekanism variants are not ported. Upgrade and addon recipes carry a {@link ModuleEnabledCondition}: + * they load only while the upgrade or addon is enabled in the config. *

* The recipes themselves are in {@link Recipes}, the same on every version; only the way into it differs. */ @@ -107,6 +111,8 @@ private ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result, int private void generate() { Consumer save = builder -> builder.save(output); + Consumer saveModule = builder -> builder.save(withConditions(output, + FabricModuleEnabledCondition.of(BuiltInRegistries.ITEM.getKey(builder.getResult()).getPath()))); ammo(save); intermediates(save); tieredIntermediates(save); @@ -114,8 +120,8 @@ private void generate() { turrets(save); misc(save); passiveDefense(save); - upgrades(save); - addons(save); + upgrades(saveModule); + addons(saveModule); } /** 1.12.2 {@code intermediate_regular_0_vanilla.json}. */ diff --git a/src/main/java/omtteam/openmodularturrets/item/ModuleToggles.java b/src/main/java/omtteam/openmodularturrets/item/ModuleToggles.java new file mode 100644 index 000000000..2e98a7098 --- /dev/null +++ b/src/main/java/omtteam/openmodularturrets/item/ModuleToggles.java @@ -0,0 +1,58 @@ +package omtteam.openmodularturrets.item; + +import net.minecraft.world.item.ItemStack; +import omtteam.openmodularturrets.config.OMTConfig; +import omtteam.openmodularturrets.core.item.AddonType; +import omtteam.openmodularturrets.core.item.GeneratorUpgradeType; +import omtteam.openmodularturrets.core.item.TurretBaseUpgradeType; +import omtteam.openmodularturrets.core.item.UpgradeType; + +/** + * The config switches of the upgrades and addons ({@code upgrades.}, {@code addons.}), as the config in + * effect has them (the server's on a client). A disabled upgrade or addon has no recipe and does nothing in a machine; + * the client marks it. + */ +public final class ModuleToggles { + private static final String UPGRADE_PREFIX = "upgrade_"; + private static final String ADDON_PREFIX = "addon_"; + + private ModuleToggles() { + } + + public static boolean isEnabled(UpgradeType type) { + return OMTConfig.get().upgrades.isEnabled(type); + } + + public static boolean isEnabled(AddonType type) { + return OMTConfig.get().addons.isEnabled(type); + } + + /** Whether the stack is an upgrade or addon that is disabled in the config. */ + public static boolean isDisabled(ItemStack stack) { + if (stack.getItem() instanceof UpgradeItem upgrade) return !isEnabled(upgrade.getUpgradeType()); + if (stack.getItem() instanceof AddonItem addon) return !isEnabled(addon.getAddonType()); + return false; + } + + /** + * Whether the upgrade or addon with this item id path ({@code upgrade_}, {@code addon_}) is enabled; + * true for any other path. Used by the recipe condition, which runs before the items may be looked up. + */ + public static boolean isItemEnabled(String path) { + if (path.startsWith(UPGRADE_PREFIX)) { + String name = path.substring(UPGRADE_PREFIX.length()); + for (TurretBaseUpgradeType type : TurretBaseUpgradeType.values()) { + if (type.getSerializedName().equals(name)) return isEnabled(type); + } + for (GeneratorUpgradeType type : GeneratorUpgradeType.values()) { + if (type.getSerializedName().equals(name)) return isEnabled(type); + } + } else if (path.startsWith(ADDON_PREFIX)) { + String name = path.substring(ADDON_PREFIX.length()); + for (AddonType type : AddonType.values()) { + if (type.getSerializedName().equals(name)) return isEnabled(type); + } + } + return true; + } +} diff --git a/src/main/java/omtteam/openmodularturrets/platform/fabric/FabricModuleEnabledCondition.java b/src/main/java/omtteam/openmodularturrets/platform/fabric/FabricModuleEnabledCondition.java new file mode 100644 index 000000000..fdbdfeb9d --- /dev/null +++ b/src/main/java/omtteam/openmodularturrets/platform/fabric/FabricModuleEnabledCondition.java @@ -0,0 +1,107 @@ +package omtteam.openmodularturrets.platform.fabric; + +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions; +import net.minecraft.resources.ResourceLocation; +import omtteam.openmodularturrets.compat.ModuleEnabledCondition; +//? if >=1.21 { +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceCondition; +import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditionType; +import org.jetbrains.annotations.Nullable; +//?} else { +/*import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.fabricmc.fabric.api.resource.conditions.v1.ConditionJsonProvider; +import net.minecraft.util.GsonHelper; + +import java.util.ArrayList; +*///?} +//? if >=1.21.11 { +/*import net.minecraft.resources.RegistryOps.RegistryInfoLookup; +*///?} else if >=1.21 { +import net.minecraft.core.HolderLookup; +//?} + +import java.util.List; + +/** + * Fabric registration of {@link ModuleEnabledCondition} (resource conditions). The condition API differs between 1.20.1 + * ({@code ConditionJsonProvider}) and 1.21 ({@code ResourceCondition}, whose {@code test} takes a registry lookup + * since 1.21.2; the condition does not need it). + *

+ * Recipe JSON: {@code "fabric:load_conditions": [{"condition": "openmodularturrets:module_enabled", "items": [...]}]}. + */ +public final class FabricModuleEnabledCondition { + private static final ResourceLocation ID = ModuleEnabledCondition.ID; + private static final String ITEMS = ModuleEnabledCondition.ITEMS; + + private FabricModuleEnabledCondition() { + } + + //? if >=1.21 { + private record Condition(List items) implements ResourceCondition { + static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.STRING.listOf().fieldOf(ITEMS).forGetter(Condition::items)).apply(instance, Condition::new)); + static final ResourceConditionType TYPE = ResourceConditionType.create(ID, CODEC); + + @Override + public ResourceConditionType getType() { + return TYPE; + } + + //? if >=1.21.11 { + /*@Override + public boolean test(@Nullable RegistryInfoLookup registries) { + *///?} else { + @Override + public boolean test(@Nullable HolderLookup.Provider registries) { + //?} + return ModuleEnabledCondition.anyEnabled(items); + } + } + + /** Registers the condition type; called by the Fabric entrypoint. */ + public static void register() { + ResourceConditions.register(Condition.TYPE); + } + + /** The condition for datagen ({@code FabricRecipeProvider#withConditions}). */ + public static ResourceCondition of(String... items) { + return new Condition(List.of(items)); + } + //?} else { + /*/^* Registers the condition type; called by the Fabric entrypoint. ^/ + public static void register() { + ResourceConditions.register(ID, json -> { + JsonArray array = GsonHelper.getAsJsonArray(json, ITEMS); + List items = new ArrayList<>(); + for (JsonElement element : array) { + items.add(element.getAsString()); + } + return ModuleEnabledCondition.anyEnabled(items); + }); + } + + /^* The condition for datagen ({@code FabricRecipeProvider#withConditions}). ^/ + public static ConditionJsonProvider of(String... items) { + return new ConditionJsonProvider() { + @Override + public ResourceLocation getConditionId() { + return ID; + } + + @Override + public void writeParameters(JsonObject object) { + JsonArray array = new JsonArray(); + for (String item : items) { + array.add(item); + } + object.add(ITEMS, array); + } + }; + } + *///?} +} diff --git a/src/main/java/omtteam/openmodularturrets/platform/fabric/OMTFabric.java b/src/main/java/omtteam/openmodularturrets/platform/fabric/OMTFabric.java index 6b2b905c7..d2c62edff 100644 --- a/src/main/java/omtteam/openmodularturrets/platform/fabric/OMTFabric.java +++ b/src/main/java/omtteam/openmodularturrets/platform/fabric/OMTFabric.java @@ -22,6 +22,7 @@ public void onInitialize() { OMTStartup.init(plugins()); OMTStartup.registrationSteps().forEach(step -> step.register().run()); FabricBlockLookups.register(ModBlockEntities.transferTypes()); + FabricModuleEnabledCondition.register(); ServerLivingEntityEvents.AFTER_DEATH.register(KillCounter::onDeath); } diff --git a/src/main/java/omtteam/openmodularturrets/platform/forge/ForgeModuleEnabledCondition.java b/src/main/java/omtteam/openmodularturrets/platform/forge/ForgeModuleEnabledCondition.java new file mode 100644 index 000000000..dd188570f --- /dev/null +++ b/src/main/java/omtteam/openmodularturrets/platform/forge/ForgeModuleEnabledCondition.java @@ -0,0 +1,55 @@ +package omtteam.openmodularturrets.platform.forge; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.common.crafting.conditions.IConditionSerializer; +import omtteam.openmodularturrets.compat.ModuleEnabledCondition; + +import java.util.ArrayList; +import java.util.List; + +/** + * Forge registration of {@link ModuleEnabledCondition} ({@code ICondition}, its {@link #SERIALIZER} registered under + * {@link ModuleEnabledCondition#ID} with {@code CraftingHelper.register}). Forge 1.20.1 reads it on recipes and + * advancements. + *

+ * Recipe JSON: {@code "conditions": [{"type": "openmodularturrets:module_enabled", "items": [...]}]}. + */ +public record ForgeModuleEnabledCondition(List items) implements ICondition { + public static final IConditionSerializer SERIALIZER = new IConditionSerializer<>() { + @Override + public void write(JsonObject json, ForgeModuleEnabledCondition condition) { + JsonArray array = new JsonArray(); + condition.items().forEach(array::add); + json.add(ModuleEnabledCondition.ITEMS, array); + } + + @Override + public ForgeModuleEnabledCondition read(JsonObject json) { + List items = new ArrayList<>(); + for (JsonElement element : GsonHelper.getAsJsonArray(json, ModuleEnabledCondition.ITEMS)) { + items.add(element.getAsString()); + } + return new ForgeModuleEnabledCondition(items); + } + + @Override + public ResourceLocation getID() { + return ModuleEnabledCondition.ID; + } + }; + + @Override + public ResourceLocation getID() { + return ModuleEnabledCondition.ID; + } + + @Override + public boolean test(IContext context) { + return ModuleEnabledCondition.anyEnabled(items); + } +} diff --git a/src/main/java/omtteam/openmodularturrets/platform/forge/OMTForge.java b/src/main/java/omtteam/openmodularturrets/platform/forge/OMTForge.java index 115fe7892..05b685a06 100644 --- a/src/main/java/omtteam/openmodularturrets/platform/forge/OMTForge.java +++ b/src/main/java/omtteam/openmodularturrets/platform/forge/OMTForge.java @@ -1,7 +1,9 @@ package omtteam.openmodularturrets.platform.forge; +import net.minecraft.core.registries.Registries; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; @@ -61,6 +63,9 @@ private void onRegister(RegisterEvent event) { done.add(step); } } + if (event.getRegistryKey().equals(Registries.RECIPE_SERIALIZER)) { + CraftingHelper.register(ForgeModuleEnabledCondition.SERIALIZER); + } } /** A step whose registry fired no event would leave its content unregistered: fail loudly instead. */ diff --git a/src/main/java/omtteam/openmodularturrets/platform/neoforge/NeoForgeModuleEnabledCondition.java b/src/main/java/omtteam/openmodularturrets/platform/neoforge/NeoForgeModuleEnabledCondition.java new file mode 100644 index 000000000..5a9d3bca9 --- /dev/null +++ b/src/main/java/omtteam/openmodularturrets/platform/neoforge/NeoForgeModuleEnabledCondition.java @@ -0,0 +1,31 @@ +package omtteam.openmodularturrets.platform.neoforge; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.neoforged.neoforge.common.conditions.ICondition; +import omtteam.openmodularturrets.compat.ModuleEnabledCondition; + +import java.util.List; + +/** + * NeoForge registration of {@link ModuleEnabledCondition} ({@code ICondition}, registered under + * {@link ModuleEnabledCondition#ID} in {@code NeoForgeRegistries.CONDITION_SERIALIZERS}). + *

+ * Recipe JSON: {@code "neoforge:conditions": [{"type": "openmodularturrets:module_enabled", "items": [...]}]}. + */ +public record NeoForgeModuleEnabledCondition(List items) implements ICondition { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.STRING.listOf().fieldOf(ModuleEnabledCondition.ITEMS).forGetter(NeoForgeModuleEnabledCondition::items)) + .apply(instance, NeoForgeModuleEnabledCondition::new)); + + @Override + public boolean test(IContext context) { + return ModuleEnabledCondition.anyEnabled(items); + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/omtteam/openmodularturrets/platform/neoforge/OMTNeoForge.java b/src/main/java/omtteam/openmodularturrets/platform/neoforge/OMTNeoForge.java index 135748321..b45d32afa 100644 --- a/src/main/java/omtteam/openmodularturrets/platform/neoforge/OMTNeoForge.java +++ b/src/main/java/omtteam/openmodularturrets/platform/neoforge/OMTNeoForge.java @@ -11,9 +11,11 @@ import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforge.registries.RegisterEvent; import omtteam.openmodularturrets.OMT; import omtteam.openmodularturrets.api.OMTPlugin; +import omtteam.openmodularturrets.compat.ModuleEnabledCondition; import omtteam.openmodularturrets.entity.projectile.KillCounter; import omtteam.omlib.platform.Platform; import omtteam.omlib.registry.RegistrationStep; @@ -53,6 +55,8 @@ private void onRegister(RegisterEvent event) { done.add(step); } } + event.register(NeoForgeRegistries.Keys.CONDITION_CODECS, ModuleEnabledCondition.ID, + () -> NeoForgeModuleEnabledCondition.CODEC); } /** diff --git a/src/main/resources/assets/openmodularturrets/lang/de_de.json b/src/main/resources/assets/openmodularturrets/lang/de_de.json index 24ad76fc6..57cdf63a9 100644 --- a/src/main/resources/assets/openmodularturrets/lang/de_de.json +++ b/src/main/resources/assets/openmodularturrets/lang/de_de.json @@ -271,5 +271,6 @@ "tooltip.openmodularturrets.generator_upgrade_slot": "Upgrades für den Generator.", "tooltip.openmodularturrets.ownership_wand.desc4": "Solange gehalten: Geschützschüsse wirken nicht auf dich", "tooltip.openmodularturrets.upgrade.machine.turret_base": "Passt in: Turmbasis", - "tooltip.openmodularturrets.upgrade.machine.generator": "Passt in: Generator" + "tooltip.openmodularturrets.upgrade.machine.generator": "Passt in: Generator", + "tooltip.openmodularturrets.module_disabled": "In der Konfiguration deaktiviert: ohne Wirkung" } diff --git a/src/main/resources/assets/openmodularturrets/lang/en_gb.json b/src/main/resources/assets/openmodularturrets/lang/en_gb.json index 726b66b2b..f05dc740e 100644 --- a/src/main/resources/assets/openmodularturrets/lang/en_gb.json +++ b/src/main/resources/assets/openmodularturrets/lang/en_gb.json @@ -271,5 +271,6 @@ "tooltip.openmodularturrets.generator_upgrade_slot": "Upgrades for the generator.", "tooltip.openmodularturrets.ownership_wand.desc4": "While held: turret shots do not affect you", "tooltip.openmodularturrets.upgrade.machine.turret_base": "Fits into: Turret Base", - "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator" + "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator", + "tooltip.openmodularturrets.module_disabled": "Disabled in the config: does nothing" } diff --git a/src/main/resources/assets/openmodularturrets/lang/en_us.json b/src/main/resources/assets/openmodularturrets/lang/en_us.json index 20102bf45..d3bbaf417 100644 --- a/src/main/resources/assets/openmodularturrets/lang/en_us.json +++ b/src/main/resources/assets/openmodularturrets/lang/en_us.json @@ -271,5 +271,6 @@ "tooltip.openmodularturrets.generator_upgrade_slot": "Upgrades for the generator.", "tooltip.openmodularturrets.ownership_wand.desc4": "While held: turret shots do not affect you", "tooltip.openmodularturrets.upgrade.machine.turret_base": "Fits into: Turret Base", - "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator" + "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator", + "tooltip.openmodularturrets.module_disabled": "Disabled in the config: does nothing" } diff --git a/src/main/resources/assets/openmodularturrets/lang/pt_br.json b/src/main/resources/assets/openmodularturrets/lang/pt_br.json index 9eaab1674..ca1992085 100644 --- a/src/main/resources/assets/openmodularturrets/lang/pt_br.json +++ b/src/main/resources/assets/openmodularturrets/lang/pt_br.json @@ -271,5 +271,6 @@ "tooltip.openmodularturrets.generator_upgrade_slot": "Upgrades for the generator.", "tooltip.openmodularturrets.ownership_wand.desc4": "Enquanto segurada: tiros de torretas não te afetam", "tooltip.openmodularturrets.upgrade.machine.turret_base": "Fits into: Turret Base", - "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator" + "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator", + "tooltip.openmodularturrets.module_disabled": "Disabled in the config: does nothing" } diff --git a/src/main/resources/assets/openmodularturrets/lang/ru_ru.json b/src/main/resources/assets/openmodularturrets/lang/ru_ru.json index 8b39ca7ac..d7f4ac49a 100644 --- a/src/main/resources/assets/openmodularturrets/lang/ru_ru.json +++ b/src/main/resources/assets/openmodularturrets/lang/ru_ru.json @@ -271,5 +271,6 @@ "tooltip.openmodularturrets.generator_upgrade_slot": "Upgrades for the generator.", "tooltip.openmodularturrets.ownership_wand.desc4": "Пока в руке: выстрелы турелей на вас не действуют", "tooltip.openmodularturrets.upgrade.machine.turret_base": "Fits into: Turret Base", - "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator" + "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator", + "tooltip.openmodularturrets.module_disabled": "Disabled in the config: does nothing" } diff --git a/src/main/resources/assets/openmodularturrets/lang/zh_cn.json b/src/main/resources/assets/openmodularturrets/lang/zh_cn.json index 613421e8e..6b3afc275 100644 --- a/src/main/resources/assets/openmodularturrets/lang/zh_cn.json +++ b/src/main/resources/assets/openmodularturrets/lang/zh_cn.json @@ -271,5 +271,6 @@ "tooltip.openmodularturrets.generator_upgrade_slot": "Upgrades for the generator.", "tooltip.openmodularturrets.ownership_wand.desc4": "手持时:炮塔的射击对你无效", "tooltip.openmodularturrets.upgrade.machine.turret_base": "Fits into: Turret Base", - "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator" + "tooltip.openmodularturrets.upgrade.machine.generator": "Fits into: Generator", + "tooltip.openmodularturrets.module_disabled": "Disabled in the config: does nothing" } diff --git a/src/main/resources/openmodularturrets.client.mixins.json b/src/main/resources/openmodularturrets.client.mixins.json index 266d3c9b2..f905f2ddf 100644 --- a/src/main/resources/openmodularturrets.client.mixins.json +++ b/src/main/resources/openmodularturrets.client.mixins.json @@ -4,6 +4,7 @@ "package": "omtteam.openmodularturrets.client.mixin", "compatibilityLevel": "JAVA_17", "client": [ + "GuiGraphicsMixin", "SpecialModelRenderersMixin" ], "injectors": { diff --git a/src/test/java/omtteam/openmodularturrets/core/base/FakeSettings.java b/src/test/java/omtteam/openmodularturrets/core/base/FakeSettings.java index 56a0c9581..020903c58 100644 --- a/src/test/java/omtteam/openmodularturrets/core/base/FakeSettings.java +++ b/src/test/java/omtteam/openmodularturrets/core/base/FakeSettings.java @@ -1,10 +1,13 @@ package omtteam.openmodularturrets.core.base; +import omtteam.openmodularturrets.core.item.AddonType; +import omtteam.openmodularturrets.core.item.TurretBaseUpgradeType; import omtteam.openmodularturrets.core.settings.BaseTierStats; import omtteam.openmodularturrets.core.settings.LogicSettings; import omtteam.openmodularturrets.core.settings.TurretStats; import omtteam.openmodularturrets.core.turret.TurretType; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -19,6 +22,8 @@ final class FakeSettings implements LogicSettings { new BaseTierStats(500, 50, 1, 1), new BaseTierStats(50000, 100, 1, 1), new BaseTierStats(150000, 1000, 2, 1), new BaseTierStats(500000, 2500, 3, 2), new BaseTierStats(10000000, 50000, 4, 2)}; int[] expanderStacks = {1, 2, 3}; + final Set disabledUpgrades = EnumSet.noneOf(TurretBaseUpgradeType.class); + final Set disabledAddons = EnumSet.noneOf(AddonType.class); int solar = 10; int reactor = 1600; boolean needAmmo = true; @@ -69,6 +74,16 @@ public int expanderStacks(int tier) { return expanderStacks[tier - 1]; } + @Override + public boolean upgradeEnabled(TurretBaseUpgradeType type) { + return !disabledUpgrades.contains(type); + } + + @Override + public boolean addonEnabled(AddonType type) { + return !disabledAddons.contains(type); + } + @Override public int solarPanelGeneration() { return solar; diff --git a/src/test/java/omtteam/openmodularturrets/core/base/TurretBaseLogicTest.java b/src/test/java/omtteam/openmodularturrets/core/base/TurretBaseLogicTest.java index 7ac737726..9f760bfb7 100644 --- a/src/test/java/omtteam/openmodularturrets/core/base/TurretBaseLogicTest.java +++ b/src/test/java/omtteam/openmodularturrets/core/base/TurretBaseLogicTest.java @@ -393,6 +393,83 @@ void concealment() { } } + /** Upgrades and addons switched off in the config stay in their slots but count as not installed. */ + @Nested + class DisabledModules { + @Test + void disabledUpgradeDoesNothing() { + TurretBaseLogic logic = base(5); + upgrade(0, TurretBaseUpgradeType.RANGE, 2); + upgrade(1, TurretBaseUpgradeType.FIRE_RATE, 2); + settings.disabledUpgrades.add(TurretBaseUpgradeType.RANGE); + assertEquals(0, logic.getUpgradeCount(TurretBaseUpgradeType.RANGE)); + assertEquals(18, logic.getRange(TurretType.MACHINE_GUN_TURRET)); + assertEquals(2, logic.getUpgradeCount(TurretBaseUpgradeType.FIRE_RATE), "other upgrades still work"); + settings.disabledUpgrades.clear(); + assertEquals(18 + 2 * 2, logic.getRange(TurretType.MACHINE_GUN_TURRET), "works again once enabled"); + } + + @Test + void disabledCreativeUpgradeNeedsAmmoAndEnergy() { + TurretBaseLogic logic = base(5); + tick(logic, 5); + upgrade(0, TurretBaseUpgradeType.CREATIVE, 1); + settings.disabledUpgrades.add(TurretBaseUpgradeType.CREATIVE); + assertFalse(logic.hasCreativeUpgrade()); + assertEquals(Optional.of(AmmoType.BULLET), logic.getRequiredAmmo(TurretType.MACHINE_GUN_TURRET)); + logic.tick(6); + assertEquals(0, logic.getEnergy().getAmount()); + } + + @Test + void disabledAddonsDoNothing() { + TurretBaseLogic logic = base(2); + addon(0, AddonType.DAMAGE_AMP, 2); + addon(1, AddonType.FAKE_DROPS, 2); + settings.disabledAddons.add(AddonType.DAMAGE_AMP); + settings.disabledAddons.add(AddonType.FAKE_DROPS); + assertEquals(0, logic.getDamageAmpLevel()); + assertEquals(0, logic.getDamageAmpBonus(TurretType.MACHINE_GUN_TURRET), 1e-9); + assertEquals(TurretBaseLogic.NO_LOOT, logic.getLootingLevel(3)); + } + + @Test + void disabledConcealerDoesNotConceal() { + TurretBaseLogic logic = base(2); + addon(0, AddonType.CONCEALER, 1); + settings.disabledAddons.add(AddonType.CONCEALER); + logic.onInventoryChanged(); + assertFalse(logic.isConcealingTurrets()); + } + + @Test + void disabledGeneratorAddonsGenerateNothing() { + TurretBaseLogic logic = base(2); + addon(0, AddonType.REDSTONE_REACTOR, 1); + addon(1, AddonType.SOLAR_PANEL, 1); + settings.disabledAddons.add(AddonType.REDSTONE_REACTOR); + settings.disabledAddons.add(AddonType.SOLAR_PANEL); + FakeSlot blocks = FakeSlot.fuel(ReactorFuel.REDSTONE_BLOCK, 1); + ammoSlot(0, blocks); + world.solar = true; + tick(logic, 20); + assertEquals(0, logic.getEnergy().getAmount()); + assertEquals(1, blocks.count, "the reactor burns no fuel"); + } + + @Test + void disabledRecyclerNeverSavesAmmo() { + settings.disabledAddons.add(AddonType.RECYCLER); + TurretBaseLogic logic = base(2); + addon(0, AddonType.RECYCLER, 1); + FakeSlot potatoes = FakeSlot.ammo(AmmoType.POTATO, 5); + ammoSlot(0, potatoes); + random.value = 0; + assertFalse(logic.drawAmmo(TurretType.POTATO_CANNON_TURRET).orElseThrow().recycled()); + assertEquals(4, potatoes.count); + } + } + @Nested class Neighbours { @Test diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_concealer.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_concealer.json index 410f83ab6..34afe7cd9 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_concealer.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_concealer.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_concealer" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_damage_amp.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_damage_amp.json index 50f9bcb3a..b6b6a1283 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_damage_amp.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_damage_amp.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_damage_amp" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_ender_eye": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_fake_drops.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_fake_drops.json index a75c595aa..286129470 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_fake_drops.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_fake_drops.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_fake_drops" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_recycler.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_recycler.json index 3f9bac2e1..1c15c9c63 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_recycler.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_recycler.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_recycler" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_redstone_reactor.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_redstone_reactor.json index 09203396b..e49bc4e7a 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_redstone_reactor.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_redstone_reactor.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_redstone_reactor" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_solar_panel.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_solar_panel.json index f8bba0fb2..b54a9e9b3 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_solar_panel.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/addon_solar_panel.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_solar_panel" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_accuracy.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_accuracy.json index a45ffc53d..0df750e48 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_accuracy.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_accuracy.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_accuracy" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_efficiency.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_efficiency.json index 6b3f13a71..39361ef8f 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_efficiency.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_efficiency.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_efficiency" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_energy_multiplier.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_energy_multiplier.json index 2a5fdee63..e3386f827 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_energy_multiplier.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_energy_multiplier.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_energy_multiplier" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_fire_rate.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_fire_rate.json index 8298a9bb2..64420ebea 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_fire_rate.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_fire_rate.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_fire_rate" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_range.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_range.json index 46778c3c1..f103128d0 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_range.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_range.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_range" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_scatter_shot.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_scatter_shot.json index d7919674f..37d4cc6b9 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_scatter_shot.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/advancements/recipes/misc/upgrade_scatter_shot.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_scatter_shot" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_concealer.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_concealer.json index 1202a4c90..1c06bc945 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_concealer.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_concealer.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_concealer" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_damage_amp.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_damage_amp.json index 81ab95e99..aba2d33e2 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_damage_amp.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_damage_amp.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_damage_amp" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_fake_drops.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_fake_drops.json index ff5bbd940..344de5b63 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_fake_drops.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_fake_drops.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_fake_drops" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_recycler.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_recycler.json index f3d40d84f..f45f798c2 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_recycler.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_recycler.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_recycler" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_redstone_reactor.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_redstone_reactor.json index cb55bfded..91c0970b8 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_redstone_reactor.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_redstone_reactor.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_redstone_reactor" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_solar_panel.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_solar_panel.json index 7c938a1fa..bf5f37c92 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_solar_panel.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/addon_solar_panel.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_solar_panel" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_accuracy.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_accuracy.json index 06788dc9a..1c9e73d42 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_accuracy.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_accuracy.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_accuracy" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_efficiency.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_efficiency.json index cb6109e28..412e3f816 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_efficiency.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_efficiency.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_efficiency" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_energy_multiplier.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_energy_multiplier.json index 83919d7c3..68bd8977f 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_energy_multiplier.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_energy_multiplier.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_energy_multiplier" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_fire_rate.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_fire_rate.json index 6e93598b5..1daa86e7d 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_fire_rate.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_fire_rate.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_fire_rate" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_range.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_range.json index 73185b652..475248aec 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_range.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_range.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_range" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_scatter_shot.json b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_scatter_shot.json index 45d7e9d03..746c48658 100644 --- a/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_scatter_shot.json +++ b/versions/1.20.1-fabric/src/main/generated/data/openmodularturrets/recipes/upgrade_scatter_shot.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_scatter_shot" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json index 716f39115..be53b8fa5 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_concealer" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json index 21d897a44..c1873f0e1 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_damage_amp" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_ender_eye": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json index 6de4d3a7f..ac57c2481 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_fake_drops" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json index d86c0316b..42144338d 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_recycler" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json index a5e17b4f9..6ce009863 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_redstone_reactor" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json index f88032ce1..fdfab0405 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_solar_panel" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json index f35f34ff9..1e4f6f9d3 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_accuracy" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json index 5fcc5e3e2..a7306d0c1 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_efficiency" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json index 9b7c93019..20efa01d7 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_energy_multiplier" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json index 715adfe7c..05dd4a321 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_fire_rate" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json index 366c9ce29..7f7fab120 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_range" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json index c0ca90761..c1c7a2c18 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_scatter_shot" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json index 7cd86966a..da9283523 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_concealer" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json index 9b7477ce2..63854f7d4 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_damage_amp" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json index 79540d834..231337309 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_fake_drops" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json index 280fc1d90..9e1d0c867 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_recycler" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json index 6efb01893..ebedb1e6e 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_redstone_reactor" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json index ed3a8660d..df9b35a13 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_solar_panel" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json index 7405e4be5..57dcedfed 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_accuracy" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json index d20c8ddaf..a4a326b98 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_efficiency" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json index e6fc4c1e8..39c673a56 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_energy_multiplier" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json index 9e43304c5..e7bf59a9f 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_fire_rate" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json index ef0e11722..55dfe27c8 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_range" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json index 09a16217a..e091067a7 100644 --- a/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json +++ b/versions/1.21.1-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_scatter_shot" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json index 716f39115..be53b8fa5 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_concealer.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_concealer" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json index 21d897a44..c1873f0e1 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_damage_amp.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_damage_amp" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_ender_eye": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json index 6de4d3a7f..ac57c2481 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_fake_drops.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_fake_drops" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json index d86c0316b..42144338d 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_recycler.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_recycler" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json index a5e17b4f9..6ce009863 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_redstone_reactor.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_redstone_reactor" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json index f88032ce1..fdfab0405 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/addon_solar_panel.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_solar_panel" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json index f35f34ff9..1e4f6f9d3 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_accuracy.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_accuracy" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json index 5fcc5e3e2..a7306d0c1 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_efficiency.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_efficiency" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json index 9b7c93019..20efa01d7 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_energy_multiplier.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_energy_multiplier" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json index 715adfe7c..05dd4a321 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_fire_rate.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_fire_rate" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json index 366c9ce29..7f7fab120 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_range.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_range" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json index c0ca90761..c1c7a2c18 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/advancement/recipes/misc/upgrade_scatter_shot.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_scatter_shot" + ] + } + ], "parent": "minecraft:recipes/root", "criteria": { "has_io_bus": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json index aba482a2b..eb131ccc4 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_concealer.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_concealer" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json index af72c27e8..4edc4c564 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_damage_amp.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_damage_amp" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json index 88e58f776..e86b3d44f 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_fake_drops.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_fake_drops" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json index 2c6efd24b..9297f32d8 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_recycler.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_recycler" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json index 273640618..702236fb6 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_redstone_reactor.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_redstone_reactor" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json index a268eb19d..65f4d6220 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/addon_solar_panel.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "addon_solar_panel" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json index 425e396e8..95ca90b6f 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_accuracy.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_accuracy" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json index d14704d41..6cb922bf6 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_efficiency.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_efficiency" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json index fa8035653..b0aca3990 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_energy_multiplier.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_energy_multiplier" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json index 15643d074..0634787cb 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_fire_rate.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_fire_rate" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json index 3691b9e37..797e9652d 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_range.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_range" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": { diff --git a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json index 6efbf71e9..7cba4df98 100644 --- a/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json +++ b/versions/1.21.11-fabric/src/main/generated/data/openmodularturrets/recipe/upgrade_scatter_shot.json @@ -1,4 +1,12 @@ { + "fabric:load_conditions": [ + { + "condition": "openmodularturrets:module_enabled", + "items": [ + "upgrade_scatter_shot" + ] + } + ], "type": "minecraft:crafting_shaped", "category": "misc", "key": {