前提
基本逻辑
通过监听 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() //生成发射物
}
})
这样一来就完成了空挥木剑发射箭了!
可选优化
本教程在客户端发包的数据可能会被人为篡改造成作弊!!!
可以将数据计算放在服务端,客户端只作为一个事件触发器来触发网络事件~