mirror of
https://github.com/eaglerforge/EaglerForgeInjector
synced 2025-07-26 23:39:25 -09:00
commit
403d41d6d9
@ -42,8 +42,10 @@ Events broadcast data for use in mods.
|
|||||||
- `frame`:
|
- `frame`:
|
||||||
- Called just when a frame is rendered on the client.
|
- Called just when a frame is rendered on the client.
|
||||||
- Event object is blank.
|
- Event object is blank.
|
||||||
|
- `render`:
|
||||||
|
- Called when 3D is rendered.
|
||||||
|
- Event object is has one property:
|
||||||
|
- `partialTicks`: number representing the fraction of ticks passed at this frame.
|
||||||
### Server Side Events
|
### Server Side Events
|
||||||
Can only be used in the context of the dedicated server. More: [DedicatedServerDocumentation](dedicatedserver.md)
|
Can only be used in the context of the dedicated server. More: [DedicatedServerDocumentation](dedicatedserver.md)
|
||||||
- `serverstart`:
|
- `serverstart`:
|
||||||
|
@ -65,13 +65,16 @@ The global object has the following properties:
|
|||||||
- Once the dedicated server worker has started, it is unuseable.
|
- Once the dedicated server worker has started, it is unuseable.
|
||||||
- More: [DedicatedServerDocumentation](dedicatedserver.md)
|
- More: [DedicatedServerDocumentation](dedicatedserver.md)
|
||||||
- `ModAPI.meta`
|
- `ModAPI.meta`
|
||||||
- This object is used to register metadata for mods such as their title, credits, icon and description.
|
- This module is used to register metadata for mods such as their title, credits, icon and description.
|
||||||
- More: [MetaDocumentation](meta.md)
|
- More: [MetaDocumentation](meta.md)
|
||||||
- `ModAPI.array`
|
- `ModAPI.array`
|
||||||
- This object is used to interact and create arrays easily.
|
- This module is used to interact and create arrays easily.
|
||||||
- More: [ArrayDocumentation](array.md)
|
- More: [ArrayDocumentation](array.md)
|
||||||
|
- `ModAPI.keygen`
|
||||||
|
- This module is used to get IDs for registering blocks and items without hardcoding an ID.
|
||||||
|
- More: [KeygenDocumentation](keygen.md)
|
||||||
- `ModAPI.resolution`
|
- `ModAPI.resolution`
|
||||||
- This object is used to query information about GUI dimensions, to make drawing to the screen easier, generated when the `frame` event is fired.
|
- This module is used to query information about GUI dimensions, to make drawing to the screen easier, generated when the `frame` event is fired.
|
||||||
- Deprecated alias (please do not use): `ModAPI.ScaledResolution`
|
- Deprecated alias (please do not use): `ModAPI.ScaledResolution`
|
||||||
- More: [ArrayDocumentation](array.md)
|
- More: [ArrayDocumentation](array.md)
|
||||||
- `ModAPI.version: String`
|
- `ModAPI.version: String`
|
||||||
|
8
docs/apidoc/keygen.md
Normal file
8
docs/apidoc/keygen.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
## ModAPI.keygen
|
||||||
|
ModAPI.keygen contains the API for getting item and block IDs from a string. It looks at the registries for items and blocks to derive the IDs, so IDs will not be automatically reserved until a block/item is actually registered. Ideally, you'd want to call a keygen method just before registering your block.
|
||||||
|
|
||||||
|
Methods:
|
||||||
|
- `ModAPI.keygen.item(itemId: String) : number`
|
||||||
|
- Example usage is: `var id = ModAPI.keygen.item("my_example_item");`
|
||||||
|
- `ModAPI.keygen.block(blockId: String) : number`
|
||||||
|
- Example usage is: `var id = ModAPI.keygen.block("my_example_block");`
|
@ -1,10 +1,38 @@
|
|||||||
## Mod tutorials with ModAPI
|
## Mod tutorials with ModAPI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Beginner
|
||||||
|
|
||||||
Prerequisites:
|
Prerequisites:
|
||||||
- Basic knowledge of JavaScript
|
- Basic knowledge of JavaScript
|
||||||
- A good code editor (recommended: https://vscode.dev)
|
- A good code editor (recommended: https://vscode.dev)
|
||||||
|
|
||||||
### Beginner
|
Tutorials:
|
||||||
- [Step Hack](step.md)
|
- [Step Hack](step.md)
|
||||||
- [Spider Hack](spider.md)
|
- [Spider Hack](spider.md)
|
||||||
- [VClip Exploit](comingsoon)
|
- [VClip Exploit](comingsoon)
|
||||||
|
|
||||||
|
### Intermediate
|
||||||
|
Prerequisites:
|
||||||
|
- Basic knowledge of JavaScript
|
||||||
|
- A good code editor (recommended: https://vscode.dev)
|
||||||
|
- A copy of the eaglercraft workspace (optional, get it at: https://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8-workspace)
|
||||||
|
|
||||||
|
Tutorials:
|
||||||
|
- [Disable All Particles](comingsoon)
|
||||||
|
- [/hat mod](comingsoon)
|
||||||
|
- [/spawnxp command](comingsoon)
|
||||||
|
- [Slippery Mod](comingsoon)
|
||||||
|
|
||||||
|
### Advanced
|
||||||
|
Prerequisites:
|
||||||
|
- Basic knowledge of JavaScript
|
||||||
|
- A good code editor (recommended: https://vscode.dev)
|
||||||
|
- A copy of the eaglercraft workspace (get it at: https://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8-workspace)
|
||||||
|
- Your EaglerForgeInjector processed.html opened in an editor (optional)
|
||||||
|
|
||||||
|
Tutorials:
|
||||||
|
- [Custom Blocks](comingsoon)
|
||||||
|
- [Custom Items](comingsoon)
|
||||||
|
- [Timescale Command](comingsoon)
|
@ -188,13 +188,22 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
const objectStore = transaction.objectStore("filesystem");
|
const objectStore = transaction.objectStore("filesystem");
|
||||||
var object = (await promisifyIDBRequest(objectStore.get(["resourcepacks/manifest.json"])))?.data;
|
var object = (await promisifyIDBRequest(objectStore.get(["resourcepacks/manifest.json"])))?.data;
|
||||||
var resourcePackList = object ? JSON.parse(dec.decode(object)) : { resourcePacks: [] };
|
var resourcePackList = object ? JSON.parse(dec.decode(object)) : { resourcePacks: [] };
|
||||||
if (!resourcePackList.resourcePacks.find(x => x.name === "AsyncSinkLib")) {
|
var pack = {
|
||||||
resourcePackList.resourcePacks.push({
|
domains: ["minecraft", "eagler"],
|
||||||
domains: ["minecraft"],
|
|
||||||
folder: "AsyncSinkLib",
|
folder: "AsyncSinkLib",
|
||||||
name: "AsyncSinkLib",
|
name: "AsyncSinkLib",
|
||||||
timestamp: Date.now()
|
timestamp: Date.now()
|
||||||
});
|
};
|
||||||
|
if (!Array.isArray(resourcePackList.resourcePacks)) {
|
||||||
|
resourcePackList.resourcePacks = [];
|
||||||
|
}
|
||||||
|
if (resourcePackList.resourcePacks.find(x => x.name === "AsyncSinkLib")) {
|
||||||
|
var idx = resourcePackList.resourcePacks.indexOf(resourcePackList.resourcePacks.find(x => x.name === "AsyncSinkLib"));
|
||||||
|
resourcePackList.resourcePacks[idx] = pack;
|
||||||
|
} else {
|
||||||
|
resourcePackList.resourcePacks.push(pack);
|
||||||
|
}
|
||||||
|
|
||||||
const writeableTransaction = db.transaction(["filesystem"], "readwrite");
|
const writeableTransaction = db.transaction(["filesystem"], "readwrite");
|
||||||
const writeableObjectStore = writeableTransaction.objectStore("filesystem");
|
const writeableObjectStore = writeableTransaction.objectStore("filesystem");
|
||||||
await promisifyIDBRequest(writeableObjectStore.put({
|
await promisifyIDBRequest(writeableObjectStore.put({
|
||||||
@ -221,7 +230,6 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
|
|
||||||
await promisifyIDBRequest(imageObjectStore.put(icon));
|
await promisifyIDBRequest(imageObjectStore.put(icon));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Client side reminders to enable the AsyncSink Resource Pack
|
// Client side reminders to enable the AsyncSink Resource Pack
|
||||||
var asyncSinkInstallStatus = false;
|
var asyncSinkInstallStatus = false;
|
||||||
@ -235,7 +243,7 @@ ModAPI.meta.credits("By ZXMushroom63");
|
|||||||
var resourcePackEntries = ModAPI.mc.mcResourcePackRepository.getRepositoryEntries().getCorrective();
|
var resourcePackEntries = ModAPI.mc.mcResourcePackRepository.getRepositoryEntries().getCorrective();
|
||||||
var array = resourcePackEntries.array || [resourcePackEntries.element];
|
var array = resourcePackEntries.array || [resourcePackEntries.element];
|
||||||
asyncSinkInstallStatus = array.find(x => ModAPI.util.ustr(x.reResourcePack.resourcePackFile.getRef()) === "AsyncSinkLib") ? true : false;
|
asyncSinkInstallStatus = array.find(x => ModAPI.util.ustr(x.reResourcePack.resourcePackFile.getRef()) === "AsyncSinkLib") ? true : false;
|
||||||
assureAsyncSinkResources();
|
//assureAsyncSinkResources();
|
||||||
if (asyncSinkInstallStatus) {
|
if (asyncSinkInstallStatus) {
|
||||||
installMessage.style.display = "none";
|
installMessage.style.display = "none";
|
||||||
} else {
|
} else {
|
||||||
|
56
examplemods/arbitrary_model.js
Normal file
56
examplemods/arbitrary_model.js
Normal file
File diff suppressed because one or more lines are too long
@ -44,7 +44,7 @@ function registerSteveClientSide() {
|
|||||||
ModAPI.util.str("steve")
|
ModAPI.util.str("steve")
|
||||||
);
|
);
|
||||||
blockClass.staticMethods.registerBlock0.method(
|
blockClass.staticMethods.registerBlock0.method(
|
||||||
198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
ModAPI.keygen.block("steve"),
|
||||||
ModAPI.util.str("steve"),
|
ModAPI.util.str("steve"),
|
||||||
block_of_steve
|
block_of_steve
|
||||||
);
|
);
|
||||||
@ -112,7 +112,7 @@ function registerSteveServerSide() {
|
|||||||
ModAPI.util.str("steve")
|
ModAPI.util.str("steve")
|
||||||
);
|
);
|
||||||
blockClass.staticMethods.registerBlock0.method(
|
blockClass.staticMethods.registerBlock0.method(
|
||||||
198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
ModAPI.keygen.block("steve"), //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
||||||
ModAPI.util.str("steve"),
|
ModAPI.util.str("steve"),
|
||||||
block_of_steve
|
block_of_steve
|
||||||
);
|
);
|
||||||
|
@ -26,7 +26,7 @@ function registerSteveClientSide() {
|
|||||||
ModAPI.util.str("steve")
|
ModAPI.util.str("steve")
|
||||||
).$setCreativeTab(creativeBlockTab);
|
).$setCreativeTab(creativeBlockTab);
|
||||||
blockClass.staticMethods.registerBlock0.method(
|
blockClass.staticMethods.registerBlock0.method(
|
||||||
198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
ModAPI.keygen.block("steve"), //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
||||||
ModAPI.util.str("steve"),
|
ModAPI.util.str("steve"),
|
||||||
block_of_steve
|
block_of_steve
|
||||||
);
|
);
|
||||||
@ -97,7 +97,7 @@ function registerSteveServerSide() {
|
|||||||
ModAPI.util.str("steve")
|
ModAPI.util.str("steve")
|
||||||
).$setCreativeTab(creativeBlockTab);
|
).$setCreativeTab(creativeBlockTab);
|
||||||
blockClass.staticMethods.registerBlock0.method(
|
blockClass.staticMethods.registerBlock0.method(
|
||||||
198, //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
ModAPI.keygen.block("steve"), //use blockid 198. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
||||||
ModAPI.util.str("steve"),
|
ModAPI.util.str("steve"),
|
||||||
block_of_steve
|
block_of_steve
|
||||||
);
|
);
|
||||||
|
42
examplemods/jenny_skin.js
Normal file
42
examplemods/jenny_skin.js
Normal file
File diff suppressed because one or more lines are too long
36
examplemods/microphone.js
Normal file
36
examplemods/microphone.js
Normal file
File diff suppressed because one or more lines are too long
83
examplemods/render_arbitrary_highpolyskin.js
Normal file
83
examplemods/render_arbitrary_highpolyskin.js
Normal file
File diff suppressed because one or more lines are too long
@ -56,7 +56,7 @@
|
|||||||
ModAPI.util.str("unluckiness")
|
ModAPI.util.str("unluckiness")
|
||||||
);
|
);
|
||||||
blockClass.staticMethods.registerBlock0.method(
|
blockClass.staticMethods.registerBlock0.method(
|
||||||
544, //use blockid 544. MAKE SURE TO CHANGE IF YOU ARE MAKING A MOD USING THIS, MAXIMUM BLOCK ID IS 4095.
|
ModAPI.keygen.block("unluckiness"),
|
||||||
ModAPI.util.str("unluckiness"),
|
ModAPI.util.str("unluckiness"),
|
||||||
block_of_unluckiness
|
block_of_unluckiness
|
||||||
);
|
);
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
var example_item = (new nmi_ItemExample()).$setUnlocalizedName(
|
var example_item = (new nmi_ItemExample()).$setUnlocalizedName(
|
||||||
ModAPI.util.str("exampleitem")
|
ModAPI.util.str("exampleitem")
|
||||||
);
|
);
|
||||||
itemClass.staticMethods.registerItem0.method(432, ModAPI.util.str("exampleitem"), example_item);
|
itemClass.staticMethods.registerItem0.method(ModAPI.keygen.item("exampleitem"), ModAPI.util.str("exampleitem"), example_item);
|
||||||
ModAPI.items["exampleitem"] = example_item;
|
ModAPI.items["exampleitem"] = example_item;
|
||||||
|
|
||||||
return example_item;
|
return example_item;
|
||||||
|
35
postinit.js
35
postinit.js
@ -22,7 +22,7 @@ globalThis.modapi_postinit = "(" + (() => {
|
|||||||
ModAPI.meta._versionMap = {};
|
ModAPI.meta._versionMap = {};
|
||||||
ModAPI.array = {};
|
ModAPI.array = {};
|
||||||
|
|
||||||
ModAPI.version = "v2.2";
|
ModAPI.version = "v2.3";
|
||||||
ModAPI.flavour = "injector";
|
ModAPI.flavour = "injector";
|
||||||
ModAPI.GNU = "terry pratchett";
|
ModAPI.GNU = "terry pratchett";
|
||||||
ModAPI.credits = ["ZXMushroom63", "radmanplays", "Murturtle", "OtterCodes101", "TheIdiotPlays", "OeildeLynx31", "Stpv22"];
|
ModAPI.credits = ["ZXMushroom63", "radmanplays", "Murturtle", "OtterCodes101", "TheIdiotPlays", "OeildeLynx31", "Stpv22"];
|
||||||
@ -952,4 +952,37 @@ globalThis.modapi_postinit = "(" + (() => {
|
|||||||
ModAPI.events.newEvent(eventName, "patcher");
|
ModAPI.events.newEvent(eventName, "patcher");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function qhash(txt, arr) {
|
||||||
|
var interval = 4095 - arr.length;
|
||||||
|
var x = 1;
|
||||||
|
for (let i = 0; i < txt.length; i++) {
|
||||||
|
x += txt.charCodeAt(i);
|
||||||
|
x = x << txt.charCodeAt(i);
|
||||||
|
x = Math.abs(x);
|
||||||
|
x = x % interval;
|
||||||
|
}
|
||||||
|
var hash = x + arr.length;
|
||||||
|
while (arr.includes(hash)) {
|
||||||
|
hash = (hash + 1) % (interval + arr.length);
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ModAPI.keygen = {};
|
||||||
|
var registryNamespaceMethod = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.util.RegistryNamespaced", "register")];
|
||||||
|
ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.util.RegistryNamespaced", "register")] = function (...args) {
|
||||||
|
args[0].$modapi_specmap ||= new Map();
|
||||||
|
args[0].$modapi_specmap.set(args[2], args[1]);
|
||||||
|
return registryNamespaceMethod.apply(this, args);
|
||||||
|
}
|
||||||
|
ModAPI.keygen.item = function (item) {
|
||||||
|
var values = [...ModAPI.reflect.getClassById("net.minecraft.item.Item").staticVariables.itemRegistry.$modapi_specmap.values()];
|
||||||
|
return qhash(item, values);
|
||||||
|
}
|
||||||
|
ModAPI.keygen.block = function (block) {
|
||||||
|
var values = [...ModAPI.reflect.getClassById("net.minecraft.block.Block").staticVariables.blockRegistry.$modapi_specmap.values()];
|
||||||
|
return qhash(block, values);
|
||||||
|
}
|
||||||
}).toString() + ")();";
|
}).toString() + ")();";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user