diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt index e3312fe82..4dae60385 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt @@ -8,6 +8,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.storage.loot.BuiltInLootTables import net.minecraft.world.level.storage.loot.LootTable import net.minecraft.world.level.storage.loot.predicates.LootItemCondition +import net.neoforged.neoforge.common.loot.AddTableLootModifier import net.neoforged.neoforge.common.loot.LootTableIdCondition import ru.dbotthepony.mc.otm.core.ResourceLocation import ru.dbotthepony.mc.otm.core.math.Decimal @@ -17,6 +18,7 @@ import ru.dbotthepony.mc.otm.data.condition.HasExoPackCondition import ru.dbotthepony.mc.otm.data.condition.ItemInInventoryCondition import ru.dbotthepony.mc.otm.data.condition.KilledByRealPlayerOrIndirectly import ru.dbotthepony.mc.otm.data.loot.LootPoolAppender +import ru.dbotthepony.mc.otm.datagen.modLootTable import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem import ru.dbotthepony.mc.otm.registry.MItems @@ -211,4 +213,29 @@ fun addLootModifiers(it: LootModifiers) { ), ItemStack(MItems.ExopackUpgrades.INVENTORY_UPGRADE_ENDER_DRAGON), )) + + it.add("trials/matter_dust", AddTableLootModifier( + arrayOf(LootTableIdCondition(BuiltInLootTables.TRIAL_CHAMBERS_REWARD)), + modLootTable("trials/matter_dust") + )) + + it.add("trials/pill", AddTableLootModifier( + arrayOf(LootTableIdCondition(BuiltInLootTables.TRIAL_CHAMBERS_REWARD)), + modLootTable("trials/pill") + )) + + it.add("trials/exosuit", AddTableLootModifier( + arrayOf(LootTableIdCondition(BuiltInLootTables.TRIAL_CHAMBERS_REWARD)), + modLootTable("trials/exosuit") + )) + + it.add("trials/battery", AddTableLootModifier( + arrayOf(LootTableIdCondition(BuiltInLootTables.TRIAL_CHAMBERS_REWARD)), + modLootTable("trials/battery") + )) + + it.add("trials/zpm_battery", AddTableLootModifier( + arrayOf(LootTableIdCondition(BuiltInLootTables.TRIAL_CHAMBERS_REWARD_OMINOUS)), + modLootTable("trials/zpm_battery") + )) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt index 59ca7a7a4..e8d16867f 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTablesData.kt @@ -5,6 +5,7 @@ import net.minecraft.advancements.critereon.ItemEnchantmentsPredicate import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemSubPredicates import net.minecraft.advancements.critereon.MinMaxBounds +import net.minecraft.util.valueproviders.UniformInt import net.minecraft.world.item.Items import net.minecraft.world.item.enchantment.Enchantments import net.minecraft.world.level.ItemLike @@ -18,7 +19,12 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition import net.minecraft.world.level.storage.loot.predicates.MatchTool import ru.dbotthepony.mc.otm.core.lookupOrThrow +import ru.dbotthepony.mc.otm.core.math.Decimal +import ru.dbotthepony.mc.otm.data.UniformDecimal import ru.dbotthepony.mc.otm.datagen.modLootTable +import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem +import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem +import ru.dbotthepony.mc.otm.item.matter.MatterDustItem import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry @@ -211,4 +217,61 @@ fun addLootTables(lootTables: LootTables) { lootTables.tile(MBlocks.BLACK_HOLE_GENERATOR) lootTables.tile(MBlocks.ITEM_INPUT_HATCH) lootTables.tile(MBlocks.ITEM_OUTPUT_HATCH) + + lootTables.builder(LootContextParamSets.VAULT, modLootTable("trials/matter_dust")) { + lootPool { item(MItems.MATTER_DUST) { + chanceCondition(0.2) + setWeight(4) + apply(MatterDustItem.Randomizer(UniformDecimal(Decimal(100), Decimal(2_500)))) + } } + } + + lootTables.builder(LootContextParamSets.VAULT, modLootTable("trials/pill")) { + lootPool { item(MItems.PILL_ANDROID) { + chanceCondition(0.1) + setWeight(1) + } } + lootPool { item(MItems.PILL_HEAL) { + chanceCondition(0.5) + setWeight(2) + setCount(2, 5) + } } + } + + lootTables.builder(LootContextParamSets.VAULT, modLootTable("trials/exosuit")) { + lootPool { item(MItems.ExopackUpgrades.INVENTORY_UPGRADE_PROCEDURAL) { + chanceCondition(0.2) + setWeight(2) + + apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(1, 9), UniformInt.of(0, 3))) + } } + + lootPool { item(MItems.ExopackUpgrades.INVENTORY_UPGRADE_PROCEDURAL) { + chanceCondition(0.1) + setWeight(1) + + apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(9, 18), UniformInt.of(0, 3))) + } } + } + + lootTables.builder(LootContextParamSets.VAULT, modLootTable("trials/battery")) { + lootPool { item(MItems.PROCEDURAL_BATTERY) { + chanceCondition(0.05) + setWeight(1) + + apply( + ProceduralBatteryItem.Randomizer( + maxBatteryLevel = UniformDecimal(Decimal(10_000_000), Decimal(50_000_000)), + batteryLevel = UniformDecimal(Decimal(0), Decimal(25_000_000)), + maxInput = UniformDecimal(Decimal(1_000), Decimal(5_000)), + )) + } } + } + + lootTables.builder(LootContextParamSets.VAULT, modLootTable("trials/zpm_battery")) { + lootPool { item(MItems.ZPM_BATTERY) { + chanceCondition(0.001) + setWeight(1) + } } + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt index 5965e0c15..9e0dcafeb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/MatterDustItem.kt @@ -1,7 +1,11 @@ package ru.dbotthepony.mc.otm.item.matter +import com.mojang.serialization.MapCodec +import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component +import net.minecraft.util.valueproviders.ConstantInt +import net.minecraft.util.valueproviders.IntProvider import net.minecraft.world.entity.SlotAccess import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.ClickAction @@ -10,18 +14,47 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.level.Level +import net.minecraft.world.level.storage.loot.LootContext +import net.minecraft.world.level.storage.loot.functions.LootItemFunction +import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType import ru.dbotthepony.mc.otm.config.ItemsConfig import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.matter.IMatterItem import ru.dbotthepony.mc.otm.core.nbt.set +import ru.dbotthepony.mc.otm.data.DecimalProvider import ru.dbotthepony.mc.otm.matter.IMatterValue import ru.dbotthepony.mc.otm.matter.MatterValue import ru.dbotthepony.mc.otm.registry.MDataComponentTypes +import ru.dbotthepony.mc.otm.registry.MItemFunctionTypes import ru.dbotthepony.mc.otm.registry.MItems class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem { + class Randomizer(val matter: DecimalProvider, val luckBias: IntProvider = ConstantInt.ZERO) : LootItemFunction, LootItemFunction.Builder { + override fun apply(t: ItemStack, u: LootContext): ItemStack { + t[MDataComponentTypes.MATTER_LEVEL] = matter.sample(u.random) + (luckBias.sample(u.random) * u.luck / 1024f).coerceAtLeast(0f) + return t + } + + override fun getType(): LootItemFunctionType { + return MItemFunctionTypes.MATTER_DUST + } + + override fun build(): LootItemFunction { + return this + } + + companion object { + val CODEC: MapCodec = RecordCodecBuilder.mapCodec { + it.group( + DecimalProvider.CODEC.fieldOf("slots").forGetter(Randomizer::matter), + IntProvider.CODEC.optionalFieldOf("luck_bias", ConstantInt.ZERO).forGetter(Randomizer::luckBias), + ).apply(it, ::Randomizer) + } + } + } + private fun matter(stack: ItemStack): Decimal { return stack.getOrDefault(MDataComponentTypes.MATTER_LEVEL, Decimal.ZERO) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt index f3afca109..3d7ae2e7c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItemFunctionTypes.kt @@ -7,6 +7,7 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.data.loot.CopyTileNbtFunction import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem +import ru.dbotthepony.mc.otm.item.matter.MatterDustItem object MItemFunctionTypes { private val registry = MDeferredRegister(Registries.LOOT_FUNCTION_TYPE, OverdriveThatMatters.MOD_ID) @@ -14,6 +15,7 @@ object MItemFunctionTypes { val COPY_TILE_NBT by registry.register("copy_tile_nbt") { LootItemFunctionType(CopyTileNbtFunction.CODEC) } val PROCEDURAL_BATTERY by registry.register(MNames.PROCEDURAL_BATTERY) { LootItemFunctionType(ProceduralBatteryItem.Randomizer.CODEC) } val PROCEDURAL_EXOPACK_UPGRADE by registry.register("exopack_upgrade") { LootItemFunctionType(ProceduralExopackSlotUpgradeItem.Randomizer.CODEC) } + val MATTER_DUST by registry.register("matter_dust") { LootItemFunctionType(MatterDustItem.Randomizer.CODEC) } fun register(bus: IEventBus) { registry.register(bus)