本篇教程将会以原版钻石剑为例子创建一个钻石剑模型的投掷物
首先让我们注册一个投掷物:
CustomItemProjectileEvents.registry(event=>{
event.create("testproj:diamond_proj")
})
然后设置它的大小
CustomItemProjectileEvents.registry(event=>{
event.create("testproj:diamond_proj")
.size(0.4,0.4) //默认是(0.5,0.5) 你可以自行修改他的大小(宽度,高度)
})
设置可攻击实体
CustomItemProjectileEvents.registry(event=>{
event.create("testproj:diamond_proj")
.size(0.4,0.4) //默认是(0.5,0.5) 你可以自行修改他的大小(宽度,高度)
.canHitEntity((proj,entity)=>{
return proj.oldCanHitEntity(entity) && entity.getType() == "minecraft:zombie"//proj.oldCanHitEntity(entity)代表使用默认方法 如果不加这个则代表完全重写canHitEntity方法
})//在默认的基础上只能攻击僵尸
})
设置击中方块和击中实体的行为
CustomItemProjectileEvents.registry(event=>{
event.create("testproj:diamond_proj")
.size(0.4,0.4) //默认是(0.5,0.5) 你可以自行修改他的Box大小(宽度,高度)
.canHitEntity((proj,entity)=>{
return proj.oldCanHitEntity(entity) && entity.getType() == "minecraft:zombie"//proj.oldCanHitEntity(entity)代表使用默认方法 如果不加这个则代表完全重写canHitEntity方法
})//在默认的基础上只能攻击僵尸
.onHitEntity((proj,hitResult)=>{
hitResult.entity.attack(10)//给击中的实体造成10点伤害
})
.onHitBlock((proj,hitResult)=>{
proj.setSoundEvent("item.trident.hit_ground") //设置声音
proj.oldOnHitBlock(hitResult)//使用默认击中方法
})
})
设置刻方法
CustomItemProjectileEvents.registry(event=>{
event.create("testproj:diamond_proj")
.size(0.4,0.4) //默认是(0.5,0.5) 你可以自行修改他的大小(宽度,高度)
.canHitEntity((proj,entity)=>{
return proj.oldCanHitEntity(entity) && entity.getType() == "minecraft:zombie"//proj.oldCanHitEntity(entity)代表使用默认方法 如果不加这个则代表完全重写canHitEntity方法
})//在默认的基础上只能攻击僵尸
.onHitEntity((proj,hitResult)=>{
hitResult.entity.attack(10)//给击中的实体造成10点伤害
})
.onHitBlock((proj,hitResult)=>{
proj.setSoundEvent("item.trident.hit_ground") //设置声音
proj.oldOnHitBlock(hitResult)//使用默认击中方法
})
.onTick(proj=>{
proj.oldTick()//使用默认刻方法
proj.level.spawnParticles("minecraft:snowflake", true, proj.x, proj.y, proj.z, 0, 0, 0, 1, 0)//每刻生成粒子
})
})
渲染效果以外的主要部分已经完成 接下来是如何生成这个投掷物。
首先,加载类。
const $CustomItemProjectile = Java.loadClass("chen1335.CustomItemProjectile.world.entity.projectile.CustomItemProjectile")
然后...
const $CustomItemProjectile = Java.loadClass("chen1335.CustomItemProjectile.world.entity.projectile.CustomItemProjectile")
ItemEvents.rightClicked("minecraft:diamond_sword", event => {
var CustomItemProjectile = new $CustomItemProjectile("testproj:diamond_proj", event.level)//创建实体对象
CustomItemProjectile.setOwner(event.player)//设置所有者
CustomItemProjectile.setItemStack("minecraft:diamond_sword") //设置itemstack(可以附魔) 模型物品
CustomItemProjectile.setPosition(event.player.x, event.player.y + event.player.eyeHeight, event.player.z)//设置位置
CustomItemProjectile.shootFromRotation(event.player, event.player.getXRot(), event.player.getYRot(), 0, 2, 1)//设置初始运动状态
CustomItemProjectile.hitInflateX = 0.5//设置击中判定箱判定的增幅大小(这一条可以不用设置,原版计算有点问题,过大的hitInflateX反而会导致无法判定:( )
event.level.addFreshEntity(CustomItemProjectile)//生成
})
大体部分已经完成 现在进入游戏内测试
成功了!
如果你只是想做飞刀类的投掷物 则可以不用看下面。
设置CustomRende (主要调整poseStack),如果不进行则使用默认的render(飞刀)
我们可以在游戏内设置临时的render方法
ItemEvents.rightClicked("minecraft:diamond_sword", event => {
var CustomItemProjectile = new $CustomItemProjectile("testproj:diamond_proj", event.level)//创建实体对象
CustomItemProjectile.setOwner(event.player)//设置所有者
CustomItemProjectile.setItemStack("minecraft:diamond_sword") //设置itemstack(可以附魔)
CustomItemProjectile.setPosition(event.player.x, event.player.y + event.player.eyeHeight, event.player.z)//设置位置
CustomItemProjectile.shootFromRotation(event.player, event.player.getXRot(), event.player.getYRot(), 0, 2, 1)//设置初始运动状态
CustomItemProjectile.hitInflateX = 0.5//设置击中判定箱判定的增幅大小(这一条可以不用设置,原版计算有点问题,过大的hitInflateX反而会导致无法判定:( )
CustomItemProjectile.setCustomRender(context=>{
context.poseStack
//太麻烦了 我也不会:(
})
event.level.addFreshEntity(CustomItemProjectile)//生成
})
调整完成后需要写进注册投掷物里
CustomItemProjectileEvents.registry(event=>{
event.create("testproj:diamond_proj")
.size(0.4,0.4) //默认是(0.5,0.5) 你可以自行修改他的大小(宽度,高度)
.canHitEntity((proj,entity)=>{
return proj.oldCanHitEntity(entity) && entity.getType() == "minecraft:zombie"//proj.oldCanHitEntity(entity)代表使用默认方法 如果不加这个则代表完全重写canHitEntity方法
})//在默认的基础上只能攻击僵尸
.onHitEntity((proj,hitResult)=>{
hitResult.entity.attack(10)//给击中的实体造成10点伤害
})
.onHitBlock((proj,hitResult)=>{
proj.setSoundEvent("item.trident.hit_ground") //设置声音
proj.oldOnHitBlock(hitResult)//使用默认击中方法
})
.onTick(proj=>{
proj.oldTick()//使用默认刻方法
proj.level.spawnParticles("minecraft:snowflake", true, proj.x, proj.y, proj.z, 0, 0, 0, 1, 0)//每刻生成粒子
})
.customRender(context=>{
//......
})//自定义render
})