Fix cargo crate not generating loot from loot tables when destroyed
Fixes #111
This commit is contained in:
parent
6c2f5a6f48
commit
30db39453a
@ -30,6 +30,16 @@ import ru.dbotthepony.mc.otm.core.component3
|
|||||||
|
|
||||||
interface IDroppableContainer {
|
interface IDroppableContainer {
|
||||||
val droppableContainer: Container
|
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(
|
abstract class MatteryBlock @JvmOverloads constructor(
|
||||||
@ -163,14 +173,26 @@ abstract class MatteryBlock @JvmOverloads constructor(
|
|||||||
val blockentity = level.getBlockEntity(blockPos)
|
val blockentity = level.getBlockEntity(blockPos)
|
||||||
|
|
||||||
if (blockentity is IDroppableContainer) {
|
if (blockentity is IDroppableContainer) {
|
||||||
|
blockentity.beforeDroppingItems(oldBlockState, level, blockPos, newBlockState, movedByPiston)
|
||||||
Containers.dropContents(level, blockPos, blockentity.droppableContainer)
|
Containers.dropContents(level, blockPos, blockentity.droppableContainer)
|
||||||
level.updateNeighbourForOutputSignal(blockPos, this)
|
level.updateNeighbourForOutputSignal(blockPos, this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
super.onRemove(oldBlockState, level, blockPos, newBlockState, movedByPiston)
|
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 {
|
companion object {
|
||||||
val DEFAULT_PROPERTIES: Properties = Properties.of(Material.STONE, MaterialColor.METAL).requiresCorrectToolForDrops().strength(1.5f, 25.0f)
|
val DEFAULT_PROPERTIES: Properties = Properties.of(Material.STONE, MaterialColor.METAL).requiresCorrectToolForDrops().strength(1.5f, 25.0f)
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import net.minecraft.world.entity.player.Inventory
|
|||||||
import net.minecraft.world.entity.player.Player
|
import net.minecraft.world.entity.player.Player
|
||||||
import net.minecraft.world.inventory.AbstractContainerMenu
|
import net.minecraft.world.inventory.AbstractContainerMenu
|
||||||
import net.minecraft.world.item.ItemStack
|
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.Block
|
||||||
import net.minecraft.world.level.block.state.BlockState
|
import net.minecraft.world.level.block.state.BlockState
|
||||||
import net.minecraft.world.level.gameevent.GameEvent
|
import net.minecraft.world.level.gameevent.GameEvent
|
||||||
@ -45,14 +46,28 @@ class CargoCrateBlockEntity(
|
|||||||
val container = MatteryContainer(this::setChanged, CAPACITY)
|
val container = MatteryContainer(this::setChanged, CAPACITY)
|
||||||
private var interactingPlayers = 0
|
private var interactingPlayers = 0
|
||||||
val handler = container.handler(object : MatteryContainerHooks {
|
val handler = container.handler(object : MatteryContainerHooks {
|
||||||
override fun preInsert(slot: Int, stack: ItemStack, simulate: Boolean) {
|
override fun canInsert(slot: Int, stack: ItemStack): Boolean {
|
||||||
|
return lootTable != null
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
unpackLootTable()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun preExtract(slot: Int, amount: Int, simulate: Boolean) {
|
override fun beforeDestroyedByPlayer(level: Level, blockPos: BlockPos, blockState: BlockState, player: Player) {
|
||||||
unpackLootTable()
|
unpackLootTable(player)
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
var lootTable: ResourceLocation? = null
|
var lootTable: ResourceLocation? = null
|
||||||
var lootTableSeed: Long? = null
|
var lootTableSeed: Long? = null
|
||||||
|
Loading…
Reference in New Issue
Block a user