From 46d3aa64c27adbeb0023f347a0cb4ca517017d8a Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:24:25 +0100 Subject: [PATCH 01/13] Change PylonDirectionBlock to use data-oriented pattern --- .../content/machines/cargo/CargoBuffer.java | 36 ++++-------------- .../machines/cargo/CargoExtractor.java | 38 +++++-------------- .../content/machines/cargo/CargoInserter.java | 38 +++++-------------- .../content/machines/simple/CoreDrill.java | 4 +- 4 files changed, 28 insertions(+), 88 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java index 81a61075..d2c46ba3 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java @@ -13,33 +13,25 @@ import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.logistics.LogisticSlotType; -import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.logistics.VirtualInventoryLogisticSlot; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.GuiItems; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import xyz.xenondevs.invui.gui.Gui; import xyz.xenondevs.invui.inventory.VirtualInventory; import java.util.List; -import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; - public class CargoBuffer extends PylonBlock implements PylonDirectionalBlock, PylonGuiBlock, PylonCargoBlock, PylonEntityHolderBlock { - private static final NamespacedKey FACE_KEY = baseKey("face"); - - private final BlockFace facing; private final VirtualInventory inventory = new VirtualInventory(1); public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT); @@ -87,16 +79,16 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { throw new IllegalArgumentException("Cargo buffers can only be placed by player"); } - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true); + setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true)); - addCargoLogisticGroup(facing, "input"); - addCargoLogisticGroup(facing.getOppositeFace(), "output"); + addCargoLogisticGroup(getFacing(), "input"); + addCargoLogisticGroup(getFacing().getOppositeFace(), "output"); setCargoTransferRate(transferRate); addEntity("main", new ItemDisplayBuilder() .itemStack(mainStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .scale(0.65) ) .build(block.getLocation().toCenterLocation()) @@ -105,7 +97,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { addEntity("side1", new ItemDisplayBuilder() .itemStack(side1Stack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .rotate(Math.PI / 2, Math.PI / 2, 0) .scale(0.5, 0.5, 0.7) ) @@ -115,7 +107,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { addEntity("side2", new ItemDisplayBuilder() .itemStack(side2Stack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .rotate(Math.PI / 2, Math.PI / 2, 0) .scale(0.7, 0.5, 0.5) ) @@ -125,7 +117,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { addEntity("input", new ItemDisplayBuilder() .itemStack(inputStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.15) .scale(0.4, 0.4, 0.4) ) @@ -135,7 +127,7 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { addEntity("output", new ItemDisplayBuilder() .itemStack(outputStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, -0.15) .scale(0.4, 0.4, 0.4) ) @@ -146,13 +138,6 @@ public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { @SuppressWarnings("unused") public CargoBuffer(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); - - facing = pdc.get(FACE_KEY, PylonSerializers.BLOCK_FACE); - } - - @Override - public void write(@NotNull PersistentDataContainer pdc) { - pdc.set(FACE_KEY, PylonSerializers.BLOCK_FACE, facing); } @Override @@ -164,11 +149,6 @@ public void write(@NotNull PersistentDataContainer pdc) { .build(); } - @Override - public @Nullable BlockFace getFacing() { - return facing; - } - @Override public void postInitialise() { createLogisticGroup("input", LogisticSlotType.INPUT, new VirtualInventoryLogisticSlot(inventory, 0)); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java index a3b3873c..b733eb1d 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java @@ -6,7 +6,6 @@ import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.content.cargo.CargoDuct; -import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.event.PylonCargoConnectEvent; @@ -20,7 +19,6 @@ import io.github.pylonmc.pylon.core.util.position.BlockPosition; import io.github.pylonmc.pylon.core.util.position.ChunkPosition; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; @@ -30,16 +28,10 @@ import java.util.*; -import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; - public class CargoExtractor extends PylonBlock implements PylonMultiblock, PylonDirectionalBlock, PylonCargoBlock, PylonEntityHolderBlock { - private static final NamespacedKey FACING_KEY = baseKey("facing"); - - private final BlockFace facing; - public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT); public final ItemStack mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) @@ -80,10 +72,10 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) } // TODO add a util function for this because ffs really - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace(); + setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace()); - addCargoLogisticGroup(facing.getOppositeFace(), "output"); - for (BlockFace face : PylonUtils.perpendicularImmediateFaces(facing)) { + addCargoLogisticGroup(getFacing().getOppositeFace(), "output"); + for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { addCargoLogisticGroup(face, "output"); } setCargoTransferRate(transferRate); @@ -91,7 +83,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("main", new ItemDisplayBuilder() .itemStack(mainStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.4) .scale(0.65, 0.65, 0.2) ) @@ -101,7 +93,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("output", new ItemDisplayBuilder() .itemStack(outputStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.3) .scale(0.4, 0.4, 0.05) ) @@ -111,7 +103,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("duct", new ItemDisplayBuilder() .itemStack(ductStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.0625) .scale(0.35, 0.35, 0.475) ) @@ -122,13 +114,6 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) @SuppressWarnings("unused") public CargoExtractor(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); - - facing = pdc.get(FACING_KEY, PylonSerializers.BLOCK_FACE); - } - - @Override - public void write(@NotNull PersistentDataContainer pdc) { - pdc.set(FACING_KEY, PylonSerializers.BLOCK_FACE, facing); } @Override @@ -150,11 +135,6 @@ public boolean isPartOfMultiblock(@NotNull Block otherBlock) { .equals(new BlockPosition(getTarget())); } - @Override - public @Nullable BlockFace getFacing() { - return facing; - } - @Override public @NotNull Map getLogisticGroups() { PylonLogisticBlock logisticBlock = getTargetLogisticBlock(); @@ -177,8 +157,8 @@ public void onDuctConnected(@NotNull PylonCargoConnectEvent event) { @Override public void onDuctDisconnected(@NotNull PylonCargoDisconnectEvent event) { // Allow connecting to all faces now that there are zero connections - List faces = PylonUtils.perpendicularImmediateFaces(facing); - faces.add(facing.getOppositeFace()); + List faces = PylonUtils.perpendicularImmediateFaces(getFacing()); + faces.add(getFacing().getOppositeFace()); for (BlockFace face : faces) { addCargoLogisticGroup(face, "output"); } @@ -190,7 +170,7 @@ public void onDuctDisconnected(@NotNull PylonCargoDisconnectEvent event) { } public @NotNull Block getTarget() { - return getBlock().getRelative(facing); + return getBlock().getRelative(getFacing()); } public @Nullable PylonLogisticBlock getTargetLogisticBlock() { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java index f3c23d06..480d4dec 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java @@ -6,7 +6,6 @@ import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.content.cargo.CargoDuct; -import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.event.PylonCargoConnectEvent; @@ -19,7 +18,6 @@ import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import io.github.pylonmc.pylon.core.util.position.ChunkPosition; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; @@ -29,16 +27,10 @@ import java.util.*; -import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; - public class CargoInserter extends PylonBlock implements PylonMultiblock, PylonDirectionalBlock, PylonCargoBlock, PylonEntityHolderBlock { - private static final NamespacedKey FACING_KEY = baseKey("facing"); - - private final BlockFace facing; - public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT); public final ItemStack mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) @@ -78,10 +70,10 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) throw new IllegalArgumentException("Cargo inserter can only be placed by player"); } - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace(); + setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace()); - addCargoLogisticGroup(facing.getOppositeFace(), "input"); - for (BlockFace face : PylonUtils.perpendicularImmediateFaces(facing)) { + addCargoLogisticGroup(getFacing().getOppositeFace(), "input"); + for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { addCargoLogisticGroup(face, "input"); } setCargoTransferRate(transferRate); @@ -89,7 +81,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("main", new ItemDisplayBuilder() .itemStack(mainStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.4) .scale(0.65, 0.65, 0.2) ) @@ -99,7 +91,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("input", new ItemDisplayBuilder() .itemStack(inputStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.3) .scale(0.4, 0.4, 0.05) ) @@ -109,7 +101,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("duct", new ItemDisplayBuilder() .itemStack(ductStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.0625) .scale(0.35, 0.35, 0.475) ) @@ -120,13 +112,6 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) @SuppressWarnings("unused") public CargoInserter(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); - - facing = pdc.get(FACING_KEY, PylonSerializers.BLOCK_FACE); - } - - @Override - public void write(@NotNull PersistentDataContainer pdc) { - pdc.set(FACING_KEY, PylonSerializers.BLOCK_FACE, facing); } @Override @@ -147,11 +132,6 @@ public boolean isPartOfMultiblock(@NotNull Block otherBlock) { return otherBlock.equals(getTarget()); } - @Override - public @Nullable BlockFace getFacing() { - return facing; - } - @Override public void onDuctConnected(@NotNull PylonCargoConnectEvent event) { // Remove all faces that aren't to the connected block - this will make sure only @@ -166,8 +146,8 @@ public void onDuctConnected(@NotNull PylonCargoConnectEvent event) { @Override public void onDuctDisconnected(@NotNull PylonCargoDisconnectEvent event) { // Allow connecting to all faces now that there are zero connections - List faces = PylonUtils.perpendicularImmediateFaces(facing); - faces.add(facing.getOppositeFace()); + List faces = PylonUtils.perpendicularImmediateFaces(getFacing()); + faces.add(getFacing().getOppositeFace()); for (BlockFace face : faces) { addCargoLogisticGroup(face, "output"); } @@ -187,7 +167,7 @@ public void onDuctDisconnected(@NotNull PylonCargoDisconnectEvent event) { } public @NotNull Block getTarget() { - return getBlock().getRelative(facing); + return getBlock().getRelative(getFacing()); } public @Nullable PylonLogisticBlock getTargetLogisticBlock() { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java index c6a5e712..0bbeab6a 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java @@ -60,9 +60,9 @@ public Item(@NotNull ItemStack stack) { protected CoreDrill(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); if (context instanceof BlockCreateContext.PlayerPlace playerPlace) { - setFacing(TransformUtil.yawToFace(playerPlace.getPlayer().getYaw())); + setDirection(TransformUtil.yawToFace(playerPlace.getPlayer().getYaw())); } else { - setFacing(BlockFace.NORTH); + setDirection(BlockFace.NORTH); } addEntity("drill", new ItemDisplayBuilder() .itemStack(ItemStackBuilder.of(drillMaterial) From 5827d126b15ea39df9a9aa01ee9f78e959b0fcc6 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:00:05 +0100 Subject: [PATCH 02/13] brrrrrrrrr --- .../components/EnrichedNetherrack.java | 2 +- .../machines/diesel/DieselBrickMolder.java | 2 +- .../machines/diesel/DieselGrindstone.java | 2 +- .../machines/diesel/DieselPipeBender.java | 2 +- .../content/machines/diesel/DieselPress.java | 24 +++++++++---------- .../machines/diesel/DieselTableSaw.java | 2 +- .../machines/fluid/CreativeFluidSource.java | 2 +- .../content/machines/fluid/FluidDrainer.java | 3 +-- .../content/machines/fluid/FluidFilter.java | 13 +++++----- .../content/machines/fluid/FluidMeter.java | 5 ++-- .../content/machines/fluid/FluidPlacer.java | 2 +- .../content/machines/fluid/FluidStrainer.java | 6 ++--- .../content/machines/fluid/FluidValve.java | 8 +++---- .../content/machines/fluid/FluidVoider.java | 5 ++-- .../content/machines/fluid/Sprinkler.java | 7 +++--- .../content/machines/fluid/WaterPump.java | 11 +++------ .../CoalFiredPurificationTower.java | 7 +----- .../hydraulics/HydraulicCoreDrill.java | 2 +- .../hydraulics/HydraulicExcavator.java | 3 +-- .../machines/hydraulics/HydraulicFarmer.java | 8 +------ .../hydraulics/HydraulicGrindstoneTurner.java | 2 +- .../hydraulics/HydraulicHammerHead.java | 4 ++-- .../hydraulics/HydraulicMixingAttachment.java | 4 ++-- .../hydraulics/HydraulicPipeBender.java | 2 +- .../hydraulics/HydraulicPressPiston.java | 2 +- .../hydraulics/HydraulicRefuelingStation.java | 4 ++-- .../hydraulics/HydraulicTableSaw.java | 2 +- .../hydraulics/SolarPurificationTower.java | 10 ++------ .../content/machines/simple/CoreDrill.java | 8 ++++--- .../content/machines/simple/MagicAltar.java | 2 +- .../content/machines/simple/VacuumHopper.java | 4 +--- .../content/machines/smelting/Bloomery.java | 2 +- .../machines/smelting/BronzeAnvil.java | 2 +- .../content/machines/smelting/PitKiln.java | 4 ++-- .../machines/smelting/SmelteryBurner.java | 4 ++-- .../machines/smelting/SmelteryCaster.java | 3 +-- .../machines/smelting/SmelteryController.java | 12 +++++----- .../machines/smelting/SmelteryHopper.java | 2 +- .../machines/smelting/SmelteryInputHatch.java | 5 ++-- .../smelting/SmelteryOutputHatch.java | 5 ++-- 40 files changed, 90 insertions(+), 109 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java b/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java index 3b48c82d..b912d0e3 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java @@ -28,7 +28,7 @@ public EnrichedNetherrack(@NotNull Block block, @NotNull PersistentDataContainer super(block, pdc); } - public void tick(double deltaSeconds) { + public void tick() { if (getBlock().getRelative(BlockFace.UP).getType() == Material.FIRE) { new ParticleBuilder(Particle.LAVA) .location(getBlock().getLocation().toCenterLocation()) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java index 04615889..7d45495b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java @@ -154,7 +154,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java index 27417f0e..9bca94ff 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java @@ -150,7 +150,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java index d7a0b0ba..73482e6a 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java @@ -169,7 +169,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java index 4a4e2735..e7585549 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java @@ -5,11 +5,7 @@ import io.github.pylonmc.pylon.base.recipes.PressRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonLogisticBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; @@ -44,8 +40,13 @@ import java.util.List; -public class DieselPress extends PylonBlock - implements PylonGuiBlock, PylonFluidBufferBlock, PylonTickingBlock, PylonLogisticBlock, PylonRecipeProcessor { +public class DieselPress extends PylonBlock implements + PylonGuiBlock, + PylonDirectionalBlock, + PylonFluidBufferBlock, + PylonTickingBlock, + PylonLogisticBlock, + PylonRecipeProcessor { public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); @@ -89,11 +90,10 @@ public DieselPress(@NotNull Block block, @NotNull BlockCreateContext context) { setTickInterval(tickInterval); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.55F); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false, 0.55F); - BlockFace facing; if (context instanceof BlockCreateContext.PlayerPlace playerPlaceContext) { - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, false); + setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, false)); } else { - facing = BlockFace.NORTH; + setFacing(BlockFace.NORTH); } addEntity("chimney", new ItemDisplayBuilder() .itemStack(ItemStackBuilder.of(Material.CYAN_TERRACOTTA) @@ -101,7 +101,7 @@ public DieselPress(@NotNull Block block, @NotNull BlockCreateContext context) { .build() ) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0.37499, -0.15, 0.0) .scale(0.15, 1.7, 0.15)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -157,7 +157,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java index 29329707..694cf75e 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java @@ -147,7 +147,7 @@ public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreak } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java index c422e6cb..6af77aad 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java @@ -51,7 +51,7 @@ public void write(@NotNull PersistentDataContainer pdc) { } @Override - public @NotNull Map getSuppliedFluids(double deltaSeconds) { + public @NotNull Map getSuppliedFluids() { return fluid == null ? Map.of() : Map.of(fluid, 1.0e9); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java index 5d08d04a..984ffa7f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java @@ -2,7 +2,6 @@ import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; @@ -73,7 +72,7 @@ public FluidDrainer(@NotNull Block block, @NotNull PersistentDataContainer pdc) } @Override - public void tick(double deltaSeconds) { + public void tick() { if (fluidSpaceRemaining(fluid) >= 1000.0 && drainBlock.getType() == material && drainBlock.getBlockData() instanceof Levelled levelled diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java index 2ad6be3b..e4adad96 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java @@ -3,7 +3,6 @@ import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.content.machines.fluid.gui.FluidSelector; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidTank; import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; @@ -134,7 +133,7 @@ public boolean isAllowedFluid(@NotNull PylonFluid fluid) { } @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { + public double fluidAmountRequested(@NotNull PylonFluid fluid) { if (fluid != this.fluid) { return 0.0; } @@ -145,10 +144,12 @@ public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSecond VirtualFluidPoint input = getFluidPointDisplayOrThrow(FluidPointType.INPUT).getPoint(); double outputFluidPerSecond = FluidManager.getFluidPerSecond(output.getSegment()); double inputFluidPerSecond = FluidManager.getFluidPerSecond(input.getSegment()); - return Math.max(0.0, Math.min(outputFluidPerSecond, inputFluidPerSecond) - * PylonConfig.getFluidTickInterval() - * deltaSeconds - - getFluidAmount() + return Math.max( + 0.0, + Math.min( + outputFluidPerSecond, + inputFluidPerSecond + ) * PylonConfig.fluidTickInterval / 20 - getFluidAmount() ); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java index 289c4e37..34f42e50 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java @@ -3,6 +3,7 @@ import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.TextDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; @@ -56,8 +57,8 @@ public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) { } @Override - public void tick(double deltaSeconds) { - Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / deltaSeconds)).asComponent(); + public void tick() { + Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / (20 * PylonConfig.fluidTickInterval))).asComponent(); TextDisplay northDisplay = getHeldEntity(TextDisplay.class, "flow_rate_north"); if (northDisplay != null) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java index 456cd4b9..9f31d5ba 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java @@ -74,7 +74,7 @@ public FluidPlacer(@NotNull Block block, @NotNull PersistentDataContainer pdc) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (fluidAmount(fluid) >= 1000.0 && placeBlock.getType().isAir()) { removeFluid(fluid, 1000.0); if (placeBlock.getWorld().getEnvironment() == World.Environment.NETHER && material == Material.WATER) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java index d6e57d54..d4a5a70f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java @@ -77,14 +77,14 @@ public void write(@NotNull PersistentDataContainer pdc) { } @Override - public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids(double deltaSeconds) { + public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids() { return currentRecipe == null ? Map.of() : Map.of(currentRecipe.outputFluid(), buffer); } @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { + public double fluidAmountRequested(@NotNull PylonFluid fluid) { if (StrainingRecipe.RECIPE_TYPE.stream().anyMatch(recipe -> recipe.input().contains(fluid))) { return bufferSize - buffer; } else { @@ -151,7 +151,7 @@ public Component getGuiTitle() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (currentRecipe != null && passedFluid >= currentRecipe.input().amountMillibuckets()) { inventory.addItem(null, currentRecipe.outputItem().clone()); passedFluid -= currentRecipe.input().amountMillibuckets(); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java index 0a2ddee9..d7dbc8d9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java @@ -105,19 +105,19 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { + public double fluidAmountRequested(@NotNull PylonFluid fluid) { if (!enabled) { return 0.0; } - return PylonFluidTank.super.fluidAmountRequested(fluid, deltaSeconds); + return PylonFluidTank.super.fluidAmountRequested(fluid); } @Override - public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids(double deltaSeconds) { + public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids() { if (!enabled) { return Map.of(); } - return PylonFluidTank.super.getSuppliedFluids(deltaSeconds); + return PylonFluidTank.super.getSuppliedFluids(); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java index b74d5b96..da6f2aed 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java @@ -3,6 +3,7 @@ import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; @@ -68,8 +69,8 @@ public FluidVoider(@NotNull Block block, @NotNull PersistentDataContainer pdc) { } @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { - return voidRate * deltaSeconds; + public double fluidAmountRequested(@NotNull PylonFluid fluid) { + return voidRate * PylonConfig.fluidTickInterval / 20; } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java index 816c140d..4bba0e30 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java @@ -11,6 +11,7 @@ import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.Config; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.event.PrePylonBlockPlaceEvent; @@ -73,10 +74,10 @@ public void onFlowerPotManipulated(PlayerFlowerPotManipulateEvent event) { } @Override - public void tick(double deltaSeconds) { - if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * deltaSeconds) { + public void tick() { + if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * PylonConfig.fluidTickInterval) { WateringCan.water(getBlock(), SETTINGS); - removeFluid(BaseFluids.WATER, WATER_PER_SECOND * deltaSeconds); + removeFluid(BaseFluids.WATER, WATER_PER_SECOND * PylonConfig.fluidTickInterval); } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java index 55ba571a..91b9d3b6 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java @@ -4,6 +4,7 @@ import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; @@ -16,7 +17,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; @@ -54,17 +54,12 @@ public WaterPump(@NotNull Block block, @NotNull PersistentDataContainer pdc) { } @Override - public @NotNull Map getSuppliedFluids(double deltaSeconds) { + public @NotNull Map getSuppliedFluids() { return getBlock().getRelative(BlockFace.DOWN).getType() == Material.WATER - ? Map.of(BaseFluids.WATER, waterPerSecond * deltaSeconds) + ? Map.of(BaseFluids.WATER, waterPerSecond * PylonConfig.fluidTickInterval / 20.0) : Map.of() ; } @Override public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) {} - - @Override - public @Nullable BlockFace getFacing() { - return null; - } } \ No newline at end of file diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java index e413efa3..00761a22 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java @@ -134,7 +134,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded()) { return; } @@ -187,11 +187,6 @@ && fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID) > 1.0e-3 && fluidSpaceRemaining(BaseFluids.HYDRAULIC_FLUID) > 1.0e-3; } - @Override - public @Nullable BlockFace getFacing() { - return PylonFluidBufferBlock.super.getFacing(); - } - @Override public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreakContext context) { PylonFluidBufferBlock.super.onBreak(drops, context); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java index e4c5c3e9..df6bc9e6 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java @@ -100,7 +100,7 @@ public HydraulicCoreDrill(@NotNull Block block, @NotNull PersistentDataContainer } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded() || isProcessing()) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java index d4b0db44..69c71996 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java @@ -3,7 +3,6 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; @@ -106,7 +105,7 @@ public void write(@NotNull PersistentDataContainer pdc) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!working) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java index 52903dc4..2a70fb7e 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java @@ -26,7 +26,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -105,7 +104,7 @@ public HydraulicFarmer(@NotNull Block block, @NotNull PersistentDataContainer pd @Override - public void tick(double deltaSeconds) { + public void tick() { double hydraulicFluidUsed = HYDRAULIC_FLUID_USAGE * getTickInterval() / 20.0; if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidUsed @@ -269,9 +268,4 @@ private List getItemsFromChest() { } return stacks; } - - @Override - public @Nullable BlockFace getFacing() { - return PylonFluidBufferBlock.super.getFacing(); - } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java index 080c4834..d36f62ea 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java @@ -80,7 +80,7 @@ public boolean isPartOfMultiblock(@NotNull Block otherBlock) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded()) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java index 559280e6..150b92f5 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java @@ -144,8 +144,8 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { - cooldown = Math.max(0, cooldown - deltaSeconds); + public void tick() { + cooldown = Math.max(0, cooldown - getTickInterval()); if (cooldown > 1.0e-5 || hammer == null) { return; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java index b21250eb..8f04f014 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java @@ -122,12 +122,12 @@ public boolean isPartOfMultiblock(@NotNull Block otherBlock) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded()) { return; } - cooldownTimeRemaining = Math.max(0, cooldownTimeRemaining - deltaSeconds); + cooldownTimeRemaining = Math.max(0, cooldownTimeRemaining - getTickInterval() / 20.0); if (cooldownTimeRemaining > 1.0e-5) { return; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java index 8e546862..e748778e 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java @@ -159,7 +159,7 @@ public void onRecipeFinished(@NotNull PipeBendingRecipe recipe) { } @Override - public void tick(double deltaSeconds) { + public void tick() { progressRecipe(TICK_INTERVAL); if (isProcessingRecipe()) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java index 4898a8a2..330c7185 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java @@ -95,7 +95,7 @@ public boolean isPartOfMultiblock(@NotNull Block otherBlock) { return otherBlock == getBlock().getRelative(BlockFace.DOWN, 2); } - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded()) { return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java index fc8a3c21..9e4af47f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java @@ -130,7 +130,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids(double deltaSeconds) { + public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids() { HydraulicRefuelable refuelable = getHeldRefuelableItem(); if (refuelable == null) { return Map.of(); @@ -139,7 +139,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { + public double fluidAmountRequested(@NotNull PylonFluid fluid) { if (!fluid.equals(BaseFluids.HYDRAULIC_FLUID)) { return 0.0; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java index 1b91261e..58db27fd 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java @@ -121,7 +121,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { + public void tick() { progressRecipe(TICK_INTERVAL); if (isProcessingRecipe()) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java index 09d9e3e2..84906dfd 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java @@ -17,7 +17,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3i; import java.util.HashMap; @@ -91,7 +90,7 @@ public SolarPurificationTower(@NotNull Block block, @NotNull PersistentDataConta } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded() || !getBlock().getWorld().isDayTime()) { return; } @@ -99,7 +98,7 @@ public void tick(double deltaSeconds) { double multiplier = getBlock().getWorld().isClearWeather() ? 1.0 : rainSpeedFraction; double toPurify = Math.min( // maximum amount of dirty hydraulic fluid that can be purified this tick - deltaSeconds * purificationSpeed * multiplier, + purificationSpeed * multiplier * getTickInterval() / 20.0, Math.min( // amount of dirty hydraulic fluid available fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), @@ -111,9 +110,4 @@ public void tick(double deltaSeconds) { removeFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, toPurify); addFluid(BaseFluids.HYDRAULIC_FLUID, toPurify * purificationEfficiency); } - - @Override - public @Nullable BlockFace getFacing() { - return PylonFluidBufferBlock.super.getFacing(); - } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java index 0bbeab6a..92d56b32 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java @@ -4,6 +4,7 @@ import io.github.pylonmc.pylon.base.PylonBase; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonProcessor; import io.github.pylonmc.pylon.core.block.base.PylonSimpleMultiblock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; @@ -30,7 +31,7 @@ import java.util.List; -public abstract class CoreDrill extends PylonBlock implements PylonSimpleMultiblock, PylonProcessor { +public abstract class CoreDrill extends PylonBlock implements PylonSimpleMultiblock, PylonDirectionalBlock, PylonProcessor { public static class Item extends PylonItem { @@ -60,10 +61,11 @@ public Item(@NotNull ItemStack stack) { protected CoreDrill(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); if (context instanceof BlockCreateContext.PlayerPlace playerPlace) { - setDirection(TransformUtil.yawToFace(playerPlace.getPlayer().getYaw())); + setFacing(TransformUtil.yawToFace(playerPlace.getPlayer().getYaw())); } else { - setDirection(BlockFace.NORTH); + setFacing(BlockFace.NORTH); } + setMultiblockDirection(getFacing()); addEntity("drill", new ItemDisplayBuilder() .itemStack(ItemStackBuilder.of(drillMaterial) .addCustomModelDataString(getKey() + ":drill") diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java index 605ca60e..ecde780a 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java @@ -131,7 +131,7 @@ public void onInteract(PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { + public void tick() { progressRecipe(tickInterval); if (!isProcessingRecipe()) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/VacuumHopper.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/VacuumHopper.java index 53a6afdd..c2c0c567 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/VacuumHopper.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/VacuumHopper.java @@ -10,7 +10,6 @@ import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; -import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.Hopper; @@ -21,7 +20,6 @@ import java.util.HashMap; import java.util.List; -import java.util.Map; public class VacuumHopper extends PylonBlock implements PylonTickingBlock, PylonBreakHandler { @@ -69,7 +67,7 @@ public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreak } @Override - public void tick(double deltaSeconds) { + public void tick() { Hopper hopper = (Hopper) getBlock().getState(); if (!((org.bukkit.block.data.type.Hopper) getBlock().getBlockData()).isEnabled()) { return; // don't vacuum if powered diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/Bloomery.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/Bloomery.java index 3e0d1b76..4c9fc5be 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/Bloomery.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/Bloomery.java @@ -98,7 +98,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { + public void tick() { ItemDisplay itemDisplay = getItemDisplay(); ItemStack stack = itemDisplay.getItemStack(); if (stack.getType().isAir()) return; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/BronzeAnvil.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/BronzeAnvil.java index 08b5f7d4..ab69c441 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/BronzeAnvil.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/BronzeAnvil.java @@ -168,7 +168,7 @@ private void onLeftClick(@NotNull PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (ThreadLocalRandom.current().nextFloat() > COOL_CHANCE) return; ItemDisplay itemDisplay = getItemDisplay(); if (!(PylonItem.fromStack(itemDisplay.getItemStack()) instanceof IronBloom bloom)) return; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/PitKiln.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/PitKiln.java index ae4ed896..374b1137 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/PitKiln.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/PitKiln.java @@ -165,7 +165,7 @@ public void addItem(ItemStack item, boolean directRemoval) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded()) { if (processingTime != null) { processingTime = null; @@ -178,7 +178,7 @@ public void tick(double deltaSeconds) { } if (processingTime == null) return; - processingTime -= deltaSeconds; + processingTime -= getTickInterval() / 20.0; if (processingTime > 0) return; processingTime = null; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java index 67f873e0..39d08759 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java @@ -101,7 +101,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { SmelteryController controller = getController(); if (controller == null || !controller.isRunning()) { return; @@ -110,7 +110,7 @@ public void tick(double deltaSeconds) { progressProcess(getTickInterval()); if (fuel != null) { - controller.heatAsymptotically(deltaSeconds, fuel.temperature); + controller.heatAsymptotically(getTickInterval() / 20.0, fuel.temperature); return; } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java index 8ad54b98..9328275e 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java @@ -1,6 +1,5 @@ package io.github.pylonmc.pylon.base.content.machines.smelting; -import io.github.pylonmc.pylon.base.PylonBase; import io.github.pylonmc.pylon.base.recipes.CastingRecipe; import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; @@ -136,7 +135,7 @@ private static TranslatableComponent casterKey(@NotNull String subkey, @NotNull } @Override - public void tick(double deltaSeconds) { + public void tick() { SmelteryController controller = getController(); if (controller == null) { bottomFluid = null; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryController.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryController.java index dfeb09de..5f6837b9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryController.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryController.java @@ -513,7 +513,7 @@ private void updateFluidDisplay() { } // - private void performRecipes(double deltaSeconds) { + private void performRecipes() { if (fluids.isEmpty()) return; recipeLoop: for (SmelteryRecipe recipe : SmelteryRecipe.RECIPE_TYPE) { @@ -524,7 +524,7 @@ private void performRecipes(double deltaSeconds) { } double highestFluidAmount = getFluidAmount(recipe.getHighestFluid()); - double consumptionRatio = highestFluidAmount / (deltaSeconds * FLUID_REACTION_PER_SECOND); + double consumptionRatio = highestFluidAmount / (FLUID_REACTION_PER_SECOND * getTickInterval() / 20.0); double currentTemperature = temperature; for (var entry : recipe.getFluidInputs().entrySet()) { PylonFluid fluid = entry.getKey(); @@ -541,13 +541,13 @@ private void performRecipes(double deltaSeconds) { } @Override - public void tick(double deltaSeconds) { - cumulativeSeconds += deltaSeconds; + public void tick() { + cumulativeSeconds += getTickInterval() / 20.0; if (isFormedAndFullyLoaded()) { if (running) { - performRecipes(deltaSeconds); + performRecipes(); } - temperature -= (temperature - ROOM_TEMPERATURE) * COOLING_FACTOR * deltaSeconds; + temperature -= (temperature - ROOM_TEMPERATURE) * COOLING_FACTOR * getTickInterval() / 20.0; heaters = 0; updateFluidDisplay(); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java index 63ccd180..f82b750f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java @@ -47,7 +47,7 @@ public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreak } @Override - public void tick(double deltaSeconds) { + public void tick() { SmelteryController controller = getController(); if (controller == null) return; Hopper hopper = (Hopper) getBlock().getState(false); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java index 49585a98..76b8485d 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java @@ -2,6 +2,7 @@ import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; @@ -26,10 +27,10 @@ public SmelteryInputHatch(@NotNull Block block, @NotNull PersistentDataContainer } @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { + public double fluidAmountRequested(@NotNull PylonFluid fluid) { SmelteryController controller = getController(); if (controller == null || !fluid.hasTag(FluidTemperature.class)) return 0.0; - return Math.min(controller.getCapacity() - controller.getTotalFluid(), flowRate * deltaSeconds); + return Math.min(controller.getCapacity() - controller.getTotalFluid(), flowRate * PylonConfig.fluidTickInterval / 20); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java index 057a1c7b..57b7b087 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java @@ -2,6 +2,7 @@ import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; @@ -29,14 +30,14 @@ public SmelteryOutputHatch(@NotNull Block block, @NotNull PersistentDataContaine } @Override - public @NotNull Map getSuppliedFluids(double deltaSeconds) { + public @NotNull Map getSuppliedFluids() { SmelteryController controller = getController(); if (controller == null) return Map.of(); Pair supplied = controller.getBottomFluid(); return supplied == null ? Map.of() - : Map.of(supplied.getFirst(), Math.min(supplied.getSecond(), flowRate * deltaSeconds)); + : Map.of(supplied.getFirst(), Math.min(supplied.getSecond(), flowRate * PylonConfig.fluidTickInterval/ 20.0)); } @Override From 6166d9e354574529d0d5286078a60620d7fb644d Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:48:16 +0100 Subject: [PATCH 03/13] fix core drill buffoonery --- .../pylonmc/pylon/base/content/machines/simple/CoreDrill.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java index 92d56b32..2de924e9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java @@ -121,7 +121,7 @@ public void cycle() { .subtract(0, 0.3, 0) ) .spawn(); - progressProcess(rotationDuration); + progressProcess(rotationDuration / 4); }, (long) ((i + j/4.0) * rotationDuration)); } } From b8aad96ab2532afc8e5aa26c9f520079068f4281 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:48:22 +0100 Subject: [PATCH 04/13] fix build --- .../base/content/machines/fluid/PortableFluidTank.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java index 46428896..658c1985 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java @@ -3,7 +3,6 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.PylonBase; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidTank; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; @@ -281,9 +280,4 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } } } - - @Override - public @Nullable BlockFace getFacing() { - return null; - } } From 728fd256c40968087ea0199dde4bbf8a16392197 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Sat, 20 Dec 2025 08:09:53 +0100 Subject: [PATCH 05/13] idra's little fixes --- .../github/pylonmc/pylon/base/BaseBlocks.java | 6 +- .../github/pylonmc/pylon/base/BaseItems.java | 17 +- .../base/content/building/Immobilizer.java | 18 +- .../pylon/base/content/building/Pedestal.java | 4 +- .../combat/ReactivatedWitherSkull.java | 12 +- ...dNetherrack.java => EnrichedSoulSoil.java} | 7 +- .../content/machines/cargo/CargoBuffer.java | 33 ++-- .../machines/cargo/CargoExtractor.java | 27 +-- .../content/machines/cargo/CargoInserter.java | 21 +-- .../machines/diesel/DieselBrickMolder.java | 54 +++--- .../machines/diesel/DieselGrindstone.java | 48 ++--- .../machines/diesel/DieselPipeBender.java | 57 +++--- .../content/machines/diesel/DieselPress.java | 37 ++-- .../machines/diesel/DieselTableSaw.java | 42 +++-- .../machines/fluid/CreativeFluidSource.java | 65 ++++++- .../content/machines/fluid/FluidDrainer.java | 34 +++- .../content/machines/fluid/FluidFilter.java | 73 +++----- .../content/machines/fluid/FluidMeter.java | 24 +-- .../content/machines/fluid/FluidPlacer.java | 41 +++-- .../content/machines/fluid/FluidStrainer.java | 170 +++++++++--------- .../content/machines/fluid/FluidTank.java | 50 +++--- .../machines/fluid/FluidTankCasing.java | 26 +-- .../content/machines/fluid/FluidValve.java | 69 +++++-- .../machines/fluid/PortableFluidTank.java | 35 ++-- .../content/machines/fluid/Sprinkler.java | 37 +++- .../content/machines/fluid/WaterPump.java | 6 +- .../machines/fluid/gui/FluidSelector.java | 2 +- .../CoalFiredPurificationTower.java | 140 ++++++++++----- .../hydraulics/HydraulicCoreDrill.java | 19 +- .../hydraulics/HydraulicCoreDrillHatch.java | 8 + .../HydraulicCoreDrillInputHatch.java | 25 ++- .../HydraulicCoreDrillOutputHatch.java | 25 ++- .../hydraulics/HydraulicExcavator.java | 90 +++++++--- .../machines/hydraulics/HydraulicFarmer.java | 69 +++++-- .../hydraulics/HydraulicGrindstoneTurner.java | 77 ++++---- .../hydraulics/HydraulicHammerHead.java | 88 +++++---- .../hydraulics/HydraulicMixingAttachment.java | 129 ++++++------- .../hydraulics/HydraulicPipeBender.java | 106 ++++++----- .../hydraulics/HydraulicPressPiston.java | 86 ++++----- .../hydraulics/HydraulicRefuelingStation.java | 7 +- .../hydraulics/HydraulicTableSaw.java | 91 ++++++---- .../hydraulics/SolarPurificationTower.java | 41 ++++- .../content/machines/simple/CoreDrill.java | 22 +-- .../content/machines/simple/Grindstone.java | 20 +-- .../machines/simple/GrindstoneHandle.java | 2 +- .../content/machines/simple/MagicAltar.java | 14 +- .../content/machines/simple/MixingPot.java | 112 ++++++------ .../base/content/machines/simple/Press.java | 97 +++++----- .../machines/smelting/SmelteryBurner.java | 5 +- .../machines/smelting/SmelteryCaster.java | 7 - .../machines/smelting/SmelteryHopper.java | 6 - .../base/content/resources/RefractoryMix.java | 1 - .../pylon/base/content/tools/Hammer.java | 66 +++---- .../base/content/tools/HydraulicCannon.java | 7 + .../pylon/base/recipes/StrainingRecipe.java | 13 +- .../pylonmc/pylon/base/util/BaseUtils.java | 19 +- src/main/resources/lang/en.yml | 135 ++++++++------ .../coal_fired_purification_tower.yml | 6 +- src/main/resources/settings/fluid_filter.yml | 2 +- src/main/resources/settings/fluid_meter.yml | 3 +- .../resources/settings/fluid_strainer.yml | 3 +- src/main/resources/settings/fluid_valve.yml | 1 + .../settings/hydraulic_excavator.yml | 2 +- .../resources/settings/hydraulic_farmer.yml | 3 +- .../settings/hydraulic_grindstone_turner.yml | 2 +- .../settings/hydraulic_hammer_head.yml | 3 +- .../settings/hydraulic_mixing_attachment.yml | 1 + .../settings/hydraulic_pipe_bender.yml | 2 +- .../settings/hydraulic_press_piston.yml | 3 +- .../settings/hydraulic_table_saw.yml | 2 +- .../resources/settings/manual_core_drill.yml | 2 +- .../settings/solar_purification_tower_1.yml | 2 +- .../settings/solar_purification_tower_2.yml | 2 +- .../settings/solar_purification_tower_3.yml | 2 +- .../settings/solar_purification_tower_4.yml | 2 +- .../settings/solar_purification_tower_5.yml | 2 +- src/main/resources/settings/sprinkler.yml | 1 + 77 files changed, 1478 insertions(+), 1110 deletions(-) rename src/main/java/io/github/pylonmc/pylon/base/content/components/{EnrichedNetherrack.java => EnrichedSoulSoil.java} (80%) create mode 100644 src/main/resources/settings/fluid_valve.yml diff --git a/src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java b/src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java index a39789f9..6fb818b7 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java +++ b/src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java @@ -4,7 +4,7 @@ import io.github.pylonmc.pylon.base.content.building.ExplosiveTarget; import io.github.pylonmc.pylon.base.content.building.Immobilizer; import io.github.pylonmc.pylon.base.content.building.Pedestal; -import io.github.pylonmc.pylon.base.content.components.EnrichedNetherrack; +import io.github.pylonmc.pylon.base.content.components.EnrichedSoulSoil; import io.github.pylonmc.pylon.base.content.machines.cargo.CargoExtractor; import io.github.pylonmc.pylon.base.content.machines.cargo.CargoInserter; import io.github.pylonmc.pylon.base.content.machines.diesel.DieselBrickMolder; @@ -15,6 +15,8 @@ import io.github.pylonmc.pylon.base.content.machines.diesel.DieselTableSaw; import io.github.pylonmc.pylon.base.content.machines.fluid.*; import io.github.pylonmc.pylon.base.content.machines.hydraulics.*; +import io.github.pylonmc.pylon.base.content.machines.hydraulics.CoalFiredPurificationTower; +import io.github.pylonmc.pylon.base.content.machines.hydraulics.SolarPurificationTower; import io.github.pylonmc.pylon.base.content.machines.simple.*; import io.github.pylonmc.pylon.base.content.machines.smelting.*; import io.github.pylonmc.pylon.base.content.resources.RefractoryMix; @@ -41,7 +43,7 @@ public static void initialize() { PylonBlock.register(BaseKeys.MAGIC_ALTAR, Material.SMOOTH_STONE_SLAB, MagicAltar.class); PylonBlock.register(BaseKeys.GRINDSTONE, Material.SMOOTH_STONE_SLAB, Grindstone.class); PylonBlock.register(BaseKeys.GRINDSTONE_HANDLE, Material.OAK_FENCE, GrindstoneHandle.class); - PylonBlock.register(BaseKeys.ENRICHED_SOUL_SOIL, Material.SOUL_SOIL, EnrichedNetherrack.class); + PylonBlock.register(BaseKeys.ENRICHED_SOUL_SOIL, Material.SOUL_SOIL, EnrichedSoulSoil.class); PylonBlock.register(BaseKeys.MIXING_POT, Material.CAULDRON, MixingPot.class); PylonBlock.register(BaseKeys.IGNEOUS_COMPOSITE, Material.OBSIDIAN, PylonBlock.class); PylonBlock.register(BaseKeys.PORTABLE_FLUID_TANK_WOOD, Material.BROWN_STAINED_GLASS, PortableFluidTank.class); diff --git a/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java b/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java index d3b02cb0..de0f562b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java +++ b/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java @@ -18,10 +18,9 @@ import io.github.pylonmc.pylon.base.content.machines.diesel.DieselTableSaw; import io.github.pylonmc.pylon.base.content.machines.fluid.*; import io.github.pylonmc.pylon.base.content.machines.hydraulics.*; -import io.github.pylonmc.pylon.base.content.machines.simple.CoreDrill; -import io.github.pylonmc.pylon.base.content.machines.simple.ImprovedManualCoreDrill; -import io.github.pylonmc.pylon.base.content.machines.simple.Press; -import io.github.pylonmc.pylon.base.content.machines.simple.VacuumHopper; +import io.github.pylonmc.pylon.base.content.machines.hydraulics.CoalFiredPurificationTower; +import io.github.pylonmc.pylon.base.content.machines.hydraulics.SolarPurificationTower; +import io.github.pylonmc.pylon.base.content.machines.simple.*; import io.github.pylonmc.pylon.base.content.machines.smelting.PitKiln; import io.github.pylonmc.pylon.base.content.resources.IronBloom; import io.github.pylonmc.pylon.base.content.science.Loupe; @@ -755,7 +754,7 @@ private BaseItems() { public static final ItemStack MIXING_POT = ItemStackBuilder.pylon(Material.CAULDRON, BaseKeys.MIXING_POT) .build(); static { - PylonItem.register(PylonItem.class, MIXING_POT, BaseKeys.MIXING_POT); + PylonItem.register(MixingPot.MixingPotItem.class, MIXING_POT, BaseKeys.MIXING_POT); BasePages.SIMPLE_MACHINES.addItem(MIXING_POT); } @@ -1184,7 +1183,7 @@ private BaseItems() { .set(DataComponentTypes.ITEM_MODEL, Material.WHITE_CONCRETE.getKey()) .build(); static { - PylonItem.register(PylonItem.class, FLUID_VALVE, BaseKeys.FLUID_VALVE); + PylonItem.register(FluidValve.Item.class, FLUID_VALVE, BaseKeys.FLUID_VALVE); BasePages.FLUID_MACHINES.addItem(FLUID_VALVE); } @@ -1192,7 +1191,7 @@ private BaseItems() { .set(DataComponentTypes.ITEM_MODEL, Material.WHITE_CONCRETE.getKey()) .build(); static { - PylonItem.register(PylonItem.class, FLUID_FILTER, BaseKeys.FLUID_FILTER); + PylonItem.register(FluidFilter.Item.class, FLUID_FILTER, BaseKeys.FLUID_FILTER); BasePages.FLUID_MACHINES.addItem(FLUID_FILTER); } @@ -1200,7 +1199,7 @@ private BaseItems() { .set(DataComponentTypes.ITEM_MODEL, Material.WHITE_CONCRETE.getKey()) .build(); static { - PylonItem.register(PylonItem.class, FLUID_METER, BaseKeys.FLUID_METER); + PylonItem.register(FluidFilter.Item.class, FLUID_METER, BaseKeys.FLUID_METER); BasePages.FLUID_MACHINES.addItem(FLUID_METER); } @@ -1310,7 +1309,7 @@ private BaseItems() { public static final ItemStack FLUID_STRAINER = ItemStackBuilder.pylon(Material.COPPER_GRATE, BaseKeys.FLUID_STRAINER) .build(); static { - PylonItem.register(PylonItem.class, FLUID_STRAINER, BaseKeys.FLUID_STRAINER); + PylonItem.register(FluidStrainer.Item.class, FLUID_STRAINER, BaseKeys.FLUID_STRAINER); BasePages.FLUID_MACHINES.addItem(FLUID_STRAINER); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/building/Immobilizer.java b/src/main/java/io/github/pylonmc/pylon/base/content/building/Immobilizer.java index e9c7b9c0..af04e143 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/building/Immobilizer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/building/Immobilizer.java @@ -34,6 +34,15 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; public class Immobilizer extends PylonBlock implements PylonPiston, PylonBreakHandler { + public static HashMap> frozenPlayers = new HashMap<>(); + private final NamespacedKey cooldownKey = baseKey("immobilizer_cooldown_millis"); + private final double radius = getSettings().getOrThrow("radius", ConfigAdapter.DOUBLE); + private final int duration = getSettings().getOrThrow("duration", ConfigAdapter.INT); + private final long cooldownMillis = getSettings().getOrThrow("cooldown", ConfigAdapter.INT) * 50L; + private final int particleCount = getSettings().getOrThrow("particle.count", ConfigAdapter.INT); + private final double particleRadius = getSettings().getOrThrow("particle.radius", ConfigAdapter.DOUBLE); + private final int particlePeriod = getSettings().getOrThrow("particle.period", ConfigAdapter.INT); + public static class Item extends PylonItem { private final double radius = getSettings().getOrThrow("radius", ConfigAdapter.DOUBLE); private final int duration = getSettings().getOrThrow("duration", ConfigAdapter.INT); @@ -53,15 +62,6 @@ public Item(@NotNull ItemStack stack) { } } - public static HashMap> frozenPlayers = new HashMap<>(); - private final NamespacedKey cooldownKey = baseKey("immobilizer_cooldown_millis"); - private final double radius = getSettings().getOrThrow("radius", ConfigAdapter.DOUBLE); - private final int duration = getSettings().getOrThrow("duration", ConfigAdapter.INT); - private final long cooldownMillis = getSettings().getOrThrow("cooldown", ConfigAdapter.INT) * 50L; - private final int particleCount = getSettings().getOrThrow("particle.count", ConfigAdapter.INT); - private final double particleRadius = getSettings().getOrThrow("particle.radius", ConfigAdapter.DOUBLE); - private final int particlePeriod = getSettings().getOrThrow("particle.period", ConfigAdapter.INT); - public Immobilizer(Block block, BlockCreateContext context) { super(block); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java b/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java index 60a28a54..63e466fc 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java @@ -9,7 +9,6 @@ import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; -import lombok.Setter; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.entity.ItemDisplay; @@ -30,8 +29,7 @@ public class Pedestal extends PylonBlock implements PylonEntityHolderBlock, Pylo private static final NamespacedKey ROTATION_KEY = baseKey("rotation"); private static final NamespacedKey LOCKED_KEY = baseKey("locked"); private double rotation; - @Setter - private boolean locked; + public boolean locked; @SuppressWarnings("unused") public Pedestal(@NotNull Block block, @NotNull BlockCreateContext context) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/combat/ReactivatedWitherSkull.java b/src/main/java/io/github/pylonmc/pylon/base/content/combat/ReactivatedWitherSkull.java index e1e54b00..f82c40f0 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/combat/ReactivatedWitherSkull.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/combat/ReactivatedWitherSkull.java @@ -34,9 +34,15 @@ public ReactivatedWitherSkull(@NotNull ItemStack stack) { @Override public void onUsedToRightClick(@NotNull PlayerInteractEvent event) { Player player = event.getPlayer(); - if ((event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) || player.isSneaking()) return; - - if (player.getGameMode() != GameMode.CREATIVE) getStack().damage(1, player); + if ((event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) + || player.isSneaking() + ) { + return; + } + + if (player.getGameMode() != GameMode.CREATIVE) { + getStack().damage(1, player); + } player.setCooldown(getStack(), cooldownTicks); Location skullPos = player.getLocation().clone().add(0, playerHeight, 0); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java b/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedSoulSoil.java similarity index 80% rename from src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java rename to src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedSoulSoil.java index b912d0e3..ce355fa3 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedNetherrack.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedSoulSoil.java @@ -13,21 +13,22 @@ import org.jetbrains.annotations.NotNull; -public final class EnrichedNetherrack extends PylonBlock implements PylonTickingBlock { +public final class EnrichedSoulSoil extends PylonBlock implements PylonTickingBlock { public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); @SuppressWarnings("unused") - public EnrichedNetherrack(@NotNull Block block, @NotNull BlockCreateContext context) { + public EnrichedSoulSoil(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(tickInterval); } @SuppressWarnings("unused") - public EnrichedNetherrack(@NotNull Block block, @NotNull PersistentDataContainer pdc) { + public EnrichedSoulSoil(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); } + @Override public void tick() { if (getBlock().getRelative(BlockFace.UP).getType() == Material.FIRE) { new ParticleBuilder(Particle.LAVA) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java index d2c46ba3..76c126eb 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java @@ -14,12 +14,10 @@ import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.logistics.LogisticSlotType; import io.github.pylonmc.pylon.core.logistics.VirtualInventoryLogisticSlot; -import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.GuiItems; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -36,21 +34,16 @@ public class CargoBuffer extends PylonBlock public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT); - public final ItemStack mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) - .addCustomModelDataString(getKey() + ":main") - .build(); - public final ItemStack side1Stack = ItemStackBuilder.of(Material.BARREL) - .addCustomModelDataString(getKey() + ":side1") - .build(); - public final ItemStack side2Stack = ItemStackBuilder.of(Material.BARREL) - .addCustomModelDataString(getKey() + ":side2") - .build(); - public final ItemStack inputStack = ItemStackBuilder.of(Material.LIME_TERRACOTTA) - .addCustomModelDataString(getKey() + ":input") - .build(); - public final ItemStack outputStack = ItemStackBuilder.of(Material.RED_TERRACOTTA) - .addCustomModelDataString(getKey() + ":output") - .build(); + public final ItemStackBuilder mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":main"); + public final ItemStackBuilder side1Stack = ItemStackBuilder.of(Material.BARREL) + .addCustomModelDataString(getKey() + ":side1"); + public final ItemStackBuilder side2Stack = ItemStackBuilder.of(Material.BARREL) + .addCustomModelDataString(getKey() + ":side2"); + public final ItemStackBuilder inputStack = ItemStackBuilder.of(Material.LIME_TERRACOTTA) + .addCustomModelDataString(getKey() + ":input"); + public final ItemStackBuilder outputStack = ItemStackBuilder.of(Material.RED_TERRACOTTA) + .addCustomModelDataString(getKey() + ":output"); public static class Item extends PylonItem { @@ -75,11 +68,7 @@ public Item(@NotNull ItemStack stack) { public CargoBuffer(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - if (!(context instanceof BlockCreateContext.PlayerPlace playerPlaceContext)) { - throw new IllegalArgumentException("Cargo buffers can only be placed by player"); - } - - setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true)); + setFacing(context.getFacing()); addCargoLogisticGroup(getFacing(), "input"); addCargoLogisticGroup(getFacing().getOppositeFace(), "output"); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java index b733eb1d..3c52f773 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java @@ -34,15 +34,12 @@ public class CargoExtractor extends PylonBlock public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT); - public final ItemStack mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) - .addCustomModelDataString(getKey() + ":main") - .build(); - public final ItemStack outputStack = ItemStackBuilder.of(Material.RED_TERRACOTTA) - .addCustomModelDataString(getKey() + ":output") - .build(); - public final ItemStack ductStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) - .addCustomModelDataString(getKey() + ":duct") - .build(); + public final ItemStackBuilder mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":main"); + public final ItemStackBuilder outputStack = ItemStackBuilder.of(Material.RED_TERRACOTTA) + .addCustomModelDataString(getKey() + ":output"); + public final ItemStackBuilder ductStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":duct"); public static class Item extends PylonItem { @@ -67,12 +64,7 @@ public Item(@NotNull ItemStack stack) { public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - if (!(context instanceof BlockCreateContext.PlayerPlace playerPlaceContext)) { - throw new IllegalArgumentException("Cargo extractor can only be placed by player"); - } - - // TODO add a util function for this because ffs really - setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace()); + setFacing(context.getFacing()); addCargoLogisticGroup(getFacing().getOppositeFace(), "output"); for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { @@ -118,10 +110,7 @@ public CargoExtractor(@NotNull Block block, @NotNull PersistentDataContainer pdc @Override public @NotNull Set<@NotNull ChunkPosition> getChunksOccupied() { - Set chunks = new HashSet<>(); - chunks.add(new ChunkPosition(getBlock())); - chunks.add(new ChunkPosition(getTarget())); - return chunks; + return Set.of(new ChunkPosition(getBlock()), new ChunkPosition(getTarget())); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java index 480d4dec..fca5c4f4 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java @@ -33,15 +33,12 @@ public class CargoInserter extends PylonBlock public final int transferRate = getSettings().getOrThrow("transfer-rate", ConfigAdapter.INT); - public final ItemStack mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) - .addCustomModelDataString(getKey() + ":main") - .build(); - public final ItemStack inputStack = ItemStackBuilder.of(Material.LIME_TERRACOTTA) - .addCustomModelDataString(getKey() + ":input") - .build(); - public final ItemStack ductStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) - .addCustomModelDataString(getKey() + ":duct") - .build(); + public final ItemStackBuilder mainStack = ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":main"); + public final ItemStackBuilder inputStack = ItemStackBuilder.of(Material.LIME_TERRACOTTA) + .addCustomModelDataString(getKey() + ":input"); + public final ItemStackBuilder ductStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":duct"); public static class Item extends PylonItem { @@ -66,11 +63,7 @@ public Item(@NotNull ItemStack stack) { public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - if (!(context instanceof BlockCreateContext.PlayerPlace playerPlaceContext)) { - throw new IllegalArgumentException("Cargo inserter can only be placed by player"); - } - - setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace()); + setFacing(context.getFacing()); addCargoLogisticGroup(getFacing().getOppositeFace(), "input"); for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java index 7d45495b..5c037c53 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java @@ -5,11 +5,7 @@ import io.github.pylonmc.pylon.base.recipes.MoldingRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonLogisticBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; @@ -35,6 +31,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector3d; @@ -44,8 +41,13 @@ import java.util.List; -public class DieselBrickMolder extends PylonBlock - implements PylonGuiBlock, PylonFluidBufferBlock, PylonTickingBlock, PylonLogisticBlock, PylonRecipeProcessor { +public class DieselBrickMolder extends PylonBlock implements + PylonGuiBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock, + PylonTickingBlock, + PylonLogisticBlock, + PylonRecipeProcessor { public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); @@ -58,6 +60,7 @@ public class DieselBrickMolder extends PylonBlock public static class Item extends PylonItem { public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); + public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); public final int ticksPerMoldingCycle = getSettings().getOrThrow("ticks-per-molding-cycle", ConfigAdapter.INT); @@ -69,36 +72,30 @@ public Item(@NotNull ItemStack stack) { public @NotNull List<@NotNull PylonArgument> getPlaceholders() { return List.of( PylonArgument.of("diesel-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(dieselPerSecond)), + PylonArgument.of("diesel-buffer", UnitFormat.MILLIBUCKETS.format(dieselBuffer)), PylonArgument.of("molding-cycles", UnitFormat.CYCLES_PER_SECOND.format(20 / (ticksPerMoldingCycle * tickInterval))) ); } } - public ItemStack plankStack = ItemStackBuilder.of(Material.OAK_PLANKS) - .addCustomModelDataString(getKey() + ":cube") - .build(); - public ItemStack sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side") - .build(); + public ItemStackBuilder plankStack = ItemStackBuilder.of(Material.OAK_PLANKS) + .addCustomModelDataString(getKey() + ":cube"); + public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) + .addCustomModelDataString(getKey() + ":chimney"); @SuppressWarnings("unused") public DieselBrickMolder(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(tickInterval); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.55F); - BlockFace facing; - if (context instanceof BlockCreateContext.PlayerPlace playerPlaceContext) { - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, false); - } else { - facing = BlockFace.NORTH; - } + setFacing(context.getFacing()); addEntity("chimney", new ItemDisplayBuilder() - .itemStack(ItemStackBuilder.of(Material.CYAN_TERRACOTTA) - .addCustomModelDataString(getKey() + ":chimney") - .build() - ) + .itemStack(chimneyStack) .transformation(new TransformBuilder() - .translate(0.4, 0.0, 0.4) + .lookAlong(getFacing()) + .translate(0.4, 0.0, -0.4) .scale(0.15)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); @@ -119,8 +116,7 @@ public DieselBrickMolder(@NotNull Block block, @NotNull BlockCreateContext conte addEntity("plank", new ItemDisplayBuilder() .itemStack(plankStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0) + .rotate(0, PylonUtils.faceToYaw(getFacing()), 0) .scale(0.5, 0.2, 0.5)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); @@ -161,8 +157,12 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); + Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( + new Vector3d(0.4, 0.7, 0.4), + getFacing()) + ); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) - .location(getBlock().getLocation().toCenterLocation().add(0.4, 0.7, 0.4)) + .location(getBlock().getLocation().toCenterLocation().add(smokePosition)) .offset(0, 1, 0) .count(0) .extra(0.05) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java index 9bca94ff..86068114 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java @@ -6,11 +6,7 @@ import io.github.pylonmc.pylon.base.recipes.GrindstoneRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonLogisticBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; @@ -38,8 +34,10 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import xyz.xenondevs.invui.gui.Gui; import xyz.xenondevs.invui.inventory.VirtualInventory; @@ -48,8 +46,13 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class DieselGrindstone extends PylonBlock - implements PylonGuiBlock, PylonFluidBufferBlock, PylonTickingBlock, PylonLogisticBlock, PylonRecipeProcessor { +public class DieselGrindstone extends PylonBlock implements + PylonGuiBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock, + PylonTickingBlock, + PylonLogisticBlock, + PylonRecipeProcessor { public static final NamespacedKey STONE_ROTATION_KEY = baseKey("stone_rotation"); @@ -64,6 +67,7 @@ public class DieselGrindstone extends PylonBlock public static class Item extends PylonItem { public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); + public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public Item(@NotNull ItemStack stack) { super(stack); @@ -72,30 +76,30 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List<@NotNull PylonArgument> getPlaceholders() { return List.of( - PylonArgument.of("diesel-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(dieselPerSecond)) + PylonArgument.of("diesel-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(dieselPerSecond)), + PylonArgument.of("diesel-buffer", UnitFormat.MILLIBUCKETS.format(dieselBuffer)) ); } } - public ItemStack stoneStack = ItemStackBuilder.of(Material.SMOOTH_STONE) - .addCustomModelDataString(getKey() + ":stone") - .build(); - public ItemStack sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side") - .build(); + public ItemStackBuilder stoneStack = ItemStackBuilder.of(Material.SMOOTH_STONE) + .addCustomModelDataString(getKey() + ":stone"); + public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) + .addCustomModelDataString(getKey() + ":chimney"); @SuppressWarnings("unused") public DieselGrindstone(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(tickInterval); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.55F); + setFacing(context.getFacing()); addEntity("chimney", new ItemDisplayBuilder() - .itemStack(ItemStackBuilder.of(Material.CYAN_TERRACOTTA) - .addCustomModelDataString(getKey() + ":chimney") - .build() - ) + .itemStack(chimneyStack) .transformation(new TransformBuilder() - .translate(0.4, 0.0, 0.4) + .lookAlong(getFacing()) + .translate(0.4, 0.0, -0.4) .scale(0.15)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); @@ -157,8 +161,12 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); + Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( + new Vector3d(0.4, 0.7, 0.4), + getFacing() + )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) - .location(getBlock().getLocation().toCenterLocation().add(0.4, 0.7, 0.4)) + .location(getBlock().getLocation().toCenterLocation().add(smokePosition)) .offset(0, 1, 0) .count(0) .extra(0.05) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java index 73482e6a..2ca6161a 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java @@ -5,11 +5,7 @@ import io.github.pylonmc.pylon.base.recipes.PipeBendingRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonLogisticBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; @@ -35,6 +31,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector3d; @@ -44,8 +41,13 @@ import java.util.List; -public class DieselPipeBender extends PylonBlock - implements PylonGuiBlock, PylonFluidBufferBlock, PylonTickingBlock, PylonLogisticBlock, PylonRecipeProcessor { +public class DieselPipeBender extends PylonBlock implements + PylonGuiBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock, + PylonTickingBlock, + PylonLogisticBlock, + PylonRecipeProcessor { public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); @@ -58,6 +60,7 @@ public class DieselPipeBender extends PylonBlock public static class Item extends PylonItem { public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); + public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final double speed = getSettings().getOrThrow("speed", ConfigAdapter.DOUBLE); public Item(@NotNull ItemStack stack) { @@ -68,36 +71,30 @@ public Item(@NotNull ItemStack stack) { public @NotNull List<@NotNull PylonArgument> getPlaceholders() { return List.of( PylonArgument.of("diesel-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(dieselPerSecond)), + PylonArgument.of("diesel-buffer", UnitFormat.MILLIBUCKETS.format(dieselBuffer)), PylonArgument.of("speed", UnitFormat.PERCENT.format(speed * 100)) ); } } - public ItemStack cubeStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) - .addCustomModelDataString(getKey() + ":cube") - .build(); - public ItemStack sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side") - .build(); + public ItemStackBuilder cubeStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":cube"); + public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) + .addCustomModelDataString(getKey() + ":chimney"); @SuppressWarnings("unused") public DieselPipeBender(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(tickInterval); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.55F); - BlockFace facing; - if (context instanceof BlockCreateContext.PlayerPlace playerPlaceContext) { - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, false); - } else { - facing = BlockFace.NORTH; - } + setFacing(context.getFacing()); addEntity("chimney", new ItemDisplayBuilder() - .itemStack(ItemStackBuilder.of(Material.CYAN_TERRACOTTA) - .addCustomModelDataString(getKey() + ":chimney") - .build() - ) + .itemStack(chimneyStack) .transformation(new TransformBuilder() - .translate(0.4, 0.0, 0.4) + .lookAlong(getFacing()) + .translate(0.4, 0.0, -0.4) .scale(0.15)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); @@ -118,7 +115,7 @@ public DieselPipeBender(@NotNull Block block, @NotNull BlockCreateContext contex addEntity("cube1", new ItemDisplayBuilder() .itemStack(cubeStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.2) .scale(0.2)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -126,7 +123,7 @@ public DieselPipeBender(@NotNull Block block, @NotNull BlockCreateContext contex addEntity("cube2", new ItemDisplayBuilder() .itemStack(cubeStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0.15, 0, -0.2) .scale(0.2)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -134,7 +131,7 @@ public DieselPipeBender(@NotNull Block block, @NotNull BlockCreateContext contex addEntity("cube3", new ItemDisplayBuilder() .itemStack(cubeStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(-0.15, 0, -0.2) .scale(0.2)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -176,8 +173,12 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); + Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( + new Vector3d(0.4, 0.7, 0.4), + getFacing() + )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) - .location(getBlock().getLocation().toCenterLocation().add(0.4, 0.7, 0.4)) + .location(getBlock().getLocation().toCenterLocation().add(smokePosition)) .offset(0, 1, 0) .count(0) .extra(0.05) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java index e7585549..ecc52bdf 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java @@ -59,6 +59,7 @@ public class DieselPress extends PylonBlock implements public static class Item extends PylonItem { public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); + public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final double timePerItem = getSettings().getOrThrow("time-per-item", ConfigAdapter.DOUBLE); public Item(@NotNull ItemStack stack) { @@ -69,20 +70,20 @@ public Item(@NotNull ItemStack stack) { public @NotNull List<@NotNull PylonArgument> getPlaceholders() { return List.of( PylonArgument.of("diesel-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(dieselPerSecond)), + PylonArgument.of("diesel-buffer", UnitFormat.MILLIBUCKETS.format(dieselBuffer)), PylonArgument.of("time-per-item", UnitFormat.SECONDS.format(timePerItem)) ); } } - public ItemStack pressStack = ItemStackBuilder.of(Material.COMPOSTER) - .addCustomModelDataString(getKey() + ":press") - .build(); - public ItemStack pressLidStack = ItemStackBuilder.of(Material.COMPOSTER) - .addCustomModelDataString(getKey() + ":press_lid") - .build(); - public ItemStack sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side") - .build(); + public ItemStackBuilder pressStack = ItemStackBuilder.of(Material.COMPOSTER) + .addCustomModelDataString(getKey() + ":press"); + public ItemStackBuilder pressLidStack = ItemStackBuilder.of(Material.COMPOSTER) + .addCustomModelDataString(getKey() + ":press_lid"); + public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) + .addCustomModelDataString(getKey() + ":chimney"); @SuppressWarnings("unused") public DieselPress(@NotNull Block block, @NotNull BlockCreateContext context) { @@ -90,16 +91,9 @@ public DieselPress(@NotNull Block block, @NotNull BlockCreateContext context) { setTickInterval(tickInterval); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.55F); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false, 0.55F); - if (context instanceof BlockCreateContext.PlayerPlace playerPlaceContext) { - setFacing(PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, false)); - } else { - setFacing(BlockFace.NORTH); - } + setFacing(context.getFacing()); addEntity("chimney", new ItemDisplayBuilder() - .itemStack(ItemStackBuilder.of(Material.CYAN_TERRACOTTA) - .addCustomModelDataString(getKey() + ":chimney") - .build() - ) + .itemStack(chimneyStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) .translate(0.37499, -0.15, 0.0) @@ -164,9 +158,12 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); - Vector3d translation = PylonUtils.rotateVectorToFace(new Vector3d(0.375, 1.5, 0), getFacing()); + Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( + new Vector3d(0.375, 1.5, 0), + getFacing() + )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) - .location(getBlock().getLocation().toCenterLocation().add(Vector.fromJOML(translation))) + .location(getBlock().getLocation().toCenterLocation().add(smokePosition)) .offset(0, 1, 0) .count(0) .extra(0.05) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java index 694cf75e..5bc53890 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java @@ -5,11 +5,7 @@ import io.github.pylonmc.pylon.base.recipes.TableSawRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonLogisticBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; @@ -36,25 +32,33 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import xyz.xenondevs.invui.gui.Gui; import xyz.xenondevs.invui.inventory.VirtualInventory; import java.util.List; -public class DieselTableSaw extends PylonBlock - implements PylonGuiBlock, PylonFluidBufferBlock, PylonTickingBlock, PylonLogisticBlock, PylonRecipeProcessor { +public class DieselTableSaw extends PylonBlock implements + PylonGuiBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock, + PylonTickingBlock, + PylonLogisticBlock, + PylonRecipeProcessor { public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); public final double speed = getSettings().getOrThrow("speed", ConfigAdapter.DOUBLE); - public ItemStack sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side") - .build(); + public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) + .addCustomModelDataString(getKey() + ":chimney"); private final VirtualInventory inputInventory = new VirtualInventory(1); private final VirtualInventory outputInventory = new VirtualInventory(1); @@ -62,6 +66,7 @@ public class DieselTableSaw extends PylonBlock public static class Item extends PylonItem { public final double dieselPerSecond = getSettings().getOrThrow("diesel-per-second", ConfigAdapter.DOUBLE); + public final double dieselBuffer = getSettings().getOrThrow("diesel-buffer", ConfigAdapter.DOUBLE); public final double speed = getSettings().getOrThrow("speed", ConfigAdapter.DOUBLE); public Item(@NotNull ItemStack stack) { @@ -72,6 +77,7 @@ public Item(@NotNull ItemStack stack) { public @NotNull List getPlaceholders() { return List.of( PylonArgument.of("diesel-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(dieselPerSecond)), + PylonArgument.of("diesel-buffer", UnitFormat.MILLIBUCKETS.format(dieselBuffer)), PylonArgument.of("speed", UnitFormat.PERCENT.format(speed * 100)) ); } @@ -82,13 +88,12 @@ public DieselTableSaw(@NotNull Block block, @NotNull BlockCreateContext context) super(block, context); setTickInterval(tickInterval); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.55F); + setFacing(context.getFacing()); addEntity("chimney", new ItemDisplayBuilder() - .itemStack(ItemStackBuilder.of(Material.CYAN_TERRACOTTA) - .addCustomModelDataString(getKey() + ":chimney") - .build() - ) + .itemStack(chimneyStack) .transformation(new TransformBuilder() - .translate(0.4, 0.0, 0.4) + .lookAlong(getFacing()) + .translate(0.4, 0.0, -0.4) .scale(0.15)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); @@ -114,6 +119,7 @@ public DieselTableSaw(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("saw", new BlockDisplayBuilder() .blockData(Material.IRON_BARS.createBlockData("[east=true,west=true]")) .transformation(new TransformBuilder() + .rotate(0, PylonUtils.faceToYaw(getFacing()), 0) .scale(0.6, 0.4, 0.4)) .build(block.getLocation().toCenterLocation().add(0, 0.7, 0)) ); @@ -153,8 +159,12 @@ public void tick() { } removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); + Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( + new Vector3d(0.4, 0.7, 0.4), + getFacing() + )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) - .location(getBlock().getLocation().toCenterLocation().add(0.4, 0.7, 0.4)) + .location(getBlock().getLocation().toCenterLocation().add(smokePosition)) .offset(0, 1, 0) .count(0) .extra(0.05) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java index 6af77aad..63edd31b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/CreativeFluidSource.java @@ -2,19 +2,27 @@ import io.github.pylonmc.pylon.base.content.machines.fluid.gui.FluidSelector; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; +import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; +import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; +import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; +import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.util.PylonUtils; -import lombok.Getter; -import lombok.Setter; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -26,16 +34,45 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class CreativeFluidSource extends PylonBlock implements PylonFluidBlock, PylonGuiBlock { +public class CreativeFluidSource extends PylonBlock implements + PylonFluidBlock, + PylonDirectionalBlock, + PylonGuiBlock, + PylonEntityHolderBlock { public static final NamespacedKey FLUID_KEY = baseKey("fluid"); - @Nullable @Getter @Setter private PylonFluid fluid; + @Nullable public PylonFluid fluid; @SuppressWarnings("unused") public CreativeFluidSource(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - createFluidPoint(FluidPointType.OUTPUT, BlockFace.NORTH, context, true); + setFacing(context.getFacing()); + createFluidPoint(FluidPointType.OUTPUT, BlockFace.NORTH, context, true, 0.55F); + addEntity("fluid-1", new ItemDisplayBuilder() + .material(Material.RED_CONCRETE) + .transformation(new TransformBuilder() + .translate(0, -0.5, 0) + .scale(1.1, 0.8, 0.8) + ) + .build(getBlock().getLocation().toCenterLocation().add(0, 0.5, 0)) + ); + addEntity("fluid-2", new ItemDisplayBuilder() + .material(Material.RED_CONCRETE) + .transformation(new TransformBuilder() + .translate(0, -0.5, 0) + .scale(0.8, 1.1, 0.8) + ) + .build(getBlock().getLocation().toCenterLocation().add(0, 0.5, 0)) + ); + addEntity("fluid-3", new ItemDisplayBuilder() + .material(Material.RED_CONCRETE) + .transformation(new TransformBuilder() + .translate(0, -0.5, 0) + .scale(0.8, 0.8, 1.1) + ) + .build(getBlock().getLocation().toCenterLocation().add(0, 0.5, 0)) + ); fluid = null; } @@ -60,7 +97,23 @@ public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) {} @Override public @NotNull Gui createGui() { - return (FluidSelector.make(() -> fluid, this::setFluid)); + return (FluidSelector.make(() -> fluid, fluid -> { + this.fluid = fluid; + ItemStack stack = fluid == null ? new ItemStack(Material.RED_CONCRETE) : fluid.getItem(); + getHeldEntityOrThrow(ItemDisplay.class, "fluid-1").setItemStack(stack); + getHeldEntityOrThrow(ItemDisplay.class, "fluid-2").setItemStack(stack); + getHeldEntityOrThrow(ItemDisplay.class, "fluid-3").setItemStack(stack); + })); + } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("fluid", fluid == null + ? Component.translatable("pylon.pylonbase.fluid.none") + : fluid.getName() + ) + )); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java index 984ffa7f..fb73096a 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidDrainer.java @@ -1,7 +1,9 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; import com.google.common.base.Preconditions; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; @@ -12,21 +14,32 @@ import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; import io.papermc.paper.event.block.BlockBreakBlockEvent; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Directional; import org.bukkit.block.data.Levelled; +import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; -public class FluidDrainer extends PylonBlock implements PylonFluidBufferBlock, PylonTickingBlock, PylonInteractBlock { +public class FluidDrainer extends PylonBlock + implements PylonFluidBufferBlock, PylonDirectionalBlock, PylonTickingBlock, PylonInteractBlock { + + public final Material material = getSettings().getOrThrow("material", ConfigAdapter.MATERIAL); + public final PylonFluid fluid = getSettings().getOrThrow("fluid", ConfigAdapter.PYLON_FLUID); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public final Block drainBlock; public static class Item extends PylonItem { @@ -46,16 +59,11 @@ public Item(@NotNull ItemStack stack) { } } - public final Material material = getSettings().getOrThrow("material", ConfigAdapter.MATERIAL); - public final PylonFluid fluid = getSettings().getOrThrow("fluid", ConfigAdapter.PYLON_FLUID); - public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); - public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); - public final Block drainBlock; - @SuppressWarnings("unused") public FluidDrainer(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, true); createFluidBuffer(fluid, buffer, false, true); Preconditions.checkState(getBlock().getBlockData() instanceof Directional); @@ -71,6 +79,18 @@ public FluidDrainer(@NotNull Block block, @NotNull PersistentDataContainer pdc) drainBlock = getBlock().getRelative(directional.getFacing()); } + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + fluidAmount(fluid), + fluidCapacity(fluid), + 20, + TextColor.color(200, 255, 255) + )) + )); + } + @Override public void tick() { if (fluidSpaceRemaining(fluid) >= 1000.0 diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java index e4adad96..d47919ee 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidFilter.java @@ -1,28 +1,27 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; -import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.content.machines.fluid.gui.FluidSelector; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidTank; import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.waila.WailaDisplay; -import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; -import io.github.pylonmc.pylon.core.fluid.FluidManager; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; -import io.github.pylonmc.pylon.core.fluid.VirtualFluidPoint; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; @@ -40,7 +39,10 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class FluidFilter extends PylonBlock implements PylonFluidTank, PylonGuiBlock { +public class FluidFilter extends PylonBlock + implements PylonFluidTank, PylonDirectionalBlock, PylonGuiBlock { + + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); public static class Item extends PylonItem { @@ -60,9 +62,8 @@ public Item(@NotNull ItemStack stack) { public static final NamespacedKey FLUID_KEY = baseKey("fluid"); - public final ItemStack mainStack = ItemStackBuilder.of(Material.WHITE_CONCRETE) - .addCustomModelDataString(getKey() + ":main") - .build(); + public final ItemStackBuilder mainStack = ItemStackBuilder.of(Material.WHITE_CONCRETE) + .addCustomModelDataString(getKey() + ":main"); public final ItemStack noFluidStack = ItemStackBuilder.of(Material.RED_CONCRETE) .addCustomModelDataString(getKey() + ":fluid:none") .build(); @@ -75,17 +76,12 @@ public FluidFilter(@NotNull Block block, @NotNull BlockCreateContext context) { fluid = null; - // a bit of a hack - treat capacity as effectively infinite and override - // fluidAmountRequested to control how much fluid comes in - setCapacity(1.0e9); - - Preconditions.checkState(context instanceof BlockCreateContext.PlayerPlace, "Fluid valve can only be placed by a player"); - Player player = ((BlockCreateContext.PlayerPlace) context).getPlayer(); - + setCapacity(buffer); + setFacing(context.getFacing()); addEntity("main", new ItemDisplayBuilder() .itemStack(mainStack) .transformation(new TransformBuilder() - .lookAlong(PylonUtils.rotateToPlayerFacing(player, BlockFace.EAST, false).getDirection().toVector3d()) + .lookAlong(getFacing()) .scale(0.25, 0.25, 0.5) ) .build(block.getLocation().toCenterLocation()) @@ -93,13 +89,13 @@ public FluidFilter(@NotNull Block block, @NotNull BlockCreateContext context) { addEntity("fluid", new ItemDisplayBuilder() .itemStack(noFluidStack) .transformation(new TransformBuilder() - .lookAlong(PylonUtils.rotateToPlayerFacing(player, BlockFace.EAST, false).getDirection().toVector3d()) + .lookAlong(getFacing()) .scale(0.2, 0.3, 0.45) ) .build(block.getLocation().toCenterLocation()) ); - createFluidPoint(FluidPointType.INPUT, BlockFace.EAST, context, false, 0.25F); - createFluidPoint(FluidPointType.OUTPUT, BlockFace.WEST, context, false, 0.25F); + createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.25F); + createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false, 0.25F); setDisableBlockTextureEntity(true); } @@ -117,10 +113,18 @@ public void write(@NotNull PersistentDataContainer pdc) { @Override public @Nullable WailaDisplay getWaila(@NotNull Player player) { - return new WailaDisplay(getDefaultWailaTranslationKey().arguments(PylonArgument.of( - "fluid", - fluid == null ? Component.translatable("pylon.pylonbase.fluid.none") : fluid.getName() - ))); + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + getFluidAmount(), + getFluidCapacity(), + 20, + TextColor.color(200, 255, 255) + )), + PylonArgument.of("fluid", fluid == null + ? Component.translatable("pylon.pylonbase.fluid.none") + : fluid.getName() + ) + )); } private @NotNull ItemDisplay getFluidDisplay() { @@ -129,28 +133,7 @@ public void write(@NotNull PersistentDataContainer pdc) { @Override public boolean isAllowedFluid(@NotNull PylonFluid fluid) { - return true; - } - - @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid) { - if (fluid != this.fluid) { - return 0.0; - } - - // Make sure the filter always has enough fluid for one tick's worth of output - // somewhat hacky - VirtualFluidPoint output = getFluidPointDisplayOrThrow(FluidPointType.OUTPUT).getPoint(); - VirtualFluidPoint input = getFluidPointDisplayOrThrow(FluidPointType.INPUT).getPoint(); - double outputFluidPerSecond = FluidManager.getFluidPerSecond(output.getSegment()); - double inputFluidPerSecond = FluidManager.getFluidPerSecond(input.getSegment()); - return Math.max( - 0.0, - Math.min( - outputFluidPerSecond, - inputFluidPerSecond - ) * PylonConfig.fluidTickInterval / 20 - getFluidAmount() - ); + return fluid == this.fluid; } public void setFluid(PylonFluid fluid) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java index 34f42e50..586f99f2 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java @@ -1,6 +1,5 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; -import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.PylonConfig; @@ -14,7 +13,6 @@ import org.bukkit.Color; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; import org.bukkit.entity.TextDisplay; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -31,13 +29,10 @@ public class FluidMeter extends FluidFilter implements PylonTickingBlock { public FluidMeter(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - Preconditions.checkState(context instanceof BlockCreateContext.PlayerPlace, "Fluid valve can only be placed by a player"); - Player player = ((BlockCreateContext.PlayerPlace) context).getPlayer(); - setTickInterval(tickInterval); - addEntity("flow_rate_north", createTextDisplay(player, BlockFace.NORTH)); - addEntity("flow_rate_south", createTextDisplay(player, BlockFace.SOUTH)); + addEntity("flow_rate_north", createTextDisplay(BlockFace.WEST)); + addEntity("flow_rate_south", createTextDisplay(BlockFace.EAST)); removedSinceLastUpdate = 0.0; setDisableBlockTextureEntity(true); @@ -60,23 +55,16 @@ public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) { public void tick() { Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / (20 * PylonConfig.fluidTickInterval))).asComponent(); - TextDisplay northDisplay = getHeldEntity(TextDisplay.class, "flow_rate_north"); - if (northDisplay != null) { - northDisplay.text(component); - } - - TextDisplay southDisplay = getHeldEntity(TextDisplay.class, "flow_rate_south"); - if (southDisplay != null) { - southDisplay.text(component); - } + getHeldEntityOrThrow(TextDisplay.class, "flow_rate_north").text(component); + getHeldEntityOrThrow(TextDisplay.class, "flow_rate_south").text(component); removedSinceLastUpdate = 0.0; } - private @NotNull TextDisplay createTextDisplay(@NotNull Player player, @NotNull BlockFace face) { + private @NotNull TextDisplay createTextDisplay(@NotNull BlockFace face) { return new TextDisplayBuilder() .transformation(new TransformBuilder() - .lookAlong(PylonUtils.rotateToPlayerFacing(player, face, false).getDirection().toVector3d()) + .lookAlong(PylonUtils.rotateFaceToReference(getFacing(), face)) .translate(new Vector3d(0.0, 0.0, 0.126)) .scale(0.3, 0.3, 0.0001) ) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java index 9f31d5ba..e1137a55 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidPlacer.java @@ -1,6 +1,7 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; import com.google.common.base.Preconditions; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; @@ -12,6 +13,8 @@ import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; @@ -19,11 +22,13 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Directional; +import org.bukkit.entity.Player; import org.bukkit.event.block.FluidLevelChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -73,18 +78,34 @@ public FluidPlacer(@NotNull Block block, @NotNull PersistentDataContainer pdc) { placeBlock = getBlock().getRelative(directional.getFacing()); } + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + fluidAmount(fluid), + fluidCapacity(fluid), + 20, + TextColor.color(200, 255, 255) + )) + )); + } + @Override public void tick() { - if (fluidAmount(fluid) >= 1000.0 && placeBlock.getType().isAir()) { - removeFluid(fluid, 1000.0); - if (placeBlock.getWorld().getEnvironment() == World.Environment.NETHER && material == Material.WATER) { - placeBlock.getWorld().playSound(placeBlock.getLocation().toCenterLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1.0f, 1.0f); - placeBlock.getWorld().spawnParticle(Particle.SMOKE, placeBlock.getLocation().toCenterLocation(), 10, 0.35, 0.35, 0.35, 0.01); - } else { - if (new FluidLevelChangeEvent(placeBlock, material.createBlockData()).callEvent()) { - placeBlock.setType(material); - } - } + if (!(fluidAmount(fluid) >= 1000.0) || !placeBlock.getType().isAir()) { + return; + } + + removeFluid(fluid, 1000.0); + + if (placeBlock.getWorld().getEnvironment() == World.Environment.NETHER && material == Material.WATER) { + placeBlock.getWorld().playSound(placeBlock.getLocation().toCenterLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1.0f, 1.0f); + placeBlock.getWorld().spawnParticle(Particle.SMOKE, placeBlock.getLocation().toCenterLocation(), 10, 0.35, 0.35, 0.35, 0.01); + return; + } + + if (new FluidLevelChangeEvent(placeBlock, material.createBlockData()).callEvent()) { + placeBlock.setType(material); } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java index d4a5a70f..389ce532 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidStrainer.java @@ -1,21 +1,25 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; +import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.recipes.StrainingRecipe; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; +import io.github.pylonmc.pylon.core.item.PylonItem; +import io.github.pylonmc.pylon.core.util.MachineUpdateReason; +import io.github.pylonmc.pylon.core.util.PylonUtils; +import io.github.pylonmc.pylon.core.util.gui.GuiItems; +import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import io.github.pylonmc.pylon.core.waila.WailaDisplay; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; -import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; import io.github.pylonmc.pylon.core.i18n.PylonArgument; -import io.github.pylonmc.pylon.core.util.PylonUtils; -import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -32,134 +36,138 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class FluidStrainer extends PylonBlock implements PylonFluidBlock, PylonTickingBlock, PylonGuiBlock { +public class FluidStrainer extends PylonBlock implements + PylonDirectionalBlock, + PylonFluidBlock, + PylonGuiBlock, + PylonRecipeProcessor { + + private static final NamespacedKey FLUID_AMOUNT_KEY = baseKey("fluid_amount"); + private static final NamespacedKey FLUID_TYPE_KEY = baseKey("fluid_type"); - public final double bufferSize = getSettings().getOrThrow("buffer-size", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + public @Nullable PylonFluid fluidType; + public double fluidAmount; + private final VirtualInventory inventory = new VirtualInventory(9 * 3); - private static final NamespacedKey CURRENT_RECIPE_KEY = baseKey("current_recipe"); - private static final NamespacedKey BUFFER_KEY = baseKey("buffer"); - private static final NamespacedKey PASSED_FLUID_KEY = baseKey("passed_fluid"); + public static class Item extends PylonItem { - private final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); - private @Nullable StrainingRecipe currentRecipe; - private double buffer; - private double passedFluid; + public Item(@NotNull ItemStack stack) { + super(stack); + } + + @Override + public @NotNull List getPlaceholders() { + return List.of( + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) + ); + } + } @SuppressWarnings("unused") public FluidStrainer(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - setTickInterval(tickInterval); - + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.UP); createFluidPoint(FluidPointType.OUTPUT, BlockFace.DOWN); + setRecipeType(StrainingRecipe.RECIPE_TYPE); - currentRecipe = null; - buffer = 0; - passedFluid = 0; + fluidType = null; + fluidAmount = 0.0; } - @SuppressWarnings({"unused", "DataFlowIssue"}) + @SuppressWarnings("unused") public FluidStrainer(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); - currentRecipe = pdc.get(CURRENT_RECIPE_KEY, StrainingRecipe.DATA_TYPE); - buffer = pdc.get(BUFFER_KEY, PylonSerializers.DOUBLE); - passedFluid = pdc.get(PASSED_FLUID_KEY, PylonSerializers.DOUBLE); + fluidType = null; + fluidAmount = pdc.get(FLUID_AMOUNT_KEY, PylonSerializers.DOUBLE); } @Override public void write(@NotNull PersistentDataContainer pdc) { - PylonUtils.setNullable(pdc, CURRENT_RECIPE_KEY, StrainingRecipe.DATA_TYPE, currentRecipe); - pdc.set(BUFFER_KEY, PylonSerializers.DOUBLE, buffer); - pdc.set(PASSED_FLUID_KEY, PylonSerializers.DOUBLE, passedFluid); - } - - @Override - public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids() { - return currentRecipe == null ? - Map.of() : - Map.of(currentRecipe.outputFluid(), buffer); + PylonUtils.setNullable(pdc, FLUID_TYPE_KEY, PylonSerializers.PYLON_FLUID, fluidType); + pdc.set(FLUID_AMOUNT_KEY, PylonSerializers.DOUBLE, fluidAmount); } @Override public double fluidAmountRequested(@NotNull PylonFluid fluid) { - if (StrainingRecipe.RECIPE_TYPE.stream().anyMatch(recipe -> recipe.input().contains(fluid))) { - return bufferSize - buffer; - } else { - return 0.0; + if (getCurrentRecipe() == null) { + if (StrainingRecipe.getRecipeForFluid(fluid) == null) { + return 0.0; + } else { + return 1000.0 - fluidAmount; + } + } + if (getCurrentRecipe().input().contains(fluid)) { + return getCurrentRecipe().input().amountMillibuckets() - fluidAmount; } + return 0; } @Override public void onFluidAdded(@NotNull PylonFluid fluid, double amount) { - if (currentRecipe == null || !currentRecipe.input().contains(fluid)) { - passedFluid = 0; - currentRecipe = null; - for (StrainingRecipe recipe : StrainingRecipe.RECIPE_TYPE) { - if (recipe.input().contains(fluid)) { - currentRecipe = recipe; - break; - } - } - if (currentRecipe == null) { - throw new IllegalStateException("No recipe found for fluid: " + fluid); - } + if (!isProcessingRecipe()) { + StrainingRecipe recipe = StrainingRecipe.getRecipeForFluid(fluid); + Preconditions.checkState(recipe != null); + startRecipe(recipe, (int) Math.round(recipe.input().amountMillibuckets())); + fluidType = recipe.outputFluid(); + } + if (isProcessingRecipe()) { + progressRecipe((int) Math.round(amount)); } - buffer += amount; - passedFluid += amount; + fluidAmount += amount; + } + + @Override + public @NotNull Map getSuppliedFluids() { + return fluidType != null + ? Map.of(fluidType, fluidAmount) + : Map.of(); } @Override public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) { - buffer -= amount; + fluidAmount -= amount; + if (fluidAmount < 1.0e-6) { + fluidType = null; + } } @Override public @Nullable WailaDisplay getWaila(@NotNull Player player) { return new WailaDisplay(getDefaultWailaTranslationKey().arguments( - PylonArgument.of("info", currentRecipe == null ? - Component.empty() : - Component.translatable("pylon.pylonbase.waila.fluid_strainer.straining", - PylonArgument.of("item", currentRecipe.outputItem().effectiveName()), - PylonArgument.of("progress", UnitFormat.PERCENT.format(passedFluid / 10) - .decimalPlaces(0)) + PylonArgument.of("info", getCurrentRecipe() == null + ? Component.empty() + : Component.translatable("pylon.pylonbase.waila.fluid_strainer.straining", + PylonArgument.of("item", getCurrentRecipe().outputItem().effectiveName()), + PylonArgument.of("bars", BaseUtils.createProgressBar( + getCurrentRecipe().input().amountMillibuckets() - getRecipeTicksRemaining(), + getCurrentRecipe().input().amountMillibuckets(), + 20, + TextColor.color(100, 255, 100) + )), + PylonArgument.of("progress", 100.0 * getRecipeTicksRemaining() / getCurrentRecipe().input().amountMillibuckets()) ) ) )); } - @Override - @NotNull - public Component getGuiTitle() { - return getDefaultWailaTranslationKey(); - } - - private final VirtualInventory inventory = new VirtualInventory(9 * 3); - @Override public @NotNull Gui createGui() { return Gui.normal() - .setStructure( - ". . . . . . . . .", - ". . . . . . . . .", - ". . . . . . . . ." - ) + .setStructure("# # . . . . . # #") .addIngredient('.', inventory) + .addIngredient('#', GuiItems.background()) .build(); } @Override - public void tick() { - if (currentRecipe != null && passedFluid >= currentRecipe.input().amountMillibuckets()) { - inventory.addItem(null, currentRecipe.outputItem().clone()); - passedFluid -= currentRecipe.input().amountMillibuckets(); - } - if (passedFluid < 1e-9) { - currentRecipe = null; - passedFluid = 0; - } + public void onRecipeFinished(@NotNull StrainingRecipe recipe) { + inventory.addItem(new MachineUpdateReason(), recipe.outputItem()); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTank.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTank.java index e3baaa34..5d2b864f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTank.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTank.java @@ -1,5 +1,6 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; @@ -20,7 +21,7 @@ import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import io.github.pylonmc.pylon.core.util.position.ChunkPosition; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; @@ -38,6 +39,13 @@ public class FluidTank extends PylonBlock implements PylonMultiblock, PylonFluidTank, PylonEntityHolderBlock { + private final int maxHeight = getSettings().getOrThrow("max-height", ConfigAdapter.INT); + + private final List casings = new ArrayList<>(); + private final List allowedTemperatures = new ArrayList<>(); + + private int lastDisplayUpdate = -1; + public static class Item extends PylonItem { private final int maxHeight = getSettings().getOrThrow("max-height", ConfigAdapter.INT); @@ -54,13 +62,6 @@ public Item(@NotNull ItemStack stack) { } } - private final int maxHeight = getSettings().getOrThrow("max-height", ConfigAdapter.INT); - - private final List casings = new ArrayList<>(); - private final List allowedTemperatures = new ArrayList<>(); - - private int lastDisplayUpdate = -1; - @SuppressWarnings("unused") public FluidTank(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); @@ -71,7 +72,7 @@ public FluidTank(@NotNull Block block, @NotNull BlockCreateContext context) { createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); } - @SuppressWarnings({"unused", "DataFlowIssue"}) + @SuppressWarnings("unused") public FluidTank(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); } @@ -110,8 +111,8 @@ public void onMultiblockFormed() { public void onMultiblockRefreshed() { FluidTankCasing casingType = casings.getFirst(); allowedTemperatures.clear(); - allowedTemperatures.addAll(casingType.getAllowedTemperatures()); - setCapacity(casings.size() * casingType.getCapacity()); + allowedTemperatures.addAll(casingType.allowedTemperatures); + setCapacity(casings.size() * casingType.capacity); setFluid(Math.min(getFluidCapacity(), getFluidAmount())); int height = casings.size(); @@ -185,20 +186,17 @@ public boolean setFluid(double amount) { @Override public @NotNull WailaDisplay getWaila(@NotNull Player player) { - Component info; - if (getFluidType() == null) { - info = Component.translatable("pylon.pylonbase.waila.fluid_tank.empty"); - } else { - info = Component.translatable( - "pylon.pylonbase.waila.fluid_tank.filled", - PylonArgument.of("amount", Math.round(getFluidAmount())), - PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(getFluidCapacity()) - .decimalPlaces(0) - .unitStyle(Style.empty()) - ), - PylonArgument.of("fluid", getFluidType().getName()) - ); - } - return new WailaDisplay(getDefaultWailaTranslationKey().arguments(PylonArgument.of("info", info))); + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + getFluidAmount(), + getFluidCapacity(), + 20, + TextColor.color(200, 255, 255) + )), + PylonArgument.of("fluid", getFluidType() == null + ? Component.translatable("pylon.pylonbase.fluid.none") + : getFluidType().getName() + ) + )); } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTankCasing.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTankCasing.java index 026fb5e1..a6d40208 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTankCasing.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidTankCasing.java @@ -25,13 +25,17 @@ public class FluidTankCasing extends PylonBlock { - public static class Item extends PylonItem { + public final double capacity = getSettings().getOrThrow("capacity", ConfigAdapter.DOUBLE); + public final List allowedTemperatures = getSettings().getOrThrow( + "allowed-temperatures", + ConfigAdapter.LIST.from(ConfigAdapter.FLUID_TEMPERATURE) + ); + public Shape shape = Shape.SINGLE; - @Getter - private final double capacity = getSettings().getOrThrow("capacity", ConfigAdapter.DOUBLE); + public static class Item extends PylonItem { - @Getter - private final List allowedTemperatures = getSettings().getOrThrow( + public final double capacity = getSettings().getOrThrow("capacity", ConfigAdapter.DOUBLE); + public final List allowedTemperatures = getSettings().getOrThrow( "allowed-temperatures", ConfigAdapter.LIST.from(ConfigAdapter.FLUID_TEMPERATURE) ); @@ -54,18 +58,6 @@ public Item(@NotNull ItemStack stack) { } } - @Getter - private final double capacity = getSettings().getOrThrow("capacity", ConfigAdapter.DOUBLE); - - @Getter - private final List allowedTemperatures = getSettings().getOrThrow( - "allowed-temperatures", - ConfigAdapter.LIST.from(ConfigAdapter.FLUID_TEMPERATURE) - ); - - @Getter - private Shape shape = Shape.SINGLE; - public FluidTankCasing(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java index d7dbc8d9..524fa2a3 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidValve.java @@ -1,10 +1,14 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; -import com.google.common.base.Preconditions; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidTank; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; +import io.github.pylonmc.pylon.core.item.PylonItem; +import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import io.github.pylonmc.pylon.core.waila.WailaDisplay; import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; @@ -15,6 +19,7 @@ import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.PylonUtils; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; @@ -26,32 +31,52 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Map; import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class FluidValve extends PylonBlock implements PylonFluidTank, PylonInteractBlock { +public class FluidValve extends PylonBlock + implements PylonFluidTank, PylonInteractBlock, PylonDirectionalBlock { public static final NamespacedKey ENABLED_KEY = baseKey("enabled"); - - private static final int BRIGHTNESS_OFF = 6; - private static final int BRIGHTNESS_ON = 13; + public static final int BRIGHTNESS_OFF = 6; + public static final int BRIGHTNESS_ON = 13; private boolean enabled; + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + + public static class Item extends PylonItem { + + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + + public Item(@NotNull ItemStack stack) { + super(stack); + } + + @Override + public @NotNull List getPlaceholders() { + return List.of( + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) + ); + } + } + @SuppressWarnings("unused") public FluidValve(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - Preconditions.checkState(context instanceof BlockCreateContext.PlayerPlace, "Fluid valve can only be placed by a player"); - Player player = ((BlockCreateContext.PlayerPlace) context).getPlayer(); - createFluidPoint(FluidPointType.INPUT, BlockFace.EAST, context, false, 0.25F); - createFluidPoint(FluidPointType.OUTPUT, BlockFace.WEST, context, false, 0.25F); + setCapacity(buffer); + setFacing(context.getFacing()); + createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false, 0.25F); + createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false, 0.25F); addEntity("main", new ItemDisplayBuilder() .itemStack(ItemStackBuilder.of(Material.WHITE_CONCRETE) .addCustomModelDataString(getKey() + ":main") @@ -59,22 +84,23 @@ public FluidValve(@NotNull Block block, @NotNull BlockCreateContext context) { ) .brightness(BRIGHTNESS_OFF) .transformation(new TransformBuilder() - .lookAlong(PylonUtils.rotateToPlayerFacing(player, BlockFace.EAST, false).getDirection().toVector3d()) + .lookAlong(PylonUtils.rotateFaceToReference(getFacing(), BlockFace.NORTH).getDirection().toVector3d()) .scale(0.25, 0.25, 0.5) ) .build(getBlock().getLocation().toCenterLocation()) ); + setDisableBlockTextureEntity(true); enabled = false; - setDisableBlockTextureEntity(true); } @SuppressWarnings({"unused", "DataFlowIssue"}) public FluidValve(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block); - enabled = pdc.get(ENABLED_KEY, PylonSerializers.BOOLEAN); setDisableBlockTextureEntity(true); + + enabled = pdc.get(ENABLED_KEY, PylonSerializers.BOOLEAN); } @Override @@ -98,10 +124,21 @@ public void onInteract(@NotNull PlayerInteractEvent event) { @Override public @Nullable WailaDisplay getWaila(@NotNull Player player) { - return new WailaDisplay(getDefaultWailaTranslationKey().arguments(PylonArgument.of( - "status", - Component.translatable("pylon.pylonbase.message.valve." + (enabled ? "enabled" : "disabled")) - ))); + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("status", Component.translatable( + "pylon.pylonbase.message.valve." + (enabled ? "enabled" : "disabled") + )), + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + getFluidAmount(), + getFluidCapacity(), + 20, + TextColor.color(200, 255, 255) + )), + PylonArgument.of("fluid", getFluidType() == null + ? Component.translatable("pylon.pylonbase.fluid.none") + : getFluidType().getName() + ) + )); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java index 658c1985..e4158bba 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/PortableFluidTank.java @@ -2,6 +2,7 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.PylonBase; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidTank; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; @@ -23,7 +24,7 @@ import lombok.Getter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.JoinConfiguration; -import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -94,7 +95,10 @@ public void setAmount(double amount) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("fluid", getFluid() == null ? Component.translatable("pylon.pylonbase.fluid.none") : getFluid().getName()), + PylonArgument.of("fluid", getFluid() == null + ? Component.translatable("pylon.pylonbase.fluid.none") + : getFluid().getName() + ), PylonArgument.of("amount", Math.round(getAmount())), PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(capacity)), PylonArgument.of("temperatures", Component.join( @@ -170,21 +174,18 @@ public boolean setFluid(double amount) { @Override public @Nullable WailaDisplay getWaila(@NotNull Player player) { - Component info; - if (getFluidType() == null) { - info = Component.translatable("pylon.pylonbase.waila.fluid_tank.empty"); - } else { - info = Component.translatable( - "pylon.pylonbase.waila.fluid_tank.filled", - PylonArgument.of("amount", Math.round(getFluidAmount())), - PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(capacity) - .decimalPlaces(0) - .unitStyle(Style.empty()) - ), - PylonArgument.of("fluid", getFluidType().getName()) - ); - } - return new WailaDisplay(getDefaultWailaTranslationKey().arguments(PylonArgument.of("info", info))); + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + getFluidAmount(), + getFluidCapacity(), + 20, + TextColor.color(200, 255, 255) + )), + PylonArgument.of("fluid", getFluidType() == null + ? Component.translatable("pylon.pylonbase.fluid.none") + : getFluidType().getName() + ) + )); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java index 4bba0e30..4fc013d5 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java @@ -4,6 +4,7 @@ import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.content.tools.WateringCan; import io.github.pylonmc.pylon.base.content.tools.WateringSettings; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonFlowerPot; @@ -19,15 +20,19 @@ import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; import io.papermc.paper.event.player.PlayerFlowerPotManipulateEvent; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -35,6 +40,12 @@ public class Sprinkler extends PylonBlock implements PylonFluidBufferBlock, PylonTickingBlock, PylonFlowerPot { + private static final Config settings = Settings.get(BaseKeys.SPRINKLER); + public static final WateringSettings SETTINGS = WateringSettings.fromConfig(settings); + public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); + public static final double WATER_PER_SECOND = settings.getOrThrow("water-per-second", ConfigAdapter.INT); + public static final double BUFFER = settings.getOrThrow("buffer", ConfigAdapter.INT); + public static class Item extends PylonItem { public Item(@NotNull ItemStack stack) { @@ -45,22 +56,18 @@ public Item(@NotNull ItemStack stack) { public @NotNull List getPlaceholders() { return List.of( PylonArgument.of("range", UnitFormat.BLOCKS.format(SETTINGS.horizontalRange())), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(BUFFER)), PylonArgument.of("water_consumption", UnitFormat.MILLIBUCKETS_PER_SECOND.format(WATER_PER_SECOND)) ); } } - private static final Config settings = Settings.get(BaseKeys.SPRINKLER); - public static final WateringSettings SETTINGS = WateringSettings.fromConfig(settings); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); - public static final double WATER_PER_SECOND = settings.getOrThrow("water-per-second", ConfigAdapter.INT); - @SuppressWarnings("unused") public Sprinkler(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); setTickInterval(TICK_INTERVAL); createFluidPoint(FluidPointType.INPUT, BlockFace.UP, -0.15F); - createFluidBuffer(BaseFluids.WATER, WATER_PER_SECOND * 5, true, false); + createFluidBuffer(BaseFluids.WATER, BUFFER, true, false); } @SuppressWarnings("unused") @@ -69,18 +76,30 @@ public Sprinkler(@NotNull Block block, @NotNull PersistentDataContainer pdc) { } @Override - public void onFlowerPotManipulated(PlayerFlowerPotManipulateEvent event) { + public void onFlowerPotManipulated(@NotNull PlayerFlowerPotManipulateEvent event) { event.setCancelled(true); } @Override public void tick() { - if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * PylonConfig.fluidTickInterval) { + if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * PylonConfig.fluidTickInterval / 20.0) { WateringCan.water(getBlock(), SETTINGS); - removeFluid(BaseFluids.WATER, WATER_PER_SECOND * PylonConfig.fluidTickInterval); + removeFluid(BaseFluids.WATER, WATER_PER_SECOND * PylonConfig.fluidTickInterval / 20.0); } } + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.WATER), + fluidCapacity(BaseFluids.WATER), + 20, + NamedTextColor.BLUE + )) + )); + } + public static class SprinklerPlaceListener implements Listener { @EventHandler private static void handle(@NotNull PrePylonBlockPlaceEvent event) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java index 91b9d3b6..d82f9942 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java @@ -24,6 +24,8 @@ public class WaterPump extends PylonBlock implements PylonFluidBlock { + public final double waterPerSecond = getSettings().getOrThrow("water-per-second", ConfigAdapter.DOUBLE); + public static class Item extends PylonItem { public final double waterPerSecond = getSettings().getOrThrow("water-per-second", ConfigAdapter.DOUBLE); @@ -40,8 +42,6 @@ public Item(@NotNull ItemStack stack) { } } - public final double waterPerSecond = getSettings().getOrThrow("water-per-second", ConfigAdapter.DOUBLE); - @SuppressWarnings("unused") public WaterPump(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); @@ -57,7 +57,7 @@ public WaterPump(@NotNull Block block, @NotNull PersistentDataContainer pdc) { public @NotNull Map getSuppliedFluids() { return getBlock().getRelative(BlockFace.DOWN).getType() == Material.WATER ? Map.of(BaseFluids.WATER, waterPerSecond * PylonConfig.fluidTickInterval / 20.0) - : Map.of() ; + : Map.of(); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java index c00d0dae..6023c088 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java @@ -70,7 +70,7 @@ public CurrentItem(@NotNull Supplier getFluid) { PylonArgument.of( "fluid", Component.translatable((fluid == null - ? "pylon.pylonbase.message.fluid_none" + ? "pylon.pylonbase.fluid.none" : "pylon.pylonbase.fluid." + fluid.getKey().getKey() )) )) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java index 00761a22..b0aafbd2 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/CoalFiredPurificationTower.java @@ -2,32 +2,30 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; -import io.github.pylonmc.pylon.core.block.base.PylonProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonSimpleMultiblock; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.ConfigSection; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.i18n.PylonArgument; -import io.github.pylonmc.pylon.core.item.ItemTypeWrapper; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; +import io.github.pylonmc.pylon.core.registry.PylonRegistry; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.GuiItems; import io.github.pylonmc.pylon.core.util.gui.ProgressItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Keyed; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -40,37 +38,69 @@ import java.util.List; import java.util.Map; +import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class CoalFiredPurificationTower extends PylonBlock - implements PylonFluidBufferBlock, PylonSimpleMultiblock, PylonProcessor, PylonGuiBlock, PylonTickingBlock { - private static final Config settings = Settings.get(BaseKeys.COAL_FIRED_PURIFICATION_TOWER); - public static final double PURIFICATION_SPEED = settings.getOrThrow("purification-speed", ConfigAdapter.INT); - public static final double PURIFICATION_EFFICIENCY = settings.getOrThrow("purification-efficiency", ConfigAdapter.DOUBLE); - public static final double HYDRAULIC_FLUID_BUFFER = settings.getOrThrow("hydraulic-fluid-buffer", ConfigAdapter.INT); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); - public static final Map FUELS = new HashMap<>(); +public class CoalFiredPurificationTower extends PylonBlock implements + PylonFluidBufferBlock, + PylonSimpleMultiblock, + PylonDirectionalBlock, + PylonProcessor, + PylonGuiBlock, + PylonTickingBlock { - static { - ConfigSection config = settings.getSectionOrThrow("fuels"); - for (String key : config.getKeys()) { - FUELS.put( - ItemTypeWrapper.of(NamespacedKey.fromString(key)).createItemStack(), - config.getOrThrow(key, ConfigAdapter.INT) - ); + public final double purificationSpeed = getSettings().getOrThrow("purification-speed", ConfigAdapter.INT); + public final double purificationEfficiency = getSettings().getOrThrow("purification-efficiency", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + + public static final NamespacedKey FUELS_KEY = baseKey("smeltery_burner_fuels"); + public static final PylonRegistry FUELS = new PylonRegistry<>(FUELS_KEY); + + // TODO display fuels + public record Fuel( + @NotNull NamespacedKey key, + @NotNull ItemStack stack, + int burnTimeSeconds + ) implements Keyed { + @Override + public @NotNull NamespacedKey getKey() { + return key; } } + static { + PylonRegistry.addRegistry(FUELS); + FUELS.register(new Fuel( + baseKey("coal"), + new ItemStack(Material.COAL), + 15 + )); + FUELS.register(new Fuel( + baseKey("coal_block"), + new ItemStack(Material.COAL_BLOCK), + 135 + )); + FUELS.register(new Fuel( + baseKey("charcoal"), + new ItemStack(Material.CHARCOAL), + 10 + )); + } + private final ItemStackBuilder idleProgressItem = ItemStackBuilder.of(Material.BLAZE_POWDER) .name(Component.translatable("pylon.pylonbase.item.coal_fired_purification_tower.progress_item.idle")); private final ItemStackBuilder runningProgressItem = ItemStackBuilder.of(Material.BLAZE_POWDER) .name(Component.translatable("pylon.pylonbase.item.coal_fired_purification_tower.progress_item.running")); private final VirtualInventory inventory = new VirtualInventory(1); - private final ProgressItem progressItem = new ProgressItem(idleProgressItem); public static class Item extends PylonItem { + public final double purificationSpeed = getSettings().getOrThrow("purification-speed", ConfigAdapter.INT); + public final double purificationEfficiency = getSettings().getOrThrow("purification-efficiency", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -78,8 +108,9 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("purification_speed", UnitFormat.MILLIBUCKETS_PER_SECOND.format(PURIFICATION_SPEED)), - PylonArgument.of("purification_efficiency", UnitFormat.PERCENT.format(PURIFICATION_EFFICIENCY * 100)) + PylonArgument.of("purification_speed", UnitFormat.MILLIBUCKETS_PER_SECOND.format(purificationSpeed)), + PylonArgument.of("purification_efficiency", UnitFormat.PERCENT.format(purificationEfficiency * 100)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -87,11 +118,13 @@ public Item(@NotNull ItemStack stack) { @SuppressWarnings("unused") public CoalFiredPurificationTower(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - setTickInterval(TICK_INTERVAL); - createFluidPoint(FluidPointType.INPUT, BlockFace.EAST, context, false); - createFluidPoint(FluidPointType.OUTPUT, BlockFace.WEST, context, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, true, false); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, false, true); + setTickInterval(tickInterval); + setFacing(context.getFacing()); + setProcessProgressItem(new ProgressItem(GuiItems.background())); + createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); + createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") @@ -99,11 +132,6 @@ public CoalFiredPurificationTower(@NotNull Block block, @NotNull PersistentDataC super(block, pdc); } - @Override - public void postInitialise() { - setProcessProgressItem(progressItem); - } - @Override public @NotNull Gui createGui() { return Gui.normal() @@ -113,7 +141,7 @@ public void postInitialise() { "# # # # x # # # #", "# # # # # # # # #" ) - .addIngredient('f', progressItem) + .addIngredient('f', getProcessProgressItem()) .addIngredient('x', inventory) .addIngredient('#', GuiItems.background()) .build(); @@ -139,18 +167,18 @@ public void tick() { return; } - progressProcess(TICK_INTERVAL); + progressProcess(tickInterval); if (!isProcessing()) { ItemStack item = inventory.getUnsafeItem(0); - for (Map.Entry fuel : FUELS.entrySet()) { - if (item == null || !PylonUtils.isPylonSimilar(item, fuel.getKey())) { + for (Fuel fuel : FUELS) { + if (item == null || !PylonUtils.isPylonSimilar(item, fuel.stack)) { continue; } inventory.setItemAmount(null, 0, item.getAmount() - 1); - progressItem.setItemStackBuilder(runningProgressItem); - startProcess(fuel.getValue() * 20); + getProcessProgressItem().setItemStackBuilder(runningProgressItem); + startProcess(fuel.burnTimeSeconds * 20); break; } } @@ -161,22 +189,40 @@ public void tick() { double toPurify = Math.min( // maximum amount of dirty hydraulic fluid that can be purified this tick - PURIFICATION_SPEED * getTickInterval() / 20.0, + purificationSpeed * getTickInterval() / 20.0, Math.min( // amount of dirty hydraulic fluid available fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), // how much dirty hydraulic fluid can be converted without overflowing the hydraulic fluid buffer - fluidSpaceRemaining(BaseFluids.HYDRAULIC_FLUID) / PURIFICATION_EFFICIENCY + fluidSpaceRemaining(BaseFluids.HYDRAULIC_FLUID) / purificationEfficiency ) ); removeFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, toPurify); - addFluid(BaseFluids.HYDRAULIC_FLUID, toPurify * PURIFICATION_EFFICIENCY); + addFluid(BaseFluids.HYDRAULIC_FLUID, toPurify * purificationEfficiency); } @Override public void onProcessFinished() { - progressItem.setItemStackBuilder(idleProgressItem); + getProcessProgressItem().setItemStackBuilder(idleProgressItem); + } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )) + )); } public boolean isRunning() { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java index df6bc9e6..5c5145d9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrill.java @@ -4,24 +4,27 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.content.machines.simple.CoreDrill; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Vector3i; import java.util.ArrayList; @@ -31,8 +34,13 @@ public class HydraulicCoreDrill extends CoreDrill implements PylonTickingBlock { + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double hydraulicFluidPerCycle = hydraulicFluidUsage * getCycleDuration() / 20.0; + public static class Item extends CoreDrill.Item { + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -40,15 +48,11 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { List placeholders = new ArrayList<>(super.getPlaceholders()); - placeholders.add(PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(HYDRAULIC_FLUID_USAGE))); + placeholders.add(PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(hydraulicFluidUsage))); return placeholders; } } - public static final Config settings = Settings.get(BaseKeys.HYDRAULIC_CORE_DRILL); - public static final int HYDRAULIC_FLUID_USAGE = settings.getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); - public final double hydraulicFluidPerCycle = HYDRAULIC_FLUID_USAGE * getCycleDuration() / 20.0; - @SuppressWarnings("unused") public HydraulicCoreDrill(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); @@ -126,7 +130,6 @@ public void tick() { @Override public void onProcessFinished() { - Vector3i chestOffset = PylonUtils.rotateVectorToFace(new Vector3i(0, -2, 4), getFacing()); if (!(getBlock().getRelative(chestOffset.x, chestOffset.y, chestOffset.z).getState() instanceof Chest chest)) { return; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillHatch.java index 215cf5dc..4aa8d699 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillHatch.java @@ -9,7 +9,9 @@ import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.fluid.PylonFluid; +import io.github.pylonmc.pylon.core.util.position.BlockPosition; import io.github.pylonmc.pylon.core.util.position.ChunkPosition; +import io.github.pylonmc.pylon.core.waila.Waila; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; @@ -47,6 +49,12 @@ public boolean isPartOfMultiblock(@NotNull Block otherBlock) { return getBlock().getRelative(BlockFace.UP) == otherBlock; } + @Override + public void onMultiblockRefreshed() { + Waila.addWailaOverride(new BlockPosition(getBlock().getRelative(BlockFace.UP)), this::getWaila); + } + + @Override public boolean setFluid(@NotNull PylonFluid fluid, double amount) { boolean result = PylonFluidBufferBlock.super.setFluid(fluid, amount); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillInputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillInputHatch.java index 8b9922eb..564c4d15 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillInputHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillInputHatch.java @@ -2,27 +2,34 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.fluid.FluidPointType; +import io.github.pylonmc.pylon.core.i18n.PylonArgument; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class HydraulicCoreDrillInputHatch extends HydraulicCoreDrillHatch { - private final double capacity = Settings.get(BaseKeys.FLUID_TANK_CASING_COPPER).getOrThrow("capacity", ConfigAdapter.DOUBLE); + private final double buffer = Settings.get(BaseKeys.FLUID_TANK_CASING_COPPER) + .getOrThrow("capacity", ConfigAdapter.DOUBLE); @SuppressWarnings("unused") public HydraulicCoreDrillInputHatch(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); createFluidBuffer( BaseFluids.HYDRAULIC_FLUID, - capacity, + buffer, true, false ); @@ -41,7 +48,7 @@ public HydraulicCoreDrillInputHatch(@NotNull Block block, @NotNull PersistentDat @Override public void onMultiblockFormed() { - setFluidCapacity(BaseFluids.HYDRAULIC_FLUID, capacity); + setFluidCapacity(BaseFluids.HYDRAULIC_FLUID, buffer); } @Override @@ -51,4 +58,16 @@ public void onMultiblockUnformed(boolean partUnloaded) { setFluid(BaseFluids.HYDRAULIC_FLUID, 0); } } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillOutputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillOutputHatch.java index 5dbf022a..d9147c81 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillOutputHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicCoreDrillOutputHatch.java @@ -2,27 +2,34 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.fluid.FluidPointType; +import io.github.pylonmc.pylon.core.i18n.PylonArgument; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class HydraulicCoreDrillOutputHatch extends HydraulicCoreDrillHatch { - private final double capacity = Settings.get(BaseKeys.FLUID_TANK_CASING_COPPER).getOrThrow("capacity", ConfigAdapter.DOUBLE); + private final double buffer = Settings.get(BaseKeys.FLUID_TANK_CASING_COPPER) + .getOrThrow("capacity", ConfigAdapter.DOUBLE); @SuppressWarnings("unused") public HydraulicCoreDrillOutputHatch(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); createFluidBuffer( BaseFluids.DIRTY_HYDRAULIC_FLUID, - capacity, + buffer, false, true ); @@ -41,7 +48,7 @@ public HydraulicCoreDrillOutputHatch(@NotNull Block block, @NotNull PersistentDa @Override public void onMultiblockFormed() { - setFluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID, capacity); + setFluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer); } @Override @@ -51,4 +58,16 @@ public void onMultiblockUnformed(boolean partUnloaded) { setFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, 0); } } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("bars", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java index 69c71996..d6411473 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicExcavator.java @@ -1,14 +1,13 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.fluid.FluidPointType; @@ -16,14 +15,18 @@ import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import io.github.pylonmc.pylon.core.util.position.BlockPosition; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.NamespacedKey; import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -31,10 +34,33 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class HydraulicExcavator extends PylonBlock implements PylonTickingBlock, PylonInteractBlock, PylonFluidBufferBlock { +public class HydraulicExcavator extends PylonBlock implements + PylonTickingBlock, + PylonDirectionalBlock, + PylonInteractBlock, + PylonFluidBufferBlock { + + public static final NamespacedKey WORKING_KEY = baseKey("working"); + public static final NamespacedKey INDEX_KEY = baseKey("index"); + + public final int radius = getSettings().getOrThrow("radius", ConfigAdapter.INT); + public final int depth = getSettings().getOrThrow("depth", ConfigAdapter.INT); + public final int blockBreakIntervalTicks = getSettings().getOrThrow("block-break-interval-ticks", ConfigAdapter.INT); + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + + private final List blockPositions = new ArrayList<>(); + private boolean working; + private int index; public static class Item extends PylonItem { + public final int radius = getSettings().getOrThrow("radius", ConfigAdapter.INT); + public final int depth = getSettings().getOrThrow("depth", ConfigAdapter.INT); + public final int blockBreakIntervalTicks = getSettings().getOrThrow("block-break-interval-ticks", ConfigAdapter.INT); + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -42,32 +68,19 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("radius", UnitFormat.BLOCKS.format(RADIUS)), - PylonArgument.of("depth", UnitFormat.BLOCKS.format(DEPTH)), - PylonArgument.of("time-per-block", UnitFormat.SECONDS.format(BLOCK_BREAK_INTERVAL_TICKS / 20.0)), - PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(HYDRAULIC_FLUID_USAGE)) + PylonArgument.of("radius", UnitFormat.BLOCKS.format(radius)), + PylonArgument.of("depth", UnitFormat.BLOCKS.format(depth)), + PylonArgument.of("time-per-block", UnitFormat.SECONDS.format(blockBreakIntervalTicks / 20.0)), + PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(hydraulicFluidUsage)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } - public static final NamespacedKey WORKING_KEY = baseKey("working"); - public static final NamespacedKey INDEX_KEY = baseKey("index"); - - public static final Config settings = Settings.get(BaseKeys.HYDRAULIC_EXCAVATOR); - public static final int RADIUS = settings.getOrThrow("radius", ConfigAdapter.INT); - public static final int DEPTH = settings.getOrThrow("depth", ConfigAdapter.INT); - public static final int BLOCK_BREAK_INTERVAL_TICKS = settings.getOrThrow("block-break-interval-ticks", ConfigAdapter.INT); - public static final int HYDRAULIC_FLUID_USAGE = settings.getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_BUFFER = settings.getOrThrow("hydraulic-fluid-buffer", ConfigAdapter.DOUBLE); - - private final List blockPositions = new ArrayList<>(); - private boolean working; - private int index; - private void initBlockPositions() { - for (int y = 0; y >= -DEPTH; y--) { - for (int x = -RADIUS; x <= RADIUS; x++) { - for (int z = -RADIUS; z <= RADIUS; z++) { + for (int y = 0; y >= -depth; y--) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { blockPositions.add(new BlockPosition(getBlock().getRelative(x, y, z))); } } @@ -81,13 +94,14 @@ public HydraulicExcavator(@NotNull Block block, @NotNull BlockCreateContext cont working = false; index = 0; - setTickInterval(BLOCK_BREAK_INTERVAL_TICKS); + setTickInterval(blockBreakIntervalTicks); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings({"DataFlowIssue", "unused"}) @@ -116,7 +130,7 @@ public void tick() { return; } - double hydraulicFluidUsed = HYDRAULIC_FLUID_USAGE * getTickInterval() / 20.0; + double hydraulicFluidUsed = hydraulicFluidUsage * getTickInterval() / 20.0; if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidUsed || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidUsed @@ -145,4 +159,22 @@ public void tick() { public void onInteract(@NotNull PlayerInteractEvent event) { working = true; } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java index 2a70fb7e..b18af19a 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicFarmer.java @@ -1,31 +1,34 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; import lombok.Getter; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.DoubleChest; import org.bukkit.block.data.Ageable; +import org.bukkit.entity.Player; import org.bukkit.inventory.BlockInventoryHolder; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -36,8 +39,11 @@ import java.util.Set; -public class HydraulicFarmer extends PylonBlock - implements PylonEntityHolderBlock, PylonTickingBlock, PylonFluidBufferBlock { +public class HydraulicFarmer extends PylonBlock implements + PylonEntityHolderBlock, + PylonTickingBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock { private static final Set CROPS_TO_BREAK = EnumSet.of( Material.PUMPKIN, @@ -62,13 +68,18 @@ public class HydraulicFarmer extends PylonBlock Material.SOUL_SAND, Map.of(Material.NETHER_WART, Material.NETHER_WART) ); - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_FARMER); - public static final int RADIUS = settings.getOrThrow("radius", ConfigAdapter.INT); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_USAGE = settings.getOrThrow("hydraulic-fluid-usage", ConfigAdapter.DOUBLE); + public final int radius = getSettings().getOrThrow("radius", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public final double hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); public static class Item extends PylonItem { + public final int radius = getSettings().getOrThrow("radius", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public final double hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -76,9 +87,10 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("radius", UnitFormat.BLOCKS.format(RADIUS)), - PylonArgument.of("tick-interval", UnitFormat.SECONDS.format(TICK_INTERVAL / 20.0)), - PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(HYDRAULIC_FLUID_USAGE)) + PylonArgument.of("radius", UnitFormat.BLOCKS.format(radius)), + PylonArgument.of("tick-interval", UnitFormat.SECONDS.format(tickInterval / 20.0)), + PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(hydraulicFluidUsage)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -87,14 +99,15 @@ public Item(@NotNull ItemStack stack) { public HydraulicFarmer(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - setTickInterval(TICK_INTERVAL); + setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); int seconds = getTickInterval() / 20; - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_USAGE * seconds, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_USAGE * seconds, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") @@ -105,7 +118,7 @@ public HydraulicFarmer(@NotNull Block block, @NotNull PersistentDataContainer pd @Override public void tick() { - double hydraulicFluidUsed = HYDRAULIC_FLUID_USAGE * getTickInterval() / 20.0; + double hydraulicFluidUsed = hydraulicFluidUsage * getTickInterval() / 20.0; if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidUsed || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidUsed @@ -216,11 +229,11 @@ private static Material getFarmlandFromItem(Material crop) { } private List getFarmingTiles() { - int diameter = 2 * RADIUS + 1; + int diameter = 2 * radius + 1; ArrayList tiles = new ArrayList<>(diameter * diameter); - for (int x = -RADIUS; x <= RADIUS; x++) { - for (int z = -RADIUS; z <= RADIUS; z++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { Block cropBlock = getBlock().getRelative(x, 0, z); tiles.add( @@ -268,4 +281,22 @@ private List getItemsFromChest() { } return stacks; } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java index d36f62ea..21216577 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicGrindstoneTurner.java @@ -1,42 +1,46 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; -import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.content.machines.simple.Grindstone; import io.github.pylonmc.pylon.base.recipes.GrindstoneRecipe; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonMultiblock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; -import io.github.pylonmc.pylon.core.util.position.ChunkPosition; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; -public class HydraulicGrindstoneTurner extends PylonBlock implements PylonMultiblock, PylonTickingBlock, PylonFluidBufferBlock { +public class HydraulicGrindstoneTurner extends PylonBlock implements + PylonTickingBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock { - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_GRINDSTONE_TURNER); - public static final int HYDRAULIC_FLUID_USAGE = settings.getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_BUFFER = settings.getOrThrow("hydraulic-fluid-buffer", ConfigAdapter.INT); + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); public static class Item extends PylonItem { + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -44,7 +48,8 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(HYDRAULIC_FLUID_USAGE)) + PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(hydraulicFluidUsage)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -53,10 +58,11 @@ public Item(@NotNull ItemStack stack) { public HydraulicGrindstoneTurner(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(Grindstone.CYCLE_DURATION_TICKS + 1); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") @@ -64,30 +70,13 @@ public HydraulicGrindstoneTurner(@NotNull Block block, @NotNull PersistentDataCo super(block, pdc); } - @Override - public @NotNull Set<@NotNull ChunkPosition> getChunksOccupied() { - return Set.of(new ChunkPosition(getBlock().getChunk())); - } - - @Override - public boolean checkFormed() { - return BlockStorage.get(getBlock().getRelative(BlockFace.UP)) instanceof Grindstone; - } - - @Override - public boolean isPartOfMultiblock(@NotNull Block otherBlock) { - return otherBlock == getBlock().getRelative(BlockFace.UP); - } - @Override public void tick() { - if (!isFormedAndFullyLoaded()) { + Grindstone grindstone = BlockStorage.getAs(Grindstone.class, getBlock().getRelative(BlockFace.UP)); + if (grindstone == null) { return; } - Grindstone grindstone = BlockStorage.getAs(Grindstone.class, getBlock().getRelative(BlockFace.UP)); - Preconditions.checkState(grindstone != null); - if (grindstone.isProcessingRecipe()) { return; } @@ -97,11 +86,11 @@ public void tick() { return; } - double hydraulicFluidUsed = HYDRAULIC_FLUID_USAGE * nextRecipe.timeTicks() / 20.0; + double hydraulicFluidUsed = hydraulicFluidUsage * nextRecipe.timeTicks() / 20.0; if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidUsed || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidUsed - || !grindstone.tryStartRecipe(nextRecipe, null) + || !grindstone.tryStartRecipe(nextRecipe) ) { return; } @@ -109,4 +98,22 @@ public void tick() { removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidUsed); addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidUsed); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java index 150b92f5..471cf846 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicHammerHead.java @@ -2,19 +2,14 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.PylonBase; import io.github.pylonmc.pylon.base.content.tools.Hammer; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; @@ -25,7 +20,8 @@ import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; -import lombok.Getter; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -33,6 +29,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; @@ -46,14 +43,19 @@ import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; -public class HydraulicHammerHead extends PylonBlock implements PylonTickingBlock, PylonInteractBlock, PylonFluidBufferBlock { +public class HydraulicHammerHead extends PylonBlock implements + PylonTickingBlock, + PylonInteractBlock, + PylonFluidBufferBlock, + PylonProcessor, + PylonDirectionalBlock { public static final NamespacedKey HAMMER_KEY = baseKey("hammer"); - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_HAMMER_HEAD); - public static final int GO_DOWN_TIME_TICKS = settings.getOrThrow("go-down-time-ticks", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_PER_CRAFT = settings.getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); + public final int goDownTimeTicks = getSettings().getOrThrow("go-down-time-ticks", ConfigAdapter.INT); + public final double hydraulicFluidPerCraft = getSettings().getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); private final ItemStack emptyHammerTipStack = ItemStackBuilder.of(Material.AIR) .addCustomModelDataString(getKey() + ":hammer_tip:empty") @@ -61,6 +63,9 @@ public class HydraulicHammerHead extends PylonBlock implements PylonTickingBlock public static class Item extends PylonItem { + public final double hydraulicFluidPerCraft = getSettings().getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -68,13 +73,13 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("hydraulic-fluid-per-craft", UnitFormat.MILLIBUCKETS.format(HYDRAULIC_FLUID_PER_CRAFT)) + PylonArgument.of("hydraulic-fluid-per-craft", UnitFormat.MILLIBUCKETS.format(hydraulicFluidPerCraft)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } - @Getter @Nullable private Hammer hammer; - @Getter double cooldown; + public @Nullable Hammer hammer; @SuppressWarnings("unused") public HydraulicHammerHead(@NotNull Block block, @NotNull BlockCreateContext context) { @@ -82,7 +87,8 @@ public HydraulicHammerHead(@NotNull Block block, @NotNull BlockCreateContext con hammer = null; - setTickInterval(TICK_INTERVAL); + setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); @@ -100,8 +106,8 @@ public HydraulicHammerHead(@NotNull Block block, @NotNull BlockCreateContext con .build(getBlock().getLocation().toCenterLocation().add(0, -1, 0)) ); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT * 2, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT * 2, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") @@ -145,14 +151,16 @@ public void onInteract(@NotNull PlayerInteractEvent event) { @Override public void tick() { - cooldown = Math.max(0, cooldown - getTickInterval()); + if (isProcessing()) { + progressProcess(getTickInterval()); + return; + } - if (cooldown > 1.0e-5 || hammer == null) { + if (hammer == null) { return; } Block baseBlock = getBlock().getRelative(BlockFace.DOWN, 3); - if (BlockStorage.isPylonBlock(baseBlock) || baseBlock.getType() != hammer.baseBlock) { return; } @@ -167,31 +175,31 @@ public void tick() { ); } - if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < HYDRAULIC_FLUID_PER_CRAFT - || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < HYDRAULIC_FLUID_PER_CRAFT + if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidPerCraft + || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidPerCraft || !hammer.tryDoRecipe(baseBlock, null, null) ) { return; } - removeFluid(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT); - addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT); + removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidPerCraft); + addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidPerCraft); - BaseUtils.animate(getHammerHead(), GO_DOWN_TIME_TICKS, getHeadTransformation(-0.7)); - BaseUtils.animate(getHammerTip(), GO_DOWN_TIME_TICKS, getTipTransformation(-1.7)); + BaseUtils.animate(getHammerHead(), goDownTimeTicks, getHeadTransformation(-0.5)); + BaseUtils.animate(getHammerTip(), goDownTimeTicks, getTipTransformation(-1.5)); Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - BaseUtils.animate(getHammerHead(), hammer.cooldownTicks - GO_DOWN_TIME_TICKS, getHeadTransformation(0.7)); - BaseUtils.animate(getHammerTip(), hammer.cooldownTicks - GO_DOWN_TIME_TICKS, getHeadTransformation(0.7)); + BaseUtils.animate(getHammerHead(), hammer.cooldownTicks - goDownTimeTicks, getHeadTransformation(0.7)); + BaseUtils.animate(getHammerTip(), hammer.cooldownTicks - goDownTimeTicks, getTipTransformation(-0.3)); new ParticleBuilder(Particle.BLOCK) .data(baseBlock.getBlockData()) .count(20) .location(baseBlock.getLocation().toCenterLocation().add(0, 0.6, 0)) .spawn(); - }, GO_DOWN_TIME_TICKS); + }, goDownTimeTicks); - cooldown = hammer.cooldownTicks / 20.0; + startProcess(hammer.cooldownTicks); } @Override @@ -222,4 +230,22 @@ public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreak .scale(0.6, 0.1, 0.6) .buildForItemDisplay(); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java index 8f04f014..a6781248 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicMixingAttachment.java @@ -1,21 +1,17 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; -import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.PylonBase; import io.github.pylonmc.pylon.base.content.machines.simple.MixingPot; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonMultiblock; +import io.github.pylonmc.pylon.core.block.base.PylonProcessor; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; -import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; import io.github.pylonmc.pylon.core.fluid.FluidPointType; @@ -23,14 +19,14 @@ import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; -import io.github.pylonmc.pylon.core.util.position.ChunkPosition; -import lombok.Getter; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -38,24 +34,27 @@ import org.joml.Matrix4f; import java.util.List; -import java.util.Set; -import static io.github.pylonmc.pylon.base.util.BaseUtils.baseKey; +public class HydraulicMixingAttachment extends PylonBlock implements + PylonTickingBlock, + PylonFluidBufferBlock, + PylonProcessor, + PylonDirectionalBlock { -public class HydraulicMixingAttachment extends PylonBlock implements PylonMultiblock, PylonTickingBlock, PylonFluidBufferBlock { - - public static final NamespacedKey COOLDOWN_TIME_REMAINING_KEY = baseKey("cooldown_time_remaining"); - - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_MIXING_ATTACHMENT); - public static final int COOLDOWN_TICKS = settings.getOrThrow("cooldown-ticks", ConfigAdapter.INT); - public static final int DOWN_ANIMATION_TIME_TICKS = settings.getOrThrow("down-animation-time-ticks", ConfigAdapter.INT); - public static final int UP_ANIMATION_TIME_TICKS = settings.getOrThrow("up-animation-time-ticks", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_PER_CRAFT = settings.getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); + public final int cooldownTicks = getSettings().getOrThrow("cooldown-ticks", ConfigAdapter.INT); + public final int downAnimationTimeTicks = getSettings().getOrThrow("down-animation-time-ticks", ConfigAdapter.INT); + public final int upAnimationTimeTicks = getSettings().getOrThrow("up-animation-time-ticks", ConfigAdapter.INT); + public final double hydraulicFluidPerCraft = getSettings().getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); public static class Item extends PylonItem { + public final int cooldownTicks = getSettings().getOrThrow("cooldown-ticks", ConfigAdapter.INT); + public final double hydraulicFluidPerCraft = getSettings().getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -63,21 +62,19 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("cooldown", UnitFormat.SECONDS.format(COOLDOWN_TICKS / 20.0)), - PylonArgument.of("hydraulic-fluid-per-craft", UnitFormat.MILLIBUCKETS.format(HYDRAULIC_FLUID_PER_CRAFT)) + PylonArgument.of("cooldown", UnitFormat.SECONDS.format(cooldownTicks / 20.0)), + PylonArgument.of("hydraulic-fluid-per-craft", UnitFormat.MILLIBUCKETS.format(hydraulicFluidPerCraft)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } - @Getter private double cooldownTimeRemaining; - @SuppressWarnings("unused") public HydraulicMixingAttachment(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - cooldownTimeRemaining = 0.0; - - setTickInterval(TICK_INTERVAL); + setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); @@ -90,68 +87,40 @@ public HydraulicMixingAttachment(@NotNull Block block, @NotNull BlockCreateConte .build(getBlock().getLocation().toCenterLocation().add(0, -1, 0)) ); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT * 2, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT * 2, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") public HydraulicMixingAttachment(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); - cooldownTimeRemaining = pdc.get(COOLDOWN_TIME_REMAINING_KEY, PylonSerializers.DOUBLE); - } - - @Override - public void write(@NotNull PersistentDataContainer pdc) { - super.write(pdc); - pdc.set(COOLDOWN_TIME_REMAINING_KEY, PylonSerializers.DOUBLE, cooldownTimeRemaining); - } - - @Override - public @NotNull Set<@NotNull ChunkPosition> getChunksOccupied() { - return Set.of(new ChunkPosition(getBlock().getChunk())); - } - - @Override - public boolean checkFormed() { - return BlockStorage.get(getBlock().getRelative(BlockFace.DOWN, 2)) instanceof MixingPot; } - @Override - public boolean isPartOfMultiblock(@NotNull Block otherBlock) { - return otherBlock == getBlock().getRelative(BlockFace.DOWN, 2); - } @Override public void tick() { - if (!isFormedAndFullyLoaded()) { - return; - } - - cooldownTimeRemaining = Math.max(0, cooldownTimeRemaining - getTickInterval() / 20.0); - - if (cooldownTimeRemaining > 1.0e-5) { + if (isProcessing()) { + progressProcess(getTickInterval()); return; } MixingPot mixingPot = BlockStorage.getAs(MixingPot.class, getBlock().getRelative(BlockFace.DOWN, 2)); - Preconditions.checkState(mixingPot != null); - - if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < HYDRAULIC_FLUID_PER_CRAFT - || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < HYDRAULIC_FLUID_PER_CRAFT - || !mixingPot.tryDoRecipe(null) - ) { + if (mixingPot == null || fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidPerCraft + || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidPerCraft + || !mixingPot.tryDoRecipe()) { return; } - removeFluid(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT); - addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT); + removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidPerCraft); + addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidPerCraft); - cooldownTimeRemaining = COOLDOWN_TICKS / 20.0; + startProcess(cooldownTicks); - BaseUtils.animate(getMixingAttachmentShaft(), DOWN_ANIMATION_TIME_TICKS, getShaftTransformation(0.2)); - Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), - () -> BaseUtils.animate(getMixingAttachmentShaft(), UP_ANIMATION_TIME_TICKS, getShaftTransformation(0.7)), - DOWN_ANIMATION_TIME_TICKS + BaseUtils.animate(getMixingAttachmentShaft(), downAnimationTimeTicks, getShaftTransformation(0.2)); + Bukkit.getScheduler().runTaskLater( + PylonBase.getInstance(), + () -> BaseUtils.animate(getMixingAttachmentShaft(), upAnimationTimeTicks, getShaftTransformation(0.7)), + downAnimationTimeTicks ); } @@ -165,4 +134,22 @@ public void tick() { public @Nullable ItemDisplay getMixingAttachmentShaft() { return getHeldEntity(ItemDisplay.class, "mixing_attachment_shaft"); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java index e748778e..d70086b4 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPipeBender.java @@ -2,17 +2,13 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.recipes.PipeBendingRecipe; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; +import io.github.pylonmc.pylon.core.config.PylonConfig; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; @@ -20,30 +16,36 @@ import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; -import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Vector3d; import java.util.List; -public class HydraulicPipeBender extends PylonBlock - implements PylonFluidBufferBlock, PylonInteractBlock, PylonTickingBlock, PylonRecipeProcessor { +public class HydraulicPipeBender extends PylonBlock implements + PylonFluidBufferBlock, + PylonDirectionalBlock, + PylonInteractBlock, + PylonTickingBlock, + PylonRecipeProcessor { - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_PIPE_BENDER); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); - public static final int HYDRAULIC_FLUID_USAGE = settings.getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_BUFFER = settings.getOrThrow("hydraulic-fluid-buffer", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); public ItemStack cubeStack = ItemStackBuilder.of(Material.ORANGE_CONCRETE) .addCustomModelDataString(getKey() + ":cube") @@ -51,6 +53,9 @@ public class HydraulicPipeBender extends PylonBlock public static class Item extends PylonItem { + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -58,7 +63,8 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(HYDRAULIC_FLUID_USAGE)) + PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(hydraulicFluidUsage)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -66,19 +72,14 @@ public Item(@NotNull ItemStack stack) { @SuppressWarnings("unused") public HydraulicPipeBender(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - setTickInterval(TICK_INTERVAL); + setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); - BlockFace facing; - if (context instanceof BlockCreateContext.PlayerPlace playerPlaceContext) { - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, false); - } else { - facing = BlockFace.NORTH; - } addEntity("cube1", new ItemDisplayBuilder() .itemStack(cubeStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0, 0, 0.2) .scale(0.25)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -86,7 +87,7 @@ public HydraulicPipeBender(@NotNull Block block, @NotNull BlockCreateContext con addEntity("cube2", new ItemDisplayBuilder() .itemStack(cubeStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(0.2, 0, -0.2) .scale(0.25)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -94,7 +95,7 @@ public HydraulicPipeBender(@NotNull Block block, @NotNull BlockCreateContext con addEntity("cube3", new ItemDisplayBuilder() .itemStack(cubeStack) .transformation(new TransformBuilder() - .lookAlong(facing) + .lookAlong(getFacing()) .translate(-0.2, 0, -0.2) .scale(0.25)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) @@ -105,8 +106,8 @@ public HydraulicPipeBender(@NotNull Block block, @NotNull BlockCreateContext con .scale(0.4)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); setRecipeType(PipeBendingRecipe.RECIPE_TYPE); } @@ -160,26 +161,32 @@ public void onRecipeFinished(@NotNull PipeBendingRecipe recipe) { @Override public void tick() { - progressRecipe(TICK_INTERVAL); + double hydraulicFluidToConsume = hydraulicFluidUsage * getTickInterval() / 20.0; + if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidToConsume + || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidToConsume + ) { + return; + } if (isProcessingRecipe()) { - spawnParticles(); + new ParticleBuilder(Particle.BLOCK) + .count(5) + .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) + .data(getCurrentRecipe().particleData()) + .spawn(); + removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidToConsume); + addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidToConsume); + progressRecipe(tickInterval); return; } ItemStack stack = getItemDisplay().getItemStack(); for (PipeBendingRecipe recipe : PipeBendingRecipe.RECIPE_TYPE) { - double hydraulicFluidInput = HYDRAULIC_FLUID_USAGE * recipe.timeTicks() / 20.0; - double dirtyHydraulicFluidOutput = HYDRAULIC_FLUID_USAGE * recipe.timeTicks() / 20.0; - if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidInput - || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < dirtyHydraulicFluidOutput - || !recipe.input().matches(stack) - ) { + if (!recipe.input().matches(stack)) { continue; } startRecipe(recipe, recipe.timeTicks()); - spawnParticles(); break; } } @@ -188,16 +195,27 @@ public ItemDisplay getItemDisplay() { return getHeldEntityOrThrow(ItemDisplay.class, "item"); } - public void spawnParticles() { - new ParticleBuilder(Particle.BLOCK) - .count(5) - .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) - .data(getCurrentRecipe().particleData()) - .spawn(); - } - @Override public void onBreak(@NotNull List drops, @NotNull BlockBreakContext context) { + PylonFluidBufferBlock.super.onBreak(drops, context); drops.add(getItemDisplay().getItemStack()); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java index 330c7185..6864a20e 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicPressPiston.java @@ -1,19 +1,15 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; -import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.PylonBase; import io.github.pylonmc.pylon.base.content.machines.simple.Press; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonMultiblock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; @@ -22,12 +18,14 @@ import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; -import io.github.pylonmc.pylon.core.util.position.ChunkPosition; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -35,17 +33,22 @@ import org.joml.Matrix4f; import java.util.List; -import java.util.Set; -public class HydraulicPressPiston extends PylonBlock implements PylonMultiblock, PylonTickingBlock, PylonFluidBufferBlock { +public class HydraulicPressPiston extends PylonBlock implements + PylonTickingBlock, + PylonFluidBufferBlock, + PylonDirectionalBlock { - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_PRESS_PISTON); - public static final double HYDRAULIC_FLUID_PER_CRAFT = settings.getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); + public final double hydraulicFluidPerCraft = getSettings().getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); public static class Item extends PylonItem { + public final double hydraulicFluidPerCraft = getSettings().getOrThrow("hydraulic-fluid-per-craft", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -53,7 +56,8 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("hydraulic-fluid-per-craft", UnitFormat.MILLIBUCKETS.format(HYDRAULIC_FLUID_PER_CRAFT)) + PylonArgument.of("hydraulic-fluid-per-craft", UnitFormat.MILLIBUCKETS.format(hydraulicFluidPerCraft)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -61,7 +65,8 @@ public Item(@NotNull ItemStack stack) { @SuppressWarnings("unused") public HydraulicPressPiston(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - setTickInterval(TICK_INTERVAL); + setTickInterval(tickInterval); + setFacing(context.getFacing()); addEntity("press_piston_shaft", new ItemDisplayBuilder() .itemStack(ItemStackBuilder.of(Material.SPRUCE_LOG) .addCustomModelDataString(getKey() + ":press_piston_shaft") @@ -71,8 +76,8 @@ public HydraulicPressPiston(@NotNull Block block, @NotNull BlockCreateContext co ); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT * 2, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT * 2, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") @@ -80,38 +85,17 @@ public HydraulicPressPiston(@NotNull Block block, @NotNull PersistentDataContain super(block, pdc); } - @Override - public @NotNull Set<@NotNull ChunkPosition> getChunksOccupied() { - return Set.of(new ChunkPosition(getBlock().getChunk())); - } - - @Override - public boolean checkFormed() { - return BlockStorage.get(getBlock().getRelative(BlockFace.DOWN, 2)) instanceof Press; - } - - @Override - public boolean isPartOfMultiblock(@NotNull Block otherBlock) { - return otherBlock == getBlock().getRelative(BlockFace.DOWN, 2); - } - public void tick() { - if (!isFormedAndFullyLoaded()) { - return; - } - Press press = BlockStorage.getAs(Press.class, getBlock().getRelative(BlockFace.DOWN, 2)); - Preconditions.checkState(press != null); - - if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < HYDRAULIC_FLUID_PER_CRAFT - || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < HYDRAULIC_FLUID_PER_CRAFT - || !press.tryStartRecipe(null) - ) { + if (press == null + || fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidPerCraft + || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidPerCraft + || !press.tryStartRecipe()) { return; } - removeFluid(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT); - addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_PER_CRAFT); + removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidPerCraft); + addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidPerCraft); BaseUtils.animate( getPistonShaft(), @@ -135,4 +119,22 @@ public void tick() { public @Nullable ItemDisplay getPistonShaft() { return getHeldEntity(ItemDisplay.class, "press_piston_shaft"); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java index 9e4af47f..256f65ec 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicRefuelingStation.java @@ -3,6 +3,7 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBlock; import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; @@ -33,12 +34,16 @@ import java.util.Map; -public class HydraulicRefuelingStation extends PylonBlock implements PylonFluidBlock, PylonInteractBlock { +public class HydraulicRefuelingStation extends PylonBlock implements + PylonFluidBlock, + PylonDirectionalBlock, + PylonInteractBlock { @SuppressWarnings("unused") public HydraulicRefuelingStation(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); addEntity("casing", new ItemDisplayBuilder() diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java index 58db27fd..7643dff0 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/HydraulicTableSaw.java @@ -2,17 +2,12 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.recipes.TableSawRecipe; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; -import io.github.pylonmc.pylon.core.block.base.PylonRecipeProcessor; -import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.config.Config; -import io.github.pylonmc.pylon.core.config.Settings; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.BlockDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; @@ -22,31 +17,41 @@ import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; -public class HydraulicTableSaw extends PylonBlock - implements PylonFluidBufferBlock, PylonInteractBlock, PylonTickingBlock, PylonRecipeProcessor { +public class HydraulicTableSaw extends PylonBlock implements + PylonFluidBufferBlock, + PylonInteractBlock, + PylonTickingBlock, + PylonDirectionalBlock, + PylonRecipeProcessor{ - private static final Config settings = Settings.get(BaseKeys.HYDRAULIC_TABLE_SAW); - public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); - public static final int HYDRAULIC_FLUID_USAGE = settings.getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); - public static final double HYDRAULIC_FLUID_BUFFER = settings.getOrThrow("hydraulic-fluid-buffer", ConfigAdapter.INT); + public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); public static class Item extends PylonItem { + public final int hydraulicFluidUsage = getSettings().getOrThrow("hydraulic-fluid-usage", ConfigAdapter.INT); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { super(stack); } @@ -54,7 +59,8 @@ public Item(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { return List.of( - PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(HYDRAULIC_FLUID_USAGE)) + PylonArgument.of("hydraulic-fluid-usage", UnitFormat.MILLIBUCKETS_PER_SECOND.format(hydraulicFluidUsage)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -62,7 +68,8 @@ public Item(@NotNull ItemStack stack) { @SuppressWarnings("unused") public HydraulicTableSaw(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - setTickInterval(TICK_INTERVAL); + setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); addEntity("item", new ItemDisplayBuilder() @@ -76,8 +83,8 @@ public HydraulicTableSaw(@NotNull Block block, @NotNull BlockCreateContext conte .scale(0.6, 0.4, 0.4)) .build(block.getLocation().toCenterLocation().add(0, 0.7, 0)) ); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, true, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, HYDRAULIC_FLUID_BUFFER, false, true); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, false, true); setRecipeType(TableSawRecipe.RECIPE_TYPE); } @@ -122,28 +129,31 @@ public void onInteract(@NotNull PlayerInteractEvent event) { @Override public void tick() { - progressRecipe(TICK_INTERVAL); + double hydraulicFluidToConsume = hydraulicFluidUsage * getTickInterval() / 20.0; + if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidToConsume + || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidToConsume) { + return; + } if (isProcessingRecipe()) { - spawnParticles(); + new ParticleBuilder(Particle.BLOCK) + .count(5) + .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) + .data(getCurrentRecipe().particleData()) + .spawn(); + removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidToConsume); + addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidToConsume); + progressRecipe(tickInterval); return; } ItemStack stack = getItemDisplay().getItemStack(); for (TableSawRecipe recipe : TableSawRecipe.RECIPE_TYPE) { - double hydraulicFluidUsed = recipe.timeTicks() * HYDRAULIC_FLUID_USAGE; - if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidUsed - || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidUsed - || !PylonUtils.isPylonSimilar(stack, recipe.input()) - || stack.getAmount() < recipe.input().getAmount() - ) { + if (!PylonUtils.isPylonSimilar(stack, recipe.input()) || stack.getAmount() < recipe.input().getAmount()) { continue; } startRecipe(recipe, recipe.timeTicks()); - spawnParticles(); - removeFluid(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidUsed); - addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidUsed); break; } } @@ -153,15 +163,12 @@ public ItemDisplay getItemDisplay() { } public void spawnParticles() { - new ParticleBuilder(Particle.BLOCK) - .count(5) - .location(getBlock().getLocation().toCenterLocation().add(0, 0.75, 0)) - .data(getCurrentRecipe().particleData()) - .spawn(); + } @Override public void onBreak(@NotNull List drops, @NotNull BlockBreakContext context) { + PylonFluidBufferBlock.super.onBreak(drops, context); drops.add(getItemDisplay().getItemStack()); } @@ -173,4 +180,22 @@ public void onRecipeFinished(@NotNull TableSawRecipe recipe) { recipe.result() ); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java index 84906dfd..8f95f6c1 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/hydraulics/SolarPurificationTower.java @@ -2,7 +2,9 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; +import io.github.pylonmc.pylon.core.block.base.PylonDirectionalBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; import io.github.pylonmc.pylon.core.block.base.PylonSimpleMultiblock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; @@ -12,11 +14,15 @@ import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; +import io.github.pylonmc.pylon.core.waila.WailaDisplay; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Vector3i; import java.util.HashMap; @@ -24,11 +30,15 @@ import java.util.Map; -public class SolarPurificationTower extends PylonBlock implements PylonSimpleMultiblock, PylonTickingBlock, PylonFluidBufferBlock { +public class SolarPurificationTower extends PylonBlock implements + PylonSimpleMultiblock, + PylonTickingBlock, + PylonDirectionalBlock, + PylonFluidBufferBlock { public final double purificationSpeed = getSettings().getOrThrow("purification-speed", ConfigAdapter.DOUBLE); public final double purificationEfficiency = getSettings().getOrThrow("purification-efficiency", ConfigAdapter.DOUBLE); - public final double hydraulicFluidBuffer = getSettings().getOrThrow("hydraulic-fluid-buffer", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); public final double rainSpeedFraction = getSettings().getOrThrow("rain-speed-fraction", ConfigAdapter.DOUBLE); public final int lensLayers = getSettings().getOrThrow("lens-layers", ConfigAdapter.INT); public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); @@ -37,6 +47,7 @@ public static class Item extends PylonItem { public final double purificationSpeed = getSettings().getOrThrow("purification-speed", ConfigAdapter.DOUBLE); public final double purificationEfficiency = getSettings().getOrThrow("purification-efficiency", ConfigAdapter.DOUBLE); + public final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); public final double rainSpeedFraction = getSettings().getOrThrow("rain-speed-fraction", ConfigAdapter.DOUBLE); public Item(@NotNull ItemStack stack) { @@ -48,7 +59,8 @@ public Item(@NotNull ItemStack stack) { return List.of( PylonArgument.of("rain_speed_percentage", UnitFormat.PERCENT.format(rainSpeedFraction * 100)), PylonArgument.of("purification_speed", UnitFormat.MILLIBUCKETS_PER_SECOND.format(purificationSpeed)), - PylonArgument.of("purification_efficiency", UnitFormat.PERCENT.format(purificationEfficiency * 100)) + PylonArgument.of("purification_efficiency", UnitFormat.PERCENT.format(purificationEfficiency * 100)), + PylonArgument.of("buffer", UnitFormat.MILLIBUCKETS.format(buffer)) ); } } @@ -57,10 +69,11 @@ public Item(@NotNull ItemStack stack) { public SolarPurificationTower(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(tickInterval); + setFacing(context.getFacing()); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); - createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, hydraulicFluidBuffer, true, false); - createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, hydraulicFluidBuffer, false, true); + createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, buffer, true, false); + createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, buffer, false, true); } @SuppressWarnings("unused") @@ -110,4 +123,22 @@ public void tick() { removeFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, toPurify); addFluid(BaseFluids.HYDRAULIC_FLUID, toPurify * purificationEfficiency); } + + @Override + public @Nullable WailaDisplay getWaila(@NotNull Player player) { + return new WailaDisplay(getDefaultWailaTranslationKey().arguments( + PylonArgument.of("input-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.DIRTY_HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.DIRTY_HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#48459b") + )), + PylonArgument.of("output-bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.HYDRAULIC_FLUID), + fluidCapacity(BaseFluids.HYDRAULIC_FLUID), + 20, + TextColor.fromHexString("#212d99") + )) + )); + } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java index 2de924e9..acb9efca 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/CoreDrill.java @@ -11,7 +11,6 @@ import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; -import io.github.pylonmc.pylon.core.entity.display.transform.TransformUtil; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; @@ -31,7 +30,8 @@ import java.util.List; -public abstract class CoreDrill extends PylonBlock implements PylonSimpleMultiblock, PylonDirectionalBlock, PylonProcessor { +public abstract class CoreDrill extends PylonBlock + implements PylonSimpleMultiblock, PylonDirectionalBlock, PylonProcessor { public static class Item extends PylonItem { @@ -56,23 +56,19 @@ public Item(@NotNull ItemStack stack) { @Getter protected final int rotationsPerCycle = getSettings().getOrThrow("rotations-per-cycle", ConfigAdapter.INT); protected final ItemStack output = getSettings().getOrThrow("output", ConfigAdapter.ITEM_STACK); protected final Material drillMaterial = getSettings().getOrThrow("drill-material", ConfigAdapter.MATERIAL); + protected final ItemStackBuilder drillStack = ItemStackBuilder.of(drillMaterial) + .addCustomModelDataString(getKey() + ":drill"); @SuppressWarnings("unused") protected CoreDrill(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); - if (context instanceof BlockCreateContext.PlayerPlace playerPlace) { - setFacing(TransformUtil.yawToFace(playerPlace.getPlayer().getYaw())); - } else { - setFacing(BlockFace.NORTH); - } + setFacing(context.getFacing()); setMultiblockDirection(getFacing()); addEntity("drill", new ItemDisplayBuilder() - .itemStack(ItemStackBuilder.of(drillMaterial) - .addCustomModelDataString(getKey() + ":drill") - .build() - ) + .itemStack(drillStack) .transformation(new TransformBuilder() - .scale(0.3, 2.1, 0.3)) + .scale(0.3, 2.1, 0.3) + ) .build(getBlock().getLocation().toCenterLocation().subtract(0, 1.5, 0)) ); } @@ -126,7 +122,7 @@ public void cycle() { } } - startProcess(rotationsPerCycle * rotationDuration); + startProcess(getCycleDuration()); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Grindstone.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Grindstone.java index d0e59e8d..711c0afc 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Grindstone.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Grindstone.java @@ -16,15 +16,12 @@ import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; @@ -104,15 +101,17 @@ public void onInteract(@NotNull PlayerInteractEvent event) { // drop old item if (!oldStack.getType().isAir()) { - getBlock().getWorld().dropItem(getBlock().getLocation().toCenterLocation().add(0, 0.25, 0), oldStack); + getBlock().getWorld().dropItem( + getBlock().getLocation().toCenterLocation().add(0, 0.25, 0), + oldStack + ); itemDisplay.setItemStack(null); return; } // insert new item if (newStack != null) { - ItemStack stackToInsert = newStack.clone(); - itemDisplay.setItemStack(stackToInsert); + itemDisplay.setItemStack(newStack.clone()); newStack.setAmount(0); } } @@ -139,11 +138,7 @@ public void onBreak(@NotNull List drops, @NotNull BlockBreakContext c .orElse(null); } - public boolean tryStartRecipe(@NotNull GrindstoneRecipe nextRecipe, @Nullable Player player) { - if (!new PrePylonCraftEvent<>(GrindstoneRecipe.RECIPE_TYPE, nextRecipe, this, player).callEvent()) { - return false; - } - + public boolean tryStartRecipe(@NotNull GrindstoneRecipe nextRecipe) { ItemDisplay itemDisplay = getItemDisplay(); ItemStack input = itemDisplay.getItemStack(); if (input.getType().isAir()) { @@ -169,6 +164,7 @@ public boolean tryStartRecipe(@NotNull GrindstoneRecipe nextRecipe, @Nullable Pl .count(10) .location(getBlock().getLocation().toCenterLocation()) .spawn(); + progressRecipe(CYCLE_DURATION_TICKS / 4); }, (long) ((i + j/4.0) * CYCLE_DURATION_TICKS)); } @@ -183,8 +179,6 @@ public void onRecipeFinished(@NotNull GrindstoneRecipe recipe) { getBlock().getLocation().toCenterLocation().add(0, 0.25, 0), recipe.results().getRandom() ); - - new PylonCraftEvent<>(GrindstoneRecipe.RECIPE_TYPE, recipe, this).callEvent(); } public @NotNull ItemDisplay getItemDisplay() { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/GrindstoneHandle.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/GrindstoneHandle.java index 570a14fd..ec32a4c9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/GrindstoneHandle.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/GrindstoneHandle.java @@ -40,7 +40,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { if (BlockStorage.get(getBlock().getRelative(BlockFace.DOWN)) instanceof Grindstone grindstone) { GrindstoneRecipe nextRecipe = grindstone.getNextRecipe(); if (nextRecipe != null) { - grindstone.tryStartRecipe(nextRecipe, event.getPlayer()); + grindstone.tryStartRecipe(nextRecipe); } } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java index ecde780a..8dc73164 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java @@ -15,8 +15,6 @@ import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.ItemDisplay; @@ -114,16 +112,14 @@ public void onInteract(PlayerInteractEvent event) { } for (MagicAltarRecipe recipe : MagicAltarRecipe.RECIPE_TYPE.getRecipes()) { - if (!recipe.isValidRecipe(ingredients, catalyst) - || !new PrePylonCraftEvent<>(MagicAltarRecipe.RECIPE_TYPE, recipe, this, event.getPlayer()).callEvent() - ) { + if (!recipe.isValidRecipe(ingredients, catalyst)) { continue; } itemDisplay.setItemStack(catalyst.asQuantity(1)); catalyst.subtract(); for (Pedestal pedestal : getPedestals()) { - pedestal.setLocked(true); + pedestal.locked = true; } startRecipe(recipe, recipe.timeSeconds() * 20); break; @@ -199,11 +195,9 @@ public ItemDisplay getItemDisplay() { public void onRecipeFinished(@NotNull MagicAltarRecipe recipe) { for (Pedestal pedestal : getPedestals()) { pedestal.getItemDisplay().setItemStack(null); - pedestal.setLocked(false); + pedestal.locked = false; } - new PylonCraftEvent<>(MagicAltarRecipe.RECIPE_TYPE, recipe, this).callEvent(); - getItemDisplay().setItemStack(recipe.result()); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) @@ -218,7 +212,7 @@ public void cancelRecipe() { for (Pedestal pedestal : getPedestals()) { if (pedestal != null) { - pedestal.setLocked(false); + pedestal.locked = false; } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MixingPot.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MixingPot.java index 107d93db..eff07703 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MixingPot.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MixingPot.java @@ -1,26 +1,23 @@ package io.github.pylonmc.pylon.base.content.machines.simple; import com.destroystokyo.paper.ParticleBuilder; -import io.github.pylonmc.pylon.base.BaseKeys; +import io.github.pylonmc.pylon.base.content.components.EnrichedSoulSoil; import io.github.pylonmc.pylon.base.recipes.MixingPotRecipe; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonCauldron; -import io.github.pylonmc.pylon.core.block.base.PylonFluidTank; -import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; -import io.github.pylonmc.pylon.core.block.base.PylonMultiblock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; +import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.waila.WailaDisplay; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.PylonFluid; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.recipe.FluidOrItem; import io.github.pylonmc.pylon.core.recipe.RecipeInput; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; -import io.github.pylonmc.pylon.core.util.position.ChunkPosition; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.block.Block; @@ -35,21 +32,39 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Set; -public final class MixingPot extends PylonBlock implements PylonMultiblock, PylonInteractBlock, PylonFluidTank, PylonCauldron { +public final class MixingPot extends PylonBlock implements + PylonDirectionalBlock, + PylonInteractBlock, + PylonFluidTank, + PylonCauldron { + + private static final Set BUCKETS = Set.of(Material.BUCKET, Material.WATER_BUCKET, Material.LAVA_BUCKET, Material.GLASS_BOTTLE); + + public static class MixingPotItem extends PylonItem { + + public MixingPotItem(@NotNull ItemStack stack) { + super(stack); + } + + @Override + public @NotNull List<@NotNull PylonArgument> getPlaceholders() { + return List.of( + PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(1000)) + ); + } + } @SuppressWarnings("unused") public MixingPot(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - + setFacing(context.getFacing()); + setCapacity(1000.0); createFluidPoint(FluidPointType.INPUT, BlockFace.NORTH, context, false); createFluidPoint(FluidPointType.OUTPUT, BlockFace.SOUTH, context, false); - - setCapacity(1000.0); } @SuppressWarnings("unused") @@ -57,21 +72,6 @@ public MixingPot(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block); } - @Override - public @NotNull Set getChunksOccupied() { - return Set.of(new ChunkPosition(getBlock())); - } - - @Override - public boolean checkFormed() { - return getFire().getType() == Material.FIRE; - } - - @Override - public boolean isPartOfMultiblock(@NotNull Block otherBlock) { - return otherBlock == getFire(); - } - @Override public boolean isAllowedFluid(@NotNull PylonFluid fluid) { return true; @@ -108,27 +108,22 @@ private void updateCauldron() { } @Override - public @Nullable WailaDisplay getWaila(@NotNull Player player) { + public @NotNull WailaDisplay getWaila(@NotNull Player player) { return new WailaDisplay(getDefaultWailaTranslationKey().arguments( - PylonArgument.of("info", getFluidType() == null ? - Component.translatable("pylon.pylonbase.waila.mixing_pot.empty") : - Component.translatable("pylon.pylonbase.waila.mixing_pot.filled", - PylonArgument.of("fluid", getFluidType().getName()), - PylonArgument.of("amount", UnitFormat.MILLIBUCKETS.format(getFluidAmount()).decimalPlaces(1)) - )) + PylonArgument.of("bar", BaseUtils.createFluidAmountBar( + getFluidAmount(), + getFluidCapacity(), + 20, + TextColor.color(200, 255, 255) + )), + getFluidType() == null + ? PylonArgument.of("fluid", Component.translatable("pylon.pylonbase.fluid.none")) + : PylonArgument.of("fluid", getFluidType().getName()) )); } @Override public void onInteract(@NotNull PlayerInteractEvent event) { - // Don't allow fluid to be manually inserted/removed - if (event.getItem() != null - && Set.of(Material.BUCKET, Material.WATER_BUCKET, Material.LAVA_BUCKET, Material.GLASS_BOTTLE).contains(event.getMaterial()) - ) { - event.setCancelled(true); - return; - } - if (event.getPlayer().isSneaking() || event.getHand() != EquipmentSlot.HAND || event.getAction() != Action.RIGHT_CLICK_BLOCK @@ -138,14 +133,18 @@ public void onInteract(@NotNull PlayerInteractEvent event) { event.setCancelled(true); - if (!isFormedAndFullyLoaded() || getFluidType() == null) { + if (event.getItem() != null && BUCKETS.contains(event.getMaterial()) || getFluidType() == null) { return; } - tryDoRecipe(event.getPlayer()); + tryDoRecipe(); } - public boolean tryDoRecipe(@Nullable Player player) { + public boolean tryDoRecipe() { + if (getFluidType() == null || (getFire().getType() != Material.FIRE && getFire().getType() != Material.SOUL_FIRE)) { + return false; + } + List items = getBlock() .getLocation() .toCenterLocation() @@ -159,19 +158,15 @@ public boolean tryDoRecipe(@Nullable Player player) { .map(Item::getItemStack) .toList(); - PylonBlock ignitedBlock = BlockStorage.get(getIgnitedBlock()); - boolean isEnrichedFire = ignitedBlock != null - && ignitedBlock.getSchema().getKey().equals(BaseKeys.ENRICHED_SOUL_SOIL); + boolean isEnriched = BlockStorage.getAs(EnrichedSoulSoil.class, getIgnitedBlock()) != null; for (MixingPotRecipe recipe : MixingPotRecipe.RECIPE_TYPE.getRecipes()) { - if (recipe.matches(stacks, isEnrichedFire, getFluidType(), getFluidAmount())) { - if (!new PrePylonCraftEvent<>(MixingPotRecipe.RECIPE_TYPE, recipe, this, player).callEvent()) { - continue; - } - - doRecipe(recipe, items); - return true; + if (!recipe.matches(stacks, isEnriched, getFluidType(), getFluidAmount())) { + continue; } + + doRecipe(recipe, items); + return true; } return false; @@ -196,12 +191,9 @@ private void doRecipe(@NotNull MixingPotRecipe recipe, @NotNull List items setFluidType(fluid.fluid()); setFluid(fluid.amountMillibuckets()); } - default -> { - } + default -> {} } - new PylonCraftEvent<>(MixingPotRecipe.RECIPE_TYPE, recipe, this).callEvent(); - new ParticleBuilder(Particle.SPLASH) .count(20) .location(getBlock().getLocation().toCenterLocation().add(0, 0.5, 0)) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Press.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Press.java index 336f0335..5ea1503c 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Press.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/Press.java @@ -6,9 +6,7 @@ import io.github.pylonmc.pylon.base.recipes.PressRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; -import io.github.pylonmc.pylon.core.block.base.PylonComposter; -import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; -import io.github.pylonmc.pylon.core.block.base.PylonInteractBlock; +import io.github.pylonmc.pylon.core.block.base.*; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; import io.github.pylonmc.pylon.core.waila.WailaDisplay; import io.github.pylonmc.pylon.core.config.Config; @@ -16,15 +14,13 @@ import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import io.papermc.paper.event.entity.EntityCompostItemEvent; -import lombok.Getter; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; @@ -43,7 +39,12 @@ import java.util.List; -public class Press extends PylonBlock implements PylonInteractBlock, PylonFluidBufferBlock, PylonComposter { +public class Press extends PylonBlock implements + PylonInteractBlock, + PylonFluidBufferBlock, + PylonComposter, + PylonDirectionalBlock, + PylonRecipeProcessor { private static final Config settings = Settings.get(BaseKeys.PRESS); public static final int TIME_PER_ITEM_TICKS = settings.getOrThrow("time-per-item-ticks", ConfigAdapter.INT); @@ -58,19 +59,17 @@ public PressItem(@NotNull ItemStack stack) { @Override public @NotNull List getPlaceholders() { - return List.of(PylonArgument.of( - "time_per_item", UnitFormat.SECONDS.format(TIME_PER_ITEM_TICKS / 20.0) - )); + return List.of( + PylonArgument.of("time-per-item", UnitFormat.SECONDS.format(TIME_PER_ITEM_TICKS / 20.0)), + PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(CAPACITY_MB)) + ); } } - // Not worth the effort to persist across unloads - @Getter private @Nullable PressRecipe currentRecipe; - @SuppressWarnings("unused") public Press(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - + setFacing(context.getFacing()); addEntity("press_cover", new ItemDisplayBuilder() .itemStack(ItemStackBuilder.of(Material.SPRUCE_PLANKS) .addCustomModelDataString(getKey() + ":press_cover")) @@ -84,14 +83,21 @@ public Press(@NotNull Block block, @NotNull BlockCreateContext context) { @SuppressWarnings("unused") public Press(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block); + + if (isProcessingRecipe()) { + finishRecipe(); + } } @Override public @NotNull WailaDisplay getWaila(@NotNull Player player) { return new WailaDisplay(getDefaultWailaTranslationKey().arguments( - PylonArgument.of("plant_oil_amount", UnitFormat.MILLIBUCKETS.format(Math.round(fluidAmount(BaseFluids.PLANT_OIL)))), - PylonArgument.of("plant_oil_capacity", UnitFormat.MILLIBUCKETS.format(CAPACITY_MB)), - PylonArgument.of("plant_oil", BaseFluids.PLANT_OIL.getName()) + PylonArgument.of("bar", BaseUtils.createFluidAmountBar( + fluidAmount(BaseFluids.PLANT_OIL), + fluidCapacity(BaseFluids.PLANT_OIL), + 20, + TextColor.fromHexString("#c4b352") + )) )); } @@ -103,11 +109,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { event.setCancelled(true); - if (currentRecipe != null) { - return; - } - - tryStartRecipe(event.getPlayer()); + tryStartRecipe(); } @Override @@ -115,8 +117,8 @@ public void onCompostByEntity(EntityCompostItemEvent event) { event.setCancelled(true); } - public boolean tryStartRecipe(@Nullable Player player) { - if (currentRecipe != null) { + public boolean tryStartRecipe() { + if (isProcessingRecipe()) { return false; } @@ -135,39 +137,32 @@ public boolean tryStartRecipe(@Nullable Player player) { for (PressRecipe recipe : PressRecipe.RECIPE_TYPE.getRecipes()) { for (ItemStack stack : stacks) { - if (recipe.input().contains(stack)) { - double availableSpace = CAPACITY_MB - fluidAmount(BaseFluids.PLANT_OIL); - if (recipe.oilAmount() > availableSpace - || !new PrePylonCraftEvent<>(PressRecipe.RECIPE_TYPE, recipe, this, player).callEvent() - ) { - continue; - } - - stack.subtract(); - startRecipe(recipe); - return true; + if (!recipe.input().contains(stack) + || recipe.oilAmount() > fluidSpaceRemaining(BaseFluids.PLANT_OIL)) { + continue; } + + stack.subtract(); + startRecipe(recipe, TIME_PER_ITEM_TICKS); + BaseUtils.animate(getCover(), TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS, getCoverTransform(0.0)); + Bukkit.getScheduler().runTaskLater( + PylonBase.getInstance(), + () -> { + BaseUtils.animate(getCover(), RETURN_TO_START_TIME_TICKS, getCoverTransform(0.4)); + Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), this::finishRecipe, RETURN_TO_START_TIME_TICKS); + }, + TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS + ); + return true; } } return false; } - public void startRecipe(PressRecipe recipe) { - this.currentRecipe = recipe; - BaseUtils.animate(getCover(), TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS, getCoverTransform(0.0)); - - Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - - BaseUtils.animate(getCover(), RETURN_TO_START_TIME_TICKS, getCoverTransform(0.4)); - - Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - - addFluid(BaseFluids.PLANT_OIL, recipe.oilAmount()); - new PylonCraftEvent<>(PressRecipe.RECIPE_TYPE, recipe, this).callEvent(); - this.currentRecipe = null; - }, RETURN_TO_START_TIME_TICKS); - }, TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS); + @Override + public void onRecipeFinished(@NotNull PressRecipe recipe) { + addFluid(BaseFluids.PLANT_OIL, recipe.oilAmount()); } public @Nullable ItemDisplay getCover() { @@ -180,6 +175,4 @@ public void startRecipe(PressRecipe recipe) { .scale(0.9, 0.1, 0.9) .buildForItemDisplay(); } - - } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java index 39d08759..4c2aeb1b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryBurner.java @@ -8,7 +8,6 @@ import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.registry.PylonRegistry; -import io.github.pylonmc.pylon.core.registry.PylonRegistryKey; import io.github.pylonmc.pylon.core.util.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.GuiItems; import io.github.pylonmc.pylon.core.util.gui.ProgressItem; @@ -32,7 +31,7 @@ public final class SmelteryBurner extends SmelteryComponent implements PylonGuiBlock, PylonTickingBlock, PylonProcessor { - public static final PylonRegistryKey FUELS_KEY = new PylonRegistryKey<>(baseKey("smeltery_burner_fuels")); + public static final NamespacedKey FUELS_KEY = baseKey("smeltery_burner_fuels"); public static final PylonRegistry FUELS = new PylonRegistry<>(FUELS_KEY); static { @@ -61,7 +60,7 @@ public SmelteryBurner(@NotNull Block block, @NotNull BlockCreateContext context) fuel = null; } - @SuppressWarnings({"unused", "DataFlowIssue"}) + @SuppressWarnings("unused") public SmelteryBurner(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block, pdc); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java index 9328275e..56dfdb1d 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryCaster.java @@ -4,8 +4,6 @@ import io.github.pylonmc.pylon.core.block.base.PylonGuiBlock; import io.github.pylonmc.pylon.core.block.base.PylonTickingBlock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import io.github.pylonmc.pylon.core.fluid.PylonFluid; import io.github.pylonmc.pylon.core.i18n.PylonArgument; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; @@ -114,10 +112,6 @@ public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @N if (recipe == null || controller.getTemperature() < recipe.temperature() || controller.getFluidAmount(bottomFluid) < recipe.input().amountMillibuckets()) return; - if (!new PrePylonCraftEvent<>(CastingRecipe.RECIPE_TYPE, recipe, controller, player).callEvent()) { - return; - } - ItemStack result = recipe.result(); if (!inventory.canHold(result)) { return; @@ -126,7 +120,6 @@ public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @N inventory.addItem(null, result); controller.removeFluid(bottomFluid, recipe.input().amountMillibuckets()); - new PylonCraftEvent<>(CastingRecipe.RECIPE_TYPE, recipe, controller).callEvent(); } private static TranslatableComponent casterKey(@NotNull String subkey, @NotNull PylonArgument @NotNull ... args) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java index f82b750f..94ef7eb7 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryHopper.java @@ -6,8 +6,6 @@ import io.github.pylonmc.pylon.core.block.base.PylonVanillaContainerBlock; import io.github.pylonmc.pylon.core.block.context.BlockBreakContext; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import org.bukkit.block.Block; import org.bukkit.block.Hopper; import org.bukkit.event.inventory.InventoryMoveItemEvent; @@ -56,9 +54,6 @@ public void tick() { MeltingRecipe recipe = null; for (MeltingRecipe meltingRecipe : MeltingRecipe.RECIPE_TYPE) { if (meltingRecipe.input().contains(item)) { - if (!new PrePylonCraftEvent<>(MeltingRecipe.RECIPE_TYPE, meltingRecipe, controller).callEvent()) { - continue; - } recipe = meltingRecipe; break; } @@ -68,7 +63,6 @@ public void tick() { if (controller.getTemperature() >= recipe.temperature() && fluidAmountAfterAdding <= controller.getCapacity()) { controller.addFluid(recipe.result(), recipe.resultAmount()); item.subtract(); - new PylonCraftEvent<>(MeltingRecipe.RECIPE_TYPE, recipe, controller).callEvent(); } } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/resources/RefractoryMix.java b/src/main/java/io/github/pylonmc/pylon/base/content/resources/RefractoryMix.java index 31b42bf0..f0a0d35f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/resources/RefractoryMix.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/resources/RefractoryMix.java @@ -23,7 +23,6 @@ public class RefractoryMix extends PylonBlock implements Moldable { private int moldingClicksRemaining; - @SuppressWarnings("unused") public RefractoryMix(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java index 76cfb37e..c0b29619 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java @@ -6,8 +6,6 @@ import io.github.pylonmc.pylon.base.recipes.HammerRecipe; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; -import io.github.pylonmc.pylon.core.event.PrePylonCraftEvent; -import io.github.pylonmc.pylon.core.event.PylonCraftEvent; import io.github.pylonmc.pylon.core.item.PylonItem; import io.github.pylonmc.pylon.core.item.PylonItemSchema; import io.github.pylonmc.pylon.core.item.base.PylonBlockInteractor; @@ -28,7 +26,6 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BoundingBox; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; @@ -39,7 +36,6 @@ import java.util.concurrent.ThreadLocalRandom; -@SuppressWarnings("UnstableApiUsage") public class Hammer extends PylonItem implements PylonBlockInteractor { @@ -62,60 +58,46 @@ public boolean tryDoRecipe(@NotNull Block block, @Nullable Player player, @Nulla Block blockAbove = block.getRelative(BlockFace.UP); - List items = new ArrayList<>(); + List items = new ArrayList<>(); for (Entity e : block.getWorld().getNearbyEntities(BoundingBox.of(blockAbove))) { if (e instanceof Item entity) { - items.add(entity.getItemStack()); + items.add(entity); entity.remove(); } } - boolean anyRecipeAttempted = false; for (HammerRecipe recipe : HammerRecipe.RECIPE_TYPE) { - if (!miningLevel.isAtLeast(recipe.level())) continue; - - if (!recipeMatches(items, recipe)) continue; - - if (!new PrePylonCraftEvent<>(HammerRecipe.RECIPE_TYPE, recipe, null, player).callEvent()) { + if (!miningLevel.isAtLeast(recipe.level())) { continue; } - anyRecipeAttempted = true; + for (Item item : items) { + if (!recipe.input().matches(item.getItemStack())) { + continue; + } - float adjustedChance = recipe.chance() * - // Each tier is twice as likely to succeed as the previous one - (1 << miningLevel.getNumericalLevel() - recipe.level().getNumericalLevel()); - if (ThreadLocalRandom.current().nextFloat() > adjustedChance) continue; + item.setItemStack(item.getItemStack().asQuantity(recipe.input().getAmount())); - for (ItemStack item : items) { - if (recipe.input().matches(item)) { - item.subtract(recipe.input().getAmount()); - break; + float adjustedChance = recipe.chance() * + // Each tier is twice as likely to succeed as the previous one + (1 << miningLevel.getNumericalLevel() - recipe.level().getNumericalLevel()); + if (ThreadLocalRandom.current().nextFloat() > adjustedChance) { + continue; } - } - items.removeIf(item -> item.getAmount() <= 0); - items.add(recipe.result().clone()); - new PylonCraftEvent<>(HammerRecipe.RECIPE_TYPE, recipe).callEvent(); - break; - } + if (player != null) { + player.setCooldown(getStack(), cooldownTicks); + PylonUtils.damageItem(getStack(), 1, player, slot); + } else { + PylonUtils.damageItem(getStack(), 1, block.getWorld()); + } + block.getWorld().playSound(sound.create(), block.getX() + 0.5, block.getY() + 0.5, block.getZ() + 0.5); - if (anyRecipeAttempted) { - if (player != null) { - player.setCooldown(getStack(), cooldownTicks); - PylonUtils.damageItem(getStack(), 1, player, slot); - } else { - PylonUtils.damageItem(getStack(), 1, block.getWorld()); + return true; } - block.getWorld().playSound(sound.create(), block.getX() + 0.5, block.getY() + 0.5, block.getZ() + 0.5); - } - - for (ItemStack item : items) { - block.getWorld().dropItem(blockAbove.getLocation().add(0.5, 0.1, 0.5), item) - .setVelocity(new Vector(0, 0, 0)); } - return anyRecipeAttempted; + return false; } @Override @@ -154,8 +136,4 @@ private static MiningLevel getMiningLevel(@NotNull NamespacedKey key) { && hammer.miningLevel.isAtLeast(level)) .toList(); } - - private static boolean recipeMatches(List items, @NotNull HammerRecipe recipe) { - return items.stream().anyMatch(recipe.input()::matches); - } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java index d7d4c52c..9e90c362 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java @@ -15,6 +15,7 @@ import io.github.pylonmc.pylon.core.item.base.PylonInteractor; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -53,6 +54,12 @@ public HydraulicCannon(@NotNull ItemStack stack) { @Override public @NotNull List<@NotNull PylonArgument> getPlaceholders() { + Bukkit.getLogger().severe("a " + getHydraulicFluid() + " " + HYDRAULIC_FLUID_CAPACITY + " " + BaseUtils.createFluidAmountBar( + getHydraulicFluid(), + HYDRAULIC_FLUID_CAPACITY, + 20, + TextColor.fromHexString("#212d99") + )); return List.of( PylonArgument.of("damage", UnitFormat.HEARTS.format(projectileDamage)), PylonArgument.of("cooldown", UnitFormat.SECONDS.format(cooldownTicks / 20.0)), diff --git a/src/main/java/io/github/pylonmc/pylon/base/recipes/StrainingRecipe.java b/src/main/java/io/github/pylonmc/pylon/base/recipes/StrainingRecipe.java index dc594d5c..9ca8d635 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/recipes/StrainingRecipe.java +++ b/src/main/java/io/github/pylonmc/pylon/base/recipes/StrainingRecipe.java @@ -3,7 +3,6 @@ import io.github.pylonmc.pylon.base.BaseItems; import io.github.pylonmc.pylon.core.config.ConfigSection; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; -import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.fluid.PylonFluid; import io.github.pylonmc.pylon.core.guide.button.FluidButton; import io.github.pylonmc.pylon.core.guide.button.ItemButton; @@ -11,8 +10,8 @@ import io.github.pylonmc.pylon.core.util.gui.GuiItems; import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemStack; -import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import xyz.xenondevs.invui.gui.Gui; import java.util.List; @@ -38,8 +37,14 @@ public record StrainingRecipe( } }; - public static final PersistentDataType DATA_TYPE = - PylonSerializers.KEYED.keyedTypeFrom(StrainingRecipe.class, RECIPE_TYPE::getRecipeOrThrow); + public static @Nullable StrainingRecipe getRecipeForFluid(PylonFluid fluid) { + for (StrainingRecipe recipe : StrainingRecipe.RECIPE_TYPE) { + if (recipe.input().fluids().contains(fluid)) { + return recipe; + } + } + return null; + } @Override public @NotNull NamespacedKey getKey() { diff --git a/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java b/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java index fca372c6..28f23783 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java +++ b/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java @@ -6,6 +6,7 @@ import lombok.experimental.UtilityClass; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.NamespacedKey; @@ -94,11 +95,25 @@ private int clampAndRound(double value) { return getDisplacement(source, target).normalize(); } + public @NotNull Component createProgressBar(double progress, int bars, TextColor color) { + int filledBars = (int) Math.round(bars * progress); + return Component.translatable("pylon.pylonbase.gui.progress_bar.text").arguments( + PylonArgument.of("filled_bars", Component.text("|".repeat(filledBars)).color(color)), + PylonArgument.of("empty_bars", "|".repeat(bars - filledBars)), + PylonArgument.of("progress", UnitFormat.PERCENT.format(progress * 100)) + ); + } + + public @NotNull Component createProgressBar(double amount, double max, int bars, TextColor color) { + return createProgressBar(amount / max, bars, color); + } + public @NotNull Component createFluidAmountBar(double amount, double capacity, int bars, TextColor fluidColor) { - int filledBars = (int) Math.round(bars * amount / capacity); + int filledBars = Math.max(0, (int) Math.round(bars * amount / capacity)); + Bukkit.getLogger().severe("bruh " + filledBars); return Component.translatable("pylon.pylonbase.gui.fluid_amount_bar.text").arguments( PylonArgument.of("filled_bars", Component.text("|".repeat(filledBars)).color(fluidColor)), - PylonArgument.of("empty_bars", "|".repeat(bars - filledBars)), + PylonArgument.of("empty_bars", Component.text("|".repeat(bars - filledBars))), PylonArgument.of("amount", Math.round(amount)), PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(Math.round(capacity))) ); diff --git a/src/main/resources/lang/en.yml b/src/main/resources/lang/en.yml index f69e454f..4711290e 100644 --- a/src/main/resources/lang/en.yml +++ b/src/main/resources/lang/en.yml @@ -285,7 +285,7 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Wooden Portable Fluid Tank %info%" + waila: "Wooden Portable Fluid Tank | %bars% (%fluid%)" portable_fluid_tank_copper: name: "Copper Portable Fluid Tank" @@ -295,7 +295,7 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Copper Portable Fluid Tank %info%" + waila: "Copper Portable Fluid Tank | %bars% (%fluid%)" portable_fluid_tank_tin: @@ -306,7 +306,7 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Tin Portable Fluid Tank %info%" + waila: "Tin Portable Fluid Tank | %bars% (%fluid%)" portable_fluid_tank_iron: name: "Iron Portable Fluid Tank" @@ -316,7 +316,7 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Iron Portable Fluid Tank %info%" + waila: "Iron Portable Fluid Tank | %bars% (%fluid%)" portable_fluid_tank_bronze: name: "Bronze Portable Fluid Tank" @@ -326,7 +326,7 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Bronze Portable Fluid Tank %info%" + waila: "Bronze Portable Fluid Tank | %bars% (%fluid%)" portable_fluid_tank_igneous_composite: name: "Igneous Composite Portable Fluid Tank" @@ -336,7 +336,7 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Obsidian Portable Fluid Tank %info%" + waila: "Igneous Composite Portable Fluid Tank | %bars% (%fluid%)" portable_fluid_tank_steel: name: "Steel Portable Fluid Tank" @@ -346,14 +346,14 @@ item: Right click with a bucket to add/remove fluids (only works with water or lava) Fluid: %amount%/%capacity% (%fluid%) Allowed temperatures: %temperatures% - waila: "Steel Portable Fluid Tank %info%" + waila: "Steel Portable Fluid Tank | %bars% (%fluid%)" fluid_valve: name: "Fluid Valve" lore: |- Right click a fluid valve to toggle it Buffer: %buffer% - waila: "Fluid Valve (%status%)" + waila: "Fluid Valve | %bars% (%fluid%) | %status%" fluid_filter: name: "Fluid Filter" @@ -361,7 +361,7 @@ item: Only lets a certain fluid through Right click a fluid filter to change the filtered fluid Buffer: %buffer% - waila: "Fluid Filter (%fluid%)" + waila: "Fluid Filter | %bars% (%fluid%)" gui: "Fluid Filter" fluid_meter: @@ -370,7 +370,7 @@ item: A variant of the fluid filter which displays the amount of fluid passing through Right click a fluid meter to change the filtered fluid Buffer: %buffer% - waila: "Fluid Meter (%fluid%)" + waila: "Fluid Meter | %bars% (%fluid%)" gui: "Fluid Meter" fluid_strainer: @@ -378,6 +378,7 @@ item: lore: |- Filters out items from fluids Right click to open the inventory + Buffer: %buffer% waila: "Fluid Strainer%info%" fluid_voider_1: @@ -409,6 +410,7 @@ item: lore: |- Produces a practically infinite amount of any fluid Right click to select a fluid + waila: "Creative Fluid Source | %fluid%" iron_dust: name: "Iron Dust" @@ -419,6 +421,8 @@ item: Fills the block in front of it with water Must be supplied with water to function Fill interval: %fill_interval% + Buffer: %buffer% + waila: "Water Placer | %bars%" lava_placer: name: "Lava Placer" @@ -426,6 +430,8 @@ item: Fills the block in front of it with lava Must be supplied with lava to function Fill interval: %fill_interval% + Buffer: %buffer% + waila: "Lava Placer | %bars%" water_drainer: name: "Water Drainer" @@ -433,6 +439,7 @@ item: Drains water from the block in front of it and makes it available to any connected pipes Drain interval: %drain_interval% Buffer: %buffer% + waila: "Water Drainer | %bars%" lava_drainer: name: "Lava Drainer" @@ -440,6 +447,7 @@ item: Drains lava from the block in front of it and makes it available to any connected pipes Drain interval: %drain_interval% Buffer: %buffer% + waila: "Lava Drainer | %bars%" elevator_1: name: "Elevator I" @@ -559,9 +567,10 @@ item: lore: |- Place items in the pot and right click to mix them together Requires a fire underneath to work - Some recipes require Enriched Netherrack fire underneath + Some recipes require Enriched Soul Soil fire underneath Can also be used like a normal cauldron - waila: "Mixing Pot %info%" + Capacity: %capacity% + waila: "Mixing Pot | %bar% (%fluid%)" monster_jerky: name: "Monster Jerky" @@ -776,6 +785,8 @@ item: Requires water to be piped in Water consumption: %water_consumption% Range: %range% + Buffer: %buffer% + waila: "Sprinkler | %bars%" steel_dust: name: "Steel Dust" @@ -858,8 +869,9 @@ item: lore: |- Presses plants into plant oil Throw plants in and right click to press them into plant oil - Time per item: %time_per_item% - waila: "Press (%plant_oil_amount% / %plant_oil_capacity% %plant_oil%)" + Time per item: %time-per-item% + Capacity: %capacity% + waila: "Press | %bar%" hydraulic_grindstone_turner: name: "Hydraulic Grindstone Turner" @@ -867,6 +879,8 @@ item: Place below a constructed grindstone Outputs dirty hydraulic fluid Hydraulic fluid usage: %hydraulic-fluid-usage% + Buffer: %buffer% + waila: "Hydraulic Grindstone Turner | %input-bar% | %output-bar%" hydraulic_mixing_attachment: name: "Hydraulic Mixing Attachment" @@ -875,6 +889,8 @@ item: Outputs dirty hydraulic fluid Cooldown time: %cooldown% Hydraulic fluid usage: %hydraulic-fluid-per-craft% per craft + Buffer: %buffer% + waila: "Hydraulic Mixing Attachment | %input-bar% | %output-bar%" hydraulic_press_piston: name: "Hydraulic Press Piston" @@ -882,6 +898,8 @@ item: Place above the press, leaving a one block gap Outputs dirty hydraulic fluid Hydraulic fluid usage: %hydraulic-fluid-per-craft% per craft + Buffer: %buffer% + waila: "Hydraulic Press Piston | %input-bar% | %output-bar%" hydraulic_hammer_head: name: "Hydraulic Hammer Head" @@ -891,6 +909,8 @@ item: Right click with a hammer to insert the hammer Right click again to take out the hammer Hydraulic fluid usage: %hydraulic-fluid-per-craft% per craft + Buffer: %buffer% + waila: "Hydraulic Hammer Head | %input-bar% | %output-bar%" hydraulic_pipe_bender: name: "Hydraulic Pipe Bender" @@ -899,6 +919,8 @@ item: Outputs dirty hydraulic fluid Right click to insert an item Hydraulic fluid usage: %hydraulic-fluid-usage% + Buffer: %buffer% + waila: "Hydraulic Pipe Bender | %input-bar% | %output-bar%" hydraulic_table_saw: name: "Hydraulic Table Saw" @@ -907,6 +929,8 @@ item: Outputs dirty hydraulic fluid Right click to insert an item Hydraulic fluid usage: %hydraulic-fluid-usage% per craft + Buffer: %buffer% + waila: "Hydraulic Table Saw | %input-bar% | %output-bar%" quartz_dust: name: "Quartz Dust" @@ -941,12 +965,14 @@ item: Runs at %rain_speed_percentage% speed when it's raining/snowing Purification speed: %purification_speed% Purification efficiency: %purification_efficiency% + Buffer: %buffer% Components 1x 1x 3x 16x + waila: "Solar Purification Tower I | %input-bar% | %output-bar%" solar_purification_tower_2: name: "Solar Purification Tower II" @@ -957,12 +983,14 @@ item: Runs at %rain_speed_percentage% speed when it's raining/snowing Purification speed: %purification_speed% Purification efficiency: %purification_efficiency% + Buffer: %buffer% Components 1x 1x 3x 48x + waila: "Solar Purification Tower II | %input-bar% | %output-bar%" solar_purification_tower_3: name: "Solar Purification Tower III" @@ -973,12 +1001,14 @@ item: Runs at %rain_speed_percentage% speed when it's raining/snowing Purification speed: %purification_speed% Purification efficiency: %purification_efficiency% + Buffer: %buffer% Components 1x 1x 3x 96x + waila: "Solar Purification Tower III | %input-bar% | %output-bar%" solar_purification_tower_4: name: "Solar Purification Tower IV" @@ -989,12 +1019,14 @@ item: Runs at %rain_speed_percentage% speed when it's raining/snowing Purification speed: %purification_speed% Purification efficiency: %purification_efficiency% + Buffer: %buffer% Components 1x 1x 3x 160x + waila: "Solar Purification Tower IV | %input-bar% | %output-bar%" solar_purification_tower_5: name: "Solar Purification Tower V" @@ -1005,12 +1037,14 @@ item: Runs at %rain_speed_percentage% speed when it's raining/snowing Purification speed: %purification_speed% Purification efficiency: %purification_efficiency% + Buffer: %buffer% Components 1x 1x 3x 240x + waila: "Solar Purification Tower V | %input-bar% | %output-bar%" coal_fired_purification_tower: name: "Coal-fired Purification Tower" @@ -1020,11 +1054,13 @@ item: Burns coal or charcoal Purification speed: %purification_speed% Purification efficiency: %purification_efficiency% + Buffer: %buffer% Components 1x 1x 5x + waila: "Coal-fired Purification Tower | %input-bar% | %output-bar%" progress_item: running: "Running" idle: "Idle" @@ -1046,7 +1082,7 @@ item: Components 1x 1 or more Fluid Tank Casing - waila: "Fluid Tank %info%" + waila: "Fluid Tank | %bars% (%fluid%)" fluid_tank_casing_wood: name: "Wooden Fluid Tank Casing" @@ -1054,7 +1090,6 @@ item: Multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Wooden Fluid Tank Casing %info%" fluid_tank_casing_copper: name: "Copper Fluid Tank Casing" @@ -1062,7 +1097,6 @@ item: Multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Copper Fluid Tank Casing %info%" fluid_tank_casing_tin: name: "Tin Fluid Tank Casing" @@ -1070,7 +1104,6 @@ item: Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Tin Fluid Tank Casing %info%" fluid_tank_casing_iron: name: "Iron Fluid Tank Casing" @@ -1078,7 +1111,6 @@ item: Fluid Tank component Capacity: %capacity% Temperatures: %temperatures% - waila: "Iron Fluid Tank Casing %info%" fluid_tank_casing_bronze: name: "Bronze Fluid Tank Casing" @@ -1086,7 +1118,6 @@ item: Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Bronze Fluid Tank Casing %info%" fluid_tank_casing_igneous_composite: name: "Igneous Composite Fluid Tank Casing" @@ -1094,7 +1125,6 @@ item: Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Igneous Composite Fluid Tank Casing %info%" fluid_tank_casing_steel: name: "Steel Fluid Tank Casing" @@ -1102,7 +1132,6 @@ item: Fluid Tank multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Steel Fluid Tank Casing %info%" manual_core_drill_lever: name: "Manual Core Drill Lever" @@ -1160,11 +1189,13 @@ item: name: "Hydraulic Core Drill Input Hatch" lore: |- Hydraulic Core Drill multiblock component + waila: "Hydraulic Core Drill Input Hatch | %bars%" hydraulic_core_drill_output_hatch: name: "Hydraulic Core Drill Output Hatch" lore: |- Hydraulic Core Drill multiblock component + waila: "Hydraulic Core Drill Output Hatch | %bars%" shallow_core_chunk: name: "Shallow Core Chunk" @@ -1304,6 +1335,8 @@ item: Radius: %radius% Farm interval: %tick-interval% Hydraulic fluid usage: %hydraulic-fluid-usage% + Buffer: %buffer% + waila: "Hydraulic Farmer | %input-bar% | %output-bar%" hydraulic_excavator: name: "Hydraulic Excavator" @@ -1316,12 +1349,15 @@ item: Depth: %depth% Time per block: %time-per-block% Hydraulic fluid usage: %hydraulic-fluid-usage% + Buffer: %buffer% + waila: "Hydraulic Excavator | %input-bar% | %output-bar%" diesel_pipe_bender: name: "Diesel Pipe Bender" lore: |- Efficiently bends materials into pipes Diesel usage: %diesel-usage% + Diesel buffer: %diesel-buffer% Speed: %speed% waila: "Diesel Pipe Bender | %diesel-bar%" @@ -1330,6 +1366,7 @@ item: lore: |- Efficiently cuts logs into planks, and planks into sticks Diesel usage: %diesel-usage% + Diesel buffer: %diesel-buffer% Speed: %speed% waila: "Diesel Table Saw | %diesel-bar%" @@ -1339,6 +1376,7 @@ item: Presses plants into plant oil Throw plants in and right click to press them into plant oil Diesel usage: %diesel-usage% + Diesel buffer: %diesel-buffer% Time per item: %time-per-item% waila: "Diesel Press | %diesel-bar% | %plant-oil-bar%" @@ -1347,6 +1385,7 @@ item: lore: |- Grinds items Diesel usage: %diesel-usage% + Diesel buffer: %diesel-buffer% waila: "Diesel Grindstone | %diesel-bar%" diesel_brick_molder: @@ -1354,9 +1393,24 @@ item: lore: |- Molds materials into bricks Diesel usage: %diesel-usage% + Diesel buffer: %diesel-buffer% Molding cycles: %molding-cycles% waila: "Diesel Brick Molder | %diesel-bar%" + diesel_fired_purification_tower: + name: "Diesel-fired Purification Tower" + lore: |- + Multiblock + Converts dirty hydraulic fluid back into hydraulic fluid + Burns diesel + Purification speed: %purification_speed% + Purification efficiency: %purification_efficiency% + + Components + 1x + 1x + 5x + cargo_duct: name: "Cargo Duct" lore: |- @@ -1409,20 +1463,17 @@ fluid: water: "Water" plant_oil: "<#c4b352>Plant Oil" hydraulic_fluid: "<#212d99>Hydraulic Fluid" - dirty_hydraulic_fluid: "<#212d99>Hydraulic Fluid <#48459b>(dirty)" + dirty_hydraulic_fluid: "<#48459b>Dirty Hydraulic Fluid" obscyra: "<#5c4a66>Obscyra" reflector_fluid: "<#d1c9ab>Reflector Fluid" biodiesel: "<#eaa627>Biodiesel" waila: - mixing_pot: - empty: "(empty)" - filled: "| %amount% of %fluid%" fluid_tank: empty: "(empty)" - filled: "| %amount%/%capacity% of %fluid%" + filled: "| %bar%/%capacity% of %fluid%" fluid_strainer: - straining: " | Straining %item%: %progress%" + straining: " | Straining %item% | %bars%" pit_kiln: "Pit Kiln | %time% left" research: @@ -1511,7 +1562,6 @@ guide: molding: "Molding cycles: %molding-cycles%" message: - fluid_none: "None" fluid_selector: current_fluid: "Current fluid: %fluid%" clear: "Clear" @@ -1535,31 +1585,17 @@ message: enabled: "Item Magnet has been enabled" disabled: "Item Magnet has been disabled" valve: - enabled: "enabled" - disabled: "disabled" + enabled: "enabled" + disabled: "disabled" elevator: none_within_range: above: "No elevators within range above you" below: "No elevators within range below you" - hydraulic_status: - not_enough_hydraulic_fluid: "Not enough hydraulic fluid" - dirty_hydraulic_fluid_buffer_full: "Dirty hydraulic fluid buffer full" - working: "Working" - idle: "Idle" - missing_grindstone: "Missing grindstone" - missing_mixing_pot: "Missing mixing pot" - missing_press: "Missing press" - missing_hammer: "Missing hammer" - missing_base: "Missing base" - no_fuel: "No fuel" - incomplete: "Incomplete" - working_with_reduced_efficiency: "Working with reduced efficiency" - no_sunlight: "No sunlight" fireproof_result: tooltip: "Fire-proofed" success: "Your item has been fire-proofed" hydraulic_refueling_station: - extra: "[In: %hydraulic-fluid-bar%] - [Out: %dirty-hydraulic-fluid-bar%]" + extra: "| %hydraulic-fluid-bar% | %dirty-hydraulic-fluid-bar%" soulbound_rune: tooltip: "Soulbound" soulbind-message: "Your soul has been linked with your item" @@ -1591,8 +1627,7 @@ gui: too_cold: "Temperature too low to cast, needs at least %temperature%" not_enough: "Not enough %fluid% to cast (%amount%/%needed%)" click_to_cast: "Click to cast (%amount%/%needed%)" + progress_bar: + text: "%filled_bars%%empty_bars% %progress%" fluid_amount_bar: - text: "%filled_bars%%empty_bars% %amount%/%capacity%" - color: - hydraulic_fluid: "<#212d99>|" - dirty_hydraulic_fluid: "<#48459b>|" \ No newline at end of file + text: "%filled_bars%%empty_bars% %amount%/%capacity%" \ No newline at end of file diff --git a/src/main/resources/settings/coal_fired_purification_tower.yml b/src/main/resources/settings/coal_fired_purification_tower.yml index eea45883..77abee2f 100644 --- a/src/main/resources/settings/coal_fired_purification_tower.yml +++ b/src/main/resources/settings/coal_fired_purification_tower.yml @@ -1,8 +1,4 @@ purification-speed: 50 # mb/s purification-efficiency: 0.93 -hydraulic-fluid-buffer: 80 # mb +buffer: 200 # mb tick-interval: 20 - -fuels: # values in seconds - coal: 15 - charcoal: 10 diff --git a/src/main/resources/settings/fluid_filter.yml b/src/main/resources/settings/fluid_filter.yml index 85b240f7..6c24bc57 100644 --- a/src/main/resources/settings/fluid_filter.yml +++ b/src/main/resources/settings/fluid_filter.yml @@ -1 +1 @@ -buffer: 2000.0 +buffer: 1000.0 diff --git a/src/main/resources/settings/fluid_meter.yml b/src/main/resources/settings/fluid_meter.yml index 6ed82e6a..a550fcef 100644 --- a/src/main/resources/settings/fluid_meter.yml +++ b/src/main/resources/settings/fluid_meter.yml @@ -1 +1,2 @@ -tick-interval: 10 +buffer: 1000 +tick-interval: 20 diff --git a/src/main/resources/settings/fluid_strainer.yml b/src/main/resources/settings/fluid_strainer.yml index fefb3a42..a777f495 100644 --- a/src/main/resources/settings/fluid_strainer.yml +++ b/src/main/resources/settings/fluid_strainer.yml @@ -1,2 +1 @@ -tick-interval: 20 -buffer-size: 100.0 \ No newline at end of file +buffer: 1000.0 \ No newline at end of file diff --git a/src/main/resources/settings/fluid_valve.yml b/src/main/resources/settings/fluid_valve.yml new file mode 100644 index 00000000..0f618d36 --- /dev/null +++ b/src/main/resources/settings/fluid_valve.yml @@ -0,0 +1 @@ +buffer: 1000 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_excavator.yml b/src/main/resources/settings/hydraulic_excavator.yml index 9efa738c..9a927cb1 100644 --- a/src/main/resources/settings/hydraulic_excavator.yml +++ b/src/main/resources/settings/hydraulic_excavator.yml @@ -2,4 +2,4 @@ block-break-interval-ticks: 40 radius: 5 depth: 5 hydraulic-fluid-usage: 60 -hydraulic-fluid-buffer: 240 \ No newline at end of file +buffer: 500 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_farmer.yml b/src/main/resources/settings/hydraulic_farmer.yml index 655f64b7..00d2b91c 100644 --- a/src/main/resources/settings/hydraulic_farmer.yml +++ b/src/main/resources/settings/hydraulic_farmer.yml @@ -1,3 +1,4 @@ radius: 4 tick-interval: 80 -hydraulic-fluid-usage: 80 \ No newline at end of file +hydraulic-fluid-usage: 80 +buffer: 500 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_grindstone_turner.yml b/src/main/resources/settings/hydraulic_grindstone_turner.yml index 2cf88471..1d5cb205 100644 --- a/src/main/resources/settings/hydraulic_grindstone_turner.yml +++ b/src/main/resources/settings/hydraulic_grindstone_turner.yml @@ -1,2 +1,2 @@ hydraulic-fluid-usage: 40 -hydraulic-fluid-buffer: 800 \ No newline at end of file +buffer: 1000 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_hammer_head.yml b/src/main/resources/settings/hydraulic_hammer_head.yml index 38d50aad..c689dced 100644 --- a/src/main/resources/settings/hydraulic_hammer_head.yml +++ b/src/main/resources/settings/hydraulic_hammer_head.yml @@ -1,3 +1,4 @@ tick-interval: 10 go-down-time-ticks: 1 -hydraulic-fluid-per-craft: 80 \ No newline at end of file +hydraulic-fluid-per-craft: 80 +buffer: 500 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_mixing_attachment.yml b/src/main/resources/settings/hydraulic_mixing_attachment.yml index ce5e6c44..042bbfce 100644 --- a/src/main/resources/settings/hydraulic_mixing_attachment.yml +++ b/src/main/resources/settings/hydraulic_mixing_attachment.yml @@ -1,5 +1,6 @@ tick-interval: 20 cooldown-ticks: 100 hydraulic-fluid-per-craft: 200 +buffer: 500 down-animation-time-ticks: 3 up-animation-time-ticks: 17 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_pipe_bender.yml b/src/main/resources/settings/hydraulic_pipe_bender.yml index 99b9a496..bf759399 100644 --- a/src/main/resources/settings/hydraulic_pipe_bender.yml +++ b/src/main/resources/settings/hydraulic_pipe_bender.yml @@ -1,3 +1,3 @@ tick-interval: 10 hydraulic-fluid-usage: 40 -hydraulic-fluid-buffer: 800 \ No newline at end of file +buffer: 1000 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_press_piston.yml b/src/main/resources/settings/hydraulic_press_piston.yml index b10f5259..120cd071 100644 --- a/src/main/resources/settings/hydraulic_press_piston.yml +++ b/src/main/resources/settings/hydraulic_press_piston.yml @@ -1,2 +1,3 @@ tick-interval: 10 -hydraulic-fluid-per-craft: 80 \ No newline at end of file +hydraulic-fluid-per-craft: 80 +buffer: 500 \ No newline at end of file diff --git a/src/main/resources/settings/hydraulic_table_saw.yml b/src/main/resources/settings/hydraulic_table_saw.yml index 7e4db592..f5470307 100644 --- a/src/main/resources/settings/hydraulic_table_saw.yml +++ b/src/main/resources/settings/hydraulic_table_saw.yml @@ -1,3 +1,3 @@ tick-interval: 10 hydraulic-fluid-usage: 20 -hydraulic-fluid-buffer: 400 \ No newline at end of file +buffer: 500 \ No newline at end of file diff --git a/src/main/resources/settings/manual_core_drill.yml b/src/main/resources/settings/manual_core_drill.yml index dfc81a17..e1126464 100644 --- a/src/main/resources/settings/manual_core_drill.yml +++ b/src/main/resources/settings/manual_core_drill.yml @@ -1,4 +1,4 @@ rotation-duration-ticks: 20 # must be a multiple of 4 rotations-per-cycle: 30 output: "pylonbase:shallow_core_chunk" -drill-material: black_concrete \ No newline at end of file +drill-material: gray_concrete \ No newline at end of file diff --git a/src/main/resources/settings/solar_purification_tower_1.yml b/src/main/resources/settings/solar_purification_tower_1.yml index c90370f6..c0683e3b 100644 --- a/src/main/resources/settings/solar_purification_tower_1.yml +++ b/src/main/resources/settings/solar_purification_tower_1.yml @@ -1,6 +1,6 @@ purification-speed: 16 # mb/s purification-efficiency: 0.90 -hydraulic-fluid-buffer: 64 # mb +buffer: 64 # mb rain-speed-fraction: 0.6 lens-layers: 1 tick-interval: 40 diff --git a/src/main/resources/settings/solar_purification_tower_2.yml b/src/main/resources/settings/solar_purification_tower_2.yml index fa7762d8..37bd44e5 100644 --- a/src/main/resources/settings/solar_purification_tower_2.yml +++ b/src/main/resources/settings/solar_purification_tower_2.yml @@ -1,6 +1,6 @@ purification-speed: 60 # mb/s purification-efficiency: 0.92 -hydraulic-fluid-buffer: 240 # mb +buffer: 240 # mb rain-speed-fraction: 0.6 lens-layers: 2 tick-interval: 40 diff --git a/src/main/resources/settings/solar_purification_tower_3.yml b/src/main/resources/settings/solar_purification_tower_3.yml index b0aee6f3..68756013 100644 --- a/src/main/resources/settings/solar_purification_tower_3.yml +++ b/src/main/resources/settings/solar_purification_tower_3.yml @@ -1,6 +1,6 @@ purification-speed: 240 # mb/s purification-efficiency: 0.94 -hydraulic-fluid-buffer: 560 # mb +buffer: 560 # mb rain-speed-fraction: 0.6 lens-layers: 3 tick-interval: 40 diff --git a/src/main/resources/settings/solar_purification_tower_4.yml b/src/main/resources/settings/solar_purification_tower_4.yml index 78747bcd..db539fe5 100644 --- a/src/main/resources/settings/solar_purification_tower_4.yml +++ b/src/main/resources/settings/solar_purification_tower_4.yml @@ -1,6 +1,6 @@ purification-speed: 300 # mb/s purification-efficiency: 0.96 -hydraulic-fluid-buffer: 1200 # mb +buffer: 1200 # mb rain-speed-fraction: 0.6 lens-layers: 4 tick-interval: 40 diff --git a/src/main/resources/settings/solar_purification_tower_5.yml b/src/main/resources/settings/solar_purification_tower_5.yml index 0772a592..0b066f37 100644 --- a/src/main/resources/settings/solar_purification_tower_5.yml +++ b/src/main/resources/settings/solar_purification_tower_5.yml @@ -1,6 +1,6 @@ purification-speed: 400 # mb/s purification-efficiency: 0.98 -hydraulic-fluid-buffer: 1600 # mb +buffer: 1600 # mb rain-speed-fraction: 0.6 lens-layers: 5 tick-interval: 40 diff --git a/src/main/resources/settings/sprinkler.yml b/src/main/resources/settings/sprinkler.yml index 6f68252f..c76bc690 100644 --- a/src/main/resources/settings/sprinkler.yml +++ b/src/main/resources/settings/sprinkler.yml @@ -1,5 +1,6 @@ tick-interval: 10 water-per-second: 350 +buffer: 1000 range: horizontal: 4 From c53765efb894a695762d7ca4bee0af77b2c2bfd9 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Sun, 21 Dec 2025 08:11:30 +0100 Subject: [PATCH 06/13] oops --- .../pylon/base/content/tools/Hammer.java | 21 +++++++++++-------- .../pylonmc/pylon/base/util/BaseUtils.java | 7 +++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java index c0b29619..aee1845b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/Hammer.java @@ -26,6 +26,7 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; @@ -62,7 +63,6 @@ public boolean tryDoRecipe(@NotNull Block block, @Nullable Player player, @Nulla for (Entity e : block.getWorld().getNearbyEntities(BoundingBox.of(blockAbove))) { if (e instanceof Item entity) { items.add(entity); - entity.remove(); } } @@ -76,21 +76,24 @@ public boolean tryDoRecipe(@NotNull Block block, @Nullable Player player, @Nulla continue; } - item.setItemStack(item.getItemStack().asQuantity(recipe.input().getAmount())); + if (player != null) { + player.setCooldown(getStack(), cooldownTicks); + PylonUtils.damageItem(getStack(), 1, player, slot); + } else { + PylonUtils.damageItem(getStack(), 1, block.getWorld()); + } float adjustedChance = recipe.chance() * // Each tier is twice as likely to succeed as the previous one (1 << miningLevel.getNumericalLevel() - recipe.level().getNumericalLevel()); if (ThreadLocalRandom.current().nextFloat() > adjustedChance) { - continue; + return true; // recipe attempted but unsuccessful } - if (player != null) { - player.setCooldown(getStack(), cooldownTicks); - PylonUtils.damageItem(getStack(), 1, player, slot); - } else { - PylonUtils.damageItem(getStack(), 1, block.getWorld()); - } + int newAmount = item.getItemStack().getAmount() - recipe.input().getAmount(); + item.setItemStack(item.getItemStack().asQuantity(newAmount)); + block.getWorld().dropItem(blockAbove.getLocation().add(0.5, 0.1, 0.5), recipe.result()) + .setVelocity(new Vector(0, 0, 0)); block.getWorld().playSound(sound.create(), block.getX() + 0.5, block.getY() + 0.5, block.getZ() + 0.5); return true; diff --git a/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java b/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java index 28f23783..2383e8a8 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java +++ b/src/main/java/io/github/pylonmc/pylon/base/util/BaseUtils.java @@ -5,8 +5,8 @@ import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import lombok.experimental.UtilityClass; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; -import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.NamespacedKey; @@ -71,7 +71,7 @@ private int clampAndRound(double value) { } public @NotNull TextDisplay spawnUnitSquareTextDisplay(@NotNull Location location, @NotNull Color color) { - return spawnUnitSquareTextDisplay(location, color, (Consumer) display -> {}); + return spawnUnitSquareTextDisplay(location, color, display -> {}); } public @NotNull TextDisplay spawnUnitSquareTextDisplay(@NotNull Location location, @NotNull Color color, Consumer initializer) { @@ -110,10 +110,9 @@ private int clampAndRound(double value) { public @NotNull Component createFluidAmountBar(double amount, double capacity, int bars, TextColor fluidColor) { int filledBars = Math.max(0, (int) Math.round(bars * amount / capacity)); - Bukkit.getLogger().severe("bruh " + filledBars); return Component.translatable("pylon.pylonbase.gui.fluid_amount_bar.text").arguments( PylonArgument.of("filled_bars", Component.text("|".repeat(filledBars)).color(fluidColor)), - PylonArgument.of("empty_bars", Component.text("|".repeat(bars - filledBars))), + PylonArgument.of("empty_bars", Component.text("|".repeat(bars - filledBars)).color(NamedTextColor.GRAY)), PylonArgument.of("amount", Math.round(amount)), PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(Math.round(capacity))) ); From 5d547fdbcaf8d64b1db8c71cd260112deee80f06 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Sun, 21 Dec 2025 20:19:57 +0100 Subject: [PATCH 07/13] fix smoke location --- .../pylon/base/content/machines/diesel/DieselBrickMolder.java | 2 +- .../pylon/base/content/machines/diesel/DieselGrindstone.java | 2 +- .../pylon/base/content/machines/diesel/DieselPipeBender.java | 2 +- .../pylon/base/content/machines/diesel/DieselTableSaw.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java index 5c037c53..111a9264 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java @@ -158,7 +158,7 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( - new Vector3d(0.4, 0.7, 0.4), + new Vector3d(0.4, 0.7, -0.4), getFacing()) ); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java index 86068114..59230d4d 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java @@ -162,7 +162,7 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( - new Vector3d(0.4, 0.7, 0.4), + new Vector3d(0.4, 0.7, -0.4), getFacing() )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java index 2ca6161a..140437be 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java @@ -174,7 +174,7 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); progressRecipe(tickInterval); Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( - new Vector3d(0.4, 0.7, 0.4), + new Vector3d(0.4, 0.7, -0.4), getFacing() )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java index 5bc53890..1a20cbae 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java @@ -160,7 +160,7 @@ public void tick() { removeFluid(BaseFluids.BIODIESEL, dieselPerSecond * tickInterval / 20); Vector smokePosition = Vector.fromJOML(PylonUtils.rotateVectorToFace( - new Vector3d(0.4, 0.7, 0.4), + new Vector3d(0.4, 0.7, -0.4), getFacing() )); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) From 18d3a66dec343e1626850d43651791ba48da335f Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Sun, 21 Dec 2025 20:21:17 +0100 Subject: [PATCH 08/13] fix extractor/inserter direction --- .../pylon/base/content/machines/cargo/CargoExtractor.java | 8 ++++---- .../pylon/base/content/machines/cargo/CargoInserter.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java index 3c52f773..73b35d0f 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoExtractor.java @@ -66,7 +66,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) setFacing(context.getFacing()); - addCargoLogisticGroup(getFacing().getOppositeFace(), "output"); + addCargoLogisticGroup(getFacing(), "output"); for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { addCargoLogisticGroup(face, "output"); } @@ -76,7 +76,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) .itemStack(mainStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) - .translate(0, 0, 0.4) + .translate(0, 0, -0.4) .scale(0.65, 0.65, 0.2) ) .build(block.getLocation().toCenterLocation()) @@ -86,7 +86,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) .itemStack(outputStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) - .translate(0, 0, 0.3) + .translate(0, 0, -0.3) .scale(0.4, 0.4, 0.05) ) .build(block.getLocation().toCenterLocation()) @@ -96,7 +96,7 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) .itemStack(ductStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) - .translate(0, 0, 0.0625) + .translate(0, 0, -0.0625) .scale(0.35, 0.35, 0.475) ) .build(block.getLocation().toCenterLocation()) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java index fca5c4f4..050ff46b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoInserter.java @@ -65,7 +65,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) setFacing(context.getFacing()); - addCargoLogisticGroup(getFacing().getOppositeFace(), "input"); + addCargoLogisticGroup(getFacing(), "input"); for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { addCargoLogisticGroup(face, "input"); } @@ -75,7 +75,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) .itemStack(mainStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) - .translate(0, 0, 0.4) + .translate(0, 0, -0.4) .scale(0.65, 0.65, 0.2) ) .build(block.getLocation().toCenterLocation()) @@ -85,7 +85,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) .itemStack(inputStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) - .translate(0, 0, 0.3) + .translate(0, 0, -0.3) .scale(0.4, 0.4, 0.05) ) .build(block.getLocation().toCenterLocation()) @@ -95,7 +95,7 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) .itemStack(ductStack) .transformation(new TransformBuilder() .lookAlong(getFacing()) - .translate(0, 0, 0.0625) + .translate(0, 0, -0.0625) .scale(0.35, 0.35, 0.475) ) .build(block.getLocation().toCenterLocation()) From 7ee3ee7d48b49876ad8cd79541daf75675c68e2f Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Sun, 21 Dec 2025 21:35:56 +0100 Subject: [PATCH 09/13] fix some things I missed --- .../content/machines/diesel/DieselBrickMolder.java | 10 ++++++---- .../base/content/machines/diesel/DieselGrindstone.java | 10 ++++++---- .../base/content/machines/diesel/DieselPipeBender.java | 10 ++++++---- .../base/content/machines/diesel/DieselPress.java | 10 ++++++---- .../base/content/machines/diesel/DieselTableSaw.java | 10 ++++++---- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java index 111a9264..c049dee8 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java @@ -80,8 +80,10 @@ public Item(@NotNull ItemStack stack) { public ItemStackBuilder plankStack = ItemStackBuilder.of(Material.OAK_PLANKS) .addCustomModelDataString(getKey() + ":cube"); - public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder sideStack1 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side1"); + public ItemStackBuilder sideStack2 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side2"); public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) .addCustomModelDataString(getKey() + ":chimney"); @@ -100,14 +102,14 @@ public DieselBrickMolder(@NotNull Block block, @NotNull BlockCreateContext conte .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side1", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack1) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(1.1, 0.8, 0.8)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side2", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack2) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(0.9, 0.8, 1.1)) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java index 59230d4d..d8c043b2 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselGrindstone.java @@ -84,8 +84,10 @@ public Item(@NotNull ItemStack stack) { public ItemStackBuilder stoneStack = ItemStackBuilder.of(Material.SMOOTH_STONE) .addCustomModelDataString(getKey() + ":stone"); - public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder sideStack1 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side1"); + public ItemStackBuilder sideStack2 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side2"); public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) .addCustomModelDataString(getKey() + ":chimney"); @@ -104,14 +106,14 @@ public DieselGrindstone(@NotNull Block block, @NotNull BlockCreateContext contex .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side1", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack1) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(1.1, 0.8, 0.8)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side2", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack2) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(0.9, 0.8, 1.1)) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java index 140437be..0e1d1ada 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPipeBender.java @@ -79,8 +79,10 @@ public Item(@NotNull ItemStack stack) { public ItemStackBuilder cubeStack = ItemStackBuilder.of(Material.GRAY_CONCRETE) .addCustomModelDataString(getKey() + ":cube"); - public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder sideStack1 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side1"); + public ItemStackBuilder sideStack2 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side2"); public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) .addCustomModelDataString(getKey() + ":chimney"); @@ -99,14 +101,14 @@ public DieselPipeBender(@NotNull Block block, @NotNull BlockCreateContext contex .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side1", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack1) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(1.1, 0.8, 0.8)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side2", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack2) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(0.9, 0.8, 1.1)) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java index ecc52bdf..ee82068c 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselPress.java @@ -80,8 +80,10 @@ public Item(@NotNull ItemStack stack) { .addCustomModelDataString(getKey() + ":press"); public ItemStackBuilder pressLidStack = ItemStackBuilder.of(Material.COMPOSTER) .addCustomModelDataString(getKey() + ":press_lid"); - public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder sideStack1 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side1"); + public ItemStackBuilder sideStack2 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side2"); public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) .addCustomModelDataString(getKey() + ":chimney"); @@ -101,14 +103,14 @@ public DieselPress(@NotNull Block block, @NotNull BlockCreateContext context) { .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side1", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack1) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(1.1, 0.8, 0.8)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side2", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack2) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(0.9, 0.8, 1.1)) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java index 1a20cbae..2c0e75b9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselTableSaw.java @@ -55,8 +55,10 @@ public class DieselTableSaw extends PylonBlock implements public final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); public final double speed = getSettings().getOrThrow("speed", ConfigAdapter.DOUBLE); - public ItemStackBuilder sideStack = ItemStackBuilder.of(Material.BRICKS) - .addCustomModelDataString(getKey() + ":side"); + public ItemStackBuilder sideStack1 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side1"); + public ItemStackBuilder sideStack2 = ItemStackBuilder.of(Material.BRICKS) + .addCustomModelDataString(getKey() + ":side2"); public ItemStackBuilder chimneyStack = ItemStackBuilder.of(Material.CYAN_TERRACOTTA) .addCustomModelDataString(getKey() + ":chimney"); @@ -98,14 +100,14 @@ public DieselTableSaw(@NotNull Block block, @NotNull BlockCreateContext context) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side1", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack1) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(1.1, 0.8, 0.8)) .build(block.getLocation().toCenterLocation().add(0, 0.5, 0)) ); addEntity("side2", new ItemDisplayBuilder() - .itemStack(sideStack) + .itemStack(sideStack2) .transformation(new TransformBuilder() .translate(0, -0.5, 0) .scale(0.9, 0.8, 1.1)) From 7d152e9da3208017239d868e38132934fe419ebf Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:16:17 +0100 Subject: [PATCH 10/13] you will run ci and you will be happy --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1228ff3e..9c2c3abb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ## What is Pylon? -Pylon is an upcoming Minecraft Java plugin that will hugely expand vanilla gameplay with new content, including electric machines, huge multiblocks, a fully-fledged fluid system, a complex smelting system, extensive automation options and much, an (actually good) research system, and much more. It is intended to supersede Slimefun. +Pylon is an upcoming Minecraft Java plugin that will hugely expand vanilla gameplay with new content, including electric machines, huge multiblocks, a fully-fledged fluid system, a complex smelting system, extensive automation options and much, an (actually good) research system, and much more. It is intended to supersede Slimefun Pylon uses an addon system, meaning anyone can add content to Pylon by writing an addon for it! It also comes with a number of really useful features, such as: - First-class translation support, meaning each player can select their own language. From 0b3b5d8545f2daea265baad55ce217c13e06df65 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Fri, 26 Dec 2025 21:01:04 +0100 Subject: [PATCH 11/13] PR comments --- .../pylonmc/pylon/base/content/machines/fluid/FluidMeter.java | 2 +- .../pylon/base/content/machines/fluid/FluidVoider.java | 2 +- .../pylonmc/pylon/base/content/machines/fluid/Sprinkler.java | 4 ++-- .../pylonmc/pylon/base/content/machines/fluid/WaterPump.java | 2 +- .../base/content/machines/smelting/SmelteryInputHatch.java | 2 +- .../base/content/machines/smelting/SmelteryOutputHatch.java | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java index 586f99f2..503f519d 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidMeter.java @@ -53,7 +53,7 @@ public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) { @Override public void tick() { - Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / (20 * PylonConfig.fluidTickInterval))).asComponent(); + Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / (20 * PylonConfig.FLUID_TICK_INTERVAL))).asComponent(); getHeldEntityOrThrow(TextDisplay.class, "flow_rate_north").text(component); getHeldEntityOrThrow(TextDisplay.class, "flow_rate_south").text(component); diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java index da6f2aed..d513b650 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/FluidVoider.java @@ -70,7 +70,7 @@ public FluidVoider(@NotNull Block block, @NotNull PersistentDataContainer pdc) { @Override public double fluidAmountRequested(@NotNull PylonFluid fluid) { - return voidRate * PylonConfig.fluidTickInterval / 20; + return voidRate * PylonConfig.FLUID_TICK_INTERVAL / 20; } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java index 4fc013d5..8a3d816b 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/Sprinkler.java @@ -82,9 +82,9 @@ public void onFlowerPotManipulated(@NotNull PlayerFlowerPotManipulateEvent event @Override public void tick() { - if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * PylonConfig.fluidTickInterval / 20.0) { + if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * PylonConfig.FLUID_TICK_INTERVAL / 20.0) { WateringCan.water(getBlock(), SETTINGS); - removeFluid(BaseFluids.WATER, WATER_PER_SECOND * PylonConfig.fluidTickInterval / 20.0); + removeFluid(BaseFluids.WATER, WATER_PER_SECOND * PylonConfig.FLUID_TICK_INTERVAL / 20.0); } } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java index d82f9942..237fb080 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/WaterPump.java @@ -56,7 +56,7 @@ public WaterPump(@NotNull Block block, @NotNull PersistentDataContainer pdc) { @Override public @NotNull Map getSuppliedFluids() { return getBlock().getRelative(BlockFace.DOWN).getType() == Material.WATER - ? Map.of(BaseFluids.WATER, waterPerSecond * PylonConfig.fluidTickInterval / 20.0) + ? Map.of(BaseFluids.WATER, waterPerSecond * PylonConfig.FLUID_TICK_INTERVAL / 20.0) : Map.of(); } diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java index 76b8485d..68c5fbdb 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java @@ -30,7 +30,7 @@ public SmelteryInputHatch(@NotNull Block block, @NotNull PersistentDataContainer public double fluidAmountRequested(@NotNull PylonFluid fluid) { SmelteryController controller = getController(); if (controller == null || !fluid.hasTag(FluidTemperature.class)) return 0.0; - return Math.min(controller.getCapacity() - controller.getTotalFluid(), flowRate * PylonConfig.fluidTickInterval / 20); + return Math.min(controller.getCapacity() - controller.getTotalFluid(), flowRate * PylonConfig.FLUID_TICK_INTERVAL / 20); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java index 57b7b087..c20c3256 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryOutputHatch.java @@ -37,7 +37,7 @@ public SmelteryOutputHatch(@NotNull Block block, @NotNull PersistentDataContaine Pair supplied = controller.getBottomFluid(); return supplied == null ? Map.of() - : Map.of(supplied.getFirst(), Math.min(supplied.getSecond(), flowRate * PylonConfig.fluidTickInterval/ 20.0)); + : Map.of(supplied.getFirst(), Math.min(supplied.getSecond(), flowRate * PylonConfig.FLUID_TICK_INTERVAL / 20.0)); } @Override From bbd560bfabc45a0f7abeec793820b47f60e249c6 Mon Sep 17 00:00:00 2001 From: Idra <35176119+LordIdra@users.noreply.github.com> Date: Mon, 29 Dec 2025 00:17:18 +0100 Subject: [PATCH 12/13] pr comments --- .../pylonmc/pylon/base/content/tools/HydraulicCannon.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java index 9e90c362..d7d4c52c 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/HydraulicCannon.java @@ -15,7 +15,6 @@ import io.github.pylonmc.pylon.core.item.base.PylonInteractor; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import net.kyori.adventure.text.format.TextColor; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -54,12 +53,6 @@ public HydraulicCannon(@NotNull ItemStack stack) { @Override public @NotNull List<@NotNull PylonArgument> getPlaceholders() { - Bukkit.getLogger().severe("a " + getHydraulicFluid() + " " + HYDRAULIC_FLUID_CAPACITY + " " + BaseUtils.createFluidAmountBar( - getHydraulicFluid(), - HYDRAULIC_FLUID_CAPACITY, - 20, - TextColor.fromHexString("#212d99") - )); return List.of( PylonArgument.of("damage", UnitFormat.HEARTS.format(projectileDamage)), PylonArgument.of("cooldown", UnitFormat.SECONDS.format(cooldownTicks / 20.0)), From d37207e9387393ecad1618962e8fa94867b12df5 Mon Sep 17 00:00:00 2001 From: LordIdra Date: Tue, 30 Dec 2025 12:52:07 +0000 Subject: [PATCH 13/13] THE MOST IMPORTANT CODE CHANGE IN THE HISTORY OF HUMANKIND HAS BEEN MADE. REJOICE!!!! --- .../pylonmc/pylon/base/content/building/Pedestal.java | 5 ++++- .../pylon/base/content/machines/simple/MagicAltar.java | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java b/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java index 63e466fc..4fa07abc 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/building/Pedestal.java @@ -9,6 +9,8 @@ import io.github.pylonmc.pylon.core.datatypes.PylonSerializers; import io.github.pylonmc.pylon.core.entity.display.ItemDisplayBuilder; import io.github.pylonmc.pylon.core.entity.display.transform.TransformBuilder; +import lombok.Getter; +import lombok.Setter; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.entity.ItemDisplay; @@ -29,7 +31,8 @@ public class Pedestal extends PylonBlock implements PylonEntityHolderBlock, Pylo private static final NamespacedKey ROTATION_KEY = baseKey("rotation"); private static final NamespacedKey LOCKED_KEY = baseKey("locked"); private double rotation; - public boolean locked; + @Getter @Setter + private boolean locked; @SuppressWarnings("unused") public Pedestal(@NotNull Block block, @NotNull BlockCreateContext context) { diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java index 8dc73164..2134f177 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/MagicAltar.java @@ -119,7 +119,7 @@ public void onInteract(PlayerInteractEvent event) { itemDisplay.setItemStack(catalyst.asQuantity(1)); catalyst.subtract(); for (Pedestal pedestal : getPedestals()) { - pedestal.locked = true; + pedestal.setLocked(true); } startRecipe(recipe, recipe.timeSeconds() * 20); break; @@ -195,7 +195,7 @@ public ItemDisplay getItemDisplay() { public void onRecipeFinished(@NotNull MagicAltarRecipe recipe) { for (Pedestal pedestal : getPedestals()) { pedestal.getItemDisplay().setItemStack(null); - pedestal.locked = false; + pedestal.setLocked(false); } getItemDisplay().setItemStack(recipe.result()); @@ -212,7 +212,7 @@ public void cancelRecipe() { for (Pedestal pedestal : getPedestals()) { if (pedestal != null) { - pedestal.locked = false; + pedestal.setLocked(false); } }