本教程我将会给钻石剑新增一个位于耐久条上方的新条。
每次攻击时会给这个条充能,充能完毕之后右键钻石剑使下一次攻击造成大量伤害。
脚本位于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)//条色()
})
初步效果:
现在将其与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("未充能完毕!")
}
})