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 00000000..faa34796 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_1.png differ diff --git a/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png new file mode 100644 index 00000000..5924226e Binary files /dev/null and b/src/main/resources/assets/betterend/textures/model/armor/crystalite_layer_2.png differ 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 00000000..10059fd6 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_1.png differ 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 00000000..ccba0618 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/model/armor/crystalite_overlay_layer_2.png differ 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 a2d59127..f6051cad 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_1.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png index 5c8be702..cc99c6b5 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/aeternium_layer_2.png differ diff --git a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png index de90bc2d..b2ba4409 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png and b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_1.png differ 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 40136116..c4711e2d 100644 Binary files a/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png and b/src/main/resources/assets/minecraft/textures/models/armor/terminite_layer_2.png differ