commit dad3ac76e34b80bc92b017732ba8d587aa28f497 Author: jakub Date: Mon Apr 6 22:51:24 2026 +0200 ss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fec0062 --- /dev/null +++ b/pom.xml @@ -0,0 +1,164 @@ + + + 4.0.0 + + xyz.soukup + ecocraftvelocity + 1.0-SNAPSHOT + jar + + ecocraftvelocity + + + 17 + UTF-8 + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.4 + + + sign-artifacts + verify + + sign + + + + + + + + src/main/resources + true + + + + + + + + clean package + + + ${project.basedir}/src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.codehaus.mojo + templating-maven-plugin + 1.0.0 + + + filter-src + + filter-sources + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + net.trajano.wagon + wagon-git + 2.0.4 + + + org.apache.maven.doxia + doxia-module-markdown + 1.12.0 + + + + + org.apache.maven.plugins + maven-release-plugin + 3.0.1 + + true + @{project.version} + [RELEASE] + install deploy site-deploy + + release + + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + com.velocitypowered + velocity-api + 3.4.0-SNAPSHOT + provided + + + diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java b/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java new file mode 100644 index 0000000..c6dea59 --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/EcocraftVelocity.java @@ -0,0 +1,52 @@ +package xyz.soukup.ecocraftVelocity; + +import com.google.inject.Inject; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandManager; +import com.velocitypowered.api.command.CommandMeta; +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.proxy.ProxyServer; +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.tab.GlobalTab; + +@Plugin(id = "ecocraftvelocity", name = "EcocraftVelocity", version = "1.0-SNAPSHOT") +public class EcocraftVelocity { + + @Inject + private Logger logger; + + @Inject + private ProxyServer server; + + @Subscribe + public void onProxyInitialization(ProxyInitializeEvent event) { + logger.info("Startujeme!"); + 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)); + } + + private void registerCommands(){ + CommandManager commandManager = server.getCommandManager(); + + CommandMeta commandMeta = commandManager.metaBuilder("msg") + .plugin(this) + .build(); + + BrigadierCommand commandToRegister = DirectMessages.messageCommand(server); + + commandManager.register(commandMeta, commandToRegister); + } +} diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java b/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java new file mode 100644 index 0000000..2c48b8c --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/DirectMessages.java @@ -0,0 +1,74 @@ +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.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +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.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +public class DirectMessages { + public static BrigadierCommand messageCommand(final ProxyServer proxy) { + LiteralCommandNode msg = BrigadierCommand.literalArgumentBuilder("msg") + .then(BrigadierCommand.requiredArgumentBuilder("player", StringArgumentType.word()) + .suggests((ctx, builder) -> playerSuggestor(proxy, ctx, builder)) + .then(BrigadierCommand.requiredArgumentBuilder("message", StringArgumentType.greedyString()) + .executes((ctx) -> sendDirectMessage(proxy, ctx))) + ) + .build(); + + return new BrigadierCommand(msg); + } + + private static CompletableFuture playerSuggestor(ProxyServer proxy, CommandContext ctx, SuggestionsBuilder builder) { + proxy.getAllPlayers().forEach(player -> { + builder.suggest(player.getUsername()); + }); + builder.suggest("all"); + return builder.buildFuture(); + } + + private static int sendDirectMessage(ProxyServer proxy, CommandContext context) { + String playerName = context.getArgument("player", String.class); + String message = context.getArgument("message", String.class); + MiniMessage mm = MiniMessage.miniMessage(); + + + Player sender = (Player) context.getSource(); + Optional playerOptional = proxy.getPlayer(playerName); + + if (playerOptional.isEmpty()){ + sender.sendMessage(mm.deserialize("Není online.")); + return Command.SINGLE_SUCCESS; + } + + + String senderFormat = "
Klikni pro odepsání\">" + + "" + + ": "; + + + + sender.sendMessage(mm.deserialize(senderFormat, Placeholder.unparsed("msg", message), Placeholder.unparsed("name", playerName))); + + 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()))); + } + ); + 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 new file mode 100644 index 0000000..1e33b60 --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/GlobalChat.java @@ -0,0 +1,50 @@ +package xyz.soukup.ecocraftVelocity.chat; + +import com.velocitypowered.api.event.Subscribe; +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; + +public class GlobalChat { + + private final ProxyServer server; + private final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public GlobalChat(ProxyServer server){ + this.server = server; + } + + @Subscribe + public void onChat(PlayerChatEvent event){ + //noinspection deprecation + event.setResult(PlayerChatEvent.ChatResult.denied()); + + String message = event.getMessage(); + Player player = event.getPlayer(); + + server.sendMessage(prepareMessageComponent(message, player)); + + + + + + } + + 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 new file mode 100644 index 0000000..3b3cf82 --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/chat/JoinLeaveMessages.java @@ -0,0 +1,37 @@ +package xyz.soukup.ecocraftVelocity.chat; + +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; +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; + +public class JoinLeaveMessages { + + private final ProxyServer server; + private final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public JoinLeaveMessages(ProxyServer server){ + this.server = server; + } + + @Subscribe + public void onJoin(ServerPostConnectEvent event){ + String name = event.getPlayer().getUsername(); + + String messageFormat = "[+] "; + + server.sendMessage(miniMessage.deserialize(messageFormat, Placeholder.parsed("name", name))); + } + + @Subscribe + public void onLeave(DisconnectEvent event){ + String name = event.getPlayer().getUsername(); + + String messageFormat = "[-] "; + + server.sendMessage(miniMessage.deserialize(messageFormat, Placeholder.parsed("name", name))); + } + +} diff --git a/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java b/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java new file mode 100644 index 0000000..eeba160 --- /dev/null +++ b/src/main/java/xyz/soukup/ecocraftVelocity/tab/GlobalTab.java @@ -0,0 +1,79 @@ +package xyz.soukup.ecocraftVelocity.tab; + +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; +import com.velocitypowered.api.event.player.ServerPostConnectEvent; +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 java.util.UUID; + +public class GlobalTab { + private final ProxyServer server; + private final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public GlobalTab(ProxyServer server) { + this.server = server; + } + + @Subscribe + public void onJoin(ServerPostConnectEvent event) { + + for (Player recipient : server.getAllPlayers()) { + for (Player onlinePlayer : server.getAllPlayers()) { + + Component displayName = formatPlayerName(onlinePlayer); + + if (!recipient.getTabList().containsEntry(onlinePlayer.getUniqueId())) { + TabListEntry entry = TabListEntry.builder() + .profile(onlinePlayer.getGameProfile()) + .displayName(displayName) + .tabList(recipient.getTabList()) + .build(); + + recipient.getTabList().addEntry(entry); + } else { + recipient.getTabList().getEntry(onlinePlayer.getUniqueId()) + .ifPresent(entry -> entry.setDisplayName(displayName)); + } + } + } + + updateTablist(); + } + + @Subscribe + public void onQuit(DisconnectEvent event) { + UUID quittingUuid = event.getPlayer().getUniqueId(); + + for (Player player : server.getAllPlayers()) { + player.getTabList().removeEntry(quittingUuid); + } + + updateTablist(); + } + + public void updateTablist() { + int onlineCount = server.getPlayerCount(); + + String header = "
EcoCraft.cz" + + "
BETA SERVER
"; + + String footer = "
www.ecocraft.cz
"; + + for (Player player : server.getAllPlayers()) { + player.sendPlayerListHeaderAndFooter(miniMessage.deserialize(header), miniMessage.deserialize(footer)); + } + } + + private Component formatPlayerName(Player player) { + String format = ""; + return miniMessage.deserialize(format, Placeholder.unparsed("name", player.getUsername())); + } +}