diff --git a/README.md b/README.md index 1228ff3ec..9c2c3abbe 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. 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 2dea87e25..8e519b646 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java +++ b/src/main/java/io/github/pylonmc/pylon/base/BaseBlocks.java @@ -4,17 +4,19 @@ 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.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; import io.github.pylonmc.pylon.base.content.machines.diesel.DieselGrindstone; -import io.github.pylonmc.pylon.base.content.components.EnrichedSoulSoil; import io.github.pylonmc.pylon.base.content.machines.diesel.DieselPipeBender; import io.github.pylonmc.pylon.base.content.machines.cargo.CargoBuffer; import io.github.pylonmc.pylon.base.content.machines.diesel.DieselPress; 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; 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 04a01e003..104fc1dce 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; @@ -763,7 +762,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); } @@ -1192,7 +1191,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); } @@ -1200,7 +1199,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); } @@ -1208,7 +1207,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); } @@ -1318,7 +1317,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 e9c7b9c01..af04e1433 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 60a28a54b..4fa07abc9 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,7 @@ 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; @@ -30,7 +31,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 + @Getter @Setter private boolean locked; @SuppressWarnings("unused") 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 e1e54b00f..f82c40f08 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/EnrichedSoulSoil.java b/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedSoulSoil.java index 672bc43c0..ce355fa30 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedSoulSoil.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/components/EnrichedSoulSoil.java @@ -28,7 +28,8 @@ public EnrichedSoulSoil(@NotNull Block block, @NotNull PersistentDataContainer p super(block, pdc); } - public void tick(double deltaSeconds) { + @Override + 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/cargo/CargoBuffer.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/cargo/CargoBuffer.java index 81a61075f..76c126eba 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,52 +13,37 @@ 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); - 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 { @@ -83,20 +68,16 @@ 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"); - } - - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true); + setFacing(context.getFacing()); - 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 +86,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 +96,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 +106,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 +116,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 +127,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 +138,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 a3b3873cc..73b35d0fe 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,27 +28,18 @@ 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) - .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 { @@ -75,15 +64,10 @@ 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 - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace(); + setFacing(context.getFacing()); - addCargoLogisticGroup(facing.getOppositeFace(), "output"); - for (BlockFace face : PylonUtils.perpendicularImmediateFaces(facing)) { + addCargoLogisticGroup(getFacing(), "output"); + for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { addCargoLogisticGroup(face, "output"); } setCargoTransferRate(transferRate); @@ -91,8 +75,8 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("main", new ItemDisplayBuilder() .itemStack(mainStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0.4) + .lookAlong(getFacing()) + .translate(0, 0, -0.4) .scale(0.65, 0.65, 0.2) ) .build(block.getLocation().toCenterLocation()) @@ -101,8 +85,8 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("output", new ItemDisplayBuilder() .itemStack(outputStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0.3) + .lookAlong(getFacing()) + .translate(0, 0, -0.3) .scale(0.4, 0.4, 0.05) ) .build(block.getLocation().toCenterLocation()) @@ -111,8 +95,8 @@ public CargoExtractor(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("duct", new ItemDisplayBuilder() .itemStack(ductStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0.0625) + .lookAlong(getFacing()) + .translate(0, 0, -0.0625) .scale(0.35, 0.35, 0.475) ) .build(block.getLocation().toCenterLocation()) @@ -122,21 +106,11 @@ 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 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 @@ -150,11 +124,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 +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"); } @@ -190,7 +159,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 f3c23d062..050ff46b7 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,27 +27,18 @@ 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) - .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 { @@ -74,14 +63,10 @@ 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"); - } - - facing = PylonUtils.rotateToPlayerFacing(playerPlaceContext.getPlayer(), BlockFace.NORTH, true).getOppositeFace(); + setFacing(context.getFacing()); - addCargoLogisticGroup(facing.getOppositeFace(), "input"); - for (BlockFace face : PylonUtils.perpendicularImmediateFaces(facing)) { + addCargoLogisticGroup(getFacing(), "input"); + for (BlockFace face : PylonUtils.perpendicularImmediateFaces(getFacing())) { addCargoLogisticGroup(face, "input"); } setCargoTransferRate(transferRate); @@ -89,8 +74,8 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("main", new ItemDisplayBuilder() .itemStack(mainStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0.4) + .lookAlong(getFacing()) + .translate(0, 0, -0.4) .scale(0.65, 0.65, 0.2) ) .build(block.getLocation().toCenterLocation()) @@ -99,8 +84,8 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("input", new ItemDisplayBuilder() .itemStack(inputStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0.3) + .lookAlong(getFacing()) + .translate(0, 0, -0.3) .scale(0.4, 0.4, 0.05) ) .build(block.getLocation().toCenterLocation()) @@ -109,8 +94,8 @@ public CargoInserter(@NotNull Block block, @NotNull BlockCreateContext context) addEntity("duct", new ItemDisplayBuilder() .itemStack(ductStack) .transformation(new TransformBuilder() - .lookAlong(facing) - .translate(0, 0, 0.0625) + .lookAlong(getFacing()) + .translate(0, 0, -0.0625) .scale(0.35, 0.35, 0.475) ) .build(block.getLocation().toCenterLocation()) @@ -120,13 +105,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 +125,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 +139,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 +160,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/diesel/DieselBrickMolder.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/diesel/DieselBrickMolder.java index 046158894..c049dee85 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,48 +72,44 @@ 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 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"); @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)) ); 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)) @@ -119,8 +118,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)) ); @@ -154,15 +152,19 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } 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 27417f0e1..d8c043b27 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,42 +76,44 @@ 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 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"); @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)) ); 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)) @@ -150,15 +156,19 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } 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 d7a0b0bac..0e1d1ada0 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,48 +71,44 @@ 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 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"); @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)) ); 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)) @@ -118,7 +117,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 +125,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 +133,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)) @@ -169,15 +168,19 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } 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 4a4e27356..ee82068c7 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); @@ -58,6 +59,7 @@ public class DieselPress 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 timePerItem = getSettings().getOrThrow("time-per-item", ConfigAdapter.DOUBLE); public Item(@NotNull ItemStack stack) { @@ -68,20 +70,22 @@ 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 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"); @SuppressWarnings("unused") public DieselPress(@NotNull Block block, @NotNull BlockCreateContext context) { @@ -89,32 +93,24 @@ 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); - } 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() - .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)) ); 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)) @@ -157,16 +153,19 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isProcessingRecipe() || fluidAmount(BaseFluids.BIODIESEL) < dieselPerSecond * tickInterval / 20) { return; } 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 293297077..2c0e75b9b 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,35 @@ 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 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"); private final VirtualInventory inputInventory = new VirtualInventory(1); private final VirtualInventory outputInventory = new VirtualInventory(1); @@ -62,6 +68,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 +79,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,25 +90,24 @@ 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)) ); 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)) @@ -114,6 +121,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)) ); @@ -147,14 +155,18 @@ 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; } 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 c422e6cb0..63edd31b4 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; } @@ -51,7 +88,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); } @@ -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 5d08d04ac..fb73096a9 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,8 +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.PylonEntityHolderBlock; +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; @@ -13,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 { @@ -47,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); @@ -73,7 +80,19 @@ public FluidDrainer(@NotNull Block block, @NotNull PersistentDataContainer pdc) } @Override - public void tick(double deltaSeconds) { + 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 && 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 35ba58d6d..d47919ee9 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,29 +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.PylonFluidBlock; +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; @@ -41,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 { @@ -61,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(); @@ -76,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 filter 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()) @@ -94,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); } @@ -118,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() { @@ -130,26 +133,7 @@ public void write(@NotNull PersistentDataContainer pdc) { @Override public boolean isAllowedFluid(@NotNull PylonFluid fluid) { - return true; - } - - @Override - public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { - 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.getFluidTickInterval() - * deltaSeconds - - 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 289c4e378..503f519d8 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,8 +1,8 @@ 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; 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; @@ -13,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; @@ -30,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); @@ -56,26 +52,19 @@ 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(); - - TextDisplay northDisplay = getHeldEntity(TextDisplay.class, "flow_rate_north"); - if (northDisplay != null) { - northDisplay.text(component); - } + public void tick() { + Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / (20 * PylonConfig.FLUID_TICK_INTERVAL))).asComponent(); - 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 456cd4b9c..e1137a552 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; @@ -74,17 +79,33 @@ public FluidPlacer(@NotNull Block block, @NotNull PersistentDataContainer pdc) { } @Override - public void tick(double deltaSeconds) { - 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); - } - } + 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()) { + 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 d6e57d541..389ce5321 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 buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); + public @Nullable PylonFluid fluidType; + public double fluidAmount; + private final VirtualInventory inventory = new VirtualInventory(9 * 3); - public final double bufferSize = getSettings().getOrThrow("buffer-size", ConfigAdapter.DOUBLE); + public static class Item extends PylonItem { - 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 final double buffer = getSettings().getOrThrow("buffer", ConfigAdapter.DOUBLE); - private final int tickInterval = getSettings().getOrThrow("tick-interval", ConfigAdapter.INT); + public Item(@NotNull ItemStack stack) { + super(stack); + } - private @Nullable StrainingRecipe currentRecipe; - private double buffer; - private double passedFluid; + @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); + PylonUtils.setNullable(pdc, FLUID_TYPE_KEY, PylonSerializers.PYLON_FLUID, fluidType); + pdc.set(FLUID_AMOUNT_KEY, PylonSerializers.DOUBLE, fluidAmount); } @Override - public @NotNull Map<@NotNull PylonFluid, @NotNull Double> getSuppliedFluids(double deltaSeconds) { - return currentRecipe == null ? - Map.of() : - Map.of(currentRecipe.outputFluid(), buffer); + public double fluidAmountRequested(@NotNull PylonFluid fluid) { + 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 double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSeconds) { - if (StrainingRecipe.RECIPE_TYPE.stream().anyMatch(recipe -> recipe.input().contains(fluid))) { - return bufferSize - buffer; - } else { - return 0.0; + public void onFluidAdded(@NotNull PylonFluid fluid, double amount) { + 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)); + } + fluidAmount += amount; } @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); - } - } - buffer += amount; - passedFluid += amount; + 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(double deltaSeconds) { - 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 e3baaa34b..5d2b864fc 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 026fb5e11..a6d402087 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 0a2ddee9b..524fa2a30 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,26 +124,37 @@ 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 - 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 b74d5b968..d513b650d 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.FLUID_TICK_INTERVAL / 20; } @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 464288961..e4158bbab 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,8 +2,8 @@ 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.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; @@ -24,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; @@ -95,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( @@ -171,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 @@ -281,9 +281,4 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } } } - - @Override - public @Nullable BlockFace getFacing() { - return null; - } } 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 816c140d7..8a3d816b3 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; @@ -11,6 +12,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; @@ -18,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; @@ -34,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) { @@ -44,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") @@ -68,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(double deltaSeconds) { - if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * deltaSeconds) { + public void tick() { + if (fluidAmount(BaseFluids.WATER) > WATER_PER_SECOND * PylonConfig.FLUID_TICK_INTERVAL / 20.0) { WateringCan.water(getBlock(), SETTINGS); - removeFluid(BaseFluids.WATER, WATER_PER_SECOND * deltaSeconds); + removeFluid(BaseFluids.WATER, WATER_PER_SECOND * PylonConfig.FLUID_TICK_INTERVAL / 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 55ba571a4..237fb0804 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; @@ -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); @@ -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() ; + ? Map.of(BaseFluids.WATER, waterPerSecond * PylonConfig.FLUID_TICK_INTERVAL / 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/fluid/gui/FluidSelector.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java index c00d0dae0..6023c088f 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 e413efa31..b0aafbd2d 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(); @@ -134,23 +162,23 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded()) { 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 deltaSeconds) { 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() { @@ -187,11 +233,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 e4c5c3e9f..5c5145d96 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); @@ -100,7 +104,7 @@ public HydraulicCoreDrill(@NotNull Block block, @NotNull PersistentDataContainer } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!isFormedAndFullyLoaded() || isProcessing()) { return; } @@ -126,7 +130,6 @@ public void tick(double deltaSeconds) { @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 215cf5dcc..4aa8d6994 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 8b9922ebb..564c4d15f 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 5dbf022a4..d9147c813 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 d4b0db44a..d64114737 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,15 +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.PylonEntityHolderBlock; +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; @@ -17,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; @@ -32,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); } @@ -43,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))); } } @@ -82,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"}) @@ -106,7 +119,7 @@ public void write(@NotNull PersistentDataContainer pdc) { } @Override - public void tick(double deltaSeconds) { + public void tick() { if (!working) { return; } @@ -117,7 +130,7 @@ public void tick(double deltaSeconds) { 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 @@ -146,4 +159,22 @@ public void tick(double deltaSeconds) { 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 52903dc43..b18af19ab 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,26 +1,28 @@ 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; @@ -37,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, @@ -63,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); } @@ -77,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)) ); } } @@ -88,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,8 +117,8 @@ public HydraulicFarmer(@NotNull Block block, @NotNull PersistentDataContainer pd @Override - public void tick(double deltaSeconds) { - double hydraulicFluidUsed = HYDRAULIC_FLUID_USAGE * getTickInterval() / 20.0; + public void tick() { + double hydraulicFluidUsed = hydraulicFluidUsage * getTickInterval() / 20.0; if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < hydraulicFluidUsed || fluidSpaceRemaining(BaseFluids.DIRTY_HYDRAULIC_FLUID) < hydraulicFluidUsed @@ -217,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( @@ -271,7 +283,20 @@ private List getItemsFromChest() { } @Override - public @Nullable BlockFace getFacing() { - return PylonFluidBufferBlock.super.getFacing(); + 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 080c48348..21216577b 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") @@ -65,29 +71,12 @@ public HydraulicGrindstoneTurner(@NotNull Block block, @NotNull PersistentDataCo } @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(double deltaSeconds) { - if (!isFormedAndFullyLoaded()) { + public void tick() { + 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(double deltaSeconds) { 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(double deltaSeconds) { 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 47f3399c8..f49848f55 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") @@ -144,15 +150,17 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { - cooldown = Math.max(0, cooldown - deltaSeconds); + public void tick() { + 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(double deltaSeconds) { ); } - 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, BlockFace.UP) ) { 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 b21250eb7..a67812482 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(double deltaSeconds) { - if (!isFormedAndFullyLoaded()) { - return; - } - - cooldownTimeRemaining = Math.max(0, cooldownTimeRemaining - deltaSeconds); - - if (cooldownTimeRemaining > 1.0e-5) { + public void tick() { + 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(double deltaSeconds) { 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 8e5468620..d70086b46 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); } @@ -159,27 +160,33 @@ public void onRecipeFinished(@NotNull PipeBendingRecipe recipe) { } @Override - public void tick(double deltaSeconds) { - progressRecipe(TICK_INTERVAL); + public void tick() { + 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 4898a8a23..6864a20ec 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(double deltaSeconds) { - if (!isFormedAndFullyLoaded()) { - return; - } - + public void tick() { 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(double deltaSeconds) { 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 fc8a3c21d..256f65ec2 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() @@ -130,7 +135,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 +144,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 1b91261ea..7643dff0e 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); } @@ -121,29 +128,32 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { - progressRecipe(TICK_INTERVAL); + public void tick() { + 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 09d9e3e2a..8f95f6c18 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,8 +14,11 @@ 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; @@ -25,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); @@ -38,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) { @@ -49,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)) ); } } @@ -58,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") @@ -91,7 +103,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 +111,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), @@ -113,7 +125,20 @@ public void tick(double deltaSeconds) { } @Override - public @Nullable BlockFace getFacing() { - return PylonFluidBufferBlock.super.getFacing(); + 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 c6a5e712b..acb9efca5 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,13 +4,13 @@ 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; 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; @@ -30,7 +30,8 @@ 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 { @@ -55,22 +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)) ); } @@ -119,12 +117,12 @@ public void cycle() { .subtract(0, 0.3, 0) ) .spawn(); - progressProcess(rotationDuration); + progressProcess(rotationDuration / 4); }, (long) ((i + j/4.0) * rotationDuration)); } } - 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 d0e59e8dc..711c0afc0 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 570a14fda..ec32a4c97 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 605ca60e5..2134f177c 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,9 +112,7 @@ 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; } @@ -131,7 +127,7 @@ public void onInteract(PlayerInteractEvent event) { } @Override - public void tick(double deltaSeconds) { + public void tick() { progressRecipe(tickInterval); if (!isProcessingRecipe()) { @@ -202,8 +198,6 @@ public void onRecipeFinished(@NotNull MagicAltarRecipe recipe) { pedestal.setLocked(false); } - new PylonCraftEvent<>(MagicAltarRecipe.RECIPE_TYPE, recipe, this).callEvent(); - getItemDisplay().setItemStack(recipe.result()); new ParticleBuilder(Particle.CAMPFIRE_COSY_SMOKE) 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 07dd4e837..e1777c08e 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 @@ -3,15 +3,16 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.BaseKeys; 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.*; 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.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; @@ -19,6 +20,7 @@ import io.github.pylonmc.pylon.core.recipe.RecipeInput; 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.Particle; import org.bukkit.block.Block; @@ -33,21 +35,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 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") @@ -93,25 +113,20 @@ private void updateCauldron() { @Override 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 @@ -120,10 +135,15 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } event.setCancelled(true); - tryDoRecipe(event.getPlayer()); + + if (event.getItem() != null && BUCKETS.contains(event.getMaterial()) || getFluidType() == null) { + return; + } + + tryDoRecipe(); } - public boolean tryDoRecipe(@Nullable Player player) { + public boolean tryDoRecipe() { if (getFluidType() == null) return false; Material fireType = getFire().getType(); @@ -146,14 +166,12 @@ public boolean tryDoRecipe(@Nullable Player player) { .toList(); 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, isEnrichedFire, getFluidType(), getFluidAmount())) { + continue; } + + doRecipe(recipe, items); + return true; } return false; @@ -178,12 +196,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 336f03355..5ea1503c6 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/simple/VacuumHopper.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/simple/VacuumHopper.java index 53a6afddc..c2c0c567b 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 02bd18590..af4858dd5 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 @@ -101,7 +101,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 8e69f7a08..ef908759d 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 @@ -166,7 +166,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 1ee7218bf..1299a3472 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 67f873e0a..4c2aeb1b4 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); @@ -101,7 +100,7 @@ public void postInitialise() { } @Override - public void tick(double deltaSeconds) { + public void tick() { SmelteryController controller = getController(); if (controller == null || !controller.isRunning()) { return; @@ -110,7 +109,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 8ad54b988..56dfdb1df 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,12 +1,9 @@ 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; 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; @@ -115,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; @@ -127,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) { @@ -136,7 +128,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 dfeb09de5..5f6837b9f 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 63ccd1805..94ef7eb7e 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; @@ -47,7 +45,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); @@ -56,9 +54,6 @@ public void tick(double deltaSeconds) { 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(double deltaSeconds) { 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/machines/smelting/SmelteryInputHatch.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/smelting/SmelteryInputHatch.java index 49585a985..68c5fbdbf 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.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 057a1c7be..c20c32567 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.FLUID_TICK_INTERVAL / 20.0)); } @Override 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 31b42bf0c..f0a0d35f7 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 97fcc8980..17b80d659 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; @@ -61,60 +59,48 @@ 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()); - entity.remove(); + items.add(entity); } } - 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; + if (player != null) { + player.setCooldown(getStack(), cooldownTicks); + PylonUtils.damageItem(getStack(), 1, player, slot); + } else { + PylonUtils.damageItem(getStack(), 1, block.getWorld()); + } - 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) { + return true; // recipe attempted but unsuccessful } - } - items.removeIf(item -> item.getAmount() <= 0); - items.add(recipe.result().clone()); - new PylonCraftEvent<>(HammerRecipe.RECIPE_TYPE, recipe).callEvent(); - break; - } + 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); - 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 @@ -153,8 +139,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/recipes/StrainingRecipe.java b/src/main/java/io/github/pylonmc/pylon/base/recipes/StrainingRecipe.java index dc594d5ca..9ca8d635c 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 fca372c62..2383e8a86 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,6 +5,7 @@ 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.Color; import org.bukkit.Location; @@ -70,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) { @@ -94,11 +95,24 @@ 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)); 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)).color(NamedTextColor.GRAY)), 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 a34d1e0c8..88b7e6d12 100644 --- a/src/main/resources/lang/en.yml +++ b/src/main/resources/lang/en.yml @@ -286,7 +286,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" @@ -296,7 +296,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: @@ -307,7 +307,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" @@ -317,7 +317,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" @@ -327,7 +327,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" @@ -337,7 +337,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" @@ -347,13 +347,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 - waila: "Fluid Valve (%status%)" + Buffer: %buffer% + waila: "Fluid Valve | %bars% (%fluid%) | %status%" fluid_filter: name: "Fluid Filter" @@ -361,7 +362,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 +371,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 +379,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 +411,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 +422,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 +431,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 +440,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 +448,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,8 +568,10 @@ item: lore: |- Place items in the pot and right click to mix them together Requires a fire underneath to work - Some recipes require fire underneath - waila: "Mixing Pot %info%" + Some recipes require Enriched Soul Soil fire underneath + Can also be used like a normal cauldron + Capacity: %capacity% + waila: "Mixing Pot | %bar% (%fluid%)" monster_jerky: name: "Monster Jerky" @@ -776,6 +787,8 @@ item: Requires water to be piped in Water consumption: %water_consumption% Range: %range% + Buffer: %buffer% + waila: "Sprinkler | %bars%" steel_dust: name: "Steel Dust" @@ -861,8 +874,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" @@ -870,6 +884,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" @@ -878,6 +894,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" @@ -885,6 +903,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" @@ -894,6 +914,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" @@ -902,6 +924,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" @@ -910,6 +934,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" @@ -944,12 +970,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" @@ -960,12 +988,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" @@ -976,12 +1006,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" @@ -992,12 +1024,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" @@ -1008,12 +1042,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" @@ -1023,11 +1059,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" @@ -1049,7 +1087,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" @@ -1057,7 +1095,6 @@ item: Multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Wooden Fluid Tank Casing %info%" fluid_tank_casing_copper: name: "Copper Fluid Tank Casing" @@ -1065,7 +1102,6 @@ item: Multiblock component Capacity: %capacity% Temperatures: %temperatures% - waila: "Copper Fluid Tank Casing %info%" fluid_tank_casing_tin: name: "Tin Fluid Tank Casing" @@ -1073,7 +1109,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" @@ -1081,7 +1116,6 @@ item: Fluid Tank component Capacity: %capacity% Temperatures: %temperatures% - waila: "Iron Fluid Tank Casing %info%" fluid_tank_casing_bronze: name: "Bronze Fluid Tank Casing" @@ -1089,7 +1123,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" @@ -1097,7 +1130,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" @@ -1105,7 +1137,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" @@ -1163,11 +1194,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" @@ -1307,6 +1340,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" @@ -1319,12 +1354,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%" @@ -1333,6 +1371,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%" @@ -1342,6 +1381,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%" @@ -1350,6 +1390,7 @@ item: lore: |- Grinds items Diesel usage: %diesel-usage% + Diesel buffer: %diesel-buffer% waila: "Diesel Grindstone | %diesel-bar%" diesel_brick_molder: @@ -1357,9 +1398,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: |- @@ -1412,20 +1468,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: @@ -1514,7 +1567,6 @@ guide: molding: "Molding cycles: %molding-cycles%" message: - fluid_none: "None" fluid_selector: current_fluid: "Current fluid: %fluid%" clear: "Clear" @@ -1538,31 +1590,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" @@ -1595,8 +1633,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 eea458832..77abee2ff 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 85b240f73..6c24bc57a 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 6ed82e6a8..a550fcef3 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 fefb3a42b..a777f4954 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 000000000..0f618d362 --- /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 9efa738c9..9a927cb1b 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 655f64b7b..00d2b91c6 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 2cf884718..1d5cb2058 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 38d50aad6..c689dced1 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 ce5e6c447..042bbfce1 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 99b9a4964..bf7593991 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 b10f52598..120cd0712 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 7e4db5921..f54703070 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 dfc81a17f..e1126464f 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 c90370f64..c0683e3bc 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 fa7762d80..37bd44e55 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 b0aee6f33..687560130 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 78747bcdb..db539fe56 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 0772a592b..0b066f377 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 6f68252f5..c76bc690b 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