萌新贴一个,低技术力,大家随便看看
大致的思路是这样的:
1、先注册一把剑,当然也可以在注册投射物的时候顺带注册再后续修改属性,这里我单独注册,一次性把属性设置好。需要补上一个使用效果,也就是这个finishUsing函数,生成飞剑实体(我这儿还写了一次性可以射多个的一点内容),不过这个实体这会儿还没注册。
.finishUsing((itemstack, level, entity)=>{
if (level.isClientSide()){return itemstack}
// 获取玩家的视角向量
let nv = entity.getForward()
let held_count=itemstack.getCount()
let projectile = level.createEntity(itemid)
projectile.setPosition(entity.x, entity.y + 1.6, entity.z); //设定发射坐标
projectile.setMotion(nv.x()* velocity, nv.y() * velocity, nv.z() * velocity) //设定发射动量
projectile.setOwner(entity) //设定伤害来源
//projectile.setRotation() // 这个函数并未完全生效,见后文
projectile.spawn() //生成
if (held_count==1){return 'minecraft:air'} //如果消耗完了,那么返回空气
else{return Item.of(itemid,held_count-1)} //否则返回剩下的量
}
2、使用entityjs注册这个飞剑投射物,需要和剑的模型一致。projectile是不带模型的,而geckolib_projectile则默认使用assets/[modid]/geo/entity文件夹下的[name].geo.json模型。纹理的话则分别是在textures/entity/projectiles和textures/entity 。
3、注意事项:建模需要注意的是,完全按照这里的代码执行的话,投掷出去的时候,以geo模型的N方向(BlockBlender中显示的)为投掷物的朝向,所以剑的geo模型需要放平,让剑尖朝向N方向。
4、随便写一下onHitBlock和onHitEntity,让飞剑有伤害(这里重写这两个函数的原因是……我不知道怎么给投掷物附加伤害,它的nbt中没有箭的damage)
StartupEvents.registry('entity_type', event => {
let type= isgeo===true ? 'entityjs:geckolib_projectile':'entityjs:projectile'
let proj=event.create(modid+':'+name,type).mobCategory('misc')
.noItem() //不顺带注册对应物品
.onHitBlock(context => {
const { entity, result } = context
entity.kill() //销毁投射物
})
.onHitEntity(context => {
const { entity, result } = context
if (result.entity.living) {
result.entity.attack(baseDamage+addDamage)
entity.kill()
}
})
完成后,我发现射出去的飞剑朝向是固定的,projectile.setRotation 生效了,但是渲染视觉上没有改变,因此需要在上述注册中添加渲染部分,让poseStack随着运动方向改变
.scaleModelForRender(context => {
let { entity, poseStack } = context
let velX = entity.getDeltaMovement().x()
let velY = entity.getDeltaMovement().y()
let velZ = entity.getDeltaMovement().z()
let yaw = Math.atan2(velZ, velX) * (180 / JavaMath.PI) - 90
let pitch = Math.atan2(velY, Math.sqrt(velX * velX + velZ * velZ)) * (180 / JavaMath.PI)
poseStack.mulPose($Axis.YP.rotationDegrees(-yaw)) //$Axis = Java.loadClass("com.mojang.math.Axis")
poseStack.mulPose($Axis.XP.rotationDegrees(-pitch))
})

嗯……只能看到剑把底,这是正确的