Fix some bugs with basic loot appender

This commit is contained in:
DBotThePony 2022-10-10 16:47:56 +07:00
parent 8091abe830
commit a6d0957a5f
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 37 additions and 26 deletions

View File

@ -1,23 +1,20 @@
package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.valueproviders.UniformInt
import net.minecraft.world.entity.EntityType
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Rarity
import net.minecraft.world.level.storage.loot.BuiltInLootTables
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemKilledByPlayerCondition
import net.minecraftforge.common.loot.LootTableIdCondition
import ru.dbotthepony.mc.otm.data.ChanceWithPlaytimeCondition
import ru.dbotthepony.mc.otm.data.HasExosuitCondition
import ru.dbotthepony.mc.otm.data.IRandomizableItem
import ru.dbotthepony.mc.otm.data.ItemInInventoryCondition
import ru.dbotthepony.mc.otm.data.KilledByRealPlayer
import ru.dbotthepony.mc.otm.data.LootTableBasicAppender
import ru.dbotthepony.mc.otm.data.BasicLootAppender
import ru.dbotthepony.mc.otm.data.LootTableSeparatedAppender
import ru.dbotthepony.mc.otm.data.RandomizableItemLootAppender
import ru.dbotthepony.mc.otm.item.ProceduralExoSuitSlotUpgradeItem
import ru.dbotthepony.mc.otm.registry.MItems
fun LootTableIdCondition(location: String): LootItemCondition {
@ -126,7 +123,7 @@ fun addLootModifiers(it: LootModifiers) {
ItemStack(MItems.NUTRIENT_PASTE, 38) to 0.1,
))
it.add("exosuit_probe_enderman_drop", LootTableBasicAppender(
it.add("exosuit_probe_enderman_drop", BasicLootAppender(
arrayOf(
LootTableIdCondition(EntityType.ENDERMAN.defaultLootTable),
HasExosuitCondition.INVERTED,
@ -141,18 +138,16 @@ fun addLootModifiers(it: LootModifiers) {
ItemStack(MItems.EXOSUIT_PROBE)
).invert().build()
),
listOf(
ItemStack(MItems.EXOSUIT_PROBE)
)
ItemStack(MItems.EXOSUIT_PROBE)
))
it.add("wither_exosuit_upgrades", LootTableSeparatedAppender(
it.add("wither_exosuit_upgrades", BasicLootAppender(
arrayOf(LootTableIdCondition(EntityType.WITHER.defaultLootTable)),
ItemStack(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_WITHER, 1) to 1.0,
ItemStack(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_WITHER),
))
it.add("ender_dragon_exosuit_upgrades", LootTableSeparatedAppender(
it.add("ender_dragon_exosuit_upgrades", BasicLootAppender(
arrayOf(LootTableIdCondition(EntityType.ENDER_DRAGON.defaultLootTable)),
ItemStack(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_ENDER_DRAGON, 1) to 1.0,
ItemStack(MItems.ExosuitUpgrades.INVENTORY_UPGRADE_ENDER_DRAGON),
))
}

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.data
import com.google.common.collect.ImmutableList
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import it.unimi.dsi.fastutil.objects.ObjectArrayList
@ -8,13 +9,24 @@ import net.minecraft.world.level.storage.loot.LootContext
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraftforge.common.loot.IGlobalLootModifier
import net.minecraftforge.common.loot.LootModifier
import ru.dbotthepony.mc.otm.core.ImmutableList
import java.util.Arrays
import java.util.stream.Stream
class LootTableBasicAppender(
class BasicLootAppender(
conditions: Array<out LootItemCondition>,
items: List<ItemStack>
items: Stream<ItemStack>
) : LootModifier(conditions) {
private val items = ImmutableList(items.size) { items[it].copy() }
constructor(
conditions: Array<out LootItemCondition>,
items: Collection<ItemStack>
) : this(conditions, items.stream())
constructor(
conditions: Array<out LootItemCondition>,
vararg items: ItemStack
) : this(conditions, Arrays.stream(items))
private val items = items.map { it.copy() }.collect(ImmutableList.toImmutableList())
override fun codec(): Codec<out IGlobalLootModifier> {
return CODEC
@ -24,14 +36,18 @@ class LootTableBasicAppender(
generatedLoot: ObjectArrayList<ItemStack>,
context: LootContext
): ObjectArrayList<ItemStack> {
generatedLoot.addAll(items)
for (item in items)
generatedLoot.add(item.copy())
return generatedLoot
}
companion object {
val CODEC: Codec<LootTableBasicAppender> by lazy {
val CODEC: Codec<BasicLootAppender> by lazy {
RecordCodecBuilder.create {
codecStart(it).and(ItemStackCodec.LIST.fieldOf("items").forGetter { it.items }).apply(it, ::LootTableBasicAppender)
codecStart(it)
.and(ItemStackCodec.LIST.fieldOf("items").forGetter(BasicLootAppender::items))
.apply(it, ::BasicLootAppender)
}
}
}

View File

@ -43,7 +43,7 @@ private val LootPoolCodec: Codec<Array<LootPool>> by lazy {
})
}
class LootTableAppender(conditions: Array<out LootItemCondition>, private vararg val pools: LootPool) : LootModifier(conditions) {
class LootPoolAppender(conditions: Array<out LootItemCondition>, private vararg val pools: LootPool) : LootModifier(conditions) {
override fun doApply(generatedLoot: ObjectArrayList<ItemStack>, context: LootContext): ObjectArrayList<ItemStack> {
pools.forEach { it.addRandomItems(generatedLoot::add, context) }
return generatedLoot
@ -54,11 +54,11 @@ class LootTableAppender(conditions: Array<out LootItemCondition>, private vararg
}
companion object {
val CODEC: Codec<LootTableAppender> by lazy {
val CODEC: Codec<LootPoolAppender> by lazy {
RecordCodecBuilder.create {
codecStart(it).and(
LootPoolCodec.fieldOf("pools").forGetter { appender -> appender.pools as Array<LootPool> }
).apply(it, ::LootTableAppender)
).apply(it, ::LootPoolAppender)
}
}
}

View File

@ -4,8 +4,8 @@ import net.minecraftforge.eventbus.api.IEventBus
import net.minecraftforge.registries.DeferredRegister
import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.data.LootTableAppender
import ru.dbotthepony.mc.otm.data.LootTableBasicAppender
import ru.dbotthepony.mc.otm.data.LootPoolAppender
import ru.dbotthepony.mc.otm.data.BasicLootAppender
import ru.dbotthepony.mc.otm.data.LootTableSeparatedAppender
import ru.dbotthepony.mc.otm.data.RandomizableItemLootAppender
@ -13,9 +13,9 @@ object LootModifiers {
private val registry = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, OverdriveThatMatters.MOD_ID)
init {
registry.register("loot_appender") { LootTableAppender.CODEC }
registry.register("loot_appender") { LootPoolAppender.CODEC }
registry.register("loot_appender_separated") { LootTableSeparatedAppender.CODEC }
registry.register("loot_appender_basic") { LootTableBasicAppender.CODEC }
registry.register("loot_appender_basic") { BasicLootAppender.CODEC }
registry.register("randomizable_item_loot_appender") { RandomizableItemLootAppender.Companion }
}