#Listen to Any Arch and or Fabric Event using KubeJS Additions

29 messages · Page 1 of 1 (latest)

wanton bear
#

Using KubeJS Additions, it is now possible to listen to any arbitrary event from either Arch or Fabric.
To help show how powerful this feature is, I have written a script to generate event listeners for every Fabric event using the documentation provided by KubeJS Offline.
The attached file is the result of that being used on 1.18.2 fabric events.
I will attach the code I use to generate these events later in this thread.

As for single examples:
1.19.2 Syntax

const LIFE_CYCLE_EVENTS = Java.loadClass('dev.architectury.event.events.common.LifecycleEvent');

ArchEvents.registry(event => {
    event.register('startup', LIFE_CYCLE_EVENTS, 'SERVER_BEFORE_START');
});

ArchEvents.handle('startup', event => {
    console.log('Custom Arch Event handler has fired!');
    console.log("Event Class: " + event);
    console.log("Parameter List: " + event.getArgs());
    console.log("Parameter 0: " + event.getArg(0));
    console.log("Parameter Map: " + event.getParameters());
    console.log("Method Name: " + event.getMethodName());
    console.log("Requires Return Type: " + event.requiresResult());
    console.log("Return Type: " + event.getReturnType());
    console.log("Generic Return Type: " + event.getGenericReturnType());
});

const SERVER_MESSAGES = Java.loadClass('net.fabricmc.fabric.api.message.v1.ServerMessageEvents');

FabricEvents.registry(event => {
    event.register('chat messages', SERVER_MESSAGES, 'CHAT_MESSAGE');
});

FabricEvents.handle('chat messages', event => {
    console.log('Custom Arch Event handler has fired!');
    console.log("Event Class: " + event);
    console.log("Parameter List: " + event.getArgs());
    console.log("Parameter 0: " + event.getArg(0));
    console.log("Parameter Map: " + event.getParameters());
    console.log("Method Name: " + event.getMethodName());
    console.log("Requires Return Type: " + event.requiresResult());
    console.log("Return Type: " + event.getReturnType());
    console.log("Generic Return Type: " + event.getGenericReturnType());
});

1.18.2 Syntax

const LIFE_CYCLE_EVENTS = java('dev.architectury.event.events.common.LifecycleEvent');

onEvent('arch.event.register', event => {
    event.register('server_before_start', LIFE_CYCLE_EVENTS, 'SERVER_BEFORE_START');
});

onEvent('server_before_start', event => {
    console.log('Custom Arch Event handler has fired!');
    console.log("Event Class: " + event);
    console.log("Parameter List: " + event.getArgs());
    console.log("Parameter 0: " + event.getArg(0));
    console.log("Parameter Map: " + event.getParameters());
    console.log("Method Name: " + event.getMethodName());
    console.log("Requires Return Type: " + event.requiresResult());
    console.log("Return Type: " + event.getReturnType());
    console.log("Generic Return Type: " + event.getGenericReturnType());
});


const FABRIC_SERVER = java('net.fabricmc.fabric.api.event.server.ServerStartCallback');

onEvent('fabric.event.register', event => {
    console.log('Fabric Event handler has fired!');
    event.register('server_start_callback', FABRIC_SERVER, 'EVENT');
});

onEvent('server_start_callback', event => {
    console.log('Custom Fabric Event handler has fired!');
    console.log("Event Class: " + event);
    console.log("Parameter List: " + event.getArgs());
    console.log("Parameter 0: " + event.getArg(0));
    console.log("Parameter Map: " + event.getParameters());
    console.log("Method Name: " + event.getMethodName());
    console.log("Requires Return Type: " + event.requiresResult());
    console.log("Return Type: " + event.getReturnType());
    console.log("Generic Return Type: " + event.getGenericReturnType());
});
half kindleBOT
#

Paste version of fabric_1_18_2_events.js from @wanton bear

wanton bear
#

As for the script I used to generate the 1.18.2 fabric examples:

#
// 1.18.2 Fabric Event Listener Generator
// Run this in the console of this page:
// https://hunter19823.github.io/kubejsoffline/1.18.2/fabric/?search=field-type&query=net.fabricmc.fabric.api.event.Event
let rows = document.getElementsByTagName('tr');
let output = '';
let constants_map = new Map();
for (let i = 1; i < rows.length; i++) {
    let row = rows[i];
    let mod = row.getAttribute('mod');
    let parent_class = row.getAttribute('declared-in');
    let name = row.getAttribute('name');
    if(!(MODIFIER.isPublic(mod) && MODIFIER.isStatic(mod))){
        continue;
    }
    let type_id = row.getAttribute('type');
    let type = getClass(type_id);
    let parent = getClass(parent_class);
    let new_event_name = type.type();
    new_event_name = new_event_name.substring(new_event_name.lastIndexOf('.') + 1);
    // Remove the last >
    new_event_name = new_event_name.substring(0, new_event_name.length - 1);
    // Replace the $ with a .
    new_event_name = new_event_name.replaceAll('$', '.');

    let constVar = `${parent.simplename().toUpperCase()}`;
    if(!constants_map.has(constVar)){
        constants_map.set(constVar, parent.name());
    }
    output+= `onEvent('fabric.event.register', event => {\n`;
    output+= `    event.register('${new_event_name}', ${constVar}, '${name}');\n`;
    output+= `});\n`;
    output+= `\n`;
    output+= `onEvent('${new_event_name}', event => {\n`;
    output+= `    // KubeJS Offline Documentation: ${window.location.origin}/${window.location.pathname}#${type_id}\n`
    output+= `    console.log('Event ${new_event_name} has fired!');\n`;
    output+= `});\n`;
}
let header = '// FABRIC 1.18.2 EVENT GENERATOR\n\n';
constants_map.forEach((value, key) => {
    header += (`const ${key} = java('${value}');\n`);
});
header += '\n';
output = header + output;
console.log(output);
#

If you install KubeJS Offline in your pack, and want to do this for any events that mods add to your pack, all you have to do is open the documentation page in your browser and add ?search=field-type&query=net.fabricmc.fabric.api.event.Event to the end of the URL.
Then run that script

#

Here is one for 1.18.2 arch:

// 1.18.2 Arch Event Listener Generator
// Run this in the console of this page:
// https://hunter19823.github.io/kubejsoffline/1.18.2/fabric/?search=field-type&query=dev.architectury.event.Event
// https://hunter19823.github.io/kubejsoffline/1.18.2/forge/?search=field-type&query=dev.architectury.event.Event
let rows = document.getElementsByTagName('tr');
let output = '';
let constants_map = new Map();
for (let i = 1; i < rows.length; i++) {
    let row = rows[i];
    let mod = row.getAttribute('mod');
    let parent_class = row.getAttribute('declared-in');
    let name = row.getAttribute('name');
    if(!(MODIFIER.isPublic(mod) && MODIFIER.isStatic(mod))){
        continue;
    }
    let type_id = row.getAttribute('type');
    let type = getClass(type_id);
    let parent = getClass(parent_class);
    let new_event_name = type.type();
    new_event_name = new_event_name.substring(new_event_name.lastIndexOf('.') + 1);
    // Remove the last >
    new_event_name = new_event_name.substring(0, new_event_name.length - 1);
    // Replace the $ with a .
    new_event_name = new_event_name.replaceAll('$', '.');

    let constVar = `${parent.simplename().toUpperCase()}`;
    if(!constants_map.has(constVar)){
        constants_map.set(constVar, parent.name());
    }
    output+= `onEvent('arch.event.register', event => {\n`;
    output+= `    event.register('${new_event_name}', ${constVar}, '${name}');\n`;
    output+= `});\n`;
    output+= `\n`;
    output+= `onEvent('${new_event_name}', event => {\n`;
    output+= `    // KubeJS Offline Documentation: ${window.location.origin}/${window.location.pathname}#${type_id}\n`
    output+= `    console.log('Event ${new_event_name} has fired!');\n`;
    output+= `});\n`;
}
let header = '// Arch 1.18.2 EVENT GENERATOR\n\n';
constants_map.forEach((value, key) => {
    header += (`const ${key} = java('${value}');\n`);
});
header += '\n';
output = header + output;
console.log(output);
half kindleBOT
#

Paste version of arch_1_18_2_event_dump.js from @wanton bear

wanton bear
#

Fabric 1.19.2 Event listener Generator

#

1.19.2 Fabric Generator

// 1.19.2 Fabric Event Listener Generator
// Run this in the console of this page:
// https://hunter19823.github.io/kubejsoffline/1.19.2/fabric/?search=field-type&query=net.fabricmc.fabric.api.event.Event
let rows = document.getElementsByTagName('tr');
let output = '';
let constants_map = new Map();
for (let i = 1; i < rows.length; i++) {
    let row = rows[i];
    let mod = row.getAttribute('mod');
    let parent_class = row.getAttribute('declared-in');
    let name = row.getAttribute('name');
    if(!(MODIFIER.isPublic(mod) && MODIFIER.isStatic(mod))){
        continue;
    }
    let type_id = row.getAttribute('type');
    let type = getClass(type_id);
    let parent = getClass(parent_class);
    let new_event_name = type.type();
    new_event_name = new_event_name.substring(new_event_name.lastIndexOf('.') + 1);
    // Remove the last >
    new_event_name = new_event_name.substring(0, new_event_name.length - 1);
    // Replace the $ with a .
    new_event_name = new_event_name.replaceAll('$', '.');

    let constVar = `${parent.simplename().toUpperCase()}`;
    if(!constants_map.has(constVar)){
        constants_map.set(constVar, parent.name());
    }
    output+= `FabricEvents.registry(event => {\n`;
    output+= `    event.register('${new_event_name}', ${constVar}, '${name}');\n`;
    output+= `});\n`;
    output+= `\n`;
    output+= `FabricEvents.handle('${new_event_name}', event => {\n`;
    output+= `    // KubeJS Offline Documentation: ${window.location.origin}/${window.location.pathname}#${type_id}\n`
    output+= `    console.log('Event ${new_event_name} has fired!');\n`;
    output+= `});\n`;
}
let header = '// FABRIC 1.19.2 EVENT GENERATOR\n\n';
constants_map.forEach((value, key) => {
    header += (`const ${key} = Java.loadClass('${value}');\n`);
});
header += '\n';
output = header + output;
console.log(output);

1.19.2 Arch Generator

// 1.19.2 Arch Event Listener Generator
// Run this in the console of this page:
// https://hunter19823.github.io/kubejsoffline/1.19.2/fabric/?search=field-type&query=dev.architectury.event.Event
// https://hunter19823.github.io/kubejsoffline/1.19.2/forge/?search=field-type&query=dev.architectury.event.Event
let rows = document.getElementsByTagName('tr');
let output = '';
let constants_map = new Map();
for (let i = 1; i < rows.length; i++) {
    let row = rows[i];
    let mod = row.getAttribute('mod');
    let parent_class = row.getAttribute('declared-in');
    let name = row.getAttribute('name');
    if(!(MODIFIER.isPublic(mod) && MODIFIER.isStatic(mod))){
        continue;
    }
    let type_id = row.getAttribute('type');
    let type = getClass(type_id);
    let parent = getClass(parent_class);
    let new_event_name = type.type();
    new_event_name = new_event_name.substring(new_event_name.lastIndexOf('.') + 1);
    // Remove the last >
    new_event_name = new_event_name.substring(0, new_event_name.length - 1);
    // Replace the $ with a .
    new_event_name = new_event_name.replaceAll('$', '.');

    let constVar = `${parent.simplename().toUpperCase()}`;
    if(!constants_map.has(constVar)){
        constants_map.set(constVar, parent.name());
    }
    output+= `ArchEvents.registry(event => {\n`;
    output+= `    event.register('${new_event_name}', ${constVar}, '${name}');\n`;
    output+= `});\n`;
    output+= `\n`;
    output+= `ArchEvents.handle('${new_event_name}', event => {\n`;
    output+= `    // KubeJS Offline Documentation: ${window.location.origin}/${window.location.pathname}#${type_id}\n`
    output+= `    console.log('Event ${new_event_name} has fired!');\n`;
    output+= `});\n`;
}
let header = '// ARCHITECTURY 1.19.2 EVENT GENERATOR\n\n';
constants_map.forEach((value, key) => {
    header += (`const ${key} = Java.loadClass('${value}');\n`);
});
header += '\n';
output = header + output;
console.log(output);
half kindleBOT
#

Paste version of fabric_1_19_2_event_dump.js from @wanton bear

wanton bear
half kindleBOT
#

Paste version of arch_1_19_2_event_dump.js from @wanton bear

wanton bear
half kindleBOT
#

Paste version of fabric_1_18_2_event_dump.js from @wanton bear

opal falcon
#

does this mean we can use these events on forge?

floral quest
#

What’s arch? Never heard of that

wanton bear
wanton bear
opal falcon
#

Ah i see.

unreal swift
#

how bout update to 1.20.1 hmmm

wanton bear
#

I made the mod while I was in college. I now have a full time job which takes up most of my time.
I just haven’t found the motivation to port a lot of my mods since then.

winter cosmos
#

this isnt required for 1.20.1+

#

you can use Utils.makeFunctionProxy and register it using the same method mods do

unreal swift
wanton bear