Set plugin instances
This commit is contained in:
parent
87d95885eb
commit
9422749511
@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user