Skip to content

Commit e3a7b23

Browse files
committed
feat: introduce PacketManager interface and refactor title name handling in packet events
1 parent 3904e73 commit e3a7b23

8 files changed

Lines changed: 110 additions & 65 deletions

File tree

API/src/main/java/fr/maxlego08/menu/api/MenuPlugin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.File;
2222
import java.util.List;
2323
import java.util.Map;
24+
import java.util.Optional;
2425

2526
public interface MenuPlugin extends Plugin {
2627

@@ -134,6 +135,8 @@ public interface MenuPlugin extends Plugin {
134135
*/
135136
FontImage getFontImage();
136137

138+
Optional<PacketManager> getPacketManager();
139+
137140
/**
138141
* Returns the data manager.
139142
* This method returns the data manager, which is used for managing data related to players.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package fr.maxlego08.menu.api;
2+
3+
import net.kyori.adventure.text.Component;
4+
import org.bukkit.entity.Player;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
public interface PacketManager {
8+
9+
void onLoad();
10+
11+
void onEnable();
12+
13+
void onDisable();
14+
15+
void editInventoryTitleName(@NotNull Player player, @NotNull Component title);
16+
17+
void editInventoryTitleName(@NotNull Player player, @NotNull String title);
18+
}

Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/PacketUtils.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,36 @@
33
import com.github.retrooper.packetevents.PacketEvents;
44
import com.github.retrooper.packetevents.event.EventManager;
55
import com.github.retrooper.packetevents.event.PacketListenerPriority;
6+
import com.github.retrooper.packetevents.manager.player.PlayerManager;
7+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerOpenWindow;
68
import fr.maxlego08.menu.api.Inventory;
79
import fr.maxlego08.menu.api.InventoryListener;
810
import fr.maxlego08.menu.api.MenuPlugin;
11+
import fr.maxlego08.menu.api.PacketManager;
912
import fr.maxlego08.menu.api.configuration.Configuration;
1013
import fr.maxlego08.menu.api.engine.BaseInventory;
1114
import fr.maxlego08.menu.api.engine.InventoryEngine;
1215
import fr.maxlego08.menu.api.engine.ItemButton;
1316
import fr.maxlego08.menu.api.utils.CompatibilityUtil;
17+
import fr.maxlego08.menu.api.utils.PaperMetaUpdater;
1418
import fr.maxlego08.menu.hooks.packetevents.listener.PacketAnimationListener;
1519
import fr.maxlego08.menu.hooks.packetevents.listener.PacketEventClickLimiterListener;
1620
import fr.maxlego08.menu.hooks.packetevents.listener.PacketTitleListener;
1721
import fr.maxlego08.menu.zcore.logger.Logger;
1822
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
23+
import net.kyori.adventure.text.Component;
1924
import org.bukkit.entity.Player;
2025
import org.bukkit.inventory.InventoryHolder;
2126
import org.bukkit.inventory.ItemStack;
27+
import org.jetbrains.annotations.NotNull;
2228

2329
import java.util.HashMap;
2430
import java.util.Map;
2531
import java.util.UUID;
2632

27-
public class PacketUtils implements InventoryListener {
33+
public class PacketUtils implements InventoryListener, PacketManager {
34+
private final PlayerManager playerManager = PacketEvents.getAPI().getPlayerManager();
35+
2836
private PacketAnimationListener packetAnimationListener;
2937
private PacketTitleListener packetTitleListener;
3038

@@ -35,11 +43,13 @@ public PacketUtils(MenuPlugin plugin) {
3543
this.plugin = plugin;
3644
}
3745

46+
@Override
3847
public void onLoad() {
3948
PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this.plugin));
4049
PacketEvents.getAPI().load();
4150
}
4251

52+
@Override
4353
public void onEnable() {
4454
PacketEvents.getAPI().init();
4555
EventManager eventManager = PacketEvents.getAPI().getEventManager();
@@ -52,6 +62,7 @@ public void onEnable() {
5262
}
5363
}
5464

65+
@Override
5566
public void onDisable() {
5667
PacketEvents.getAPI().terminate();
5768
}
@@ -110,4 +121,24 @@ public PacketAnimationListener getPacketAnimationListener() {
110121
public PacketTitleListener getPacketTitleListener() {
111122
return packetTitleListener;
112123
}
124+
125+
@Override
126+
public void editInventoryTitleName(@NotNull Player player, @NotNull Component title) {
127+
this.packetTitleListener.getPlayerPacketInformation(player.getUniqueId()).ifPresent(playerPacketInformation -> {
128+
WrapperPlayServerOpenWindow wrapperPlayServerOpenWindow = playerPacketInformation.getWrapperPlayServerOpenWindow();
129+
WrapperPlayServerOpenWindow newWrapperPlayServerOpenWindow1 = new WrapperPlayServerOpenWindow(wrapperPlayServerOpenWindow.getContainerId(),
130+
wrapperPlayServerOpenWindow.getType(),
131+
title);
132+
this.playerManager.sendPacket(player, newWrapperPlayServerOpenWindow1);
133+
this.playerManager.sendPacket(player, playerPacketInformation.getWrapperPlayServerWindowItems());
134+
});
135+
}
136+
137+
@Override
138+
public void editInventoryTitleName(@NotNull Player player, @NotNull String title) {
139+
if (this.plugin.getMetaUpdater() instanceof PaperMetaUpdater paperMetaUpdater) {
140+
Component component = paperMetaUpdater.getComponent(title);
141+
this.editInventoryTitleName(player, component);
142+
}
143+
}
113144
}
Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,26 @@
11
package fr.maxlego08.menu.hooks.packetevents.action;
22

3-
import com.github.retrooper.packetevents.PacketEvents;
4-
import com.github.retrooper.packetevents.manager.player.PlayerManager;
5-
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerOpenWindow;
3+
import fr.maxlego08.menu.api.PacketManager;
64
import fr.maxlego08.menu.api.button.Button;
75
import fr.maxlego08.menu.api.engine.InventoryEngine;
8-
import fr.maxlego08.menu.api.utils.PaperMetaUpdater;
96
import fr.maxlego08.menu.api.utils.Placeholders;
107
import fr.maxlego08.menu.common.utils.ActionHelper;
11-
import fr.maxlego08.menu.hooks.packetevents.listener.PacketTitleListener;
12-
import net.kyori.adventure.text.Component;
138
import org.bukkit.entity.Player;
149
import org.jetbrains.annotations.NotNull;
1510
import org.jetbrains.annotations.Nullable;
1611

1712
public class PacketEventChangeTitleName extends ActionHelper {
18-
private final PaperMetaUpdater metaUpdater;
19-
private final PacketTitleListener packetTitleListener;
2013
private final String newInventoryName;
21-
private final PlayerManager playerManager = PacketEvents.getAPI().getPlayerManager();
14+
private final PacketManager packetManager;
2215

23-
public PacketEventChangeTitleName(@NotNull PaperMetaUpdater metaUpdater, PacketTitleListener packetTitleListener, String newInventoryName) {
24-
this.metaUpdater = metaUpdater;
25-
this.packetTitleListener = packetTitleListener;
16+
17+
public PacketEventChangeTitleName(String newInventoryName, PacketManager packetManager) {
2618
this.newInventoryName = newInventoryName;
19+
this.packetManager = packetManager;
2720
}
2821

2922
@Override
3023
protected void execute(@NotNull Player player, @Nullable Button button, @NotNull InventoryEngine inventoryEngine, @NotNull Placeholders placeholders) {
31-
Component component = metaUpdater.getComponent(papi(placeholders.parse(this.newInventoryName), player));
32-
PacketTitleListener.PlayerPacketInformation playerPacketInformation = this.packetTitleListener.getPlayerPacketInformation(player.getUniqueId());
33-
if (playerPacketInformation != null) {
34-
WrapperPlayServerOpenWindow wrapperPlayServerOpenWindow = playerPacketInformation.getWrapperPlayServerOpenWindow();
35-
WrapperPlayServerOpenWindow newWrapperPlayServerOpenWindow1 = new WrapperPlayServerOpenWindow(wrapperPlayServerOpenWindow.getContainerId(),
36-
wrapperPlayServerOpenWindow.getType(),
37-
component);
38-
this.playerManager.sendPacket(player, newWrapperPlayServerOpenWindow1);
39-
this.playerManager.sendPacket(player, playerPacketInformation.getWrapperPlayServerWindowItems());
40-
}
24+
this.packetManager.editInventoryTitleName(player, papi(placeholders.parse(this.newInventoryName), player));
4125
}
4226
}

Hooks/PacketEvents/src/main/java/fr/maxlego08/menu/hooks/packetevents/listener/PacketTitleListener.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import java.util.HashMap;
1212
import java.util.Map;
13+
import java.util.Optional;
1314
import java.util.UUID;
1415

1516
public class PacketTitleListener implements PacketListener {
@@ -40,30 +41,35 @@ public void setWrapperPlayServerOpenWindow(WrapperPlayServerOpenWindow wrapperPl
4041
public void onPacketSend(PacketSendEvent event) {
4142
//TODO: Only store packets for players who have menus open from zMenu
4243
PacketTypeCommon packetType = event.getPacketType();
43-
if (packetType == PacketType.Play.Server.OPEN_WINDOW){
44-
WrapperPlayServerOpenWindow wrapper = new WrapperPlayServerOpenWindow(event);
45-
Player player = event.getPlayer();
46-
if (player == null) return;
47-
UUID playerUniqueId = player.getUniqueId();
48-
this.playerPacketInformation.computeIfAbsent(playerUniqueId, k -> new PlayerPacketInformation())
49-
.setWrapperPlayServerOpenWindow(wrapper);
50-
} else if (packetType == PacketType.Play.Server.CLOSE_WINDOW){
51-
Player player = event.getPlayer();
52-
if (player == null) return;
53-
UUID playerUniqueId = player.getUniqueId();
54-
this.playerPacketInformation.remove(playerUniqueId);
55-
} else if (packetType == PacketType.Play.Server.WINDOW_ITEMS){
56-
WrapperPlayServerWindowItems wrapper = new WrapperPlayServerWindowItems(event);
57-
Player player = event.getPlayer();
58-
if (player == null) return;
59-
UUID playerUniqueId = player.getUniqueId();
60-
this.playerPacketInformation.computeIfAbsent(playerUniqueId, k -> new PlayerPacketInformation())
61-
.setWrapperPlayServerWindowItems(wrapper);
44+
switch (packetType) {
45+
case PacketType.Play.Server.OPEN_WINDOW -> {
46+
WrapperPlayServerOpenWindow wrapper = new WrapperPlayServerOpenWindow(event);
47+
Player player = event.getPlayer();
48+
if (player == null) return;
49+
UUID playerUniqueId = player.getUniqueId();
50+
this.playerPacketInformation.computeIfAbsent(playerUniqueId, k -> new PlayerPacketInformation())
51+
.setWrapperPlayServerOpenWindow(wrapper);
52+
}
53+
case PacketType.Play.Server.CLOSE_WINDOW -> {
54+
Player player = event.getPlayer();
55+
if (player == null) return;
56+
UUID playerUniqueId = player.getUniqueId();
57+
this.playerPacketInformation.remove(playerUniqueId);
58+
}
59+
case PacketType.Play.Server.WINDOW_ITEMS -> {
60+
WrapperPlayServerWindowItems wrapper = new WrapperPlayServerWindowItems(event);
61+
Player player = event.getPlayer();
62+
if (player == null) return;
63+
UUID playerUniqueId = player.getUniqueId();
64+
this.playerPacketInformation.computeIfAbsent(playerUniqueId, k -> new PlayerPacketInformation())
65+
.setWrapperPlayServerWindowItems(wrapper);
66+
}
67+
default -> {}
6268
}
6369
}
6470

65-
public PlayerPacketInformation getPlayerPacketInformation(UUID playerUUID) {
66-
return this.playerPacketInformation.get(playerUUID);
71+
public Optional<PlayerPacketInformation> getPlayerPacketInformation(UUID playerUUID) {
72+
return Optional.ofNullable(this.playerPacketInformation.get(playerUUID));
6773
}
6874

6975

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
11
package fr.maxlego08.menu.hooks.packetevents.loader;
22

3+
import fr.maxlego08.menu.api.PacketManager;
34
import fr.maxlego08.menu.api.loader.ActionLoader;
45
import fr.maxlego08.menu.api.requirement.Action;
5-
import fr.maxlego08.menu.api.utils.PaperMetaUpdater;
66
import fr.maxlego08.menu.api.utils.TypedMapAccessor;
77
import fr.maxlego08.menu.hooks.packetevents.action.PacketEventChangeTitleName;
8-
import fr.maxlego08.menu.hooks.packetevents.listener.PacketTitleListener;
98
import org.jetbrains.annotations.NotNull;
109
import org.jetbrains.annotations.Nullable;
1110

1211
import java.io.File;
1312

1413
public class PacketEventChangeTitleNameLoader extends ActionLoader {
15-
private final PaperMetaUpdater metaUpdater;
16-
private final PacketTitleListener packetTitleListener;
14+
private final PacketManager packetManager;
1715

18-
public PacketEventChangeTitleNameLoader(PaperMetaUpdater metaUpdater, PacketTitleListener packetTitleListener) {
16+
public PacketEventChangeTitleNameLoader(PacketManager packetManager) {
1917
super("change-title", "change-title-name");
20-
this.metaUpdater = metaUpdater;
21-
this.packetTitleListener = packetTitleListener;
18+
this.packetManager = packetManager;
2219
}
2320

2421
@Override
2522
public @Nullable Action load(@NotNull String path, @NotNull TypedMapAccessor accessor, @NotNull File file) {
2623
String newInventoryName = accessor.getString("inventory-name", "menu");
27-
return new PacketEventChangeTitleName(this.metaUpdater, this.packetTitleListener, newInventoryName);
24+
return new PacketEventChangeTitleName(newInventoryName, this.packetManager);
2825
}
2926
}

src/main/java/fr/maxlego08/menu/ZInventoryManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,9 @@ public void loadButtons() {
410410
buttonManager.registerAction(new DialogLoader(this.plugin, this.plugin.getDialogManager()));
411411
}
412412
if (this.plugin.isEnable(Plugins.PACKETEVENTS)) {
413-
if (this.plugin.getMetaUpdater() instanceof PaperMetaUpdater paperMetaUpdater)
414-
buttonManager.registerAction(new PacketEventChangeTitleNameLoader(paperMetaUpdater, this.plugin.getPacketUtils().getPacketTitleListener()));
413+
414+
Optional<PacketManager> packetManager = this.plugin.getPacketManager();
415+
packetManager.ifPresent(manager -> buttonManager.registerAction(new PacketEventChangeTitleNameLoader(manager)));
415416
}
416417

417418
// Loading ButtonLoader

src/main/java/fr/maxlego08/menu/ZMenuPlugin.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public class ZMenuPlugin extends ZPlugin implements MenuPlugin {
118118
private DupeManager dupeManager;
119119
private FontImage fontImage = new EmptyFont();
120120
private MetaUpdater metaUpdater = new ClassicMeta();
121-
private PacketUtils packetUtils;
121+
private PacketManager packetManager;
122122

123123
public static ZMenuPlugin getInstance() {
124124
return instance;
@@ -127,8 +127,10 @@ public static ZMenuPlugin getInstance() {
127127
@Override
128128
public void onLoad() {
129129
if (this.isActive(Plugins.PACKETEVENTS)) {
130-
this.packetUtils = new PacketUtils(this);
131-
this.packetUtils.onLoad();
130+
this.packetManager = new PacketUtils(this);
131+
}
132+
if (this.packetManager != null) {
133+
this.packetManager.onLoad();
132134
}
133135
}
134136

@@ -140,8 +142,8 @@ public void onEnable() {
140142
this.saveDefaultConfig();
141143
Configuration.getInstance().load(getConfig());
142144

143-
if (this.packetUtils != null) {
144-
this.packetUtils.onEnable();
145+
if (this.packetManager != null) {
146+
this.packetManager.onEnable();
145147
}
146148

147149
this.scheduler = this.foliaLib.getScheduler();
@@ -407,8 +409,9 @@ private List<String> getInventoriesFiles() {
407409
@Override
408410
public void onDisable() {
409411

410-
if (this.packetUtils != null)
411-
this.packetUtils.onDisable();
412+
if (this.packetManager != null) {
413+
this.packetManager.onDisable();
414+
}
412415

413416
this.preDisable();
414417

@@ -536,6 +539,12 @@ public MenuItemStack loadItemStack(YamlConfiguration configuration, String path,
536539
return this.inventoryManager.loadItemStack(configuration, path, file);
537540
}
538541

542+
@Override
543+
public Optional<PacketManager> getPacketManager() {
544+
return Optional.ofNullable(this.packetManager);
545+
546+
}
547+
539548
/**
540549
* Returns the class that will manage the website
541550
*
@@ -554,10 +563,6 @@ public CommandMenu getCommandMenu() {
554563
return commandMenu;
555564
}
556565

557-
public PacketUtils getPacketUtils() {
558-
return packetUtils;
559-
}
560-
561566
@Override
562567
public DataManager getDataManager() {
563568
return dataManager;

0 commit comments

Comments
 (0)