diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt index 19cd87725..41081208f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/MatteryBlock.kt @@ -30,6 +30,16 @@ import ru.dbotthepony.mc.otm.core.component3 interface IDroppableContainer { val droppableContainer: Container + + fun beforeDroppingItems( + oldBlockState: BlockState, + level: Level, + blockPos: BlockPos, + newBlockState: BlockState, + movedByPiston: Boolean + ) {} + + fun beforeDestroyedByPlayer(level: Level, blockPos: BlockPos, blockState: BlockState, player: Player) {} } abstract class MatteryBlock @JvmOverloads constructor( @@ -163,14 +173,26 @@ abstract class MatteryBlock @JvmOverloads constructor( val blockentity = level.getBlockEntity(blockPos) if (blockentity is IDroppableContainer) { + blockentity.beforeDroppingItems(oldBlockState, level, blockPos, newBlockState, movedByPiston) Containers.dropContents(level, blockPos, blockentity.droppableContainer) level.updateNeighbourForOutputSignal(blockPos, this) } } + @Suppress("DEPRECATION") super.onRemove(oldBlockState, level, blockPos, newBlockState, movedByPiston) } + override fun playerWillDestroy(level: Level, blockPos: BlockPos, blockState: BlockState, player: Player) { + super.playerWillDestroy(level, blockPos, blockState, player) + + val blockentity = level.getBlockEntity(blockPos) + + if (blockentity is IDroppableContainer) { + blockentity.beforeDestroyedByPlayer(level, blockPos, blockState, player) + } + } + companion object { val DEFAULT_PROPERTIES: Properties = Properties.of(Material.STONE, MaterialColor.METAL).requiresCorrectToolForDrops().strength(1.5f, 25.0f) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt index f8097ed6f..06d2935d0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt @@ -17,6 +17,7 @@ import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.gameevent.GameEvent @@ -45,15 +46,29 @@ class CargoCrateBlockEntity( val container = MatteryContainer(this::setChanged, CAPACITY) private var interactingPlayers = 0 val handler = container.handler(object : MatteryContainerHooks { - override fun preInsert(slot: Int, stack: ItemStack, simulate: Boolean) { - unpackLootTable() + override fun canInsert(slot: Int, stack: ItemStack): Boolean { + return lootTable != null } - override fun preExtract(slot: Int, amount: Int, simulate: Boolean) { - unpackLootTable() + override fun canExtract(slot: Int, amount: Int, stack: ItemStack): Boolean { + return lootTable != null } }) + override fun beforeDroppingItems( + oldBlockState: BlockState, + level: Level, + blockPos: BlockPos, + newBlockState: BlockState, + movedByPiston: Boolean + ) { + unpackLootTable() + } + + override fun beforeDestroyedByPlayer(level: Level, blockPos: BlockPos, blockState: BlockState, player: Player) { + unpackLootTable(player) + } + var lootTable: ResourceLocation? = null var lootTableSeed: Long? = null