diff options
author | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2022-05-29 12:04:52 +0800 |
---|---|---|
committer | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2022-05-29 12:04:52 +0800 |
commit | a6593709b0e1e99e241b6c163fe66623685b6efc (patch) | |
tree | 9714e82716caf9edd6be05a1822fa492eb6756ed /featureClass | |
parent | a7dcf231cc43c9ef73d6a969203c2dafd2ce8caf (diff) | |
download | SoopyV2-a6593709b0e1e99e241b6c163fe66623685b6efc.tar.gz SoopyV2-a6593709b0e1e99e241b6c163fe66623685b6efc.tar.bz2 SoopyV2-a6593709b0e1e99e241b6c163fe66623685b6efc.zip |
first part of supporting java side rendering
Diffstat (limited to 'featureClass')
-rw-r--r-- | featureClass/class.js | 11 | ||||
-rw-r--r-- | featureClass/featureManager.js | 4 | ||||
-rw-r--r-- | featureClass/forgeEvents.js | 24 |
3 files changed, 22 insertions, 17 deletions
diff --git a/featureClass/class.js b/featureClass/class.js index d595e4b..b8a17d9 100644 --- a/featureClass/class.js +++ b/featureClass/class.js @@ -79,17 +79,16 @@ class Feature { delete this.soopyEvents[event.id] } - registerForge(event, func, messageIfError) { + registerForge(event, func, priority) { let theEvent try { - theEvent = this.FeatureManager.registerForge(event, func, this) - } catch (e) { //TODO: option to disable this chat message + fallback register for some that support (eg fallback of RenderWorldLastEvent to ct 'renderWorld') - if (!messageIfError) messageIfError = "An error occured while registering the event " + event.class.toString().split(".").pop() + ", this may cause " + this.constructor.name + " to not work properly." - ChatLib.chat(this.FeatureManager.messagePrefix + messageIfError) + theEvent = this.FeatureManager.registerForge(event, func, priority, this) + } catch (e) { + ChatLib.chat(this.FeatureManager.messagePrefix + "An error occured while registering the event " + event.class.toString().split(".").pop() + ", this may cause " + this.constructor.name + " to not work properly.") } if (theEvent) this.forgeEvents[theEvent.id] = theEvent - return new ForgeEvent(theEvent, theEvent.trigger, [event, func, messageIfError], this) + return new ForgeEvent(theEvent, theEvent.trigger, [event, func, priority], this) } unregisterForge(event) { diff --git a/featureClass/featureManager.js b/featureClass/featureManager.js index e27208f..991f549 100644 --- a/featureClass/featureManager.js +++ b/featureClass/featureManager.js @@ -439,13 +439,13 @@ class FeatureManager { return this.customEvents[id] } - registerForge(event, func, context) { + registerForge(event, func, priority, context) { let id = this.lastForgeEventId++ this.forgeEvents[id] = { func: func, context: context, - trigger: registerForgeBase(event, (...args) => { + trigger: registerForgeBase(event, priority, (...args) => { try { if (context.enabled) { if (this.recordingPerformanceUsage) this.startRecordingPerformance(context.constructor.name, event.class.name) diff --git a/featureClass/forgeEvents.js b/featureClass/forgeEvents.js index e852c49..fb723b1 100644 --- a/featureClass/forgeEvents.js +++ b/featureClass/forgeEvents.js @@ -4,15 +4,20 @@ importPackage(org.objectweb.asm) importClass(java.lang.ClassLoader) importClass(org.apache.commons.lang3.RandomStringUtils) importClass(java.util.function.Consumer) +importClass(net.minecraftforge.fml.common.eventhandler.EventPriority) const L = s => `L${s};` - const LoadedInsts = [] -function defineClassBytes(name, bytes) { +function defineClassBytes(name, bytes) {//should support multymc? ty dawjaw https://canary.discord.com/channels/119493402902528000/688773480954855537/979959207124168744 const classLoader = Packages.com.chattriggers.ctjs.CTJS.class.getClassLoader() - const defClass = ClassLoader.class.getDeclaredMethods()[23] // defineClass() + let defClass; + ClassLoader.class.getDeclaredMethods().forEach(m => { + if (m.toString() === "protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError") { + defClass = m; + } + }) defClass.setAccessible(true) @@ -22,7 +27,7 @@ function defineClassBytes(name, bytes) { return defClass.invoke(classLoader, n, bytes, o, s) } -const registerForge = (e, cb) => { +const registerForge = (e, priority = EventPriority.NORMAL, cb) => { const cw = new ClassWriter(0) const event = Type.getType(e.class).internalName @@ -35,7 +40,7 @@ const registerForge = (e, cb) => { const obj = Type.getType(java.lang.Object.class).internalName cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, obj, null) - // cw.visitInnerClass("net/minecraftforge/event/entity/player/PlayerEvent$BreakSpeed", "net/minecraftforge/event/entity/player/PlayerEvent", "BreakSpeed", ACC_PUBLIC + ACC_STATIC); + //cw.visitInnerClass("net/minecraftforge/event/entity/player/PlayerEvent$BreakSpeed","net/minecraftforge/event/entity/player/PlayerEvent","BreakSpeed",ACC_PUBLIC+ACC_STATIC); { cw.visitField(Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL, "callback", L(consumer), L(consumer + "<" + L(event) + ">"), null).visitEnd() } @@ -44,7 +49,7 @@ const registerForge = (e, cb) => { con.visitCode() con.visitVarInsn(Opcodes.ALOAD, 0) con.visitMethodInsn(Opcodes.INVOKESPECIAL, obj, "<init>", "()V", false) - + con.visitVarInsn(Opcodes.ALOAD, 0) con.visitVarInsn(Opcodes.ALOAD, 1) con.visitFieldInsn(Opcodes.PUTFIELD, name, "callback", L(consumer)) @@ -59,6 +64,7 @@ const registerForge = (e, cb) => { const mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "on", "(" + L(event) + ")V", null, null) { const av = mv.visitAnnotation(L(subscribeEvent), true) + av.visitEnum("priority", "Lnet/minecraftforge/fml/common/eventhandler/EventPriority;", priority.name()); av.visitEnd() } mv.visitCode() @@ -75,7 +81,7 @@ const registerForge = (e, cb) => { const inst = defineClassBytes(name, cw.toByteArray()) .getDeclaredConstructor(Consumer.class) .newInstance(new java.util.function.Consumer({ - accept: function (t) { cb(t) } + accept: function (t) { cb(t) } })) LoadedInsts.push(inst) return inst; @@ -86,8 +92,8 @@ const unregisterForge = inst => { } register("gameUnload", () => { - LoadedInsts.forEach(unregisterForge) + LoadedInsts.forEach(unregisterForge) LoadedInsts.length = 0 }) -export { registerForge, unregisterForge } +export { registerForge, unregisterForge }
\ No newline at end of file |