Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions MarryPlugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories>

<dependencies>
Expand All @@ -33,6 +37,12 @@
<version>1.21.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.6</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
Expand Down
51 changes: 16 additions & 35 deletions MarryPlugin/src/main/java/dev/marryplugin/MarryPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,23 @@

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 dev.marryplugin.placeholders.MarryPlaceholders;
import org.bukkit.plugin.java.JavaPlugin;

/**
* Clase principal del plugin MarryPlugin.
*
* Comandos:
* /marry proponer <jugador> - 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 chat - Activar/desactivar chat de pareja
* /marry estado - Ver estado del matrimonio
* /marry <jugador> - 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 {

Expand All @@ -29,57 +27,40 @@ 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) {
cmd.setExecutor(commandExecutor);
cmd.setTabCompleter(commandExecutor);
}

// Registrar listeners
getServer().getPluginManager().registerEvents(new ChatListener(manager), this);
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; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,24 @@
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 <jugador> - 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 chat - Activar/desactivar chat de pareja
* /marry estado - Ver estado del matrimonio
* /marry ayuda - Mostrar ayuda
* Comandos disponibles:
* /marry <jugador> - 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 {

private final MarryPlugin plugin;
private final MarriageManager manager;

private static final List<String> SUBCOMMANDS = List.of(
"proponer", "aceptar", "rechazar", "divorcio",
"sethome", "home", "delhome", "tp", "chat", "estado", "ayuda"
"aceptar", "rechazar", "divorcio", "tp"
);

public MarryCommand(MarryPlugin plugin, MarriageManager manager) {
Expand All @@ -52,82 +44,44 @@ 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 <jugador> &7| &daceptar &7| &drechazar &7| &ddivorcio &7| &dtp"));
return true;
}

switch (args[0].toLowerCase()) {

case "proponer", "propose" -> {
if (args.length < 2) {
player.sendMessage(colorize(prefix() + "&cUso: /marry proponer <jugador>"));
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);

case "divorcio", "divorce" -> manager.divorce(player);

case "sethome" -> manager.setHome(player);

case "home" -> manager.goHome(player);

case "delhome", "removehome" -> manager.removeHome(player);

case "tp", "tele" -> manager.tpToPartner(player);

case "chat" -> manager.toggleChat(player);

case "estado", "status" -> manager.showStatus(player);

case "ayuda", "help" -> showHelp(player);

default -> {
player.sendMessage(colorize(prefix() + "&cSubcomando desconocido. Usa &d/marry ayuda&c."));
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);
}
}

return true;
}

private void showHelp(Player player) {
player.sendMessage(colorize("&d&m &r &d&lMarryPlugin &d&m "));
player.sendMessage(colorize("&d/marry proponer <jugador> &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 chat &7- Activar/desactivar chat de pareja"));
player.sendMessage(colorize("&d/marry estado &7- Ver estado del matrimonio"));
player.sendMessage(colorize("&d&m "));
}

@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender,
@NotNull Command command,
Expand All @@ -136,18 +90,15 @@ 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();
List<String> suggestions = new 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();
Expand Down
51 changes: 2 additions & 49 deletions MarryPlugin/src/main/java/dev/marryplugin/data/MarriageData.java
Original file line number Diff line number Diff line change
@@ -1,87 +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 el estado del chat.
*/
public class MarriageData {

private final UUID player1;
private final UUID player2;

// 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;

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) {
// Constructor para carga desde archivo
public MarriageData(UUID player1, UUID player2, long marriedAt) {
this.player1 = player1;
this.player2 = player2;
this.sharedHome = sharedHome;
this.player1ChatActive = p1Chat;
this.player2ChatActive = p2Chat;
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);
}

/**
* 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; }
public UUID getPlayer2() { return player2; }
public Location getSharedHome() { return sharedHome; }
public void setSharedHome(Location sharedHome) { this.sharedHome = sharedHome; }
public long getMarriedAt() { return marriedAt; }
}
Loading