From eb441318011bf1eb5e353f547f412190dd1670b1 Mon Sep 17 00:00:00 2001 From: Bjorn Beishline <75190918+BjornTheProgrammer@users.noreply.github.com> Date: Mon, 2 Feb 2026 16:53:54 -0700 Subject: [PATCH] Fix cancel checking causing errors --- .../events/PatchBukkitEventFactory.java | 8 +++++++ rust/src/java/plugin/event_manager.rs | 23 +++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/events/PatchBukkitEventFactory.java b/java/patchbukkit/src/main/java/org/patchbukkit/events/PatchBukkitEventFactory.java index 449c0e6..61755af 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/events/PatchBukkitEventFactory.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/events/PatchBukkitEventFactory.java @@ -2,6 +2,7 @@ package org.patchbukkit.events; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import net.kyori.adventure.text.Component; @@ -37,6 +38,13 @@ public class PatchBukkitEventFactory { return new PlayerQuitEvent(player, quitMessage, PlayerQuitEvent.QuitReason.DISCONNECTED); } + /** + * Check if an event implements Cancellable. + */ + public static boolean isCancellable(@NotNull Event event) { + return event instanceof org.bukkit.event.Cancellable; + } + /** * Look up a player by UUID string. Returns null with a warning if not found. */ diff --git a/rust/src/java/plugin/event_manager.rs b/rust/src/java/plugin/event_manager.rs index 4ff8fca..93f54af 100644 --- a/rust/src/java/plugin/event_manager.rs +++ b/rust/src/java/plugin/event_manager.rs @@ -51,13 +51,22 @@ impl EventManager { ], )?; - let cancelled = match jvm.invoke( - &jvm.clone_instance(&j_event)?, - "isCancelled", - InvocationArg::empty(), - ) { - Ok(instance) => jvm.to_rust::(instance).unwrap_or(false), - Err(_) => false, + let is_cancellable: bool = jvm.to_rust(jvm.invoke_static( + "org.patchbukkit.events.PatchBukkitEventFactory", + "isCancellable", + &[InvocationArg::from(jvm.clone_instance(&j_event)?)], + )?)?; + + let cancelled = match is_cancellable { + true => match jvm.invoke( + &jvm.clone_instance(&j_event)?, + "isCancelled", + InvocationArg::empty(), + ) { + Ok(instance) => jvm.to_rust::(instance).unwrap_or(false), + Err(_) => false, + }, + false => false, }; Ok(cancelled)