From b0cc8233ca322171aa56eca6afc6b02449e2a1f8 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 18:40:26 +0000 Subject: [PATCH 1/4] =?UTF-8?q?Eliminar=20marry=20chat=20y=20a=C3=B1adir?= =?UTF-8?q?=20botones=20clickables=20para=20propuestas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Elimina completamente la función marry chat (/marry chat, ChatListener, toggleChat, handleChat, campos chatActive en MarriageData) - Las propuestas ahora muestran botones [✔ Aceptar] y [✗ Rechazar] clickables en el chat usando la API de Adventure (ClickEvent/HoverEvent) - Actualiza MarriageData con constructor simplificado sin parámetros de chat - Limpia PlayerListener, MarryCommand y showStatus de referencias al chat https://claude.ai/code/session_018xHAmj4mCTsiinizeVrzKJ --- .../java/dev/marryplugin/MarryPlugin.java | 3 - .../marryplugin/commands/MarryCommand.java | 6 +- .../dev/marryplugin/data/MarriageData.java | 30 +------- .../dev/marryplugin/data/MarriageStorage.java | 2 +- .../marryplugin/listeners/ChatListener.java | 33 --------- .../marryplugin/listeners/PlayerListener.java | 3 - .../marryplugin/managers/MarriageManager.java | 68 ++++++------------- 7 files changed, 24 insertions(+), 121 deletions(-) delete mode 100644 MarryPlugin/src/main/java/dev/marryplugin/listeners/ChatListener.java diff --git a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java index 1c0ad2a..38b9cbd 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java @@ -2,7 +2,6 @@ import dev.marryplugin.commands.MarryCommand; import dev.marryplugin.data.MarriageStorage; -import dev.marryplugin.listeners.ChatListener; import dev.marryplugin.listeners.PlayerListener; import dev.marryplugin.managers.MarriageManager; import org.bukkit.plugin.java.JavaPlugin; @@ -19,7 +18,6 @@ * /marry home - Ir al home de pareja * /marry delhome - Eliminar home de pareja * /marry tp - Teleportarse a la pareja - * /marry chat - Activar/desactivar chat de pareja * /marry estado - Ver estado del matrimonio */ public final class MarryPlugin extends JavaPlugin { @@ -47,7 +45,6 @@ public void onEnable() { } // Registrar listeners - getServer().getPluginManager().registerEvents(new ChatListener(manager), this); getServer().getPluginManager().registerEvents(new PlayerListener(this, manager), this); getLogger().info("══════════════════════════════════"); diff --git a/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java b/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java index 5190fb7..dee2277 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java @@ -27,7 +27,6 @@ * /marry home - Ir al home compartido * /marry delhome - Eliminar home compartido * /marry tp - Teleportarse a la pareja - * /marry chat - Activar/desactivar chat de pareja * /marry estado - Ver estado del matrimonio * /marry ayuda - Mostrar ayuda */ @@ -38,7 +37,7 @@ public class MarryCommand implements CommandExecutor, TabCompleter { private static final List SUBCOMMANDS = List.of( "proponer", "aceptar", "rechazar", "divorcio", - "sethome", "home", "delhome", "tp", "chat", "estado", "ayuda" + "sethome", "home", "delhome", "tp", "estado", "ayuda" ); public MarryCommand(MarryPlugin plugin, MarriageManager manager) { @@ -99,8 +98,6 @@ public boolean onCommand(@NotNull CommandSender sender, case "tp", "tele" -> manager.tpToPartner(player); - case "chat" -> manager.toggleChat(player); - case "estado", "status" -> manager.showStatus(player); case "ayuda", "help" -> showHelp(player); @@ -123,7 +120,6 @@ private void showHelp(Player player) { player.sendMessage(colorize("&d/marry home &7- Ir al home de pareja")); player.sendMessage(colorize("&d/marry delhome &7- Eliminar home de pareja")); player.sendMessage(colorize("&d/marry tp &7- Teleportarse a tu pareja")); - player.sendMessage(colorize("&d/marry chat &7- Activar/desactivar chat de pareja")); player.sendMessage(colorize("&d/marry estado &7- Ver estado del matrimonio")); player.sendMessage(colorize("&d&m ")); } diff --git a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java index 096d5e0..4b03c3c 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java @@ -6,7 +6,7 @@ /** * Modelo de datos de un matrimonio. - * Contiene los UUID de ambos cónyuges, el home compartido y el estado del chat. + * Contiene los UUID de ambos cónyuges, el home compartido y la fecha. */ public class MarriageData { @@ -16,10 +16,6 @@ public class MarriageData { // Home compartido (puede ser null si no se ha establecido) private Location sharedHome; - // Indica si el chat de pareja está activo para cada jugador - private boolean player1ChatActive; - private boolean player2ChatActive; - // Fecha de matrimonio (timestamp) private final long marriedAt; @@ -27,19 +23,14 @@ public MarriageData(UUID player1, UUID player2) { this.player1 = player1; this.player2 = player2; this.marriedAt = System.currentTimeMillis(); - this.player1ChatActive = false; - this.player2ChatActive = false; this.sharedHome = null; } // Constructor completo (para carga desde archivo) - public MarriageData(UUID player1, UUID player2, Location sharedHome, - boolean p1Chat, boolean p2Chat, long marriedAt) { + public MarriageData(UUID player1, UUID player2, Location sharedHome, long marriedAt) { this.player1 = player1; this.player2 = player2; this.sharedHome = sharedHome; - this.player1ChatActive = p1Chat; - this.player2ChatActive = p2Chat; this.marriedAt = marriedAt; } @@ -60,23 +51,6 @@ public boolean involves(UUID uuid) { return player1.equals(uuid) || player2.equals(uuid); } - /** - * Activa/desactiva el marry chat para un jugador específico. - */ - public void setChatActive(UUID uuid, boolean active) { - if (uuid.equals(player1)) player1ChatActive = active; - else if (uuid.equals(player2)) player2ChatActive = active; - } - - /** - * Devuelve si el marry chat está activo para un jugador específico. - */ - public boolean isChatActive(UUID uuid) { - if (uuid.equals(player1)) return player1ChatActive; - if (uuid.equals(player2)) return player2ChatActive; - return false; - } - // ---- Getters y Setters ---- public UUID getPlayer1() { return player1; } diff --git a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java index e754881..3d9f1ed 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java @@ -90,7 +90,7 @@ public void load() { } } - MarriageData data = new MarriageData(p1, p2, home, false, false, marriedAt); + MarriageData data = new MarriageData(p1, p2, home, marriedAt); marriagesByPlayer.put(p1, data); marriagesByPlayer.put(p2, data); diff --git a/MarryPlugin/src/main/java/dev/marryplugin/listeners/ChatListener.java b/MarryPlugin/src/main/java/dev/marryplugin/listeners/ChatListener.java deleted file mode 100644 index 94cb0b9..0000000 --- a/MarryPlugin/src/main/java/dev/marryplugin/listeners/ChatListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package dev.marryplugin.listeners; - -import dev.marryplugin.MarryPlugin; -import dev.marryplugin.managers.MarriageManager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; - -/** - * Intercepta los mensajes de chat para redirigirlos al canal de pareja - * cuando el jugador tiene el marry chat activado. - * - * Usa prioridad LOWEST para interceptar antes que otros plugins de chat. - */ -@SuppressWarnings("deprecation") // AsyncPlayerChatEvent es legacy pero sigue siendo compatible -public class ChatListener implements Listener { - - private final MarriageManager manager; - - public ChatListener(MarriageManager manager) { - this.manager = manager; - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onChat(AsyncPlayerChatEvent event) { - // Si el mensaje es interceptado por el marry chat, cancelar el evento global - boolean intercepted = manager.handleChat(event.getPlayer(), event.getMessage()); - if (intercepted) { - event.setCancelled(true); - } - } -} diff --git a/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java b/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java index 1869a87..ca09b8c 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java @@ -31,9 +31,6 @@ public void onPlayerQuit(PlayerQuitEvent event) { if (data == null) return; - // Desactivar el marry chat al desconectarse - data.setChatActive(player.getUniqueId(), false); - // Notificar a la pareja si está conectada Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); if (partner != null && partner.isOnline()) { diff --git a/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java b/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java index 982ec9d..d6f4078 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java @@ -5,6 +5,10 @@ import dev.marryplugin.data.MarriageStorage; import dev.marryplugin.data.ProposalData; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -76,8 +80,22 @@ public void propose(Player proposer, Player target) { pendingProposals.put(target.getUniqueId(), proposal); send(proposer, "&d&lHas enviado una solicitud de matrimonio a &f" + target.getName() + "&d!"); - send(target, "&d&l" + proposer.getName() + " &d<e ha propuesto matrimonio! &r" + - "&a/marry aceptar &7| &c/marry rechazar"); + + Component acceptBtn = Component.text(" [✔ Aceptar] ") + .color(NamedTextColor.GREEN) + .decorate(TextDecoration.BOLD) + .clickEvent(ClickEvent.runCommand("/marry aceptar")) + .hoverEvent(HoverEvent.showText(Component.text("Clic para aceptar"))); + Component rejectBtn = Component.text("[✗ Rechazar]") + .color(NamedTextColor.RED) + .decorate(TextDecoration.BOLD) + .clickEvent(ClickEvent.runCommand("/marry rechazar")) + .hoverEvent(HoverEvent.showText(Component.text("Clic para rechazar"))); + Component proposalMsg = colorize(plugin.getConfig().getString("plugin-prefix", "&d[Marry] ")) + .append(colorize("&d&l" + proposer.getName() + " &d<e ha propuesto matrimonio!")) + .append(acceptBtn) + .append(rejectBtn); + target.sendMessage(proposalMsg); // Tarea de expiración long timeoutSeconds = plugin.getConfig().getLong("proposal-timeout", 60); @@ -276,50 +294,6 @@ public void tpToPartner(Player player) { send(partner, "&a" + player.getName() + " se ha teletransportado a ti."); } - // ════════════════════════════════════════════════════════════ - // CHAT DE PAREJA - // ════════════════════════════════════════════════════════════ - - /** - * Activa/desactiva el marry chat para el jugador. - */ - public void toggleChat(Player player) { - MarriageData data = storage.getMarriage(player.getUniqueId()); - if (data == null) { send(player, "&cNo estas casado/a."); return; } - - boolean current = data.isChatActive(player.getUniqueId()); - data.setChatActive(player.getUniqueId(), !current); - - if (!current) { - send(player, "&dChat de pareja &aactivado&d. Tus mensajes irán a tu pareja."); - } else { - send(player, "&dChat de pareja &cdesactivado&d."); - } - } - - /** - * Envía un mensaje a través del chat de pareja. - * @return true si el mensaje fue interceptado por el marry chat - */ - public boolean handleChat(Player player, String message) { - MarriageData data = storage.getMarriage(player.getUniqueId()); - if (data == null) return false; - if (!data.isChatActive(player.getUniqueId())) return false; - - Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); - String prefix = plugin.getConfig().getString("chat-prefix", "&d&l[❤ Pareja] &r"); - String formatted = prefix + "&f" + player.getName() + ": &r" + message; - - player.sendMessage(colorize(formatted)); - if (partner != null && partner.isOnline()) { - partner.sendMessage(colorize(formatted)); - } else { - send(player, "&7(Tu pareja no esta conectada, el mensaje no fue entregado)"); - } - - return true; // mensaje interceptado, no va al chat global - } - // ════════════════════════════════════════════════════════════ // INFORMACION // ════════════════════════════════════════════════════════════ @@ -334,12 +308,10 @@ public void showStatus(Player player) { UUID partnerUuid = data.getPartnerOf(player.getUniqueId()); String partnerName = getPlayerName(partnerUuid); String homeStatus = data.getSharedHome() != null ? "&aEstablecido" : "&cNo establecido"; - String chatStatus = data.isChatActive(player.getUniqueId()) ? "&aActivo" : "&cInactivo"; send(player, "&d&l--- Estado de Matrimonio ---"); send(player, "&7Pareja: &f" + partnerName); send(player, "&7Home compartido: " + homeStatus); - send(player, "&7Chat de pareja: " + chatStatus); } // ════════════════════════════════════════════════════════════ From 585d2d80a9d1061eef4817fe87dd93016360d70f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 18:50:54 +0000 Subject: [PATCH 2/4] Reemplazar /marry proponer por /marry y quitar /marry home MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /marry ahora propone matrimonio directamente sin subcomando - Elimina /marry proponer y /marry home (comando y método goHome) - Tab completion en args[1] sugiere subcomandos + jugadores online - Actualiza ayuda y javadocs https://claude.ai/code/session_018xHAmj4mCTsiinizeVrzKJ --- .../java/dev/marryplugin/MarryPlugin.java | 3 +- .../marryplugin/commands/MarryCommand.java | 51 +++++++------------ .../marryplugin/managers/MarriageManager.java | 17 ------- 3 files changed, 20 insertions(+), 51 deletions(-) diff --git a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java index 38b9cbd..2ab714f 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java @@ -10,12 +10,11 @@ * Clase principal del plugin MarryPlugin. * * Comandos: - * /marry proponer - Proponer matrimonio (a 5 bloques o menos) + * /marry - Proponer matrimonio (a 5 bloques o menos) * /marry aceptar - Aceptar propuesta * /marry rechazar - Rechazar propuesta * /marry divorcio - Divorciarse (sin importar distancia ni conexión) * /marry sethome - Establecer home de pareja - * /marry home - Ir al home de pareja * /marry delhome - Eliminar home de pareja * /marry tp - Teleportarse a la pareja * /marry estado - Ver estado del matrimonio diff --git a/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java b/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java index dee2277..40d5064 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java @@ -19,12 +19,11 @@ * Manejador del comando /marry con todos sus subcomandos. * * Subcomandos: - * /marry proponer - Proponer matrimonio + * /marry - Proponer matrimonio * /marry aceptar - Aceptar propuesta * /marry rechazar - Rechazar propuesta * /marry divorcio - Divorciarse * /marry sethome - Establecer home compartido - * /marry home - Ir al home compartido * /marry delhome - Eliminar home compartido * /marry tp - Teleportarse a la pareja * /marry estado - Ver estado del matrimonio @@ -36,8 +35,8 @@ public class MarryCommand implements CommandExecutor, TabCompleter { private final MarriageManager manager; private static final List SUBCOMMANDS = List.of( - "proponer", "aceptar", "rechazar", "divorcio", - "sethome", "home", "delhome", "tp", "estado", "ayuda" + "aceptar", "rechazar", "divorcio", + "sethome", "delhome", "tp", "estado", "ayuda" ); public MarryCommand(MarryPlugin plugin, MarriageManager manager) { @@ -71,19 +70,6 @@ public boolean onCommand(@NotNull CommandSender sender, switch (args[0].toLowerCase()) { - case "proponer", "propose" -> { - if (args.length < 2) { - player.sendMessage(colorize(prefix() + "&cUso: /marry proponer ")); - return true; - } - Player target = Bukkit.getPlayerExact(args[1]); - if (target == null || !target.isOnline()) { - player.sendMessage(colorize(prefix() + "&cEse jugador no esta conectado.")); - return true; - } - manager.propose(player, target); - } - case "aceptar", "accept" -> manager.acceptProposal(player); case "rechazar", "deny", "reject" -> manager.rejectProposal(player); @@ -92,8 +78,6 @@ public boolean onCommand(@NotNull CommandSender sender, case "sethome" -> manager.setHome(player); - case "home" -> manager.goHome(player); - case "delhome", "removehome" -> manager.removeHome(player); case "tp", "tele" -> manager.tpToPartner(player); @@ -103,7 +87,13 @@ public boolean onCommand(@NotNull CommandSender sender, case "ayuda", "help" -> showHelp(player); default -> { - player.sendMessage(colorize(prefix() + "&cSubcomando desconocido. Usa &d/marry ayuda&c.")); + // Intentar proponer matrimonio al jugador con ese nombre + Player target = Bukkit.getPlayerExact(args[0]); + if (target == null || !target.isOnline()) { + player.sendMessage(colorize(prefix() + "&cEse jugador no esta conectado.")); + return true; + } + manager.propose(player, target); } } @@ -112,12 +102,11 @@ public boolean onCommand(@NotNull CommandSender sender, private void showHelp(Player player) { player.sendMessage(colorize("&d&m &r &d&lMarryPlugin &d&m ")); - player.sendMessage(colorize("&d/marry proponer &7- Proponer matrimonio")); + player.sendMessage(colorize("&d/marry &7- Proponer matrimonio")); player.sendMessage(colorize("&d/marry aceptar &7- Aceptar solicitud")); player.sendMessage(colorize("&d/marry rechazar &7- Rechazar solicitud")); player.sendMessage(colorize("&d/marry divorcio &7- Divorciarse")); player.sendMessage(colorize("&d/marry sethome &7- Establecer home de pareja")); - player.sendMessage(colorize("&d/marry home &7- Ir al home de pareja")); player.sendMessage(colorize("&d/marry delhome &7- Eliminar home de pareja")); player.sendMessage(colorize("&d/marry tp &7- Teleportarse a tu pareja")); player.sendMessage(colorize("&d/marry estado &7- Ver estado del matrimonio")); @@ -132,18 +121,16 @@ private void showHelp(Player player) { if (!(sender instanceof Player)) return List.of(); if (args.length == 1) { - return SUBCOMMANDS.stream() - .filter(s -> s.startsWith(args[0].toLowerCase())) - .toList(); - } - - // Autocompletar jugador para /marry proponer - if (args.length == 2 && args[0].equalsIgnoreCase("proponer")) { - String input = args[1].toLowerCase(); - return Bukkit.getOnlinePlayers().stream() + String input = args[0].toLowerCase(); + // Subcomandos + nombres de jugadores online (excepto el propio jugador) + List suggestions = new java.util.ArrayList<>(); + SUBCOMMANDS.stream().filter(s -> s.startsWith(input)).forEach(suggestions::add); + Bukkit.getOnlinePlayers().stream() + .filter(p -> !p.equals(sender)) .map(Player::getName) .filter(name -> name.toLowerCase().startsWith(input)) - .toList(); + .forEach(suggestions::add); + return suggestions; } return List.of(); diff --git a/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java b/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java index d6f4078..a10bb0a 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java @@ -233,23 +233,6 @@ public void setHome(Player player) { } } - /** - * Teletransporta al jugador al home compartido. - */ - public void goHome(Player player) { - MarriageData data = storage.getMarriage(player.getUniqueId()); - if (data == null) { send(player, "&cNo estas casado/a."); return; } - - Location home = data.getSharedHome(); - if (home == null || home.getWorld() == null) { - send(player, "&cNo teneis un home de pareja establecido. Usa &d/marry sethome&c."); - return; - } - - player.teleport(home); - send(player, "&aTeletransportado al home de pareja."); - } - /** * Elimina el home compartido. */ From f4b938e99e6c1aab5db5c3024672d5f80fc6eeda Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 19:22:02 +0000 Subject: [PATCH 3/4] =?UTF-8?q?Limpiar=20comandos=20y=20a=C3=B1adir=20noti?= =?UTF-8?q?ficaci=C3=B3n=20de=20conexi=C3=B3n=20de=20pareja?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Elimina sethome, delhome, home, estado: solo existen marry , aceptar, rechazar, divorcio y tp - Elimina sharedHome de MarriageData y MarriageStorage por completo - Elimina setHome, removeHome, showStatus de MarriageManager - PlayerListener: añade onPlayerJoin para notificar a la pareja cuando el cónyuge se conecta (igual que al desconectarse) - Mensaje de conexión en rosa ❤, desconexión en gris ❤ https://claude.ai/code/session_018xHAmj4mCTsiinizeVrzKJ --- .../java/dev/marryplugin/MarryPlugin.java | 5 +- .../marryplugin/commands/MarryCommand.java | 52 ++------ .../dev/marryplugin/data/MarriageData.java | 25 +--- .../dev/marryplugin/data/MarriageStorage.java | 84 +----------- .../marryplugin/listeners/PlayerListener.java | 30 +++-- .../marryplugin/managers/MarriageManager.java | 121 ++---------------- 6 files changed, 46 insertions(+), 271 deletions(-) diff --git a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java index 2ab714f..6f0a21a 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java @@ -13,11 +13,8 @@ * /marry - Proponer matrimonio (a 5 bloques o menos) * /marry aceptar - Aceptar propuesta * /marry rechazar - Rechazar propuesta - * /marry divorcio - Divorciarse (sin importar distancia ni conexión) - * /marry sethome - Establecer home de pareja - * /marry delhome - Eliminar home de pareja + * /marry divorcio - Divorciarse * /marry tp - Teleportarse a la pareja - * /marry estado - Ver estado del matrimonio */ public final class MarryPlugin extends JavaPlugin { diff --git a/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java b/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java index 40d5064..d071b43 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/commands/MarryCommand.java @@ -13,21 +13,16 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; /** - * Manejador del comando /marry con todos sus subcomandos. - * - * Subcomandos: - * /marry - Proponer matrimonio - * /marry aceptar - Aceptar propuesta - * /marry rechazar - Rechazar propuesta - * /marry divorcio - Divorciarse - * /marry sethome - Establecer home compartido - * /marry delhome - Eliminar home compartido - * /marry tp - Teleportarse a la pareja - * /marry estado - Ver estado del matrimonio - * /marry ayuda - Mostrar ayuda + * Comandos disponibles: + * /marry - Proponer matrimonio + * /marry aceptar - Aceptar propuesta + * /marry rechazar - Rechazar propuesta + * /marry divorcio - Divorciarse + * /marry tp - Teleportarse a la pareja */ public class MarryCommand implements CommandExecutor, TabCompleter { @@ -35,8 +30,7 @@ public class MarryCommand implements CommandExecutor, TabCompleter { private final MarriageManager manager; private static final List SUBCOMMANDS = List.of( - "aceptar", "rechazar", "divorcio", - "sethome", "delhome", "tp", "estado", "ayuda" + "aceptar", "rechazar", "divorcio", "tp" ); public MarryCommand(MarryPlugin plugin, MarriageManager manager) { @@ -50,21 +44,18 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull String label, @NotNull String[] args) { - // Solo jugadores pueden usar este comando if (!(sender instanceof Player player)) { sender.sendMessage(colorize("&cSolo los jugadores pueden usar este comando.")); return true; } - // Sin permiso if (!player.hasPermission("marry.use")) { player.sendMessage(colorize("&cNo tienes permiso para usar este comando.")); return true; } - // Sin argumentos → mostrar ayuda if (args.length == 0) { - showHelp(player); + player.sendMessage(colorize(prefix() + "&dUso: /marry &7| &daceptar &7| &drechazar &7| &ddivorcio &7| &dtp")); return true; } @@ -76,18 +67,9 @@ public boolean onCommand(@NotNull CommandSender sender, case "divorcio", "divorce" -> manager.divorce(player); - case "sethome" -> manager.setHome(player); - - case "delhome", "removehome" -> manager.removeHome(player); - case "tp", "tele" -> manager.tpToPartner(player); - case "estado", "status" -> manager.showStatus(player); - - case "ayuda", "help" -> showHelp(player); - default -> { - // Intentar proponer matrimonio al jugador con ese nombre Player target = Bukkit.getPlayerExact(args[0]); if (target == null || !target.isOnline()) { player.sendMessage(colorize(prefix() + "&cEse jugador no esta conectado.")); @@ -100,19 +82,6 @@ public boolean onCommand(@NotNull CommandSender sender, return true; } - private void showHelp(Player player) { - player.sendMessage(colorize("&d&m &r &d&lMarryPlugin &d&m ")); - player.sendMessage(colorize("&d/marry &7- Proponer matrimonio")); - player.sendMessage(colorize("&d/marry aceptar &7- Aceptar solicitud")); - player.sendMessage(colorize("&d/marry rechazar &7- Rechazar solicitud")); - player.sendMessage(colorize("&d/marry divorcio &7- Divorciarse")); - player.sendMessage(colorize("&d/marry sethome &7- Establecer home de pareja")); - player.sendMessage(colorize("&d/marry delhome &7- Eliminar home de pareja")); - player.sendMessage(colorize("&d/marry tp &7- Teleportarse a tu pareja")); - player.sendMessage(colorize("&d/marry estado &7- Ver estado del matrimonio")); - player.sendMessage(colorize("&d&m ")); - } - @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @@ -122,8 +91,7 @@ private void showHelp(Player player) { if (args.length == 1) { String input = args[0].toLowerCase(); - // Subcomandos + nombres de jugadores online (excepto el propio jugador) - List suggestions = new java.util.ArrayList<>(); + List suggestions = new ArrayList<>(); SUBCOMMANDS.stream().filter(s -> s.startsWith(input)).forEach(suggestions::add); Bukkit.getOnlinePlayers().stream() .filter(p -> !p.equals(sender)) diff --git a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java index 4b03c3c..de83ea8 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java @@ -1,61 +1,40 @@ package dev.marryplugin.data; -import org.bukkit.Location; - import java.util.UUID; /** * Modelo de datos de un matrimonio. - * Contiene los UUID de ambos cónyuges, el home compartido y la fecha. */ public class MarriageData { private final UUID player1; private final UUID player2; - - // Home compartido (puede ser null si no se ha establecido) - private Location sharedHome; - - // Fecha de matrimonio (timestamp) private final long marriedAt; public MarriageData(UUID player1, UUID player2) { this.player1 = player1; this.player2 = player2; this.marriedAt = System.currentTimeMillis(); - this.sharedHome = null; } - // Constructor completo (para carga desde archivo) - public MarriageData(UUID player1, UUID player2, Location sharedHome, long marriedAt) { + // Constructor para carga desde archivo + public MarriageData(UUID player1, UUID player2, long marriedAt) { this.player1 = player1; this.player2 = player2; - this.sharedHome = sharedHome; this.marriedAt = marriedAt; } - /** - * Devuelve el UUID del cónyuge del jugador dado. - * @return UUID del cónyuge, o null si el UUID no pertenece a este matrimonio - */ public UUID getPartnerOf(UUID uuid) { if (uuid.equals(player1)) return player2; if (uuid.equals(player2)) return player1; return null; } - /** - * Verifica si el UUID dado pertenece a este matrimonio. - */ public boolean involves(UUID uuid) { return player1.equals(uuid) || player2.equals(uuid); } - // ---- Getters y Setters ---- - public UUID getPlayer1() { return player1; } public UUID getPlayer2() { return player2; } - public Location getSharedHome() { return sharedHome; } - public void setSharedHome(Location sharedHome) { this.sharedHome = sharedHome; } public long getMarriedAt() { return marriedAt; } } diff --git a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java index 3d9f1ed..71b774c 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/data/MarriageStorage.java @@ -1,9 +1,6 @@ package dev.marryplugin.data; import dev.marryplugin.MarryPlugin; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; @@ -14,18 +11,12 @@ /** * Gestiona la persistencia de los matrimonios en un archivo YAML (marriages.yml). * - * Formato del archivo: + * Formato: * marriages: * -: * player1: * player2: * married-at: - * home-world: - * home-x: - * home-y: - * home-z: - * home-yaw: - * home-pitch: */ public class MarriageStorage { @@ -33,8 +24,6 @@ public class MarriageStorage { private final File dataFile; private YamlConfiguration yaml; - // Mapa en memoria: UUID de cualquier cónyuge → datos del matrimonio - // Cada matrimonio tiene DOS entradas (una por UUID) apuntando al mismo objeto private final Map marriagesByPlayer = new HashMap<>(); public MarriageStorage(MarryPlugin plugin) { @@ -43,13 +32,6 @@ public MarriageStorage(MarryPlugin plugin) { load(); } - // ════════════════════════════════════════════════════════════ - // Carga / Guardado - // ════════════════════════════════════════════════════════════ - - /** - * Carga todos los matrimonios desde el archivo YAML. - */ public void load() { if (!dataFile.exists()) { plugin.getDataFolder().mkdirs(); @@ -69,31 +51,14 @@ public void load() { for (String key : section.getKeys(false)) { var entry = section.getConfigurationSection(key); if (entry == null) continue; - try { UUID p1 = UUID.fromString(Objects.requireNonNull(entry.getString("player1"))); UUID p2 = UUID.fromString(Objects.requireNonNull(entry.getString("player2"))); long marriedAt = entry.getLong("married-at", System.currentTimeMillis()); - // Cargar home compartido si existe - Location home = null; - String worldName = entry.getString("home-world"); - if (worldName != null) { - World world = Bukkit.getWorld(worldName); - if (world != null) { - double x = entry.getDouble("home-x"); - double y = entry.getDouble("home-y"); - double z = entry.getDouble("home-z"); - float yaw = (float) entry.getDouble("home-yaw"); - float pitch = (float) entry.getDouble("home-pitch"); - home = new Location(world, x, y, z, yaw, pitch); - } - } - - MarriageData data = new MarriageData(p1, p2, home, marriedAt); + MarriageData data = new MarriageData(p1, p2, marriedAt); marriagesByPlayer.put(p1, data); marriagesByPlayer.put(p2, data); - } catch (Exception e) { plugin.getLogger().warning("Error al cargar matrimonio con clave: " + key); } @@ -102,36 +67,18 @@ public void load() { plugin.getLogger().info("Matrimonios cargados: " + (marriagesByPlayer.size() / 2)); } - /** - * Guarda todos los matrimonios en el archivo YAML. - */ public void save() { - yaml.set("marriages", null); // limpiar sección + yaml.set("marriages", null); - // Deduplicar (solo guardar cada matrimonio una vez) Set saved = new HashSet<>(); - for (MarriageData data : marriagesByPlayer.values()) { if (saved.contains(data)) continue; saved.add(data); - String key = data.getPlayer1() + "-" + data.getPlayer2(); - String base = "marriages." + key; - + String base = "marriages." + data.getPlayer1() + "-" + data.getPlayer2(); yaml.set(base + ".player1", data.getPlayer1().toString()); yaml.set(base + ".player2", data.getPlayer2().toString()); yaml.set(base + ".married-at", data.getMarriedAt()); - - // Guardar home si existe - Location home = data.getSharedHome(); - if (home != null && home.getWorld() != null) { - yaml.set(base + ".home-world", home.getWorld().getName()); - yaml.set(base + ".home-x", home.getX()); - yaml.set(base + ".home-y", home.getY()); - yaml.set(base + ".home-z", home.getZ()); - yaml.set(base + ".home-yaw", (double) home.getYaw()); - yaml.set(base + ".home-pitch", (double) home.getPitch()); - } } try { @@ -141,13 +88,6 @@ public void save() { } } - // ════════════════════════════════════════════════════════════ - // Operaciones - // ════════════════════════════════════════════════════════════ - - /** - * Registra un nuevo matrimonio entre dos jugadores. - */ public MarriageData addMarriage(UUID p1, UUID p2) { MarriageData data = new MarriageData(p1, p2); marriagesByPlayer.put(p1, data); @@ -156,9 +96,6 @@ public MarriageData addMarriage(UUID p1, UUID p2) { return data; } - /** - * Elimina el matrimonio de un jugador. - */ public void removeMarriage(UUID uuid) { MarriageData data = marriagesByPlayer.get(uuid); if (data == null) return; @@ -167,24 +104,11 @@ public void removeMarriage(UUID uuid) { save(); } - /** - * Obtiene los datos del matrimonio de un jugador, o null si no está casado. - */ public MarriageData getMarriage(UUID uuid) { return marriagesByPlayer.get(uuid); } - /** - * Verifica si un jugador está casado. - */ public boolean isMarried(UUID uuid) { return marriagesByPlayer.containsKey(uuid); } - - /** - * Guarda los cambios de un matrimonio existente (ej: nuevo home). - */ - public void updateMarriage(MarriageData data) { - save(); - } } diff --git a/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java b/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java index ca09b8c..279afce 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java @@ -8,12 +8,9 @@ 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; -/** - * Escucha eventos de jugadores para notificar a la pareja cuando alguien se desconecta, - * y para limpiar el estado del chat de pareja. - */ public class PlayerListener implements Listener { private final MarryPlugin plugin; @@ -25,19 +22,32 @@ public PlayerListener(MarryPlugin plugin, MarriageManager manager) { } @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { + public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); MarriageData data = manager.getStorage().getMarriage(player.getUniqueId()); + if (data == null) return; + + Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); + if (partner != null && partner.isOnline()) { + partner.sendMessage(msg("&d❤ Tu pareja &f" + player.getName() + " &dse ha conectado.")); + } + } + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + MarriageData data = manager.getStorage().getMarriage(player.getUniqueId()); if (data == null) return; - // Notificar a la pareja si está conectada Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); if (partner != null && partner.isOnline()) { - partner.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize( - plugin.getConfig().getString("plugin-prefix", "&d[Marry] ") + - "&7Tu pareja &f" + player.getName() + " &7se ha desconectado." - )); + partner.sendMessage(msg("&7❤ Tu pareja &f" + player.getName() + " &7se ha desconectado.")); } } + + private net.kyori.adventure.text.Component msg(String text) { + return LegacyComponentSerializer.legacyAmpersand().deserialize( + plugin.getConfig().getString("plugin-prefix", "&d[Marry] ") + text + ); + } } diff --git a/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java b/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java index a10bb0a..edfc0f8 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/managers/MarriageManager.java @@ -11,7 +11,6 @@ import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; @@ -20,17 +19,14 @@ import java.util.UUID; /** - * Núcleo del plugin. Gestiona propuestas, matrimonios, homes, chat y teleporte. + * Núcleo del plugin. Gestiona propuestas, matrimonios y teleporte. */ public class MarriageManager { private final MarryPlugin plugin; private final MarriageStorage storage; - // Propuestas pendientes: UUID del objetivo → ProposalData private final Map pendingProposals = new HashMap<>(); - - // Tareas de expiración de propuestas private final Map expirationTasks = new HashMap<>(); public MarriageManager(MarryPlugin plugin, MarriageStorage storage) { @@ -42,42 +38,32 @@ public MarriageManager(MarryPlugin plugin, MarriageStorage storage) { // PROPUESTAS // ════════════════════════════════════════════════════════════ - /** - * Envía una propuesta de matrimonio. - * Valida distancia, estado actual y que no haya propuesta duplicada. - */ public void propose(Player proposer, Player target) { - // Ya casado if (storage.isMarried(proposer.getUniqueId())) { - send(proposer, "&cYa estas casado/a. Divorciante primero con /marry divorcio"); + send(proposer, "&cYa estas casado/a. Divorciate primero con /marry divorcio"); return; } if (storage.isMarried(target.getUniqueId())) { send(proposer, "&c" + target.getName() + " ya esta casado/a."); return; } - // Auto-propuesta if (proposer.getUniqueId().equals(target.getUniqueId())) { send(proposer, "&cNo puedes proponerte matrimonio a ti mismo."); return; } - // Mismos mundos y distancia if (!proposer.getWorld().equals(target.getWorld()) || proposer.getLocation().distance(target.getLocation()) > plugin.getConfig().getDouble("proposal-distance", 5)) { send(proposer, "&cDebes estar a " + (int) plugin.getConfig().getDouble("proposal-distance", 5) + " bloques o menos de " + target.getName() + " para proponer matrimonio."); return; } - // Propuesta duplicada if (pendingProposals.containsKey(target.getUniqueId()) && pendingProposals.get(target.getUniqueId()).getProposer().equals(proposer.getUniqueId())) { send(proposer, "&cYa le enviaste una solicitud a " + target.getName() + ". Espera a que responda."); return; } - // Registrar propuesta - ProposalData proposal = new ProposalData(proposer.getUniqueId(), target.getUniqueId()); - pendingProposals.put(target.getUniqueId(), proposal); + pendingProposals.put(target.getUniqueId(), new ProposalData(proposer.getUniqueId(), target.getUniqueId())); send(proposer, "&d&lHas enviado una solicitud de matrimonio a &f" + target.getName() + "&d!"); @@ -91,13 +77,13 @@ public void propose(Player proposer, Player target) { .decorate(TextDecoration.BOLD) .clickEvent(ClickEvent.runCommand("/marry rechazar")) .hoverEvent(HoverEvent.showText(Component.text("Clic para rechazar"))); - Component proposalMsg = colorize(plugin.getConfig().getString("plugin-prefix", "&d[Marry] ")) - .append(colorize("&d&l" + proposer.getName() + " &d<e ha propuesto matrimonio!")) - .append(acceptBtn) - .append(rejectBtn); - target.sendMessage(proposalMsg); + target.sendMessage( + colorize(plugin.getConfig().getString("plugin-prefix", "&d[Marry] ")) + .append(colorize("&d&l" + proposer.getName() + " &d<e ha propuesto matrimonio!")) + .append(acceptBtn) + .append(rejectBtn) + ); - // Tarea de expiración long timeoutSeconds = plugin.getConfig().getLong("proposal-timeout", 60); BukkitTask task = Bukkit.getScheduler().runTaskLater(plugin, () -> { if (pendingProposals.containsKey(target.getUniqueId()) && @@ -109,14 +95,10 @@ public void propose(Player proposer, Player target) { expirationTasks.remove(target.getUniqueId()); }, timeoutSeconds * 20L); - // Cancelar tarea anterior si existía BukkitTask old = expirationTasks.put(target.getUniqueId(), task); if (old != null) old.cancel(); } - /** - * El objetivo acepta la propuesta de matrimonio. - */ public void acceptProposal(Player target) { ProposalData proposal = pendingProposals.remove(target.getUniqueId()); cancelExpirationTask(target.getUniqueId()); @@ -126,23 +108,19 @@ public void acceptProposal(Player target) { return; } - // Verificar que el proponente sigue conectado Player proposer = Bukkit.getPlayer(proposal.getProposer()); if (proposer == null || !proposer.isOnline()) { send(target, "&cEl jugador que te propuso matrimonio ya no esta conectado."); return; } - // Verificar que ninguno se haya casado mientras tanto if (storage.isMarried(proposer.getUniqueId()) || storage.isMarried(target.getUniqueId())) { send(target, "&cUno de los dos ya esta casado."); return; } - // Crear matrimonio storage.addMarriage(proposer.getUniqueId(), target.getUniqueId()); - // Mensajes String msg = buildMarryMessage(proposer.getName(), target.getName()); if (plugin.getConfig().getBoolean("broadcast-marry", true)) { Bukkit.broadcast(colorize(plugin.getConfig().getString("plugin-prefix", "&d[Marry] ") + msg)); @@ -150,14 +128,8 @@ public void acceptProposal(Player target) { send(proposer, msg); send(target, msg); } - - send(proposer, "&7Usa &d/marry sethome &7para establecer vuestra casa compartida."); - send(target, "&7Usa &d/marry sethome &7para establecer vuestra casa compartida."); } - /** - * El objetivo rechaza la propuesta. - */ public void rejectProposal(Player target) { ProposalData proposal = pendingProposals.remove(target.getUniqueId()); cancelExpirationTask(target.getUniqueId()); @@ -178,10 +150,6 @@ public void rejectProposal(Player target) { // DIVORCIO // ════════════════════════════════════════════════════════════ - /** - * Divorcia al jugador de su cónyuge. - * No requiere que el cónyuge esté conectado. - */ public void divorce(Player player) { MarriageData data = storage.getMarriage(player.getUniqueId()); if (data == null) { @@ -203,65 +171,16 @@ public void divorce(Player player) { if (partner != null && partner.isOnline()) send(partner, msg); } - // Notificar al cónyuge si está conectado Player partner = Bukkit.getPlayer(partnerUuid); if (partner != null && partner.isOnline()) { send(partner, "&cTe has divorciado de " + player.getName() + "."); } } - // ════════════════════════════════════════════════════════════ - // HOME COMPARTIDO - // ════════════════════════════════════════════════════════════ - - /** - * Establece el home compartido en la ubicación actual del jugador. - */ - public void setHome(Player player) { - MarriageData data = storage.getMarriage(player.getUniqueId()); - if (data == null) { send(player, "&cNo estas casado/a."); return; } - - data.setSharedHome(player.getLocation().clone()); - storage.updateMarriage(data); - - send(player, "&aHome de pareja establecido en tu ubicacion actual."); - - // Notificar al cónyuge - Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); - if (partner != null && partner.isOnline()) { - send(partner, "&a" + player.getName() + " ha actualizado el home de pareja."); - } - } - - /** - * Elimina el home compartido. - */ - public void removeHome(Player player) { - MarriageData data = storage.getMarriage(player.getUniqueId()); - if (data == null) { send(player, "&cNo estas casado/a."); return; } - - if (data.getSharedHome() == null) { - send(player, "&cNo teneis un home de pareja establecido."); - return; - } - - data.setSharedHome(null); - storage.updateMarriage(data); - send(player, "&cHome de pareja eliminado."); - - Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); - if (partner != null && partner.isOnline()) { - send(partner, "&c" + player.getName() + " ha eliminado el home de pareja."); - } - } - // ════════════════════════════════════════════════════════════ // TELEPORTE A LA PAREJA // ════════════════════════════════════════════════════════════ - /** - * Teleporta al jugador a su cónyuge (requiere que esté conectado). - */ public void tpToPartner(Player player) { MarriageData data = storage.getMarriage(player.getUniqueId()); if (data == null) { send(player, "&cNo estas casado/a."); return; } @@ -277,26 +196,6 @@ public void tpToPartner(Player player) { send(partner, "&a" + player.getName() + " se ha teletransportado a ti."); } - // ════════════════════════════════════════════════════════════ - // INFORMACION - // ════════════════════════════════════════════════════════════ - - public void showStatus(Player player) { - MarriageData data = storage.getMarriage(player.getUniqueId()); - if (data == null) { - send(player, "&7No estas casado/a."); - return; - } - - UUID partnerUuid = data.getPartnerOf(player.getUniqueId()); - String partnerName = getPlayerName(partnerUuid); - String homeStatus = data.getSharedHome() != null ? "&aEstablecido" : "&cNo establecido"; - - send(player, "&d&l--- Estado de Matrimonio ---"); - send(player, "&7Pareja: &f" + partnerName); - send(player, "&7Home compartido: " + homeStatus); - } - // ════════════════════════════════════════════════════════════ // UTILIDADES PRIVADAS // ════════════════════════════════════════════════════════════ @@ -319,7 +218,6 @@ private String buildDivorceMessage(String p1, String p2) { private String getPlayerName(UUID uuid) { Player online = Bukkit.getPlayer(uuid); if (online != null) return online.getName(); - // Buscar nombre offline var offline = Bukkit.getOfflinePlayer(uuid); return offline.getName() != null ? offline.getName() : uuid.toString().substring(0, 8); } @@ -336,6 +234,5 @@ private Component colorize(String msg) { return LegacyComponentSerializer.legacyAmpersand().deserialize(msg); } - // ---- Getter para storage ---- public MarriageStorage getStorage() { return storage; } } From 1b81e9f1cd126c8e0734b8b8d9560261100a2d2d Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 29 Mar 2026 14:05:15 +0000 Subject: [PATCH 4/4] =?UTF-8?q?Eliminar=20mensajes=20de=20conexi=C3=B3n=20?= =?UTF-8?q?y=20a=C3=B1adir=20placeholders=20de=20PlaceholderAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Elimina PlayerListener (mensajes de conexión/desconexión de pareja) - Añade PlaceholderAPI como softdepend y dependencia en pom.xml - Crea MarryPlaceholders con dos placeholders: %marry_pareja% → nombre de la pareja o "Soltero/a" %marry_estado% → "Activo" si casado, "Inactivo" si no - Actualiza plugin.yml (softdepend, usage) y config.yml (elimina chat-prefix) https://claude.ai/code/session_018xHAmj4mCTsiinizeVrzKJ --- MarryPlugin/pom.xml | 10 +++ .../java/dev/marryplugin/MarryPlugin.java | 44 +++++------- .../marryplugin/listeners/PlayerListener.java | 53 -------------- .../placeholders/MarryPlaceholders.java | 69 +++++++++++++++++++ MarryPlugin/src/main/resources/config.yml | 3 - MarryPlugin/src/main/resources/plugin.yml | 3 +- 6 files changed, 97 insertions(+), 85 deletions(-) delete mode 100644 MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java create mode 100644 MarryPlugin/src/main/java/dev/marryplugin/placeholders/MarryPlaceholders.java diff --git a/MarryPlugin/pom.xml b/MarryPlugin/pom.xml index aafdbf6..b7bec63 100644 --- a/MarryPlugin/pom.xml +++ b/MarryPlugin/pom.xml @@ -24,6 +24,10 @@ papermc https://repo.papermc.io/repository/maven-public/ + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + @@ -33,6 +37,12 @@ 1.21.1-R0.1-SNAPSHOT provided + + me.clip + placeholderapi + 2.11.6 + provided + diff --git a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java index 6f0a21a..48a5223 100644 --- a/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java +++ b/MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java @@ -2,19 +2,23 @@ import dev.marryplugin.commands.MarryCommand; import dev.marryplugin.data.MarriageStorage; -import dev.marryplugin.listeners.PlayerListener; import dev.marryplugin.managers.MarriageManager; +import dev.marryplugin.placeholders.MarryPlaceholders; import org.bukkit.plugin.java.JavaPlugin; /** * Clase principal del plugin MarryPlugin. * * Comandos: - * /marry - Proponer matrimonio (a 5 bloques o menos) - * /marry aceptar - Aceptar propuesta - * /marry rechazar - Rechazar propuesta - * /marry divorcio - Divorciarse - * /marry tp - Teleportarse a la pareja + * /marry - Proponer matrimonio (a 5 bloques o menos) + * /marry aceptar - Aceptar propuesta + * /marry rechazar - Rechazar propuesta + * /marry divorcio - Divorciarse + * /marry tp - Teleportarse a la pareja + * + * Placeholders (requiere PlaceholderAPI): + * %marry_pareja% - Nombre de la pareja o "Soltero/a" + * %marry_estado% - "Activo" si casado, "Inactivo" si no */ public final class MarryPlugin extends JavaPlugin { @@ -23,16 +27,11 @@ public final class MarryPlugin extends JavaPlugin { @Override public void onEnable() { - // Guardar config por defecto si no existe saveDefaultConfig(); - // Inicializar almacenamiento storage = new MarriageStorage(this); - - // Inicializar gestor de lógica manager = new MarriageManager(this, storage); - // Registrar comando MarryCommand commandExecutor = new MarryCommand(this, manager); var cmd = getCommand("marry"); if (cmd != null) { @@ -40,39 +39,28 @@ public void onEnable() { cmd.setTabCompleter(commandExecutor); } - // Registrar listeners - getServer().getPluginManager().registerEvents(new PlayerListener(this, manager), this); + // Registrar placeholders si PlaceholderAPI está disponible + if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) { + new MarryPlaceholders(this).register(); + getLogger().info("PlaceholderAPI detectado — placeholders registrados."); + } getLogger().info("══════════════════════════════════"); getLogger().info(" MarryPlugin v" + getDescription().getVersion() + " activado."); - getLogger().info(" Matrimonios cargados: " + countMarriages()); getLogger().info("══════════════════════════════════"); } @Override public void onDisable() { - // Guardar datos al apagar - if (storage != null) { - storage.save(); - } + if (storage != null) storage.save(); getLogger().info("MarryPlugin desactivado. Datos guardados."); } - /** - * Recarga la configuración del plugin. - */ public void reloadPluginConfig() { reloadConfig(); storage.load(); } - private int countMarriages() { - // Estimación simple: el mapa tiene dos entradas por matrimonio - return 0; // Se registra en el log de storage.load() - } - - // ---- Getters ---- - public MarriageStorage getStorage() { return storage; } public MarriageManager getMarriageManager() { return manager; } } diff --git a/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java b/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java deleted file mode 100644 index 279afce..0000000 --- a/MarryPlugin/src/main/java/dev/marryplugin/listeners/PlayerListener.java +++ /dev/null @@ -1,53 +0,0 @@ -package dev.marryplugin.listeners; - -import dev.marryplugin.MarryPlugin; -import dev.marryplugin.data.MarriageData; -import dev.marryplugin.managers.MarriageManager; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -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; - -public class PlayerListener implements Listener { - - private final MarryPlugin plugin; - private final MarriageManager manager; - - public PlayerListener(MarryPlugin plugin, MarriageManager manager) { - this.plugin = plugin; - this.manager = manager; - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); - MarriageData data = manager.getStorage().getMarriage(player.getUniqueId()); - if (data == null) return; - - Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); - if (partner != null && partner.isOnline()) { - partner.sendMessage(msg("&d❤ Tu pareja &f" + player.getName() + " &dse ha conectado.")); - } - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - Player player = event.getPlayer(); - MarriageData data = manager.getStorage().getMarriage(player.getUniqueId()); - if (data == null) return; - - Player partner = Bukkit.getPlayer(data.getPartnerOf(player.getUniqueId())); - if (partner != null && partner.isOnline()) { - partner.sendMessage(msg("&7❤ Tu pareja &f" + player.getName() + " &7se ha desconectado.")); - } - } - - private net.kyori.adventure.text.Component msg(String text) { - return LegacyComponentSerializer.legacyAmpersand().deserialize( - plugin.getConfig().getString("plugin-prefix", "&d[Marry] ") + text - ); - } -} diff --git a/MarryPlugin/src/main/java/dev/marryplugin/placeholders/MarryPlaceholders.java b/MarryPlugin/src/main/java/dev/marryplugin/placeholders/MarryPlaceholders.java new file mode 100644 index 0000000..ef4c2c9 --- /dev/null +++ b/MarryPlugin/src/main/java/dev/marryplugin/placeholders/MarryPlaceholders.java @@ -0,0 +1,69 @@ +package dev.marryplugin.placeholders; + +import dev.marryplugin.MarryPlugin; +import dev.marryplugin.data.MarriageData; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +/** + * Placeholders disponibles: + * %marry_pareja% → Nombre de la pareja, o "Soltero/a" si no está casado + * %marry_estado% → "Activo" si está casado, "Inactivo" si no + */ +public class MarryPlaceholders extends PlaceholderExpansion { + + private final MarryPlugin plugin; + + public MarryPlaceholders(MarryPlugin plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "marry"; + } + + @Override + public @NotNull String getAuthor() { + return String.join(", ", plugin.getDescription().getAuthors()); + } + + @Override + public @NotNull String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + if (player == null) return ""; + + MarriageData data = plugin.getMarriageManager().getStorage().getMarriage(player.getUniqueId()); + + return switch (params.toLowerCase()) { + case "pareja" -> { + if (data == null) yield "Soltero/a"; + yield getPartnerName(data.getPartnerOf(player.getUniqueId())); + } + case "estado" -> data != null ? "Activo" : "Inactivo"; + default -> null; + }; + } + + private String getPartnerName(UUID uuid) { + if (uuid == null) return "Soltero/a"; + var online = Bukkit.getPlayer(uuid); + if (online != null) return online.getName(); + var offline = Bukkit.getOfflinePlayer(uuid); + return offline.getName() != null ? offline.getName() : "Soltero/a"; + } +} diff --git a/MarryPlugin/src/main/resources/config.yml b/MarryPlugin/src/main/resources/config.yml index cc6e233..eac1fae 100644 --- a/MarryPlugin/src/main/resources/config.yml +++ b/MarryPlugin/src/main/resources/config.yml @@ -8,9 +8,6 @@ proposal-distance: 5 # Tiempo en segundos que dura una solicitud de matrimonio antes de expirar proposal-timeout: 60 -# Prefijo del chat de pareja (marry chat) -chat-prefix: '&d&l[❤ Pareja&d&l] &r' - # Prefijo general del plugin en mensajes plugin-prefix: '&d[MarryPlugin] &r' diff --git a/MarryPlugin/src/main/resources/plugin.yml b/MarryPlugin/src/main/resources/plugin.yml index ee623bf..7138922 100644 --- a/MarryPlugin/src/main/resources/plugin.yml +++ b/MarryPlugin/src/main/resources/plugin.yml @@ -4,11 +4,12 @@ main: dev.marryplugin.MarryPlugin api-version: '1.21' description: Plugin de matrimonio para Paper 1.21.x authors: [ TuNombre ] +softdepend: [ PlaceholderAPI ] commands: marry: description: Comandos de matrimonio - usage: /marry [jugador] + usage: /marry aliases: [ marriage ] permissions: