Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/1.20.1' into 1.20.1
Browse files Browse the repository at this point in the history
  • Loading branch information
ATPStorages committed Aug 30, 2024
2 parents 8b056ca + 69da072 commit 36e38b1
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
66 changes: 66 additions & 0 deletions src/main/kotlin/breadmod/block/entity/SoundBlockEntity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand All @@ -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 <T : Any?> getCapability(cap: Capability<T>): LazyOptional<T> =
getCapability(cap, null)

override fun <T : Any?> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> =
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())

Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/breadmod/menu/block/SoundBlockMenu.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -23,7 +26,9 @@ class SoundBlockMenu(
)

init {
val cap = parent.capabilityHolder.capabilityOrNull<IndexableItemHandler>(ForgeCapabilities.ITEM_HANDLER)
addInventorySlots(pInventory, 8, 142, 84)
addSlot(Slot(TODO(), 1, 0, 0))
}

override fun stillValid(pPlayer: Player): Boolean = stillValid(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package breadmod.network.serverbound

object SoundBlockPacket {
}

0 comments on commit 36e38b1

Please sign in to comment.