From b31ccdbae1d11cff2e925d308fdfc96ca841945c Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 2 Oct 2022 17:41:00 +0700 Subject: [PATCH] More, More and More Advancements --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 2 + .../datagen/advancements/AdvancementData.kt | 286 ++++++++++++++++++ .../advancements/AndroidAdvancementsData.kt | 115 ++++++- .../advancements/MachineAdvancementsData.kt | 85 ++++++ .../mc/otm/datagen/items/ItemModels.kt | 10 +- .../datagen/items/MatteryItemModelProvider.kt | 5 +- .../mc/otm/datagen/loot/LootTables.kt | 2 +- .../mc/otm/datagen/loot/LootTablesData.kt | 51 ++++ .../dbotthepony/mc/otm/datagen/tags/Tags.kt | 4 + .../mc/otm/datagen/tags/TagsProvider.kt | 2 + .../mc/otm/OverdriveThatMatters.java | 3 + .../android/feature/EnderTeleporterFeature.kt | 38 +++ .../android/feature/FallDampenersFeature.kt | 10 +- .../otm/android/feature/JumpBoostFeature.kt | 13 + .../android/feature/NanobotsArmorFeature.kt | 12 + ...erWithBattery.kt => AndroidPowerSource.kt} | 11 +- .../otm/capability/MatteryPlayerCapability.kt | 28 +- .../ru/dbotthepony/mc/otm/registry/MItems.kt | 9 + .../dbotthepony/mc/otm/registry/MRegistry.kt | 14 +- .../ru/dbotthepony/mc/otm/registry/Tags.kt | 4 + .../mc/otm/triggers/AndroidBatteryTrigger.kt | 44 +++ .../EnderTeleporterFallDeathTrigger.kt | 32 ++ .../otm/triggers/FallDampenersSaveTrigger.kt | 32 ++ .../mc/otm/triggers/NanobotsArmorTrigger.kt | 43 +++ .../otm/triggers/PhantomSpawnDeniedTrigger.kt | 32 ++ 25 files changed, 866 insertions(+), 21 deletions(-) create mode 100644 src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt rename src/main/kotlin/ru/dbotthepony/mc/otm/capability/{SynchronizedPowerWithBattery.kt => AndroidPowerSource.kt} (94%) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/triggers/PhantomSpawnDeniedTrigger.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 4bf2e6c8f..b66a2235c 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -31,6 +31,7 @@ import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.datagen.advancements.AdvancementProvider import ru.dbotthepony.mc.otm.datagen.advancements.addAdvancements import ru.dbotthepony.mc.otm.datagen.advancements.addAndroidAdvancements +import ru.dbotthepony.mc.otm.datagen.advancements.addMachineAdvancements import ru.dbotthepony.mc.otm.datagen.blocks.addBlockStates import ru.dbotthepony.mc.otm.datagen.blocks.addComplexBlockStates import ru.dbotthepony.mc.otm.datagen.items.addItemModels @@ -354,6 +355,7 @@ object DataGen { advancementProvider.exec { it, files -> addAdvancements(it, files, languageProvider) addAndroidAdvancements(it, files, languageProvider) + addMachineAdvancements(it, files, languageProvider) } addPlatePressRecipes(recipeProvider) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt index 0df09d2e2..964580ee1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AdvancementData.kt @@ -1,16 +1,20 @@ package ru.dbotthepony.mc.otm.datagen.advancements import net.minecraft.advancements.Advancement +import net.minecraft.advancements.AdvancementRewards import net.minecraft.advancements.FrameType import net.minecraft.advancements.RequirementsStrategy import net.minecraft.advancements.critereon.InventoryChangeTrigger +import net.minecraft.world.item.DyeColor import net.minecraft.world.item.ItemStack import net.minecraftforge.common.data.ExistingFileHelper import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems +import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.triggers.BlackHoleTrigger import java.util.function.Consumer @@ -32,7 +36,85 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist .addCriterion("has_tritanium_ingot", InventoryChangeTrigger.TriggerInstance.hasItems(MItems.TRITANIUM_INGOT)) .save(serializer, modLocation("regular/root"), existingFileHelper) + val crude = AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(MItems.BATTERY_CRUDE), + title = TranslatableComponent(translation.add("crude_battery", "Potato Power!")), + description = TranslatableComponent(translation.add("crude_battery.desc", "Put together a Crude Battery. Better hope for getter better power source soon")), + ) + .addCriterion("has_item", criterion(MItems.BATTERY_CRUDE)) + .save(serializer, modLocation("regular/crude_battery"), existingFileHelper) + + val normal = AdvancementBuilder() + .parent(crude) + .display( + itemStack = ItemStack(MItems.BATTERY_NORMAL), + title = TranslatableComponent(translation.add("normal_battery", "Power Storage")), + description = TranslatableComponent(translation.add("normal_battery.desc", "Put together an Ordinary Battery")), + ) + .addCriterion("has_item", criterion(MItems.BATTERY_NORMAL)) + .save(serializer, modLocation("regular/normal_battery"), existingFileHelper) + AdvancementBuilder() + .parent(normal) + .display( + itemStack = ItemStack(MItems.BATTERY_DENSE), + title = TranslatableComponent(translation.add("dense_battery", "Extra Space Battery")), + description = TranslatableComponent(translation.add("dense_battery.desc", "Put together a Dense Battery. Better not to expose it to fires!")), + ) + .addCriterion("has_item", criterion(MItems.BATTERY_DENSE)) + .save(serializer, modLocation("regular/dense_battery"), existingFileHelper) + + val capacitor = AdvancementBuilder() + .parent(normal) + .display( + itemStack = ItemStack(MItems.BATTERY_CAPACITOR), + title = TranslatableComponent(translation.add("capacitor_battery", "Supercapacitor")), + description = TranslatableComponent(translation.add("capacitor_battery.desc", "Put together a Capacitor Battery. Surely, you gonna need them somewhere...")), + ) + .addCriterion("has_item", criterion(MItems.BATTERY_CAPACITOR)) + .save(serializer, modLocation("regular/capacitor_battery"), existingFileHelper) + + AdvancementBuilder() + .parent(capacitor) + .display( + itemStack = ItemStack(MItems.ENERGY_SWORD), + title = TranslatableComponent(translation.add("energy_sword", "Self Sharpening Blade")), + description = TranslatableComponent(translation.add("energy_sword.desc", "Wield an Energy Sword, a melee weapon intended to slice Creepers into creep-cakes. Rational folks won't attempt to slice their Android fellows...")), + frameType = FrameType.GOAL + ) + .addCriterion("has_item", criterion(MItems.ENERGY_SWORD)) + .save(serializer, modLocation("regular/energy_sword"), existingFileHelper) + + AdvancementBuilder() + .parent(normal) + .display( + itemStack = ItemStack(MItems.QUANTUM_BATTERY), + title = TranslatableComponent(translation.add("quantum_battery", "Power, in Superposition")), + description = TranslatableComponent(translation.add("quantum_battery.desc", "Put together a Quantum Battery, powered by Ender technologies")), + frameType = FrameType.GOAL + ) + .rewards(AdvancementRewards.Builder.experience(50)) + .requirements(RequirementsStrategy.OR) + .addCriterion("has_item0", criterion(MItems.QUANTUM_BATTERY)) + .addCriterion("has_item1", criterion(MItems.QUANTUM_CAPACITOR)) + .save(serializer, modLocation("regular/quantum_battery"), existingFileHelper) + + AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(MItems.ZPM_BATTERY), + title = TranslatableComponent(translation.add("zpm_battery", "Pocket Universe, as Power Source")), + description = TranslatableComponent(translation.add("zpm_battery.desc", "Find Zero Point Module, something from different universe of ours, created using technologies lost in time in all possible multiverses")), + frameType = FrameType.CHALLENGE, + hidden = true + ) + .rewards(AdvancementRewards.Builder.experience(800)) + .addCriterion("has_item", criterion(MItems.ZPM_BATTERY)) + .save(serializer, modLocation("regular/zpm_battery"), existingFileHelper) + + val blackhole = AdvancementBuilder() .parent(root) .display( itemStack = ItemStack(MItems.BLACK_HOLE), @@ -42,6 +124,36 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist .addCriterion("pulled_by_black_hole", BlackHoleTrigger.Instance) .save(serializer, modLocation("regular/black_hole"), existingFileHelper) + AdvancementBuilder() + .parent(blackhole) + .display( + itemStack = ItemStack(MItems.BLACK_HOLE_SCANNER), + title = TranslatableComponent(translation.add("black_hole_scanner", "Determining the Mass")), + description = TranslatableComponent(translation.add("black_hole_scanner.desc", "Craft the Singularity Scanner, to determine mass of Singularity from safe distance")), + ) + .addCriterion("has_item", criterion(MItems.BLACK_HOLE_SCANNER)) + .save(serializer, modLocation("regular/black_hole_scanner"), existingFileHelper) + + AdvancementBuilder() + .parent(blackhole) + .display( + itemStack = ItemStack(MItems.GRAVITATION_STABILIZER), + title = TranslatableComponent(translation.add("stabilizer", "Reducing the Impact")), + description = TranslatableComponent(translation.add("stabilizer.desc", "Put together a device that defy physical laws and also defy gravity of Singularities. Better hope it does not cause any side effects")), + ) + .addCriterion("has_item", criterion(MItems.GRAVITATION_STABILIZER)) + .save(serializer, modLocation("regular/stabilizer"), existingFileHelper) + + AdvancementBuilder() + .parent(blackhole) + .display( + itemStack = ItemStack(MItems.PORTABLE_GRAVITATION_STABILIZER), + title = TranslatableComponent(translation.add("portable_stabilizer", "Local Gravity Field")), + description = TranslatableComponent(translation.add("portable_stabilizer.desc", "Protect yourself from gravitational effect of Singularity using Portable Gravitation Stabilizer")), + ) + .addCriterion("has_item", criterion(MItems.PORTABLE_GRAVITATION_STABILIZER)) + .save(serializer, modLocation("regular/portable_stabilizer"), existingFileHelper) + val ore = AdvancementBuilder() .parent(root) .requirements(RequirementsStrategy.OR) @@ -85,6 +197,179 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist .addCriterion("hoe", criterion(MItems.TRITANIUM_HOE)) .save(serializer, modLocation("regular/hoe"), existingFileHelper) + val plate = AdvancementBuilder() + .parent(ingot) + .display( + itemStack = ItemStack(MItems.TRITANIUM_PLATE), + title = TranslatableComponent(translation.add("plate", "Hard Plating")), + description = TranslatableComponent(translation.add("plate.desc", "Roll down some Tritanium using Plate Press")) + ) + .addCriterion("has_item", criterion(MItemTags.TRITANIUM_PLATES)) + .save(serializer, modLocation("regular/plate"), existingFileHelper) + + AdvancementBuilder() + .parent(plate) + .display( + itemStack = ItemStack(MItems.TRITANIUM_CHESTPLATE), + title = TranslatableComponent(translation.add("armor", "Composite Armor")), + description = TranslatableComponent(translation.add("armor.desc", "Bend some Tritanium plates into simple yet sturdy armor")) + ) + .requirements(RequirementsStrategy.OR) + .addCriterion("has_item0", criterion(MItems.TRITANIUM_HELMET)) + .addCriterion("has_item1", criterion(MItems.TRITANIUM_CHESTPLATE)) + .addCriterion("has_item2", criterion(MItems.TRITANIUM_PANTS)) + .addCriterion("has_item3", criterion(MItems.TRITANIUM_BOOTS)) + .save(serializer, modLocation("regular/armor"), existingFileHelper) + + val glass = AdvancementBuilder() + .parent(plate) + .display( + itemStack = ItemStack(MRegistry.INDUSTRIAL_GLASS.item), + title = TranslatableComponent(translation.add("industrial_glass", "Extra Hard Glass")), + description = TranslatableComponent(translation.add("industrial_glass.desc", "Manual says it should be bulletproof.")) + ) + .requirements(RequirementsStrategy.OR) + .also { advancement -> + MRegistry.INDUSTRIAL_GLASS.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/industrial_glass"), existingFileHelper) + + AdvancementBuilder() + .parent(glass) + .display( + itemStack = ItemStack(MRegistry.INDUSTRIAL_GLASS.getItem(DyeColor.GREEN)), + title = TranslatableComponent(translation.add("industrial_glass2", "Glass-tacular Artist")), + description = TranslatableComponent(translation.add("industrial_glass2.desc", "Paint Industrial Glass all possible colors")) + ) + .requirements(RequirementsStrategy.AND) + .also { advancement -> + MRegistry.INDUSTRIAL_GLASS.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/industrial_glass2"), existingFileHelper) + + val cargoCrate = AdvancementBuilder() + .parent(plate) + .display( + itemStack = ItemStack(MRegistry.CARGO_CRATES.item), + title = TranslatableComponent(translation.add("cargo_crate", "Sturdy Item Stash")), + description = TranslatableComponent(translation.add("cargo_crate.desc", "Cargo Crates, like Double Chest, but Single.")) + ) + .requirements(RequirementsStrategy.OR) + .also { advancement -> + MRegistry.CARGO_CRATES.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/cargo_crate"), existingFileHelper) + + val cargoCrateInMinecart = AdvancementBuilder() + .parent(cargoCrate) + .display( + itemStack = ItemStack(MItems.CARGO_CRATE_MINECARTS[null]!!), + title = TranslatableComponent(translation.add("cargo_crate_minecart", "Crate On a Rail")), + description = TranslatableComponent(translation.add("cargo_crate_minecart.desc", "Drop a Cargo Crate onto Minecart and see how it goes")) + ) + .requirements(RequirementsStrategy.OR) + .also { advancement -> + MItems.CARGO_CRATE_MINECARTS.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/cargo_crate_minecart"), existingFileHelper) + + AdvancementBuilder() + .parent(cargoCrateInMinecart) + .display( + itemStack = ItemStack(MItems.CARGO_CRATE_MINECARTS[DyeColor.GREEN]!!), + title = TranslatableComponent(translation.add("cargo_crate_minecart2", "A Motley Train")), + description = TranslatableComponent(translation.add("cargo_crate_minecart2.desc", "Have all color variants of Minecarts with Cargo Crates")), + frameType = FrameType.GOAL + ) + .requirements(RequirementsStrategy.AND) + .also { advancement -> + MItems.CARGO_CRATE_MINECARTS.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/cargo_crate_minecart2"), existingFileHelper) + + AdvancementBuilder() + .parent(cargoCrate) + .display( + itemStack = ItemStack(MRegistry.CARGO_CRATES.item), + title = TranslatableComponent(translation.add("cargo_crate2", "Colorful Warehouse")), + description = TranslatableComponent(translation.add("cargo_crate2.desc", "Craft all color variants of Cargo Crates")), + frameType = FrameType.GOAL + ) + .requirements(RequirementsStrategy.AND) + .also { advancement -> + MRegistry.CARGO_CRATES.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/cargo_crate2"), existingFileHelper) + + val tritaniumBlock = AdvancementBuilder() + .parent(plate) + .display( + itemStack = ItemStack(MRegistry.TRITANIUM_BLOCK.item), + title = TranslatableComponent(translation.add("tritanium_block", "Cold, Impregnable Wall")), + description = TranslatableComponent(translation.add("tritanium_block.desc", "Coat stones in Tritanium Plates, a cheap yet incredibly sturdy material")) + ) + .requirements(RequirementsStrategy.OR) + .also { advancement -> + MRegistry.TRITANIUM_BLOCK.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + MRegistry.TRITANIUM_STRIPED_BLOCK.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/tritanium_block"), existingFileHelper) + + AdvancementBuilder() + .parent(tritaniumBlock) + .display( + itemStack = ItemStack(MItems.TRITANIUM_STRIPED_BLOCK), + title = TranslatableComponent(translation.add("striped_tritanium_block", "Old Fashion Color Touch")), + description = TranslatableComponent(translation.add("striped_tritanium_block.desc", "Pale Blue coat with Yellow stripe, I bet you know whose design is this")) + ) + .addCriterion("has_item", criterion(MItems.TRITANIUM_STRIPED_BLOCK)) + .save(serializer, modLocation("regular/striped_tritanium_block"), existingFileHelper) + + val colorTritaniumBlock = AdvancementBuilder() + .parent(tritaniumBlock) + .display( + itemStack = ItemStack(MRegistry.TRITANIUM_BLOCK.getItem(DyeColor.GREEN)), + title = TranslatableComponent(translation.add("tritanium_block2", "Colorful Fortress")), + description = TranslatableComponent(translation.add("tritanium_block2.desc", "Put some paint over Tritanium Block to make it look fabulous")) + ) + .requirements(RequirementsStrategy.OR) + .also { advancement -> + MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + MRegistry.TRITANIUM_STRIPED_BLOCK.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/tritanium_block2"), existingFileHelper) + + val colorfulTritaniumBlock = AdvancementBuilder() + .parent(colorTritaniumBlock) + .display( + itemStack = ItemStack(MRegistry.TRITANIUM_BLOCK.getItem(DyeColor.BLACK)), + title = TranslatableComponent(translation.add("tritanium_block3", "Paint Me A Castle")), + description = TranslatableComponent(translation.add("tritanium_block3.desc", "Craft all color variants of Tritanium Blocks")), + frameType = FrameType.GOAL + ) + .rewards(AdvancementRewards.Builder.loot(modLocation("tritanium_block3")).addExperience(100)) + .requirements(RequirementsStrategy.AND) + .also { advancement -> + MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/tritanium_block3"), existingFileHelper) + + AdvancementBuilder() + .parent(colorfulTritaniumBlock) + .display( + itemStack = ItemStack(MRegistry.TRITANIUM_STRIPED_BLOCK.getItem(DyeColor.BLACK, DyeColor.WHITE)), + title = TranslatableComponent(translation.add("tritanium_block4", "All The Colors")), + description = TranslatableComponent(translation.add("tritanium_block4.desc", "Craft ALL color variants of Tritanium Blocks including striped ones")), + frameType = FrameType.CHALLENGE + ) + .rewards(AdvancementRewards.Builder.loot(modLocation("tritanium_block4")).addExperience(400)) + .requirements(RequirementsStrategy.AND) + .also { advancement -> + MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + MRegistry.TRITANIUM_STRIPED_BLOCK.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) } + } + .save(serializer, modLocation("regular/tritanium_block4"), existingFileHelper) + val pill = AdvancementBuilder() .parent(root) .display( @@ -108,6 +393,7 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist frameType = FrameType.CHALLENGE, hidden = true ) + .rewards(AdvancementRewards.Builder.experience(200)) .requirements(RequirementsStrategy.AND) .addCriterion("pill1", criterion(MItems.PILL_ANDROID)) .addCriterion("pill2", criterion(MItems.PILL_HEAL)) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt index 6ff720a41..8103ac23a 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/AndroidAdvancementsData.kt @@ -1,12 +1,15 @@ package ru.dbotthepony.mc.otm.datagen.advancements import net.minecraft.advancements.Advancement +import net.minecraft.advancements.AdvancementRewards import net.minecraft.advancements.FrameType import net.minecraft.advancements.RequirementsStrategy import net.minecraft.advancements.critereon.DamagePredicate import net.minecraft.advancements.critereon.DamageSourcePredicate import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.InventoryChangeTrigger +import net.minecraft.advancements.critereon.ItemPredicate +import net.minecraft.advancements.critereon.MinMaxBounds.Doubles import net.minecraft.advancements.critereon.PlayerHurtEntityTrigger import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.EntityType @@ -20,11 +23,16 @@ import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MNames +import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidDeathTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidSleepTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidTrigger import ru.dbotthepony.mc.otm.triggers.BecomeHumaneTrigger +import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger +import ru.dbotthepony.mc.otm.triggers.FallDampenersSaveTrigger +import ru.dbotthepony.mc.otm.triggers.NanobotsArmorTrigger +import ru.dbotthepony.mc.otm.triggers.PhantomSpawnDeniedTrigger import ru.dbotthepony.mc.otm.triggers.ShockwaveDamageMobTrigger import ru.dbotthepony.mc.otm.triggers.ShockwaveTrigger import java.util.function.Consumer @@ -36,7 +44,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper .display( itemStack = ItemStack(MItems.PILL_ANDROID), title = TranslatableComponent(translation.add("root", "Androids and Humans")), - description = TranslatableComponent(translation.add("root.desc", "Can you make out who is cruel machine and who can make love?")), + description = TranslatableComponent(translation.add("root.desc", "Can you make out who is cruel machine and who can love?")), showToast = false, announceChat = false, background = modLocation("textures/block/decorative/metal_beam_top.png") @@ -44,6 +52,32 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper .addCriterion("became_android", BecomeAndroidTrigger.Instance) .save(serializer, modLocation("android/root"), existingFileHelper) + AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(MItems.ZPM_BATTERY), + title = TranslatableComponent(translation.add("zpm", "Fully Autonomous")), + description = TranslatableComponent(translation.add("zpm.desc", "Use Zero Point Module as internal battery power source. Only time is your enemy now")), + hidden = true, + frameType = FrameType.CHALLENGE + ) + .addCriterion("item", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build())) + .save(serializer, modLocation("android/zpm"), existingFileHelper) + + AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(MItems.QUANTUM_BATTERY), + title = TranslatableComponent(translation.add("quantum_battery", "Wireless Charged")), + description = TranslatableComponent(translation.add("quantum_battery.desc", "Use Quantum Battery as internal battery power source, might as well have Fission Reactor charge other side of the link")), + hidden = true, + frameType = FrameType.GOAL + ) + .requirements(RequirementsStrategy.OR) + .addCriterion("item0", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.QUANTUM_BATTERY).build())) + .addCriterion("item1", AndroidBatteryTrigger.Instance(ItemPredicate.Builder.item().of(MItems.QUANTUM_CAPACITOR).build())) + .save(serializer, modLocation("android/quantum_battery"), existingFileHelper) + AdvancementBuilder() .parent(root) .display( @@ -78,6 +112,37 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper .addCriterion("become_humane", BecomeHumaneTrigger.Instance) .save(serializer, modLocation("android/become_humane"), existingFileHelper) + val phantoms = AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(Items.PHANTOM_MEMBRANE), + title = TranslatableComponent(translation.add("phantom_spawn_denied", "Insomnia Immune")), + description = TranslatableComponent(translation.add("phantom_spawn_denied.desc", "Have Phantoms not come after you because you are not someone who needs to sleep")), + hidden = true + ) + .addCriterion("phantom_spawn_denied", PhantomSpawnDeniedTrigger.Instance) + .save(serializer, modLocation("android/phantom_spawn_denied"), existingFileHelper) + + val attractor = AdvancementBuilder() + .parent(phantoms) + .display( + itemStack = ItemStack(MItems.PHANTOM_ATTRACTOR), + title = TranslatableComponent(translation.add("phantom_attractor", "Eversleeping Decoy")), + description = TranslatableComponent(translation.add("phantom_attractor.desc", "Put together a Phantom Attractor, to be able to fight Phantoms as Android again")), + ) + .addCriterion("has_item", criterion(MItems.PHANTOM_ATTRACTOR)) + .save(serializer, modLocation("regular/phantom_attractor"), existingFileHelper) + + AdvancementBuilder() + .parent(attractor) + .display( + itemStack = ItemStack(MItems.PHANTOM_ATTRACTOR), + title = TranslatableComponent(translation.add("phantom_attractor_research", "Deception of Phantoms")), + description = TranslatableComponent(translation.add("phantom_attractor_research.desc", "Research into how to attract Phantoms the same way as the ones who need to sleep")), + ) + .addCriterion("researched", AndroidResearchTrigger.Instance(modLocation(MNames.PHANTOM_ATTRACTOR))) + .save(serializer, modLocation("regular/phantom_attractor_research"), existingFileHelper) + val researchAnything = AdvancementBuilder() .parent(root) .display( @@ -119,6 +184,53 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper .addCriterion("nanobots", AndroidResearchTrigger.Instance(modLocation(MNames.NANOBOTS))) .save(serializer, modLocation("android/research_nanobots"), existingFileHelper) + val shielding = AdvancementBuilder() + .parent(nanobots) + .display( + itemStack = ItemStack(Items.SHIELD), + title = TranslatableComponent(translation.add("nanobots_armor_deflect", "Like a Concrete Wall")), + description = TranslatableComponent(translation.add("nanobots_armor_deflect.desc", "Have Nanobots absorb more than 5 hears of damage while you are left still functioning")), + hidden = true, + frameType = FrameType.GOAL + ) + .addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(10.0))) + .save(serializer, modLocation("android/nanobots_armor_deflect"), existingFileHelper) + + AdvancementBuilder() + .parent(shielding) + .display( + itemStack = ItemStack(Items.SHIELD), + title = TranslatableComponent(translation.add("nanobots_armor_deflect2", "Unstoppable Force vs Immovable Object")), + description = TranslatableComponent(translation.add("nanobots_armor_deflect2.desc", "Have Nanobots absorb more than 10 hears of damage while you are left still functioning")), + hidden = true, + frameType = FrameType.CHALLENGE + ) + .addCriterion("damage", NanobotsArmorTrigger.Instance(Doubles.atLeast(20.0))) + .save(serializer, modLocation("android/nanobots_armor_deflect2"), existingFileHelper) + + AdvancementBuilder() + .parent(researchAnything) + .display( + itemStack = ItemStack(Items.FEATHER), + title = TranslatableComponent(translation.add("fall_dampeners_save", "Lucky Landing")), + description = TranslatableComponent(translation.add("fall_dampeners_save.desc", "Survive fall that would have otherwise be fatal without Fall Dampeners research")), + frameType = FrameType.GOAL + ) + .addCriterion("saved", FallDampenersSaveTrigger.Instance) + .save(serializer, modLocation("android/fall_dampeners_save"), existingFileHelper) + + AdvancementBuilder() + .parent(researchAnything) + .display( + itemStack = ItemStack(Items.SKELETON_SKULL), + title = TranslatableComponent(translation.add("ender_teleport_fall_death", "Navigation Error")), + description = TranslatableComponent(translation.add("ender_teleport_fall_death.desc", "Fall to your death moments after Teleporting")), + frameType = FrameType.GOAL, + hidden = true + ) + .addCriterion("death", EnderTeleporterFallDeathTrigger.Instance) + .save(serializer, modLocation("android/ender_teleport_fall_death"), existingFileHelper) + val regen = AdvancementBuilder() .parent(nanobots) .display( @@ -151,6 +263,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper description = TranslatableComponent(translation.add("research_all.desc", "Research everything (that don't block any other research)")), frameType = FrameType.CHALLENGE ) + .rewards(AdvancementRewards.Builder.experience(400).addLootTable(modLocation("research_all_android"))) .also { advancement -> DataGen.researchProvider.generatedView.stream() .filter { it.allBlockedBy.isEmpty() && it.allBlocking.isEmpty() } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt new file mode 100644 index 000000000..0de0a3756 --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt @@ -0,0 +1,85 @@ +package ru.dbotthepony.mc.otm.datagen.advancements + +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.RequirementsStrategy +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraftforge.common.data.ExistingFileHelper +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.core.registryName +import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider +import ru.dbotthepony.mc.otm.datagen.modLocation +import ru.dbotthepony.mc.otm.registry.MItemTags +import ru.dbotthepony.mc.otm.registry.MItems +import java.util.function.Consumer + +private data class CraftEntry(val item: Item, val englishName: String, val englishSuffix: String? = null) + +fun addMachineAdvancements(serializer: Consumer, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider) { + val translation = lang.english.Prepended("otm.advancements.machine") + + val root = AdvancementBuilder() + .requirements(RequirementsStrategy.OR) + .display( + itemStack = ItemStack(MItems.CHEMICAL_GENERATOR), + title = TranslatableComponent(translation.add("root", "Tritanium Empowered Machinery")), + description = TranslatableComponent(translation.add("root.desc", "Do not drop on anything if you want the latter preserved intact")), + showToast = false, + announceChat = false, + background = modLocation("textures/block/decorative/floor_tiles_gray.png") + ) + .addCriterion("has_machine", criterion(MItemTags.MACHINES)) + .addCriterion("has_tritanium_ingot", criterion(MItemTags.TRITANIUM_INGOTS)) + .addCriterion("has_tritanium_plate_somehow", criterion(MItemTags.TRITANIUM_PLATES)) + .save(serializer, modLocation("machines/root"), existingFileHelper) + + val chem = AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(MItems.CHEMICAL_GENERATOR), + title = TranslatableComponent(translation.add("chemical_generator", "Burning the Organics")), + description = TranslatableComponent(translation.add("chemical_generator.desc", "Craft a Chemical Generator, better to put it outside")), + ) + .addCriterion("has_machine", criterion(MItems.CHEMICAL_GENERATOR)) + .save(serializer, modLocation("machines/chemical_generator"), existingFileHelper) + + val press = AdvancementBuilder() + .parent(chem) + .display( + itemStack = ItemStack(MItems.PLATE_PRESS), + title = TranslatableComponent(translation.add("plate_press", "Bending the Material")), + description = TranslatableComponent(translation.add("plate_press.desc", "Craft a Plate Press, avoid having limbs inside during operation")), + ) + .addCriterion("has_machine", criterion(MItems.PLATE_PRESS)) + .save(serializer, modLocation("machines/plate_press"), existingFileHelper) + + val entries = listOf( + CraftEntry(MItems.MATTER_SCANNER, "Scanning Things that Matter"), + CraftEntry(MItems.PATTERN_STORAGE, "Digital Knowledge Library"), + CraftEntry(MItems.MATTER_DECOMPOSER, "Decaying the Atoms", "Keep limbs outside of working chamber at all times"), + CraftEntry(MItems.MATTER_PANEL, "Indexing the Library"), + CraftEntry(MItems.MATTER_REPLICATOR, "Local Bakery", "Now let's bake perfect bread"), + CraftEntry(MItems.MATTER_BOTTLER, "Transfusing Pure Matter", "For those who loved to play with water in childhood"), + CraftEntry(MItems.MATTER_RECYCLER, "Refine and Redefine", "This is what waste recycling should look like"), + CraftEntry(MItems.MATTER_CAPACITOR_BANK, "Modular Matter Tank"), + + CraftEntry(MItems.ENERGY_COUNTER, "Visualize Power Burn"), + CraftEntry(MItems.BATTERY_BANK, "Modular Power Tank", "By all means avoid urge to hammer incompatible batteries onto power bus."), + ) + + val built = mutableMapOf() + + for (entry in entries) { + val path = entry.item.registryName!!.path + + built[entry.item] = AdvancementBuilder() + .parent(press) + .display( + itemStack = ItemStack(entry.item), + title = TranslatableComponent(translation.add(path, entry.englishName)), + description = TranslatableComponent(translation.add("$path.desc", "Craft a %s%s"), entry.item.description, if (entry.englishSuffix != null) ". " + entry.englishSuffix else ""), + ) + .addCriterion("has_machine", criterion(entry.item)) + .save(serializer, modLocation("machines/$path"), existingFileHelper) + } +} diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index e875bf76b..356be1199 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.items import net.minecraft.resources.ResourceLocation import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.datagen.DataGen +import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry @@ -11,7 +12,14 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.block(MItems.BATTERY_BANK) provider.block(MItems.MATTER_CAPACITOR_BANK) provider.block(MItems.PATTERN_STORAGE) - provider.block(MItems.BLACK_HOLE) + + provider.exec { + provider + .withExistingParent(MItems.BLACK_HOLE.registryName!!.path, MatteryItemModelProvider.GENERATED) + .texture("layer0", modLocation("item/" + MItems.BLACK_HOLE.registryName!!.path)) + .renderType("translucent") + } + provider.block(MItems.CARBON_FIBRE_BLOCK) provider.block(MItems.DEEPSLATE_TRITANIUM_ORE) provider.block(MItems.TRITANIUM_ORE) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt index 43e92fd75..985082d3d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt @@ -40,6 +40,7 @@ class MatteryItemModelProvider(event: GatherDataEvent) : ItemModelProvider(event withExistingParent(item.registryName!!.path, HANDHELD).texture("layer0", texture) } + fun generated(item: Item) = generated(item, ResourceLocation(DataGen.MOD_ID, "item/${item.registryName!!.path}")) fun generated(vararg items: Item) = items.forEach { generated(it, ResourceLocation(DataGen.MOD_ID, "item/${it.registryName!!.path}")) } fun KOT(vararg items: Item) = items.forEach { generated(it, ResourceLocation(DataGen.MOD_ID, "block/ph_kitty")) } fun generated(items: Collection) = items.forEach { generated(it, ResourceLocation(DataGen.MOD_ID, "item/${it.registryName!!.path}")) } @@ -77,8 +78,8 @@ class MatteryItemModelProvider(event: GatherDataEvent) : ItemModelProvider(event } companion object { - private val GENERATED = ResourceLocation("minecraft", "item/generated") - private val HANDHELD = ResourceLocation("minecraft", "item/handheld") + val GENERATED = ResourceLocation("minecraft", "item/generated") + val HANDHELD = ResourceLocation("minecraft", "item/handheld") private val LOGGER = LogManager.getLogger() } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt index d70701809..d77578c5f 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootTables.kt @@ -78,7 +78,7 @@ class LootTables(generator: DataGenerator) : LootTableProvider(generator) { } } - fun provider(provider: LootTableCallback, context: LootContextParamSet) { + fun provider(context: LootContextParamSet, provider: LootTableCallback) { providers.add(Pair(Supplier { provider }, context)) } 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 6d0446ba9..ca90987db 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 @@ -2,10 +2,15 @@ package ru.dbotthepony.mc.otm.datagen.loot import net.minecraft.advancements.critereon.StatePropertiesPredicate import net.minecraft.data.loot.BlockLoot +import net.minecraft.world.item.DyeColor +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.block.state.properties.DoubleBlockHalf +import net.minecraft.world.level.storage.loot.LootContext import net.minecraft.world.level.storage.loot.entries.LootItem import net.minecraft.world.level.storage.loot.entries.LootPoolEntries +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition import ru.dbotthepony.mc.otm.block.entity.ChemicalGeneratorBlockEntity import ru.dbotthepony.mc.otm.block.entity.EnergyCounterBlockEntity @@ -16,7 +21,9 @@ import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity.Companion.REDSTONE_ import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.AbstractStorageImportExport.Companion.FILTER_KEY import ru.dbotthepony.mc.otm.block.entity.storage.StoragePowerSupplierBlockEntity +import ru.dbotthepony.mc.otm.datagen.modLocation import ru.dbotthepony.mc.otm.registry.MBlocks +import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry fun addLootTables(lootTables: LootTables) { @@ -55,6 +62,50 @@ fun addLootTables(lootTables: LootTables) { .hasProperty(BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER)))) } + lootTables.provider(LootContextParamSets.ADVANCEMENT_ENTITY) { + it.accept(modLocation("research_all_android"), singleLootPool { + it.add(LootItem.lootTableItem(MItems.EXOSUIT_INVENTORY_UPGRADE_HUGE)) + }) + + it.accept(modLocation("tritanium_block3"), singleLootPool { + it.add(LootItem.lootTableItem(Items.WHITE_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.ORANGE_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.MAGENTA_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.YELLOW_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.LIME_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.PINK_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.GRAY_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.CYAN_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.PURPLE_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.BLUE_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.BROWN_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.GREEN_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.RED_DYE).setQuality(8)) + it.add(LootItem.lootTableItem(Items.BLACK_DYE).setQuality(8)) + }) + + it.accept(modLocation("tritanium_block4"), singleLootPool { + it.add(LootItem.lootTableItem(Items.WHITE_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.ORANGE_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.MAGENTA_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.LIGHT_BLUE_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.YELLOW_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.LIME_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.PINK_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.GRAY_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.LIGHT_GRAY_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.CYAN_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.PURPLE_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.BLUE_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.BROWN_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.GREEN_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.RED_DYE).setQuality(64)) + it.add(LootItem.lootTableItem(Items.BLACK_DYE).setQuality(64)) + }) + } + lootTables.tile(MBlocks.ENERGY_SERVO) lootTables.tile(MBlocks.ENERGY_COUNTER, diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt index d3d30ab5f..86ae43b45 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt @@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.datagen.tags import net.minecraft.tags.BlockTags import net.minecraft.tags.ItemTags import net.minecraft.world.effect.MobEffects +import net.minecraft.world.item.BlockItem import net.minecraft.world.item.DyeColor import net.minecraft.world.item.Items import net.minecraft.world.item.Tiers @@ -70,6 +71,9 @@ fun addTags(tagsProvider: TagsProvider) { tagsProvider.items.appender(ItemTags.TRAPDOORS).add(MItems.TRITANIUM_TRAPDOOR) tagsProvider.blocks.appender(BlockTags.TRAPDOORS).add(MBlocks.TRITANIUM_TRAPDOOR) + tagsProvider.items.appender(MItemTags.MACHINES).add(MItems.MACHINES) + tagsProvider.blocks.appender(MBlockTags.MACHINES).add(MItems.MACHINES.stream().map { it as? BlockItem }.filter { it != null }.map { it!!.block }) + tagsProvider.requiresPickaxe(listOf( MBlocks.ANDROID_STATION, MBlocks.BATTERY_BANK, diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt index 2e4c79fc8..61740050e 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt @@ -14,6 +14,7 @@ import net.minecraft.world.level.gameevent.GameEvent import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.datagen.DataGen +import java.util.stream.Stream import net.minecraft.data.tags.TagsProvider as MinecraftTagsProvider interface MTagAppender { @@ -27,6 +28,7 @@ interface MTagAppender { } fun add(values: Collection): TagsProvider + fun add(values: Stream): TagsProvider = add(values.toList()) fun addSafe(values: Collection): Boolean { var any = false diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 82c6c6fd9..6860ef25e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -17,6 +17,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import ru.dbotthepony.mc.otm.android.AndroidResearchManager; +import ru.dbotthepony.mc.otm.android.feature.EnderTeleporterFeature; import ru.dbotthepony.mc.otm.android.feature.NanobotsArmorFeature; import ru.dbotthepony.mc.otm.block.entity.SynchronizedBlockEntity; import ru.dbotthepony.mc.otm.block.entity.blackhole.ExplosionQueue; @@ -143,6 +144,8 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, SynchronizedBlockEntity.Companion::onForget); EVENT_BUS.addListener(EventPriority.NORMAL, SynchronizedBlockEntity.Companion::playerDisconnected); + EVENT_BUS.addListener(EventPriority.NORMAL, EnderTeleporterFeature.Companion::onEntityDeath); + MatteryPlayerNetworkChannel.INSTANCE.register(); MenuNetworkChannel.INSTANCE.register(); WeaponNetworkChannel.INSTANCE.register(); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt index 54f95dcb4..6dc6d6ceb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt @@ -7,20 +7,25 @@ import com.mojang.math.Vector3f import net.minecraft.ChatFormatting import net.minecraft.core.BlockPos import net.minecraft.core.Direction +import net.minecraft.nbt.CompoundTag import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer import net.minecraft.world.level.ClipContext import net.minecraft.world.level.block.Block import net.minecraft.world.phys.BlockHitResult import net.minecraft.world.phys.HitResult import net.minecraft.world.phys.shapes.CollisionContext import net.minecraftforge.client.event.RenderLevelStageEvent +import net.minecraftforge.event.entity.living.LivingDeathEvent import org.lwjgl.opengl.GL11.GL_LESS +import ru.dbotthepony.mc.otm.NULLABLE_MINECRAFT_SERVER import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.ServerConfig import ru.dbotthepony.mc.otm.android.AndroidActiveFeature import ru.dbotthepony.mc.otm.android.AndroidResearchManager import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact +import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.client.render.ResearchIcons import ru.dbotthepony.mc.otm.client.render.element import ru.dbotthepony.mc.otm.core.Vector @@ -31,19 +36,34 @@ import ru.dbotthepony.mc.otm.core.component3 import ru.dbotthepony.mc.otm.core.formatPower import ru.dbotthepony.mc.otm.core.genericPositions import ru.dbotthepony.mc.otm.core.plus +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.shortestDistanceBetween import ru.dbotthepony.mc.otm.core.times import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.MNames +import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger import kotlin.math.sin class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiveFeature(AndroidFeatures.ENDER_TELEPORTER, capability) { var cooldown by synchronizer.int() + var lastTeleport = 0 + private set private fun canUse(): Boolean { return cooldown <= 0 && android.androidEnergy.extractEnergyInnerExact(ServerConfig.EnderTeleporter.ENERGY_COST, true).isPositive } + override fun serializeNBT(): CompoundTag { + return super.serializeNBT().also { + it["cooldown"] = cooldown + } + } + + override fun deserializeNBT(nbt: CompoundTag) { + super.deserializeNBT(nbt) + cooldown = nbt.getInt("cooldown") + } + private fun isValidPosition(blockPos: BlockPos): Boolean { if (!Block.canSupportCenter(ply.level, blockPos.below(), Direction.UP) && !Block.canSupportRigidBlock(ply.level, blockPos.below())) { return false @@ -107,6 +127,11 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv cooldown = ServerConfig.EnderTeleporter.COOLDOWN + val server = ply.server + + if (server != null) + lastTeleport = server.tickCount + if (!isClient) android.androidEnergy.extractEnergyInner(ServerConfig.EnderTeleporter.ENERGY_COST, false) ply.setPos(Vector(blockPos.x + 0.5, blockPos.y.toDouble(), blockPos.z + 0.5)) ply.deltaMovement = Vector(0.0, 0.0, 0.0) @@ -165,5 +190,18 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv ResourceLocation(OverdriveThatMatters.MOD_ID, MNames.ENDER_TELEPORTER), "otm.gui.power_cost_per_use", { ServerConfig.EnderTeleporter.ENERGY_COST.formatPower().copy().withStyle(ChatFormatting.YELLOW) }) + + fun onEntityDeath(event: LivingDeathEvent) { + val android = event.entity.matteryPlayer ?: return + val server = NULLABLE_MINECRAFT_SERVER ?: return + + if (android.isAndroid && event.source.isFall) { + val feature = android.getFeature(AndroidFeatures.ENDER_TELEPORTER) as EnderTeleporterFeature? ?: return + + if (server.tickCount - feature.lastTeleport <= 120) { + EnderTeleporterFallDeathTrigger.trigger(event.entity as ServerPlayer) + } + } + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/FallDampenersFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/FallDampenersFeature.kt index a0ef86da3..c942434be 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/FallDampenersFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/FallDampenersFeature.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.android.feature import net.minecraft.ChatFormatting import net.minecraft.resources.ResourceLocation -import net.minecraft.world.damagesource.DamageSource +import net.minecraft.server.level.ServerPlayer import net.minecraftforge.event.entity.living.LivingHurtEvent import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.ServerConfig @@ -13,17 +13,25 @@ import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.MNames +import ru.dbotthepony.mc.otm.triggers.FallDampenersSaveTrigger class FallDampenersFeature(capability: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.FALL_DAMPENERS, capability) { override fun onHurt(event: LivingHurtEvent) { if (event.source.isFall) { val reduction = (ServerConfig.FALL_DAMAGE_REDUCTION_PER_LEVEL * (level + 1)).toFloat() + val old = event.amount + if (reduction >= 1f) { event.isCanceled = true + event.amount = 0f } else { event.amount *= (1f - reduction) } + + if (ply is ServerPlayer && ply.health > event.amount && ply.health <= old) { + FallDampenersSaveTrigger.trigger(ply as ServerPlayer) + } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt index 6279721ee..285c6623e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/JumpBoostFeature.kt @@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.android.feature import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.ChatFormatting +import net.minecraft.nbt.CompoundTag import net.minecraft.network.FriendlyByteBuf import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerPlayer @@ -19,6 +20,7 @@ import ru.dbotthepony.mc.otm.client.render.ResearchIcons import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.core.formatPower import ru.dbotthepony.mc.otm.core.plus +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel import ru.dbotthepony.mc.otm.network.enqueueWork @@ -62,6 +64,17 @@ class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF } }) + override fun serializeNBT(): CompoundTag { + return super.serializeNBT().also { + it["cooldown"] = cooldown + } + } + + override fun deserializeNBT(nbt: CompoundTag) { + super.deserializeNBT(nbt) + cooldown = nbt.getInt("cooldown") + } + fun putOnCooldown() { cooldown = (ServerConfig.AndroidJumpBoost.BASE_COOLDOWN - ServerConfig.AndroidJumpBoost.COOLDOWN_REDUCTION * level).coerceAtLeast(0) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt index c2bbf16ef..1771495e3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt @@ -13,6 +13,8 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.onceServer +import ru.dbotthepony.mc.otm.triggers.NanobotsArmorTrigger import kotlin.math.roundToInt class NanobotsArmorFeature(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_ARMOR, android) { @@ -48,6 +50,16 @@ class NanobotsArmorFeature(android: MatteryPlayerCapability) : AndroidFeature(An val powerRequired = ENERGY_PER_HITPOINT * absorbed val powerExtracted = android.androidEnergy.extractEnergyInner(powerRequired, false) val realAbsorbed = (powerExtracted / ENERGY_PER_HITPOINT).toFloat() + + val ply = ply + + if (ply is ServerPlayer) { + onceServer { + if (!ply.hasDisconnected() && ply.isAlive) + NanobotsArmorTrigger.trigger(ply, realAbsorbed.toDouble()) + } + } + event.amount = event.amount - realAbsorbed (ply as ServerPlayer?)?.awardStat(StatNames.DAMAGE_ABSORBED, (realAbsorbed * 10f).roundToInt()) layers-- diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/SynchronizedPowerWithBattery.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/AndroidPowerSource.kt similarity index 94% rename from src/main/kotlin/ru/dbotthepony/mc/otm/capability/SynchronizedPowerWithBattery.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/capability/AndroidPowerSource.kt index ea763d3b3..609c108c3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/SynchronizedPowerWithBattery.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/AndroidPowerSource.kt @@ -13,8 +13,9 @@ import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.network.FieldSynchronizer import ru.dbotthepony.mc.otm.registry.StatNames +import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger -class SynchronizedPowerWithBattery( +class AndroidPowerSource( private val ply: Player, synchronizer: FieldSynchronizer, initialCharge: ImpreciseFraction, @@ -23,7 +24,13 @@ class SynchronizedPowerWithBattery( private var battery by synchronizer.fraction(initialCharge) private var maxBattery by synchronizer.fraction(maxCharge) - var item by synchronizer.item() + var item by synchronizer.item(setter = setter@{ value, access, setByRemote -> + access.write(value) + + if (ply is ServerPlayer) { + AndroidBatteryTrigger.trigger(ply, value) + } + }) override fun serializeNBT(): CompoundTag { return CompoundTag().also { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index 49b40832b..6e6025a4a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -54,6 +54,7 @@ import ru.dbotthepony.mc.otm.triggers.BecomeAndroidDeathTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidSleepTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidTrigger import ru.dbotthepony.mc.otm.triggers.BecomeHumaneTrigger +import ru.dbotthepony.mc.otm.triggers.PhantomSpawnDeniedTrigger import java.util.* import java.util.stream.Stream import kotlin.collections.ArrayDeque @@ -226,7 +227,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial var willBecomeAndroid by synchronizer.bool() var isAndroid by synchronizer.bool() - val androidEnergy = SynchronizedPowerWithBattery(ply, synchronizer, ServerConfig.ANDROID_MAX_ENERGY, ServerConfig.ANDROID_MAX_ENERGY) + val androidEnergy = AndroidPowerSource(ply, synchronizer, ServerConfig.ANDROID_MAX_ENERGY, ServerConfig.ANDROID_MAX_ENERGY) fun invalidateNetworkState() { invalidateNetworkIn = 10 @@ -889,14 +890,23 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial fun canEntitySpawn(event: LivingSpawnEvent.CheckSpawn) { if (event.spawnReason == MobSpawnType.NATURAL && event.entity is Phantom) { for (ply in event.entity.level.players()) { - if (ply.matteryPlayer?.isAndroid == true && (ply.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature?)?.isActive != true) { - if ( - ply.position.y in event.y - 36.0 .. event.y - 19.0 && - ply.position.x in event.x - 12.0 .. event.x + 12.0 && - ply.position.z in event.z - 12.0 .. event.z + 12.0 - ) { - event.result = Event.Result.DENY - return + if (ply.matteryPlayer?.isAndroid == true) { + val feature = (ply.matteryPlayer?.getFeature(AndroidFeatures.PHANTOM_ATTRACTOR) as AndroidSwitchableFeature?) + + if (feature?.isActive != true) { + if ( + ply.position.y in event.y - 36.0 .. event.y - 19.0 && + ply.position.x in event.x - 12.0 .. event.x + 12.0 && + ply.position.z in event.z - 12.0 .. event.z + 12.0 + ) { + event.result = Event.Result.DENY + + if (feature == null && ply is ServerPlayer) { + PhantomSpawnDeniedTrigger.trigger(ply) + } + + return + } } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index e6e3faafc..068b4b771 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -108,6 +108,15 @@ object MItems { } } + val MACHINES = LazyList( + ::ANDROID_STATION, ::BATTERY_BANK, ::MATTER_DECOMPOSER, ::MATTER_CAPACITOR_BANK, ::MATTER_CABLE, ::PATTERN_STORAGE, + ::MATTER_SCANNER, ::MATTER_PANEL, ::MATTER_REPLICATOR, ::MATTER_BOTTLER, ::ENERGY_COUNTER, ::CHEMICAL_GENERATOR, + ::PLATE_PRESS, ::MATTER_RECYCLER, ::STORAGE_BUS, ::STORAGE_IMPORTER, ::STORAGE_EXPORTER, ::DRIVE_VIEWER, + ::DRIVE_RACK, ::ITEM_MONITOR, ::STORAGE_CABLE, ::STORAGE_POWER_SUPPLIER, ::ENERGY_SERVO, + ::PHANTOM_ATTRACTOR, + ::GRAVITATION_STABILIZER, + ) + val DEBUG_EXPLOSION_SMALL: Item by registry.register(MNames.DEBUG_EXPLOSION_SMALL) { BlockItem(MBlocks.DEBUG_EXPLOSION_SMALL, Item.Properties().stacksTo(64)) } val DEBUG_SPHERE_POINTS: Item by registry.register(MNames.DEBUG_SPHERE_POINTS) { BlockItem(MBlocks.DEBUG_SPHERE_POINTS, Item.Properties().stacksTo(64)) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt index 7c45ab76b..c7540cb87 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -2,9 +2,7 @@ package ru.dbotthepony.mc.otm.registry import com.mojang.serialization.Lifecycle import net.minecraft.advancements.CriteriaTriggers -import net.minecraft.client.renderer.block.model.ItemOverrides import net.minecraft.client.renderer.item.ItemProperties -import net.minecraft.client.renderer.item.ItemPropertyFunction import net.minecraft.core.BlockPos import net.minecraft.core.Holder import net.minecraft.core.Registry @@ -22,14 +20,12 @@ import net.minecraft.world.level.material.MaterialColor import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext import net.minecraftforge.registries.ForgeRegistry import net.minecraftforge.registries.IForgeRegistry import net.minecraftforge.registries.NewRegistryEvent import net.minecraftforge.registries.RegistryBuilder import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.android.AndroidFeatureType -import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.android.feature.EnderTeleporterFeature import ru.dbotthepony.mc.otm.android.feature.FallDampenersFeature import ru.dbotthepony.mc.otm.android.feature.ItemMagnetFeature @@ -44,12 +40,17 @@ import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock import ru.dbotthepony.mc.otm.registry.objects.CrateProperties import ru.dbotthepony.mc.otm.registry.objects.DecorativeBlock import ru.dbotthepony.mc.otm.registry.objects.StripedColoredDecorativeBlock +import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidDeathTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidSleepTrigger import ru.dbotthepony.mc.otm.triggers.BecomeAndroidTrigger import ru.dbotthepony.mc.otm.triggers.BecomeHumaneTrigger import ru.dbotthepony.mc.otm.triggers.BlackHoleTrigger +import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger +import ru.dbotthepony.mc.otm.triggers.FallDampenersSaveTrigger +import ru.dbotthepony.mc.otm.triggers.NanobotsArmorTrigger +import ru.dbotthepony.mc.otm.triggers.PhantomSpawnDeniedTrigger import ru.dbotthepony.mc.otm.triggers.ShockwaveDamageMobTrigger import ru.dbotthepony.mc.otm.triggers.ShockwaveTrigger import java.util.function.Supplier @@ -275,6 +276,11 @@ object MRegistry { CriteriaTriggers.register(AndroidResearchTrigger) CriteriaTriggers.register(ShockwaveDamageMobTrigger) CriteriaTriggers.register(ShockwaveTrigger) + CriteriaTriggers.register(PhantomSpawnDeniedTrigger) + CriteriaTriggers.register(AndroidBatteryTrigger) + CriteriaTriggers.register(NanobotsArmorTrigger) + CriteriaTriggers.register(FallDampenersSaveTrigger) + CriteriaTriggers.register(EnderTeleporterFallDeathTrigger) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt index 89304e052..2e2e75295 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt @@ -65,6 +65,8 @@ object MItemTags { val HARDENED_GLASS_RED: TagKey = ItemTags.create(ResourceLocation("forge", "hardened_glass/red")) val HARDENED_GLASS_WHITE: TagKey = ItemTags.create(ResourceLocation("forge", "hardened_glass/white")) val HARDENED_GLASS_YELLOW: TagKey = ItemTags.create(ResourceLocation("forge", "hardened_glass/yellow")) + + val MACHINES: TagKey = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "machines")) } @Suppress("unused") @@ -109,4 +111,6 @@ object MBlockTags { val HARDENED_GLASS_RED: TagKey = BlockTags.create(ResourceLocation("forge", "hardened_glass/red")) val HARDENED_GLASS_WHITE: TagKey = BlockTags.create(ResourceLocation("forge", "hardened_glass/white")) val HARDENED_GLASS_YELLOW: TagKey = BlockTags.create(ResourceLocation("forge", "hardened_glass/yellow")) + + val MACHINES: TagKey = BlockTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "machines")) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt new file mode 100644 index 000000000..513d10a9f --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt @@ -0,0 +1,44 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.DeserializationContext +import net.minecraft.advancements.critereon.EntityPredicate.Composite +import net.minecraft.advancements.critereon.ItemPredicate +import net.minecraft.advancements.critereon.SerializationContext +import net.minecraft.advancements.critereon.SimpleCriterionTrigger +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.item.ItemStack +import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.core.set + +object AndroidBatteryTrigger : SimpleCriterionTrigger() { + val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "android_battery") + + override fun getId(): ResourceLocation { + return ID + } + + override fun createInstance( + p_66248_: JsonObject, + p_66249_: Composite, + p_66250_: DeserializationContext + ): Instance { + return Instance( + ItemPredicate.fromJson(p_66248_["predicate"]) + ) + } + + fun trigger(player: ServerPlayer, newItem: ItemStack) { + trigger(player) { it.predicate.matches(newItem) } + } + + class Instance(val predicate: ItemPredicate) : AbstractCriterionTriggerInstance(ID, Composite.ANY) { + override fun serializeToJson(p_16979_: SerializationContext): JsonObject { + return super.serializeToJson(p_16979_).also { + it["predicate"] = predicate.serializeToJson() + } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt new file mode 100644 index 000000000..8d85a8313 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt @@ -0,0 +1,32 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.DeserializationContext +import net.minecraft.advancements.critereon.EntityPredicate.Composite +import net.minecraft.advancements.critereon.SimpleCriterionTrigger +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer +import ru.dbotthepony.mc.otm.OverdriveThatMatters + +object EnderTeleporterFallDeathTrigger : SimpleCriterionTrigger() { + val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "ender_teleporter_fall_death") + + override fun getId(): ResourceLocation { + return ID + } + + override fun createInstance( + p_66248_: JsonObject, + p_66249_: Composite, + p_66250_: DeserializationContext + ): Instance { + return Instance + } + + fun trigger(player: ServerPlayer) { + trigger(player) { true } + } + + object Instance : AbstractCriterionTriggerInstance(ID, Composite.ANY) +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt new file mode 100644 index 000000000..633f6426b --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt @@ -0,0 +1,32 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.DeserializationContext +import net.minecraft.advancements.critereon.EntityPredicate.Composite +import net.minecraft.advancements.critereon.SimpleCriterionTrigger +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer +import ru.dbotthepony.mc.otm.OverdriveThatMatters + +object FallDampenersSaveTrigger : SimpleCriterionTrigger() { + val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "fall_dampeners_save") + + override fun getId(): ResourceLocation { + return ID + } + + override fun createInstance( + p_66248_: JsonObject, + p_66249_: Composite, + p_66250_: DeserializationContext + ): Instance { + return Instance + } + + fun trigger(player: ServerPlayer) { + trigger(player) { true } + } + + object Instance : AbstractCriterionTriggerInstance(ID, Composite.ANY) +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt new file mode 100644 index 000000000..fa026e177 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/NanobotsArmorTrigger.kt @@ -0,0 +1,43 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.DeserializationContext +import net.minecraft.advancements.critereon.EntityPredicate.Composite +import net.minecraft.advancements.critereon.MinMaxBounds.Doubles +import net.minecraft.advancements.critereon.SerializationContext +import net.minecraft.advancements.critereon.SimpleCriterionTrigger +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer +import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.core.set + +object NanobotsArmorTrigger : SimpleCriterionTrigger() { + val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "nanobots_armor") + + override fun getId(): ResourceLocation { + return ID + } + + override fun createInstance( + p_66248_: JsonObject, + p_66249_: Composite, + p_66250_: DeserializationContext + ): Instance { + return Instance( + Doubles.fromJson(p_66248_["predicate"]) + ) + } + + fun trigger(player: ServerPlayer, damageAbsorbed: Double) { + trigger(player) { it.predicate.matches(damageAbsorbed) } + } + + class Instance(val predicate: Doubles) : AbstractCriterionTriggerInstance(ID, Composite.ANY) { + override fun serializeToJson(p_16979_: SerializationContext): JsonObject { + return super.serializeToJson(p_16979_).also { + it["predicate"] = predicate.serializeToJson() + } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/PhantomSpawnDeniedTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/PhantomSpawnDeniedTrigger.kt new file mode 100644 index 000000000..1be863f36 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/PhantomSpawnDeniedTrigger.kt @@ -0,0 +1,32 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.DeserializationContext +import net.minecraft.advancements.critereon.EntityPredicate.Composite +import net.minecraft.advancements.critereon.SimpleCriterionTrigger +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer +import ru.dbotthepony.mc.otm.OverdriveThatMatters + +object PhantomSpawnDeniedTrigger : SimpleCriterionTrigger() { + val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "phantom_spawn_denied") + + override fun getId(): ResourceLocation { + return ID + } + + override fun createInstance( + p_66248_: JsonObject, + p_66249_: Composite, + p_66250_: DeserializationContext + ): Instance { + return Instance + } + + fun trigger(player: ServerPlayer) { + trigger(player) { true } + } + + object Instance : AbstractCriterionTriggerInstance(ID, Composite.ANY) +}