炼药锅
本帖最后由 炼药锅 于 2021-12-4 21:37 编辑


选自RarityEG的教程。我好奇为什么不使用getInventory()呢?

洞穴夜莺
说句实话,我觉得e.getView()可能是合适的

  1. /**
  2.      * Gets the view object itself
  3.      *
  4.      * [url=home.php?mod=space&uid=491268]@Return[/url] InventoryView
  5.      */
  6.     @NotNull
  7.     public InventoryView getView() {
  8.         return transaction;
  9.     }
复制代码


为什么采用getOpenInventory我觉得不如问问本人 @RarityEG

ARSpark
洞穴夜莺 发表于 2021-12-4 18:56
说句实话,我觉得e.getView()可能是合适的

(是可以啊,没问题(
选用 getOpenInventory 只是确保这个 GUI 已经被玩家打开并且正在操作(当然是我猜的


@炼药锅 getInventory 的返回值类型不对

洞穴夜莺
RarityEG 发表于 2021-12-4 20:35
(是可以啊,没问题(
选用 getOpenInventory 只是确保这个 GUI 已经被玩家打开并且正在操作(当然是我猜 ...

getOpenInventory返回的是玩家当前打开的GUI
但是在这个例子使用玩家点击的GUI(即使已经关闭)不是更合理吗?(试想原本玩家在操作一个GUI,然后另一个插件在处理事件时打开了你的GUI,然后按你这个逻辑玩家对那个已经关闭的GUI的操作就变成了对你的GUI的操作?)

没太明白

ARSpark
洞穴夜莺 发表于 2021-12-4 21:04
getOpenInventory返回的是玩家当前打开的GUI
但是在这个例子使用玩家点击的GUI(即使已经关闭)不是更合 ...

参考:
https://bdn.tdiant.net/#/unit/3-1

(那时候我才刚学插件开发,后来这个写法就成习惯了(


Durham
getInventory()方法的返回值是Inventory getOpenInventory()方法的返回值是InventoryView 用途决定了使用什么方法

炼药锅
本帖最后由 炼药锅 于 2021-12-4 22:28 编辑
RarityEG 发表于 2021-12-4 20:35
(是可以啊,没问题(
选用 getOpenInventory 只是确保这个 GUI 已经被玩家打开并且正在操作(当然是我猜 ...

@Override
public void onEnable() {
    Inventory inv = Bukkit.createInventory(Bukkit.getPlayer("RarityEG"), 3 * 9, "GUI 标题");
    Bukkit.getPluginManager().registerEvents(new Listener() {
        @EventHandler
        public void onPlayerJoinEvent(PlayerJoinEvent e) {
            e.getPlayer().openInventory(inv);
        }
        @EventHandler
        public void onInventoryClickEvent(InventoryClickEvent e) {
            if (inv.equals(e.getInventory())) {
                e.setCancelled(true);
            }
        }
    }, this);
}
1.这样也可以吧?2.Inventory和InventoryView有什么区别?
@RarityEG


ARSpark
炼药锅 发表于 2021-12-4 22:23
@Override
public void onEnable() {
    Inventory inv = Bukkit.createInventory(Bukkit.getPlayer("Rar ...

1. 你可以试试啊(
2.
Inventory:
Interface to the various inventories.

比如一个箱子里面的 27 格就是一个 Inventory,表示物品栏内容

InventoryView:
Represents a view linking two inventories and a single player (whose inventory may or may not be one of the two).

当你打开箱子时,上方箱子的 27 格,玩家的 36 格背包合起来显示给玩家的那个可见窗口就是 InventoryView
所以 Inventory 是没有 Title 的,InventoryView 才有

(说法本身可能不很正确,但基本上是这样