diff --git a/src/main/java/com/github/talrey/createdeco/BlockRegistry.java b/src/main/java/com/github/talrey/createdeco/BlockRegistry.java index 56479579..6948bc56 100644 --- a/src/main/java/com/github/talrey/createdeco/BlockRegistry.java +++ b/src/main/java/com/github/talrey/createdeco/BlockRegistry.java @@ -4,24 +4,35 @@ import com.github.talrey.createdeco.blocks.*; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.AllMountedStorageTypes; import com.simibubi.create.AllTags; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.simibubi.create.api.packager.InventoryIdentifier; import com.simibubi.create.content.decoration.MetalLadderBlock; import com.simibubi.create.content.decoration.palettes.ConnectedGlassPaneBlock; import com.simibubi.create.content.decoration.palettes.ConnectedPillarBlock; import com.simibubi.create.content.decoration.palettes.WindowBlock; import com.simibubi.create.content.decoration.placard.PlacardBlock; import com.simibubi.create.content.decoration.placard.PlacardRenderer; +import com.simibubi.create.content.logistics.vault.ItemVaultBlockEntity; +import com.simibubi.create.content.logistics.vault.ItemVaultMountedStorageType; +import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.SharedProperties; import com.simibubi.create.foundation.item.TooltipModifier; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.entry.BlockEntityEntry; import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import java.util.ArrayList; import java.util.HashMap; @@ -84,6 +95,8 @@ public class BlockRegistry { public static HashMap> SHIPPING_CONTAINERS = new HashMap<>(); public static HashMap> CONTAINER_ENTITIES = new HashMap<>(); + public static final RegistryEntry, ShippingContainerBlock.MountedStorageType> CONTAINER_MOUNTED_STORAGE = CreateDecoMod.REGISTRATE.mountedItemStorage("shipping_container", ShippingContainerBlock.MountedStorageType::new).register();; + public static DyeColor fromName (String color) { for (DyeColor dye : BRICK_COLORS.keySet()) { if (BRICK_COLORS.get(dye).equals(color)) return dye; @@ -115,6 +128,17 @@ public static void init() { // Bricks registration CreateDecoMod.REGISTRATE.defaultCreativeTab(CreativeTabs.BRICKS_KEY); registerBricks(); + registerShippingContainers(); + } + + private static void registerInventoryIdentifiers() { + // connect vaults + for (BlockEntry container : SHIPPING_CONTAINERS.values()) { + InventoryIdentifier.REGISTRY.register(container.get(), (level, state, face) -> { + BlockEntity be = level.getBlockEntity(face.getPos()); + return be instanceof ShippingContainerBlock.Entity vault ? vault.getInvId() : null; + }); + } } private static void registerBars (String metal, Function getter) { @@ -286,12 +310,15 @@ private static void registerSupports (String metal, Function gette } private static void registerShippingContainers () { + for (DyeColor color : DyeColor.values()) { + SHIPPING_CONTAINERS.put(color, ShippingContainers.build(CreateDecoMod.REGISTRATE, color) .recipe( (ctx, prov)-> { ShippingContainers.recipeCrafting(color, ctx, prov); ShippingContainers.recipeDyeing(color, ctx, prov); }) + .transform(MountedItemStorageType.mountedItemStorage(CONTAINER_MOUNTED_STORAGE)) .register() ); CONTAINER_ENTITIES.put(color, CreateDecoMod.REGISTRATE.blockEntity( @@ -393,4 +420,15 @@ private static void registerBricks () { }); }); } + + @EventBusSubscriber + public static class EventSubscriber { + + @SubscribeEvent + private static void onCommonSetup(FMLCommonSetupEvent event) { + for (BlockEntry container : BlockRegistry.SHIPPING_CONTAINERS.values()) { + MountedItemStorageType.REGISTRY.register(container.get(), BlockRegistry.CONTAINER_MOUNTED_STORAGE.get()); + } + } + } } diff --git a/src/main/java/com/github/talrey/createdeco/blocks/ShippingContainerBlock.java b/src/main/java/com/github/talrey/createdeco/blocks/ShippingContainerBlock.java index 023547c1..afc2735e 100644 --- a/src/main/java/com/github/talrey/createdeco/blocks/ShippingContainerBlock.java +++ b/src/main/java/com/github/talrey/createdeco/blocks/ShippingContainerBlock.java @@ -1,19 +1,24 @@ package com.github.talrey.createdeco.blocks; import com.github.talrey.createdeco.BlockRegistry; -import com.simibubi.create.AllBlockEntityTypes; +import com.mojang.serialization.MapCodec; +import com.simibubi.create.AllMountedStorageTypes; import com.simibubi.create.api.connectivity.ConnectivityHandler; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.api.packager.InventoryIdentifier; import com.simibubi.create.content.logistics.vault.ItemVaultBlock; import com.simibubi.create.content.logistics.vault.ItemVaultBlockEntity; +import com.simibubi.create.content.logistics.vault.ItemVaultMountedStorage; import com.simibubi.create.foundation.ICapabilityProvider; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryWrapper; +import com.simibubi.create.foundation.codec.CreateCodecs; import com.simibubi.create.foundation.utility.SameSizeCombinedInvWrapper; import com.tterrag.registrate.util.entry.BlockEntityEntry; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; @@ -203,5 +208,45 @@ private void initCapability() { this.invId = new InventoryIdentifier.Bounds(bounds); } } + + public static class MountedStorage extends ItemVaultMountedStorage { + + public static final MapCodec CODEC = CreateCodecs.ITEM_STACK_HANDLER.xmap( + MountedStorage::new, storage -> storage.wrapped + ).fieldOf("value"); + + protected MountedStorage(MountedItemStorageType type, ItemStackHandler handler) { + super(type, handler); + } + + protected MountedStorage(ItemStackHandler handler) { + this(BlockRegistry.CONTAINER_MOUNTED_STORAGE.get(), handler); + } + + @Override + public void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + if (be instanceof Entity vault) { + vault.applyInventoryToBlock(this.wrapped); + } + } + + public static MountedStorage fromVault(ItemVaultBlockEntity vault) { + // Vault inventories have a world-affecting onContentsChanged, copy to a safe one + return new MountedStorage(copyToItemStackHandler(vault.getInventoryOfBlock())); + } + } + + public static class MountedStorageType extends MountedItemStorageType { + + public MountedStorageType() { + super(MountedStorage.CODEC); + } + + @Override + @Nullable + public MountedStorage mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + return be instanceof Entity vault ? MountedStorage.fromVault(vault) : null; + } + } }