Skip to content

Commit ea81c84

Browse files
Copilotptthanh02
andcommitted
Fix compilation error and implement action configuration system
Co-authored-by: ptthanh02 <73684260+ptthanh02@users.noreply.github.com>
1 parent 5fd6c5a commit ea81c84

4 files changed

Lines changed: 140 additions & 2 deletions

File tree

core/src/main/java/github/nighter/smartspawner/spawner/gui/layout/GuiLayout.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public Optional<String> getButtonTypeAtSlot(int slot) {
2828
return Optional.ofNullable(slotToButtonType.get(slot));
2929
}
3030

31+
public Optional<GuiButton> getButtonAtSlot(int slot) {
32+
String buttonType = slotToButtonType.get(slot);
33+
return buttonType != null ? Optional.ofNullable(buttons.get(buttonType)) : Optional.empty();
34+
}
35+
3136
public boolean hasButton(String buttonType) {
3237
return buttons.containsKey(buttonType) && buttons.get(buttonType).isEnabled();
3338
}

core/src/main/java/github/nighter/smartspawner/spawner/gui/main/SpawnerMenuAction.java

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,16 @@ public void onMenuClick(InventoryClickEvent event) {
9393
return;
9494
}
9595

96-
Material itemType = clickedItem.getType();
96+
// Use layout-based action handling
97+
int slot = event.getRawSlot();
98+
String clickType = getClickTypeString(event.getClick());
99+
100+
if (handleLayoutAction(player, spawner, slot, clickType)) {
101+
return;
102+
}
97103

104+
// Fallback to legacy material-based handling for backward compatibility
105+
Material itemType = clickedItem.getType();
98106
if (itemType == Material.CHEST) {
99107
handleChestClick(player, spawner);
100108
} else if (SPAWNER_INFO_MATERIALS.contains(itemType)) {
@@ -104,6 +112,68 @@ public void onMenuClick(InventoryClickEvent event) {
104112
}
105113
}
106114

115+
private boolean handleLayoutAction(Player player, SpawnerData spawner, int slot, String clickType) {
116+
var layoutConfig = plugin.getGuiLayoutConfig();
117+
var layout = layoutConfig.getCurrentMainLayout();
118+
119+
if (layout == null) {
120+
return false;
121+
}
122+
123+
var buttonOpt = layout.getButtonAtSlot(slot);
124+
if (buttonOpt.isEmpty()) {
125+
return false;
126+
}
127+
128+
var button = buttonOpt.get();
129+
String action = button.getAction(clickType);
130+
131+
if (action == null) {
132+
return false;
133+
}
134+
135+
switch (action) {
136+
case "open_storage":
137+
handleChestClick(player, spawner);
138+
return true;
139+
case "toggle_info":
140+
if (isClickTooFrequent(player)) {
141+
return true;
142+
}
143+
// Check stacker permission and open stacker GUI
144+
if (!player.hasPermission("smartspawner.stack")) {
145+
messageService.sendMessage(player, "no_permission");
146+
return true;
147+
}
148+
spawnerStackerUI.openStackerGui(player, spawner);
149+
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f);
150+
return true;
151+
case "sell_inventory":
152+
if (isClickTooFrequent(player)) {
153+
return true;
154+
}
155+
// Collect EXP and sell items if shop integration is available
156+
handleExpBottleClick(player, spawner, true);
157+
handleSellAllItems(player, spawner);
158+
return true;
159+
case "collect_exp":
160+
handleExpBottleClick(player, spawner, false);
161+
return true;
162+
default:
163+
return false;
164+
}
165+
}
166+
167+
private String getClickTypeString(ClickType clickType) {
168+
return switch (clickType) {
169+
case LEFT -> "left_click";
170+
case RIGHT -> "right_click";
171+
case SHIFT_LEFT -> "shift_left_click";
172+
case SHIFT_RIGHT -> "shift_right_click";
173+
default -> "left_click";
174+
};
175+
}
176+
107177
public void handleChestClick(Player player, SpawnerData spawner) {
108178
String title = languageManager.getGuiTitle("gui_title_storage");
109179
Inventory pageInventory = spawnerStorageUI.createInventory(spawner, title, 1, -1);

core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageAction.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,70 @@ private void handleControlSlotClick(Player player, int slot, StoragePageHolder h
139139
return;
140140
}
141141

142+
Optional<GuiButton> buttonOpt = layout.getButtonAtSlot(slot);
143+
if (buttonOpt.isEmpty()) {
144+
return;
145+
}
146+
147+
GuiButton button = buttonOpt.get();
148+
149+
// For now, we'll use left_click as the default action since storage GUI
150+
// currently doesn't differentiate between click types in most cases
151+
String action = button.getAction("left_click");
152+
if (action == null) {
153+
// Fallback to legacy button type handling
154+
handleLegacyButtonType(player, slot, holder, spawner, inventory, layout);
155+
return;
156+
}
157+
158+
switch (action) {
159+
case "discard_all":
160+
handleDiscardAllItems(player, spawner, inventory);
161+
break;
162+
case "item_filter":
163+
openFilterConfig(player, spawner);
164+
break;
165+
case "previous_page":
166+
if (holder.getCurrentPage() > 1) {
167+
updatePageContent(player, spawner, holder.getCurrentPage() - 1, inventory, true);
168+
}
169+
break;
170+
case "take_all":
171+
handleTakeAllItems(player, inventory);
172+
break;
173+
case "next_page":
174+
if (holder.getCurrentPage() < holder.getTotalPages()) {
175+
updatePageContent(player, spawner, holder.getCurrentPage() + 1, inventory, true);
176+
}
177+
break;
178+
case "drop_page":
179+
handleDropPageItems(player, spawner, inventory);
180+
break;
181+
case "sell_all":
182+
if (plugin.hasSellIntegration()) {
183+
if (!player.hasPermission("smartspawner.sellall")) {
184+
messageService.sendMessage(player, "no_permission");
185+
return;
186+
}
187+
if (isClickTooFrequent(player)) {
188+
return;
189+
}
190+
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 1.0f, 1.0f);
191+
spawnerSellManager.sellAllItems(player, spawner);
192+
}
193+
break;
194+
case "return":
195+
openMainMenu(player, spawner);
196+
break;
197+
default:
198+
// Fallback to legacy handling for unknown actions
199+
handleLegacyButtonType(player, slot, holder, spawner, inventory, layout);
200+
break;
201+
}
202+
}
203+
204+
private void handleLegacyButtonType(Player player, int slot, StoragePageHolder holder,
205+
SpawnerData spawner, Inventory inventory, GuiLayout layout) {
142206
Optional<String> buttonTypeOpt = layout.getButtonTypeAtSlot(slot);
143207
if (buttonTypeOpt.isEmpty()) {
144208
return;

core/src/main/java/github/nighter/smartspawner/spawner/gui/storage/SpawnerStorageUI.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ private void initializeStaticButtons() {
129129
languageManager.getGuiItemLoreAsList("sell_button.lore")
130130
));
131131
}
132-
}
133132
}
134133

135134
public Inventory createInventory(SpawnerData spawner, String title, int page, int totalPages) {

0 commit comments

Comments
 (0)