From cca5bed6eecedd32d6db4d48ee376d53328c084d Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 21:35:23 +0800 Subject: [PATCH 01/23] Reimplemented elder arenas implementation --- src/main/java/com/ceraia/arena/Double.java | 110 +++ src/main/java/com/ceraia/arena/Utils.java | 62 ++ .../arena/commands/arena/CommandArena.java | 337 +++++++ .../arena/commands/arena/CommandGVG.java | 278 ++++++ .../arena/commands/arena/CommandPVP.java | 223 +++++ .../arena/commands/arena/CommandProfile.java | 73 ++ .../arena/commands/arena/CommandTop.java | 77 ++ .../commands/factions/CommandFaction.java | 98 ++ .../arena/commands/system/CommandMod.java | 135 +++ .../arena/commands/system/CommandVersion.java | 34 + .../arena/listeners/ArenaBlockListener.java | 44 + .../arena/listeners/ArenaExplodeListener.java | 104 +++ .../arena/listeners/ArenaFightListener.java | 200 ++++ .../listeners/PlayerEloChangeListener.java | 30 + .../arena/listeners/PlayerEventListener.java | 37 + .../listeners/PlayerInventoryListener.java | 49 + .../arena/listeners/SpellsListener.java | 216 +++++ .../ceraia/arena/managers/ArenaManager.java | 84 ++ .../arena/managers/EloScoreboardManager.java | 39 + .../ceraia/arena/managers/FactionManager.java | 81 ++ .../ceraia/arena/managers/InviteManager.java | 25 + .../ceraia/arena/managers/PlayerManager.java | 196 ++++ .../java/com/ceraia/arena/misc/Metrics.java | 871 ++++++++++++++++++ .../java/com/ceraia/arena/types/Arena.java | 439 +++++++++ .../ceraia/arena/types/ArenaSelectGUI.java | 240 +++++ .../com/ceraia/arena/types/DoublePlayer.java | 215 +++++ .../java/com/ceraia/arena/types/Faction.java | 89 ++ 27 files changed, 4386 insertions(+) create mode 100644 src/main/java/com/ceraia/arena/Double.java create mode 100644 src/main/java/com/ceraia/arena/Utils.java create mode 100644 src/main/java/com/ceraia/arena/commands/arena/CommandArena.java create mode 100644 src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java create mode 100644 src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java create mode 100644 src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java create mode 100644 src/main/java/com/ceraia/arena/commands/arena/CommandTop.java create mode 100644 src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java create mode 100644 src/main/java/com/ceraia/arena/commands/system/CommandMod.java create mode 100644 src/main/java/com/ceraia/arena/commands/system/CommandVersion.java create mode 100644 src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java create mode 100644 src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java create mode 100644 src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java create mode 100644 src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java create mode 100644 src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java create mode 100644 src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java create mode 100644 src/main/java/com/ceraia/arena/listeners/SpellsListener.java create mode 100644 src/main/java/com/ceraia/arena/managers/ArenaManager.java create mode 100644 src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java create mode 100644 src/main/java/com/ceraia/arena/managers/FactionManager.java create mode 100644 src/main/java/com/ceraia/arena/managers/InviteManager.java create mode 100644 src/main/java/com/ceraia/arena/managers/PlayerManager.java create mode 100644 src/main/java/com/ceraia/arena/misc/Metrics.java create mode 100644 src/main/java/com/ceraia/arena/types/Arena.java create mode 100644 src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java create mode 100644 src/main/java/com/ceraia/arena/types/DoublePlayer.java create mode 100644 src/main/java/com/ceraia/arena/types/Faction.java diff --git a/src/main/java/com/ceraia/arena/Double.java b/src/main/java/com/ceraia/arena/Double.java new file mode 100644 index 0000000..41e40a3 --- /dev/null +++ b/src/main/java/com/ceraia/arena/Double.java @@ -0,0 +1,110 @@ +package com.ceraia.arena; + +import com.ceraia.arena.commands.arena.*; +import com.ceraia.arena.commands.factions.CommandFaction; +import com.ceraia.arena.commands.system.CommandMod; +import com.ceraia.arena.commands.system.CommandVersion; +import com.ceraia.arena.listeners.*; +import com.ceraia.arena.managers.*; +import com.ceraia.arena.misc.Metrics; +import com.ceraia.arena.types.ArenaSelectGUI; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.util.Objects; + +public class Double extends JavaPlugin { + + private ArenaManager arenaManager; + private InviteManager inviteManager; + private ArenaSelectGUI arenaSelectGUI; + private CommandGVG commandGVG; + private PlayerManager playerManager; + Metrics metrics; + private EloScoreboardManager eloScoreBoardManager; + private FactionManager factionManager; + + public void onEnable() { + metrics = new Metrics(this, 20303); + + saveDefaultConfig(); + new File(getDataFolder(), "data/arenas").mkdirs(); + new File(getDataFolder(), "data/items").mkdirs(); + new File(getDataFolder(), "data/users").mkdirs(); + new File(getDataFolder(), "data/factions").mkdirs(); + + // Managers + this.factionManager = new FactionManager(this); + this.arenaManager = new ArenaManager(this); + this.playerManager = new PlayerManager(this); + this.eloScoreBoardManager = new EloScoreboardManager(this); + this.inviteManager = new InviteManager(); + + this.arenaSelectGUI = new ArenaSelectGUI(this); + this.commandGVG = new CommandGVG(this); + + // Command + CommandPVP commandPVP = new CommandPVP(this); + CommandArena commandArena = new CommandArena(this); + CommandMod commandMod = new CommandMod(this); + CommandTop commandTop = new CommandTop(this); + CommandProfile commandProfile = new CommandProfile(this); + CommandVersion commandVersion = new CommandVersion(this); + CommandFaction commandFaction = new CommandFaction(this); + + // Listeners + new PlayerEloChangeListener(this); + new ArenaFightListener(this); + new PlayerInventoryListener(this); + new ArenaBlockListener(this); + new ArenaExplodeListener(this); + new SpellsListener(this); + + // PvP Commands + Objects.requireNonNull(getCommand("pvp")).setExecutor(commandPVP); + Objects.requireNonNull(getCommand("arena")).setExecutor(commandArena); + Objects.requireNonNull(getCommand("gvg")).setExecutor(commandGVG); + Objects.requireNonNull(getCommand("top")).setExecutor(commandTop); + Objects.requireNonNull(getCommand("leaderboard")).setExecutor(commandTop); + Objects.requireNonNull(getCommand("profile")).setExecutor(commandProfile); + Objects.requireNonNull(getCommand("stats")).setExecutor(commandProfile); + + // System Misc + Objects.requireNonNull(getCommand("mod")).setExecutor(commandMod); + Objects.requireNonNull(getCommand("version")).setExecutor(commandVersion); + + // Faction Commands + Objects.requireNonNull(getCommand("faction")).setExecutor(commandFaction); + } + + public void onDisable() { + metrics.shutdown(); + playerManager.savePlayers(); + factionManager.saveFactions(); + } + + public ArenaManager getArenaManager() { + return arenaManager; + } + + public PlayerManager getPlayerManager() { + return playerManager; + } + + public InviteManager getInviteManager() { + return inviteManager; + } + + public ArenaSelectGUI getArenaSelectGUI() { + return arenaSelectGUI; + } + + public CommandGVG getGroupManager() { + return commandGVG; + } + + public FactionManager getFactionManager() { + return factionManager; + } + +} diff --git a/src/main/java/com/ceraia/arena/Utils.java b/src/main/java/com/ceraia/arena/Utils.java new file mode 100644 index 0000000..e5fe233 --- /dev/null +++ b/src/main/java/com/ceraia/arena/Utils.java @@ -0,0 +1,62 @@ +package com.ceraia.arena; + +import com.ceraia.arena.types.Arena; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.util.Objects; + +public class Utils { + + public static void revertInventory(Double plugin, Player pl, Arena arena) { + try { + File file = new File(plugin.getDataFolder(), "data/pinventory_" + arena.getName() + "_" + pl.getName() + ".yml"); + + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + + ItemStack[] content = new ItemStack[pl.getInventory().getContents().length]; + try { + for (String s : Objects.requireNonNull(config.getConfigurationSection("items")).getKeys(false)) { + int i = Integer.parseInt(s); + content[i] = config.getItemStack("items." + s); + }} catch (Exception e) { + System.out.println("Problem loading player inventories."); + } + + pl.getInventory().setContents(content); + + file.delete(); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Problem loading player inventory"); + } + } + + public static void teleportPlayerToSpawn(Double plugin, Player player, Arena arena) { + String useLocation = plugin.getConfig().getString("spawn_teleport.use"); + assert useLocation != null; + if (useLocation.equalsIgnoreCase("command")) { + Bukkit.dispatchCommand( + Bukkit.getConsoleSender(), + Objects.requireNonNull(plugin.getConfig().getString("spawn_teleport.command")) + .replace("%player%", player.getName()) + ); + } else if (useLocation.equalsIgnoreCase("prior")) { + Location l = arena.getPlayerPriorLocation(player); + player.teleport(l); + } else { + Location l = new Location( + Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("spawn_teleport.location.world"))), + plugin.getConfig().getDouble("spawn_teleport.location.x"), + plugin.getConfig().getDouble("spawn_teleport.location.y"), + plugin.getConfig().getDouble("spawn_teleport.location.z") + ); + player.teleport(l); + } + } +} diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java b/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java new file mode 100644 index 0000000..b9be439 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java @@ -0,0 +1,337 @@ +package com.ceraia.arena.commands.arena; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.Arena; +import com.ceraia.arena.types.DoublePlayer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +public class CommandArena implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandArena(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if(!sender.hasPermission("xdbl.arena")){ + sender.sendMessage(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.no_permission"))); + return true; + } + + if (args.length == 0) { + arenaHelp(sender); + return true; + } + + if (args[0].equalsIgnoreCase("list")) { + arenaList(sender); + return true; + } + + if (args[0].equalsIgnoreCase("scoreboard") || args[0].equalsIgnoreCase("top")) { + Player p = (Player) sender; + + // Create and show a string list of the top 10 players with the highest elo + List top = new ArrayList<>(); + AtomicInteger i = new AtomicInteger(); + i.set(1); + + top.add(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.scoreboard.top"))); + + plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(DoublePlayer::getElo).reversed()).limit(10).forEach(ap -> { + String playerName = Bukkit.getOfflinePlayer(ap.getUUID()).getName(); + int elo = ap.getElo(); + + String medal; // Default medal color for players outside the top 3 + + // Check for 1st, 2nd, and 3rd place + if (i.get() == 1) { + medal = ""; // Gold for 1st place + } else if (i.get() == 2) { + medal = "<#C0C0C0>"; // Silver for 2nd place + } else if (i.get() == 3) { + medal = "<#cd7f32>"; // Bronze for 3rd place + } else { + medal = ""; // Default medal color for players outside the top 3 + } + + top.add(MiniMessage.miniMessage().deserialize(medal + i + " " + playerName + " - " + elo + " ELO (" + (ap.wins() + ap.losses()) + " games)")); + i.getAndIncrement(); + }); + + // Send the top 10 players with the highest elo to the player + top.forEach(p::sendMessage); + + return true; + } + + if (args[0].equalsIgnoreCase("delete")) { + arenaDelete(sender, args); + return true; + } + if (args[0].equalsIgnoreCase("create")) { + arenaCreate(sender, args); + return true; + } + if (args[0].equalsIgnoreCase("sp1")) { + arenaSP1(sender, args); + return true; + } + if (args[0].equalsIgnoreCase("sp2")) { + arenaSP2(sender, args); + return true; + } + if (args[0].equalsIgnoreCase("public")) { + arenaPublic(sender, args); + return true; + } + else { + badUsage(sender); + arenaHelp(sender); + return true; + } + } + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String label, String[] args) { + List arenas = new ArrayList<>(); + + if (args.length == 1) { + return Arrays.asList("list", "delete", "public", "create", "sp1", "sp2", "top", "scoreboard"); + } else if (args.length == 2 && ( + args[0].equalsIgnoreCase("delete") || + args[0].equalsIgnoreCase("public") || + args[0].equalsIgnoreCase("sp1") || + args[0].equalsIgnoreCase("sp2"))) { + plugin.getArenaManager().getArenas().forEach(a ->{ + if (a.getOwner().equals(sender.getName())) { + arenas.add(a.getName()); + } + }); + return arenas; + } else if (args.length == 2 && args[0].equalsIgnoreCase("create")) { + return Arrays.asList(""); + } else if ((args.length == 3 && args[0].equalsIgnoreCase("public"))) { + return Arrays.asList("true", "false"); + } + return new ArrayList<>(); + } + + private void arenaSP1(CommandSender sender, String[] args) { + if (args.length == 1) { + badUsage(sender); + return; + } + + String name = args[1]; + + Arena arena = plugin.getArenaManager().getArena(name); + if (arena == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) + ); + return; + } + if (!Objects.equals(arena.getOwner(), sender.getName())) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_yours")) + ); + return; + } + arena.setSpawnPoint1(((Player) sender).getLocation()); + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.sp1.success")) + ); + } + + private void arenaSP2(CommandSender sender, String[] args) { + if (args.length == 1) { + badUsage(sender); + return; + } + + String name = args[1]; + + Arena arena = plugin.getArenaManager().getArena(name); + if (arena == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) + ); + return; + } + + if (!Objects.equals(arena.getOwner(), sender.getName())) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_yours")) + ); + return; + } + arena.setSpawnPoint2(((Player) sender).getLocation()); + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.sp2.success")) + ); + } + + private void arenaCreate(CommandSender sender, String[] args) { + if (args.length == 1) { + badUsage(sender); + return; + } + + String name = args[1]; + + // Check if the user is banned from creating arenas + if (plugin.getPlayerManager().getDoublePlayer(((Player) sender).getUniqueId()).arenaBanned()){ + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.banned")) + ); + return; + } + + // Check if the string is the same as , if so state the user should put a name + if (name.equalsIgnoreCase("")) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.no_name")) + ); + return; + } + // Check if the string is alphanumeric + if (!name.matches("[a-zA-Z0-9]*")) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.alphanumeric")) + ); + return; + } + + // Check if the arena already exists + if (plugin.getArenaManager().getArenas().stream().filter(a -> a.getName().equalsIgnoreCase(name)).count() > 0) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.exists")) + ); + return; + } + + File file = new File(plugin.getDataFolder(), "data/arenas/" + name + ".yml"); + + Arena arena = new Arena(plugin, name, sender.getName(), ((Player) sender).getLocation(), ((Player) sender).getLocation(), false, false, file); + + arena.setSpawnPoint1(((Player) sender).getLocation()); + arena.setSpawnPoint2(((Player) sender).getLocation()); + + plugin.getArenaManager().addArena(arena); + + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.success")) + ); + } + + private void arenaDelete(CommandSender sender, String[] args) { + if (args.length == 1) { + badUsage(sender); + return; + } + + String name = args[1]; + Arena arena = plugin.getArenaManager().getArena(name); + if (arena == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) + ); + return; + } + if (!arena.getOwner().equals(sender.getName())) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_yours")) + ); + return; + } + if (arena.getState() != Arena.ArenaState.WAITING) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.delete.running")) + ); + return; + } + + arena.delete(); + plugin.getArenaManager().removeArena(arena); + + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.delete.delete")) + ); + } + + private void arenaPublic(CommandSender sender, String[] args) { + if (args.length == 1) { + badUsage(sender); + return; + } + + String name = args[1]; + Arena arena = plugin.getArenaManager().getArena(name); + if (arena == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) + ); + return; + } + if (!arena.getOwner().equals(sender.getName())) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_yours")) + ); + return; + } + + boolean isPublic = arena.isPublic(); + + if (isPublic) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.public_command.success_private")) + ); + } else { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.public_command.success_public")) + ); + } + + arena.setPublic(!isPublic); + } + + private void badUsage(CommandSender sender) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.bad_usage"))); + } + + private void arenaList(CommandSender sender) { + List arenas = plugin.getArenaManager().getArenas().stream().filter(arena -> arena.getOwner().equals(sender.getName())).collect(Collectors.toList()); + plugin.getConfig().getStringList("messages.arena.list").forEach(s -> { + if (s.contains("%arenas%")) { + arenas.forEach(a -> { + sender.sendMessage(MiniMessage.miniMessage().deserialize(s.replace("%arenas%", a.getName()) + + (a.getSpawnPoint1() != null ? " (" + a.getSpawnPoint1().getBlockX() + ", " + a.getSpawnPoint1().getBlockY() + ", " + a.getSpawnPoint1().getBlockZ() + ")" : ""))); + }); + } else { + sender.sendMessage(MiniMessage.miniMessage().deserialize(s)); + } + }); + } + + private void arenaHelp(CommandSender sender) { + plugin.getConfig().getStringList("messages.arena.help").forEach(s -> { + sender.sendMessage(MiniMessage.miniMessage().deserialize(s)); + }); + } +} diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java b/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java new file mode 100644 index 0000000..676e6cf --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java @@ -0,0 +1,278 @@ +package com.ceraia.arena.commands.arena; + +import com.ceraia.arena.Double; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.stream.Collectors; + +public class CommandGVG implements CommandExecutor, TabCompleter, Listener { + + private final Double plugin; + private final Map> groups = new HashMap<>(); + private final Map playersByGroup = new HashMap<>(); + + private final Map invites = new HashMap<>(); + + public CommandGVG(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if(!sender.hasPermission("xdbl.gvg")){ + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.no_permission")))); + return true; + } + + if (args.length == 0) { + plugin.getConfig().getStringList("messages.gvg.help").forEach(s -> sender.sendMessage(MiniMessage.miniMessage().deserialize(s))); + return true; + } + + Player player = (Player) sender; + + if (args[0].equalsIgnoreCase("invite")) { + if (playersByGroup.containsKey(player) && !groups.containsKey(player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.dont_have_group")))); + return true; + } + + if (args.length == 1) { + badUsage(sender); + return true; + } + + List targets = new ArrayList<>(); + List notOnline = new ArrayList<>(); + + for (int i = 1; i < args.length; i++) { + Player target = Bukkit.getPlayer(args[i]); + if (target == null) { + notOnline.add(args[i]); + } else { + targets.add(target); + } + + if (playersByGroup.containsKey(target)) { + assert target != null; + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.invite.already_in_group")) + .replace("%player%", target.getName()))); + return true; + } + } + + if (targets.contains(player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.invite.cant_invite_yourself")))); + return true; + } + + if (notOnline.size() > 0) { + System.out.println(notOnline); + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.player_offline")) + .replace("%player%", String.join(", ", notOnline)))); + return true; + } + + for (Player target : targets) { + Component message = Objects.requireNonNull( + MiniMessage.miniMessage().deserialize( + Objects.requireNonNull( + plugin.getConfig().getString("messages.gvg.invite.invite_message") + ).replace("%inviter%", player.getName() + ) + ) + ); + target.sendMessage(message); + + invites.put(target, player); + } + + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.invite.invite_sent")) + .replace("%player%", targets.stream().map(Player::getName).collect(Collectors.joining(", "))))); + return true; + } + else if (args[0].equalsIgnoreCase("accept")) { + Player inviter = invites.get(player); + + if (inviter == null || !inviter.isOnline()) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.accept.invite_not_found")))); + return true; + } + + if (playersByGroup.containsKey(inviter) && !groups.containsKey(inviter)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.accept.invite_not_found")))); + return true; + } + + if (playersByGroup.containsKey(player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.accept.you_already_in_group")))); + return true; + } + + List group = groups.get(inviter); + if (group == null) { + group = new ArrayList<>(); + group.add(inviter); + playersByGroup.put(inviter, inviter); + } + group.add(player); + groups.put(inviter, group); + + playersByGroup.put(player, inviter); + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.accept.accepted")))); + for (Player pl : group) { + pl.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.accept.invite_accepted")) + .replace("%player%", player.getName()))); + } + return true; + } + else if (args[0].equalsIgnoreCase("leave")) { + leaveGang(player); + } + else if (args[0].equalsIgnoreCase("kick")) { + if (!groups.containsKey(player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.kick.not_in_group")))); + return true; + } + + if (args.length == 1) { + badUsage(sender); + return true; + } + + Player target = plugin.getServer().getPlayer(args[1]); + if (target == null) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.player_offline")) + .replace("%player%", args[1]))); + return true; + } + + List group = groups.get(player); + + if (!group.contains(target)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.kick.player_not_in_group")))); + return true; + } + + group.remove(target); + playersByGroup.remove(target); + + target.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.kick.you_kicked")))); + + if (group.size() <= 1) { + + groups.get(player).forEach(p -> { + player.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.you_left")))); + playersByGroup.remove(p); + groups.remove(player); + }); + + groups.remove(player); + } else { + group.forEach(p -> p.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.kicked")) + .replace("%player%", target.getName())))); + } + return true; + } + else if (args[0].equalsIgnoreCase("fight")) { + String playerName = args[1]; + Player invited = Bukkit.getPlayer(playerName); + + if (invited == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.player_offline")) + .replace("%player%", playerName))); + return true; + } + + if (invited == player) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.invite.invite_yourself")))); + return true; + } + + if (!groups.containsKey(player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.not_in_group")))); + return true; + } + + if (!groups.containsKey(invited) || (groups.get(player).contains(invited) || groups.get(invited).contains(player))) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.player_not_in_group")))); + return true; + } + + plugin.getArenaSelectGUI().openArenaList(player, invited); + } + + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args){ + if (args.length == 1) { + return Arrays.asList("invite", "accept", "leave", "kick", "fight"); + } + else if (args.length == 2 && args[0].equalsIgnoreCase("kick")) { + return getPlayersByGroup((Player) sender).stream().map(Player::getName).collect(Collectors.toList()); + } + else if (args.length == 2 && (args[0].equalsIgnoreCase("invite") ||args[0].equalsIgnoreCase("fight"))) { + return Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); + } + + return new ArrayList<>(); + } + + private void leaveGang(Player player) { + if (!playersByGroup.containsKey(player)) { + player.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.not_in_group")))); + return; + } + + Player owner = playersByGroup.get(player); + List group = groups.get(owner); + + if (group != null || group.size() <= 2) { + group.forEach(pl -> { + pl.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.you_left")))); + playersByGroup.remove(pl); + }); + + groups.remove(owner); + } else { + group.forEach(p -> player.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.gvg.leave.player_left_group")) + .replace("%player%", player.getName())))); + + group.remove(player); + groups.put(owner, group); + + playersByGroup.remove(player); + } + } + + private void badUsage(CommandSender sender) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.bad_usage")))); + } + + public List getPlayersByGroup(Player player) { + return groups.get(player); + } + + @EventHandler + public void onQuit(PlayerQuitEvent e) { + Player player = e.getPlayer(); + if (playersByGroup.containsKey(player)) { + leaveGang(player); + } + } +} diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java b/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java new file mode 100644 index 0000000..de28af4 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java @@ -0,0 +1,223 @@ +package com.ceraia.arena.commands.arena; + +import com.ceraia.arena.Double; +import com.ceraia.arena.managers.InviteManager; +import com.ceraia.arena.types.Arena; +import com.ceraia.arena.types.DoublePlayer; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class CommandPVP implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandPVP(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if(!sender.hasPermission("xdbl.pvp")){ + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.no_permission")))); + return true; + } + + if (args.length == 0) { + pvpHelp(sender); + return true; + } + + // Check if the sender is pvpbanned + DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(((Player) sender).getUniqueId()); + if (doublePlayer.pvpBanned()) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.banned.cant_invite"))) + ); + return true; + } + + if (args[0].equalsIgnoreCase("accept")) { + Player p = (Player) sender; + + // Check if the player is banned + if (plugin.getPlayerManager().getDoublePlayer(p.getUniqueId()).pvpBanned()) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.banned.cant_accept"))) + ); + return true; + } + + InviteManager.Invite invite = plugin.getInviteManager().invites.get(p); + + if (invite == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.invite_not_found"))) + ); + plugin.getInviteManager().invites.remove(p); + return true; + } + + if (!invite.invited.isOnline() || !invite.inviter.isOnline()) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.other_player_offline"))) + ); + return true; + } + + if(invite.accepted){ + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.invite_already_accepted"))) + ); + return true; + } + + if (invite.arena.getState() != Arena.ArenaState.WAITING || plugin.getArenaManager().getArenas().stream().noneMatch( + a -> a.getName().equalsIgnoreCase(invite.arena.getName()) + )) { + for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { + pl.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.arena_not_ready"))) + ); + } + plugin.getInviteManager().invites.remove(p); + return true; + } + + List playersToFight = new ArrayList<>(); + + if (invite.group) { + List group1 = plugin.getGroupManager().getPlayersByGroup(invite.inviter); + List group2 = plugin.getGroupManager().getPlayersByGroup(invite.invited); + + if (group1 == null || group2 == null) { + for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { + pl.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.group.group_not_found"))) + ); + } + plugin.getInviteManager().invites.remove(p); + return true; + } + + if (group1.size() < 2 || group2.size() < 2) { + for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { + pl.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.group.group_too_small"))) + ); + } + plugin.getInviteManager().invites.remove(p); + return true; + } + + boolean allPlayersAreReady = true; + + for (Player pl : group1) { + if (plugin.getArenaManager().getArena(pl) != null) { + return true; + } + } + + for (Player pl : group2) { + if (plugin.getArenaManager().getArena(pl) != null) { + return true; + } + } + + if (!allPlayersAreReady) { + for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { + pl.sendMessage( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.invite_accept.group.someone_already_in_fight")) + ); + } + plugin.getInviteManager().invites.remove(p); + return true; + } + + playersToFight.addAll(group1); + playersToFight.addAll(group2); + + group1.forEach(pl -> invite.arena.addPlayer(pl, 1)); + group2.forEach(pl -> invite.arena.addPlayer(pl, 2)); + } else { + playersToFight.add(invite.invited); + playersToFight.add(invite.inviter); + invite.arena.addPlayer(invite.invited, 1); + invite.arena.addPlayer(invite.inviter, 2); + } + + // Starting arena + invite.accepted = true; + invite.arena.start(invite, playersToFight); + + return true; + } + + // open gui for invite player + + String playerName = args[0]; + + // reload for op + if (playerName.equalsIgnoreCase("reload") && sender.isOp()) { + plugin.reloadConfig(); + plugin.getArenaSelectGUI().reloadConfig(); + sender.sendMessage(MiniMessage.miniMessage().deserialize( + "Reloaded!") + ); + return true; + } // If the player is reload and the sender is op, reload the config + + Player invited = Bukkit.getPlayer(playerName); + + if (invited == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.invite.player_offline"))) + ); + return true; + } // If the player is offline, return + + Player inviter = (Player) sender; + + if (inviter == invited) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.invite.invite_self"))) + ); + return true; + } // If the inviter is the same as the invited, return + + plugin.getArenaSelectGUI().openArenaList(inviter, invited); + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (args.length == 1) { + List tabOptions = new ArrayList<>(); + // If there is an argument, suggest online player names + for (Player player : Bukkit.getOnlinePlayers()) { + // Exclude the sender's name from the suggestions + if (!player.getName().equals(sender.getName())) { + tabOptions.add(player.getName()); + } + } + + return tabOptions; + } + // If there is more than one argument, return an empty list + return new ArrayList<>(); + } + + private void pvpHelp(CommandSender sender) { + plugin.getConfig().getStringList("messages.pvp.help").forEach(s -> sender.sendMessage(MiniMessage.miniMessage().deserialize(s))); + } +} diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java b/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java new file mode 100644 index 0000000..d9b5273 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java @@ -0,0 +1,73 @@ +package com.ceraia.arena.commands.arena; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.DoublePlayer; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class CommandProfile implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandProfile(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (!sender.hasPermission("xdbl.pvp")) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.no_permission")))); + return true; + } + + Player player; + if (args.length == 1) { + player = Bukkit.getPlayer(args[0]); + if (player == null) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.bad_usage")))); + return true; + } + } else { + player = (Player) sender; + } + + // Return the player's profile + DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(player.getUniqueId()); + plugin.getConfig().getStringList("messages.profile").forEach(s -> sender.sendMessage(MiniMessage.miniMessage().deserialize(s + .replace("%player%", player.getName()) + .replace("%elo%", String.valueOf(doublePlayer.getElo())) + .replace("%wins%", String.valueOf(doublePlayer.wins())) + .replace("%losses%", String.valueOf(doublePlayer.losses())) + .replace("%draws%", String.valueOf(doublePlayer.draws())) + .replace("%games%", String.valueOf(doublePlayer.wins() + doublePlayer.losses())) + .replace("%pvpbanned%", doublePlayer.pvpBanned() ? "Yes" : "No") + .replace("%arenabanned%", doublePlayer.arenaBanned() ? "Yes" : "No")))); + + + + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + // Return a list of all players + if (args.length == 1) { + List players = new ArrayList<>(); + Bukkit.getOnlinePlayers().forEach(p -> players.add(p.getName())); + return players; + } + return new ArrayList<>(); + } + + +} diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java b/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java new file mode 100644 index 0000000..c50c6f5 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java @@ -0,0 +1,77 @@ +package com.ceraia.arena.commands.arena; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.DoublePlayer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + +public class CommandTop implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandTop(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (!sender.hasPermission("xdbl.pvp")) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.no_permission")))); + return true; + } + + Player p = (Player) sender; + + // Create and show a string list of the top 10 players with the highest elo + List top = new ArrayList<>(); + AtomicInteger i = new AtomicInteger(); + i.set(1); + + top.add(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.scoreboard.top")))); + + plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(DoublePlayer::getElo).reversed()).limit(10).forEach(ap -> { + String playerName = Bukkit.getOfflinePlayer(ap.getUUID()).getName(); + int elo = ap.getElo(); + + String medal; // Default medal color for players outside the top 3 + + // Check for 1st, 2nd, and 3rd place + if (i.get() == 1) { + medal = ""; // Gold for 1st place + } else if (i.get() == 2) { + medal = "<#C0C0C0>"; // Silver for 2nd place + } else if (i.get() == 3) { + medal = "<#cd7f32>"; // Bronze for 3rd place + } else { + medal = ""; // Default medal color for players outside the top 3 + } + + top.add(MiniMessage.miniMessage().deserialize(medal + i + " " + playerName + " - " + elo + " ELO (" + (ap.wins() + ap.losses()) + " games)")); + i.getAndIncrement(); + }); + + // Send the top 10 players with the highest elo to the player + top.forEach(p::sendMessage); + + + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + return new ArrayList<>(); + } +} diff --git a/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java b/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java new file mode 100644 index 0000000..ff11d26 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java @@ -0,0 +1,98 @@ +package com.ceraia.arena.commands.factions; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.Faction; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class CommandFaction implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandFaction(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage("Only players can use this command"); + return true; + } + + switch (args[0]){ + case "add" -> { + switch (args[1]){ + case "faction" -> { + plugin.getLogger().info("faction addition called"); + Faction faction = plugin.getFactionManager().newFaction(args[2]); + faction.addMember(player.getName()); + faction.saveFaction(); + } + case "member" -> { + plugin.getLogger().info("member addition called"); + } + } + } + case "remove" -> { + switch (args[1]){ + case "faction" -> { + plugin.getLogger().info("faction removal not supported"); + } + case "member" -> { + plugin.getLogger().info("member removal not supported"); + } + } + } + } + + + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (args.length == 1) { + List tabOptions = new ArrayList<>(); + + tabOptions.add("add"); + tabOptions.add("remove"); + + return tabOptions; + } + if (args.length == 2) { + List tabOptions = new ArrayList<>(); + + tabOptions.add("member"); + tabOptions.add("faction"); + + return tabOptions; + } + if (args.length == 3) { + List tabOptions = new ArrayList<>(); + + if(Objects.equals(args[2], "member")) + for (Player player : Bukkit.getOnlinePlayers()) { + tabOptions.add(player.getName()); + } + + if(Objects.equals(args[2], "faction")) + for (Faction faction : plugin.getFactionManager().getFactions()) { + tabOptions.add(faction.getName()); + } + + return tabOptions; + } + // If there is more than one argument, return an empty list + return new ArrayList<>(); + } +} diff --git a/src/main/java/com/ceraia/arena/commands/system/CommandMod.java b/src/main/java/com/ceraia/arena/commands/system/CommandMod.java new file mode 100644 index 0000000..41deca5 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/system/CommandMod.java @@ -0,0 +1,135 @@ +package com.ceraia.arena.commands.system; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.DoublePlayer; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class CommandMod implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandMod(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (!sender.hasPermission("xdbl.mod")) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.no_permission")))); + return true; + } + + if (args.length == 0) { + ModHelp(sender); + return true; + } + + if (args.length == 1) { + if (args[0].equalsIgnoreCase("ban")) { + ModHelp(sender); + return true; + } + } + + if (args.length == 2) { + if (args[0].equalsIgnoreCase("ban")) { + if (args[1].equalsIgnoreCase("pvp")) { + ModHelp(sender); + return true; + } + if (args[1].equalsIgnoreCase("arena")) { + ModHelp(sender); + return true; + } + } + } + + if (args.length == 3) { + if (args[0].equalsIgnoreCase("ban")) { + Player target = Bukkit.getPlayer(args[2]); + + if (args[1].equalsIgnoreCase("arena")) { + if (target == null) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.player_not_found")))); + return true; + } + DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(target.getUniqueId()); + boolean arenabanned = doublePlayer.arenaBan(); + if (arenabanned) { + doublePlayer.addLog("Banned from creation of arenas by " + sender.getName()); + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.arena.banned")).replace("%player%", target.getName()))); + } else { + doublePlayer.addLog("Unbanned from creation of arenas by " + sender.getName()); + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.arena.unbanned")).replace("%player%", target.getName()))); + } + } + if (args[1].equalsIgnoreCase("pvp")) { + if (target == null) { + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.player_not_found")))); + return true; + } + DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(target.getUniqueId()); + boolean pvpbanned = doublePlayer.pvpBan(); + if (pvpbanned) { + doublePlayer.addLog("Banned from PVPing by " + sender.getName()); + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.pvp.banned")).replace("%player%", target.getName()))); + } else { + doublePlayer.addLog("Unbanned from PVPing by " + sender.getName()); + sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.pvp.unbanned")).replace("%player%", target.getName()))); + } + } + } + } + + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + if (args.length == 1) { + List tabOptions = new ArrayList<>(); + tabOptions.add("ban"); + tabOptions.add("remove"); + return tabOptions; + } + if (args.length == 2) { + List tabOptions = new ArrayList<>(); + if (args[1].equalsIgnoreCase("ban")) tabOptions.add("pvp"); + tabOptions.add("arena"); + return tabOptions; + } + if (args.length == 3) { + if (args[2].equalsIgnoreCase("pvp")) { + List tabOptions = new ArrayList<>(); + // If there is an argument, suggest online player names + for (Player player : Bukkit.getOnlinePlayers()) { + tabOptions.add(player.getName()); + } + return tabOptions; + } + if (args[2].equalsIgnoreCase("arena")) { + List tabOptions = new ArrayList<>(); + // If there is an argument, suggest all arena names + plugin.getArenaManager().getArenas().forEach(arena -> tabOptions.add(arena.getName())); + return tabOptions; + } + } + // If there is more than one argument, return an empty list + return new ArrayList<>(); + } + + private void ModHelp(CommandSender sender) { + plugin.getConfig().getStringList("messages.mod.help").forEach(s -> sender.sendMessage(MiniMessage.miniMessage().deserialize(s))); + } +} diff --git a/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java b/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java new file mode 100644 index 0000000..e432d44 --- /dev/null +++ b/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java @@ -0,0 +1,34 @@ +package com.ceraia.arena.commands.system; + +import com.ceraia.arena.Double; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class CommandVersion implements CommandExecutor, TabCompleter { + + private final Double plugin; + + public CommandVersion(Double plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize("Running Double v" + plugin.getPluginMeta().getVersion() + " by Axodouble") + ); + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { + return new ArrayList<>(); + } +} diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java new file mode 100644 index 0000000..5658938 --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java @@ -0,0 +1,44 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.Arena; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; + +public class ArenaBlockListener implements Listener { + + private final Double plugin; + + public ArenaBlockListener(Double plugin) { + this.plugin = plugin; + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent e) { + Arena arena = plugin.getArenaManager().getArena(e.getPlayer()); + if (arena == null) { + return; + } + + arena.placeBlock(e.getBlockPlaced().getLocation()); + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent e) { + Arena arena = plugin.getArenaManager().getArena(e.getPlayer()); + if (arena == null) { + return; + } + + if (arena.getPlacedBlocks().contains(e.getBlock().getLocation())) { + arena.removeBlock(e.getBlock().getLocation()); + return; + } + + e.setCancelled(true); + } +} diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java new file mode 100644 index 0000000..7d5434a --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java @@ -0,0 +1,104 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.Double; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.RespawnAnchor; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public class ArenaExplodeListener implements Listener { + + private final Double plugin; + + public ArenaExplodeListener(Double plugin) { + this.plugin = plugin; + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + private boolean isInArena(Player player) { + return plugin.getArenaManager().getArena(player) != null; + } + + // TNT + @EventHandler + public void onEntiyExplode(EntityExplodeEvent e) { + Player source = null; + if (e.getEntityType().equals(EntityType.PRIMED_TNT)) { + TNTPrimed tnt = (TNTPrimed) e.getEntity(); + Entity entity = tnt.getSource(); + if (!(entity instanceof Player)) return; + source = (Player) entity; + } + + if (source == null || !isInArena(source)) { + return; + } + e.blockList().clear(); + } + + // End crystal + @EventHandler + public void onHitCrystal(EntityDamageByEntityEvent e) { + Entity entity = e.getEntity(); + Entity damager = e.getDamager(); + + if (damager == null) return; + + Player source = null; + + if (!(entity instanceof EnderCrystal)) return; + + if (damager instanceof Player) { + source = (Player) damager; + } else if (damager instanceof Arrow) { + Arrow arrow = (Arrow) damager; + Entity entity2 = (Entity) arrow.getShooter(); + if (!(entity2 instanceof Player)) return; + source = (Player) entity2; + } else { + return; + } + + if (!isInArena(source)) { + return; + } + + e.setCancelled(true); + if (e.getEntity().isValid()) + e.getEntity().remove(); + e.getEntity().getWorld().createExplosion( + e.getEntity().getLocation(), + 6, + false, + false + ); + } + + // Respawn Anchor + @EventHandler + public void onFillAnchor(PlayerInteractEvent e) { + if (e.getClickedBlock() == null) return; + if (!e.getClickedBlock().getType().equals(Material.RESPAWN_ANCHOR)) return; + + Block block = e.getClickedBlock(); + RespawnAnchor data = (RespawnAnchor) block.getBlockData(); + if (data.getCharges() < data.getMaximumCharges()) return; + + if (!isInArena(e.getPlayer())) return; + + e.setCancelled(true); + block.setType(Material.AIR); + block.getWorld().createExplosion( + block.getLocation(), + 5, + false, + false + ); + } +} diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java new file mode 100644 index 0000000..0872f9a --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java @@ -0,0 +1,200 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.Double; +import com.ceraia.arena.managers.InviteManager; +import com.ceraia.arena.types.Arena; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Objects; +import java.util.UUID; + +public class ArenaFightListener implements Listener { + + private final Double plugin; + + public ArenaFightListener(Double plugin) { + this.plugin = plugin; + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + private boolean isInArena(Player player) { + return plugin.getArenaManager().getArena(player) != null; + } + + @EventHandler + public void onHit(EntityDamageByEntityEvent e) { + if (e.getDamager() == null || e.getEntity() == null) { + return; + } + + if (!(e.getDamager() instanceof Player damager) || !(e.getEntity() instanceof Player player)) { + return; + } + + if (!isInArena(damager) && !isInArena(player)) { + return; + } + + if (((isInArena(damager) && !isInArena(player)) || (!isInArena(damager) && isInArena(player))) || !Objects.equals(plugin.getArenaManager().getArena(damager).getName(), plugin.getArenaManager().getArena(player).getName())) { + e.setCancelled(true); + return; + } + + Arena arena = plugin.getArenaManager().getArena(damager); + + if (arena == null) { + return; + } + + if (arena.getState() != Arena.ArenaState.RUNNING) { + e.setCancelled(true); + return; + } + + if (arena.getTeam1().contains(damager) && arena.getTeam1().contains(player)) { + e.setCancelled(true); + return; + } + + if (arena.getTeam2().contains(damager) && arena.getTeam2().contains(player)) { + e.setCancelled(true); + } + } + + @EventHandler + public void onDamage(EntityDamageEvent e) { + if (!(e.getEntity() instanceof Player player)) { + return; + } + + if (!isInArena(player)) { + return; + } + + // Get player that hurt the player + Player killer = null; + if (e instanceof EntityDamageByEntityEvent event) { + // If the damage is caused by a player + if (event.getDamager() instanceof Player) { + plugin.getLogger().info("Player"); + killer = (Player) event.getDamager(); + } + // If the damage is caused by a projectile + else if (event.getDamager() instanceof org.bukkit.entity.Projectile projectile) { + plugin.getLogger().info("Arrow"); + if (projectile.getShooter() instanceof Player) { + killer = (Player) projectile.getShooter(); + } + } + + // If the damage is caused by a tnt + else if (event.getDamager().getType() == org.bukkit.entity.EntityType.PRIMED_TNT) { + plugin.getLogger().info("TNT"); + if (event.getDamager().customName() != null) { + killer = Bukkit.getPlayer(Objects.requireNonNull(event.getDamager().customName()).toString()); + } + } + } + + Arena arena = plugin.getArenaManager().getArena(player); + + double healthAfter = player.getHealth() - e.getFinalDamage(); + if (healthAfter <= 0) { + + // Check if during the fight totems are allowed + + InviteManager.Invite invite = plugin.getInviteManager().invites.get(player); + + if (invite == null) invite = plugin.getInviteManager().selectingInvites.get(killer); + + if (invite != null) { + if (arena.totems) { + if (player.getInventory().getItemInMainHand().getType() == Material.TOTEM_OF_UNDYING || player.getInventory().getItemInOffHand().getType() == Material.TOTEM_OF_UNDYING) { + return; + } + } + } + + + e.setCancelled(true); + player.setHealth(player.getHealthScale()); + + arena.end(player, false); + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent e) { + if (!isInArena(e.getEntity())) { + return; + } + Arena arena = plugin.getArenaManager().getArena(e.getEntity()); + + Location loc = e.getEntity().getLocation(); + + Player killer = e.getEntity().getKiller(); + + if (killer == null) { + killer = Bukkit.getPlayer(Objects.requireNonNull(Objects.requireNonNull(e.getEntity().getLastDamageCause()).getEntity().customName()).toString()); + } + if (killer != null) { + matchEnd(e.getEntity(), killer); + } + + + + e.getEntity().spigot().respawn(); + new BukkitRunnable() { + @Override + public void run() { + e.getEntity().teleport(loc); + arena.end(e.getEntity(), false); + } + }.runTaskLater(plugin, 5L); + } + + @EventHandler + public void onQuit(PlayerQuitEvent e) { + if (!isInArena(e.getPlayer())) { + return; + } + + Arena arena = plugin.getArenaManager().getArena(e.getPlayer()); + + // Check in which team the player is + if (arena.getTeam1().contains(e.getPlayer())) { + matchEnd(e.getPlayer(), arena.getTeam2().get(0)); + } else { + matchEnd(e.getPlayer(), arena.getTeam1().get(0)); + } + + arena.end(e.getPlayer(), true); + } + + private void matchEnd(Player loser, Player winner) { + UUID winnerUUID = winner.getUniqueId(); + UUID loserUUID = loser.getUniqueId(); + + // Get the win chance + int winChance = plugin.getPlayerManager().CalculateWinChance(winnerUUID, loserUUID); + + // Announce the winner and the win chance in chat + Bukkit.broadcast(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.fight.end_global").replace("%winner%", winner.getName()).replace("%loser%", loser.getName()).replace("%elo%", String.valueOf(plugin.getPlayerManager().getDoublePlayer(loserUUID).getElo())).replace("%winchance%", String.valueOf(winChance)).replace("%arena%", plugin.getArenaManager().getArena(loser).getName())) + + ); + + // Handle ELO calculations + plugin.getPlayerManager().PlayerKill(winnerUUID, loserUUID); + } +} diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java b/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java new file mode 100644 index 0000000..288941a --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java @@ -0,0 +1,30 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.Double; +import com.ceraia.arena.managers.EloScoreboardManager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class PlayerEloChangeListener implements Listener { + + private final Double plugin; + + public PlayerEloChangeListener(Double plugin) { + this.plugin = plugin; + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler // Custom on player Elo change event to update the scoreboard + public void onPlayerEloChange(PlayerEventListener event) { + EloScoreboardManager eloScoreboardManager = new EloScoreboardManager(plugin); + eloScoreboardManager.updateScoreboard(); + } + + @EventHandler // On player join event to update the scoreboard + public void onPlayerJoin(PlayerJoinEvent event) { + EloScoreboardManager eloScoreboardManager = new EloScoreboardManager(plugin); + eloScoreboardManager.updateScoreboard(); + } + +} diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java b/src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java new file mode 100644 index 0000000..a22ab9a --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java @@ -0,0 +1,37 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.types.DoublePlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class PlayerEventListener extends Event { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + private final DoublePlayer doublePlayer; + + public PlayerEventListener(Player player, DoublePlayer doublePlayer) { + this.player = player; + this.doublePlayer = doublePlayer; + } + + public Player getPlayer() { + return player; + } + + public DoublePlayer getArenaPlayer() { + return doublePlayer; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + +} diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java b/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java new file mode 100644 index 0000000..7b3e939 --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java @@ -0,0 +1,49 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.Double; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerDropItemEvent; + +public class PlayerInventoryListener implements Listener { + + private final Double plugin; + + public PlayerInventoryListener(Double plugin) { + this.plugin = plugin; + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + private boolean isInArena(Player player) { + return plugin.getArenaManager().getArena(player) != null; + } + + @EventHandler + public void onDropItem(PlayerDropItemEvent e) { + if (isInArena(e.getPlayer())) { + e.setCancelled(true); + } + } + + @EventHandler + public void onClickInventory(InventoryClickEvent e) { + Player p = (Player) e.getWhoClicked(); + + if (!isInArena(p)) { + return; + } + + if (e.getView().getTopInventory().getType() == InventoryType.PLAYER + || e.getView().getTopInventory().getType() == + InventoryType.CRAFTING) { + return; + } + + e.setCancelled(true); + + } +} diff --git a/src/main/java/com/ceraia/arena/listeners/SpellsListener.java b/src/main/java/com/ceraia/arena/listeners/SpellsListener.java new file mode 100644 index 0000000..f1c1d81 --- /dev/null +++ b/src/main/java/com/ceraia/arena/listeners/SpellsListener.java @@ -0,0 +1,216 @@ +package com.ceraia.arena.listeners; + +import com.ceraia.arena.Double; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.Objects; + +public class SpellsListener implements Listener { + + private final Double plugin; + + public SpellsListener(Double plugin) { + this.plugin = plugin; + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + // Check if the player is casting a spell by right clicking with a book + @EventHandler + public void onPlayerRightClick(PlayerInteractEvent event) { + if (event.getItem() == null) return; + if (event.getItem().getType() == Material.BOOK) { + Player p = event.getPlayer(); + if (p.getInventory().getItemInMainHand().getType() == Material.BOOK) { + String name = Objects.requireNonNull(p.getInventory().getItemInMainHand().getItemMeta()).getDisplayName(); + switch (name) { + case "Fireflies" -> { + // Launch snowballs that light the person it hits on fire + event.setCancelled(true); + p.sendMessage("You casted Fireflies!"); + p.launchProjectile(SmallFireball.class); + } + case "Getauttahere" -> { + event.setCancelled(true); + Trident trident = p.launchProjectile(Trident.class); + trident.setPickupStatus(Trident.PickupStatus.DISALLOWED); // Prevents Trident from being picked up + trident.addScoreboardTag("getauttahere"); // Add a tag to the Trident to identify it later + trident.addPassenger(p); + p.sendMessage("You casted Getauttahere!"); + } + case "Bidenblast" -> { + event.setCancelled(true); + for (int i = 0; i < 1; i++) { + Arrow arrow = p.launchProjectile(Arrow.class); + arrow.setVelocity(p.getLocation().getDirection().multiply(10)); + arrow.addScoreboardTag("explosive"); + } + } + case "Kamikazesheep" -> { + event.setCancelled(true); + p.launchProjectile(Snowball.class).addScoreboardTag("kamikazesheep"); + p.sendMessage("You casted Kamikazesheep!"); + } + case "ThermonuclearDetonation" -> { + event.setCancelled(true); + p.launchProjectile(Snowball.class).addScoreboardTag("earfquake"); + } + } + } + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event){ + // Log the UUID in the console + System.out.println(event.getPlayer().getUniqueId()); + } + + @EventHandler + public void onEntityHit(ProjectileHitEvent event) { + if (event.getEntity() instanceof Arrow arrow) { + if (arrow.getScoreboardTags().contains("explosive")) { + arrow.getWorld().createExplosion(arrow.getLocation(), 100, true, true); + arrow.remove(); + } + } else if (event.getEntity() instanceof Trident trident) { + if (trident.getScoreboardTags().contains("getauttahere")) { + trident.remove(); + } + } else if (event.getEntity() instanceof Snowball snowball) { + if (snowball.getScoreboardTags().contains("kamikazesheep")) { + // Get the closest player to the snowball + Player p = null; + double distance = 100; + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.getLocation().distance(snowball.getLocation()) < distance) { + p = player; + distance = player.getLocation().distance(snowball.getLocation()); + } + } + + Sheep sheep = snowball.getWorld().spawn(snowball.getLocation(), Sheep.class); + + TNTPrimed tnt = snowball.getWorld().spawn(snowball.getLocation(), TNTPrimed.class); + tnt.setFuseTicks(300); + + + sheep.addPassenger(tnt); + sheep.addScoreboardTag("kamikaze"); + sheep.setCustomNameVisible(true); + sheep.customName(MiniMessage.miniMessage().deserialize("jeb_")); + sheep.setInvulnerable(true); + + sheep.addPotionEffect( + new org.bukkit.potion.PotionEffect( + PotionEffectType.SPEED, 1000000, 2, false, false + ) + ); + + snowball.remove(); + + Player finalP = p; + new BukkitRunnable() { + @Override + public void run() { + // Make the sheep walk towards the player + assert finalP != null; + sheep.getPathfinder().moveTo(finalP.getLocation()); + if (sheep.getPassengers().size() == 0) { + sheep.remove(); + this.cancel(); + } + } + }.runTaskTimer(plugin, 0L, 2L); + } else if (snowball.getScoreboardTags().contains("earfquake")) { + snowball.getWorld().createExplosion(snowball.getLocation(), 80, true, false); // Adjust power as needed + + // Get the blocks in the affected area + float radius = 30; // Adjust as needed however no bigger than 40 has been tested which is already very large + + + int remTree = (int) (radius * 5); + + // Remove all trees and leaves in the affected area + for (int x = -remTree; x <= remTree; x++) { + for (int y = -remTree; y <= remTree; y++) { + for (int z = -remTree; z <= remTree; z++) { + if (Math.sqrt(x * x + (y) * (y) + z * z) <= remTree) { + Block block = snowball.getLocation().clone().add(x, y, z).getBlock(); + if (block.getType() == Material.OAK_LOG || block.getType() == Material.BIRCH_LOG || block.getType() == Material.SPRUCE_LOG || block.getType() == Material.JUNGLE_LOG || block.getType() == Material.ACACIA_LOG || block.getType() == Material.DARK_OAK_LOG) { + block.setType(Material.FIRE); + } + if(block.getType() == Material.OAK_LEAVES|| block.getType() == Material.BIRCH_LEAVES || block.getType() == Material.SPRUCE_LEAVES || block.getType() == Material.JUNGLE_LEAVES || block.getType() == Material.ACACIA_LEAVES || block.getType() == Material.DARK_OAK_LEAVES) { + block.setType(Material.FIRE); + } + if(block.getType() == Material.BAMBOO || block.getType() == Material.SHORT_GRASS || block.getType() == Material.TALL_GRASS || block.getType() == Material.VINE ) { + block.setType(Material.FIRE); + } + if(block.getType() == Material.SNOW || block.getType() == Material.POWDER_SNOW || block.getType() == Material.SNOW_BLOCK || block.getType() == Material.ICE || block.getType() == Material.PACKED_ICE || block.getType() == Material.BLUE_ICE || block.getType() == Material.FROSTED_ICE) { + block.setType(Material.AIR); + } + if(block.getType() == Material.GRASS_BLOCK || block.getType() == Material.DIRT || block.getType() == Material.COARSE_DIRT || block.getType() == Material.PODZOL || block.getType() == Material.DIRT_PATH || block.getType() == Material.MYCELIUM || block.getType() == Material.SNOW_BLOCK) { + // Choose random number if the block should be converted to course dirt or other "ruined" blocks + int random = (int) (Math.random() * 100); + if(random < 30) block.setType(Material.COARSE_DIRT); + else if(random < 40) block.setType(Material.MUD); + else if(random < 50) { + block.setType(Material.NETHERRACK); + Block blockFire = snowball.getLocation().clone().add(x, (y + 1), z).getBlock(); + if(blockFire.getType() == Material.AIR) blockFire.setType(Material.FIRE); + } + else if(random < 60) block.setType(Material.DIRT_PATH); + else if(random < 70) block.setType(Material.GRAVEL); + else if(random < 80) block.setType(Material.PODZOL); + else if(random < 90) block.setType(Material.MANGROVE_ROOTS); + else if(random < 100) block.setType(Material.MUDDY_MANGROVE_ROOTS); + } + } + } + } + } + + // Do the explosion + for (int x = (int) -radius; x <= radius; x++) { + for (int y = (int) -radius; y <= radius; y++) { + for (int z = (int) -radius; z <= radius; z++) { + if (Math.sqrt(x * x + y * y + z * z) <= radius) { + Block block = snowball.getLocation().clone().add(x, y, z).getBlock(); + if ((block.getType() != Material.AIR) + &&(block.getType() != Material.BEDROCK) + &&(block.getType() != Material.AIR) + ) { + if((block.getType() == Material.WATER)) block.setType(Material.AIR); + + + // Spawn falling block entities at the location of each block + FallingBlock fallingBlock = snowball.getWorld().spawnFallingBlock(block.getLocation(), block.getBlockData()); + // Apply velocity to simulate launch effect + fallingBlock.setVelocity(new Vector( + (Math.random() - 0.5) * (radius / 20) * 2, // Random x velocity between -radius/20 and radius/20 + Math.random() * ((radius / 100) * 3) + 1.2, // Random y velocity between 1.2 and (1.2 + radius/100 * 3) + (Math.random() - 0.5) * (radius / 20) * 2 // Random z velocity between -radius/20 and radius/20 + )); + // Remove the original block + block.setType(Material.AIR); + } + } + } + } + } + } + + } + } +} diff --git a/src/main/java/com/ceraia/arena/managers/ArenaManager.java b/src/main/java/com/ceraia/arena/managers/ArenaManager.java new file mode 100644 index 0000000..e5c0e33 --- /dev/null +++ b/src/main/java/com/ceraia/arena/managers/ArenaManager.java @@ -0,0 +1,84 @@ +package com.ceraia.arena.managers; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.Arena; +import org.bukkit.Location; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ArenaManager { + + private final Double plugin; + + private final List arenas = new ArrayList<>(); + private final Map playersInArena = new HashMap<>(); + + public ArenaManager(Double plugin) { + this.plugin = plugin; + + // Load arenas + File f = new File(plugin.getDataFolder(), "data/arenas"); + if (!f.exists()) { + f.mkdirs(); + return; + } + + File[] files = f.listFiles(); + for (File file : files) { + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + + String name = config.getString("name"); + String owner = config.getString("owner"); + Location spawnPoint1 = config.getLocation("spawnPoint1"); + Location spawnPoint2 = config.getLocation("spawnPoint2"); + boolean isPublic = config.getBoolean("public", false); + boolean isFFA = config.getBoolean("ffa", false); + + Arena arena = new Arena(plugin, name, owner, spawnPoint1, spawnPoint2, isPublic, isFFA, file); + arenas.add(arena); + } + + } + + public List getArenas() { + return arenas; + } + + public Arena getArena(Player player) { + return playersInArena.get(player); + } + + public Arena getArena(String name) { + for (Arena arena : arenas) { + if (arena.getName().equalsIgnoreCase(name)) { + return arena; + } + } + return null; + } + + + public void addArena(Arena arena) { + arenas.add(arena); + arena.saveArena(); + } + + public void removeArena(Arena arena) { + arenas.remove(arena); + } + + public void addPlayerToArena(Player player, Arena arena) { + playersInArena.put(player, arena); + } + + public void removePlayerFromArena(Player player) { + playersInArena.remove(player); + } +} diff --git a/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java b/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java new file mode 100644 index 0000000..c12067c --- /dev/null +++ b/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java @@ -0,0 +1,39 @@ +package com.ceraia.arena.managers; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.DoublePlayer; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.ScoreboardManager; + +public class EloScoreboardManager { + + private final Double plugin; + + public EloScoreboardManager(Double plugin) { + this.plugin = plugin; + } + + public void updateScoreboard() { + ScoreboardManager scoreboardManager = Bukkit.getScoreboardManager(); + Scoreboard scoreboardDefault = scoreboardManager.getNewScoreboard(); + Objective objectivePlayerList = scoreboardDefault.registerNewObjective("eloObjectivePlayerList", "dummy", MiniMessage.miniMessage().deserialize("Top Arena Players")); + Objective objectiveBelowName = scoreboardDefault.registerNewObjective("eloObjectiveBelowName", "dummy", MiniMessage.miniMessage().deserialize("ELO")); + + // Get all online players and set their score to their Elo rating + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(onlinePlayer.getUniqueId()); + + objectivePlayerList.getScore(onlinePlayer.getName()).setScore(doublePlayer.getElo()); + objectiveBelowName.getScore(onlinePlayer.getName()).setScore(doublePlayer.getElo()); + objectivePlayerList.setDisplaySlot(DisplaySlot.PLAYER_LIST); + objectiveBelowName.setDisplaySlot(DisplaySlot.BELOW_NAME); + + onlinePlayer.setScoreboard(scoreboardDefault); + } + } +} diff --git a/src/main/java/com/ceraia/arena/managers/FactionManager.java b/src/main/java/com/ceraia/arena/managers/FactionManager.java new file mode 100644 index 0000000..b665a08 --- /dev/null +++ b/src/main/java/com/ceraia/arena/managers/FactionManager.java @@ -0,0 +1,81 @@ +package com.ceraia.arena.managers; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.Faction; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class FactionManager { + private final List factions = new ArrayList<>(); + private final Double plugin; + + public FactionManager(Double plugin) { + this.plugin = plugin; + + // Load arenas + File f = new File(plugin.getDataFolder(), "data/factions"); + if (!f.exists()) { + f.mkdirs(); + return; + } + + File[] files = f.listFiles(); + for (File file : files) { + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + + UUID uuid = UUID.fromString(config.getString("id")); + String name = config.getString("name"); + + List members = new ArrayList(config.getStringList("members")); + + Faction faction = new Faction(plugin, uuid, name, members, file); + factions.add(faction); + } + + } + + public List getFactions() { + return factions; + } + + public Faction getFaction(UUID uuid) { + for (Faction faction : factions) { + if (faction.getUUID() == uuid) { + return faction; + } + } + return null; + } + + public Faction getFaction(String name) { + for (Faction faction : factions) { + if (faction.getName().equalsIgnoreCase(name)) { + return faction; + } + } + return null; + } + + public Faction newFaction(String name){ + List members = null; + File file = new File(plugin.getDataFolder(), "data/factions/" + name + ".yml"); + + return new Faction(plugin, UUID.randomUUID(), name, members, file); + } + + public void removeFaction(Faction faction) { + factions.remove(faction); + } + + public void saveFactions(){ + plugin.getLogger().info("Saving factions..."); + for(Faction faction : factions){ + faction.saveFaction(); + } + } +} diff --git a/src/main/java/com/ceraia/arena/managers/InviteManager.java b/src/main/java/com/ceraia/arena/managers/InviteManager.java new file mode 100644 index 0000000..7075276 --- /dev/null +++ b/src/main/java/com/ceraia/arena/managers/InviteManager.java @@ -0,0 +1,25 @@ +package com.ceraia.arena.managers; + +import com.ceraia.arena.types.Arena; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public class InviteManager { + + public Map invites = new HashMap<>(); + public Map selectingInvites = new HashMap<>(); + + public static class Invite { + public Player inviter, invited; + public Arena arena; + public boolean accepted = false; + public boolean group; + + public Invite(Player inviter, Player invited) { + this.inviter = inviter; + this.invited = invited; + } + } +} diff --git a/src/main/java/com/ceraia/arena/managers/PlayerManager.java b/src/main/java/com/ceraia/arena/managers/PlayerManager.java new file mode 100644 index 0000000..5f4adad --- /dev/null +++ b/src/main/java/com/ceraia/arena/managers/PlayerManager.java @@ -0,0 +1,196 @@ +package com.ceraia.arena.managers; + +import com.ceraia.arena.Double; +import com.ceraia.arena.types.DoublePlayer; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +public class PlayerManager { + + private final Double plugin; + private final List doublePlayers = new ArrayList<>(); + + public PlayerManager(Double plugin) { + this.plugin = plugin; + + // Load arenaPlayers + File f = new File(plugin.getDataFolder(), "data/users"); + if (!f.exists()) { + f.mkdirs(); + return; + } + + File[] files = f.listFiles(); + for (File file : files) { + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + + UUID faction = null; + if (config.getString("faction") != null){ + faction = UUID.fromString(config.getString("faction", null)); + } + + DoublePlayer doublePlayer = new DoublePlayer( + plugin, + config.getString("name"), + UUID.fromString(Objects.requireNonNull(config.getString("uuid"))),//UUID.fromString(file.getName().split("\\.")[0]), + config.getInt("elo", 1500), + config.getBoolean("arenabanned", false), + config.getBoolean("pvpbanned", false), + config.getInt("wins", 0), + config.getInt("losses", 0), + config.getInt("draws", 0), + config.getStringList("logs"), + config.getInt("lastSeen", (int) (System.currentTimeMillis() / 1000L)), + faction, + file + ); + doublePlayers.add(doublePlayer); + } + } + + public List getDoublePlayers() { + return doublePlayers; + } + + public DoublePlayer getDoublePlayer(UUID playerUUID) { + // Check if the player is already in the list + for (DoublePlayer doublePlayer : doublePlayers) { + if (doublePlayer.getUUID().equals(playerUUID)) { + return doublePlayer; + } + } + + DoublePlayer newPlayer = createNewDoublePlayer(playerUUID); + doublePlayers.add(newPlayer); + + return newPlayer; + } + public DoublePlayer getDoublePlayer(String playerName) { + // Check if the player is already in the list + for (DoublePlayer doublePlayer : doublePlayers) { + if (doublePlayer.getName().equals(playerName)) { + return doublePlayer; + } + } + + DoublePlayer newPlayer = createNewDoublePlayer(Objects.requireNonNull(Bukkit.getPlayer(playerName)).getUniqueId()); + doublePlayers.add(newPlayer); + return newPlayer; + } + + + public void PlayerKill(UUID playerKiller, UUID playerVictim) { + DoublePlayer killer = getDoublePlayer(playerKiller); + DoublePlayer victim = getDoublePlayer(playerVictim); + + // Constants for the Elo calculation + double kFactor = 32.0; + double expectedScoreKiller = 1.0 / (1.0 + Math.pow(10, (victim.getElo() - killer.getElo()) / 400.0)); + double expectedScoreVictim = 1.0 / (1.0 + Math.pow(10, (killer.getElo() - victim.getElo()) / 400.0)); + + // Update Elo ratings + int newEloKiller = (int) (killer.getElo() + kFactor * (1.0 - expectedScoreKiller)); + int newEloVictim = (int) (victim.getElo() + kFactor * (0.0 - expectedScoreVictim)); + + // Set new Elo ratings + killer.setElo(newEloKiller); + victim.setElo(newEloVictim); + } + + + public int CalculateWinChance(UUID playerKiller, UUID playerVictim){ + DoublePlayer killer = getDoublePlayer(playerKiller); + DoublePlayer victim = getDoublePlayer(playerVictim); + + double expectedScoreKiller = 1.0 / (1.0 + Math.pow(10, (victim.getElo() - killer.getElo()) / 400.0)); + int winChance = (int) (expectedScoreKiller * 100); + + return winChance; + } + + public int CalculateLossChance(UUID playerKiller, UUID playerVictim){ + DoublePlayer killer = getDoublePlayer(playerKiller); + DoublePlayer victim = getDoublePlayer(playerVictim); + + double expectedScoreVictim = 1.0 / (1.0 + Math.pow(10, (killer.getElo() - victim.getElo()) / 400.0)); + int lossChance = (int) (expectedScoreVictim * 100); + + return lossChance; + } + + private DoublePlayer createNewDoublePlayer(UUID playerUUID) { + String playerName = Objects.requireNonNull(Bukkit.getPlayer(playerUUID)).getName(); + File configFile = new File(plugin.getDataFolder(), "data/users/" + playerName + ".yml"); + try { + configFile.createNewFile(); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + + // Set default values or load from other sources as needed + int defaultElo = 1500; + + config.set("name", playerName); + config.set("uuid", playerUUID.toString()); + config.set("elo", defaultElo); + config.set("arenabanned", false); + config.set("pvpbanned", false); + config.set("wins", 0); + config.set("losses", 0); + config.set("logs", new ArrayList()); + config.set("faction", null); + + config.save(configFile); + + return new DoublePlayer( + plugin, + Objects.requireNonNull(Bukkit.getPlayer(playerUUID)).getName(), + playerUUID, + defaultElo, + false, + false, + 0, + 0, + 0, + new ArrayList(), + (int) (System.currentTimeMillis() / 1000L), + null, + configFile + ); + } catch (IOException e) { + e.printStackTrace(); + return null; // Handle the exception based on your needs + } + } + + public DoublePlayer getPlayer(UUID uniqueId) { + for (DoublePlayer doublePlayer : doublePlayers) { + if (doublePlayer.getUUID().equals(uniqueId)) { + return doublePlayer; + } + } + return null; + } + + public DoublePlayer getPlayer(String name) { + for (DoublePlayer doublePlayer : doublePlayers) { + if (doublePlayer.getName().equalsIgnoreCase(name)) { + return doublePlayer; + } + } + return null; + } + + public void savePlayers(){ + plugin.getLogger().info("Saving players..."); + for(DoublePlayer doublePlayer : doublePlayers){ + doublePlayer.savePlayer(); + } + } +} diff --git a/src/main/java/com/ceraia/arena/misc/Metrics.java b/src/main/java/com/ceraia/arena/misc/Metrics.java new file mode 100644 index 0000000..7f05f7b --- /dev/null +++ b/src/main/java/com/ceraia/arena/misc/Metrics.java @@ -0,0 +1,871 @@ +/* + * This Metrics class was auto-generated and can be copied into your project if you are + * not using a build tool like Gradle or Maven for dependency management. + * + * IMPORTANT: You are not allowed to modify this class, except changing the package. + * + * Disallowed modifications include but are not limited to: + * - Remove the option for users to opt-out + * - Change the frequency for data submission + * - Obfuscate the code (every obfuscator should allow you to make an exception for specific files) + * - Reformat the code (if you use a linter, add an exception) + * + * Violations will result in a ban of your plugin and account from bStats. + */ +package com.ceraia.arena.misc; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.lang.reflect.Method; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.zip.GZIPOutputStream; + +public class Metrics { + + private final Plugin plugin; + + private final MetricsBase metricsBase; + + /** + * Creates a new Metrics instance. + * + * @param plugin Your plugin instance. + * @param serviceId The id of the service. It can be found at What is my plugin id? + */ + public Metrics(JavaPlugin plugin, int serviceId) { + this.plugin = plugin; + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + if (!config.isSet("serverUuid")) { + config.addDefault("enabled", true); + config.addDefault("serverUuid", UUID.randomUUID().toString()); + config.addDefault("logFailedRequests", false); + config.addDefault("logSentData", false); + config.addDefault("logResponseStatusText", false); + // Inform the server owners about bStats + config + .options() + .header( + "bStats (https://bStats.org) collects some basic information for plugin authors, like how\n" + + "many people use their plugin and their total player count. It's recommended to keep bStats\n" + + "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n" + + "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n" + + "anonymous.") + .copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { + } + } + // Load the data + boolean enabled = config.getBoolean("enabled", true); + String serverUUID = config.getString("serverUuid"); + boolean logErrors = config.getBoolean("logFailedRequests", false); + boolean logSentData = config.getBoolean("logSentData", false); + boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false); + metricsBase = + new MetricsBase( + "bukkit", + serverUUID, + serviceId, + enabled, + this::appendPlatformData, + this::appendServiceData, + submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), + plugin::isEnabled, + (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), + (message) -> this.plugin.getLogger().log(Level.INFO, message), + logErrors, + logSentData, + logResponseStatusText); + } + + /** Shuts down the underlying scheduler service. */ + public void shutdown() { + metricsBase.shutdown(); + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + metricsBase.addCustomChart(chart); + } + + private void appendPlatformData(JsonObjectBuilder builder) { + builder.appendField("playerAmount", getPlayerAmount()); + builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0); + builder.appendField("bukkitVersion", Bukkit.getVersion()); + builder.appendField("bukkitName", Bukkit.getName()); + builder.appendField("javaVersion", System.getProperty("java.version")); + builder.appendField("osName", System.getProperty("os.name")); + builder.appendField("osArch", System.getProperty("os.arch")); + builder.appendField("osVersion", System.getProperty("os.version")); + builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); + } + + private void appendServiceData(JsonObjectBuilder builder) { + builder.appendField("pluginVersion", plugin.getDescription().getVersion()); + } + + private int getPlayerAmount() { + try { + // Around MC 1.8 the return type was changed from an array to a collection, + // This fixes java.lang.NoSuchMethodError: + // org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; + Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); + return onlinePlayersMethod.getReturnType().equals(Collection.class) + ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() + : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; + } catch (Exception e) { + // Just use the new method if the reflection failed + return Bukkit.getOnlinePlayers().size(); + } + } + + public static class MetricsBase { + + /** The version of the Metrics class. */ + public static final String METRICS_VERSION = "3.0.2"; + + private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; + + private final ScheduledExecutorService scheduler; + + private final String platform; + + private final String serverUuid; + + private final int serviceId; + + private final Consumer appendPlatformDataConsumer; + + private final Consumer appendServiceDataConsumer; + + private final Consumer submitTaskConsumer; + + private final Supplier checkServiceEnabledSupplier; + + private final BiConsumer errorLogger; + + private final Consumer infoLogger; + + private final boolean logErrors; + + private final boolean logSentData; + + private final boolean logResponseStatusText; + + private final Set customCharts = new HashSet<>(); + + private final boolean enabled; + + /** + * Creates a new MetricsBase class instance. + * + * @param platform The platform of the service. + * @param serviceId The id of the service. + * @param serverUuid The server uuid. + * @param enabled Whether or not data sending is enabled. + * @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all platform-specific data. + * @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and + * appends all service-specific data. + * @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be + * used to delegate the data collection to a another thread to prevent errors caused by + * concurrency. Can be {@code null}. + * @param checkServiceEnabledSupplier A supplier to check if the service is still enabled. + * @param errorLogger A consumer that accepts log message and an error. + * @param infoLogger A consumer that accepts info log messages. + * @param logErrors Whether or not errors should be logged. + * @param logSentData Whether or not the sent data should be logged. + * @param logResponseStatusText Whether or not the response status text should be logged. + */ + public MetricsBase( + String platform, + String serverUuid, + int serviceId, + boolean enabled, + Consumer appendPlatformDataConsumer, + Consumer appendServiceDataConsumer, + Consumer submitTaskConsumer, + Supplier checkServiceEnabledSupplier, + BiConsumer errorLogger, + Consumer infoLogger, + boolean logErrors, + boolean logSentData, + boolean logResponseStatusText) { + ScheduledThreadPoolExecutor scheduler = + new ScheduledThreadPoolExecutor(1, task -> new Thread(task, "bStats-Metrics")); + // We want delayed tasks (non-periodic) that will execute in the future to be + // cancelled when the scheduler is shutdown. + // Otherwise, we risk preventing the server from shutting down even when + // MetricsBase#shutdown() is called + scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); + this.scheduler = scheduler; + this.platform = platform; + this.serverUuid = serverUuid; + this.serviceId = serviceId; + this.enabled = enabled; + this.appendPlatformDataConsumer = appendPlatformDataConsumer; + this.appendServiceDataConsumer = appendServiceDataConsumer; + this.submitTaskConsumer = submitTaskConsumer; + this.checkServiceEnabledSupplier = checkServiceEnabledSupplier; + this.errorLogger = errorLogger; + this.infoLogger = infoLogger; + this.logErrors = logErrors; + this.logSentData = logSentData; + this.logResponseStatusText = logResponseStatusText; + checkRelocation(); + if (enabled) { + // WARNING: Removing the option to opt-out will get your plugin banned from + // bStats + startSubmitting(); + } + } + + public void addCustomChart(CustomChart chart) { + this.customCharts.add(chart); + } + + public void shutdown() { + scheduler.shutdown(); + } + + private void startSubmitting() { + final Runnable submitTask = + () -> { + if (!enabled || !checkServiceEnabledSupplier.get()) { + // Submitting data or service is disabled + scheduler.shutdown(); + return; + } + if (submitTaskConsumer != null) { + submitTaskConsumer.accept(this::submitData); + } else { + this.submitData(); + } + }; + // Many servers tend to restart at a fixed time at xx:00 which causes an uneven + // distribution of requests on the + // bStats backend. To circumvent this problem, we introduce some randomness into + // the initial and second delay. + // WARNING: You must not modify and part of this Metrics class, including the + // submit delay or frequency! + // WARNING: Modifying this code will get your plugin banned on bStats. Just + // don't do it! + long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3)); + long secondDelay = (long) (1000 * 60 * (Math.random() * 30)); + scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); + scheduler.scheduleAtFixedRate( + submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS); + } + + private void submitData() { + final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder(); + appendPlatformDataConsumer.accept(baseJsonBuilder); + final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder(); + appendServiceDataConsumer.accept(serviceJsonBuilder); + JsonObjectBuilder.JsonObject[] chartData = + customCharts.stream() + .map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors)) + .filter(Objects::nonNull) + .toArray(JsonObjectBuilder.JsonObject[]::new); + serviceJsonBuilder.appendField("id", serviceId); + serviceJsonBuilder.appendField("customCharts", chartData); + baseJsonBuilder.appendField("service", serviceJsonBuilder.build()); + baseJsonBuilder.appendField("serverUUID", serverUuid); + baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION); + JsonObjectBuilder.JsonObject data = baseJsonBuilder.build(); + scheduler.execute( + () -> { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logErrors) { + errorLogger.accept("Could not submit bStats metrics data", e); + } + } + }); + } + + private void sendData(JsonObjectBuilder.JsonObject data) throws Exception { + if (logSentData) { + infoLogger.accept("Sent bStats metrics data: " + data.toString()); + } + String url = String.format(REPORT_URL, platform); + HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("User-Agent", "Metrics-Service/1"); + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.write(compressedData); + } + StringBuilder builder = new StringBuilder(); + try (BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + builder.append(line); + } + } + if (logResponseStatusText) { + infoLogger.accept("Sent data to bStats and received response: " + builder); + } + } + + /** Checks that the class was properly relocated. */ + private void checkRelocation() { + // You can use the property to disable the check in your test environment + if (System.getProperty("bstats.relocatecheck") == null + || !System.getProperty("bstats.relocatecheck").equals("false")) { + // Maven's Relocate is clever and changes strings, too. So we have to use this + // little "trick" ... :D + final String defaultPackage = + new String(new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's'}); + final String examplePackage = + new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); + // We want to make sure no one just copy & pastes the example and uses the wrong + // package names + if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage) + || MetricsBase.class.getPackage().getName().startsWith(examplePackage)) { + throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); + } + } + } + + /** + * Gzips the given string. + * + * @param str The string to gzip. + * @return The gzipped string. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { + gzip.write(str.getBytes(StandardCharsets.UTF_8)); + } + return outputStream.toByteArray(); + } + } + + public static class SimplePie extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimplePie(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + String value = callable.call(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + public static class MultiLineChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public MultiLineChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class AdvancedPie extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedPie(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class SimpleBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimpleBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + valuesBuilder.appendField(entry.getKey(), new int[] {entry.getValue()}); + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class AdvancedBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + // Skip this invalid + continue; + } + allSkipped = false; + valuesBuilder.appendField(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public static class DrilldownPie extends CustomChart { + + private final Callable>> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public DrilldownPie(String chartId, Callable>> callable) { + super(chartId); + this.callable = callable; + } + + @Override + public JsonObjectBuilder.JsonObject getChartData() throws Exception { + JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); + Map> map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean reallyAllSkipped = true; + for (Map.Entry> entryValues : map.entrySet()) { + JsonObjectBuilder valueBuilder = new JsonObjectBuilder(); + boolean allSkipped = true; + for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { + valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue()); + allSkipped = false; + } + if (!allSkipped) { + reallyAllSkipped = false; + valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build()); + } + } + if (reallyAllSkipped) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); + } + } + + public abstract static class CustomChart { + + private final String chartId; + + protected CustomChart(String chartId) { + if (chartId == null) { + throw new IllegalArgumentException("chartId must not be null"); + } + this.chartId = chartId; + } + + public JsonObjectBuilder.JsonObject getRequestJsonObject( + BiConsumer errorLogger, boolean logErrors) { + JsonObjectBuilder builder = new JsonObjectBuilder(); + builder.appendField("chartId", chartId); + try { + JsonObjectBuilder.JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + builder.appendField("data", data); + } catch (Throwable t) { + if (logErrors) { + errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return builder.build(); + } + + protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; + } + + public static class SingleLineChart extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SingleLineChart(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObjectBuilder.JsonObject getChartData() throws Exception { + int value = callable.call(); + if (value == 0) { + // Null = skip the chart + return null; + } + return new JsonObjectBuilder().appendField("value", value).build(); + } + } + + /** + * An extremely simple JSON builder. + * + *

While this class is neither feature-rich nor the most performant one, it's sufficient enough + * for its use-case. + */ + public static class JsonObjectBuilder { + + private StringBuilder builder = new StringBuilder(); + + private boolean hasAtLeastOneField = false; + + public JsonObjectBuilder() { + builder.append("{"); + } + + /** + * Appends a null field to the JSON. + * + * @param key The key of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendNull(String key) { + appendFieldUnescaped(key, "null"); + return this; + } + + /** + * Appends a string field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String value) { + if (value == null) { + throw new IllegalArgumentException("JSON value must not be null"); + } + appendFieldUnescaped(key, "\"" + escape(value) + "\""); + return this; + } + + /** + * Appends an integer field to the JSON. + * + * @param key The key of the field. + * @param value The value of the field. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int value) { + appendFieldUnescaped(key, String.valueOf(value)); + return this; + } + + /** + * Appends an object to the JSON. + * + * @param key The key of the field. + * @param object The object. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject object) { + if (object == null) { + throw new IllegalArgumentException("JSON object must not be null"); + } + appendFieldUnescaped(key, object.toString()); + return this; + } + + /** + * Appends a string array to the JSON. + * + * @param key The key of the field. + * @param values The string array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, String[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values) + .map(value -> "\"" + escape(value) + "\"") + .collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an integer array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, int[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends an object array to the JSON. + * + * @param key The key of the field. + * @param values The integer array. + * @return A reference to this object. + */ + public JsonObjectBuilder appendField(String key, JsonObject[] values) { + if (values == null) { + throw new IllegalArgumentException("JSON values must not be null"); + } + String escapedValues = + Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(",")); + appendFieldUnescaped(key, "[" + escapedValues + "]"); + return this; + } + + /** + * Appends a field to the object. + * + * @param key The key of the field. + * @param escapedValue The escaped value of the field. + */ + private void appendFieldUnescaped(String key, String escapedValue) { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + if (key == null) { + throw new IllegalArgumentException("JSON key must not be null"); + } + if (hasAtLeastOneField) { + builder.append(","); + } + builder.append("\"").append(escape(key)).append("\":").append(escapedValue); + hasAtLeastOneField = true; + } + + /** + * Builds the JSON string and invalidates this builder. + * + * @return The built JSON string. + */ + public JsonObject build() { + if (builder == null) { + throw new IllegalStateException("JSON has already been built"); + } + JsonObject object = new JsonObject(builder.append("}").toString()); + builder = null; + return object; + } + + /** + * Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt. + * + *

This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'. + * Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n"). + * + * @param value The value to escape. + * @return The escaped value. + */ + private static String escape(String value) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + if (c == '"') { + builder.append("\\\""); + } else if (c == '\\') { + builder.append("\\\\"); + } else if (c <= '\u000F') { + builder.append("\\u000").append(Integer.toHexString(c)); + } else if (c <= '\u001F') { + builder.append("\\u00").append(Integer.toHexString(c)); + } else { + builder.append(c); + } + } + return builder.toString(); + } + + /** + * A super simple representation of a JSON object. + * + *

This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not + * allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String, + * JsonObject)}. + */ + public static class JsonObject { + + private final String value; + + private JsonObject(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } + } + } +} diff --git a/src/main/java/com/ceraia/arena/types/Arena.java b/src/main/java/com/ceraia/arena/types/Arena.java new file mode 100644 index 0000000..a86ee2d --- /dev/null +++ b/src/main/java/com/ceraia/arena/types/Arena.java @@ -0,0 +1,439 @@ +package com.ceraia.arena.types; + +import com.ceraia.arena.Double; +import com.ceraia.arena.Utils; +import com.ceraia.arena.managers.InviteManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.title.Title; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +public class Arena { + + private final Double plugin; + + // before ready + private final String name; + private final String owner; + private final List startPlayers = new ArrayList<>(); + private final List placedBlocks = new ArrayList<>(); + private final Map priorLocations = new HashMap<>(); + private boolean isPublic; + private File configFile; + // after ready + private Location spawnPoint1, spawnPoint2; + // after start + private List team1 = new ArrayList<>(); + private List team2 = new ArrayList<>(); + private ArenaState state = ArenaState.WAITING; + private int timer; + public boolean totems = false; + private boolean isFFA = false; + + public Arena(Double plugin, String name, String owner, Location spawnPoint1, Location spawnPoint2, boolean isPublic, boolean isFFA, File configFile) { + this.plugin = plugin; + + this.name = name; + this.owner = owner; + this.spawnPoint1 = spawnPoint1; + this.spawnPoint2 = spawnPoint2; + this.isPublic = isPublic; + this.isFFA = isFFA; + + this.configFile = configFile; + } + + public boolean saveArena() { + try { + configFile = new File(plugin.getDataFolder(), "data/arenas/" + name + ".yml"); + + // Check if the file already exists + if (!configFile.exists()) { + configFile.createNewFile(); + } + + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + + // Update or set the values + config.set("name", name); + config.set("owner", owner); + + config.set("spawnPoint1", spawnPoint1); + config.set("spawnPoint2", spawnPoint2); + config.set("public", isPublic); + + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + public boolean totems() { + return totems; + } + + public void setTotems(boolean totems) { + this.totems = totems; + } + + public void setTotems(boolean totems, boolean save) { + this.totems = totems; + if (save) { + saveArena(); + } + } + public int getTimer() { + return timer; + } + + public void setTimer(int timer) { + this.timer = timer; + } + + public ArenaState getState() { + return state; + } + + public void setState(ArenaState state) { + this.state = state; + } + + public boolean delete() { + return configFile.delete(); + } + + public String getName() { + return name; + } + + public String getOwner() { + return owner; + } + + public Location getSpawnPoint1() { + return spawnPoint1; + } + + public void setSpawnPoint1(Location loc) { + spawnPoint1 = loc; + saveArena(); + } + + public Location getSpawnPoint2() { + return spawnPoint2; + } + + public void setSpawnPoint2(Location loc) { + spawnPoint2 = loc; + saveArena(); + } + + public List getTeam1() { + return team1; + } + + public void setTeam1(List team1) { + this.team1 = team1; + } + + public List getTeam2() { + return team2; + } + + public void setTeam2(List team2) { + this.team2 = team2; + } + + public void addPlayer(Player player, int team) { + plugin.getArenaManager().addPlayerToArena(player, this); + if (team == 1) { + team1.add(player); + } else { + team2.add(player); + } + + startPlayers.add(player); + } + + public List getStartPlayers() { + return startPlayers; + } + + public List getOnlinePlayers() { + List onlinePlayers = new ArrayList<>(); + onlinePlayers.addAll(team1); + onlinePlayers.addAll(team2); + + return onlinePlayers; + } + + public void reset() { + team1.clear(); + team2.clear(); + startPlayers.clear(); + placedBlocks.clear(); + priorLocations.clear(); + } + + public void end(Player player, boolean quit) { + boolean end = false; + + + + List winners = new ArrayList<>(); + List losers = new ArrayList<>(); + + if (this.getTeam1().contains(player)) { + if (this.getTeam1().size() <= 1) { + end = true; + + winners.addAll(this.getTeam2()); + losers.addAll(this.getTeam1()); + } else { + List team = this.getTeam1(); + team.remove(player); + this.setTeam1(team); + } + } else { + if (this.getTeam2().size() <= 1) { + end = true; + + winners.addAll(this.getTeam1()); + losers.addAll(this.getTeam2()); + } else { + List team = this.getTeam2(); + team.remove(player); + this.setTeam2(team); + } + } + + if (!end || quit) { + Utils.teleportPlayerToSpawn(plugin, player, this); + plugin.getArenaManager().removePlayerFromArena(player); + + player.getInventory().clear(); + Utils.revertInventory(plugin, player, this); + if (!end) { + return; + } + } + + for (Player pl : this.getOnlinePlayers()) { + if (pl == player && quit) { + continue; + } + + pl.sendMessage( + MiniMessage.miniMessage().deserialize( + plugin.getConfig().getString("messages.fight.end") + .replace("%winner%", winners.stream().map(Player::getName).collect(Collectors.joining(", "))) + .replace("%time%", String.valueOf(plugin.getConfig().getInt("cooldown.after"))) + ) + ); + + pl.getInventory().clear(); + + pl.setHealth(20); + pl.setFireTicks(0); + pl.setFoodLevel(20); + pl.setSaturation(20); + } + + this.setState(ArenaState.ENDING); + + Arena thisArena = this; + + new BukkitRunnable() { + public void run() { + for (Location loc : placedBlocks) { + loc.getBlock().setType(Material.AIR); + } + + for (Player pl : getOnlinePlayers()) { + if (pl == player && quit) { + continue; + } + Utils.teleportPlayerToSpawn(plugin, pl, thisArena); + + plugin.getArenaManager().removePlayerFromArena(pl); + + Utils.revertInventory(plugin, pl, thisArena); + } + + // Reward + for (Player pl : winners) { + plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).addWin(); + plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).setLastFought(System.currentTimeMillis() / 1000L); + for (String command : plugin.getConfig().getStringList("rewards")) { + pl.performCommand(command.replace("%player%", pl.getName())); + } + } + + // Reward losers + for (Player pl : losers) { + plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).addLoss(); + plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).setLastFought(System.currentTimeMillis() / 1000L); + for (String command : plugin.getConfig().getStringList("rewards_lose")) { + pl.performCommand(command.replace("%player%", pl.getName())); + } + } + + thisArena.setState(ArenaState.WAITING); + reset(); + } + }.runTaskLater(plugin, plugin.getConfig().getInt("cooldown.after") * 20L); + } + + public void start(InviteManager.Invite invite, List players) { + this.setState(ArenaState.STARTING); + + try { + for (Player pl : players) { + priorLocations.put(pl, pl.getLocation()); + + ItemStack[] content = pl.getInventory().getContents(); + + File file = new File(plugin.getDataFolder(), "data/pinventory_" + this.getName() + "_" + pl.getName() + ".yml"); + file.createNewFile(); + + FileConfiguration yaml = YamlConfiguration.loadConfiguration(file); + + // list of itemstack from array + for (int i = 0; i < content.length; i++) { + if (content[i] == null) { + yaml.set("items." + i, "null"); + } else { + yaml.set("items." + i, content[i]); + } + } + + yaml.save(file); + } + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Problem saving inventories, nothing was deleted!"); + for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { + pl.sendMessage( + MiniMessage.miniMessage().deserialize( + Objects.requireNonNull(plugin.getConfig().getString("messages.fight.problem_saving_inventories")) + ) + ); + } + + return; + } + + for (Player pl : this.getTeam1()) { + pl.teleport( + this.getSpawnPoint1() + ); + } + for (Player pl : this.getTeam2()) { + pl.teleport( + this.getSpawnPoint2() + ); + } + + for (Player pl : players) { + pl.setHealth(20); + pl.setFoodLevel(20); + pl.setSaturation(20); + pl.setGameMode(GameMode.SURVIVAL); + } + + this.setState(ArenaState.STARTING); + + AtomicInteger i = new AtomicInteger( + plugin.getConfig().getInt("cooldown.before") + 1 + ); + + Arena thisArena = this; + new BukkitRunnable() { + public void run() { + for (Player pl : players) { + if (i.get() == 0) { + pl.showTitle(Title.title(Component.empty(), Component.empty())); + } else if (i.get() == 1) { + Title title = Title.title( + MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.fight.started") + .replace("%time%", String.valueOf(i.get() - 1))), + Component.empty() + ); + + pl.showTitle(title); + } else { + pl.showTitle(Title.title(MiniMessage.miniMessage().deserialize( + plugin.getConfig().getString("messages.fight.starting") + .replace("%time%", String.valueOf(i.get() - 1)) + ), MiniMessage.miniMessage().deserialize( + Objects.requireNonNull(plugin.getArenaManager().getArena(pl).totems ? + plugin.getConfig().getString("messages.fight.totems_enabled") + : plugin.getConfig().getString("messages.fight.totems_disabled")) + ) + )); + } + } + + if (i.get() == 0) { + thisArena.setState(ArenaState.RUNNING); + cancel(); + return; + } + + i.decrementAndGet(); + + } + }.runTaskTimer(plugin, 0, 20); + } + + public void placeBlock(Location loc) { + placedBlocks.add(loc); + } + + public void removeBlock(Location loc) { + placedBlocks.remove(loc); + } + + public List getPlacedBlocks() { + return placedBlocks; + } + + public boolean isPublic() { + return isPublic; + } + + public void setPublic(boolean isPublic) { + this.isPublic = isPublic; + + try { + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("public", isPublic); + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Location getPlayerPriorLocation(Player pl) { + return priorLocations.get(pl); + } + + public enum ArenaState { + WAITING, STARTING, RUNNING, ENDING + } +} diff --git a/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java b/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java new file mode 100644 index 0000000..d14280b --- /dev/null +++ b/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java @@ -0,0 +1,240 @@ +package com.ceraia.arena.types; + +import com.ceraia.arena.Double; +import com.ceraia.arena.managers.InviteManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class ArenaSelectGUI implements Listener { + private static Component INVENTORY_NAME_ARENAS; + private static Component INVENTORY_NAME_TOTEMS; + private final Double plugin; + private final Map> selectingArenaCache = new HashMap<>(); + + public ArenaSelectGUI(Double plugin) { + this.plugin = plugin; + + INVENTORY_NAME_ARENAS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.inventory_name"))); + INVENTORY_NAME_TOTEMS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.inventory_name"))); + + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + public void reloadConfig() { + INVENTORY_NAME_ARENAS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.inventory_name"))); + INVENTORY_NAME_TOTEMS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.inventory_name"))); + } + + public void openArenaList(Player inviter, Player invited) { // Let the player select what arena to fight in + // Add the player invitee and inviter + InviteManager.Invite invite = new InviteManager.Invite(inviter, invited); + + plugin.getInviteManager().selectingInvites.put(inviter, invite); + + // Get a list of all arenas accessible to the player + List arenas = plugin.getArenaManager().getArenas() + .stream().filter(a -> a.isPublic() || a.getOwner().equals(inviter.getName())).toList(); + + // Size is from arenas.size() and must be devidable by 9 + int size = Math.max(9, (arenas.size() + 8) / 9 * 9); + + // Create the inventory + Inventory inv = Bukkit.createInventory(null, size, MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.inventory_name")))); + + // Create a map of the slot and the arena + Map arenasSelectSlots = new HashMap<>(); + + int i = 0; // Slot + for (Arena a : arenas.stream().filter(a -> a.getState() == Arena.ArenaState.WAITING).toList()) { // Filter out arenas that are not ready + ItemStack itemStack = new ItemStack(Objects.requireNonNull(Material.getMaterial( + Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.arena_item.item")) + ))); // Create the itemstack + ItemMeta meta = itemStack.getItemMeta(); + meta.displayName( + MiniMessage.miniMessage().deserialize( + Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.arena_item.name")) + .replace("%arena_name%", a.getName()) + .replace("%arena_owner%", a.getOwner()) + ) + ); + + List lore = new ArrayList<>(); + for (String s : plugin.getConfig().getStringList("messages.arena_select_gui.arena_item.lore")) { + lore.add(MiniMessage.miniMessage().deserialize(s.replace("%arena_name%", a.getName()) + .replace("%arena_owner%", a.getOwner()) + .replace("%totems%", a.totems ? "enabled" : "disabled") + )); + } + + meta.lore(lore); + + itemStack.setItemMeta(meta); + + inv.setItem(i, itemStack); + arenasSelectSlots.put(i, a); + + i++; + } + + // Put the map in the cache + selectingArenaCache.put(inviter, arenasSelectSlots); + + // Open the inventory + inviter.openInventory(inv); + } + + public void openTotemEnabled(Player inviter, Arena arena){ // Let the player select whether to enable or disable totems in the fight + int size = 9; + + Inventory inv = Bukkit.createInventory(null, size, MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.inventory_name")))); + + ItemStack itemStackEnable = new ItemStack(Objects.requireNonNull(Material.getMaterial( + Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.items.enable.item")) + ))); // Create the itemstack + ItemMeta metaEnable = itemStackEnable.getItemMeta(); + + metaEnable.displayName( + MiniMessage.miniMessage().deserialize( + Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.items.enable.name")) + ) + ); + + List loreEnable = new ArrayList<>(); + for (String s : plugin.getConfig().getStringList("messages.totem_select_gui.items.enable.lore")) { + loreEnable.add(MiniMessage.miniMessage().deserialize(s)); + } + + metaEnable.lore(loreEnable); + + itemStackEnable.setItemMeta(metaEnable); + + inv.setItem(1, itemStackEnable); + + ItemStack itemStackDisable = new ItemStack(Objects.requireNonNull(Material.getMaterial( + Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.items.disable.item")) + ))); // Create the itemstack + ItemMeta metaDisable = itemStackDisable.getItemMeta(); + metaDisable.displayName( + MiniMessage.miniMessage().deserialize( + Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.items.disable.name")) + ) + ); + + List loreDisable = new ArrayList<>(); + for (String s : plugin.getConfig().getStringList("messages.totem_select_gui.items.disable.lore")) { + loreDisable.add(MiniMessage.miniMessage().deserialize(s)); + } + + metaDisable.lore(loreDisable); + + itemStackDisable.setItemMeta(metaDisable); + + inv.setItem(7, itemStackDisable); + + // Set the center slot to the arena that was selected + ItemStack itemStackArena = new ItemStack(Objects.requireNonNull(Material.getMaterial( + Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.arena_item.item")) + ))); // Create the itemstack + + ItemMeta metaArena = itemStackArena.getItemMeta(); + metaArena.displayName( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.arena_item.name")) + .replace("%arena_name%", arena.getName()) + .replace("%arena_owner%", arena.getOwner())) + + ); + + List loreArena = new ArrayList<>(); + for (String s : plugin.getConfig().getStringList("messages.arena_select_gui.arena_item.lore")) { + loreArena.add(MiniMessage.miniMessage().deserialize(s.replace("%arena_name%", arena.getName()) + .replace("%arena_owner%", arena.getOwner()) + )); + } + + metaArena.lore(loreArena); + + inviter.openInventory(inv); + } + + @EventHandler + public void onClick(InventoryClickEvent e) { + if (e.getCurrentItem() == null || e.getCurrentItem().getType() == Material.AIR) { + return; + } // If the item doesn't exist or is air, return + + if (Objects.requireNonNull(e.getInventory()).getType() == InventoryType.PLAYER) { + return; + } // If the inventory is the player's inventory, return + + Player inviter = (Player) e.getWhoClicked(); // Get the player who clicked + + if (Objects.equals(e.getView().title().toString(), INVENTORY_NAME_ARENAS.toString())) { + e.setCancelled(true); // The inventory name is from the plugin, so cancel the event + + int slot = e.getSlot(); + Arena arena = selectingArenaCache.get(inviter).get(slot); // Get the specific player and then the arena from the cache + + InviteManager.Invite invite = plugin.getInviteManager().selectingInvites.get(inviter); // Get the invite from the selectingInvites map + invite.arena = arena; // Set the arena in the invite + + + if (arena == null || arena.getState() != Arena.ArenaState.WAITING) { // Somehow arena doesn't work, purely debug + inviter.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.arena_not_ready")))) + ; + return; + } + + + openTotemEnabled(inviter, arena); + } + if (Objects.equals(e.getView().title().toString(), INVENTORY_NAME_TOTEMS.toString())) { + e.setCancelled(true); // The inventory name is from the plugin, so cancel the event + + int slot = e.getSlot(); + + // Get the invite from the selectingInvites map + InviteManager.Invite invite = plugin.getInviteManager().selectingInvites.get(inviter); + + // Get the arena from the invite + Arena arena = invite.arena; + + // Set the totems in the invite + arena.totems = slot == 1; + + inviter.sendMessage( + MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.invite.invite_sent")) + .replace("%player%", invite.invited.getName()))) + ; // Send the invite confirmation message + + String invite_message = Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.invite_message")) + .replace("%inviter%", inviter.getName()) + .replace("%arena_name%", arena.getName()) + .replace("%winchance%", plugin.getPlayerManager().CalculateWinChance(inviter.getUniqueId(), invite.invited.getUniqueId()) + "%") + .replace("%totems%", arena.totems ? "enabled" : "disabled"); + // Get the invite message from the config and replace the placeholders + + Objects.requireNonNull(plugin.getServer().getPlayer(invite.invited.getUniqueId())).sendMessage(MiniMessage.miniMessage().deserialize(invite_message));// Send the actual message + + + invite.arena = arena; + + plugin.getInviteManager().selectingInvites.remove(inviter); // Remove the invite from the selectingInvites map + plugin.getInviteManager().invites.put(invite.invited, invite); // Put the invite in the invites map + + inviter.closeInventory(); // Close the inventory + } + } +} diff --git a/src/main/java/com/ceraia/arena/types/DoublePlayer.java b/src/main/java/com/ceraia/arena/types/DoublePlayer.java new file mode 100644 index 0000000..065d7ce --- /dev/null +++ b/src/main/java/com/ceraia/arena/types/DoublePlayer.java @@ -0,0 +1,215 @@ +package com.ceraia.arena.types; + +import com.ceraia.arena.Double; +import com.ceraia.arena.listeners.PlayerEventListener; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +public class DoublePlayer { + + private final Double plugin; + private final UUID uuid; + private final String name; + private UUID faction; + private final int draws; + private boolean pvpbanned; + private int wins; + private int losses; + private boolean arenabanned; + private final File configFile; + private final List logs; + private int elo; + private long lastFought; + + + public DoublePlayer( + Double plugin, + String name, + UUID uuid, + int elo, + boolean arenabanned, + boolean pvpbanned, + int wins, + int losses, + int draws, + List logs, + long lastFought, + UUID faction, + File configFile + + ) { + this.plugin = plugin; + + this.name = name; + this.uuid = uuid; + this.elo = elo; + this.arenabanned = arenabanned; + this.pvpbanned = pvpbanned; + this.wins = wins; + this.losses = losses; + this.draws = draws; + this.logs = logs; + this.lastFought = lastFought; + this.faction = faction; + this.configFile = configFile; + } + + public UUID getUUID() { + return uuid; + } + public String getName() { + return name; + } + + public int getElo() { + return elo; + } + + public void setElo(int elo) { + this.elo = elo; + + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("elo", elo); + try { + // Trigger the custom event when Elo changes + PlayerEventListener eloChangeEvent = new PlayerEventListener(Bukkit.getPlayer(uuid), this); + Bukkit.getServer().getPluginManager().callEvent(eloChangeEvent); + + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public boolean pvpBan(){ + pvpbanned = !pvpbanned; + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("pvpbanned", pvpbanned); + try { + // Trigger the custom event when Elo changes + PlayerEventListener eloChangeEvent = new PlayerEventListener(Bukkit.getPlayer(uuid), this); + Bukkit.getServer().getPluginManager().callEvent(eloChangeEvent); + + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + return pvpbanned; + } + + public boolean arenaBan(){ + arenabanned = !arenabanned; + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("arenabanned", arenabanned); + try { + // Trigger the custom event when Elo changes + PlayerEventListener eloChangeEvent = new PlayerEventListener(Bukkit.getPlayer(uuid), this); + Bukkit.getServer().getPluginManager().callEvent(eloChangeEvent); + + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + return arenabanned; + } + + public boolean pvpBanned() { + return pvpbanned; + } + + public boolean arenaBanned() { + return arenabanned; + } + + public int wins() { + return wins; + } + + public int losses() { + return losses; + } + + public int draws() { + return draws; + } + + public void addWin() { + wins++; + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("wins", wins); + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void addLoss() { + losses++; + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("losses", losses); + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void addLog(String string){ + logs.add(string); + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("logs", logs); + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void savePlayer(){ + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("name", name); + config.set("uuid", uuid.toString()); + config.set("elo", elo); + config.set("arenabanned", arenabanned); + config.set("pvpbanned", pvpbanned); + config.set("wins", wins); + config.set("losses", losses); + config.set("logs", logs); + + if(faction == null){ + config.set("faction", null); + } else { + config.set("faction", faction.toString()); + } + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void setLastFought(long lastFought) { + this.lastFought = lastFought; + } + + public Faction getFaction() { + return plugin.getFactionManager().getFaction(faction); + } + public void setFaction(UUID faction) { + this.faction = faction; + FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); + config.set("faction", faction.toString()); + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/ceraia/arena/types/Faction.java b/src/main/java/com/ceraia/arena/types/Faction.java new file mode 100644 index 0000000..a9a3f61 --- /dev/null +++ b/src/main/java/com/ceraia/arena/types/Faction.java @@ -0,0 +1,89 @@ +package com.ceraia.arena.types; + +import com.ceraia.arena.Double; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class Faction { + + private final Double plugin; + private final UUID uuid; + private final String name; + private File configFile; + + private List members; + + public Faction( + Double plugin, + UUID uuid, + String name, + List members, + File configFile + ) { + this.plugin = plugin; + this.name = name; + this.uuid = uuid; + this.members = members; + this.configFile = configFile; + } + + public UUID getUUID() { + return uuid; + } + + public String getName(){ + return this.name; + } + + public List getMembers(){ + return this.members; + } + + public void addMember(String name){ + // If members is null, create a new list + if (this.members == null){ + this.members = new ArrayList(); + } + this.members.add(name); + this.plugin.getPlayerManager().getDoublePlayer(name).setFaction(this.uuid); + + this.saveFaction(); + } + + public void removeMember(String name){ + this.members.remove(name); + } + + public boolean saveFaction(){ + try { + configFile = new File(plugin.getDataFolder(), "data/factions/" + name + ".yml"); + + // Check if the file already exists + if (!configFile.exists()) { + configFile.createNewFile(); + } + + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + + // Update or set the values + config.set("name", name); + config.set("id", uuid.toString()); + + config.set("members", members); + + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + public File getConfigFile(){ + return this.configFile; + } +} From c262df3bfd686550dd2f58f5c4861c47d2286474 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:13:53 +0800 Subject: [PATCH 02/23] Updated primed tnt name for newer version --- .../java/com/ceraia/arena/listeners/ArenaExplodeListener.java | 2 +- .../java/com/ceraia/arena/listeners/ArenaFightListener.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java index 7d5434a..6491169 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java +++ b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java @@ -29,7 +29,7 @@ private boolean isInArena(Player player) { @EventHandler public void onEntiyExplode(EntityExplodeEvent e) { Player source = null; - if (e.getEntityType().equals(EntityType.PRIMED_TNT)) { + if (e.getEntityType().equals(EntityType.TNT)) { TNTPrimed tnt = (TNTPrimed) e.getEntity(); Entity entity = tnt.getSource(); if (!(entity instanceof Player)) return; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java index 0872f9a..1f61f00 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java +++ b/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java @@ -99,7 +99,7 @@ else if (event.getDamager() instanceof org.bukkit.entity.Projectile projectile) } // If the damage is caused by a tnt - else if (event.getDamager().getType() == org.bukkit.entity.EntityType.PRIMED_TNT) { + else if (event.getDamager().getType() == org.bukkit.entity.EntityType.TNT) { plugin.getLogger().info("TNT"); if (event.getDamager().customName() != null) { killer = Bukkit.getPlayer(Objects.requireNonNull(event.getDamager().customName()).toString()); From 1f947709570b98f20538df8d9ce0c8fe475e2fb4 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:16:02 +0800 Subject: [PATCH 03/23] Removed some redundant calls and allocations --- .../arena/listeners/ArenaExplodeListener.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java index 6491169..4587d51 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java +++ b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java @@ -27,7 +27,7 @@ private boolean isInArena(Player player) { // TNT @EventHandler - public void onEntiyExplode(EntityExplodeEvent e) { + public void onEntityExplode(EntityExplodeEvent e) { Player source = null; if (e.getEntityType().equals(EntityType.TNT)) { TNTPrimed tnt = (TNTPrimed) e.getEntity(); @@ -36,7 +36,7 @@ public void onEntiyExplode(EntityExplodeEvent e) { source = (Player) entity; } - if (source == null || !isInArena(source)) { + if (source == null || isInArena(source)) { return; } e.blockList().clear(); @@ -48,16 +48,13 @@ public void onHitCrystal(EntityDamageByEntityEvent e) { Entity entity = e.getEntity(); Entity damager = e.getDamager(); - if (damager == null) return; - - Player source = null; + Player source; if (!(entity instanceof EnderCrystal)) return; if (damager instanceof Player) { source = (Player) damager; - } else if (damager instanceof Arrow) { - Arrow arrow = (Arrow) damager; + } else if (damager instanceof Arrow arrow) { Entity entity2 = (Entity) arrow.getShooter(); if (!(entity2 instanceof Player)) return; source = (Player) entity2; @@ -65,7 +62,7 @@ public void onHitCrystal(EntityDamageByEntityEvent e) { return; } - if (!isInArena(source)) { + if (isInArena(source)) { return; } @@ -90,7 +87,7 @@ public void onFillAnchor(PlayerInteractEvent e) { RespawnAnchor data = (RespawnAnchor) block.getBlockData(); if (data.getCharges() < data.getMaximumCharges()) return; - if (!isInArena(e.getPlayer())) return; + if (isInArena(e.getPlayer())) return; e.setCancelled(true); block.setType(Material.AIR); From 9c62dff268bf993bc8a94c6c4f1e29b504006960 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:18:44 +0800 Subject: [PATCH 04/23] Refactored double file and moved the location, adjusted file to kotlin --- src/main/java/com/ceraia/Double.kt | 89 ++++++++++++++ src/main/java/com/ceraia/arena/Double.java | 110 ------------------ src/main/java/com/ceraia/arena/Utils.java | 12 +- .../arena/commands/arena/CommandArena.java | 2 +- .../arena/commands/arena/CommandGVG.java | 2 +- .../arena/commands/arena/CommandPVP.java | 2 +- .../arena/commands/arena/CommandProfile.java | 2 +- .../arena/commands/arena/CommandTop.java | 2 +- .../commands/factions/CommandFaction.java | 2 +- .../arena/commands/system/CommandMod.java | 2 +- .../arena/commands/system/CommandVersion.java | 2 +- .../arena/listeners/ArenaBlockListener.java | 2 +- .../arena/listeners/ArenaExplodeListener.java | 2 +- .../arena/listeners/ArenaFightListener.java | 2 +- .../listeners/PlayerEloChangeListener.java | 2 +- .../listeners/PlayerInventoryListener.java | 2 +- .../arena/listeners/SpellsListener.java | 2 +- .../ceraia/arena/managers/ArenaManager.java | 2 +- .../arena/managers/EloScoreboardManager.java | 2 +- .../ceraia/arena/managers/FactionManager.java | 2 +- .../ceraia/arena/managers/PlayerManager.java | 2 +- .../java/com/ceraia/arena/types/Arena.java | 2 +- .../ceraia/arena/types/ArenaSelectGUI.java | 2 +- .../com/ceraia/arena/types/DoublePlayer.java | 2 +- .../java/com/ceraia/arena/types/Faction.java | 2 +- 25 files changed, 118 insertions(+), 137 deletions(-) create mode 100644 src/main/java/com/ceraia/Double.kt delete mode 100644 src/main/java/com/ceraia/arena/Double.java diff --git a/src/main/java/com/ceraia/Double.kt b/src/main/java/com/ceraia/Double.kt new file mode 100644 index 0000000..ac2dd7c --- /dev/null +++ b/src/main/java/com/ceraia/Double.kt @@ -0,0 +1,89 @@ +package com.ceraia + +import com.ceraia.arena.commands.arena.* +import com.ceraia.arena.commands.factions.CommandFaction +import com.ceraia.arena.commands.system.CommandMod +import com.ceraia.arena.commands.system.CommandVersion +import com.ceraia.arena.listeners.* +import com.ceraia.arena.managers.* +import com.ceraia.arena.misc.Metrics +import com.ceraia.arena.types.ArenaSelectGUI +import org.bukkit.plugin.java.JavaPlugin +import java.io.File +import java.util.* + +class Double : JavaPlugin() { + var arenaManager: ArenaManager? = null + private set + var inviteManager: InviteManager? = null + private set + var arenaSelectGUI: ArenaSelectGUI? = null + private set + var groupManager: CommandGVG? = null + private set + var playerManager: PlayerManager? = null + private set + var metrics: Metrics? = null + private var eloScoreBoardManager: EloScoreboardManager? = null + var factionManager: FactionManager? = null + private set + + override fun onEnable() { + metrics = Metrics(this, 20303) + + saveDefaultConfig() + File(dataFolder, "data/arenas").mkdirs() + File(dataFolder, "data/items").mkdirs() + File(dataFolder, "data/users").mkdirs() + File(dataFolder, "data/factions").mkdirs() + + // Managers + this.factionManager = FactionManager(this) + this.arenaManager = ArenaManager(this) + this.playerManager = PlayerManager(this) + this.eloScoreBoardManager = EloScoreboardManager(this) + this.inviteManager = InviteManager() + + this.arenaSelectGUI = ArenaSelectGUI(this) + this.groupManager = CommandGVG(this) + + // Command + val commandPVP = CommandPVP(this) + val commandArena = CommandArena(this) + val commandMod = CommandMod(this) + val commandTop = CommandTop(this) + val commandProfile = CommandProfile(this) + val commandVersion = CommandVersion(this) + val commandFaction = CommandFaction(this) + + // Listeners + PlayerEloChangeListener(this) + ArenaFightListener(this) + PlayerInventoryListener(this) + ArenaBlockListener(this) + ArenaExplodeListener(this) + SpellsListener(this) + + // PvP Commands + Objects.requireNonNull(getCommand("pvp"))?.setExecutor(commandPVP) + Objects.requireNonNull(getCommand("arena"))?.setExecutor(commandArena) + Objects.requireNonNull(getCommand("gvg"))?.setExecutor(groupManager) + Objects.requireNonNull(getCommand("top"))?.setExecutor(commandTop) + Objects.requireNonNull(getCommand("leaderboard"))?.setExecutor(commandTop) + Objects.requireNonNull(getCommand("profile"))?.setExecutor(commandProfile) + Objects.requireNonNull(getCommand("stats"))?.setExecutor(commandProfile) + + // System Misc + Objects.requireNonNull(getCommand("mod"))?.setExecutor(commandMod) + Objects.requireNonNull(getCommand("version"))?.setExecutor(commandVersion) + + // Faction Commands + Objects.requireNonNull(getCommand("faction"))?.setExecutor(commandFaction) + } + + override fun onDisable() { + metrics!!.shutdown() + playerManager!!.savePlayers() + factionManager!!.saveFactions() + } +} diff --git a/src/main/java/com/ceraia/arena/Double.java b/src/main/java/com/ceraia/arena/Double.java deleted file mode 100644 index 41e40a3..0000000 --- a/src/main/java/com/ceraia/arena/Double.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.ceraia.arena; - -import com.ceraia.arena.commands.arena.*; -import com.ceraia.arena.commands.factions.CommandFaction; -import com.ceraia.arena.commands.system.CommandMod; -import com.ceraia.arena.commands.system.CommandVersion; -import com.ceraia.arena.listeners.*; -import com.ceraia.arena.managers.*; -import com.ceraia.arena.misc.Metrics; -import com.ceraia.arena.types.ArenaSelectGUI; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.File; -import java.util.Objects; - -public class Double extends JavaPlugin { - - private ArenaManager arenaManager; - private InviteManager inviteManager; - private ArenaSelectGUI arenaSelectGUI; - private CommandGVG commandGVG; - private PlayerManager playerManager; - Metrics metrics; - private EloScoreboardManager eloScoreBoardManager; - private FactionManager factionManager; - - public void onEnable() { - metrics = new Metrics(this, 20303); - - saveDefaultConfig(); - new File(getDataFolder(), "data/arenas").mkdirs(); - new File(getDataFolder(), "data/items").mkdirs(); - new File(getDataFolder(), "data/users").mkdirs(); - new File(getDataFolder(), "data/factions").mkdirs(); - - // Managers - this.factionManager = new FactionManager(this); - this.arenaManager = new ArenaManager(this); - this.playerManager = new PlayerManager(this); - this.eloScoreBoardManager = new EloScoreboardManager(this); - this.inviteManager = new InviteManager(); - - this.arenaSelectGUI = new ArenaSelectGUI(this); - this.commandGVG = new CommandGVG(this); - - // Command - CommandPVP commandPVP = new CommandPVP(this); - CommandArena commandArena = new CommandArena(this); - CommandMod commandMod = new CommandMod(this); - CommandTop commandTop = new CommandTop(this); - CommandProfile commandProfile = new CommandProfile(this); - CommandVersion commandVersion = new CommandVersion(this); - CommandFaction commandFaction = new CommandFaction(this); - - // Listeners - new PlayerEloChangeListener(this); - new ArenaFightListener(this); - new PlayerInventoryListener(this); - new ArenaBlockListener(this); - new ArenaExplodeListener(this); - new SpellsListener(this); - - // PvP Commands - Objects.requireNonNull(getCommand("pvp")).setExecutor(commandPVP); - Objects.requireNonNull(getCommand("arena")).setExecutor(commandArena); - Objects.requireNonNull(getCommand("gvg")).setExecutor(commandGVG); - Objects.requireNonNull(getCommand("top")).setExecutor(commandTop); - Objects.requireNonNull(getCommand("leaderboard")).setExecutor(commandTop); - Objects.requireNonNull(getCommand("profile")).setExecutor(commandProfile); - Objects.requireNonNull(getCommand("stats")).setExecutor(commandProfile); - - // System Misc - Objects.requireNonNull(getCommand("mod")).setExecutor(commandMod); - Objects.requireNonNull(getCommand("version")).setExecutor(commandVersion); - - // Faction Commands - Objects.requireNonNull(getCommand("faction")).setExecutor(commandFaction); - } - - public void onDisable() { - metrics.shutdown(); - playerManager.savePlayers(); - factionManager.saveFactions(); - } - - public ArenaManager getArenaManager() { - return arenaManager; - } - - public PlayerManager getPlayerManager() { - return playerManager; - } - - public InviteManager getInviteManager() { - return inviteManager; - } - - public ArenaSelectGUI getArenaSelectGUI() { - return arenaSelectGUI; - } - - public CommandGVG getGroupManager() { - return commandGVG; - } - - public FactionManager getFactionManager() { - return factionManager; - } - -} diff --git a/src/main/java/com/ceraia/arena/Utils.java b/src/main/java/com/ceraia/arena/Utils.java index e5fe233..a16022d 100644 --- a/src/main/java/com/ceraia/arena/Utils.java +++ b/src/main/java/com/ceraia/arena/Utils.java @@ -1,5 +1,6 @@ package com.ceraia.arena; +import com.ceraia.Double; import com.ceraia.arena.types.Arena; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -13,7 +14,7 @@ public class Utils { - public static void revertInventory(Double plugin, Player pl, Arena arena) { + public static void revertInventory(com.ceraia.Double plugin, Player pl, Arena arena) { try { File file = new File(plugin.getDataFolder(), "data/pinventory_" + arena.getName() + "_" + pl.getName() + ".yml"); @@ -21,10 +22,11 @@ public static void revertInventory(Double plugin, Player pl, Arena arena) { ItemStack[] content = new ItemStack[pl.getInventory().getContents().length]; try { - for (String s : Objects.requireNonNull(config.getConfigurationSection("items")).getKeys(false)) { - int i = Integer.parseInt(s); - content[i] = config.getItemStack("items." + s); - }} catch (Exception e) { + for (String s : Objects.requireNonNull(config.getConfigurationSection("items")).getKeys(false)) { + int i = Integer.parseInt(s); + content[i] = config.getItemStack("items." + s); + } + } catch (Exception e) { System.out.println("Problem loading player inventories."); } diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java b/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java index b9be439..46f43a5 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.arena; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.Arena; import com.ceraia.arena.types.DoublePlayer; import net.kyori.adventure.text.Component; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java b/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java index 676e6cf..3bf5d80 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.arena; -import com.ceraia.arena.Double; +import com.ceraia.Double; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java b/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java index de28af4..db3ee9f 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.arena; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.managers.InviteManager; import com.ceraia.arena.types.Arena; import com.ceraia.arena.types.DoublePlayer; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java b/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java index d9b5273..339c686 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.arena; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java b/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java index c50c6f5..e6edf40 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java +++ b/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.arena; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.DoublePlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; diff --git a/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java b/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java index ff11d26..e5fd2fb 100644 --- a/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java +++ b/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.factions; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.Faction; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/src/main/java/com/ceraia/arena/commands/system/CommandMod.java b/src/main/java/com/ceraia/arena/commands/system/CommandMod.java index 41deca5..3f99300 100644 --- a/src/main/java/com/ceraia/arena/commands/system/CommandMod.java +++ b/src/main/java/com/ceraia/arena/commands/system/CommandMod.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.system; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java b/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java index e432d44..d6af5c6 100644 --- a/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java +++ b/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java @@ -1,6 +1,6 @@ package com.ceraia.arena.commands.system; -import com.ceraia.arena.Double; +import com.ceraia.Double; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java index 5658938..ac85bfc 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java +++ b/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java @@ -1,6 +1,6 @@ package com.ceraia.arena.listeners; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.Arena; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java index 4587d51..9f73551 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java +++ b/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java @@ -1,6 +1,6 @@ package com.ceraia.arena.listeners; -import com.ceraia.arena.Double; +import com.ceraia.Double; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java b/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java index 1f61f00..508b2e7 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java +++ b/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java @@ -1,6 +1,6 @@ package com.ceraia.arena.listeners; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.managers.InviteManager; import com.ceraia.arena.types.Arena; import net.kyori.adventure.text.minimessage.MiniMessage; diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java b/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java index 288941a..b6e08ca 100644 --- a/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java +++ b/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java @@ -1,6 +1,6 @@ package com.ceraia.arena.listeners; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.managers.EloScoreboardManager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java b/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java index 7b3e939..f28b453 100644 --- a/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java +++ b/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java @@ -1,6 +1,6 @@ package com.ceraia.arena.listeners; -import com.ceraia.arena.Double; +import com.ceraia.Double; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/src/main/java/com/ceraia/arena/listeners/SpellsListener.java b/src/main/java/com/ceraia/arena/listeners/SpellsListener.java index f1c1d81..2a9a893 100644 --- a/src/main/java/com/ceraia/arena/listeners/SpellsListener.java +++ b/src/main/java/com/ceraia/arena/listeners/SpellsListener.java @@ -1,6 +1,6 @@ package com.ceraia.arena.listeners; -import com.ceraia.arena.Double; +import com.ceraia.Double; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/src/main/java/com/ceraia/arena/managers/ArenaManager.java b/src/main/java/com/ceraia/arena/managers/ArenaManager.java index e5c0e33..abf10c2 100644 --- a/src/main/java/com/ceraia/arena/managers/ArenaManager.java +++ b/src/main/java/com/ceraia/arena/managers/ArenaManager.java @@ -1,6 +1,6 @@ package com.ceraia.arena.managers; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.Arena; import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java b/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java index c12067c..3bc0894 100644 --- a/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java +++ b/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java @@ -1,6 +1,6 @@ package com.ceraia.arena.managers; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/managers/FactionManager.java b/src/main/java/com/ceraia/arena/managers/FactionManager.java index b665a08..d491ee3 100644 --- a/src/main/java/com/ceraia/arena/managers/FactionManager.java +++ b/src/main/java/com/ceraia/arena/managers/FactionManager.java @@ -1,6 +1,6 @@ package com.ceraia.arena.managers; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.Faction; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/ceraia/arena/managers/PlayerManager.java b/src/main/java/com/ceraia/arena/managers/PlayerManager.java index 5f4adad..73038ea 100644 --- a/src/main/java/com/ceraia/arena/managers/PlayerManager.java +++ b/src/main/java/com/ceraia/arena/managers/PlayerManager.java @@ -1,6 +1,6 @@ package com.ceraia.arena.managers; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.types.DoublePlayer; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/com/ceraia/arena/types/Arena.java b/src/main/java/com/ceraia/arena/types/Arena.java index a86ee2d..fb360da 100644 --- a/src/main/java/com/ceraia/arena/types/Arena.java +++ b/src/main/java/com/ceraia/arena/types/Arena.java @@ -1,6 +1,6 @@ package com.ceraia.arena.types; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.Utils; import com.ceraia.arena.managers.InviteManager; import net.kyori.adventure.text.Component; diff --git a/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java b/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java index d14280b..c2adfa0 100644 --- a/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java +++ b/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java @@ -1,6 +1,6 @@ package com.ceraia.arena.types; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.managers.InviteManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; diff --git a/src/main/java/com/ceraia/arena/types/DoublePlayer.java b/src/main/java/com/ceraia/arena/types/DoublePlayer.java index 065d7ce..593f425 100644 --- a/src/main/java/com/ceraia/arena/types/DoublePlayer.java +++ b/src/main/java/com/ceraia/arena/types/DoublePlayer.java @@ -1,6 +1,6 @@ package com.ceraia.arena.types; -import com.ceraia.arena.Double; +import com.ceraia.Double; import com.ceraia.arena.listeners.PlayerEventListener; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/com/ceraia/arena/types/Faction.java b/src/main/java/com/ceraia/arena/types/Faction.java index a9a3f61..ea18bf8 100644 --- a/src/main/java/com/ceraia/arena/types/Faction.java +++ b/src/main/java/com/ceraia/arena/types/Faction.java @@ -1,6 +1,6 @@ package com.ceraia.arena.types; -import com.ceraia.arena.Double; +import com.ceraia.Double; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; From 2e680044921901bf8bfbca1a3384c69d9fda4604 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:20:17 +0800 Subject: [PATCH 05/23] Moved metrics location --- src/main/java/com/ceraia/Double.kt | 2 +- src/main/java/com/ceraia/{arena/misc => metrics}/Metrics.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/com/ceraia/{arena/misc => metrics}/Metrics.java (99%) diff --git a/src/main/java/com/ceraia/Double.kt b/src/main/java/com/ceraia/Double.kt index ac2dd7c..ddb33d8 100644 --- a/src/main/java/com/ceraia/Double.kt +++ b/src/main/java/com/ceraia/Double.kt @@ -6,7 +6,7 @@ import com.ceraia.arena.commands.system.CommandMod import com.ceraia.arena.commands.system.CommandVersion import com.ceraia.arena.listeners.* import com.ceraia.arena.managers.* -import com.ceraia.arena.misc.Metrics +import com.ceraia.metrics.Metrics import com.ceraia.arena.types.ArenaSelectGUI import org.bukkit.plugin.java.JavaPlugin import java.io.File diff --git a/src/main/java/com/ceraia/arena/misc/Metrics.java b/src/main/java/com/ceraia/metrics/Metrics.java similarity index 99% rename from src/main/java/com/ceraia/arena/misc/Metrics.java rename to src/main/java/com/ceraia/metrics/Metrics.java index 7f05f7b..1629719 100644 --- a/src/main/java/com/ceraia/arena/misc/Metrics.java +++ b/src/main/java/com/ceraia/metrics/Metrics.java @@ -12,7 +12,7 @@ * * Violations will result in a ban of your plugin and account from bStats. */ -package com.ceraia.arena.misc; +package com.ceraia.metrics; import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; From 63b657413f482ff327f758c429e8d7c5effb57ed Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:23:20 +0800 Subject: [PATCH 06/23] Reimplemented metrics to main file --- src/main/java/com/ceraia/Ceraia.kt | 8 ++++++++ src/main/java/com/ceraia/Double.kt | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ceraia/Ceraia.kt b/src/main/java/com/ceraia/Ceraia.kt index 2ab89d2..a7ce62b 100644 --- a/src/main/java/com/ceraia/Ceraia.kt +++ b/src/main/java/com/ceraia/Ceraia.kt @@ -1,6 +1,7 @@ package com.ceraia import com.ceraia.managers.PlayerManager +import com.ceraia.metrics.Metrics import com.ceraia.modules.* import com.ceraia.modules.arenas.ArenaModule import com.ceraia.modules.races.ModuleRaces @@ -14,6 +15,9 @@ import java.io.File class Ceraia : JavaPlugin() { private val plugin: Ceraia = this + + var metrics: Metrics? = null + lateinit var playerManager: PlayerManager private set lateinit var moduleSeating: ModuleSeating @@ -30,7 +34,10 @@ class Ceraia : JavaPlugin() { private set override fun onEnable() { + metrics = Metrics(this, 20303) + saveDefaultConfig() + File(dataFolder, "data").mkdirs() File(dataFolder, "data/arenas").mkdirs() File(dataFolder, "data/items").mkdirs() @@ -58,6 +65,7 @@ class Ceraia : JavaPlugin() { override fun onDisable() { playerManager.savePlayers() + metrics?.shutdown() } fun noPermission(player: Player) { diff --git a/src/main/java/com/ceraia/Double.kt b/src/main/java/com/ceraia/Double.kt index ddb33d8..f545316 100644 --- a/src/main/java/com/ceraia/Double.kt +++ b/src/main/java/com/ceraia/Double.kt @@ -84,6 +84,5 @@ class Double : JavaPlugin() { override fun onDisable() { metrics!!.shutdown() playerManager!!.savePlayers() - factionManager!!.saveFactions() } } From 7396bc6394827bf76744e39ab3c47f62542c036d Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:37:52 +0800 Subject: [PATCH 07/23] Renamed module convention to have module be the latter part of the class name --- src/main/java/com/ceraia/Ceraia.kt | 21 +++++++++---------- .../{ModuleMarriage.kt => MarriageModule.kt} | 2 +- .../{ModuleSeating.kt => SeatingModule.kt} | 2 +- .../races/{ModuleRaces.kt => RaceModule.kt} | 2 +- .../{ModuleSystem.kt => SystemModule.kt} | 2 +- 5 files changed, 14 insertions(+), 15 deletions(-) rename src/main/java/com/ceraia/modules/{ModuleMarriage.kt => MarriageModule.kt} (99%) rename src/main/java/com/ceraia/modules/{ModuleSeating.kt => SeatingModule.kt} (98%) rename src/main/java/com/ceraia/modules/races/{ModuleRaces.kt => RaceModule.kt} (99%) rename src/main/java/com/ceraia/modules/system/{ModuleSystem.kt => SystemModule.kt} (98%) diff --git a/src/main/java/com/ceraia/Ceraia.kt b/src/main/java/com/ceraia/Ceraia.kt index a7ce62b..62aa31f 100644 --- a/src/main/java/com/ceraia/Ceraia.kt +++ b/src/main/java/com/ceraia/Ceraia.kt @@ -4,13 +4,12 @@ import com.ceraia.managers.PlayerManager import com.ceraia.metrics.Metrics import com.ceraia.modules.* import com.ceraia.modules.arenas.ArenaModule -import com.ceraia.modules.races.ModuleRaces -import com.ceraia.modules.system.ModuleSystem +import com.ceraia.modules.races.RaceModule +import com.ceraia.modules.system.SystemModule import com.ceraia.util.ConfigHelper import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin -import org.incendo.cloud.paper.PaperCommandManager import java.io.File class Ceraia : JavaPlugin() { @@ -20,13 +19,13 @@ class Ceraia : JavaPlugin() { lateinit var playerManager: PlayerManager private set - lateinit var moduleSeating: ModuleSeating + lateinit var seatingModule: SeatingModule private set - lateinit var moduleMarriage: ModuleMarriage + lateinit var marriageModule: MarriageModule private set - lateinit var moduleSystem: ModuleSystem + lateinit var systemModule: SystemModule private set - lateinit var moduleRaces: ModuleRaces + lateinit var raceModule: RaceModule private set lateinit var configHelper: ConfigHelper private set @@ -51,10 +50,10 @@ class Ceraia : JavaPlugin() { /*---------------------------------*/ /* Modules */ /*---------------------------------*/ - moduleSeating = ModuleSeating(plugin) - moduleMarriage = ModuleMarriage(plugin) - moduleSystem = ModuleSystem(plugin) - moduleRaces = ModuleRaces(plugin) + seatingModule = SeatingModule(plugin) + marriageModule = MarriageModule(plugin) + systemModule = SystemModule(plugin) + raceModule = RaceModule(plugin) arenaModule = ArenaModule(plugin) /*---------------------------------*/ diff --git a/src/main/java/com/ceraia/modules/ModuleMarriage.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt similarity index 99% rename from src/main/java/com/ceraia/modules/ModuleMarriage.kt rename to src/main/java/com/ceraia/modules/MarriageModule.kt index 6121c03..ea52202 100644 --- a/src/main/java/com/ceraia/modules/ModuleMarriage.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -16,7 +16,7 @@ import org.bukkit.event.player.PlayerInteractEntityEvent import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.util.StringUtil -class ModuleMarriage(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { +class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { private val invites: MutableMap = mutableMapOf() diff --git a/src/main/java/com/ceraia/modules/ModuleSeating.kt b/src/main/java/com/ceraia/modules/SeatingModule.kt similarity index 98% rename from src/main/java/com/ceraia/modules/ModuleSeating.kt rename to src/main/java/com/ceraia/modules/SeatingModule.kt index 1149116..64052cb 100644 --- a/src/main/java/com/ceraia/modules/ModuleSeating.kt +++ b/src/main/java/com/ceraia/modules/SeatingModule.kt @@ -18,7 +18,7 @@ import org.bukkit.event.Listener import org.bukkit.event.player.PlayerInteractEvent import org.jetbrains.annotations.NotNull -class ModuleSeating(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { +class SeatingModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { val chairs: MutableList = mutableListOf() diff --git a/src/main/java/com/ceraia/modules/races/ModuleRaces.kt b/src/main/java/com/ceraia/modules/races/RaceModule.kt similarity index 99% rename from src/main/java/com/ceraia/modules/races/ModuleRaces.kt rename to src/main/java/com/ceraia/modules/races/RaceModule.kt index 3eb8f8b..5171dfe 100644 --- a/src/main/java/com/ceraia/modules/races/ModuleRaces.kt +++ b/src/main/java/com/ceraia/modules/races/RaceModule.kt @@ -21,7 +21,7 @@ import org.bukkit.util.StringUtil import java.io.File import java.util.* -class ModuleRaces(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCompleter, Listener { +class RaceModule(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCompleter, Listener { private var races: MutableList = ArrayList() private var raceFactions: MutableList = ArrayList() diff --git a/src/main/java/com/ceraia/modules/system/ModuleSystem.kt b/src/main/java/com/ceraia/modules/system/SystemModule.kt similarity index 98% rename from src/main/java/com/ceraia/modules/system/ModuleSystem.kt rename to src/main/java/com/ceraia/modules/system/SystemModule.kt index df0e936..b387fb4 100644 --- a/src/main/java/com/ceraia/modules/system/ModuleSystem.kt +++ b/src/main/java/com/ceraia/modules/system/SystemModule.kt @@ -11,7 +11,7 @@ import org.bukkit.entity.Player import org.bukkit.event.Listener import org.bukkit.util.StringUtil -class ModuleSystem(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { +class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { init { // Register the commands From 0a9fb6e7dc1e307b427102ee55973d49976b911c Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:45:21 +0800 Subject: [PATCH 08/23] Refactored main modules to include system modules. --- src/main/java/com/ceraia/Ceraia.kt | 6 +- .../ceraia/modules/{races => }/RaceModule.kt | 2 +- .../modules/{system => }/SystemModule.kt | 2 +- .../java/com/ceraia/modules/arenas/Arena.kt | 89 ------------------- .../ceraia/modules/arenas/ArenaCommands.kt | 71 --------------- .../com/ceraia/{ => modules/arenas}/Double.kt | 16 ++-- .../{arena => modules/arenas}/Utils.java | 7 +- .../arenas}/commands/arena/CommandArena.java | 8 +- .../arenas}/commands/arena/CommandGVG.java | 4 +- .../arenas}/commands/arena/CommandPVP.java | 10 +-- .../commands/arena/CommandProfile.java | 6 +- .../arenas}/commands/arena/CommandTop.java | 6 +- .../commands/factions/CommandFaction.java | 6 +- .../arenas}/commands/system/CommandMod.java | 6 +- .../commands/system/CommandVersion.java | 4 +- .../arenas}/listeners/ArenaBlockListener.java | 6 +- .../listeners/ArenaExplodeListener.java | 4 +- .../arenas}/listeners/ArenaFightListener.java | 8 +- .../listeners/PlayerEloChangeListener.java | 6 +- .../listeners/PlayerEventListener.java | 4 +- .../listeners/PlayerInventoryListener.java | 4 +- .../arenas}/listeners/SpellsListener.java | 4 +- .../arenas}/managers/ArenaManager.java | 6 +- .../managers/EloScoreboardManager.java | 6 +- .../arenas}/managers/FactionManager.java | 6 +- .../arenas}/managers/InviteManager.java | 4 +- .../arenas}/managers/PlayerManager.java | 6 +- .../arenas}/types/Arena.java | 8 +- .../arenas}/types/ArenaSelectGUI.java | 6 +- .../arenas}/types/DoublePlayer.java | 6 +- .../arenas}/types/Faction.java | 4 +- .../com/ceraia/modules/ceraia/CeraiaModule.kt | 18 ++++ .../ceraia}/managers/PlayerManager.kt | 4 +- .../ceraia}/types/DoublePlayer.kt | 2 +- 34 files changed, 106 insertions(+), 249 deletions(-) rename src/main/java/com/ceraia/modules/{races => }/RaceModule.kt (99%) rename src/main/java/com/ceraia/modules/{system => }/SystemModule.kt (99%) delete mode 100644 src/main/java/com/ceraia/modules/arenas/Arena.kt delete mode 100644 src/main/java/com/ceraia/modules/arenas/ArenaCommands.kt rename src/main/java/com/ceraia/{ => modules/arenas}/Double.kt (87%) rename src/main/java/com/ceraia/{arena => modules/arenas}/Utils.java (93%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/arena/CommandArena.java (98%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/arena/CommandGVG.java (99%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/arena/CommandPVP.java (97%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/arena/CommandProfile.java (94%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/arena/CommandTop.java (95%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/factions/CommandFaction.java (95%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/system/CommandMod.java (97%) rename src/main/java/com/ceraia/{arena => modules/arenas}/commands/system/CommandVersion.java (91%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/ArenaBlockListener.java (89%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/ArenaExplodeListener.java (97%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/ArenaFightListener.java (97%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/PlayerEloChangeListener.java (86%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/PlayerEventListener.java (89%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/PlayerInventoryListener.java (93%) rename src/main/java/com/ceraia/{arena => modules/arenas}/listeners/SpellsListener.java (99%) rename src/main/java/com/ceraia/{arena => modules/arenas}/managers/ArenaManager.java (94%) rename src/main/java/com/ceraia/{arena => modules/arenas}/managers/EloScoreboardManager.java (92%) rename src/main/java/com/ceraia/{arena => modules/arenas}/managers/FactionManager.java (94%) rename src/main/java/com/ceraia/{arena => modules/arenas}/managers/InviteManager.java (86%) rename src/main/java/com/ceraia/{arena => modules/arenas}/managers/PlayerManager.java (98%) rename src/main/java/com/ceraia/{arena => modules/arenas}/types/Arena.java (98%) rename src/main/java/com/ceraia/{arena => modules/arenas}/types/ArenaSelectGUI.java (98%) rename src/main/java/com/ceraia/{arena => modules/arenas}/types/DoublePlayer.java (97%) rename src/main/java/com/ceraia/{arena => modules/arenas}/types/Faction.java (96%) create mode 100644 src/main/java/com/ceraia/modules/ceraia/CeraiaModule.kt rename src/main/java/com/ceraia/{ => modules/ceraia}/managers/PlayerManager.kt (97%) rename src/main/java/com/ceraia/{ => modules/ceraia}/types/DoublePlayer.kt (97%) diff --git a/src/main/java/com/ceraia/Ceraia.kt b/src/main/java/com/ceraia/Ceraia.kt index 62aa31f..8f1432e 100644 --- a/src/main/java/com/ceraia/Ceraia.kt +++ b/src/main/java/com/ceraia/Ceraia.kt @@ -1,11 +1,11 @@ package com.ceraia -import com.ceraia.managers.PlayerManager +import com.ceraia.modules.ceraia.managers.PlayerManager import com.ceraia.metrics.Metrics import com.ceraia.modules.* import com.ceraia.modules.arenas.ArenaModule -import com.ceraia.modules.races.RaceModule -import com.ceraia.modules.system.SystemModule +import com.ceraia.modules.RaceModule +import com.ceraia.modules.SystemModule import com.ceraia.util.ConfigHelper import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.entity.Player diff --git a/src/main/java/com/ceraia/modules/races/RaceModule.kt b/src/main/java/com/ceraia/modules/RaceModule.kt similarity index 99% rename from src/main/java/com/ceraia/modules/races/RaceModule.kt rename to src/main/java/com/ceraia/modules/RaceModule.kt index 5171dfe..5160235 100644 --- a/src/main/java/com/ceraia/modules/races/RaceModule.kt +++ b/src/main/java/com/ceraia/modules/RaceModule.kt @@ -1,4 +1,4 @@ -package com.ceraia.modules.races +package com.ceraia.modules import dev.triumphteam.gui.builder.item.ItemBuilder import dev.triumphteam.gui.guis.Gui diff --git a/src/main/java/com/ceraia/modules/system/SystemModule.kt b/src/main/java/com/ceraia/modules/SystemModule.kt similarity index 99% rename from src/main/java/com/ceraia/modules/system/SystemModule.kt rename to src/main/java/com/ceraia/modules/SystemModule.kt index b387fb4..1f0807e 100644 --- a/src/main/java/com/ceraia/modules/system/SystemModule.kt +++ b/src/main/java/com/ceraia/modules/SystemModule.kt @@ -1,4 +1,4 @@ -package com.ceraia.modules.system +package com.ceraia.modules import com.ceraia.Ceraia import net.kyori.adventure.text.minimessage.MiniMessage diff --git a/src/main/java/com/ceraia/modules/arenas/Arena.kt b/src/main/java/com/ceraia/modules/arenas/Arena.kt deleted file mode 100644 index 6fb9b73..0000000 --- a/src/main/java/com/ceraia/modules/arenas/Arena.kt +++ /dev/null @@ -1,89 +0,0 @@ -package com.ceraia.modules.arenas - -import com.ceraia.Ceraia -import org.bukkit.Location -import org.bukkit.Material -import org.bukkit.World -import org.bukkit.entity.Player -import java.util.UUID - -class Arena private constructor( - private val plugin: Ceraia, - private val name: String, - private val owner: UUID, - private val breaking: Boolean, - private val spawnpoints: List, -) { - private val players: MutableMap = mutableMapOf() - private val placedBlocks: MutableList = mutableListOf() - private val brokenBlocks: MutableList = mutableListOf() - private val state: ArenaState = ArenaState.READY - private val world: World = spawnpoints[0].world - - fun getPlugin(): Ceraia { return this.plugin } - - fun getName(): String { return this.name } - - fun getOwner(): UUID { return this.owner } - - fun getSpawnpoints(): List { return this.spawnpoints } - - fun breakingAllowed(): Boolean { return this.breaking } - - fun getPlayers(): MutableMap { return this.players } - - fun getPlacedBlocks(): MutableList { return this.placedBlocks } - - fun getBrokenBlocks(): MutableList { return this.brokenBlocks } - - fun getState(): ArenaState { return this.state } - - fun addPlayer(player: Player, location: Location) { - this.players[player] = location - } - - fun removePlayer(player: Player) { - this.players.remove(player) - } - - fun addPlacedBlock(location: Location) { - this.placedBlocks.add(location) - } - - fun removePlacedBlocks() { - this.placedBlocks.forEach { - block -> block.block.type = Material.AIR - } - this.placedBlocks.clear() - } - - class Builder { - private lateinit var plugin: Ceraia - private lateinit var name: String - private lateinit var owner: UUID - private var breaking: Boolean = false // Default to false - private lateinit var spawnpoints: List - - fun plugin(plugin: Ceraia) = apply { this.plugin = plugin } - fun name(name: String) = apply { this.name = name } - fun owner(owner: UUID) = apply { this.owner = owner } - fun breaking(breaking: Boolean) = apply { this.breaking = breaking } - fun spawnpoints(spawnpoints: List) = apply { this.spawnpoints = spawnpoints } - - fun loadBuilder(): Arena { - return Arena(plugin, name, owner, breaking, spawnpoints) - } - } - - companion object { - fun builder() = Builder() - } - - enum class ArenaState { - READY, - STARTING, - INGAME, - ENDING, - ENDLESS - } -} \ No newline at end of file diff --git a/src/main/java/com/ceraia/modules/arenas/ArenaCommands.kt b/src/main/java/com/ceraia/modules/arenas/ArenaCommands.kt deleted file mode 100644 index d7286d6..0000000 --- a/src/main/java/com/ceraia/modules/arenas/ArenaCommands.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.ceraia.modules.arenas - -import com.ceraia.Ceraia -import com.mojang.brigadier.CommandDispatcher -import com.mojang.brigadier.arguments.StringArgumentType -import com.mojang.brigadier.builder.LiteralArgumentBuilder -import com.mojang.brigadier.builder.RequiredArgumentBuilder -import com.mojang.brigadier.context.CommandContext -import com.mojang.brigadier.exceptions.CommandSyntaxException -import org.bukkit.command.Command -import org.bukkit.command.CommandSender -import org.bukkit.event.Listener - -class ArenaCommands(plugin: Ceraia) : Listener { - private val plugin: Ceraia = plugin - private val dispatcher: CommandDispatcher = CommandDispatcher() - - init { - registerCommands() - } - - private fun registerCommands() { - dispatcher.register( - LiteralArgumentBuilder.literal("arena") - .then( - LiteralArgumentBuilder.literal("create") - .then( - RequiredArgumentBuilder.argument("name", StringArgumentType.string()) - .executes { context: CommandContext -> createArena(context) } - ) - ) - .then( - LiteralArgumentBuilder.literal("delete") - .then( - RequiredArgumentBuilder.argument("name", StringArgumentType.string()) - .executes { context: CommandContext -> deleteArena(context) } - ) - ) - ) - } - - private fun createArena(context: CommandContext): Int { - val sender = context.source - val name = StringArgumentType.getString(context, "name") - - sender.sendMessage("Arena $name created.") - return 1 - } - - private fun deleteArena(context: CommandContext): Int { - val sender = context.source - val name = StringArgumentType.getString(context, "name") - - sender.sendMessage("Arena $name deleted.") - return 1 - } - - fun onCommand(sender: CommandSender, command: Command, label: String, args: Array?): Boolean { - try { - dispatcher.execute(command.name + " " + args?.joinToString(" "), sender) - } catch (e: CommandSyntaxException) { - sender.sendMessage("Invalid command syntax.") - } - return true - } - - fun onTabComplete(sender: CommandSender, command: Command, alias: String, args: Array?): MutableList? { - - return null - } -} \ No newline at end of file diff --git a/src/main/java/com/ceraia/Double.kt b/src/main/java/com/ceraia/modules/arenas/Double.kt similarity index 87% rename from src/main/java/com/ceraia/Double.kt rename to src/main/java/com/ceraia/modules/arenas/Double.kt index f545316..ae8fd7e 100644 --- a/src/main/java/com/ceraia/Double.kt +++ b/src/main/java/com/ceraia/modules/arenas/Double.kt @@ -1,13 +1,13 @@ -package com.ceraia +package com.ceraia.modules.arenas -import com.ceraia.arena.commands.arena.* -import com.ceraia.arena.commands.factions.CommandFaction -import com.ceraia.arena.commands.system.CommandMod -import com.ceraia.arena.commands.system.CommandVersion -import com.ceraia.arena.listeners.* -import com.ceraia.arena.managers.* +import com.ceraia.modules.arenas.commands.arena.* +import com.ceraia.modules.arenas.commands.factions.CommandFaction +import com.ceraia.modules.arenas.commands.system.CommandMod +import com.ceraia.modules.arenas.commands.system.CommandVersion +import com.ceraia.modules.arenas.listeners.* +import com.ceraia.modules.arenas.managers.* import com.ceraia.metrics.Metrics -import com.ceraia.arena.types.ArenaSelectGUI +import com.ceraia.modules.arenas.types.ArenaSelectGUI import org.bukkit.plugin.java.JavaPlugin import java.io.File import java.util.* diff --git a/src/main/java/com/ceraia/arena/Utils.java b/src/main/java/com/ceraia/modules/arenas/Utils.java similarity index 93% rename from src/main/java/com/ceraia/arena/Utils.java rename to src/main/java/com/ceraia/modules/arenas/Utils.java index a16022d..d9f0e82 100644 --- a/src/main/java/com/ceraia/arena/Utils.java +++ b/src/main/java/com/ceraia/modules/arenas/Utils.java @@ -1,7 +1,6 @@ -package com.ceraia.arena; +package com.ceraia.modules.arenas; -import com.ceraia.Double; -import com.ceraia.arena.types.Arena; +import com.ceraia.modules.arenas.types.Arena; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; @@ -14,7 +13,7 @@ public class Utils { - public static void revertInventory(com.ceraia.Double plugin, Player pl, Arena arena) { + public static void revertInventory(Double plugin, Player pl, Arena arena) { try { File file = new File(plugin.getDataFolder(), "data/pinventory_" + arena.getName() + "_" + pl.getName() + ".yml"); diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java similarity index 98% rename from src/main/java/com/ceraia/arena/commands/arena/CommandArena.java rename to src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java index 46f43a5..113b8b6 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandArena.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java @@ -1,8 +1,8 @@ -package com.ceraia.arena.commands.arena; +package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.Double; -import com.ceraia.arena.types.Arena; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.Arena; +import com.ceraia.modules.arenas.types.DoublePlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java similarity index 99% rename from src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java rename to src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java index 3bf5d80..a791f93 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandGVG.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.commands.arena; +package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.Double; +import com.ceraia.modules.arenas.Double; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java similarity index 97% rename from src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java rename to src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java index db3ee9f..067061e 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandPVP.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java @@ -1,9 +1,9 @@ -package com.ceraia.arena.commands.arena; +package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.Double; -import com.ceraia.arena.managers.InviteManager; -import com.ceraia.arena.types.Arena; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.managers.InviteManager; +import com.ceraia.modules.arenas.types.Arena; +import com.ceraia.modules.arenas.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java similarity index 94% rename from src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java rename to src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java index 339c686..65e6ff0 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandProfile.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.commands.arena; +package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.Double; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java similarity index 95% rename from src/main/java/com/ceraia/arena/commands/arena/CommandTop.java rename to src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java index e6edf40..88e74d3 100644 --- a/src/main/java/com/ceraia/arena/commands/arena/CommandTop.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.commands.arena; +package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.Double; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.DoublePlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java b/src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java similarity index 95% rename from src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java rename to src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java index e5fd2fb..5ec18ed 100644 --- a/src/main/java/com/ceraia/arena/commands/factions/CommandFaction.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.commands.factions; +package com.ceraia.modules.arenas.commands.factions; -import com.ceraia.Double; -import com.ceraia.arena.types.Faction; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.Faction; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/src/main/java/com/ceraia/arena/commands/system/CommandMod.java b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java similarity index 97% rename from src/main/java/com/ceraia/arena/commands/system/CommandMod.java rename to src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java index 3f99300..96b179a 100644 --- a/src/main/java/com/ceraia/arena/commands/system/CommandMod.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.commands.system; +package com.ceraia.modules.arenas.commands.system; -import com.ceraia.Double; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java similarity index 91% rename from src/main/java/com/ceraia/arena/commands/system/CommandVersion.java rename to src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java index d6af5c6..8fd116f 100644 --- a/src/main/java/com/ceraia/arena/commands/system/CommandVersion.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.commands.system; +package com.ceraia.modules.arenas.commands.system; -import com.ceraia.Double; +import com.ceraia.modules.arenas.Double; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java similarity index 89% rename from src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java index ac85bfc..e55e1f4 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaBlockListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.Double; -import com.ceraia.arena.types.Arena; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.Arena; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java similarity index 97% rename from src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java index 9f73551..a4bf7ba 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaExplodeListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.Double; +import com.ceraia.modules.arenas.Double; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java similarity index 97% rename from src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java index 508b2e7..39e2ff8 100644 --- a/src/main/java/com/ceraia/arena/listeners/ArenaFightListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java @@ -1,8 +1,8 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.Double; -import com.ceraia.arena.managers.InviteManager; -import com.ceraia.arena.types.Arena; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.managers.InviteManager; +import com.ceraia.modules.arenas.types.Arena; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java similarity index 86% rename from src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java index b6e08ca..d625954 100644 --- a/src/main/java/com/ceraia/arena/listeners/PlayerEloChangeListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.Double; -import com.ceraia.arena.managers.EloScoreboardManager; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.managers.EloScoreboardManager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java similarity index 89% rename from src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java index a22ab9a..75afb72 100644 --- a/src/main/java/com/ceraia/arena/listeners/PlayerEventListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.types.DoublePlayer; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; diff --git a/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java similarity index 93% rename from src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java index f28b453..fc5a8f6 100644 --- a/src/main/java/com/ceraia/arena/listeners/PlayerInventoryListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.Double; +import com.ceraia.modules.arenas.Double; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/src/main/java/com/ceraia/arena/listeners/SpellsListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java similarity index 99% rename from src/main/java/com/ceraia/arena/listeners/SpellsListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java index 2a9a893..631d321 100644 --- a/src/main/java/com/ceraia/arena/listeners/SpellsListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.listeners; +package com.ceraia.modules.arenas.listeners; -import com.ceraia.Double; +import com.ceraia.modules.arenas.Double; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/src/main/java/com/ceraia/arena/managers/ArenaManager.java b/src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java similarity index 94% rename from src/main/java/com/ceraia/arena/managers/ArenaManager.java rename to src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java index abf10c2..133a8e3 100644 --- a/src/main/java/com/ceraia/arena/managers/ArenaManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.managers; +package com.ceraia.modules.arenas.managers; -import com.ceraia.Double; -import com.ceraia.arena.types.Arena; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.Arena; import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java b/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java similarity index 92% rename from src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java rename to src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java index 3bc0894..0196174 100644 --- a/src/main/java/com/ceraia/arena/managers/EloScoreboardManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.managers; +package com.ceraia.modules.arenas.managers; -import com.ceraia.Double; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.DoublePlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/src/main/java/com/ceraia/arena/managers/FactionManager.java b/src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java similarity index 94% rename from src/main/java/com/ceraia/arena/managers/FactionManager.java rename to src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java index d491ee3..b4bea9b 100644 --- a/src/main/java/com/ceraia/arena/managers/FactionManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.managers; +package com.ceraia.modules.arenas.managers; -import com.ceraia.Double; -import com.ceraia.arena.types.Faction; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.Faction; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/ceraia/arena/managers/InviteManager.java b/src/main/java/com/ceraia/modules/arenas/managers/InviteManager.java similarity index 86% rename from src/main/java/com/ceraia/arena/managers/InviteManager.java rename to src/main/java/com/ceraia/modules/arenas/managers/InviteManager.java index 7075276..6737aed 100644 --- a/src/main/java/com/ceraia/arena/managers/InviteManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/InviteManager.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.managers; +package com.ceraia.modules.arenas.managers; -import com.ceraia.arena.types.Arena; +import com.ceraia.modules.arenas.types.Arena; import org.bukkit.entity.Player; import java.util.HashMap; diff --git a/src/main/java/com/ceraia/arena/managers/PlayerManager.java b/src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java similarity index 98% rename from src/main/java/com/ceraia/arena/managers/PlayerManager.java rename to src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java index 73038ea..ac83e6a 100644 --- a/src/main/java/com/ceraia/arena/managers/PlayerManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.managers; +package com.ceraia.modules.arenas.managers; -import com.ceraia.Double; -import com.ceraia.arena.types.DoublePlayer; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.types.DoublePlayer; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/ceraia/arena/types/Arena.java b/src/main/java/com/ceraia/modules/arenas/types/Arena.java similarity index 98% rename from src/main/java/com/ceraia/arena/types/Arena.java rename to src/main/java/com/ceraia/modules/arenas/types/Arena.java index fb360da..878a8ec 100644 --- a/src/main/java/com/ceraia/arena/types/Arena.java +++ b/src/main/java/com/ceraia/modules/arenas/types/Arena.java @@ -1,8 +1,8 @@ -package com.ceraia.arena.types; +package com.ceraia.modules.arenas.types; -import com.ceraia.Double; -import com.ceraia.arena.Utils; -import com.ceraia.arena.managers.InviteManager; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.Utils; +import com.ceraia.modules.arenas.managers.InviteManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.title.Title; diff --git a/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java similarity index 98% rename from src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java rename to src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java index c2adfa0..3eaeeb3 100644 --- a/src/main/java/com/ceraia/arena/types/ArenaSelectGUI.java +++ b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.types; +package com.ceraia.modules.arenas.types; -import com.ceraia.Double; -import com.ceraia.arena.managers.InviteManager; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.managers.InviteManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; diff --git a/src/main/java/com/ceraia/arena/types/DoublePlayer.java b/src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java similarity index 97% rename from src/main/java/com/ceraia/arena/types/DoublePlayer.java rename to src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java index 593f425..7f82fb0 100644 --- a/src/main/java/com/ceraia/arena/types/DoublePlayer.java +++ b/src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java @@ -1,7 +1,7 @@ -package com.ceraia.arena.types; +package com.ceraia.modules.arenas.types; -import com.ceraia.Double; -import com.ceraia.arena.listeners.PlayerEventListener; +import com.ceraia.modules.arenas.Double; +import com.ceraia.modules.arenas.listeners.PlayerEventListener; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/com/ceraia/arena/types/Faction.java b/src/main/java/com/ceraia/modules/arenas/types/Faction.java similarity index 96% rename from src/main/java/com/ceraia/arena/types/Faction.java rename to src/main/java/com/ceraia/modules/arenas/types/Faction.java index ea18bf8..285dec4 100644 --- a/src/main/java/com/ceraia/arena/types/Faction.java +++ b/src/main/java/com/ceraia/modules/arenas/types/Faction.java @@ -1,6 +1,6 @@ -package com.ceraia.arena.types; +package com.ceraia.modules.arenas.types; -import com.ceraia.Double; +import com.ceraia.modules.arenas.Double; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; diff --git a/src/main/java/com/ceraia/modules/ceraia/CeraiaModule.kt b/src/main/java/com/ceraia/modules/ceraia/CeraiaModule.kt new file mode 100644 index 0000000..4ea682e --- /dev/null +++ b/src/main/java/com/ceraia/modules/ceraia/CeraiaModule.kt @@ -0,0 +1,18 @@ +package com.ceraia.modules.ceraia + +import com.ceraia.Ceraia +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Bukkit +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter +import org.bukkit.entity.Player +import org.bukkit.event.Listener +import org.bukkit.util.StringUtil + +class CeraiaModule(private val plugin: Ceraia) : Listener { + init { + + } +} diff --git a/src/main/java/com/ceraia/managers/PlayerManager.kt b/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt similarity index 97% rename from src/main/java/com/ceraia/managers/PlayerManager.kt rename to src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt index 2fd7ebd..cf1d3e5 100644 --- a/src/main/java/com/ceraia/managers/PlayerManager.kt +++ b/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt @@ -1,7 +1,7 @@ -package com.ceraia.managers +package com.ceraia.modules.ceraia.managers import com.ceraia.Ceraia -import com.ceraia.types.CeraiaPlayer +import com.ceraia.modules.ceraia.types.CeraiaPlayer import org.bukkit.Bukkit import org.bukkit.configuration.file.FileConfiguration import org.bukkit.configuration.file.YamlConfiguration diff --git a/src/main/java/com/ceraia/types/DoublePlayer.kt b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt similarity index 97% rename from src/main/java/com/ceraia/types/DoublePlayer.kt rename to src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt index f10a488..ca62fb0 100644 --- a/src/main/java/com/ceraia/types/DoublePlayer.kt +++ b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt @@ -1,4 +1,4 @@ -package com.ceraia.types +package com.ceraia.modules.ceraia.types import com.ceraia.Ceraia import org.bukkit.configuration.file.FileConfiguration From e02416035a5be01bb307a6647a61892e751e84e7 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:48:34 +0800 Subject: [PATCH 09/23] Rename .java to .kt --- src/main/java/com/ceraia/modules/arenas/{Utils.java => Utils.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/ceraia/modules/arenas/{Utils.java => Utils.kt} (100%) diff --git a/src/main/java/com/ceraia/modules/arenas/Utils.java b/src/main/java/com/ceraia/modules/arenas/Utils.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/Utils.java rename to src/main/java/com/ceraia/modules/arenas/Utils.kt From 2c112676b2ab83ee7322dbfe501059548fe2e01c Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sat, 28 Dec 2024 22:48:34 +0800 Subject: [PATCH 10/23] Converted utils to kotlin --- .../com/ceraia/modules/arenas/ArenaModule.kt | 4 +- .../java/com/ceraia/modules/arenas/Utils.kt | 92 ++++++++++--------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt index b76e157..eb4ea3f 100644 --- a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt +++ b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt @@ -4,8 +4,6 @@ import com.ceraia.Ceraia class ArenaModule(private val plugin: Ceraia) { init { - val arenaCommands = ArenaCommands(plugin) - plugin.getCommand("arena")?.setExecutor(arenaCommands::onCommand) - plugin.getCommand("arena")?.setTabCompleter(arenaCommands::onTabComplete) + } } \ No newline at end of file diff --git a/src/main/java/com/ceraia/modules/arenas/Utils.kt b/src/main/java/com/ceraia/modules/arenas/Utils.kt index d9f0e82..32b4662 100644 --- a/src/main/java/com/ceraia/modules/arenas/Utils.kt +++ b/src/main/java/com/ceraia/modules/arenas/Utils.kt @@ -1,63 +1,65 @@ -package com.ceraia.modules.arenas; +package com.ceraia.modules.arenas -import com.ceraia.modules.arenas.types.Arena; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; +import com.ceraia.modules.arenas.types.Arena +import org.bukkit.Bukkit +import org.bukkit.Location +import org.bukkit.configuration.file.FileConfiguration +import org.bukkit.configuration.file.YamlConfiguration +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import java.io.File +import java.util.* -import java.io.File; -import java.util.Objects; - -public class Utils { - - public static void revertInventory(Double plugin, Player pl, Arena arena) { +object Utils { + @JvmStatic + fun revertInventory(plugin: Double, pl: Player, arena: Arena) { try { - File file = new File(plugin.getDataFolder(), "data/pinventory_" + arena.getName() + "_" + pl.getName() + ".yml"); + val file = File(plugin.dataFolder, "data/pinventory_" + arena.name + "_" + pl.name + ".yml") - FileConfiguration config = YamlConfiguration.loadConfiguration(file); + val config: FileConfiguration = YamlConfiguration.loadConfiguration(file) - ItemStack[] content = new ItemStack[pl.getInventory().getContents().length]; + val content = arrayOfNulls(pl.inventory.contents.size) try { - for (String s : Objects.requireNonNull(config.getConfigurationSection("items")).getKeys(false)) { - int i = Integer.parseInt(s); - content[i] = config.getItemStack("items." + s); + for (s in Objects.requireNonNull(config.getConfigurationSection("items"))?.getKeys(false)!!) { + val i = s.toInt() + content[i] = config.getItemStack("items.$s") } - } catch (Exception e) { - System.out.println("Problem loading player inventories."); + } catch (e: Exception) { + println("Problem loading player inventories.") } - pl.getInventory().setContents(content); + pl.inventory.contents = content - file.delete(); - } catch (Exception e) { - e.printStackTrace(); - System.out.println("Problem loading player inventory"); + file.delete() + } catch (e: Exception) { + e.printStackTrace() + println("Problem loading player inventory") } } - public static void teleportPlayerToSpawn(Double plugin, Player player, Arena arena) { - String useLocation = plugin.getConfig().getString("spawn_teleport.use"); - assert useLocation != null; - if (useLocation.equalsIgnoreCase("command")) { - Bukkit.dispatchCommand( + @JvmStatic + fun teleportPlayerToSpawn(plugin: Double, player: Player, arena: Arena) { + val useLocation = checkNotNull(plugin.config.getString("spawn_teleport.use")) + if (useLocation.equals("command", ignoreCase = true)) { + Objects.requireNonNull(plugin.config.getString("spawn_teleport.command"))?.let { + Bukkit.dispatchCommand( Bukkit.getConsoleSender(), - Objects.requireNonNull(plugin.getConfig().getString("spawn_teleport.command")) - .replace("%player%", player.getName()) - ); - } else if (useLocation.equalsIgnoreCase("prior")) { - Location l = arena.getPlayerPriorLocation(player); - player.teleport(l); + it + .replace("%player%", player.name) + ) + } + } else if (useLocation.equals("prior", ignoreCase = true)) { + val l = arena.getPlayerPriorLocation(player) + player.teleport(l) } else { - Location l = new Location( - Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("spawn_teleport.location.world"))), - plugin.getConfig().getDouble("spawn_teleport.location.x"), - plugin.getConfig().getDouble("spawn_teleport.location.y"), - plugin.getConfig().getDouble("spawn_teleport.location.z") - ); - player.teleport(l); + val l = Location( + Objects.requireNonNull(plugin.config.getString("spawn_teleport.location.world")) + ?.let { Bukkit.getWorld(it) }, + plugin.config.getDouble("spawn_teleport.location.x"), + plugin.config.getDouble("spawn_teleport.location.y"), + plugin.config.getDouble("spawn_teleport.location.z") + ) + player.teleport(l) } } } From 89f674925a81f8ae5df4c7ca3b156d2ed2db1033 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 10:08:17 +0800 Subject: [PATCH 11/23] Adjusted math in marriagemodule to use kotlins built in math functions --- .../java/com/ceraia/modules/MarriageModule.kt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ceraia/modules/MarriageModule.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt index ea52202..0b5c7d2 100644 --- a/src/main/java/com/ceraia/modules/MarriageModule.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -15,6 +15,8 @@ import org.bukkit.event.Listener import org.bukkit.event.player.PlayerInteractEntityEvent import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.util.StringUtil +import kotlin.math.cos +import kotlin.math.sin class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { @@ -25,7 +27,6 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter plugin.getCommand("divorce")?.setExecutor(this) plugin.getCommand("marry")?.tabCompleter = this - Bukkit.getPluginManager().registerEvents(this, plugin) } @@ -100,7 +101,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter )) } - fun accept(target: Player, sender: Player) { + private fun accept(target: Player, sender: Player) { val senderCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(sender.uniqueId) val targetCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(target.uniqueId) @@ -148,7 +149,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter return 4 } - fun divorce(player: Player) { + private fun divorce(player: Player) { val doublePlayer = plugin.playerManager.getCeraiaPlayer(player.uniqueId) val doublePartner = plugin.playerManager.getCeraiaPlayer(doublePlayer.getPartner() ?: return) @@ -170,7 +171,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter val rightClicked = event.rightClicked as? Player ?: return if (event.player.uniqueId == rightClicked.uniqueId || !event.player.isSneaking) return - val doublePlayer = plugin.playerManager.getCeraiaPlayer(event.player.uniqueId) + val doublePlayer = plugin.playerManager.getCeraiaPlayer(event.player.uniqueId) if (doublePlayer.isMarried() && rightClicked.name == doublePlayer.getMarriedName()) { // Spawn a bunch of hearts spawnHeartsAroundPlayer(rightClicked) @@ -186,16 +187,12 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter repeat(heartsToSpawn) { val angle = Math.random() * Math.PI * 2 val radius = 0.5 - val x = playerLocation.x + Math.cos(angle) * radius + val x = playerLocation.x + cos(angle) * radius val y = playerLocation.y + (Math.random() * 0.3) + 1.5 - val z = playerLocation.z + Math.sin(angle) * radius + val z = playerLocation.z + sin(angle) * radius val particleLocation = Location(world, x, y, z) world.spawnParticle(Particle.HEART, particleLocation, 1) } } - - fun getRequests(player: Player): Collection { - return invites.filter { it.value == player }.keys.map { it.name } - } } From 24e9d86a108b134df8ebb137cf88e4df68cbc5a6 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 11:01:30 +0800 Subject: [PATCH 12/23] Refactored all arena code to be compatible with the current configuration, moved all code to arena module too. --- src/main/java/com/ceraia/Ceraia.kt | 3 +- .../java/com/ceraia/modules/SystemModule.kt | 1 + .../com/ceraia/modules/arenas/ArenaModule.kt | 81 +++++++ .../java/com/ceraia/modules/arenas/Double.kt | 88 ------- .../java/com/ceraia/modules/arenas/Utils.kt | 5 +- .../arenas/commands/arena/CommandArena.java | 38 ++- .../arenas/commands/arena/CommandGVG.java | 8 +- .../arenas/commands/arena/CommandPVP.java | 50 ++-- .../arenas/commands/arena/CommandProfile.java | 19 +- .../arenas/commands/arena/CommandTop.java | 12 +- .../commands/factions/CommandFaction.java | 98 -------- .../arenas/commands/system/CommandMod.java | 48 +--- .../commands/system/CommandVersion.java | 6 +- .../arenas/listeners/ArenaBlockListener.java | 10 +- .../listeners/ArenaExplodeListener.java | 8 +- .../arenas/listeners/ArenaFightListener.java | 29 +-- .../listeners/PlayerEloChangeListener.java | 6 +- .../arenas/listeners/PlayerEventListener.java | 12 +- .../listeners/PlayerInventoryListener.java | 8 +- .../arenas/listeners/SpellsListener.java | 216 ------------------ .../modules/arenas/managers/ArenaManager.java | 6 +- .../arenas/managers/EloScoreboardManager.java | 10 +- .../arenas/managers/FactionManager.java | 81 ------- .../arenas/managers/PlayerManager.java | 196 ---------------- .../ceraia/modules/arenas/types/Arena.java | 21 +- .../modules/arenas/types/ArenaSelectGUI.java | 20 +- .../modules/arenas/types/DoublePlayer.java | 215 ----------------- .../ceraia/modules/arenas/types/Faction.java | 89 -------- .../modules/ceraia/types/DoublePlayer.kt | 11 +- 29 files changed, 219 insertions(+), 1176 deletions(-) delete mode 100644 src/main/java/com/ceraia/modules/arenas/Double.kt delete mode 100644 src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java delete mode 100644 src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java delete mode 100644 src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java delete mode 100644 src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java delete mode 100644 src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java delete mode 100644 src/main/java/com/ceraia/modules/arenas/types/Faction.java diff --git a/src/main/java/com/ceraia/Ceraia.kt b/src/main/java/com/ceraia/Ceraia.kt index 8f1432e..afe1c8d 100644 --- a/src/main/java/com/ceraia/Ceraia.kt +++ b/src/main/java/com/ceraia/Ceraia.kt @@ -11,6 +11,7 @@ import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin import java.io.File +import java.util.UUID class Ceraia : JavaPlugin() { private val plugin: Ceraia = this @@ -38,8 +39,6 @@ class Ceraia : JavaPlugin() { saveDefaultConfig() File(dataFolder, "data").mkdirs() - File(dataFolder, "data/arenas").mkdirs() - File(dataFolder, "data/items").mkdirs() File(dataFolder, "data/users").mkdirs() /*---------------------------------*/ diff --git a/src/main/java/com/ceraia/modules/SystemModule.kt b/src/main/java/com/ceraia/modules/SystemModule.kt index 1f0807e..92674ec 100644 --- a/src/main/java/com/ceraia/modules/SystemModule.kt +++ b/src/main/java/com/ceraia/modules/SystemModule.kt @@ -10,6 +10,7 @@ import org.bukkit.command.TabCompleter import org.bukkit.entity.Player import org.bukkit.event.Listener import org.bukkit.util.StringUtil +import java.io.File class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { diff --git a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt index eb4ea3f..3eb1323 100644 --- a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt +++ b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt @@ -1,9 +1,90 @@ package com.ceraia.modules.arenas import com.ceraia.Ceraia +import com.ceraia.metrics.Metrics +import com.ceraia.modules.arenas.commands.arena.* +import com.ceraia.modules.arenas.commands.factions.CommandFaction +import com.ceraia.modules.arenas.commands.system.CommandMod +import com.ceraia.modules.arenas.commands.system.CommandVersion +import com.ceraia.modules.arenas.listeners.* +import com.ceraia.modules.arenas.managers.ArenaManager +import com.ceraia.modules.arenas.managers.EloScoreboardManager +import com.ceraia.modules.arenas.managers.InviteManager +import com.ceraia.modules.arenas.types.ArenaSelectGUI +import com.ceraia.modules.ceraia.managers.PlayerManager +import java.io.File +import java.util.* class ArenaModule(private val plugin: Ceraia) { + var arenaManager: ArenaManager? = null + private set + var inviteManager: InviteManager? = null + private set + var arenaSelectGUI: ArenaSelectGUI? = null + private set + var groupManager: CommandGVG? = null + private set + var playerManager: PlayerManager? = null + private set + var metrics: Metrics? = null + private var eloScoreBoardManager: EloScoreboardManager? = null init { + File(plugin.dataFolder, "data/arena").mkdirs() + File(plugin.dataFolder, "data/arena/arenas").mkdirs() + File(plugin.dataFolder, "data/arena/items").mkdirs() + // Managers + this.arenaManager = ArenaManager(plugin) + this.playerManager = PlayerManager(plugin) + this.eloScoreBoardManager = EloScoreboardManager(plugin) + this.inviteManager = InviteManager() + + this.arenaSelectGUI = ArenaSelectGUI(plugin) + this.groupManager = CommandGVG(plugin) + + // Command + val commandPVP = CommandPVP(plugin) + val commandArena = CommandArena(plugin) + val commandMod = CommandMod(plugin) + val commandTop = CommandTop(plugin) + val commandProfile = CommandProfile(plugin) + val commandVersion = CommandVersion(plugin) + val commandFaction = CommandFaction(plugin) + + // Listeners + PlayerEloChangeListener(plugin) + ArenaFightListener(plugin) + PlayerInventoryListener(plugin) + ArenaBlockListener(plugin) + ArenaExplodeListener(plugin) + + // PvP Commands + Objects.requireNonNull(plugin.getCommand("pvp"))?.setExecutor(commandPVP) + Objects.requireNonNull(plugin.getCommand("arena"))?.setExecutor(commandArena) + Objects.requireNonNull(plugin.getCommand("gvg"))?.setExecutor(groupManager) + Objects.requireNonNull(plugin.getCommand("top"))?.setExecutor(commandTop) + Objects.requireNonNull(plugin.getCommand("leaderboard"))?.setExecutor(commandTop) + Objects.requireNonNull(plugin.getCommand("profile"))?.setExecutor(commandProfile) + Objects.requireNonNull(plugin.getCommand("stats"))?.setExecutor(commandProfile) + + // System Misc + Objects.requireNonNull(plugin.getCommand("mod"))?.setExecutor(commandMod) + Objects.requireNonNull(plugin.getCommand("version"))?.setExecutor(commandVersion) + + // Faction Commands + Objects.requireNonNull(plugin.getCommand("faction"))?.setExecutor(commandFaction) + + + } + + fun calculateWinChance(player1: UUID, player2: UUID): Double { + val elo1 = playerManager.getPlayer(player1)?.elo + val elo2 = playerManager.getPlayer(player2)?.elo + + if ((elo1 == 0 || elo1 == null) || (elo2 == 0 || elo2 == null)) { + return 0.5 + } + + return 1 / (1 + Math.pow(10.0, (elo2 - elo1) / 400.0)) } } \ No newline at end of file diff --git a/src/main/java/com/ceraia/modules/arenas/Double.kt b/src/main/java/com/ceraia/modules/arenas/Double.kt deleted file mode 100644 index ae8fd7e..0000000 --- a/src/main/java/com/ceraia/modules/arenas/Double.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.ceraia.modules.arenas - -import com.ceraia.modules.arenas.commands.arena.* -import com.ceraia.modules.arenas.commands.factions.CommandFaction -import com.ceraia.modules.arenas.commands.system.CommandMod -import com.ceraia.modules.arenas.commands.system.CommandVersion -import com.ceraia.modules.arenas.listeners.* -import com.ceraia.modules.arenas.managers.* -import com.ceraia.metrics.Metrics -import com.ceraia.modules.arenas.types.ArenaSelectGUI -import org.bukkit.plugin.java.JavaPlugin -import java.io.File -import java.util.* - -class Double : JavaPlugin() { - var arenaManager: ArenaManager? = null - private set - var inviteManager: InviteManager? = null - private set - var arenaSelectGUI: ArenaSelectGUI? = null - private set - var groupManager: CommandGVG? = null - private set - var playerManager: PlayerManager? = null - private set - var metrics: Metrics? = null - private var eloScoreBoardManager: EloScoreboardManager? = null - var factionManager: FactionManager? = null - private set - - override fun onEnable() { - metrics = Metrics(this, 20303) - - saveDefaultConfig() - File(dataFolder, "data/arenas").mkdirs() - File(dataFolder, "data/items").mkdirs() - File(dataFolder, "data/users").mkdirs() - File(dataFolder, "data/factions").mkdirs() - - // Managers - this.factionManager = FactionManager(this) - this.arenaManager = ArenaManager(this) - this.playerManager = PlayerManager(this) - this.eloScoreBoardManager = EloScoreboardManager(this) - this.inviteManager = InviteManager() - - this.arenaSelectGUI = ArenaSelectGUI(this) - this.groupManager = CommandGVG(this) - - // Command - val commandPVP = CommandPVP(this) - val commandArena = CommandArena(this) - val commandMod = CommandMod(this) - val commandTop = CommandTop(this) - val commandProfile = CommandProfile(this) - val commandVersion = CommandVersion(this) - val commandFaction = CommandFaction(this) - - // Listeners - PlayerEloChangeListener(this) - ArenaFightListener(this) - PlayerInventoryListener(this) - ArenaBlockListener(this) - ArenaExplodeListener(this) - SpellsListener(this) - - // PvP Commands - Objects.requireNonNull(getCommand("pvp"))?.setExecutor(commandPVP) - Objects.requireNonNull(getCommand("arena"))?.setExecutor(commandArena) - Objects.requireNonNull(getCommand("gvg"))?.setExecutor(groupManager) - Objects.requireNonNull(getCommand("top"))?.setExecutor(commandTop) - Objects.requireNonNull(getCommand("leaderboard"))?.setExecutor(commandTop) - Objects.requireNonNull(getCommand("profile"))?.setExecutor(commandProfile) - Objects.requireNonNull(getCommand("stats"))?.setExecutor(commandProfile) - - // System Misc - Objects.requireNonNull(getCommand("mod"))?.setExecutor(commandMod) - Objects.requireNonNull(getCommand("version"))?.setExecutor(commandVersion) - - // Faction Commands - Objects.requireNonNull(getCommand("faction"))?.setExecutor(commandFaction) - } - - override fun onDisable() { - metrics!!.shutdown() - playerManager!!.savePlayers() - } -} diff --git a/src/main/java/com/ceraia/modules/arenas/Utils.kt b/src/main/java/com/ceraia/modules/arenas/Utils.kt index 32b4662..0a254ce 100644 --- a/src/main/java/com/ceraia/modules/arenas/Utils.kt +++ b/src/main/java/com/ceraia/modules/arenas/Utils.kt @@ -1,5 +1,6 @@ package com.ceraia.modules.arenas +import com.ceraia.Ceraia import com.ceraia.modules.arenas.types.Arena import org.bukkit.Bukkit import org.bukkit.Location @@ -12,7 +13,7 @@ import java.util.* object Utils { @JvmStatic - fun revertInventory(plugin: Double, pl: Player, arena: Arena) { + fun revertInventory(plugin: Ceraia, pl: Player, arena: Arena) { try { val file = File(plugin.dataFolder, "data/pinventory_" + arena.name + "_" + pl.name + ".yml") @@ -38,7 +39,7 @@ object Utils { } @JvmStatic - fun teleportPlayerToSpawn(plugin: Double, player: Player, arena: Arena) { + fun teleportPlayerToSpawn(plugin: Ceraia, player: Player, arena: Arena) { val useLocation = checkNotNull(plugin.config.getString("spawn_teleport.use")) if (useLocation.equals("command", ignoreCase = true)) { Objects.requireNonNull(plugin.config.getString("spawn_teleport.command"))?.let { diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java index 113b8b6..3678cf3 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java @@ -1,8 +1,8 @@ package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.types.Arena; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; @@ -20,9 +20,9 @@ public class CommandArena implements CommandExecutor, TabCompleter { - private final Double plugin; + private final Ceraia plugin; - public CommandArena(Double plugin) { + public CommandArena(Ceraia plugin) { this.plugin = plugin; } @@ -53,7 +53,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St top.add(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.scoreboard.top"))); - plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(DoublePlayer::getElo).reversed()).limit(10).forEach(ap -> { + plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(CeraiaPlayer::getElo).reversed()).limit(10).forEach(ap -> { String playerName = Bukkit.getOfflinePlayer(ap.getUUID()).getName(); int elo = ap.getElo(); @@ -70,7 +70,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St medal = ""; // Default medal color for players outside the top 3 } - top.add(MiniMessage.miniMessage().deserialize(medal + i + " " + playerName + " - " + elo + " ELO (" + (ap.wins() + ap.losses()) + " games)")); + top.add(MiniMessage.miniMessage().deserialize(medal + i + " " + playerName + " - " + elo + " ELO (" + (ap.getWins() + ap.getLosses()) + " games)")); i.getAndIncrement(); }); @@ -118,7 +118,7 @@ public List onTabComplete(CommandSender sender, Command cmd, String labe args[0].equalsIgnoreCase("public") || args[0].equalsIgnoreCase("sp1") || args[0].equalsIgnoreCase("sp2"))) { - plugin.getArenaManager().getArenas().forEach(a ->{ + plugin.getArenaModule().getArenaManager().getArenas().forEach(a ->{ if (a.getOwner().equals(sender.getName())) { arenas.add(a.getName()); } @@ -140,7 +140,7 @@ private void arenaSP1(CommandSender sender, String[] args) { String name = args[1]; - Arena arena = plugin.getArenaManager().getArena(name); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(name); if (arena == null) { sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) @@ -167,7 +167,7 @@ private void arenaSP2(CommandSender sender, String[] args) { String name = args[1]; - Arena arena = plugin.getArenaManager().getArena(name); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(name); if (arena == null) { sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) @@ -195,14 +195,6 @@ private void arenaCreate(CommandSender sender, String[] args) { String name = args[1]; - // Check if the user is banned from creating arenas - if (plugin.getPlayerManager().getDoublePlayer(((Player) sender).getUniqueId()).arenaBanned()){ - sender.sendMessage( - MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.banned")) - ); - return; - } - // Check if the string is the same as , if so state the user should put a name if (name.equalsIgnoreCase("")) { sender.sendMessage( @@ -219,7 +211,7 @@ private void arenaCreate(CommandSender sender, String[] args) { } // Check if the arena already exists - if (plugin.getArenaManager().getArenas().stream().filter(a -> a.getName().equalsIgnoreCase(name)).count() > 0) { + if (plugin.getArenaModule().getArenaManager().getArenas().stream().filter(a -> a.getName().equalsIgnoreCase(name)).count() > 0) { sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.exists")) ); @@ -233,7 +225,7 @@ private void arenaCreate(CommandSender sender, String[] args) { arena.setSpawnPoint1(((Player) sender).getLocation()); arena.setSpawnPoint2(((Player) sender).getLocation()); - plugin.getArenaManager().addArena(arena); + plugin.getArenaModule().getArenaManager().addArena(arena); sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.create.success")) @@ -247,7 +239,7 @@ private void arenaDelete(CommandSender sender, String[] args) { } String name = args[1]; - Arena arena = plugin.getArenaManager().getArena(name); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(name); if (arena == null) { sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) @@ -268,7 +260,7 @@ private void arenaDelete(CommandSender sender, String[] args) { } arena.delete(); - plugin.getArenaManager().removeArena(arena); + plugin.getArenaModule().getArenaManager().removeArena(arena); sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.delete.delete")) @@ -282,7 +274,7 @@ private void arenaPublic(CommandSender sender, String[] args) { } String name = args[1]; - Arena arena = plugin.getArenaManager().getArena(name); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(name); if (arena == null) { sender.sendMessage( MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.arena.not_found")) @@ -316,7 +308,7 @@ private void badUsage(CommandSender sender) { } private void arenaList(CommandSender sender) { - List arenas = plugin.getArenaManager().getArenas().stream().filter(arena -> arena.getOwner().equals(sender.getName())).collect(Collectors.toList()); + List arenas = plugin.getArenaModule().getArenaManager().getArenas().stream().filter(arena -> arena.getOwner().equals(sender.getName())).collect(Collectors.toList()); plugin.getConfig().getStringList("messages.arena.list").forEach(s -> { if (s.contains("%arenas%")) { arenas.forEach(a -> { diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java index a791f93..736d929 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandGVG.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; @@ -19,13 +19,13 @@ public class CommandGVG implements CommandExecutor, TabCompleter, Listener { - private final Double plugin; + private final Ceraia plugin; private final Map> groups = new HashMap<>(); private final Map playersByGroup = new HashMap<>(); private final Map invites = new HashMap<>(); - public CommandGVG(Double plugin) { + public CommandGVG(Ceraia plugin) { this.plugin = plugin; } @@ -212,7 +212,7 @@ else if (args[0].equalsIgnoreCase("fight")) { return true; } - plugin.getArenaSelectGUI().openArenaList(player, invited); + plugin.getArenaModule().getArenaSelectGUI().openArenaList(player, invited); } return true; diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java index 067061e..9a46225 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java @@ -1,9 +1,9 @@ package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.managers.InviteManager; import com.ceraia.modules.arenas.types.Arena; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -20,9 +20,9 @@ public class CommandPVP implements CommandExecutor, TabCompleter { - private final Double plugin; + private final Ceraia plugin; - public CommandPVP(Double plugin) { + public CommandPVP(Ceraia plugin) { this.plugin = plugin; } @@ -39,32 +39,18 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St } // Check if the sender is pvpbanned - DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(((Player) sender).getUniqueId()); - if (doublePlayer.pvpBanned()) { - sender.sendMessage( - MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.banned.cant_invite"))) - ); - return true; - } + CeraiaPlayer doublePlayer = plugin.getPlayerManager().getCeraiaPlayer(((Player) sender).getUniqueId()); if (args[0].equalsIgnoreCase("accept")) { Player p = (Player) sender; - // Check if the player is banned - if (plugin.getPlayerManager().getDoublePlayer(p.getUniqueId()).pvpBanned()) { - sender.sendMessage( - MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.pvp.banned.cant_accept"))) - ); - return true; - } - - InviteManager.Invite invite = plugin.getInviteManager().invites.get(p); + InviteManager.Invite invite = Objects.requireNonNull(plugin.getArenaModule().getInviteManager()).invites.get(p); if (invite == null) { sender.sendMessage( MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.invite_not_found"))) ); - plugin.getInviteManager().invites.remove(p); + plugin.getArenaModule().getInviteManager().invites.remove(p); return true; } @@ -82,7 +68,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St return true; } - if (invite.arena.getState() != Arena.ArenaState.WAITING || plugin.getArenaManager().getArenas().stream().noneMatch( + if (invite.arena.getState() != Arena.ArenaState.WAITING || plugin.getArenaModule().getArenaManager().getArenas().stream().noneMatch( a -> a.getName().equalsIgnoreCase(invite.arena.getName()) )) { for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { @@ -90,15 +76,15 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.arena_not_ready"))) ); } - plugin.getInviteManager().invites.remove(p); + plugin.getArenaModule().getInviteManager().invites.remove(p); return true; } List playersToFight = new ArrayList<>(); if (invite.group) { - List group1 = plugin.getGroupManager().getPlayersByGroup(invite.inviter); - List group2 = plugin.getGroupManager().getPlayersByGroup(invite.invited); + List group1 = plugin.getArenaModule().getGroupManager().getPlayersByGroup(invite.inviter); + List group2 = plugin.getArenaModule().getGroupManager().getPlayersByGroup(invite.invited); if (group1 == null || group2 == null) { for (Player pl : Arrays.asList(invite.invited, invite.inviter)) { @@ -106,7 +92,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.group.group_not_found"))) ); } - plugin.getInviteManager().invites.remove(p); + plugin.getArenaModule().getInviteManager().invites.remove(p); return true; } @@ -116,20 +102,20 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.invite_accept.group.group_too_small"))) ); } - plugin.getInviteManager().invites.remove(p); + plugin.getArenaModule().getInviteManager().invites.remove(p); return true; } boolean allPlayersAreReady = true; for (Player pl : group1) { - if (plugin.getArenaManager().getArena(pl) != null) { + if (plugin.getArenaModule().getArenaManager().getArena(pl) != null) { return true; } } for (Player pl : group2) { - if (plugin.getArenaManager().getArena(pl) != null) { + if (plugin.getArenaModule().getArenaManager().getArena(pl) != null) { return true; } } @@ -140,7 +126,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.invite_accept.group.someone_already_in_fight")) ); } - plugin.getInviteManager().invites.remove(p); + plugin.getArenaModule().getInviteManager().invites.remove(p); return true; } @@ -170,7 +156,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St // reload for op if (playerName.equalsIgnoreCase("reload") && sender.isOp()) { plugin.reloadConfig(); - plugin.getArenaSelectGUI().reloadConfig(); + plugin.getArenaModule().getArenaSelectGUI().reloadConfig(); sender.sendMessage(MiniMessage.miniMessage().deserialize( "Reloaded!") ); @@ -195,7 +181,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St return true; } // If the inviter is the same as the invited, return - plugin.getArenaSelectGUI().openArenaList(inviter, invited); + plugin.getArenaModule().getArenaSelectGUI().openArenaList(inviter, invited); return true; } diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java index 65e6ff0..3f22bdd 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java @@ -1,7 +1,7 @@ package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.Ceraia; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -17,9 +17,9 @@ public class CommandProfile implements CommandExecutor, TabCompleter { - private final Double plugin; + private final Ceraia plugin; - public CommandProfile(Double plugin) { + public CommandProfile(Ceraia plugin) { this.plugin = plugin; } @@ -42,16 +42,13 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St } // Return the player's profile - DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(player.getUniqueId()); + CeraiaPlayer doublePlayer = plugin.getPlayerManager().getCeraiaPlayer(player.getUniqueId()); plugin.getConfig().getStringList("messages.profile").forEach(s -> sender.sendMessage(MiniMessage.miniMessage().deserialize(s .replace("%player%", player.getName()) .replace("%elo%", String.valueOf(doublePlayer.getElo())) - .replace("%wins%", String.valueOf(doublePlayer.wins())) - .replace("%losses%", String.valueOf(doublePlayer.losses())) - .replace("%draws%", String.valueOf(doublePlayer.draws())) - .replace("%games%", String.valueOf(doublePlayer.wins() + doublePlayer.losses())) - .replace("%pvpbanned%", doublePlayer.pvpBanned() ? "Yes" : "No") - .replace("%arenabanned%", doublePlayer.arenaBanned() ? "Yes" : "No")))); + .replace("%wins%", String.valueOf(doublePlayer.getWins())) + .replace("%losses%", String.valueOf(doublePlayer.getLosses())) + .replace("%games%", String.valueOf(doublePlayer.getWins() + doublePlayer.getLosses()))))); diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java index 88e74d3..899cdc0 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java @@ -1,7 +1,7 @@ package com.ceraia.modules.arenas.commands.arena; -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.Ceraia; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; @@ -20,9 +20,9 @@ public class CommandTop implements CommandExecutor, TabCompleter { - private final Double plugin; + private final Ceraia plugin; - public CommandTop(Double plugin) { + public CommandTop(Ceraia plugin) { this.plugin = plugin; } @@ -42,7 +42,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St top.add(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.scoreboard.top")))); - plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(DoublePlayer::getElo).reversed()).limit(10).forEach(ap -> { + plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(CeraiaPlayer::getElo).reversed()).limit(10).forEach(ap -> { String playerName = Bukkit.getOfflinePlayer(ap.getUUID()).getName(); int elo = ap.getElo(); @@ -59,7 +59,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St medal = ""; // Default medal color for players outside the top 3 } - top.add(MiniMessage.miniMessage().deserialize(medal + i + " " + playerName + " - " + elo + " ELO (" + (ap.wins() + ap.losses()) + " games)")); + top.add(MiniMessage.miniMessage().deserialize(medal + i + " " + playerName + " - " + elo + " ELO (" + (ap.getWins() + ap.getLosses()) + " games)")); i.getAndIncrement(); }); diff --git a/src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java b/src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java deleted file mode 100644 index 5ec18ed..0000000 --- a/src/main/java/com/ceraia/modules/arenas/commands/factions/CommandFaction.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.ceraia.modules.arenas.commands.factions; - -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.Faction; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class CommandFaction implements CommandExecutor, TabCompleter { - - private final Double plugin; - - public CommandFaction(Double plugin) { - this.plugin = plugin; - } - - @Override - public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { - if (!(sender instanceof Player player)) { - sender.sendMessage("Only players can use this command"); - return true; - } - - switch (args[0]){ - case "add" -> { - switch (args[1]){ - case "faction" -> { - plugin.getLogger().info("faction addition called"); - Faction faction = plugin.getFactionManager().newFaction(args[2]); - faction.addMember(player.getName()); - faction.saveFaction(); - } - case "member" -> { - plugin.getLogger().info("member addition called"); - } - } - } - case "remove" -> { - switch (args[1]){ - case "faction" -> { - plugin.getLogger().info("faction removal not supported"); - } - case "member" -> { - plugin.getLogger().info("member removal not supported"); - } - } - } - } - - - return true; - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { - if (args.length == 1) { - List tabOptions = new ArrayList<>(); - - tabOptions.add("add"); - tabOptions.add("remove"); - - return tabOptions; - } - if (args.length == 2) { - List tabOptions = new ArrayList<>(); - - tabOptions.add("member"); - tabOptions.add("faction"); - - return tabOptions; - } - if (args.length == 3) { - List tabOptions = new ArrayList<>(); - - if(Objects.equals(args[2], "member")) - for (Player player : Bukkit.getOnlinePlayers()) { - tabOptions.add(player.getName()); - } - - if(Objects.equals(args[2], "faction")) - for (Faction faction : plugin.getFactionManager().getFactions()) { - tabOptions.add(faction.getName()); - } - - return tabOptions; - } - // If there is more than one argument, return an empty list - return new ArrayList<>(); - } -} diff --git a/src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java index 96b179a..a0adb32 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandMod.java @@ -1,7 +1,7 @@ package com.ceraia.modules.arenas.commands.system; -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.Ceraia; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -17,9 +17,9 @@ public class CommandMod implements CommandExecutor, TabCompleter { - private final Double plugin; + private final Ceraia plugin; - public CommandMod(Double plugin) { + public CommandMod(Ceraia plugin) { this.plugin = plugin; } @@ -54,44 +54,6 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St } } } - - if (args.length == 3) { - if (args[0].equalsIgnoreCase("ban")) { - Player target = Bukkit.getPlayer(args[2]); - - if (args[1].equalsIgnoreCase("arena")) { - if (target == null) { - sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.player_not_found")))); - return true; - } - DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(target.getUniqueId()); - boolean arenabanned = doublePlayer.arenaBan(); - if (arenabanned) { - doublePlayer.addLog("Banned from creation of arenas by " + sender.getName()); - sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.arena.banned")).replace("%player%", target.getName()))); - } else { - doublePlayer.addLog("Unbanned from creation of arenas by " + sender.getName()); - sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.arena.unbanned")).replace("%player%", target.getName()))); - } - } - if (args[1].equalsIgnoreCase("pvp")) { - if (target == null) { - sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.player_not_found")))); - return true; - } - DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(target.getUniqueId()); - boolean pvpbanned = doublePlayer.pvpBan(); - if (pvpbanned) { - doublePlayer.addLog("Banned from PVPing by " + sender.getName()); - sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.pvp.banned")).replace("%player%", target.getName()))); - } else { - doublePlayer.addLog("Unbanned from PVPing by " + sender.getName()); - sender.sendMessage(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.mod.ban.pvp.unbanned")).replace("%player%", target.getName()))); - } - } - } - } - return true; } @@ -121,7 +83,7 @@ public List onTabComplete(@NotNull CommandSender sender, @NotNull Comman if (args[2].equalsIgnoreCase("arena")) { List tabOptions = new ArrayList<>(); // If there is an argument, suggest all arena names - plugin.getArenaManager().getArenas().forEach(arena -> tabOptions.add(arena.getName())); + Objects.requireNonNull(plugin.getArenaModule().getArenaManager()).getArenas().forEach(arena -> tabOptions.add(arena.getName())); return tabOptions; } } diff --git a/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java index 8fd116f..bfa112a 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.commands.system; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -13,9 +13,9 @@ public class CommandVersion implements CommandExecutor, TabCompleter { - private final Double plugin; + private final Ceraia plugin; - public CommandVersion(Double plugin) { + public CommandVersion(Ceraia plugin) { this.plugin = plugin; } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java index e55e1f4..6e8bc1a 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.listeners; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.types.Arena; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; @@ -10,16 +10,16 @@ public class ArenaBlockListener implements Listener { - private final Double plugin; + private final Ceraia plugin; - public ArenaBlockListener(Double plugin) { + public ArenaBlockListener(Ceraia plugin) { this.plugin = plugin; Bukkit.getPluginManager().registerEvents(this, plugin); } @EventHandler public void onBlockPlace(BlockPlaceEvent e) { - Arena arena = plugin.getArenaManager().getArena(e.getPlayer()); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getPlayer()); if (arena == null) { return; } @@ -29,7 +29,7 @@ public void onBlockPlace(BlockPlaceEvent e) { @EventHandler public void onBlockBreak(BlockBreakEvent e) { - Arena arena = plugin.getArenaManager().getArena(e.getPlayer()); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getPlayer()); if (arena == null) { return; } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java index a4bf7ba..44b93ed 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.listeners; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; @@ -14,15 +14,15 @@ public class ArenaExplodeListener implements Listener { - private final Double plugin; + private final Ceraia plugin; - public ArenaExplodeListener(Double plugin) { + public ArenaExplodeListener(Ceraia plugin) { this.plugin = plugin; Bukkit.getPluginManager().registerEvents(this, plugin); } private boolean isInArena(Player player) { - return plugin.getArenaManager().getArena(player) != null; + return plugin.getArenaModule().getArenaManager().getArena(player) != null; } // TNT diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java index 39e2ff8..c1dd48b 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.listeners; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.managers.InviteManager; import com.ceraia.modules.arenas.types.Arena; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -21,15 +21,15 @@ public class ArenaFightListener implements Listener { - private final Double plugin; + private final Ceraia plugin; - public ArenaFightListener(Double plugin) { + public ArenaFightListener(Ceraia plugin) { this.plugin = plugin; Bukkit.getPluginManager().registerEvents(this, plugin); } private boolean isInArena(Player player) { - return plugin.getArenaManager().getArena(player) != null; + return plugin.getArenaModule().getArenaManager().getArena(player) != null; } @EventHandler @@ -46,12 +46,12 @@ public void onHit(EntityDamageByEntityEvent e) { return; } - if (((isInArena(damager) && !isInArena(player)) || (!isInArena(damager) && isInArena(player))) || !Objects.equals(plugin.getArenaManager().getArena(damager).getName(), plugin.getArenaManager().getArena(player).getName())) { + if (((isInArena(damager) && !isInArena(player)) || (!isInArena(damager) && isInArena(player))) || !Objects.equals(plugin.getArenaModule().getArenaManager().getArena(damager).getName(), plugin.getArenaModule().getArenaManager().getArena(player).getName())) { e.setCancelled(true); return; } - Arena arena = plugin.getArenaManager().getArena(damager); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(damager); if (arena == null) { return; @@ -107,16 +107,16 @@ else if (event.getDamager().getType() == org.bukkit.entity.EntityType.TNT) { } } - Arena arena = plugin.getArenaManager().getArena(player); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(player); double healthAfter = player.getHealth() - e.getFinalDamage(); if (healthAfter <= 0) { // Check if during the fight totems are allowed - InviteManager.Invite invite = plugin.getInviteManager().invites.get(player); + InviteManager.Invite invite = plugin.getArenaModule().getInviteManager().invites.get(player); - if (invite == null) invite = plugin.getInviteManager().selectingInvites.get(killer); + if (invite == null) invite = plugin.getArenaModule().getInviteManager().selectingInvites.get(killer); if (invite != null) { if (arena.totems) { @@ -139,7 +139,7 @@ public void onDeath(PlayerDeathEvent e) { if (!isInArena(e.getEntity())) { return; } - Arena arena = plugin.getArenaManager().getArena(e.getEntity()); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getEntity()); Location loc = e.getEntity().getLocation(); @@ -170,7 +170,7 @@ public void onQuit(PlayerQuitEvent e) { return; } - Arena arena = plugin.getArenaManager().getArena(e.getPlayer()); + Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getPlayer()); // Check in which team the player is if (arena.getTeam1().contains(e.getPlayer())) { @@ -187,14 +187,15 @@ private void matchEnd(Player loser, Player winner) { UUID loserUUID = loser.getUniqueId(); // Get the win chance - int winChance = plugin.getPlayerManager().CalculateWinChance(winnerUUID, loserUUID); + int winChance = (int) plugin.getArenaModule().calculateWinChance(winnerUUID, loserUUID); // Announce the winner and the win chance in chat - Bukkit.broadcast(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.fight.end_global").replace("%winner%", winner.getName()).replace("%loser%", loser.getName()).replace("%elo%", String.valueOf(plugin.getPlayerManager().getDoublePlayer(loserUUID).getElo())).replace("%winchance%", String.valueOf(winChance)).replace("%arena%", plugin.getArenaManager().getArena(loser).getName())) + Bukkit.broadcast(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.fight.end_global").replace("%winner%", winner.getName()).replace("%loser%", loser.getName()).replace("%elo%", String.valueOf(plugin.getPlayerManager().getCeraiaPlayer(loserUUID).getElo())).replace("%winchance%", String.valueOf(winChance)).replace("%arena%", plugin.getArenaModule().getArenaManager().getArena(loser).getName())) ); // Handle ELO calculations - plugin.getPlayerManager().PlayerKill(winnerUUID, loserUUID); + // #TODO: Re-implement ELO calculations + //plugin.getPlayerManager().PlayerKill(winnerUUID, loserUUID); } } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java index d625954..2322c7f 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.listeners; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.managers.EloScoreboardManager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -8,9 +8,9 @@ public class PlayerEloChangeListener implements Listener { - private final Double plugin; + private final Ceraia plugin; - public PlayerEloChangeListener(Double plugin) { + public PlayerEloChangeListener(Ceraia plugin) { this.plugin = plugin; plugin.getServer().getPluginManager().registerEvents(this, plugin); } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java index 75afb72..76520ac 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.listeners; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -10,19 +10,19 @@ public class PlayerEventListener extends Event { private static final HandlerList handlers = new HandlerList(); private final Player player; - private final DoublePlayer doublePlayer; + private final CeraiaPlayer ceraiaPlayer; - public PlayerEventListener(Player player, DoublePlayer doublePlayer) { + public PlayerEventListener(Player player, CeraiaPlayer ceraiaPlayer) { this.player = player; - this.doublePlayer = doublePlayer; + this.ceraiaPlayer = ceraiaPlayer; } public Player getPlayer() { return player; } - public DoublePlayer getArenaPlayer() { - return doublePlayer; + public CeraiaPlayer getArenaPlayer() { + return ceraiaPlayer; } @Override diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java index fc5a8f6..9a19187 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.listeners; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -11,15 +11,15 @@ public class PlayerInventoryListener implements Listener { - private final Double plugin; + private final Ceraia plugin; - public PlayerInventoryListener(Double plugin) { + public PlayerInventoryListener(Ceraia plugin) { this.plugin = plugin; Bukkit.getPluginManager().registerEvents(this, plugin); } private boolean isInArena(Player player) { - return plugin.getArenaManager().getArena(player) != null; + return plugin.getArenaModule().getArenaManager().getArena(player) != null; } @EventHandler diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java deleted file mode 100644 index 631d321..0000000 --- a/src/main/java/com/ceraia/modules/arenas/listeners/SpellsListener.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.ceraia.modules.arenas.listeners; - -import com.ceraia.modules.arenas.Double; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.Objects; - -public class SpellsListener implements Listener { - - private final Double plugin; - - public SpellsListener(Double plugin) { - this.plugin = plugin; - Bukkit.getPluginManager().registerEvents(this, plugin); - } - - // Check if the player is casting a spell by right clicking with a book - @EventHandler - public void onPlayerRightClick(PlayerInteractEvent event) { - if (event.getItem() == null) return; - if (event.getItem().getType() == Material.BOOK) { - Player p = event.getPlayer(); - if (p.getInventory().getItemInMainHand().getType() == Material.BOOK) { - String name = Objects.requireNonNull(p.getInventory().getItemInMainHand().getItemMeta()).getDisplayName(); - switch (name) { - case "Fireflies" -> { - // Launch snowballs that light the person it hits on fire - event.setCancelled(true); - p.sendMessage("You casted Fireflies!"); - p.launchProjectile(SmallFireball.class); - } - case "Getauttahere" -> { - event.setCancelled(true); - Trident trident = p.launchProjectile(Trident.class); - trident.setPickupStatus(Trident.PickupStatus.DISALLOWED); // Prevents Trident from being picked up - trident.addScoreboardTag("getauttahere"); // Add a tag to the Trident to identify it later - trident.addPassenger(p); - p.sendMessage("You casted Getauttahere!"); - } - case "Bidenblast" -> { - event.setCancelled(true); - for (int i = 0; i < 1; i++) { - Arrow arrow = p.launchProjectile(Arrow.class); - arrow.setVelocity(p.getLocation().getDirection().multiply(10)); - arrow.addScoreboardTag("explosive"); - } - } - case "Kamikazesheep" -> { - event.setCancelled(true); - p.launchProjectile(Snowball.class).addScoreboardTag("kamikazesheep"); - p.sendMessage("You casted Kamikazesheep!"); - } - case "ThermonuclearDetonation" -> { - event.setCancelled(true); - p.launchProjectile(Snowball.class).addScoreboardTag("earfquake"); - } - } - } - } - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event){ - // Log the UUID in the console - System.out.println(event.getPlayer().getUniqueId()); - } - - @EventHandler - public void onEntityHit(ProjectileHitEvent event) { - if (event.getEntity() instanceof Arrow arrow) { - if (arrow.getScoreboardTags().contains("explosive")) { - arrow.getWorld().createExplosion(arrow.getLocation(), 100, true, true); - arrow.remove(); - } - } else if (event.getEntity() instanceof Trident trident) { - if (trident.getScoreboardTags().contains("getauttahere")) { - trident.remove(); - } - } else if (event.getEntity() instanceof Snowball snowball) { - if (snowball.getScoreboardTags().contains("kamikazesheep")) { - // Get the closest player to the snowball - Player p = null; - double distance = 100; - for (Player player : Bukkit.getOnlinePlayers()) { - if (player.getLocation().distance(snowball.getLocation()) < distance) { - p = player; - distance = player.getLocation().distance(snowball.getLocation()); - } - } - - Sheep sheep = snowball.getWorld().spawn(snowball.getLocation(), Sheep.class); - - TNTPrimed tnt = snowball.getWorld().spawn(snowball.getLocation(), TNTPrimed.class); - tnt.setFuseTicks(300); - - - sheep.addPassenger(tnt); - sheep.addScoreboardTag("kamikaze"); - sheep.setCustomNameVisible(true); - sheep.customName(MiniMessage.miniMessage().deserialize("jeb_")); - sheep.setInvulnerable(true); - - sheep.addPotionEffect( - new org.bukkit.potion.PotionEffect( - PotionEffectType.SPEED, 1000000, 2, false, false - ) - ); - - snowball.remove(); - - Player finalP = p; - new BukkitRunnable() { - @Override - public void run() { - // Make the sheep walk towards the player - assert finalP != null; - sheep.getPathfinder().moveTo(finalP.getLocation()); - if (sheep.getPassengers().size() == 0) { - sheep.remove(); - this.cancel(); - } - } - }.runTaskTimer(plugin, 0L, 2L); - } else if (snowball.getScoreboardTags().contains("earfquake")) { - snowball.getWorld().createExplosion(snowball.getLocation(), 80, true, false); // Adjust power as needed - - // Get the blocks in the affected area - float radius = 30; // Adjust as needed however no bigger than 40 has been tested which is already very large - - - int remTree = (int) (radius * 5); - - // Remove all trees and leaves in the affected area - for (int x = -remTree; x <= remTree; x++) { - for (int y = -remTree; y <= remTree; y++) { - for (int z = -remTree; z <= remTree; z++) { - if (Math.sqrt(x * x + (y) * (y) + z * z) <= remTree) { - Block block = snowball.getLocation().clone().add(x, y, z).getBlock(); - if (block.getType() == Material.OAK_LOG || block.getType() == Material.BIRCH_LOG || block.getType() == Material.SPRUCE_LOG || block.getType() == Material.JUNGLE_LOG || block.getType() == Material.ACACIA_LOG || block.getType() == Material.DARK_OAK_LOG) { - block.setType(Material.FIRE); - } - if(block.getType() == Material.OAK_LEAVES|| block.getType() == Material.BIRCH_LEAVES || block.getType() == Material.SPRUCE_LEAVES || block.getType() == Material.JUNGLE_LEAVES || block.getType() == Material.ACACIA_LEAVES || block.getType() == Material.DARK_OAK_LEAVES) { - block.setType(Material.FIRE); - } - if(block.getType() == Material.BAMBOO || block.getType() == Material.SHORT_GRASS || block.getType() == Material.TALL_GRASS || block.getType() == Material.VINE ) { - block.setType(Material.FIRE); - } - if(block.getType() == Material.SNOW || block.getType() == Material.POWDER_SNOW || block.getType() == Material.SNOW_BLOCK || block.getType() == Material.ICE || block.getType() == Material.PACKED_ICE || block.getType() == Material.BLUE_ICE || block.getType() == Material.FROSTED_ICE) { - block.setType(Material.AIR); - } - if(block.getType() == Material.GRASS_BLOCK || block.getType() == Material.DIRT || block.getType() == Material.COARSE_DIRT || block.getType() == Material.PODZOL || block.getType() == Material.DIRT_PATH || block.getType() == Material.MYCELIUM || block.getType() == Material.SNOW_BLOCK) { - // Choose random number if the block should be converted to course dirt or other "ruined" blocks - int random = (int) (Math.random() * 100); - if(random < 30) block.setType(Material.COARSE_DIRT); - else if(random < 40) block.setType(Material.MUD); - else if(random < 50) { - block.setType(Material.NETHERRACK); - Block blockFire = snowball.getLocation().clone().add(x, (y + 1), z).getBlock(); - if(blockFire.getType() == Material.AIR) blockFire.setType(Material.FIRE); - } - else if(random < 60) block.setType(Material.DIRT_PATH); - else if(random < 70) block.setType(Material.GRAVEL); - else if(random < 80) block.setType(Material.PODZOL); - else if(random < 90) block.setType(Material.MANGROVE_ROOTS); - else if(random < 100) block.setType(Material.MUDDY_MANGROVE_ROOTS); - } - } - } - } - } - - // Do the explosion - for (int x = (int) -radius; x <= radius; x++) { - for (int y = (int) -radius; y <= radius; y++) { - for (int z = (int) -radius; z <= radius; z++) { - if (Math.sqrt(x * x + y * y + z * z) <= radius) { - Block block = snowball.getLocation().clone().add(x, y, z).getBlock(); - if ((block.getType() != Material.AIR) - &&(block.getType() != Material.BEDROCK) - &&(block.getType() != Material.AIR) - ) { - if((block.getType() == Material.WATER)) block.setType(Material.AIR); - - - // Spawn falling block entities at the location of each block - FallingBlock fallingBlock = snowball.getWorld().spawnFallingBlock(block.getLocation(), block.getBlockData()); - // Apply velocity to simulate launch effect - fallingBlock.setVelocity(new Vector( - (Math.random() - 0.5) * (radius / 20) * 2, // Random x velocity between -radius/20 and radius/20 - Math.random() * ((radius / 100) * 3) + 1.2, // Random y velocity between 1.2 and (1.2 + radius/100 * 3) - (Math.random() - 0.5) * (radius / 20) * 2 // Random z velocity between -radius/20 and radius/20 - )); - // Remove the original block - block.setType(Material.AIR); - } - } - } - } - } - } - - } - } -} diff --git a/src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java b/src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java index 133a8e3..d3133b6 100644 --- a/src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/ArenaManager.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.managers; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.types.Arena; import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; @@ -15,12 +15,12 @@ public class ArenaManager { - private final Double plugin; + private final Ceraia plugin; private final List arenas = new ArrayList<>(); private final Map playersInArena = new HashMap<>(); - public ArenaManager(Double plugin) { + public ArenaManager(Ceraia plugin) { this.plugin = plugin; // Load arenas diff --git a/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java b/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java index 0196174..406b7ce 100644 --- a/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java @@ -1,7 +1,7 @@ package com.ceraia.modules.arenas.managers; -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.DoublePlayer; +import com.ceraia.Ceraia; +import com.ceraia.modules.ceraia.types.CeraiaPlayer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -12,9 +12,9 @@ public class EloScoreboardManager { - private final Double plugin; + private final Ceraia plugin; - public EloScoreboardManager(Double plugin) { + public EloScoreboardManager(Ceraia plugin) { this.plugin = plugin; } @@ -26,7 +26,7 @@ public void updateScoreboard() { // Get all online players and set their score to their Elo rating for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { - DoublePlayer doublePlayer = plugin.getPlayerManager().getDoublePlayer(onlinePlayer.getUniqueId()); + CeraiaPlayer doublePlayer = plugin.getPlayerManager().getCeraiaPlayer(onlinePlayer.getUniqueId()); objectivePlayerList.getScore(onlinePlayer.getName()).setScore(doublePlayer.getElo()); objectiveBelowName.getScore(onlinePlayer.getName()).setScore(doublePlayer.getElo()); diff --git a/src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java b/src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java deleted file mode 100644 index b4bea9b..0000000 --- a/src/main/java/com/ceraia/modules/arenas/managers/FactionManager.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.ceraia.modules.arenas.managers; - -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.Faction; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class FactionManager { - private final List factions = new ArrayList<>(); - private final Double plugin; - - public FactionManager(Double plugin) { - this.plugin = plugin; - - // Load arenas - File f = new File(plugin.getDataFolder(), "data/factions"); - if (!f.exists()) { - f.mkdirs(); - return; - } - - File[] files = f.listFiles(); - for (File file : files) { - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - - UUID uuid = UUID.fromString(config.getString("id")); - String name = config.getString("name"); - - List members = new ArrayList(config.getStringList("members")); - - Faction faction = new Faction(plugin, uuid, name, members, file); - factions.add(faction); - } - - } - - public List getFactions() { - return factions; - } - - public Faction getFaction(UUID uuid) { - for (Faction faction : factions) { - if (faction.getUUID() == uuid) { - return faction; - } - } - return null; - } - - public Faction getFaction(String name) { - for (Faction faction : factions) { - if (faction.getName().equalsIgnoreCase(name)) { - return faction; - } - } - return null; - } - - public Faction newFaction(String name){ - List members = null; - File file = new File(plugin.getDataFolder(), "data/factions/" + name + ".yml"); - - return new Faction(plugin, UUID.randomUUID(), name, members, file); - } - - public void removeFaction(Faction faction) { - factions.remove(faction); - } - - public void saveFactions(){ - plugin.getLogger().info("Saving factions..."); - for(Faction faction : factions){ - faction.saveFaction(); - } - } -} diff --git a/src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java b/src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java deleted file mode 100644 index ac83e6a..0000000 --- a/src/main/java/com/ceraia/modules/arenas/managers/PlayerManager.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.ceraia.modules.arenas.managers; - -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.types.DoublePlayer; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.UUID; - -public class PlayerManager { - - private final Double plugin; - private final List doublePlayers = new ArrayList<>(); - - public PlayerManager(Double plugin) { - this.plugin = plugin; - - // Load arenaPlayers - File f = new File(plugin.getDataFolder(), "data/users"); - if (!f.exists()) { - f.mkdirs(); - return; - } - - File[] files = f.listFiles(); - for (File file : files) { - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - - UUID faction = null; - if (config.getString("faction") != null){ - faction = UUID.fromString(config.getString("faction", null)); - } - - DoublePlayer doublePlayer = new DoublePlayer( - plugin, - config.getString("name"), - UUID.fromString(Objects.requireNonNull(config.getString("uuid"))),//UUID.fromString(file.getName().split("\\.")[0]), - config.getInt("elo", 1500), - config.getBoolean("arenabanned", false), - config.getBoolean("pvpbanned", false), - config.getInt("wins", 0), - config.getInt("losses", 0), - config.getInt("draws", 0), - config.getStringList("logs"), - config.getInt("lastSeen", (int) (System.currentTimeMillis() / 1000L)), - faction, - file - ); - doublePlayers.add(doublePlayer); - } - } - - public List getDoublePlayers() { - return doublePlayers; - } - - public DoublePlayer getDoublePlayer(UUID playerUUID) { - // Check if the player is already in the list - for (DoublePlayer doublePlayer : doublePlayers) { - if (doublePlayer.getUUID().equals(playerUUID)) { - return doublePlayer; - } - } - - DoublePlayer newPlayer = createNewDoublePlayer(playerUUID); - doublePlayers.add(newPlayer); - - return newPlayer; - } - public DoublePlayer getDoublePlayer(String playerName) { - // Check if the player is already in the list - for (DoublePlayer doublePlayer : doublePlayers) { - if (doublePlayer.getName().equals(playerName)) { - return doublePlayer; - } - } - - DoublePlayer newPlayer = createNewDoublePlayer(Objects.requireNonNull(Bukkit.getPlayer(playerName)).getUniqueId()); - doublePlayers.add(newPlayer); - return newPlayer; - } - - - public void PlayerKill(UUID playerKiller, UUID playerVictim) { - DoublePlayer killer = getDoublePlayer(playerKiller); - DoublePlayer victim = getDoublePlayer(playerVictim); - - // Constants for the Elo calculation - double kFactor = 32.0; - double expectedScoreKiller = 1.0 / (1.0 + Math.pow(10, (victim.getElo() - killer.getElo()) / 400.0)); - double expectedScoreVictim = 1.0 / (1.0 + Math.pow(10, (killer.getElo() - victim.getElo()) / 400.0)); - - // Update Elo ratings - int newEloKiller = (int) (killer.getElo() + kFactor * (1.0 - expectedScoreKiller)); - int newEloVictim = (int) (victim.getElo() + kFactor * (0.0 - expectedScoreVictim)); - - // Set new Elo ratings - killer.setElo(newEloKiller); - victim.setElo(newEloVictim); - } - - - public int CalculateWinChance(UUID playerKiller, UUID playerVictim){ - DoublePlayer killer = getDoublePlayer(playerKiller); - DoublePlayer victim = getDoublePlayer(playerVictim); - - double expectedScoreKiller = 1.0 / (1.0 + Math.pow(10, (victim.getElo() - killer.getElo()) / 400.0)); - int winChance = (int) (expectedScoreKiller * 100); - - return winChance; - } - - public int CalculateLossChance(UUID playerKiller, UUID playerVictim){ - DoublePlayer killer = getDoublePlayer(playerKiller); - DoublePlayer victim = getDoublePlayer(playerVictim); - - double expectedScoreVictim = 1.0 / (1.0 + Math.pow(10, (killer.getElo() - victim.getElo()) / 400.0)); - int lossChance = (int) (expectedScoreVictim * 100); - - return lossChance; - } - - private DoublePlayer createNewDoublePlayer(UUID playerUUID) { - String playerName = Objects.requireNonNull(Bukkit.getPlayer(playerUUID)).getName(); - File configFile = new File(plugin.getDataFolder(), "data/users/" + playerName + ".yml"); - try { - configFile.createNewFile(); - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Set default values or load from other sources as needed - int defaultElo = 1500; - - config.set("name", playerName); - config.set("uuid", playerUUID.toString()); - config.set("elo", defaultElo); - config.set("arenabanned", false); - config.set("pvpbanned", false); - config.set("wins", 0); - config.set("losses", 0); - config.set("logs", new ArrayList()); - config.set("faction", null); - - config.save(configFile); - - return new DoublePlayer( - plugin, - Objects.requireNonNull(Bukkit.getPlayer(playerUUID)).getName(), - playerUUID, - defaultElo, - false, - false, - 0, - 0, - 0, - new ArrayList(), - (int) (System.currentTimeMillis() / 1000L), - null, - configFile - ); - } catch (IOException e) { - e.printStackTrace(); - return null; // Handle the exception based on your needs - } - } - - public DoublePlayer getPlayer(UUID uniqueId) { - for (DoublePlayer doublePlayer : doublePlayers) { - if (doublePlayer.getUUID().equals(uniqueId)) { - return doublePlayer; - } - } - return null; - } - - public DoublePlayer getPlayer(String name) { - for (DoublePlayer doublePlayer : doublePlayers) { - if (doublePlayer.getName().equalsIgnoreCase(name)) { - return doublePlayer; - } - } - return null; - } - - public void savePlayers(){ - plugin.getLogger().info("Saving players..."); - for(DoublePlayer doublePlayer : doublePlayers){ - doublePlayer.savePlayer(); - } - } -} diff --git a/src/main/java/com/ceraia/modules/arenas/types/Arena.java b/src/main/java/com/ceraia/modules/arenas/types/Arena.java index 878a8ec..cdf0d5a 100644 --- a/src/main/java/com/ceraia/modules/arenas/types/Arena.java +++ b/src/main/java/com/ceraia/modules/arenas/types/Arena.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.types; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.Utils; import com.ceraia.modules.arenas.managers.InviteManager; import net.kyori.adventure.text.Component; @@ -22,8 +22,7 @@ import java.util.stream.Collectors; public class Arena { - - private final Double plugin; + private final Ceraia plugin; // before ready private final String name; @@ -43,7 +42,7 @@ public class Arena { public boolean totems = false; private boolean isFFA = false; - public Arena(Double plugin, String name, String owner, Location spawnPoint1, Location spawnPoint2, boolean isPublic, boolean isFFA, File configFile) { + public Arena(Ceraia plugin, String name, String owner, Location spawnPoint1, Location spawnPoint2, boolean isPublic, boolean isFFA, File configFile) { this.plugin = plugin; this.name = name; @@ -160,7 +159,7 @@ public void setTeam2(List team2) { } public void addPlayer(Player player, int team) { - plugin.getArenaManager().addPlayerToArena(player, this); + plugin.getArenaModule().getArenaManager().addPlayerToArena(player, this); if (team == 1) { team1.add(player); } else { @@ -224,7 +223,7 @@ public void end(Player player, boolean quit) { if (!end || quit) { Utils.teleportPlayerToSpawn(plugin, player, this); - plugin.getArenaManager().removePlayerFromArena(player); + plugin.getArenaModule().getArenaManager().removePlayerFromArena(player); player.getInventory().clear(); Utils.revertInventory(plugin, player, this); @@ -270,15 +269,14 @@ public void run() { } Utils.teleportPlayerToSpawn(plugin, pl, thisArena); - plugin.getArenaManager().removePlayerFromArena(pl); + plugin.getArenaModule().getArenaManager().removePlayerFromArena(pl); Utils.revertInventory(plugin, pl, thisArena); } // Reward for (Player pl : winners) { - plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).addWin(); - plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).setLastFought(System.currentTimeMillis() / 1000L); + plugin.getPlayerManager().getCeraiaPlayer(pl.getUniqueId()).addWin(); for (String command : plugin.getConfig().getStringList("rewards")) { pl.performCommand(command.replace("%player%", pl.getName())); } @@ -286,8 +284,7 @@ public void run() { // Reward losers for (Player pl : losers) { - plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).addLoss(); - plugin.getPlayerManager().getDoublePlayer(pl.getUniqueId()).setLastFought(System.currentTimeMillis() / 1000L); + plugin.getPlayerManager().getCeraiaPlayer(pl.getUniqueId()).addLoss(); for (String command : plugin.getConfig().getStringList("rewards_lose")) { pl.performCommand(command.replace("%player%", pl.getName())); } @@ -381,7 +378,7 @@ public void run() { plugin.getConfig().getString("messages.fight.starting") .replace("%time%", String.valueOf(i.get() - 1)) ), MiniMessage.miniMessage().deserialize( - Objects.requireNonNull(plugin.getArenaManager().getArena(pl).totems ? + Objects.requireNonNull(plugin.getArenaModule().getArenaManager().getArena(pl).totems ? plugin.getConfig().getString("messages.fight.totems_enabled") : plugin.getConfig().getString("messages.fight.totems_disabled")) ) diff --git a/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java index 3eaeeb3..bfd319c 100644 --- a/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java +++ b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java @@ -1,6 +1,6 @@ package com.ceraia.modules.arenas.types; -import com.ceraia.modules.arenas.Double; +import com.ceraia.Ceraia; import com.ceraia.modules.arenas.managers.InviteManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -20,10 +20,10 @@ public class ArenaSelectGUI implements Listener { private static Component INVENTORY_NAME_ARENAS; private static Component INVENTORY_NAME_TOTEMS; - private final Double plugin; + private final Ceraia plugin; private final Map> selectingArenaCache = new HashMap<>(); - public ArenaSelectGUI(Double plugin) { + public ArenaSelectGUI(Ceraia plugin) { this.plugin = plugin; INVENTORY_NAME_ARENAS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.inventory_name"))); @@ -41,10 +41,10 @@ public void openArenaList(Player inviter, Player invited) { // Let the player se // Add the player invitee and inviter InviteManager.Invite invite = new InviteManager.Invite(inviter, invited); - plugin.getInviteManager().selectingInvites.put(inviter, invite); + plugin.getArenaModule().getInviteManager().selectingInvites.put(inviter, invite); // Get a list of all arenas accessible to the player - List arenas = plugin.getArenaManager().getArenas() + List arenas = plugin.getArenaModule().getArenaManager().getArenas() .stream().filter(a -> a.isPublic() || a.getOwner().equals(inviter.getName())).toList(); // Size is from arenas.size() and must be devidable by 9 @@ -186,7 +186,7 @@ public void onClick(InventoryClickEvent e) { int slot = e.getSlot(); Arena arena = selectingArenaCache.get(inviter).get(slot); // Get the specific player and then the arena from the cache - InviteManager.Invite invite = plugin.getInviteManager().selectingInvites.get(inviter); // Get the invite from the selectingInvites map + InviteManager.Invite invite = plugin.getArenaModule().getInviteManager().selectingInvites.get(inviter); // Get the invite from the selectingInvites map invite.arena = arena; // Set the arena in the invite @@ -206,7 +206,7 @@ public void onClick(InventoryClickEvent e) { int slot = e.getSlot(); // Get the invite from the selectingInvites map - InviteManager.Invite invite = plugin.getInviteManager().selectingInvites.get(inviter); + InviteManager.Invite invite = plugin.getArenaModule().getInviteManager().selectingInvites.get(inviter); // Get the arena from the invite Arena arena = invite.arena; @@ -222,7 +222,7 @@ public void onClick(InventoryClickEvent e) { String invite_message = Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.invite_message")) .replace("%inviter%", inviter.getName()) .replace("%arena_name%", arena.getName()) - .replace("%winchance%", plugin.getPlayerManager().CalculateWinChance(inviter.getUniqueId(), invite.invited.getUniqueId()) + "%") + .replace("%winchance%", plugin.getArenaModule().CalculateWinChance(inviter.getUniqueId(), invite.invited.getUniqueId()) + "%") .replace("%totems%", arena.totems ? "enabled" : "disabled"); // Get the invite message from the config and replace the placeholders @@ -231,8 +231,8 @@ public void onClick(InventoryClickEvent e) { invite.arena = arena; - plugin.getInviteManager().selectingInvites.remove(inviter); // Remove the invite from the selectingInvites map - plugin.getInviteManager().invites.put(invite.invited, invite); // Put the invite in the invites map + plugin.getArenaModule().getInviteManager().selectingInvites.remove(inviter); // Remove the invite from the selectingInvites map + plugin.getArenaModule().getInviteManager().invites.put(invite.invited, invite); // Put the invite in the invites map inviter.closeInventory(); // Close the inventory } diff --git a/src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java b/src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java deleted file mode 100644 index 7f82fb0..0000000 --- a/src/main/java/com/ceraia/modules/arenas/types/DoublePlayer.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.ceraia.modules.arenas.types; - -import com.ceraia.modules.arenas.Double; -import com.ceraia.modules.arenas.listeners.PlayerEventListener; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.UUID; - -public class DoublePlayer { - - private final Double plugin; - private final UUID uuid; - private final String name; - private UUID faction; - private final int draws; - private boolean pvpbanned; - private int wins; - private int losses; - private boolean arenabanned; - private final File configFile; - private final List logs; - private int elo; - private long lastFought; - - - public DoublePlayer( - Double plugin, - String name, - UUID uuid, - int elo, - boolean arenabanned, - boolean pvpbanned, - int wins, - int losses, - int draws, - List logs, - long lastFought, - UUID faction, - File configFile - - ) { - this.plugin = plugin; - - this.name = name; - this.uuid = uuid; - this.elo = elo; - this.arenabanned = arenabanned; - this.pvpbanned = pvpbanned; - this.wins = wins; - this.losses = losses; - this.draws = draws; - this.logs = logs; - this.lastFought = lastFought; - this.faction = faction; - this.configFile = configFile; - } - - public UUID getUUID() { - return uuid; - } - public String getName() { - return name; - } - - public int getElo() { - return elo; - } - - public void setElo(int elo) { - this.elo = elo; - - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("elo", elo); - try { - // Trigger the custom event when Elo changes - PlayerEventListener eloChangeEvent = new PlayerEventListener(Bukkit.getPlayer(uuid), this); - Bukkit.getServer().getPluginManager().callEvent(eloChangeEvent); - - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public boolean pvpBan(){ - pvpbanned = !pvpbanned; - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("pvpbanned", pvpbanned); - try { - // Trigger the custom event when Elo changes - PlayerEventListener eloChangeEvent = new PlayerEventListener(Bukkit.getPlayer(uuid), this); - Bukkit.getServer().getPluginManager().callEvent(eloChangeEvent); - - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - return pvpbanned; - } - - public boolean arenaBan(){ - arenabanned = !arenabanned; - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("arenabanned", arenabanned); - try { - // Trigger the custom event when Elo changes - PlayerEventListener eloChangeEvent = new PlayerEventListener(Bukkit.getPlayer(uuid), this); - Bukkit.getServer().getPluginManager().callEvent(eloChangeEvent); - - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - return arenabanned; - } - - public boolean pvpBanned() { - return pvpbanned; - } - - public boolean arenaBanned() { - return arenabanned; - } - - public int wins() { - return wins; - } - - public int losses() { - return losses; - } - - public int draws() { - return draws; - } - - public void addWin() { - wins++; - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("wins", wins); - try { - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void addLoss() { - losses++; - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("losses", losses); - try { - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void addLog(String string){ - logs.add(string); - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("logs", logs); - try { - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void savePlayer(){ - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("name", name); - config.set("uuid", uuid.toString()); - config.set("elo", elo); - config.set("arenabanned", arenabanned); - config.set("pvpbanned", pvpbanned); - config.set("wins", wins); - config.set("losses", losses); - config.set("logs", logs); - - if(faction == null){ - config.set("faction", null); - } else { - config.set("faction", faction.toString()); - } - try { - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void setLastFought(long lastFought) { - this.lastFought = lastFought; - } - - public Faction getFaction() { - return plugin.getFactionManager().getFaction(faction); - } - public void setFaction(UUID faction) { - this.faction = faction; - FileConfiguration config = YamlConfiguration.loadConfiguration(configFile); - config.set("faction", faction.toString()); - try { - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/ceraia/modules/arenas/types/Faction.java b/src/main/java/com/ceraia/modules/arenas/types/Faction.java deleted file mode 100644 index 285dec4..0000000 --- a/src/main/java/com/ceraia/modules/arenas/types/Faction.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.ceraia.modules.arenas.types; - -import com.ceraia.modules.arenas.Double; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class Faction { - - private final Double plugin; - private final UUID uuid; - private final String name; - private File configFile; - - private List members; - - public Faction( - Double plugin, - UUID uuid, - String name, - List members, - File configFile - ) { - this.plugin = plugin; - this.name = name; - this.uuid = uuid; - this.members = members; - this.configFile = configFile; - } - - public UUID getUUID() { - return uuid; - } - - public String getName(){ - return this.name; - } - - public List getMembers(){ - return this.members; - } - - public void addMember(String name){ - // If members is null, create a new list - if (this.members == null){ - this.members = new ArrayList(); - } - this.members.add(name); - this.plugin.getPlayerManager().getDoublePlayer(name).setFaction(this.uuid); - - this.saveFaction(); - } - - public void removeMember(String name){ - this.members.remove(name); - } - - public boolean saveFaction(){ - try { - configFile = new File(plugin.getDataFolder(), "data/factions/" + name + ".yml"); - - // Check if the file already exists - if (!configFile.exists()) { - configFile.createNewFile(); - } - - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Update or set the values - config.set("name", name); - config.set("id", uuid.toString()); - - config.set("members", members); - - config.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - return true; - } - public File getConfigFile(){ - return this.configFile; - } -} diff --git a/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt index ca62fb0..396268b 100644 --- a/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt +++ b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt @@ -21,7 +21,6 @@ class CeraiaPlayer( var losses: Int, private val configFile: File ) { - fun getUUID(): UUID = uuid fun togglePvpBan(): Boolean { @@ -80,4 +79,14 @@ class CeraiaPlayer( this.race = race savePlayer() } + + fun addWin() { + wins++ + savePlayer() + } + + fun addLoss() { + losses++ + savePlayer() + } } From 7684683db9de8b6b0d056220076e8000a9fc0bbb Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 11:03:41 +0800 Subject: [PATCH 13/23] Fixed typo's. --- .../java/com/ceraia/modules/arenas/ArenaModule.kt | 11 ++--------- .../ceraia/modules/arenas/types/ArenaSelectGUI.java | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt index 3eb1323..ffc3a7e 100644 --- a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt +++ b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt @@ -3,7 +3,6 @@ package com.ceraia.modules.arenas import com.ceraia.Ceraia import com.ceraia.metrics.Metrics import com.ceraia.modules.arenas.commands.arena.* -import com.ceraia.modules.arenas.commands.factions.CommandFaction import com.ceraia.modules.arenas.commands.system.CommandMod import com.ceraia.modules.arenas.commands.system.CommandVersion import com.ceraia.modules.arenas.listeners.* @@ -49,7 +48,6 @@ class ArenaModule(private val plugin: Ceraia) { val commandTop = CommandTop(plugin) val commandProfile = CommandProfile(plugin) val commandVersion = CommandVersion(plugin) - val commandFaction = CommandFaction(plugin) // Listeners PlayerEloChangeListener(plugin) @@ -70,16 +68,11 @@ class ArenaModule(private val plugin: Ceraia) { // System Misc Objects.requireNonNull(plugin.getCommand("mod"))?.setExecutor(commandMod) Objects.requireNonNull(plugin.getCommand("version"))?.setExecutor(commandVersion) - - // Faction Commands - Objects.requireNonNull(plugin.getCommand("faction"))?.setExecutor(commandFaction) - - } fun calculateWinChance(player1: UUID, player2: UUID): Double { - val elo1 = playerManager.getPlayer(player1)?.elo - val elo2 = playerManager.getPlayer(player2)?.elo + val elo1 = playerManager?.getPlayer(player1)?.elo + val elo2 = playerManager?.getPlayer(player2)?.elo if ((elo1 == 0 || elo1 == null) || (elo2 == 0 || elo2 == null)) { return 0.5 diff --git a/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java index bfd319c..f058482 100644 --- a/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java +++ b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java @@ -222,7 +222,7 @@ public void onClick(InventoryClickEvent e) { String invite_message = Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.invite_message")) .replace("%inviter%", inviter.getName()) .replace("%arena_name%", arena.getName()) - .replace("%winchance%", plugin.getArenaModule().CalculateWinChance(inviter.getUniqueId(), invite.invited.getUniqueId()) + "%") + .replace("%winchance%", plugin.getArenaModule().calculateWinChance(inviter.getUniqueId(), invite.invited.getUniqueId()) + "%") .replace("%totems%", arena.totems ? "enabled" : "disabled"); // Get the invite message from the config and replace the placeholders From ef0bbc0d614e9687e35c6960b30c39ec6a90d04d Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 18:15:41 +0800 Subject: [PATCH 14/23] Adjusted the double name everywhere to Ceraia --- build.gradle.kts | 2 +- .../java/com/ceraia/modules/MarriageModule.kt | 16 ++++++------ .../java/com/ceraia/modules/RaceModule.kt | 14 +++++----- .../java/com/ceraia/modules/SeatingModule.kt | 2 +- .../java/com/ceraia/modules/SystemModule.kt | 14 +++++----- .../arenas/commands/arena/CommandArena.java | 2 +- .../arenas/commands/arena/CommandPVP.java | 3 +-- .../arenas/commands/arena/CommandProfile.java | 10 +++---- .../arenas/commands/arena/CommandTop.java | 2 +- .../commands/system/CommandVersion.java | 2 +- .../arenas/managers/EloScoreboardManager.java | 6 ++--- .../modules/arenas/types/ArenaSelectGUI.java | 9 ++----- .../modules/ceraia/managers/PlayerManager.kt | 24 ++++++++--------- src/main/resources/plugin.yml | 26 +++++++++---------- 14 files changed, 63 insertions(+), 69 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0bf9d10..92030e5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -71,6 +71,6 @@ tasks.processResources { tasks { runServer { - minecraftVersion("1.21.1") + minecraftVersion("1.21.4") } } diff --git a/src/main/java/com/ceraia/modules/MarriageModule.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt index 0b5c7d2..e9f800c 100644 --- a/src/main/java/com/ceraia/modules/MarriageModule.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -33,7 +33,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter override fun onCommand(sender: CommandSender, cmd: Command, label: String, args: Array): Boolean { if (sender !is Player) return true - if (!sender.hasPermission("double.marry")) { + if (!sender.hasPermission("ceraia.marry")) { plugin.noPermission(sender) return true } @@ -150,14 +150,14 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter } private fun divorce(player: Player) { - val doublePlayer = plugin.playerManager.getCeraiaPlayer(player.uniqueId) - val doublePartner = plugin.playerManager.getCeraiaPlayer(doublePlayer.getPartner() ?: return) + val ceraiaPlayer = plugin.playerManager.getCeraiaPlayer(player.uniqueId) + val ceraiaPartner = plugin.playerManager.getCeraiaPlayer(ceraiaPlayer.getPartner() ?: return) - doublePlayer.divorce() - doublePartner.divorce() + ceraiaPlayer.divorce() + ceraiaPartner.divorce() plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( - "${player.name} has divorced ${doublePartner.name}." + "${player.name} has divorced ${ceraiaPartner.name}." )) } @@ -171,8 +171,8 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter val rightClicked = event.rightClicked as? Player ?: return if (event.player.uniqueId == rightClicked.uniqueId || !event.player.isSneaking) return - val doublePlayer = plugin.playerManager.getCeraiaPlayer(event.player.uniqueId) - if (doublePlayer.isMarried() && rightClicked.name == doublePlayer.getMarriedName()) { + val ceraiaPlayer = plugin.playerManager.getCeraiaPlayer(event.player.uniqueId) + if (ceraiaPlayer.isMarried() && rightClicked.name == ceraiaPlayer.getMarriedName()) { // Spawn a bunch of hearts spawnHeartsAroundPlayer(rightClicked) spawnHeartsAroundPlayer(event.player) diff --git a/src/main/java/com/ceraia/modules/RaceModule.kt b/src/main/java/com/ceraia/modules/RaceModule.kt index 5160235..187f02b 100644 --- a/src/main/java/com/ceraia/modules/RaceModule.kt +++ b/src/main/java/com/ceraia/modules/RaceModule.kt @@ -52,7 +52,7 @@ class RaceModule(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCo when (args[0]) { "reload" -> { - if (!sender.hasPermission("double.races.reload")) { + if (!sender.hasPermission("ceraia.races.reload")) { plugin.noPermission(sender) return true } @@ -62,7 +62,7 @@ class RaceModule(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCo } "become" -> { - if (!sender.hasPermission("double.races.become")) { + if (!sender.hasPermission("ceraia.races.become")) { plugin.noPermission(sender) return true } @@ -89,8 +89,8 @@ class RaceModule(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCo sender.sendMessage(MiniMessage.miniMessage().deserialize("Race not found!")) return true } else { - if (!sender.hasPermission("double.races.become." + args[1]) && - !sender.hasPermission("double.races.become.*") + if (!sender.hasPermission("ceraia.races.become." + args[1]) && + !sender.hasPermission("ceraia.races.become.*") ) { sender.sendMessage( MiniMessage.miniMessage().deserialize("You do not have permission to become this race") @@ -109,7 +109,7 @@ class RaceModule(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCo "gui" -> openFactionGui(sender) "restore" -> { - if (!sender.hasPermission("double.races.restore")) { + if (!sender.hasPermission("ceraia.races.restore")) { plugin.noPermission(sender) return true } @@ -543,8 +543,8 @@ class RaceModule(private val plugin: com.ceraia.Ceraia) : CommandExecutor, TabCo val selectable: MutableList = ArrayList() for (race in races) { - if ((player.hasPermission("double.races.become." + race.name) || - player.hasPermission("double.races.become.*")) && + if ((player.hasPermission("ceraia.races.become." + race.name) || + player.hasPermission("ceraia.races.become.*")) && (faction.getRaceInhabitants().contains(race.name) || faction.getRaceInhabitants().contains("*")) ) selectable.add(race) diff --git a/src/main/java/com/ceraia/modules/SeatingModule.kt b/src/main/java/com/ceraia/modules/SeatingModule.kt index 64052cb..fac3582 100644 --- a/src/main/java/com/ceraia/modules/SeatingModule.kt +++ b/src/main/java/com/ceraia/modules/SeatingModule.kt @@ -76,7 +76,7 @@ class SeatingModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, if (sender !is Player) { return true } - if (!sender.hasPermission("double.sit")) { + if (!sender.hasPermission("ceraia.sit")) { plugin.noPermission(sender) return true } diff --git a/src/main/java/com/ceraia/modules/SystemModule.kt b/src/main/java/com/ceraia/modules/SystemModule.kt index 92674ec..ff32932 100644 --- a/src/main/java/com/ceraia/modules/SystemModule.kt +++ b/src/main/java/com/ceraia/modules/SystemModule.kt @@ -40,14 +40,14 @@ class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, "version" -> { sender.sendMessage( MiniMessage.miniMessage().deserialize( - "Running Ceraia v${plugin.pluginMeta.version} by Axodouble" + "Running Ceraia v${plugin.pluginMeta.version} by Axoceraia" ) ) return true } "day", "noon" -> { - if (!sender.hasPermission("double.time.day") && - !sender.hasPermission("double.time.*") + if (!sender.hasPermission("ceraia.time.day") && + !sender.hasPermission("ceraia.time.*") ) { plugin.noPermission(sender as Player) return true @@ -61,8 +61,8 @@ class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, return true } "night" -> { - if (!sender.hasPermission("double.time.night") && - !sender.hasPermission("double.time.*") + if (!sender.hasPermission("ceraia.time.night") && + !sender.hasPermission("ceraia.time.*") ) { plugin.noPermission(sender as Player) return true @@ -73,7 +73,7 @@ class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, return true } "discord" -> { - if (!sender.hasPermission("double.discord")) { + if (!sender.hasPermission("ceraia.discord")) { plugin.noPermission(sender as Player) return true } @@ -105,7 +105,7 @@ class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, } private fun jump(player: Player) { - if (!player.hasPermission("double.jump")) { + if (!player.hasPermission("ceraia.jump")) { plugin.noPermission(player) return } diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java index 3678cf3..707ddc1 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandArena.java @@ -53,7 +53,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St top.add(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.scoreboard.top"))); - plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(CeraiaPlayer::getElo).reversed()).limit(10).forEach(ap -> { + plugin.getPlayerManager().getCeraiaPlayers().stream().sorted(Comparator.comparingInt(CeraiaPlayer::getElo).reversed()).limit(10).forEach(ap -> { String playerName = Bukkit.getOfflinePlayer(ap.getUUID()).getName(); int elo = ap.getElo(); diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java index 9a46225..a06ae8b 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandPVP.java @@ -39,7 +39,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St } // Check if the sender is pvpbanned - CeraiaPlayer doublePlayer = plugin.getPlayerManager().getCeraiaPlayer(((Player) sender).getUniqueId()); + CeraiaPlayer ceraiaPlayer = plugin.getPlayerManager().getCeraiaPlayer(((Player) sender).getUniqueId()); if (args[0].equalsIgnoreCase("accept")) { Player p = (Player) sender; @@ -156,7 +156,6 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St // reload for op if (playerName.equalsIgnoreCase("reload") && sender.isOp()) { plugin.reloadConfig(); - plugin.getArenaModule().getArenaSelectGUI().reloadConfig(); sender.sendMessage(MiniMessage.miniMessage().deserialize( "Reloaded!") ); diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java index 3f22bdd..baed6ba 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandProfile.java @@ -42,13 +42,13 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St } // Return the player's profile - CeraiaPlayer doublePlayer = plugin.getPlayerManager().getCeraiaPlayer(player.getUniqueId()); + CeraiaPlayer ceraiaPlayer = plugin.getPlayerManager().getCeraiaPlayer(player.getUniqueId()); plugin.getConfig().getStringList("messages.profile").forEach(s -> sender.sendMessage(MiniMessage.miniMessage().deserialize(s .replace("%player%", player.getName()) - .replace("%elo%", String.valueOf(doublePlayer.getElo())) - .replace("%wins%", String.valueOf(doublePlayer.getWins())) - .replace("%losses%", String.valueOf(doublePlayer.getLosses())) - .replace("%games%", String.valueOf(doublePlayer.getWins() + doublePlayer.getLosses()))))); + .replace("%elo%", String.valueOf(ceraiaPlayer.getElo())) + .replace("%wins%", String.valueOf(ceraiaPlayer.getWins())) + .replace("%losses%", String.valueOf(ceraiaPlayer.getLosses())) + .replace("%games%", String.valueOf(ceraiaPlayer.getWins() + ceraiaPlayer.getLosses()))))); diff --git a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java index 899cdc0..c64fe25 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/arena/CommandTop.java @@ -42,7 +42,7 @@ public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull St top.add(MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.scoreboard.top")))); - plugin.getPlayerManager().getDoublePlayers().stream().sorted(Comparator.comparingInt(CeraiaPlayer::getElo).reversed()).limit(10).forEach(ap -> { + plugin.getPlayerManager().getCeraiaPlayers().stream().sorted(Comparator.comparingInt(CeraiaPlayer::getElo).reversed()).limit(10).forEach(ap -> { String playerName = Bukkit.getOfflinePlayer(ap.getUUID()).getName(); int elo = ap.getElo(); diff --git a/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java index bfa112a..759d2aa 100644 --- a/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java +++ b/src/main/java/com/ceraia/modules/arenas/commands/system/CommandVersion.java @@ -22,7 +22,7 @@ public CommandVersion(Ceraia plugin) { @Override public boolean onCommand(CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { sender.sendMessage( - MiniMessage.miniMessage().deserialize("Running Double v" + plugin.getPluginMeta().getVersion() + " by Axodouble") + MiniMessage.miniMessage().deserialize("Running Ceraia v" + plugin.getPluginMeta().getVersion() + " by Axodouble") ); return true; } diff --git a/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java b/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java index 406b7ce..8deeedf 100644 --- a/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java +++ b/src/main/java/com/ceraia/modules/arenas/managers/EloScoreboardManager.java @@ -26,10 +26,10 @@ public void updateScoreboard() { // Get all online players and set their score to their Elo rating for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { - CeraiaPlayer doublePlayer = plugin.getPlayerManager().getCeraiaPlayer(onlinePlayer.getUniqueId()); + CeraiaPlayer ceraiaPlayer = plugin.getPlayerManager().getCeraiaPlayer(onlinePlayer.getUniqueId()); - objectivePlayerList.getScore(onlinePlayer.getName()).setScore(doublePlayer.getElo()); - objectiveBelowName.getScore(onlinePlayer.getName()).setScore(doublePlayer.getElo()); + objectivePlayerList.getScore(onlinePlayer.getName()).setScore(ceraiaPlayer.getElo()); + objectiveBelowName.getScore(onlinePlayer.getName()).setScore(ceraiaPlayer.getElo()); objectivePlayerList.setDisplaySlot(DisplaySlot.PLAYER_LIST); objectiveBelowName.setDisplaySlot(DisplaySlot.BELOW_NAME); diff --git a/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java index f058482..f619f3f 100644 --- a/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java +++ b/src/main/java/com/ceraia/modules/arenas/types/ArenaSelectGUI.java @@ -26,17 +26,12 @@ public class ArenaSelectGUI implements Listener { public ArenaSelectGUI(Ceraia plugin) { this.plugin = plugin; - INVENTORY_NAME_ARENAS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.inventory_name"))); - INVENTORY_NAME_TOTEMS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.inventory_name"))); + INVENTORY_NAME_ARENAS = MiniMessage.miniMessage().deserialize("Quick Text Arena Title"); + INVENTORY_NAME_TOTEMS = MiniMessage.miniMessage().deserialize("Quick Text Totem Title"); Bukkit.getPluginManager().registerEvents(this, plugin); } - public void reloadConfig() { - INVENTORY_NAME_ARENAS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.arena_select_gui.inventory_name"))); - INVENTORY_NAME_TOTEMS = MiniMessage.miniMessage().deserialize(Objects.requireNonNull(plugin.getConfig().getString("messages.totem_select_gui.inventory_name"))); - } - public void openArenaList(Player inviter, Player invited) { // Let the player select what arena to fight in // Add the player invitee and inviter InviteManager.Invite invite = new InviteManager.Invite(inviter, invited); diff --git a/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt b/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt index cf1d3e5..ef5af9e 100644 --- a/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt +++ b/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt @@ -11,7 +11,7 @@ import java.io.IOException import java.util.* class PlayerManager(private val plugin: Ceraia) { - val doublePlayers: MutableList = mutableListOf() + val ceraiaPlayers: MutableList = mutableListOf() init { // Load arenaPlayers @@ -27,7 +27,7 @@ class PlayerManager(private val plugin: Ceraia) { } - val doublePlayer = CeraiaPlayer( + val ceraiaPlayer = CeraiaPlayer( plugin, config.getString("name") ?: throw IllegalArgumentException("Name cannot be null"), config.getString("race", "human").toString(), @@ -41,25 +41,25 @@ class PlayerManager(private val plugin: Ceraia) { config.getInt("losses", 0), file ) - doublePlayers.add(doublePlayer) + ceraiaPlayers.add(ceraiaPlayer) } } fun getCeraiaPlayer(playerUUID: UUID): CeraiaPlayer { - return doublePlayers.find { it.uuid == playerUUID } ?: createNewCeraiaPlayer(playerUUID).also { - doublePlayers.add(it) + return ceraiaPlayers.find { it.uuid == playerUUID } ?: createNewCeraiaPlayer(playerUUID).also { + ceraiaPlayers.add(it) } } fun getCeraiaPlayer(playerName: String): CeraiaPlayer { - return doublePlayers.find { it.name == playerName } + return ceraiaPlayers.find { it.name == playerName } ?: createNewCeraiaPlayer(Bukkit.getPlayer(playerName)?.uniqueId ?: throw IllegalArgumentException("Player not found")) - .also { doublePlayers.add(it) } + .also { ceraiaPlayers.add(it) } } fun getCeraiaPlayer(player: Player): CeraiaPlayer { - return doublePlayers.find { it.uuid == player.uniqueId } ?: createNewCeraiaPlayer(player.uniqueId).also { - doublePlayers.add(it) + return ceraiaPlayers.find { it.uuid == player.uniqueId } ?: createNewCeraiaPlayer(player.uniqueId).also { + ceraiaPlayers.add(it) } } @@ -121,15 +121,15 @@ class PlayerManager(private val plugin: Ceraia) { } fun getPlayer(uniqueId: UUID): CeraiaPlayer? { - return doublePlayers.find { it.uuid == uniqueId } + return ceraiaPlayers.find { it.uuid == uniqueId } } fun getPlayer(name: String): CeraiaPlayer? { - return doublePlayers.find { it.name.equals(name, ignoreCase = true) } + return ceraiaPlayers.find { it.name.equals(name, ignoreCase = true) } } fun savePlayers() { plugin.logger.info("Saving players...") - doublePlayers.forEach { it.savePlayer() } + ceraiaPlayers.forEach { it.savePlayer() } } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a612d4b..cf7a18f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -38,44 +38,44 @@ commands: description: A command to change your race usage: /race permissions : - double.discord: + ceraia.discord: description: "Access to the /discord command that is set in the config.yml" default: true - double.time: + ceraia.time: description: "Access to the /day and /night commands" default: op children: - double.time.day: + ceraia.time.day: description: "Access to the /day command" default: op - double.time.night: + ceraia.time.night: description: "Access to the /night command" default: op - double.time.*: + ceraia.time.*: description: "Access to all time commands" default: op - double.sit: + ceraia.sit: description: "Access to the /sit command and to sit on blocks" default: true - double.marry: + ceraia.marry: description: "Access to the /marry command" default: true - double.jump: + ceraia.jump: description: "Access to the /jump command" default: op - double.races: + ceraia.races: description: "Access to the /race command" default: true children: - double.races.become: + ceraia.races.become: description: "Access to become a race with /race become " default: true - double.races.become.*: + ceraia.races.become.*: description: "Access to specific races" default: true - double.races.reload: + ceraia.races.reload: description: "Access to reload the races" default: op - double.races.restore: + ceraia.races.restore: description: "Access to restore all races" default: op \ No newline at end of file From 21ad92b74adb04eec3012a70240d0fa89a092112 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 18:26:41 +0800 Subject: [PATCH 15/23] Fixed all missing command references --- .../java/com/ceraia/modules/SystemModule.kt | 15 -------------- .../com/ceraia/modules/arenas/ArenaModule.kt | 4 ---- src/main/resources/plugin.yml | 20 +++++++++++++++++++ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/ceraia/modules/SystemModule.kt b/src/main/java/com/ceraia/modules/SystemModule.kt index ff32932..b051ad2 100644 --- a/src/main/java/com/ceraia/modules/SystemModule.kt +++ b/src/main/java/com/ceraia/modules/SystemModule.kt @@ -10,7 +10,6 @@ import org.bukkit.command.TabCompleter import org.bukkit.entity.Player import org.bukkit.event.Listener import org.bukkit.util.StringUtil -import java.io.File class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { @@ -127,18 +126,4 @@ class SystemModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, } } } - - private fun modHelp(sender: CommandSender) { - sender.sendMessage( - MiniMessage.miniMessage().deserialize( - """ - Mod Help - /mod ban pvp - /mod ban arenas - /mod remove pvp - /mod remove arenas - """.trimIndent() - ) - ) - } } \ No newline at end of file diff --git a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt index ffc3a7e..67896a5 100644 --- a/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt +++ b/src/main/java/com/ceraia/modules/arenas/ArenaModule.kt @@ -64,10 +64,6 @@ class ArenaModule(private val plugin: Ceraia) { Objects.requireNonNull(plugin.getCommand("leaderboard"))?.setExecutor(commandTop) Objects.requireNonNull(plugin.getCommand("profile"))?.setExecutor(commandProfile) Objects.requireNonNull(plugin.getCommand("stats"))?.setExecutor(commandProfile) - - // System Misc - Objects.requireNonNull(plugin.getCommand("mod"))?.setExecutor(commandMod) - Objects.requireNonNull(plugin.getCommand("version"))?.setExecutor(commandVersion) } fun calculateWinChance(player1: UUID, player2: UUID): Double { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index cf7a18f..ea83acb 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,6 +6,26 @@ description: Ceraia, the utility plugin. author: Axodouble website: https://github.com/Ceraia/Minecraft commands: + pvp: + description: All pvp related commands. + usage: /pvp + arena: + description: All arena related commands. + usage: /arena + gvg: + description: All gvg related commands. + usage: /gvg + leaderboard: + description: All leaderboard related commands. + usage: /leaderboard + aliases: + - top + profile: + description: All profile related commands. + usage: /profile + stats: + description: All stats related commands. + usage: /stats version: description: Show the version of the plugin. usage: /version From f730aca30cbc65306f02f1ecd4d3ab11e8b73f0b Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 19:57:01 +0800 Subject: [PATCH 16/23] Rename .java to .kt --- .../listeners/{ArenaBlockListener.java => ArenaBlockListener.kt} | 0 .../{ArenaExplodeListener.java => ArenaExplodeListener.kt} | 0 .../listeners/{ArenaFightListener.java => ArenaFightListener.kt} | 0 .../{PlayerEloChangeListener.java => PlayerEloChangeListener.kt} | 0 .../{PlayerEventListener.java => PlayerEventListener.kt} | 0 .../{PlayerInventoryListener.java => PlayerInventoryListener.kt} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/com/ceraia/modules/arenas/listeners/{ArenaBlockListener.java => ArenaBlockListener.kt} (100%) rename src/main/java/com/ceraia/modules/arenas/listeners/{ArenaExplodeListener.java => ArenaExplodeListener.kt} (100%) rename src/main/java/com/ceraia/modules/arenas/listeners/{ArenaFightListener.java => ArenaFightListener.kt} (100%) rename src/main/java/com/ceraia/modules/arenas/listeners/{PlayerEloChangeListener.java => PlayerEloChangeListener.kt} (100%) rename src/main/java/com/ceraia/modules/arenas/listeners/{PlayerEventListener.java => PlayerEventListener.kt} (100%) rename src/main/java/com/ceraia/modules/arenas/listeners/{PlayerInventoryListener.java => PlayerInventoryListener.kt} (100%) diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.kt diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.kt diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.kt diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.kt diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.kt similarity index 100% rename from src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.java rename to src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.kt From 3b10a1d3b571e90a18bc62dd4ed89e3074a75e7c Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 19:57:01 +0800 Subject: [PATCH 17/23] Converted all listeners to kotlin --- .../arenas/listeners/ArenaBlockListener.kt | 53 ++-- .../arenas/listeners/ArenaExplodeListener.kt | 136 +++++------ .../arenas/listeners/ArenaFightListener.kt | 227 ++++++++---------- .../listeners/PlayerEloChangeListener.kt | 35 ++- .../arenas/listeners/PlayerEventListener.kt | 41 +--- .../listeners/PlayerInventoryListener.kt | 60 +++-- .../ceraia/modules/arenas/types/Arena.java | 4 +- 7 files changed, 245 insertions(+), 311 deletions(-) diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.kt index 6e8bc1a..e2a51c3 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaBlockListener.kt @@ -1,44 +1,33 @@ -package com.ceraia.modules.arenas.listeners; - -import com.ceraia.Ceraia; -import com.ceraia.modules.arenas.types.Arena; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; - -public class ArenaBlockListener implements Listener { - - private final Ceraia plugin; - - public ArenaBlockListener(Ceraia plugin) { - this.plugin = plugin; - Bukkit.getPluginManager().registerEvents(this, plugin); +package com.ceraia.modules.arenas.listeners + +import com.ceraia.Ceraia +import org.bukkit.Bukkit +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.block.BlockBreakEvent +import org.bukkit.event.block.BlockPlaceEvent + +class ArenaBlockListener(private val plugin: Ceraia) : Listener { + init { + Bukkit.getPluginManager().registerEvents(this, plugin) } @EventHandler - public void onBlockPlace(BlockPlaceEvent e) { - Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getPlayer()); - if (arena == null) { - return; - } + fun onBlockPlace(e: BlockPlaceEvent) { + val arena = plugin.arenaModule.arenaManager!!.getArena(e.player) ?: return - arena.placeBlock(e.getBlockPlaced().getLocation()); + arena.placeBlock(e.blockPlaced.location) } @EventHandler - public void onBlockBreak(BlockBreakEvent e) { - Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getPlayer()); - if (arena == null) { - return; - } + fun onBlockBreak(e: BlockBreakEvent) { + val arena = plugin.arenaModule.arenaManager!!.getArena(e.player) ?: return - if (arena.getPlacedBlocks().contains(e.getBlock().getLocation())) { - arena.removeBlock(e.getBlock().getLocation()); - return; + if (arena.placedBlocks.contains(e.block.location)) { + arena.removeBlock(e.block.location) + return } - e.setCancelled(true); + e.isCancelled = true } } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.kt index 44b93ed..804e4b1 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaExplodeListener.kt @@ -1,101 +1,93 @@ -package com.ceraia.modules.arenas.listeners; - -import com.ceraia.Ceraia; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.data.type.RespawnAnchor; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -public class ArenaExplodeListener implements Listener { - - private final Ceraia plugin; - - public ArenaExplodeListener(Ceraia plugin) { - this.plugin = plugin; - Bukkit.getPluginManager().registerEvents(this, plugin); +package com.ceraia.modules.arenas.listeners + +import com.ceraia.Ceraia +import org.bukkit.Bukkit +import org.bukkit.Material +import org.bukkit.block.data.type.RespawnAnchor +import org.bukkit.entity.* +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.entity.EntityDamageByEntityEvent +import org.bukkit.event.entity.EntityExplodeEvent +import org.bukkit.event.player.PlayerInteractEvent + +class ArenaExplodeListener(private val plugin: Ceraia) : Listener { + init { + Bukkit.getPluginManager().registerEvents(this, plugin) } - private boolean isInArena(Player player) { - return plugin.getArenaModule().getArenaManager().getArena(player) != null; + private fun isInArena(player: Player): Boolean { + return plugin.arenaModule.arenaManager!!.getArena(player) != null } // TNT @EventHandler - public void onEntityExplode(EntityExplodeEvent e) { - Player source = null; - if (e.getEntityType().equals(EntityType.TNT)) { - TNTPrimed tnt = (TNTPrimed) e.getEntity(); - Entity entity = tnt.getSource(); - if (!(entity instanceof Player)) return; - source = (Player) entity; + fun onEntityExplode(e: EntityExplodeEvent) { + var source: Player? = null + if (e.entityType == EntityType.TNT) { + val tnt = e.entity as TNTPrimed + val entity = tnt.source as? Player ?: return + source = entity } if (source == null || isInArena(source)) { - return; + return } - e.blockList().clear(); + e.blockList().clear() } // End crystal @EventHandler - public void onHitCrystal(EntityDamageByEntityEvent e) { - Entity entity = e.getEntity(); - Entity damager = e.getDamager(); + fun onHitCrystal(e: EntityDamageByEntityEvent) { + val entity = e.entity + val damager = e.damager - Player source; + val source: Player - if (!(entity instanceof EnderCrystal)) return; + if (entity !is EnderCrystal) return - if (damager instanceof Player) { - source = (Player) damager; - } else if (damager instanceof Arrow arrow) { - Entity entity2 = (Entity) arrow.getShooter(); - if (!(entity2 instanceof Player)) return; - source = (Player) entity2; + if (damager is Player) { + source = damager + } else if (damager is Arrow) { + val entity2 = damager.shooter as Entity? as? Player ?: return + source = entity2 } else { - return; + return } if (isInArena(source)) { - return; + return } - e.setCancelled(true); - if (e.getEntity().isValid()) - e.getEntity().remove(); - e.getEntity().getWorld().createExplosion( - e.getEntity().getLocation(), - 6, - false, - false - ); + e.isCancelled = true + if (e.entity.isValid) e.entity.remove() + e.entity.world.createExplosion( + e.entity.location, + 6f, + false, + false + ) } // Respawn Anchor @EventHandler - public void onFillAnchor(PlayerInteractEvent e) { - if (e.getClickedBlock() == null) return; - if (!e.getClickedBlock().getType().equals(Material.RESPAWN_ANCHOR)) return; - - Block block = e.getClickedBlock(); - RespawnAnchor data = (RespawnAnchor) block.getBlockData(); - if (data.getCharges() < data.getMaximumCharges()) return; - - if (isInArena(e.getPlayer())) return; - - e.setCancelled(true); - block.setType(Material.AIR); - block.getWorld().createExplosion( - block.getLocation(), - 5, - false, - false - ); + fun onFillAnchor(e: PlayerInteractEvent) { + if (e.clickedBlock == null) return + if (e.clickedBlock!!.type != Material.RESPAWN_ANCHOR) return + + val block = e.clickedBlock + val data = block!!.blockData as RespawnAnchor + if (data.charges < data.maximumCharges) return + + if (isInArena(e.player)) return + + e.isCancelled = true + block.type = Material.AIR + block.world.createExplosion( + block.location, + 5f, + false, + false + ) } } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.kt index c1dd48b..90f333e 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/ArenaFightListener.kt @@ -1,201 +1,184 @@ -package com.ceraia.modules.arenas.listeners; - -import com.ceraia.Ceraia; -import com.ceraia.modules.arenas.managers.InviteManager; -import com.ceraia.modules.arenas.types.Arena; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.Objects; -import java.util.UUID; - -public class ArenaFightListener implements Listener { - - private final Ceraia plugin; - - public ArenaFightListener(Ceraia plugin) { - this.plugin = plugin; - Bukkit.getPluginManager().registerEvents(this, plugin); +package com.ceraia.modules.arenas.listeners + +import com.ceraia.Ceraia +import com.ceraia.modules.arenas.types.Arena +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Bukkit +import org.bukkit.Material +import org.bukkit.entity.* +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.entity.EntityDamageByEntityEvent +import org.bukkit.event.entity.EntityDamageEvent +import org.bukkit.event.entity.PlayerDeathEvent +import org.bukkit.event.player.PlayerQuitEvent +import org.bukkit.scheduler.BukkitRunnable +import java.util.* + +class ArenaFightListener(private val plugin: Ceraia) : Listener { + init { + Bukkit.getPluginManager().registerEvents(this, plugin) } - private boolean isInArena(Player player) { - return plugin.getArenaModule().getArenaManager().getArena(player) != null; + private fun isInArena(player: Player): Boolean { + return plugin.arenaModule.arenaManager?.getArena(player) != null } @EventHandler - public void onHit(EntityDamageByEntityEvent e) { - if (e.getDamager() == null || e.getEntity() == null) { - return; - } - - if (!(e.getDamager() instanceof Player damager) || !(e.getEntity() instanceof Player player)) { - return; - } + fun onHit(e: EntityDamageByEntityEvent) { + val damager = e.damager as? Player ?: return + val player = e.entity as? Player ?: return if (!isInArena(damager) && !isInArena(player)) { - return; + return } - if (((isInArena(damager) && !isInArena(player)) || (!isInArena(damager) && isInArena(player))) || !Objects.equals(plugin.getArenaModule().getArenaManager().getArena(damager).getName(), plugin.getArenaModule().getArenaManager().getArena(player).getName())) { - e.setCancelled(true); - return; + if (((isInArena(damager) && !isInArena(player)) || (!isInArena(damager) && isInArena(player))) || plugin.arenaModule.arenaManager?.getArena( + damager + )?.name != plugin.arenaModule.arenaManager?.getArena(player)?.name + ) { + e.isCancelled = true + return } - Arena arena = plugin.getArenaModule().getArenaManager().getArena(damager); + val arena: Arena = plugin.arenaModule.arenaManager?.getArena(damager) ?: return - if (arena == null) { - return; + if (arena.state != Arena.ArenaState.RUNNING) { + e.isCancelled = true + return } - if (arena.getState() != Arena.ArenaState.RUNNING) { - e.setCancelled(true); - return; + if (arena.team1.contains(damager) && arena.team1.contains(player)) { + e.isCancelled = true + return } - if (arena.getTeam1().contains(damager) && arena.getTeam1().contains(player)) { - e.setCancelled(true); - return; - } - - if (arena.getTeam2().contains(damager) && arena.getTeam2().contains(player)) { - e.setCancelled(true); + if (arena.team2.contains(damager) && arena.team2.contains(player)) { + e.isCancelled = true } } @EventHandler - public void onDamage(EntityDamageEvent e) { - if (!(e.getEntity() instanceof Player player)) { - return; - } + fun onDamage(e: EntityDamageEvent) { + val player = e.entity as? Player ?: return if (!isInArena(player)) { - return; + return } // Get player that hurt the player - Player killer = null; - if (e instanceof EntityDamageByEntityEvent event) { + var killer: Player? = null + if (e is EntityDamageByEntityEvent) { // If the damage is caused by a player - if (event.getDamager() instanceof Player) { - plugin.getLogger().info("Player"); - killer = (Player) event.getDamager(); - } - // If the damage is caused by a projectile - else if (event.getDamager() instanceof org.bukkit.entity.Projectile projectile) { - plugin.getLogger().info("Arrow"); - if (projectile.getShooter() instanceof Player) { - killer = (Player) projectile.getShooter(); + if (e.damager is Player) { + plugin.logger.info("Player") + killer = e.damager as Player + } else if (e.damager is Projectile) { + plugin.logger.info("Arrow") + val projectile = e.damager as Projectile + if (projectile.shooter is Player) { + killer = projectile.shooter as Player } - } - - // If the damage is caused by a tnt - else if (event.getDamager().getType() == org.bukkit.entity.EntityType.TNT) { - plugin.getLogger().info("TNT"); - if (event.getDamager().customName() != null) { - killer = Bukkit.getPlayer(Objects.requireNonNull(event.getDamager().customName()).toString()); + } else if (e.damager.type == EntityType.TNT) { + plugin.logger.info("TNT") + if (e.damager.customName() != null) { + killer = Bukkit.getPlayer(Objects.requireNonNull(e.damager.customName()).toString()) } } } - Arena arena = plugin.getArenaModule().getArenaManager().getArena(player); + val arena: Arena = plugin.arenaModule.arenaManager?.getArena(player) ?: return - double healthAfter = player.getHealth() - e.getFinalDamage(); + val healthAfter: Double = player.health - e.finalDamage if (healthAfter <= 0) { - // Check if during the fight totems are allowed - InviteManager.Invite invite = plugin.getArenaModule().getInviteManager().invites.get(player); + var invite = plugin.arenaModule.inviteManager!!.invites[player] - if (invite == null) invite = plugin.getArenaModule().getInviteManager().selectingInvites.get(killer); + if (invite == null) invite = plugin.arenaModule.inviteManager!!.selectingInvites[killer] if (invite != null) { if (arena.totems) { - if (player.getInventory().getItemInMainHand().getType() == Material.TOTEM_OF_UNDYING || player.getInventory().getItemInOffHand().getType() == Material.TOTEM_OF_UNDYING) { - return; + if (player.inventory.itemInMainHand.type == Material.TOTEM_OF_UNDYING || player.inventory.itemInOffHand.type == Material.TOTEM_OF_UNDYING) { + return } } } + e.isCancelled = true + player.health = player.healthScale - e.setCancelled(true); - player.setHealth(player.getHealthScale()); - - arena.end(player, false); + arena.end(player, false) } } @EventHandler - public void onDeath(PlayerDeathEvent e) { - if (!isInArena(e.getEntity())) { - return; + fun onDeath(e: PlayerDeathEvent) { + if (!isInArena(e.entity)) { + return } - Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getEntity()); + val arena = plugin.arenaModule.arenaManager?.getArena(e.entity) ?: return - Location loc = e.getEntity().getLocation(); + val loc = e.entity.location - Player killer = e.getEntity().getKiller(); + var killer = e.entity.killer if (killer == null) { - killer = Bukkit.getPlayer(Objects.requireNonNull(Objects.requireNonNull(e.getEntity().getLastDamageCause()).getEntity().customName()).toString()); + killer = Bukkit.getPlayer( + Objects.requireNonNull(Objects.requireNonNull(e.entity.lastDamageCause)?.entity?.customName()).toString() + ) } if (killer != null) { - matchEnd(e.getEntity(), killer); + matchEnd(e.entity, killer) } - - - e.getEntity().spigot().respawn(); - new BukkitRunnable() { - @Override - public void run() { - e.getEntity().teleport(loc); - arena.end(e.getEntity(), false); + e.entity.spigot().respawn() + object : BukkitRunnable() { + override fun run() { + e.entity.teleport(loc) + arena.end(e.entity, false) } - }.runTaskLater(plugin, 5L); + }.runTaskLater(plugin, 5L) } @EventHandler - public void onQuit(PlayerQuitEvent e) { - if (!isInArena(e.getPlayer())) { - return; + fun onQuit(e: PlayerQuitEvent) { + if (!isInArena(e.player)) { + return } - Arena arena = plugin.getArenaModule().getArenaManager().getArena(e.getPlayer()); + val arena = plugin.arenaModule.arenaManager?.getArena(e.player) ?: return // Check in which team the player is - if (arena.getTeam1().contains(e.getPlayer())) { - matchEnd(e.getPlayer(), arena.getTeam2().get(0)); + if (arena.team1.contains(e.player)) { + matchEnd(e.player, arena.team2[0]) } else { - matchEnd(e.getPlayer(), arena.getTeam1().get(0)); + matchEnd(e.player, arena.team1[0]) } - arena.end(e.getPlayer(), true); + arena.end(e.player, true) } - private void matchEnd(Player loser, Player winner) { - UUID winnerUUID = winner.getUniqueId(); - UUID loserUUID = loser.getUniqueId(); + private fun matchEnd(loser: Player, winner: Player) { + val winnerUUID = winner.uniqueId + val loserUUID = loser.uniqueId // Get the win chance - int winChance = (int) plugin.getArenaModule().calculateWinChance(winnerUUID, loserUUID); + val winChance = plugin.arenaModule.calculateWinChance(winnerUUID, loserUUID).toInt() // Announce the winner and the win chance in chat - Bukkit.broadcast(MiniMessage.miniMessage().deserialize(plugin.getConfig().getString("messages.fight.end_global").replace("%winner%", winner.getName()).replace("%loser%", loser.getName()).replace("%elo%", String.valueOf(plugin.getPlayerManager().getCeraiaPlayer(loserUUID).getElo())).replace("%winchance%", String.valueOf(winChance)).replace("%arena%", plugin.getArenaModule().getArenaManager().getArena(loser).getName())) - - ); + Bukkit.broadcast( + MiniMessage.miniMessage().deserialize( + plugin.config.getString("messages.fight.end_global")!! + .replace("%winner%", winner.name).replace("%loser%", loser.name) + .replace("%elo%", plugin.playerManager.getCeraiaPlayer(loserUUID).elo.toString()) + .replace("%winchance%", winChance.toString()) + .replace("%arena%", plugin.arenaModule.arenaManager?.getArena(loser)?.name ?: "") + ) + ) // Handle ELO calculations // #TODO: Re-implement ELO calculations //plugin.getPlayerManager().PlayerKill(winnerUUID, loserUUID); } -} +} \ No newline at end of file diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.kt index 2322c7f..166b3dd 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEloChangeListener.kt @@ -1,30 +1,25 @@ -package com.ceraia.modules.arenas.listeners; +package com.ceraia.modules.arenas.listeners -import com.ceraia.Ceraia; -import com.ceraia.modules.arenas.managers.EloScoreboardManager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; +import com.ceraia.Ceraia +import com.ceraia.modules.arenas.managers.EloScoreboardManager +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent -public class PlayerEloChangeListener implements Listener { - - private final Ceraia plugin; - - public PlayerEloChangeListener(Ceraia plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); +class PlayerEloChangeListener(private val plugin: Ceraia) : Listener { + init { + plugin.server.pluginManager.registerEvents(this, plugin) } @EventHandler // Custom on player Elo change event to update the scoreboard - public void onPlayerEloChange(PlayerEventListener event) { - EloScoreboardManager eloScoreboardManager = new EloScoreboardManager(plugin); - eloScoreboardManager.updateScoreboard(); + fun onPlayerEloChange(event: PlayerEventListener?) { + val eloScoreboardManager = EloScoreboardManager(plugin) + eloScoreboardManager.updateScoreboard() } @EventHandler // On player join event to update the scoreboard - public void onPlayerJoin(PlayerJoinEvent event) { - EloScoreboardManager eloScoreboardManager = new EloScoreboardManager(plugin); - eloScoreboardManager.updateScoreboard(); + fun onPlayerJoin(event: PlayerJoinEvent?) { + val eloScoreboardManager = EloScoreboardManager(plugin) + eloScoreboardManager.updateScoreboard() } - } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt index 76520ac..a5a5ebb 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt @@ -1,37 +1,16 @@ -package com.ceraia.modules.arenas.listeners; +package com.ceraia.modules.arenas.listeners -import com.ceraia.modules.ceraia.types.CeraiaPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; +import com.ceraia.modules.ceraia.types.CeraiaPlayer +import org.bukkit.entity.Player +import org.bukkit.event.Event +import org.bukkit.event.HandlerList -public class PlayerEventListener extends Event { - - private static final HandlerList handlers = new HandlerList(); - private final Player player; - private final CeraiaPlayer ceraiaPlayer; - - public PlayerEventListener(Player player, CeraiaPlayer ceraiaPlayer) { - this.player = player; - this.ceraiaPlayer = ceraiaPlayer; +class PlayerEventListener(val player: Player, val arenaPlayer: CeraiaPlayer) : Event() { + override fun getHandlers(): HandlerList { + return handlerList } - public Player getPlayer() { - return player; + companion object { + val handlerList: HandlerList = HandlerList() } - - public CeraiaPlayer getArenaPlayer() { - return ceraiaPlayer; - } - - @Override - public @NotNull HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } - } diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.kt index 9a19187..bef7c6e 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerInventoryListener.kt @@ -1,49 +1,45 @@ -package com.ceraia.modules.arenas.listeners; - -import com.ceraia.Ceraia; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.player.PlayerDropItemEvent; - -public class PlayerInventoryListener implements Listener { - - private final Ceraia plugin; - - public PlayerInventoryListener(Ceraia plugin) { - this.plugin = plugin; - Bukkit.getPluginManager().registerEvents(this, plugin); +package com.ceraia.modules.arenas.listeners + +import com.ceraia.Ceraia +import org.bukkit.Bukkit +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.event.inventory.InventoryType +import org.bukkit.event.player.PlayerDropItemEvent + +class PlayerInventoryListener(private val plugin: Ceraia) : Listener { + init { + Bukkit.getPluginManager().registerEvents(this, plugin) } - private boolean isInArena(Player player) { - return plugin.getArenaModule().getArenaManager().getArena(player) != null; + private fun isInArena(player: Player): Boolean { + return plugin.arenaModule.arenaManager!!.getArena(player) != null } @EventHandler - public void onDropItem(PlayerDropItemEvent e) { - if (isInArena(e.getPlayer())) { - e.setCancelled(true); + fun onDropItem(e: PlayerDropItemEvent) { + if (isInArena(e.player)) { + e.isCancelled = true } } @EventHandler - public void onClickInventory(InventoryClickEvent e) { - Player p = (Player) e.getWhoClicked(); + fun onClickInventory(e: InventoryClickEvent) { + val p = e.whoClicked as Player if (!isInArena(p)) { - return; + return } - if (e.getView().getTopInventory().getType() == InventoryType.PLAYER - || e.getView().getTopInventory().getType() == - InventoryType.CRAFTING) { - return; + if (e.view.topInventory.type == InventoryType.PLAYER + || e.view.topInventory.type == + InventoryType.CRAFTING + ) { + return } - e.setCancelled(true); - + e.isCancelled = true } } diff --git a/src/main/java/com/ceraia/modules/arenas/types/Arena.java b/src/main/java/com/ceraia/modules/arenas/types/Arena.java index cdf0d5a..ec8e416 100644 --- a/src/main/java/com/ceraia/modules/arenas/types/Arena.java +++ b/src/main/java/com/ceraia/modules/arenas/types/Arena.java @@ -112,8 +112,8 @@ public void setState(ArenaState state) { this.state = state; } - public boolean delete() { - return configFile.delete(); + public void delete() { + configFile.delete(); } public String getName() { From ad5e8a226f9ffcb434141f623c7ecd9ffc3ca261 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 20:00:55 +0800 Subject: [PATCH 18/23] Fixed playereventlistener causing a crash --- .../arenas/listeners/PlayerEventListener.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt index a5a5ebb..842c6ea 100644 --- a/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt +++ b/src/main/java/com/ceraia/modules/arenas/listeners/PlayerEventListener.kt @@ -1,16 +1,19 @@ package com.ceraia.modules.arenas.listeners -import com.ceraia.modules.ceraia.types.CeraiaPlayer -import org.bukkit.entity.Player import org.bukkit.event.Event import org.bukkit.event.HandlerList -class PlayerEventListener(val player: Player, val arenaPlayer: CeraiaPlayer) : Event() { - override fun getHandlers(): HandlerList { - return handlerList +class PlayerEventListener : Event() { + companion object { + private val handlers = HandlerList() + + @JvmStatic + fun getHandlerList(): HandlerList { + return handlers + } } - companion object { - val handlerList: HandlerList = HandlerList() + override fun getHandlers(): HandlerList { + return handlers } -} +} \ No newline at end of file From 18d9fa5afb7477be6b5bb277ede1f9ac0056612c Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 20:51:57 +0800 Subject: [PATCH 19/23] Started sketch on allowing for adoptions within the current marriage module. --- .../java/com/ceraia/modules/MarriageModule.kt | 50 +++++++++---------- .../modules/ceraia/types/DoublePlayer.kt | 24 ++++++++- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/ceraia/modules/MarriageModule.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt index e9f800c..dd75765 100644 --- a/src/main/java/com/ceraia/modules/MarriageModule.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -20,7 +20,9 @@ import kotlin.math.sin class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter, Listener { - private val invites: MutableMap = mutableMapOf() + private val proposals: MutableMap = mutableMapOf() + // First is parent of the request, second is the child + private val adoptionRequests: MutableMap = mutableMapOf() init { plugin.getCommand("marry")?.setExecutor(this) @@ -54,6 +56,9 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter invite(sender, target) } + "adopt" -> { + + } } return true @@ -85,14 +90,14 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter return } - if (invites.containsKey(sender)) { - if (invites[sender] == target) { + if (proposals.containsKey(sender)) { + if (proposals[sender] == target) { accept(sender, target) return } } - invites[target] = sender + proposals[target] = sender plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( "${sender.name} has invited ${target.name} to marry them!" )) @@ -115,7 +120,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter target.sendMessage(MiniMessage.miniMessage().deserialize("You are already married!")) return } - if (invites[target] != sender) { + if (proposals[target] != sender) { return } @@ -125,45 +130,36 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter targetCeraiaPlayer.marry(sender.name) senderCeraiaPlayer.marry(target.name) - invites.remove(target) + proposals.remove(target) } - fun decline(target: Player, sender: Player): Int { - val senderCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(sender.uniqueId) - val targetCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(target.uniqueId) + private fun divorce(player: Player) { + val ceraiaPlayer = plugin.playerManager.getCeraiaPlayer(player.uniqueId) + val ceraiaPartner = plugin.playerManager.getCeraiaPlayer(ceraiaPlayer.getPartner() ?: return) - if (senderCeraiaPlayer.isMarried()) { - return 1 - } - if (targetCeraiaPlayer.isMarried()) { - return 2 - } - if (invites[target] != sender) { - return 3 - } + ceraiaPlayer.divorce() + ceraiaPartner.divorce() plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( - "${target.name} has declined ${sender.name}'s marriage proposal!" + "${player.name} has divorced ${ceraiaPartner.name}." )) - invites.remove(target) - return 4 } - private fun divorce(player: Player) { + private fun adoptParent(player: Player, parent: Player) { val ceraiaPlayer = plugin.playerManager.getCeraiaPlayer(player.uniqueId) - val ceraiaPartner = plugin.playerManager.getCeraiaPlayer(ceraiaPlayer.getPartner() ?: return) + val ceraiaParent = plugin.playerManager.getCeraiaPlayer(parent.uniqueId) - ceraiaPlayer.divorce() - ceraiaPartner.divorce() + ceraiaPlayer.addParent(parent.name) + ceraiaParent.addChild(player.name) plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( - "${player.name} has divorced ${ceraiaPartner.name}." + "${player.name} has adopted ${parent.name} as their parent." )) } @EventHandler fun onPlayerQuit(event: PlayerQuitEvent) { - invites.remove(event.player) + proposals.remove(event.player) } @EventHandler diff --git a/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt index 396268b..fa15f77 100644 --- a/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt +++ b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt @@ -19,7 +19,9 @@ class CeraiaPlayer( private var pvpBanned: Boolean, var wins: Int, var losses: Int, - private val configFile: File + private val configFile: File, + private val parents: MutableList, + private var children: MutableList ) { fun getUUID(): UUID = uuid @@ -46,6 +48,8 @@ class CeraiaPlayer( config.set("pvpbanned", pvpBanned) config.set("wins", wins) config.set("losses", losses) + config.set("parents", parents) + config.set("children", children) try { config.save(configFile) @@ -59,6 +63,22 @@ class CeraiaPlayer( savePlayer() } + fun disown(name: String){ + children.remove(name) + parents.remove(name) + savePlayer() + } + + fun addChild(name: String){ + children.add(name) + savePlayer() + } + + fun addParent(name: String){ + parents.add(name) + savePlayer() + } + fun marry(name: String) { marriedName = name savePlayer() @@ -89,4 +109,4 @@ class CeraiaPlayer( losses++ savePlayer() } -} +} \ No newline at end of file From 97e51930deb1eb6fb1106b75abab1ba31e17d0c1 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 20:55:47 +0800 Subject: [PATCH 20/23] Renamed accept to accept proposal --- src/main/java/com/ceraia/modules/MarriageModule.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ceraia/modules/MarriageModule.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt index dd75765..cc723f8 100644 --- a/src/main/java/com/ceraia/modules/MarriageModule.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -92,7 +92,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter if (proposals.containsKey(sender)) { if (proposals[sender] == target) { - accept(sender, target) + acceptProposal(sender, target) return } } @@ -106,7 +106,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter )) } - private fun accept(target: Player, sender: Player) { + private fun acceptProposal(target: Player, sender: Player) { val senderCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(sender.uniqueId) val targetCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(target.uniqueId) @@ -146,15 +146,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter } private fun adoptParent(player: Player, parent: Player) { - val ceraiaPlayer = plugin.playerManager.getCeraiaPlayer(player.uniqueId) - val ceraiaParent = plugin.playerManager.getCeraiaPlayer(parent.uniqueId) - - ceraiaPlayer.addParent(parent.name) - ceraiaParent.addChild(player.name) - plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( - "${player.name} has adopted ${parent.name} as their parent." - )) } @EventHandler From ce5d0bf4334d0d4ddec4eb1b83940a4660121ef2 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 20:59:56 +0800 Subject: [PATCH 21/23] Fixed player data structure to accept parents and kids --- .../com/ceraia/modules/ceraia/managers/PlayerManager.kt | 8 ++++++++ .../java/com/ceraia/modules/ceraia/types/DoublePlayer.kt | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt b/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt index ef5af9e..715b30e 100644 --- a/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt +++ b/src/main/java/com/ceraia/modules/ceraia/managers/PlayerManager.kt @@ -39,6 +39,8 @@ class PlayerManager(private val plugin: Ceraia) { config.getBoolean("pvpbanned", false), config.getInt("wins", 0), config.getInt("losses", 0), + config.getStringList("parents"), + config.getStringList("children"), file ) ceraiaPlayers.add(ceraiaPlayer) @@ -84,6 +86,8 @@ class PlayerManager(private val plugin: Ceraia) { set("wins", 0) set("losses", 0) set("logs", mutableListOf()) + set("parents", mutableListOf()) + set("children", mutableListOf()) } config.save(configFile) @@ -99,6 +103,8 @@ class PlayerManager(private val plugin: Ceraia) { false, 0, 0, + mutableListOf(), + mutableListOf(), configFile ) } catch (e: IOException) { @@ -115,6 +121,8 @@ class PlayerManager(private val plugin: Ceraia) { false, 0, 0, + mutableListOf(), + mutableListOf(), configFile ) } diff --git a/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt index fa15f77..64b8d23 100644 --- a/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt +++ b/src/main/java/com/ceraia/modules/ceraia/types/DoublePlayer.kt @@ -19,9 +19,9 @@ class CeraiaPlayer( private var pvpBanned: Boolean, var wins: Int, var losses: Int, - private val configFile: File, private val parents: MutableList, - private var children: MutableList + private var children: MutableList, + private val configFile: File, ) { fun getUUID(): UUID = uuid From c2dd4fdaa30839d2a717c22b64d8e5e92e473d65 Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 21:00:32 +0800 Subject: [PATCH 22/23] Clarified other functions --- src/main/java/com/ceraia/modules/MarriageModule.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ceraia/modules/MarriageModule.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt index cc723f8..0872b99 100644 --- a/src/main/java/com/ceraia/modules/MarriageModule.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -54,7 +54,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter return true } - invite(sender, target) + propose(sender, target) } "adopt" -> { @@ -77,7 +77,7 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter return returnedOptions } - fun invite(sender: Player, target: Player) { + private fun propose(sender: Player, target: Player) { val senderCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(sender.uniqueId) val targetCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(target.uniqueId) From 9ff4878bd8b6d8bad9e628d2c0f453fbc17dc0aa Mon Sep 17 00:00:00 2001 From: Axodouble Date: Sun, 29 Dec 2024 21:12:23 +0800 Subject: [PATCH 23/23] (untested) Added final sketch for adoption. --- .../java/com/ceraia/modules/MarriageModule.kt | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ceraia/modules/MarriageModule.kt b/src/main/java/com/ceraia/modules/MarriageModule.kt index 0872b99..70126f7 100644 --- a/src/main/java/com/ceraia/modules/MarriageModule.kt +++ b/src/main/java/com/ceraia/modules/MarriageModule.kt @@ -57,13 +57,60 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter propose(sender, target) } "adopt" -> { + if (args.isEmpty() || args.size < 2 || (args[0] != "parent" && args[0] != "kid")) { + sender.sendMessage(MiniMessage.miniMessage().deserialize("Usage: /adopt ")) + return true + } + + val target = plugin.server.getPlayer(args[1]) + + if (target == null) { + sender.sendMessage(MiniMessage.miniMessage().deserialize("Player not found")) + return true + } + if(args[0] == "parent") adopt(sender, target) else adopt(target, sender) } } return true } + private fun adopt(parent: Player, child: Player) { + if (adoptionRequests.containsKey(parent)) { + if (adoptionRequests[parent] == child) { + acceptAdoption(parent, child) + return + } + } + + adoptionRequests[child] = parent + plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( + "${parent.name} has invited ${child.name} to adopt them!" + )) + child.sendMessage(MiniMessage.miniMessage().deserialize( + "${parent.name} has invited you to adopt them! Click [here] to accept." + )) + } + + private fun acceptAdoption(parent: Player, child: Player) { + val parentCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(parent.uniqueId) + val childCeraiaPlayer = plugin.playerManager.getCeraiaPlayer(child.uniqueId) + + if (adoptionRequests[child] != parent) { + return + } + + plugin.server.sendMessage(MiniMessage.miniMessage().deserialize( + "${child.name} has accepted ${parent.name}'s adoption proposal!" + )) + + childCeraiaPlayer.addParent(parent.name) + parentCeraiaPlayer.addChild(child.name) + + adoptionRequests.remove(child) + } + override fun onTabComplete(sender: CommandSender, cmd: Command, label: String, args: Array): List { // Return all online players except the sender val tabOptions = Bukkit.getServer().onlinePlayers @@ -145,10 +192,6 @@ class MarriageModule(private val plugin: Ceraia) : CommandExecutor, TabCompleter )) } - private fun adoptParent(player: Player, parent: Player) { - - } - @EventHandler fun onPlayerQuit(event: PlayerQuitEvent) { proposals.remove(event.player)