mirror of
https://github.com/eaglerforge/EaglerForgeInjector
synced 2025-07-25 07:01:20 -09:00
Add display to chat, plus example mod
This commit is contained in:
parent
db6e60a196
commit
fa9f50c399
@ -1,5 +0,0 @@
|
|||||||
//Very much WIP, still firguring out how to poke the dedicated server.
|
|
||||||
(()=>{
|
|
||||||
//PluginAPI.javaClient.$timer.$timerSpeed = 4;
|
|
||||||
ModAPI.dedicatedServer.appendCode(`console.log(ModAPI.hooks._rippedStaticProperties[ModAPI.util.getCompiledNameFromPackage("net.lax1dude.eaglercraft.v1_8.sp.server.EaglerIntegratedServerWorker")].currentProcess)`);
|
|
||||||
})();
|
|
9
examplemods/minecraft_on_3x_speed.js
Normal file
9
examplemods/minecraft_on_3x_speed.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
//Very much WIP, still firguring out how to poke the dedicated server.
|
||||||
|
(()=>{
|
||||||
|
PluginAPI.javaClient.$timer.$timerSpeed = 3;
|
||||||
|
ModAPI.dedicatedServer.appendCode(`
|
||||||
|
const original_getCurrentTime = ModAPI.hooks.methods.nms_MinecraftServer_getCurrentTimeMillis;
|
||||||
|
ModAPI.hooks.methods.nms_MinecraftServer_getCurrentTimeMillis = function () {
|
||||||
|
return original_getCurrentTime() * 3n;
|
||||||
|
};`);
|
||||||
|
})();
|
@ -199,6 +199,7 @@
|
|||||||
var modapi_preinit = `globalThis.ModAPI ||= {};
|
var modapi_preinit = `globalThis.ModAPI ||= {};
|
||||||
ModAPI.hooks ||= {};
|
ModAPI.hooks ||= {};
|
||||||
ModAPI.hooks._rippedData ||= [];
|
ModAPI.hooks._rippedData ||= [];
|
||||||
|
ModAPI.hooks._teavmMethods ||= {};
|
||||||
ModAPI.hooks._rippedConstructors ||= {};
|
ModAPI.hooks._rippedConstructors ||= {};
|
||||||
ModAPI.hooks.methods ||= {};
|
ModAPI.hooks.methods ||= {};
|
||||||
ModAPI.hooks._rippedMethodTypeMap ||= {};
|
ModAPI.hooks._rippedMethodTypeMap ||= {};
|
||||||
@ -287,7 +288,7 @@ var main;(function(){`
|
|||||||
return ModAPI.hooks.methods[\`${fullName}\`].apply(this, args);
|
return ModAPI.hooks.methods[\`${fullName}\`].apply(this, args);
|
||||||
}
|
}
|
||||||
ModAPI.hooks._rippedMethodTypeMap[\`${fullName}\`] = \`${
|
ModAPI.hooks._rippedMethodTypeMap[\`${fullName}\`] = \`${
|
||||||
match.includes("function " + fullName + "($this")
|
match.includes("($this")
|
||||||
? "instance" //Todo: fix static/instance detection
|
? "instance" //Todo: fix static/instance detection
|
||||||
: "static"
|
: "static"
|
||||||
}\`;
|
}\`;
|
||||||
@ -298,8 +299,9 @@ var main;(function(){`
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
var staticVariables = [...patchedFile.matchAll(/var \S+?_\S+?_\S+? = null;/gm)].flatMap(x => {return x[0]});
|
var staticVariables = [...patchedFile.matchAll(/var \S+?_\S+?_\S+? = null;/gm)].flatMap(x => {return x[0]});
|
||||||
patchedFile = patchedFile.replaceAll(/var \S+?_\S+? = \$rt_classWithoutFields\(\);/gm, function (match) {
|
//Todo: add support for static properties on classes with constructors like this: function nmcg_GuiMainMenu() {
|
||||||
var prefix = match.replace(" = $rt_classWithoutFields();", "");
|
patchedFile = patchedFile.replaceAll(/var \S+?_\S+? = \$rt_classWithoutFields\(\S*?\);/gm, function (match) {
|
||||||
|
var prefix = match.replaceAll(/ = \$rt_classWithoutFields\(\S*?\);/gm, "");
|
||||||
var entries = [];
|
var entries = [];
|
||||||
staticVariables.forEach(entry => {
|
staticVariables.forEach(entry => {
|
||||||
if (entry.startsWith(prefix)) {
|
if (entry.startsWith(prefix)) {
|
||||||
@ -344,6 +346,12 @@ var main;(function(){`
|
|||||||
});`;
|
});`;
|
||||||
return match + proxy;
|
return match + proxy;
|
||||||
});
|
});
|
||||||
|
patchedFile = patchedFile.replaceAll(/function \$rt_\S+?\(/gm, (match)=>{
|
||||||
|
var name = match.replace("function ", "");
|
||||||
|
name = name.substring(0, name.length - 1);
|
||||||
|
return `ModAPI.hooks._teavmMethods[\`${name}\`]=${name};
|
||||||
|
` + match;
|
||||||
|
});
|
||||||
patchedFile = patchedFile.replaceAll(/main\(\);\s*?}/gm, (match) => {
|
patchedFile = patchedFile.replaceAll(/main\(\);\s*?}/gm, (match) => {
|
||||||
return match.replace("main();", "main();ModAPI.hooks._postInit();");
|
return match.replace("main();", "main();ModAPI.hooks._postInit();");
|
||||||
});
|
});
|
||||||
@ -395,6 +403,7 @@ var main;(function(){`
|
|||||||
ModAPI.version = "v2.0";
|
ModAPI.version = "v2.0";
|
||||||
ModAPI.flavour = "injector";
|
ModAPI.flavour = "injector";
|
||||||
ModAPI.credits = ["ZXMushroom63", "radmanplays", "OtterCodes101", "TheIdiotPlays"];
|
ModAPI.credits = ["ZXMushroom63", "radmanplays", "OtterCodes101", "TheIdiotPlays"];
|
||||||
|
ModAPI.hooks.regenerateClassMap = function () {
|
||||||
ModAPI.hooks._rippedConstructorKeys = Object.keys(ModAPI.hooks._rippedConstructors);
|
ModAPI.hooks._rippedConstructorKeys = Object.keys(ModAPI.hooks._rippedConstructors);
|
||||||
ModAPI.hooks._rippedMethodKeys = Object.keys(ModAPI.hooks._rippedMethodTypeMap);
|
ModAPI.hooks._rippedMethodKeys = Object.keys(ModAPI.hooks._rippedMethodTypeMap);
|
||||||
ModAPI.hooks._rippedData.forEach(block => {
|
ModAPI.hooks._rippedData.forEach(block => {
|
||||||
@ -445,7 +454,7 @@ var main;(function(){`
|
|||||||
if (ModAPI.hooks._rippedMethodTypeMap[method] === "static") {
|
if (ModAPI.hooks._rippedMethodTypeMap[method] === "static") {
|
||||||
targetMethodMap = ModAPI.hooks._classMap[classId].staticMethods;
|
targetMethodMap = ModAPI.hooks._classMap[classId].staticMethods;
|
||||||
}
|
}
|
||||||
targetMethodMap[method] = {
|
targetMethodMap[method.replace(compiledName + "_", "")] = {
|
||||||
method: ModAPI.hooks.methods[method],
|
method: ModAPI.hooks.methods[method],
|
||||||
proxiedMethod: function (...args) {
|
proxiedMethod: function (...args) {
|
||||||
return ModAPI.hooks.methods[method].apply(this, args);
|
return ModAPI.hooks.methods[method].apply(this, args);
|
||||||
@ -457,6 +466,8 @@ var main;(function(){`
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
ModAPI.hooks.regenerateClassMap();
|
||||||
var reloadDeprecationWarnings = 0;
|
var reloadDeprecationWarnings = 0;
|
||||||
const TeaVM_to_BaseData_ProxyConf = {
|
const TeaVM_to_BaseData_ProxyConf = {
|
||||||
get(target, prop, receiver) {
|
get(target, prop, receiver) {
|
||||||
@ -496,7 +507,7 @@ var main;(function(){`
|
|||||||
return outputValue;
|
return outputValue;
|
||||||
},
|
},
|
||||||
set(object, prop, value) {
|
set(object, prop, value) {
|
||||||
object[prop]=value;
|
object[prop] = value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -609,6 +620,7 @@ var main;(function(){`
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
ModAPI.events.newEvent("update");
|
ModAPI.events.newEvent("update");
|
||||||
|
|
||||||
ModAPI.require = function (module) {
|
ModAPI.require = function (module) {
|
||||||
ModAPI.required.add(module);
|
ModAPI.required.add(module);
|
||||||
};
|
};
|
||||||
@ -635,13 +647,26 @@ var main;(function(){`
|
|||||||
return uint16Array;
|
return uint16Array;
|
||||||
}
|
}
|
||||||
|
|
||||||
var stringDefaultConstructor = ModAPI.hooks._classMap["java.lang.String"].constructors.filter(x => {return x.length === 0})[0];
|
var stringDefaultConstructor = ModAPI.hooks._classMap["java.lang.String"].constructors.filter(x => { return x.length === 0 })[0];
|
||||||
ModAPI.util.string = ModAPI.util.str = function (string) {
|
ModAPI.util.string = ModAPI.util.str = function (string) {
|
||||||
var jclString = stringDefaultConstructor();
|
var jclString = stringDefaultConstructor();
|
||||||
jclString.$characters.data = ModAPI.util.stringToUint16Array(string);
|
jclString.$characters.data = ModAPI.util.stringToUint16Array(string);
|
||||||
return jclString;
|
return jclString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModAPI.util.setStringContent = function (jclString) {
|
||||||
|
jclString.$characters.data = ModAPI.util.stringToUint16Array(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModAPI.util.jclStrToJsStr = function (jclString) {
|
||||||
|
var uint16Array = jclString.$characters.data;
|
||||||
|
let str = '';
|
||||||
|
for (let i = 0; i < uint16Array.length; i++) {
|
||||||
|
str += String.fromCharCode(uint16Array[i]);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
ModAPI.displayToChat = function (param) {
|
ModAPI.displayToChat = function (param) {
|
||||||
var v = typeof param === "object" ? param.msg : (param + "");
|
var v = typeof param === "object" ? param.msg : (param + "");
|
||||||
v ||= "";
|
v ||= "";
|
||||||
@ -668,12 +693,27 @@ var main;(function(){`
|
|||||||
|
|
||||||
var integratedServerStartup = ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer", "loadIntegratedServerSourceInline");
|
var integratedServerStartup = ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer", "loadIntegratedServerSourceInline");
|
||||||
//Integrated server setup has a randomised suffix on the end
|
//Integrated server setup has a randomised suffix on the end
|
||||||
integratedServerStartup = ModAPI.hooks._rippedMethodKeys.filter(key => {return key.startsWith(integratedServerStartup); })[0];
|
integratedServerStartup = ModAPI.hooks._rippedMethodKeys.filter(key => { return key.startsWith(integratedServerStartup); })[0];
|
||||||
const integratedServerStartupMethod = ModAPI.hooks.methods[integratedServerStartup];
|
const integratedServerStartupMethod = ModAPI.hooks.methods[integratedServerStartup];
|
||||||
ModAPI.hooks.methods[integratedServerStartup] = function (worker, bootstrap) {
|
ModAPI.hooks.methods[integratedServerStartup] = function (worker, bootstrap) {
|
||||||
var x = integratedServerStartupMethod.apply(this, [worker, bootstrap + ";" + globalThis.modapi_postinit + ";" + ModAPI.dedicatedServer._data.join(";")]);
|
var x = integratedServerStartupMethod.apply(this, [worker, bootstrap + ";" + globalThis.modapi_postinit + ";" + ModAPI.dedicatedServer._data.join(";")]);
|
||||||
return x;
|
return x;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ModAPI.events.newEvent("sendchatmessage");
|
||||||
|
const sendChatMessageMethodName = ModAPI.util.getMethodFromPackage("net.minecraft.client.entity.EntityPlayerSP", "sendChatMessage");
|
||||||
|
const sendChatMessage = ModAPI.hooks.methods[sendChatMessageMethodName];
|
||||||
|
ModAPI.hooks.methods[sendChatMessageMethodName] = function ($this, $message) {
|
||||||
|
var data = {
|
||||||
|
preventDefault: false,
|
||||||
|
message: ModAPI.util.jclStrToJsStr($message)
|
||||||
|
}
|
||||||
|
ModAPI.events.callEvent("sendchatmessage", data);
|
||||||
|
if (data.preventDefault) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return sendChatMessage.apply(this, [$this, ModAPI.util.str(data.message) || $message]);
|
||||||
|
}
|
||||||
})();`;
|
})();`;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
40
postinit.js
40
postinit.js
@ -39,6 +39,7 @@
|
|||||||
ModAPI.version = "v2.0";
|
ModAPI.version = "v2.0";
|
||||||
ModAPI.flavour = "injector";
|
ModAPI.flavour = "injector";
|
||||||
ModAPI.credits = ["ZXMushroom63", "radmanplays", "OtterCodes101", "TheIdiotPlays"];
|
ModAPI.credits = ["ZXMushroom63", "radmanplays", "OtterCodes101", "TheIdiotPlays"];
|
||||||
|
ModAPI.hooks.regenerateClassMap = function () {
|
||||||
ModAPI.hooks._rippedConstructorKeys = Object.keys(ModAPI.hooks._rippedConstructors);
|
ModAPI.hooks._rippedConstructorKeys = Object.keys(ModAPI.hooks._rippedConstructors);
|
||||||
ModAPI.hooks._rippedMethodKeys = Object.keys(ModAPI.hooks._rippedMethodTypeMap);
|
ModAPI.hooks._rippedMethodKeys = Object.keys(ModAPI.hooks._rippedMethodTypeMap);
|
||||||
ModAPI.hooks._rippedData.forEach(block => {
|
ModAPI.hooks._rippedData.forEach(block => {
|
||||||
@ -89,7 +90,7 @@
|
|||||||
if (ModAPI.hooks._rippedMethodTypeMap[method] === "static") {
|
if (ModAPI.hooks._rippedMethodTypeMap[method] === "static") {
|
||||||
targetMethodMap = ModAPI.hooks._classMap[classId].staticMethods;
|
targetMethodMap = ModAPI.hooks._classMap[classId].staticMethods;
|
||||||
}
|
}
|
||||||
targetMethodMap[method] = {
|
targetMethodMap[method.replace(compiledName + "_", "")] = {
|
||||||
method: ModAPI.hooks.methods[method],
|
method: ModAPI.hooks.methods[method],
|
||||||
proxiedMethod: function (...args) {
|
proxiedMethod: function (...args) {
|
||||||
return ModAPI.hooks.methods[method].apply(this, args);
|
return ModAPI.hooks.methods[method].apply(this, args);
|
||||||
@ -101,6 +102,8 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
ModAPI.hooks.regenerateClassMap();
|
||||||
var reloadDeprecationWarnings = 0;
|
var reloadDeprecationWarnings = 0;
|
||||||
const TeaVM_to_BaseData_ProxyConf = {
|
const TeaVM_to_BaseData_ProxyConf = {
|
||||||
get(target, prop, receiver) {
|
get(target, prop, receiver) {
|
||||||
@ -140,7 +143,7 @@
|
|||||||
return outputValue;
|
return outputValue;
|
||||||
},
|
},
|
||||||
set(object, prop, value) {
|
set(object, prop, value) {
|
||||||
object[prop]=value;
|
object[prop] = value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,6 +256,7 @@
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
ModAPI.events.newEvent("update");
|
ModAPI.events.newEvent("update");
|
||||||
|
|
||||||
ModAPI.require = function (module) {
|
ModAPI.require = function (module) {
|
||||||
ModAPI.required.add(module);
|
ModAPI.required.add(module);
|
||||||
};
|
};
|
||||||
@ -279,13 +283,26 @@
|
|||||||
return uint16Array;
|
return uint16Array;
|
||||||
}
|
}
|
||||||
|
|
||||||
var stringDefaultConstructor = ModAPI.hooks._classMap["java.lang.String"].constructors.filter(x => {return x.length === 0})[0];
|
var stringDefaultConstructor = ModAPI.hooks._classMap["java.lang.String"].constructors.filter(x => { return x.length === 0 })[0];
|
||||||
ModAPI.util.string = ModAPI.util.str = function (string) {
|
ModAPI.util.string = ModAPI.util.str = function (string) {
|
||||||
var jclString = stringDefaultConstructor();
|
var jclString = stringDefaultConstructor();
|
||||||
jclString.$characters.data = ModAPI.util.stringToUint16Array(string);
|
jclString.$characters.data = ModAPI.util.stringToUint16Array(string);
|
||||||
return jclString;
|
return jclString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModAPI.util.setStringContent = function (jclString) {
|
||||||
|
jclString.$characters.data = ModAPI.util.stringToUint16Array(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModAPI.util.jclStrToJsStr = function (jclString) {
|
||||||
|
var uint16Array = jclString.$characters.data;
|
||||||
|
let str = '';
|
||||||
|
for (let i = 0; i < uint16Array.length; i++) {
|
||||||
|
str += String.fromCharCode(uint16Array[i]);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
ModAPI.displayToChat = function (param) {
|
ModAPI.displayToChat = function (param) {
|
||||||
var v = typeof param === "object" ? param.msg : (param + "");
|
var v = typeof param === "object" ? param.msg : (param + "");
|
||||||
v ||= "";
|
v ||= "";
|
||||||
@ -312,10 +329,25 @@
|
|||||||
|
|
||||||
var integratedServerStartup = ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer", "loadIntegratedServerSourceInline");
|
var integratedServerStartup = ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer", "loadIntegratedServerSourceInline");
|
||||||
//Integrated server setup has a randomised suffix on the end
|
//Integrated server setup has a randomised suffix on the end
|
||||||
integratedServerStartup = ModAPI.hooks._rippedMethodKeys.filter(key => {return key.startsWith(integratedServerStartup); })[0];
|
integratedServerStartup = ModAPI.hooks._rippedMethodKeys.filter(key => { return key.startsWith(integratedServerStartup); })[0];
|
||||||
const integratedServerStartupMethod = ModAPI.hooks.methods[integratedServerStartup];
|
const integratedServerStartupMethod = ModAPI.hooks.methods[integratedServerStartup];
|
||||||
ModAPI.hooks.methods[integratedServerStartup] = function (worker, bootstrap) {
|
ModAPI.hooks.methods[integratedServerStartup] = function (worker, bootstrap) {
|
||||||
var x = integratedServerStartupMethod.apply(this, [worker, bootstrap + ";" + globalThis.modapi_postinit + ";" + ModAPI.dedicatedServer._data.join(";")]);
|
var x = integratedServerStartupMethod.apply(this, [worker, bootstrap + ";" + globalThis.modapi_postinit + ";" + ModAPI.dedicatedServer._data.join(";")]);
|
||||||
return x;
|
return x;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ModAPI.events.newEvent("sendchatmessage");
|
||||||
|
const sendChatMessageMethodName = ModAPI.util.getMethodFromPackage("net.minecraft.client.entity.EntityPlayerSP", "sendChatMessage");
|
||||||
|
const sendChatMessage = ModAPI.hooks.methods[sendChatMessageMethodName];
|
||||||
|
ModAPI.hooks.methods[sendChatMessageMethodName] = function ($this, $message) {
|
||||||
|
var data = {
|
||||||
|
preventDefault: false,
|
||||||
|
message: ModAPI.util.jclStrToJsStr($message)
|
||||||
|
}
|
||||||
|
ModAPI.events.callEvent("sendchatmessage", data);
|
||||||
|
if (data.preventDefault) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return sendChatMessage.apply(this, [$this, ModAPI.util.str(data.message) || $message]);
|
||||||
|
}
|
||||||
})();
|
})();
|
Loading…
x
Reference in New Issue
Block a user