From 5cedb788cc3cf8dc2cfb566d304d4e2cf29f09ea Mon Sep 17 00:00:00 2001 From: PTOM76 <58260965+PTOM76@users.noreply.github.com> Date: Fri, 20 Sep 2024 20:45:29 +0900 Subject: [PATCH] emc transportation on importer/exporter --- .../pitan76/itemalchemy/data/ServerState.java | 2 + .../itemalchemy/tile/EMCExporterTile.java | 37 +++++++++++++++++-- .../itemalchemy/tile/EMCImporterTile.java | 32 +++++++++++++++- .../tile/base/OwnedBlockEntity.java | 5 ++- 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/pitan76/itemalchemy/data/ServerState.java b/src/main/java/net/pitan76/itemalchemy/data/ServerState.java index 6721b16..882b16a 100644 --- a/src/main/java/net/pitan76/itemalchemy/data/ServerState.java +++ b/src/main/java/net/pitan76/itemalchemy/data/ServerState.java @@ -118,6 +118,8 @@ public static ServerState getServerState(MinecraftServer server) { } public static ServerState of(MinecraftServer server) { + if (server == null) return null; + return getServerState(server); } diff --git a/src/main/java/net/pitan76/itemalchemy/tile/EMCExporterTile.java b/src/main/java/net/pitan76/itemalchemy/tile/EMCExporterTile.java index 70f1b1a..1c6c225 100644 --- a/src/main/java/net/pitan76/itemalchemy/tile/EMCExporterTile.java +++ b/src/main/java/net/pitan76/itemalchemy/tile/EMCExporterTile.java @@ -29,9 +29,13 @@ public class EMCExporterTile extends OwnedBlockEntity implements ExtendBlockEntityTicker, SidedInventory, IInventory, ExtendedScreenHandlerFactory { + public static int MAX_STACK_COUNT = 4096; + public DefaultedList filter = DefaultedList.ofSize(9, ItemStackUtil.empty()); public String ownerName = ""; + public long oldStoredEMC = -1; + public EMCExporterTile(BlockEntityType type, TileCreateEvent e) { super(type, e); } @@ -40,10 +44,10 @@ public EMCExporterTile(TileCreateEvent e) { this(Tiles.EMC_EXPORTER.getOrNull(), e); } - public static int maxStackCount = 4096; - @Override public void writeNbt(WriteNbtArgs args) { + super.writeNbt(args); + NbtCompound filterNbt = NbtUtil.create(); InventoryUtil.writeNbt(args.registryLookup, filterNbt, filter); NbtUtil.put(args.nbt, "filter", filterNbt); @@ -57,6 +61,8 @@ public void writeNbt(WriteNbtArgs args) { @Override public void readNbt(ReadNbtArgs args) { + super.readNbt(args); + if (NbtUtil.has(args.nbt, "filter")) { NbtCompound filterNbt = NbtUtil.get(args.nbt, "filter"); InventoryUtil.readNbt(args.registryLookup, filterNbt, filter); @@ -77,7 +83,17 @@ public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity pl @Override public void tick(TileTickEvent e) { + if (oldStoredEMC != -1 && oldStoredEMC == storedEMC) return; + if (!hasTeam()) return; + @SuppressWarnings("OptionalGetWithoutIsPresent") + TeamState teamState = getTeamState().get(); + if (oldStoredEMC != -1) + teamState.storedEMC -= oldStoredEMC - storedEMC; + + storedEMC = Math.min(teamState.storedEMC, getMaxEMC()); + oldStoredEMC = storedEMC; + markDirty(); } @Override @@ -122,7 +138,7 @@ public DefaultedList getItems() { if (!teamState.registeredItems.contains(ItemUtil.toCompatID(filterStack.getItem()).toString())) continue; ItemStack stack = filterStack.copy(); - stack.setCount(Math.min((int) Math.floorDiv(aveEMC, neededEMC), maxStackCount)); + stack.setCount(Math.min((int) Math.floorDiv(aveEMC, neededEMC), MAX_STACK_COUNT)); result.set(i, stack); } @@ -189,4 +205,19 @@ public void writeExtraData(ExtraDataArgs args) { args.writeVar(data); } + + @Override + public long getMaxEMC() { + return 500_000; + } + + @Override + public boolean canExtract() { + return true; + } + + @Override + public boolean canInsert() { + return false; + } } diff --git a/src/main/java/net/pitan76/itemalchemy/tile/EMCImporterTile.java b/src/main/java/net/pitan76/itemalchemy/tile/EMCImporterTile.java index 4ca993a..56ba010 100644 --- a/src/main/java/net/pitan76/itemalchemy/tile/EMCImporterTile.java +++ b/src/main/java/net/pitan76/itemalchemy/tile/EMCImporterTile.java @@ -12,6 +12,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.World; import net.pitan76.itemalchemy.EMCManager; +import net.pitan76.itemalchemy.api.EMCStorageUtil; import net.pitan76.itemalchemy.data.TeamState; import net.pitan76.itemalchemy.gui.screen.EMCImporterScreenHandler; import net.pitan76.itemalchemy.tile.base.OwnedBlockEntity; @@ -44,6 +45,8 @@ public EMCImporterTile(TileCreateEvent e) { @Override public void writeNbt(WriteNbtArgs args) { + super.writeNbt(args); + NbtCompound filterNbt = NbtUtil.create(); InventoryUtil.writeNbt(args.registryLookup, filterNbt, filter); @@ -62,6 +65,8 @@ public void writeNbt(WriteNbtArgs args) { @Override public void readNbt(ReadNbtArgs args) { + super.readNbt(args); + if (NbtUtil.has(args.nbt, "filter")) { NbtCompound filterNbt = NbtUtil.get(args.nbt, "filter"); InventoryUtil.readNbt(args.registryLookup, filterNbt, filter); @@ -89,8 +94,18 @@ public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity pl public void tick(TileTickEvent e) { World world = e.world; if (WorldUtil.isClient(world)) return; - if (!hasTeam()) return; + + EMCStorageUtil.transferAllEMC(this); + if (storedEMC > 0) { + @SuppressWarnings("OptionalGetWithoutIsPresent") + TeamState teamState = getTeamState().get(); + + teamState.storedEMC += storedEMC; + storedEMC = 0; + markDirty(); + } + if (inv.get(0).isEmpty()) return; ItemStack stack = inv.get(0); @@ -197,4 +212,19 @@ public void writeExtraData(ExtraDataArgs args) { args.writeVar(data); } + + @Override + public long getMaxEMC() { + return 30_000; + } + + @Override + public boolean canExtract() { + return false; + } + + @Override + public boolean canInsert() { + return true; + } } diff --git a/src/main/java/net/pitan76/itemalchemy/tile/base/OwnedBlockEntity.java b/src/main/java/net/pitan76/itemalchemy/tile/base/OwnedBlockEntity.java index e8429e2..c9b9ab0 100644 --- a/src/main/java/net/pitan76/itemalchemy/tile/base/OwnedBlockEntity.java +++ b/src/main/java/net/pitan76/itemalchemy/tile/base/OwnedBlockEntity.java @@ -8,12 +8,11 @@ import net.pitan76.itemalchemy.data.TeamState; import net.pitan76.mcpitanlib.api.entity.Player; import net.pitan76.mcpitanlib.api.event.block.TileCreateEvent; -import net.pitan76.mcpitanlib.api.tile.CompatBlockEntity; import java.util.Optional; import java.util.UUID; -public class OwnedBlockEntity extends CompatBlockEntity { +public abstract class OwnedBlockEntity extends EMCStorageBlockEntity { public UUID teamUUID = null; @@ -26,6 +25,8 @@ public OwnedBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) } public Optional getTeamState() { + if (getWorld() == null) return Optional.empty(); + ServerState serverState = ServerState.of(getWorld()); if (serverState == null || teamUUID == null) return Optional.empty();