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

12
rust/Cargo.lock generated
View File

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

View File

@ -27,11 +27,11 @@ walkdir = "2"
zip = "8.6"
anyhow = "1.0"
uuid = "1.24.0"
uuid = "1.24.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde-saphyr = "1.0.1"
serde-saphyr = "1.1.0"
rand = { git = "https://github.com/rust-random/rand"}
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 candidates = [
server_root.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"),
server_root
.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 {

View File

@ -348,7 +348,6 @@ impl PatchBukkitEvent for pumpkin::plugin::player::player_move::PlayerMoveEvent
}
Some(())
}
}
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()
.map_err(|e| tracing::error!("Canonicalize error: {e:?}"))
.ok()?;
if path.components().any(|c| c.as_os_str() == "patchbukkit-libs") {
if path
.components()
.any(|c| c.as_os_str() == "patchbukkit-libs")
{
None
} else {
Some(path)
@ -71,53 +74,53 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
// 1. paper-libraries.json
if let Ok(mut file) = archive.by_name("paper-libraries.json") {
let mut content = String::new();
if file.read_to_string(&mut content).is_ok() {
if let Ok(val) = serde_json::from_str::<serde_json::Value>(&content) {
if let Some(repos) = val.get("repositories") {
if let Some(map) = repos.as_object() {
for (_, v) in map {
if let Some(url) = v.as_str() {
let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) {
libraries.push(repo_entry);
}
if file.read_to_string(&mut content).is_ok()
&& let Ok(val) = serde_json::from_str::<serde_json::Value>(&content)
{
if let Some(repos) = val.get("repositories") {
if let Some(map) = repos.as_object() {
for (_, v) in map {
if let Some(url) = v.as_str() {
let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) {
libraries.push(repo_entry);
}
}
} else if let Some(arr) = repos.as_array() {
for item in arr {
if let Some(url) = item.as_str() {
let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) {
libraries.push(repo_entry);
}
} else if let Some(obj) = item.as_object() {
if let Some(url) = obj.get("url").and_then(|u| u.as_str()) {
let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) {
libraries.push(repo_entry);
}
}
}
} else if let Some(arr) = repos.as_array() {
for item in arr {
if let Some(url) = item.as_str() {
let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) {
libraries.push(repo_entry);
}
} else if let Some(obj) = item.as_object()
&& let Some(url) = obj.get("url").and_then(|u| u.as_str())
{
let repo_entry = format!("repo:{url}");
if !libraries.contains(&repo_entry) {
libraries.push(repo_entry);
}
}
}
}
}
if let Some(deps) = val.get("dependencies") {
if let Some(arr) = deps.as_array() {
for item in arr {
if let Some(s) = item.as_str() {
if !libraries.contains(&s.to_string()) {
libraries.push(s.to_string());
}
}
if let Some(deps) = val.get("dependencies") {
if let Some(arr) = deps.as_array() {
for item in arr {
if let Some(s) = item.as_str()
&& !libraries.contains(&s.to_string())
{
libraries.push(s.to_string());
}
} else if let Some(map) = deps.as_object() {
for (k, v) in map {
if let Some(ver) = v.as_str() {
let coord = format!("{k}:{ver}");
if !libraries.contains(&coord) {
libraries.push(coord);
}
}
} else if let Some(map) = deps.as_object() {
for (k, v) in map {
if let Some(ver) = v.as_str() {
let coord = format!("{k}:{ver}");
if !libraries.contains(&coord) {
libraries.push(coord);
}
}
}
@ -132,10 +135,11 @@ pub fn read_libraries_from_jar<P: AsRef<Path>>(jar_path: P) -> Vec<String> {
if file.read_to_string(&mut content).is_ok() {
for line in content.lines() {
let trimmed = line.trim();
if !trimmed.is_empty() && !trimmed.starts_with('#') {
if !libraries.contains(&trimmed.to_string()) {
libraries.push(trimmed.to_string());
}
if !trimmed.is_empty()
&& !trimmed.starts_with('#')
&& !libraries.contains(&trimmed.to_string())
{
libraries.push(trimmed.to_string());
}
}
}
@ -159,7 +163,8 @@ mod tests {
let file = File::create(&jar_path).unwrap();
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#"{
"repositories": {
"miraculixx": "https://repo.miraculixx.de"

View File

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

View File

@ -157,9 +157,8 @@ pub fn ffi_native_bridge_is_op_impl(
if !is_op {
let op_config = tokio::task::block_in_place(|| {
ctx.runtime.block_on(async {
ctx.plugin_context.server.data.operator_config.read().await
})
ctx.runtime
.block_on(async { ctx.plugin_context.server.data.operator_config.read().await })
});
if op_config.get_entry(&player_uuid).is_some() {
is_op = true;
@ -170,13 +169,11 @@ pub fn ffi_native_bridge_is_op_impl(
})
.unwrap_or_else(|| {
let op_config = tokio::task::block_in_place(|| {
ctx.runtime.block_on(async {
ctx.plugin_context.server.data.operator_config.read().await
})
ctx.runtime
.block_on(async { ctx.plugin_context.server.data.operator_config.read().await })
});
op_config.get_entry(&player_uuid).is_some()
});
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 {
world
.set_block_state(
&pos,
state_id,
pumpkin::world::BlockFlags::NOTIFY_ALL,
)
.set_block_state(&pos, state_id, pumpkin::world::BlockFlags::NOTIFY_ALL)
.await;
});

View File

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

View File

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

View File

@ -22,10 +22,7 @@ use tokio::sync::{
use crate::{
config::patchbukkit::PatchBukkitConfig,
java::{
jvm::{
commands::JvmCommand,
worker::JvmWorker,
},
jvm::{commands::JvmCommand, worker::JvmWorker},
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)
.map_err(|e| format!("Failed to setup PatchBukkit config: {e}"))?;
// Manage embedded resources
setup_j4rs(&dirs.j4rs).map_err(|e| format!("Failed to setup J4RS: {e}"))?;