Get callbacks working

This commit is contained in:
Bjorn Beishline 2026-01-27 12:10:09 -07:00
parent bb23fce01e
commit 4cca142617
3 changed files with 57 additions and 5 deletions

View File

@ -1,5 +1,34 @@
package org.patchbukkit; package org.patchbukkit;
import org.astonbitecode.j4rs.api.invocation.NativeCallbackToRustChannelSupport; 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 });
}
}

View File

@ -98,9 +98,7 @@ public class PatchBukkitPluginManager implements PluginManager {
@NotNull Listener listener, @NotNull Listener listener,
@NotNull Plugin plugin @NotNull Plugin plugin
) { ) {
throw new UnsupportedOperationException( NativeCallbacks.getInstance().doRegisterCallback(listener, plugin);
"Unimplemented method 'registerEvents'"
);
} }
@Override @Override

View File

@ -1,6 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use j4rs::Jvm; use j4rs::{InvocationArg, Jvm};
use pumpkin::plugin::Context; use pumpkin::plugin::Context;
use pumpkin_api_macros::{plugin_impl, plugin_method}; use pumpkin_api_macros::{plugin_impl, plugin_method};
@ -75,6 +75,31 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc<Context>) ->
let jvm = initialize_jvm(&dirs.j4rs)?; let jvm = initialize_jvm(&dirs.j4rs)?;
setup_patchbukkit_server(&jvm)?; 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
.plugin_manager .plugin_manager
.load_all_plugins(&jvm) .load_all_plugins(&jvm)