From 1a30f4d2037d6ffc02292db1ab71df89bd86affa Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 9 Mar 2025 19:54:03 +0700 Subject: [PATCH] Gold Disk, for spawning in dungeons, add Imperfect Bread to dungeons as Gold Disk --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 5 ++ .../mc/otm/datagen/items/ItemModels.kt | 2 + .../mc/otm/datagen/lang/English.kt | 3 + .../mc/otm/datagen/lang/Russian.kt | 3 + .../mc/otm/datagen/loot/LootModifiersData.kt | 13 +++ .../otm/capability/matter/IPatternStorage.kt | 22 +++++ .../mc/otm/item/matter/GoldDiskItem.kt | 84 +++++++++++++++++++ .../mc/otm/item/matter/PatternStorageItem.kt | 36 +++----- .../mc/otm/registry/game/MItems.kt | 3 + 9 files changed, 147 insertions(+), 24 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/GoldDiskItem.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 206133507..8ce8671ac 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -34,6 +34,7 @@ import ru.dbotthepony.mc.otm.datagen.items.MatteryItemModelProvider import ru.dbotthepony.mc.otm.datagen.lang.AddEnglishLanguage import ru.dbotthepony.mc.otm.datagen.models.MatteryBlockModelProvider import ru.dbotthepony.mc.otm.core.registryName +import ru.dbotthepony.mc.otm.core.util.PCG32RandomSource import ru.dbotthepony.mc.otm.data.FlywheelMaterialDataProvider import ru.dbotthepony.mc.otm.datagen.advancements.addAdvancements import ru.dbotthepony.mc.otm.datagen.advancements.addAndroidAdvancements @@ -68,6 +69,10 @@ internal fun modLootTable(string: String) = ResourceKey.create(Registries.LOOT_T object DataGen { const val MOD_ID = OverdriveThatMatters.MOD_ID + // for things which need to be random (e.g. UUIDs), + // so builds continue to be reproducible + val random = PCG32RandomSource(822393994030754753L) + var blockModelProvider: MatteryBlockModelProvider by WriteOnce() private set var itemModelProvider: MatteryItemModelProvider by WriteOnce() diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index 1c4bc7248..94c9b76ab 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -194,6 +194,8 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.generated(MItems.PATTERN_DRIVE_CREATIVE) provider.generated(MItems.PATTERN_DRIVE_CREATIVE2) + provider.withExistingParent(MItems.GOLD_DISK, MItems.PATTERN_DRIVE_CREATIVE.registryName!!) + provider.generated(MItems.MATTER_DUST) provider.generated(MItems.TRITANIUM_DOOR.values) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 673379cff..f3f095f07 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -879,6 +879,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.PATTERN_DRIVE_QUAD, "Quad-Level Pattern Drive") add(MItems.PATTERN_DRIVE_CREATIVE, "Creative Pattern Drive") + add(MItems.GOLD_DISK, "Gold Disk") + add(MItems.GOLD_DISK, "single_item", "Gold Disk (%s)") + add(MItems.PATTERN_DRIVE_CREATIVE2, "Omni-Present Pattern Drive") add(MItems.PATTERN_DRIVE_CREATIVE2, "description1", "Creative-only item") add(MItems.PATTERN_DRIVE_CREATIVE2, "description2", "Holds pattern for every item that have matter value") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index ae0d7b49b..faf9ae2b1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -872,6 +872,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.PATTERN_DRIVE_QUAD, "Четырёхуровневый диск шаблонов") add(MItems.PATTERN_DRIVE_CREATIVE, "Творческий диск шаблонов") + add(MItems.GOLD_DISK, "Золотой диск") + add(MItems.GOLD_DISK, "single_item", "Золотой диск (%s)") + add(MItems.PATTERN_DRIVE_CREATIVE2, "Вездесущий диск шаблонов") add(MItems.PATTERN_DRIVE_CREATIVE2, "description1", "Предмет режима творчества") add(MItems.PATTERN_DRIVE_CREATIVE2, "description2", "Содержит в себе шаблоны всех предметов, которые имеют значение материи") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt index 3305a8958..d186819db 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt @@ -5,6 +5,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.util.valueproviders.UniformInt import net.minecraft.world.entity.EntityType import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items import net.minecraft.world.level.storage.loot.BuiltInLootTables import net.minecraft.world.level.storage.loot.LootTable import net.minecraft.world.level.storage.loot.predicates.LootItemCondition @@ -18,9 +19,11 @@ import ru.dbotthepony.mc.otm.data.condition.HasExoPackCondition import ru.dbotthepony.mc.otm.data.condition.ItemInInventoryCondition import ru.dbotthepony.mc.otm.data.condition.KilledByRealPlayerOrIndirectly import ru.dbotthepony.mc.otm.data.loot.LootPoolAppender +import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.modLootTable import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem +import ru.dbotthepony.mc.otm.item.matter.GoldDiskItem import ru.dbotthepony.mc.otm.registry.game.MItems @Suppress("FunctionName") @@ -66,6 +69,11 @@ fun addLootModifiers(it: LootModifiers) { apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(4, 10))) }, + singleItem(MItems.GOLD_DISK) { + chanceCondition(0.1) + apply(GoldDiskItem.patterns(DataGen.random, MItems.IMPERFECT_BREAD)) + }, + singleItem(MItems.PROCEDURAL_BATTERY) { chanceCondition(0.15) @@ -122,6 +130,11 @@ fun addLootModifiers(it: LootModifiers) { chanceCondition(0.1) apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(27, 56), UniformInt.of(2, 6))) }, + + singleItem(MItems.GOLD_DISK) { + chanceCondition(0.15) + apply(GoldDiskItem.patterns(DataGen.random, Items.ENDER_PEARL)) + }, )) it.add("dungeon_pill", PlainLootAppender( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt index 70238b168..d5ebbd7fb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt @@ -1,7 +1,13 @@ package ru.dbotthepony.mc.otm.capability.matter +import net.minecraft.ChatFormatting +import net.minecraft.network.chat.Component import net.minecraft.world.item.Item +import net.minecraft.world.item.Item.TooltipContext +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.TooltipFlag import ru.dbotthepony.kommons.math.RGBAColor +import ru.dbotthepony.mc.otm.core.TranslatableComponent import java.util.* import java.util.function.Predicate import java.util.stream.Collectors @@ -72,3 +78,19 @@ fun IPatternStorage.getBarWidth(): Int { fun IPatternStorage.getBarColor(): Int { return RGBAColor.LOW_PATTERNS.linearInterpolation((storedPatterns / patternCapacity).toFloat(), RGBAColor.FULL_PATTERNS).toBGR() } + +fun IPatternStorage.gatherTooltip( + context: TooltipContext, + components: MutableList, + tooltipType: TooltipFlag +) { + for (state in patterns) { + components.add( + TranslatableComponent( + "otm.item.pattern.line", + state.item.getName(ItemStack(state.item, 1)), + String.format("%.2f", state.researchPercent * 100.0) + ).withStyle(ChatFormatting.AQUA) + ) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/GoldDiskItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/GoldDiskItem.kt new file mode 100644 index 000000000..dcdfda6c4 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/GoldDiskItem.kt @@ -0,0 +1,84 @@ +package ru.dbotthepony.mc.otm.item.matter + +import com.google.common.collect.ImmutableList +import net.minecraft.network.chat.Component +import net.minecraft.util.RandomSource +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items +import net.minecraft.world.item.TooltipFlag +import net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction +import net.minecraft.world.level.storage.loot.functions.SetComponentsFunction +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent +import ru.dbotthepony.mc.otm.capability.MatteryCapability +import ru.dbotthepony.mc.otm.capability.matter.IPatternStorage +import ru.dbotthepony.mc.otm.capability.matter.PatternInsertFailure +import ru.dbotthepony.mc.otm.capability.matter.PatternInsertStatus +import ru.dbotthepony.mc.otm.capability.matter.PatternState +import ru.dbotthepony.mc.otm.capability.matter.gatherTooltip +import ru.dbotthepony.mc.otm.core.TextComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.core.stream +import ru.dbotthepony.mc.otm.item.MatteryItem +import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener +import ru.dbotthepony.mc.otm.registry.game.MDataComponentTypes +import java.util.* +import java.util.stream.Stream + +class GoldDiskItem(parameters: Properties) : MatteryItem(parameters), CapabilitiesRegisterListener { + override fun registerCapabilities(event: RegisterCapabilitiesEvent) { + event.registerItem(MatteryCapability.PATTERN_ITEM, { o, _ -> ItemPatternStorageCapability(o) }, this) + } + + override fun getName(stack: ItemStack): Component { + val data = stack[MDataComponentTypes.PATTERNS] + + if (data == null || data.size > 1) { + return super.getName(stack) + } else if (data.size == 0 || data[0].item == Items.AIR) { + return TranslatableComponent("$descriptionId.single_item", TextComponent("???")) + } else { + return TranslatableComponent("$descriptionId.single_item", data[0].item.getName(ItemStack(data[0].item))) + } + } + + override fun appendHoverText( + itemStack: ItemStack, + context: TooltipContext, + components: MutableList, + tooltipType: TooltipFlag + ) { + itemStack.getCapability(MatteryCapability.PATTERN_ITEM)?.gatherTooltip(context, components, tooltipType) + + super.appendHoverText(itemStack, context, components, tooltipType) + } + + class ItemPatternStorageCapability(val stack: ItemStack) : IPatternStorage { + override val patternCapacity: Int get() { + return stack[MDataComponentTypes.PATTERNS]?.size ?: 0 + } + + override val storedPatterns: Int get() { + return patternCapacity + } + + override val patterns: Stream get() { + return stack[MDataComponentTypes.PATTERNS]?.stream() ?: Stream.empty() + } + + override fun insertPattern(pattern: PatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { + return PatternInsertFailure + } + } + + companion object { + fun patterns(random: RandomSource, vararg items: Item): LootItemConditionalFunction.Builder<*> { + return SetComponentsFunction.setComponent( + MDataComponentTypes.PATTERNS, + items + .stream() + .map { PatternState(UUID(random.nextLong(), random.nextLong()), it, 1.0) } + .collect(ImmutableList.toImmutableList())) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt index eb4f62599..ee85ced91 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt @@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.item.matter import com.google.common.collect.ImmutableList import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component -import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Rarity import net.minecraft.world.item.TooltipFlag @@ -15,23 +14,20 @@ import ru.dbotthepony.mc.otm.capability.matter.PatternInsertInserted import ru.dbotthepony.mc.otm.capability.matter.PatternInsertStatus import ru.dbotthepony.mc.otm.capability.matter.PatternInsertUpdated import ru.dbotthepony.mc.otm.capability.matter.PatternState +import ru.dbotthepony.mc.otm.capability.matter.gatherTooltip import ru.dbotthepony.mc.otm.capability.matter.getBarColor import ru.dbotthepony.mc.otm.capability.matter.getBarWidth import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.item.MatteryItem import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener import ru.dbotthepony.mc.otm.registry.game.MDataComponentTypes import java.util.stream.Stream -class PatternStorageItem : Item, CapabilitiesRegisterListener { +class PatternStorageItem : MatteryItem, CapabilitiesRegisterListener { private val _capacity: () -> Int val capacity get() = _capacity.invoke() var isCreative: Boolean - constructor(capacity: Int) : super(Properties().stacksTo(1)) { - _capacity = { capacity } - isCreative = false - } - constructor(capacity: () -> Int) : super(Properties().stacksTo(1)) { _capacity = capacity isCreative = false @@ -47,29 +43,21 @@ class PatternStorageItem : Item, CapabilitiesRegisterListener { } override fun appendHoverText( - p_41421_: ItemStack, - p_339594_: TooltipContext, - list: MutableList, - p_41424_: TooltipFlag + itemStack: ItemStack, + context: TooltipContext, + components: MutableList, + tooltipType: TooltipFlag ) { - p_41421_.getCapability(MatteryCapability.PATTERN_ITEM)?.let { + itemStack.getCapability(MatteryCapability.PATTERN_ITEM)?.let { if (isCreative) - list.add(TranslatableComponent("otm.item.pattern.infinite.stored", it.storedPatterns).withStyle(ChatFormatting.GRAY)) + components.add(TranslatableComponent("otm.item.pattern.infinite.stored", it.storedPatterns).withStyle(ChatFormatting.GRAY)) else - list.add(TranslatableComponent("otm.item.pattern.stored", it.storedPatterns, it.patternCapacity).withStyle(ChatFormatting.GRAY)) + components.add(TranslatableComponent("otm.item.pattern.stored", it.storedPatterns, it.patternCapacity).withStyle(ChatFormatting.GRAY)) - for (state in it.patterns) { - list.add( - TranslatableComponent( - "otm.item.pattern.line", - state.item.getName(ItemStack(state.item, 1)), - String.format("%.2f", state.researchPercent * 100.0) - ).withStyle(ChatFormatting.AQUA) - ) - } + it.gatherTooltip(context, components, tooltipType) } - super.appendHoverText(p_41421_, p_339594_, list, p_41424_) + super.appendHoverText(itemStack, context, components, tooltipType) } override fun isBarVisible(p_150899_: ItemStack): Boolean { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt index 5857a511e..eacba6edc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt @@ -60,6 +60,7 @@ import ru.dbotthepony.mc.otm.item.exopack.ExopackSlotUpgradeItem import ru.dbotthepony.mc.otm.item.exopack.ExopackUpgradeItem import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem import ru.dbotthepony.mc.otm.item.matter.CreativePatternItem +import ru.dbotthepony.mc.otm.item.matter.GoldDiskItem import ru.dbotthepony.mc.otm.item.matter.MatterCapacitorItem import ru.dbotthepony.mc.otm.item.matter.MatterDustItem import ru.dbotthepony.mc.otm.item.matter.PatternStorageItem @@ -497,6 +498,8 @@ object MItems { val PATTERN_DRIVE_CREATIVE: Item by registry.register(MNames.PATTERN_DRIVE_CREATIVE) { PatternStorageItem() } val PATTERN_DRIVE_CREATIVE2: Item by registry.register(MNames.PATTERN_DRIVE_CREATIVE2) { CreativePatternItem() } + val GOLD_DISK: Item by registry.register("gold_disk") { GoldDiskItem(Properties().stacksTo(16).rarity(Rarity.RARE)) } + val PORTABLE_CONDENSATION_DRIVE: Item by registry.register(MNames.PORTABLE_CONDENSATION_DRIVE) { PortableCondensationDriveItem(4000) } val PORTABLE_DENSE_CONDENSATION_DRIVE: Item by registry.register(MNames.PORTABLE_DENSE_CONDENSATION_DRIVE) { PortableCondensationDriveItem(25000) }