Add CallbackValue

This commit is contained in:
Bjorn Beishline 2026-01-27 14:15:52 -07:00
parent 4cca142617
commit e45fa6ab9a
4 changed files with 47 additions and 9 deletions

View File

@ -0,0 +1,24 @@
package org.patchbukkit;
public class CallbackValue {
public String callbackName;
public Object[] args;
public CallbackValue(String callbackName, Object[] args) {
this.callbackName = callbackName;
this.args = args;
}
public Object getArg(int arg) {
return args[arg];
}
public Object argLength() {
return args.length;
}
public String getCallbackName() {
return callbackName;
}
}

View File

@ -25,10 +25,15 @@ public class NativeCallbacks extends NativeCallbackToRustChannelSupport {
return instance; return instance;
} }
public void doRegisterCallback( public void registerEventCallback(
@NotNull Listener listener, @NotNull Listener listener,
@NotNull Plugin plugin @NotNull Plugin plugin
) { ) {
doCallback(new Object[] { listener, plugin }); doCallback(
new CallbackValue(
"REGISTER_EVENT_CALLBACK",
new Object[] { listener, plugin }
)
);
} }
} }

View File

@ -98,7 +98,7 @@ public class PatchBukkitPluginManager implements PluginManager {
@NotNull Listener listener, @NotNull Listener listener,
@NotNull Plugin plugin @NotNull Plugin plugin
) { ) {
NativeCallbacks.getInstance().doRegisterCallback(listener, plugin); NativeCallbacks.getInstance().registerEventCallback(listener, plugin);
} }
@Override @Override

View File

@ -81,16 +81,25 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc<Context>) ->
let r = jvm.init_callback_channel(&i).unwrap(); let r = jvm.init_callback_channel(&i).unwrap();
std::thread::spawn(move || { std::thread::spawn(move || {
if let Err(e) = Jvm::attach_thread() { let jvm = match Jvm::attach_thread() {
Ok(jvm) => jvm,
Err(e) => {
log::error!("Failed to attach callback thread to JVM: {}", e); log::error!("Failed to attach callback thread to JVM: {}", e);
return; return;
} }
};
loop { loop {
match r.rx().recv() { match r.rx().recv() {
Ok(ret) => { Ok(ret) => {
plugin.plugin_manager.add_listener(); let result = jvm
log::info!("Received callback: {:?}", ret.class_name()); .invoke(&ret, "getCallbackName", InvocationArg::empty())
.unwrap();
let callback_name: String = jvm.to_rust(result).unwrap();
match callback_name {
_ => log::warn!("Received unknown callback: {:?}", callback_name),
}
} }
Err(e) => { Err(e) => {
log::error!("Callback channel closed: {}", e); log::error!("Callback channel closed: {}", e);