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

呢么这次的教程也就到此结束了
不过我觉得还不够完美
我希望物品贴图因应存血量而改变
呢么我们就留到下一章实现吧
源文件
但这还不够完美
我希望他按住右键的时候可以像和药水一样有动作和声音
呢么我们可以参照一下原版药水的代码来给我们的血瓶加入这个功能
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这样的信息
呢么这次的教程也就到此结束了
不过我觉得还不够完美
我希望物品贴图因应存血量而改变
呢么我们就留到下一章实现吧
源文件
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<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这样的信息

呢么这次的教程也就到此结束了
不过我觉得还不够完美
我希望物品贴图因应存血量而改变
呢么我们就留到下一章实现吧
源文件
Good,go go go .........
我就喜欢放源码的 直接 谢了老兄 666666666666666