Minecraft 1.16.5模组开发(三十八) 3D盔甲(新)

Minecraft升级到1.16.5后,3D盔甲的制作方法也跟之前版本稍有不同(主要在第二步、第四步),建议先复习一下往期教程:

Minecraft 1.12.2模组开发(三十七) 3D盔甲

1.在blockbench中制作我们的盔甲的模型和材质

注意修改版本为1.16(Mojmaps)

cr0.jpg

制作好后导出Java模型

cr1.jpg

将模型放入armor包中

cr2.jpg

2.对模型文件添加或修改几个函数

MirandaSuit.java

package com.joy187.re8joymod.common.items.armor;

// Made with Blockbench 3.9.3
// Exported for Minecraft version 1.15 - 1.16 with Mojang mappings
// Paste this class into your mod and generate all required imports


import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.entity.model.BipedModel;
import net.minecraft.client.renderer.model.ModelRenderer;
import net.minecraft.inventory.EquipmentSlotType;

public class MirandaSuit extends BipedModel {
    //和上期一样,bone是模型根目录
	private final ModelRenderer bone;
	private final ModelRenderer Body;
	private final ModelRenderer Body_r1;
	...(模型机密)
	private final ModelRenderer Leftfrontlib;

	public MirandaSuit() {
		super(1F);
		texWidth = 128;
		texHeight = 128;

		bone = new ModelRenderer(this);
		bone.setPos(0.0F, 44.0F, 0.0F);


		Body = new ModelRenderer(this);
		Body.setPos(0.0F, -24.0F, 0.0F);
		bone.addChild(Body);
		Body.texOffs(44, 7).addBox(-6.0F, -19.0F, -6.0F, 12.0F, 12.0F, 11.0F, 0.0F, false);
		Body.texOffs(44, 7).addBox(-5.0F, -20.0F, -5.0F, 10.0F, 1.0F, 10.0F, 0.0F, false);
		Body.texOffs(86, 109).addBox(-6.0F, -19.0F, 5.0F, 12.0F, 18.0F, 2.0F, 0.0F, false);
		Body.texOffs(46, 65).addBox(-6.0F, -7.0F, -6.0F, 11.0F, 8.0F, 9.0F, 0.0F, false);

		Body_r1 = new ModelRenderer(this);

        ...
		Leftfrontlib = new ModelRenderer(this);
		Leftfrontlib.setPos(0.0F, 1.0F, -2.0F);
		Leftlib.addChild(Leftfrontlib);
        
        //添加这句话,说明是胸甲(头盔head,护腿、靴子leftLeg,rightLeg)
		this.body.addChild(bone);
	}

    //这个函数很关键,直接整个复制
	public final MirandaSuit applyEntityStats(BipedModel defaultArmor){

		this.leftArmPose = defaultArmor.leftArmPose;
		this.rightArmPose = defaultArmor.rightArmPose;
		this.crouching = defaultArmor.crouching;
		this.head.copyFrom(defaultArmor.head);
		this.hat.copyFrom(defaultArmor.hat);
		this.body.copyFrom(defaultArmor.body);
		this.rightArm.copyFrom(defaultArmor.rightArm);
		this.leftArm.copyFrom(defaultArmor.leftArm);
		this.rightLeg.copyFrom(defaultArmor.rightLeg);
		this.leftLeg.copyFrom(defaultArmor.leftLeg);

		return this;
	}
	
    //这个函数也很关键,直接整个复制
	@Override
	public void copyPropertiesTo(BipedModel p_217148_1_) {
		super.copyPropertiesTo(p_217148_1_);
		p_217148_1_.leftArmPose = this.leftArmPose;
		p_217148_1_.rightArmPose = this.rightArmPose;
		p_217148_1_.crouching = this.crouching;
		p_217148_1_.head.copyFrom(this.head);
		p_217148_1_.hat.copyFrom(this.hat);
		p_217148_1_.body.copyFrom(this.body);
		p_217148_1_.rightArm.copyFrom(this.rightArm);
		p_217148_1_.leftArm.copyFrom(this.leftArm);
		p_217148_1_.rightLeg.copyFrom(this.rightLeg);
		p_217148_1_.leftLeg.copyFrom(this.leftLeg);
	}
    
    //这个函数决定盔甲部位,
	public BipedModel applySlot(EquipmentSlotType slot){
		bone.visible = false;
		switch(slot){
		    //这里的CHEST说明我们的盔甲是胸甲,头盔HEAD,护腿LEGS,靴子FEET
			case CHEST:
				bone.visible = true;

				break;
			default:
				break;
		}

		return this;
	}
    //这个函数也很关键,直接整个复制
	@Override
	public void renderToBuffer(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){
		bone.render(matrixStack, buffer, packedLight, packedOverlay);
	}
    //这个函数也很关键,直接整个复制
	public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) {
		modelRenderer.xRot = x;
		modelRenderer.yRot = y;
		modelRenderer.zRot = z;
	}
    //这个函数也很关键,直接整个复制
	private final void copyModelAngles(ModelRenderer in, ModelRenderer out){
		out.xRot = in.xRot;
		out.yRot = in.yRot;
		out.zRot = in.zRot;
	}
}

3.在armor包中新建一个盔甲物品定义类ArmorMirandaSuit

ArmorMirandaSuit.java

package com.joy187.re8joymod.common.items.armor;

import com.joy187.re8joymod.common.init.ModItems;
import net.minecraft.client.renderer.entity.model.BipedModel;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.world.World;


public class ArmorMirandaSuit extends ArmorItem {
    //定义一个我们第二步中的盔甲类
    private MirandaSuit mirandaSuitModel;
    
    //仿照这样写
    public ArmorMirandaSuit(IArmorMaterial material, EquipmentSlotType equipmentSlot, Item.Properties properties, MirandaSuit armorModel) {
        super(material, equipmentSlot, properties);
        this.mirandaSuitModel = armorModel;
    }
    
    @Override
    public final BipedModel getArmorModel(LivingEntity entity, ItemStack itemStack, EquipmentSlotType armorSlot, BipedModel defaultArmor) {

        this.mirandaSuitModel.copyPropertiesTo(defaultArmor);
        //最后EquipmentSlotType是我们穿戴的部位:胸甲CHEST,头盔HEAD,护腿LEGS,靴子FEET
        return mirandaSuitModel.applyEntityStats(defaultArmor).applySlot(EquipmentSlotType.CHEST);
    }

    //定义穿上盔甲的效果
    @OnlyIn(Dist.CLIENT)
    @Override
    public void onArmorTick(ItemStack stack, World world, PlayerEntity player) {
        if(player.getItemBySlot(EquipmentSlotType.CHEST).getItem() == ModItems.MIRANDA_SUIT.get())
        {
            player.addEffect(new EffectInstance(Effects.DIG_SPEED,10,3,false,false));
            player.addEffect(new EffectInstance(Effects.REGENERATION,10,3,true,true));
        }
        super.onArmorTick(stack,world, player);
    }

}

4.新建一个盔甲属性类用于存放所有模组的盔甲属性:

CustomArmorMaterial.java

public enum CustomArmorMaterial implements IArmorMaterial {

    ARMOR_MATERIAL_FRANKSUIT("franksuit", 80, new int[] {8, 13, 20, 12}, 35, SoundEvents.ARMOR_EQUIP_IRON, 7.0F, 0.8F, () -> Ingredient.of(ModItems.MACHINEHEARTS.get())),
    ARMOR_MATERIAL_MIRANDASUIT("mirandasuit", 150, new int[] {20, 40, 48, 28}, 95, SoundEvents.ARMOR_EQUIP_NETHERITE, 10.0F, 0.8F, () -> Ingredient.of(ModItems.BLACKFEATHER.get())),
    ARMOR_MATERIAL_MIRANDA1SUIT("miranda1suit", 160, new int[] {20, 49, 40, 28}, 125, SoundEvents.ARMOR_EQUIP_NETHERITE, 15.0F, 0.9F, () -> Ingredient.of(ModItems.BLACKFEATHER.get())),
    //可以添加续写
    
    ARMOR_MATERIAL_DIMI1SUIT("dimi1suit", 120, new int[] {15, 35, 25, 20}, 75, SoundEvents.ARMOR_EQUIP_NETHERITE, 10.0F, 0.6F, () -> Ingredient.of(ModItems.BLACKFEATHER.get()));


    private static final int[] baseDurability = { 13, 15, 16, 11 };
    private final String name;
    private final int durabilityMultiplier;
    private final int[] armorVal;
    private final int enchantability;
    private final SoundEvent equipSound;
    private final float toughness;
    private final float knockbackResistance;
    private Ingredient repairIngredient;

    /**
     * Constructor that adds the armormaterial
     * @param name Armor name
     * @param durabilityMultiplier Armor durability multiplier
     * @param armorVal Armor values per body part
     * @param enchantability Armor enchantability
     * @param equipSound Armor equipping sound
     * @param toughness Armor toughness points
     * @param knockbackResistance Armor knockback resistance
     * @param repairIngredient Armor repair item
     */
    CustomArmorMaterial(String name, int durabilityMultiplier, int[] armorVal, int enchantability, SoundEvent equipSound, float toughness, float knockbackResistance, Supplier<Ingredient> repairIngredient) {
        this.name = name;
        this.durabilityMultiplier = durabilityMultiplier;
        this.armorVal = armorVal;
        this.enchantability = enchantability;
        this.equipSound = equipSound;
        this.toughness = toughness;
        this.knockbackResistance = knockbackResistance;
        this.repairIngredient = repairIngredient.get();
    }

    /**
     * Gets the durability for a certain slot
     * @param slot Armor slot
     * @return Base durability times multiplier for that slot
     */
    @Override
    public int getDurabilityForSlot(EquipmentSlotType slot) {
        return baseDurability[slot.getIndex()] * durabilityMultiplier;
    }

    /**
     * Gets the defense for a certain slot
     * @param slot Armor slot
     * @return Armor value for that slot
     */
    @Override
    public int getDefenseForSlot(EquipmentSlotType slot) {
        return this.armorVal[slot.getIndex()];
    }

    /**
     * Gets the enchantability for a certain armor
     * @return Enchantability value
     */
    @Override
    public int getEnchantmentValue() {
        return this.enchantability;
    }

    /**
     * Gets the equip sound for a certain armor
     * @return Equip sound
     */
    @Override
    public SoundEvent getEquipSound() {
        return this.equipSound;
    }

    /**
     * Gets the repair item for a certain armor
     * @return Repair item
     */
    @Override
    public Ingredient getRepairIngredient() {
        return this.repairIngredient;
    }

    /**
     * Gets the name for a certain armor
     * @return Name
     */
    @Override
    public String getName() {
        return this.name;
    }

    /**
     * Gets the toughness value for a certain armor
     * @return Toughness value
     */
    @Override
    public float getToughness() {
        return this.toughness;
    }

    /**
     * Gets the knockback resistance for a certain armor
     * @return Knockback resistance value
     */
    @Override
    public float getKnockbackResistance() {
        return this.knockbackResistance;
    }
}

5.在ModItems.java中声明我们的盔甲

//盔甲声明 参数:盔甲名称字符串,盔甲属性(上一步中定义,在这里引用),盔甲穿戴部位,盔甲放在哪个物品栏,盔甲类(第二步中的)
public static final RegistryObject<Item> MIRANDA_SUIT = ITEMS.register("mirandasuit",
            () -> new ArmorMirandaSuit(CustomArmorMaterial.ARMOR_MATERIAL_MIRANDA1SUIT,EquipmentSlotType.CHEST,(new Item.Properties()).tab(RegistryEvents.RE8GROUP),new MirandaSuit()) );

6.找到resources包中assets包

cr3.jpg

1.assets\minecraft\textures\models\armor中添加盔甲穿戴后贴图
2.assets\你的模组名称文件夹下:
en_us.json中添加物品游戏内英文名称
  "item.re8joymod.mirandasuit":"Miranda's Suit",
在models/item中新建一个模型文件mirandasuit.json
{
	"parent": "item/generated",
	"textures": {
		"layer0": "re8joymod:items/mirandasuit"
	}
}
textures/models/armor包中添加盔甲贴图,textures/items中添加物品手持贴图

6.保存所有文件,刷新项目 -> 启动MC

CR.jpg

没有问题~
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: Minecraft 1.16.5 模组开发需要使用 Minecraft Forge 来进行。Forge 是一个 Minecraft 游戏引擎的模组加载器,可以帮助开发者在游戏中添加的物品、方块、生物等内容。要使用 Forge 开发模组,需要了解 Java 编程语言,并且要下载 Forge 的开发工具(包括 Forge 的安装程序和样例代码)。开发完成后,可以将模组发布到 Minecraft 模组网站上,供其他玩家下载和使用。 ### 回答2: Minecraft是一款驰名世界的沙盒游戏,而模组是为了丰富游戏内容而产生的。在1.16.5版本中,模组开发者可以借助许多已有的API来快速创建自己的模组。 首先,1.16.5版本加入了很多特性,如的生物、的方块等等,模组开发者可以充分利用这些特性来增加游戏的趣味性。例如,可以添加的生物,创造的剧情,让玩家们更有代入感。 其次,Minecraft 1.16.5提供了许多API给模组开发者使用,协助他们快速制作模组。比如说,模组开发者可以使用SpongeAPI来创建的方块和物品,并且可以添加的动画和粒子效果等,让游戏更加生动有趣。 最后,模组开发需要一定的编程基础,开发者需要掌握Java语言、Minecraft API和模组API等知识,以便在代码层面上实现模组和游戏的无缝结合。同时,模组开发过程中需要注重游戏的稳定性,保证模组运行不会影响游戏的正常运行。 总之,Minecraft 1.16.5模组开发是一个挑战和乐趣并存的过程,只有具备一定相关知识和经验的开发者才能顺利完成。但是,对于喜欢创造和探索的玩家来说,模组开发也是一项极具意义的工作。 ### 回答3: Minecraft是一款备受欢迎的沙盒游戏,为了让玩家们更好地玩耍,游戏开发者提供了一些简单的功能,如基本方块和物品,但这远远不够激动人心。为了让游戏更有趣,玩家们可以使用模组,这些模组可以添加的方块、武器、生物等等,这样就可以使游戏变得更加丰富多彩,也能满足不同的玩家需求。 对于当前最Minecraft 1.16.5版本,模组开发者需要先了解模组的基础知识。首先,模组是用Java编写的,并且需要与Minecraft游戏的Java代码进行交互。因此,开发者需要熟悉Java编程语言,并掌握如何使用Java开发工具,如Eclipse或IntelliJ IDEA。 其次,开发者需要了解Minecraft游戏代码的结构和API(Application Programming Interface)的使用。Minecraft提供了一组API,即Minecraft Forge,其中包括用于物品、方块、生物、技能等的修改API,以及用于添加自定义游戏逻辑或玩家交互的事件API。开发者需要熟悉这些API的使用和结构,以便在模组开发过程中使用它们。 第三,开发者需要有良好的设计思路和实现能力。他们需要为自己的模组设计合理的玩法,考虑玩家的需求和玩法体验,同时也要注意与其他模组的兼容性和与Minecraft游戏的整体和谐性。 最后,在完成模组开发后,开发者需要对模组进行测试和调试,以确保模组的稳定性和能够良好地与其他模组Minecraft游戏兼容。 总之,Minecraft模组开发需要开发者拥有良好的Java编程基础、对Minecraft游戏代码结构和API的了解,以及良好的设计思路和实现能力,它是一项非常有趣的任务,可以满足玩家们的不同需求,同时也为Minecraft游戏增加了更多的乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值