From 4cca142617b338e453fc66b61eba79693028a155 Mon Sep 17 00:00:00 2001 From: Bjorn Beishline <75190918+BjornTheProgrammer@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:10:09 -0700 Subject: [PATCH] Get callbacks working --- .../java/org/patchbukkit/NativeCallbacks.java | 31 ++++++++++++++++++- .../patchbukkit/PatchBukkitPluginManager.java | 4 +-- rust/src/lib.rs | 27 +++++++++++++++- 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java b/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java index 26a3bae..054d71f 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/NativeCallbacks.java @@ -1,5 +1,34 @@ package org.patchbukkit; import org.astonbitecode.j4rs.api.invocation.NativeCallbackToRustChannelSupport; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -public class NativeCallbacks extends NativeCallbackToRustChannelSupport {} +public class NativeCallbacks extends NativeCallbackToRustChannelSupport { + + private static NativeCallbacks instance; + + public NativeCallbacks() { + NativeCallbacks.setInstance(this); + } + + private static synchronized void setInstance( + NativeCallbacks nativeCallbacks + ) { + if (instance == null) { + instance = nativeCallbacks; + } + } + + public static NativeCallbacks getInstance() { + return instance; + } + + public void doRegisterCallback( + @NotNull Listener listener, + @NotNull Plugin plugin + ) { + doCallback(new Object[] { listener, plugin }); + } +} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java index 2a96a20..a5fc251 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java @@ -98,9 +98,7 @@ public class PatchBukkitPluginManager implements PluginManager { @NotNull Listener listener, @NotNull Plugin plugin ) { - throw new UnsupportedOperationException( - "Unimplemented method 'registerEvents'" - ); + NativeCallbacks.getInstance().doRegisterCallback(listener, plugin); } @Override diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 98fc300..68669b3 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use j4rs::Jvm; +use j4rs::{InvocationArg, Jvm}; use pumpkin::plugin::Context; use pumpkin_api_macros::{plugin_impl, plugin_method}; @@ -75,6 +75,31 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc) -> let jvm = initialize_jvm(&dirs.j4rs)?; setup_patchbukkit_server(&jvm)?; + let i = jvm + .create_instance("org.patchbukkit.NativeCallbacks", InvocationArg::empty()) + .map_err(|err| err.to_string())?; + let r = jvm.init_callback_channel(&i).unwrap(); + + std::thread::spawn(move || { + if let Err(e) = Jvm::attach_thread() { + log::error!("Failed to attach callback thread to JVM: {}", e); + return; + } + + loop { + match r.rx().recv() { + Ok(ret) => { + plugin.plugin_manager.add_listener(); + log::info!("Received callback: {:?}", ret.class_name()); + } + Err(e) => { + log::error!("Callback channel closed: {}", e); + break; + } + } + } + }); + plugin .plugin_manager .load_all_plugins(&jvm)