package net.md_5.bungee.forge; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.packet.PluginMessage; public class ForgeUtils { /** * Gets the registered FML channels from the packet. * * @param pluginMessage The packet representing FMLProxyPacket. * @return The registered channels. */ public static Set<String> readRegisteredChannels(PluginMessage pluginMessage) { String channels = new String( pluginMessage.getData(), Charsets.UTF_8 ); String[] split = channels.split( "\0" ); Set<String> channelSet = ImmutableSet.copyOf( split ); return channelSet; } /** * Gets the modlist from the packet. * * @param pluginMessage The packet representing FMLProxyPacket. * @return The modlist. */ public static Map<String, String> readModList(PluginMessage pluginMessage) { Map<String, String> modTags = Maps.newHashMap(); ByteBuf payload = Unpooled.wrappedBuffer( pluginMessage.getData() ); byte discriminator = payload.readByte(); if ( discriminator == 2 ) // ModList { ByteBuf buffer = payload.slice(); int modCount = DefinedPacket.readVarInt( buffer, 2 ); for ( int i = 0; i < modCount; i++ ) { modTags.put( DefinedPacket.readString( buffer ), DefinedPacket.readString( buffer ) ); } } return modTags; } /** * Get the build number of FML from the packet. * * @param modList The modlist, as a Map. * @return The build number, or 0 if it failed. */ public static int getFmlBuildNumber(Map<String, String> modList) { if ( modList.containsKey( "FML" ) ) { String fmlVersion = modList.get( "FML" ); // FML's version is hardcoded to this for builds beyond 1405 for 1.7.10 - if we see this, return Forge's build number. if ( fmlVersion.equals( "7.10.99.99" ) ) { Matcher matcher = ForgeConstants.FML_HANDSHAKE_VERSION_REGEX.matcher( modList.get( "Forge" ) ); if ( matcher.find() ) { // We know from the regex that we have an int. return Integer.parseInt( matcher.group( 4 ) ); } } else { Matcher matcher = ForgeConstants.FML_HANDSHAKE_VERSION_REGEX.matcher( fmlVersion ); if ( matcher.find() ) { // We know from the regex that we have an int. return Integer.parseInt( matcher.group( 4 ) ); } } } return 0; } }