Skip to content

Commit 527172e

Browse files
authored
feat: menu lib (#22)
1 parent b8e5f7b commit 527172e

File tree

6 files changed

+237
-1
lines changed

6 files changed

+237
-1
lines changed

src/main/java/com/slampvp/factory/FactoryServer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.slampvp.factory;
22

33
import com.slampvp.factory.command.FactoryCommand;
4+
import com.slampvp.factory.common.menu.MenuListener;
45
import com.slampvp.factory.database.DatabaseManager;
56
import com.slampvp.factory.player.PlayerListener;
67
import com.slampvp.factory.plot.PlotGenerator;
@@ -41,6 +42,7 @@ public static void main(String[] args) {
4142
instanceContainer.setTimeRate(0);
4243

4344
new PlayerListener(instanceContainer);
45+
new MenuListener();
4446

4547
PlotManager.getInstance().init();
4648
DatabaseManager.getInstance().init();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.slampvp.factory.common.menu;
2+
3+
import net.kyori.adventure.text.TextComponent;
4+
import net.minestom.server.entity.Player;
5+
import net.minestom.server.event.inventory.InventoryCloseEvent;
6+
import net.minestom.server.event.inventory.InventoryOpenEvent;
7+
import net.minestom.server.inventory.Inventory;
8+
import net.minestom.server.inventory.InventoryType;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.util.List;
12+
import java.util.Optional;
13+
14+
public interface Menu {
15+
@NotNull
16+
TextComponent name();
17+
18+
@NotNull
19+
InventoryType type();
20+
21+
@NotNull
22+
List<MenuItem> items();
23+
24+
default Optional<MenuItem> itemBySlot(int slot) {
25+
return items().stream()
26+
.filter(menuItem -> menuItem.slots().contains(slot))
27+
.findFirst();
28+
}
29+
30+
default void open(Player player) {
31+
MenuManager.getInstance().setOpenMenu(player, this);
32+
33+
Inventory inventory = new Inventory(type(), name());
34+
35+
items().forEach(menuItem -> menuItem.slots().forEach(slot -> inventory.setItemStack(slot, menuItem.itemStack())));
36+
37+
player.openInventory(inventory);
38+
}
39+
40+
default void onOpen(InventoryOpenEvent event) {
41+
}
42+
43+
default void onClose(InventoryCloseEvent event) {
44+
}
45+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.slampvp.factory.common.menu;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.format.NamedTextColor;
5+
import net.kyori.adventure.text.format.TextDecoration;
6+
import net.minestom.server.entity.Player;
7+
import net.minestom.server.event.inventory.InventoryPreClickEvent;
8+
import net.minestom.server.item.ItemStack;
9+
import net.minestom.server.item.Material;
10+
11+
import java.util.List;
12+
import java.util.function.Consumer;
13+
import java.util.function.Function;
14+
import java.util.stream.IntStream;
15+
16+
public record MenuItem(List<Integer> slots, ItemStack itemStack, ClickAction action) {
17+
public static Function<Integer, MenuItem> CLOSE = slot ->
18+
new MenuItem(slot,
19+
ItemStack.of(Material.BARRIER)
20+
.withCustomName(Component.text("Close").color(NamedTextColor.DARK_RED).decorate(TextDecoration.BOLD)),
21+
event -> {
22+
Player player = event.getPlayer();
23+
player.closeInventory();
24+
MenuManager.getInstance().clearOpenMenu(player);
25+
});
26+
27+
public MenuItem(IntStream stream, ItemStack itemStack) {
28+
this(stream.boxed().toList(), itemStack, new ClickAction() {
29+
});
30+
}
31+
32+
public MenuItem(IntStream stream, ItemStack itemStack, ClickAction action) {
33+
this(stream.boxed().toList(), itemStack, action);
34+
}
35+
36+
public MenuItem(IntStream stream, ItemStack itemStack, Consumer<InventoryPreClickEvent> consumer) {
37+
this(stream.boxed().toList(), itemStack, true, consumer);
38+
}
39+
40+
public MenuItem(IntStream stream, ItemStack itemStack, boolean cancel, Consumer<InventoryPreClickEvent> consumer) {
41+
this(stream.boxed().toList(), itemStack, cancel, consumer);
42+
}
43+
44+
public MenuItem(List<Integer> slots, ItemStack itemStack) {
45+
this(slots, itemStack, new ClickAction() {
46+
});
47+
}
48+
49+
public MenuItem(List<Integer> slots, ItemStack itemStack, Consumer<InventoryPreClickEvent> consumer) {
50+
this(slots, itemStack, true, consumer);
51+
}
52+
53+
public MenuItem(List<Integer> slots, ItemStack itemStack, boolean cancel, Consumer<InventoryPreClickEvent> consumer) {
54+
this(slots, itemStack, new ClickAction() {
55+
@Override
56+
public boolean cancel() {
57+
return cancel;
58+
}
59+
60+
@Override
61+
public void onClick(InventoryPreClickEvent event) {
62+
consumer.accept(event);
63+
}
64+
});
65+
}
66+
67+
public MenuItem(int slot, ItemStack itemStack) {
68+
this(List.of(slot), itemStack, new ClickAction() {
69+
});
70+
}
71+
72+
public MenuItem(int slot, ItemStack itemStack, Consumer<InventoryPreClickEvent> consumer) {
73+
this(List.of(slot), itemStack, consumer);
74+
}
75+
76+
public MenuItem(int slot, ItemStack itemStack, boolean cancel, Consumer<InventoryPreClickEvent> consumer) {
77+
this(List.of(slot), itemStack, cancel, consumer);
78+
}
79+
80+
public interface ClickAction {
81+
default boolean cancel() {
82+
return true;
83+
}
84+
85+
default void onClick(InventoryPreClickEvent event) {
86+
}
87+
}
88+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.slampvp.factory.common.menu;
2+
3+
import net.minestom.server.MinecraftServer;
4+
import net.minestom.server.entity.Player;
5+
import net.minestom.server.event.GlobalEventHandler;
6+
import net.minestom.server.event.inventory.InventoryCloseEvent;
7+
import net.minestom.server.event.inventory.InventoryOpenEvent;
8+
import net.minestom.server.event.inventory.InventoryPreClickEvent;
9+
10+
import java.util.Optional;
11+
12+
public class MenuListener {
13+
public MenuListener() {
14+
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
15+
16+
globalEventHandler.addListener(InventoryPreClickEvent.class, event -> {
17+
Player player = event.getPlayer();
18+
Optional<Menu> optionalMenu = MenuManager.getInstance().getOpenMenu(player);
19+
20+
if (optionalMenu.isEmpty()) {
21+
return;
22+
}
23+
24+
Menu menu = optionalMenu.get();
25+
int slot = event.getSlot();
26+
27+
Optional<MenuItem> optionalMenuItem = menu.itemBySlot(slot);
28+
29+
if (optionalMenuItem.isEmpty()) {
30+
return;
31+
}
32+
33+
MenuItem item = optionalMenuItem.get();
34+
35+
if (item.action().cancel()) {
36+
event.setCancelled(true);
37+
}
38+
39+
item.action().onClick(event);
40+
});
41+
42+
globalEventHandler.addListener(InventoryOpenEvent.class, event -> {
43+
Player player = event.getPlayer();
44+
Optional<Menu> optionalMenu = MenuManager.getInstance().getOpenMenu(player);
45+
46+
if (optionalMenu.isEmpty()) {
47+
return;
48+
}
49+
50+
Menu menu = optionalMenu.get();
51+
menu.onOpen(event);
52+
});
53+
54+
globalEventHandler.addListener(InventoryCloseEvent.class, event -> {
55+
Player player = event.getPlayer();
56+
Optional<Menu> optionalMenu = MenuManager.getInstance().getOpenMenu(player);
57+
58+
if (optionalMenu.isEmpty()) {
59+
return;
60+
}
61+
62+
Menu menu = optionalMenu.get();
63+
menu.onClose(event);
64+
});
65+
}
66+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.slampvp.factory.common.menu;
2+
3+
import net.minestom.server.entity.Player;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
import java.util.Optional;
8+
import java.util.UUID;
9+
10+
public final class MenuManager {
11+
private static MenuManager instance;
12+
private final Map<UUID, Menu> openMenus;
13+
14+
private MenuManager() {
15+
this.openMenus = new HashMap<>();
16+
}
17+
18+
public static synchronized MenuManager getInstance() {
19+
if (instance == null) {
20+
instance = new MenuManager();
21+
}
22+
return instance;
23+
}
24+
25+
public Optional<Menu> getOpenMenu(Player player) {
26+
return Optional.ofNullable(openMenus.get(player.getUuid()));
27+
}
28+
29+
public void setOpenMenu(Player player, Menu menu) {
30+
openMenus.put(player.getUuid(), menu);
31+
}
32+
33+
public void clearOpenMenu(Player player) {
34+
openMenus.remove(player.getUuid());
35+
}
36+
}

src/main/java/com/slampvp/factory/player/PlayerListener.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import net.minestom.server.instance.InstanceContainer;
1212

1313
public class PlayerListener {
14-
1514
public PlayerListener(InstanceContainer instanceContainer) {
1615
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
1716

0 commit comments

Comments
 (0)