Allow to specify loot table rounds through nbt
This commit is contained in:
parent
3902e60424
commit
16f91343d8
@ -46,6 +46,14 @@ class BlockLootTableHolder(private val listener: Runnable = Runnable { }) {
|
||||
}
|
||||
}
|
||||
|
||||
var lootTableRounds: Int? = null
|
||||
set(value) {
|
||||
if (field != value) {
|
||||
field = value
|
||||
if (!ignoreListener) listener.run()
|
||||
}
|
||||
}
|
||||
|
||||
fun save(nbt: CompoundTag, registry: HolderLookup.Provider) {
|
||||
try {
|
||||
ignoreListener = true
|
||||
@ -55,6 +63,9 @@ class BlockLootTableHolder(private val listener: Runnable = Runnable { }) {
|
||||
|
||||
if (lootTableSeed != null)
|
||||
nbt.putLong(LOOT_TABLE_SEED_KEY, lootTableSeed!!)
|
||||
|
||||
if (lootTableRounds != null)
|
||||
nbt.putInt("LootRounds", lootTableRounds!!)
|
||||
}
|
||||
} finally {
|
||||
ignoreListener = false
|
||||
@ -68,6 +79,10 @@ class BlockLootTableHolder(private val listener: Runnable = Runnable { }) {
|
||||
if (nbt.contains(LOOT_TABLE_KEY, Tag.TAG_STRING.toInt())) {
|
||||
lootTable = ResourceLocation.tryParse(nbt.getString(LOOT_TABLE_KEY))?.let { ResourceKey.create(Registries.LOOT_TABLE, it) }
|
||||
lootTableSeed = if (nbt.contains(LOOT_TABLE_SEED_KEY, Tag.TAG_LONG.toInt())) nbt.getLong(LOOT_TABLE_SEED_KEY) else null
|
||||
lootTableRounds = if (nbt.contains("LootRounds", Tag.TAG_INT.toInt())) nbt.getInt("LootRounds") else null
|
||||
|
||||
if (lootTableRounds != null && lootTableRounds!! < 0)
|
||||
lootTableRounds = null
|
||||
}
|
||||
} finally {
|
||||
ignoreListener = false
|
||||
@ -84,20 +99,20 @@ class BlockLootTableHolder(private val listener: Runnable = Runnable { }) {
|
||||
return if (lootTableSeed == null) fallback else GJRAND64RandomSource(lootTableSeed)
|
||||
}
|
||||
|
||||
fun getItems(params: LootParams, level: ServerLevel, overrideSeed: Long? = null, rounds: Int = 1): MutableList<ItemStack> {
|
||||
return lookup(level).getRandomItems(params, selectRandom(overrideSeed, level.otmRandom), rounds)
|
||||
fun getItems(params: LootParams, level: ServerLevel, overrideSeed: Long? = null, rounds: Int? = null): MutableList<ItemStack> {
|
||||
return lookup(level).getRandomItems(params, selectRandom(overrideSeed, level.otmRandom), rounds ?: lootTableRounds ?: 1)
|
||||
}
|
||||
|
||||
fun getItems(params: LootParams.Builder, blockState: BlockState, overrideSeed: Long? = null, rounds: Int = 1): MutableList<ItemStack> {
|
||||
fun getItems(params: LootParams.Builder, blockState: BlockState, overrideSeed: Long? = null, rounds: Int? = null): MutableList<ItemStack> {
|
||||
val level = params.level
|
||||
val create = params.withParameter(LootContextParams.BLOCK_STATE, blockState).create(LootContextParamSets.BLOCK)
|
||||
return getItems(create, level, overrideSeed, rounds)
|
||||
}
|
||||
|
||||
fun fill(level: ServerLevel, blockPos: BlockPos, container: Container, ply: Player? = null, blockEntity: BlockEntity? = level.getBlockEntityNow(blockPos), overrideSeed: Long? = null, dropContents: Boolean = true, rounds: Int = 1) {
|
||||
fun fill(level: ServerLevel, blockPos: BlockPos, container: Container, ply: Player? = null, blockEntity: BlockEntity? = level.getBlockEntityNow(blockPos), overrideSeed: Long? = null, dropContents: Boolean = true, rounds: Int? = null) {
|
||||
if (rounds == 0)
|
||||
return
|
||||
else if (rounds < 0)
|
||||
else if (rounds != null && rounds < 0)
|
||||
throw IllegalArgumentException("Negative amount of rounds: $rounds")
|
||||
|
||||
val lootTable = lootTable ?: return
|
||||
@ -122,7 +137,7 @@ class BlockLootTableHolder(private val listener: Runnable = Runnable { }) {
|
||||
if (dropContents)
|
||||
Containers.dropContents(level, blockPos, container)
|
||||
|
||||
loot.fill(params.create(LootContextParamSets.CHEST), selectRandom(overrideSeed, level.otmRandom), container, rounds)
|
||||
loot.fill(params.create(LootContextParamSets.CHEST), selectRandom(overrideSeed, level.otmRandom), container, rounds ?: lootTableRounds ?: 1)
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
|
Loading…
Reference in New Issue
Block a user