diff --git a/src/main/java/robaertschi/environmenttech/client/screen/EnvCollectorScreen.java b/src/main/java/robaertschi/environmenttech/client/screen/EnvCollectorScreen.java index ca05e80..d86dde5 100644 --- a/src/main/java/robaertschi/environmenttech/client/screen/EnvCollectorScreen.java +++ b/src/main/java/robaertschi/environmenttech/client/screen/EnvCollectorScreen.java @@ -1,7 +1,9 @@ package robaertschi.environmenttech.client.screen; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; @@ -14,7 +16,7 @@ public class EnvCollectorScreen extends AbstractContainerScreen buf.writeBlockPos(pPos)); + pPlayer.openMenu((MenuProvider) be, pPos); } else { throw new IllegalStateException("Our named container provider is missing!"); } diff --git a/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java b/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java index 9fdb0ec..20b2c8d 100644 --- a/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java +++ b/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java @@ -5,7 +5,17 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -20,10 +30,11 @@ import robaertschi.environmenttech.data.capabilities.EnvStorage; import robaertschi.environmenttech.data.capabilities.EnvType; import robaertschi.environmenttech.data.recipes.ETRecipes; import robaertschi.environmenttech.data.recipes.EnvCollectorRecipe; +import robaertschi.environmenttech.menu.EnvCollectorMenu; import static robaertschi.environmenttech.EnvironmentTech.MODID; -public class EnvCollectorBlockEntity extends BlockEntity { +public class EnvCollectorBlockEntity extends BlockEntity implements MenuProvider { public static final int SLOT_INPUT = 0; public static final int SLOT_INPUT_COUNT = 1; @@ -36,8 +47,11 @@ public class EnvCollectorBlockEntity extends BlockEntity { private final ItemStackHandler inventory = new ItemStackHandler(2) { @Override protected void onContentsChanged(int slot) { - super.onContentsChanged(slot); EnvCollectorBlockEntity.this.setChanged(); + assert level != null; + if (!level.isClientSide()) { + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3); + } } @Override @@ -53,12 +67,21 @@ public class EnvCollectorBlockEntity extends BlockEntity { private final EnvStorage envStorage = new EnvStorage(EnvType.Chunk, 64, 0, 1) { @Override public void onContentsChanged() { - super.onContentsChanged(); EnvCollectorBlockEntity.this.setChanged(); + assert level != null; + if (!level.isClientSide()) { + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3); + } } }; + @Getter + private ContainerData data; + + @Getter private int progress = 0; + @Getter + private int maxProgress = 10; // Every 20 ticks, we take ENV from the current Chunk private int takeEnv = 0; @Nullable @@ -67,6 +90,29 @@ public class EnvCollectorBlockEntity extends BlockEntity { public EnvCollectorBlockEntity(BlockPos pos, BlockState state) { super(ETBlockEntities.ENV_COLLECTOR_BLOCK_ENTITY.get(), pos, state); + this.data = new ContainerData() { + @Override + public int get(int pIndex) { + return switch(pIndex) { + case 0 -> EnvCollectorBlockEntity.this.progress; + case 1 -> EnvCollectorBlockEntity.this.maxProgress; + default -> 0; + }; + } + + @Override + public void set(int pIndex, int pValue) { + switch (pIndex) { + case 0 -> EnvCollectorBlockEntity.this.progress = pValue; + case 1 -> EnvCollectorBlockEntity.this.maxProgress = pValue; + } + } + + @Override + public int getCount() { + return 2; + } + }; } @Override @@ -118,17 +164,19 @@ public class EnvCollectorBlockEntity extends BlockEntity { } if (hasRecipe(level)) { - if (progress > 0 && progress < 60) { + if (progress > 0 && progress < getMaxProgress()) { progress++; } else if (progress > 0) { produce(level); progress = 0; - } else { + } else if (getOutputItem().getCount() < getOutputItem().getMaxStackSize()){ assert currentRecipe != null; - if (envStorage.getEnvStored() >= currentRecipe.envUsed()) { - envStorage.setEnvStored(envStorage.getEnvStored() - currentRecipe.envUsed()); - progress = 1; - } +// if (envStorage.getEnvStored() >= currentRecipe.envUsed()) { +// envStorage.setEnvStored(envStorage.getEnvStored() - currentRecipe.envUsed()); +// progress = 1; +// } + + progress = 1; } } @@ -138,7 +186,13 @@ public class EnvCollectorBlockEntity extends BlockEntity { getInputItem().setCount(getInputItem().getCount() - 1); // Is safe, as hasRecipe already checked assert currentRecipe != null; - setOutputItem(currentRecipe.assemble(recipeWrapper, level.registryAccess())); + + if (getOutputItem().isEmpty()) { + setOutputItem(currentRecipe.assemble(recipeWrapper, level.registryAccess())); + } else { + getOutputItem().setCount(getOutputItem().getCount() + 1); + } + } private boolean hasRecipe(Level level) { @@ -156,4 +210,31 @@ public class EnvCollectorBlockEntity extends BlockEntity { } } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public @NotNull CompoundTag getUpdateTag(HolderLookup.@NotNull Provider pRegistries) { + return saveWithoutMetadata(pRegistries); + } + + @Override + public void onDataPacket(@NotNull Connection net, @NotNull ClientboundBlockEntityDataPacket pkt, HolderLookup.@NotNull Provider lookupProvider) { + super.onDataPacket(net, pkt, lookupProvider); + } + + @Override + public @NotNull Component getDisplayName() { + return Component.translatable("screen.environmenttech.env_collector"); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int pContainerId, @NotNull Inventory pPlayerInventory, @NotNull Player pPlayer) { + return new EnvCollectorMenu(pContainerId, pPlayer, this, data); + } } diff --git a/src/main/java/robaertschi/environmenttech/menu/ETMenus.java b/src/main/java/robaertschi/environmenttech/menu/ETMenus.java index d69a805..2cb5a5b 100644 --- a/src/main/java/robaertschi/environmenttech/menu/ETMenus.java +++ b/src/main/java/robaertschi/environmenttech/menu/ETMenus.java @@ -13,7 +13,7 @@ public class ETMenus { public static final DeferredRegister> MENUS = DeferredRegister.create(BuiltInRegistries.MENU, MODID); public static final DeferredHolder, MenuType> ENV_COLLECTOR_MENU = MENUS.register("env_collector", () -> - IMenuTypeExtension.create((windowId, inv, data) -> new EnvCollectorMenu(windowId, inv.player, data.readBlockPos()))); + IMenuTypeExtension.create((windowId, inv, data) -> new EnvCollectorMenu(windowId, inv.player, data))); public static void init(IEventBus modEventBus) { MENUS.register(modEventBus); diff --git a/src/main/java/robaertschi/environmenttech/menu/EnvCollectorMenu.java b/src/main/java/robaertschi/environmenttech/menu/EnvCollectorMenu.java index 272e642..2821133 100644 --- a/src/main/java/robaertschi/environmenttech/menu/EnvCollectorMenu.java +++ b/src/main/java/robaertschi/environmenttech/menu/EnvCollectorMenu.java @@ -1,13 +1,11 @@ package robaertschi.environmenttech.menu; import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.SlotItemHandler; import org.jetbrains.annotations.NotNull; @@ -20,16 +18,30 @@ import static robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEn public class EnvCollectorMenu extends AbstractContainerMenu { - private final BlockPos pos; + private final EnvCollectorBlockEntity blockEntity; + private final ContainerData data; - public EnvCollectorMenu(int pContainerId, Player player, BlockPos pos) { + public EnvCollectorMenu(int pContainerId, Player player, FriendlyByteBuf buf) { + this(pContainerId, player, (EnvCollectorBlockEntity) player.level().getBlockEntity(buf.readBlockPos()), new SimpleContainerData(2)); + } + + public EnvCollectorMenu(int pContainerId, Player player, EnvCollectorBlockEntity blockEntity, ContainerData data) { super(ETMenus.ENV_COLLECTOR_MENU.get(), pContainerId); - this.pos = pos; - if (player.level().getBlockEntity(pos) instanceof EnvCollectorBlockEntity envCollector) { - addSlot(new SlotItemHandler(envCollector.getInventory(), 0, 55, 35)); - addSlot(new SlotItemHandler(envCollector.getInventory(), 1, 114, 33)); - } - layoutPlayerInventorySlots(player.getInventory(), 10, 70); + this.blockEntity = blockEntity; + this.data = data; + addSlot(new SlotItemHandler(blockEntity.getInventory(), 0, 54, 34)); + addSlot(new SlotItemHandler(blockEntity.getInventory(), 1, 116, 35)); + layoutPlayerInventorySlots(player.getInventory(), 8, 84); + + addDataSlots(data); + } + + public int getProgress() { + return data.get(0); + } + + public int getMaxProgress() { + return data.get(1); } private int addSlotRange(Container playerInventory, int index, int x, int y, int amount, int dx) { @@ -99,6 +111,6 @@ public class EnvCollectorMenu extends AbstractContainerMenu { @Override public boolean stillValid(@NotNull Player pPlayer) { - return stillValid(ContainerLevelAccess.create(pPlayer.level(), pos), pPlayer, ETBlocks.ENV_COLLECTOR_BLOCK.get()); + return stillValid(ContainerLevelAccess.create(pPlayer.level(), blockEntity.getBlockPos()), pPlayer, ETBlocks.ENV_COLLECTOR_BLOCK.get()); } } diff --git a/src/main/resources/assets/environmenttech/lang/en_us.json b/src/main/resources/assets/environmenttech/lang/en_us.json index 48f6a3f..bed998f 100644 --- a/src/main/resources/assets/environmenttech/lang/en_us.json +++ b/src/main/resources/assets/environmenttech/lang/en_us.json @@ -2,5 +2,6 @@ "item.environmenttech.env_detector": "ENV Detector", "item.environmenttech.environmental_essence": "Environmental Essence", - "itemGroup.environmenttech": "Environment Tech" + "itemGroup.environmenttech": "Environment Tech", + "screen.environmenttech.env_collector": "ENV Collector" } \ No newline at end of file diff --git a/src/main/resources/assets/environmenttech/textures/gui/component/progress_bar.png b/src/main/resources/assets/environmenttech/textures/gui/component/progress_bar.png deleted file mode 100644 index 4664b8f..0000000 Binary files a/src/main/resources/assets/environmenttech/textures/gui/component/progress_bar.png and /dev/null differ diff --git a/src/main/resources/assets/environmenttech/textures/gui/sprites/component/progress_arrow.png b/src/main/resources/assets/environmenttech/textures/gui/sprites/component/progress_arrow.png new file mode 100644 index 0000000..be4e213 Binary files /dev/null and b/src/main/resources/assets/environmenttech/textures/gui/sprites/component/progress_arrow.png differ