跳到主要内容

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 监听 KeyEventTickStartEventReceivePostEvent,并利用这些事件处理玩家按键输入、游戏 Tick 逻辑以及服务器消息。