From f20ae021e9ece887b252f7b0c5b9ae15845acbce Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Tue, 5 Nov 2024 18:28:36 +0800 Subject: [PATCH 1/9] add warnings --- examplemods/block_of_steve_advanced.js | 4 ++-- examplemods/block_of_steve_simple.js | 4 ++-- examplemods/unlucky_blocks.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examplemods/block_of_steve_advanced.js b/examplemods/block_of_steve_advanced.js index 24bc3d0..8917ed4 100644 --- a/examplemods/block_of_steve_advanced.js +++ b/examplemods/block_of_steve_advanced.js @@ -44,7 +44,7 @@ function registerSteveClientSide() { ModAPI.util.str("steve") ); blockClass.staticMethods.registerBlock0.method( - 198, //use blockid 198 + 198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095. ModAPI.util.str("steve"), block_of_steve ); @@ -112,7 +112,7 @@ function registerSteveServerSide() { ModAPI.util.str("steve") ); blockClass.staticMethods.registerBlock0.method( - 198, + 198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095. ModAPI.util.str("steve"), block_of_steve ); diff --git a/examplemods/block_of_steve_simple.js b/examplemods/block_of_steve_simple.js index 46b6e25..3e9c40a 100644 --- a/examplemods/block_of_steve_simple.js +++ b/examplemods/block_of_steve_simple.js @@ -26,7 +26,7 @@ function registerSteveClientSide() { ModAPI.util.str("steve") ).$setCreativeTab(creativeBlockTab); blockClass.staticMethods.registerBlock0.method( - 198, //use blockid 198 + 198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095. ModAPI.util.str("steve"), block_of_steve ); @@ -98,7 +98,7 @@ function registerSteveServerSide() { ModAPI.util.str("steve") ).$setCreativeTab(creativeBlockTab); blockClass.staticMethods.registerBlock0.method( - 198, + 198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095. ModAPI.util.str("steve"), block_of_steve ); diff --git a/examplemods/unlucky_blocks.js b/examplemods/unlucky_blocks.js index 7943d92..bb7b949 100644 --- a/examplemods/unlucky_blocks.js +++ b/examplemods/unlucky_blocks.js @@ -56,7 +56,7 @@ ModAPI.util.str("unluckiness") ); blockClass.staticMethods.registerBlock0.method( - 544, + 544, //use blockid 544. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095. ModAPI.util.str("unluckiness"), block_of_unluckiness ); From ef39278f70505d5999b1bf14a799a40216e828c4 Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Tue, 5 Nov 2024 18:29:03 +0800 Subject: [PATCH 2/9] remove dead roadmap link --- index.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/index.html b/index.html index 4eb6424..edaf423 100644 --- a/index.html +++ b/index.html @@ -126,12 +126,6 @@ have a naming convention similar to EaglercraftX_1.8_Offline_en_US.html) -
- Roadmap? - roadmap. -
How does this tool work? The injector works by analysing your uploaded file for patterns that From b4660e025083a1fd38245eb80d5a0628063f06b9 Mon Sep 17 00:00:00 2001 From: radmanplays <95340057+radmanplays@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:17:58 +0330 Subject: [PATCH 3/9] Create diamondBlockCustomCraft.js --- examplemods/diamondBlockCustomCraft.js | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 examplemods/diamondBlockCustomCraft.js diff --git a/examplemods/diamondBlockCustomCraft.js b/examplemods/diamondBlockCustomCraft.js new file mode 100644 index 0000000..6c3412f --- /dev/null +++ b/examplemods/diamondBlockCustomCraft.js @@ -0,0 +1,51 @@ +(function AddDiamondRecipe() { + ModAPI.meta.title("DiamondCraftingRecipeMod"); + ModAPI.meta.description("Adds a crafting recipe to create diamond blocks from dirt."); + + async function addDiamondRecipe() { + await new Promise((res,rej)=>{var x = setInterval(()=>{if(ModAPI.blocks){clearInterval(x);res();}}, 100);}) + var ObjectClass = ModAPI.reflect.getClassById("java.lang.Object").class; + function ToChar(char) { + return ModAPI.reflect.getClassById("java.lang.Character").staticMethods.valueOf.method(char[0].charCodeAt(0)); + } + + // Define the recipe legend to map characters to items + var recipeLegend = { + "D": { + type: "block", + id: "dirt" // Using dirt blocks + } + }; + + // Define the crafting grid pattern for the recipe + var recipePattern = [ + "DDD", + "DDD", + "DDD" + ]; + + // Convert the recipe pattern and legend into the required format + var recipeInternal = []; + Object.keys(recipeLegend).forEach((key) => { + recipeInternal.push(ToChar(key)); + var ingredient = ModAPI.blocks[recipeLegend[key].id].getRef(); + recipeInternal.push(ingredient); + }); + + var recipeContents = recipePattern.flatMap(row => ModAPI.util.str(row)); + var recipe = ModAPI.util.makeArray(ObjectClass, recipeContents.concat(recipeInternal)); + + // Define the output item as diamond_block + var resultItem = ModAPI.reflect.getClassById("net.minecraft.item.ItemStack").constructors[1](ModAPI.blocks["diamond_block"].getRef(), 1); + + + + // Register the recipe with CraftingManager + var craftingManager = ModAPI.reflect.getClassById("net.minecraft.item.crafting.CraftingManager").staticMethods.getInstance.method(); + ModAPI.hooks.methods.nmic_CraftingManager_addRecipe(craftingManager, resultItem, recipe); + } + + ModAPI.dedicatedServer.appendCode(addDiamondRecipe); + + addDiamondRecipe(); +})(); From ee0809067daa991a463b0e62490d428e59121ac5 Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Thu, 7 Nov 2024 15:57:43 +0800 Subject: [PATCH 4/9] various bug fixes --- examplemods/block_of_steve_advanced.js | 1 - examplemods/block_of_steve_simple.js | 2 -- examplemods/lib.customitems.js | 1 + examplemods/no_particles.js | 4 ++++ 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 examplemods/no_particles.js diff --git a/examplemods/block_of_steve_advanced.js b/examplemods/block_of_steve_advanced.js index 8917ed4..4002ef9 100644 --- a/examplemods/block_of_steve_advanced.js +++ b/examplemods/block_of_steve_advanced.js @@ -49,7 +49,6 @@ function registerSteveClientSide() { block_of_steve ); itemClass.staticMethods.registerItemBlock0.method(block_of_steve); - ModAPI.mc.renderItem.registerBlock(block_of_steve, ModAPI.util.str("steve")); ModAPI.addEventListener("lib:asyncsink", async () => { ModAPI.addEventListener("custom:asyncsink_reloaded", ()=>{ ModAPI.mc.renderItem.registerBlock(block_of_steve, ModAPI.util.str("steve")); diff --git a/examplemods/block_of_steve_simple.js b/examplemods/block_of_steve_simple.js index 3e9c40a..3186a33 100644 --- a/examplemods/block_of_steve_simple.js +++ b/examplemods/block_of_steve_simple.js @@ -31,8 +31,6 @@ function registerSteveClientSide() { block_of_steve ); itemClass.staticMethods.registerItemBlock0.method(block_of_steve); - ModAPI.mc.renderItem.registerBlock(block_of_steve, ModAPI.util.str("steve")); - ModAPI.addEventListener("lib:asyncsink", async () => { ModAPI.addEventListener("custom:asyncsink_reloaded", ()=>{ diff --git a/examplemods/lib.customitems.js b/examplemods/lib.customitems.js index d2b36e3..b7f29e5 100644 --- a/examplemods/lib.customitems.js +++ b/examplemods/lib.customitems.js @@ -5,6 +5,7 @@ ModAPI.meta.icon("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAQdJREFUOE9jZGBg+M9AAWAEGbBl2QmyjPCJsmAgaABbdybc8F+l01EswmsATONXLi4GYSkpBgZ+foY1O3cyuHWuhhuC1QBkjf///QMrFtHWZmD4+BHDEBQDUGzU1ITb8ubqVZyGoBjwsCONQYqXl0FYU5MBpAlsKxRgM+STUwoDhgG66upgZ4IAuiEooRcXx/DpCRuqAU97shg0jYzgfsVpSFwcg5mZGcOedRewGDBhAgPDokUohsBthmoE8U+dOoXdBfHHjoElUQxB03i9oABspnTJNFQXgARB3oAbwsAAdirMRmSNMFdhTQcwQ/BpxGsAzCUwRSCn4gJE5QV8uQxuAFlZEaoJAKrYrAHl38o6AAAAAElFTkSuQmCC"); ModAPI.meta.description("Library to make adding basic custom items easier."); ModAPI.events.newEvent("lib:libcustomitems:loaded"); + globalThis.LCI_ITEMDB ||= {}; function libServerside() { var packetblockchange = ModAPI.reflect.getClassByName("S23PacketBlockChange").constructors.find(x => { return x.length === 2 }); var sendPacket = ModAPI.reflect.getClassByName("NetHandlerPlayServer").methods.sendPacket.method; diff --git a/examplemods/no_particles.js b/examplemods/no_particles.js new file mode 100644 index 0000000..cd202de --- /dev/null +++ b/examplemods/no_particles.js @@ -0,0 +1,4 @@ +ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.particle.EffectRenderer", "renderParticles")] = ()=>{}; +ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.particle.EffectRenderer", "hasParticlesInAlphaLayer")] = ()=>{return 0}; +ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.particle.EffectRenderer", "addEffect")] = ()=>{}; +ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.particle.EffectRenderer", "addBlockDestroyEffects")] = ()=>{}; \ No newline at end of file From aba91b2cbc2296e272e6836952e326a4c60ae071 Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Fri, 8 Nov 2024 16:02:57 +0800 Subject: [PATCH 5/9] LCI fix number 2 --- examplemods/lib.customitems.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examplemods/lib.customitems.js b/examplemods/lib.customitems.js index b7f29e5..582f7c3 100644 --- a/examplemods/lib.customitems.js +++ b/examplemods/lib.customitems.js @@ -5,7 +5,6 @@ ModAPI.meta.icon("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAQdJREFUOE9jZGBg+M9AAWAEGbBl2QmyjPCJsmAgaABbdybc8F+l01EswmsATONXLi4GYSkpBgZ+foY1O3cyuHWuhhuC1QBkjf///QMrFtHWZmD4+BHDEBQDUGzU1ITb8ubqVZyGoBjwsCONQYqXl0FYU5MBpAlsKxRgM+STUwoDhgG66upgZ4IAuiEooRcXx/DpCRuqAU97shg0jYzgfsVpSFwcg5mZGcOedRewGDBhAgPDokUohsBthmoE8U+dOoXdBfHHjoElUQxB03i9oABspnTJNFQXgARB3oAbwsAAdirMRmSNMFdhTQcwQ/BpxGsAzCUwRSCn4gJE5QV8uQxuAFlZEaoJAKrYrAHl38o6AAAAAElFTkSuQmCC"); ModAPI.meta.description("Library to make adding basic custom items easier."); ModAPI.events.newEvent("lib:libcustomitems:loaded"); - globalThis.LCI_ITEMDB ||= {}; function libServerside() { var packetblockchange = ModAPI.reflect.getClassByName("S23PacketBlockChange").constructors.find(x => { return x.length === 2 }); var sendPacket = ModAPI.reflect.getClassByName("NetHandlerPlayServer").methods.sendPacket.method; @@ -16,7 +15,7 @@ globalThis.LCI_ITEMDB ||= {}; globalThis.LibCustomItems = { makeItemStack: function makeItemStack(tag) { - return globalThis.LCI_ITEMBD[tag] || null; + return globalThis.LCI_ITEMDB[tag] || null; } }; var useName = ModAPI.util.getMethodFromPackage("net.minecraft.network.NetHandlerPlayServer", "processPlayerBlockPlacement"); @@ -149,7 +148,7 @@ if (globalThis.LCI_RECIPEEVENTS[data.tag]) { globalThis.LCI_RECIPEEVENTS[data.tag](new Proxy(testItem, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf)); } - globalThis.LCI_ITEMBD[data.tag] = new Proxy(testItem, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf); + globalThis.LCI_ITEMDB[data.tag] = new Proxy(testItem, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf); var craftingManager = ModAPI.reflect.getClassById("net.minecraft.item.crafting.CraftingManager").staticMethods.getInstance.method(); if((data.useRecipe !== false) || (data.useRecipe !== "false")) { @@ -163,7 +162,7 @@ LCI_registerItem(data); } LibCustomItems.makeItemStack = function makeItemStack(tag) { - return globalThis.LCI_ITEMBD[tag] || null; + return globalThis.LCI_ITEMDB[tag] || null; } ModAPI.events.callEvent("lib:libcustomitems:loaded", {}); })(); From ae7e696c5c8d5f4d73bc4112e68ed7190dfff2cb Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Sat, 9 Nov 2024 12:17:22 +0800 Subject: [PATCH 6/9] Useless Item Example Mod --- examplemods/useless_item_example_mod.js | 72 +++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 examplemods/useless_item_example_mod.js diff --git a/examplemods/useless_item_example_mod.js b/examplemods/useless_item_example_mod.js new file mode 100644 index 0000000..ae92683 --- /dev/null +++ b/examplemods/useless_item_example_mod.js @@ -0,0 +1,72 @@ +// This is an example mod on how to register an item. +(()=>{ + const itemTexture = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAKZJREFUOE9j/P//PxMDBIBoEP6HREOl4PLIciA2AyPIgMcM//7KgvWSDJjBBpx9/+YvJzc3Sbq12DhB6sEGsJ19/+YnmQawYhigzc7FcPXnN4KugbqAHWQAy9n3b34T4wJkw6EGYLqAoNVQBWS5ANlwZBfAvUCs/0EGkW0AzBKqGoCSDgh5A80F2KMRpAgfAKUT6kcjsfEPUycmKMQgy8AETkgUZWcAS3CPIf4oSPsAAAAASUVORK5CYII="; + //this texture is really baad, so the item appears 2d in game. + ModAPI.meta.title("Adding items demo."); + ModAPI.meta.version("v1.0"); + ModAPI.meta.icon(itemTexture); + ModAPI.meta.description("Requires AsyncSink."); + + function ExampleItem() { + 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); + var nmi_ItemExample = function nmi_ItemExample() { + itemSuper(this); //Use super function to get block properties on this class. + this.$setCreativeTab(creativeMiscTab); + } + ModAPI.reflect.prototypeStack(itemClass, nmi_ItemExample); + nmi_ItemExample.prototype.$onItemRightClick = function ($itemstack, $world, $player) { //example of how to override a method + return $itemstack; + } + + function internal_reg() { + var example_item = (new nmi_ItemExample()).$setUnlocalizedName( + ModAPI.util.str("exampleitem") + ); + itemClass.staticMethods.registerItem0.method(432, ModAPI.util.str("exampleitem"), example_item); + ModAPI.items["exampleitem"] = example_item; + + return example_item; + } + + if (ModAPI.items) { + return internal_reg(); + } else { + ModAPI.addEventListener("bootstrap", internal_reg); + } + } + + ModAPI.dedicatedServer.appendCode(ExampleItem); + var example_item = ExampleItem(); + + ModAPI.addEventListener("lib:asyncsink", async () => { + ModAPI.addEventListener("custom:asyncsink_reloaded", ()=>{ + ModAPI.mc.renderItem.registerItem(example_item, ModAPI.util.str("exampleitem")); + }); + AsyncSink.L10N.set("item.exampleitem.name", "Example Item"); + AsyncSink.setFile("resourcepacks/AsyncSinkLib/assets/minecraft/models/item/exampleitem.json", JSON.stringify( + { + "parent": "builtin/generated", + "textures": { + "layer0": "items/exampleitem" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } + } + )); + AsyncSink.setFile("resourcepacks/AsyncSinkLib/assets/minecraft/textures/items/exampleitem.png", await (await fetch( + itemTexture + )).arrayBuffer()); + }); +})(); \ No newline at end of file From 0840d6b95db62f6154f43b6e48381abee0caad0f Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Sat, 9 Nov 2024 15:38:04 +0800 Subject: [PATCH 7/9] fix steve register issue --- examplemods/block_of_steve_advanced.js | 3 +++ examplemods/block_of_steve_simple.js | 2 ++ 2 files changed, 5 insertions(+) diff --git a/examplemods/block_of_steve_advanced.js b/examplemods/block_of_steve_advanced.js index 4002ef9..4e860e4 100644 --- a/examplemods/block_of_steve_advanced.js +++ b/examplemods/block_of_steve_advanced.js @@ -87,6 +87,7 @@ function registerSteveClientSide() { "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE0SURBVDhPpdO9S8NAHMbxy3sVfJmMg6h7FRXXkkUUX0addSjo4OAfIDqLIoiLi3+BRRx0EIQOnV0EcVAIWkR0KIFgrcEktX6vcXD0nuE+5Afhnhw5bWy4qylaidOfVQhT0zFKYozjBHVdzi3TwCZvteaS/0fLD8oGf5OzTeyxNUyE3Ln2HmGctpuxKuS3wd76CgPHsrEj142NeojCkHsFry+4c3aJ6g1OtlZp0Ok4DD4i+Y2GIZ+DMMAhtw+fHu8xi3IDM9t5YfMQF71dLHo+ZjsfXbh4WtnH0vYaqp/BcXGGM3D7BxiYTi+el8uYZWm2gM/VB/Tfaqje4GB5iga2Jv+sUuUa5/ITmOXq7gbnC+MY1r9QvcHG9AgN0lRex1u/ilr7ehqWvBNZvMlRbESfqNhAiG/Pb1bHXpMbFgAAAABJRU5ErkJggg==" )).arrayBuffer()); }); + ModAPI.blocks["steve"] = block_of_steve; } function registerSteveServerSide() { function fixupBlockIds() { @@ -117,10 +118,12 @@ function registerSteveServerSide() { ); itemClass.staticMethods.registerItemBlock0.method(block_of_steve); fixupBlockIds(); + ModAPI.blocks["steve"] = block_of_steve; }); } ModAPI.dedicatedServer.appendCode(makeSteveBlock); makeSteveBlock(); registerSteveClientSide(); fixupBlockIds(); + ModAPI.dedicatedServer.appendCode(registerSteveServerSide); \ No newline at end of file diff --git a/examplemods/block_of_steve_simple.js b/examplemods/block_of_steve_simple.js index 3186a33..8814856 100644 --- a/examplemods/block_of_steve_simple.js +++ b/examplemods/block_of_steve_simple.js @@ -70,6 +70,7 @@ function registerSteveClientSide() { "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE0SURBVDhPpdO9S8NAHMbxy3sVfJmMg6h7FRXXkkUUX0addSjo4OAfIDqLIoiLi3+BRRx0EIQOnV0EcVAIWkR0KIFgrcEktX6vcXD0nuE+5Afhnhw5bWy4qylaidOfVQhT0zFKYozjBHVdzi3TwCZvteaS/0fLD8oGf5OzTeyxNUyE3Ln2HmGctpuxKuS3wd76CgPHsrEj142NeojCkHsFry+4c3aJ6g1OtlZp0Ok4DD4i+Y2GIZ+DMMAhtw+fHu8xi3IDM9t5YfMQF71dLHo+ZjsfXbh4WtnH0vYaqp/BcXGGM3D7BxiYTi+el8uYZWm2gM/VB/Tfaqje4GB5iga2Jv+sUuUa5/ITmOXq7gbnC+MY1r9QvcHG9AgN0lRex1u/ilr7ehqWvBNZvMlRbESfqNhAiG/Pb1bHXpMbFgAAAABJRU5ErkJggg==" )).arrayBuffer()); }); + ModAPI.blocks["steve"] = block_of_steve; } function registerSteveServerSide() { function fixupBlockIds() { @@ -102,6 +103,7 @@ function registerSteveServerSide() { ); itemClass.staticMethods.registerItemBlock0.method(block_of_steve); fixupBlockIds(); + ModAPI.blocks["steve"] = block_of_steve; }); } registerSteveClientSide(); From 99835d002aedd477f1fcebf128a0a95c71cbc34c Mon Sep 17 00:00:00 2001 From: radmanplays <95340057+radmanplays@users.noreply.github.com> Date: Sun, 10 Nov 2024 14:35:07 +0330 Subject: [PATCH 8/9] Update Worldedit.js --- examplemods/Worldedit.js | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/examplemods/Worldedit.js b/examplemods/Worldedit.js index 6d9a637..f3f6c13 100644 --- a/examplemods/Worldedit.js +++ b/examplemods/Worldedit.js @@ -180,6 +180,58 @@ ModAPI.addEventListener("lib:libcustomitems:loaded", () => { } event.preventDefault = true; } + // "this command was made by EymenWSMC. comments included" - radmanplays + if (event.command.toLowerCase().startsWith("//replacenear")) { + const args = event.command.split(" ").slice(1); + if (args.length < 3) { + event.sender.addChatMessage(ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText").constructors[0](ModAPI.util.str(prefix + "Usage: //replacenear "))); + event.preventDefault = true; + return; + } + + const radius = parseInt(args[0]); + const targetBlockName = args[1]; + const replacementBlockName = args[2]; + + const targetBlock = ModAPI.blocks[targetBlockName]; + const replacementBlock = ModAPI.blocks[replacementBlockName]; + if (!targetBlock || !replacementBlock) { + event.sender.addChatMessage(ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText").constructors[0](ModAPI.util.str(prefix + "Invalid block names!"))); + event.preventDefault = true; + return; + } + + + //Replacing logic + const targetBlockState = targetBlock.getDefaultState().getRef(); + const replacementBlockState = replacementBlock.getDefaultState().getRef(); + + const playerPos = event.sender.getPosition(); + const xStart = Math.floor(playerPos.x - radius); + const xEnd = Math.floor(playerPos.x + radius); + const yStart = Math.floor(playerPos.y - radius); + const yEnd = Math.floor(playerPos.y + radius); + const zStart = Math.floor(playerPos.z - radius); + const zEnd = Math.floor(playerPos.z + radius); + + //Replace ity with radoius + for (let x = xStart; x <= xEnd; x++) { + for (let y = yStart; y <= yEnd; y++) { + for (let z = zStart; z <= zEnd; z++) { + const blockPos = blockPosConstructor(x, y, z); + const currentBlock = event.sender.getServerForPlayer().getBlockState(blockPos); + + if (currentBlock.equals(targetBlockState)) { + event.sender.getServerForPlayer().setBlockState(blockPos, replacementBlockState, 3); + } + } + } + } + + //Send messages shit + event.sender.addChatMessage(ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText").constructors[0](ModAPI.util.str(prefix + `Replaced ${targetBlockName} with ${replacementBlockName} within radius ${radius}`))); + event.preventDefault = true; + } }); }); })(); From 21a98ddf0b7b4a5e9f00e9b8b331c0d32aa72e63 Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Sat, 16 Nov 2024 19:22:41 +0800 Subject: [PATCH 9/9] Better self compile doc --- docs/compiling_client.md | 53 ++++++++++++++++++++++++++++++++++++++++ index.html | 9 +------ 2 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 docs/compiling_client.md diff --git a/docs/compiling_client.md b/docs/compiling_client.md new file mode 100644 index 0000000..157d65e --- /dev/null +++ b/docs/compiling_client.md @@ -0,0 +1,53 @@ +# Compiling Eaglercraft with support for EFI +In recent updates of eaglercraft, compiling for EaglerForgeInjector has become a great deal more complicated. To enable reflection and disable obfuscation, follow these steps once you have an EaglercraftX workspace set up: + + +1. In any files named `build.gradle`, set the `obfuscate` property to `false`. +2. In any files named `build.gradle`, find any code that looks like this: + ```javascript + tasks.named("generateJavaScript") { + doLast { + + // NOTE: This step may break at any time, and is not required for 99% of browsers + + def phile = file(folder + "/" + name) + def dest = phile.getText("UTF-8") + def i = dest.substring(0, dest.indexOf("=\$rt_globals.Symbol('jsoClass');")).lastIndexOf("let ") + dest = dest.substring(0, i) + "var" + dest.substring(i + 3) + def j = dest.indexOf("function(\$rt_globals,\$rt_exports){") + dest = dest.substring(0, j + 34) + "\n" + file(folder + "/ES6ShimScript.txt").getText("UTF-8") + "\n" + dest.substring(j + 34) + phile.write(dest, "UTF-8") + } + } + ``` + and delete it. +3. Inside of the `src/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/` folder, create a new file called `ForceReflection.java`, with these contents: + ```java + package net.lax1dude.eaglercraft.v1_8.internal.teavm; + + public class ForceReflection { + public static Object myObject; + + public static Object forceInit(Class iClass) { + myObject = new ReflectiveClass(); + try { + myObject = iClass.newInstance(); + } catch (Exception e) { + // TODO: handle exception + } + return myObject; + } + + public static class ReflectiveClass { + } + } + ``` +4. In the same folder, edit `MainClass.java` edit the start of the `main(String[] args)` method to look like this: + ```java + public static void main(String[] args) { + ForceReflection.forceInit(ForceReflection.class); + if(args.length == 1) { + //... rest of method + ``` +5. Finally, build an offline download by using `CompileJS.bat`/`CompileJS.sh` and then `MakeOfflineDownload.bat`/`MakeOfflineDownload.sh`. +6. You can then upload the `EaglercraftX_1.8_Offline_en_US.html` into EaglerForgeInjector. \ No newline at end of file diff --git a/index.html b/index.html index edaf423..31d159d 100644 --- a/index.html +++ b/index.html @@ -117,14 +117,7 @@ How do I compile my own unobfuscated unsigned Eaglercraft build? - Once you have a local EaglercraftX workspace setup, in - build.gradle, set the obfuscate property to - false. Then, run CompileJS.bat (or .sh if on - a unix-based os), and then run MakeOfflineDownload.bat. - The outputted offline download will have a much larger file size than - other offline builds. This is the file you should select. (it should - have a naming convention similar to - EaglercraftX_1.8_Offline_en_US.html) + tutorial here
How does this tool work?