This commit is contained in:
ZXMushroom63 2024-09-26 12:50:21 +08:00
parent 69a1829d0d
commit 7d7c06475b
2 changed files with 38 additions and 1 deletions

View File

@ -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;

View File

@ -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());