Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be8870502f |
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"};
|
||||
|
||||
Reference in new issue
Block a user