我的世界Java版1.21.4的Fabric模组开发教程(十)更多物品交互行为

article/2025/6/24 20:43:27

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十章——更多物品交互行为。想要阅读其他内容,请查看或订阅上面的专栏。

在之前的创建自定义数据组件章节中,我们在自定义物品类中重写了来自Item类中的use()方法,实现了在右键使用物品时修改数据组件中数据值的功能。实际上,在Item类中还有很多方法可以在自定义物品类中重写,以此来为自定义物品添加更多的自定义交互行为。

在本章中,我们将创建一个物品——烫手马铃薯(hot_potato),并使其在背包中存放时,给玩家造成一定伤害。

完成创建物品的常规流程

与创建其他物品相同,我们要为其创建物品类、模型文件、模型描述文件和纹理图,然后再为其在语言文件中添加中文翻译,最后在游戏注册表中注册物品并将其添加到指定物品组。

1.在com/example/test/item目录中创建自定义方块类HotPotato.java,使其继承Item类并重写相关方法;

public class HotPotato extends Item {public HotPotato(Settings settings) {super(settings);}@Overridepublic void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {tooltip.add(Text.translatable("已烫鼠...").formatted(Formatting.RED));}
}

2.在assets/test/models/item目录中创建模型文件hot_potato.json

{"parent": "minecraft:item/generated","textures": {"layer0": "test:item/hot_potato"}
}

3.在assets/test/items目录中创建模型描述文件hot_potato.json

{"model":{"type": "minecraft:model","model": "test:item/hot_potato"}
}

4.在assets/test/textures/item目录中为物品创建纹理“hot_potato.png”;
在这里插入图片描述
5.在语言文件zh-cn.json中为其添加中文翻译“烫手的马铃薯”;

{..."item.test.hot_potato": "烫手的马铃薯",...
}

6.在入口点类中声明静态常量HOT_POTATO,类型为Item,使用ModItems.register()方法对其初始化;

public static final Item HOT_POTATO = ModItems.register("hot_potato", HotPotato::new, new Item.Settings());

设置路径为“hot_potato”;

7.在入口点类的onInitialize()方法中,将物品添加到指定物品组中;

@Override
public void onInitialize() {//...ItemGroupEvents.modifyEntriesEvent(CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {//...itemGroup.add(HOT_POTATO);//...});//...
}

如果从未了解过自定义物品创建,请先访问我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品。

Item类中的其他方法

除了自定义数据组件章节中用到的use()方法外,Item类中还有很多方法可以被物品类重写,用于为物品添加更多的交互行为,其中包括:

  • postHit():当玩家攻击实体时被调用;
  • postMine():当玩家挖掘方块时被调用;
  • inventoryTick():当物品在物品栏或背包中时,每游戏刻调用一次;
  • onCraft():当物品被合成时调用;
  • useOnBlock():当玩家手持物品右键方块时调用(确切的说是对着方块按下使用按键);
  • use():当玩家手持物品按下右键时调用(确切的说是按下使用按键);

在本章中我们将使用inventoryTick()方法,来实现给玩家造成伤害的功能。

编写物品的自定义交互行为逻辑

现在我们为物品添加自定义交互行为,即当玩家背包或物品栏中有“烫手的马铃薯”,每游戏刻给玩家造成0.25颗心的伤害。要实现这个功能,在自定义物品类中重写inventoryTick()方法最为合适。

1.在自定义物品类中重写inventoryTick()方法;

@Override
public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {}

方法提供了5个参数:

  • ItemStack stack:当前物品堆叠实例;
  • World world:世界对象;
  • Entity entity:持有该物品的实体,通常为玩家;
  • int slot:物品所在的库存槽位索引;
  • boolean selected:该物品是否在玩家的选中快捷栏槽位(即手持状态);

如果不了解部分API,可以参考我的世界Java版1.21.4的Fabric模组开发教程(七)创建自定义魔咒效果其中的部分API描述。

2.调用Entity对象的damage()方法,对玩家造成伤害;

damage()方法是抽象类Entity中的抽象方法,这个方法被Entity的子类所重写。在inventoryTick方法的参数列表中,entity的类型实际上是Entity的子类PlayerEntity,因此,此处调用的damage()方法的逻辑同样是来自PlayerEntity类。

public abstract boolean damage(ServerWorld world, DamageSource source, float amount);

其中需要传递的参数有:

  • ServerWorld world:指定实体所在的服务器世界对象;
  • DamageSource source:指定伤害来源,若无法确定伤害来源,可以使用world.getDamageSources().generic(),代表通用类型;
  • float amount:指定为实体扣除的生命值。

inventoryTick()方法中,调用entity.damage()方法;

entity.damage((ServerWorld) world,world.getDamageSources().generic(),0.5f);

首先传递世界对象,需要强制转换;然后传递伤害类型为world.getDamageSources().generic()通用类型,最后设置伤害值为0.5,即0.25颗心。

现在,只要玩家背包中存放了“烫手的马铃薯”,玩家将会以每游戏刻0.25颗心的速度扣除生命值,直至玩家死亡。玩家血量的红心图标不会以剩余1/4或3/4的形式体现,因此,玩家满血状态下第一次受伤时不会在血量的红心图标中体现。

3.需要注意的是,由于游戏服务端和客户端的同步性,inventoryTick()方法将在客户端和服务端交替执行。而entity.damage()方法只能在服务端执行,在客户端执行时会因为无法强制转换ServerWorld对象而发生错误。

因此,我们必须在执行damage()方法前判断当前世界对象是否为服务器世界ServerWorld对象,需要调用world.isClient()方法;

@Override
public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {if(!world.isClient()){entity.damage((ServerWorld) world,world.getDamageSources().generic(),0.5f);}
}

当确定当前世界对象的类型不是ClientWorld,则可以继续执行damage()

启动游戏测试

1.启动游戏,打开创造模式物品栏,找到“烫手的土豆”,可以看到贴图、名称和物品工具提示能够正常显示;
在这里插入图片描述
2.将“烫手的土豆”加入背包,然后手持“烫手的土豆”,按Q键将其丢弃;
在这里插入图片描述
3.将游戏模式切换为生存模式,然后捡起“烫手的土豆”;
请添加图片描述
可以看到玩家的血量正以每游戏刻0.25颗心减少。

本章小结

本章详细阐述了为自定义物品添加物品交互行为的步骤,使读者可以创建带有自定义交互行为的物品。本文总体难度较小,篇幅较短,但其中仍使用了之前几个章节中的前置知识,想没有障碍的完成学习还需参考专栏的其他章节。感谢各位的阅读,有兴趣可以订阅此专栏!


http://www.hkcw.cn/article/aOmCISfnXB.shtml

相关文章

Linux531rsync定时同步 再回忆

rsync定时同步 环境配置 关闭防火墙&#xff0c;selinux systemctl stop firewalld systemctl disable firewall setenforce 0 cat /etc/selinux/configpei SELINUXdisable设置主机名 systemctl set-hostname code systemctl set-hostname backup设置静态IP rsync由于要设…

MySQL数据库复合查询

前言&#xff1a;本文不对SQL查询做详细讲解&#xff0c;而做案例实践&#xff0c;适合已掌握MySQL基础语法&#xff0c;需要通过实际案例巩固技能的开发者。 首先准备这样三张表 雇员信息表、部门信息、薪水等级。如下&#xff1a; 需要库文件的小伙伴私信我哦&#xff01;&am…

STM32 串口通信①:USART 全面理解 + 代码详解

一 前言 本篇文章并不会系统的从零开始讲起&#xff0c;适合大家对USART有一定的学习&#xff0c;再看本篇文章会有一定的收获&#xff0c;祝大家在本文中&#xff0c;吸收到新的知识。 二 通信方式 1&#xff09;按数据传输的方式分&#xff08;这就是“串行 vs 并行”&…

基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践

在企业数字化转型进程中&#xff0c;非结构化文本数据的处理与分析已成为核心技术挑战。传统自然语言处理方法在处理客户反馈、社交媒体内容和内部文档等复杂数据集时&#xff0c;往往难以有效捕获文本间的深层语义关联和结构化关系。大型概念模型&#xff08;Large Concept Mo…

极地导航的难点及应对措施(上)

在之前的博文《南北极导航选用什么投影&#xff1f;》和何老师的博文《高纬度、跨极区导航技术》中简单说了说南北极导航的投影设置问题。 本文主要说一说南北极导航中实际工作的难点问题以及应对措施。下图是南北极的位置图&#xff0c;从图中可以看出&#xff0c;南极是大陆…

Centos系统搭建主备DNS服务

目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…

【图像处理入门】3. 几何变换基础:从平移旋转到插值魔法

摘要 掌握图像的几何变换相当于学会「图像的空间魔法」。本文将带你理解平移/旋转/缩放的数学原理&#xff0c;掌握OpenCV中warpAffine和getAffineTransform的核心用法&#xff0c;对比最近邻、双线性等插值算法的优劣。通过图像翻转、镜像、透视变换实战&#xff0c;学会用变…

TomatoSCI分析日记:数据分析为什么用csv不用excel

其实并不是多余&#xff0c;虽然看到的内容是一样的&#xff0c;但是相比excel文件&#xff0c;csv文件没这么多繁文缛节&#xff0c;效率更高。 1.csv更干净 csv本质是纯文本&#xff0c;只有你看到的数据&#xff0c;没有花里胡哨的单元格格式、颜色、批注等隐藏信息&#…

【鱼皮-用户中心】笔记

任务&#xff1a;完整了解做项目的思路&#xff0c;接触一些企业及的开发技术 title 企业做项目流程需求分析技术选型 计划一一、前端初始化1. **下载node.js**2. **安装yarn**3. **初始化 Ant Design Pro 脚⼿架&#xff08;关于更多可进入官网了解&#xff09;**4. **开启Umi…

基于 Chrome 浏览器扩展的Chroma简易图形化界面

简介 ChromaDB Manager 是基于 Chrome 浏览器扩展的一款 ChromaDB&#xff08;一个流行的向量数据库&#xff09;的数据查询工具。提供了一个用户友好的界面&#xff0c;可以直接从浏览器连接到本地 ChromaDB 实例、查看集合信息和分片数据。本工具特别适合开发人员快速查看和…

[ElasticSearch] ElasticSearch的初识与基本操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Kafka 如何保证不重复消费

在消息队列的使用场景中&#xff0c;避免消息重复消费是保障数据准确性和业务逻辑正确性的关键。对于 Kafka 而言&#xff0c;保证不重复消费并非单一机制就能实现&#xff0c;而是需要从生产者、消费者以及业务层等多个维度协同配合。接下来&#xff0c;我们将结合图文详细解析…

【快速解决】数据库快速导出成sql文件

1、cmd直接打开 输入命令 mysqldump -u用户名 -p密码 数据库名 > 导出文件名.sql修改成自己mysql的用户名和密码&#xff0c;和要导出的数据库名称&#xff0c;给导出的文件起一个名字。 如图所示 这样就成功了。

OldRoll复古胶片相机:穿越时光,定格经典

在数字摄影盛行的今天&#xff0c;复古胶片相机的独特魅力依然吸引着无数摄影爱好者。OldRoll复古胶片相机这款软件&#xff0c;以其独特的复古风格和丰富的胶片滤镜效果&#xff0c;让用户仿佛穿越回了那个胶片摄影的黄金时代。它不仅模拟了胶片相机的操作界面&#xff0c;还提…

利用Dify创建一个公司产品知识问答

1、创建知识库 打开dify&#xff0c;创建知识库。 选择创建一个空知识库&#xff0c;对知识库进行命名&#xff0c;或者直接导入已有文本&#xff0c;拖曳或选择文件进入下一步&#xff0c;会自动命名知识库。 创新空知识库后&#xff0c;点击添加文件&#xff0c;再导入已有文…

redis核心知识点

Redis是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、Hash(哈希)、 Lis…

黄金价格查询接口如何用C#进行调用?

一、什么是黄金价格查询接口&#xff1f; 提供当日实时黄金行情数据&#xff0c;如上交所&#xff0c;银行账户黄金&#xff0c;国际金价、金店价格等&#xff0c;获取最低价、最高价、卖价、昨日收盘价、开盘价、涨跌值、最新价格、时间、买价、涨跌幅等行情。 二、科技赋能…

JVM 核心组件深度解析:堆、方法区、执行引擎与本地方法接口

一、JVM 堆内存&#xff1a;对象的生存与消亡之地 作为 Java 虚拟机中最大的内存区域&#xff0c;堆内存是所有对象实例的 “出生地” 与 “安息所”。从程序运行的角度看&#xff0c;所有通过new关键字创建的对象都在堆中分配内存&#xff0c;其生命周期完全由垃圾回收机制&am…

每日Prompt:隐形人

提示词 黑色棒球帽&#xff0c;白色抹胸、粉色低腰短裙、白色襪子&#xff0c;黑色鞋子&#xff0c;粉紅色背包&#xff0c;衣服悬浮在空中呈现动态姿势&#xff0c;虚幻引擎渲染风格&#xff0c;高清晰游戏CG质感&#xff0c;户外山林背景&#xff0c;画面聚焦在漂浮的衣服上…

Ubuntu22.04通过命令行安装qt5

环境&#xff1a; VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤&#xff1a; 安装好虚拟机进入shell&#xff0c;或通过ssh登录&#xff0c;确保虚拟机能上外网&#xff0c;执行命令&#xff1a; sudo apt update sudo apt install build-essential sudo snap in…