前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Forge 开发经验 —— 创造一个通过消耗耐久值进行合成的物品

Forge 开发经验 —— 创造一个通过消耗耐久值进行合成的物品

作者头像
HikariLan贺兰星辰
发布2022-10-27 10:01:17
5090
发布2022-10-27 10:01:17
举报
文章被收录于专栏:HikariLan's BlogHikariLan's Blog

本文最后更新于 167 天前,其中的信息可能已经有所发展或是发生改变。

Forge 开发经验 —— 创造一个通过损坏耐久值进行合成的物品

如果你玩过工业 2,你应该知道“锻造锤”这个物品,它可以通过消耗耐久值来将矿物锻造成矿物片,但是实际上“消耗耐久值合成”这个功能在原版是不受支持的,那么,应当如何实现这个功能呢?

环境:Minecraft 1.18.2, Forge 40.1.0, Mapping ‘parchment’ 2022.03.13-1.18.2

刚开始的想法

首先我们肯定还是要按照正常的情况(直接消耗整个物品,而不是消耗耐久值)将 recipe 的数据包 json 制作好的,接下来,我们要想办法让他消耗耐久值:

通常我们会想到用数据包直接实现,但是这个上面说了是不受支持的;

然后我们可能会想到用事件来捕获,但是 PlayerEvent.ItemCraftedEvent 被触发时合成已经结束了,因此我们是无法获知合成信息的;

然后我们可能会想到覆盖 Item.onCraftedBy 方法,但是这个方法的和上面的事件一样,被触发时合成也已经结束;

利用原版已经存在的机制

事实上,我们可以先退一步,看看看原版有什么东西是可以在合成时保留原来的物品的,诸如水桶这样的容器,都拥有这样的属性,经过查看,我们发现 Item 事实上存在一个 craftingRemainingItem 属性,代表的就是合成剩余的 Item,应该在初始化时通过 Item.Properties 传入。

但是我们不能按通常的办法向 Item.Properties 传入 Item:在对象初始化期间传入 this 显然是不可能的,传入一个新的对象实例则会直接导致无限递归调用。

这时,我们就需要退而求其次,看看 craftingRemainingItem 属性是否存在访问方法,然后通过 override 这些访问方法,间接的传入 craftingRemainingItem。恰巧,我们可以看到 IForgeItemItemStack getContainerItem(ItemStack itemStack)boolean hasContainerItem(ItemStack stack) 方法提供了这些功能,接下来,只需要编写代码,便可以完成我们要的效果了:

代码语言:javascript
复制
package io.hikarilan.examplemod.items

import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Rarity
import kotlin.random.Random
import kotlin.random.asJavaRandom

class ExampleItem : Item(
    Properties()
        .stacksTo(1)
        .durability(10)
) {

    override fun getContainerItem(itemStack: ItemStack): ItemStack {
        return itemStack.copy()
            .apply { hurt(1, Random.asJavaRandom(), null) }
            .let { if (it.damageValue >= it.maxDamage) ItemStack.EMPTY else it }
    }

    override fun hasContainerItem(stack: ItemStack): Boolean = true

}

简单来说,首先覆盖 hasContainerItem 方法让 Minecraft 知道,craftingRemainingItem 字段应该是存在的(即使实际上它是空的),然后,覆盖 getContainerItem 方法,当每次需要的时候,就复制一份 itemStack,然后令其耐久减少,当减少到 0 的时候返回空物品(也就是物品消失)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-5-10 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Forge 开发经验 —— 创造一个通过损坏耐久值进行合成的物品
    • 刚开始的想法
      • 利用原版已经存在的机制
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档