Items requirement for research, gold plates

This commit is contained in:
DBotThePony 2022-09-25 18:42:10 +07:00
parent 25a1c90012
commit 46819e82c6
Signed by: DBot
GPG Key ID: DCC23B5715498507
10 changed files with 137 additions and 38 deletions

View File

@ -1,5 +1,7 @@
package ru.dbotthepony.mc.otm.datagen package ru.dbotthepony.mc.otm.datagen
import net.minecraft.world.item.Items
import net.minecraftforge.common.Tags
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.android.AndroidResearchType
import ru.dbotthepony.mc.otm.android.feature.ItemMagnetFeature import ru.dbotthepony.mc.otm.android.feature.ItemMagnetFeature
@ -10,6 +12,8 @@ import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider
import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.AndroidFeatures
import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MNames import ru.dbotthepony.mc.otm.registry.MNames
import java.util.LinkedList import java.util.LinkedList
import java.util.function.Consumer import java.util.function.Consumer
@ -21,6 +25,8 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.addFeatureResult(AndroidFeatures.AIR_BAGS) .addFeatureResult(AndroidFeatures.AIR_BAGS)
.withDescription() .withDescription()
.withIcon(ResearchIcons.ICON_AIR_BAGS) .withIcon(ResearchIcons.ICON_AIR_BAGS)
.addItem(Tags.Items.GLASS_PANES, 6)
.addItem(MItemTags.PLATE_IRON)
.build() .build()
serializer.accept(AIR_BAGS) serializer.accept(AIR_BAGS)
@ -29,6 +35,9 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.withExperience(20) .withExperience(20)
.withDescription() .withDescription()
.withIcon(ResearchIcons.ICON_EXTENDED_REACH) .withIcon(ResearchIcons.ICON_EXTENDED_REACH)
.addItem(MItemTags.PLATE_TRITANIUM, 3)
.addItem(MItemTags.PLATE_IRON, 2)
.addItem(MItemTags.GOLD_WIRES, 4)
.build() .build()
serializer.accept(IMPROVED_LIMBS) serializer.accept(IMPROVED_LIMBS)
@ -39,6 +48,9 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.withDescription() .withDescription()
.withIcon(ResearchIcons.ICON_STEP_ASSIST) .withIcon(ResearchIcons.ICON_STEP_ASSIST)
.addPrerequisite(IMPROVED_LIMBS) .addPrerequisite(IMPROVED_LIMBS)
.addItem(MItemTags.PISTONS, 2)
.addItem(MItemTags.PLATE_TRITANIUM, 4)
.addItem(MItemTags.COPPER_WIRES, 6)
.build() .build()
serializer.accept(STEP_ASSIST) serializer.accept(STEP_ASSIST)
@ -49,6 +61,10 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.addPrerequisite(IMPROVED_LIMBS) .addPrerequisite(IMPROVED_LIMBS)
.withDescription() .withDescription()
.withIcon(ResearchIcons.ICON_EXTENDED_REACH) .withIcon(ResearchIcons.ICON_EXTENDED_REACH)
.addItem(MItemTags.PISTONS, 2)
.addItem(MItemTags.PLATE_TRITANIUM, 4)
.addItem(MItemTags.GOLD_WIRES, 6)
.addItem(MItems.QUANTUM_TRANSCEIVER)
.build() .build()
serializer.accept(EXTENDED_REACH) serializer.accept(EXTENDED_REACH)
@ -58,6 +74,12 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.withDescription() .withDescription()
.withIcon(ResearchIcons.ICON_NIGHT_VISION) .withIcon(ResearchIcons.ICON_NIGHT_VISION)
.addFeatureResult(AndroidFeatures.NIGHT_VISION) .addFeatureResult(AndroidFeatures.NIGHT_VISION)
.addItem(Tags.Items.GLASS_PANES_COLORLESS, 4)
.addItem(Tags.Items.DUSTS_REDSTONE, 4)
.addItem(MItemTags.PLATE_TRITANIUM, 2)
.addItem(MItems.ELECTRIC_PARTS, 3)
.addItem(MItemTags.ADVANCED_CIRCUIT)
.addItem(Items.ENDER_EYE, 2)
.build() .build()
serializer.accept(NIGHT_VISION) serializer.accept(NIGHT_VISION)
@ -77,6 +99,8 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.addFeatureResult(OverdriveThatMatters.loc(MNames.NANOBOTS_ARMOR)) .addFeatureResult(OverdriveThatMatters.loc(MNames.NANOBOTS_ARMOR))
.withIcon(ResearchIcons.ICON_ARMOR) .withIcon(ResearchIcons.ICON_ARMOR)
.addBlocker(OverdriveThatMatters.loc(MNames.ATTACK_BOOST_1), rigid = true) .addBlocker(OverdriveThatMatters.loc(MNames.ATTACK_BOOST_1), rigid = true)
.addItem(MItemTags.PLATE_TRITANIUM, 4)
.addItem(MItemTags.COPPER_WIRES, 8)
.build() .build()
serializer.accept(NANOBOTS_ARMOR) serializer.accept(NANOBOTS_ARMOR)
@ -102,10 +126,12 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
(i + 1) * 6 (i + 1) * 6
) )
) )
.addItem(MItemTags.COPPER_WIRES, 4 + i * 2)
.addFeatureResult(OverdriveThatMatters.loc(MNames.LIMB_OVERCLOCKING), i) .addFeatureResult(OverdriveThatMatters.loc(MNames.LIMB_OVERCLOCKING), i)
if (i > 0) { if (i > 0) {
research.addPrerequisite(OverdriveThatMatters.loc(MNames.LIMB_OVERCLOCKING_LIST[i - 1]), rigid = true) research.addPrerequisite(OverdriveThatMatters.loc(MNames.LIMB_OVERCLOCKING_LIST[i - 1]), rigid = true)
research.addItem(MItemTags.GOLD_WIRES, i * 2)
} }
research.build() research.build()
@ -145,6 +171,9 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
"android_research.overdrive_that_matters.nanobots_regeneration.description" "android_research.overdrive_that_matters.nanobots_regeneration.description"
) )
) )
.addItem(MItems.MATTER_CAPACITOR_PARTS, 1)
.addItem(Items.SUGAR, 2 + i * 2)
.addItem(Tags.Items.DUSTS_REDSTONE, 2 + i * 2)
.addFeatureResult(AndroidFeatures.NANOBOTS_REGENERATION, i) .addFeatureResult(AndroidFeatures.NANOBOTS_REGENERATION, i)
if (i > 0) { if (i > 0) {
@ -179,6 +208,8 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
(i + 1) * 6 (i + 1) * 6
) )
) )
.addItem(MItemTags.PLATE_TRITANIUM, 2 + i * 2)
.addItem(Items.SUGAR, 1 + i)
.addFeatureResult(AndroidFeatures.NANOBOTS_ARMOR, 0, .addFeatureResult(AndroidFeatures.NANOBOTS_ARMOR, 0,
transformersUp = listOf(NanobotsArmorFeature.STRENGTH_TRANSFORMER_UP.bind(level)), transformersUp = listOf(NanobotsArmorFeature.STRENGTH_TRANSFORMER_UP.bind(level)),
transformersDown = listOf(NanobotsArmorFeature.STRENGTH_TRANSFORMER_DOWN.bind(level)), transformersDown = listOf(NanobotsArmorFeature.STRENGTH_TRANSFORMER_DOWN.bind(level)),
@ -205,6 +236,7 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
(i + 1) * 6 (i + 1) * 6
) )
) )
.addItem(Tags.Items.DUSTS_REDSTONE, 4 + i * 4)
.addFeatureResult(AndroidFeatures.NANOBOTS_ARMOR, 0, .addFeatureResult(AndroidFeatures.NANOBOTS_ARMOR, 0,
transformersUp = listOf(NanobotsArmorFeature.SPEED_TRANSFORMER_UP.bind(level)), transformersUp = listOf(NanobotsArmorFeature.SPEED_TRANSFORMER_UP.bind(level)),
transformersDown = listOf(NanobotsArmorFeature.SPEED_TRANSFORMER_DOWN.bind(level)), transformersDown = listOf(NanobotsArmorFeature.SPEED_TRANSFORMER_DOWN.bind(level)),
@ -227,6 +259,10 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.withIcon(ResearchIcons.ICON_SHOCKWAVE) .withIcon(ResearchIcons.ICON_SHOCKWAVE)
.addFeatureResult(AndroidFeatures.SHOCKWAVE) .addFeatureResult(AndroidFeatures.SHOCKWAVE)
.addPrerequisite(attackBoostList[2]) .addPrerequisite(attackBoostList[2])
.addItem(Tags.Items.ENDER_PEARLS)
.addItem(Tags.Items.DUSTS_REDSTONE, 2)
.addItem(MItemTags.GOLD_WIRES, 4)
.addItem(MItemTags.PLATE_GOLD, 2)
.build() .build()
val ITEM_MAGNET = val ITEM_MAGNET =
@ -237,6 +273,9 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
.withIcon(ResearchIcons.ICON_ITEM_MAGNET) .withIcon(ResearchIcons.ICON_ITEM_MAGNET)
.addFeatureResult(AndroidFeatures.ITEM_MAGNET) .addFeatureResult(AndroidFeatures.ITEM_MAGNET)
.addPrerequisite(STEP_ASSIST) .addPrerequisite(STEP_ASSIST)
.addItem(MItems.QUANTUM_TRANSCEIVER)
.addItem(Tags.Items.DUSTS_REDSTONE, 4)
.addItem(Items.ENDER_EYE)
.build() .build()
serializer.accept(SHOCKWAVE) serializer.accept(SHOCKWAVE)
@ -274,11 +313,11 @@ fun addResearchData(serializer: Consumer<AndroidResearchType>, lang: MatteryLang
add(STEP_ASSIST, "description", "Allows unit to step up whole blocks") add(STEP_ASSIST, "description", "Allows unit to step up whole blocks")
add(ITEM_MAGNET, "Item Magnet") add(ITEM_MAGNET, "Item Magnet")
add(ITEM_MAGNET, "description0", "Pulls nearby items to you while active") add(ITEM_MAGNET, "description0", "Pulls nearby items to unit while active")
add(ITEM_MAGNET, "description1", "Drains energy for each item stack it pulls") add(ITEM_MAGNET, "description1", "Drains energy for each item stack it pulls")
add(SHOCKWAVE, "Shockwave Pulsator") add(SHOCKWAVE, "Shockwave Pulsator")
add(SHOCKWAVE, "description", "Releases a shockwave around you, damaging everything in small radius, as you quickly land on ground") add(SHOCKWAVE, "description", "Releases a shockwave around unit, damaging everything in small radius, as unit quickly land on ground")
add(attackBoostList[0], "Attack Boost %s") add(attackBoostList[0], "Attack Boost %s")
add(attackBoostList[0], "description", "Increases total melee attack strength by %s%%") add(attackBoostList[0], "description", "Increases total melee attack strength by %s%%")

View File

@ -391,6 +391,7 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.MACHINE_FRAME, "Machine Frame") add(MItems.MACHINE_FRAME, "Machine Frame")
add(MItems.TRITANIUM_PLATE, "Tritanium Plate") add(MItems.TRITANIUM_PLATE, "Tritanium Plate")
add(MItems.IRON_PLATE, "Iron Plate") add(MItems.IRON_PLATE, "Iron Plate")
add(MItems.GOLD_PLATE, "Gold Plate")
add(MItems.COPPER_WIRING, "Copper Wiring") add(MItems.COPPER_WIRING, "Copper Wiring")
add(MItems.GOLD_WIRING, "Gold Wiring") add(MItems.GOLD_WIRING, "Gold Wiring")
add(MItems.PORTABLE_CONDENSATION_DRIVE_CASING, "Portable Condensation Drive Casing") add(MItems.PORTABLE_CONDENSATION_DRIVE_CASING, "Portable Condensation Drive Casing")
@ -458,6 +459,9 @@ private fun research(provider: MatteryLanguageProvider) {
add("android_research.status.requires", "Requires %s to be researched") add("android_research.status.requires", "Requires %s to be researched")
add("android_research.status.blocks", "Locks %s") add("android_research.status.blocks", "Locks %s")
add("android_research.status.blocked_by", "Locked by %s") add("android_research.status.blocked_by", "Locked by %s")
add("android_research.status.requires_item", "Requires %s")
add("android_research.status.requires_item_multiple0", "Requires %s x%s (missing %s)")
add("android_research.status.requires_item_multiple1", "Requires %s x%s")
} }
} }

View File

@ -17,6 +17,7 @@ fun addTags(tagsProvider: TagsProvider) {
tagsProvider.plates.add("tritanium", MItems.TRITANIUM_PLATE) tagsProvider.plates.add("tritanium", MItems.TRITANIUM_PLATE)
tagsProvider.plates.add("iron", MItems.IRON_PLATE) tagsProvider.plates.add("iron", MItems.IRON_PLATE)
tagsProvider.plates.add("gold", MItems.GOLD_PLATE)
tagsProvider.ore("tritanium", MBlocks.TRITANIUM_ORE) tagsProvider.ore("tritanium", MBlocks.TRITANIUM_ORE)
tagsProvider.ore("tritanium", MBlocks.DEEPSLATE_TRITANIUM_ORE) tagsProvider.ore("tritanium", MBlocks.DEEPSLATE_TRITANIUM_ORE)

View File

@ -10,19 +10,23 @@ import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.INBTSerializable
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
import ru.dbotthepony.mc.otm.capability.itemsStream import ru.dbotthepony.mc.otm.capability.itemsStream
import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.client.render.SkinElement
import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.container.iterator
import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.addAll import ru.dbotthepony.mc.otm.core.addAll
import ru.dbotthepony.mc.otm.core.getCompoundList import ru.dbotthepony.mc.otm.core.getCompoundList
import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.core.nonEmpty
import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.network.FieldSynchronizer import ru.dbotthepony.mc.otm.network.FieldSynchronizer
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import java.io.DataInputStream import java.io.DataInputStream
import java.io.InputStream import java.io.InputStream
import kotlin.math.absoluteValue
class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlayerCapability) : INBTSerializable<CompoundTag> { class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlayerCapability) : INBTSerializable<CompoundTag> {
val ply: Player get() = capability.ply val ply: Player get() = capability.ply
@ -130,12 +134,12 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
} }
} }
for (item in type.items) { for ((tag, count) in type.items) {
var required = item.count var required = count
val iterator = capability.ply.inventory.iterator().nonEmpty() val iterator = capability.ply.inventory.iterator().nonEmpty()
for (invItem in iterator) { for (invItem in iterator) {
if (ItemStack.isSameItemSameTags(invItem, item)) { if (tag.test(invItem)) {
val toExtract = required.coerceAtMost(invItem.count) val toExtract = required.coerceAtMost(invItem.count)
required -= toExtract required -= toExtract
@ -176,10 +180,12 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
} }
for (item in type.items) { for (item in type.items) {
capability.ply.inventory.add(item) val stack = (item.first.items.firstOrNull { it.item.registryName?.namespace == OverdriveThatMatters.MOD_ID } ?: item.first.items.first()).copy()
stack.count = item.second
capability.ply.inventory.add(stack)
if (!item.isEmpty) { if (!stack.isEmpty) {
capability.ply.spawnAtLocation(item) capability.ply.spawnAtLocation(stack)
} }
} }
@ -300,32 +306,63 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay
if (type.experienceLevels != 0) { if (type.experienceLevels != 0) {
builder.add( builder.add(
TranslatableComponent("otm.android_station.research.xp_cost", type.experienceLevels).withStyle( TranslatableComponent("otm.android_station.research.xp_cost", TextComponent(type.experienceLevels.toString()).withStyle(
if (capability.ply.experienceLevel >= type.experienceLevels) if (capability.ply.experienceLevel >= type.experienceLevels)
ChatFormatting.DARK_GREEN ChatFormatting.DARK_GREEN
else else
ChatFormatting.DARK_RED ChatFormatting.DARK_RED
)) )).withStyle(ChatFormatting.GRAY))
} }
for (value in this.type.flatPrerequisites) { for (value in this.type.flatPrerequisites) {
val instance = capability.getResearch(value) val instance = capability.getResearch(value)
builder.add( builder.add(
TranslatableComponent("android_research.status.requires", instance.screenTooltipHeader).withStyle( TranslatableComponent("android_research.status.requires", instance.screenTooltipHeader.copy().withStyle(
if (instance.isResearched) if (instance.isResearched)
ChatFormatting.DARK_GREEN ChatFormatting.DARK_GREEN
else else
ChatFormatting.DARK_RED ChatFormatting.DARK_RED
)) )).withStyle(ChatFormatting.GRAY))
} }
for (value in this.type.flatBlockedBy) { for (value in this.type.flatBlockedBy) {
builder.add(TranslatableComponent("android_research.status.blocked_by", capability.getResearch(value).screenTooltipHeader).withStyle(ChatFormatting.DARK_RED)) builder.add(TranslatableComponent("android_research.status.blocked_by", capability.getResearch(value).screenTooltipHeader.copy().withStyle(ChatFormatting.DARK_RED)).withStyle(ChatFormatting.GRAY))
} }
for (value in this.type.flatBlocking) { for (value in this.type.flatBlocking) {
builder.add(TranslatableComponent("android_research.status.blocks", capability.getResearch(value).screenTooltipHeader).withStyle(ChatFormatting.DARK_RED)) builder.add(TranslatableComponent("android_research.status.blocks", capability.getResearch(value).screenTooltipHeader.copy().withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GRAY))
}
for ((tag, count) in type.items) {
var required = count
val iterator = capability.ply.inventory.iterator().nonEmpty()
for (invItem in iterator) {
if (tag.test(invItem)) {
required -= required.coerceAtMost(invItem.count)
if (required <= 0) {
break
}
}
}
val chooseItem = tag.items[((System.nanoTime() / 300_000_000L).absoluteValue % tag.items.size).toInt()]
if (required > 0) {
if (count == 1) {
builder.add(TranslatableComponent("android_research.status.requires_item", chooseItem.hoverName.copy().withStyle(ChatFormatting.DARK_RED)).withStyle(ChatFormatting.GRAY))
} else {
builder.add(TranslatableComponent("android_research.status.requires_item_multiple0", chooseItem.hoverName.copy().withStyle(ChatFormatting.DARK_RED), TextComponent(count.toString()).withStyle(ChatFormatting.YELLOW), TextComponent(required.toString()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GRAY))
}
} else {
if (count == 1) {
builder.add(TranslatableComponent("android_research.status.requires_item", chooseItem.hoverName.copy().withStyle(ChatFormatting.DARK_GREEN)).withStyle(ChatFormatting.GRAY))
} else {
builder.add(TranslatableComponent("android_research.status.requires_item_multiple1", chooseItem.hoverName.copy().withStyle(ChatFormatting.DARK_GREEN), TextComponent(count.toString()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GRAY))
}
}
} }
return builder return builder

View File

@ -13,17 +13,20 @@ import net.minecraft.network.chat.ComponentContents
import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.MutableComponent
import net.minecraft.network.chat.contents.TranslatableContents import net.minecraft.network.chat.contents.TranslatableContents
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.tags.TagKey
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.level.ItemLike
import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.client.render.SkinElement
import ru.dbotthepony.mc.otm.core.ListSet import ru.dbotthepony.mc.otm.core.ListSet
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.isActuallyEmpty
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.set
import ru.dbotthepony.mc.otm.core.toImmutableList import ru.dbotthepony.mc.otm.core.toImmutableList
import ru.dbotthepony.mc.otm.data.ItemStackCodec
import ru.dbotthepony.mc.otm.data.stream import ru.dbotthepony.mc.otm.data.stream
import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.registry.MRegistry
import java.util.LinkedList import java.util.LinkedList
@ -76,7 +79,7 @@ class AndroidResearchType(
prerequisites: Collection<Reference>, prerequisites: Collection<Reference>,
blockedBy: Collection<Reference>, blockedBy: Collection<Reference>,
items: Collection<ItemStack>, items: Collection<Pair<Ingredient, Int>>,
features: Collection<FeatureReference>, features: Collection<FeatureReference>,
descriptionLines: Collection<Component>, descriptionLines: Collection<Component>,
@ -249,12 +252,9 @@ class AndroidResearchType(
null } }) null } })
} }
private val itemCollection: List<ItemStack> = items.stream().filter { !it.isEmpty }.map { it.copy() }.toList().toImmutableList() private val definedItems: List<Pair<Ingredient, Int>> = ImmutableList.copyOf(items)
/** val items: Stream<out Pair<Ingredient, Int>> get() = definedItems.stream().filter { !it.first.isActuallyEmpty }
* Stream containing copies of original items in list
*/
val items: Stream<out ItemStack> get() = itemCollection.stream().map { it.copy() }
private val descriptionLines: List<MutableComponent> = ImmutableList.copyOf(descriptionLines.map { it.copy() }) private val descriptionLines: List<MutableComponent> = ImmutableList.copyOf(descriptionLines.map { it.copy() })
@ -464,7 +464,7 @@ class AndroidResearchType(
it["prerequisites"] = JsonArray().also { for (value in prerequisites) it.add(value.toJson()) } it["prerequisites"] = JsonArray().also { for (value in prerequisites) it.add(value.toJson()) }
it["blocked_by"] = JsonArray().also { for (value in blockedBy) it.add(value.toJson()) } it["blocked_by"] = JsonArray().also { for (value in blockedBy) it.add(value.toJson()) }
it["required_items"] = JsonArray().also { for (item in itemCollection) it.add(ItemStackCodec.serialize(item)) } it["required_items"] = JsonArray().also { for (item in definedItems) it.add(JsonObject().also { it["count"] = JsonPrimitive(item.second); it["ingredient"] = item.first.toJson() }) }
it["feature_result"] = JsonArray().also { for (feature in features) it.add(feature.toJson()) } it["feature_result"] = JsonArray().also { for (feature in features) it.add(feature.toJson()) }
it["description"] = JsonArray().also { for (line in descriptionLines) it.add(Component.Serializer.toJsonTree(line)) } it["description"] = JsonArray().also { for (line in descriptionLines) it.add(Component.Serializer.toJsonTree(line)) }
it["description_funcs"] = JsonArray().also { for (line in descriptionSuppliers) it.add(line.toJson()) } it["description_funcs"] = JsonArray().also { for (line in descriptionSuppliers) it.add(line.toJson()) }
@ -498,7 +498,7 @@ class AndroidResearchType(
buff.writeUtf(id.toString()) buff.writeUtf(id.toString())
buff.writeCollection(prerequisites) { a, b -> b.toNetwork(a) } buff.writeCollection(prerequisites) { a, b -> b.toNetwork(a) }
buff.writeCollection(blockedBy) { a, b -> b.toNetwork(a) } buff.writeCollection(blockedBy) { a, b -> b.toNetwork(a) }
buff.writeCollection(itemCollection) { a, b -> a.writeItem(b) } buff.writeCollection(definedItems) { a, b -> b.first.toNetwork(a); a.writeVarInt(b.second) }
buff.writeCollection(features) { a, b -> b.toNetwork(a) } buff.writeCollection(features) { a, b -> b.toNetwork(a) }
buff.writeCollection(descriptionLines) { a, b -> a.writeComponent(b) } buff.writeCollection(descriptionLines) { a, b -> a.writeComponent(b) }
buff.writeCollection(descriptionSuppliers) { a, b -> b.toNetwork(a) } buff.writeCollection(descriptionSuppliers) { a, b -> b.toNetwork(a) }
@ -522,7 +522,7 @@ class AndroidResearchType(
val id = ResourceLocation(buff.readUtf()) val id = ResourceLocation(buff.readUtf())
val prerequisites = buff.readCollection({ LinkedList() }, Reference::fromNetwork) val prerequisites = buff.readCollection({ LinkedList() }, Reference::fromNetwork)
val blockedBy = buff.readCollection({ LinkedList() }, Reference::fromNetwork) val blockedBy = buff.readCollection({ LinkedList() }, Reference::fromNetwork)
val items = buff.readCollection({ LinkedList() }, FriendlyByteBuf::readItem) val items = buff.readCollection({ LinkedList() }, { Ingredient.fromNetwork(it) to it.readVarInt() })
val features = buff.readCollection({ LinkedList() }, FeatureReference::fromNetwork) val features = buff.readCollection({ LinkedList() }, FeatureReference::fromNetwork)
val descriptionLines = buff.readCollection({ LinkedList() }, FriendlyByteBuf::readComponent) val descriptionLines = buff.readCollection({ LinkedList() }, FriendlyByteBuf::readComponent)
val descriptionSuppliers = buff.readCollection({ LinkedList() }, { AndroidResearchManager.descriptionFuncs.fromNetwork(it) }) val descriptionSuppliers = buff.readCollection({ LinkedList() }, { AndroidResearchManager.descriptionFuncs.fromNetwork(it) })
@ -590,7 +590,10 @@ class AndroidResearchType(
prerequisites = prerequisites.stream().map { Reference.fromJson(it) }.toList(), prerequisites = prerequisites.stream().map { Reference.fromJson(it) }.toList(),
blockedBy = blocked_by.stream().map { Reference.fromJson(it) }.toList(), blockedBy = blocked_by.stream().map { Reference.fromJson(it) }.toList(),
features = features.stream().map { FeatureReference.fromJson(it) }.toList(), features = features.stream().map { FeatureReference.fromJson(it) }.toList(),
items = items.stream().map { ItemStackCodec.deserialize(it) }.filter { !it.isEmpty }.toList(), items = items.stream()
.map { it as? JsonObject ?: throw JsonSyntaxException("One of items is not an JsonObject") }
.map { Ingredient.fromJson(it["ingredient"] ?: throw JsonSyntaxException("Missing ingredient key")) to (it["count"]?.asInt ?: throw JsonSyntaxException("Missing count key")) }
.toList(),
descriptionLines = description.stream().map { Component.Serializer.fromJson(it) }.toList() as List<MutableComponent>, descriptionLines = description.stream().map { Component.Serializer.fromJson(it) }.toList() as List<MutableComponent>,
descriptionSuppliers = description_funcs.stream().map { AndroidResearchManager.descriptionFuncs.fromJson(it) }.toList() as List<ComponentSupplier>, descriptionSuppliers = description_funcs.stream().map { AndroidResearchManager.descriptionFuncs.fromJson(it) }.toList() as List<ComponentSupplier>,
experienceLevels = experience, experienceLevels = experience,
@ -613,7 +616,7 @@ class AndroidResearchType(
var skinIcon: SkinElement? = null, var skinIcon: SkinElement? = null,
var iconText: Component? = null, var iconText: Component? = null,
) { ) {
private val items = ArrayList<ItemStack>() private val items = ArrayList<Pair<Ingredient, Int>>()
private val prerequisites = LinkedList<Reference>() private val prerequisites = LinkedList<Reference>()
private val blockers = ArrayList<Reference>() private val blockers = ArrayList<Reference>()
@ -802,7 +805,25 @@ class AndroidResearchType(
} }
fun addItem(cost: ItemStack): Builder { fun addItem(cost: ItemStack): Builder {
items.add(cost) require(!cost.isEmpty) { "Provided stack is empty" }
items.add(Ingredient.of(cost) to cost.count)
return this
}
fun addItem(cost: ItemLike, count: Int = 1): Builder {
items.add(Ingredient.of(cost) to count)
return this
}
fun addItem(cost: Ingredient, count: Int = 1): Builder {
require(count >= 1) { "Invalid count $count" }
items.add(cost to count)
return this
}
fun addItem(cost: TagKey<Item>, count: Int = 1): Builder {
require(count >= 1) { "Invalid count $count" }
items.add(Ingredient.of(cost) to count)
return this return this
} }

View File

@ -15,29 +15,20 @@ import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.Entity import net.minecraft.world.entity.Entity
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.Ingredient
import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateHolder import net.minecraft.world.level.block.state.StateHolder
import net.minecraft.world.level.block.state.properties.Property import net.minecraft.world.level.block.state.properties.Property
import net.minecraft.world.phys.Vec3 import net.minecraft.world.phys.Vec3
import net.minecraftforge.common.ForgeConfigSpec import net.minecraftforge.common.ForgeHooks
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue
import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.common.util.LazyOptional
import net.minecraftforge.items.IItemHandler import net.minecraftforge.items.IItemHandler
import net.minecraftforge.registries.ForgeRegistries import net.minecraftforge.registries.ForgeRegistries
import net.minecraftforge.registries.ForgeRegistry import net.minecraftforge.registries.ForgeRegistry
import net.minecraftforge.registries.IForgeRegistry import net.minecraftforge.registries.IForgeRegistry
import net.minecraftforge.registries.RegistryManager
import ru.dbotthepony.mc.otm.ClientConfig
import ru.dbotthepony.mc.otm.item.BatteryItem
import java.math.BigInteger import java.math.BigInteger
import java.util.Spliterator
import java.util.Spliterators import java.util.Spliterators
import java.util.function.BiConsumer
import java.util.function.BinaryOperator
import java.util.function.Function
import java.util.function.Supplier
import java.util.stream.Collector
import java.util.stream.Stream import java.util.stream.Stream
import java.util.stream.StreamSupport import java.util.stream.StreamSupport
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@ -390,3 +381,5 @@ fun <E> Iterable<E>.stream(): Stream<out E> {
fun <E> Iterator<E>.stream(): Stream<out E> { fun <E> Iterator<E>.stream(): Stream<out E> {
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(this, 0), false) return StreamSupport.stream(Spliterators.spliteratorUnknownSize(this, 0), false)
} }
val Ingredient.isActuallyEmpty: Boolean get() = ForgeHooks.hasNoElements(this)

View File

@ -272,6 +272,7 @@ object MItems {
val MACHINE_FRAME: Item by registry.register(MNames.MACHINE_FRAME) { Item(DEFAULT_PROPERTIES) } val MACHINE_FRAME: Item by registry.register(MNames.MACHINE_FRAME) { Item(DEFAULT_PROPERTIES) }
val TRITANIUM_PLATE: Item by registry.register(MNames.TRITANIUM_PLATE) { Item(DEFAULT_PROPERTIES) } val TRITANIUM_PLATE: Item by registry.register(MNames.TRITANIUM_PLATE) { Item(DEFAULT_PROPERTIES) }
val IRON_PLATE: Item by registry.register(MNames.IRON_PLATE) { Item(DEFAULT_PROPERTIES) } val IRON_PLATE: Item by registry.register(MNames.IRON_PLATE) { Item(DEFAULT_PROPERTIES) }
val GOLD_PLATE: Item by registry.register(MNames.GOLD_PLATE) { Item(DEFAULT_PROPERTIES) }
val COPPER_WIRING: Item by registry.register(MNames.COPPER_WIRING) { Item(DEFAULT_PROPERTIES) } val COPPER_WIRING: Item by registry.register(MNames.COPPER_WIRING) { Item(DEFAULT_PROPERTIES) }
val GOLD_WIRING: Item by registry.register(MNames.GOLD_WIRING) { Item(DEFAULT_PROPERTIES) } val GOLD_WIRING: Item by registry.register(MNames.GOLD_WIRING) { Item(DEFAULT_PROPERTIES) }
val PORTABLE_CONDENSATION_DRIVE_CASING: Item by registry.register(MNames.PORTABLE_CONDENSATION_DRIVE_CASING) { Item(DEFAULT_PROPERTIES) } val PORTABLE_CONDENSATION_DRIVE_CASING: Item by registry.register(MNames.PORTABLE_CONDENSATION_DRIVE_CASING) { Item(DEFAULT_PROPERTIES) }
@ -288,6 +289,7 @@ object MItems {
{ ELECTRIC_PARTS }, { ELECTRIC_PARTS },
{ TRITANIUM_PLATE }, { TRITANIUM_PLATE },
{ IRON_PLATE }, { IRON_PLATE },
{ GOLD_PLATE },
{ COPPER_WIRING }, { COPPER_WIRING },
{ GOLD_WIRING }, { GOLD_WIRING },
{ CIRCUIT_PLATING }, { CIRCUIT_PLATING },

View File

@ -135,6 +135,7 @@ object MNames {
const val MACHINE_FRAME = "machine_frame" const val MACHINE_FRAME = "machine_frame"
const val TRITANIUM_PLATE = "tritanium_plate" const val TRITANIUM_PLATE = "tritanium_plate"
const val IRON_PLATE = "iron_plate" const val IRON_PLATE = "iron_plate"
const val GOLD_PLATE = "gold_plate"
const val COPPER_WIRING = "copper_wiring" const val COPPER_WIRING = "copper_wiring"
const val GOLD_WIRING = "gold_wiring" const val GOLD_WIRING = "gold_wiring"

View File

@ -10,6 +10,7 @@ object MItemTags {
val INGOT_TRITANIUM: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "ingots/tritanium")) val INGOT_TRITANIUM: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "ingots/tritanium"))
val PLATE_TRITANIUM: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/tritanium")) val PLATE_TRITANIUM: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/tritanium"))
val PLATE_IRON: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/iron")) val PLATE_IRON: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/iron"))
val PLATE_GOLD: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/gold"))
val TRITANIUM_CRATES: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "tritanium_crates")) val TRITANIUM_CRATES: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "tritanium_crates"))
val INDUSTRIAL_GLASS: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "industrial_glass")) val INDUSTRIAL_GLASS: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "industrial_glass"))

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB