SPIGOT-7380: Add PlayerInteractEvent#getClickedPosition and ChiseledBookshelf#getSlot

By: Jishuna <joshl5324@gmail.com>
This commit is contained in:
Bukkit/Spigot 2023-06-17 14:31:36 +10:00
parent 6b90c83282
commit 8f69d9dde3
2 changed files with 33 additions and 0 deletions

View file

@ -2,6 +2,7 @@ package org.bukkit.block;
import org.bukkit.inventory.BlockInventoryHolder; import org.bukkit.inventory.BlockInventoryHolder;
import org.bukkit.inventory.ChiseledBookshelfInventory; import org.bukkit.inventory.ChiseledBookshelfInventory;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@ -37,4 +38,16 @@ public interface ChiseledBookshelf extends TileState, BlockInventoryHolder {
*/ */
@NotNull @NotNull
ChiseledBookshelfInventory getSnapshotInventory(); ChiseledBookshelfInventory getSnapshotInventory();
/**
* Gets the appropriate slot based on a vector relative to this block.<br>
* Will return -1 if the given vector is not within the bounds of any slot.
* <p>
* The supplied vector should only contain components with values between 0.0
* and 1.0, inclusive.
*
* @param position a vector relative to this block
* @return the slot under the given vector or -1
*/
int getSlot(@NotNull Vector position);
} }

View file

@ -10,6 +10,7 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockCanBuildEvent; import org.bukkit.event.block.BlockCanBuildEvent;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -34,18 +35,24 @@ public class PlayerInteractEvent extends PlayerEvent implements Cancellable {
private Result useClickedBlock; private Result useClickedBlock;
private Result useItemInHand; private Result useItemInHand;
private EquipmentSlot hand; private EquipmentSlot hand;
private Vector clickedPosistion;
public PlayerInteractEvent(@NotNull final Player who, @NotNull final Action action, @Nullable final ItemStack item, @Nullable final Block clickedBlock, @NotNull final BlockFace clickedFace) { public PlayerInteractEvent(@NotNull final Player who, @NotNull final Action action, @Nullable final ItemStack item, @Nullable final Block clickedBlock, @NotNull final BlockFace clickedFace) {
this(who, action, item, clickedBlock, clickedFace, EquipmentSlot.HAND); this(who, action, item, clickedBlock, clickedFace, EquipmentSlot.HAND);
} }
public PlayerInteractEvent(@NotNull final Player who, @NotNull final Action action, @Nullable final ItemStack item, @Nullable final Block clickedBlock, @NotNull final BlockFace clickedFace, @Nullable final EquipmentSlot hand) { public PlayerInteractEvent(@NotNull final Player who, @NotNull final Action action, @Nullable final ItemStack item, @Nullable final Block clickedBlock, @NotNull final BlockFace clickedFace, @Nullable final EquipmentSlot hand) {
this(who, action, item, clickedBlock, clickedFace, hand, null);
}
public PlayerInteractEvent(@NotNull final Player who, @NotNull final Action action, @Nullable final ItemStack item, @Nullable final Block clickedBlock, @NotNull final BlockFace clickedFace, @Nullable final EquipmentSlot hand, @Nullable final Vector clickedPosition) {
super(who); super(who);
this.action = action; this.action = action;
this.item = item; this.item = item;
this.blockClicked = clickedBlock; this.blockClicked = clickedBlock;
this.blockFace = clickedFace; this.blockFace = clickedFace;
this.hand = hand; this.hand = hand;
this.clickedPosistion = clickedPosition;
useItemInHand = Result.DEFAULT; useItemInHand = Result.DEFAULT;
useClickedBlock = clickedBlock == null ? Result.DENY : Result.ALLOW; useClickedBlock = clickedBlock == null ? Result.DENY : Result.ALLOW;
@ -221,6 +228,19 @@ public class PlayerInteractEvent extends PlayerEvent implements Cancellable {
return hand; return hand;
} }
/**
* Gets the exact position on the block the player interacted with, this will
* be null outside of {@link Action#RIGHT_CLICK_BLOCK}.
* <p>
* All vector components are between 0.0 and 1.0 inclusive.
*
* @return the clicked position. May be null.
*/
@Nullable
public Vector getClickedPosition() {
return clickedPosistion;
}
@NotNull @NotNull
@Override @Override
public HandlerList getHandlers() { public HandlerList getHandlers() {