JEXL 客户端事件监听模块使用 教程
介绍
本教程将介绍如何使用 JEXL 事件监听模块,以便在客户端中监听按键事件、游戏 Tick 事件等,并进行相应的处理。(since 4.4.2)
目录结构
需要将main.js,eventhandlers_test.js放入GermPlugin的目录结构
jexl/
├── client/
│ ├── main.js
│ ├── eventhandlers_test.js
main.js:模块的主入口文件,文件名固定且位置不可改变,负责注册和注销事件监听。eventhandlers_test.js:处理玩家移动键输入记录和回放逻辑。
初始化模块
在 main.js 中,我们使用 Main.registerListener() 方法来注册事件监听模块:
function onEnable(){
Main.registerListener("eventhandlers_test.js");
}
function onDisable(){
Main.unregisterListener("eventhandlers_test.js");
}
监听按键事件
在 eventhandlers_test.js 文件中,我们需要添加默认的方法,onEnable将在Main.registerListener("eventhandlers_test.js");时被调用onDisable将在Main.unregisterListener("eventhandlers_test.js");被调用
//这样创建map,否则变量的值会一直为赋值时的初始值
var cachemap = Utils.getGlobal("germplugin_cachemap",{"":""});
// 模块启用时的初始化函数
function onEnable() {
//开启监听事件,需要在当前文件创建对应的方法 onEvent 方法名暂不可自定义
Events.listenEvent("KeyEvent"); //玩家按下按键时触发
Events.listenEvent("TickStartEvent"); //客户端tick开始时触发
Events.listenEvent("TickEndEvent"); //客户端tick结束时触发
Events.listenEvent("ReceivePostEvent"); //客户端收到服务端主动发来的post时触发
}
// 模块禁用时的清理函数
function onDisable() {
}
在 eventhandlers_test.js 文件中,我们监听 KeyEvent 事件,以检测玩家是否按下了移动键:
function onKeyEvent(event){
var forward = Utils.isKeyDown(Utils.getKeyType("W"));
var left = Utils.isKeyDown(Utils.getKeyType("A"));
var back = Utils.isKeyDown(Utils.getKeyType("S"));
var right = Utils.isKeyDown(Utils.getKeyType("D"));
var sneak = Utils.isKeyDown(Utils.getKeyType("LSHIFT"));
var jump = Utils.isKeyDown(Utils.getKeyType("SPACE"));
var keystr = forward+"_"+left+"_"+right+"_"+back+"_"+sneak+"_"+jump;
Log.chat("玩家移动调试 " + keystr);
var dataMap = {"tick":tick,"jump":jump,"sneak":sneak,"forward":forward,"left":left,"right":right,"back":back};
//告诉服务端玩家如何移动的
Utils.post("playerghosts_record_move",dataMap);
self.cachemap.put("keydata",keystr); //这样调用当前js内的变量
}
监听 Tick 事件
在 eventhandlers_test.js 中,我们使用 onTickStartEvent 方法监听游戏 Tick 事件,强制帮玩家按下某些移动按键:
function onTickStartEvent(event){
//让玩家按下跳跃键
Utils.setKeyBindActive(Utils.getKeyType("SPACE"),true);
}
监听服务器消息
我们可以监听 ReceivePostEvent 事件来处理服务器发送的消息:
function onReceivePostEvent(event){
var path = event["path"];
var data = event["data"];
if("move".equals(path)){
self.cachemap.put("replay",data);
self.cachemap.put("replay_max_tick",maxtick);
self.cachemap.put("replay_tick",0);
}
}
结论
通过本教程,你已经学会了如何使用 JEXL 监听 KeyEvent、TickStartEvent 和 ReceivePostEvent,并利用这些事件处理玩家按键输入、游戏 Tick 逻辑以及服务器消息。