parent
ea8adbf62d
commit
db5775c90b
@ -6,10 +6,12 @@ import net.minecraft.data.recipes.ShapelessRecipeBuilder
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.tags.Tag
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.IronBarsBlock
|
||||
import net.minecraftforge.client.model.generators.ModelFile
|
||||
import net.minecraftforge.common.Tags
|
||||
import net.minecraftforge.common.loot.LootTableIdCondition
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent
|
||||
import net.minecraftforge.fml.common.Mod
|
||||
import net.minecraftforge.forge.event.lifecycle.GatherDataEvent
|
||||
@ -22,11 +24,13 @@ import ru.dbotthepony.mc.otm.block.EnergyCounterBlock
|
||||
import ru.dbotthepony.mc.otm.block.BlockMatteryRotatable
|
||||
import ru.dbotthepony.mc.otm.block.PatternStorageBlock
|
||||
import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState
|
||||
import ru.dbotthepony.mc.otm.data.LootTableBasicAppender
|
||||
import ru.dbotthepony.mc.otm.datagen.blocks.BatteryBankProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.blocks.MatterBankProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.blocks.MatteryBlockStateProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.loot.LootModifiers
|
||||
import ru.dbotthepony.mc.otm.datagen.items.MatteryItemModelProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.loot.MatteryLootTableProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.loot.LootTables
|
||||
import ru.dbotthepony.mc.otm.datagen.loot.TileNbtCopy
|
||||
import ru.dbotthepony.mc.otm.datagen.models.BlockMatteryModelProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.recipes.MatteryRecipeProvider
|
||||
@ -40,8 +44,9 @@ object DataGen {
|
||||
private lateinit var blockModelProvider: BlockMatteryModelProvider
|
||||
private lateinit var itemModelProvider: MatteryItemModelProvider
|
||||
private lateinit var blockStateProvider: MatteryBlockStateProvider
|
||||
private lateinit var lootTableProvider: MatteryLootTableProvider
|
||||
private lateinit var lootTableProvider: LootTables
|
||||
private lateinit var recipeProvider: MatteryRecipeProvider
|
||||
private lateinit var lootModifier: LootModifiers
|
||||
|
||||
private fun decorativeCubeAll(vararg blocks: Block) {
|
||||
blockModelProvider.decorativeCubeAll(*blocks)
|
||||
@ -107,8 +112,9 @@ object DataGen {
|
||||
blockModelProvider = BlockMatteryModelProvider(event)
|
||||
blockStateProvider = MatteryBlockStateProvider(event)
|
||||
itemModelProvider = MatteryItemModelProvider(event)
|
||||
lootTableProvider = MatteryLootTableProvider(event.generator)
|
||||
lootTableProvider = LootTables(event.generator)
|
||||
recipeProvider = MatteryRecipeProvider(event.generator)
|
||||
lootModifier = LootModifiers(event.generator)
|
||||
|
||||
event.generator.addProvider(blockModelProvider)
|
||||
event.generator.addProvider(itemModelProvider)
|
||||
@ -118,6 +124,7 @@ object DataGen {
|
||||
event.generator.addProvider(MatterBankProvider(event))
|
||||
event.generator.addProvider(BatteryBankProvider(event))
|
||||
event.generator.addProvider(lootTableProvider)
|
||||
event.generator.addProvider(lootModifier)
|
||||
|
||||
decorativeCubeAll(*MBlocks.CRATES)
|
||||
decorativeCubeAll(MBlocks.CARBON_FIBRE_BLOCK)
|
||||
@ -431,5 +438,42 @@ object DataGen {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lootModifier.lambda {
|
||||
it.add("dungeon_pill", LootTableBasicAppender.Companion, LootTableBasicAppender(
|
||||
arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/simple_dungeon")).build()),
|
||||
ItemStack(MItems.PILL_ANDROID, 1) to 0.1,
|
||||
ItemStack(MItems.PILL_HEAL, 2) to 0.5,
|
||||
))
|
||||
|
||||
it.add("mineshaft_pill", LootTableBasicAppender.Companion, LootTableBasicAppender(
|
||||
arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/abandoned_mineshaft")).build()),
|
||||
ItemStack(MItems.PILL_ANDROID, 1) to 0.1,
|
||||
ItemStack(MItems.PILL_HEAL, 1) to 0.25,
|
||||
))
|
||||
|
||||
it.add("desert_pyramid_pill", LootTableBasicAppender.Companion, LootTableBasicAppender(
|
||||
arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/abandoned_mineshaft")).build()),
|
||||
ItemStack(MItems.PILL_ANDROID, 1) to 0.05,
|
||||
ItemStack(MItems.PILL_HEAL, 1) to 0.3,
|
||||
))
|
||||
|
||||
it.add("jungle_temple_pill", LootTableBasicAppender.Companion, LootTableBasicAppender(
|
||||
arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/jungle_temple")).build()),
|
||||
ItemStack(MItems.PILL_ANDROID, 1) to 0.1
|
||||
))
|
||||
|
||||
it.add("end_city_pill", LootTableBasicAppender.Companion, LootTableBasicAppender(
|
||||
arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/end_city_treasure")).build()),
|
||||
ItemStack(MItems.PILL_ANDROID, 1) to 0.1,
|
||||
ItemStack(MItems.PILL_HUMANE, 1) to 0.2,
|
||||
ItemStack(MItems.PILL_OBLIVION, 1) to 0.4,
|
||||
))
|
||||
|
||||
it.add("shipwreck_supply_pill", LootTableBasicAppender.Companion, LootTableBasicAppender(
|
||||
arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/shipwreck_supply")).build()),
|
||||
ItemStack(MItems.PILL_HUMANE, 1) to 0.3
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
package ru.dbotthepony.mc.otm.datagen.loot
|
||||
|
||||
import net.minecraft.data.DataGenerator
|
||||
import net.minecraftforge.common.data.GlobalLootModifierProvider
|
||||
import ru.dbotthepony.mc.otm.datagen.DataGen
|
||||
|
||||
class LootModifiers(generator: DataGenerator) : GlobalLootModifierProvider(generator, DataGen.MOD_ID) {
|
||||
private val lambdas = ArrayList<(LootModifiers) -> Unit>()
|
||||
|
||||
fun lambda(lambda: (LootModifiers) -> Unit) {
|
||||
lambdas.add(lambda)
|
||||
}
|
||||
|
||||
override fun start() {
|
||||
for (lambda in lambdas) {
|
||||
lambda.invoke(this)
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,6 @@ import net.minecraft.world.level.storage.loot.LootTable
|
||||
import net.minecraft.world.level.storage.loot.ValidationContext
|
||||
import net.minecraft.world.level.storage.loot.entries.LootItem
|
||||
import net.minecraft.world.level.storage.loot.functions.CopyNbtFunction
|
||||
import net.minecraft.world.level.storage.loot.functions.LootItemFunctions
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
|
||||
import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider
|
||||
@ -30,7 +29,7 @@ fun singleLootPool(f: (LootPool.Builder) -> Unit): LootTable.Builder {
|
||||
data class NbtCopy(val source: String, val destination: String, val strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE)
|
||||
data class TileNbtCopy(val source: String, val strategy: CopyNbtFunction.MergeStrategy = CopyNbtFunction.MergeStrategy.REPLACE)
|
||||
|
||||
class MatteryLootTableProvider(generator: DataGenerator) : LootTableProvider(generator) {
|
||||
class LootTables(generator: DataGenerator) : LootTableProvider(generator) {
|
||||
private val providers = ArrayList<LootTuple>()
|
||||
|
||||
override fun getTables(): List<LootTuple> {
|
@ -52,6 +52,10 @@ public final class OverdriveThatMatters {
|
||||
};
|
||||
|
||||
public OverdriveThatMatters() {
|
||||
if (INSTANCE != null) {
|
||||
throw new IllegalStateException("yo what the fuck");
|
||||
}
|
||||
|
||||
INSTANCE = this;
|
||||
|
||||
// Register the setup method for modloading
|
||||
@ -77,6 +81,7 @@ public final class OverdriveThatMatters {
|
||||
FMLJavaModLoadingContext.get().getModEventBus().register(AndroidResearch.class);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().register(MStats.class);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().register(MRecipes.class);
|
||||
FMLJavaModLoadingContext.get().getModEventBus().register(LootModifiers.INSTANCE);
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(DrivePool.INSTANCE);
|
||||
MinecraftForge.EVENT_BUS.register(PortableCondensationDriveItem.Companion);
|
||||
|
117
src/main/kotlin/ru/dbotthepony/mc/otm/data/LootTableAppender.kt
Normal file
117
src/main/kotlin/ru/dbotthepony/mc/otm/data/LootTableAppender.kt
Normal file
@ -0,0 +1,117 @@
|
||||
package ru.dbotthepony.mc.otm.data
|
||||
|
||||
import com.google.common.collect.ImmutableList
|
||||
import com.google.gson.JsonArray
|
||||
import com.google.gson.JsonObject
|
||||
import com.google.gson.JsonParseException
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.storage.loot.Deserializers
|
||||
import net.minecraft.world.level.storage.loot.LootContext
|
||||
import net.minecraft.world.level.storage.loot.LootPool
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
|
||||
import net.minecraftforge.common.loot.GlobalLootModifierSerializer
|
||||
import net.minecraftforge.common.loot.LootModifier
|
||||
import net.minecraftforge.registries.ForgeRegistries
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||
|
||||
class LootTableAppender(conditions: Array<out LootItemCondition>, private vararg val pools: LootPool) : LootModifier(conditions) {
|
||||
override fun doApply(generatedLoot: MutableList<ItemStack>, context: LootContext): MutableList<ItemStack> {
|
||||
pools.forEach { it.addRandomItems(generatedLoot::add, context) }
|
||||
return generatedLoot
|
||||
}
|
||||
|
||||
companion object : GlobalLootModifierSerializer<LootTableAppender>() {
|
||||
private val lootPoolGson = Deserializers.createLootTableSerializer().create()
|
||||
|
||||
override fun read(
|
||||
location: ResourceLocation,
|
||||
`object`: JsonObject,
|
||||
ailootcondition: Array<out LootItemCondition>
|
||||
): LootTableAppender {
|
||||
val pools = lootPoolGson.fromJson(`object`["pools"], Array<LootPool>::class.java) ?: throw JsonParseException("Invalid 'pools' entry")
|
||||
pools.forEach {
|
||||
@Suppress("UNNECESSARY_NOT_NULL_ASSERTION")
|
||||
it!!
|
||||
}
|
||||
return LootTableAppender(ailootcondition, *pools)
|
||||
}
|
||||
|
||||
override fun write(instance: LootTableAppender): JsonObject {
|
||||
val build = makeConditions(instance.conditions)
|
||||
build.add("pools", lootPoolGson.toJsonTree(instance.pools))
|
||||
return build
|
||||
}
|
||||
|
||||
init {
|
||||
registryName = ResourceLocation(OverdriveThatMatters.MOD_ID, "loot_appender")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class LootTableBasicAppender(conditions: Array<out LootItemCondition>, items: List<Pair<ItemStack, Double>>) : LootModifier(conditions) {
|
||||
private val items = ImmutableList.copyOf(items)
|
||||
|
||||
constructor(conditions: Array<out LootItemCondition>, vararg items: Pair<ItemStack, Double>) : this(conditions, items.toList())
|
||||
|
||||
override fun doApply(generatedLoot: MutableList<ItemStack>, context: LootContext): MutableList<ItemStack> {
|
||||
for ((item, chance) in items) {
|
||||
if (context.random.nextDouble() <= chance) {
|
||||
generatedLoot.add(item.copy())
|
||||
}
|
||||
}
|
||||
|
||||
return generatedLoot
|
||||
}
|
||||
|
||||
companion object : GlobalLootModifierSerializer<LootTableBasicAppender>() {
|
||||
override fun read(
|
||||
location: ResourceLocation,
|
||||
obj: JsonObject,
|
||||
ailootcondition: Array<out LootItemCondition>
|
||||
): LootTableBasicAppender {
|
||||
val entries = ArrayList<Pair<ItemStack, Double>>()
|
||||
|
||||
for (entry in obj["entries"].asJsonArray) {
|
||||
entry as JsonObject
|
||||
val item = entry["item"]?.asJsonObject ?: throw JsonParseException("Missing 'item'")
|
||||
val name = item["name"]?.asString ?: throw JsonParseException("Missing 'item.name'")
|
||||
val count = item["count"]?.asInt ?: throw JsonParseException("Missing 'item.count'")
|
||||
val chance = entry["chance"]?.asDouble ?: throw JsonParseException("Missing 'chance'")
|
||||
|
||||
val itemObj = ForgeRegistries.ITEMS.getValue(ResourceLocation(name)) ?: throw JsonParseException("Unknown item $name")
|
||||
val stack = ItemStack(itemObj, count)
|
||||
|
||||
entries.add(stack to chance)
|
||||
}
|
||||
|
||||
return LootTableBasicAppender(ailootcondition, ImmutableList.copyOf(entries))
|
||||
}
|
||||
|
||||
override fun write(instance: LootTableBasicAppender): JsonObject {
|
||||
val obj = makeConditions(instance.conditions)
|
||||
val listing = JsonArray()
|
||||
|
||||
for ((item, chance) in instance.items) {
|
||||
val entry = JsonObject()
|
||||
|
||||
entry.add("item", JsonObject().also {
|
||||
it.addProperty("name", item.item.registryName!!.toString())
|
||||
it.addProperty("count", item.count)
|
||||
})
|
||||
|
||||
entry.addProperty("chance", chance)
|
||||
|
||||
listing.add(entry)
|
||||
}
|
||||
|
||||
obj.add("entries", listing)
|
||||
|
||||
return obj
|
||||
}
|
||||
|
||||
init {
|
||||
registryName = ResourceLocation(OverdriveThatMatters.MOD_ID, "loot_appender_basic")
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package ru.dbotthepony.mc.otm.registry
|
||||
|
||||
import net.minecraftforge.common.loot.GlobalLootModifierSerializer
|
||||
import net.minecraftforge.event.RegistryEvent
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent
|
||||
import ru.dbotthepony.mc.otm.data.LootTableAppender
|
||||
import ru.dbotthepony.mc.otm.data.LootTableBasicAppender
|
||||
|
||||
object LootModifiers {
|
||||
@SubscribeEvent
|
||||
fun register(event: RegistryEvent.Register<GlobalLootModifierSerializer<*>>) {
|
||||
event.registry.register(LootTableAppender.Companion)
|
||||
event.registry.register(LootTableBasicAppender.Companion)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user