diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/BlockLootTableHolder.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/BlockLootTableHolder.kt index 4c8958029..af2fca337 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/BlockLootTableHolder.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/BlockLootTableHolder.kt @@ -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 { - return lookup(level).getRandomItems(params, selectRandom(overrideSeed, level.otmRandom), rounds) + fun getItems(params: LootParams, level: ServerLevel, overrideSeed: Long? = null, rounds: Int? = null): MutableList { + 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 { + fun getItems(params: LootParams.Builder, blockState: BlockState, overrideSeed: Long? = null, rounds: Int? = null): MutableList { 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() {