Skip to content

Commit

Permalink
materials, enchantments, and start of api doc
Browse files Browse the repository at this point in the history
  • Loading branch information
ZXMushroom63 committed Sep 1, 2024
1 parent 99d3846 commit 5034c12
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 6 deletions.
1 change: 1 addition & 0 deletions docs/apidoc/dedicatedserver.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## ModAPI.dedicatedServer
5 changes: 5 additions & 0 deletions docs/apidoc/hooks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## ModAPI.hooks
- To replace a function with another, you can use:
- `ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("com.package.abc.MyClass", "myMethod")] = function () {}`
- To intercept inputs to a function, you can us
- `ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("com.package.abc.MyClass", "myMethod")] = function () {}`
55 changes: 55 additions & 0 deletions docs/apidoc/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# EaglerForge ModAPI Documentation
The EaglerForge ModAPI is housed in a global JavaScript object stored on `globalThis`, called `ModAPI` or `PluginAPI`. (both are identical)

The global object has the following properties:
- `ModAPI.player: EntityPlayerSP`
- Only accessible after `ModAPI.require("player")` is called, this is the local player entity. It is regenerated every time the `update` event is called.
- `ModAPI.network: NetHandlerPlayClient`
- Only accessible after `ModAPI.require("network")` is called, this is the client's networking handler. It is regenerated every time the `update` event is called.
- `ModAPI.settings: GameSettings`
- This is the Minecraft client's settings. It is generated upon init.
- `ModAPI.items: Map<String, Item>`
- This is a key-value dictionary of all of the items in the game. It is generated upon init from the static variables of the `Items` class.
- For example, to access the item class for `acacia_door`, you can use `ModAPI.items["acacia_door"]`
- `ModAPI.blocks: Map<String, Block>`
- This is a key-value dictionary of all of the blocks in the game. It is generated upon init from the static variables of the `Blocks` class.
- For example, to access the block class for `bedrock`, you can use `ModAPI.blocks["bedrock"]`
- `ModAPI.materials: Map<String, Material>`
- This is a key-value dictionary of all of the blocks in the game. It is generated upon init from the static variables of the `Material` class.
- For example, to access the material class for `portal`, you can use `ModAPI.materials["portal"]`
- `ModAPI.enchantments: Map<String, Enchantment|Object>`
- This is a key-value dictionary of all of the enchantments in the game. It is generated upon init from the static variables of the `Enchantment` class.
- For example, to access the enchantment class for `knockback`, you can use `ModAPI.enchantments["knockback"]`
- As the enchantment class has other static variables, `Object.keys` will also return non-enchantment keys such as `enchantmentsBookList`.
- `ModAPI.minecraft: Minecraft`
- This is the minecraft instance for the client, generated upon init.
- It can also be accessed using `ModAPI.mc`
- `ModAPI.mcinstance: Raw<Minecraft>`
- This is the raw minecraft instance for the client, generated upon init.
- It can also be accessed using `ModAPI.javaClient`
- It can also be accessed using `ModAPI.minecraft.getRef()`
- `ModAPI.server: MinecraftServer`
- This is the dedicated minecraft server in the service worker, generated when the `serverstart`.
- It can only be accessed in the dedicated server's context. (See `ModAPI.dedicatedServer`)
- It can also be accessed using `ModAPI.serverInstance`
- `ModAPI.rawServer: MinecraftServer`
- This is the dedicated minecraft server in the service worker, generated when the `serverstart`.
- It can only be accessed in the dedicated server's context. (See `ModAPI.dedicatedServer`)
- It can also be accessed using `ModAPI.server.getRef()`
- `ModAPI.hooks`
- This is the internal hooking map for ModAPI and can be used to patch, intercept, or rewrite internal functions, and more.
- More: [HooksDocumentation](hooks.md)
- `ModAPI.util`
- This contains utilities for using `ModAPI.hooks`, `ModAPI.reflect`, and more.
- More: [UtilDocumentation](utils.md)
- `ModAPI.reflect`
- This is a wrapper around `ModAPI.hooks`, `ModAPI.hooks._teavm` and `ModAPI.hooks._classMap` that makes accessing and using internal java classes in mods much easier.
- More: [ReflectDocumentation](reflect.md)
- `ModAPI.dedicatedServer`
- This object is used to push code for use in the dedicated server.
- Once the dedicated server worker has started, it is unuseable.
- More: [DedicatedServerDocumentation](dedicatedserver.md)
- `ModAPI.version: String`
- The version of ModAPI.
- `ModAPI.flavour: String`
- The flavour of ModAPI. Hardcoded to be `"injector"`.
1 change: 1 addition & 0 deletions docs/apidoc/reflect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## ModAPI.reflect
1 change: 1 addition & 0 deletions docs/apidoc/utils.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## ModAPI.utils
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
EaglerForge Injector is a tool that uses regular expressions to attatch itself to internal code inside of raw EaglercraftX offline downloads (sounds easy, isn't at all).

### Documentation fragments
[Injector Arcitecture](architecture.md)
[Injector Architecture](architecture.md)

[TeaVM quirks](quirks.md)

Expand Down
7 changes: 6 additions & 1 deletion examplemods/no_block_particles.js
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
ModAPI.hooks.methods.nmcp_EffectRenderer_addBlockDestroyEffects = ()=>{}
ModAPI.hooks.methods[
ModAPI.util.getMethodFromPackage(
"net.minecraft.client.particles.EffectRenderer",
"addBlockDestroyEffects"
)
] = () => {}
22 changes: 19 additions & 3 deletions postinit.injector.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ globalThis.modapi_postinit = `(() => {
globalThis.PluginAPI ||= ModAPI;
ModAPI.mcinstance ||= {};
ModAPI.javaClient ||= {};
ModAPI.reflect ||= {};
ModAPI.server = ModAPI.serverInstance = null;
ModAPI.dedicatedServer ||= {};
ModAPI.dedicatedServer._data ||= [];
Expand Down Expand Up @@ -107,6 +108,9 @@ globalThis.modapi_postinit = `(() => {
"staticVariableNames": [],
"class": item || null,
"hasMeta": !!item,
"instanceOf": function (object) {
return ModAPI.hooks._teavm.$rt_isInstance(object, item || null);
},
"compiledName": compiledName
}
}
Expand Down Expand Up @@ -145,9 +149,18 @@ globalThis.modapi_postinit = `(() => {
}
});
});
ModAPI.reflect.classes = Object.values(ModAPI.hooks._classMap);
console.log("[ModAPI] Regenerated hook classmap.");
}
ModAPI.hooks.regenerateClassMap();
ModAPI.reflect.getClassById = function (classId) {
return ModAPI.hooks._classMap[ModAPI.util.getCompiledName(classId)];
}
ModAPI.reflect.getClassByName = function (className) {
var classKeys = Object.keys(ModAPI.hooks._classMap);
var key = classKeys.filter(k => {k.endsWith("_" + className)})[0];
return key ? ModAPI.hooks._classMap[key] : null;
}
var reloadDeprecationWarnings = 0;
const TeaVM_to_BaseData_ProxyConf = {
get(target, prop, receiver) {
Expand Down Expand Up @@ -397,6 +410,7 @@ globalThis.modapi_postinit = `(() => {
ModAPI.hooks.methods[initMethodName] = function (...args) {
var x = originalInit.apply(this, args);
//args[0] means $this (ie: minecraft instance).
ModAPI.mc = ModAPI.minecraft = new Proxy(args[0], TeaVM_to_Recursive_BaseData_ProxyConf);
ModAPI.mcinstance = ModAPI.javaClient = args[0];
ModAPI.settings = new Proxy(ModAPI.mcinstance.$gameSettings, TeaVM_to_Recursive_BaseData_ProxyConf);
Expand All @@ -405,8 +419,6 @@ globalThis.modapi_postinit = `(() => {
return x;
};
ModAPI.events.newEvent("load", "client");
var integratedServerStartup = ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.sp.internal.ClientPlatformSingleplayer", "loadIntegratedServerSourceInline");
//Integrated server setup has a randomised suffix on the end
integratedServerStartup = ModAPI.hooks._rippedMethodKeys.filter(key => { return key.startsWith(integratedServerStartup); })[0];
Expand All @@ -418,6 +430,8 @@ globalThis.modapi_postinit = `(() => {
return x;
};
ModAPI.events.newEvent("load", "client");
ModAPI.events.newEvent("sendchatmessage", "client");
const sendChatMessageMethodName = ModAPI.util.getMethodFromPackage("net.minecraft.client.entity.EntityPlayerSP", "sendChatMessage");
const sendChatMessage = ModAPI.hooks.methods[sendChatMessageMethodName];
Expand Down Expand Up @@ -453,7 +467,7 @@ globalThis.modapi_postinit = `(() => {
const serverStartMethod = ModAPI.hooks.methods[serverStartMethodName];
ModAPI.hooks.methods[serverStartMethodName] = function ($this) {
var x = serverStartMethod.apply(this, [$this]);
ModAPI.server = ModAPI.serverInstance = new Proxy($this, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf);
ModAPI.server = new Proxy($this, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf);
ModAPI.rawServer = $this;
ModAPI.events.callEvent("serverstart", {});
return x;
Expand Down Expand Up @@ -511,6 +525,8 @@ globalThis.modapi_postinit = `(() => {
ModAPI.items = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.init.Items")].staticVariables, StaticProps_ProxyConf);
ModAPI.blocks = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.init.Blocks")].staticVariables, StaticProps_ProxyConf);
ModAPI.materials = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.block.material.Material")].staticVariables, StaticProps_ProxyConf);
ModAPI.enchantments = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.enchantment.Enchantment")].staticVariables, StaticProps_ProxyConf);
const originalOptionsInit = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.gui.GuiOptions", "initGui")];
Expand Down
5 changes: 4 additions & 1 deletion postinit.js
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,7 @@
ModAPI.hooks.methods[initMethodName] = function (...args) {
var x = originalInit.apply(this, args);
//args[0] means $this (ie: minecraft instance).
ModAPI.mc = ModAPI.minecraft = new Proxy(args[0], TeaVM_to_Recursive_BaseData_ProxyConf);
ModAPI.mcinstance = ModAPI.javaClient = args[0];
ModAPI.settings = new Proxy(ModAPI.mcinstance.$gameSettings, TeaVM_to_Recursive_BaseData_ProxyConf);

Expand Down Expand Up @@ -466,7 +467,7 @@
const serverStartMethod = ModAPI.hooks.methods[serverStartMethodName];
ModAPI.hooks.methods[serverStartMethodName] = function ($this) {
var x = serverStartMethod.apply(this, [$this]);
ModAPI.server = ModAPI.serverInstance = new Proxy($this, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf);
ModAPI.server = new Proxy($this, ModAPI.util.TeaVM_to_Recursive_BaseData_ProxyConf);
ModAPI.rawServer = $this;
ModAPI.events.callEvent("serverstart", {});
return x;
Expand Down Expand Up @@ -524,6 +525,8 @@

ModAPI.items = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.init.Items")].staticVariables, StaticProps_ProxyConf);
ModAPI.blocks = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.init.Blocks")].staticVariables, StaticProps_ProxyConf);
ModAPI.materials = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.block.material.Material")].staticVariables, StaticProps_ProxyConf);
ModAPI.enchantments = new Proxy(ModAPI.hooks._classMap[ModAPI.util.getCompiledName("net.minecraft.enchantment.Enchantment")].staticVariables, StaticProps_ProxyConf);


const originalOptionsInit = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.gui.GuiOptions", "initGui")];
Expand Down

0 comments on commit 5034c12

Please sign in to comment.