我的世界1.19.2fabric自定义工具
先上个wiki链接 fabricmc.net/wiki/tutorial:tools
其实大多数的按照wiki就行了

并实现父类方法

然后写这一个工具类

注册
public static final Item LightningRod1 = register("lightning_rod_material",(Item) new LightningRod(LightningRodMaterial.LIGHTNING_ROD_MATERIAL,new Item.Settings().group(ITEM_GROUP).maxDamage(LightningRodMaterial.LIGHTNING_ROD_MATERIAL.getDurability())));
这里的register是我自行写了个方法,ITEM_GROUP是我自定义的物品组可以用ItemGroup.FOOD代替,注意这里的注册方法与wiki的不同


然后放置纹理,配置文件就行了


但是你会发现这个工具在LightningRodMaterial写的getAttackDamage中的攻击伤害没效果
并且也么有耐久,还有耐久变成负数的情况

在LightningRod中覆写postHit攻击函数
就是public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) {
}
然后写以下内容(吐槽,为什么这个b编辑器没有代码块功能)
@Override
public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) {
//造成伤害,是target被攻击者受到的伤害 target.damage(DamageSource.GENERIC,lightningRod.getAttackDamage());
ItemStack itemStack = attacker.getStackInHand(attacker.getActiveHand()); // 创建用户手头ItemStack的一个新的ItemStack实例
// itemStack.setDamage(itemStack.getDamage()-1);
PlayerEntity playerEntity = attacker.getEntityWorld().getPlayerByUuid(attacker.getUuid());//通过uuid获取玩家
if (itemStack.isDamageable()&&!playerEntity.isCreative()){//是否有耐久,是否为创造
playerEntity.getItemCooldownManager().set(this,5);//设置攻击冷却
itemStack.setDamage(itemStack.getDamage()+1);//设置耐久
if (itemStack.getDamage()>=itemStack.getMaxDamage()){如果当前损失耐久大于最大耐久
itemStack.decrement(1);//去除这个物品
}
}
return true;
}

由于PlayerEntity是LivingEntity的子类,不能强转,要获取子类方法只能另寻出路
就是PlayerEntity playerEntity= attacker.getEntityWorld().getPlayerByUuid(attacker.getUuid());//通过uuid获取玩家
由此可以设置他的物品冷却时间playerEntity.getItemCooldownManager().set(this,100);
在攻击的时候召唤闪电
World world = attacker.getWorld();
LightningEntity lightningEntity = new LightningEntity(EntityType.LIGHTNING_BOLT,world);
lightningEntity.setPosition(target.getPos());
world.spawnEntity(lightningEntity);
