Fix gun bug, add more static variables and add clinit methods

This commit is contained in:
ZXMushroom63 2024-12-09 16:59:45 +08:00
parent 8c1ae93040
commit a519eb7afa
3 changed files with 16 additions and 37 deletions

View File

@ -6,6 +6,7 @@
ModAPI.meta.description("Requires AsyncSink."); ModAPI.meta.description("Requires AsyncSink.");
function PistolItem() { function PistolItem() {
var DamageSourceClass = ModAPI.reflect.getClassByName("DamageSource");
var creativeMiscTab = ModAPI.reflect.getClassById("net.minecraft.creativetab.CreativeTabs").staticVariables.tabMisc; var creativeMiscTab = ModAPI.reflect.getClassById("net.minecraft.creativetab.CreativeTabs").staticVariables.tabMisc;
var itemClass = ModAPI.reflect.getClassById("net.minecraft.item.Item"); var itemClass = ModAPI.reflect.getClassById("net.minecraft.item.Item");
var itemSuper = ModAPI.reflect.getSuper(itemClass, (x) => x.length === 1); var itemSuper = ModAPI.reflect.getSuper(itemClass, (x) => x.length === 1);
@ -53,7 +54,11 @@
} }
ModAPI.reflect.prototypeStack(itemClass, nmi_ItemPistol); ModAPI.reflect.prototypeStack(itemClass, nmi_ItemPistol);
nmi_ItemPistol.prototype.$onItemRightClick = function ($itemstack, $world, $player) { 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 world = ModAPI.util.wrap($world);
var entityplayer = ModAPI.util.wrap($player); var entityplayer = ModAPI.util.wrap($player);
var shotentity = entityRayCast(entityplayer, world, 12.0) var shotentity = entityRayCast(entityplayer, world, 12.0)

View File

@ -18,24 +18,17 @@ function entriesToStaticVariableProxy(entries, prefix) {
var getComponents = ""; var getComponents = "";
entries.forEach((entry) => { entries.forEach((entry) => {
getComponents += ` getComponents += `
case \`${entry.name}\`: case \`${entry.name}\`: return ${entry.variable};`;
return ${entry.variable};
break;`;
}); });
getComponents += ` getComponents += `
default: default: return Reflect.get(a,b,c);`
return Reflect.get(a,b,c);`
var setComponents = ""; var setComponents = "";
entries.forEach((entry) => { entries.forEach((entry) => {
setComponents += ` setComponents += `
case \`${entry.name}\`: case \`${entry.name}\`: ${entry.variable} = c; break;`;
${entry.variable} = c;
break;`;
}); });
setComponents += ` setComponents += ` default: a[b]=c;`
default:
a[b]=c;`
/*/ /*/
ModAPI.hooks._rippedStaticIndexer[\`${prefix.replace( ModAPI.hooks._rippedStaticIndexer[\`${prefix.replace(
@ -196,8 +189,7 @@ var main;(function(){`
(match) => { (match) => {
if ( if (
match.includes("__init_") || match.includes("__init_") ||
match.includes("__clinit_") || match.includes("__clinit_")
match.includes("_$callClinit")
) { ) {
return match; return match;
} }
@ -212,13 +204,14 @@ var main;(function(){`
ModAPI.hooks.methods[\`${fullName}\`]=` + ModAPI.hooks.methods[\`${fullName}\`]=` +
match.replace(fullName + "(", "(") match.replace(fullName + "(", "(")
); );
return match;
} }
); );
var staticVariables = [ var staticVariables = [
...patchedFile.matchAll(/var \S+?_\S+?_\S+? = null;/gm), ...patchedFile.matchAll(/var \S+?_\S+?_\S+? = /gm),
].flatMap((x) => { ].flatMap((x) => {
return x[0]; return x[0];
}).filter(x => {
return (!x.includes("$_clinit_$")) && (!x.includes("$lambda$"))
}); });
patchedFile = patchedFile.replaceAll( patchedFile = patchedFile.replaceAll(
/var \S+?_\S+? = \$rt_classWithoutFields\(\S*?\);/gm, /var \S+?_\S+? = \$rt_classWithoutFields\(\S*?\);/gm,
@ -232,7 +225,7 @@ var main;(function(){`
if (entry.startsWith(prefix)) { if (entry.startsWith(prefix)) {
var variableName = entry var variableName = entry
.replace("var ", "") .replace("var ", "")
.replace(" = null;", ""); .replace(" = ", "");
var segments = variableName.split("_"); var segments = variableName.split("_");
segments.splice(0, 2); segments.splice(0, 2);
var name = segments.join("_"); var name = segments.join("_");
@ -262,7 +255,7 @@ var main;(function(){`
if (entry.startsWith(prefix)) { if (entry.startsWith(prefix)) {
var variableName = entry var variableName = entry
.replace("var ", "") .replace("var ", "")
.replace(" = null;", ""); .replace(" = ", "");
var segments = variableName.split("_"); var segments = variableName.split("_");
segments.splice(0, 2); segments.splice(0, 2);
var name = segments.join("_"); var name = segments.join("_");

View File

@ -890,14 +890,12 @@ globalThis.modapi_postinit = "(" + (() => {
} }
ModAPI.events.newEvent("bootstrap", "server"); ModAPI.events.newEvent("bootstrap", "server");
ModAPI.events.newEvent("prebootstrap", "server");
const bootstrapClass = ModAPI.reflect.getClassById("net.minecraft.init.Bootstrap"); const bootstrapClass = ModAPI.reflect.getClassById("net.minecraft.init.Bootstrap");
const originalBootstrap = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.init.Bootstrap", "register")]; 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) { ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.init.Bootstrap", "register")] = function (...args) {
if (bootstrapClass.staticVariables.alreadyRegistered) { if (bootstrapClass.staticVariables.alreadyRegistered) {
return; return;
} }
ModAPI.events.callEvent("prebootstrap", {});
var x = originalBootstrap.apply(this, args); var x = originalBootstrap.apply(this, args);
ModAPI.util.bootstrap(); ModAPI.util.bootstrap();
console.log("[ModAPI] Hooked into bootstrap. .blocks, .items, .materials and .enchantments are now accessible."); console.log("[ModAPI] Hooked into bootstrap. .blocks, .items, .materials and .enchantments are now accessible.");
@ -905,23 +903,6 @@ globalThis.modapi_postinit = "(" + (() => {
return x; 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")]; 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) { ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.gui.GuiOptions", "initGui")] = function (...args) {
var x = originalOptionsInit.apply(this, args); var x = originalOptionsInit.apply(this, args);