yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
116 lines (115 loc) • 4.34 kB
JavaScript
import { ChatCommand } from "./command/ChatCommand.js";
import { Command } from "./command.js";
import { EntityUtils } from "./EntityUtils.js";
import { Logger } from "./util/Logger.js";
import { listenEvent, EventPriority } from "./event.js";
import { getErrorMsg } from "./lib/console.js";
import { runTask, Minecraft } from "./basis.js";
let logger = new Logger("debug_func");
let doEval;
let doEvalFunctionInitizePromise = initEvalFunction();
ChatCommand.registerPrefixCommand("$", "geval", onRequestChatEventAsEval);
ChatCommand.registerPrefixCommand("$", "eval", onEvalCommand);
listenEvent({
event: Minecraft.ChatSendBeforeEvent,
priority: EventPriority.HIGHEST,
ignoreCancelled: true
}, onChatEventAsEval);
async function initEvalFunction() {
let generateFunctionCodeLines = [];
// yoni-mcscripts-lib
const yonilib = await import("./index.js");
for (const variable in yonilib) {
generateFunctionCodeLines.push(`let { ${variable} } = arguments[0];`);
}
// util
generateFunctionCodeLines.push(`let { say, send } = YoniUtils;`);
// ObjectUtils
const { ObjectUtils } = await import("./lib/ObjectUtils.js");
generateFunctionCodeLines.push("let { getKeys } = arguments[1];");
// timeout lib
const timeoutlib = await import("./lib/Timeout.js");
for (const variable in timeoutlib) {
generateFunctionCodeLines.push(`let { ${variable} } = arguments[2];`);
}
// memory storage
const s = Object.create(null);
generateFunctionCodeLines.push("let s = arguments[3];");
// logger
generateFunctionCodeLines.push("let logger = arguments[4];");
// dpEval Function Code
generateFunctionCodeLines.push(`
let doEval = async (sender, code) => {
return eval(code);
}
`);
generateFunctionCodeLines.push("return doEval;");
let generateFunction = new Function(generateFunctionCodeLines.join("\n"));
//logger.info(generateFunctionCodeLines.join("\n"));
doEval = generateFunction(yonilib, ObjectUtils, timeoutlib, s, logger);
}
const chatAsEvalPlayers = new Set();
function onEvalCommand(sender, command, label, args) {
if (!hasPermission(sender)) {
sender.sendMessage("§c没有权限");
return;
}
let code = command.slice(command.indexOf(" ") + 1);
executeEval(sender, code);
}
function onChatEventAsEval(event) {
const player = EntityUtils.from(event.sender);
if (chatAsEvalPlayers.has(player)) {
event.cancel = true;
executeEval(player, event.message);
}
}
function onRequestChatEventAsEval(sender, command, label, args) {
if (!hasPermission(sender)) {
sender.sendMessage("§c没有权限");
return;
}
if (chatAsEvalPlayers.has(sender)) {
sender.sendMessage("§b已关闭聊天信息直接作为代码运行");
chatAsEvalPlayers.delete(sender);
}
else {
sender.sendMessage("§e已开启聊天信息直接作为代码运行");
runTask(() => chatAsEvalPlayers.add(sender));
}
}
function hasPermission(player) {
return player.isOp();
}
async function executeEval(sender, code) {
if (!hasPermission(sender)) {
sender.sendMessage("§c没有权限");
return;
}
sender.sendMessage("> " + code);
runTask(() => doEval(sender, code)
.then(onSuccess)
.catch(onError));
function onSuccess(result) {
globalThis._ = result;
sender.sendMessage("§7" + String(result));
}
function onError(error) {
globalThis._error = error;
sender.sendMessage("§c" + getErrorMsg(error).errMsg);
}
}
ChatCommand.registerPrefixCommand("$", "exec", async (sender, rawCommand, label, args) => {
let cmd = rawCommand.slice(label.length + 1);
sender.sendMessage("/" + cmd);
let rt = await sender.fetchCommand(cmd);
sender.sendMessage("§7" + JSON.stringify(rt));
});
ChatCommand.registerPrefixCommand("$", "run", (sender, rawCommand, label, args) => {
let cmd = rawCommand.slice(label.length + 1);
sender.sendMessage("/" + cmd);
let rt = Command.run(cmd);
sender.sendMessage("§7" + JSON.stringify(rt));
});
doEvalFunctionInitizePromise.then(() => logger.info("debug功能已加载,使用$eval可以执行代码"))
.catch((e) => logger.info("debug功能加载出现错误", e));