javascript - 使用事件将玩家信息从客户端发送到服务器(我的世界基岩 API)
问题描述
我一直在尝试使用 BETA API 创建一个 Minecraft BEDROCK Windows 10 MOD。我目前正在关注 {The source Code} 和 Steven Blom 的教程,但这些教程已经过时,而且数量不多。
现在我创建了一个客户端脚本,而不是每秒发送一个自定义事件。
// CLIENT SCRIPT :
// function called once
clientSystem.initialize = function ()
{
let customData = {}; // I would like this to be a player object but for now it's just an empty object
clientSystem.registerEventData("myScript:replaceStone", customData); // register a custom event
}
let tps = 20; // tick per seconds
let tickNumber = 0; // counter
let tickMax = 1 * tps; // when tickNumber reach this % limit, an event is sent
// function called every tick so 20 times per second :
clientSystem.update = function()
{
if (!(++tickNumber % tickMax)) // each second, this condition is true so we enter the if
{
// we create a specific object for replace stone event
let d = clientSystem.createEventData("myScript:replaceStone");
// we call the event and send the specific object with it. (in this case, an empty object)
clientSystem.broadcastEvent("myScript:replaceStone", d);
}
}
// THEN in my server.js script :
/*
** server register the custom event then, listen for it.
** everything works so far.
*/
serverSystem.initialize = function ()
{
// server register to custom event
let rpStoneData = {};
serverSystem.registerEventData("myScript:replaceStone", rpStoneData);
serverSystem.listenForEvent("myScript:replaceStone", eventData => serverSystem.replaceStone(eventData));
}
/*
** Then the function replaceStone is called and a debug message event is called.
*/
serverSystem.replaceStone = function(eventData)
{
let chatEventData = serverSystem.createEventData("minecraft:display_chat_event");
chatEventData.data.message = "ReplaceStone has been called";
serverSystem.broadcastEvent("minecraft:display_chat_event", chatEventData);
}
好的,我想通过自定义事件“替换石头”将玩家信息从客户端发送到服务器端。这意味着我不想将 EMPTY OBJECT 发送到事件,而是想发送客户端的玩家信息。以玩家的位置为例。在替换石头中,我可以执行一个名为“minecraft:execute_command”的事件并执行一个特定的命令,例如“/setblock x y-1 z stone”,x,y,z 将是玩家的位置!我希望它足够清楚,谢谢你的帮助!
解决方案
您可以像这样在自定义事件中发送数据:
if (!(++tickNumber % tickMax)) // each second, this condition is true so we enter the if
{
let d = clientSystem.createEventData("myScript:replaceStone");
d.data.playerPosition = {x: 0, y: 0, z: 0};
clientSystem.broadcastEvent("myScript:replaceStone", d);
}
并像这样在注册上定义事件:
clientSystem.registerEventData("myScript:replaceStone", {playerPosition: null});
顺便说一句,没有必要注册两次“myScript:replaceStone”。您在客户端和服务器上注册它,但在发送事件的一侧进行就足够了。在这种情况下,请在客户端注册它,因为它是发件人。服务器无需注册即可监听事件。
推荐阅读
- logging - 无法在 Flask 的子模块中使用 Python 日志记录
- python - 为什么我无法在烧瓶中使用 request.form 获取文本值来对文本进行情感分析?
- apache - htaccess - 在子文件夹中设置根目录?
- javascript - 使用 [MEAN] 向 API 发出 POST 请求时阻止跨域请求
- python - 为什么我没有得到某些值的输出
- javascript - want custom title image description in facebook share link in asp.net MVC
- swagger - “=”在 Swagger 路径参数中是什么意思?
- python - 如何阻止正则表达式从 4 个数字中过滤掉 2 个数字?
- excel - Excel VBA:通过 IE 自动化使用 iFrame
- mongodb - TmongoDbInput 模式未正确检索 JsonArray