fancydialogs: Enhance dialog viewer management

Add viewer tracking and handle player join/quit/death events
This commit is contained in:
Oliver
2025-07-17 12:59:19 +02:00
parent 00094d5a5f
commit df75c7cf51
9 changed files with 128 additions and 2 deletions

View File

@@ -1 +1 @@
0.0.12 0.0.13

View File

@@ -94,7 +94,7 @@ tasks {
minecraftVersion("1.21.7") minecraftVersion("1.21.7")
downloadPlugins { downloadPlugins {
modrinth("fancynpcs", "2.6.0") modrinth("fancynpcs", "2.6.0.280")
// hangar("ViaVersion", "5.3.2") // hangar("ViaVersion", "5.3.2")
// hangar("ViaBackwards", "5.3.2") // hangar("ViaBackwards", "5.3.2")
// modrinth("multiverse-core", "4.3.11") // modrinth("multiverse-core", "4.3.11")

View File

@@ -2,22 +2,39 @@ package com.fancyinnovations.fancydialogs.api;
import com.fancyinnovations.fancydialogs.api.data.DialogData; import com.fancyinnovations.fancydialogs.api.data.DialogData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.ApiStatus;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public abstract class Dialog { public abstract class Dialog {
protected String id; protected String id;
protected DialogData data; protected DialogData data;
protected Set<UUID> viewers;
public Dialog(String id, DialogData data) { public Dialog(String id, DialogData data) {
this.id = id; this.id = id;
this.data = data; this.data = data;
this.viewers = ConcurrentHashMap.newKeySet();
} }
public Dialog() { public Dialog() {
} }
/**
* Opens the dialog for the specified player.
*
* @param player the player to open the dialog for
*/
abstract public void open(Player player); abstract public void open(Player player);
/**
* Closes the dialog for the specified player.
*
* @param player the player to close the dialog for
*/
abstract public void close(Player player); abstract public void close(Player player);
public String getId() { public String getId() {
@@ -27,4 +44,55 @@ public abstract class Dialog {
public DialogData getData() { public DialogData getData() {
return data; return data;
} }
/**
* @return a set of UUIDs of players who have this dialog opened
*/
public Set<UUID> getViewers() {
return Set.copyOf(viewers);
}
/**
* Checks if the dialog is opened for a specific player by UUID.
*
* @param uuid of the player to check
* @return true if the dialog is opened for the player, false otherwise
*/
public boolean isOpenedFor(UUID uuid) {
if (uuid == null) {
return false;
}
return viewers.contains(uuid);
}
/***
* Checks if the dialog is opened for a specific player.
*
* @param player the player to check
* @return true if the dialog is opened for the player, false otherwise
*/
public boolean isOpenedFor(Player player) {
if (player == null) {
return false;
}
return isOpenedFor(player.getUniqueId());
}
@ApiStatus.Internal
public void addViewer(Player player) {
if (player == null) {
return;
}
viewers.add(player.getUniqueId());
}
@ApiStatus.Internal
public void removeViewer(Player player) {
if (player == null) {
return;
}
viewers.remove(player.getUniqueId());
}
} }

View File

@@ -17,7 +17,9 @@ import com.fancyinnovations.fancydialogs.dialog.DialogImpl;
import com.fancyinnovations.fancydialogs.fancynpcs.OpenDialogNpcAction; import com.fancyinnovations.fancydialogs.fancynpcs.OpenDialogNpcAction;
import com.fancyinnovations.fancydialogs.joinedplayerscache.JoinedPlayersCache; import com.fancyinnovations.fancydialogs.joinedplayerscache.JoinedPlayersCache;
import com.fancyinnovations.fancydialogs.listener.DialogButtonClickedListener; import com.fancyinnovations.fancydialogs.listener.DialogButtonClickedListener;
import com.fancyinnovations.fancydialogs.listener.PlayerDeathListener;
import com.fancyinnovations.fancydialogs.listener.PlayerJoinListener; import com.fancyinnovations.fancydialogs.listener.PlayerJoinListener;
import com.fancyinnovations.fancydialogs.listener.PlayerQuitListener;
import com.fancyinnovations.fancydialogs.registry.DefaultDialogs; import com.fancyinnovations.fancydialogs.registry.DefaultDialogs;
import com.fancyinnovations.fancydialogs.registry.DialogRegistry; import com.fancyinnovations.fancydialogs.registry.DialogRegistry;
import com.fancyinnovations.fancydialogs.storage.DialogStorage; import com.fancyinnovations.fancydialogs.storage.DialogStorage;
@@ -207,6 +209,8 @@ public class FancyDialogsPlugin extends JavaPlugin implements FancyDialogs {
private void registerListeners() { private void registerListeners() {
Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), this); Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), this);
Bukkit.getPluginManager().registerEvents(new PlayerQuitListener(), this);
Bukkit.getPluginManager().registerEvents(new PlayerDeathListener(), this);
Bukkit.getPluginManager().registerEvents(new DialogButtonClickedListener(), this); Bukkit.getPluginManager().registerEvents(new DialogButtonClickedListener(), this);
} }

View File

@@ -1,5 +1,6 @@
package com.fancyinnovations.fancydialogs.dialog; package com.fancyinnovations.fancydialogs.dialog;
import com.fancyinnovations.fancydialogs.FancyDialogsPlugin;
import com.fancyinnovations.fancydialogs.api.Dialog; import com.fancyinnovations.fancydialogs.api.Dialog;
import com.fancyinnovations.fancydialogs.api.data.DialogBodyData; import com.fancyinnovations.fancydialogs.api.data.DialogBodyData;
import com.fancyinnovations.fancydialogs.api.data.DialogButton; import com.fancyinnovations.fancydialogs.api.data.DialogButton;
@@ -170,6 +171,10 @@ public class DialogImpl extends Dialog {
FancySitula.PACKET_FACTORY FancySitula.PACKET_FACTORY
.createShowDialogPacket(fsDialog) .createShowDialogPacket(fsDialog)
.send(new FS_RealPlayer(player)); .send(new FS_RealPlayer(player));
viewers.add(player.getUniqueId());
FancyDialogsPlugin.get().getFancyLogger().debug("Opened dialog " + id + " for player " + player.getName());
} }
@Override @Override
@@ -177,6 +182,10 @@ public class DialogImpl extends Dialog {
FancySitula.PACKET_FACTORY FancySitula.PACKET_FACTORY
.createClearDialogPacket() .createClearDialogPacket()
.send(new FS_RealPlayer(player)); .send(new FS_RealPlayer(player));
viewers.remove(player.getUniqueId());
FancyDialogsPlugin.get().getFancyLogger().debug("Closed dialog " + id + " for player " + player.getName());
} }
} }

View File

@@ -58,6 +58,11 @@ public class CustomClickActionPacketListener {
return; return;
} }
if (!dialog.isOpenedFor(event.player())) {
FancyDialogsPlugin.get().getFancyLogger().warn("Received action for dialog: " + dialogId + " but it is not opened for player: " + event.player().getName());
return;
}
DialogButton btn = dialog.getData().getButtonById(buttonId); DialogButton btn = dialog.getData().getButtonById(buttonId);
if (btn == null) { if (btn == null) {
FancyDialogsPlugin.get().getFancyLogger().warn("Received action for unknown button: " + buttonId + " in dialog: " + dialogId); FancyDialogsPlugin.get().getFancyLogger().warn("Received action for unknown button: " + buttonId + " in dialog: " + dialogId);

View File

@@ -0,0 +1,18 @@
package com.fancyinnovations.fancydialogs.listener;
import com.fancyinnovations.fancydialogs.FancyDialogsPlugin;
import com.fancyinnovations.fancydialogs.api.Dialog;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
public class PlayerDeathListener implements Listener {
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
for (Dialog dialog : FancyDialogsPlugin.get().getDialogRegistry().getAll()) {
dialog.removeViewer(event.getPlayer());
}
}
}

View File

@@ -13,6 +13,10 @@ public class PlayerJoinListener implements Listener {
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
CustomClickActionPacketListener.get().getPacketListener().inject(event.getPlayer()); CustomClickActionPacketListener.get().getPacketListener().inject(event.getPlayer());
for (Dialog dialog : FancyDialogsPlugin.get().getDialogRegistry().getAll()) {
dialog.removeViewer(event.getPlayer());
}
if (FDFeatureFlags.DISABLE_WELCOME_DIALOG.isEnabled()) { if (FDFeatureFlags.DISABLE_WELCOME_DIALOG.isEnabled()) {
FancyDialogsPlugin.get().getFancyLogger().debug("Welcome dialog is disabled via feature flag"); FancyDialogsPlugin.get().getFancyLogger().debug("Welcome dialog is disabled via feature flag");
return; return;

View File

@@ -0,0 +1,18 @@
package com.fancyinnovations.fancydialogs.listener;
import com.fancyinnovations.fancydialogs.FancyDialogsPlugin;
import com.fancyinnovations.fancydialogs.api.Dialog;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
public class PlayerQuitListener implements Listener {
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
for (Dialog dialog : FancyDialogsPlugin.get().getDialogRegistry().getAll()) {
dialog.removeViewer(event.getPlayer());
}
}
}