From 9422749511ddf5e36952aaea6dc5a56d0c45ab1c Mon Sep 17 00:00:00 2001 From: Bjorn Beishline <75190918+BjornTheProgrammer@users.noreply.github.com> Date: Tue, 27 Jan 2026 22:59:14 -0700 Subject: [PATCH] Set plugin instances --- .../java/org/patchbukkit/CallbackValue.java | 2 +- rust/src/events/join.rs | 9 +++- rust/src/events/mod.rs | 6 +-- rust/src/lib.rs | 42 ++++++++++++++++--- rust/src/plugin/manager.rs | 6 ++- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/CallbackValue.java b/java/patchbukkit/src/main/java/org/patchbukkit/CallbackValue.java index 54352de..7f61ba6 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/CallbackValue.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/CallbackValue.java @@ -10,7 +10,7 @@ public class CallbackValue { this.args = args; } - public Object getArg(int arg) { + public Object getArg(Integer arg) { return args[arg]; } diff --git a/rust/src/events/join.rs b/rust/src/events/join.rs index 055f6fa..4439c42 100644 --- a/rust/src/events/join.rs +++ b/rust/src/events/join.rs @@ -7,16 +7,21 @@ use pumpkin::{ use pumpkin_api_macros::with_runtime; use pumpkin_util::text::{TextComponent, color::NamedColor}; -pub struct PatchBukkitJoinHandler; +use crate::plugin::manager::Plugins; + +pub struct PatchBukkitJoinHandler { + pub plugins: Plugins, +} #[with_runtime(global)] impl EventHandler for PatchBukkitJoinHandler { fn handle_blocking<'a>( &self, - _server: &Arc, + server: &Arc, event: &'a mut PlayerJoinEvent, ) -> BoxFuture<'a, ()> { Box::pin(async { + for (_plugin_name, plugin) in self.plugins.lock().unwrap().iter_mut() {} event.join_message = TextComponent::text(format!("Welcome, {}!", event.player.gameprofile.name)) .color_named(NamedColor::Green); diff --git a/rust/src/events/mod.rs b/rust/src/events/mod.rs index 4339eb5..79343e7 100644 --- a/rust/src/events/mod.rs +++ b/rust/src/events/mod.rs @@ -2,14 +2,14 @@ use std::sync::Arc; use pumpkin::plugin::{Context, EventPriority}; -use crate::events::join::PatchBukkitJoinHandler; +use crate::{events::join::PatchBukkitJoinHandler, plugin::manager::Plugins}; pub mod join; -pub async fn register_handlers(server: &Arc) { +pub async fn register_handlers(plugins: Plugins, server: &Arc) { server .register_event( - Arc::new(PatchBukkitJoinHandler), + Arc::new(PatchBukkitJoinHandler { plugins }), EventPriority::Highest, true, ) diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 70f9552..33229c0 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -80,6 +80,7 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc) -> .map_err(|err| err.to_string())?; let r = jvm.init_callback_channel(&i).unwrap(); + let plugins = plugin.plugin_manager.plugins.clone(); std::thread::spawn(move || { let jvm = match Jvm::attach_thread() { Ok(jvm) => jvm, @@ -92,22 +93,53 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc) -> loop { match r.rx().recv() { Ok(ret) => { - let _: anyhow::Result<()> = (|| { + let result: anyhow::Result<()> = (|| { let result = jvm.invoke(&ret, "getCallbackName", InvocationArg::empty())?; let callback_name: String = jvm.to_rust(result)?; match callback_name.as_str() { "REGISTER_EVENT_CALLBACK" => { - let listener = - jvm.invoke(&ret, "getArg", &[&InvocationArg::try_from(0)?])?; - let plugin = - jvm.invoke(&ret, "getArg", &[&InvocationArg::try_from(1)?])?; + let listener_name: String = jvm.to_rust(jvm.invoke( + &ret, + "getArg", + &[&InvocationArg::try_from(0_i32)?], + )?)?; + let listener = jvm.cast( + &jvm.invoke( + &ret, + "getArg", + &[&InvocationArg::try_from(1_i32)?], + )?, + "org.bukkit.event.Listener", + )?; + let plugin_instance = jvm.cast( + &jvm.invoke( + &ret, + "getArg", + &[&InvocationArg::try_from(2_i32)?], + )?, + "org.bukkit.plugin.Plugin", + )?; + let plugin_name: String = jvm.to_rust(jvm.invoke( + &plugin_instance, + "getName", + InvocationArg::empty(), + )?)?; + + match plugins.lock().unwrap().get_mut(&plugin_name) { + Some(rust_plugin) => { + rust_plugin.listeners.insert(listener_name, listener) + } + None => todo!(), + }; } _ => log::warn!("Received unknown callback: {:?}", callback_name), } return Ok(()); })(); + + result.unwrap(); } Err(e) => { log::error!("Callback channel closed: {}", e); diff --git a/rust/src/plugin/manager.rs b/rust/src/plugin/manager.rs index ec7b214..9306df0 100644 --- a/rust/src/plugin/manager.rs +++ b/rust/src/plugin/manager.rs @@ -56,10 +56,12 @@ pub struct Plugin { /// Data folder for this plugin pub data_folder: PathBuf, pub instance: Option, + pub listeners: HashMap, } +pub type Plugins = Arc>>; pub struct PluginManager { - plugins: Arc>>, + pub plugins: Plugins, } impl PluginManager { @@ -100,6 +102,7 @@ impl PluginManager { data_folder: jar_path.as_ref().parent().unwrap().join("data"), path: jar_path.as_ref().to_path_buf(), instance: None, + listeners: HashMap::new(), }; self.add_plugin(plugin); @@ -124,6 +127,7 @@ impl PluginManager { data_folder: jar_path.as_ref().parent().unwrap().join("data"), path: jar_path.as_ref().to_path_buf(), instance: None, + listeners: HashMap::new(), }; self.add_plugin(plugin);