diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index b9d0d8609..0261b4098 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -10,6 +10,7 @@ import com.google.gson.GsonBuilder; import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour; import com.simibubi.create.content.CreateItemGroup; import com.simibubi.create.content.contraptions.TorquePropagator; +import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineModifiers; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.curiosities.weapons.BuiltinPotatoProjectileTypes; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; @@ -98,6 +99,7 @@ public class Create { AllMovementBehaviours.register(); AllWorldFeatures.register(); AllEnchantments.register(); + FurnaceEngineModifiers.register(); AllConfigs.register(modLoadingContext); BlockSpoutingBehaviour.register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index 5b144822e..e7f604707 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -23,6 +24,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.CocoaBlock; import net.minecraft.block.CropsBlock; import net.minecraft.block.SugarCaneBlock; +import net.minecraft.block.SweetBerryBushBlock; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -50,14 +52,16 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { @Nullable @Override - public ActorInstance createInstance(MaterialManager materialManager, PlacementSimulationWorld simulationWorld, MovementContext context) { + public ActorInstance createInstance(MaterialManager materialManager, PlacementSimulationWorld simulationWorld, + MovementContext context) { return new HarvesterActorInstance(materialManager, simulationWorld, context); } @Override public void renderInContraption(MovementContext context, PlacementSimulationWorld renderWorld, ContraptionMatrices matrices, IRenderTypeBuffer buffers) { - if (!Backend.getInstance().canUseInstancing()) + if (!Backend.getInstance() + .canUseInstancing()) HarvesterRenderer.renderInContraption(context, renderWorld, matrices, buffers); } @@ -86,16 +90,18 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { ItemStack item = ItemStack.EMPTY; float effectChance = 1; - - if (stateVisited.getBlock().is(BlockTags.LEAVES)) { + + if (stateVisited.getBlock() + .is(BlockTags.LEAVES)) { item = new ItemStack(Items.SHEARS); effectChance = .45f; } - + MutableBoolean seedSubtracted = new MutableBoolean(notCropButCuttable); BlockState state = stateVisited; BlockHelper.destroyBlockAs(world, pos, null, item, effectChance, stack -> { - if (!seedSubtracted.getValue() && stack.sameItem(new ItemStack(state.getBlock()))) { + if (AllConfigs.SERVER.kinetics.harvesterReplants.get() && !seedSubtracted.getValue() + && stack.sameItem(new ItemStack(state.getBlock()))) { stack.shrink(1); seedSubtracted.setTrue(); } @@ -106,23 +112,31 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { } private boolean isValidCrop(World world, BlockPos pos, BlockState state) { + boolean harvestPartial = AllConfigs.SERVER.kinetics.harvestPartiallyGrown.get(); + boolean replant = AllConfigs.SERVER.kinetics.harvesterReplants.get(); + if (state.getBlock() instanceof CropsBlock) { CropsBlock crop = (CropsBlock) state.getBlock(); - if (!crop.isMaxAge(state)) - return false; - return true; + if (harvestPartial) + return state.getValue(crop.getAgeProperty()) != 0 || !replant; + return crop.isMaxAge(state); } + if (state.getCollisionShape(world, pos) .isEmpty() || state.getBlock() instanceof CocoaBlock) { for (Property property : state.getProperties()) { if (!(property instanceof IntegerProperty)) continue; + IntegerProperty ageProperty = (IntegerProperty) property; if (!property.getName() .equals(BlockStateProperties.AGE_1.getName())) continue; - if (((IntegerProperty) property).getPossibleValues() - .size() - 1 != state.getValue((IntegerProperty) property) - .intValue()) + int age = state.getValue(ageProperty) + .intValue(); + if (state.getBlock() instanceof SweetBerryBushBlock && age <= 1 && replant) + continue; + if (age == 0 && replant || !harvestPartial && (ageProperty.getPossibleValues() + .size() - 1 != age)) continue; return true; } @@ -136,7 +150,8 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { return false; if (state.getBlock() instanceof SugarCaneBlock) return true; - if (state.getBlock().is(BlockTags.LEAVES)) + if (state.getBlock() + .is(BlockTags.LEAVES)) return true; if (state.getCollisionShape(world, pos) @@ -161,6 +176,14 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { } private BlockState cutCrop(World world, BlockPos pos, BlockState state) { + if (!AllConfigs.SERVER.kinetics.harvesterReplants.get()) { + if (state.getFluidState() + .isEmpty()) + return Blocks.AIR.defaultBlockState(); + return state.getFluidState() + .createLegacyBlock(); + } + Block block = state.getBlock(); if (block instanceof CropsBlock) { CropsBlock crop = (CropsBlock) block; @@ -171,18 +194,18 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { } if (block == Blocks.SUGAR_CANE || block instanceof AbstractPlantBlock) { if (state.getFluidState() - .isEmpty()) + .isEmpty()) return Blocks.AIR.defaultBlockState(); return state.getFluidState() - .createLegacyBlock(); + .createLegacyBlock(); } if (state.getCollisionShape(world, pos) - .isEmpty() || block instanceof CocoaBlock) { + .isEmpty() || block instanceof CocoaBlock) { for (Property property : state.getProperties()) { if (!(property instanceof IntegerProperty)) continue; if (!property.getName() - .equals(BlockStateProperties.AGE_1.getName())) + .equals(BlockStateProperties.AGE_1.getName())) continue; return state.setValue((IntegerProperty) property, Integer.valueOf(0)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineModifiers.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineModifiers.java new file mode 100644 index 000000000..2a77de7b0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineModifiers.java @@ -0,0 +1,32 @@ +package com.simibubi.create.content.contraptions.components.flywheel.engine; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraftforge.registries.IRegistryDelegate; + +public class FurnaceEngineModifiers { + + public final static FurnaceEngineModifiers INSTANCE = new FurnaceEngineModifiers(); + + protected Map, Float> blockModifiers = new HashMap<>(); + + public void register(IRegistryDelegate block, float modifier) { + this.blockModifiers.put(block, modifier); + } + + public float getModifierOrDefault(BlockState state, float defaultValue) { + return blockModifiers.getOrDefault(state.getBlock().delegate, defaultValue); + } + + public float getModifier(BlockState state) { + return getModifierOrDefault(state, 1f); + } + + public static void register() { + INSTANCE.register(Blocks.BLAST_FURNACE.delegate, 2f); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineTileEntity.java index 22742c712..03f22efe0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/FurnaceEngineTileEntity.java @@ -25,7 +25,7 @@ public class FurnaceEngineTileEntity extends EngineTileEntity { if (!(state.getBlock() instanceof AbstractFurnaceBlock)) return; - float modifier = state.getBlock() == Blocks.BLAST_FURNACE ? 2 : 1; + float modifier = FurnaceEngineModifiers.INSTANCE.getModifier(state); boolean active = state.hasProperty(AbstractFurnaceBlock.LIT) && state.getValue(AbstractFurnaceBlock.LIT); float speed = active ? 16 * modifier : 0; float capacity = diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index b7b3400eb..08b834108 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -5,6 +5,7 @@ import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.material.MaterialManager; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -33,7 +34,11 @@ public abstract class MovementBehaviour { } public void dropItem(MovementContext context, ItemStack stack) { - ItemStack remainder = ItemHandlerHelper.insertItem(context.contraption.inventory, stack, false); + ItemStack remainder; + if (AllConfigs.SERVER.kinetics.moveItemsToStorage.get()) + remainder = ItemHandlerHelper.insertItem(context.contraption.inventory, stack, false); + else + remainder = stack; if (remainder.isEmpty()) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java index 87d73c00c..0d7bb5199 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java @@ -29,14 +29,14 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour { public static BehaviourType TYPE = new BehaviourType<>(); - enum UpdatePhase { + public enum UpdatePhase { WAIT_FOR_PUMPS, // Do not run Layer II logic while pumps could still be distributing pressure FLIP_FLOWS, // Do not cut any flows until all pipes had a chance to reverse them IDLE; // Operate normally } - Map interfaces; - UpdatePhase phase; + public Map interfaces; + public UpdatePhase phase; public FluidTransportBehaviour(SmartTileEntity te) { super(te); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java index f0b119fa7..47e344737 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -11,6 +11,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllFluids; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.BlockFace; @@ -214,6 +215,10 @@ public class OpenEndedPipe extends FlowSource { .scheduleTick(outputPos, Fluids.WATER, 1); return true; } + + if (!AllConfigs.SERVER.fluids.placeFluidSourceBlocks.get()) + return true; + world.setBlock(outputPos, fluid.getFluid() .defaultFluidState() .createLegacyBlock(), 3); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java index 240883516..3ef881ba0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java @@ -32,7 +32,7 @@ import net.minecraftforge.fml.DistExecutor; public class PipeConnection { - Direction side; + public Direction side; // Layer I Couple pressure; // [inbound, outward] diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java index 612b82201..814651f9d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -7,6 +7,7 @@ import java.util.Objects; import java.util.Set; import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; @@ -126,23 +127,25 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { int maxBlocks = maxBlocks(); boolean evaporate = world.dimensionType() .ultraWarm() && fluid.is(FluidTags.WATER); + boolean canPlaceSources = AllConfigs.SERVER.fluids.placeFluidSourceBlocks.get(); - if ((!fillInfinite() && infinite) || evaporate) { + if ((!fillInfinite() && infinite) || evaporate || !canPlaceSources) { FluidState fluidState = world.getFluidState(rootPos); boolean equivalentTo = fluidState.getType() .isSame(fluid); - if (!equivalentTo && !evaporate) + if (!equivalentTo && !evaporate && canPlaceSources) return false; if (simulate) return true; - playEffect(world, null, fluid, false); + playEffect(world, root, fluid, false); if (evaporate) { int i = root.getX(); int j = root.getY(); int k = root.getZ(); world.playSound(null, i, j, k, SoundEvents.FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); - } + } else if (!canPlaceSources) + AllTriggers.triggerForNearbyPlayers(AllTriggers.HOSE_PULLEY, world, tileEntity.getBlockPos(), 8); return true; } diff --git a/src/main/java/com/simibubi/create/foundation/config/CFluids.java b/src/main/java/com/simibubi/create/foundation/config/CFluids.java index af554e15b..40f98f3b6 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CFluids.java +++ b/src/main/java/com/simibubi/create/foundation/config/CFluids.java @@ -12,6 +12,8 @@ public class CFluids extends ConfigBase { public final ConfigBool fillInfinite = b(false, "fillInfinite", Comments.fillInfinite); public final ConfigInt hosePulleyRange = i(128, 1, "hosePulleyRange", Comments.blocks, Comments.hosePulleyRange); + public ConfigBool placeFluidSourceBlocks = b(true, "placeFluidSourceBlocks", Comments.placeFluidSourceBlocks); + @Override public String getName() { return "fluids"; @@ -30,6 +32,7 @@ public class CFluids extends ConfigBase { static String hosePulleyBlockThreshold = "The minimum amount of fluid blocks the hose pulley needs to find before deeming it an infinite source."; static String fillInfinite = "Whether hose pulleys should continue filling up above-threshold sources"; + static String placeFluidSourceBlocks = "Whether open-ended pipes and hose pulleys should be allowed to place fluid sources"; } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java index 0875a6a17..1f0e7013a 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java @@ -40,6 +40,9 @@ public class CKinetics extends ConfigBase { e(ContraptionMovementSetting.NO_PICKUP, "movableSpawners", Comments.spawnerMovement); public final ConfigEnum obsidianMovement = e(ContraptionMovementSetting.UNMOVABLE, "movableObsidian", Comments.obsidianMovement); + public ConfigBool moveItemsToStorage = b(true, "moveItemsToStorage", Comments.moveItemsToStorage); + public ConfigBool harvestPartiallyGrown = b(false, "harvestPartiallyGrown", Comments.harvestPartiallyGrown); + public ConfigBool harvesterReplants = b(true, "harvesterReplants", Comments.harvesterReplants); public final CStress stressValues = nested(1, CStress::new, Comments.stress); @@ -76,6 +79,10 @@ public class CKinetics extends ConfigBase { static String maxPistonPoles = "Maximum amount of extension poles behind a Mechanical Piston."; static String maxRopeLength = "Max length of rope available off a Rope Pulley."; static String maxCartCouplingLength = "Maximum allowed distance of two coupled minecarts."; + static String moveItemsToStorage = + "Whether items mined or harvested by contraptions should be placed in their mounted storage."; + static String harvestPartiallyGrown = "Whether harvesters should break crops that aren't fully grown."; + static String harvesterReplants = "Whether harvesters should replant crops after harvesting."; static String stats = "Configure speed/capacity levels for requirements and indicators."; static String rpm = "[in Revolutions per Minute]"; static String su = "[in Stress Units]"; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java new file mode 100644 index 000000000..b963a236c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.utility.worldWrappers; + +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.chunk.ChunkStatus; +import net.minecraft.world.chunk.listener.IChunkStatusListener; + +public class DummyStatusListener implements IChunkStatusListener { + + @Override + public void updateSpawnPos(ChunkPos p_219509_1_) {} + + @Override + public void onStatusChange(ChunkPos p_219508_1_, ChunkStatus p_219508_2_) {} + + @Override + public void stop() {} + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java index 6161cbfc4..8104de717 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java @@ -37,8 +37,10 @@ public class WrappedServerWorld extends ServerWorld { protected World world; public WrappedServerWorld(World world) { - // Replace null with world.getChunkProvider().chunkManager.progressListener ? We had null in 1.15 - super(world.getServer(), Util.backgroundExecutor(), getLevelSaveFromWorld(world), (IServerWorldInfo) world.getLevelData(), world.dimension(), world.dimensionType(), null, ((ServerChunkProvider) world.getChunkSource()).getGenerator(), world.isDebug(), world.getBiomeManager().biomeZoomSeed, Collections.EMPTY_LIST, false); //, world.field_25143); + super(world.getServer(), Util.backgroundExecutor(), getLevelSaveFromWorld(world), + (IServerWorldInfo) world.getLevelData(), world.dimension(), world.dimensionType(), + new DummyStatusListener(), ((ServerChunkProvider) world.getChunkSource()).getGenerator(), world.isDebug(), + world.getBiomeManager().biomeZoomSeed, Collections.emptyList(), false); this.world = world; }