本篇教程将会以原版钻石剑为例子创建一个钻石剑模型的投掷物


首先让我们注册一个投掷物:

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)//生成
})

大体部分已经完成 现在进入游戏内测试

如何创建一个简单的自定义投掷物(以钻石剑为例子)-第1张图片


如何创建一个简单的自定义投掷物(以钻石剑为例子)-第2张图片

成功了!


如果你只是想做飞刀类的投掷物 则可以不用看下面。


设置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
    
})