Reorganize advancements, add exopack and more machine advancements

This commit is contained in:
DBotThePony 2023-07-09 22:54:21 +07:00
parent dfb07cc9c5
commit 5800ddc9ad
Signed by: DBot
GPG Key ID: DCC23B5715498507
23 changed files with 623 additions and 323 deletions

View File

@ -508,7 +508,6 @@ object DataGen {
AdvancementGenerator { registries, saver, existingFileHelper ->
addAdvancements(saver, existingFileHelper, languageProvider)
addAndroidAdvancements(saver, existingFileHelper, languageProvider)
addMachineAdvancements(saver, existingFileHelper, languageProvider)
}
)) {}

View File

@ -38,6 +38,8 @@ fun addAdvancements(serializer: Consumer<Advancement>, 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<Advancement>, 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<Advancement>, 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<Advancement>, 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()

View File

@ -48,7 +48,7 @@ fun addAndroidAdvancements(serializer: Consumer<Advancement>, 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<Advancement>, 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<Advancement>, 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<Advancement>, 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<Advancement>, 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<Advancement>, 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<Advancement>, existingFileHelper
russian("Вызовите ударную волну при приземлении")
},
)
.addCriterion("shockwave", ShockwaveTrigger.Instance)
.addCriterion("shockwave", ShockwaveTrigger.instance)
.save(serializer, modLocation("android/shockwave"), existingFileHelper)
AdvancementBuilder()

View File

@ -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<Advancement>, 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)
}

View File

@ -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,29 +26,36 @@ private data class CraftEntry(
val russianName: String? = null,
val russianSuffix: String? = null,
)
) {
fun make(serializer: Consumer<Advancement>, existingFileHelper: ExistingFileHelper, parent: Advancement, translation: MatteryLanguageProvider.MultiBuilder): Advancement {
val path = item.registryName!!.path
fun addMachineAdvancements(serializer: Consumer<Advancement>, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider) {
val translation = lang.MultiBuilder("otm.advancements.machine")
val translated = translation.add("$path.desc", "Craft a %s%s") {
russian("Создайте %s%s")
}
val root = AdvancementBuilder()
.requirements(RequirementsStrategy.OR)
val translatedSuffix = translation.add("$path.suffix", if (englishSuffix != null) ". $englishSuffix" else "") {
russian(if (russianSuffix != null) ". $russianSuffix" else "")
}
return AdvancementBuilder()
.parent(parent)
.display(
itemStack = ItemStack(MItems.CHEMICAL_GENERATOR),
title = translation.add("root", "Tritanium Empowered Machinery") {
russian("Тританово запитанные механизмы")
itemStack = ItemStack(item),
title = translation.add(path, englishName) {
if (russianName != null) {
russian(russianName)
}
},
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")
description = TranslatableComponent(translated.contents.key, item.description, translatedSuffix),
)
.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)
.addCriterion("has_machine", criterion(item))
.save(serializer, modLocation("machines/$path"), existingFileHelper)
}
}
fun addMachineAdvancements(serializer: Consumer<Advancement>, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider, root: Advancement) {
val translation = lang.MultiBuilder("otm.advancements.machine")
val chem = AdvancementBuilder()
.parent(root)
@ -74,55 +85,98 @@ fun addMachineAdvancements(serializer: Consumer<Advancement>, 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<Item, Advancement>()
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 = "Переворачиваем песочные часы")
val translatedSuffix = translation.add("$path.suffix", if (entry.englishSuffix != null) ". " + entry.englishSuffix else "") {
russian(if (entry.russianSuffix != null) ". " + entry.russianSuffix else "")
}
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)
built[entry.item] = AdvancementBuilder()
.parent(press)
replicator.make(serializer, existingFileHelper, it, translation).also {
AdvancementBuilder()
.parent(it)
.display(
itemStack = ItemStack(entry.item),
title = translation.add(path, entry.englishName) {
if (entry.russianName != null) {
russian(entry.russianName)
}
itemStack = ItemStack(Items.BREAD),
title = translation.add("replicate_something", "Local Bakery") {
russian("Местная выпечка")
},
description = TranslatableComponent(translated.contents.key, entry.item.description, translatedSuffix),
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("has_machine", criterion(entry.item))
.save(serializer, modLocation("machines/$path"), existingFileHelper)
.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)
}
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)
}

View File

@ -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
}

View File

@ -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)
}
})

View File

@ -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<String>()
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 <T> LootContext.get(param: LootContextParam<T>): T? {
return getParamOrNull(param)
}

View File

@ -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<ItemPredicate> {
override fun <T : Any> encode(input: ItemPredicate, ops: DynamicOps<T>, prefix: T): DataResult<T> {
return DataResult.success(JsonOps.INSTANCE.convertTo(ops, input.serializeToJson().let { if (it is JsonObject) it.getRidOfNulls() else it }))
}
override fun <T : Any> decode(ops: DynamicOps<T>, input: T): DataResult<Pair<ItemPredicate, T>> {
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}" }
}
}
}

View File

@ -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)
}

View File

@ -124,7 +124,7 @@ class ExoPackInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen
}
val furnaceOutputs: List<MachineOutputSlot> = 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
}

View File

@ -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)
}
}

View File

@ -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()

View File

@ -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<AndroidFeatureType<*>>("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)
}
}

View File

@ -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<AndroidBatteryTrigger.Instance>() {
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()
}
}
}
}

View File

@ -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<BecomeAndroidTrigger.Instance>() {
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<BecomeAndroidSleepTrigger.Instance>() {
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<BecomeAndroidDeathTrigger.Instance>() {
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<BecomeHumaneTrigger.Instance>() {
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)
}

View File

@ -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<BlackHoleTrigger.Instance>() {
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)
}

View File

@ -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<EnderTeleporterFallDeathTrigger.Instance>() {
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)
}

View File

@ -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<ExopackSlotsExpandedTrigger.Instance>() {
val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "exopack_expanded")
override fun getId(): ResourceLocation {
return ID
}
val codec: Codec<Instance> = 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
}
}
}

View File

@ -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<FallDampenersSaveTrigger.Instance>() {
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)
}

View File

@ -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<ItemTrigger.Instance>() {
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<Instance> = 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
}
}
}

View File

@ -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"))

View File

@ -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<ShockwaveTrigger.Instance>() {
val ID = ResourceLocation(OverdriveThatMatters.MOD_ID, "shockwave")
class SingletonTrigger(val ID: ResourceLocation) : SimpleCriterionTrigger<AbstractCriterionTriggerInstance>() {
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) {}
}