[原创][KubeJS]利用事件监听制作弹幕武器
灵感大王
7
帖子
4
发布者
60
浏览
2
关注中
-
前提
基本逻辑
通过监听 Forge 空击事件 来进行发包(关联NetWork)
本教程逻辑图如下:
是不是非常简单呢?实操代码
首先是在 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() //生成发射物 } })
这样一来就完成了空挥木剑发射箭了!
可选优化
本教程在客户端发包的数据可能会被人为篡改造成作弊!!!
可以将数据计算放在服务端,客户端只作为一个事件触发器来触发网络事件~