From a519eb7afa730127d2fd4aa329684e6181826a0b Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Mon, 9 Dec 2024 16:59:45 +0800 Subject: [PATCH] Fix gun bug, add more static variables and add clinit methods --- examplemods/guns.js | 7 ++++++- injector.js | 27 ++++++++++----------------- postinit.js | 19 ------------------- 3 files changed, 16 insertions(+), 37 deletions(-) diff --git a/examplemods/guns.js b/examplemods/guns.js index 8cb5e99..de22609 100644 --- a/examplemods/guns.js +++ b/examplemods/guns.js @@ -6,6 +6,7 @@ ModAPI.meta.description("Requires AsyncSink."); function PistolItem() { + var DamageSourceClass = ModAPI.reflect.getClassByName("DamageSource"); var creativeMiscTab = ModAPI.reflect.getClassById("net.minecraft.creativetab.CreativeTabs").staticVariables.tabMisc; var itemClass = ModAPI.reflect.getClassById("net.minecraft.item.Item"); var itemSuper = ModAPI.reflect.getSuper(itemClass, (x) => x.length === 1); @@ -53,7 +54,11 @@ } ModAPI.reflect.prototypeStack(itemClass, nmi_ItemPistol); nmi_ItemPistol.prototype.$onItemRightClick = function ($itemstack, $world, $player) { - var cactus = ModAPI.reflect.getClassByName("DamageSource").staticVariables.cactus; + DamageSourceClass.staticMethods.$callClinit.method(); + //Noticed that the gun only worked after an entity in the world takes damage XD + //TeaVM is very optimised. Using $callClinit tells it to hurry up pretty much lol + + var cactus = DamageSourceClassstaticVariables.cactus; var world = ModAPI.util.wrap($world); var entityplayer = ModAPI.util.wrap($player); var shotentity = entityRayCast(entityplayer, world, 12.0) diff --git a/injector.js b/injector.js index 2a9c590..bb3d8a5 100644 --- a/injector.js +++ b/injector.js @@ -18,24 +18,17 @@ function entriesToStaticVariableProxy(entries, prefix) { var getComponents = ""; entries.forEach((entry) => { getComponents += ` - case \`${entry.name}\`: - return ${entry.variable}; - break;`; + case \`${entry.name}\`: return ${entry.variable};`; }); getComponents += ` - default: - return Reflect.get(a,b,c);` + default: return Reflect.get(a,b,c);` var setComponents = ""; entries.forEach((entry) => { setComponents += ` - case \`${entry.name}\`: - ${entry.variable} = c; - break;`; + case \`${entry.name}\`: ${entry.variable} = c; break;`; }); - setComponents += ` - default: - a[b]=c;` + setComponents += ` default: a[b]=c;` /*/ ModAPI.hooks._rippedStaticIndexer[\`${prefix.replace( @@ -196,8 +189,7 @@ var main;(function(){` (match) => { if ( match.includes("__init_") || - match.includes("__clinit_") || - match.includes("_$callClinit") + match.includes("__clinit_") ) { return match; } @@ -212,13 +204,14 @@ var main;(function(){` ModAPI.hooks.methods[\`${fullName}\`]=` + match.replace(fullName + "(", "(") ); - return match; } ); var staticVariables = [ - ...patchedFile.matchAll(/var \S+?_\S+?_\S+? = null;/gm), + ...patchedFile.matchAll(/var \S+?_\S+?_\S+? = /gm), ].flatMap((x) => { return x[0]; + }).filter(x => { + return (!x.includes("$_clinit_$")) && (!x.includes("$lambda$")) }); patchedFile = patchedFile.replaceAll( /var \S+?_\S+? = \$rt_classWithoutFields\(\S*?\);/gm, @@ -232,7 +225,7 @@ var main;(function(){` if (entry.startsWith(prefix)) { var variableName = entry .replace("var ", "") - .replace(" = null;", ""); + .replace(" = ", ""); var segments = variableName.split("_"); segments.splice(0, 2); var name = segments.join("_"); @@ -262,7 +255,7 @@ var main;(function(){` if (entry.startsWith(prefix)) { var variableName = entry .replace("var ", "") - .replace(" = null;", ""); + .replace(" = ", ""); var segments = variableName.split("_"); segments.splice(0, 2); var name = segments.join("_"); diff --git a/postinit.js b/postinit.js index c7c8479..857026d 100644 --- a/postinit.js +++ b/postinit.js @@ -890,14 +890,12 @@ globalThis.modapi_postinit = "(" + (() => { } ModAPI.events.newEvent("bootstrap", "server"); - ModAPI.events.newEvent("prebootstrap", "server"); const bootstrapClass = ModAPI.reflect.getClassById("net.minecraft.init.Bootstrap"); const originalBootstrap = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.init.Bootstrap", "register")]; ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.init.Bootstrap", "register")] = function (...args) { if (bootstrapClass.staticVariables.alreadyRegistered) { return; } - ModAPI.events.callEvent("prebootstrap", {}); var x = originalBootstrap.apply(this, args); ModAPI.util.bootstrap(); console.log("[ModAPI] Hooked into bootstrap. .blocks, .items, .materials and .enchantments are now accessible."); @@ -905,23 +903,6 @@ globalThis.modapi_postinit = "(" + (() => { return x; } - - ModAPI.events.newEvent("registeritems", "server"); - const originalItemRegister = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.item.Item", "registerItems")]; - ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.item.Item", "registerItems")] = function (...args) { - var x = originalItemRegister.apply(this, args); - ModAPI.events.callEvent("registeritems", {}); - return x; - } - - ModAPI.events.newEvent("registerblocks", "server"); - const originalBlockRegister = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.block.Block", "registerBlocks")]; - ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.block.Block")] = function (...args) { - var x = originalBlockRegister.apply(this, args); - ModAPI.events.callEvent("registerblocks", {}); - return x; - } - const originalOptionsInit = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.gui.GuiOptions", "initGui")]; ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.gui.GuiOptions", "initGui")] = function (...args) { var x = originalOptionsInit.apply(this, args);