Fix cargo crate not generating loot from loot tables when destroyed

Fixes #111
This commit is contained in:
DBotThePony 2022-10-09 10:41:26 +07:00
parent 6c2f5a6f48
commit 30db39453a
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 41 additions and 4 deletions

View File

@ -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)
}

View File

@ -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