From 4678cf5fdd55fca2b00e9f6f23108bb75bf89d7e Mon Sep 17 00:00:00 2001 From: DaTTV <104141141+DrFreezyYT@users.noreply.github.com> Date: Wed, 19 Feb 2025 17:31:13 +0100 Subject: [PATCH] Added Language manager (untested) --- .idea/discord.xml | 2 +- .../plugins/papermc/blazesmp/BlazeSMP.java | 5 + .../blazesmp/command/ClaimCommand.java | 19 +- .../papermc/blazesmp/command/ClanCommand.java | 554 +++++++----------- .../papermc/blazesmp/command/HomeCommand.java | 23 +- .../blazesmp/command/ReportCommand.java | 35 +- .../listener/ChunkInventoryManager.java | 62 +- .../listener/PlayerClaimListener.java | 36 +- .../PlayerCommandBlockerListener.java | 10 +- .../blazesmp/listener/PlayerJoinListener.java | 5 +- .../listener/PressurePlateListener.java | 11 +- .../papermc/blazesmp/module/manager/L4M4.java | 100 ++++ .../tasks/PlayerTeleportHomeTimer.java | 41 +- src/main/resources/storage/messages.json | 119 ++++ 14 files changed, 581 insertions(+), 441 deletions(-) create mode 100644 src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java create mode 100644 src/main/resources/storage/messages.json diff --git a/.idea/discord.xml b/.idea/discord.xml index 30bab2a..d8e9561 100644 --- a/.idea/discord.xml +++ b/.idea/discord.xml @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java index baeaced..f8d189b 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java @@ -8,6 +8,7 @@ import me.freezy.plugins.papermc.blazesmp.command.ReportCommand; import me.freezy.plugins.papermc.blazesmp.listener.*; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; import me.freezy.plugins.papermc.blazesmp.module.manager.Homes; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import me.freezy.plugins.papermc.blazesmp.module.manager.ProtectedBlocks; import me.freezy.plugins.papermc.blazesmp.tasks.PlayerNameUpdate; import org.bukkit.configuration.file.FileConfiguration; @@ -47,6 +48,10 @@ public final class BlazeSMP extends JavaPlugin { saveConfig(); this.log.info("Loaded config!"); + this.log.info("Loading L4M4..."); + L4M4.init(); + this.log.info("Loaded L4M4!"); + this.log.info("Loaded BlazeSMP!"); } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java index 70cd449..7efdf05 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java @@ -5,6 +5,7 @@ import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; import me.freezy.plugins.papermc.blazesmp.listener.ChunkInventoryManager; import me.freezy.plugins.papermc.blazesmp.module.Clan; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Chunk; import org.bukkit.command.Command; @@ -27,12 +28,12 @@ public class ClaimCommand extends SimpleCommand { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player player)) { - sender.sendMessage(MiniMessage.miniMessage().deserialize("You must be a player to use this command!")); + sender.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.not_a_player"))); return true; } UUID playerUUID = player.getUniqueId(); if (!clans.isInClan(playerUUID)) { - player.sendMessage(MiniMessage.miniMessage().deserialize("You must be in a clan to claim/unclaim chunks!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.not_in_clan"))); return true; } else { if (label.equalsIgnoreCase("claim")) { @@ -41,21 +42,21 @@ public class ClaimCommand extends SimpleCommand { return true; } Clan playerClan = clans.getClanByMember(playerUUID); - LinkedHashMap> existingClaims=clans.getClanChunks(playerClan); + LinkedHashMap> existingClaims = clans.getClanChunks(playerClan); if (!existingClaims.containsKey(playerUUID)) { existingClaims.put(playerUUID, new LinkedList<>()); } LinkedList playerClaims = existingClaims.get(playerUUID); int MAX_CLAIMS = 50; if (playerClaims.size() >= MAX_CLAIMS) { - player.sendMessage(MiniMessage.miniMessage().deserialize("You have reached the maximum amount of claims!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.max_claims_reached"))); } else { Chunk playerChunk = player.getLocation().getChunk(); if (clans.isChunkClaimed(playerChunk)) { - player.sendMessage(MiniMessage.miniMessage().deserialize("This chunk is already claimed!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_already_claimed"))); } else { playerClaims.add(playerChunk); - player.sendMessage(MiniMessage.miniMessage().deserialize("Claimed chunk!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("success.chunk_claimed"))); existingClaims.put(playerUUID, playerClaims); clans.setClanChunks(playerClan, existingClaims); playerClan.save(); @@ -65,19 +66,19 @@ public class ClaimCommand extends SimpleCommand { return true; } else if (label.equalsIgnoreCase("unclaim")) { Clan playerClan = clans.getClanByMember(playerUUID); - LinkedHashMap> existingClaims=clans.getClanChunks(playerClan); + LinkedHashMap> existingClaims = clans.getClanChunks(playerClan); if (existingClaims.containsKey(playerUUID)) { LinkedList playerClaims = existingClaims.get(playerUUID); Chunk playerChunk = player.getLocation().getChunk(); if (playerClaims.contains(playerChunk)) { playerClaims.remove(playerChunk); - player.sendMessage(MiniMessage.miniMessage().deserialize("Unclaimed chunk!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("success.chunk_unclaimed"))); existingClaims.put(playerUUID, playerClaims); clans.setClanChunks(playerClan, existingClaims); playerClan.save(); clans.saveAllClans(); } else { - player.sendMessage(MiniMessage.miniMessage().deserialize("You do not own this chunk!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_not_owned"))); } return true; } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java index de3627f..b11a1a9 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java @@ -4,7 +4,10 @@ import me.freezy.plugins.papermc.blazesmp.BlazeSMP; import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; import me.freezy.plugins.papermc.blazesmp.module.Clan; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; +import static net.kyori.adventure.text.minimessage.MiniMessage.miniMessage; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; @@ -17,12 +20,11 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -import static net.kyori.adventure.text.minimessage.MiniMessage.miniMessage; - public class ClanCommand extends SimpleCommand { + private final Clans clans; - // Mapping: Clan -> Liste der Join-Anfragen (Spieler, die einer bestehenden Clan beitreten möchten) + // Mapping: Clan -> Liste der Join-Anfragen (Spieler, die einem Clan beitreten möchten) private final LinkedHashMap> clanJoins = new LinkedHashMap<>(); // Mapping: Clan -> Liste der Einladungen (Spieler, die vom Clan eingeladen wurden) private final LinkedHashMap> clanInvites = new LinkedHashMap<>(); @@ -39,29 +41,27 @@ public class ClanCommand extends SimpleCommand { @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player player)) { - sender.sendMessage(miniMessage().deserialize("You must be a player to execute this command!")); + sender.sendMessage(miniMessage().deserialize(L4M4.get("error.not_a_player"))); return true; } UUID playerUUID = player.getUniqueId(); - // Keine Subcommands -> zeige Hilfe + // Keine Subcommands → Hilfe anzeigen if (args.length == 0) { sendHelpMessage(player, playerUUID); return true; } - // Verarbeitung der Unterbefehle String subCommand = args[0].toLowerCase(); switch (subCommand) { - // ========== CREATE ========== case "create" -> { if (clans.isInClan(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are already in a clan!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.already_in_clan"))); return true; } if (args.length < 3) { - player.sendMessage(miniMessage().deserialize("Usage: /clan create ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_create"))); return true; } String clanName = args[1]; @@ -69,73 +69,92 @@ public class ClanCommand extends SimpleCommand { Component tagComponent = miniMessage().deserialize(clanTag); Clan newClan = new Clan(clanName, tagComponent, playerUUID); - // Clan hinzufügen und speichern clans.addClan(newClan); newClan.save(); - - player.sendMessage(miniMessage().deserialize("Clan created successfully!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("success.clan_created"))); return true; } + + // ========== CHAT ========== case "chat" -> { if (!clans.isInClan(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not in a clan!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_in_clan_chat"))); return true; } Clan clan = clans.getClanByMember(playerUUID); if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan chat ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_chat"))); return true; } String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); + // Verwende den externen Chat-Format-String Component chatMessage = miniMessage().deserialize( - String.format("[Clan] %s: %s", player.getName(), message)); + String.format(L4M4.get("chat.format"), player.getName(), message) + ).decoration(TextDecoration.ITALIC, true); + player.sendMessage(chatMessage); + // Sende Nachricht an alle Clanmitglieder (außer Sender) for (UUID mem : clan.getMembers()) { + if (mem.equals(playerUUID)) continue; Player member = Bukkit.getPlayer(mem); if (member != null && member.isOnline()) { member.sendMessage(chatMessage); } } + // Zusätzlich Leader und Vice benachrichtigen + Player leader = Bukkit.getPlayer(clan.getLeaderUUID()); + if (leader != null && leader.isOnline() && !leader.getUniqueId().equals(playerUUID)) { + leader.sendMessage(chatMessage); + } + if (clan.getViceUUID() != null) { + Player vice = Bukkit.getPlayer(clan.getViceUUID()); + if (vice != null && vice.isOnline() && !vice.getUniqueId().equals(playerUUID)) { + vice.sendMessage(chatMessage); + } + } return true; } // ========== JOIN ========== case "join" -> { if (clans.isInClan(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are already in a clan!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.already_in_clan"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan join ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_join"))); return true; } String targetClanName = args[1]; Clan targetClan = clans.getClanByName(targetClanName); if (targetClan == null) { - player.sendMessage(miniMessage().deserialize("Clan not found!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } - clanJoins.computeIfAbsent(targetClan, k -> new LinkedList<>()); LinkedList joinRequests = clanJoins.get(targetClan); - if (joinRequests.contains(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You have already requested to join this clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.already_requested"))); return true; } joinRequests.add(playerUUID); player.sendMessage(miniMessage().deserialize( - String.format("Join request sent to clan %s!", targetClan.getName()))); - - // Benachrichtige den Clan-Leader (sofern online) + String.format(L4M4.get("success.join_request_sent"), targetClan.getName()) + )); + // Benachrichtige den Clan-Leader, sofern online Player leader = Bukkit.getPlayer(targetClan.getLeaderUUID()); if (leader != null && leader.isOnline()) { String acceptCommand = "/clan accept " + player.getName(); String denyCommand = "/clan deny " + player.getName(); - Component notifyMsg = miniMessage().deserialize( - String.format("New join request from %s.\n", player.getName()) - + String.format("[Accept] ", acceptCommand) - + String.format("[Deny]", denyCommand) - ); + String notifyText = String.format(L4M4.get("notification.invite"), targetClan.getName()); + Component notifyMsg = miniMessage().deserialize(notifyText) + .append(Component.text(" ")) + .append(miniMessage().deserialize( + "" + L4M4.get("button.accept") + "" + )) + .append(Component.text(" ")) + .append(miniMessage().deserialize( + "" + L4M4.get("button.deny") + "" + )); leader.sendMessage(notifyMsg); } return true; @@ -144,56 +163,66 @@ public class ClanCommand extends SimpleCommand { // ========== INVITE ========== case "invite" -> { if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not authorized to invite players to a clan!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_authorized_invite"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan invite ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_invite"))); return true; } String inviteeName = args[1]; Player invitee = Bukkit.getPlayer(inviteeName); if (invitee == null || !invitee.isOnline()) { - player.sendMessage(miniMessage().deserialize(String.format("Player %s is not online!", inviteeName))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.player_not_online"), inviteeName) + )); return true; } if (clans.isInClan(invitee.getUniqueId())) { - player.sendMessage(miniMessage().deserialize(String.format("%s is already in a clan!", inviteeName))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.player_already_in_clan"), inviteeName) + )); return true; } Clan inviterClan = clans.getClanByMember(playerUUID); if (inviterClan == null) { - player.sendMessage(miniMessage().deserialize("Error: Your clan could not be found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } clanInvites.computeIfAbsent(inviterClan, k -> new LinkedList<>()); LinkedList inviteList = clanInvites.get(inviterClan); - if (inviteList.contains(invitee.getUniqueId())) { - player.sendMessage(miniMessage().deserialize(String.format("Player %s has already been invited!", inviteeName))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.already_requested"), inviteeName) + )); return true; } inviteList.add(invitee.getUniqueId()); - player.sendMessage(miniMessage().deserialize(String.format("Invite sent to %s.", inviteeName))); - + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("success.invite_sent"), inviteeName) + )); // Benachrichtige den Eingeladenen String acceptCmd = "/clan accept " + inviterClan.getName(); String denyCmd = "/clan deny " + inviterClan.getName(); - Component inviteNotify = miniMessage().deserialize( - String.format("Invite from clan %s.\n", inviterClan.getName()) - + String.format("[Accept] ", acceptCmd) - + String.format("[Deny]", denyCmd) - ); + String inviteNotifyText = String.format(L4M4.get("notification.invite"), inviterClan.getName()); + Component inviteNotify = miniMessage().deserialize(inviteNotifyText) + .append(Component.text("\n")) + .append(miniMessage().deserialize( + "" + L4M4.get("button.accept") + "" + )) + .append(Component.text(" ")) + .append(miniMessage().deserialize( + "" + L4M4.get("button.deny") + "" + )); invitee.sendMessage(inviteNotify); return true; } // ========== ACCEPT ========== case "accept" -> { - // 1) Spieler ist noch in keinem Clan -> Einladung annehmen if (!clans.isInClan(playerUUID)) { if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan accept ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_accept"))); return true; } String clanNameForInvite = args[1]; @@ -206,57 +235,60 @@ public class ClanCommand extends SimpleCommand { } } if (invitedClan == null) { - player.sendMessage(miniMessage().deserialize(String.format("No invite found from clan %s.", clanNameForInvite))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.invite_not_found"), clanNameForInvite) + )); return true; } invitedClan.getMembers().add(playerUUID); clanInvites.get(invitedClan).remove(playerUUID); - player.sendMessage(miniMessage().deserialize( - String.format("You have joined the clan %s!", invitedClan.getName()))); - + String.format(L4M4.get("success.join_clan"), invitedClan.getName()) + )); Player leader = Bukkit.getPlayer(invitedClan.getLeaderUUID()); if (leader != null && leader.isOnline()) { leader.sendMessage(miniMessage().deserialize( - String.format("%s has accepted the clan invite.", player.getName()))); + String.format(L4M4.get("success.invite_accepted_notify"), player.getName()) + )); } invitedClan.save(); } else { - // 2) Spieler ist bereits in einem Clan -> Beitrittsanfrage annehmen (Leader/Vice) if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not authorized to accept join requests.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_authorized_accept"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan accept ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_accept_request"))); return true; } String joinRequesterName = args[1]; Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Error: Your clan could not be found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } LinkedList joinReqs = clanJoins.get(currentClan); if (joinReqs == null || joinReqs.isEmpty()) { - player.sendMessage(miniMessage().deserialize("No join requests available.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.no_join_requests"))); return true; } UUID requesterUUID = getUuidByName(joinReqs, joinRequesterName); if (requesterUUID == null) { - player.sendMessage(miniMessage().deserialize(String.format("No join request found from %s.", joinRequesterName))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.join_request_not_found"), joinRequesterName) + )); return true; } currentClan.getMembers().add(requesterUUID); joinReqs.remove(requesterUUID); - player.sendMessage(miniMessage().deserialize( - String.format("You have accepted %s's join request.", joinRequesterName))); - + String.format(L4M4.get("success.join_request_accepted"), joinRequesterName) + )); Player requester = Bukkit.getPlayer(requesterUUID); if (requester != null && requester.isOnline()) { requester.sendMessage(miniMessage().deserialize( - String.format("Your join request for clan %s has been accepted.", currentClan.getName()))); + String.format(L4M4.get("success.join_request_accepted_notify"), currentClan.getName()) + )); } currentClan.save(); } @@ -265,10 +297,9 @@ public class ClanCommand extends SimpleCommand { // ========== DENY ========== case "deny" -> { - // 1) Spieler ist noch in keinem Clan -> Einladung ablehnen if (!clans.isInClan(playerUUID)) { if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan deny ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_deny_invite"))); return true; } String clanNameForInvite = args[1]; @@ -281,53 +312,57 @@ public class ClanCommand extends SimpleCommand { } } if (invitedClan == null) { - player.sendMessage(miniMessage().deserialize(String.format("No invite found from clan %s.", clanNameForInvite))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.invite_not_found"), clanNameForInvite) + )); return true; } clanInvites.get(invitedClan).remove(playerUUID); player.sendMessage(miniMessage().deserialize( - String.format("You have declined the clan invite from %s.", invitedClan.getName()))); - + String.format(L4M4.get("error.invite_declined"), invitedClan.getName()) + )); Player leader = Bukkit.getPlayer(invitedClan.getLeaderUUID()); if (leader != null && leader.isOnline()) { leader.sendMessage(miniMessage().deserialize( - String.format("%s has declined the clan invite.", player.getName()))); + String.format(L4M4.get("error.invite_declined_notify"), player.getName()) + )); } } else { - // 2) Spieler ist in einem Clan -> Beitrittsanfrage ablehnen (Leader/Vice) if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not authorized to deny join requests.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_authorized_deny"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan deny ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_deny_request"))); return true; } String joinRequesterName = args[1]; Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Error: Your clan could not be found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } LinkedList joinReqs = clanJoins.get(currentClan); if (joinReqs == null || joinReqs.isEmpty()) { - player.sendMessage(miniMessage().deserialize("No join requests available.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.no_join_requests"))); return true; } UUID requesterUUID = getUuidByName(joinReqs, joinRequesterName); if (requesterUUID == null) { - player.sendMessage(miniMessage().deserialize(String.format("No join request found from %s.", joinRequesterName))); + player.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.join_request_not_found"), joinRequesterName) + )); return true; } joinReqs.remove(requesterUUID); - player.sendMessage(miniMessage().deserialize( - String.format("You have denied %s's join request.", joinRequesterName))); - + String.format(L4M4.get("error.join_request_denied"), joinRequesterName) + )); Player requester = Bukkit.getPlayer(requesterUUID); if (requester != null && requester.isOnline()) { requester.sendMessage(miniMessage().deserialize( - String.format("Your join request for clan %s has been denied.", currentClan.getName()))); + String.format(L4M4.get("error.join_request_denied_notify"), currentClan.getName()) + )); } } return true; @@ -335,24 +370,34 @@ public class ClanCommand extends SimpleCommand { // ========== LIST ========== case "list" -> { - // Zeige eine Liste aller existierenden Clans an - sendClanList(player); + Collection allClans = clans.getClans(); + if (allClans.isEmpty()) { + player.sendMessage(miniMessage().deserialize(L4M4.get("error.no_clans"))); + return true; + } + Component clanListComponent = miniMessage().deserialize("=== List of clans ===\n"); + for (Clan clan : allClans) { + clanListComponent = clanListComponent.append( + miniMessage().deserialize(String.format(" - %s\n", clan.getName())) + ); + } + clanListComponent = clanListComponent.append(miniMessage().deserialize("=====================")); + player.sendMessage(clanListComponent); return true; } // ========== INFO ========== case "info" -> { if (!clans.isInClan(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not in a clan!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_in_clan_info"))); return true; } Clan clan = clans.getClanByMember(playerUUID); if (clan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found_info"))); return true; } - // Sammle die Daten UUID leaderUUID = clan.getLeaderUUID(); UUID viceUUID = clan.getViceUUID(); List members = clan.getMembers(); @@ -366,64 +411,24 @@ public class ClanCommand extends SimpleCommand { viceName = (viceOffline.getName() != null) ? viceOffline.getName() : viceUUID.toString(); } - // Wir bauen den Info-Text in mehreren Component-Teilen auf - Component infoComponent = Component.empty(); + // Baue den Info-Text mithilfe der externen Message-Templates + Component infoComponent = Component.empty() + .append(miniMessage().deserialize(L4M4.get("info.header"))) + .append(miniMessage().deserialize(String.format(L4M4.get("info.uuid"), clan.getUuid()))) + .append(miniMessage().deserialize(String.format(L4M4.get("info.name"), clan.getName()))) + .append(miniMessage().deserialize(String.format(L4M4.get("info.leader"), leaderName))) + .append(miniMessage().deserialize(String.format(L4M4.get("info.vice"), viceName))) + .append(miniMessage().deserialize(String.format(L4M4.get("info.members_count"), members.size()))) + .append(miniMessage().deserialize(String.format(L4M4.get("info.tag"), miniMessage().serialize(clan.getTag())))) + .append(miniMessage().deserialize(L4M4.get("info.members_list_header"))); - // Header - Component l1 = miniMessage().deserialize("=== Clan info ===\n"); - // ID - Component l2 = miniMessage().deserialize(String.format( - " - ID: %s\n", - clan.getUuid() - )); - // Name - Component l3 = miniMessage().deserialize(String.format( - " - Name: %s\n", - clan.getName() - )); - // Leader - Component l4 = miniMessage().deserialize(String.format( - " - Leader: %s\n", - leaderName - )); - // Vice - Component l5 = miniMessage().deserialize(String.format( - " - Vice Leader: %s\n", - viceName - )); - // Member Count - Component l6 = miniMessage().deserialize(String.format( - " - Members: %d\n", - members.size() - )); - // Tag - Component l8 = miniMessage().deserialize(String.format( - " - Tag: %s\n", - miniMessage().serialize(clan.getTag()) - )); - // Member-Liste - Component l7 = miniMessage().deserialize("Members List:\n"); - - infoComponent = infoComponent - .append(l1).append(l2).append(l3) - .append(l4).append(l5).append(l6) - .append(l8).append(l7); - - // Detaillierte Auflistung der Mitglieder for (UUID mem : members) { OfflinePlayer off = Bukkit.getOfflinePlayer(mem); String name = off.getName() != null ? off.getName() : mem.toString(); - Component memberLine = miniMessage().deserialize(String.format( - " - Member: %s\n", - name - )); + Component memberLine = miniMessage().deserialize(String.format(L4M4.get("info.member_line"), name)); infoComponent = infoComponent.append(memberLine); } - - // Abschlusslinie - Component endLine = miniMessage().deserialize("====================="); - infoComponent = infoComponent.append(endLine); - + infoComponent = infoComponent.append(miniMessage().deserialize(L4M4.get("info.footer"))); player.sendMessage(infoComponent); return true; } @@ -431,49 +436,44 @@ public class ClanCommand extends SimpleCommand { // ========== KICK ========== case "kick" -> { if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not authorized to kick players.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_authorized_kick"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan kick ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_kick"))); return true; } Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } String targetName = args[1]; OfflinePlayer targetOffline = Bukkit.getOfflinePlayer(targetName); - if (targetOffline.getName() == null) { - player.sendMessage(miniMessage().deserialize("No such player found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.player_not_found"))); return true; } UUID targetUUID = targetOffline.getUniqueId(); - - // Check: Ist der Spieler im Clan? if (!currentClan.isMember(targetUUID)) { - player.sendMessage(miniMessage().deserialize(String.format("%s is not in your clan!", targetName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("error.player_not_in_clan"), targetName))); return true; } - // Vice kann keinen Leader kicken if (clans.isVice(playerUUID) && currentClan.isLeader(targetUUID)) { - player.sendMessage(miniMessage().deserialize("You cannot kick the clan leader!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.cannot_kick_leader"))); return true; } - - // Vice entfernen, falls der Gekickte Vice war if (currentClan.isVice(targetUUID)) { currentClan.setViceUUID(null); } currentClan.getMembers().remove(targetUUID); currentClan.save(); - - player.sendMessage(miniMessage().deserialize(String.format("You kicked %s from the clan.", targetName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("success.player_kicked"), targetName))); if (targetOffline.isOnline()) { Player targetOnline = (Player) targetOffline; - targetOnline.sendMessage(miniMessage().deserialize(String.format("You have been kicked from the clan %s.", currentClan.getName()))); + targetOnline.sendMessage(miniMessage().deserialize( + String.format(L4M4.get("error.player_kicked_notify"), currentClan.getName()) + )); } return true; } @@ -481,47 +481,42 @@ public class ClanCommand extends SimpleCommand { // ========== TRANSFER ========== case "transfer" -> { if (!clans.isLeader(playerUUID)) { - player.sendMessage(miniMessage().deserialize("Only the clan leader can transfer leadership.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.only_leader_transfer"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan transfer ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_transfer"))); return true; } Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } String newLeaderName = args[1]; OfflinePlayer newLeaderOffline = Bukkit.getOfflinePlayer(newLeaderName); if (newLeaderOffline.getName() == null) { - player.sendMessage(miniMessage().deserialize("No such player found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.player_not_found"))); return true; } UUID newLeaderUUID = newLeaderOffline.getUniqueId(); - if (!currentClan.isMember(newLeaderUUID)) { - player.sendMessage(miniMessage().deserialize(String.format("%s is not in your clan!", newLeaderName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("error.player_not_in_clan"), newLeaderName))); return true; } - - // Füge den alten Leader zur Members-Liste hinzu (falls nicht enthalten) if (!currentClan.getMembers().contains(playerUUID)) { currentClan.getMembers().add(playerUUID); } - // Setze neuen Leader currentClan.setLeaderUUID(newLeaderUUID); - // Falls Vice, entfernen if (currentClan.isVice(newLeaderUUID)) { currentClan.setViceUUID(null); } currentClan.save(); - - player.sendMessage(miniMessage().deserialize(String.format("You transferred leadership to %s.", newLeaderName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("success.leadership_transferred"), newLeaderName))); if (newLeaderOffline.isOnline()) { ((Player) newLeaderOffline).sendMessage(miniMessage().deserialize( - String.format("You are now the leader of the clan %s.", currentClan.getName()))); + String.format(L4M4.get("success.new_leader_notify"), currentClan.getName()) + )); } return true; } @@ -529,39 +524,41 @@ public class ClanCommand extends SimpleCommand { // ========== PROMOTE ========== case "promote" -> { if (!clans.isLeader(playerUUID)) { - player.sendMessage(miniMessage().deserialize("Only the clan leader can promote a member.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.only_leader_promote"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan promote ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_promote"))); return true; } Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } String promoteName = args[1]; OfflinePlayer promoteOffline = Bukkit.getOfflinePlayer(promoteName); - if (promoteOffline.getName() == null) { - player.sendMessage(miniMessage().deserialize("No such player found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.player_not_found"))); return true; } UUID promoteUUID = promoteOffline.getUniqueId(); - if (!currentClan.isMember(promoteUUID)) { - player.sendMessage(miniMessage().deserialize(String.format("%s is not in your clan!", promoteName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("error.player_not_in_clan"), promoteName))); return true; } - // Vice setzen + if (currentClan.isVice(promoteUUID)) { + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("error.already_vice"), promoteName))); + return true; + } + currentClan.getMembers().remove(promoteUUID); currentClan.setViceUUID(promoteUUID); currentClan.save(); - - player.sendMessage(miniMessage().deserialize(String.format("You promoted %s to vice leader.", promoteName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("success.promoted_to_vice"), promoteName))); if (promoteOffline.isOnline()) { ((Player) promoteOffline).sendMessage(miniMessage().deserialize( - String.format("You have been promoted to vice leader of clan %s.", currentClan.getName()))); + String.format(L4M4.get("success.promoted_notify"), currentClan.getName()) + )); } return true; } @@ -569,48 +566,43 @@ public class ClanCommand extends SimpleCommand { // ========== DEMOTE ========== case "demote" -> { if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not authorized to demote anyone.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_authorized_demote"))); return true; } if (args.length < 2) { - player.sendMessage(miniMessage().deserialize("Usage: /clan demote ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_demote"))); return true; } Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } String demoteName = args[1]; OfflinePlayer demoteOffline = Bukkit.getOfflinePlayer(demoteName); - if (demoteOffline.getName() == null) { - player.sendMessage(miniMessage().deserialize("No such player found.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.player_not_found"))); return true; } UUID demoteUUID = demoteOffline.getUniqueId(); - - // Check, ob der Spieler Vice ist if (!currentClan.isVice(demoteUUID)) { - player.sendMessage(miniMessage().deserialize(String.format("%s is not the vice leader!", demoteName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("error.not_vice"), demoteName))); return true; } - // Vice kann nur sich selbst demoten (oder Leader kann Vice demoten) if (!clans.isLeader(playerUUID) && !playerUUID.equals(demoteUUID)) { - player.sendMessage(miniMessage().deserialize("You can only demote yourself!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.only_self_demote"))); return true; } currentClan.setViceUUID(null); - // Sicherstellen, dass der Spieler in der Memberliste bleibt if (!currentClan.getMembers().contains(demoteUUID)) { currentClan.getMembers().add(demoteUUID); } currentClan.save(); - - player.sendMessage(miniMessage().deserialize(String.format("You demoted %s to a normal member.", demoteName))); + player.sendMessage(miniMessage().deserialize(String.format(L4M4.get("success.demoted"), demoteName))); if (demoteOffline.isOnline()) { ((Player) demoteOffline).sendMessage(miniMessage().deserialize( - String.format("You have been demoted to a normal member of clan %s.", currentClan.getName()))); + String.format(L4M4.get("error.demoted_notify"), currentClan.getName()) + )); } return true; } @@ -618,195 +610,104 @@ public class ClanCommand extends SimpleCommand { // ========== DISBAND ========== case "disband" -> { if (!clans.isLeader(playerUUID)) { - player.sendMessage(miniMessage().deserialize("Only the clan leader can disband the clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.only_leader_disband"))); return true; } Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } - - // Benachrichtige alle Mitglieder for (UUID memberUUID : currentClan.getMembers()) { Player memberOnline = Bukkit.getPlayer(memberUUID); if (memberOnline != null && memberOnline.isOnline()) { memberOnline.sendMessage(miniMessage().deserialize( - String.format("Your clan %s has been disbanded by the leader.", currentClan.getName()))); + String.format(L4M4.get("error.clan_disbanded_notify"), currentClan.getName()) + )); } } - // Clan entfernen clans.removeClan(currentClan); - player.sendMessage(miniMessage().deserialize("You have disbanded your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("success.clan_disbanded_leave"))); return true; } // ========== LEAVE ========== case "leave" -> { if (!clans.isInClan(playerUUID)) { - player.sendMessage(miniMessage().deserialize("You are not in a clan!")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.not_in_clan_info"))); return true; } Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } - - // Leader kann nicht einfach gehen, ohne disband oder transfer if (currentClan.isLeader(playerUUID)) { if (!currentClan.getMembers().isEmpty()) { - player.sendMessage(miniMessage().deserialize("You must transfer leadership or disband the clan before leaving.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.leader_cannot_leave"))); } else { - // Keine weiteren Mitglieder -> disband clans.removeClan(currentClan); - player.sendMessage(miniMessage().deserialize( - "You have disbanded your clan (no other members) and left.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("success.clan_disbanded_leave"))); } return true; } - // Vice -> Vice-Position freigeben if (currentClan.isVice(playerUUID)) { currentClan.setViceUUID(null); } currentClan.getMembers().remove(playerUUID); currentClan.save(); - player.sendMessage(miniMessage().deserialize( - String.format("You have left the clan %s.", currentClan.getName()))); + String.format(L4M4.get("success.left_clan"), currentClan.getName()) + )); return true; } - // ========== MODIFY (Name/Tag) ========== + // ========== MODIFY ========== case "modify" -> { if (!clans.isLeader(playerUUID)) { - player.sendMessage(miniMessage().deserialize("Only the clan leader can modify clan settings.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.only_leader_modify"))); return true; } if (args.length < 3) { - player.sendMessage(miniMessage().deserialize("Usage: /clan modify ")); + player.sendMessage(miniMessage().deserialize(L4M4.get("usage.clan_modify"))); return true; } String whatToModify = args[1].toLowerCase(); String newValue = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); - Clan currentClan = clans.getClanByMember(playerUUID); if (currentClan == null) { - player.sendMessage(miniMessage().deserialize("Could not find your clan.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.clan_not_found"))); return true; } - switch (whatToModify) { case "name" -> { currentClan.setName(newValue); currentClan.save(); - player.sendMessage(miniMessage().deserialize(String.format("Clan name changed to %s.", newValue))); + player.sendMessage(miniMessage().deserialize( + String.format("Clan name changed to %s.", newValue) + )); } case "tag" -> { Component newTag = miniMessage().deserialize(newValue); currentClan.setTag(newTag); currentClan.save(); - player.sendMessage(miniMessage().deserialize(String.format("Clan tag changed to %s.", newValue))); - } - default -> { - player.sendMessage(miniMessage().deserialize("You can only modify 'name' or 'tag'.")); + player.sendMessage(miniMessage().deserialize( + String.format("Clan tag changed to %s.", newValue) + )); } + default -> player.sendMessage(miniMessage().deserialize(L4M4.get("error.modify_invalid"))); } return true; } - // ========== Fallback für Unbekanntes ========== + // ========== Fallback ========== default -> { - player.sendMessage(miniMessage().deserialize("Unknown subcommand. Use /clan for help.")); + player.sendMessage(miniMessage().deserialize(L4M4.get("error.unknown_subcommand"))); return true; } } } - /** - * Zeigt eine Liste aller Clans auf dem Server an. - */ - private void sendClanList(Player player) { - // Hier nehmen wir an, dass 'clans.getClans()' alle existierenden Clans liefert. - Collection allClans = clans.getClans(); - if (allClans.isEmpty()) { - player.sendMessage(miniMessage().deserialize("No clans found!")); - return; - } - - Component clanListComponent = Component.empty(); - clanListComponent = clanListComponent.append( - miniMessage().deserialize("=== List of clans ===\n")); - - for (Clan clan : allClans) { - Component clanComponent = miniMessage().deserialize( - String.format(" - %s\n", clan.getName())); - clanListComponent = clanListComponent.append(clanComponent); - } - clanListComponent = clanListComponent.append( - miniMessage().deserialize("=====================")); - - player.sendMessage(clanListComponent); - } - - /** - * Hilfsfunktion: Zeigt eine übersichtliche Hilfe basierend auf der Rolle (Leader, Vice, Member, Kein-Mitglied). - */ - private void sendHelpMessage(Player player, UUID playerUUID) { - if (clans.isLeader(playerUUID)) { - Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); - Component l2 = miniMessage().deserialize(" - /clan info\n"); - Component l3 = miniMessage().deserialize(" - /clan invite\n"); - Component l4 = miniMessage().deserialize(" - /clan kick\n"); - Component l5 = miniMessage().deserialize(" - /clan transfer\n"); - Component l6 = miniMessage().deserialize(" - /clan promote\n"); - Component l7 = miniMessage().deserialize(" - /clan demote\n"); - Component l8 = miniMessage().deserialize(" - /clan disband\n"); - Component l9 = miniMessage().deserialize(" - /clan leave\n"); - Component l10 = miniMessage().deserialize(" - /clan accept\n"); - Component l11 = miniMessage().deserialize(" - /clan deny\n"); - Component l12 = miniMessage().deserialize(" - /clan modify\n"); - Component l13 = miniMessage().deserialize(" - /clan list\n"); - Component l14 = miniMessage().deserialize("====================="); - - player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5) - .append(l6).append(l7).append(l8).append(l9).append(l10).append(l11).append(l12).append(l13).append(l14)); - } else if (clans.isVice(playerUUID)) { - Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); - Component l2 = miniMessage().deserialize(" - /clan info\n"); - Component l3 = miniMessage().deserialize(" - /clan invite\n"); - Component l4 = miniMessage().deserialize(" - /clan kick\n"); - Component l5 = miniMessage().deserialize(" - /clan demote\n"); - Component l6 = miniMessage().deserialize(" - /clan leave\n"); - Component l7 = miniMessage().deserialize(" - /clan accept\n"); - Component l8 = miniMessage().deserialize(" - /clan deny\n"); - Component l9 = miniMessage().deserialize(" - /clan list\n"); - Component l10 = miniMessage().deserialize("====================="); - - player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5) - .append(l6).append(l7).append(l8).append(l9).append(l10)); - } else if (clans.isMember(playerUUID)) { - Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); - Component l2 = miniMessage().deserialize(" - /clan info\n"); - Component l3 = miniMessage().deserialize(" - /clan leave\n"); - Component l4 = miniMessage().deserialize(" - /clan list\n"); - Component l5 = miniMessage().deserialize("====================="); - - player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5)); - } else { - // Spieler ist in keinem Clan - Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); - Component l2 = miniMessage().deserialize(" - /clan create\n"); - Component l3 = miniMessage().deserialize(" - /clan join\n"); - Component l4 = miniMessage().deserialize(" - /clan accept\n"); - Component l5 = miniMessage().deserialize(" - /clan deny\n"); - Component l6 = miniMessage().deserialize(" - /clan list\n"); - Component l7 = miniMessage().deserialize("====================="); - - player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5).append(l6).append(l7)); - } - } - @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @@ -815,7 +716,6 @@ public class ClanCommand extends SimpleCommand { if (!(sender instanceof Player player)) return List.of(); UUID playerUUID = player.getUniqueId(); - // Erste Ebene der Subcommands if (args.length == 1) { if (clans.isLeader(playerUUID)) { return Stream.of("info", "chat", "invite", "kick", "transfer", "promote", @@ -839,7 +739,6 @@ public class ClanCommand extends SimpleCommand { } } - // Zweite Ebene if (args.length == 2) { if (clans.isLeader(playerUUID)) { switch (args[0].toLowerCase()) { @@ -862,12 +761,9 @@ public class ClanCommand extends SimpleCommand { case "demote" -> { Clan clan = clans.getClanByMember(playerUUID); if (clan == null || clan.getViceUUID() == null) return List.of(); - String viceName = Optional.ofNullable( - Bukkit.getOfflinePlayer(clan.getViceUUID()).getName()) + String viceName = Optional.ofNullable(Bukkit.getOfflinePlayer(clan.getViceUUID()).getName()) .orElse(clan.getViceUUID().toString()); - return viceName.startsWith(args[1]) - ? List.of(viceName) - : List.of(); + return viceName.startsWith(args[1]) ? List.of(viceName) : List.of(); } case "accept", "deny" -> { List joins = getClanJoinRequests(args, playerUUID); @@ -901,12 +797,9 @@ public class ClanCommand extends SimpleCommand { case "demote" -> { Clan clan = clans.getClanByMember(playerUUID); if (clan == null || clan.getViceUUID() == null) return List.of(); - String viceName = Optional.ofNullable( - Bukkit.getOfflinePlayer(clan.getViceUUID()).getName()) + String viceName = Optional.ofNullable(Bukkit.getOfflinePlayer(clan.getViceUUID()).getName()) .orElse(clan.getViceUUID().toString()); - return viceName.startsWith(args[1]) - ? List.of(viceName) - : List.of(); + return viceName.startsWith(args[1]) ? List.of(viceName) : List.of(); } case "accept", "deny" -> { List joins = getClanJoinRequests(args, playerUUID); @@ -917,7 +810,6 @@ public class ClanCommand extends SimpleCommand { } else { switch (args[0].toLowerCase()) { case "accept", "deny" -> { - // Zeige alle Clan-Einladungen an return clanInvites.entrySet().stream() .filter(entry -> entry.getValue().contains(playerUUID)) .map(entry -> entry.getKey().getName()) @@ -925,7 +817,6 @@ public class ClanCommand extends SimpleCommand { .collect(Collectors.toList()); } case "join" -> { - // Zeige alle Clans an return clans.getClans().stream() .map(Clan::getName) .filter(s -> s.startsWith(args[1])) @@ -939,15 +830,12 @@ public class ClanCommand extends SimpleCommand { } } - // Dritte Ebene (z. B. /clan modify name ) if (args.length == 3) { - if (clans.isLeader(playerUUID)) { - if (args[0].equalsIgnoreCase("modify")) { - if (args[1].equalsIgnoreCase("name")) { - return Collections.singletonList(""); - } else if (args[1].equalsIgnoreCase("tag")) { - return Collections.singletonList(""); - } + if (clans.isLeader(playerUUID) && args[0].equalsIgnoreCase("modify")) { + if (args[1].equalsIgnoreCase("name")) { + return Collections.singletonList(""); + } else if (args[1].equalsIgnoreCase("tag")) { + return Collections.singletonList(""); } } else if (args[0].equalsIgnoreCase("create")) { return Collections.singletonList(""); @@ -956,9 +844,6 @@ public class ClanCommand extends SimpleCommand { return List.of(); } - /** - * Liefert zu einem Namen die passende UUID aus einer UUID-Liste (z. B. Join-Anfragen). - */ @Nullable private UUID getUuidByName(List uuidList, String playerName) { for (UUID uuid : uuidList) { @@ -970,21 +855,28 @@ public class ClanCommand extends SimpleCommand { return null; } - /** - * Hilfsfunktion für Tab-Completion (Zeigt Spielernamen von Join-Anfragen). - */ @Nullable private List getClanJoinRequests(@NotNull String[] args, UUID playerUUID) { Clan clan = clans.getClanByMember(playerUUID); if (clan == null) return null; - LinkedList joins = clanJoins.get(clan); if (joins == null) return null; - return joins.stream() .map(uuid -> Bukkit.getOfflinePlayer(uuid).getName()) .filter(Objects::nonNull) .filter(name -> name.startsWith(args[1])) .collect(Collectors.toList()); } + + private void sendHelpMessage(Player player, UUID playerUUID) { + if (clans.isLeader(playerUUID)) { + player.sendMessage(miniMessage().deserialize(L4M4.get("help.leader"))); + } else if (clans.isVice(playerUUID)) { + player.sendMessage(miniMessage().deserialize(L4M4.get("help.vice"))); + } else if (clans.isMember(playerUUID)) { + player.sendMessage(miniMessage().deserialize(L4M4.get("help.member"))); + } else { + player.sendMessage(miniMessage().deserialize(L4M4.get("help.none"))); + } + } } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java index 3f16af0..f391184 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java @@ -3,6 +3,7 @@ package me.freezy.plugins.papermc.blazesmp.command; import me.freezy.plugins.papermc.blazesmp.BlazeSMP; import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; import me.freezy.plugins.papermc.blazesmp.module.manager.Homes; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import me.freezy.plugins.papermc.blazesmp.tasks.PlayerTeleportHomeTimer; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; @@ -14,6 +15,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public class HomeCommand extends SimpleCommand { + public HomeCommand() { super("home", List.of("sethome", "delhome")); } @@ -21,25 +23,34 @@ public class HomeCommand extends SimpleCommand { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player player)) { - sender.sendMessage(MiniMessage.miniMessage().deserialize("You must be a player to use this command!")); + sender.sendMessage(MiniMessage.miniMessage().deserialize( + L4M4.get("home.error.not_a_player") + )); return true; } Homes homes = BlazeSMP.getInstance().getHomes(); if (label.equalsIgnoreCase("sethome")) { homes.setHome(player); - player.sendMessage(MiniMessage.miniMessage().deserialize("Home set!")); + player.sendMessage(MiniMessage.miniMessage().deserialize( + L4M4.get("home.sethome.success") + )); } else if (label.equalsIgnoreCase("delhome")) { homes.removeHome(player); - player.sendMessage(MiniMessage.miniMessage().deserialize("Home removed!")); + player.sendMessage(MiniMessage.miniMessage().deserialize( + L4M4.get("home.delhome.success") + )); } else { if (homes.hasHome(player)) { - // Informiere den Spieler, dass der Teleport-Vorgang gestartet wird - player.sendMessage(MiniMessage.miniMessage().deserialize("Teleporting to home!")); + player.sendMessage(MiniMessage.miniMessage().deserialize( + L4M4.get("home.teleport.start") + )); new PlayerTeleportHomeTimer(player).runTaskTimer(BlazeSMP.getInstance(), 0, 1); } else { homes.setHome(player); - player.sendMessage(MiniMessage.miniMessage().deserialize("Home set!")); + player.sendMessage(MiniMessage.miniMessage().deserialize( + L4M4.get("home.sethome.success") + )); } } return true; diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ReportCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ReportCommand.java index bdb02b8..26e0f22 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ReportCommand.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ReportCommand.java @@ -2,6 +2,7 @@ package me.freezy.plugins.papermc.blazesmp.command; import me.freezy.plugins.papermc.blazesmp.BlazeSMP; import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; @@ -31,24 +32,25 @@ public class ReportCommand extends SimpleCommand { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player reporter)) { - sender.sendMessage(miniMessage.deserialize("Du darfst das nicht")); + sender.sendMessage(miniMessage.deserialize(L4M4.get("report.error.not_a_player"))); return true; } if (args.length < 2) { - sender.sendMessage(miniMessage.deserialize("Benutze bitte: /report ")); + reporter.sendMessage(miniMessage.deserialize(L4M4.get("report.usage"))); return true; } OfflinePlayer reportedPlayer = Bukkit.getOfflinePlayer(args[0]); if (!reportedPlayer.hasPlayedBefore() && !reportedPlayer.isOnline()) { - reporter.sendMessage(miniMessage.deserialize("Der Spieler existiert nicht oder war noch nie online!")); + reporter.sendMessage(miniMessage.deserialize(L4M4.get("report.error.invalid_player"))); return true; } String reason = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - reporter.sendMessage(miniMessage.deserialize(String.format("Du hast %s erfolgreich wegen %s gemeldet", reportedPlayer.getName(), reason))); + reporter.sendMessage(miniMessage.deserialize(String.format(L4M4.get("report.success.reported"), + reportedPlayer.getName(), reason))); sendReportToDiscord(reporter.getName(), reportedPlayer.getName(), reason, reporter.getUniqueId()); @@ -57,21 +59,20 @@ public class ReportCommand extends SimpleCommand { private void sendReportToDiscord(String reporter, String reported, String reason, UUID reporterUUID) { try { - String thumbnailUrl = "http://209.25.141.65:40018/v1/head/getHead/"; + String thumbnailUrl = L4M4.get("report.discord.thumbnail_url_base"); String jsonPayload = "{" - + "\"username\": \"ReportBot\"," + + "\"username\": \"" + L4M4.get("report.discord.username") + "\"," + "\"embeds\": [{" - + "\"title\": \"Neuer Report\"," - + "\"color\": 16711680," // Red color - + "\"thumbnail\": {\"url\": \"" + thumbnailUrl+reporterUUID.toString() + "\"}," // Thumbnail + + "\"title\": \"" + L4M4.get("report.discord.title") + "\"," + + "\"color\": 16711680," + + "\"thumbnail\": {\"url\": \"" + thumbnailUrl + reporterUUID.toString() + "\"}," + "\"fields\": [" - + "{\"name\": \"Reporter\", \"value\": \"" + reporter + "\", \"inline\": true}," - + "{\"name\": \"Gemeldeter Spieler\", \"value\": \"" + reported + "\", \"inline\": true}," - + "{\"name\": \"Grund\", \"value\": \"" + reason + "\", \"inline\": false}" + + "{\"name\": \"" + L4M4.get("report.discord.field.reporter") + "\", \"value\": \"" + reporter + "\", \"inline\": true}," + + "{\"name\": \"" + L4M4.get("report.discord.field.reported") + "\", \"value\": \"" + reported + "\", \"inline\": true}," + + "{\"name\": \"" + L4M4.get("report.discord.field.reason") + "\", \"value\": \"" + reason + "\", \"inline\": false}" + "]" + "}]" + "}"; - HttpURLConnection connection = getHttpURLConnection(jsonPayload); int responseCode = connection.getResponseCode(); @@ -82,13 +83,15 @@ public class ReportCommand extends SimpleCommand { } connection.disconnect(); } catch (Exception e) { - e.printStackTrace(); + BlazeSMP.getInstance().getLog().error("Failed to send report to Discord: {}", e.getMessage()); } } private static @NotNull HttpURLConnection getHttpURLConnection(String jsonPayload) throws IOException { String webhookUrl = BlazeSMP.getInstance().getConfig().getString("discord-report-webhook"); - assert webhookUrl != null; + if (webhookUrl == null) { + throw new IOException("Discord report webhook URL not set in config!"); + } URL url = new URL(webhookUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); @@ -112,4 +115,4 @@ public class ReportCommand extends SimpleCommand { } return List.of(); } -} \ No newline at end of file +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/ChunkInventoryManager.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/ChunkInventoryManager.java index de30f9b..f3437a2 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/ChunkInventoryManager.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/ChunkInventoryManager.java @@ -13,8 +13,6 @@ 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.InventoryCloseEvent; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; @@ -29,7 +27,9 @@ public class ChunkInventoryManager implements Listener { public static void openInv(Player player) { Clan clan = BlazeSMP.getInstance().getClans().getClanByMember(player.getUniqueId()); if (clan == null) { - player.sendMessage(MiniMessage.miniMessage().deserialize("Du bist in keinem Clan.")); + player.sendMessage(MiniMessage.miniMessage().deserialize( + me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.error.no_clan") + )); return; } new ChunkInventoryManager().chunksInv(player, clan); @@ -44,7 +44,7 @@ public class ChunkInventoryManager implements Listener { */ private void chunksInv(Player player, Clan clan) { // Erstelle eine Liste der Map-Einträge (Chunk -> Besitzer UUID) aus dem Clan - List> chunkEntries = new ArrayList<>(clan.getChunkOwnerMap().entrySet()); + List> chunkEntries = new ArrayList<>(clan.getChunkOwnerMap().entrySet()); int itemsPerPage = 45; // Plätze 0-44 für Items, untere Reihe für Navigation int totalPages = (int) Math.ceil(chunkEntries.size() / (double) itemsPerPage); int currentPage = 0; @@ -60,13 +60,15 @@ public class ChunkInventoryManager implements Listener { * @param currentPage Aktuelle Seite. * @param totalPages Gesamtzahl der Seiten. * @param itemsPerPage Items pro Seite (hier 45). - * @param clan Der Clan, dessen Chunks angezeigt werden. + * @param ignoredClan Der Clan, dessen Chunks angezeigt werden. */ - private void openChunksMenu(Player player, List> chunkEntries, + private void openChunksMenu(Player player, List> chunkEntries, int currentPage, int totalPages, int itemsPerPage, - Clan clan) { + Clan ignoredClan) { // Erstelle ein 54-Slot Inventar mit farbigem Titel (Adventure Component) - Component title = MiniMessage.miniMessage().deserialize("Clan Chunks"); + Component title = MiniMessage.miniMessage().deserialize( + me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.title") + ); Inventory inv = Bukkit.createInventory(null, 54, title); // Berechne Start- und Endindex für die aktuelle Seite @@ -84,7 +86,6 @@ public class ChunkInventoryManager implements Listener { ItemStack head = new ItemStack(Material.PLAYER_HEAD); SkullMeta skullMeta = (SkullMeta) head.getItemMeta(); skullMeta.setOwningPlayer(ownerPlayer); - // Titel als Component und dann in reinen Text umwandeln, falls nötig Component itemName = MiniMessage.miniMessage().deserialize("Chunk [" + chunk.getX() + ", " + chunk.getZ() + "]"); skullMeta.displayName(itemName); List lore = new ArrayList<>(); @@ -103,13 +104,17 @@ public class ChunkInventoryManager implements Listener { // Vorherige Seite (Slot 45) if (currentPage > 0) { ItemStack prev = new ItemStack(Material.ARROW); - prev.editMeta(meta -> meta.displayName(MiniMessage.miniMessage().deserialize("Previous Page"))); + prev.editMeta(meta -> meta.displayName(MiniMessage.miniMessage().deserialize( + me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.navigation.previous") + ))); inv.setItem(45, prev); } // Nächste Seite (Slot 53) if (currentPage < totalPages - 1) { ItemStack next = new ItemStack(Material.ARROW); - next.editMeta(meta -> meta.displayName(MiniMessage.miniMessage().deserialize("Next Page"))); + next.editMeta(meta -> meta.displayName(MiniMessage.miniMessage().deserialize( + me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.navigation.next") + ))); inv.setItem(53, next); } } @@ -118,38 +123,33 @@ public class ChunkInventoryManager implements Listener { player.openInventory(inv); } - // Listener für Inventarklicks mit Paper-Event (Adventure Components) @EventHandler public void onInventoryClick(InventoryClickEvent event) { if (!(event.getWhoClicked() instanceof Player player)) return; - // Verwende Paper's getView() um den Titel als Component zu erhalten Component invTitle = event.getView().title(); - Component expectedTitle = MiniMessage.miniMessage().deserialize("Clan Chunks"); - // Vergleiche die reinen Texte der Components + Component expectedTitle = MiniMessage.miniMessage().deserialize( + me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.title") + ); if (!PlainTextComponentSerializer.plainText().serialize(invTitle) .equals(PlainTextComponentSerializer.plainText().serialize(expectedTitle))) { return; } - event.setCancelled(true); // Standardverhalten verhindern + event.setCancelled(true); ItemStack clickedItem = event.getCurrentItem(); if (clickedItem == null || !clickedItem.hasItemMeta()) return; - // Holen des angezeigten Namens als reiner Text Component itemNameComp = clickedItem.getItemMeta().displayName(); - assert itemNameComp != null; + if (itemNameComp == null) return; String displayName = PlainTextComponentSerializer.plainText().serialize(itemNameComp); - // Hole den Clan des Spielers (angenommen, der Spieler ist in einem Clan) - me.freezy.plugins.papermc.blazesmp.module.Clan clan = BlazeSMP.getInstance().getClans().getClanByMember(player.getUniqueId()); + Clan clan = BlazeSMP.getInstance().getClans().getClanByMember(player.getUniqueId()); if (clan == null) return; - // Hole alle Einträge (Chunks) des Clans - List> chunkEntries = new ArrayList<>(clan.getChunkOwnerMap().entrySet()); + List> chunkEntries = new ArrayList<>(clan.getChunkOwnerMap().entrySet()); int itemsPerPage = 45; int totalPages = (int) Math.ceil(chunkEntries.size() / (double) itemsPerPage); int currentPage = paginatedData.getPage(player.getUniqueId()); - // Navigation behandeln if (displayName.contains("Previous Page")) { if (currentPage > 0) { currentPage--; @@ -163,26 +163,26 @@ public class ChunkInventoryManager implements Listener { openChunksMenu(player, chunkEntries, currentPage, totalPages, itemsPerPage, clan); } } else { - // Reagiere auf Klicks auf einzelne Chunk-Items - player.sendMessage(MiniMessage.miniMessage().deserialize("Du hast Chunk-Item: " + displayName + " angeklickt.")); + // Nutze den zentralen Nachrichtentext für Klicks + String msg = String.format( + me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.clicked"), + displayName + ); + player.sendMessage(MiniMessage.miniMessage().deserialize(msg)); } } - // Listener, um die gespeicherten Seiteninformationen aufzuräumen @EventHandler - public void onInventoryClose(InventoryCloseEvent event) { + public void onInventoryClose(org.bukkit.event.inventory.InventoryCloseEvent event) { if (!(event.getPlayer() instanceof Player player)) return; paginatedData.removePage(player.getUniqueId()); } @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { + public void onPlayerQuit(org.bukkit.event.player.PlayerQuitEvent event) { paginatedData.removePage(event.getPlayer().getUniqueId()); } - /** - * Hilfsklasse zur Verwaltung der aktuellen Seite pro Spieler. - */ private static class PaginatedData { private final Map playerPages = new HashMap<>(); diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java index a49a571..aac257d 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java @@ -3,7 +3,7 @@ package me.freezy.plugins.papermc.blazesmp.listener; import me.freezy.plugins.papermc.blazesmp.BlazeSMP; import me.freezy.plugins.papermc.blazesmp.module.Clan; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; -import net.kyori.adventure.text.Component; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -13,17 +13,12 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.inventory.Inventory; public class PlayerClaimListener implements Listener { - - Component title = MiniMessage.miniMessage().deserialize("Clan Chunks"); @EventHandler public void onBlockBreak(BlockBreakEvent event) { Location location = event.getBlock().getLocation(); @@ -108,25 +103,24 @@ public class PlayerClaimListener implements Listener { Clan oldClan = clans.getClanByChunk(fromChunk); Clan newClan = clans.getClanByChunk(toChunk); - if (oldClan != null && (!oldClan.equals(newClan))) { - player.sendActionBar( - MiniMessage.miniMessage().deserialize( - "You left the claim of " + oldClan.getName() + "!" - ) + // Falls der Spieler den Claim wechselt (verlassen) + if (oldClan != null && newClan != null && !oldClan.equals(newClan)) { + String msg = String.format( + L4M4.get("claim.entered"), + newClan.getName() ); + player.sendActionBar(MiniMessage.miniMessage().deserialize(msg)); } - if (newClan != null && (!newClan.equals(oldClan))) { - player.sendActionBar( - MiniMessage.miniMessage().deserialize( - "Territory of " + newClan.getName() + " - " + - Bukkit.getOfflinePlayer(newClan.getChunkOwnerMap().get(toChunk)).getName() + - "!" - ) + // Falls der Spieler in einen neuen Claim eintritt + if (newClan != null && !newClan.equals(oldClan)) { + String ownerName = Bukkit.getOfflinePlayer(newClan.getChunkOwnerMap().get(toChunk)).getName(); + String msg = String.format( + L4M4.get("claim.territory"), + newClan.getName(), + ownerName ); + player.sendActionBar(MiniMessage.miniMessage().deserialize(msg)); } - - - } } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerCommandBlockerListener.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerCommandBlockerListener.java index 878e469..2843b6a 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerCommandBlockerListener.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerCommandBlockerListener.java @@ -1,6 +1,7 @@ package me.freezy.plugins.papermc.blazesmp.listener; import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -203,11 +204,10 @@ public class PlayerCommandBlockerListener implements Listener { String message = event.getMessage(); if (isBlocked(message)) { event.setCancelled(true); - // Zeige den blockierten Befehl als Hinweis (hier der erste Teil der Nachricht) String blockedPart = message.split(" ")[0]; - player.sendMessage(MiniMessage.miniMessage().deserialize( - "Unknown or incomplete command, see below for error\n" + blockedPart + " <--[HERE]" - )); + // Nutze den zentralen Nachrichtentext aus messages.json + String msg = String.format(L4M4.get("command.blocked"), blockedPart); + player.sendMessage(MiniMessage.miniMessage().deserialize(msg)); } } @@ -218,8 +218,6 @@ public class PlayerCommandBlockerListener implements Listener { String buffer = event.getBuffer(); if (isBlocked(buffer)) { - // Alle Tab-Vorschläge entfernen und das Event abbrechen, - // wenn der eingegebene Befehl blockiert ist. event.getCompletions().clear(); event.setCancelled(true); } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerJoinListener.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerJoinListener.java index 9bc133f..40fd323 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerJoinListener.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerJoinListener.java @@ -1,6 +1,7 @@ package me.freezy.plugins.papermc.blazesmp.listener; import me.freezy.plugins.papermc.blazesmp.manager.PlayerManager; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -13,6 +14,8 @@ public class PlayerJoinListener implements Listener { Player player = event.getPlayer(); new PlayerManager().setPlayerTeam(player); - event.joinMessage(MiniMessage.miniMessage().deserialize("[+] ").append(player.teamDisplayName())); + // Verwende den zentral konfigurierten Join-Text aus der JSON-Datei + event.joinMessage(MiniMessage.miniMessage().deserialize(L4M4.get("player.join")) + .append(player.teamDisplayName())); } } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PressurePlateListener.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PressurePlateListener.java index a45a752..a293d62 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PressurePlateListener.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PressurePlateListener.java @@ -1,6 +1,7 @@ package me.freezy.plugins.papermc.blazesmp.listener; import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -39,8 +40,9 @@ public class PressurePlateListener implements Listener { config.getDouble("spawn-location.y", 200), config.getDouble("spawn-location.z", 0) ); - teleportMessage = config.getString("teleport-message", "§cYou need to wait 5 seconds to be teleported."); - teleportDelay = config.getLong("teleport-delay", 100L); // Default to 5 seconds (100 ticks) + // Verwende die zentrale Nachricht aus der messages.json + teleportMessage = L4M4.get("pressureplate.teleport"); + teleportDelay = 5*20L; // Default to 5 seconds (100 ticks) } @EventHandler @@ -68,8 +70,9 @@ public class PressurePlateListener implements Listener { @EventHandler public void onBlockBreak(BlockBreakEvent event) { - if (event.getBlock().getLocation().equals(pressurePlateLocation) && event.getBlock().getType() == Material.POLISHED_BLACKSTONE_PRESSURE_PLATE) { + if (event.getBlock().getLocation().equals(pressurePlateLocation) + && event.getBlock().getType() == Material.POLISHED_BLACKSTONE_PRESSURE_PLATE) { event.setCancelled(true); } } -} \ No newline at end of file +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java new file mode 100644 index 0000000..ece8289 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java @@ -0,0 +1,100 @@ +package me.freezy.plugins.papermc.blazesmp.module.manager; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.Map; +import java.util.logging.Logger; + +public class L4M4 { + private static final Logger LOGGER = Logger.getLogger("L4M4"); + private static final String MESSAGES_STORAGE_PATH = "plugins/BlazeSMP/storage/messages.json"; + + // Map zum Speichern der geladenen Nachrichten + private static Map messages; + + /** + * Initialisiert die messages.json und lädt anschließend die Nachrichten. + * Diese Methode muss vor der Verwendung von get() aufgerufen werden. + */ + public static void init() { + initializeMessages(); + loadMessages(); + } + + /** + * Initialisiert die messages.json. + * Falls die Datei nicht existiert, wird der Standardinhalt aus den Ressourcen geladen und gespeichert. + */ + private static void initializeMessages() { + File messagesFile = new File(MESSAGES_STORAGE_PATH); + if (!messagesFile.exists()) { + // Erstelle die notwendigen Verzeichnisse + if (messagesFile.getParentFile() != null && !messagesFile.getParentFile().exists()) { + if (messagesFile.getParentFile().mkdirs()) { + LOGGER.info("Verzeichnis für messages.json erstellt: " + messagesFile.getParentFile().getAbsolutePath()); + } else { + LOGGER.severe("Fehler beim Erstellen des Verzeichnisses für messages.json: " + messagesFile.getParentFile().getAbsolutePath()); + return; + } + } + // Lade die Ressource als Stream + try (InputStream in = L4M4.class.getClassLoader().getResourceAsStream("storage/messages.json")) { + if (in == null) { + LOGGER.severe("Resource 'storage/messages.json' nicht gefunden!"); + return; + } + // Kopiere den Inhalt der Ressource in die Zieldatei + Files.copy(in, messagesFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + LOGGER.info("Default messages.json wurde kopiert nach: " + MESSAGES_STORAGE_PATH); + } catch (IOException e) { + LOGGER.severe("Fehler beim Kopieren der Default messages.json: " + e.getMessage()); + } + } else { + LOGGER.info("messages.json existiert bereits unter: " + MESSAGES_STORAGE_PATH); + } + } + + /** + * Lädt die messages.json in ein Map. + */ + private static void loadMessages() { + File messagesFile = new File(MESSAGES_STORAGE_PATH); + if (!messagesFile.exists()) { + LOGGER.severe("messages.json Datei nicht gefunden beim Laden."); + return; + } + try (Reader reader = new FileReader(messagesFile)) { + Gson gson = new Gson(); + messages = gson.fromJson(reader, new TypeToken>() {}.getType()); + LOGGER.info("messages.json wurde erfolgreich geladen."); + } catch (IOException e) { + LOGGER.severe("Fehler beim Laden von messages.json: " + e.getMessage()); + } + } + + /** + * Gibt den Wert zum gegebenen Schlüssel zurück. + * + * @param key der Schlüssel + * @return der Wert, falls vorhanden, ansonsten null. + */ + public static String get(String key) { + if (messages == null) { + LOGGER.warning("Messages wurden nicht geladen. Bitte init() aufrufen."); + return "404 not found"; + } + String value = messages.get(key); + if (value == null) { + LOGGER.warning("Key '" + key + "' nicht in messages.json gefunden."); + } + return value; + } +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java index a552600..0b320ba 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java @@ -1,6 +1,7 @@ package me.freezy.plugins.papermc.blazesmp.tasks; import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Location; import org.bukkit.Particle; @@ -17,6 +18,7 @@ public class PlayerTeleportHomeTimer extends BukkitRunnable { // Felder für den Spiraleneffekt private double angle = 0; + private double yOffset = 0; public PlayerTeleportHomeTimer(Player player) { this.player = player; @@ -32,36 +34,45 @@ public class PlayerTeleportHomeTimer extends BukkitRunnable { if (player.getLocation().getX() != origX || player.getLocation().getY() != origY || player.getLocation().getZ() != origZ) { - player.sendMessage(MiniMessage.miniMessage().deserialize("Teleporting cancelt you moved!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("teleport.cancelled"))); cancel(); return; } - // Berechne, wie viele Ticks bereits vergangen sind - int ticksElapsed = (5 * 20) - ticksRemaining; - - // Erzeuge den Spiraleneffekt Location baseLoc = player.getLocation(); double radius = 1.5; - double offsetX = Math.cos(angle) * radius; - double offsetZ = Math.sin(angle) * radius; - // Inkrementiere den Y-Wert, sodass die Spirale nach oben steigt - double offsetY = 0.2 + ticksElapsed * 0.05; - Location particleLoc = baseLoc.clone().add(offsetX, offsetY, offsetZ); - player.getWorld().spawnParticle(Particle.FLAME, particleLoc, 1, 0, 0, 0, 0); - // Erhöhe den Winkel schneller, sodass sich die Spirale schneller dreht + // Schleife für einen schnelleren Effekt: Mehrere Partikel pro Tick + // Basis-Inkrement des Winkels double angleIncrement = Math.PI / 4; - angle += angleIncrement; + for (int i = 0; i < 3; i++) { + double currentAngle = angle + (i * angleIncrement); + double offsetX = Math.cos(currentAngle) * radius; + double offsetZ = Math.sin(currentAngle) * radius; + // Verwende yOffset für die vertikale Verschiebung und setze zurück, wenn er über 2 liegt + double currentYOffset = yOffset; + if (currentYOffset > 2) { + currentYOffset = 0; + } + Location particleLoc = baseLoc.clone().add(offsetX, currentYOffset, offsetZ); + player.getWorld().spawnParticle(Particle.FLAME, particleLoc, 1, 0, 0, 0, 0); + } + + // Erhöhe den globalen Winkel und yOffset für den nächsten Tick + angle += angleIncrement * 3; // da 3 Partikel pro Tick + yOffset += 0.05 * 3; + if (yOffset > 2) { + yOffset = 0; + } // Teleport-Countdown und Nachrichten if (ticksRemaining <= 0) { player.teleportAsync(BlazeSMP.getInstance().getHomes().getHome(player)); - player.sendMessage(MiniMessage.miniMessage().deserialize("Teleported!")); + player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("teleport.success"))); cancel(); } else if (ticksRemaining % 20 == 0) { int secondsLeft = ticksRemaining / 20; - String message = String.format("Teleporting to home in %s seconds!", secondsLeft); + String message = String.format(L4M4.get("teleport.countdown"), secondsLeft); player.sendMessage(MiniMessage.miniMessage().deserialize(message)); } diff --git a/src/main/resources/storage/messages.json b/src/main/resources/storage/messages.json new file mode 100644 index 0000000..d6306c0 --- /dev/null +++ b/src/main/resources/storage/messages.json @@ -0,0 +1,119 @@ +{ + "error.not_a_player": "You must be a player to execute this command!", + "error.already_in_clan": "You are already in a clan!", + "usage.clan_create": "Usage: /clan create ", + "success.clan_created": "Clan created successfully!", + "usage.clan_chat": "Usage: /clan chat ", + "error.not_in_clan_chat": "You are not in a clan!", + "usage.clan_join": "Usage: /clan join ", + "error.clan_not_found": "Clan not found!", + "error.already_requested": "You have already requested to join this clan.", + "success.join_request_sent": "Join request sent to clan %s!", + "error.player_not_online": "Player %s is not online!", + "error.player_already_in_clan": "%s is already in a clan!", + "success.invite_sent": "Invite sent to %s.", + "notification.invite": "Invite from clan %s.", + "button.accept": "[Accept]", + "button.deny": "[Deny]", + "usage.clan_invite": "Usage: /clan invite ", + "error.not_authorized_invite": "You are not authorized to invite players to a clan!", + "usage.clan_accept": "Usage: /clan accept ", + "error.invite_not_found": "No invite found from clan %s.", + "success.join_clan": "You have joined the clan %s!", + "success.invite_accepted_notify": "%s has accepted the clan invite.", + "usage.clan_accept_request": "Usage: /clan accept ", + "error.no_join_requests": "No join requests available.", + "error.join_request_not_found": "No join request found from %s.", + "success.join_request_accepted": "You have accepted %s's join request.", + "success.join_request_accepted_notify": "Your join request for clan %s has been accepted.", + "usage.clan_deny_invite": "Usage: /clan deny ", + "error.invite_declined": "You have declined the clan invite from %s.", + "error.invite_declined_notify": "%s has declined the clan invite.", + "usage.clan_deny_request": "Usage: /clan deny ", + "error.join_request_denied": "You have denied %s's join request.", + "error.join_request_denied_notify": "Your join request for clan %s has been denied.", + "error.no_clans": "No clans found!", + "error.not_in_clan_info": "You are not in a clan!", + "error.clan_not_found_info": "Could not find your clan.", + "error.not_authorized_kick": "You are not authorized to kick players.", + "usage.clan_kick": "Usage: /clan kick ", + "error.player_not_found": "No such player found.", + "error.player_not_in_clan": "%s is not in your clan!", + "error.cannot_kick_leader": "You cannot kick the clan leader!", + "success.player_kicked": "You kicked %s from the clan.", + "error.player_kicked_notify": "You have been kicked from the clan %s.", + "error.only_leader_transfer": "Only the clan leader can transfer leadership.", + "usage.clan_transfer": "Usage: /clan transfer ", + "success.leadership_transferred": "You transferred leadership to %s.", + "success.new_leader_notify": "You are now the leader of the clan %s.", + "error.only_leader_promote": "Only the clan leader can promote a member.", + "usage.clan_promote": "Usage: /clan promote ", + "error.already_vice": "%s is already the vice!", + "success.promoted_to_vice": "You promoted %s to vice leader.", + "success.promoted_notify": "You have been promoted to vice leader of clan %s.", + "error.not_authorized_demote": "You are not authorized to demote anyone.", + "usage.clan_demote": "Usage: /clan demote ", + "error.not_vice": "%s is not the vice leader!", + "error.only_self_demote": "You can only demote yourself!", + "success.demoted": "You demoted %s to a normal member.", + "error.demoted_notify": "You have been demoted to a normal member of clan %s.", + "error.only_leader_disband": "Only the clan leader can disband the clan.", + "error.leader_cannot_leave": "You must transfer leadership or disband the clan before leaving.", + "success.clan_disbanded_leave": "You have disbanded your clan (no other members) and left.", + "success.left_clan": "You have left the clan %s.", + "error.only_leader_modify": "Only the clan leader can modify clan settings.", + "usage.clan_modify": "Usage: /clan modify ", + "error.modify_invalid": "You can only modify 'name' or 'tag'.", + "error.unknown_subcommand": "Unknown subcommand. Use /clan for help.", + "error.clan_disbanded_notify": "Your clan %s has been disbanded by the leader.", + "help.leader": "=== Clan Commands ===\n- /clan info\n- /clan invite\n- /clan kick\n- /clan transfer\n- /clan promote\n- /clan demote\n- /clan disband\n- /clan leave\n- /clan accept\n- /clan deny\n- /clan modify\n- /clan list\n=====================", + "help.vice": "=== Clan Commands ===\n- /clan info\n- /clan invite\n- /clan kick\n- /clan demote\n- /clan leave\n- /clan accept\n- /clan deny\n- /clan list\n=====================", + "help.member": "=== Clan Commands ===\n- /clan info\n- /clan leave\n- /clan list\n=====================", + "help.none": "=== Clan Commands ===\n- /clan create\n- /clan join\n- /clan accept\n- /clan deny\n- /clan list\n=====================", + + "chat.format": "[Clan] %s: %s", + + "info.header": "=== Clan info ===\n", + "info.uuid": " - ID: %s\n", + "info.name": " - Name: %s\n", + "info.leader": " - Leader: %s\n", + "info.vice": " - Vice Leader: %s\n", + "info.members_count": " - Members: %d\n", + "info.tag": " - Tag: %s\n", + "info.members_list_header": "Members List:\n", + "info.member_line": " - Member: %s\n", + "info.footer": "=====================", + + "home.error.not_a_player": "You must be a player to use this command!", + "home.sethome.success": "Home set!", + "home.delhome.success": "Home removed!", + "home.teleport.start": "Teleporting to home!", + + "report.error.not_a_player": "Du darfst das nicht", + "report.usage": "Benutze bitte: /report ", + "report.error.invalid_player": "Der Spieler existiert nicht oder war noch nie online!", + "report.success.reported": "Du hast %s erfolgreich wegen %s gemeldet", + "report.discord.username": "ReportBot", + "report.discord.title": "Neuer Report", + "report.discord.thumbnail_url_base": "http://209.25.141.65:40018/v1/head/getHead/", + "report.discord.field.reporter": "Reporter", + "report.discord.field.reported": "Gemeldeter Spieler", + "report.discord.field.reason": "Grund", + + "chunk.error.no_clan": "You are not in a clan!", + "chunk.title": "Clan Chunks", + "chunk.navigation.previous": "Previous Page", + "chunk.navigation.next": "Next Page", + "chunk.clicked": "You clicked on Chunk item: %s.", + + "claim.entered": "You entered the claim of %s!", + "claim.territory": "Territory of %s - %s!", + + "command.blocked": "Unknown or incomplete command, see below for error\n%s <--[HERE]", + "player.join": "[+] ", + + "pressureplate.teleport": "You need to wait 5 seconds to be teleported.", + "teleport.cancelled": "Teleporting cancelled, you moved!", + "teleport.success": "Teleported!", + "teleport.countdown": "Teleporting to home in %s seconds!" +}