本帖最后由 cnYeqi 于 2023-10-25 20:45 编辑
如题,我使用如下方法监听按钮触发和保护按钮,但是getHolder时发现,打开的gui玩家背包那部分点击物品时获得的是Player Holder,可以按住shift+左键把物品强行放到菜单里.有没有什么优雅的方法解决这个问题?
public void onClick(InventoryClickEvent e){
if(e.getClickedInventory()==null || e.getClickedInventory().getHolder()==null){
return;
}
if(e.getClickedInventory().getHolder() instanceof MagicGui) {
MagicGui gui = (MagicGui) e.getClickedInventory().getHolder();
int slot = e.getSlot();
if (!gui.getUnLimitSlots().contains(slot)) {
e.setCancelled(true);
}
gui.getContext().putVariable("slot", slot);
gui.getContext().putVariable("item", new ItemStackResult(e.getCurrentItem()));
gui.getContext().putVariable("click", e.getClick().name());
gui.getContext().putVariable("action", e.getAction().name());
gui.executeSpell(slot, (Player) e.getWhoClicked());
}
}
如题,我使用如下方法监听按钮触发和保护按钮,但是getHolder时发现,打开的gui玩家背包那部分点击物品时获得的是Player Holder,可以按住shift+左键把物品强行放到菜单里.有没有什么优雅的方法解决这个问题?
public void onClick(InventoryClickEvent e){
if(e.getClickedInventory()==null || e.getClickedInventory().getHolder()==null){
return;
}
if(e.getClickedInventory().getHolder() instanceof MagicGui) {
MagicGui gui = (MagicGui) e.getClickedInventory().getHolder();
int slot = e.getSlot();
if (!gui.getUnLimitSlots().contains(slot)) {
e.setCancelled(true);
}
gui.getContext().putVariable("slot", slot);
gui.getContext().putVariable("item", new ItemStackResult(e.getCurrentItem()));
gui.getContext().putVariable("click", e.getClick().name());
gui.getContext().putVariable("action", e.getAction().name());
gui.executeSpell(slot, (Player) e.getWhoClicked());
}
}
InventoryDragEvent
nsju7 发表于 2023-10-25 20:50
InventoryDragEvent
这个不能解决这个问题,我自行解决了,不通过getClick获得背包,而是直接从事件获得背包就可以了
可以添加额外的条件来检查是否点击的是GUI中的物品,而不是玩家背包中的物品。通常,GUI中的物品会具有某种特定的标识,例如一个特殊的物品或特定的slot范围。
public void onClick(InventoryClickEvent e) {
if (e.getClickedInventory() == null || e.getClickedInventory().getHolder() == null) {
return;
}
if (e.getClickedInventory().getHolder() instanceof MagicGui) {
MagicGui gui = (MagicGui) e.getClickedInventory().getHolder();
int slot = e.getSlot();
// Check if the slot is within the valid range for GUI items
if (gui.isValidSlot(slot)) {
e.setCancelled(true);
gui.getContext().putVariable("slot", slot);
gui.getContext().putVariable("item", new ItemStackResult(e.getCurrentItem()));
gui.getContext().putVariable("click", e.getClick().name());
gui.getContext().putVariable("action", e.getAction().name());
gui.executeSpell(slot, (Player) e.getWhoClicked());
}
}
}
public void onClick(InventoryClickEvent e) {
if (e.getClickedInventory() == null || e.getClickedInventory().getHolder() == null) {
return;
}
if (e.getClickedInventory().getHolder() instanceof MagicGui) {
MagicGui gui = (MagicGui) e.getClickedInventory().getHolder();
int slot = e.getSlot();
// Check if the slot is within the valid range for GUI items
if (gui.isValidSlot(slot)) {
e.setCancelled(true);
gui.getContext().putVariable("slot", slot);
gui.getContext().putVariable("item", new ItemStackResult(e.getCurrentItem()));
gui.getContext().putVariable("click", e.getClick().name());
gui.getContext().putVariable("action", e.getAction().name());
gui.executeSpell(slot, (Player) e.getWhoClicked());
}
}
}