本教程我将会给钻石剑新增一个位于耐久条上方的新条。

每次攻击时会给这个条充能,充能完毕之后右键钻石剑使下一次攻击造成大量伤害。

脚本位于client_scripts

首先是注册

//第一个参数是需要注册的物品,第二个参数是这个ItemDecorator在钻石剑上的唯一id
const exampleItemDecorator = RenderJSItemDecoratorHandler.register("diamond_sword","example",context=>{
   //......
})

//如果你希望在游戏中可以随时修改,那么可以:
exampleItemDecorator.setRender(context=>{
    //本教材将会在这里添加
})
exampleItemDecorator.setRender(context=>{
    var itemStack = context.itemStack
    var charge = 0
    if (itemStack.getOrCreateTag().contains("Charge")) {
        charge = itemStack.nbt.getInt("Charge")
    }

    //重置颜色
    RenderJSRenderSystem.setShaderColorJS(1,1,1,1)
    //禁用深度测试 要不然贴图会在物品下面
    RenderJSRenderSystem.disableDepthTestJS()
    //纯色填充(int pX, int pY, int pWidth, int pHeight, int pRed, int pGreen, int pBlue, int pAlpha)
    RenderJSUtils.fillRect(context.xOffset+2,context.yOffset+12,13,1,0,0,0,255)//底色


    RenderJSUtils.fillRect(context.xOffset+2,context.yOffset+12,10,1,255,0,0,255)//条色()


})

初步效果:

如何注册并且使用ItemDecorator?(以物品双条为例子)-第1张图片

现在将其与charge关联

exampleItemDecorator.setRender(context=>{
    var itemStack = context.itemStack
    var charge = 0
    if (itemStack.getOrCreateTag().contains("Charge")) {
        charge = itemStack.nbt.getInt("Charge")
    }

    //设置满充能为10
    charge=Math.min(charge,10)
    //重置颜色
    RenderJSRenderSystem.setShaderColorJS(1,1,1,1)
    //禁用深度测试 要不然贴图会在物品下面
    RenderJSRenderSystem.disableDepthTestJS()
    //纯色填充(int pX, int pY, int pWidth, int pHeight, int pRed, int pGreen, int pBlue, int pAlpha)
    RenderJSUtils.fillRect(context.xOffset+2,context.yOffset+12,13,1,0,0,0,255)//底色


    RenderJSUtils.fillRect(context.xOffset+2,context.yOffset+12,13*charge/10,1,255,0,0,255)//条色
})

这部分大体已经完成(就是这么简单),其实这里不止能用纯色填充,也能以hud里相同的方式绘制图片。

现在 开始实现能力

server_scripts

EntityEvents.hurt(event=>{
    if (event.source.actual.isPlayer() && event.source.player.mainHandItem.item.id == 'minecraft:diamond_sword') {
        var tag = event.source.player.mainHandItem.getOrCreateTag()
        if (!tag.contains("Charge")) {
            tag.putInt("Charge",1)
        }
        tag.putInt("Charge",Math.min(tag.getInt("Charge")+1,10))

        if (tag.contains("isUseAbility")&&tag.getBoolean("isUseAbility")) {
            tag.putBoolean("isUseAbility",false)
            event.entity.attack(event.source,100)
        }
    }
})

ItemEvents.rightClicked("diamond_sword",event=>{
    var tag = event.item.getOrCreateTag()
    if (tag.contains("Charge") && tag.getInt("Charge") == 10) {
        event.player.tell("使用技能!")
        tag.putBoolean("isUseAbility",true)
        tag.putInt("Charge",0)
    }else{
        event.player.tell("未充能完毕!")
    }
})

如何注册并且使用ItemDecorator?(以物品双条为例子)-第2张图片如何注册并且使用ItemDecorator?(以物品双条为例子)-第3张图片

如何注册并且使用ItemDecorator?(以物品双条为例子)-第4张图片