跳转至内容
  • 版块
  • 最新
  • 热门
  • 标签
  • 群组
皮肤
  • 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 魔改论坛

  1. 主页
  2. 灵感大王
  3. [原创][KubeJS]利用事件监听制作弹幕武器

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

已定时 已固定 已锁定 已移动 灵感大王
kubejs1.20.1forge
7 帖子 4 发布者 60 浏览 2 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 哼啊啊啊啊J 离线
      哼啊啊啊啊J 离线
      哼啊啊啊啊
      编写于 最后由 juitar 编辑
      #1

      总览
      • 前提
      • 基本逻辑
      • 实操代码
        • 可选优化

      前提

      • 掌握基础的物品注册
      • 掌握网络事件的收发包
        还不会看这里👇
        物品注册
        网络事件

      基本逻辑

      通过监听 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

      可选优化

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

      1 条回复 最后回复
      3
      • 温酒故长安温 离线
        温酒故长安温 离线
        温酒故长安
        KubeJS
        编写于 最后由 编辑
        #2

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

        哼啊啊啊啊J 1 条回复 最后回复
        0
        • 温酒故长安温 温酒故长安

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

          哼啊啊啊啊J 离线
          哼啊啊啊啊J 离线
          哼啊啊啊啊
          编写于 最后由 编辑
          #3

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

          1 条回复 最后回复
          0
          • 半梦半 离线
            半梦半 离线
            半梦
            Packing
            编写于 最后由 编辑
            #4

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

            哼啊啊啊啊J 1 条回复 最后回复
            0
            • 半梦半 半梦

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

              哼啊啊啊啊J 离线
              哼啊啊啊啊J 离线
              哼啊啊啊啊
              编写于 最后由 编辑
              #5

              @半梦 你可以尝试一下

              1 条回复 最后回复
              0
              • 不是客服M 离线
                不是客服M 离线
                不是客服
                VariedMC
                编写于 最后由 编辑
                #6

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

                1 条回复 最后回复
                0
                • 不是客服M 离线
                  不是客服M 离线
                  不是客服
                  VariedMC
                  编写于 最后由 mihono 编辑
                  #7
                  flowchart TD A((玩家空挥)) --> B{是否为特定武器} B -->|是| C["计算发射数据 发包服务端<br/>(坐标,弹幕实体id)"] B -->|不是| D["服务端生成相应弹幕"] C --> D D --> E((结束))
                  1 条回复 最后回复
                  0

                  回复
                  • 在新帖中回复
                  登录后回复
                  • 从旧到新
                  • 从新到旧
                  • 最多赞同


                    • 登录

                    • 没有帐号? 注册

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