mirror of
https://github.com/rockyhawk64/CommandPanels.git
synced 2025-11-18 07:14:17 +01:00
session management simplification
This commit is contained in:
parent
e65a1f6636
commit
eead4eb543
@ -5,7 +5,6 @@ import me.rockyhawk.commandpanels.formatter.Placeholders;
|
||||
import me.rockyhawk.commandpanels.formatter.language.TextFormatter;
|
||||
import me.rockyhawk.commandpanels.formatter.data.DataLoader;
|
||||
import me.rockyhawk.commandpanels.interaction.openpanel.PanelOpenCommand;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import me.rockyhawk.commandpanels.session.inventory.generator.GenerateManager;
|
||||
import me.rockyhawk.commandpanels.session.inventory.listeners.ClickEvents;
|
||||
import me.rockyhawk.commandpanels.session.inventory.listeners.InventoryEvents;
|
||||
@ -17,7 +16,6 @@ public class Context {
|
||||
public FileHandler fileHandler;
|
||||
public PanelOpenCommand panelCommand;
|
||||
public DataLoader dataLoader;
|
||||
public SessionManager session;
|
||||
public GenerateManager generator;
|
||||
|
||||
public Context(CommandPanels pl) {
|
||||
@ -30,7 +28,6 @@ public class Context {
|
||||
fileHandler = new FileHandler(this);
|
||||
panelCommand = new PanelOpenCommand(this);
|
||||
dataLoader = new DataLoader(this);
|
||||
session = new SessionManager(this);
|
||||
generator = new GenerateManager(this);
|
||||
|
||||
// Register plugin command
|
||||
@ -38,7 +35,6 @@ public class Context {
|
||||
plugin.registerCommand("pa", new MainCommand(this));
|
||||
|
||||
// Register events
|
||||
Bukkit.getServer().getPluginManager().registerEvents(session, plugin);
|
||||
Bukkit.getServer().getPluginManager().registerEvents(new InventoryEvents(this), plugin);
|
||||
Bukkit.getServer().getPluginManager().registerEvents(panelCommand, plugin);
|
||||
Bukkit.getServer().getPluginManager().registerEvents(new ClickEvents(this), plugin);
|
||||
|
||||
@ -2,7 +2,6 @@ package me.rockyhawk.commandpanels.builder;
|
||||
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public abstract class PanelBuilder {
|
||||
@ -14,7 +13,7 @@ public abstract class PanelBuilder {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public abstract void open(Panel panel, SessionManager.PanelOpenType openType);
|
||||
public abstract void open(Panel panel);
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
|
||||
@ -14,8 +14,10 @@ import me.rockyhawk.commandpanels.session.dialog.components.DialogButton;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.ClickCallback;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
public class ActionBuilder implements Listener {
|
||||
private final Context ctx;
|
||||
@ -53,11 +55,17 @@ public class ActionBuilder implements Listener {
|
||||
|
||||
// Use the first non-null value
|
||||
if (text != null) {
|
||||
ctx.session.getPlayerSession((Player) audience).setData(id, text);
|
||||
player.getPersistentDataContainer()
|
||||
.set(new NamespacedKey(ctx.plugin, id),
|
||||
PersistentDataType.STRING, text);
|
||||
} else if (number != null) {
|
||||
ctx.session.getPlayerSession((Player) audience).setData(id, String.valueOf(number));
|
||||
player.getPersistentDataContainer()
|
||||
.set(new NamespacedKey(ctx.plugin, id),
|
||||
PersistentDataType.STRING, String.valueOf(number));
|
||||
} else if (bool != null) {
|
||||
ctx.session.getPlayerSession((Player) audience).setData(id, String.valueOf(bool));
|
||||
player.getPersistentDataContainer()
|
||||
.set(new NamespacedKey(ctx.plugin, id),
|
||||
PersistentDataType.STRING, String.valueOf(bool));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -12,7 +12,6 @@ import me.rockyhawk.commandpanels.builder.logic.ConditionNode;
|
||||
import me.rockyhawk.commandpanels.builder.logic.ConditionParser;
|
||||
import me.rockyhawk.commandpanels.formatter.language.Message;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import me.rockyhawk.commandpanels.session.dialog.DialogComponent;
|
||||
import me.rockyhawk.commandpanels.session.dialog.DialogPanel;
|
||||
import me.rockyhawk.commandpanels.session.dialog.components.*;
|
||||
@ -37,7 +36,7 @@ public class DialogPanelBuilder extends PanelBuilder {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Panel openPanel, SessionManager.PanelOpenType openType) {
|
||||
public void open(Panel openPanel) {
|
||||
if (!(openPanel instanceof DialogPanel panel)) {
|
||||
throw new IllegalArgumentException("Expected DialogPanel, got " + openPanel.getClass());
|
||||
}
|
||||
@ -132,7 +131,6 @@ public class DialogPanelBuilder extends PanelBuilder {
|
||||
|
||||
// Show the dialog to player and create session
|
||||
player.showDialog(dialog);
|
||||
ctx.session.updateSession(this.getPlayer(), panel, openType);
|
||||
}
|
||||
|
||||
public float parseFloat(String raw) {
|
||||
|
||||
@ -9,7 +9,9 @@ import me.rockyhawk.commandpanels.interaction.commands.RequirementRunner;
|
||||
import me.rockyhawk.commandpanels.session.floodgate.FloodgateComponent;
|
||||
import me.rockyhawk.commandpanels.session.floodgate.FloodgatePanel;
|
||||
import me.rockyhawk.commandpanels.session.floodgate.components.*;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.geysermc.cumulus.response.CustomFormResponse;
|
||||
import org.geysermc.floodgate.api.FloodgateApi;
|
||||
|
||||
@ -156,7 +158,9 @@ public class CustomForm {
|
||||
// Placeholder key will be the ID of the component and make session data from result string
|
||||
// Eg first button at the top will be index 0 %commandpanels_session_exampleslider%
|
||||
private void createSessionData(String key, String output) {
|
||||
ctx.session.getPlayerSession(builder.getPlayer()).setData(key, output);
|
||||
builder.getPlayer().getPersistentDataContainer()
|
||||
.set(new NamespacedKey(ctx.plugin, key),
|
||||
PersistentDataType.STRING, output);
|
||||
}
|
||||
|
||||
private String parseText(String raw) {
|
||||
|
||||
@ -3,7 +3,6 @@ package me.rockyhawk.commandpanels.builder.floodgate;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.builder.PanelBuilder;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import me.rockyhawk.commandpanels.session.floodgate.FloodgatePanel;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -21,7 +20,7 @@ public class FloodgatePanelBuilder extends PanelBuilder {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Panel openPanel, SessionManager.PanelOpenType openType){
|
||||
public void open(Panel openPanel){
|
||||
if (!(openPanel instanceof FloodgatePanel panel)) {
|
||||
throw new IllegalArgumentException("Expected FloodgatePanel, got " + openPanel.getClass());
|
||||
}
|
||||
@ -35,6 +34,5 @@ public class FloodgatePanelBuilder extends PanelBuilder {
|
||||
case "simple" -> this.simpleBuilder.sendForm(panel);
|
||||
case "custom" -> this.customBuilder.sendForm(panel);
|
||||
}
|
||||
ctx.session.updateSession(this.getPlayer(), panel, openType);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@ package me.rockyhawk.commandpanels.builder.inventory;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.builder.PanelBuilder;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
@ -18,12 +17,11 @@ public class InventoryPanelBuilder extends PanelBuilder {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Panel panel, SessionManager.PanelOpenType openType){
|
||||
public void open(Panel panel){
|
||||
if (!(panel instanceof InventoryPanel)) {
|
||||
throw new IllegalArgumentException("Expected InventoryPanel, got " + panel.getClass());
|
||||
}
|
||||
Inventory panelInv = panelFactory.createInventory((InventoryPanel) panel, this.getPlayer());
|
||||
this.getPlayer().openInventory(panelInv);
|
||||
ctx.session.updateSession(this.getPlayer(), panel, openType);
|
||||
}
|
||||
}
|
||||
@ -4,7 +4,6 @@ import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.commands.SubCommand;
|
||||
import me.rockyhawk.commandpanels.formatter.language.Message;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -61,7 +60,7 @@ public class OpenCommand implements SubCommand {
|
||||
ctx.text.sendInfo(sender, Message.PANEL_OPEN_TRIGGERED);
|
||||
}
|
||||
|
||||
panel.open(ctx, target, SessionManager.PanelOpenType.EXTERNAL);
|
||||
panel.open(ctx, target, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,9 +2,9 @@ package me.rockyhawk.commandpanels.formatter.placeholders;
|
||||
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.formatter.PlaceholderResolver;
|
||||
import me.rockyhawk.commandpanels.session.PanelSession;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
public class SessionDataPlaceholder implements PlaceholderResolver {
|
||||
@Override
|
||||
@ -16,12 +16,14 @@ public class SessionDataPlaceholder implements PlaceholderResolver {
|
||||
// Get data key
|
||||
String key = identifier.substring("session_".length());
|
||||
|
||||
// Get session if it exists
|
||||
PanelSession session = ctx.session.getPlayerSession((Player) player);
|
||||
if(session == null) return "no_session_found";
|
||||
// Get session data if it exists
|
||||
String data = player.getPersistentDataContainer()
|
||||
.get(new NamespacedKey(ctx.plugin, key),
|
||||
PersistentDataType.STRING);
|
||||
if(data == null) return "null";
|
||||
|
||||
// Get the data from session
|
||||
|
||||
return session.getData(key);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@ package me.rockyhawk.commandpanels.interaction.commands.tags;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandTagResolver;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class OpenPanelTag implements CommandTagResolver {
|
||||
@ -21,7 +20,7 @@ public class OpenPanelTag implements CommandTagResolver {
|
||||
|
||||
// Open panel tag will gracefully move from one panel to the next within the same session
|
||||
Panel openPanel = ctx.plugin.panels.get(command);
|
||||
openPanel.open(ctx, player, SessionManager.PanelOpenType.INTERNAL);
|
||||
openPanel.open(ctx, player, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3,9 +3,9 @@ package me.rockyhawk.commandpanels.interaction.commands.tags;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandTagResolver;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.PanelSession;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
public class PreviousPanelTag implements CommandTagResolver {
|
||||
|
||||
@ -17,10 +17,13 @@ public class PreviousPanelTag implements CommandTagResolver {
|
||||
@Override
|
||||
public void handle(Context ctx, Panel panel, Player player, String raw, String command) {
|
||||
// Open the previous panel
|
||||
PanelSession session = ctx.session.getPlayerSession(player);
|
||||
if(ctx.session.getPlayerSession(player) != null){
|
||||
if(session.getPrevious() != null)
|
||||
session.getPrevious().open(ctx, player, SessionManager.PanelOpenType.INTERNAL);
|
||||
String previousPanel = player.getPersistentDataContainer()
|
||||
.get(new NamespacedKey(ctx.plugin, "previous"),
|
||||
PersistentDataType.STRING);
|
||||
|
||||
if(previousPanel != null){
|
||||
ctx.plugin.panels.get(previousPanel)
|
||||
.open(ctx, player, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@ package me.rockyhawk.commandpanels.interaction.commands.tags;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandTagResolver;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class RefreshPanelTag implements CommandTagResolver {
|
||||
@ -15,6 +14,6 @@ public class RefreshPanelTag implements CommandTagResolver {
|
||||
|
||||
@Override
|
||||
public void handle(Context ctx, Panel panel, Player player, String raw, String command) {
|
||||
panel.open(ctx, player, SessionManager.PanelOpenType.REFRESH);
|
||||
panel.open(ctx, player, false);
|
||||
}
|
||||
}
|
||||
@ -3,7 +3,10 @@ package me.rockyhawk.commandpanels.interaction.commands.tags;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandTagResolver;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
public class SessionTag implements CommandTagResolver {
|
||||
|
||||
@ -28,7 +31,9 @@ public class SessionTag implements CommandTagResolver {
|
||||
if (args.length < 3) return;
|
||||
String key = args[1];
|
||||
String value = joinArgs(args, 2);
|
||||
ctx.session.getPlayerSession(player).setData(key, value);
|
||||
player.getPersistentDataContainer()
|
||||
.set(new NamespacedKey(ctx.plugin, key),
|
||||
PersistentDataType.STRING, value);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -36,7 +41,8 @@ public class SessionTag implements CommandTagResolver {
|
||||
// [session] del key
|
||||
if (args.length < 2) return;
|
||||
String key = args[1];
|
||||
ctx.session.getPlayerSession(player).removeData(key);
|
||||
player.getPersistentDataContainer()
|
||||
.remove(new NamespacedKey(ctx.plugin, key));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@ -3,11 +3,12 @@ package me.rockyhawk.commandpanels.interaction.openpanel;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.formatter.language.Message;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@ -52,7 +53,9 @@ public class PanelOpenCommand implements Listener {
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
String key = pnlCmdArgs[i];
|
||||
String value = args[i];
|
||||
ctx.session.getPlayerSession(e.getPlayer()).setData(key, value);
|
||||
e.getPlayer().getPersistentDataContainer()
|
||||
.set(new NamespacedKey(ctx.plugin, key),
|
||||
PersistentDataType.STRING, value);
|
||||
}
|
||||
|
||||
// Stop and do not open panel if conditions are false
|
||||
@ -61,7 +64,7 @@ public class PanelOpenCommand implements Listener {
|
||||
}
|
||||
|
||||
e.setCancelled(true);
|
||||
Bukkit.getGlobalRegionScheduler().run(ctx.plugin, task -> panel.open(ctx, e.getPlayer(), SessionManager.PanelOpenType.EXTERNAL));
|
||||
Bukkit.getGlobalRegionScheduler().run(ctx.plugin, task -> panel.open(ctx, e.getPlayer(), true));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -3,8 +3,12 @@ package me.rockyhawk.commandpanels.session;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.builder.logic.ConditionNode;
|
||||
import me.rockyhawk.commandpanels.builder.logic.ConditionParser;
|
||||
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -38,7 +42,23 @@ public abstract class Panel {
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void open(Context ctx, Player player, SessionManager.PanelOpenType openType);
|
||||
// Updates data to set the current panel and previous panel.
|
||||
public void updatePanelData(Context ctx, Player p) {
|
||||
NamespacedKey keyCurrent = new NamespacedKey(ctx.plugin, "current");
|
||||
NamespacedKey keyPrevious = new NamespacedKey(ctx.plugin, "previous");
|
||||
PersistentDataContainer container = p.getPersistentDataContainer();
|
||||
|
||||
// Move current → previous
|
||||
String current = container.get(keyCurrent, PersistentDataType.STRING);
|
||||
current = (current != null) ? current : "";
|
||||
container.set(keyPrevious, PersistentDataType.STRING, current);
|
||||
|
||||
// Set this panel as the new current
|
||||
container.set(keyCurrent, PersistentDataType.STRING, this.name);
|
||||
}
|
||||
|
||||
|
||||
public abstract void open(Context ctx, Player player, boolean isNewPanelSession);
|
||||
|
||||
public String getName() { return name; }
|
||||
|
||||
|
||||
@ -1,79 +0,0 @@
|
||||
package me.rockyhawk.commandpanels.session;
|
||||
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class PanelSession {
|
||||
private Panel panel;
|
||||
private Panel previous;
|
||||
private final Player player;
|
||||
private final Map<String, String> data;
|
||||
|
||||
private PanelUpdater updater;
|
||||
|
||||
public PanelSession(Panel panel, Player player) {
|
||||
this.panel = panel;
|
||||
this.previous = null;
|
||||
this.player = player;
|
||||
this.data = new HashMap<>();
|
||||
}
|
||||
|
||||
public Panel getPanel() {
|
||||
return panel;
|
||||
}
|
||||
|
||||
public void setPanel(Panel panel) {
|
||||
// First panel since session start, update and return
|
||||
if(this.panel == null) {
|
||||
this.panel = panel;
|
||||
return;
|
||||
}
|
||||
// Update previous panel if new panel is different
|
||||
if(!panel.getName().equals(this.panel.getName())) {
|
||||
this.previous = this.panel;
|
||||
}
|
||||
this.panel = panel;
|
||||
}
|
||||
|
||||
public Player getPlayer(){
|
||||
return player;
|
||||
}
|
||||
|
||||
// Updater controls
|
||||
public void startUpdateTask(Context ctx, PanelUpdater updater) {
|
||||
removeUpdateTask();
|
||||
this.updater = updater;
|
||||
updater.start(ctx, this);
|
||||
}
|
||||
|
||||
public void removeUpdateTask() {
|
||||
if (updater != null){
|
||||
this.updater.stop();
|
||||
this.updater = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Session data
|
||||
public void setData(String key, String value) {
|
||||
data.put(key, value);
|
||||
}
|
||||
|
||||
public String getData(String key) {
|
||||
return data.get(key);
|
||||
}
|
||||
|
||||
public void removeData(String key) {
|
||||
data.remove(key);
|
||||
}
|
||||
|
||||
public void clearData() {
|
||||
data.clear();
|
||||
}
|
||||
|
||||
public Panel getPrevious() {
|
||||
return previous;
|
||||
}
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
package me.rockyhawk.commandpanels.session;
|
||||
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
|
||||
public interface PanelUpdater {
|
||||
void start(Context ctx, PanelSession session);
|
||||
void stop();
|
||||
}
|
||||
|
||||
@ -1,78 +0,0 @@
|
||||
package me.rockyhawk.commandpanels.session;
|
||||
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.formatter.language.Message;
|
||||
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
|
||||
import me.rockyhawk.commandpanels.session.inventory.InventoryPanelUpdater;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public class SessionManager implements Listener {
|
||||
private final Context ctx;
|
||||
private final Map<UUID, PanelSession> panelSessions = new HashMap<>();
|
||||
|
||||
public SessionManager(Context ctx) {
|
||||
this.ctx = ctx;
|
||||
}
|
||||
|
||||
public PanelSession getPlayerSession(Player player) {
|
||||
return panelSessions.get(player.getUniqueId());
|
||||
}
|
||||
|
||||
public void updateSession(Player player, Panel panel, PanelOpenType openType) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
boolean panelSnooper = ctx.fileHandler.config.getBoolean("panel-snooper");
|
||||
|
||||
panelSessions.compute(uuid, (key, session) -> {
|
||||
// Start a new session no panel open, or switch panel
|
||||
if (session == null) {
|
||||
session = new PanelSession(panel, player);
|
||||
} else {
|
||||
session.setPanel(panel);
|
||||
}
|
||||
if (panelSnooper && panel != null)
|
||||
ctx.text.sendInfo(Bukkit.getConsoleSender(), Message.PANEL_OPEN_LOG, player.getName(), panel.getName());
|
||||
|
||||
// Update data file when sessions are started
|
||||
ctx.dataLoader.saveDataFileAsync();
|
||||
|
||||
// Assign refresher for new panel
|
||||
if (panel instanceof InventoryPanel) {
|
||||
InventoryPanelUpdater updater = new InventoryPanelUpdater();
|
||||
session.startUpdateTask(ctx, updater);
|
||||
}
|
||||
return session;
|
||||
});
|
||||
}
|
||||
|
||||
public void removeSession(Player player) {
|
||||
panelSessions.remove(player.getUniqueId());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent e) {
|
||||
// Start session with no panel to allow data to be added
|
||||
ctx.session.updateSession(e.getPlayer(), null, PanelOpenType.EXTERNAL);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent e) {
|
||||
// Always remove session once player leaves
|
||||
ctx.session.removeSession(e.getPlayer());
|
||||
}
|
||||
|
||||
public enum PanelOpenType {
|
||||
EXTERNAL, // Opened via external action
|
||||
INTERNAL, // Opened via in-panel navigation
|
||||
REFRESH // Internal and refresh only
|
||||
}
|
||||
|
||||
}
|
||||
@ -5,8 +5,8 @@ import me.rockyhawk.commandpanels.builder.PanelBuilder;
|
||||
import me.rockyhawk.commandpanels.builder.dialog.DialogPanelBuilder;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandRunner;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import me.rockyhawk.commandpanels.session.floodgate.FloodgatePanel;
|
||||
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
@ -53,26 +53,29 @@ public class DialogPanel extends Panel {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Context ctx, Player player, SessionManager.PanelOpenType openType){
|
||||
public void open(Context ctx, Player player, boolean isNewPanelSession){
|
||||
// Check for floodgate panel if bedrock player
|
||||
Panel panel = ctx.plugin.panels.get(floodgate);
|
||||
if (Bukkit.getPluginManager().getPlugin("floodgate") != null) {
|
||||
if (panel instanceof FloodgatePanel floodgatePanel &&
|
||||
FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) {
|
||||
floodgatePanel.open(ctx, player, openType);
|
||||
floodgatePanel.open(ctx, player, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Run panel commands
|
||||
if(openType != SessionManager.PanelOpenType.REFRESH) {
|
||||
if(isNewPanelSession) {
|
||||
// Update panel data values
|
||||
updatePanelData(ctx, player);
|
||||
|
||||
// Run panel commands
|
||||
CommandRunner runner = new CommandRunner(ctx);
|
||||
runner.runCommands(this, player, this.getCommands());
|
||||
}
|
||||
|
||||
// Build and open panel
|
||||
PanelBuilder builder = new DialogPanelBuilder(ctx, player);
|
||||
builder.open(this, openType);
|
||||
builder.open(this);
|
||||
}
|
||||
|
||||
public Map<String, DialogComponent> getComponents() { return components; }
|
||||
|
||||
@ -5,7 +5,6 @@ import me.rockyhawk.commandpanels.builder.PanelBuilder;
|
||||
import me.rockyhawk.commandpanels.builder.floodgate.FloodgatePanelBuilder;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandRunner;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
@ -49,20 +48,23 @@ public class FloodgatePanel extends Panel {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Context ctx, Player player, SessionManager.PanelOpenType openType){
|
||||
public void open(Context ctx, Player player, boolean isNewPanelSession){
|
||||
if (Bukkit.getPluginManager().getPlugin("floodgate") == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Run panel commands
|
||||
if(openType != SessionManager.PanelOpenType.REFRESH) {
|
||||
if(isNewPanelSession) {
|
||||
// Update panel data values
|
||||
updatePanelData(ctx, player);
|
||||
|
||||
// Run panel commands
|
||||
CommandRunner runner = new CommandRunner(ctx);
|
||||
runner.runCommands(this, player, this.getCommands());
|
||||
}
|
||||
|
||||
// Build and open panel
|
||||
PanelBuilder builder = new FloodgatePanelBuilder(ctx, player);
|
||||
builder.open(this, openType);
|
||||
builder.open(this);
|
||||
}
|
||||
public String getSubtitle() { return simpleSubtitle; }
|
||||
public String getFloodgateType() { return floodgateType; }
|
||||
|
||||
@ -5,14 +5,16 @@ import me.rockyhawk.commandpanels.builder.PanelBuilder;
|
||||
import me.rockyhawk.commandpanels.builder.inventory.InventoryPanelBuilder;
|
||||
import me.rockyhawk.commandpanels.interaction.commands.CommandRunner;
|
||||
import me.rockyhawk.commandpanels.session.Panel;
|
||||
import me.rockyhawk.commandpanels.session.SessionManager;
|
||||
import me.rockyhawk.commandpanels.session.floodgate.FloodgatePanel;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.geysermc.floodgate.api.FloodgateApi;
|
||||
|
||||
import java.util.HashMap;
|
||||
@ -54,26 +56,45 @@ public class InventoryPanel extends Panel implements InventoryHolder {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Context ctx, Player player, SessionManager.PanelOpenType openType) {
|
||||
public void open(Context ctx, Player player, boolean isNewPanelSession) {
|
||||
// Check for floodgate panel if bedrock player
|
||||
Panel panel = ctx.plugin.panels.get(floodgate);
|
||||
if (Bukkit.getPluginManager().getPlugin("floodgate") != null) {
|
||||
if (panel instanceof FloodgatePanel floodgatePanel &&
|
||||
FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) {
|
||||
floodgatePanel.open(ctx, player, openType);
|
||||
floodgatePanel.open(ctx, player, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Run panel commands
|
||||
if(openType != SessionManager.PanelOpenType.REFRESH) {
|
||||
|
||||
if(isNewPanelSession) {
|
||||
// Don't open same panel if its already open
|
||||
if(checkCurrentPanel(player)){
|
||||
return;
|
||||
}
|
||||
updatePanelData(ctx, player);
|
||||
|
||||
// Run panel commands
|
||||
CommandRunner runner = new CommandRunner(ctx);
|
||||
runner.runCommands(this, player, this.getCommands());
|
||||
|
||||
// Start a panel updater
|
||||
InventoryPanelUpdater updater = new InventoryPanelUpdater();
|
||||
updater.start(ctx, player, this);
|
||||
}
|
||||
|
||||
// Build and open the panel
|
||||
PanelBuilder builder = new InventoryPanelBuilder(ctx, player);
|
||||
builder.open(this, openType);
|
||||
builder.open(this);
|
||||
}
|
||||
|
||||
// Do not open the same panel again if its already open
|
||||
private boolean checkCurrentPanel(Player p) {
|
||||
if(p.getOpenInventory().getTopInventory().getHolder() instanceof InventoryPanel panel){
|
||||
return panel.getName().equals(getName());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getRows() {
|
||||
|
||||
@ -5,26 +5,24 @@ import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.builder.inventory.InventoryPanelBuilder;
|
||||
import me.rockyhawk.commandpanels.builder.inventory.items.ItemBuilder;
|
||||
import me.rockyhawk.commandpanels.session.PanelUpdater;
|
||||
import me.rockyhawk.commandpanels.session.PanelSession;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.joml.Random;
|
||||
|
||||
public class InventoryPanelUpdater implements PanelUpdater {
|
||||
public class InventoryPanelUpdater {
|
||||
|
||||
private ScheduledTask task;
|
||||
|
||||
@Override
|
||||
public void start(Context ctx, PanelSession session) {
|
||||
if (!(session.getPanel() instanceof InventoryPanel panel)) return;
|
||||
|
||||
public void start(Context ctx, Player p, InventoryPanel panel) {
|
||||
// If restarted, stop current event
|
||||
stop();
|
||||
|
||||
InventoryPanelBuilder panelBuilder = new InventoryPanelBuilder(ctx, session.getPlayer());
|
||||
InventoryPanelBuilder panelBuilder = new InventoryPanelBuilder(ctx, p);
|
||||
ItemBuilder builder = new ItemBuilder(ctx, panelBuilder);
|
||||
|
||||
int updateDelay = 20;
|
||||
@ -42,9 +40,17 @@ public class InventoryPanelUpdater implements PanelUpdater {
|
||||
// Schedule repeating GUI update task on the player's region
|
||||
this.task = Bukkit.getRegionScheduler().runAtFixedRate(
|
||||
ctx.plugin,
|
||||
session.getPlayer().getLocation(),
|
||||
p.getLocation(),
|
||||
(scheduledTask) -> {
|
||||
Inventory inv = session.getPlayer().getOpenInventory().getTopInventory();
|
||||
Inventory inv = p.getOpenInventory().getTopInventory();
|
||||
|
||||
InventoryHolder holder = inv.getHolder();
|
||||
if (!(holder instanceof InventoryPanel) || holder != panel) {
|
||||
stop();
|
||||
return;
|
||||
}
|
||||
p.sendMessage(panel.getName() + " " + Random.newSeed());
|
||||
|
||||
NamespacedKey itemIdKey = new NamespacedKey(ctx.plugin, "item_id");
|
||||
NamespacedKey baseIdKey = new NamespacedKey(ctx.plugin, "base_item_id");
|
||||
NamespacedKey fillItem = new NamespacedKey(ctx.plugin, "fill_item");
|
||||
@ -86,7 +92,6 @@ public class InventoryPanelUpdater implements PanelUpdater {
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
if (task != null) {
|
||||
task.cancel();
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package me.rockyhawk.commandpanels.session.inventory.listeners;
|
||||
|
||||
import me.rockyhawk.commandpanels.Context;
|
||||
import me.rockyhawk.commandpanels.session.PanelSession;
|
||||
import me.rockyhawk.commandpanels.session.inventory.InventoryPanel;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -34,11 +33,9 @@ public class InventoryEvents implements Listener {
|
||||
if (!(event.getPlayer() instanceof Player player)) return;
|
||||
|
||||
// Only remove the session if the player has one
|
||||
PanelSession session = ctx.session.getPlayerSession(player);
|
||||
if (event.getInventory().getHolder() instanceof InventoryPanel) {
|
||||
itemSanitiser(player.getInventory());
|
||||
itemDropper(player, event.getInventory());
|
||||
if(session != null) session.removeUpdateTask();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user