diff --git a/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt b/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt index a3d32ae8..4fa4e767 100644 --- a/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt +++ b/src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt @@ -2,13 +2,23 @@ package breadmod.block.entity import breadmod.ModMain.modTranslatable import breadmod.menu.block.SoundBlockMenu +import breadmod.network.PacketHandler.NETWORK +import breadmod.network.clientbound.CapabilitySideDataPacket +import breadmod.network.clientbound.CapabilityTagDataPacket import breadmod.registry.block.ModBlockEntityTypes +import breadmod.util.capability.CapabilityHolder +import breadmod.util.capability.CapabilityHolder.Companion.ACCEPT_ALL +import breadmod.util.capability.ICapabilitySavable +import breadmod.util.capability.IndexableItemHandler +import breadmod.util.capability.StorageDirection import net.minecraft.core.BlockPos +import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag 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.sounds.SoundEvents import net.minecraft.world.MenuProvider import net.minecraft.world.entity.player.Inventory @@ -18,6 +28,11 @@ import net.minecraft.world.item.BlockItem import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.block.state.properties.BlockStateProperties +import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities +import net.minecraftforge.common.util.LazyOptional +import net.minecraftforge.network.PacketDistributor // todo actual logic and packet for handling entered sounds class SoundBlockEntity( @@ -28,18 +43,69 @@ class SoundBlockEntity( pPos, pBlockState ), MenuProvider { + val capabilityHolder = CapabilityHolder(mapOf( + ForgeCapabilities.ITEM_HANDLER to ( + IndexableItemHandler( + listOf( + 1 to StorageDirection.STORE_ONLY + ) + ) to ACCEPT_ALL + ) + )) + + init { + capabilityHolder.capabilities.forEach { _, u -> + u.first.ifPresent { it.changed = { setChanged() } } + } + capabilityHolder.changed = { cap, _, _ -> + NETWORK.send( + PacketDistributor.TRACKING_CHUNK.with { (level as ServerLevel).getChunkAt(blockPos) }, + CapabilitySideDataPacket(blockPos, cap.name, capabilityHolder.capabilities[cap]?.second ?: emptyList()) + ) + } + capabilityHolder.capabilities.forEach { + (capabilityHolder.capability(it.key) as ICapabilitySavable<*>).changed = ::setChanged + } + } + + override fun getCapability(cap: Capability): LazyOptional = + getCapability(cap, null) + + override fun getCapability(cap: Capability, side: Direction?): LazyOptional = + capabilityHolder.capabilitySided(cap, blockState.getValue(BlockStateProperties.HORIZONTAL_FACING), side) + ?: super.getCapability(cap, side) + + override fun invalidateCaps() { + capabilityHolder.invalidate() + super.invalidateCaps() + } + var currentSound: String? = SoundEvents.BELL_BLOCK.location.path override fun saveAdditional(pTag: CompoundTag) { + capabilityHolder.capabilities.forEach { (cap, list) -> + list.first.ifPresent { pTag.put(cap.name, it.serializeNBT()) } + } currentSound?.let { pTag.putString("current_sound", it) } super.saveAdditional(pTag) } override fun load(pTag: CompoundTag) { + capabilityHolder.capabilities.forEach { (cap, list) -> + list.first.ifPresent { it.deserializeNBT(pTag.get(cap.name)) } + } if (currentSound != null) pTag.getCompound("current_sound") super.load(pTag) } + override fun setChanged() { + if (level is ServerLevel) NETWORK.send( + PacketDistributor.TRACKING_CHUNK.with { (level as ServerLevel).getChunkAt(blockPos) }, + CapabilityTagDataPacket(blockPos, updateTag) + ) + super.setChanged() + } + override fun saveToItem(pStack: ItemStack) = BlockItem.setBlockEntityData(pStack, type, saveWithFullMetadata()) diff --git a/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt b/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt index 0fb9f34c..b6752f83 100644 --- a/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt +++ b/src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt @@ -4,10 +4,13 @@ import breadmod.block.entity.SoundBlockEntity import breadmod.menu.AbstractModContainerMenu import breadmod.registry.block.ModBlockEntityTypes import breadmod.registry.menu.ModMenuTypes +import breadmod.util.capability.IndexableItemHandler import net.minecraft.network.FriendlyByteBuf import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.ContainerLevelAccess +import net.minecraft.world.inventory.Slot +import net.minecraftforge.common.capabilities.ForgeCapabilities class SoundBlockMenu( pContainerId: Int, @@ -23,7 +26,9 @@ class SoundBlockMenu( ) init { + val cap = parent.capabilityHolder.capabilityOrNull(ForgeCapabilities.ITEM_HANDLER) addInventorySlots(pInventory, 8, 142, 84) + addSlot(Slot(TODO(), 1, 0, 0)) } override fun stillValid(pPlayer: Player): Boolean = stillValid( diff --git a/src/main/kotlin/breadmod/network/serverbound/SoundBlockPacket.kt b/src/main/kotlin/breadmod/network/serverbound/SoundBlockPacket.kt new file mode 100644 index 00000000..49c6dc07 --- /dev/null +++ b/src/main/kotlin/breadmod/network/serverbound/SoundBlockPacket.kt @@ -0,0 +1,4 @@ +package breadmod.network.serverbound + +object SoundBlockPacket { +} \ No newline at end of file