diff --git a/src/main/java/io/github/pylonmc/pylon/base/BaseEntities.java b/src/main/java/io/github/pylonmc/pylon/base/BaseEntities.java deleted file mode 100644 index 3ef06b01d..000000000 --- a/src/main/java/io/github/pylonmc/pylon/base/BaseEntities.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.pylonmc.pylon.base; - -import io.github.pylonmc.pylon.base.entities.SimpleBlockDisplay; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; -import io.github.pylonmc.pylon.base.entities.SimpleTextDisplay; -import io.github.pylonmc.pylon.core.entity.PylonEntity; -import org.bukkit.entity.BlockDisplay; -import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.TextDisplay; - -public final class BaseEntities { - - private BaseEntities() { - throw new AssertionError("Utility class"); - } - - public static void initialize() { - PylonEntity.register(BaseKeys.SIMPLE_ITEM_DISPLAY, ItemDisplay.class, SimpleItemDisplay.class); - PylonEntity.register(BaseKeys.SIMPLE_BLOCK_DISPLAY, BlockDisplay.class, SimpleBlockDisplay.class); - PylonEntity.register(BaseKeys.SIMPLE_TEXT_DISPLAY, TextDisplay.class, SimpleTextDisplay.class); - } -} diff --git a/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java b/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java index cf5f6cbcb..de7f57936 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java +++ b/src/main/java/io/github/pylonmc/pylon/base/BaseItems.java @@ -15,7 +15,7 @@ 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.smelting.PitKiln; -import io.github.pylonmc.pylon.base.content.magic.FireproofRune; +import io.github.pylonmc.pylon.base.content.tools.FireproofRune; import io.github.pylonmc.pylon.base.content.resources.RefractoryMix; import io.github.pylonmc.pylon.base.content.science.Loupe; import io.github.pylonmc.pylon.base.content.science.ResearchPack; diff --git a/src/main/java/io/github/pylonmc/pylon/base/PylonBase.java b/src/main/java/io/github/pylonmc/pylon/base/PylonBase.java index b72bb81b8..84d6083b9 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/PylonBase.java +++ b/src/main/java/io/github/pylonmc/pylon/base/PylonBase.java @@ -1,7 +1,7 @@ package io.github.pylonmc.pylon.base; import io.github.pylonmc.pylon.base.command.PylonBaseCommand; -import io.github.pylonmc.pylon.base.content.magic.base.Rune; +import io.github.pylonmc.pylon.base.content.tools.base.Rune; import io.github.pylonmc.pylon.base.content.tools.HealthTalisman; import io.github.pylonmc.pylon.base.content.building.Immobilizer; import io.github.pylonmc.pylon.base.content.building.IgneousCompositeListener; @@ -46,7 +46,6 @@ public void onEnable() { BaseItems.initialize(); BaseBlocks.initialize(); - BaseEntities.initialize(); BaseFluids.initialize(); BaseResearches.initialize(); BaseRecipes.initialize(); 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 f43211822..5f1c96794 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 @@ -1,6 +1,5 @@ package io.github.pylonmc.pylon.base.content.building; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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.PylonInteractBlock; @@ -37,10 +36,10 @@ public class Pedestal extends PylonBlock implements PylonEntityHolderBlock, Pylo public Pedestal(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - addEntity("item", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("item", new ItemDisplayBuilder() .transformation(transformBuilder().buildForItemDisplay()) .build(getBlock().getLocation().toCenterLocation()) - )); + ); rotation = 0; locked = false; @@ -101,7 +100,7 @@ public void onBreak(@NotNull List drops, @NotNull BlockBreakContext c } public ItemDisplay getItemDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "item").getEntity(); + return getHeldEntityOrThrow(ItemDisplay.class, "item"); } public TransformBuilder transformBuilder() { 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 6334c46f5..f49facabf 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 @@ -2,7 +2,6 @@ import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.content.machines.fluid.gui.FluidSelector; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -21,6 +20,7 @@ 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; @@ -62,8 +62,12 @@ public Item(@NotNull ItemStack stack) { public static final NamespacedKey FLUID_KEY = baseKey("fluid"); - public static final Material MAIN_MATERIAL = Material.WHITE_CONCRETE; - public static final Material NO_FLUID_MATERIAL = Material.RED_CONCRETE; + public final ItemStack mainStack = ItemStackBuilder.of(Material.WHITE_CONCRETE) + .addCustomModelDataString(getKey() + ":main") + .build(); + public final ItemStack noFluidStack = ItemStackBuilder.of(Material.RED_CONCRETE) + .addCustomModelDataString(getKey() + ":fluid:none") + .build(); protected @Nullable PylonFluid fluid; @@ -80,21 +84,21 @@ public FluidFilter(@NotNull Block block, @NotNull BlockCreateContext context) { Preconditions.checkState(context instanceof BlockCreateContext.PlayerPlace, "Fluid valve can only be placed by a player"); Player player = ((BlockCreateContext.PlayerPlace) context).getPlayer(); - addEntity("main", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(MAIN_MATERIAL) + addEntity("main", new ItemDisplayBuilder() + .itemStack(mainStack) .transformation(new TransformBuilder() .lookAlong(PylonUtils.rotateToPlayerFacing(player, BlockFace.EAST, false).getDirection().toVector3d()) .scale(0.25, 0.25, 0.5) ) - .build(block.getLocation().toCenterLocation())) + .build(block.getLocation().toCenterLocation()) ); - addEntity("fluid", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(NO_FLUID_MATERIAL) + addEntity("fluid", new ItemDisplayBuilder() + .itemStack(noFluidStack) .transformation(new TransformBuilder() .lookAlong(PylonUtils.rotateToPlayerFacing(player, BlockFace.EAST, false).getDirection().toVector3d()) .scale(0.2, 0.3, 0.45) ) - .build(block.getLocation().toCenterLocation())) + .build(block.getLocation().toCenterLocation()) ); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.EAST, 0.25F)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.WEST, 0.25F)); @@ -120,7 +124,7 @@ public void write(@NotNull PersistentDataContainer pdc) { } private @NotNull ItemDisplay getFluidDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "fluid").getEntity(); + return getHeldEntityOrThrow(ItemDisplay.class, "fluid"); } @Override @@ -136,8 +140,8 @@ public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSecond // Make sure the filter always has enough fluid for one tick's worth of output // somewhat hacky - VirtualFluidPoint output = getHeldEntityOrThrow(FluidPointInteraction.class, "output").getPoint(); - VirtualFluidPoint input = getHeldEntityOrThrow(FluidPointInteraction.class, "input").getPoint(); + VirtualFluidPoint output = getHeldPylonEntityOrThrow(FluidPointInteraction.class, "output").getPoint(); + VirtualFluidPoint input = getHeldPylonEntityOrThrow(FluidPointInteraction.class, "input").getPoint(); double outputFluidPerSecond = FluidManager.getFluidPerSecond(output.getSegment()); double inputFluidPerSecond = FluidManager.getFluidPerSecond(input.getSegment()); return Math.max(0.0, Math.min(outputFluidPerSecond, inputFluidPerSecond) @@ -149,7 +153,7 @@ public double fluidAmountRequested(@NotNull PylonFluid fluid, double deltaSecond public void setFluid(PylonFluid fluid) { this.fluid = fluid; - getFluidDisplay().setItemStack(new ItemStack(fluid == null ? NO_FLUID_MATERIAL : fluid.getMaterial())); + getFluidDisplay().setItemStack(fluid == null ? noFluidStack : fluid.getItem()); } @Override 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 7eafa62de..6292fa695 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,7 +1,6 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; import com.google.common.base.Preconditions; -import io.github.pylonmc.pylon.base.entities.SimpleTextDisplay; 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.adapter.ConfigAdapter; @@ -15,6 +14,7 @@ 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; import org.joml.Vector3d; @@ -56,21 +56,21 @@ public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) { public void tick(double deltaSeconds) { Component component = UnitFormat.MILLIBUCKETS_PER_SECOND.format(Math.round(removedSinceLastUpdate / deltaSeconds)).asComponent(); - SimpleTextDisplay northDisplay = getHeldEntity(SimpleTextDisplay.class, "flow_rate_north"); + TextDisplay northDisplay = getHeldEntity(TextDisplay.class, "flow_rate_north"); if (northDisplay != null) { - northDisplay.getEntity().text(component); + northDisplay.text(component); } - SimpleTextDisplay southDisplay = getHeldEntity(SimpleTextDisplay.class, "flow_rate_south"); + TextDisplay southDisplay = getHeldEntity(TextDisplay.class, "flow_rate_south"); if (southDisplay != null) { - southDisplay.getEntity().text(component); + southDisplay.text(component); } removedSinceLastUpdate = 0.0; } - private @NotNull SimpleTextDisplay createTextDisplay(@NotNull Player player, @NotNull BlockFace face) { - return new SimpleTextDisplay(new TextDisplayBuilder() + private @NotNull TextDisplay createTextDisplay(@NotNull Player player, @NotNull BlockFace face) { + return new TextDisplayBuilder() .transformation(new TransformBuilder() .lookAlong(PylonUtils.rotateToPlayerFacing(player, face, false).getDirection().toVector3d()) .translate(new Vector3d(0.0, 0.0, 0.126)) @@ -78,8 +78,7 @@ public void tick(double deltaSeconds) { ) .backgroundColor(Color.fromARGB(0, 0, 0, 0)) .text(UnitFormat.MILLIBUCKETS_PER_SECOND.format(0).asComponent()) - .build(getBlock().getLocation().toCenterLocation()) - ); + .build(getBlock().getLocation().toCenterLocation()); } @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 953ec7959..d3a7b1149 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,6 +1,5 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -26,6 +25,7 @@ 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; @@ -73,9 +73,9 @@ public FluidTank(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); height = 0; allowedTemperatures = List.of(); - addEntity("fluid", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("fluid", new ItemDisplayBuilder() .build(getBlock().getLocation().toCenterLocation().add(0, 1, 0)) - )); + ); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); } @@ -147,14 +147,14 @@ public boolean isAllowedFluid(@NotNull PylonFluid fluid) { @Override public void setFluidType(@Nullable PylonFluid fluid) { PylonFluidTank.super.setFluidType(fluid); - getFluidDisplay().getEntity().setItemStack(fluid == null ? null : new ItemStack(fluid.getMaterial())); + getFluidDisplay().setItemStack(fluid == null ? null : fluid.getItem()); } @Override public boolean setFluid(double amount) { boolean result = PylonFluidTank.super.setFluid(amount); float scale = (float) ((height - 0.1) * getFluidAmount() / getFluidCapacity()); - getFluidDisplay().getEntity().setTransformationMatrix(new TransformBuilder() + getFluidDisplay().setTransformationMatrix(new TransformBuilder() .translate(0.0, -0.45 + scale / 2, 0.0) .scale(0.9, scale, 0.9) .buildForItemDisplay() @@ -162,8 +162,8 @@ public boolean setFluid(double amount) { return result; } - public @NotNull SimpleItemDisplay getFluidDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "fluid"); + public @NotNull ItemDisplay getFluidDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "fluid"); } @Override 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 7562030ca..e568db55c 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 @@ -31,7 +31,6 @@ public static class Item extends PylonItem { ConfigAdapter.LIST.from(ConfigAdapter.FLUID_TEMPERATURE) ); - public Item(@NotNull ItemStack stack) { super(stack); } 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 62b5520f4..53eaf0f40 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,7 +1,6 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; import com.google.common.base.Preconditions; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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.PylonFluidBlock; @@ -17,6 +16,7 @@ import io.github.pylonmc.pylon.core.fluid.FluidPointType; import io.github.pylonmc.pylon.core.fluid.VirtualFluidPoint; import io.github.pylonmc.pylon.core.i18n.PylonArgument; +import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.PylonUtils; import net.kyori.adventure.text.Component; import org.bukkit.Material; @@ -24,6 +24,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Display; +import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.block.Action; @@ -41,7 +42,6 @@ public class FluidValve extends PylonBlock public static final NamespacedKey ENABLED_KEY = baseKey("enabled"); - private static final Material MAIN_MATERIAL = Material.WHITE_CONCRETE; private static final int BRIGHTNESS_OFF = 6; private static final int BRIGHTNESS_ON = 13; @@ -55,15 +55,18 @@ public FluidValve(@NotNull Block block, @NotNull BlockCreateContext context) { Player player = ((BlockCreateContext.PlayerPlace) context).getPlayer(); addEntity("east", FluidPointInteraction.make(context, FluidPointType.CONNECTOR, BlockFace.EAST, 0.25F)); addEntity("west", FluidPointInteraction.make(context, FluidPointType.CONNECTOR, BlockFace.WEST, 0.25F)); - addEntity("main", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(MAIN_MATERIAL) + addEntity("main", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.WHITE_CONCRETE) + .addCustomModelDataString(getKey() + ":main") + .build() + ) .brightness(BRIGHTNESS_OFF) .transformation(new TransformBuilder() .lookAlong(PylonUtils.rotateToPlayerFacing(player, BlockFace.EAST, false).getDirection().toVector3d()) .scale(0.25, 0.25, 0.5) ) .build(getBlock().getLocation().toCenterLocation()) - )); + ); enabled = false; } @@ -102,8 +105,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { enabled = !enabled; - getHeldEntityOrThrow(SimpleItemDisplay.class, "main") - .getEntity() + getHeldEntityOrThrow(ItemDisplay.class, "main") .setBrightness(new Display.Brightness(0, enabled ? BRIGHTNESS_ON : BRIGHTNESS_OFF)); if (enabled) { @@ -122,12 +124,10 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } private @NotNull VirtualFluidPoint getEastPoint() { - //noinspection DataFlowIssue - return getHeldEntity(FluidPointInteraction.class, "east").getPoint(); + return getHeldPylonEntityOrThrow(FluidPointInteraction.class, "east").getPoint(); } private @NotNull VirtualFluidPoint getWestPoint() { - //noinspection DataFlowIssue - return getHeldEntity(FluidPointInteraction.class, "west").getPoint(); + return getHeldPylonEntityOrThrow(FluidPointInteraction.class, "west").getPoint(); } } 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 a5aa2f644..34f926e80 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 @@ -1,6 +1,5 @@ package io.github.pylonmc.pylon.base.content.machines.fluid; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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.PylonFluidBlock; @@ -13,6 +12,7 @@ import io.github.pylonmc.pylon.core.fluid.PylonFluid; 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 org.bukkit.Material; import org.bukkit.block.Block; @@ -50,13 +50,16 @@ public Item(@NotNull ItemStack stack) { public FluidVoider(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.UP, (float) (mainDisplaySize / 2.0))); - addEntity("main", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(mainMaterial) + addEntity("main", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(mainMaterial) + .addCustomModelDataString(getKey() + ":main") + .build() + ) .transformation(new TransformBuilder() .scale(mainDisplaySize) ) .build(getBlock().getLocation().toCenterLocation()) - )); + ); } @SuppressWarnings("unused") 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 f5d0865ff..336d7a5f2 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,7 +2,6 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.PylonBase; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -32,6 +31,7 @@ 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.event.Event; import org.bukkit.event.player.PlayerInteractEvent; @@ -119,9 +119,9 @@ public void setAmount(double amount) { @SuppressWarnings("unused") public PortableFluidTank(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - addEntity("fluid", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("fluid", new ItemDisplayBuilder() .build(getBlock().getLocation().toCenterLocation()) - )); + ); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.UP)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.DOWN)); setCapacity(capacity); @@ -141,14 +141,14 @@ public boolean isAllowedFluid(@NotNull PylonFluid fluid) { @Override public void setFluidType(@Nullable PylonFluid fluid) { PylonFluidTank.super.setFluidType(fluid); - getFluidDisplay().getEntity().setItemStack(fluid == null ? null : new ItemStack(fluid.getMaterial())); + getFluidDisplay().setItemStack(fluid == null ? null : fluid.getItem()); } @Override public boolean setFluid(double amount) { boolean result = PylonFluidTank.super.setFluid(amount); float scale = (float) (0.9F * getFluidAmount() / capacity); - getFluidDisplay().getEntity().setTransformationMatrix(new TransformBuilder() + getFluidDisplay().setTransformationMatrix(new TransformBuilder() .translate(0.0, -0.45 + scale / 2, 0.0) .scale(0.9, scale, 0.9) .buildForItemDisplay() @@ -156,8 +156,8 @@ public boolean setFluid(double amount) { return result; } - public @NotNull SimpleItemDisplay getFluidDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "fluid"); + public @NotNull ItemDisplay getFluidDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "fluid"); } @Override diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java b/src/main/java/io/github/pylonmc/pylon/base/content/machines/fluid/gui/FluidSelector.java index c2053a602..c00d0dae0 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 @@ -11,6 +11,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import xyz.xenondevs.invui.gui.Gui; import xyz.xenondevs.invui.item.ItemProvider; @@ -63,7 +64,7 @@ public CurrentItem(@NotNull Supplier getFluid) { @Override public @NotNull ItemProvider getItemProvider() { PylonFluid fluid = getFluid.get(); - return ItemStackBuilder.of(fluid == null ? Material.BARRIER : fluid.getMaterial()) + return ItemStackBuilder.of(fluid == null ? new ItemStack(Material.BARRIER) : fluid.getItem()) .name(Component.translatable( "pylon.pylonbase.message.fluid_selector.current_fluid", PylonArgument.of( @@ -98,7 +99,7 @@ public ItemProvider getItemProvider() { return ItemStackBuilder.of(Material.BARRIER) .name(Component.translatable("pylon.pylonbase.message.fluid_selector.clear")); } - return ItemStackBuilder.of(itemFluid.getMaterial()) + return ItemStackBuilder.of(itemFluid.getItem()) .name(Component.translatable("pylon.pylonbase.fluid." + itemFluid.getKey().getKey())); } 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 64f5d0c9d..115dc3e8f 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 @@ -1,7 +1,6 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -13,6 +12,7 @@ import io.github.pylonmc.pylon.core.util.position.ChunkPosition; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.ItemDisplay; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -56,7 +56,7 @@ public boolean setFluid(@NotNull PylonFluid fluid, double amount) { if (scale < 1.0e-9) { scale = 0.0F; } - getFluidDisplay().getEntity().setTransformationMatrix(new TransformBuilder() + getFluidDisplay().setTransformationMatrix(new TransformBuilder() .translate(0.0, -0.45 + scale / 2, 0.0) .scale(0.9, scale, 0.9) .buildForItemDisplay() @@ -64,7 +64,7 @@ public boolean setFluid(@NotNull PylonFluid fluid, double amount) { return result; } - public @NotNull SimpleItemDisplay getFluidDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "fluid"); + public @NotNull ItemDisplay getFluidDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "fluid"); } } 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 ec7c6bbe8..3b1575086 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,7 +2,6 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -28,11 +27,11 @@ public HydraulicCoreDrillInputHatch(@NotNull Block block, @NotNull BlockCreateCo true, false ); - addEntity("fluid", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(BaseFluids.HYDRAULIC_FLUID.getMaterial()) + addEntity("fluid", new ItemDisplayBuilder() + .itemStack(BaseFluids.HYDRAULIC_FLUID.getItem()) .transformation(new TransformBuilder().scale(0)) .build(getBlock().getLocation().toCenterLocation().add(0, 1, 0)) - )); + ); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); } 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 a7814dce8..6e290ae0b 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,7 +2,6 @@ import io.github.pylonmc.pylon.base.BaseFluids; import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -28,11 +27,11 @@ public HydraulicCoreDrillOutputHatch(@NotNull Block block, @NotNull BlockCreateC false, true ); - addEntity("fluid", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(BaseFluids.DIRTY_HYDRAULIC_FLUID.getMaterial()) + addEntity("fluid", new ItemDisplayBuilder() + .itemStack(BaseFluids.DIRTY_HYDRAULIC_FLUID.getItem()) .transformation(new TransformBuilder().scale(0)) .build(getBlock().getLocation().toCenterLocation().add(0, 1, 0)) - )); + ); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.NORTH)); } 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 706ee995a..2ad5c27ee 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 @@ -5,7 +5,7 @@ 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.entities.SimpleItemDisplay; +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; @@ -23,6 +23,7 @@ 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.PylonUtils; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import lombok.Getter; @@ -32,6 +33,7 @@ import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.ItemDisplay; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; @@ -56,6 +58,10 @@ public class HydraulicHammerHead extends PylonBlock public static final double DIRTY_HYDRAULIC_FLUID_MB_PER_CRAFT = settings.getOrThrow("dirty-hydraulic-fluid-mb-per-craft", ConfigAdapter.INT); public static final int TICK_INTERVAL = settings.getOrThrow("tick-interval", ConfigAdapter.INT); + private final ItemStack emptyHammerTipStack = ItemStackBuilder.of(Material.AIR) + .addCustomModelDataString(getKey() + ":hammer_tip:empty") + .build(); + public static class Item extends PylonItem { public Item(@NotNull ItemStack stack) { @@ -84,16 +90,18 @@ public HydraulicHammerHead(@NotNull Block block, @NotNull BlockCreateContext con addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); - addEntity("hammer_head", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.GRAY_CONCRETE) + addEntity("hammer_head", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":hammer_head") + ) .transformation(getHeadTransformation(0.7)) .build(getBlock().getLocation().toCenterLocation().add(0, -1, 0)) - )); - addEntity("hammer_tip", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.AIR) + ); + addEntity("hammer_tip", new ItemDisplayBuilder() + .itemStack(emptyHammerTipStack) .transformation(getTipTransformation(-0.3)) .build(getBlock().getLocation().toCenterLocation().add(0, -1, 0)) - )); + ); createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_MB_PER_CRAFT * 2, true, false); createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, DIRTY_HYDRAULIC_FLUID_MB_PER_CRAFT * 2, false, true); @@ -129,7 +137,12 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } } - getHammerTip().getEntity().setItemStack(new ItemStack(hammer == null ? Material.AIR : hammer.baseBlock)); + getHammerTip().setItemStack(hammer == null + ? emptyHammerTipStack + : ItemStackBuilder.of(hammer.baseBlock) + .addCustomModelDataString(getKey() + ":hammer_tip:" + hammer.getKey().key()) + .build() + ); } @Override @@ -148,7 +161,12 @@ public void tick(double deltaSeconds) { if (hammer.getStack().getAmount() == 0) { this.hammer = null; - getHammerTip().getEntity().setItemStack(new ItemStack(hammer == null ? Material.AIR : hammer.baseBlock)); + getHammerTip().setItemStack(hammer == null + ? emptyHammerTipStack + : ItemStackBuilder.of(hammer.baseBlock) + .addCustomModelDataString(getKey() + ":hammer_tip:" + hammer.getKey().key()) + .build() + ); } if (fluidAmount(BaseFluids.HYDRAULIC_FLUID) < HYDRAULIC_FLUID_MB_PER_CRAFT @@ -161,11 +179,13 @@ public void tick(double deltaSeconds) { removeFluid(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_MB_PER_CRAFT); addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, DIRTY_HYDRAULIC_FLUID_MB_PER_CRAFT); - getHammerHead().setTransform(GO_DOWN_TIME_TICKS, getHeadTransformation(-0.7)); - getHammerTip().setTransform(GO_DOWN_TIME_TICKS, getTipTransformation(-1.7)); + BaseUtils.animate(getHammerHead(), GO_DOWN_TIME_TICKS, getHeadTransformation(-0.7)); + BaseUtils.animate(getHammerTip(), GO_DOWN_TIME_TICKS, getTipTransformation(-1.7)); + Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - getHammerHead().setTransform(hammer.cooldownTicks - GO_DOWN_TIME_TICKS, getHeadTransformation(0.7)); - getHammerTip().setTransform(hammer.cooldownTicks - GO_DOWN_TIME_TICKS, getTipTransformation(0.3)); + BaseUtils.animate(getHammerHead(), hammer.cooldownTicks - GO_DOWN_TIME_TICKS, getHeadTransformation(0.7)); + BaseUtils.animate(getHammerTip(), hammer.cooldownTicks - GO_DOWN_TIME_TICKS, getHeadTransformation(0.7)); + new ParticleBuilder(Particle.BLOCK) .data(baseBlock.getBlockData()) .count(20) @@ -184,12 +204,12 @@ public void postBreak() { } } - public @NotNull SimpleItemDisplay getHammerHead() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "hammer_head"); + public @NotNull ItemDisplay getHammerHead() { + return getHeldEntityOrThrow(ItemDisplay.class, "hammer_head"); } - public @NotNull SimpleItemDisplay getHammerTip() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "hammer_tip"); + public @NotNull ItemDisplay getHammerTip() { + return getHeldEntityOrThrow(ItemDisplay.class, "hammer_tip"); } public static @NotNull Matrix4f getHeadTransformation(double translationY) { 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 5ec6d3b5e..e912fd917 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 @@ -5,7 +5,7 @@ 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.entities.SimpleItemDisplay; +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; @@ -23,6 +23,7 @@ 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.github.pylonmc.pylon.core.util.position.ChunkPosition; import lombok.Getter; @@ -31,6 +32,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.ItemDisplay; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -83,11 +85,13 @@ public HydraulicMixingAttachment(@NotNull Block block, @NotNull BlockCreateConte addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); - addEntity("mixing_attachment_shaft", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.LIGHT_GRAY_CONCRETE) + addEntity("mixing_attachment_shaft", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.LIGHT_GRAY_CONCRETE) + .addCustomModelDataString(getKey() + ":mixing_attachment_shaft") + ) .transformation(getShaftTransformation(0.7)) .build(getBlock().getLocation().toCenterLocation().add(0, -1, 0)) - )); + ); createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_MB_PER_CRAFT * 2, true, false); createFluidBuffer(BaseFluids.DIRTY_HYDRAULIC_FLUID, DIRTY_HYDRAULIC_FLUID_MB_PER_CRAFT * 2, false, true); @@ -147,9 +151,9 @@ public void tick(double deltaSeconds) { cooldownTimeRemaining = COOLDOWN_TICKS / 20.0; - getMotorShaft().setTransform(DOWN_ANIMATION_TIME_TICKS, getShaftTransformation(0.2)); + BaseUtils.animate(getMixingAttachmentShaft(), DOWN_ANIMATION_TIME_TICKS, getShaftTransformation(0.2)); Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), - () -> getMotorShaft().setTransform(UP_ANIMATION_TIME_TICKS, getShaftTransformation(0.7)), + () -> BaseUtils.animate(getMixingAttachmentShaft(), UP_ANIMATION_TIME_TICKS, getShaftTransformation(0.7)), DOWN_ANIMATION_TIME_TICKS ); } @@ -161,7 +165,7 @@ public void tick(double deltaSeconds) { .buildForItemDisplay(); } - public @NotNull SimpleItemDisplay getMotorShaft() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "mixing_attachment_shaft"); + public @NotNull ItemDisplay getMixingAttachmentShaft() { + return getHeldEntityOrThrow(ItemDisplay.class, "mixing_attachment_shaft"); } } 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 c6f4de45d..29731c574 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 @@ -3,7 +3,6 @@ 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.entities.SimpleItemDisplay; import io.github.pylonmc.pylon.base.recipes.PipeBendingRecipe; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; @@ -71,12 +70,12 @@ public HydraulicPipeBender(@NotNull Block block, @NotNull BlockCreateContext con setTickInterval(TICK_INTERVAL); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); - addEntity("item", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("item", new ItemDisplayBuilder() .transformation(new TransformBuilder() .lookAlong(new Vector3d(0.0, 1.0, 0.0)) .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, DIRTY_HYDRAULIC_FLUID_BUFFER, false, true); recipe = null; @@ -101,7 +100,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { recipe = null; - ItemDisplay itemDisplay = getItemDisplay().getEntity(); + ItemDisplay itemDisplay = getItemDisplay(); ItemStack oldStack = itemDisplay.getItemStack(); ItemStack newStack = event.getItem(); @@ -125,7 +124,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { @Override public void tick(double deltaSeconds) { - ItemStack stack = getItemDisplay().getEntity().getItemStack(); + ItemStack stack = getItemDisplay().getItemStack(); if (recipe != null) { spawnParticles(); @@ -135,7 +134,7 @@ public void tick(double deltaSeconds) { return; } - getItemDisplay().getEntity().setItemStack(stack.subtract(recipe.input().getAmount())); + getItemDisplay().setItemStack(stack.subtract(recipe.input().getAmount())); getBlock().getWorld().dropItemNaturally( getBlock().getLocation().toCenterLocation().add(0, 0.75, 0), recipe.result() @@ -162,8 +161,8 @@ public void tick(double deltaSeconds) { } } - public SimpleItemDisplay getItemDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "item"); + public ItemDisplay getItemDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "item"); } public void spawnParticles() { @@ -176,6 +175,6 @@ public void spawnParticles() { @Override public void onBreak(@NotNull List drops, @NotNull BlockBreakContext context) { - drops.add(getItemDisplay().getEntity().getItemStack()); + drops.add(getItemDisplay().getItemStack()); } } 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 90e7bc2f7..09a12c820 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 @@ -5,7 +5,7 @@ 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.entities.SimpleItemDisplay; +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; @@ -22,12 +22,14 @@ 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.github.pylonmc.pylon.core.util.position.ChunkPosition; 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.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -64,11 +66,13 @@ public Item(@NotNull ItemStack stack) { public HydraulicPressPiston(@NotNull Block block, @NotNull BlockCreateContext context) { super(block, context); setTickInterval(TICK_INTERVAL); - addEntity("press_piston_shaft", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.SPRUCE_LOG) + addEntity("press_piston_shaft", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.SPRUCE_LOG) + .addCustomModelDataString(getKey() + ":press_piston_shaft") + ) .transformation(getTransformation(0.0)) .build(getBlock().getLocation().toCenterLocation().add(0, -1, 0)) - )); + ); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); createFluidBuffer(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_MB_PER_CRAFT * 2, true, false); @@ -113,13 +117,14 @@ public void tick(double deltaSeconds) { removeFluid(BaseFluids.HYDRAULIC_FLUID, HYDRAULIC_FLUID_MB_PER_CRAFT); addFluid(BaseFluids.DIRTY_HYDRAULIC_FLUID, DIRTY_HYDRAULIC_FLUID_MB_PER_CRAFT); - getPistonShaft().setTransform( + BaseUtils.animate( + getPistonShaft(), Press.TIME_PER_ITEM_TICKS - Press.RETURN_TO_START_TIME_TICKS, getTransformation(-0.3) ); Bukkit.getScheduler().runTaskLater( PylonBase.getInstance(), - () -> getPistonShaft().setTransform(Press.RETURN_TO_START_TIME_TICKS, getTransformation(0.0)), + () -> BaseUtils.animate(getPistonShaft(), Press.RETURN_TO_START_TIME_TICKS, getTransformation(0.0)), Press.TIME_PER_ITEM_TICKS - Press.RETURN_TO_START_TIME_TICKS ); } @@ -131,7 +136,7 @@ public void tick(double deltaSeconds) { .buildForItemDisplay(); } - public @NotNull SimpleItemDisplay getPistonShaft() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "press_piston_shaft"); + public @NotNull ItemDisplay getPistonShaft() { + return getHeldEntityOrThrow(ItemDisplay.class, "press_piston_shaft"); } } 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 237dc29e8..e770abf5b 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 @@ -1,7 +1,6 @@ package io.github.pylonmc.pylon.base.content.machines.hydraulics; import io.github.pylonmc.pylon.base.BaseFluids; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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; @@ -17,6 +16,7 @@ import io.github.pylonmc.pylon.core.fluid.PylonFluid; 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 net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Material; @@ -44,21 +44,23 @@ public HydraulicRefuelingStation(@NotNull Block block, @NotNull BlockCreateConte addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); - addEntity("casing", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.ORANGE_STAINED_GLASS) + addEntity("casing", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.ORANGE_STAINED_GLASS) + .addCustomModelDataString(getKey() + ":casing") + ) .transformation(new TransformBuilder() .translate(0, 0.1, 0) .scale(0.7) ) .build(getBlock().getLocation().toCenterLocation()) - )); - addEntity("item", new SimpleItemDisplay(new ItemDisplayBuilder() + ); + addEntity("item", new ItemDisplayBuilder() .transformation(new TransformBuilder() .translate(0, 0.25, 0) .scale(0.4) ) .build(getBlock().getLocation().toCenterLocation()) - )); + ); } @SuppressWarnings("unused") @@ -72,7 +74,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { return; } - ItemDisplay itemDisplay = getHeldEntityOrThrow(SimpleItemDisplay.class, "item").getEntity(); + ItemDisplay itemDisplay = getHeldEntityOrThrow(ItemDisplay.class, "item"); ItemStack toInsert = event.getPlayer().getInventory().getItem(EquipmentSlot.HAND); if (!itemDisplay.getItemStack().isEmpty()) { @@ -90,9 +92,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { } public @Nullable HydraulicRefuelable getHeldRefuelableItem() { - ItemStack stack = getHeldEntityOrThrow(SimpleItemDisplay.class, "item") - .getEntity() - .getItemStack(); + ItemStack stack = getHeldEntityOrThrow(ItemDisplay.class, "item").getItemStack(); if (PylonItem.fromStack(stack) instanceof HydraulicRefuelable refuelable) { return refuelable; } @@ -160,7 +160,7 @@ public void onFluidAdded(@NotNull PylonFluid fluid, double amount) { // Itemdisplay's item has to be set again after it's been edited for some unknown reason ItemStack stack = ((PylonItem) refuelable).getStack(); - getHeldEntityOrThrow(SimpleItemDisplay.class, "item").getEntity().setItemStack(stack); + getHeldEntityOrThrow(ItemDisplay.class, "item").setItemStack(stack); } @Override @@ -170,12 +170,12 @@ public void onFluidRemoved(@NotNull PylonFluid fluid, double amount) { // Itemdisplay's item has to be set again after it's been edited for some unknown reason ItemStack stack = ((PylonItem) refuelable).getStack(); - getHeldEntityOrThrow(SimpleItemDisplay.class, "item").getEntity().setItemStack(stack); + getHeldEntityOrThrow(ItemDisplay.class, "item").setItemStack(stack); } @Override public void onBreak(@NotNull List<@NotNull ItemStack> drops, @NotNull BlockBreakContext context) { - ItemStack stack = getHeldEntityOrThrow(SimpleItemDisplay.class, "item").getEntity().getItemStack(); + ItemStack stack = getHeldEntityOrThrow(ItemDisplay.class, "item").getItemStack(); if (!stack.isEmpty()) { drops.add(stack); } 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 087aa9b74..fc46080d5 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 @@ -3,8 +3,6 @@ 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.entities.SimpleBlockDisplay; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; import io.github.pylonmc.pylon.base.recipes.TableSawRecipe; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonEntityHolderBlock; @@ -75,17 +73,17 @@ public HydraulicTableSaw(@NotNull Block block, @NotNull BlockCreateContext conte setTickInterval(TICK_INTERVAL); addEntity("input", FluidPointInteraction.make(context, FluidPointType.INPUT, BlockFace.NORTH)); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.SOUTH)); - addEntity("item", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("item", new ItemDisplayBuilder() .transformation(new TransformBuilder() .scale(0.3)) .build(block.getLocation().toCenterLocation().add(0, 0.65, 0)) - )); - addEntity("saw", new SimpleBlockDisplay(new BlockDisplayBuilder() + ); + addEntity("saw", new BlockDisplayBuilder() .blockData(Material.IRON_BARS.createBlockData("[east=true,west=true]")) .transformation(new TransformBuilder() .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, DIRTY_HYDRAULIC_FLUID_BUFFER, false, true); recipe = null; @@ -110,7 +108,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { recipe = null; - ItemDisplay itemDisplay = getItemDisplay().getEntity(); + ItemDisplay itemDisplay = getItemDisplay(); ItemStack oldStack = itemDisplay.getItemStack(); ItemStack newStack = event.getItem(); @@ -134,7 +132,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { @Override public void tick(double deltaSeconds) { - ItemStack stack = getItemDisplay().getEntity().getItemStack(); + ItemStack stack = getItemDisplay().getItemStack(); if (recipe != null) { spawnParticles(); @@ -144,7 +142,7 @@ public void tick(double deltaSeconds) { return; } - getItemDisplay().getEntity().setItemStack(stack.subtract(recipe.input().getAmount())); + getItemDisplay().setItemStack(stack.subtract(recipe.input().getAmount())); getBlock().getWorld().dropItemNaturally( getBlock().getLocation().toCenterLocation().add(0, 0.75, 0), recipe.result() @@ -174,8 +172,8 @@ public void tick(double deltaSeconds) { } } - public SimpleItemDisplay getItemDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "item"); + public ItemDisplay getItemDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "item"); } public void spawnParticles() { @@ -188,6 +186,6 @@ public void spawnParticles() { @Override public void onBreak(@NotNull List drops, @NotNull BlockBreakContext context) { - drops.add(getItemDisplay().getEntity().getItemStack()); + drops.add(getItemDisplay().getItemStack()); } } 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 f486629d0..2f1450e17 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 @@ -2,7 +2,7 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.PylonBase; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; +import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.core.block.PylonBlock; import io.github.pylonmc.pylon.core.block.base.PylonSimpleMultiblock; import io.github.pylonmc.pylon.core.block.context.BlockCreateContext; @@ -12,6 +12,7 @@ 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; import io.github.pylonmc.pylon.core.util.gui.unit.UnitFormat; import lombok.Getter; import org.bukkit.Bukkit; @@ -19,6 +20,7 @@ import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.ItemDisplay; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; import org.jetbrains.annotations.NotNull; @@ -61,12 +63,15 @@ public CoreDrill(@NotNull Block block, @NotNull BlockCreateContext context) { } else { setFacing(BlockFace.NORTH); } - addEntity("drill", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(drillMaterial) + addEntity("drill", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(drillMaterial) + .addCustomModelDataString(getKey() + ":drill") + .build() + ) .transformation(new TransformBuilder() .scale(0.3, 2.1, 0.3)) .build(getBlock().getLocation().toCenterLocation().subtract(0, 1.5, 0)) - )); + ); cycling = false; } @@ -76,8 +81,8 @@ public CoreDrill(@NotNull Block block, @NotNull PersistentDataContainer pdc) { cycling = false; } - public SimpleItemDisplay getDrillDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "drill"); + public ItemDisplay getDrillDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "drill"); } public static @NotNull Matrix4f getDrillDisplayMatrix(double rotation) { @@ -98,9 +103,7 @@ public void cycle() { for (int j = 0; j < 4; j++) { double rotation = (j / 4.0) * 2.0 * Math.PI; Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - getDrillDisplay().setTransform( - rotationDuration / 4, getDrillDisplayMatrix(rotation) - ); + BaseUtils.animate(getDrillDisplay(), rotationDuration / 4, getDrillDisplayMatrix(rotation)); new ParticleBuilder(Particle.BLOCK) .count(5) .data(getBlock().getRelative(BlockFace.DOWN, 3).getBlockData()) 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 9ead23cb4..814d4924a 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 @@ -3,8 +3,8 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.PylonBase; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; 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.PylonInteractBlock; import io.github.pylonmc.pylon.core.block.base.PylonSimpleMultiblock; @@ -16,6 +16,7 @@ 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 lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -35,13 +36,10 @@ import java.util.List; import java.util.Map; -import java.util.Random; public class Grindstone extends PylonBlock implements PylonSimpleMultiblock, PylonInteractBlock { - private static final Random random = new Random(); - public static final int CYCLE_DURATION_TICKS = Settings.get(BaseKeys.GRINDSTONE) .getOrThrow("cycle-duration-ticks", ConfigAdapter.INT); @@ -50,19 +48,21 @@ public class Grindstone extends PylonBlock implements PylonSimpleMultiblock, Pyl @SuppressWarnings("unused") public Grindstone(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - addEntity("item", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("item", new ItemDisplayBuilder() .transformation(new TransformBuilder() .scale(0.3) .translate(0, 0.15, 0) .rotate(Math.PI / 2, 0, 0)) .build(getBlock().getLocation().toCenterLocation()) - )); - addEntity("block", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.SMOOTH_STONE_SLAB) + ); + addEntity("block", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.SMOOTH_STONE_SLAB) + .addCustomModelDataString(getKey() + ":block") + ) .transformation(new TransformBuilder() .translate(0, 0.8, 0)) .build(getBlock().getLocation().toCenterLocation()) - )); + ); recipeInProgress = false; } @@ -92,7 +92,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { return; } - ItemDisplay itemDisplay = getItemDisplay().getEntity(); + ItemDisplay itemDisplay = getItemDisplay(); ItemStack oldStack = itemDisplay.getItemStack(); ItemStack newStack = event.getItem(); @@ -114,7 +114,7 @@ public void onInteract(@NotNull PlayerInteractEvent event) { @Override public void onBreak(@NotNull List drops, @NotNull BlockBreakContext context) { PylonSimpleMultiblock.super.onBreak(drops, context); - drops.add(getItemDisplay().getEntity().getItemStack()); + drops.add(getItemDisplay().getItemStack()); } public @Nullable GrindstoneRecipe getNextRecipe() { @@ -122,7 +122,7 @@ public void onBreak(@NotNull List drops, @NotNull BlockBreakContext c return null; } - ItemStack input = getItemDisplay().getEntity().getItemStack(); + ItemStack input = getItemDisplay().getItemStack(); if (input.getType().isAir()) { return null; } @@ -139,12 +139,12 @@ public boolean tryStartRecipe(@NotNull GrindstoneRecipe nextRecipe, @Nullable Pl return false; } - ItemStack input = getItemDisplay().getEntity().getItemStack(); + ItemStack input = getItemDisplay().getItemStack(); if (input.getType().isAir()) { return false; } - getItemDisplay().getEntity().setItemStack(input.subtract(nextRecipe.input().getAmount())); + getItemDisplay().setItemStack(input.subtract(nextRecipe.input().getAmount())); recipeInProgress = true; @@ -154,9 +154,7 @@ public boolean tryStartRecipe(@NotNull GrindstoneRecipe nextRecipe, @Nullable Pl double translation = isLast ? 0.8 : 0.5; double rotation = (j / 4.0) * 2.0 * Math.PI; Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - getStoneDisplay().setTransform( - CYCLE_DURATION_TICKS / 4, getStoneDisplayMatrix(translation, rotation) - ); + BaseUtils.animate(getStoneDisplay(), CYCLE_DURATION_TICKS / 4, getStoneDisplayMatrix(translation, rotation)); new ParticleBuilder(Particle.BLOCK) .data(nextRecipe.particleBlockData()) .count(10) @@ -184,12 +182,12 @@ public boolean tryStartRecipe(@NotNull GrindstoneRecipe nextRecipe, @Nullable Pl return true; } - public SimpleItemDisplay getItemDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "item"); + public ItemDisplay getItemDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "item"); } - public SimpleItemDisplay getStoneDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "block"); + public ItemDisplay getStoneDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "block"); } public static @NotNull Matrix4f getStoneDisplayMatrix(double translation, double rotation) { 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 5b8199dd6..70968d6c9 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 @@ -3,7 +3,6 @@ import com.destroystokyo.paper.ParticleBuilder; import io.github.pylonmc.pylon.base.BaseKeys; import io.github.pylonmc.pylon.base.content.building.Pedestal; -import io.github.pylonmc.pylon.base.entities.SimpleItemDisplay; import io.github.pylonmc.pylon.base.recipes.MagicAltarRecipe; import io.github.pylonmc.pylon.core.block.BlockStorage; import io.github.pylonmc.pylon.core.block.PylonBlock; @@ -57,14 +56,14 @@ public MagicAltar(Block block, BlockCreateContext context) { setTickInterval(tickInterval); - addEntity("item", new SimpleItemDisplay(new ItemDisplayBuilder() + addEntity("item", new ItemDisplayBuilder() .transformation(new TransformBuilder() .translate(0, 0.5, 0) .scale(0.5) .buildForItemDisplay() ) .build(getBlock().getLocation().toCenterLocation()) - )); + ); } @SuppressWarnings({"unused", "DataFlowIssue"}) @@ -108,7 +107,7 @@ public void onInteract(PlayerInteractEvent event) { event.setCancelled(true); - ItemDisplay itemDisplay = getItemDisplay().getEntity(); + ItemDisplay itemDisplay = getItemDisplay(); // drop item if not processing and an item is already on the altar ItemStack displayItem = itemDisplay.getItemStack(); @@ -179,8 +178,8 @@ public List getPedestals() { return MagicAltarRecipe.RECIPE_TYPE.getRecipe(processingRecipe); } - public SimpleItemDisplay getItemDisplay() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "item"); + public ItemDisplay getItemDisplay() { + return getHeldEntityOrThrow(ItemDisplay.class, "item"); } public void startRecipe(MagicAltarRecipe recipe) { @@ -234,7 +233,7 @@ public void tickRecipe(double deltaSeconds) { } public void finishRecipe() { - ItemDisplay itemDisplay = getItemDisplay().getEntity(); + ItemDisplay itemDisplay = getItemDisplay(); for (Pedestal pedestal : getPedestals()) { pedestal.getItemDisplay().setItemStack(null); 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 26a15dfaf..f02820cfd 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 @@ -3,8 +3,8 @@ 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.entities.SimpleItemDisplay; 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.PylonEntityHolderBlock; import io.github.pylonmc.pylon.core.block.base.PylonFluidBufferBlock; @@ -22,6 +22,7 @@ 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 lombok.Getter; import org.bukkit.Bukkit; @@ -29,6 +30,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Item; +import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; @@ -70,17 +72,18 @@ public PressItem(@NotNull ItemStack stack) { public Press(@NotNull Block block, @NotNull BlockCreateContext context) { super(block); - addEntity("press_cover", new SimpleItemDisplay(new ItemDisplayBuilder() - .material(Material.SPRUCE_PLANKS) + addEntity("press_cover", new ItemDisplayBuilder() + .itemStack(ItemStackBuilder.of(Material.SPRUCE_PLANKS) + .addCustomModelDataString(getKey() + ":press_cover")) .transformation(getCoverTransform(0.4)) .build(getBlock().getLocation().toCenterLocation()) - )); + ); addEntity("output", FluidPointInteraction.make(context, FluidPointType.OUTPUT, BlockFace.NORTH)); createFluidBuffer(BaseFluids.PLANT_OIL, CAPACITY_MB, false, true); } - @SuppressWarnings({"unused", "DataFlowIssue"}) + @SuppressWarnings("unused") public Press(@NotNull Block block, @NotNull PersistentDataContainer pdc) { super(block); } @@ -149,10 +152,10 @@ public boolean tryStartRecipe(@Nullable Player player) { public void startRecipe(PressRecipe recipe) { this.currentRecipe = recipe; - getCover().setTransform(TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS, getCoverTransform(0.0)); + BaseUtils.animate(getCover(), TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS, getCoverTransform(0.0)); Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { - getCover().setTransform(RETURN_TO_START_TIME_TICKS, getCoverTransform(0.4)); + BaseUtils.animate(getCover(), RETURN_TO_START_TIME_TICKS, getCoverTransform(0.4)); Bukkit.getScheduler().runTaskLater(PylonBase.getInstance(), () -> { addFluid(BaseFluids.PLANT_OIL, recipe.oilAmount()); @@ -162,8 +165,8 @@ public void startRecipe(PressRecipe recipe) { }, TIME_PER_ITEM_TICKS - RETURN_TO_START_TIME_TICKS); } - public @NotNull SimpleItemDisplay getCover() { - return getHeldEntityOrThrow(SimpleItemDisplay.class, "press_cover"); + public @NotNull ItemDisplay getCover() { + return getHeldEntityOrThrow(ItemDisplay.class, "press_cover"); } public static @NotNull Matrix4f getCoverTransform(double translation) { 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 07e15b9c0..a53f534d3 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 @@ -2,8 +2,6 @@ import com.google.common.base.Preconditions; import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.base.PylonBase; -import io.github.pylonmc.pylon.base.entities.SimpleTextDisplay; import io.github.pylonmc.pylon.base.recipes.SmelteryRecipe; import io.github.pylonmc.pylon.base.util.BaseUtils; import io.github.pylonmc.pylon.base.util.HslColor; @@ -15,7 +13,6 @@ 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.transform.TransformUtil; -import io.github.pylonmc.pylon.core.event.PylonBlockUnloadEvent; import io.github.pylonmc.pylon.core.fluid.PylonFluid; import io.github.pylonmc.pylon.core.fluid.tags.FluidTemperature; import io.github.pylonmc.pylon.core.i18n.PylonArgument; @@ -29,10 +26,8 @@ import kotlin.Pair; import lombok.Getter; import lombok.Setter; -import lombok.extern.slf4j.Slf4j; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.Style; -import net.kyori.adventure.text.format.TextColor; import org.apache.commons.lang3.ArrayUtils; import org.bukkit.Location; import org.bukkit.Material; @@ -115,7 +110,7 @@ public SmelteryController(@NotNull Block block, @NotNull BlockCreateContext cont .scaleLocal(1f / RESOLUTION) ); display.setBrightness(new Display.Brightness(15, 15)); - addEntity("pixel_" + counter++, new SimpleTextDisplay(display)); + addEntity("pixel_" + counter++, display); } } @@ -303,8 +298,8 @@ public boolean checkFormed() { boolean formed = isFormed(); // set pixels invisible if multiblock not formed, and visible if multiblock formed - for (SimpleTextDisplay display : getPixels()) { - display.getEntity().text(Component.text(formed ? " " : "")); + for (TextDisplay display : getPixels()) { + display.text(Component.text(formed ? " " : "")); } return formed; @@ -443,7 +438,7 @@ public void heatAsymptotically(double dt, double target) { // // - private final List pixels = new ArrayList<>(); + private final List pixels = new ArrayList<>(); private static final int RESOLUTION = Settings.get(BaseKeys.SMELTERY_CONTROLLER).getOrThrow("display.resolution", ConfigAdapter.INT); private static final int PIXELS_PER_SIDE = 3 * RESOLUTION; @@ -457,10 +452,10 @@ public void heatAsymptotically(double dt, double target) { private double cumulativeSeconds = 0; - public @NotNull List getPixels() { + public @NotNull List getPixels() { if (pixels.isEmpty()) { for (int i = 0; i < PIXELS_PER_SIDE * PIXELS_PER_SIDE; i++) { - pixels.add(getHeldEntityOrThrow(SimpleTextDisplay.class, "pixel_" + i)); + pixels.add(getHeldEntityOrThrow(TextDisplay.class, "pixel_" + i)); } } return pixels; @@ -477,10 +472,9 @@ private void updateFluidDisplay() { } double finalHeight = center.getY() + height * fill - 0.01; - List pixels = getPixels(); + List pixels = getPixels(); for (int i = 0; i < pixels.size(); i++) { - SimpleTextDisplay pixel = pixels.get(i); - TextDisplay entity = pixel.getEntity(); + TextDisplay entity = pixels.get(i); if (!entity.isValid()) continue; int x = i % PIXELS_PER_SIDE; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/magic/FireproofRune.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/FireproofRune.java similarity index 97% rename from src/main/java/io/github/pylonmc/pylon/base/content/magic/FireproofRune.java rename to src/main/java/io/github/pylonmc/pylon/base/content/tools/FireproofRune.java index 38bed76f3..17917b7fb 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/magic/FireproofRune.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/FireproofRune.java @@ -1,7 +1,7 @@ -package io.github.pylonmc.pylon.base.content.magic; +package io.github.pylonmc.pylon.base.content.tools; import com.destroystokyo.paper.ParticleBuilder; -import io.github.pylonmc.pylon.base.content.magic.base.Rune; +import io.github.pylonmc.pylon.base.content.tools.base.Rune; import io.github.pylonmc.pylon.core.config.adapter.ConfigAdapter; import io.github.pylonmc.pylon.core.item.builder.ItemStackBuilder; import io.github.pylonmc.pylon.core.util.RandomizedSound; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/magic/base/Rune.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/base/Rune.java similarity index 97% rename from src/main/java/io/github/pylonmc/pylon/base/content/magic/base/Rune.java rename to src/main/java/io/github/pylonmc/pylon/base/content/tools/base/Rune.java index 8ce7d55d5..1b588e2af 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/magic/base/Rune.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/base/Rune.java @@ -1,4 +1,4 @@ -package io.github.pylonmc.pylon.base.content.magic.base; +package io.github.pylonmc.pylon.base.content.tools.base; import io.github.pylonmc.pylon.base.BaseConfig; import io.github.pylonmc.pylon.base.PylonBase; @@ -8,8 +8,6 @@ import io.github.pylonmc.pylon.core.item.base.PylonBucket; import io.github.pylonmc.pylon.core.item.base.PylonTool; import io.github.pylonmc.pylon.core.item.base.PylonWeapon; -import org.bukkit.FluidCollisionMode; -import org.bukkit.block.Block; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/src/main/java/io/github/pylonmc/pylon/base/content/magic/base/RuneApplicable.java b/src/main/java/io/github/pylonmc/pylon/base/content/tools/base/RuneApplicable.java similarity index 96% rename from src/main/java/io/github/pylonmc/pylon/base/content/magic/base/RuneApplicable.java rename to src/main/java/io/github/pylonmc/pylon/base/content/tools/base/RuneApplicable.java index 9a6a5e456..d06e2a617 100644 --- a/src/main/java/io/github/pylonmc/pylon/base/content/magic/base/RuneApplicable.java +++ b/src/main/java/io/github/pylonmc/pylon/base/content/tools/base/RuneApplicable.java @@ -1,4 +1,4 @@ -package io.github.pylonmc.pylon.base.content.magic.base; +package io.github.pylonmc.pylon.base.content.tools.base; import io.github.pylonmc.pylon.core.item.base.PylonArrow; import io.github.pylonmc.pylon.core.item.base.PylonBow; diff --git a/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleBlockDisplay.java b/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleBlockDisplay.java deleted file mode 100644 index c59a23816..000000000 --- a/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleBlockDisplay.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.pylonmc.pylon.base.entities; - -import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.core.entity.PylonEntity; -import org.bukkit.entity.BlockDisplay; -import org.jetbrains.annotations.NotNull; -import org.joml.Matrix4f; - - -public final class SimpleBlockDisplay extends PylonEntity { - - @SuppressWarnings("unused") - public SimpleBlockDisplay(@NotNull BlockDisplay entity) { - super(BaseKeys.SIMPLE_BLOCK_DISPLAY, entity); - } - - public void setTransform(int durationTicks, Matrix4f matrix) { - getEntity().setTransformationMatrix(matrix); - getEntity().setInterpolationDelay(0); - getEntity().setInterpolationDuration(durationTicks); - } -} diff --git a/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleItemDisplay.java b/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleItemDisplay.java deleted file mode 100644 index 7acda51f7..000000000 --- a/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleItemDisplay.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.pylonmc.pylon.base.entities; - -import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.core.entity.PylonEntity; -import org.bukkit.entity.ItemDisplay; -import org.jetbrains.annotations.NotNull; -import org.joml.Matrix4f; - - -public final class SimpleItemDisplay extends PylonEntity { - - @SuppressWarnings("unused") - public SimpleItemDisplay(@NotNull ItemDisplay entity) { - super(BaseKeys.SIMPLE_ITEM_DISPLAY, entity); - } - - public void setTransform(int durationTicks, Matrix4f matrix) { - getEntity().setTransformationMatrix(matrix); - getEntity().setInterpolationDelay(0); - getEntity().setInterpolationDuration(durationTicks); - } -} diff --git a/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleTextDisplay.java b/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleTextDisplay.java deleted file mode 100644 index caa296e8f..000000000 --- a/src/main/java/io/github/pylonmc/pylon/base/entities/SimpleTextDisplay.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.pylonmc.pylon.base.entities; - -import io.github.pylonmc.pylon.base.BaseKeys; -import io.github.pylonmc.pylon.core.entity.PylonEntity; -import org.bukkit.entity.TextDisplay; -import org.jetbrains.annotations.NotNull; - - -public final class SimpleTextDisplay extends PylonEntity { - - @SuppressWarnings("unused") - public SimpleTextDisplay(@NotNull TextDisplay entity) { - super(BaseKeys.SIMPLE_TEXT_DISPLAY, entity); - } -} 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 1574e4df8..47df3567d 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 @@ -10,6 +10,7 @@ import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.NamespacedKey; +import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.TextDisplay; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; @@ -96,4 +97,14 @@ private int clampAndRound(double value) { PylonArgument.of("capacity", UnitFormat.MILLIBUCKETS.format(Math.round(capacity))) ); } + + public void animate(ItemDisplay display, int delay, int duration, Matrix4f matrix) { + display.setInterpolationDelay(delay); + display.setInterpolationDuration(duration); + display.setTransformationMatrix(matrix); + } + + public void animate(ItemDisplay display, int duration, Matrix4f matrix) { + animate(display, 0, duration, matrix); + } }