Reorganize advancements, add exopack and more machine advancements
This commit is contained in:
parent
dfb07cc9c5
commit
5800ddc9ad
@ -508,7 +508,6 @@ object DataGen {
|
||||
AdvancementGenerator { registries, saver, existingFileHelper ->
|
||||
addAdvancements(saver, existingFileHelper, languageProvider)
|
||||
addAndroidAdvancements(saver, existingFileHelper, languageProvider)
|
||||
addMachineAdvancements(saver, existingFileHelper, languageProvider)
|
||||
}
|
||||
)) {}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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}" }
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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"))
|
@ -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) {}
|
||||
}
|
Loading…
Reference in New Issue
Block a user