diff --git a/README.md b/README.md index ebfc242..dfc19d3 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,13 @@ It also parses passed IP addresses so the server is aware of the real player IP ### Compatibility -TCPShield is compatible with Spigot / CraftBukkit, BungeeCord and Velocity. +TCPShield is compatible with Spigot / CraftBukkit, BungeeCord, Velocity and Fabric. When using Spigot / CraftBukkit, [ProtocolLib](https://github.com/aadnk/ProtocolLib) needs to be installed. +This does not apply when using Paper 1.16 build #503 or higher. ### Setup -Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/onboarding/tcpshield-plugin) guidelines. +Setting up the plugin is easy as pie. Please follow [these](https://docs.tcpshield.com/config/tcpshield-plugin) guidelines. ### Compiling In order to compile TCPShield, [install Gradle](https://docs.gradle.org/current/userguide/installation.html) and run the following command in the project folder: @@ -29,4 +30,5 @@ See [Contact](https://docs.tcpshield.com/about-us) These wonderful contributors have helped TCPShield make this plugin better! * [Paul Zhang](https://github.com/paulzhng) +* [Draylar](https://github.com/Draylar) * [RyanDeLap](https://github.com/RyanDeLap) diff --git a/build.gradle b/build.gradle index 82bed13..be900c4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,4 @@ +import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.google.gson.JsonParser import org.yaml.snakeyaml.DumperOptions @@ -18,6 +19,7 @@ buildscript { plugins { id 'java' id 'idea' + id 'fabric-loom' version '0.6-SNAPSHOT' } repositories { @@ -39,6 +41,12 @@ repositories { maven { url = 'https://repo.velocitypowered.com/snapshots/' } + maven { + url = 'https://maven.fabricmc.net/' + } + flatDir { + dirs '/libs' + } } dependencies { @@ -47,7 +55,7 @@ dependencies { compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.4.0' // Paper - compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.15.2-R0.1-SNAPSHOT' + compileOnly group: 'com.destroystokyo.paper', name: 'paper-api', version: '1.16.5-R0.1-20210227.144841-85' // BungeeCord compileOnly group: 'net.md-5', name: 'bungeecord-api', version: '1.14-SNAPSHOT' @@ -55,9 +63,16 @@ dependencies { // Velocity compileOnly group: 'com.velocitypowered', name: 'velocity-api', version: '1.0.0-SNAPSHOT' + // Fabric + minecraft "com.mojang:minecraft:1.16.5" + mappings "net.fabricmc:yarn:1.16.5+build.5:v2" + modImplementation group: 'net.fabricmc', name: 'fabric-loader', version: '0.11.2' + // Testing - testImplementation group: 'org.junit.jupiter', name:'junit-jupiter-api', version: '5.7.0-M1' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version:'5.7.0-M1' + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0-M1' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0-M1' + + compileOnly 'org.geyser:floodgate-spigot:2.0' } test { @@ -68,7 +83,7 @@ configurations { testImplementation.extendsFrom compileOnly } -version = '2.4' +version = '2.5' group = 'net.tcpshield.tcpshield' archivesBaseName = 'TCPShield' @@ -133,6 +148,7 @@ void updateYaml() { } void updateJson() { + def gson = new GsonBuilder().setPrettyPrinting().create(); def velocityJson = new File('src/main/resources/velocity-plugin.json') def files = [velocityJson] @@ -143,7 +159,7 @@ void updateJson() { object.addProperty("version", version.toString()) new FileWriter(file).withCloseable { writer -> - writer.write(object.toString()) + writer.write(gson.toJson(object)) } } } diff --git a/libs/floodgate-spigot.jar b/libs/floodgate-spigot.jar new file mode 100644 index 0000000..2e8b565 Binary files /dev/null and b/libs/floodgate-spigot.jar differ diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..5b60df3 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + jcenter() + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/HandshakePacketHandler.java b/src/main/java/net/tcpshield/tcpshield/HandshakePacketHandler.java index f9637c2..26949f3 100644 --- a/src/main/java/net/tcpshield/tcpshield/HandshakePacketHandler.java +++ b/src/main/java/net/tcpshield/tcpshield/HandshakePacketHandler.java @@ -35,8 +35,8 @@ public void onHandshake(IPacket packet, IPlayer player) { InetAddress inetAddress = InetAddress.getByName(player.getIP()); if (!ipValidation.validateIP(inetAddress)) throw new InvalidIPException(); - if (rawPayload == null) - return; // raw payload is passed when it's not available -> e.g. Paper server list ping events + // raw payload is passed when it's not available -> e.g. Paper server list ping events + if (rawPayload == null) return; String extraData = null; @@ -69,7 +69,7 @@ public void onHandshake(IPacket packet, IPlayer player) { } catch (InvalidIPException e) { handleInvalidIPException(player, rawPayload); } catch (IPModificationFailureException e) { - this.logger.warning(String.format("%s[%s/%s]'s IP failed to be modified. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload)); + this.logger.warning(String.format("%s's IP failed to be modified. Raw payload = \"%s\"", player.getIP(), rawPayload)); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); @@ -78,11 +78,16 @@ public void onHandshake(IPacket packet, IPlayer player) { private void handleInvalidIPException(IPlayer player, String rawPayload) { if (config.isDebug()) { - this.logger.warning(String.format("%s[%s/%s] was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getName(), player.getUUID(), player.getIP(), rawPayload)); + this.logger.warning(String.format("%s was disconnected because the client failed the ip check and only-allowed-proxy-connections is enabled. Raw payload = \"%s\"", player.getIP(), rawPayload)); } if (config.isOnlyProxy()) { player.disconnect(); } } + + public TCPShieldConfig getConfig() { + return config; + } + } diff --git a/src/main/java/net/tcpshield/tcpshield/abstraction/IPlayer.java b/src/main/java/net/tcpshield/tcpshield/abstraction/IPlayer.java index 13e0226..cb47efd 100644 --- a/src/main/java/net/tcpshield/tcpshield/abstraction/IPlayer.java +++ b/src/main/java/net/tcpshield/tcpshield/abstraction/IPlayer.java @@ -6,10 +6,6 @@ public interface IPlayer { - String getUUID(); - - String getName(); - String getIP(); void setIP(InetSocketAddress ip) throws IPModificationFailureException; diff --git a/src/main/java/net/tcpshield/tcpshield/abstraction/TCPShieldConfig.java b/src/main/java/net/tcpshield/tcpshield/abstraction/TCPShieldConfig.java index 89e18b0..912fb93 100644 --- a/src/main/java/net/tcpshield/tcpshield/abstraction/TCPShieldConfig.java +++ b/src/main/java/net/tcpshield/tcpshield/abstraction/TCPShieldConfig.java @@ -7,6 +7,7 @@ public abstract class TCPShieldConfig { protected boolean onlyProxy; protected File ipWhitelistFolder; protected boolean debug; + protected boolean geyser; public boolean isOnlyProxy() { return this.onlyProxy; @@ -20,4 +21,8 @@ public boolean isDebug() { return this.debug; } + public boolean isGeyser() { + return this.geyser; + } + } diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/TCPShieldBukkit.java b/src/main/java/net/tcpshield/tcpshield/bukkit/TCPShieldBukkit.java index c3ec8af..7c9b626 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/TCPShieldBukkit.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/TCPShieldBukkit.java @@ -13,7 +13,7 @@ public void onEnable() { new TCPShieldPaper(this).load(); } else { if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) { - this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper to enable native compatibility or install ProtocolLib."); + this.getLogger().warning("TCPShield not loading because ProtocolLib is not installed. Either use Paper (1.16 build #503 or higher) to enable native compatibility or install ProtocolLib."); return; } @@ -21,13 +21,17 @@ public void onEnable() { } } + /** + * Checks if the server version supports native Paper support (Paper 1.16.5 build #503 or higher) + * + * @return if the server version supports native Paper support + */ private boolean isPaper() { - if (1 == 1) return false; - try { - Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent"); + Class handshakeEvent = Class.forName("com.destroystokyo.paper.event.player.PlayerHandshakeEvent"); + handshakeEvent.getMethod("getOriginalSocketAddressHostname"); return true; - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException | NoSuchMethodException e) { return false; } } diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/impl/BukkitConfigImpl.java b/src/main/java/net/tcpshield/tcpshield/bukkit/impl/BukkitConfigImpl.java index 320e540..ebed16f 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/impl/BukkitConfigImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/impl/BukkitConfigImpl.java @@ -15,6 +15,7 @@ public BukkitConfigImpl(JavaPlugin javaPlugin) { this.onlyProxy = config.getBoolean("only-allow-proxy-connections"); this.ipWhitelistFolder = new File(javaPlugin.getDataFolder(), "ip-whitelist"); + this.geyser = config.getBoolean("enable-geyser-compatibility"); this.debug = config.getBoolean("debug-mode"); } } diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/PaperHandshakePacketHandler.java b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/PaperHandshakePacketHandler.java index 739fa8e..f6f537e 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/PaperHandshakePacketHandler.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/PaperHandshakePacketHandler.java @@ -19,8 +19,8 @@ public class PaperHandshakePacketHandler implements Listener { private final HandshakePacketHandler handshakePacketHandler; - public PaperHandshakePacketHandler(JavaPlugin plugin) { - this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin)); + public PaperHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) { + this.handshakePacketHandler = handshakePacketHandler; } @EventHandler(priority = EventPriority.LOWEST) diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/TCPShieldPaper.java b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/TCPShieldPaper.java index 9c3434e..78b7c54 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/TCPShieldPaper.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/TCPShieldPaper.java @@ -1,5 +1,11 @@ package net.tcpshield.tcpshield.bukkit.paper; +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl; +import net.tcpshield.tcpshield.geyser.GeyserHandshakePacketHandler; +import net.tcpshield.tcpshield.geyser.GeyserUtils; +import net.tcpshield.tcpshield.velocity.VelocityHandshakePacketHandler; +import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -12,7 +18,11 @@ public TCPShieldPaper(JavaPlugin plugin) { } public void load() { - PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(plugin); - Bukkit.getPluginManager().registerEvents(packetHandler, plugin); + HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin)); + + GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> { + PaperHandshakePacketHandler packetHandler = new PaperHandshakePacketHandler(handshakePacketHandler); + Bukkit.getPluginManager().registerEvents(packetHandler, plugin); + }); } } diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperPlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperPlayerImpl.java index 340908c..64e3433 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperPlayerImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperPlayerImpl.java @@ -1,10 +1,10 @@ package net.tcpshield.tcpshield.bukkit.paper.impl; import com.destroystokyo.paper.event.player.PlayerHandshakeEvent; +import net.kyori.adventure.text.Component; import net.tcpshield.tcpshield.abstraction.IPlayer; import java.net.InetSocketAddress; -import java.util.UUID; public class PaperPlayerImpl implements IPlayer { @@ -14,22 +14,9 @@ public PaperPlayerImpl(PlayerHandshakeEvent handshakeEvent) { this.handshakeEvent = handshakeEvent; } - @Override - public String getUUID() { - UUID uuid = handshakeEvent.getUniqueId(); - if (uuid == null) return "unknown"; - - return uuid.toString(); - } - - @Override - public String getName() { - return "unknown"; - } - @Override public String getIP() { - return handshakeEvent.getSocketAddressHostname(); + return handshakeEvent.getOriginalSocketAddressHostname(); } @Override @@ -40,7 +27,7 @@ public void setIP(InetSocketAddress ip) { @Override public void disconnect() { handshakeEvent.setCancelled(false); - handshakeEvent.setFailMessage("Connection failed. Please try again or contact an administrator."); + handshakeEvent.failMessage(Component.text("Connection failed. Please try again or contact an administrator.")); handshakeEvent.setFailed(true); } } diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperServerListPingPlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperServerListPingPlayerImpl.java index e99fe78..9524104 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperServerListPingPlayerImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/paper/impl/PaperServerListPingPlayerImpl.java @@ -13,16 +13,6 @@ public PaperServerListPingPlayerImpl(PaperServerListPingEvent pingEvent) { this.pingEvent = pingEvent; } - @Override - public String getUUID() { - return "unknown"; - } - - @Override - public String getName() { - return "unknown"; - } - @Override public String getIP() { return pingEvent.getAddress().getHostAddress(); diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/ProtocolLibHandshakePacketHandler.java b/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/ProtocolLibHandshakePacketHandler.java index 9505286..a718414 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/ProtocolLibHandshakePacketHandler.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/ProtocolLibHandshakePacketHandler.java @@ -7,7 +7,6 @@ import net.tcpshield.tcpshield.HandshakePacketHandler; import net.tcpshield.tcpshield.abstraction.IPacket; import net.tcpshield.tcpshield.abstraction.IPlayer; -import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl; import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPacketImpl; import net.tcpshield.tcpshield.bukkit.protocollib.impl.ProtocolLibPlayerImpl; import org.bukkit.plugin.java.JavaPlugin; @@ -16,9 +15,9 @@ public class ProtocolLibHandshakePacketHandler extends PacketAdapter { private final HandshakePacketHandler handshakePacketHandler; - public ProtocolLibHandshakePacketHandler(JavaPlugin plugin) { + public ProtocolLibHandshakePacketHandler(JavaPlugin plugin, HandshakePacketHandler handshakePacketHandler) { super(plugin, ListenerPriority.LOWEST, PacketType.Handshake.Client.SET_PROTOCOL); - this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin)); + this.handshakePacketHandler = handshakePacketHandler; } @Override diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/TCPShieldProtocolLib.java b/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/TCPShieldProtocolLib.java index 5a9189a..1c3b901 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/TCPShieldProtocolLib.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/TCPShieldProtocolLib.java @@ -1,5 +1,9 @@ package net.tcpshield.tcpshield.bukkit.protocollib; +import com.comphenix.protocol.ProtocolLibrary; +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.bukkit.impl.BukkitConfigImpl; +import net.tcpshield.tcpshield.geyser.GeyserUtils; import org.bukkit.plugin.java.JavaPlugin; public class TCPShieldProtocolLib { @@ -11,7 +15,10 @@ public TCPShieldProtocolLib(JavaPlugin plugin) { } public void load() { - ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin); - com.comphenix.protocol.ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler); + HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BukkitConfigImpl(plugin)); + GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> { + ProtocolLibHandshakePacketHandler packetHandler = new ProtocolLibHandshakePacketHandler(plugin, handshakePacketHandler); + ProtocolLibrary.getProtocolManager().addPacketListener(packetHandler); + }); } } diff --git a/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/impl/ProtocolLibPlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/impl/ProtocolLibPlayerImpl.java index 3d1c544..36c2097 100644 --- a/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/impl/ProtocolLibPlayerImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/bukkit/protocollib/impl/ProtocolLibPlayerImpl.java @@ -34,16 +34,6 @@ public ProtocolLibPlayerImpl(Player player) { this.ip = player.getAddress().getAddress().getHostAddress(); } - @Override - public String getUUID() { - return "unknown"; // not supported with temporary players - } - - @Override - public String getName() { - return "unknown"; // not supported with temporary players - } - @Override public String getIP() { return ip; diff --git a/src/main/java/net/tcpshield/tcpshield/bungee/BungeeHandshakePacketHandler.java b/src/main/java/net/tcpshield/tcpshield/bungee/BungeeHandshakePacketHandler.java index 7e1a7f2..fb5038a 100644 --- a/src/main/java/net/tcpshield/tcpshield/bungee/BungeeHandshakePacketHandler.java +++ b/src/main/java/net/tcpshield/tcpshield/bungee/BungeeHandshakePacketHandler.java @@ -4,13 +4,11 @@ import net.md_5.bungee.api.event.PlayerHandshakeEvent; import net.md_5.bungee.api.event.ProxyPingEvent; import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventPriority; import net.tcpshield.tcpshield.HandshakePacketHandler; import net.tcpshield.tcpshield.abstraction.IPacket; import net.tcpshield.tcpshield.abstraction.IPlayer; -import net.tcpshield.tcpshield.bungee.impl.BungeeConfigImpl; import net.tcpshield.tcpshield.bungee.impl.BungeePacketImpl; import net.tcpshield.tcpshield.bungee.impl.BungeePlayerImpl; @@ -18,8 +16,8 @@ public class BungeeHandshakePacketHandler implements Listener { private final HandshakePacketHandler handshakePacketHandler; - public BungeeHandshakePacketHandler(Plugin plugin) { - this.handshakePacketHandler = new HandshakePacketHandler(plugin.getLogger(), new BungeeConfigImpl(plugin)); + public BungeeHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) { + this.handshakePacketHandler = handshakePacketHandler; } @EventHandler(priority = EventPriority.LOWEST) diff --git a/src/main/java/net/tcpshield/tcpshield/bungee/TCPShieldBungee.java b/src/main/java/net/tcpshield/tcpshield/bungee/TCPShieldBungee.java index c92f841..de35717 100644 --- a/src/main/java/net/tcpshield/tcpshield/bungee/TCPShieldBungee.java +++ b/src/main/java/net/tcpshield/tcpshield/bungee/TCPShieldBungee.java @@ -3,12 +3,19 @@ import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.PluginManager; +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.bungee.impl.BungeeConfigImpl; +import net.tcpshield.tcpshield.geyser.GeyserUtils; public class TCPShieldBungee extends Plugin implements Listener { @Override public void onEnable() { - PluginManager pluginManager = this.getProxy().getPluginManager(); - pluginManager.registerListener(this, new BungeeHandshakePacketHandler(this)); + HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(this.getLogger(), new BungeeConfigImpl(this)); + + GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> { + PluginManager pluginManager = this.getProxy().getPluginManager(); + pluginManager.registerListener(this, new BungeeHandshakePacketHandler(handshakePacketHandler)); + }); } } diff --git a/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeeConfigImpl.java b/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeeConfigImpl.java index a5d4248..b486eab 100644 --- a/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeeConfigImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeeConfigImpl.java @@ -23,6 +23,7 @@ public BungeeConfigImpl(Plugin plugin) { Configuration config = loadConfig(); this.onlyProxy = config.getBoolean("only-allow-proxy-connections"); this.ipWhitelistFolder = new File(plugin.getDataFolder(), "ip-whitelist"); + this.geyser = config.getBoolean("enable-geyser-compatibility"); this.debug = config.getBoolean("debug-mode"); } diff --git a/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeePlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeePlayerImpl.java index fa108a4..9038a2c 100644 --- a/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeePlayerImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/bungee/impl/BungeePlayerImpl.java @@ -9,7 +9,6 @@ import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.UUID; public class BungeePlayerImpl implements IPlayer { @@ -21,19 +20,6 @@ public BungeePlayerImpl(PendingConnection pendingConnection) { this.ip = pendingConnection.getAddress().getAddress().getHostAddress(); } - @Override - public String getUUID() { - UUID uuid = pendingConnection.getUniqueId(); - if (uuid == null) return "Unknown"; - - return uuid.toString(); - } - - @Override - public String getName() { - return pendingConnection.getName(); - } - @Override public String getIP() { return ip; diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/TCPShieldFabric.java b/src/main/java/net/tcpshield/tcpshield/fabric/TCPShieldFabric.java new file mode 100644 index 0000000..0d6e4d4 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/TCPShieldFabric.java @@ -0,0 +1,18 @@ +package net.tcpshield.tcpshield.fabric; + +import net.fabricmc.api.ModInitializer; +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.fabric.impl.FabricConfigImpl; + +import java.util.logging.Logger; + +public class TCPShieldFabric implements ModInitializer { + + public static final Logger LOGGER = Logger.getLogger("TCPShield"); + public static final HandshakePacketHandler PACKET_HANDLER = new HandshakePacketHandler(LOGGER, new FabricConfigImpl()); + + @Override + public void onInitialize() { + LOGGER.info("TCPShield has been loaded."); + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricConfigImpl.java b/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricConfigImpl.java new file mode 100644 index 0000000..2f1cefe --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricConfigImpl.java @@ -0,0 +1,105 @@ +package net.tcpshield.tcpshield.fabric.impl; + +import net.fabricmc.loader.api.FabricLoader; +import net.tcpshield.tcpshield.abstraction.TCPShieldConfig; +import net.tcpshield.tcpshield.exception.TCPShieldInitializationException; + +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.List; + +public class FabricConfigImpl extends TCPShieldConfig { + + private final Path configLocation = new File(FabricLoader.getInstance().getConfigDir().toString(), "tcpshield.yml").toPath(); + + public FabricConfigImpl() { + if(!configExists()) { + createDefaultConfig(); + } + + ConfigData config = loadConfig(); + + this.onlyProxy = config.onlyAllowProxyConnections; + this.ipWhitelistFolder = new File(FabricLoader.getInstance().getGameDirectory(), "ip-whitelist"); + this.geyser = false; + this.debug = config.debugMode; + } + + /** + * @return whether the file specified in {@link FabricConfigImpl#configLocation} exists. + */ + private boolean configExists() { + return Files.exists(configLocation); + } + + /** + * Creates the default configuration file at the location specified in {@link FabricConfigImpl#configLocation}. + * + *

+ * This operation will always override an existing configuration file if it exists. + * Callers should check {@link FabricConfigImpl#configExists()} if they wish to avoid this behavior. + */ + private void createDefaultConfig() { + // Ensure the parent directory of our config file exists. + // If it does not exist, attempt to create it now. + Path parentDirectory = configLocation.getParent(); + if (!Files.exists(parentDirectory) || !Files.isDirectory(parentDirectory)) { + parentDirectory.toFile().mkdirs(); + } + + // Copy the config.yml data from our mod jar to the loader config folder. + try (InputStream in = getClass().getClassLoader().getResourceAsStream("config.yml")) { + Files.copy(in, configLocation); + } catch (Exception e) { + throw new TCPShieldInitializationException(e); + } + } + + private ConfigData loadConfig() { + try { + List strings = Files.readAllLines(configLocation); + + boolean onlyAllowProxyConnections = true; + boolean debugMode = false; + + // Rudimentary config parsing + for (String line : strings) { + String[] keyValue = line.split(": "); + + // A config option will only be valid if it is in the format 'a: b'. + // Ensure that is the case now. + if (keyValue.length == 2) { + String key = keyValue[0]; + String value = keyValue[1]; + + switch (key) { + case "only-allow-proxy-connections": + onlyAllowProxyConnections = Boolean.parseBoolean(value); + break; + case "debug-mode": + debugMode = Boolean.parseBoolean(value); + break; + } + } + } + + return new ConfigData(onlyAllowProxyConnections, debugMode); + } catch (Exception e) { + throw new TCPShieldInitializationException("Couldn't load config in config/tclshield.yml!"); + } + } + + private static class ConfigData { + + protected boolean onlyAllowProxyConnections; + protected boolean debugMode; + + public ConfigData(boolean onlyAllowProxyConnections, boolean debugMode) { + this.onlyAllowProxyConnections = onlyAllowProxyConnections; + this.debugMode = debugMode; + } + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricPacketImpl.java b/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricPacketImpl.java new file mode 100644 index 0000000..2751ba9 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricPacketImpl.java @@ -0,0 +1,24 @@ +package net.tcpshield.tcpshield.fabric.impl; + +import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; +import net.tcpshield.tcpshield.abstraction.IPacket; +import net.tcpshield.tcpshield.fabric.mixin.HandshakeC2SPacketAccessor; + +public class FabricPacketImpl implements IPacket { + + private final HandshakeC2SPacket handshake; + + public FabricPacketImpl(HandshakeC2SPacket handshake) { + this.handshake = handshake; + } + + @Override + public String getRawPayload() { + return ((HandshakeC2SPacketAccessor) handshake).getAddress(); + } + + @Override + public void modifyOriginalPacket(String hostname) throws Exception { + // NO OPERATION + } +} \ No newline at end of file diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricPlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricPlayerImpl.java new file mode 100644 index 0000000..1fb5722 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/impl/FabricPlayerImpl.java @@ -0,0 +1,40 @@ +package net.tcpshield.tcpshield.fabric.impl; + +import net.minecraft.network.ClientConnection; +import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; +import net.minecraft.network.packet.s2c.login.LoginDisconnectS2CPacket; +import net.minecraft.text.LiteralText; +import net.tcpshield.tcpshield.abstraction.IPlayer; +import net.tcpshield.tcpshield.exception.IPModificationFailureException; +import net.tcpshield.tcpshield.fabric.mixin.ClientConnectionAccessor; + +import java.net.InetSocketAddress; + +public class FabricPlayerImpl implements IPlayer { + + private final ClientConnection connection; + private String ip; + + public FabricPlayerImpl(HandshakeC2SPacket packet, ClientConnection connection) { + this.connection = connection; + this.ip = ((InetSocketAddress) ((ClientConnectionAccessor) connection).getChannel().remoteAddress()).getAddress().getHostAddress(); + } + + @Override + public String getIP() { + return ip; + } + + @Override + public void setIP(InetSocketAddress ip) throws IPModificationFailureException { + // At this point, the IP/connection believe the player has the IP of TCPShield. + // The ip passed into this method contains their CORRECT data, which we have to assign to the player network connection. + ((ClientConnectionAccessor) connection).setAddress(ip); + this.ip = ((InetSocketAddress) ((ClientConnectionAccessor) connection).getChannel().remoteAddress()).getAddress().getHostAddress(); + } + + @Override + public void disconnect() { + connection.disconnect(new LiteralText("Connection failed. Please try again or contact an administrator.")); + } +} \ No newline at end of file diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/mixin/ClientConnectionAccessor.java b/src/main/java/net/tcpshield/tcpshield/fabric/mixin/ClientConnectionAccessor.java new file mode 100644 index 0000000..e725e07 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/mixin/ClientConnectionAccessor.java @@ -0,0 +1,20 @@ +package net.tcpshield.tcpshield.fabric.mixin; + +import io.netty.channel.Channel; +import net.minecraft.network.ClientConnection; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.net.SocketAddress; + +@Mixin(ClientConnection.class) +public interface ClientConnectionAccessor { + @Accessor + void setAddress(SocketAddress address); + + @Accessor + Channel getChannel(); + + @Accessor + SocketAddress getAddress(); +} diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/mixin/HandshakeC2SPacketAccessor.java b/src/main/java/net/tcpshield/tcpshield/fabric/mixin/HandshakeC2SPacketAccessor.java new file mode 100644 index 0000000..fe7e6fa --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/mixin/HandshakeC2SPacketAccessor.java @@ -0,0 +1,11 @@ +package net.tcpshield.tcpshield.fabric.mixin; + +import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HandshakeC2SPacket.class) +public interface HandshakeC2SPacketAccessor { + @Accessor + String getAddress(); +} diff --git a/src/main/java/net/tcpshield/tcpshield/fabric/mixin/ServerHandshakeMixin.java b/src/main/java/net/tcpshield/tcpshield/fabric/mixin/ServerHandshakeMixin.java new file mode 100644 index 0000000..a67c619 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/fabric/mixin/ServerHandshakeMixin.java @@ -0,0 +1,32 @@ +package net.tcpshield.tcpshield.fabric.mixin; + +import net.minecraft.network.ClientConnection; +import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; +import net.minecraft.server.network.ServerHandshakeNetworkHandler; +import net.tcpshield.tcpshield.abstraction.IPacket; +import net.tcpshield.tcpshield.abstraction.IPlayer; +import net.tcpshield.tcpshield.fabric.TCPShieldFabric; +import net.tcpshield.tcpshield.fabric.impl.FabricPacketImpl; +import net.tcpshield.tcpshield.fabric.impl.FabricPlayerImpl; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ServerHandshakeNetworkHandler.class) +public class ServerHandshakeMixin { + + @Shadow @Final private ClientConnection connection; + + @Inject( + method = "onHandshake", + at = @At("HEAD")) + private void onHandshake(HandshakeC2SPacket handshake, CallbackInfo ci) { + IPacket packet = new FabricPacketImpl(handshake); + IPlayer player = new FabricPlayerImpl(handshake, connection); + + TCPShieldFabric.PACKET_HANDLER.onHandshake(packet, player); + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/geyser/GeyserHandshakePacketHandler.java b/src/main/java/net/tcpshield/tcpshield/geyser/GeyserHandshakePacketHandler.java new file mode 100644 index 0000000..4d27a05 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/geyser/GeyserHandshakePacketHandler.java @@ -0,0 +1,29 @@ +package net.tcpshield.tcpshield.geyser; + +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.abstraction.IPacket; +import net.tcpshield.tcpshield.abstraction.IPlayer; +import net.tcpshield.tcpshield.geyser.impl.GeyserPacketImpl; +import net.tcpshield.tcpshield.geyser.impl.GeyserPlayerImpl; +import org.geysermc.floodgate.api.InstanceHolder; + +public class GeyserHandshakePacketHandler { + + private final HandshakePacketHandler handshakePacketHandler; + + public GeyserHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) { + this.handshakePacketHandler = handshakePacketHandler; + } + + public void init() { + InstanceHolder.getHandshakeHandlers().addHandshakeHandler(data -> { + // In case the connection is a Bedrock connection, we don't bother + if (data.getBedrockData() != null) return; + + IPlayer player = new GeyserPlayerImpl(data); + IPacket packet = new GeyserPacketImpl(data); + + handshakePacketHandler.onHandshake(packet, player); + }); + } +} \ No newline at end of file diff --git a/src/main/java/net/tcpshield/tcpshield/geyser/GeyserUtils.java b/src/main/java/net/tcpshield/tcpshield/geyser/GeyserUtils.java new file mode 100644 index 0000000..7ed6957 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/geyser/GeyserUtils.java @@ -0,0 +1,27 @@ +package net.tcpshield.tcpshield.geyser; + +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.abstraction.TCPShieldConfig; + +public class GeyserUtils { + + public static void initGeyserOrDefault(HandshakePacketHandler handshakePacketHandler, Runnable registrar) { + if (!useGeyser(handshakePacketHandler.getConfig())) { + registrar.run(); + } else { + GeyserHandshakePacketHandler geyserHandler = new GeyserHandshakePacketHandler(handshakePacketHandler); + geyserHandler.init(); + } + } + + private static boolean useGeyser(TCPShieldConfig config) { + if (!config.isGeyser()) return false; + + try { + Class.forName("org.geysermc.floodgate.api.InstanceHolder"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/geyser/impl/GeyserPacketImpl.java b/src/main/java/net/tcpshield/tcpshield/geyser/impl/GeyserPacketImpl.java new file mode 100644 index 0000000..9e79ead --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/geyser/impl/GeyserPacketImpl.java @@ -0,0 +1,23 @@ +package net.tcpshield.tcpshield.geyser.impl; + +import net.tcpshield.tcpshield.abstraction.IPacket; +import org.geysermc.floodgate.api.handshake.HandshakeData; + +public class GeyserPacketImpl implements IPacket { + + private final HandshakeData handshakeData; + + public GeyserPacketImpl(HandshakeData handshakeData) { + this.handshakeData = handshakeData; + } + + @Override + public String getRawPayload() { + return handshakeData.getHostname(); + } + + @Override + public void modifyOriginalPacket(String hostname) { + handshakeData.setHostname(hostname); + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/geyser/impl/GeyserPlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/geyser/impl/GeyserPlayerImpl.java new file mode 100644 index 0000000..e2ce311 --- /dev/null +++ b/src/main/java/net/tcpshield/tcpshield/geyser/impl/GeyserPlayerImpl.java @@ -0,0 +1,30 @@ +package net.tcpshield.tcpshield.geyser.impl; + +import net.tcpshield.tcpshield.abstraction.IPlayer; +import org.geysermc.floodgate.api.handshake.HandshakeData; + +import java.net.InetSocketAddress; + +public class GeyserPlayerImpl implements IPlayer { + + private final HandshakeData handshakeData; + + public GeyserPlayerImpl(HandshakeData handshakeData) { + this.handshakeData = handshakeData; + } + + @Override + public String getIP() { + return ((InetSocketAddress) handshakeData.getChannel().remoteAddress()).getAddress().getHostAddress(); + } + + @Override + public void setIP(InetSocketAddress ip) { + handshakeData.setIp(ip.getAddress().getHostAddress()); + } + + @Override + public void disconnect() { + handshakeData.getChannel().close(); + } +} diff --git a/src/main/java/net/tcpshield/tcpshield/velocity/TCPShieldVelocity.java b/src/main/java/net/tcpshield/tcpshield/velocity/TCPShieldVelocity.java index d20529b..57d04e2 100644 --- a/src/main/java/net/tcpshield/tcpshield/velocity/TCPShieldVelocity.java +++ b/src/main/java/net/tcpshield/tcpshield/velocity/TCPShieldVelocity.java @@ -6,6 +6,9 @@ import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import net.tcpshield.tcpshield.HandshakePacketHandler; +import net.tcpshield.tcpshield.geyser.GeyserUtils; +import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl; import java.nio.file.Path; import java.util.logging.Logger; @@ -29,6 +32,8 @@ public TCPShieldVelocity(ProxyServer server, Logger logger, @DataDirectory Path @Subscribe public void onProxyInitialization(ProxyInitializeEvent e) { - server.getEventManager().register(this, new VelocityHandshakePacketHandler(logger, dataFolder.toFile())); + HandshakePacketHandler handshakePacketHandler = new HandshakePacketHandler(this.logger, new VelocityConfigImpl(dataFolder.toFile())); + + GeyserUtils.initGeyserOrDefault(handshakePacketHandler, () -> server.getEventManager().register(this, new VelocityHandshakePacketHandler(handshakePacketHandler))); } } \ No newline at end of file diff --git a/src/main/java/net/tcpshield/tcpshield/velocity/VelocityHandshakePacketHandler.java b/src/main/java/net/tcpshield/tcpshield/velocity/VelocityHandshakePacketHandler.java index 1afc196..9c32d79 100644 --- a/src/main/java/net/tcpshield/tcpshield/velocity/VelocityHandshakePacketHandler.java +++ b/src/main/java/net/tcpshield/tcpshield/velocity/VelocityHandshakePacketHandler.java @@ -7,19 +7,15 @@ import com.velocitypowered.api.proxy.InboundConnection; import net.tcpshield.tcpshield.HandshakePacketHandler; import net.tcpshield.tcpshield.abstraction.IPacket; -import net.tcpshield.tcpshield.velocity.impl.VelocityConfigImpl; import net.tcpshield.tcpshield.velocity.impl.VelocityPacketImpl; import net.tcpshield.tcpshield.velocity.impl.VelocityPlayerImpl; -import java.io.File; -import java.util.logging.Logger; - public class VelocityHandshakePacketHandler { private final HandshakePacketHandler handshakePacketHandler; - public VelocityHandshakePacketHandler(Logger logger, File dataFolder) { - this.handshakePacketHandler = new HandshakePacketHandler(logger, new VelocityConfigImpl(dataFolder)); + public VelocityHandshakePacketHandler(HandshakePacketHandler handshakePacketHandler) { + this.handshakePacketHandler = handshakePacketHandler; } @Subscribe(order = PostOrder.FIRST) diff --git a/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityConfigImpl.java b/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityConfigImpl.java index 988444e..ca3c189 100644 --- a/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityConfigImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityConfigImpl.java @@ -21,6 +21,7 @@ public VelocityConfigImpl(File dataFolder) { Toml toml = loadConfig(); this.onlyProxy = toml.getBoolean("only-allow-proxy-connections"); this.ipWhitelistFolder = new File(dataFolder, "ip-whitelist"); + this.geyser = toml.getBoolean("enable-geyser-compatibility"); this.debug = toml.getBoolean("debug-mode"); } diff --git a/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityPlayerImpl.java b/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityPlayerImpl.java index 3326f23..6ba343c 100644 --- a/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityPlayerImpl.java +++ b/src/main/java/net/tcpshield/tcpshield/velocity/impl/VelocityPlayerImpl.java @@ -42,16 +42,6 @@ public VelocityPlayerImpl(InboundConnection inboundConnection) { this.ip = inboundConnection.getRemoteAddress().getAddress().getHostAddress(); } - @Override - public String getUUID() { - return "unknown"; // not supported - } - - @Override - public String getName() { - return "unknown"; // not supported - } - @Override public String getIP() { return ip; diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml index b6935f8..dcc2560 100644 --- a/src/main/resources/bungee.yml +++ b/src/main/resources/bungee.yml @@ -1,4 +1,6 @@ name: TCPShield -version: '2.4' +version: '2.5' main: net.tcpshield.tcpshield.bungee.TCPShieldBungee author: https://tcpshield.com +softDepends: +- floodgate diff --git a/src/main/resources/config.toml b/src/main/resources/config.toml index 84031ed..37eea5f 100644 --- a/src/main/resources/config.toml +++ b/src/main/resources/config.toml @@ -1,5 +1,8 @@ # Please keep this as true in while using TCPShield! only-allow-proxy-connections = true +# Only set this to true in case you're using TCPShield's Geyser proxy! +enable-geyser-compatibility = false + # Turn on to diagnose connection issues debug-mode = false \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c91d06b..d34c824 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,8 @@ # Please keep this as true in while using TCPShield! only-allow-proxy-connections: true +# Only set this to true in case you're using TCPShield's Geyser proxy! +enable-geyser-compatibility: false + # Turn on to diagnose connection issues debug-mode: false \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..86bc3d5 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,27 @@ +{ + "schemaVersion": 1, + "id": "tcp-shield", + "version": "2.5", + "name": "TCPShield", + "description": "TCPShield IP parsing capabilities for Fabric", + "authors": [ + "TCPShield" + ], + "contact": { + "homepage": "https://tcpshield.com" + }, + "license": "MIT", + "environment": "*", + "entrypoints": { + "main": [ + "net.tcpshield.tcpshield.fabric.TCPShieldFabric" + ] + }, + "mixins": [ + "tcpshield.mixins.json" + ], + "depends": { + "fabricloader": "*", + "minecraft": "*" + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c1b2aae..2c604cf 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,8 @@ name: TCPShield -version: '2.4' +version: '2.5' main: net.tcpshield.tcpshield.bukkit.TCPShieldBukkit softdepend: - ProtocolLib +- floodgate author: https://tcpshield.com api-version: 1.16 diff --git a/src/main/resources/tcpshield.mixins.json b/src/main/resources/tcpshield.mixins.json new file mode 100644 index 0000000..9ad8b4e --- /dev/null +++ b/src/main/resources/tcpshield.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.tcpshield.tcpshield.fabric.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "ClientConnectionAccessor", + "HandshakeC2SPacketAccessor", + "ServerHandshakeMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/velocity-plugin.json b/src/main/resources/velocity-plugin.json index 779266d..d88dc9a 100644 --- a/src/main/resources/velocity-plugin.json +++ b/src/main/resources/velocity-plugin.json @@ -1,11 +1,16 @@ { "id": "tcpshield", "name": "TCPShield", - "version": "2.4", + "version": "2.5", "description": "TCPShield IP parsing capabilities for Velocity", "authors": [ "TCPShield" ], - "dependencies": [], + "dependencies": [ + { + "id": "floodgate", + "optional": true + } + ], "main": "net.tcpshield.tcpshield.velocity.TCPShieldVelocity" } \ No newline at end of file diff --git a/src/test/java/net/tcpshield/tcpshield/impl/TestPlayerImpl.java b/src/test/java/net/tcpshield/tcpshield/impl/TestPlayerImpl.java index 233f9e4..d5f9a94 100644 --- a/src/test/java/net/tcpshield/tcpshield/impl/TestPlayerImpl.java +++ b/src/test/java/net/tcpshield/tcpshield/impl/TestPlayerImpl.java @@ -20,16 +20,6 @@ public TestPlayerImpl(String ip) { } } - @Override - public String getUUID() { - return "uuid"; - } - - @Override - public String getName() { - return "name"; - } - @Override public String getIP() { if (ip == null) return "ip";