跳转至内容

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

灵感大王
7 4 318 2
  • 前提

    基本逻辑

    通过监听 Forge 空击事件 来进行发包(关联NetWork)
    本教程逻辑图如下:
    未命名绘图.drawio.png
    是不是非常简单呢?

    实操代码

    首先是在 startup_scripts 文件夹添加如下代码:

    // 监听左键空击事件
    ForgeEvents.onEvent('net.minecraftforge.event.entity.player.PlayerInteractEvent$LeftClickEmpty', event => {
        let player = event.entity;
        if (!player || !event.level.isClientSide()) return;
        
        let projectileName;
        if(player.mainHandItem.id =="minecraft:wooden_sword") { //判断玩家手里的是不是木剑
            projectileName = "minecraft:arrow";
        }
            // 计算发射数据
            let viewVector = player.getViewVector(1.0)
            const length = Math.sqrt(viewVector.x() * viewVector.x() + viewVector.y() * viewVector.y() + viewVector.z() * viewVector.z())
            let nor_x = viewVector.x() / length
            let nor_y = viewVector.y() / length
            let nor_z = viewVector.z() / length
            let new_x = player.x + nor_x * 2
            let new_y = player.y + player.getEyeHeight()
            let new_z = player.z + nor_z * 2
            
            // 发送数据到服务端
            Client.player.sendData("projectlie", {
                x: new_x,
                y: new_y,
                z: new_z,
                viewX: nor_x,
                viewY: nor_y,
                viewZ: nor_z,
                name: projectileName
            })
    })
    

    那么发送完数据了,接下来就是在服务端进行数据处理啦~
    server_script 文件夹下添加如下代码:

    NetworkEvents.dataReceived("projectlie", (event) => {
        let x = event.data.x
        let y = event.data.y
        let z = event.data.z
        let viewX = event.data.viewX
        let viewY = event.data.viewY
        let viewZ = event.data.viewZ
        let projectlieName = event.data.name
        if(event.player.isHolding("minecraft:wooden_sword")) {
            let projectlie = event.level.createEntity(projectlieName) //创建发射物
            projectlie.setPosition(x, y, z) //设置发射位置
            projectlie.setMotion(viewX * 3, viewY * 3, viewZ * 3) //设置发射速度
            projectlie.setOwner(event.player) //设置发射者
            projectile.spawn() //生成发射物
        }
    })
    

    这样一来就完成了空挥木剑发射箭了!
    QQ2025526-205059-HD.gif

    可选优化

    本教程在客户端发包的数据可能会被人为篡改造成作弊!!!
    可以将数据计算放在服务端,客户端只作为一个事件触发器来触发网络事件~

  • 思维导图好评,下次有没有更多类型的发射?弹幕发射产生粒子之类的

  • 思维导图好评,下次有没有更多类型的发射?弹幕发射产生粒子之类的

    @温酒故长安 本质上都是发包服务器,这个教程主要是一个思路,如果换成粒子效果也行 就是伤害不依附于弹射物,伤害计算需要独立计算。

  • 服务器事件里不是有物品左击事件吗,客户端检测空击,然后发包和这个有什么区别吗🤔

  • 服务器事件里不是有物品左击事件吗,客户端检测空击,然后发包和这个有什么区别吗🤔

    @半梦 你可以尝试一下

  • 我看看能不能给论坛加个mermaid支持。

  • flowchart TD A((玩家空挥)) --> B{是否为特定武器} B -->|是| C["计算发射数据 发包服务端<br/>(坐标,弹幕实体id)"] B -->|不是| D["服务端生成相应弹幕"] C --> D D --> E((结束))

相关推荐


  • [原创][KubeJS]简单的以tick实现的嘲讽

    灵感大王 kubejs
    3
    2 赞同
    3 帖子
    86 浏览
    稽塔Gui_tarJ
    我必须先攻击拥有嘲讽的随从
  • 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 }) })
  • 0 赞同
    3 帖子
    190 浏览
    sdjgeS
    补药在1.21.1偷走我的钱包