This commit is contained in:
Alexander Medvedev 2026-08-19 11:56:13 +02:00
parent afb0e82713
commit e1fb278af0
12 changed files with 89 additions and 91 deletions

View File

@ -74,7 +74,7 @@ jobs:
- run: rustup component add clippy - run: rustup component add clippy
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
- name: Download JAR - name: Download JAR
uses: actions/download-artifact@v7 uses: actions/download-artifact@v8
with: with:
name: patchbukkit-jar name: patchbukkit-jar
path: java/patchbukkit/build/libs/ path: java/patchbukkit/build/libs/
@ -170,7 +170,7 @@ jobs:
Windows) cp rust/target/release/*.dll "dist/patchbukkit-${{ runner.arch }}-${{ runner.os }}.dll" ;; Windows) cp rust/target/release/*.dll "dist/patchbukkit-${{ runner.arch }}-${{ runner.os }}.dll" ;;
esac esac
- name: Export artifacts - name: Export artifacts
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: patchbukkit-${{ runner.arch }}-${{ runner.os }} name: patchbukkit-${{ runner.arch }}-${{ runner.os }}
compression-level: 9 compression-level: 9

12
rust/Cargo.lock generated
View File

@ -1794,9 +1794,9 @@ checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b"
[[package]] [[package]]
name = "granit-parser" name = "granit-parser"
version = "1.0.1" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c92814c286f45b5ed1498ce9547bc9637b473eba7037f8aee6a4d5a3c1e051c" checksum = "4ccd1be9ebf2bd5520dbfcfb72b70ef492f654061299a097056f3e73410e38ec"
dependencies = [ dependencies = [
"arraydeque", "arraydeque",
"smallvec", "smallvec",
@ -4266,9 +4266,9 @@ dependencies = [
[[package]] [[package]]
name = "serde-saphyr" name = "serde-saphyr"
version = "1.0.1" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af2c6921c8ce48fb1b052b457619d008834039d80325992ed3bc55bbe6c155ad" checksum = "a1ec1f5cac0eb96063c64b28705255a7ed6e7d77f95c1d25e9f8b8c928006ce1"
dependencies = [ dependencies = [
"annotate-snippets", "annotate-snippets",
"base64 0.23.1", "base64 0.23.1",
@ -5136,9 +5136,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.24.0" version = "1.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9"
dependencies = [ dependencies = [
"getrandom 0.4.3", "getrandom 0.4.3",
"js-sys", "js-sys",

View File

@ -27,11 +27,11 @@ walkdir = "2"
zip = "8.6" zip = "8.6"
anyhow = "1.0" anyhow = "1.0"
uuid = "1.24.0" uuid = "1.24.1"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
serde-saphyr = "1.0.1" serde-saphyr = "1.1.0"
rand = { git = "https://github.com/rust-random/rand"} rand = { git = "https://github.com/rust-random/rand"}
prost = "0.14" prost = "0.14"

View File

@ -32,8 +32,19 @@ pub fn setup_directories(server: &Context) -> Result<PatchBukkitDirectories, Str
let patchbukkit_jar_dest = jassets.join("patchbukkit.jar"); let patchbukkit_jar_dest = jassets.join("patchbukkit.jar");
let candidates = [ let candidates = [
server_root.join("java").join("patchbukkit").join("build").join("libs").join("patchbukkit.jar"), server_root
server_root.join("patchbukkit").join("java").join("patchbukkit").join("build").join("libs").join("patchbukkit.jar"), .join("java")
.join("patchbukkit")
.join("build")
.join("libs")
.join("patchbukkit.jar"),
server_root
.join("patchbukkit")
.join("java")
.join("patchbukkit")
.join("build")
.join("libs")
.join("patchbukkit.jar"),
]; ];
for candidate in &candidates { for candidate in &candidates {

View File

@ -348,7 +348,6 @@ impl PatchBukkitEvent for pumpkin::plugin::player::player_move::PlayerMoveEvent
} }
Some(()) Some(())
} }
} }
impl PatchBukkitEvent for pumpkin::plugin::player::player_chat::PlayerChatEvent { impl PatchBukkitEvent for pumpkin::plugin::player::player_chat::PlayerChatEvent {

View File

@ -22,7 +22,10 @@ pub fn discover_jar_files(plugin_folder: &Path) -> impl Iterator<Item = PathBuf>
.canonicalize() .canonicalize()
.map_err(|e| tracing::error!("Canonicalize error: {e:?}")) .map_err(|e| tracing::error!("Canonicalize error: {e:?}"))
.ok()?; .ok()?;
if path.components().any(|c| c.as_os_str() == "patchbukkit-libs") { if path
.components()
.any(|c| c.as_os_str() == "patchbukkit-libs")
{
None None
} else { } else {
Some(path) Some(path)
@ -71,8 +74,9 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
// 1. paper-libraries.json // 1. paper-libraries.json
if let Ok(mut file) = archive.by_name("paper-libraries.json") { if let Ok(mut file) = archive.by_name("paper-libraries.json") {
let mut content = String::new(); let mut content = String::new();
if file.read_to_string(&mut content).is_ok() { if file.read_to_string(&mut content).is_ok()
if let Ok(val) = serde_json::from_str::<serde_json::Value>(&content) { && let Ok(val) = serde_json::from_str::<serde_json::Value>(&content)
{
if let Some(repos) = val.get("repositories") { if let Some(repos) = val.get("repositories") {
if let Some(map) = repos.as_object() { if let Some(map) = repos.as_object() {
for (_, v) in map { for (_, v) in map {
@ -90,8 +94,9 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
if !libraries.contains(&repo_entry) { if !libraries.contains(&repo_entry) {
libraries.push(repo_entry); libraries.push(repo_entry);
} }
} else if let Some(obj) = item.as_object() { } else if let Some(obj) = item.as_object()
if let Some(url) = obj.get("url").and_then(|u| u.as_str()) { && let Some(url) = obj.get("url").and_then(|u| u.as_str())
{
let repo_entry = format!("repo:{url}"); let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) { if !libraries.contains(&repo_entry) {
libraries.push(repo_entry); libraries.push(repo_entry);
@ -100,17 +105,16 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
} }
} }
} }
}
if let Some(deps) = val.get("dependencies") { if let Some(deps) = val.get("dependencies") {
if let Some(arr) = deps.as_array() { if let Some(arr) = deps.as_array() {
for item in arr { for item in arr {
if let Some(s) = item.as_str() { if let Some(s) = item.as_str()
if !libraries.contains(&s.to_string()) { && !libraries.contains(&s.to_string())
{
libraries.push(s.to_string()); libraries.push(s.to_string());
} }
} }
}
} else if let Some(map) = deps.as_object() { } else if let Some(map) = deps.as_object() {
for (k, v) in map { for (k, v) in map {
if let Some(ver) = v.as_str() { if let Some(ver) = v.as_str() {
@ -124,7 +128,6 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
} }
} }
} }
}
// 2. paper-libraries.list // 2. paper-libraries.list
if let Ok(mut file) = archive.by_name("paper-libraries.list") { if let Ok(mut file) = archive.by_name("paper-libraries.list") {
@ -132,14 +135,15 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
if file.read_to_string(&mut content).is_ok() { if file.read_to_string(&mut content).is_ok() {
for line in content.lines() { for line in content.lines() {
let trimmed = line.trim(); let trimmed = line.trim();
if !trimmed.is_empty() && !trimmed.starts_with('#') { if !trimmed.is_empty()
if !libraries.contains(&trimmed.to_string()) { && !trimmed.starts_with('#')
&& !libraries.contains(&trimmed.to_string())
{
libraries.push(trimmed.to_string()); libraries.push(trimmed.to_string());
} }
} }
} }
} }
}
libraries libraries
} }
@ -159,7 +163,8 @@ mod tests {
let file = File::create(&jar_path).unwrap(); let file = File::create(&jar_path).unwrap();
let mut zip = zip::ZipWriter::new(file); let mut zip = zip::ZipWriter::new(file);
zip.start_file("paper-libraries.json", SimpleFileOptions::default()).unwrap(); zip.start_file("paper-libraries.json", SimpleFileOptions::default())
.unwrap();
let json = r#"{ let json = r#"{
"repositories": { "repositories": {
"miraculixx": "https://repo.miraculixx.de" "miraculixx": "https://repo.miraculixx.de"

View File

@ -1,9 +1,6 @@
use pumpkin_util::permission::{Permission, PermissionDefault}; use pumpkin_util::permission::{Permission, PermissionDefault};
use crate::{ use crate::{commands::init_java_command, proto::patchbukkit::command::RegisterCommandRequest};
commands::init_java_command,
proto::patchbukkit::command::RegisterCommandRequest,
};
pub fn ffi_native_bridge_register_command_impl(request: RegisterCommandRequest) -> Option<()> { pub fn ffi_native_bridge_register_command_impl(request: RegisterCommandRequest) -> Option<()> {
let context = super::CALLBACK_CONTEXT.get()?; let context = super::CALLBACK_CONTEXT.get()?;
@ -37,12 +34,7 @@ pub fn ffi_native_bridge_register_command_impl(request: RegisterCommandRequest)
} }
} }
let node = init_java_command( let node = init_java_command(cmd_name.clone(), command_tx, names, description);
cmd_name.clone(),
command_tx,
names,
description,
);
let clean_perm = cmd_name.trim_start_matches('/'); let clean_perm = cmd_name.trim_start_matches('/');
let permission = format!("patchbukkit:command.{clean_perm}"); let permission = format!("patchbukkit:command.{clean_perm}");

View File

@ -157,9 +157,8 @@ pub fn ffi_native_bridge_is_op_impl(
if !is_op { if !is_op {
let op_config = tokio::task::block_in_place(|| { let op_config = tokio::task::block_in_place(|| {
ctx.runtime.block_on(async { ctx.runtime
ctx.plugin_context.server.data.operator_config.read().await .block_on(async { ctx.plugin_context.server.data.operator_config.read().await })
})
}); });
if op_config.get_entry(&player_uuid).is_some() { if op_config.get_entry(&player_uuid).is_some() {
is_op = true; is_op = true;
@ -170,13 +169,11 @@ pub fn ffi_native_bridge_is_op_impl(
}) })
.unwrap_or_else(|| { .unwrap_or_else(|| {
let op_config = tokio::task::block_in_place(|| { let op_config = tokio::task::block_in_place(|| {
ctx.runtime.block_on(async { ctx.runtime
ctx.plugin_context.server.data.operator_config.read().await .block_on(async { ctx.plugin_context.server.data.operator_config.read().await })
})
}); });
op_config.get_entry(&player_uuid).is_some() op_config.get_entry(&player_uuid).is_some()
}); });
Some(crate::proto::patchbukkit::entity::IsOpResponse { is_op }) Some(crate::proto::patchbukkit::entity::IsOpResponse { is_op })
} }

View File

@ -60,11 +60,7 @@ pub fn ffi_native_bridge_set_block_data_impl(request: SetBlockDataRequest) -> Op
ctx.runtime.spawn(async move { ctx.runtime.spawn(async move {
world world
.set_block_state( .set_block_state(&pos, state_id, pumpkin::world::BlockFlags::NOTIFY_ALL)
&pos,
state_id,
pumpkin::world::BlockFlags::NOTIFY_ALL,
)
.await; .await;
}); });

View File

@ -163,7 +163,10 @@ impl CommandManager {
], ],
) { ) {
Ok(inst) => { Ok(inst) => {
if jvm.invoke(&inst, "getName", InvocationArg::empty()).is_err() { if jvm
.invoke(&inst, "getName", InvocationArg::empty())
.is_err()
{
tracing::error!( tracing::error!(
"Failed to create PluginCommand for {}: Java returned null", "Failed to create PluginCommand for {}: Java returned null",
cmd_name cmd_name

View File

@ -224,12 +224,12 @@ impl PluginManager {
for item in arr { for item in arr {
if let Some(s) = item.as_str() { if let Some(s) = item.as_str() {
libraries.push(format!("repo:{s}")); libraries.push(format!("repo:{s}"));
} else if let Some(obj) = item.as_object() { } else if let Some(obj) = item.as_object()
if let Some(u) = obj.get("url").and_then(|v| v.as_str()) { && let Some(u) = obj.get("url").and_then(|v| v.as_str())
{
libraries.push(format!("repo:{u}")); libraries.push(format!("repo:{u}"));
} }
} }
}
} else if let Some(map) = repos.as_object() { } else if let Some(map) = repos.as_object() {
for (_, v) in map { for (_, v) in map {
if let Some(s) = v.as_str() { if let Some(s) = v.as_str() {

View File

@ -22,10 +22,7 @@ use tokio::sync::{
use crate::{ use crate::{
config::patchbukkit::PatchBukkitConfig, config::patchbukkit::PatchBukkitConfig,
java::{ java::{
jvm::{ jvm::{commands::JvmCommand, worker::JvmWorker},
commands::JvmCommand,
worker::JvmWorker,
},
resources::setup_j4rs, resources::setup_j4rs,
}, },
}; };
@ -42,8 +39,6 @@ async fn on_load_inner(plugin: &PatchBukkitPlugin, server: Arc<Context>) -> Resu
let config = PatchBukkitConfig::get_or_create(config_path) let config = PatchBukkitConfig::get_or_create(config_path)
.map_err(|e| format!("Failed to setup PatchBukkit config: {e}"))?; .map_err(|e| format!("Failed to setup PatchBukkit config: {e}"))?;
// Manage embedded resources // Manage embedded resources
setup_j4rs(&dirs.j4rs).map_err(|e| format!("Failed to setup J4RS: {e}"))?; setup_j4rs(&dirs.j4rs).map_err(|e| format!("Failed to setup J4RS: {e}"))?;