zkm00323
上一张我们完成了血瓶的基本使用逻辑和功能
但这还不够完美
我希望他按住右键的时候可以像和药水一样有动作和声音
呢么我们可以参照一下原版药水的代码来给我们的血瓶加入这个功能

1.优化物品使用体验
首先我们在ItemBloodsave里面重写getMaxItemUseDuration方法
    public int getMaxItemUseDuration(ItemStack stack){
        return 32;
    }


32就是32tick,1tick=1/20秒,所以等于要长按右键1.6秒才会触发onItemUseFinish方法
再加上下面的方法
    public EnumAction getItemUseAction(ItemStack stack){
        return EnumAction.DRINK;
    }


物品正在使用时候执行DRINK动作

再来我们在原本的onItemRightClick开头加入
    public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand handIn){
       player.setActiveHand(handIn);


右键则设定玩家正在使用手里(handIn)的物品

把之前右键回血的代码提取出来放到onItemUseFinish方法里
public ItemStack onItemUseFinish(ItemStack item, World world, EntityLivingBase player) {
            if(!world.isRemote){
                    if(item.getTagCompound().getInteger("bloodsave")>0 && !(player.getMaxHealth() == player.getHealth())){
                                if(player.getMaxHealth()-player.getHealth()>item.getTagCompound().getInteger("bloodsave")){
                                        player.heal(item.getTagCompound().getInteger("bloodsave"));  
                                        item.getTagCompound().setInteger("bloodsave", 0);
                                }else{
                                        item.getTagCompound().setInteger("bloodsave",(item.getTagCompound().getInteger("bloodsave")-(int)(player.getMaxHealth()-player.getHealth())));
                                        player.setHealth(player.getMaxHealth());
                                }        
                            ((EntityPlayer) player).addChatComponentMessage(new TextComponentString("bloodsave:"+item.getTagCompound().getInteger("bloodsave")), true);
                        }  
            }
            return super.onItemUseFinish(item, world, player);
    }

我加了((EntityPlayer) player).addChatComponentMessage方法,这会在玩家物品栏上方显示信息

呢么现在的onItemRightClick去除了补血方面的代码只留下扣血以及创建nbt的代码
   public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand handIn){
       player.setActiveHand(handIn);
                   if(!world.isRemote){
                ItemStack item = player.getHeldItemMainhand();
                    if(item.getTagCompound()==null){
                            item.setTagCompound(new NBTTagCompound());
                            NBTTagCompound nbt = new NBTTagCompound();
                            nbt.setInteger("bloodsave", 20);
                            item.getTagCompound().setTag("blood", nbt);
                    }
                    if(player.isSneaking() && item.getTagCompound().getInteger("bloodsave")<20){
                            int damage = new Random().nextInt(10)+1;                     
                            int save = item.getTagCompound().getInteger("bloodsave");
                            player.setHealth(player.isCreative() ? player.getHealth()-0: player.getHealth()-damage);
                            ((EntityPlayer) player).addChatComponentMessage(new TextComponentString("bloodsave:"+item.getTagCompound().getInteger("bloodsave")+"+"+damage/2), true);
                            item.getTagCompound().setInteger("bloodsave", save + damage/2 > 20 ? 20 : save + damage/2);     
                            player.stopActiveHand();
}else if(player.isSneaking() && item.getTagCompound().getInteger("bloodsave")==20)
                                    ((EntityPlayer) player).addChatComponentMessage(new TextComponentString("bloodsave:20"), true);
             }
                   return new ActionResult(EnumActionResult.SUCCESS, player.getHeldItem(handIn));
    }

注意我加了player.stopActiveHand()停止玩家手里物品的使用,这样就不会再触发onItemUseFinish方法
毕竟如果我们这一次动作是为了扣血,而不要补血
而在扣血指令呢里我添加了一个判断 是否为创造模式?不扣血:扣血

最后我们还可以给物品添加可视化信息
    public void addInformation(ItemStack stack, EntityPlayer playerIn, List<String> tooltip, boolean advanced) {
        NBTTagCompound nbt = stack.getTagCompound();
        if (nbt != null && nbt.hasKey("bloodsave"))
        tooltip.add("bloodsave: " + nbt.getInteger("bloodsave"));
            super.addInformation(stack, playerIn, tooltip, advanced);
    }

这样当你鼠标移到物品上时就会有bloodsave:XX这样的信息


呢么这次的教程也就到此结束了
不过我觉得还不够完美
我希望物品贴图因应存血量而改变
呢么我们就留到下一章实现吧

源文件
src_教程5.rar (5.93 KB, 下载次数: 23)


2021.12 数据,可能有更多内容上一张我们完成了血瓶的基本使用逻辑和功能
但这还不够完美
我希望他按住右键的时候可以像和药水一样有动作和声音
呢么我们可以参照一下原版药水的代码来给我们的血瓶加入这个功能


1.优化物品使用体验
首先我们在ItemBloodsave里面重写getMaxItemUseDuration方法
    public int getMaxItemUseDuration(ItemStack stack){
  return 32;
    }



32就是32tick,1tick=1/20秒,所以等于要长按右键1.6秒才会触发onItemUseFinish方法
再加上下面的方法
    public EnumAction getItemUseAction(ItemStack stack){
  return EnumAction.DRINK;
    }


物品正在使用时候执行DRINK动作


再来我们在原本的onItemRightClick开头加入
    public ActionResult&lt;ItemStack&gt; onItemRightClick(World world, EntityPlayer player, EnumHand handIn){
    player.setActiveHand(handIn);



右键则设定玩家正在使用手里(handIn)的物品


把之前右键回血的代码提取出来放到onItemUseFinish方法里
public ItemStack onItemUseFinish(ItemStack item, World world, EntityLivingBase player) {
   if(!world.isRemote){
  if(item.getTagCompound().getInteger(&quot;bloodsave&quot;)&gt;0 &amp;&amp; !(player.getMaxHealth() == player.getHealth())){
  if(player.getMaxHealth()-player.getHealth()&gt;item.getTagCompound().getInteger(&quot;bloodsave&quot;)){
    player.heal(item.getTagCompound().getInteger(&quot;bloodsave&quot;));
    item.getTagCompound().setInteger(&quot;bloodsave&quot;, 0);
  }else{
    item.getTagCompound().setInteger(&quot;bloodsave&quot;,(item.getTagCompound().getInteger(&quot;bloodsave&quot;)-(int)(player.getMaxHealth()-player.getHealth())));
    player.setHealth(player.getMaxHealth());
  } 
    ((EntityPlayer) player).addChatComponentMessage(new TextComponentString(&quot;bloodsave:&quot;+item.getTagCompound().getInteger(&quot;bloodsave&quot;)), true);
   }
   }
   return super.onItemUseFinish(item, world, player);
    }


我加了((EntityPlayer) player).addChatComponentMessage方法,这会在玩家物品栏上方显示信息


呢么现在的onItemRightClick去除了补血方面的代码只留下扣血以及创建nbt的代码
   public ActionResult&lt;ItemStack&gt; onItemRightClick(World world, EntityPlayer player, EnumHand handIn){
    player.setActiveHand(handIn);
    if(!world.isRemote){
    ItemStack item = player.getHeldItemMainhand();
  if(item.getTagCompound()==null){
    item.setTagCompound(new NBTTagCompound());
    NBTTagCompound nbt = new NBTTagCompound();
    nbt.setInteger(&quot;bloodsave&quot;, 20);
    item.getTagCompound().setTag(&quot;blood&quot;, nbt);
  }
  if(player.isSneaking() &amp;&amp; item.getTagCompound().getInteger(&quot;bloodsave&quot;)&lt;20){
    int damage = new Random().nextInt(10)+1;   
    int save = item.getTagCompound().getInteger(&quot;bloodsave&quot;);
    player.setHealth(player.isCreative() ? player.getHealth()-0: player.getHealth()-damage);
    ((EntityPlayer) player).addChatComponentMessage(new TextComponentString(&quot;bloodsave:&quot;+item.getTagCompound().getInteger(&quot;bloodsave&quot;)+&quot;+&quot;+damage/2), true);
    item.getTagCompound().setInteger(&quot;bloodsave&quot;, save + damage/2 &gt; 20 ? 20 : save + damage/2); 
    player.stopActiveHand();
}else if(player.isSneaking() &amp;&amp; item.getTagCompound().getInteger(&quot;bloodsave&quot;)==20)
   ((EntityPlayer) player).addChatComponentMessage(new TextComponentString(&quot;bloodsave:20&quot;), true);
    }
    return new ActionResult(EnumActionResult.SUCCESS, player.getHeldItem(handIn));
    }


注意我加了player.stopActiveHand()停止玩家手里物品的使用,这样就不会再触发onItemUseFinish方法
毕竟如果我们这一次动作是为了扣血,而不要补血
而在扣血指令呢里我添加了一个判断 是否为创造模式?不扣血:扣血


最后我们还可以给物品添加可视化信息
    public void addInformation(ItemStack stack, EntityPlayer playerIn, List&lt;String&gt; tooltip, boolean advanced) {
  NBTTagCompound nbt = stack.getTagCompound();
  if (nbt != null &amp;&amp; nbt.hasKey(&quot;bloodsave&quot;))
  tooltip.add(&quot;bloodsave: &quot; + nbt.getInteger(&quot;bloodsave&quot;));
   super.addInformation(stack, playerIn, tooltip, advanced);
    }


这样当你鼠标移到物品上时就会有bloodsave:XX这样的信息



呢么这次的教程也就到此结束了
不过我觉得还不够完美
我希望物品贴图因应存血量而改变
呢么我们就留到下一章实现吧


源文件




thestronger
Good,go go go .........

OP1115
我就喜欢放源码的 直接 谢了老兄 666666666666666