如何让Minetest中的食物物品实现多种功能?[模组开发]
问题解决与修正代码
核心问题分析
原代码存在以下关键问题导致物品不消失:
on_use参数错误,未正确接收物品栈与玩家对象,无法处理物品消耗逻辑- 硬编码玩家名称,无法适配多玩家场景
- 手动修改HP后未正确返回
item_eat处理后的物品栈,游戏无法识别物品已被食用 - 速度加成设置为永久,不符合临时buff需求
- 同时设置
on_left_click和on_use,触发逻辑冲突
修正后的代码
minetest.register_craftitem("hot_chocolate_mod:hot_chocolate", { description = "Cup of Hot Chocolate", inventory_image = "hot_chocolate_mod_hot_chocolate.png", groups = { craftitem = 1, food = 3, eatable = 6, can_eat_when_full=1 }, on_use = function(itemstack, user, pointed_thing) -- 添加临时速度加成,持续10秒,可自行修改数字调整时长 user:set_physics_override({ speed = 3 }) minetest.after(10, function(player) if player and player:is_player() then player:set_physics_override({ speed = 1 }) -- 恢复原速度 end end, user) -- 调用内置食用逻辑处理HP回复与物品消耗,返回处理后的物品栈 return minetest.item_eat(2, "mcl_buckets:bucket_empty")(itemstack, user, pointed_thing) end })
关键修改说明
- 修正
on_use参数:使用Minetest标准的itemstack, user, pointed_thing参数,直接通过user获取当前玩家,无需硬编码名称 - 临时速度buff:用
minetest.after设置定时器,到期后自动恢复玩家原速度 - 正确处理物品消耗:调用
minetest.item_eat并返回其处理后的物品栈,游戏会自动扣除物品或替换为空桶 - 移除冗余的
on_left_click:MineClone2中食物默认右键食用,on_use已覆盖该逻辑
参考教程核心内容翻译
物品与食用逻辑(Minetest模组开发手册)
- 注册可食用物品时,
minetest.item_eat(hp_change, replace_item)会返回一个内置处理函数,自动完成玩家HP回复、物品消耗或替换操作 on_use函数必须返回处理后的物品栈,否则游戏不会认定物品已被食用- 若要添加额外效果(如速度buff),需先在
on_use中执行自定义逻辑,再调用item_eat并返回其结果
内容的提问来源于stack exchange,提问作者That_Coder
相关产品推荐
相关产品推荐

