跳转至内容

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


相关推荐


  • [原创][KubeJS]利用事件监听制作弹幕武器

    灵感大王 kubejs
    7
    3 赞同
    7 帖子
    318 浏览
    不是客服M
    flowchart TD A((玩家空挥)) --> B{是否为特定武器} B -->|是| C["计算发射数据 发包服务端<br/>(坐标,弹幕实体id)"] B -->|不是| D["服务端生成相应弹幕"] C --> D D --> E((结束))
  • 1 赞同
    1 帖子
    171 浏览
    忆然
    本文使用:CC-BY-NC-SA 4.0协议 kjs本身提供的物品注册比较有限,在注册某些kjs未提供的item的时候我们就需要用到createCustom 如果有需要的item注册可以在本文下方留言,会考虑更新 createCustom注册model是没有的,也就是你还得去写一份model.json(这部分可以参考原版wiki) 下面是使用createCustom去注册一个弓的例子 let $BowItem = Java.loadClass("net.minecraft.world.item.BowItem") let $Item$Properties = Java.loadClass("net.minecraft.world.item.Item$Properties") StartupEvents.registry("item", event => { event.createCustom("modid:item_name", () => { let properties = new $Item$Properties() //修改耐久 为0则无耐久属性 properties.durability(0) //修改最大堆叠数量 properties.stacksTo(1) //修改稀有度 properties.rarity("epic") //创建新的bowitem let item = new $BowItem(properties) //返回新的bowitem进行注册 return item }) })
  • [原创]使用kjs进行文件的删除

    灵感大王 kubejs 危险行为 数据操作
    4
    0 赞同
    4 帖子
    221 浏览
    草莓呜咩B
    @芒果凍布丁 我揣测Client可能被安全化了,所以loadClass,能直接用的话就安全多了呢。