跳转至内容
  • 版块
  • 最新
  • 热门
  • 标签
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Zephyr)
  • 不使用皮肤
折叠
品牌标识

VariedMC 魔改论坛

widokenusW

widokenus

@widokenus
KubeJS
关于
帖子
1
主题
1
分享
0
群组
1
粉丝
0
关注
0
Blog

帖子

最新 最佳 有争议的

  • [原创][KubeJS 6] 物品投射实现飞剑
    widokenusW widokenus

    萌新贴一个,低技术力,大家随便看看
    大致的思路是这样的:
    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
    嗯……只能看到剑把底,这是正确的

    灵感大王 kubejs entityjs
  • 1 / 1
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 热门
  • 标签
  • 群组