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
中:
在en_us.json
中添加我们的物品英文名称
"item.re8joymod.reshield":"Ferocious Totem Shield",
3.保存所有文件 -> 启动游戏测试