mirror of
https://github.com/barkeser2002/CatServer.git
synced 2026-09-25 03:00:03 +03:00
125 lines
6.7 KiB
Diff
125 lines
6.7 KiB
Diff
--- ../src-base/minecraft/net/minecraft/server/network/NetHandlerHandshakeTCP.java
|
|
+++ ../src-work/minecraft/net/minecraft/server/network/NetHandlerHandshakeTCP.java
|
|
@@ -9,39 +9,94 @@
|
|
import net.minecraft.util.text.ITextComponent;
|
|
import net.minecraft.util.text.TextComponentTranslation;
|
|
|
|
-public class NetHandlerHandshakeTCP implements INetHandlerHandshakeServer
|
|
-{
|
|
+import java.net.InetAddress;
|
|
+import java.util.HashMap;
|
|
+
|
|
+public class NetHandlerHandshakeTCP implements INetHandlerHandshakeServer {
|
|
private final MinecraftServer server;
|
|
private final NetworkManager networkManager;
|
|
|
|
- public NetHandlerHandshakeTCP(MinecraftServer serverIn, NetworkManager netManager)
|
|
- {
|
|
+ private static final HashMap<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>();
|
|
+ private static int throttleCounter = 0;
|
|
+ private static final com.google.gson.Gson gson = new com.google.gson.Gson(); // Spigot
|
|
+
|
|
+ public NetHandlerHandshakeTCP(MinecraftServer serverIn, NetworkManager netManager) {
|
|
this.server = serverIn;
|
|
this.networkManager = netManager;
|
|
}
|
|
|
|
- public void processHandshake(C00Handshake packetIn)
|
|
- {
|
|
- switch (packetIn.getRequestedState())
|
|
- {
|
|
+ public void processHandshake(C00Handshake packetIn) {
|
|
+ if (!net.minecraftforge.fml.common.FMLCommonHandler.instance().handleServerHandshake(packetIn, this.networkManager))
|
|
+ return;
|
|
+
|
|
+ switch (packetIn.getRequestedState()) {
|
|
case LOGIN:
|
|
this.networkManager.setConnectionState(EnumConnectionState.LOGIN);
|
|
|
|
- if (packetIn.getProtocolVersion() > 340)
|
|
- {
|
|
- ITextComponent itextcomponent = new TextComponentTranslation("multiplayer.disconnect.outdated_server", new Object[] {"1.12.2"});
|
|
+ // CraftBukkit start - Connection throttle
|
|
+ try {
|
|
+ long currentTime = System.currentTimeMillis();
|
|
+ long connectionThrottle = MinecraftServer.getServerInst().server.getConnectionThrottle();
|
|
+ InetAddress address = ((java.net.InetSocketAddress) this.networkManager.getRemoteAddress()).getAddress();
|
|
+
|
|
+ synchronized (throttleTracker) {
|
|
+ if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) {
|
|
+ throttleTracker.put(address, currentTime);
|
|
+ ITextComponent chatmessage = new TextComponentTranslation("Connection throttled! Please wait before reconnecting.");
|
|
+ this.networkManager.sendPacket(new SPacketDisconnect(chatmessage));
|
|
+ this.networkManager.closeChannel(chatmessage);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ throttleTracker.put(address, currentTime);
|
|
+ throttleCounter++;
|
|
+ if (throttleCounter > 200) {
|
|
+ throttleCounter = 0;
|
|
+
|
|
+ // Cleanup stale entries
|
|
+ java.util.Iterator iter = throttleTracker.entrySet().iterator();
|
|
+ while (iter.hasNext()) {
|
|
+ java.util.Map.Entry<InetAddress, Long> entry = (java.util.Map.Entry) iter.next();
|
|
+ if (entry.getValue() > connectionThrottle) {
|
|
+ iter.remove();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ } catch (Throwable t) {
|
|
+ org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t);
|
|
+ }
|
|
+ // CraftBukkit end
|
|
+
|
|
+ if (packetIn.getProtocolVersion() > 340) {
|
|
+ ITextComponent itextcomponent = new TextComponentTranslation(org.spigotmc.SpigotConfig.outdatedServerMessage.replaceAll("'", "''"), new Object[]{"1.12.2"}); // Spigot
|
|
this.networkManager.sendPacket(new SPacketDisconnect(itextcomponent));
|
|
this.networkManager.closeChannel(itextcomponent);
|
|
- }
|
|
- else if (packetIn.getProtocolVersion() < 340)
|
|
- {
|
|
- ITextComponent itextcomponent1 = new TextComponentTranslation("multiplayer.disconnect.outdated_client", new Object[] {"1.12.2"});
|
|
+ } else if (packetIn.getProtocolVersion() < 340) {
|
|
+ ITextComponent itextcomponent1 = new TextComponentTranslation(org.spigotmc.SpigotConfig.outdatedClientMessage.replaceAll("'", "''"), new Object[]{"1.12.2"}); // Spigot
|
|
this.networkManager.sendPacket(new SPacketDisconnect(itextcomponent1));
|
|
this.networkManager.closeChannel(itextcomponent1);
|
|
- }
|
|
- else
|
|
- {
|
|
+ } else {
|
|
this.networkManager.setNetHandler(new NetHandlerLoginServer(this.server, this.networkManager));
|
|
+ // Spigot Start
|
|
+ if (org.spigotmc.SpigotConfig.bungee) {
|
|
+ String[] split = packetIn.ip.split("\00");
|
|
+ if (split.length == 3 || split.length == 4) {
|
|
+ packetIn.ip = split[0];
|
|
+ networkManager.socketAddress = new java.net.InetSocketAddress(split[1], ((java.net.InetSocketAddress) networkManager.getRemoteAddress()).getPort());
|
|
+ networkManager.spoofedUUID = com.mojang.util.UUIDTypeAdapter.fromString(split[2]);
|
|
+ } else {
|
|
+ ITextComponent itextcomponent1 = new TextComponentTranslation("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!");
|
|
+ this.networkManager.sendPacket(new SPacketDisconnect(itextcomponent1));
|
|
+ this.networkManager.closeChannel(itextcomponent1);
|
|
+ return;
|
|
+ }
|
|
+ if (split.length == 4) {
|
|
+ networkManager.spoofedProfile = gson.fromJson(split[3], com.mojang.authlib.properties.Property[].class);
|
|
+ }
|
|
+ }
|
|
+ // Spigot End
|
|
+ ((NetHandlerLoginServer) this.networkManager.getNetHandler()).hostname = packetIn.ip + ":" + packetIn.port; // CraftBukkit - set hostname
|
|
}
|
|
|
|
break;
|
|
@@ -54,7 +109,6 @@
|
|
}
|
|
}
|
|
|
|
- public void onDisconnect(ITextComponent reason)
|
|
- {
|
|
+ public void onDisconnect(ITextComponent reason) {
|
|
}
|
|
}
|