[原创][KubeJS 6] 物品投射实现飞剑
灵感大王
2
帖子
2
发布者
110
浏览
2
关注中
-
萌新贴一个,低技术力,大家随便看看
大致的思路是这样的:
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)) })
嗯……只能看到剑把底,这是正确的