Minecraft 1.18.1、1.18.2模组开发 17.自定义盾牌(shield)

本文介绍了如何在Minecraft 1.12.2版本中创建一个自定义的盾牌类,扩展了原版盾牌的功能。通过编写ItemShield.java,设置盾牌的耐久值、修理材料,并赋予盾牌额外的属性,如增加护甲值和抗击退效果。同时,教程还涉及了3D模型的制作,指导玩家如何在Blockbench中设计盾牌模型并导入游戏中。最后,通过在游戏中添加相应的英文名称,完成盾牌的全部定制过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Minecraft 1.12.2 自定义盾牌(Shield)

今天我们在1.18的版本中实现一个3D盾牌。

1.在新建一个我们的盾牌类ItemShield,继承原版的盾牌:

ItemShield.java

package com.joy187.re8joymod.items;

import java.util.UUID;

import javax.annotation.Nullable;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.joy187.re8joymod.Main;

import net.minecraft.tags.ItemTags;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ShieldItem;
import net.minecraft.world.item.UseAnim;
import net.minecraft.world.level.Level;

public class ItemShield extends ShieldItem{
    protected static final UUID OFF_HAND_MODIFIER = UUID.fromString("9271eeea-5f74-4e12-97b6-7cf3c60ef7a0");
    protected static final UUID MAIN_HAND_MODIFIER = UUID.fromString("7d766720-0695-46c6-b320-44529f3da63f");

    public ItemShield() {
        super(new Properties().tab(Main.TUTORIAL_TAB).stacksTo(1));

    }
    
    public boolean isShield(ItemStack stack, @Nullable LivingEntity entity) {
        return true;
    }

    /**
     * returns the action that specifies what animation to play when the items is being used
     */
    public UseAnim getUseAnimation(ItemStack p_40678_) {
        return UseAnim.BLOCK;
     }
    /**
     * How long it takes to use or consume an item
     */
    public int getMaxItemUseDuration(ItemStack stack) {
        return 72000;
    }

    @Override
    public InteractionResultHolder<ItemStack> use(Level p_77659_1_, Player playerIn, InteractionHand handIn) {
        ItemStack itemstack = playerIn.getItemInHand(handIn);
        playerIn.startUsingItem(handIn);
        return InteractionResultHolder.consume(itemstack);
    }
    
    //我们盾牌的耐久值
    @Override
    public int getMaxDamage(ItemStack stack) {
        return 768;
    }

    //能用什么修理
    public boolean isValidRepairItem(ItemStack p_43091_, ItemStack p_43092_) {
        return p_43092_.is(ItemTags.PLANKS) || super.isValidRepairItem(p_43091_, p_43092_);
     }
    
    //盾牌装备的属性
    public Multimap<Attribute, AttributeModifier> getAttributeModifiers(EquipmentSlot equipmentSlot, ItemStack stack)
    {
        Multimap<Attribute, AttributeModifier> multimap = HashMultimap.<Attribute, AttributeModifier>create();
        //当装备在主手时,就增加6点护甲值和30%抗击退
        if (equipmentSlot == EquipmentSlot.OFFHAND )
        {
            multimap.put(Attributes.KNOCKBACK_RESISTANCE, new AttributeModifier(OFF_HAND_MODIFIER, "Weapon modifier", (double)0.3, AttributeModifier.Operation.fromValue(0)));
            multimap.put(Attributes.ARMOR, new AttributeModifier(MAIN_HAND_MODIFIER, "Weapon modifier", (double)6, AttributeModifier.Operation.fromValue(0)));
        }
        
        //当装备在主手时,就给予玩家6点护甲值
        if (equipmentSlot == EquipmentSlot.MAINHAND)
        {
            multimap.put(Attributes.ARMOR, new AttributeModifier(MAIN_HAND_MODIFIER, "Weapon modifier", (double)6, AttributeModifier.Operation.fromValue(0)));
            //multimap.put(GlobalEntityTypeAttributes.ATTACK_DAMAGE, new AttributeModifier(MAIN_HAND_MODIFIER, "Weapon modifier", (double)6 / 2f, AttributeModifier.Operation.fromValue(0)));
        }
        return multimap;
    }
}
在ItemInit中声明我们的盾牌:
    public static RegistryObject<Item> RESHIELD = ITEMS.register("reshield",()->
    {
        return new ItemShield();
    });

2.代码部分结束,我们可以在Blockbench中制作一个3D盾牌并导出为.json文件,将其放入resources\assets\你的modid\models\item中:

cr7.png

en_us.json中添加我们的物品英文名称
  "item.re8joymod.reshield":"Ferocious Totem Shield",

3.保存所有文件 -> 启动游戏测试

ss

各种盾牌随你制作~
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jay_fearless

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

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

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

打赏作者

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

抵扣说明:

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

余额充值