From 2bd0034f01ab2517ccf3d6eeebee6ef9ff7d00cf Mon Sep 17 00:00:00 2001 From: TropheusJ <60247969+TropheusJ@users.noreply.github.com> Date: Sun, 23 Feb 2025 17:43:20 -0500 Subject: [PATCH] Stress Values API (#18) --- .../java/com/simibubi/create/AllBlocks.java | 100 +++++++------- .../create/api/stress/BlockStressValues.java | 50 +++++++ .../bearing/WindmillBearingBlock.java | 6 - .../content/fluids/tank/BoilerData.java | 2 +- .../content/kinetics/BlockStressDefaults.java | 68 --------- .../content/kinetics/BlockStressValues.java | 116 ---------------- .../kinetics/base/KineticBlockEntity.java | 2 +- .../kinetics/crank/HandCrankBlock.java | 6 - .../kinetics/crank/ValveHandleBlock.java | 9 +- .../steamEngine/PoweredShaftBlockEntity.java | 3 +- .../waterwheel/LargeWaterWheelBlock.java | 5 - .../kinetics/waterwheel/WaterWheelBlock.java | 5 - .../foundation/data/BuilderTransformers.java | 13 +- .../create/foundation/item/KineticStats.java | 13 +- .../infrastructure/config/AllConfigs.java | 7 +- .../create/infrastructure/config/CStress.java | 129 ++++++++---------- 16 files changed, 184 insertions(+), 350 deletions(-) create mode 100644 src/main/java/com/simibubi/create/api/stress/BlockStressValues.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 9fabbbf106..97dd7540a3 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -19,6 +19,7 @@ import static com.simibubi.create.foundation.data.TagGen.tagBlockAndItem; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.api.behaviour.interaction.ConductorBlockInteractionBehavior; +import com.simibubi.create.api.stress.BlockStressValues; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsBlock; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovingInteraction; @@ -110,7 +111,6 @@ import com.simibubi.create.content.fluids.tank.FluidTankGenerator; import com.simibubi.create.content.fluids.tank.FluidTankItem; import com.simibubi.create.content.fluids.tank.FluidTankModel; import com.simibubi.create.content.fluids.tank.FluidTankMovementBehavior; -import com.simibubi.create.content.kinetics.BlockStressDefaults; import com.simibubi.create.content.kinetics.belt.BeltBlock; import com.simibubi.create.content.kinetics.belt.BeltGenerator; import com.simibubi.create.content.kinetics.belt.BeltModel; @@ -270,6 +270,7 @@ import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.UncontainableBlockItem; import com.simibubi.create.foundation.utility.ColorHandlers; import com.simibubi.create.foundation.utility.DyeHelper; +import com.simibubi.create.infrastructure.config.CStress; import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.DataIngredient; @@ -365,7 +366,7 @@ public class AllBlocks { public static final BlockEntry SHAFT = REGISTRATE.block("shaft", ShaftBlock::new) .initialProperties(SharedProperties::stone) .properties(p -> p.mapColor(MapColor.METAL).forceSolidOff()) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.axisBlockProvider(false)) .onRegister(CreateRegistrate.blockModel(() -> BracketedKineticBlockModel::new)) @@ -376,7 +377,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.sound(SoundType.WOOD) .mapColor(MapColor.DIRT)) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.axisBlockProvider(false)) .onRegister(CreateRegistrate.blockModel(() -> BracketedKineticBlockModel::new)) @@ -390,7 +391,7 @@ public class AllBlocks { .properties(p -> p.sound(SoundType.WOOD) .mapColor(MapColor.DIRT)) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .blockstate(BlockStateGen.axisBlockProvider(false)) .onRegister(CreateRegistrate.blockModel(() -> BracketedKineticBlockModel::new)) .item(CogwheelBlockItem::new) @@ -456,7 +457,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.noOcclusion() .mapColor(MapColor.PODZOL)) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(axeOrPickaxe()) .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(AllSpriteShifts.ANDESITE_CASING))) .onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.ANDESITE_CASING, @@ -471,7 +472,7 @@ public class AllBlocks { .properties(p -> p.noOcclusion() .mapColor(MapColor.PODZOL)) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(axeOrPickaxe()) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p))) .item() @@ -483,7 +484,7 @@ public class AllBlocks { .properties(p -> p.noOcclusion() .mapColor(MapColor.PODZOL)) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(axeOrPickaxe()) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, AssetLookup.forPowered(c, p))) .item() @@ -495,7 +496,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.noOcclusion() .mapColor(MapColor.PODZOL)) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(axeOrPickaxe()) .blockstate((c, p) -> new ChainDriveGenerator((state, suffix) -> p.models() .getExistingFile(p.modLoc("block/" + c.getName() + "/" + suffix))).generate(c, p)) @@ -508,7 +509,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.noOcclusion() .mapColor(MapColor.NETHER)) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .transform(axeOrPickaxe()) .blockstate((c, p) -> new ChainDriveGenerator((state, suffix) -> { String powered = state.getValue(ChainGearshiftBlock.POWERED) ? "_powered" : ""; @@ -530,7 +531,7 @@ public class AllBlocks { .addLayer(() -> RenderType::cutoutMipped) .transform(axeOrPickaxe()) .blockstate(new BeltGenerator()::generate) - .transform(BlockStressDefaults.setImpact(0)) + .transform(CStress.setNoImpact()) .transform(displaySource(AllDisplaySources.ITEM_NAMES)) .onRegister(CreateRegistrate.blockModel(() -> BeltModel::new)) .register(); @@ -541,7 +542,8 @@ public class AllBlocks { .properties(p -> p.noOcclusion() .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setImpact(1)) + .transform(CStress.setImpact(1)) + .transform(CStress.setImpact(1)) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .item() .transform(customItemModel()) @@ -555,8 +557,8 @@ public class AllBlocks { .tag(AllBlockTags.SAFE_NBT.tag) .transform(pickaxeOnly()) .blockstate(new CreativeMotorGenerator()::generate) - .transform(BlockStressDefaults.setCapacity(16384.0)) - .transform(BlockStressDefaults.setGeneratorSpeed(() -> Couple.create(0, 256))) + .transform(CStress.setCapacity(16384.0)) + .onRegister(BlockStressValues.setGeneratorSpeed(256, true)) .item() .properties(p -> p.rarity(Rarity.EPIC)) .transform(customItemModel()) @@ -570,8 +572,8 @@ public class AllBlocks { .blockstate( (c, p) -> BlockStateGen.directionalBlockIgnoresWaterlogged(c, p, s -> AssetLookup.partialBaseModel(c, p))) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setCapacity(32.0)) - .transform(BlockStressDefaults.setGeneratorSpeed(WaterWheelBlock::getSpeedRange)) + .transform(CStress.setCapacity(32)) + .onRegister(BlockStressValues.setGeneratorSpeed(8)) .item() .transform(customItemModel()) .register(); @@ -585,8 +587,8 @@ public class AllBlocks { .blockstate((c, p) -> axisBlock(c, p, s -> s.getValue(LargeWaterWheelBlock.EXTENSION) ? AssetLookup.partialBaseModel(c, p, "extension") : AssetLookup.partialBaseModel(c, p))) - .transform(BlockStressDefaults.setCapacity(128.0)) - .transform(BlockStressDefaults.setGeneratorSpeed(LargeWaterWheelBlock::getSpeedRange)) + .transform(CStress.setCapacity(128.0)) + .onRegister(BlockStressValues.setGeneratorSpeed(4)) .item(LargeWaterWheelBlockItem::new) .transform(customItemModel()) .register(); @@ -608,7 +610,7 @@ public class AllBlocks { .blockstate(BlockStateGen.directionalBlockProvider(true)) .addLayer(() -> RenderType::cutoutMipped) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setImpact(2.0)) + .transform(CStress.setImpact(2.0)) .item() .transform(customItemModel()) .register(); @@ -629,7 +631,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.standardModel(c, p))) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .simpleItem() .register(); @@ -638,8 +640,8 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.directionalBlockProvider(true)) - .transform(BlockStressDefaults.setCapacity(8.0)) - .transform(BlockStressDefaults.setGeneratorSpeed(HandCrankBlock::getSpeedRange)) + .transform(CStress.setCapacity(8.0)) + .onRegister(BlockStressValues.setGeneratorSpeed(32)) .tag(AllBlockTags.BRITTLE.tag) .onRegister(ItemUseOverrides::addBlock) .item() @@ -669,7 +671,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.METAL)) .transform(pickaxeOnly()) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item() .transform(customItemModel()) .register(); @@ -682,7 +684,7 @@ public class AllBlocks { .transform(pickaxeOnly()) .blockstate((c, p) -> BlockStateGen.axisBlock(c, p, s -> AssetLookup.partialBaseModel(c, p))) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setImpact(8.0)) + .transform(CStress.setImpact(8.0)) .item() .transform(customItemModel()) .register(); @@ -706,7 +708,7 @@ public class AllBlocks { .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(8.0)) + .transform(CStress.setImpact(8.0)) .item(AssemblyOperatorBlockItem::new) .transform(customItemModel()) .register(); @@ -719,7 +721,7 @@ public class AllBlocks { .transform(axeOrPickaxe()) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item(AssemblyOperatorBlockItem::new) .transform(customItemModel()) .register(); @@ -793,7 +795,7 @@ public class AllBlocks { .mapColor(MapColor.COLOR_GRAY)) .transform(axeOrPickaxe()) .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p), 180)) - .transform(BlockStressDefaults.setImpact(2.0)) + .transform(CStress.setImpact(2.0)) .transform(displaySource(AllDisplaySources.ITEM_NAMES)) .item(EjectorItem::new) .transform(customItemModel()) @@ -831,7 +833,7 @@ public class AllBlocks { .initialProperties(SharedProperties::wooden) .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .blockstate(new GaugeGenerator()::generate) .transform(displaySource(AllDisplaySources.KINETIC_SPEED)) .item() @@ -842,7 +844,7 @@ public class AllBlocks { .initialProperties(SharedProperties::wooden) .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .blockstate(new GaugeGenerator()::generate) .transform(displaySource(AllDisplaySources.KINETIC_STRESS)) .item() @@ -923,7 +925,7 @@ public class AllBlocks { .transform(pickaxeOnly()) .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(true)) .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item() .transform(customItemModel()) .register(); @@ -955,7 +957,7 @@ public class AllBlocks { REGISTRATE.block("copper_valve_handle", ValveHandleBlock::copper) .transform(pickaxeOnly()) .transform(BuilderTransformers.valveHandle(null)) - .transform(BlockStressDefaults.setCapacity(8.0)) + .transform(CStress.setCapacity(8.0)) .register(); public static final DyedBlockList DYED_VALVE_HANDLES = new DyedBlockList<>(colour -> { @@ -1016,7 +1018,7 @@ public class AllBlocks { .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item() .transform(customItemModel()) .register(); @@ -1055,8 +1057,8 @@ public class AllBlocks { .initialProperties(SharedProperties::copperMetal) .transform(pickaxeOnly()) .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) - .transform(BlockStressDefaults.setCapacity(1024.0)) - .transform(BlockStressDefaults.setGeneratorSpeed(SteamEngineBlock::getSpeedRange)) + .transform(CStress.setCapacity(1024.0)) + .onRegister(BlockStressValues.setGeneratorSpeed(64, true)) .item() .transform(customItemModel()) .register(); @@ -1162,7 +1164,7 @@ public class AllBlocks { existing.getLocation()) .texture("2", p.modLoc("block/" + c.getName() + powered + flipped)); })) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .item() .transform(customItemModel("_", "block_single")) .register(); @@ -1172,8 +1174,8 @@ public class AllBlocks { .transform(axeOrPickaxe()) .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(BuilderTransformers.bearing("windmill", "gearbox")) - .transform(BlockStressDefaults.setCapacity(512.0)) - .transform(BlockStressDefaults.setGeneratorSpeed(WindmillBearingBlock::getSpeedRange)) + .transform(CStress.setCapacity(512.0)) + .onRegister(BlockStressValues.setGeneratorSpeed(16, true)) .tag(AllBlockTags.SAFE_NBT.tag) .register(); @@ -1182,7 +1184,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .transform(BuilderTransformers.bearing("mechanical", "gearbox")) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(movementBehaviour(new StabilizedBearingMovementBehaviour())) .register(); @@ -1192,7 +1194,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN)) .transform(axeOrPickaxe()) .transform(BuilderTransformers.bearing("clockwork", "brass_gearbox")) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .tag(AllBlockTags.SAFE_NBT.tag) .register(); @@ -1204,7 +1206,7 @@ public class AllBlocks { .transform(axeOrPickaxe()) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(BlockStateGen.horizontalAxisBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item() .transform(customItemModel()) .register(); @@ -1233,7 +1235,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item() .transform(customItemModel()) .register(); @@ -1337,7 +1339,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.directionalBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .onRegister(movementBehaviour(new DrillMovementBehaviour())) .item() .tag(AllItemTags.CONTRAPTION_CONTROLLED.tag) @@ -1350,7 +1352,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(new SawGenerator()::generate) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .onRegister(movementBehaviour(new SawMovementBehaviour())) .addLayer(() -> RenderType::cutoutMipped) .item() @@ -1363,7 +1365,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.directionalAxisBlockProvider()) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .onRegister(movementBehaviour(new DeployerMovementBehaviour())) .onRegister(interactionBehaviour(new DeployerMovingInteraction())) .item(AssemblyOperatorBlockItem::new) @@ -1538,7 +1540,7 @@ public class AllBlocks { .mapColor(MapColor.TERRACOTTA_YELLOW)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(2.0)) + .transform(CStress.setImpact(2.0)) .onRegister(CreateRegistrate.connectedTextures(CrafterCTBehaviour::new)) .addLayer(() -> RenderType::cutoutMipped) .item() @@ -1552,7 +1554,7 @@ public class AllBlocks { .transform(axeOrPickaxe()) .tag(AllBlockTags.SAFE_NBT.tag) .properties(BlockBehaviour.Properties::noOcclusion) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .blockstate(new SequencedGearshiftGenerator()::generate) .item() .transform(customItemModel()) @@ -1563,7 +1565,7 @@ public class AllBlocks { .properties(p -> p.noOcclusion() .mapColor(MapColor.TERRACOTTA_YELLOW)) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .blockstate(BlockStateGen.axisBlockProvider(true)) .item() .transform(customItemModel()) @@ -1575,7 +1577,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW)) .transform(axeOrPickaxe()) .tag(AllBlockTags.SAFE_NBT.tag) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .blockstate(BlockStateGen.horizontalAxisBlockProvider(true)) .item() .transform(customItemModel()) @@ -1592,7 +1594,7 @@ public class AllBlocks { .modelFile(AssetLookup.partialBaseModel(c, p)) .rotationX(s.getValue(ArmBlock.CEILING) ? 180 : 0) .build())) - .transform(BlockStressDefaults.setImpact(2.0)) + .transform(CStress.setImpact(2.0)) .item(ArmItem::new) .transform(customItemModel()) .register(); @@ -2026,7 +2028,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.COLOR_GRAY)) .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) - .transform(BlockStressDefaults.setImpact(0)) + .transform(CStress.setNoImpact()) .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.partialBaseModel(c, p))) .transform(displayTarget(AllDisplayTargets.DISPLAY_BOARD)) .lang("Display Board") diff --git a/src/main/java/com/simibubi/create/api/stress/BlockStressValues.java b/src/main/java/com/simibubi/create/api/stress/BlockStressValues.java new file mode 100644 index 0000000000..47c137aa87 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/stress/BlockStressValues.java @@ -0,0 +1,50 @@ +package com.simibubi.create.api.stress; + +import java.util.function.DoubleSupplier; + +import com.simibubi.create.api.registry.SimpleRegistry; +import com.tterrag.registrate.util.nullness.NonNullConsumer; + +import net.minecraft.world.level.block.Block; + +public class BlockStressValues { + /** + * Registry for suppliers of stress impacts. Determine the base impact at 1 RPM. + */ + public static final SimpleRegistry IMPACTS = SimpleRegistry.create(); + /** + * Registry for suppliers of stress capacities. Determine the base capacity at 1 RPM. + */ + public static final SimpleRegistry CAPACITIES = SimpleRegistry.create(); + /** + * Registry for generator RPM values. This is only used for tooltips; actual functionality is determined by the block. + */ + public static final SimpleRegistry RPM = SimpleRegistry.create(); + + public static double getImpact(Block block) { + DoubleSupplier supplier = IMPACTS.get(block); + return supplier == null ? 0 : supplier.getAsDouble(); + } + + public static double getCapacity(Block block) { + DoubleSupplier supplier = CAPACITIES.get(block); + return supplier == null ? 0 : supplier.getAsDouble(); + } + + /** + * Shortcut for when a generator always generates the same RPM. + */ + public static NonNullConsumer setGeneratorSpeed(int value) { + return block -> RPM.register(block, new GeneratedRpm(value, false)); + } + + /** + * Utility for Registrate. Registers the given RPM generation info to blocks passed to the returned consumer. + */ + public static NonNullConsumer setGeneratorSpeed(int value, boolean mayGenerateLess) { + return block -> RPM.register(block, new GeneratedRpm(value, mayGenerateLess)); + } + + public record GeneratedRpm(int value, boolean mayGenerateLess) { + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/WindmillBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/WindmillBearingBlock.java index 24676fd4c9..11bd891e30 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/WindmillBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/WindmillBearingBlock.java @@ -3,7 +3,6 @@ package com.simibubi.create.content.contraptions.bearing; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -51,9 +50,4 @@ public class WindmillBearingBlock extends BearingBlock implements IBE getBlockEntityType() { return AllBlockEntityTypes.WINDMILL_BEARING.get(); } - - public static Couple getSpeedRange() { - return Couple.create(1, 16); - } - } diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java index e0750e75d6..6dfd085c10 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java @@ -11,9 +11,9 @@ import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.api.boiler.BoilerHeater; +import com.simibubi.create.api.stress.BlockStressValues; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlock; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlockEntity; -import com.simibubi.create.content.kinetics.BlockStressValues; import com.simibubi.create.content.kinetics.steamEngine.SteamEngineBlock; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; diff --git a/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java b/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java deleted file mode 100644 index 8acbf2156c..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.simibubi.create.content.kinetics; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; - -import com.tterrag.registrate.builders.BlockBuilder; -import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; - -import net.createmod.catnip.data.Couple; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; - -public class BlockStressDefaults { - - /** - * Increment this number if all stress entries should be forced to update in the - * next release. Worlds from the previous version will overwrite potentially - * changed values with the new defaults. - */ - public static final int FORCED_UPDATE_VERSION = 2; - - public static final Map DEFAULT_IMPACTS = new ConcurrentHashMap<>(); - public static final Map DEFAULT_CAPACITIES = new ConcurrentHashMap<>(); - public static final Map>> GENERATOR_SPEEDS = new ConcurrentHashMap<>(); - - public static void setDefaultImpact(ResourceLocation blockId, double impact) { - DEFAULT_IMPACTS.put(blockId, impact); - } - - public static void setDefaultCapacity(ResourceLocation blockId, double capacity) { - DEFAULT_CAPACITIES.put(blockId, capacity); - } - - public static void setGeneratorSpeed(ResourceLocation blockId, Supplier> provider) { - GENERATOR_SPEEDS.put(blockId, provider); - } - - public static NonNullUnaryOperator> setNoImpact() { - return setImpact(0); - } - - public static NonNullUnaryOperator> setImpact(double impact) { - return b -> { - setDefaultImpact(new ResourceLocation(b.getOwner() - .getModid(), b.getName()), impact); - return b; - }; - } - - public static NonNullUnaryOperator> setCapacity(double capacity) { - return b -> { - setDefaultCapacity(new ResourceLocation(b.getOwner() - .getModid(), b.getName()), capacity); - return b; - }; - } - - public static NonNullUnaryOperator> setGeneratorSpeed( - Supplier> provider) { - return b -> { - setGeneratorSpeed(new ResourceLocation(b.getOwner() - .getModid(), b.getName()), provider); - return b; - }; - } - -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java b/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java deleted file mode 100644 index d0b6d24b61..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.simibubi.create.content.kinetics; - -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Nullable; - -import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.data.Couple; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; - -public class BlockStressValues { - - private static final Map PROVIDERS = new HashMap<>(); - - public static void registerProvider(String namespace, IStressValueProvider provider) { - PROVIDERS.put(namespace, provider); - } - - @Nullable - public static IStressValueProvider getProvider(String namespace) { - return PROVIDERS.get(namespace); - } - - @Nullable - public static IStressValueProvider getProvider(Block block) { - return getProvider(CatnipServices.REGISTRIES.getKeyOrThrow(block) - .getNamespace()); - } - - public static double getImpact(Block block) { - ResourceLocation blockId = CatnipServices.REGISTRIES.getKeyOrThrow(block); - IStressValueProvider provider = getProvider(blockId.getNamespace()); - if (provider != null) { - return provider.getImpact(block); - } - Double defaultImpact = BlockStressDefaults.DEFAULT_IMPACTS.get(blockId); - if (defaultImpact != null) { - return defaultImpact; - } - return 0; - } - - public static double getCapacity(Block block) { - ResourceLocation blockId = CatnipServices.REGISTRIES.getKeyOrThrow(block); - IStressValueProvider provider = getProvider(blockId.getNamespace()); - if (provider != null) { - return provider.getCapacity(block); - } - Double defaultCapacity = BlockStressDefaults.DEFAULT_CAPACITIES.get(blockId); - if (defaultCapacity != null) { - return defaultCapacity; - } - return 0; - } - - public static boolean hasImpact(Block block) { - ResourceLocation blockId = CatnipServices.REGISTRIES.getKeyOrThrow(block); - IStressValueProvider provider = getProvider(blockId.getNamespace()); - if (provider != null) { - return provider.hasImpact(block); - } - return BlockStressDefaults.DEFAULT_IMPACTS.containsKey(blockId); - } - - public static boolean hasCapacity(Block block) { - ResourceLocation blockId = CatnipServices.REGISTRIES.getKeyOrThrow(block); - IStressValueProvider provider = getProvider(blockId.getNamespace()); - if (provider != null) { - return provider.hasCapacity(block); - } - return BlockStressDefaults.DEFAULT_CAPACITIES.containsKey(blockId); - } - - @Nullable - public static Couple getGeneratedRPM(Block block) { - ResourceLocation blockId = CatnipServices.REGISTRIES.getKeyOrThrow(block); - IStressValueProvider provider = getProvider(blockId.getNamespace()); - if (provider != null) { - return provider.getGeneratedRPM(block); - } - return null; - } - - public interface IStressValueProvider { - /** - * Gets the stress impact of a block. - * - * @param block The block. - * @return the stress impact value of the block, or 0 if it does not have one. - */ - double getImpact(Block block); - - /** - * Gets the stress capacity of a block. - * - * @param block The block. - * @return the stress capacity value of the block, or 0 if it does not have one. - */ - double getCapacity(Block block); - - boolean hasImpact(Block block); - - boolean hasCapacity(Block block); - - /** - * - * @param block - * @return min, max generated RPM; null if block does not have a stress capacity - */ - @Nullable - Couple getGeneratedRPM(Block block); - } - -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java index 9f0ac2d03c..bab6c06ea9 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java @@ -10,7 +10,7 @@ import javax.annotation.Nullable; import com.simibubi.create.Create; import com.simibubi.create.api.equipment.goggles.IHaveGoggleInformation; import com.simibubi.create.api.equipment.goggles.IHaveHoveringInformation; -import com.simibubi.create.content.kinetics.BlockStressValues; +import com.simibubi.create.api.stress.BlockStressValues; import com.simibubi.create.content.kinetics.KineticNetwork; import com.simibubi.create.content.kinetics.RotationPropagator; import com.simibubi.create.content.kinetics.base.IRotate.SpeedLevel; diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlock.java index c6395a26c9..2639e3d6ab 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlock.java @@ -9,7 +9,6 @@ import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -150,9 +149,4 @@ public class HandCrankBlock extends DirectionalKineticBlock public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; } - - public static Couple getSpeedRange() { - return Couple.create(32, 32); - } - } diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlock.java index ff795cf77f..e8d168db91 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlock.java @@ -8,7 +8,6 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.utility.BlockHelper; -import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -22,6 +21,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -32,7 +32,7 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; public class ValveHandleBlock extends HandCrankBlock { public final DyeColor color; - + public static ValveHandleBlock copper(Properties properties) { return new ValveHandleBlock(properties, null); } @@ -111,9 +111,4 @@ public class ValveHandleBlock extends HandCrankBlock { public int getRotationSpeed() { return 32; } - - public static Couple getSpeedRange() { - return Couple.create(32, 32); - } - } diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlockEntity.java index 33c46cfd09..50c02d6bc0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlockEntity.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.steamEngine; import java.util.List; -import com.simibubi.create.content.kinetics.BlockStressValues; +import com.simibubi.create.api.stress.BlockStressValues; import com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity; import net.createmod.catnip.platform.CatnipServices; @@ -16,6 +16,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.registries.ForgeRegistries; public class PoweredShaftBlockEntity extends GeneratingKineticBlockEntity { diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlock.java index a9cd1fc302..a2701b9f10 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlock.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.data.Couple; import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -164,10 +163,6 @@ public class LargeWaterWheelBlock extends RotatedPillarKineticBlock implements I return 2.25f; } - public static Couple getSpeedRange() { - return Couple.create(4, 4); - } - @Override public boolean isFlammable(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { return false; diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java index e52c6113de..cffe2b78b4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.data.Couple; import net.createmod.catnip.data.Iterate; import net.createmod.catnip.levelWrappers.WrappedLevel; import net.minecraft.core.BlockPos; @@ -127,10 +126,6 @@ public class WaterWheelBlock extends DirectionalKineticBlock implements IBE getSpeedRange() { - return Couple.create(8, 8); - } - @Override public boolean isFlammable(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { return false; diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 54f04c8197..49809df8a6 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -20,6 +20,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.Create; +import com.simibubi.create.api.stress.BlockStressValues; import com.simibubi.create.content.contraptions.behaviour.DoorMovingInteraction; import com.simibubi.create.content.contraptions.behaviour.TrapdoorMovingInteraction; import com.simibubi.create.content.contraptions.piston.MechanicalPistonGenerator; @@ -31,7 +32,6 @@ import com.simibubi.create.content.decoration.encasing.CasingBlock; import com.simibubi.create.content.decoration.encasing.EncasedCTBehaviour; import com.simibubi.create.content.decoration.slidingDoor.SlidingDoorBlock; import com.simibubi.create.content.decoration.slidingDoor.SlidingDoorMovementBehaviour; -import com.simibubi.create.content.kinetics.BlockStressDefaults; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogCTBehaviour; @@ -51,6 +51,7 @@ import com.simibubi.create.foundation.block.ItemUseOverrides; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; import com.simibubi.create.foundation.item.ItemDescription; +import com.simibubi.create.infrastructure.config.CStress; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.RegistrateRecipeProvider; @@ -226,7 +227,7 @@ public class BuilderTransformers { Supplier drop) { return b.initialProperties(SharedProperties::stone) .properties(BlockBehaviour.Properties::noOcclusion) - .transform(BlockStressDefaults.setNoImpact()) + .transform(CStress.setNoImpact()) .loot((p, lb) -> p.dropOther(lb, drop.get())); } @@ -235,7 +236,7 @@ public class BuilderTransformers { .blockstate((c, p) -> p.horizontalBlock(c.get(), p.models() .getExistingFile(p.modLoc("block/cuckoo_clock/block")))) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setImpact(1.0)) + .transform(CStress.setImpact(1)) .item() .transform(ModelGen.customItemModel("cuckoo_clock", "item")); } @@ -299,7 +300,7 @@ public class BuilderTransformers { .texture("3", p.modLoc("block/valve_handle/valve_handle_" + variant))); }) .tag(AllBlockTags.BRITTLE.tag, AllBlockTags.VALVE_HANDLES.tag) - .transform(BlockStressDefaults.setGeneratorSpeed(ValveHandleBlock::getSpeedRange)) + .onRegister(BlockStressValues.setGeneratorSpeed(32)) .onRegister(ItemUseOverrides::addBlock) .item() .tag(AllItemTags.VALVE_HANDLES.tag) @@ -380,7 +381,7 @@ public class BuilderTransformers { .properties(p -> p.noOcclusion()) .blockstate(new MechanicalPistonGenerator(type)::generate) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .item() .transform(ModelGen.customItemModel("mechanical_piston", type.getSerializedName(), "item")); } @@ -441,7 +442,7 @@ public class BuilderTransformers { return b -> b.blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) - .transform(BlockStressDefaults.setImpact(4.0)) + .transform(CStress.setImpact(4.0)) .loot((lt, block) -> { Builder builder = LootTable.lootTable(); LootItemCondition.Builder survivesExplosion = ExplosionCondition.survivesExplosion(); diff --git a/src/main/java/com/simibubi/create/foundation/item/KineticStats.java b/src/main/java/com/simibubi/create/foundation/item/KineticStats.java index 70cbb183cc..d9fc2280fb 100644 --- a/src/main/java/com/simibubi/create/foundation/item/KineticStats.java +++ b/src/main/java/com/simibubi/create/foundation/item/KineticStats.java @@ -9,8 +9,9 @@ import java.util.List; import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllBlocks; +import com.simibubi.create.api.stress.BlockStressValues; +import com.simibubi.create.api.stress.BlockStressValues.GeneratedRpm; import com.simibubi.create.content.equipment.goggles.GogglesItem; -import com.simibubi.create.content.kinetics.BlockStressValues; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.IRotate.StressImpact; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; @@ -19,7 +20,6 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CKinetics; -import net.createmod.catnip.data.Couple; import net.createmod.catnip.lang.Lang; import net.createmod.catnip.lang.LangBuilder; import net.minecraft.network.chat.CommonComponents; @@ -80,7 +80,7 @@ public class KineticStats implements TooltipModifier { boolean hasStressImpact = StressImpact.isEnabled() && showStressImpact && BlockStressValues.getImpact(block) > 0; - boolean hasStressCapacity = StressImpact.isEnabled() && BlockStressValues.hasCapacity(block); + boolean hasStressCapacity = StressImpact.isEnabled() && BlockStressValues.getCapacity(block) > 0; if (hasStressImpact) { CreateLang.translate("tooltip.stressImpact") @@ -110,7 +110,7 @@ public class KineticStats implements TooltipModifier { .addTo(list); double capacity = BlockStressValues.getCapacity(block); - Couple generatedRPM = BlockStressValues.getGeneratedRPM(block); + GeneratedRpm generatedRPM = BlockStressValues.RPM.get(block); StressImpact impactId = capacity >= config.highCapacity.get() ? StressImpact.HIGH : (capacity >= config.mediumCapacity.get() ? StressImpact.MEDIUM : StressImpact.LOW); @@ -126,11 +126,10 @@ public class KineticStats implements TooltipModifier { .addTo(list); if (generatedRPM != null) { - LangBuilder amount = CreateLang.number(capacity * generatedRPM.getSecond()) + LangBuilder amount = CreateLang.number(capacity * generatedRPM.value()) .add(suUnit); CreateLang.text(" -> ") - .add(!generatedRPM.getFirst() - .equals(generatedRPM.getSecond()) ? CreateLang.translate("tooltip.up_to", amount) : amount) + .add(generatedRPM.mayGenerateLess() ? CreateLang.translate("tooltip.up_to", amount) : amount) .style(DARK_GRAY) .addTo(list); } diff --git a/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java b/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java index 0312732839..28ecc292d5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/AllConfigs.java @@ -7,9 +7,10 @@ import java.util.function.Supplier; import org.apache.commons.lang3.tuple.Pair; -import com.simibubi.create.content.kinetics.BlockStressValues; +import com.simibubi.create.api.stress.BlockStressValues; import net.createmod.catnip.config.ConfigBase; + import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoadingContext; @@ -63,7 +64,9 @@ public class AllConfigs { for (Entry pair : CONFIGS.entrySet()) context.registerConfig(pair.getKey(), pair.getValue().specification); - BlockStressValues.registerProvider(context.getActiveNamespace(), server().kinetics.stressValues); + CStress stress = server().kinetics.stressValues; + BlockStressValues.IMPACTS.registerProvider(stress::getImpact); + BlockStressValues.CAPACITIES.registerProvider(stress::getCapacity); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CStress.java b/src/main/java/com/simibubi/create/infrastructure/config/CStress.java index 4d5a3f104b..4c5a930f28 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CStress.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CStress.java @@ -2,105 +2,94 @@ package com.simibubi.create.infrastructure.config; import java.util.HashMap; import java.util.Map; -import java.util.function.Supplier; +import java.util.function.DoubleSupplier; + +import org.jetbrains.annotations.Nullable; import com.simibubi.create.Create; -import com.simibubi.create.content.kinetics.BlockStressDefaults; -import com.simibubi.create.content.kinetics.BlockStressValues.IStressValueProvider; +import com.tterrag.registrate.builders.BlockBuilder; +import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +import it.unimi.dsi.fastutil.objects.Object2DoubleMap; +import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap; import net.createmod.catnip.config.ConfigBase; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.data.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; + import net.minecraftforge.common.ForgeConfigSpec.Builder; import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; -public class CStress extends ConfigBase implements IStressValueProvider { +public class CStress extends ConfigBase { + // bump this version to reset configured values. + private static final int VERSION = 2; - private final Map> capacities = new HashMap<>(); - private final Map> impacts = new HashMap<>(); + // IDs need to be used since configs load before registration + + private static final Object2DoubleMap DEFAULT_IMPACTS = new Object2DoubleOpenHashMap<>(); + private static final Object2DoubleMap DEFAULT_CAPACITIES = new Object2DoubleOpenHashMap<>(); + + protected final Map> capacities = new HashMap<>(); + protected final Map> impacts = new HashMap<>(); @Override public void registerAll(Builder builder) { builder.comment(".", Comments.su, Comments.impact) .push("impact"); - BlockStressDefaults.DEFAULT_IMPACTS.forEach((r, i) -> { - if (r.getNamespace() - .equals(Create.ID)) - getImpacts().put(r, builder.define(r.getPath(), i)); - }); + DEFAULT_IMPACTS.forEach((id, value) -> this.impacts.put(id, builder.define(id.getPath(), value))); builder.pop(); builder.comment(".", Comments.su, Comments.capacity) .push("capacity"); - BlockStressDefaults.DEFAULT_CAPACITIES.forEach((r, i) -> { - if (r.getNamespace() - .equals(Create.ID)) - getCapacities().put(r, builder.define(r.getPath(), i)); - }); + DEFAULT_CAPACITIES.forEach((id, value) -> this.capacities.put(id, builder.define(id.getPath(), value))); builder.pop(); } - @Override - public double getImpact(Block block) { - block = redirectValues(block); - ResourceLocation key = CatnipServices.REGISTRIES.getKeyOrThrow(block); - ConfigValue value = getImpacts().get(key); - if (value != null) - return value.get(); - return 0; - } - - @Override - public double getCapacity(Block block) { - block = redirectValues(block); - ResourceLocation key = CatnipServices.REGISTRIES.getKeyOrThrow(block); - ConfigValue value = getCapacities().get(key); - if (value != null) - return value.get(); - return 0; - } - - @Override - public Couple getGeneratedRPM(Block block) { - block = redirectValues(block); - ResourceLocation key = CatnipServices.REGISTRIES.getKeyOrThrow(block); - Supplier> supplier = BlockStressDefaults.GENERATOR_SPEEDS.get(key); - if (supplier == null) - return null; - return supplier.get(); - } - - @Override - public boolean hasImpact(Block block) { - block = redirectValues(block); - ResourceLocation key = CatnipServices.REGISTRIES.getKeyOrThrow(block); - return getImpacts().containsKey(key); - } - - @Override - public boolean hasCapacity(Block block) { - block = redirectValues(block); - ResourceLocation key = CatnipServices.REGISTRIES.getKeyOrThrow(block); - return getCapacities().containsKey(key); - } - - protected Block redirectValues(Block block) { - return block; - } - @Override public String getName() { - return "stressValues.v" + BlockStressDefaults.FORCED_UPDATE_VERSION; + return "stressValues.v" + VERSION; } - public Map> getImpacts() { - return impacts; + @Nullable + public DoubleSupplier getImpact(Block block) { + ResourceLocation id = CatnipServices.REGISTRIES.getKeyOrThrow(block); + ConfigValue value = this.impacts.get(id); + return value == null ? null : value::get; } - public Map> getCapacities() { - return capacities; + @Nullable + public DoubleSupplier getCapacity(Block block) { + ResourceLocation id = CatnipServices.REGISTRIES.getKeyOrThrow(block); + ConfigValue value = this.capacities.get(id); + return value == null ? null : value::get; + } + + public static NonNullUnaryOperator> setNoImpact() { + return setImpact(0); + } + + public static NonNullUnaryOperator> setImpact(double value) { + return builder -> { + assertFromCreate(builder); + ResourceLocation id = Create.asResource(builder.getName()); + DEFAULT_IMPACTS.put(id, value); + return builder; + }; + } + + public static NonNullUnaryOperator> setCapacity(double value) { + return builder -> { + assertFromCreate(builder); + ResourceLocation id = Create.asResource(builder.getName()); + DEFAULT_CAPACITIES.put(id, value); + return builder; + }; + } + + private static void assertFromCreate(BlockBuilder builder) { + if (!builder.getOwner().getModid().equals(Create.ID)) { + throw new IllegalStateException("Non-Create blocks cannot be added to Create's config."); + } } private static class Comments {