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 81e3b1bdd..47ffc4fdc 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -508,7 +508,6 @@ object DataGen { AdvancementGenerator { registries, saver, existingFileHelper -> addAdvancements(saver, existingFileHelper, languageProvider) addAndroidAdvancements(saver, existingFileHelper, languageProvider) - addMachineAdvancements(saver, existingFileHelper, languageProvider) } )) {} 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 3898e9ce8..6625eaf74 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 @@ -38,6 +38,8 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist .addCriterion("has_tritanium_ingot", InventoryChangeTrigger.TriggerInstance.hasItems(MItems.TRITANIUM_INGOT)) .save(serializer, modLocation("regular/root"), existingFileHelper) + addMachineAdvancements(serializer, existingFileHelper, lang, root) + val crude = AdvancementBuilder() .parent(root) .display( @@ -127,7 +129,7 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist .addCriterion("has_item1", criterion(MItems.QUANTUM_CAPACITOR)) .save(serializer, modLocation("regular/quantum_battery"), existingFileHelper) - AdvancementBuilder() + val zpm = AdvancementBuilder() .parent(root) .display( itemStack = ItemStack(MItems.ZPM_BATTERY), @@ -144,6 +146,8 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist .addCriterion("has_item", criterion(MItems.ZPM_BATTERY)) .save(serializer, modLocation("regular/zpm_battery"), existingFileHelper) + addExopackAdvancements(serializer, existingFileHelper, lang, root, zpm) + val blackhole = AdvancementBuilder() .parent(root) .display( @@ -156,7 +160,7 @@ fun addAdvancements(serializer: Consumer, existingFileHelper: Exist }, hidden = true ) - .addCriterion("pulled_by_black_hole", BlackHoleTrigger.Instance) + .addCriterion("pulled_by_black_hole", BlackHoleTrigger.instance) .save(serializer, modLocation("regular/black_hole"), existingFileHelper) AdvancementBuilder() 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 c93400485..f84f15be1 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 @@ -48,7 +48,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper announceChat = false, background = modLocation("textures/block/decorative/metal_beam_top.png") ) - .addCriterion("became_android", BecomeAndroidTrigger.Instance) + .addCriterion("became_android", BecomeAndroidTrigger.instance) .save(serializer, modLocation("android/root"), existingFileHelper) AdvancementBuilder() @@ -97,7 +97,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper }, hidden = true, ) - .addCriterion("became_android", BecomeAndroidSleepTrigger.Instance) + .addCriterion("became_android", BecomeAndroidSleepTrigger.instance) .save(serializer, modLocation("android/become_thru_sleep"), existingFileHelper) AdvancementBuilder() @@ -112,7 +112,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper }, hidden = true, ) - .addCriterion("became_android", BecomeAndroidDeathTrigger.Instance) + .addCriterion("became_android", BecomeAndroidDeathTrigger.instance) .save(serializer, modLocation("android/become_thru_death"), existingFileHelper) AdvancementBuilder() @@ -128,7 +128,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper hidden = true, frameType = FrameType.GOAL ) - .addCriterion("become_humane", BecomeHumaneTrigger.Instance) + .addCriterion("become_humane", BecomeHumaneTrigger.instance) .save(serializer, modLocation("android/become_humane"), existingFileHelper) val attractor = AdvancementBuilder() @@ -246,7 +246,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper }, frameType = FrameType.GOAL ) - .addCriterion("saved", FallDampenersSaveTrigger.Instance) + .addCriterion("saved", FallDampenersSaveTrigger.instance) .save(serializer, modLocation("android/fall_dampeners_save"), existingFileHelper) AdvancementBuilder() @@ -262,7 +262,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper frameType = FrameType.GOAL, hidden = true ) - .addCriterion("death", EnderTeleporterFallDeathTrigger.Instance) + .addCriterion("death", EnderTeleporterFallDeathTrigger.instance) .save(serializer, modLocation("android/ender_teleport_fall_death"), existingFileHelper) val regen = AdvancementBuilder() @@ -330,7 +330,7 @@ fun addAndroidAdvancements(serializer: Consumer, existingFileHelper russian("Вызовите ударную волну при приземлении") }, ) - .addCriterion("shockwave", ShockwaveTrigger.Instance) + .addCriterion("shockwave", ShockwaveTrigger.instance) .save(serializer, modLocation("android/shockwave"), existingFileHelper) AdvancementBuilder() diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt new file mode 100644 index 000000000..aec551e13 --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/ExopackAdvancementsData.kt @@ -0,0 +1,249 @@ +package ru.dbotthepony.mc.otm.datagen.advancements + +import net.minecraft.advancements.Advancement +import net.minecraft.advancements.FrameType +import net.minecraft.advancements.critereon.ItemPredicate +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items +import net.minecraftforge.common.data.ExistingFileHelper +import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider +import ru.dbotthepony.mc.otm.datagen.modLocation +import ru.dbotthepony.mc.otm.registry.MItems +import ru.dbotthepony.mc.otm.triggers.ExopackBatterySlotTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackGainedCraftingTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackGainedSmeltingTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackObtainedTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackSlotsExpandedTrigger +import java.util.function.Consumer + +fun addExopackAdvancements(serializer: Consumer, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider, root: Advancement, zpm: Advancement) { + val translation = lang.MultiBuilder("otm.advancements.exopack") + + AdvancementBuilder() + .parent(zpm) + .display( + hidden = true, + itemStack = ItemStack(MItems.ZPM_BATTERY), + title = translation.add("zpm_battery", "At Maximum Battery Capacity") { + russian("Достигнут максимальный заряд батареи") + }, + description = translation.add("zpm_battery.desc", "Use Zero Point Module as power source in Exopack") { + russian("Используйте модуль нулевой точки как источник питания в Экзопаке") + }, + frameType = FrameType.GOAL + ) + .addCriterion("zpm_battery", ExopackBatterySlotTrigger.Instance(ItemPredicate.Builder.item().of(MItems.ZPM_BATTERY).build())) + .save(serializer, modLocation("exopack/zpm_battery"), existingFileHelper) + + val obtained = AdvancementBuilder() + .parent(root) + .display( + itemStack = ItemStack(MItems.EXOPACK_PROBE), + title = translation.add("obtained", "One Dimension Bigger") { + russian("Больше на одно измерение") + }, + description = translation.add("obtained.desc", "Obtain an Exopack, a mysterious, semi-present, light as a feather, stuff storage on your back") { + russian("Получите Экзопак, загадочное, полу-присутствующее, лёгкое как пёрышко, хранилище штуковин на вашей спине") + }, + frameType = FrameType.GOAL + ) + .addCriterion("obtained", ExopackObtainedTrigger.instance) + .save(serializer, modLocation("exopack/obtained"), existingFileHelper) + + AdvancementBuilder() + .parent(obtained) + .display( + itemStack = ItemStack(Items.CRAFTING_TABLE), + title = translation.add("crafting", "Crafting on Go") { + russian("Крафт по пути") + }, + description = translation.add("crafting.desc", "Install Crafting Upgrade in your Exopack, allowing to craft 3x3 recipes") { + russian("Установите улучшение сетки крафта в ваш Экзопаке, который позволяет создавать предметы, требующие сетку крафта рабочего стола") + }, + ) + .addCriterion("crafting", ExopackGainedCraftingTrigger.instance) + .save(serializer, modLocation("exopack/crafting"), existingFileHelper) + + AdvancementBuilder() + .parent(obtained) + .display( + itemStack = ItemStack(Items.FURNACE), + title = translation.add("smelting", "Pocket Furnace") { + russian("Печь в кармане") + }, + description = translation.add("smelting.desc", "Install Smelting Module in your Exopack, allowing to smelt items right inside your inventory") { + russian("Установите модуль переплавки в ваш Экзопак, позволяющий переплавлять предметы прямо у вас в инвентаре") + }, + ) + .addCriterion("smelting", ExopackGainedSmeltingTrigger.instance) + .save(serializer, modLocation("exopack/smelting"), existingFileHelper) + + var size = AdvancementBuilder() + .parent(obtained) + .display( + itemStack = ItemStack(Items.CHEST), + title = translation.add("size0", "Closet Upgrade") { + russian("Обновление чуланчика") + }, + description = translation.add("size0.desc", "Upgrade Exopack storage") { + russian("Улучшите размер инвентаря Экзопака") + }, + ) + .addCriterion("size0", ExopackSlotsExpandedTrigger.Instance(minTotal = 1)) + .save(serializer, modLocation("exopack/size0"), existingFileHelper) + + val size0 = size + + size = AdvancementBuilder() + .parent(size) + .display( + itemStack = ItemStack(Items.CHEST), + title = translation.add("size1", "Double the Capacity") { + russian("Двойной объём") + }, + description = translation.add("size1.desc", "Reach 27 slots in your Exopack storage") { + russian("Достигните 27 слотов хранилища Экзопака") + }, + ) + .addCriterion("size1", ExopackSlotsExpandedTrigger.Instance(minTotal = 27)) + .save(serializer, modLocation("exopack/size1"), existingFileHelper) + + size = AdvancementBuilder() + .parent(size) + .display( + itemStack = ItemStack(Items.CHEST), + hidden = true, + title = translation.add("size2", "Pack Rat") { + russian("Воришка") + }, + description = translation.add("size2.desc", "Reach 54 slots in your Exopack storage") { + russian("Достигните 54 слотов хранилища Экзопака") + }, + ) + .addCriterion("size2", ExopackSlotsExpandedTrigger.Instance(minTotal = 54)) + .save(serializer, modLocation("exopack/size2"), existingFileHelper) + + size = AdvancementBuilder() + .parent(size) + .display( + itemStack = ItemStack(Items.CHEST), + hidden = true, + title = translation.add("size3", "Its Getting Big In Here") { + russian("Тут становится просторно") + }, + description = translation.add("size3.desc", "Reach 108 slots in your Exopack storage") { + russian("Достигните 108 слотов хранилища Экзопака") + }, + frameType = FrameType.GOAL + ) + .addCriterion("size3", ExopackSlotsExpandedTrigger.Instance(minTotal = 108)) + .save(serializer, modLocation("exopack/size3"), existingFileHelper) + + size = AdvancementBuilder() + .parent(size) + .display( + itemStack = ItemStack(Items.ENDER_CHEST), + hidden = true, + title = translation.add("size4", "Warehousing Pioneer") { + russian("Пионер складских решений") + }, + description = translation.add("size4.desc", "Reach 432 slots in your Exopack storage. You could fit a house in there") { + russian("Достигните 432 слотов хранилища Экзопака. Туда можно уже впихнуть целый дом") + }, + frameType = FrameType.CHALLENGE + ) + .addCriterion("size4", ExopackSlotsExpandedTrigger.Instance(minTotal = 432)) + .save(serializer, modLocation("exopack/size4"), existingFileHelper) + + AdvancementBuilder() + .parent(size) + .display( + itemStack = ItemStack(Items.ENDER_CHEST), + hidden = true, + title = translation.add("size5", "With Volume Like This...") { + russian("С таким объёмом...") + }, + description = translation.add("size5.desc", "Reach 1728 slots in your Exopack storage. Why would you need to go any bigger?!") { + russian("Достигните 1728 слотов хранилища Экзопака. Куда вам столько?!") + }, + frameType = FrameType.CHALLENGE + ) + .addCriterion("size5", ExopackSlotsExpandedTrigger.Instance(minTotal = 1728)) + .save(serializer, modLocation("exopack/size5"), existingFileHelper) + + var once = AdvancementBuilder() + .parent(size0) + .display( + itemStack = ItemStack(Items.CHEST), + title = translation.add("once0", "One Module - One Row") { + russian("Один модуль - одна строка") + }, + description = translation.add("once0.desc", "Upgrade your Exopack storage with 9 slots using one module") { + russian("Улучшите хранилище Экзопака модулем на 9 слотов") + }, + ) + .addCriterion("once0", ExopackSlotsExpandedTrigger.Instance(minGained = 9)) + .save(serializer, modLocation("exopack/once0"), existingFileHelper) + + once = AdvancementBuilder() + .parent(once) + .display( + itemStack = ItemStack(Items.CHEST), + title = translation.add("once1", "One Module - One Chest") { + russian("Один модуль - один сундук") + }, + description = translation.add("once1.desc", "Upgrade your Exopack storage with 27 slots using one module") { + russian("Улучшите хранилище Экзопака модулем на 27 слотов") + }, + ) + .addCriterion("once1", ExopackSlotsExpandedTrigger.Instance(minGained = 27)) + .save(serializer, modLocation("exopack/once1"), existingFileHelper) + + once = AdvancementBuilder() + .parent(once) + .display( + itemStack = ItemStack(Items.CHEST), + hidden = true, + title = translation.add("once2", "One Module - Two Chests?") { + russian("Один модуль - два сундука?") + }, + description = translation.add("once2.desc", "Upgrade your Exopack storage with 54 slots using one module") { + russian("Улучшите хранилище Экзопака модулем на 54 слотов") + }, + frameType = FrameType.GOAL + ) + .addCriterion("once2", ExopackSlotsExpandedTrigger.Instance(minGained = 54)) + .save(serializer, modLocation("exopack/once2"), existingFileHelper) + + once = AdvancementBuilder() + .parent(once) + .display( + itemStack = ItemStack(Items.ENDER_CHEST), + hidden = true, + title = translation.add("once3", "Storage Housing Construct") { + russian("Хранилище быстрого приготовления") + }, + description = translation.add("once3.desc", "Upgrade your Exopack storage with 90 slots using one module") { + russian("Улучшите хранилище Экзопака модулем на 90 слотов") + }, + frameType = FrameType.GOAL + ) + .addCriterion("once3", ExopackSlotsExpandedTrigger.Instance(minGained = 90)) + .save(serializer, modLocation("exopack/once3"), existingFileHelper) + + AdvancementBuilder() + .parent(once) + .display( + itemStack = ItemStack(Items.ENDER_CHEST), + hidden = true, + title = translation.add("once4", "Non-Euclidean Wardrobe") { + russian("Неевклидов Шкаф") + }, + description = translation.add("once4.desc", "Upgrade your Exopack storage with 150 slots using one module. After you open one, tens meters long racks roll out of it!") { + russian("Улучшите хранилище Экзопака модулем на 150 слотов. Открой один - и покатились стеллажи на десятки метров!") + }, + frameType = FrameType.CHALLENGE + ) + .addCriterion("once4", ExopackSlotsExpandedTrigger.Instance(minGained = 150)) + .save(serializer, modLocation("exopack/once4"), existingFileHelper) +} 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 index b50ef7bb0..349354dbc 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/advancements/MachineAdvancementsData.kt @@ -1,10 +1,13 @@ package ru.dbotthepony.mc.otm.datagen.advancements import net.minecraft.advancements.Advancement +import net.minecraft.advancements.FrameType import net.minecraft.advancements.RequirementsStrategy +import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.network.chat.contents.TranslatableContents import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items import net.minecraftforge.common.data.ExistingFileHelper import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.key @@ -13,6 +16,7 @@ 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.triggers.TakeItemOutOfReplicatorTrigger import java.util.function.Consumer private data class CraftEntry( @@ -22,30 +26,37 @@ private data class CraftEntry( val russianName: String? = null, val russianSuffix: String? = null, -) +) { + fun make(serializer: Consumer, existingFileHelper: ExistingFileHelper, parent: Advancement, translation: MatteryLanguageProvider.MultiBuilder): Advancement { + val path = item.registryName!!.path -fun addMachineAdvancements(serializer: Consumer, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider) { + val translated = translation.add("$path.desc", "Craft a %s%s") { + russian("Создайте %s%s") + } + + val translatedSuffix = translation.add("$path.suffix", if (englishSuffix != null) ". $englishSuffix" else "") { + russian(if (russianSuffix != null) ". $russianSuffix" else "") + } + + return AdvancementBuilder() + .parent(parent) + .display( + itemStack = ItemStack(item), + title = translation.add(path, englishName) { + if (russianName != null) { + russian(russianName) + } + }, + description = TranslatableComponent(translated.contents.key, item.description, translatedSuffix), + ) + .addCriterion("has_machine", criterion(item)) + .save(serializer, modLocation("machines/$path"), existingFileHelper) + } +} + +fun addMachineAdvancements(serializer: Consumer, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider, root: Advancement) { val translation = lang.MultiBuilder("otm.advancements.machine") - val root = AdvancementBuilder() - .requirements(RequirementsStrategy.OR) - .display( - itemStack = ItemStack(MItems.CHEMICAL_GENERATOR), - title = translation.add("root", "Tritanium Empowered Machinery") { - russian("Тританово запитанные механизмы") - }, - description = translation.add("root.desc", "Do not drop in anything if you want the latter preserved intact") { - russian("Не роняйте ничего внутрь если хотите чтоб последнее осталось таким, какое оно есть") - }, - 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( @@ -74,55 +85,98 @@ fun addMachineAdvancements(serializer: Consumer, existingFileHelper .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", - russianName = "Сканируем вещи которые материальны"), - CraftEntry(MItems.PATTERN_STORAGE, "Digital Knowledge Library", - russianName = "Цифровая библиотека знаний"), - CraftEntry(MItems.MATTER_DECOMPOSER, "Decaying the Atoms", "Keep your limbs outside of the working chamber at all times", - russianName = "Разлагаем атомы", russianSuffix = "Во всех ситуациях держите свои конечности вне рабочей камеры"), - CraftEntry(MItems.MATTER_PANEL, "Indexing the Library", - russianName = "Индексируем библиотеку"), - CraftEntry(MItems.MATTER_REPLICATOR, "Local Bakery", "Now let's bake some perfect bread", - russianName = "Местная выпечка", russianSuffix = "А теперь давайте выпечем немного идеального хлеба"), - CraftEntry(MItems.MATTER_BOTTLER, "Transfusing Pure Matter", "For those who loved to play with water in their childhood", - russianName = "Переливаем чистую материю", russianSuffix = "Для тех, кто любил играться в воде в детстве"), - CraftEntry(MItems.MATTER_RECYCLER, "Refine and Redefine", "This is what waste recycling should look like", - russianName = "Переработка и перегонка", russianSuffix = "Вот он, пик переработки отходов"), - CraftEntry(MItems.MATTER_CAPACITOR_BANK, "Modular Matter Tank", - russianName = "Модульный бак материи"), + CraftEntry(MItems.TWIN_PLATE_PRESS, "Twice the Thud", + russianName = "Двойной стук").make(serializer, existingFileHelper, press, translation) - CraftEntry(MItems.ENERGY_COUNTER, "Visualize Power Burn", - russianName = "Визуализация сжигания энергии"), - CraftEntry(MItems.BATTERY_BANK, "Batteries Not Included", "By all means avoid the urge to hammer incompatible batteries into the power bus.", - russianName = "Батарейки в комплект не входят", russianSuffix = "Пожалуйста, воздержитесь от вбивания кувалдой несовместимых батарей в энергетическую шину."), - ) + val scanner = CraftEntry(MItems.MATTER_SCANNER, "Scanning Things that Matter", + russianName = "Сканируем вещи которые материальны") + val decomposer = CraftEntry(MItems.MATTER_DECOMPOSER, "Decaying the Atoms", "Keep your limbs outside of the working chamber at all times", + russianName = "Разлагаем атомы", russianSuffix = "Во всех ситуациях держите свои конечности вне рабочей камеры") + val panel = CraftEntry(MItems.MATTER_PANEL, "Indexing the Library", + russianName = "Индексируем библиотеку") + val replicator = CraftEntry(MItems.MATTER_REPLICATOR, "Cook with (Im)Perfection", "Now let's bake some perfect bread", + russianName = "Повар с (не) идеальностями", russianSuffix = "А теперь давайте выпечем немного идеального хлеба") + val bottler = CraftEntry(MItems.MATTER_BOTTLER, "Transfusing Pure Matter", "For those who loved to play with water in their childhood", + russianName = "Переливаем чистую материю", russianSuffix = "Для тех, кто любил играться в воде в детстве") + val recycler = CraftEntry(MItems.MATTER_RECYCLER, "Refine and Redefine", "This is what waste recycling should look like", + russianName = "Переработка и перегонка", russianSuffix = "Вот он, пик переработки отходов") + val capacitor = CraftEntry(MItems.MATTER_CAPACITOR_BANK, "Modular Matter Tank", + russianName = "Модульный бак материи") - val built = mutableMapOf() + val counter = CraftEntry(MItems.ENERGY_COUNTER, "Visualize Power Burn", + russianName = "Визуализация сжигания энергии") + val battery = CraftEntry(MItems.BATTERY_BANK, "Batteries Not Included", "By all means avoid the urge to hammer incompatible batteries into the power bus.", + russianName = "Батарейки в комплект не входят", russianSuffix = "Пожалуйста, воздержитесь от вбивания кувалдой несовместимых батарей в энергетическую шину.") - for (entry in entries) { - val path = entry.item.registryName!!.path + val pattern = CraftEntry(MItems.PATTERN_STORAGE, "Digital Knowledge Library", + russianName = "Цифровая библиотека знаний") - val translated = translation.add("$path.desc", "Craft a %s%s") { - russian("Создайте %s%s") + val reconstructor = CraftEntry(MItems.MATTER_RECONSTRUCTOR, "Flipping Hourglass", + russianName = "Переворачиваем песочные часы") + + decomposer.make(serializer, existingFileHelper, press, translation).also { + pattern.make(serializer, existingFileHelper, it, translation).also { + scanner.make(serializer, existingFileHelper, it, translation) + panel.make(serializer, existingFileHelper, it, translation) + + replicator.make(serializer, existingFileHelper, it, translation).also { + AdvancementBuilder() + .parent(it) + .display( + itemStack = ItemStack(Items.BREAD), + title = translation.add("replicate_something", "Local Bakery") { + russian("Местная выпечка") + }, + description = translation.add("replicate_something.desc", "Replicate something using Matter Replicator. If you replicated some food, be the first to taste it among your company") { + russian("Среплицируйте что либо используя репликатор материи. Если это еда, то не стесняйтесь быть первым, кто попробует её на вкус среди вашей компании") + }, + frameType = FrameType.GOAL + ) + .addCriterion("replicate_something", TakeItemOutOfReplicatorTrigger.Instance(ItemPredicate.Builder.item().of(MItems.MATTER_DUST).build(), true)) + .save(serializer, modLocation("machines/replicate_something"), existingFileHelper) + + AdvancementBuilder() + .parent(it) + .display( + hidden = true, + itemStack = ItemStack(MItems.MATTER_DUST), + title = translation.add("replicate_failure", "Unhealthy Flavor") { + russian("Вредная посыпка") + }, + description = translation.add("replicate_failure.desc", "Experience replication failure and have your thing turn into matter dust") { + russian("Наблюдайте неудачный результат репликации, где ваш заказ рассыпался в материальную труху") + }, + ) + .addCriterion("replicate_failure", TakeItemOutOfReplicatorTrigger.Instance(ItemPredicate.Builder.item().of(MItems.MATTER_DUST).build())) + .save(serializer, modLocation("machines/replicate_failure"), existingFileHelper) + } + + reconstructor.make(serializer, existingFileHelper, it, translation) } - val translatedSuffix = translation.add("$path.suffix", if (entry.englishSuffix != null) ". " + entry.englishSuffix else "") { - russian(if (entry.russianSuffix != null) ". " + entry.russianSuffix else "") - } - - built[entry.item] = AdvancementBuilder() - .parent(press) - .display( - itemStack = ItemStack(entry.item), - title = translation.add(path, entry.englishName) { - if (entry.russianName != null) { - russian(entry.russianName) - } - }, - description = TranslatableComponent(translated.contents.key, entry.item.description, translatedSuffix), - ) - .addCriterion("has_machine", criterion(entry.item)) - .save(serializer, modLocation("machines/$path"), existingFileHelper) + bottler.make(serializer, existingFileHelper, it, translation) + recycler.make(serializer, existingFileHelper, it, translation) + capacitor.make(serializer, existingFileHelper, it, translation) } + + counter.make(serializer, existingFileHelper, press, translation).also { + battery.make(serializer, existingFileHelper, it, translation) + } + + val station = CraftEntry(MItems.ANDROID_STATION, "Android Home Page", + russianName = "Домашняя страница андроидов", + russianSuffix = "Только пользоваться этим устройством могут вёдра с болтами", + englishSuffix = "Except only buckets of bolts can use this thing") + + val charger = CraftEntry(MItems.ANDROID_CHARGER, "Android Home Router", + russianName = "Домашняя страница андроидов") + + station.make(serializer, existingFileHelper, press, translation).also { + charger.make(serializer, existingFileHelper, it, translation) + } + + CraftEntry(MItems.COBBLESTONE_GENERATOR, "Cobblestone: Infinity + 1", + russianName = "Булыжник: бесконечность + 1", + russianSuffix = "Смотрите, чтоб он не просыпался во все сундуки", + englishSuffix = "Watch for not to spill it over all your chests").make(serializer, existingFileHelper, press, translation) } 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 3a03ed84f..8db96a554 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -109,6 +109,10 @@ 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.ExopackGainedCraftingTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackGainedSmeltingTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackObtainedTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackSlotsExpandedTrigger import java.util.* import java.util.stream.Stream import kotlin.collections.ArrayDeque @@ -194,7 +198,13 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial /** * Whenever player has Exopack */ - var hasExoPack by publicSynchronizer.bool().property + var hasExoPack by publicSynchronizer.bool(setter = setter@{ value, access, _ -> + access.write(value) + + if (value && ply is ServerPlayer) { + ExopackObtainedTrigger.trigger(ply) + } + }).property /** * Whenever to render Exopack on player @@ -285,6 +295,10 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial if (value != access.readBoolean()) { access.write(value) _exoPackMenu = null + + if (value && ply is ServerPlayer) { + ExopackGainedCraftingTrigger.trigger(ply) + } } }).property @@ -383,6 +397,10 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial if (value != access.readBoolean()) { access.write(value) _exoPackMenu = null + + if (value && ply is ServerPlayer) { + ExopackGainedSmeltingTrigger.trigger(ply) + } } }).property @@ -855,6 +873,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial override fun deserializeNBT(tag: CompoundTag) { savetables.deserializeNBT(tag) + if (ply is ServerPlayer && hasExoPack) + ExopackSlotsExpandedTrigger.trigger(ply, 0, exoPackContainer.containerSize) + for (filter in regularSlotFilters) { filter.value = null } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/BatteryBackedEnergyStorage.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/BatteryBackedEnergyStorage.kt index a04a14b70..cec3e8396 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/BatteryBackedEnergyStorage.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/BatteryBackedEnergyStorage.kt @@ -18,6 +18,7 @@ import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer import ru.dbotthepony.mc.otm.registry.StatNames import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackBatterySlotTrigger class BatteryBackedEnergyStorage( private val ply: Player, @@ -37,6 +38,8 @@ class BatteryBackedEnergyStorage( if (ply is ServerPlayer && isAndroid) { AndroidBatteryTrigger.trigger(ply, value) + } else if (ply is ServerPlayer && !isAndroid) { + ExopackBatterySlotTrigger.trigger(ply, value) } }) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/Ext.kt index 6cf8c6434..fcc744d47 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/Ext.kt @@ -1,11 +1,56 @@ package ru.dbotthepony.mc.otm.data +import com.google.gson.JsonArray +import com.google.gson.JsonNull +import com.google.gson.JsonObject import com.mojang.serialization.DataResult +import it.unimi.dsi.fastutil.ints.IntAVLTreeSet import net.minecraft.world.entity.player.Player import net.minecraft.world.level.storage.loot.LootContext import net.minecraft.world.level.storage.loot.parameters.LootContextParam import net.minecraft.world.level.storage.loot.parameters.LootContextParams +fun JsonArray.getRidOfNulls(): JsonArray { + val toRemove = IntAVLTreeSet() + + for (i in 0 until size()) { + when (val value = this[i]) { + JsonNull.INSTANCE -> toRemove.add(i) + is JsonArray -> value.getRidOfNulls() + is JsonObject -> value.getRidOfNulls() + } + } + + if (toRemove.isNotEmpty()) { + remove(toRemove.lastInt()) + val iterator = toRemove.iterator(toRemove.lastInt()) + + while (iterator.hasPrevious()) { + remove(iterator.previousInt()) + } + } + + return this +} + +fun JsonObject.getRidOfNulls(): JsonObject { + val toRemove = ArrayList() + + for ((key, value) in entrySet()) { + when (value) { + JsonNull.INSTANCE -> toRemove.add(key) + is JsonArray -> value.getRidOfNulls() + is JsonObject -> value.getRidOfNulls() + } + } + + for (key in toRemove) { + remove(key) + } + + return this +} + operator fun LootContext.get(param: LootContextParam): T? { return getParamOrNull(param) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt new file mode 100644 index 000000000..b37fb23a9 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/ItemPredicateCodec.kt @@ -0,0 +1,27 @@ +package ru.dbotthepony.mc.otm.data + +import com.google.gson.JsonObject +import com.google.gson.JsonParseException +import com.google.gson.JsonSyntaxException +import com.mojang.datafixers.util.Pair +import com.mojang.serialization.Codec +import com.mojang.serialization.DataResult +import com.mojang.serialization.DynamicOps +import com.mojang.serialization.JsonOps +import net.minecraft.advancements.critereon.ItemPredicate + +object ItemPredicateCodec : Codec { + override fun encode(input: ItemPredicate, ops: DynamicOps, prefix: T): DataResult { + return DataResult.success(JsonOps.INSTANCE.convertTo(ops, input.serializeToJson().let { if (it is JsonObject) it.getRidOfNulls() else it })) + } + + override fun decode(ops: DynamicOps, input: T): DataResult> { + return try { + DataResult.success(Pair(ItemPredicate.fromJson(ops.convertTo(JsonOps.INSTANCE, input)), ops.empty())) + } catch (err: JsonSyntaxException) { + DataResult.error { "Failed to deserialize ItemPredicate: ${err.message}" } + } catch (err: JsonParseException) { + DataResult.error { "Failed to deserialize ItemPredicate: ${err.message}" } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/exopack/AbstractExoPackSlotUpgradeItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/exopack/AbstractExoPackSlotUpgradeItem.kt index d2dbcb804..591ae73ac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/exopack/AbstractExoPackSlotUpgradeItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/exopack/AbstractExoPackSlotUpgradeItem.kt @@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.isExplosion import ru.dbotthepony.mc.otm.core.isFire import ru.dbotthepony.mc.otm.runIfClient +import ru.dbotthepony.mc.otm.triggers.ExopackSlotsExpandedTrigger import java.util.UUID abstract class AbstractExoPackSlotUpgradeItem(properties: Properties = defaultProperties()) : Item(properties) { @@ -105,6 +106,7 @@ abstract class AbstractExoPackSlotUpgradeItem(properties: Properties = defaultPr matteryPlayer.exoPackSlotModifier[UUID.randomUUID()] = slotCount } + ExopackSlotsExpandedTrigger.trigger(player, slotCount, matteryPlayer.exoPackContainer.containerSize) player.displayClientMessage(TranslatableComponent("otm.exopack_upgrades.slots_upgraded", slotCount).withStyle(ChatFormatting.DARK_GREEN), false) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoPackInventoryMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoPackInventoryMenu.kt index 59ef84a53..ccf112f43 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoPackInventoryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoPackInventoryMenu.kt @@ -124,7 +124,7 @@ class ExoPackInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen } val furnaceOutputs: List = capability.smelters.map { - object : MachineOutputSlot(it.output, 0, onTake = ::popFurnaceExp) { + object : MachineOutputSlot(it.output, 0, onTake = { popFurnaceExp() }) { override fun mayPickup(player: Player): Boolean { return super.mayPickup(player) && capability.isExoPackSmeltingInstalled } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt index ae8d1dc44..74bda90bd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt @@ -64,19 +64,19 @@ open class UserFilteredSlot(container: Container, index: Int, x: Int = 0, y: Int } } -open class MachineOutputSlot(container: Container, index: Int, x: Int = 0, y: Int = 0, val onTake: () -> Unit = {}) : MatterySlot(container, index, x, y) { +open class MachineOutputSlot(container: Container, index: Int, x: Int = 0, y: Int = 0, val onTake: (ItemStack) -> Unit = {}) : MatterySlot(container, index, x, y) { override fun mayPlace(itemStack: ItemStack): Boolean { return false } override fun onTake(pPlayer: Player, pStack: ItemStack) { super.onTake(pPlayer, pStack) - this.onTake.invoke() + this.onTake.invoke(pStack) } override fun onQuickCraft(pStack: ItemStack, pAmount: Int) { super.onQuickCraft(pStack, pAmount) - this.onTake.invoke() + this.onTake.invoke(pStack) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterReplicatorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterReplicatorMenu.kt index 949333bbb..684dac899 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterReplicatorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterReplicatorMenu.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.menu.matter +import net.minecraft.server.level.ServerPlayer import kotlin.jvm.JvmOverloads import net.minecraft.world.entity.player.Inventory import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity @@ -7,12 +8,15 @@ import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget import net.minecraft.world.SimpleContainer import ru.dbotthepony.mc.otm.core.immutableList +import ru.dbotthepony.mc.otm.core.isNotEmpty +import ru.dbotthepony.mc.otm.item.matter.MatterDustItem import ru.dbotthepony.mc.otm.menu.MachineOutputSlot import ru.dbotthepony.mc.otm.menu.MatteryPoweredMenu import ru.dbotthepony.mc.otm.menu.input.EnergyConfigPlayerInput import ru.dbotthepony.mc.otm.menu.input.ItemConfigPlayerInput import ru.dbotthepony.mc.otm.menu.widget.ProfiledLevelGaugeWidget import ru.dbotthepony.mc.otm.registry.MMenus +import ru.dbotthepony.mc.otm.triggers.TakeItemOutOfReplicatorTrigger class MatterReplicatorMenu @JvmOverloads constructor( p_38852_: Int, @@ -30,7 +34,9 @@ class MatterReplicatorMenu @JvmOverloads constructor( val container = tile?.container ?: SimpleContainer(5) storageSlots = immutableList(5) { - addStorageSlot(MachineOutputSlot(container, it)) + addStorageSlot(MachineOutputSlot(container, it, onTake = { + if (inventory.player is ServerPlayer && it.isNotEmpty) + TakeItemOutOfReplicatorTrigger.trigger(inventory.player as ServerPlayer, it) })) } addInventorySlots() 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 9dfb64918..c8ced79fb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -44,11 +44,17 @@ 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.ExopackBatterySlotTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackGainedCraftingTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackGainedSmeltingTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackObtainedTrigger +import ru.dbotthepony.mc.otm.triggers.ExopackSlotsExpandedTrigger import ru.dbotthepony.mc.otm.triggers.FallDampenersSaveTrigger import ru.dbotthepony.mc.otm.triggers.NailedEntityTrigger import ru.dbotthepony.mc.otm.triggers.NanobotsArmorTrigger import ru.dbotthepony.mc.otm.triggers.ShockwaveDamageMobTrigger import ru.dbotthepony.mc.otm.triggers.ShockwaveTrigger +import ru.dbotthepony.mc.otm.triggers.TakeItemOutOfReplicatorTrigger object MRegistry { private val features = RegistryDelegate>("android_features") @@ -254,6 +260,12 @@ object MRegistry { CriteriaTriggers.register(KillAsAndroidTrigger) CriteriaTriggers.register(AndroidTravelUnderwater) CriteriaTriggers.register(NailedEntityTrigger) + CriteriaTriggers.register(ExopackObtainedTrigger) + CriteriaTriggers.register(ExopackGainedSmeltingTrigger) + CriteriaTriggers.register(ExopackGainedCraftingTrigger) + CriteriaTriggers.register(ExopackSlotsExpandedTrigger) + CriteriaTriggers.register(ExopackBatterySlotTrigger) + CriteriaTriggers.register(TakeItemOutOfReplicatorTrigger) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt deleted file mode 100644 index 4a7a4a26c..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidBatteryTrigger.kt +++ /dev/null @@ -1,40 +0,0 @@ -package ru.dbotthepony.mc.otm.triggers - -import com.google.gson.JsonObject -import net.minecraft.advancements.critereon.* -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.nbt.set -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_286603_: ContextAwarePredicate, - 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, ContextAwarePredicate.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/AndroidStatusTriggers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidStatusTriggers.kt deleted file mode 100644 index 7efbf0e6d..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/AndroidStatusTriggers.kt +++ /dev/null @@ -1,95 +0,0 @@ -package ru.dbotthepony.mc.otm.triggers - -import com.google.gson.JsonObject -import net.minecraft.advancements.critereon.* -import net.minecraft.resources.ResourceLocation -import net.minecraft.server.level.ServerPlayer -import ru.dbotthepony.mc.otm.OverdriveThatMatters - -object BecomeAndroidTrigger : SimpleCriterionTrigger() { - val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "become_android") - - override fun getId(): ResourceLocation { - return ID - } - - override fun createInstance( - p_66248_: JsonObject, - p_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} - -object BecomeAndroidSleepTrigger : SimpleCriterionTrigger() { - val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "become_android_sleep") - - override fun getId(): ResourceLocation { - return ID - } - - override fun createInstance( - p_66248_: JsonObject, - p_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} - -object BecomeAndroidDeathTrigger : SimpleCriterionTrigger() { - val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "become_android_death") - - override fun getId(): ResourceLocation { - return ID - } - - override fun createInstance( - p_66248_: JsonObject, - p_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} - -object BecomeHumaneTrigger : SimpleCriterionTrigger() { - val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "become_humane") - - override fun getId(): ResourceLocation { - return ID - } - - override fun createInstance( - p_66248_: JsonObject, - p_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/BlackHoleTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/BlackHoleTrigger.kt deleted file mode 100644 index 3f33a3b0d..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/BlackHoleTrigger.kt +++ /dev/null @@ -1,32 +0,0 @@ -package ru.dbotthepony.mc.otm.triggers - -import com.google.gson.JsonObject -import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance -import net.minecraft.advancements.critereon.ContextAwarePredicate -import net.minecraft.advancements.critereon.DeserializationContext -import net.minecraft.advancements.critereon.SimpleCriterionTrigger -import net.minecraft.resources.ResourceLocation -import net.minecraft.server.level.ServerPlayer -import ru.dbotthepony.mc.otm.OverdriveThatMatters - -object BlackHoleTrigger : SimpleCriterionTrigger() { - val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "black_hole_pull") - - override fun getId(): ResourceLocation { - return ID - } - - override fun createInstance( - p_66248_: JsonObject, - p_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt deleted file mode 100644 index 4db93ebed..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/EnderTeleporterFallDeathTrigger.kt +++ /dev/null @@ -1,32 +0,0 @@ -package ru.dbotthepony.mc.otm.triggers - -import com.google.gson.JsonObject -import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance -import net.minecraft.advancements.critereon.ContextAwarePredicate -import net.minecraft.advancements.critereon.DeserializationContext -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_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ExopackTriggers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ExopackTriggers.kt new file mode 100644 index 000000000..c036e5556 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ExopackTriggers.kt @@ -0,0 +1,55 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import com.mojang.serialization.Codec +import com.mojang.serialization.codecs.RecordCodecBuilder +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.ContextAwarePredicate +import net.minecraft.advancements.critereon.DeserializationContext +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.fromJsonStrict +import ru.dbotthepony.mc.otm.core.toJsonStrict + +val ExopackObtainedTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "exopack_obtained")) +val ExopackGainedCraftingTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "exopack_gained_crafting")) +val ExopackGainedSmeltingTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "exopack_gained_smelting")) + +val ExopackBatterySlotTrigger = ItemTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "exopack_battery_slot")) + +object ExopackSlotsExpandedTrigger : SimpleCriterionTrigger() { + val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "exopack_expanded") + + override fun getId(): ResourceLocation { + return ID + } + + val codec: Codec = RecordCodecBuilder.create { + it.group( + Codec.intRange(0, Int.MAX_VALUE).optionalFieldOf("minGained", 0).forGetter(Instance::minGained), + Codec.intRange(0, Int.MAX_VALUE).optionalFieldOf("minTotal", 0).forGetter(Instance::minTotal), + ).apply(it, ::Instance) + } + + fun trigger(player: ServerPlayer, gained: Int, total: Int) { + trigger(player) { it.minGained <= gained && it.minTotal <= total } + } + + override fun createInstance(p_66248_: JsonObject, p_286603_: ContextAwarePredicate, p_66250_: DeserializationContext): Instance { + return codec.fromJsonStrict(p_66248_) + } + + data class Instance(val minGained: Int = 0, val minTotal: Int = 0) : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) { + init { + require(minGained >= 0) { "Invalid minGained $minGained" } + require(minTotal >= 0) { "Invalid minTotal $minTotal" } + } + + override fun serializeToJson(p_16979_: SerializationContext): JsonObject { + return codec.toJsonStrict(this) as JsonObject + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt deleted file mode 100644 index 3acd19f8b..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/FallDampenersSaveTrigger.kt +++ /dev/null @@ -1,32 +0,0 @@ -package ru.dbotthepony.mc.otm.triggers - -import com.google.gson.JsonObject -import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance -import net.minecraft.advancements.critereon.ContextAwarePredicate -import net.minecraft.advancements.critereon.DeserializationContext -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_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance - } - - fun trigger(player: ServerPlayer) { - trigger(player) { true } - } - - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt new file mode 100644 index 000000000..1b43b2356 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ItemTrigger.kt @@ -0,0 +1,44 @@ +package ru.dbotthepony.mc.otm.triggers + +import com.google.gson.JsonObject +import com.mojang.serialization.Codec +import com.mojang.serialization.codecs.RecordCodecBuilder +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance +import net.minecraft.advancements.critereon.ContextAwarePredicate +import net.minecraft.advancements.critereon.DeserializationContext +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.core.fromJsonStrict +import ru.dbotthepony.mc.otm.core.toJsonStrict +import ru.dbotthepony.mc.otm.data.ItemPredicateCodec + +class ItemTrigger(val ID: ResourceLocation) : SimpleCriterionTrigger() { + override fun getId(): ResourceLocation { + return ID + } + + fun trigger(player: ServerPlayer, item: ItemStack) { + trigger(player) { if (it.invert) !it.predicate.matches(item) else it.predicate.matches(item) } + } + + val codec: Codec = RecordCodecBuilder.create { + it.group( + ItemPredicateCodec.fieldOf("predicate").forGetter(Instance::predicate), + Codec.BOOL.optionalFieldOf("invert", false).forGetter(Instance::invert), + ).apply(it, ::Instance) + } + + override fun createInstance(p_66248_: JsonObject, p_286603_: ContextAwarePredicate, p_66250_: DeserializationContext): Instance { + return codec.fromJsonStrict(p_66248_) + } + + inner class Instance(val predicate: ItemPredicate, val invert: Boolean = false) : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) { + override fun serializeToJson(p_16979_: SerializationContext): JsonObject { + return codec.toJsonStrict(this) as JsonObject + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SimpleTriggers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SimpleTriggers.kt new file mode 100644 index 000000000..174884c99 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SimpleTriggers.kt @@ -0,0 +1,17 @@ +package ru.dbotthepony.mc.otm.triggers + +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.OverdriveThatMatters + +val BlackHoleTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "black_hole_pull")) +val FallDampenersSaveTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "fall_dampeners_save")) +val ShockwaveTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "shockwave")) +val EnderTeleporterFallDeathTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "ender_teleporter_fall_death")) + +val BecomeAndroidTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "become_android")) +val BecomeAndroidSleepTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "become_android_sleep")) +val BecomeAndroidDeathTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "become_android_death")) +val BecomeHumaneTrigger = SingletonTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "become_humane")) + +val AndroidBatteryTrigger = ItemTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "android_battery")) +val TakeItemOutOfReplicatorTrigger = ItemTrigger(ResourceLocation(OverdriveThatMatters.MOD_ID, "take_item_out_of_replicator")) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ShockwaveTrigger.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt similarity index 56% rename from src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ShockwaveTrigger.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt index 04d761755..c555138d1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/ShockwaveTrigger.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/triggers/SingletonTrigger.kt @@ -7,26 +7,19 @@ import net.minecraft.advancements.critereon.DeserializationContext import net.minecraft.advancements.critereon.SimpleCriterionTrigger import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerPlayer -import ru.dbotthepony.mc.otm.OverdriveThatMatters - -object ShockwaveTrigger : SimpleCriterionTrigger() { - val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "shockwave") +class SingletonTrigger(val ID: ResourceLocation) : SimpleCriterionTrigger() { override fun getId(): ResourceLocation { return ID } - override fun createInstance( - p_66248_: JsonObject, - p_286603_: ContextAwarePredicate, - p_66250_: DeserializationContext - ): Instance { - return Instance + override fun createInstance(p_66248_: JsonObject, p_286603_: ContextAwarePredicate, p_66250_: DeserializationContext): AbstractCriterionTriggerInstance { + return instance } fun trigger(player: ServerPlayer) { trigger(player) { true } } - object Instance : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) + val instance = object : AbstractCriterionTriggerInstance(ID, ContextAwarePredicate.ANY) {} }