跳转至内容

[原创][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))
            })
    

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

  • cool


相关推荐


  • [原创]使用kjs进行文件的删除

    灵感大王 kubejs 危险行为 数据操作
    4
    0 赞同
    4 帖子
    221 浏览
    草莓呜咩B
    @芒果凍布丁 我揣测Client可能被安全化了,所以loadClass,能直接用的话就安全多了呢。
  • 0 赞同
    4 帖子
    144 浏览
    QiHuang02Q
    这里贴一份1.21.1版本的实现
  • 美食再就业:用紫颂果慕斯进行定点传送

    灵感大王 kubejs 物品
    1
    3 赞同
    1 帖子
    50 浏览
    草莓呜咩B
    美食们可不止能饱腹而已! 紫颂果慕斯既然是紫颂果做的,就和传送脱不了关系? 现在可以将它在铁砧上改名为坐标,逗号间隔,吃了就可以传送到该坐标,是不是很方便呀。 不过还是要消耗一点点经验呢。 ItemEvents.foodEaten("kitchenkarrot:chorus_mousse", event => { let position = event.player.mainHandItem.displayName.getString().slice(1, -1).split(","); if (event.player.xpLevel < 3) event.player.statusMessage = "经验等级不足, 需要三级经验!"; else if (position.length == 3) { event.player.setPosition(position[0], position[1], position[2]); event.player.addXPLevels(-3); } }); 那么草莓慕斯会是什么效果呢?要是能召唤草莓军团就太帅了!