mirror of
https://github.com/eaglerforge/EaglerForgeInjector
synced 2025-07-24 14:41:18 -09:00
commit
557766347c
12
core/core.js
12
core/core.js
@ -14,7 +14,7 @@ var modapi_preinit = `globalThis.ModAPI ||= {};
|
|||||||
`;
|
`;
|
||||||
var freezeCallstack = `if(ModAPI.hooks.freezeCallstack){return false};`;
|
var freezeCallstack = `if(ModAPI.hooks.freezeCallstack){return false};`;
|
||||||
const EFIConfig = {
|
const EFIConfig = {
|
||||||
ModAPIVersion: "v2.7.6", //also change in package.json
|
ModAPIVersion: "v2.7.7", //also change in package.json
|
||||||
doEaglerforge: true,
|
doEaglerforge: true,
|
||||||
verbose: false,
|
verbose: false,
|
||||||
doServerExtras: false,
|
doServerExtras: false,
|
||||||
@ -368,8 +368,12 @@ var main;(function(){`
|
|||||||
if (EFIConfig.doMinify) {
|
if (EFIConfig.doMinify) {
|
||||||
_status("Shrinking file...");
|
_status("Shrinking file...");
|
||||||
await wait(50);
|
await wait(50);
|
||||||
|
if (globalThis.process) {
|
||||||
patchedFile = await minify(patchedFile, parser, EFIConfig);
|
let _minify = require("./minify").minify;
|
||||||
|
patchedFile = await _minify(patchedFile, parser, EFIConfig);
|
||||||
|
} else {
|
||||||
|
patchedFile = await minify(patchedFile, parser, EFIConfig);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -436,4 +440,4 @@ if (globalThis.process) {
|
|||||||
patchClient: patchClient,
|
patchClient: patchClient,
|
||||||
conf: EFIConfig
|
conf: EFIConfig
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ const modapi_guikit = "(" + (() => {
|
|||||||
height: 100vh;
|
height: 100vh;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 9999999999;
|
z-index: 127;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
|
@ -1172,7 +1172,7 @@ const modapi_postinit = "(" + (() => {
|
|||||||
ModAPI.util.getBlockById = easyStaticMethod("net.minecraft.block.Block", "getBlockById", false);
|
ModAPI.util.getBlockById = easyStaticMethod("net.minecraft.block.Block", "getBlockById", false);
|
||||||
ModAPI.util.getBlockFromItem = easyStaticMethod("net.minecraft.block.Block", "getBlockFromItem", true);
|
ModAPI.util.getBlockFromItem = easyStaticMethod("net.minecraft.block.Block", "getBlockFromItem", true);
|
||||||
ModAPI.util.getIdFromBlock = easyStaticMethod("net.minecraft.block.Block", "getIdFromBlock", true);
|
ModAPI.util.getIdFromBlock = easyStaticMethod("net.minecraft.block.Block", "getIdFromBlock", true);
|
||||||
|
|
||||||
function qhash(txt, arr, interval) {
|
function qhash(txt, arr, interval) {
|
||||||
// var interval = 4095; //used to be 4095 - arr.length, but that increases incompatibility based on load order and other circumstances
|
// var interval = 4095; //used to be 4095 - arr.length, but that increases incompatibility based on load order and other circumstances
|
||||||
if (arr.length >= interval) {
|
if (arr.length >= interval) {
|
||||||
@ -1210,8 +1210,18 @@ const modapi_postinit = "(" + (() => {
|
|||||||
return qhash(block, values, 4095);
|
return qhash(block, values, 4095);
|
||||||
}
|
}
|
||||||
ModAPI.keygen.entity = function (entity) {
|
ModAPI.keygen.entity = function (entity) {
|
||||||
var hashMap = ModAPI.util.wrap(ModAPI.reflect.getClassById("net.minecraft.entity.EntityList").staticVariables.idToClassMapping).getCorrective();
|
var values = [];
|
||||||
var values = hashMap.keys.getRef().data.filter(x => hashMap.get(x));
|
if (ModAPI.is_1_12) {
|
||||||
|
var arrayList = ModAPI.util.wrap(ModAPI.reflect.getClassById("net.minecraft.entity.EntityList").staticVariables.field_191311_g).getCorrective().array;
|
||||||
|
arrayList.forEach((x, i) => {
|
||||||
|
if (x) {
|
||||||
|
values.push(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var hashMap = ModAPI.util.wrap(ModAPI.reflect.getClassById("net.minecraft.entity.EntityList").staticVariables.idToClassMapping).getCorrective();
|
||||||
|
values = hashMap.keys.getRef().data.filter(x => hashMap.get(x));
|
||||||
|
}
|
||||||
return qhash(entity, values, 127);
|
return qhash(entity, values, 127);
|
||||||
}
|
}
|
||||||
}).toString() + ")();";
|
}).toString() + ")();";
|
||||||
|
@ -7,7 +7,15 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
const ResourceLocation = ModAPI.reflect.getClassByName("ResourceLocation").constructors.find(x => x.length === 1);
|
const ResourceLocation = ModAPI.reflect.getClassByName("ResourceLocation").constructors.find(x => x.length === 1);
|
||||||
//AsyncSink is a plugin to debug and override asynchronous methods in EaglercraftX
|
//AsyncSink is a plugin to debug and override asynchronous methods in EaglercraftX
|
||||||
async function runtimeComponent() {
|
async function runtimeComponent() {
|
||||||
const booleanResult = (b) => ModAPI.hooks.methods.nlevit_BooleanResult__new(b * 1);
|
let booleanResult;
|
||||||
|
|
||||||
|
if (ModAPI.is_1_12) {
|
||||||
|
const _boolRes = ModAPI.reflect.getClassById("net.lax1dude.eaglercraft.internal.teavm.BooleanResult").constructors[0];
|
||||||
|
booleanResult = (b) => _boolRes(b*1);
|
||||||
|
} else {
|
||||||
|
booleanResult = (b) => ModAPI.hooks.methods.nlevit_BooleanResult__new(b * 1);
|
||||||
|
}
|
||||||
|
|
||||||
const wrap = ModAPI.hooks.methods.otji_JSWrapper_wrap;
|
const wrap = ModAPI.hooks.methods.otji_JSWrapper_wrap;
|
||||||
const unwrap = ModAPI.hooks.methods.otji_JSWrapper_unwrap;
|
const unwrap = ModAPI.hooks.methods.otji_JSWrapper_unwrap;
|
||||||
function getAsyncHandlerName(name) {
|
function getAsyncHandlerName(name) {
|
||||||
@ -16,9 +24,9 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
}
|
}
|
||||||
var fs_debugging = false;
|
var fs_debugging = false;
|
||||||
const encoder = new TextEncoder('utf-8');
|
const encoder = new TextEncoder('utf-8');
|
||||||
var filesystemPlatform = ModAPI.hooks.methods.nlevit_IndexedDBFilesystem$AsyncHandlers_readWholeFile ? true : false;
|
var filesystemPlatform = (ModAPI.hooks.methods.nlevit_IndexedDBFilesystem$AsyncHandlers_readWholeFile || ModAPI.hooks.methods.nleit_IndexedDBFilesystem$AsyncHandlers_readWholeFile) ? true : false;
|
||||||
if (!filesystemPlatform) {
|
if (!filesystemPlatform) {
|
||||||
console.error("AsyncSink requires EaglercraftX u37 or greater to work! Attempting to run anyway...");
|
console.warn("AsyncSink requires EaglercraftX u37 or greater to work! Attempting to run anyway...");
|
||||||
}
|
}
|
||||||
const AsyncSink = {};
|
const AsyncSink = {};
|
||||||
const originalSuspend = ModAPI.hooks.TeaVMThread.prototype.suspend;
|
const originalSuspend = ModAPI.hooks.TeaVMThread.prototype.suspend;
|
||||||
@ -209,7 +217,7 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
async function assureAsyncSinkResources() {
|
async function assureAsyncSinkResources() {
|
||||||
const dec = new TextDecoder("utf-8");
|
const dec = new TextDecoder("utf-8");
|
||||||
const enc = new TextEncoder("utf-8");
|
const enc = new TextEncoder("utf-8");
|
||||||
var resourcePackKey = (await indexedDB.databases()).find(x => x?.name?.endsWith("_resourcePacks")).name;
|
var resourcePackKey = ModAPI.is_1_12 ? "_net_lax1dude_eaglercraft_v1_8_internal_PlatformFilesystem_1_12_2_" :(await indexedDB.databases()).find(x => x?.name?.endsWith("_resourcePacks")).name;
|
||||||
const dbRequest = indexedDB.open(resourcePackKey);
|
const dbRequest = indexedDB.open(resourcePackKey);
|
||||||
const db = await promisifyIDBRequest(dbRequest);
|
const db = await promisifyIDBRequest(dbRequest);
|
||||||
const transaction = db.transaction(["filesystem"], "readonly");
|
const transaction = db.transaction(["filesystem"], "readonly");
|
||||||
@ -242,7 +250,7 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
path: "resourcepacks/AsyncSinkLib/pack.mcmeta",
|
path: "resourcepacks/AsyncSinkLib/pack.mcmeta",
|
||||||
data: enc.encode(JSON.stringify({
|
data: enc.encode(JSON.stringify({
|
||||||
"pack": {
|
"pack": {
|
||||||
"pack_format": 1,
|
"pack_format": ModAPI.is_1_12 ? 3 : 1,
|
||||||
"description": "AsyncSink Library Resources"
|
"description": "AsyncSink Library Resources"
|
||||||
}
|
}
|
||||||
})).buffer
|
})).buffer
|
||||||
@ -307,7 +315,7 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var snd = ModAPI.mc.mcSoundHandler;
|
var snd = ModAPI.mc.mcSoundHandler;
|
||||||
var registry = snd.sndRegistry.soundRegistry;
|
var registry = (snd.sndRegistry || snd.soundRegistry).getCorrective().soundRegistry;
|
||||||
console.log("[AsyncSink] Populating sound registry hash map with " + AsyncSink.Audio.Objects.length + " sound effects.");
|
console.log("[AsyncSink] Populating sound registry hash map with " + AsyncSink.Audio.Objects.length + " sound effects.");
|
||||||
AsyncSink.Audio.Objects.forEach(pair => {
|
AsyncSink.Audio.Objects.forEach(pair => {
|
||||||
registry.put(pair[0], pair[1]);
|
registry.put(pair[0], pair[1]);
|
||||||
@ -318,18 +326,19 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
// values = SoundEntry[]
|
// values = SoundEntry[]
|
||||||
// category: AsyncSink.Audio.Category.*
|
// category: AsyncSink.Audio.Category.*
|
||||||
// SoundEntry = {path: String, pitch: 1, volume: 1, streaming: false}
|
// SoundEntry = {path: String, pitch: 1, volume: 1, streaming: false}
|
||||||
const SoundPoolEntry = ModAPI.reflect.getClassByName("SoundPoolEntry").constructors.find(x => x.length === 4);
|
|
||||||
const EaglercraftRandom = ModAPI.reflect.getClassByName("EaglercraftRandom").constructors.find(x=>x.length===0);
|
const EaglercraftRandom = ModAPI.reflect.getClassByName("EaglercraftRandom").constructors.find(x=>x.length===0);
|
||||||
const SoundEventAccessorClass = ModAPI.reflect.getClassByName("SoundEventAccessor").class;
|
|
||||||
function makeSoundEventAccessor(soundpoolentry, weight) {
|
function makeSoundEventAccessor(soundpoolentry, weight) {
|
||||||
|
const SoundEventAccessorClass = ModAPI.reflect.getClassByName("SoundEventAccessor").class;
|
||||||
var object = new SoundEventAccessorClass;
|
var object = new SoundEventAccessorClass;
|
||||||
var wrapped = ModAPI.util.wrap(object).getCorrective();
|
var wrapped = ModAPI.util.wrap(object).getCorrective();
|
||||||
wrapped.entry = soundpoolentry;
|
wrapped.entry = soundpoolentry;
|
||||||
wrapped.weight = weight;
|
wrapped.weight = weight;
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
const SoundEventAccessorCompositeClass = ModAPI.reflect.getClassByName("SoundEventAccessorComposite").class;
|
|
||||||
function makeSoundEventAccessorComposite(rKey, pitch, volume, category) {
|
function makeSoundEventAccessorComposite(rKey, pitch, volume, category) {
|
||||||
|
const SoundEventAccessorCompositeClass = ModAPI.reflect.getClassByName("SoundEventAccessorComposite").class;
|
||||||
var object = new SoundEventAccessorCompositeClass;
|
var object = new SoundEventAccessorCompositeClass;
|
||||||
var wrapped = ModAPI.util.wrap(object).getCorrective();
|
var wrapped = ModAPI.util.wrap(object).getCorrective();
|
||||||
wrapped.soundLocation = rKey;
|
wrapped.soundLocation = rKey;
|
||||||
@ -340,26 +349,64 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
wrapped.rnd = EaglercraftRandom();
|
wrapped.rnd = EaglercraftRandom();
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
AsyncSink.Audio.register = function addSfx(key, category, values) {
|
function makeSoundEventAccessor112(rKey) {
|
||||||
if (!category) {
|
const SoundEventAccessorClass = ModAPI.reflect.getClassByName("SoundEventAccessor").class;
|
||||||
throw new Error("[AsyncSink] Invalid audio category provided: "+category);
|
var object = new SoundEventAccessorClass;
|
||||||
}
|
var wrapped = ModAPI.util.wrap(object).getCorrective();
|
||||||
var snd = ModAPI.mc.mcSoundHandler;
|
wrapped.location = rKey;
|
||||||
var registry = snd.sndRegistry.soundRegistry;
|
wrapped.subtitle = null;
|
||||||
var rKey = ResourceLocation(ModAPI.util.str(key));
|
wrapped.accessorList = ModAPI.hooks.methods.cgcc_Lists_newArrayList0();
|
||||||
var soundPool = values.map(se => {
|
wrapped.rnd = EaglercraftRandom();
|
||||||
var path = ResourceLocation(ModAPI.util.str(se.path));
|
return object;
|
||||||
return SoundPoolEntry(path, se.pitch, se.volume, 1 * se.streaming);
|
|
||||||
}).map(spe => {
|
|
||||||
return makeSoundEventAccessor(spe, 1); // 1 = weight
|
|
||||||
});
|
|
||||||
var compositeSound = makeSoundEventAccessorComposite(rKey, 1, 1, category);
|
|
||||||
var compositeSoundWrapped = ModAPI.util.wrap(compositeSound);
|
|
||||||
soundPool.forEach(sound => {
|
|
||||||
compositeSoundWrapped.soundPool.add(sound);
|
|
||||||
});
|
|
||||||
AsyncSink.Audio.Objects.push([rKey, compositeSound]);
|
|
||||||
registry.put(rKey, compositeSound);
|
|
||||||
values.map(x=>"resourcepacks/AsyncSinkLib/assets/minecraft/" + x.path + ".mcmeta").forEach(x=>AsyncSink.setFile(x, new ArrayBuffer(0)));
|
|
||||||
}
|
}
|
||||||
})();
|
if (ModAPI.is_1_12) {
|
||||||
|
const soundType = ModAPI.reflect.getClassById("net.minecraft.client.audio.Sound$Type").staticVariables.FILE;
|
||||||
|
const mkSound = ModAPI.reflect.getClassById("net.minecraft.client.audio.Sound").constructors[0];
|
||||||
|
|
||||||
|
AsyncSink.Audio.register = function addSfx(key, category, values) {
|
||||||
|
if (!category) {
|
||||||
|
throw new Error("[AsyncSink] Invalid audio category provided: "+category);
|
||||||
|
}
|
||||||
|
var snd = ModAPI.mc.mcSoundHandler.getCorrective();
|
||||||
|
var registry = snd.soundRegistry.soundRegistry;
|
||||||
|
var rKey = ResourceLocation(ModAPI.util.str(key));
|
||||||
|
var soundPool = values.map(se => {
|
||||||
|
return mkSound(ModAPI.util.str(se.path), se.volume, se.pitch, 1, soundType, 1 * se.streaming);
|
||||||
|
});
|
||||||
|
var eventAccessor = makeSoundEventAccessor112(rKey);
|
||||||
|
var eventAccessorWrapped = ModAPI.util.wrap(eventAccessor);
|
||||||
|
soundPool.forEach(sound => {
|
||||||
|
eventAccessorWrapped.accessorList.add(sound);
|
||||||
|
});
|
||||||
|
AsyncSink.Audio.Objects.push([rKey, eventAccessor]);
|
||||||
|
registry.put(rKey, eventAccessor);
|
||||||
|
values.map(x=>"resourcepacks/AsyncSinkLib/assets/minecraft/" + x.path + ".mcmeta").forEach(x=>AsyncSink.setFile(x, new ArrayBuffer(0)));
|
||||||
|
return soundPool;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const SoundPoolEntry = ModAPI.reflect.getClassByName("SoundPoolEntry").constructors.find(x => x.length === 4);
|
||||||
|
AsyncSink.Audio.register = function addSfx(key, category, values) {
|
||||||
|
if (!category) {
|
||||||
|
throw new Error("[AsyncSink] Invalid audio category provided: "+category);
|
||||||
|
}
|
||||||
|
var snd = ModAPI.mc.mcSoundHandler;
|
||||||
|
var registry = snd.sndRegistry.soundRegistry;
|
||||||
|
var rKey = ResourceLocation(ModAPI.util.str(key));
|
||||||
|
var soundPool = values.map(se => {
|
||||||
|
var path = ResourceLocation(ModAPI.util.str(se.path));
|
||||||
|
return SoundPoolEntry(path, se.pitch, se.volume, 1 * se.streaming);
|
||||||
|
}).map(spe => {
|
||||||
|
return makeSoundEventAccessor(spe, 1); // 1 = weight
|
||||||
|
});
|
||||||
|
var compositeSound = makeSoundEventAccessorComposite(rKey, 1, 1, category);
|
||||||
|
var compositeSoundWrapped = ModAPI.util.wrap(compositeSound);
|
||||||
|
soundPool.forEach(sound => {
|
||||||
|
compositeSoundWrapped.soundPool.add(sound);
|
||||||
|
});
|
||||||
|
AsyncSink.Audio.Objects.push([rKey, compositeSound]);
|
||||||
|
registry.put(rKey, compositeSound);
|
||||||
|
values.map(x=>"resourcepacks/AsyncSinkLib/assets/minecraft/" + x.path + ".mcmeta").forEach(x=>AsyncSink.setFile(x, new ArrayBuffer(0)));
|
||||||
|
return soundPool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
@ -113,7 +113,11 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/Eaglercraft-Archive/unminified-eaglercraft-builds/releases/latest"
|
href="https://github.com/Eaglercraft-Archive/unminified-eaglercraft-builds/releases/latest"
|
||||||
>https://github.com/Eaglercraft-Archive/unminified-eaglercraft-builds/releases/latest</a
|
>1.8: https://github.com/Eaglercraft-Archive/unminified-eaglercraft-builds/releases/latest</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="https://github.com/Eaglercraft-Archive/unminified-eaglercraft-builds-1.12/releases/latest"
|
||||||
|
>1.12: https://github.com/Eaglercraft-Archive/unminified-eaglercraft-builds-1.12/releases/latest</a
|
||||||
>
|
>
|
||||||
</details>
|
</details>
|
||||||
<details>
|
<details>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "eaglerforgeinjector",
|
"name": "eaglerforgeinjector",
|
||||||
"version": "2.7.6",
|
"version": "2.7.7",
|
||||||
"description": "Advanced modding API injector for unminified, unobfuscated, unsigned eaglercraft builds.",
|
"description": "Advanced modding API injector for unminified, unobfuscated, unsigned eaglercraft builds.",
|
||||||
"main": "node.js",
|
"main": "node.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user