Skip to content

Commit a76f639

Browse files
尝试
1 parent a585f1f commit a76f639

2 files changed

Lines changed: 46 additions & 46 deletions

File tree

src/main/java/ict/minesunshineone/landmark/gui/LandmarkMenu.java

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.bukkit.event.inventory.InventoryClickEvent;
1717
import org.bukkit.event.inventory.InventoryCloseEvent;
1818
import org.bukkit.inventory.Inventory;
19+
import org.bukkit.inventory.InventoryHolder;
1920
import org.bukkit.inventory.ItemStack;
2021
import org.bukkit.inventory.meta.ItemMeta;
2122
import org.bukkit.persistence.PersistentDataContainer;
@@ -26,24 +27,32 @@
2627
import net.kyori.adventure.text.Component;
2728
import net.kyori.adventure.text.minimessage.MiniMessage;
2829

29-
public class LandmarkMenu implements Listener {
30+
public class LandmarkMenu implements InventoryHolder, Listener {
3031

3132
private static final String LANDMARK_KEY = "landmark_name";
3233
private final LandmarkPlugin plugin;
3334
private final Player player;
34-
private final Inventory inventory;
35+
private Inventory inventory;
3536
private final MiniMessage miniMessage = MiniMessage.miniMessage();
3637
private final NamespacedKey landmarkKey;
3738

3839
public LandmarkMenu(LandmarkPlugin plugin, Player player) {
3940
this.plugin = plugin;
4041
this.player = player;
4142
this.landmarkKey = new NamespacedKey(plugin, LANDMARK_KEY);
43+
}
44+
45+
@Override
46+
public Inventory getInventory() {
47+
return inventory;
48+
}
49+
50+
public void open() {
4251
Component title = plugin.getConfigManager().getMessage("gui.title", "<gold>锚点传送菜单</gold>");
4352
int size = plugin.getConfigManager().getConfig().getInt("gui.size", 54);
44-
this.inventory = Bukkit.createInventory(null, size, title);
45-
53+
this.inventory = Bukkit.createInventory(this, size, title);
4654
initializeItems();
55+
player.openInventory(inventory);
4756
}
4857

4958
private void initializeItems() {
@@ -281,57 +290,37 @@ private void addLockedLore(List<Component> lore, Landmark landmark) {
281290
}
282291
}
283292

284-
private void updateMenu() {
285-
inventory.clear();
286-
initializeItems();
287-
}
288-
289-
public void open() {
290-
// 在打开菜单时注册监听器并更新内容
291-
plugin.getServer().getPluginManager().registerEvents(this, plugin);
292-
updateMenu();
293-
player.openInventory(inventory);
294-
}
295-
296-
public static void handleClick(InventoryClickEvent event) {
297-
if (!(event.getWhoClicked() instanceof Player player)) {
298-
return;
299-
}
300-
301-
LandmarkPlugin plugin = LandmarkPlugin.getInstance();
302-
if (!event.getView().title().equals(plugin.getConfigManager().getMessage("gui.title", "<gold>锚点传送菜单</gold>"))) {
303-
return;
304-
}
305-
293+
public void onClick(int slot, InventoryClickEvent event) {
306294
event.setCancelled(true);
307295
ItemStack clickedItem = event.getCurrentItem();
308296
if (clickedItem == null || clickedItem.getType() == Material.AIR) {
309297
return;
310298
}
311299

312300
try {
313-
ItemMeta meta = clickedItem.getItemMeta();
314-
if (meta == null) {
315-
return;
316-
}
317-
318-
PersistentDataContainer container = meta.getPersistentDataContainer();
319-
String landmarkName = container.get(new NamespacedKey(plugin, LANDMARK_KEY), PersistentDataType.STRING);
320-
321-
if (landmarkName != null && plugin.getLandmarkManager().isLandmarkUnlocked(player, landmarkName)) {
322-
plugin.getServer().getGlobalRegionScheduler().execute(plugin, () -> {
323-
if (event.getInventory().getHolder() instanceof LandmarkMenu menu) {
324-
menu.cleanup();
325-
}
326-
player.closeInventory();
327-
plugin.getLandmarkManager().teleport(player, landmarkName);
328-
});
329-
}
301+
handleItemClick(clickedItem, (Player) event.getWhoClicked());
330302
} catch (Exception e) {
331303
plugin.getSLF4JLogger().error("GUI传送处理出错: {}", e.getMessage(), e);
332304
}
333305
}
334306

307+
private void handleItemClick(ItemStack item, Player player) {
308+
ItemMeta meta = item.getItemMeta();
309+
if (meta == null) {
310+
return;
311+
}
312+
313+
PersistentDataContainer container = meta.getPersistentDataContainer();
314+
String landmarkName = container.get(landmarkKey, PersistentDataType.STRING);
315+
316+
if (landmarkName != null && plugin.getLandmarkManager().isLandmarkUnlocked(player, landmarkName)) {
317+
plugin.getServer().getGlobalRegionScheduler().execute(plugin, () -> {
318+
player.closeInventory();
319+
plugin.getLandmarkManager().teleport(player, landmarkName);
320+
});
321+
}
322+
}
323+
335324
// 添加关闭菜单时的清理方法
336325
private void cleanup() {
337326
// 清理物品栏内容

src/main/java/ict/minesunshineone/landmark/listener/PlayerListener.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
import org.bukkit.entity.Interaction;
1515
import org.bukkit.entity.Player;
1616
import org.bukkit.event.EventHandler;
17+
import org.bukkit.event.EventPriority;
1718
import org.bukkit.event.Listener;
1819
import org.bukkit.event.block.Action;
1920
import org.bukkit.event.inventory.InventoryClickEvent;
2021
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
2122
import org.bukkit.event.player.PlayerInteractEvent;
2223
import org.bukkit.event.player.PlayerMoveEvent;
2324
import org.bukkit.event.player.PlayerQuitEvent;
25+
import org.bukkit.inventory.InventoryHolder;
2426

2527
import ict.minesunshineone.landmark.LandmarkPlugin;
2628
import ict.minesunshineone.landmark.gui.LandmarkMenu;
@@ -38,9 +40,18 @@ public PlayerListener(LandmarkPlugin plugin) {
3840
this.plugin = plugin;
3941
}
4042

41-
@EventHandler
42-
public void onInventoryClick(InventoryClickEvent event) {
43-
LandmarkMenu.handleClick(event);
43+
@EventHandler(priority = EventPriority.HIGHEST)
44+
public void onClickMenu(InventoryClickEvent event) {
45+
if (event.getClickedInventory() == null) {
46+
return;
47+
}
48+
49+
InventoryHolder holder = event.getView().getTopInventory().getHolder();
50+
if (!(holder instanceof LandmarkMenu menu)) {
51+
return;
52+
}
53+
54+
menu.onClick(event.getSlot(), event);
4455
}
4556

4657
@EventHandler

0 commit comments

Comments
 (0)