diff --git a/pom.xml b/pom.xml index fec0062..975da2a 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,36 @@ + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + + dev.dejvokep.boostedyaml.* + xyz.soukup.boostedYaml + + + + + + package + + shade + + + + + dev.dejvokep:boosted-yaml + + dev.dejvokep:boosted-yaml-spigot + + + + + + @@ -160,5 +190,10 @@ 3.4.0-SNAPSHOT provided + + dev.dejvokep + boosted-yaml + 1.3.5 + diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java b/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java index 3384213..425948a 100644 --- a/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java +++ b/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java @@ -8,13 +8,25 @@ import com.velocitypowered.api.event.EventManager; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import dev.dejvokep.boostedyaml.YamlDocument; import org.slf4j.Logger; import xyz.soukup.ecocraftVelocity.chat.DirectMessages; import xyz.soukup.ecocraftVelocity.chat.GlobalChat; import xyz.soukup.ecocraftVelocity.chat.JoinLeaveMessages; +import xyz.soukup.ecocraftVelocity.chat.ReplyCommand; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; +import xyz.soukup.ecocraftVelocity.motd.MotdRequestEvent; import xyz.soukup.ecocraftVelocity.tab.GlobalTab; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + @Plugin(id = "ecocraftvelocity", name = "EcocraftVelocity", version = "1.0-SNAPSHOT") public class EcocraftVelocity { @@ -24,29 +36,76 @@ public class EcocraftVelocity { @Inject private ProxyServer server; + @Inject + @DataDirectory + private Path dataDirectory; + + private YamlDocument config; + private YamlDocument lang; + private LangManager langManager; + @Subscribe public void onProxyInitialization(ProxyInitializeEvent event) { logger.info("Startujeme!"); + setupConfigs(); + loadResources(); registerEvents(); registerCommands(); } -; + private void registerEvents(){ EventManager eventManager = server.getEventManager(); - eventManager.register(this, new GlobalChat(server)); - eventManager.register(this, new GlobalTab(server)); - eventManager.register(this, new JoinLeaveMessages(server)); + eventManager.register(this, new GlobalChat(server, langManager)); + eventManager.register(this, new GlobalTab(server, langManager)); + eventManager.register(this, new JoinLeaveMessages(server, langManager)); + eventManager.register(this, new MotdRequestEvent(langManager, dataDirectory)); } private void registerCommands(){ - CommandManager commandManager = server.getCommandManager(); + registerCommand("msg", new DirectMessages(server, langManager).command()); + registerCommand("r", new ReplyCommand(langManager).command(server)); + } - CommandMeta commandMeta = commandManager.metaBuilder("msg") + private void registerCommand(String name, BrigadierCommand command){ + CommandManager commandManager = server.getCommandManager(); + CommandMeta commandMeta = commandManager.metaBuilder(name) .plugin(this) .build(); - BrigadierCommand commandToRegister = DirectMessages.messageCommand(server); + commandManager.register(commandMeta, command); + } + + private void setupConfigs(){ + try { + config = YamlDocument.create(new File(dataDirectory.toFile(), "config.yml"), Objects.requireNonNull(this.getClass().getResourceAsStream("/config.yml"))); + lang = YamlDocument.create(new File(dataDirectory.toFile(), "messages.yml"), Objects.requireNonNull(this.getClass().getResourceAsStream("/messages.yml"))); + langManager = new LangManager(lang); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - commandManager.register(commandMeta, commandToRegister); + private void loadResources(){ + loadResource("server-icon.png"); } + + private void loadResource(String relativePath){ + try { + Path target = dataDirectory.resolve(relativePath); + + if (Files.exists(target)) { + return; + } + + Files.createDirectories(dataDirectory); + InputStream in = getClass().getClassLoader().getResourceAsStream(relativePath); + + assert in != null; + Files.copy(in, target); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java b/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java index c231eea..90a5766 100644 --- a/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java @@ -12,32 +12,42 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; +import xyz.soukup.ecocraftVelocity.configuration.Replace; import java.util.Optional; import java.util.concurrent.CompletableFuture; public class DirectMessages { - public static BrigadierCommand messageCommand(final ProxyServer proxy) { + + private final ProxyServer proxy; + private final LangManager langManager; + + public DirectMessages(ProxyServer proxyServer, LangManager langManager) { + this.proxy = proxyServer; + this.langManager = langManager; + } + + public BrigadierCommand command() { LiteralCommandNode msg = BrigadierCommand.literalArgumentBuilder("msg") .then(BrigadierCommand.requiredArgumentBuilder("player", StringArgumentType.word()) - .suggests((ctx, builder) -> playerSuggestor(proxy, ctx, builder)) + .suggests(this::playerSuggestor) .then(BrigadierCommand.requiredArgumentBuilder("message", StringArgumentType.greedyString()) - .executes((ctx) -> sendDirectMessage(proxy, ctx))) + .executes(this::sendDirectMessage)) ) .build(); return new BrigadierCommand(msg); } - private static CompletableFuture playerSuggestor(ProxyServer proxy, CommandContext ctx, SuggestionsBuilder builder) { + private CompletableFuture playerSuggestor( CommandContext ctx, SuggestionsBuilder builder) { proxy.getAllPlayers().forEach(player -> { builder.suggest(player.getUsername()); }); return builder.buildFuture(); } - private static int sendDirectMessage(ProxyServer proxy, CommandContext context) { + private int sendDirectMessage(CommandContext context) { String playerName = context.getArgument("player", String.class); String message = context.getArgument("message", String.class); MiniMessage mm = MiniMessage.miniMessage(); @@ -48,24 +58,25 @@ public class DirectMessages { if (playerOptional.isEmpty()){ sender.sendMessage(mm.deserialize("Není online.")); - return Command.SINGLE_SUCCESS; + return 1; } - String senderFormat = "
Klikni pro odepsání\">" + - "" + - ": "; + Component senderMessage = langManager.get("chat-format.direct.sender", + new Replace("msg", message, sender.hasPermission("ecocraft.chat.formatting")), + new Replace("name", playerName)); - sender.sendMessage(mm.deserialize(senderFormat, Placeholder.unparsed("msg", message), Placeholder.unparsed("name", playerName))); + sender.sendMessage(senderMessage); proxy.getPlayer(playerName).ifPresent(player -> { - String receiverFormat = "
Klikni pro odepsání\">" + - " já" + - ": "; - player.sendMessage(mm.deserialize(receiverFormat, Placeholder.unparsed("msg", message), Placeholder.unparsed("name", sender.getUsername()))); + Component receiverMessage = langManager.get("chat-format.direct.receiver", + new Replace("msg", message, sender.hasPermission("ecocraft.chat.formatting")), + new Replace("name", sender.getUsername())); + player.sendMessage(receiverMessage); + ReplyCommand.addRecipient(player, sender); } ); return Command.SINGLE_SUCCESS; diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/chat/GlobalChat.java b/src/main/java/xyz/soukup/ecocraftVelocity/chat/GlobalChat.java index 1e33b60..2c0c3ae 100644 --- a/src/main/java/xyz/soukup/ecocraftVelocity/chat/GlobalChat.java +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/GlobalChat.java @@ -5,16 +5,17 @@ import com.velocitypowered.api.event.player.PlayerChatEvent; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; +import xyz.soukup.ecocraftVelocity.configuration.Replace; public class GlobalChat { private final ProxyServer server; - private final MiniMessage miniMessage = MiniMessage.miniMessage(); + private final LangManager langManager; - public GlobalChat(ProxyServer server){ + public GlobalChat(ProxyServer server, LangManager langManager){ this.server = server; + this.langManager = langManager; } @Subscribe @@ -22,29 +23,21 @@ public class GlobalChat { //noinspection deprecation event.setResult(PlayerChatEvent.ChatResult.denied()); - String message = event.getMessage(); + String text = event.getMessage(); Player player = event.getPlayer(); - server.sendMessage(prepareMessageComponent(message, player)); - - + Component message = langManager.get( + "chat-format.player-message", + new Replace("name", player.getUsername()), + new Replace("msg", text, player.hasPermission("ecocraft.chat.formatting")) + ); + server.sendMessage(message); - } - private static Component prepareMessageComponent(String text, Player player){ - final MiniMessage miniMessage = MiniMessage.miniMessage(); - String format = "
Klikni pro napsání hráči'> >" + - "" + - ": "; - - return miniMessage.deserialize( - format, - Placeholder.parsed("name", player.getUsername()), - Placeholder.unparsed("msg", text) - ); } + } diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/chat/JoinLeaveMessages.java b/src/main/java/xyz/soukup/ecocraftVelocity/chat/JoinLeaveMessages.java index ab153cd..c0200e7 100644 --- a/src/main/java/xyz/soukup/ecocraftVelocity/chat/JoinLeaveMessages.java +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/JoinLeaveMessages.java @@ -7,32 +7,31 @@ import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.proxy.ProxyServer; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; +import xyz.soukup.ecocraftVelocity.configuration.Replace; public class JoinLeaveMessages { private final ProxyServer server; - private final MiniMessage miniMessage = MiniMessage.miniMessage(); + private final LangManager langManager; - public JoinLeaveMessages(ProxyServer server){ + public JoinLeaveMessages(ProxyServer server, LangManager langManager){ this.server = server; + this.langManager = langManager; } @Subscribe public void onJoin(LoginEvent event){ String name = event.getPlayer().getUsername(); - String messageFormat = "[+] "; - - server.sendMessage(miniMessage.deserialize(messageFormat, Placeholder.parsed("name", name))); + server.sendMessage(langManager.get("chat-format.join", new Replace("name", name))); } @Subscribe public void onLeave(DisconnectEvent event){ String name = event.getPlayer().getUsername(); - String messageFormat = "[-] "; - - server.sendMessage(miniMessage.deserialize(messageFormat, Placeholder.parsed("name", name))); + server.sendMessage(langManager.get("chat-format.leave", new Replace("name", name))); } } diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/chat/Recipients.java b/src/main/java/xyz/soukup/ecocraftVelocity/chat/Recipients.java new file mode 100644 index 0000000..65c8b4c --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/Recipients.java @@ -0,0 +1,55 @@ +package xyz.soukup.ecocraftVelocity.chat; + +import com.velocitypowered.api.proxy.Player; + +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Recipients { + HashMap recipients; + + public Recipients() { + this.recipients = new HashMap<>(); + } + + public void add(Player player){ + recipients.put(player, Instant.now()); + } + + + public List getPlayers(){ + List players = new ArrayList<>(); + Instant lastEligibleInstant = Instant.now().minus(Duration.ofMinutes(5)); + + recipients.forEach((player, date) -> { + if (date.isBefore(lastEligibleInstant) || !player.isActive()){ + recipients.remove(player); + }else { + players.add(player); + } + }); + + return players; + } + + public List getUsernames(){ + List usernames = new ArrayList<>(); + + for (Player player : getPlayers()){ + usernames.add(player.getUsername()); + } + + return usernames; + } + + public int count(){ + return getPlayers().size(); + } + + public Player getFirst(){ + return getPlayers().get(0); + } +} diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/chat/ReplyCommand.java b/src/main/java/xyz/soukup/ecocraftVelocity/chat/ReplyCommand.java index 559b8bf..3ebe9f9 100644 --- a/src/main/java/xyz/soukup/ecocraftVelocity/chat/ReplyCommand.java +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/ReplyCommand.java @@ -1,6 +1,5 @@ package xyz.soukup.ecocraftVelocity.chat; -import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.tree.LiteralCommandNode; @@ -8,29 +7,95 @@ import com.velocitypowered.api.command.BrigadierCommand; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.JoinConfiguration; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; +import xyz.soukup.ecocraftVelocity.configuration.Replace; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class ReplyCommand { - public static HashMap> replyRecipients = new HashMap<>(); + public static HashMap replyRecipients = new HashMap<>(); - public static BrigadierCommand replyCommand(final ProxyServer proxy){ + private final LangManager langManager; + + public ReplyCommand(LangManager langManager){ + this.langManager = langManager; + } + + public BrigadierCommand command(final ProxyServer proxy){ LiteralCommandNode reply = BrigadierCommand.literalArgumentBuilder("r") .then(BrigadierCommand.requiredArgumentBuilder("message", StringArgumentType.greedyString()) - .executes(ReplyCommand::reply) + .executes((context -> reply(context, langManager))) ) .build(); return new BrigadierCommand(reply); } - private static int reply(CommandContext ctx){ + private static int reply(CommandContext ctx, LangManager langManager){ String message = ctx.getArgument("message", String.class); - List recipients = replyRecipients.get(ctx.getSource()); + Player sender = (Player) ctx.getSource(); + Recipients recipients = replyRecipients.computeIfAbsent(sender, k -> new Recipients()); + + switch (recipients.count()){ + case 0: + langManager.send("chat-format.direct.reply.error.no-recipients", sender); + break; + case 1: + sendDirectMessage(langManager, sender, recipients.getFirst(), message); + break; + default: + sendPlayerSelector(langManager, sender, recipients, message); + } + return 0; } + private static void sendDirectMessage(LangManager langManager, Player sender, Player receiver, String message){ + langManager.send("chat-format.direct.sender", sender, + new Replace("name", receiver.getUsername()), + new Replace("msg", message)); + langManager.send("chat-format.direct.receiver", receiver, + new Replace("name", sender.getUsername()), + new Replace("msg", message)); + addRecipient(sender, receiver); + } + + private static void sendPlayerSelector(LangManager langManager, Player sender, Recipients recipients, String message){ + List recipientsUsernames = recipients.getUsernames(); + List formatedRecipientsUsernames = new ArrayList<>(); + + for (String username : recipientsUsernames){ + Component formatedUsername = langManager.get("chat-format.direct.reply.multiple-receivers.name-format", + new Replace("name", username), + new Replace("msg", message)); + formatedRecipientsUsernames.add(formatedUsername); + } + + Component prefix = langManager.get("chat-format.direct.reply.multiple-receivers.prefix"); + + JoinConfiguration joinConfiguration = JoinConfiguration.separator(langManager.get("chat-format.direct.reply.multiple-receivers.separator")); + Component selector = Component.join(joinConfiguration,formatedRecipientsUsernames); + + Component suffix = langManager.get(""); + + sender.sendMessage(prefix.append(selector).append(suffix)); + } + + + + public static void addRecipient(Player player1, Player player2){ + Recipients recipients1 = replyRecipients.computeIfAbsent(player1, k -> new Recipients()); + Recipients recipients2 = replyRecipients.computeIfAbsent(player2, k -> new Recipients()); + + recipients1.add(player2); + recipients2.add(player1); + + } + } diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/configuration/LangManager.java b/src/main/java/xyz/soukup/ecocraftVelocity/configuration/LangManager.java new file mode 100644 index 0000000..2302822 --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/configuration/LangManager.java @@ -0,0 +1,74 @@ +package xyz.soukup.ecocraftVelocity.configuration; + +import com.velocitypowered.api.proxy.Player; +import dev.dejvokep.boostedyaml.YamlDocument; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.minimessage.MiniMessage; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class LangManager { + private final MiniMessage miniMessage = MiniMessage.miniMessage(); + private final YamlDocument langDocument; + + public LangManager(YamlDocument langDocument) { + this.langDocument = langDocument; + } + + public String getRaw(String key){ + String raw = null; + + if (langDocument.isList(key)){ + List strings = langDocument.getStringList(key); + raw = String.join("
", strings); + } + + if (raw == null){ + raw = langDocument.getString(key); + } + + if (raw == null){ + return key; + } + + return raw; + } + public Component get(String key){ + String raw = getRaw(key); + return miniMessage.deserialize(raw); + } + + public Component get(String key, Replace... replaces){ + String raw = getRaw(key); + + for (Replace replace : replaces){ + raw = replace.replace(raw); + } + + return miniMessage.deserialize(raw); + } + + public Component getRandom(String key){ + List list = langDocument.getStringList(key); + + if (list == null){ + return miniMessage.deserialize(key); + } + + int randomInt = ThreadLocalRandom.current().nextInt(list.size()); + String raw = list.get(randomInt); + + return miniMessage.deserialize(raw); + } + + public void send(String key, Player player, Replace... replaces){ + Component message = get(key, replaces); + player.sendMessage(message); + } + + +} +; \ No newline at end of file diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/configuration/Replace.java b/src/main/java/xyz/soukup/ecocraftVelocity/configuration/Replace.java new file mode 100644 index 0000000..0b8c67b --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/configuration/Replace.java @@ -0,0 +1,42 @@ +package xyz.soukup.ecocraftVelocity.configuration; + +import net.kyori.adventure.text.minimessage.MiniMessage; + +public class Replace { + private final String key; + private final String value; + private final Boolean allowFormatting; + private final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public Replace(String key, String value){ + this.key = key; + this.value = value; + this.allowFormatting = false; + } + + public Replace(String key, String value, Boolean allowFormatting) { + this.key = key; + this.value = value; + this.allowFormatting = allowFormatting; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + public Boolean getAllowFormatting() { + return allowFormatting; + } + + public String replace(String string){ + if (allowFormatting){ + return string.replace("<" + key + ">", value); + }else{ + return string.replace("<" + key + ">", miniMessage.stripTags(value)); + } + } +} diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/motd/MotdRequestEvent.java b/src/main/java/xyz/soukup/ecocraftVelocity/motd/MotdRequestEvent.java new file mode 100644 index 0000000..6523cdc --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/motd/MotdRequestEvent.java @@ -0,0 +1,43 @@ +package xyz.soukup.ecocraftVelocity.motd; + +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyPingEvent; +import com.velocitypowered.api.proxy.server.ServerPing; +import com.velocitypowered.api.util.Favicon; +import net.kyori.adventure.text.Component; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; + +import java.io.IOException; +import java.nio.file.Path; + +public class MotdRequestEvent { + private final LangManager langManager; + private final Path dataDirectory; + + public MotdRequestEvent(LangManager langManager, Path dataDirectory) { + this.langManager = langManager; + this.dataDirectory = dataDirectory; + } + + + @Subscribe + public void onServerPing(ProxyPingEvent event){ + + Component motd = langManager.get("motd.line1") + .append(Component.newline()) + .append(langManager.getRandom("motd.quotes")); + + + ServerPing serverPing = event.getPing(); + ServerPing.Builder builder = serverPing.asBuilder(); + builder.description(motd); + + try { + builder.favicon(Favicon.create(dataDirectory.resolve("server-icon.png"))); + } catch (IOException e) { + throw new RuntimeException(e); + } + + event.setPing(builder.build()); + } +} diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java b/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java index eeba160..dbb0040 100644 --- a/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java +++ b/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java @@ -7,19 +7,18 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.player.TabListEntry; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import xyz.soukup.ecocraftVelocity.configuration.LangManager; +import xyz.soukup.ecocraftVelocity.configuration.Replace; import java.util.UUID; public class GlobalTab { private final ProxyServer server; - private final MiniMessage miniMessage = MiniMessage.miniMessage(); + private final LangManager langManager; - public GlobalTab(ProxyServer server) { + public GlobalTab(ProxyServer server, LangManager langManager) { this.server = server; + this.langManager = langManager; } @Subscribe @@ -28,7 +27,7 @@ public class GlobalTab { for (Player recipient : server.getAllPlayers()) { for (Player onlinePlayer : server.getAllPlayers()) { - Component displayName = formatPlayerName(onlinePlayer); + Component displayName = langManager.get("tab.name-format", new Replace("name", onlinePlayer.getUsername())); if (!recipient.getTabList().containsEntry(onlinePlayer.getUniqueId())) { TabListEntry entry = TabListEntry.builder() @@ -62,18 +61,11 @@ public class GlobalTab { public void updateTablist() { int onlineCount = server.getPlayerCount(); - String header = "
EcoCraft.cz" + - "
BETA SERVER
"; - - String footer = "
www.ecocraft.cz
"; + Component header = langManager.get("tab.header"); + Component footer = langManager.get("tab.footer"); for (Player player : server.getAllPlayers()) { - player.sendPlayerListHeaderAndFooter(miniMessage.deserialize(header), miniMessage.deserialize(footer)); + player.sendPlayerListHeaderAndFooter(header, footer); } } - - private Component formatPlayerName(Player player) { - String format = ""; - return miniMessage.deserialize(format, Placeholder.unparsed("name", player.getUsername())); - } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml new file mode 100644 index 0000000..14c00e5 --- /dev/null +++ b/src/main/resources/messages.yml @@ -0,0 +1,38 @@ +motd: + line1: "EcoCraft.cz CZ/SK Ekonomický Server" + new-message: "Čeká na tebe nová zpráva!" + quotes: + - "„Kdo jinému jámu kopá, ten je u něj na brigádě“" + - "„Ta java to je hrozný jazyk“" + - "„Sníh padá jinak, když kráčí vůdce“" + - "„Kdo mi to tu krade obilí?“" + - "„Není ta hora až moc velká?“" + - "„I use arch linux btw“" + - "„co jste provedli XD“" + - "„Kdo tu staví ty hákáče?“" +tab: + header: + - "" + - "EcoCraft.cz" + - " BETA SERVER " + - "" + footer: + - "" + - " www.soukup.xyz" + - "" + name-format: "" +chat-format: + join: "[+] " + leave: "[-] " + player-message: "
Klikni pro napsání hráči'>>: " + direct: + reply: + multiple-receivers: + prefix: "Vyber příjemce:
" + suffix: "" + separator: "
" + name-format: "Odeslat hráči '> '> -> " + error: + no-recipients: "Nemáš komu odepsat" + sender: "
Klikni pro odepsání'>>: " + receiver: "
Klikni pro odepsání'>> : " \ No newline at end of file diff --git a/src/main/resources/server-icon.png b/src/main/resources/server-icon.png new file mode 100644 index 0000000..47e3c69 Binary files /dev/null and b/src/main/resources/server-icon.png differ