From 6aaad2fe88d540d811a866cd77fdf35f1934687b Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Mon, 30 Oct 2023 12:41:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D1=80=D0=B0=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=82=D1=80=D0=B8=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B1=D1=80=D0=BE=D0=BD=D0=B8=20#178=20:WiseTree:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/datagen/items/ItemModels.kt | 2 +- .../datagen/items/MatteryItemModelProvider.kt | 8 ++++++ .../datagen/recipes/CraftingTableRecipes.kt | 20 ++++++++++++++ .../mc/otm/item/armor/TritaniumArmorItem.kt | 25 +++++++++++------- .../dbotthepony/mc/otm/registry/MRegistry.kt | 11 +++++++- .../textures/item/tritanium_boots_base.png | Bin 0 -> 246 bytes .../textures/item/tritanium_boots_overlay.png | Bin 0 -> 205 bytes .../item/tritanium_chestplate_base.png | Bin 0 -> 268 bytes .../item/tritanium_chestplate_overlay.png | Bin 0 -> 217 bytes .../textures/item/tritanium_helmet_base.png | Bin 0 -> 250 bytes .../item/tritanium_helmet_overlay.png | Bin 0 -> 217 bytes .../textures/item/tritanium_pants_base.png | Bin 0 -> 240 bytes .../textures/item/tritanium_pants_overlay.png | Bin 0 -> 201 bytes .../models/armor/tritanium_armor_base.png | Bin 0 -> 2358 bytes .../models/armor/tritanium_armor_overlay.png | Bin 0 -> 1861 bytes 15 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_boots_base.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_boots_overlay.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_chestplate_base.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_chestplate_overlay.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_helmet_base.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_helmet_overlay.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_pants_base.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_pants_overlay.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/models/armor/tritanium_armor_base.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/models/armor/tritanium_armor_overlay.png 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 c85458ea1..ec6a56c07 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 @@ -86,7 +86,7 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.generated(MItems.EXOPACK_PROBE) provider.handheld(MItems.TRITANIUM_TOOLS) - provider.generated(MItems.TRITANIUM_ARMOR) + provider.armorColored(MItems.TRITANIUM_ARMOR) provider.armorWithTrims(MItems.SIMPLE_TRITANIUM_ARMOR) provider.handheld(MItems.CHEST_UPGRADER) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt index f06049371..649117b21 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt @@ -105,6 +105,14 @@ class MatteryItemModelProvider(event: GatherDataEvent) : ItemModelProvider(event fun armorWithTrims(vararg items: Item) = items.forEach { armorWithTrims(it, modLocation("item/${it.registryName!!.path}")) } fun armorWithTrims(items: Collection) = items.forEach { armorWithTrims(it, modLocation("item/${it.registryName!!.path}")) } + fun armorColored(item: Item) = exec { + withExistingParent(item.registryName!!.path, GENERATED) + .texture("layer0", modLocation("item/${item.registryName!!.path}_base")) + .texture("layer1", modLocation("item/${item.registryName!!.path}_overlay")) + } + fun armorColored(vararg items: Item) = items.forEach { armorColored(it) } + fun armorColored(items: Collection) = items.forEach { armorColored(it) } + companion object { val ARMOR_TRIM_MATERIALS = listOf("quartz", "iron", "netherite", "redstone", "copper", "gold", "emerald", "diamond", "lapis", "amethyst") val GENERATED = ResourceLocation("minecraft", "item/generated") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index 509e9e9f6..a7db8cd40 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -208,12 +208,22 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { // броня MatteryRecipe(MItems.TRITANIUM_HELMET, category = RecipeCategory.COMBAT) + .setUpgradeSource(Items.LEATHER_HELMET) + .addUpgradeOps( + UpgradeRecipe.Direct("display"), + UpgradeRecipe.Direct("Enchantments"), + ) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_HELMET, MItemTags.REINFORCED_TRITANIUM_PLATES) .unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES) .build(consumer) MatteryRecipe(MItems.TRITANIUM_PANTS, category = RecipeCategory.COMBAT) + .setUpgradeSource(Items.LEATHER_LEGGINGS) + .addUpgradeOps( + UpgradeRecipe.Direct("display"), + UpgradeRecipe.Direct("Enchantments"), + ) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_LEGGINGS, MItemTags.REINFORCED_TRITANIUM_PLATES) .rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) @@ -221,6 +231,11 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { .build(consumer) MatteryRecipe(MItems.TRITANIUM_CHESTPLATE, category = RecipeCategory.COMBAT) + .setUpgradeSource(Items.LEATHER_CHESTPLATE) + .addUpgradeOps( + UpgradeRecipe.Direct("display"), + UpgradeRecipe.Direct("Enchantments"), + ) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_CHESTPLATE, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) @@ -228,6 +243,11 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) { .build(consumer) MatteryRecipe(MItems.TRITANIUM_BOOTS, category = RecipeCategory.COMBAT) + .setUpgradeSource(Items.LEATHER_BOOTS) + .addUpgradeOps( + UpgradeRecipe.Direct("display"), + UpgradeRecipe.Direct("Enchantments"), + ) .row(MItemTags.REINFORCED_TRITANIUM_PLATES, Items.LEATHER_BOOTS, MItemTags.REINFORCED_TRITANIUM_PLATES) .rowAC(MItemTags.REINFORCED_TRITANIUM_PLATES, MItemTags.REINFORCED_TRITANIUM_PLATES) .unlockedBy(MItemTags.REINFORCED_TRITANIUM_PLATES) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/armor/TritaniumArmorItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/armor/TritaniumArmorItem.kt index a90d73674..2a1f8a588 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/armor/TritaniumArmorItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/armor/TritaniumArmorItem.kt @@ -3,20 +3,17 @@ package ru.dbotthepony.mc.otm.item.armor import net.minecraft.client.model.HumanoidModel import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvents -import net.minecraft.world.damagesource.DamageSource import net.minecraft.world.damagesource.DamageTypes import net.minecraft.world.entity.Entity import net.minecraft.world.entity.EquipmentSlot import net.minecraft.world.entity.LivingEntity -import net.minecraft.world.item.ArmorItem -import net.minecraft.world.item.ArmorMaterial -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Rarity +import net.minecraft.world.item.* import net.minecraft.world.item.crafting.Ingredient import net.minecraftforge.client.extensions.common.IClientItemExtensions import net.minecraftforge.event.entity.living.LivingAttackEvent import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.model.TritaniumArmorModel +import ru.dbotthepony.mc.otm.core.math.RGBAColor import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems import java.util.function.Consumer @@ -66,18 +63,28 @@ private object TritaniumArmorRenderProperties : IClientItemExtensions { } } -class TritaniumArmorItem(slot: Type) : ArmorItem(TritaniumArmorMaterial, slot, Properties().stacksTo(1).rarity(Rarity.RARE)) { +class TritaniumArmorItem(slot: Type) : DyeableArmorItem(TritaniumArmorMaterial, slot, Properties().stacksTo(1).rarity(Rarity.RARE)) { override fun initializeClient(consumer: Consumer) { super.initializeClient(consumer) consumer.accept(TritaniumArmorRenderProperties) } - override fun getArmorTexture(stack: ItemStack?, entity: Entity?, slot: EquipmentSlot?, type: String?): String { - return TEXTURE_LOCATION + override fun getArmorTexture(stack: ItemStack, entity: Entity, slot: EquipmentSlot, type: String?): String = + if (type.equals("overlay")) TEXTURE_LOCATION_OVERLAY else TEXTURE_LOCATION_BASE + + override fun getColor(stack: ItemStack): Int { + val tag = stack.getTagElement("display")?: return TRITANIUM_COLOR + if (tag.contains("color", 99)) { + return tag.getInt("color") + } + + return TRITANIUM_COLOR } companion object { - const val TEXTURE_LOCATION = "${OverdriveThatMatters.MOD_ID}:textures/models/armor/tritanium_armor.png" + val TRITANIUM_COLOR = RGBAColor(157, 187, 204).toARGB() + const val TEXTURE_LOCATION_BASE = "${OverdriveThatMatters.MOD_ID}:textures/models/armor/tritanium_armor_base.png" + const val TEXTURE_LOCATION_OVERLAY = "${OverdriveThatMatters.MOD_ID}:textures/models/armor/tritanium_armor_overlay.png" fun onHurt(event: LivingAttackEvent) { if (event.source.typeHolder().`is`(DamageTypes.SWEET_BERRY_BUSH) || event.source.msgId == "sweetBerryBush") { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt index 30e37ea11..aac52447c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MRegistry.kt @@ -5,11 +5,13 @@ import com.google.common.collect.Streams import net.minecraft.advancements.CriteriaTriggers import net.minecraft.client.renderer.item.ItemProperties import net.minecraft.core.BlockPos +import net.minecraft.core.cauldron.CauldronInteraction import net.minecraft.core.registries.Registries import net.minecraft.resources.ResourceLocation import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.ai.village.poi.PoiType import net.minecraft.world.entity.ai.village.poi.PoiTypes +import net.minecraft.world.item.DyeableArmorItem import net.minecraft.world.item.Items import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.block.* @@ -318,7 +320,7 @@ object MRegistry { } private fun initializeCommon(event: FMLCommonSetupEvent) { - + registerCauldronHandlers() } private fun initializeClient(event: FMLClientSetupEvent) { @@ -353,8 +355,15 @@ object MRegistry { } } + private fun registerCauldronHandlers() { + MItems.TRITANIUM_ARMOR.forEach { CauldronInteraction.WATER[it] = CauldronInteraction.DYED_ITEM } + } + private fun registerItemColorHandlers(event: RegisterColorHandlersEvent.Item) { event.register(DynamicFluidContainerModel.Colors(), MItems.FLUID_CAPSULE) + event.register({ stack, layer -> if (layer == 0) (stack.item as DyeableArmorItem).getColor(stack) else -1 }, + *MItems.TRITANIUM_ARMOR.toTypedArray() + ) } private fun registerItemDecorators(event: RegisterItemDecorationsEvent) { diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_boots_base.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_boots_base.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d0581604afe758b5c91e9fb772d5e7b4ded4a1 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|-o^78U$&z{YlJ6Bs<``EE#>({S0H8m9z6H`-D11dRrI)DR6ag_x5 z1^*~g5I7kjv*Ssy=Sb24k&Q21SE+Z`l~$41GdvE*FfB{uoKoKK%ztl5dTG5T=ae%{AsYp{)Y)4% doaNkAfA}oB5zm9n_dsJAJYD@<);T3K0RR?cR!sl^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_boots_overlay.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_boots_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..5da3bfded50ee7eae8dbc202bce50d2d9dd7c3fe GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G~10G|+7ZEbB+Q&TZ9F*P+cpxFBH2?+8JY5_^G=kT57z!~c@Eqd$^xvGj?DeC$>1~sinN;xG?!523jCYEd ppC-2hyV0Zrdk#)A*uk2~{P`F2jQ%fct$`*mc)I$ztaD0e0ssmYIlTY? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_chestplate_base.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_chestplate_base.png new file mode 100644 index 0000000000000000000000000000000000000000..c031ca6ddc9da61bb319178d411053401cc70cb5 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|-o^78U$&z>DSc5MCn_1fCnH*emYJ9qAi6)S-9jnQVafD~s*kYDhB zC}0TouMh$W7I;J!GcfQS0Aa?gYn_}x!BkHd#}JL+(sS&52NZai5AdY_`G2(3L3UM? zvg3{hhhJ0qC!Ev@Ke#YU`iczmF}7U?Q=7Zn7=+qlCL}F9^pd5)RG5?J!?vkAt2gfd z&&dC7uKK@)Y;xh7Chc6<$Y@u{l)C8@Z}=|$O%1H63%$;R{LSF$>gTe~DWM4f3ddj4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_chestplate_overlay.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_chestplate_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..533643b6554222d3b4a2c86ce22b24f86b6a3f75 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|>0G|+7ZEfwFH*c<3u>vUYMnOmuq^=~$FZloe{|pXVE588woCO|{#S9F5 zhd`K7RKu$QDCp+t;uxY4JheBFk3oUMN%LL(bC=6eYy0o0)I4M8|HbB!(7&6dw;_eu zk@<&FL*!qE-464cclphGU}f1*G|g+ua*yrnLZ2`s2r|{}v+M{1n#kbk>gTe~DWM4f DpCUp3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_helmet_base.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_helmet_base.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa5490ba5cd4578b8e071f2156a150e615e4e2f GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|-oz`(%r^73cTo*g@OOj}!9PEKz9`t@RBVsq!t1uAK%xH}0*ag_x5 z1^?c+ZES{-ZeqTlF(X1tm61#!i=zij+vjn5%gY3XEslwruYYT=zYB%65Z=6NF__ gC+>E7uD!$lv^=}E+}D$KK%*HvUHx3vIVCg!0AeImE&u=k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_helmet_overlay.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_helmet_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..37f74f685b0bcbb22f7deaa690fb6ae4ecdafc71 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G~10G|-oz`#IlZEZO@IWaLYpqNC2YYUKKEeY}q{tpBUzqj#$4B{;Ch%9Dc z;5!V$jK}j=qyPn-JY5_^G=h8281gYFa5x7ZxcC2zn8C7L8SIDao7=MY2dtmNT{FL- z+8|i!hM;q!rC)+}NV~(TT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_pants_base.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_pants_base.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2b2f48221b26c3d71124d6891ca7ee1b48a1c1 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|-o^73+RZS7;njy-$!Z2kK6bLY;zdGqFq6)S-9cT2TJfD~s*kYDhB zC}0TouMh$W7I;J!GcfQS1YyP<6SLm}1wB1o978mMTTcb@9Z=w44(M8N=l>CHDPh&q z*ZSM`DFlAv+tkFnXzj{bm8Y2Wo-y$4Uts-U4ezzeM=cW#?Ckc`{b8P9PX(D>8XNLm50>{an^LB{Ts5N@!F@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_pants_overlay.png b/src/main/resources/assets/overdrive_that_matters/textures/item/tritanium_pants_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a799933267ef4de06167aa0d38e0fbe2d747a4 GIT binary patch literal 201 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