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

稽塔Gui_tarJ

稽塔Gui_tar

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

帖子

最新 最佳 有争议的

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

    @半梦 你可以尝试一下

    灵感大王 kubejs 1.20.1 forge

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

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

    灵感大王 kubejs 1.20.1 forge

  • [原创][KubeJS]简单的以tick实现的嘲讽
    稽塔Gui_tarJ 稽塔Gui_tar

    我必须先攻击拥有嘲讽的随从

    灵感大王 原创 kubejs 1.20.1

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

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

    前提

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

    基本逻辑

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

    可选优化

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

    灵感大王 kubejs 1.20.1 forge
  • 1 / 1
  • 登录

  • 没有帐号? 注册

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