1+ package com .github .mori01231 .lifecore .listener ;
2+
3+ import com .github .mori01231 .lifecore .LifeCore ;
4+ import com .github .mori01231 .lifecore .util .ItemUtil ;
5+ import org .bukkit .ChatColor ;
6+ import org .bukkit .event .EventHandler ;
7+ import org .bukkit .event .Listener ;
8+ import org .bukkit .event .inventory .InventoryClickEvent ;
9+ import org .bukkit .event .inventory .InventoryDragEvent ;
10+ import org .bukkit .inventory .ItemStack ;
11+ import org .jetbrains .annotations .NotNull ;
12+
13+ public class PreventStorageBoxSellListener implements Listener {
14+ private final LifeCore plugin ;
15+
16+ public PreventStorageBoxSellListener (@ NotNull LifeCore plugin ) {
17+ this .plugin = plugin ;
18+ }
19+
20+ @ EventHandler
21+ public void onInventoryClick (InventoryClickEvent event ) {
22+ // Check if the inventory title contains "Menu" and "Sell"
23+ if (event .getView ().getTitle ().contains ("Menu" ) && event .getView ().getTitle ().contains ("Sell" )) {
24+ // Check if player is moving an item TO the sell screen (clicked inventory is the top inventory)
25+ if (event .getClickedInventory () != null && event .getClickedInventory ().equals (event .getView ().getTopInventory ())) {
26+ ItemStack item = null ;
27+
28+ // Handle different click types
29+ switch (event .getAction ()) {
30+ case PLACE_ALL :
31+ case PLACE_ONE :
32+ case PLACE_SOME :
33+ case SWAP_WITH_CURSOR :
34+ item = event .getCursor ();
35+ break ;
36+ case MOVE_TO_OTHER_INVENTORY :
37+ item = event .getCurrentItem ();
38+ break ;
39+ default :
40+ // For shift-click from player inventory
41+ if (event .isShiftClick () && event .getClickedInventory ().equals (event .getView ().getBottomInventory ())) {
42+ item = event .getCurrentItem ();
43+ }
44+ break ;
45+ }
46+
47+ if (item != null && hasStorageBoxType (item )) {
48+ event .setCancelled (true );
49+ event .getWhoClicked ().sendMessage (ChatColor .RED + "StorageBoxは売却できません。" );
50+ }
51+ }
52+
53+ // Handle shift-clicking from player inventory to sell screen
54+ if (event .isShiftClick () && event .getClickedInventory () != null
55+ && event .getClickedInventory ().equals (event .getView ().getBottomInventory ())) {
56+ ItemStack item = event .getCurrentItem ();
57+ if (item != null && hasStorageBoxType (item )) {
58+ event .setCancelled (true );
59+ event .getWhoClicked ().sendMessage (ChatColor .RED + "ストレージボックスは売却できません。" );
60+ }
61+ }
62+ }
63+ }
64+
65+ @ EventHandler
66+ public void onInventoryDrag (InventoryDragEvent event ) {
67+ // Check if the inventory title contains "Menu" and "Sell"
68+ if (event .getView ().getTitle ().contains ("Menu" ) && event .getView ().getTitle ().contains ("Sell" )) {
69+ // Check if any of the dragged slots are in the top inventory
70+ boolean isDraggingToSellScreen = event .getRawSlots ().stream ()
71+ .anyMatch (slot -> slot < event .getView ().getTopInventory ().getSize ());
72+
73+ if (isDraggingToSellScreen ) {
74+ ItemStack item = event .getOldCursor ();
75+ if (item != null && hasStorageBoxType (item )) {
76+ event .setCancelled (true );
77+ event .getWhoClicked ().sendMessage (ChatColor .RED + "ストレージボックスは売却できません。" );
78+ }
79+ }
80+ }
81+ }
82+
83+ private boolean hasStorageBoxType (@ NotNull ItemStack item ) {
84+ String storageBoxType = ItemUtil .getStringTag (item , "storageBoxType" );
85+ return storageBoxType != null && !storageBoxType .isEmpty ();
86+ }
87+ }
0 commit comments