不久前,我发布了一个关于如何在Minecraft中使用代理的问题。
总结一下大部分问题,我正在研究一个暴徒,我希望能够在代码过程中随时更改 JVM 的代理。我知道在调用 VM 时设置代理很容易,但我希望能够在游戏中实时更改它,以便当我连接到服务器时,我的 IP 是不同的(这个模组主要由加入服务器的人和知道他们 IP 的人使用。
我尝试设置系统属性如下:
System.setProperty("http.proxyHost", "186.116.8.170");
System.setProperty("http.proxyPort", "8080");
还尝试过做
System.setProperty("https.proxyHost", "186.116.8.170");
System.setProperty("https.proxyPort", "8080");
但这些都没有奏效。
我将不胜感激任何帮助,谢谢。
minecraft 使用 netty,则需要使用 mixin 来修改 net.minecraft.network.NetworkManager
以下 1.8.9 的代码
@Mixin(NetworkManager.class)
public abstract class MixinNetworkManager {
@Shadow
@Final
public static LazyLoadBase<NioEventLoopGroup> CLIENT_NIO_EVENTLOOP;
@Overwrite
public static NetworkManager createNetworkManagerAndConnect(InetAddress address, int serverPort, boolean useNativeTransport) {
final NetworkManager networkmanager = new NetworkManager(EnumPacketDirection.CLIENTBOUND);
Bootstrap bootstrap=new Bootstrap();
EventLoopGroup eventLoopGroup;
Proxy proxy=ProxyManager.INSTANCE.getProxy();
if(proxy.type().equals(Proxy.Type.DIRECT)){
eventLoopGroup=CLIENT_NIO_EVENTLOOP.getValue();
bootstrap.channel(NioSocketChannel.class);
}else {
if(!Epoll.isAvailable()||!useNativeTransport){
System.out.println("Something goes wrong! Maybe you can disable proxy. [Epoll="+Epoll.isAvailable()+", UNT="+useNativeTransport+"]");
}
eventLoopGroup=new OioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).build());
bootstrap.channelFactory(new ProxyOioChannelFactory(proxy));
}
bootstrap.group(eventLoopGroup).handler(new ChannelInitializer<Channel>() {
protected void initChannel(Channel channel) {
try {
channel.config().setOption(ChannelOption.TCP_NODELAY, true);
} catch (ChannelException var3) {
var3.printStackTrace();
}
channel.pipeline().addLast("timeout", new ReadTimeoutHandler(30)).addLast("splitter", new MessageDeserializer2()).addLast("decoder", new MessageDeserializer(EnumPacketDirection.CLIENTBOUND)).addLast("prepender", new MessageSerializer2()).addLast("encoder", new MessageSerializer(EnumPacketDirection.SERVERBOUND)).addLast("packet_handler", networkmanager);
}
});
bootstrap.connect(address, serverPort).syncUninterruptibly();
return networkmanager;
}