Set plugin instances

This commit is contained in:
Bjorn Beishline 2026-01-27 22:59:14 -07:00
parent 87d95885eb
commit 9422749511
5 changed files with 53 additions and 12 deletions

View File

@ -10,7 +10,7 @@ public class CallbackValue {
this.args = args; this.args = args;
} }
public Object getArg(int arg) { public Object getArg(Integer arg) {
return args[arg]; return args[arg];
} }

View File

@ -7,16 +7,21 @@ use pumpkin::{
use pumpkin_api_macros::with_runtime; use pumpkin_api_macros::with_runtime;
use pumpkin_util::text::{TextComponent, color::NamedColor}; use pumpkin_util::text::{TextComponent, color::NamedColor};
pub struct PatchBukkitJoinHandler; use crate::plugin::manager::Plugins;
pub struct PatchBukkitJoinHandler {
pub plugins: Plugins,
}
#[with_runtime(global)] #[with_runtime(global)]
impl EventHandler<PlayerJoinEvent> for PatchBukkitJoinHandler { impl EventHandler<PlayerJoinEvent> for PatchBukkitJoinHandler {
fn handle_blocking<'a>( fn handle_blocking<'a>(
&self, &self,
_server: &Arc<Server>, server: &Arc<Server>,
event: &'a mut PlayerJoinEvent, event: &'a mut PlayerJoinEvent,
) -> BoxFuture<'a, ()> { ) -> BoxFuture<'a, ()> {
Box::pin(async { Box::pin(async {
for (_plugin_name, plugin) in self.plugins.lock().unwrap().iter_mut() {}
event.join_message = event.join_message =
TextComponent::text(format!("Welcome, {}!", event.player.gameprofile.name)) TextComponent::text(format!("Welcome, {}!", event.player.gameprofile.name))
.color_named(NamedColor::Green); .color_named(NamedColor::Green);

View File

@ -2,14 +2,14 @@ use std::sync::Arc;
use pumpkin::plugin::{Context, EventPriority}; use pumpkin::plugin::{Context, EventPriority};
use crate::events::join::PatchBukkitJoinHandler; use crate::{events::join::PatchBukkitJoinHandler, plugin::manager::Plugins};
pub mod join; pub mod join;
pub async fn register_handlers(server: &Arc<Context>) { pub async fn register_handlers(plugins: Plugins, server: &Arc<Context>) {
server server
.register_event( .register_event(
Arc::new(PatchBukkitJoinHandler), Arc::new(PatchBukkitJoinHandler { plugins }),
EventPriority::Highest, EventPriority::Highest,
true, true,
) )

View File

@ -80,6 +80,7 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc<Context>) ->
.map_err(|err| err.to_string())?; .map_err(|err| err.to_string())?;
let r = jvm.init_callback_channel(&i).unwrap(); let r = jvm.init_callback_channel(&i).unwrap();
let plugins = plugin.plugin_manager.plugins.clone();
std::thread::spawn(move || { std::thread::spawn(move || {
let jvm = match Jvm::attach_thread() { let jvm = match Jvm::attach_thread() {
Ok(jvm) => jvm, Ok(jvm) => jvm,
@ -92,22 +93,53 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc<Context>) ->
loop { loop {
match r.rx().recv() { match r.rx().recv() {
Ok(ret) => { Ok(ret) => {
let _: anyhow::Result<()> = (|| { let result: anyhow::Result<()> = (|| {
let result = jvm.invoke(&ret, "getCallbackName", InvocationArg::empty())?; let result = jvm.invoke(&ret, "getCallbackName", InvocationArg::empty())?;
let callback_name: String = jvm.to_rust(result)?; let callback_name: String = jvm.to_rust(result)?;
match callback_name.as_str() { match callback_name.as_str() {
"REGISTER_EVENT_CALLBACK" => { "REGISTER_EVENT_CALLBACK" => {
let listener = let listener_name: String = jvm.to_rust(jvm.invoke(
jvm.invoke(&ret, "getArg", &[&InvocationArg::try_from(0)?])?; &ret,
let plugin = "getArg",
jvm.invoke(&ret, "getArg", &[&InvocationArg::try_from(1)?])?; &[&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), _ => log::warn!("Received unknown callback: {:?}", callback_name),
} }
return Ok(()); return Ok(());
})(); })();
result.unwrap();
} }
Err(e) => { Err(e) => {
log::error!("Callback channel closed: {}", e); log::error!("Callback channel closed: {}", e);

View File

@ -56,10 +56,12 @@ pub struct Plugin {
/// Data folder for this plugin /// Data folder for this plugin
pub data_folder: PathBuf, pub data_folder: PathBuf,
pub instance: Option<Instance>, pub instance: Option<Instance>,
pub listeners: HashMap<String, Instance>,
} }
pub type Plugins = Arc<Mutex<HashMap<String, Plugin>>>;
pub struct PluginManager { pub struct PluginManager {
plugins: Arc<Mutex<HashMap<String, Plugin>>>, pub plugins: Plugins,
} }
impl PluginManager { impl PluginManager {
@ -100,6 +102,7 @@ impl PluginManager {
data_folder: jar_path.as_ref().parent().unwrap().join("data"), data_folder: jar_path.as_ref().parent().unwrap().join("data"),
path: jar_path.as_ref().to_path_buf(), path: jar_path.as_ref().to_path_buf(),
instance: None, instance: None,
listeners: HashMap::new(),
}; };
self.add_plugin(plugin); self.add_plugin(plugin);
@ -124,6 +127,7 @@ impl PluginManager {
data_folder: jar_path.as_ref().parent().unwrap().join("data"), data_folder: jar_path.as_ref().parent().unwrap().join("data"),
path: jar_path.as_ref().to_path_buf(), path: jar_path.as_ref().to_path_buf(),
instance: None, instance: None,
listeners: HashMap::new(),
}; };
self.add_plugin(plugin); self.add_plugin(plugin);