From fbf3013382c01fecf324be621132c4019c4eb53a Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 29 Nov 2020 23:14:34 +0300 Subject: [PATCH] WIP: custom armor models --- .../ru/betterend/client/BetterEndClient.java | 2 + .../ru/betterend/item/EndArmorMaterial.java | 3 + .../item/model/CrystaliteArmorModel.java | 17 ---- .../item/model/CrystaliteArmorProvider.java | 81 ++++++++++++++++++ .../item/model/CrystaliteBootsModel.java | 42 +++++++++ .../item/model/CrystaliteChestplateModel.java | 54 ++++++++++++ .../item/model/CrystaliteHelmetModel.java | 33 +++++++ .../item/model/CrystaliteLeggingsModel.java | 32 +++++++ .../java/ru/betterend/registry/EndItems.java | 4 + .../betterend/registry/EndModelProviders.java | 17 ++++ .../models/item/crystalite_boots.json | 6 ++ .../models/item/crystalite_chestplate.json | 6 ++ .../models/item/crystalite_hammer.json | 6 ++ .../models/item/crystalite_helmet.json | 6 ++ .../models/item/crystalite_leggings.json | 6 ++ .../model/armor/crystalite_layer_1.png | Bin 0 -> 1308 bytes .../model/armor/crystalite_layer_2.png | Bin 0 -> 631 bytes .../armor/crystalite_overlay_layer_1.png | Bin 0 -> 563 bytes .../armor/crystalite_overlay_layer_2.png | Bin 0 -> 252 bytes .../models/armor/aeternium_layer_1.png | Bin 2685 -> 1381 bytes .../models/armor/aeternium_layer_2.png | Bin 1132 -> 584 bytes .../models/armor/terminite_layer_1.png | Bin 1781 -> 1122 bytes .../models/armor/terminite_layer_2.png | Bin 711 -> 555 bytes 23 files changed, 298 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/ru/betterend/item/model/CrystaliteArmorModel.java create mode 100644 src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java create mode 100644 src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java create mode 100644 src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java create mode 100644 src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java create mode 100644 src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java create mode 100644 src/main/java/ru/betterend/registry/EndModelProviders.java create mode 100644 src/main/resources/assets/betterend/models/item/crystalite_boots.json create mode 100644 src/main/resources/assets/betterend/models/item/crystalite_chestplate.json create mode 100644 src/main/resources/assets/betterend/models/item/crystalite_hammer.json create mode 100644 src/main/resources/assets/betterend/models/item/crystalite_helmet.json create mode 100644 src/main/resources/assets/betterend/models/item/crystalite_leggings.json create mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png create mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png create mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png create mode 100644 src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index 5e2e4e88..a7956ef6 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -9,6 +9,7 @@ import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.registry.EndBlockEntityRenders; import ru.betterend.registry.EndEntitiesRenders; +import ru.betterend.registry.EndModelProviders; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndScreens; import ru.betterend.util.TranslationHelper; @@ -21,6 +22,7 @@ public class BetterEndClient implements ClientModInitializer { EndScreens.register(); EndParticles.register(); EndEntitiesRenders.register(); + EndModelProviders.register(); if (BetterEnd.isDevEnvironment()) { TranslationHelper.printMissingNames(); diff --git a/src/main/java/ru/betterend/item/EndArmorMaterial.java b/src/main/java/ru/betterend/item/EndArmorMaterial.java index 60ab6505..b3ae46e0 100644 --- a/src/main/java/ru/betterend/item/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/EndArmorMaterial.java @@ -18,6 +18,9 @@ public enum EndArmorMaterial implements ArmorMaterial { }), AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { return Ingredient.ofItems(EndItems.AETERNIUM_INGOT); + }), + CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { + return Ingredient.ofItems(EndItems.TERMINITE_INGOT); }); private static final int[] BASE_DURABILITY = new int[] { 13, 15, 16, 11 }; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorModel.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorModel.java deleted file mode 100644 index 4fd78c37..00000000 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorModel.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.betterend.item.model; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.entity.LivingEntity; - -public class CrystaliteArmorModel extends BipedEntityModel { - - public ModelPart helmet; - public ModelPart chestplate; - public ModelPart leggings; - public ModelPart boots; - - public CrystaliteArmorModel() { - super(1.0F); - } -} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java new file mode 100644 index 00000000..57218aa9 --- /dev/null +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -0,0 +1,81 @@ +package ru.betterend.item.model; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider; +import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; + +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; + +import ru.betterend.BetterEnd; +import ru.betterend.registry.EndItems; + +@Environment(EnvType.CLIENT) +public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { + private final static Identifier FIRST_LAYER = BetterEnd.makeID("textures/model/armor/crystalite_layer_1.png"); + private final static Identifier SECOND_LAYER = BetterEnd.makeID("textures/model/armor/crystalite_layer_2.png"); + private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); + private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); + private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); + private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); + private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); + + @Override + public @NotNull Identifier getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, + boolean secondLayer, @Nullable String suffix, Identifier defaultTexture) { + if (!isStackValid(stack)) return defaultTexture; + if (secondLayer) return SECOND_LAYER; + return FIRST_LAYER; + } + + @Override + public @NotNull BipedEntityModel getArmorModel(LivingEntity entity, ItemStack stack, + EquipmentSlot slot, BipedEntityModel defaultModel) { + if (!isStackValid(stack)) return defaultModel; + if (entity instanceof AbstractClientPlayerEntity && + ((AbstractClientPlayerEntity) entity).getModel().equals("slim") && + slot == EquipmentSlot.CHEST) { + + return CHEST_MODEL_SLIM; + } + switch(slot) { + case HEAD: { + return new CrystaliteHelmetModel(1.0F); + } + case CHEST: { + return new CrystaliteChestplateModel(1.0F, false); + } + case LEGS: { + return new CrystaliteChestplateModel(1.0F, true); + } + case FEET: { + return new CrystaliteBootsModel(1.0F); + } + default: { + return defaultModel; + } + } + } + + public Iterable getRenderedItems() { + return Lists.newArrayList(EndItems.CRYSTALITE_HELMET, EndItems.CRYSTALITE_CHESTPLATE, EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); + } + + private boolean isStackValid(ItemStack stack) { + return stack.getItem() == EndItems.CRYSTALITE_HELMET || + stack.getItem() == EndItems.CRYSTALITE_CHESTPLATE || + stack.getItem() == EndItems.CRYSTALITE_LEGGINGS || + stack.getItem() == EndItems.CRYSTALITE_BOOTS; + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java new file mode 100644 index 00000000..e6d31f8d --- /dev/null +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -0,0 +1,42 @@ +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; + +public class CrystaliteBootsModel extends BipedEntityModel { + + public ModelPart leftBoot; + public ModelPart rightBoot; + + public CrystaliteBootsModel(float scale) { + super(scale); + this.leftBoot = new ModelPart(this, 0, 16); + this.leftBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.leftBoot.setPivot(1.9F, 12.0F, 0.0F); + this.rightBoot = new ModelPart(this, 0, 16); + this.rightBoot.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.rightBoot.setPivot(-1.9F, 12.0F, 0.0F); + } + + @Override + protected Iterable getHeadParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable getBodyParts() { + return Lists.newArrayList(leftBoot, rightBoot); + } + + @Override + public void setAngles(LivingEntity livingEntity, float f, float g, float h, float i, float j) { + super.setAngles(livingEntity, f, g, h, i, j); + this.leftBoot.copyPositionAndRotation(leftLeg); + this.rightBoot.copyPositionAndRotation(rightLeg); + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java new file mode 100644 index 00000000..b02ccf2a --- /dev/null +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -0,0 +1,54 @@ +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; + +public class CrystaliteChestplateModel extends BipedEntityModel { + + public ModelPart leftShoulder; + public ModelPart rightShoulder; + + public CrystaliteChestplateModel(float scale, boolean thinArms) { + super(scale); + this.torso = new ModelPart(this, 16, 16); + this.torso.addCuboid(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); + this.torso.setPivot(0.0F, 0.0F, 0.0F); + if (thinArms) { + this.leftShoulder = new ModelPart(this, 40, 16); + this.leftShoulder.addCuboid(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.25F); + this.leftShoulder.setPivot(5.0F, 2.5F, 0.0F); + this.rightShoulder = new ModelPart(this, 40, 16); + this.rightShoulder.addCuboid(-2.0F, -2.0F, -12.0F, 3.0F, 12.0F, 4.0F, scale + 0.25F); + this.rightShoulder.setPivot(-5.0F, 2.5F, 10.0F); + } else { + this.leftShoulder = new ModelPart(this, 40, 16); + this.leftShoulder.addCuboid(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.leftShoulder.setPivot(5.0F, 2.0F, 0.0F); + this.rightShoulder = new ModelPart(this, 40, 16); + this.rightShoulder.addCuboid(-3.0F, -2.0F, -12.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); + this.rightShoulder.setPivot(-5.0F, 2.0F, 10.0F); + } + } + + @Override + protected Iterable getHeadParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable getBodyParts() { + return Lists.newArrayList(torso, leftShoulder, rightShoulder); + } + + @Override + public void setAngles(LivingEntity livingEntity, float f, float g, float h, float i, float j) { + super.setAngles(livingEntity, f, g, h, i, j); + this.leftShoulder.copyPositionAndRotation(leftArm); + this.rightShoulder.copyPositionAndRotation(rightArm); + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java new file mode 100644 index 00000000..44ce0fbe --- /dev/null +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -0,0 +1,33 @@ +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; + +@Environment(EnvType.CLIENT) +public class CrystaliteHelmetModel extends BipedEntityModel { + + public CrystaliteHelmetModel(float scale) { + super(scale); + this.helmet = new ModelPart(this, 0, 0); + this.helmet.addCuboid(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); + this.helmet.setPivot(0.0F, 0.0F, 0.0F); + } + + @Override + protected Iterable getHeadParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable getBodyParts() { + return Lists.newArrayList(helmet); + } +} diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java new file mode 100644 index 00000000..625986e9 --- /dev/null +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -0,0 +1,32 @@ +package ru.betterend.item.model; + +import java.util.Collections; + +import com.google.common.collect.Lists; + +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; + +public class CrystaliteLeggingsModel extends BipedEntityModel { + + public CrystaliteLeggingsModel(float scale) { + super(scale); + this.rightLeg = new ModelPart(this, 0, 16); + this.rightLeg.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.rightLeg.setPivot(-1.9F, 12.0F, 0.0F); + this.leftLeg = new ModelPart(this, 0, 16); + this.leftLeg.addCuboid(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + this.leftLeg.setPivot(1.9F, 12.0F, 0.0F); + } + + @Override + protected Iterable getHeadParts() { + return Collections::emptyIterator; + } + + @Override + protected Iterable getBodyParts() { + return Lists.newArrayList(rightLeg, leftLeg); + } +} diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index bc247e3e..ebbbb310 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -69,6 +69,10 @@ public class EndItems { public static final Item AETERNIUM_CHESTPLATE = registerItem("aeternium_chestplate", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeSettings())); public static final Item AETERNIUM_LEGGINGS = registerItem("aeternium_leggings", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.LEGS, makeSettings())); public static final Item AETERNIUM_BOOTS = registerItem("aeternium_boots", new ArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.FEET, makeSettings())); + public static final Item CRYSTALITE_HELMET = registerItem("crystalite_helmet", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.HEAD, makeSettings())); + public static final Item CRYSTALITE_CHESTPLATE = registerItem("crystalite_chestplate", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.CHEST, makeSettings())); + public static final Item CRYSTALITE_LEGGINGS = registerItem("crystalite_leggings", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.LEGS, makeSettings())); + public static final Item CRYSTALITE_BOOTS = registerItem("crystalite_boots", new ArmorItem(EndArmorMaterial.CRYSTALITE, EquipmentSlot.FEET, makeSettings())); // Tools // public static final ToolItem TERMINITE_SHOVEL = registerTool("terminite_shovel", new ShovelItem(EndToolMaterial.TERMINITE, 1.5F, -3.0F, makeSettings())); diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java new file mode 100644 index 00000000..80952641 --- /dev/null +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -0,0 +1,17 @@ +package ru.betterend.registry; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import ru.betterend.item.model.CrystaliteArmorProvider; + +@Environment(EnvType.CLIENT) +public class EndModelProviders { + + public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); + + public final static void register() { + ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + } +} diff --git a/src/main/resources/assets/betterend/models/item/crystalite_boots.json b/src/main/resources/assets/betterend/models/item/crystalite_boots.json new file mode 100644 index 00000000..1a96c392 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/crystalite_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/crystalite_boots" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json b/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json new file mode 100644 index 00000000..8fcf0ae2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/crystalite_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/crystalite_chestplate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_hammer.json b/src/main/resources/assets/betterend/models/item/crystalite_hammer.json new file mode 100644 index 00000000..b1428237 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/crystalite_hammer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "betterend:item/crystalite_hammer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_helmet.json b/src/main/resources/assets/betterend/models/item/crystalite_helmet.json new file mode 100644 index 00000000..c6377a56 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/crystalite_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/crystalite_helmet" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/crystalite_leggings.json b/src/main/resources/assets/betterend/models/item/crystalite_leggings.json new file mode 100644 index 00000000..4457aef3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/crystalite_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "betterend:item/crystalite_leggings" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..faa34796b619021fb0bc01aa167e7bec9290e6e0 GIT binary patch literal 1308 zcmV+%1>^dOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T@f>tO2ILLuiI0Ra2s6iyMRix&%d*6C)e-yp10bdzpsy4jG37G zOC{as2zG#dpGVMpWn_Ym*4EOo6DMf0<|SJH)hU)68XGAP2++l<3QMQDriNwz?%n*n z^!3qOM_G<{jzC~dw*#_QZ7X>lvV-p&<%KBGeTMQTJHH(it8erjE-4^lMu?UB7gRLebkaeDx~#1D^5kp)cA4d<_M^ zle=jn-=FKf_#P{z2`dO9(CLwVWMqVmMSXb92KCy31FF8hp3bzk(m<9{m^ocXNOVTP zjHCP!>Smox*iQKsK!g`CIAO<~yIlXXew_;5n>9hH`Bht1Ue58OJ7-}t+4$5Bv$e2Q zqJL?N(a^(hr8|f!dz9A)gnJk$2LE?ciyFImlMKV4g8Y2StKQ3wvl|g_*AU0p9g%hi znDwHF19-`{{iO0rOK7%#fSus0e9pS(#)w3YPA9Gh4hJaAVposl09=obPbkXCB?@&x zw0QX0r|H)0zx0>wdZyv%fDex!kD0l*j~wA=9(;T|-JP4G+r9mKJypaT&r)%96y97| z$Tbc?!k-sh$0Ev!{Z+j^lwXeF`KzY64Q`-9C!b}4D zGmUk1v{$X+0$ubWyt;os$05P1oQR}209hWgI{{hYXzd5&_xpKCa@))l0d)1u5PWy= zO-sL|^=wQ&feci~tDK0WI6yZZh>V$#r5H~~N7omSXd(T^(ni~>>_oO%FBzoM`Hw!r zGd3L_qwMJ!x)Bc3R<)W_Wq@=!*m;iIU{!XOl@0@>&_z=-G5Xhi4{(14a|TULPI3{v z$oHI(Fx^)A$qHWc8fEciNCFn}0^|pHf7gEUCB0BpWz9rn*Asjn*b^hL^V)cfzGRsH zcg~Q7AJn6!S6NSWfwXruf5zVqU<}%NPy^5t$DuyICEwDA@u~Xo%5L@=Rdrbmme~b( z9q^97@$J`K@J|vxgb1Q5&x$kP1Qb~zsX$?yLiB|}m|fsSUhJSD`@YOD48)-(-g365 z%0enqW`(ah#l^)eVEF+r^3R=}u8hi*{NIi$D=Rn1m>-)mYcF*El9`6NgXljKqc>RQ S8Xh130000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizyJUazyWI3i3tDz0t`t+K~!i%?Uy@9 zD?t>7|K0Tg@dXO;D%#yf@Qq-ng;)r;5KHas#mWb_QUt+L2!a-3z<`a7C<-E|+)}*w zK*R(kD3N$oF0R2S=*k&pm(3c88(qxGd=O^-a}Htm%$YN@5C{YUfj}S-2m}IwKp+@A zKh_p*BN~kjffN3{1w{f?B$Ss+J`NcmY32zdx=$qm*;A&@& z&%Q4b9}RN5yR@9>4Of7=vGpeAtI=0pl0N=ul6jwpW&`-y+r!oSbS5Uq4r~hyb^Jnm zOA9j)cD0+4k5<;O8@uBYAidN#fQ#WVLtFi3?RFH8*E{mRxCp1=FmC@IptGO^f%$o; zs*1?YF0SKonEguZAwfT#g-7{+xf1!Qw1kzjxuoa(enc)W+1%<+7Vl=1teUD3H8 z(ZjrKL^uB+6bxc7N5*r$2WG!jyS)O~7RXX$JVvh&i$qz8Yt8kzuPigP)o<2rPk=<{ zK20hrE7-+{N<1B{Lw5+PO(&TzRlL*3tdRiy@}ob@d$qTz4u!SV#LkaZzeC%kP9Qw^{{S)J8%qwIz`lcZ0h4qTD6Yq2a6h5X6HPI94g*C;0!4R`i zlk}ATVDsgvX=aZH&zPnrYA4?59`oVs7PPe{e3H=$Q-2_61yhkK-q{KOUIF7RV8xwI Rlp6p5002ovPDHLkV1f-l8gc*t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..10059fd610956fb77e4baedf2b9706aaa8386016 GIT binary patch literal 563 zcmV-30?hr1P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T{p^?%tqTbtN2_zz=DOr2$H7v24tUvY#N^Xz<)~}$bv&}y z-R^u3^J2n6v?~DSPR67vfWCEIsS0rKVX?6GG^I@d-g3O%ictamo#!meGNDzB&1e$< zlV!75=1~-}!+y^`(o`(@YK)E4)_`C(6O+ntm8N+c7@HwE4wms8(DVtE_kVEhJ>T^6 zv|0gb?=NqO*F>C0Zd@bJ(<%Yj>iS|H#PR7o@{>#THyRTF<9#xZXGz`?W6#w4ZLr#d z+)bxawbSTXq`XM)cLA6{4Jy|mif*FQ1fWTxG)lVo$K_JgAq7>}(OCjuBn(5bB-SZe{Q?lJgl7c~a~l8v002ovPDHLkV1hPb B`cMD> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ccba06183f3524e141f94e30571b12770b344982 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4uCLY*0oMfpx{JL7srqc=eIKt@-`?4uw2~L;&kNRk+2Qo znvX>`^9!$hP^P}KM<7l(-e6{ALRwp9Aj1qX)&{(kB-@GGX|)@^`0f|`e{R-i<;{CV zqLbdt-)}rG?Fajm#~k6=5kJ#@7zhPdnV*kZUVhlHO0o%RpeN@;HYU5v*IyVO{ta{- NgQu&X%Q~loCIEFJRXP9w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png index a2d59127e006330b1154f3440a1471b49906ea1f..f6051cada6a40214e510f158aedc3ecc2819eac7 100644 GIT binary patch delta 1363 zcmV-Z1+4o06y*w#BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1o}xtK~!i%-B@2tTU8kUE>)PJ!*yCfR&|vTsaDM_LbbnwVFnXb*rK~Hh zg=>GO{ccXLx4pfV(ZVme>HW_A?&bD=g0U4)Q~)sDcQ!OogU6#^TLqR1e$eMDmdAlo?U(eS`>rG0#KvFzv_E=?>(~o&(qi0Bv1eR9EjJZ}T2uv+s}n z{ld<-kASdNL;!Xl@CpMT#K4-D1Hhy?{c%PB5CB;ejeq^g?*r%q0jq=n=prbS2QEhz zXzY>9{i$Qel=t6$N4YpZM;C&V^!?y~!XFMF_{uQ$#XvhQ1QtQ4gmkKSd(H|CxDyPD zhHCYm_+=y;o}kX?igM+xHjL(=>XjzMeR6vqPi*c_(|D1MbHd=&}bO z`)dl2;SmMVWKdNSqX9iIAOj-BkSG-Ba>CY!FGs=(4G!nFE!Vw?Nu;};pC)qhorjEsu*jlySreHy1!WR_3Qe^Am) zvfK)TcwpqZzIGXle+_Rqc?L>z>@hecmjYYG5Okp2z*z*RS)|iaVHp67JVel#?#hMr zF3C$)V!4*UM{!+X+~LVZm09gz^hdww54%hTMqIWL4D47LMjQTC#hR@pkPq1E;$q+< z+%m8TfOM0&ylUj|^aZ=e?dD zJus*xP%AK4@fmjQLRgmonEfFLzIo;h9eU-cUK}yti+5x|*&%Q&a(PK`hcn;J(?xNvn zh?Hv3Z(tSA`4$%h)qJQ|v_T-HlG@E`OF#699!@WTq2Uo~OJy7Kz<(%m z#uF?n5maP>;wfaume)5_7ggSo9d7z&D0dp3=;+e(HY+(s9Qa9#i(f!aw;=zpkK7zb zPoC_3x4WC1E*B-!4eq8UvSa_5ij#BczCLAl*KQ}D&qwE8_tXC7XUOxUi#l8OP$IUX zF9Gxc@|YR!RgGR~^iWeQLC#r~+<)mwgKK}2M@(m{DO@TXore$iI;yLMFySLbqYeAF z$O4U1if)dNQz$K|H)|iIwY3yEv+^=<`FF7%5va-KCE+us&I!M0>L2m$_4^S@ZmSW& z!*`p;Ja8%t%zMog5<%HFq5 zYgn`6T9SfGOQO+^efx_qiy~Di^}i9~M5v?vfFOe-D!|PCL%pjDl>EF>i4_N;e*wyZ VNArM_?QQ@7002ovPDHLkV1g7+j(Gq8 delta 2677 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 yCXtPiASs@n;fUB9n^BYYRvip{f delta 1112 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 IM6N<$g4@t`SpWb4 diff --git a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png index 40136116c17aef28a033009954b195fb9ef9e305..c4711e2ded973f084d9c053852b90589fd75a2ce 100644 GIT binary patch delta 531 zcmX@kx|(HzayIXJpSKRe*Rx`#^I%#|2em|>n1c^ z(pXUZTdeJFJD*|At`b%)qZ&pxhWa&gjd)KbB~+9?Q<`F0!>Bx^jrrS(1^;vO?>klU z@XY@%cO<}g4uf)$-G1YI&1SD4lPT^p^()u~EV!ps|1#Kd>t-XXLqo{F05+fN+ukKu zeE%vu<@5mut@;(rX?lhm+xVUS@O+oEOQ|UTXT<#Z`g@-Kc{XVkzaCr9>DTK&^S`wI zf1>i0HHw@w>N>fbCmZW{Hvc$i8L3fIQkn8Efc=clu35bEZ$>^e{58G3yHVs{fIs5{ zodbu?9QpA1sdn4?^Kng+Ej0fulw;^wP$hq4!o;bJ<~0tUb7bsz8g2=^NHS>f?VC^) z6~6fcLxX8uLZ9L^{j^2r4=i8KoNw05#H!N9TYun*N1*>_hK5Ti%mEB~bBtJHO#O7$ zGj%^L-)1OL__^_@LoJs8L#4#DB%r$23<+%@g^E?(ALVxh)YSgwi{J_IDDw1dxEa0d zEKB$Q9kudj*hLpDS+TrS(z)=(C#&0wOJ+J6@@UCBFo-m_FerZA;>*ax!(g&8aD55$ Tzeha4NM`VK^>bP0l+XkKOL^OQ delta 688 zcmV;h0#E&`1jhxCBYy&pNkl+i$4kKfeiO?JzPh$n?)SJp-bM8^aZX`hPS;5*$GbxPGw$aubxI`hAWO zZ&2GuoD6qvDnFj;wY9jXBdIGb@(^u;0^b{=wzdL*e@5RJwQyehK>G?!Y`M#hWW3*w z=g#jlyL^)Ndi}nu*KDpWM6?4Jd6ITW0!hRZNoq-;aqx`?j~Sa7Cs+(YX&YdCc7~;m z_4LPr#eWb)zU^P1O4ldsToWvYT@#*=