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 package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.util.valueproviders.UniformInt
import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.EntityType
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Rarity import net.minecraft.world.item.Rarity
import net.minecraft.world.level.storage.loot.BuiltInLootTables 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.LootItemCondition
import net.minecraft.world.level.storage.loot.predicates.LootItemKilledByPlayerCondition
import net.minecraftforge.common.loot.LootTableIdCondition import net.minecraftforge.common.loot.LootTableIdCondition
import ru.dbotthepony.mc.otm.data.ChanceWithPlaytimeCondition import ru.dbotthepony.mc.otm.data.ChanceWithPlaytimeCondition
import ru.dbotthepony.mc.otm.data.HasExosuitCondition import ru.dbotthepony.mc.otm.data.HasExosuitCondition
import ru.dbotthepony.mc.otm.data.IRandomizableItem import ru.dbotthepony.mc.otm.data.IRandomizableItem
import ru.dbotthepony.mc.otm.data.ItemInInventoryCondition import ru.dbotthepony.mc.otm.data.ItemInInventoryCondition
import ru.dbotthepony.mc.otm.data.KilledByRealPlayer 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.LootTableSeparatedAppender
import ru.dbotthepony.mc.otm.data.RandomizableItemLootAppender import ru.dbotthepony.mc.otm.data.RandomizableItemLootAppender
import ru.dbotthepony.mc.otm.item.ProceduralExoSuitSlotUpgradeItem
import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MItems
fun LootTableIdCondition(location: String): LootItemCondition { fun LootTableIdCondition(location: String): LootItemCondition {
@ -126,7 +123,7 @@ fun addLootModifiers(it: LootModifiers) {
ItemStack(MItems.NUTRIENT_PASTE, 38) to 0.1, ItemStack(MItems.NUTRIENT_PASTE, 38) to 0.1,
)) ))
it.add("exosuit_probe_enderman_drop", LootTableBasicAppender( it.add("exosuit_probe_enderman_drop", BasicLootAppender(
arrayOf( arrayOf(
LootTableIdCondition(EntityType.ENDERMAN.defaultLootTable), LootTableIdCondition(EntityType.ENDERMAN.defaultLootTable),
HasExosuitCondition.INVERTED, HasExosuitCondition.INVERTED,
@ -141,18 +138,16 @@ fun addLootModifiers(it: LootModifiers) {
ItemStack(MItems.EXOSUIT_PROBE) ItemStack(MItems.EXOSUIT_PROBE)
).invert().build() ).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)), 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)), 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 package ru.dbotthepony.mc.otm.data
import com.google.common.collect.ImmutableList
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import it.unimi.dsi.fastutil.objects.ObjectArrayList 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.minecraft.world.level.storage.loot.predicates.LootItemCondition
import net.minecraftforge.common.loot.IGlobalLootModifier import net.minecraftforge.common.loot.IGlobalLootModifier
import net.minecraftforge.common.loot.LootModifier 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>, conditions: Array<out LootItemCondition>,
items: List<ItemStack> items: Stream<ItemStack>
) : LootModifier(conditions) { ) : 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> { override fun codec(): Codec<out IGlobalLootModifier> {
return CODEC return CODEC
@ -24,14 +36,18 @@ class LootTableBasicAppender(
generatedLoot: ObjectArrayList<ItemStack>, generatedLoot: ObjectArrayList<ItemStack>,
context: LootContext context: LootContext
): ObjectArrayList<ItemStack> { ): ObjectArrayList<ItemStack> {
generatedLoot.addAll(items) for (item in items)
generatedLoot.add(item.copy())
return generatedLoot return generatedLoot
} }
companion object { companion object {
val CODEC: Codec<LootTableBasicAppender> by lazy { val CODEC: Codec<BasicLootAppender> by lazy {
RecordCodecBuilder.create { 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> { override fun doApply(generatedLoot: ObjectArrayList<ItemStack>, context: LootContext): ObjectArrayList<ItemStack> {
pools.forEach { it.addRandomItems(generatedLoot::add, context) } pools.forEach { it.addRandomItems(generatedLoot::add, context) }
return generatedLoot return generatedLoot
@ -54,11 +54,11 @@ class LootTableAppender(conditions: Array<out LootItemCondition>, private vararg
} }
companion object { companion object {
val CODEC: Codec<LootTableAppender> by lazy { val CODEC: Codec<LootPoolAppender> by lazy {
RecordCodecBuilder.create { RecordCodecBuilder.create {
codecStart(it).and( codecStart(it).and(
LootPoolCodec.fieldOf("pools").forGetter { appender -> appender.pools as Array<LootPool> } 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.DeferredRegister
import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.data.LootTableAppender import ru.dbotthepony.mc.otm.data.LootPoolAppender
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.LootTableSeparatedAppender
import ru.dbotthepony.mc.otm.data.RandomizableItemLootAppender 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) private val registry = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, OverdriveThatMatters.MOD_ID)
init { init {
registry.register("loot_appender") { LootTableAppender.CODEC } registry.register("loot_appender") { LootPoolAppender.CODEC }
registry.register("loot_appender_separated") { LootTableSeparatedAppender.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 } registry.register("randomizable_item_loot_appender") { RandomizableItemLootAppender.Companion }
} }