From 7d7c06475bd68136fc38ba0f04ccf6470e2096bd Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Thu, 26 Sep 2024 12:50:21 +0800 Subject: [PATCH] test --- examplemods/AsyncSink.js | 21 ++++++++++++++++++++- examplemods/npcspawner.js | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/examplemods/AsyncSink.js b/examplemods/AsyncSink.js index bb9aab2..9e2cd08 100644 --- a/examplemods/AsyncSink.js +++ b/examplemods/AsyncSink.js @@ -76,7 +76,11 @@ } return wrap(AsyncSink.getFile(ModAPI.util.ustr(args[1]))); } - + var ev = {method: "read", file: ModAPI.util.ustr(args[1]), shim: false, shimOutput: new ArrayBuffer()}; + AsyncSink.MIDDLEWARE.forEach((fn)=>{fn(ev)}); + if (ev.shim) { + return wrap(ev.shimOutput); + } return originalReadWholeFile.apply(this, args); }; @@ -92,6 +96,11 @@ AsyncSink.setFile(ModAPI.util.ustr(args[1]), args[2]); return booleanResult(true); } + var ev = {method: "write", file: ModAPI.util.ustr(args[1]), data: args[2], shim: false, shimOutput: true}; + AsyncSink.MIDDLEWARE.forEach((fn)=>{fn(ev)}); + if (ev.shim) { + return booleanResult(ev.shimOutput); + } return originalWriteWholeFile.apply(this, args); }; @@ -107,6 +116,11 @@ AsyncSink.deleteFile(ModAPI.util.ustr(args[1])); return booleanResult(true); } + var ev = {method: "delete", file: ModAPI.util.ustr(args[1]), shim: false, shimOutput: true}; + AsyncSink.MIDDLEWARE.forEach((fn)=>{fn(ev)}); + if (ev.shim) { + return booleanResult(ev.shimOutput); + } return originalDeleteFile.apply(this, args); }; @@ -122,6 +136,11 @@ var result = AsyncSink.fileExists(ModAPI.util.ustr(args[1])); return booleanResult(result); } + var ev = {method: "exists", file: ModAPI.util.ustr(args[1]), shim: false, shimOutput: true}; + AsyncSink.MIDDLEWARE.forEach((fn)=>{fn(ev)}); + if (ev.shim) { + return booleanResult(ev.shimOutput); + } return originalFileExists.apply(this, args); }; globalThis.AsyncSink = AsyncSink; diff --git a/examplemods/npcspawner.js b/examplemods/npcspawner.js index a07fbb2..f17bb07 100644 --- a/examplemods/npcspawner.js +++ b/examplemods/npcspawner.js @@ -1,5 +1,20 @@ (() => { PluginAPI.dedicatedServer.appendCode(function () { + var ready = false; + var killFS = false; + function setup_filesystem_middleware() { + if (!ready) { + AsyncSink.MIDDLEWARE.push((ev)=>{ + if (killFS) { + ev.shim = true; + if (typeof ev.shimOutput === "boolean") { + ev.shimOutput = true; + } + } + }); + ready = true; + } + } PluginAPI.addEventListener("processcommand", (event) => { if (!ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP").instanceOf(event.sender.getRef())) { return; } @@ -7,6 +22,7 @@ if (!globalThis.AsyncSink) { return alert("NPC Spawner relies on the AsyncSink library."); } + setup_filesystem_middleware(); const world = event.sender.getServerForPlayer(); const senderPos = event.sender.getPosition(); @@ -23,6 +39,7 @@ const playerInteractionManager = PlayerInteractionManagerClass.constructors[0](world.getRef()); // Get the EntityPlayerMP class to spawn the fake player + killFS = true; AsyncSink.startDebuggingFS(); const EntityPlayerMPClass = ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP"); var worldNameProp = ModAPI.util.getNearestProperty(ModAPI.server.getRef(), "$worldName"); @@ -31,6 +48,7 @@ const fakePlayer = EntityPlayerMPClass.constructors[0]( ModAPI.server.getRef(), world.getRef(), fakeProfile, playerInteractionManager ); + killFS = false; // Set the fake player position to be near the command sender fakePlayer.setPosition(senderPos.$getX(), senderPos.$getY(), senderPos.$getZ());