在 mod [Java] 中更改 minecraft 代理



不久前,我发布了一个关于如何在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;
    }

最新更新