Compare commits

...
1 Commits
Author SHA1 Message Date
dmg be8870502f fix(session): prioritize native door interaction
Release / release (push) Successful in 9m57s
2026-09-21 11:57:22 -04:00
2 changed files with 41 additions and 0 deletions

No files matched your search

@@ -353,6 +353,7 @@ public final class EquipmentSessionEvents implements Listener, AutoCloseable {
if (allowed && event.getHand() == EquipmentSlot.HAND && (event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_AIR
|| event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK)) {
var selected = sessions.selectedControl(event.getPlayer(), event.getItem()).orElse(null);
if (selected != null && !selected.ability().isEmpty() && doorInteraction(event)) return;
if (selected != null && useGesture(selected)) {
org.bukkit.entity.Entity target = selected.ability().equals("hex")
|| selected.ability().equals("mending_light")
@@ -367,6 +368,12 @@ public final class EquipmentSessionEvents implements Listener, AutoCloseable {
}
}
private boolean doorInteraction(org.bukkit.event.player.PlayerInteractEvent event) {
var block = event.getClickedBlock();
return event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK && block != null
&& block.getBlockData() instanceof org.bukkit.block.data.type.Door;
}
private void beginDraw(Player player, ItemStack item, EquipmentSessions.SelectedControl selected) {
UUID owner = player.getUniqueId();
if (closed || draws.containsKey(owner) || player.hasActiveItem()) return;
@@ -1283,6 +1283,40 @@ class EquipmentSessionEventsNativeTest {
}
}
@Test void nativeDoorInteractionTakesPrecedenceOverAbilityUseAndLongbowDraw() throws Exception {
try (var f = new Fixture()) {
f.loadout("quickstep", "longbow");
var a = f.actor; f.core.activate(a);
var door = org.mockito.Mockito.mock(org.bukkit.block.Block.class);
org.mockito.Mockito.doReturn(org.mockito.Mockito.mock(org.bukkit.block.data.type.Door.class)).when(door).getBlockData();
for (int slot : new int[]{2, 3}) {
a.inventory.getInventory().setSelectedSlot(slot);
var event = new org.bukkit.event.player.PlayerInteractEvent(a.player,
org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, a.inventory.getItem(slot), door,
org.bukkit.block.BlockFace.UP, org.bukkit.inventory.EquipmentSlot.HAND);
event.setUseInteractedBlock(org.bukkit.event.Event.Result.ALLOW);
int beforeInputs = f.inputs.size(); int beforeDraws = a.useStarts;
f.dispatcher.accept(event);
assertEquals(org.bukkit.event.Event.Result.ALLOW, event.useInteractedBlock());
assertEquals(org.bukkit.event.Event.Result.DENY, event.useItemInHand());
assertEquals(beforeInputs, f.inputs.size(), "A door click is not an ability input");
assertEquals(beforeDraws, a.useStarts, "A door click does not begin Longbow drawing");
}
var stone = org.mockito.Mockito.mock(org.bukkit.block.Block.class);
org.mockito.Mockito.doReturn(org.mockito.Mockito.mock(org.bukkit.block.data.BlockData.class)).when(stone).getBlockData();
a.inventory.getInventory().setSelectedSlot(2);
var ordinaryBlock = new org.bukkit.event.player.PlayerInteractEvent(a.player,
org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, a.inventory.getItem(2), stone,
org.bukkit.block.BlockFace.UP, org.bukkit.inventory.EquipmentSlot.HAND);
f.dispatcher.accept(ordinaryBlock); assertEquals(1, f.inputs.size(), "Non-door ability use remains active");
a.inventory.getInventory().setSelectedSlot(3);
var air = new org.bukkit.event.player.PlayerInteractEvent(a.player,
org.bukkit.event.block.Action.RIGHT_CLICK_AIR, a.inventory.getItem(3), null,
org.bukkit.block.BlockFace.SELF, org.bukkit.inventory.EquipmentSlot.HAND);
f.dispatcher.accept(air); assertEquals(1, a.useStarts, "Air use still begins Longbow drawing");
}
}
@Test void selectedAbilityUseReachesItsHandlerWithoutVanillaThrowDrinkEquipBlockOrPlacement() throws Exception {
try (var f = new Fixture()) {
String[] abilities = {"chain_lightning", "purify", "guardian_bond", "shield_bash", "rallying_cry", "frost_nova", "revive"};