summaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java')
-rw-r--r--src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java114
1 files changed, 111 insertions, 3 deletions
diff --git a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
index e26aea1..ba09c5e 100644
--- a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
+++ b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
@@ -1,12 +1,36 @@
package moe.nea.funnyteleporters;
-import net.minecraft.block.Block;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.DataResult;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.block.BlockState;
+import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
-import net.minecraft.block.entity.ChestBlockEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.inventory.Inventories;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.registry.RegistryWrapper;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
-public class ColouredChestBlockEntity extends ChestBlockEntity {
+import java.util.List;
+
+public class ColouredChestBlockEntity extends BlockEntity implements Inventory {
+ private DefaultedList<ItemStack> inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY);
+
+ public record ExtraData(
+ List<DyeColor> frequency
+ ) {
+ public static Codec<ExtraData> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ DyeColor.CODEC.listOf().validate(it -> it.size() == 3 ? DataResult.success(it) : (it.size() > 3 ? DataResult.error(() -> "List " + it + "too long", it.subList(0, 3)) : DataResult.error(() -> "List " + it + " too short"))).fieldOf("frequency").forGetter(ExtraData::frequency)
+ ).apply(instance, ExtraData::new));
+ }
+
public ColouredChestBlockEntity(BlockPos blockPos, BlockState blockState) {
this(FunnyRegistry.COLOURED_CHEST_ENTITY, blockPos, blockState);
}
@@ -14,4 +38,88 @@ public class ColouredChestBlockEntity extends ChestBlockEntity {
protected ColouredChestBlockEntity(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
super(blockEntityType, blockPos, blockState);
}
+
+ @Override
+ protected void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
+ super.writeNbt(nbt, registryLookup);
+ Inventories.writeNbt(nbt, inventory, registryLookup);
+ var result = ExtraData.CODEC.encodeStart(NbtOps.INSTANCE, extra);
+ if (result.hasResultOrPartial()) {
+ nbt.put("extra", result.getPartialOrThrow());
+ }
+ }
+
+ ExtraData extra = new ExtraData(List.of(DyeColor.BLUE, DyeColor.BLUE, DyeColor.BLUE));
+
+ public int size() {
+ return 27;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ for (ItemStack itemStack : inventory) {
+ if (!itemStack.isEmpty()) return false;
+ }
+ return true;
+ }
+
+ @Override
+ public ItemStack getStack(int slot) {
+ if (0 <= slot && slot < size())
+ return inventory.get(slot);
+ return ItemStack.EMPTY;
+ }
+
+ @Override
+ public ItemStack removeStack(int slot, int amount) {
+ ItemStack itemStack = Inventories.splitStack(this.inventory, slot, amount);
+ if (!itemStack.isEmpty()) {
+ markDirty();
+ }
+
+ return itemStack;
+ }
+
+ @Override
+ public ItemStack removeStack(int slot) {
+ markDirty();
+ return Inventories.removeStack(inventory, slot);
+ }
+
+ @Override
+ public void setStack(int slot, ItemStack stack) {
+ if (0 <= slot && slot < size()) {
+ markDirty();
+ inventory.set(slot, stack);
+ }
+ }
+
+ @Override
+ public boolean canPlayerUse(PlayerEntity player) {
+ return true;
+ }
+
+ @Override
+ protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
+ super.readNbt(nbt, registryLookup);
+ inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY);
+ Inventories.readNbt(nbt, inventory, registryLookup);
+ if (nbt.contains("extra")) {
+ var extra = ExtraData.CODEC.decode(NbtOps.INSTANCE, nbt.get("extra"));
+ if (extra.hasResultOrPartial()) {
+ this.extra = extra.getPartialOrThrow().getFirst();
+ }
+ }
+ }
+
+ @Override
+ public void clear() {
+ markDirty();
+ inventory.clear();
+ }
+
+ public void openScreen(ServerPlayerEntity player) {
+ new ColouredChestConfigGUI(this, player).open();
+ }
}
+