diff --git a/src/main/java/us/myles/ViaVersion/ViaConfig.java b/src/main/java/us/myles/ViaVersion/ViaConfig.java index 7a91146a3..9e4c22da9 100644 --- a/src/main/java/us/myles/ViaVersion/ViaConfig.java +++ b/src/main/java/us/myles/ViaVersion/ViaConfig.java @@ -4,6 +4,7 @@ import us.myles.ViaVersion.api.ViaVersionConfig; import us.myles.ViaVersion.util.Configuration; import java.io.File; +import java.util.List; public class ViaConfig implements ViaVersionConfig { private final ViaVersionPlugin plugin; @@ -169,4 +170,14 @@ public class ViaConfig implements ViaVersionConfig { public boolean isForceJsonTransform() { return plugin.getConfig().getBoolean("force-json-transform", false); } + + @Override + public List getBlockedProtocols() { + return plugin.getConfig().getIntegerList("block-protocols"); + } + + @Override + public String getBlockedDisconnectMsg() { + return plugin.getConfig().getString("block-disconnect-msg", "You are using an unsupported Minecraft version!"); + } } diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index 0c9a64bec..ebe41c2f5 100644 --- a/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -1,5 +1,7 @@ package us.myles.ViaVersion.api; +import java.util.List; + public interface ViaVersionConfig { /** @@ -193,4 +195,18 @@ public interface ViaVersionConfig { * @return True if enabled */ boolean isForceJsonTransform(); + + /** + * Get the blocked protocols + * + * @return An Integer list + */ + List getBlockedProtocols(); + + /** + * Get the custom disconnect message + * + * @return Disconnect message + */ + String getBlockedDisconnectMsg(); } diff --git a/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java b/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java index 12cd4e8f2..149df567e 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java +++ b/src/main/java/us/myles/ViaVersion/protocols/base/BaseProtocol.java @@ -21,6 +21,7 @@ import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.Direction; import us.myles.ViaVersion.packets.State; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import java.util.List; import java.util.UUID; @@ -45,20 +46,26 @@ public class BaseProtocol extends Protocol { try { JSONObject json = (JSONObject) new JSONParser().parse(originalStatus); JSONObject version = (JSONObject) json.get("version"); - if (ViaVersion.getConfig().isSendSupportedVersions()) + int protocolVersion = ((Long) version.get("protocol")).intValue(); + + if (ViaVersion.getConfig().isSendSupportedVersions()) //Send supported versions version.put("supportedVersions", ViaVersion.getInstance().getSupportedVersions()); - if (ProtocolRegistry.SERVER_PROTOCOL == -1) { - Long original = (Long) version.get("protocol"); - ProtocolRegistry.SERVER_PROTOCOL = original.intValue(); - } + + if (ProtocolRegistry.SERVER_PROTOCOL == -1) // Set the Server protocol if the detection on startup failed + ProtocolRegistry.SERVER_PROTOCOL = protocolVersion; + List> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), ProtocolRegistry.SERVER_PROTOCOL); if (protocols != null) { - if ((long) version.get("protocol") != 9999) //Fix ServerListPlus + if (protocolVersion != 9999) //Fix ServerListPlus version.put("protocol", info.getProtocolVersion()); } else { // not compatible :(, *plays very sad violin* wrapper.user().setActive(false); } + + if (ViaVersion.getConfig().getBlockedProtocols().contains(info.getProtocolVersion())) + version.put("protocol", -1); // Show blocked versions as outdated + wrapper.set(Type.STRING, 0, json.toJSONString()); // Update value } catch (ParseException e) { e.printStackTrace(); @@ -152,7 +159,28 @@ public class BaseProtocol extends Protocol { registerIncoming(State.STATUS, 0x00, 0x00); // Status Request Packet registerIncoming(State.STATUS, 0x01, 0x01); // Status Ping Packet - registerIncoming(State.LOGIN, 0x00, 0x00); // Login Start Packet + // Login Start Packet + registerIncoming(State.LOGIN, 0x00, 0x00, new PacketRemapper() { + @Override + public void registerMap() { + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + int protocol = wrapper.user().get(ProtocolInfo.class).getProtocolVersion(); + if (ViaVersion.getConfig().getBlockedProtocols().contains(protocol)) { + if (!wrapper.user().getChannel().isOpen()) return; + + PacketWrapper disconnectPacket = new PacketWrapper(0x00, null, wrapper.user()); // Disconnect Packet + Protocol1_9TO1_8.FIX_JSON.write(disconnectPacket, ViaVersion.getConfig().getBlockedDisconnectMsg()); + disconnectPacket.send(BaseProtocol.class); + + wrapper.cancel(); + wrapper.user().getChannel().closeFuture(); + } + } + }); + } + }); // Login Start Packet registerIncoming(State.LOGIN, 0x01, 0x01); // Encryption Response Packet } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f7c7864b8..30116ef66 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -12,6 +12,11 @@ checkforupdates: true # Send the supported versions with the Status (Ping) response packet send-supported-versions: false +# Block specific Minecraft protocols that ViaVersion allows +# List of all Minecraft protocol versions: http://wiki.vg/Protocol_version_numbers +block-protocols: [] +# Change the blocked disconnect message +block-disconnect-msg: "You are using an unsupported Minecraft version!" # #----------------------------------------------------------# # GLOBAL PACKET LIMITER #