Skip to content

Commit f678dfb

Browse files
Add last of misc commits to Master branch
1 parent 2e8b24b commit f678dfb

4 files changed

Lines changed: 120 additions & 1 deletion

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.dimdev.vanillafix.bugs.mixins.client;
2+
3+
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
4+
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
5+
import net.minecraft.network.EnumConnectionState;
6+
import net.minecraft.network.EnumPacketDirection;
7+
import net.minecraft.network.Packet;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Overwrite;
10+
11+
import javax.annotation.Nullable;
12+
import java.lang.reflect.Constructor;
13+
import java.lang.reflect.InvocationTargetException;
14+
import java.util.function.Supplier;
15+
16+
@Mixin(EnumConnectionState.class)
17+
public final class MixinEnumConnectionState {
18+
19+
private final Int2ObjectMap<Supplier<? extends Packet<?>>> serverbound = new Int2ObjectArrayMap<>();
20+
private final Int2ObjectMap<Supplier<? extends Packet<?>>> clientbound = new Int2ObjectArrayMap<>();
21+
private int serverboundId = 0, clientboundId = 0;
22+
23+
/**
24+
* @reason Makes packet construction faster
25+
*/
26+
@Overwrite
27+
protected EnumConnectionState registerPacket(EnumPacketDirection direction, Class<? extends Packet<?>> packetClass) {
28+
Int2ObjectMap<Supplier<? extends Packet<?>>> suppliers = direction == EnumPacketDirection.SERVERBOUND ? serverbound : clientbound;
29+
Constructor<? extends Packet<?>> constructor;
30+
try {
31+
constructor = packetClass.getConstructor();
32+
} catch (NoSuchMethodException ex) {
33+
throw new RuntimeException(ex);
34+
}
35+
constructor.setAccessible(true);
36+
suppliers.put(direction == EnumPacketDirection.SERVERBOUND ? serverboundId++ : clientboundId++, () -> {
37+
try {
38+
return constructor.newInstance();
39+
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
40+
throw new RuntimeException(ex);
41+
}
42+
});
43+
return (EnumConnectionState) (Object) this;
44+
}
45+
46+
/**
47+
* @reason Makes packet construction faster
48+
*/
49+
@Nullable
50+
@Overwrite
51+
public Packet<?> getPacket(EnumPacketDirection direction, int packetId) {
52+
Supplier<? extends Packet<?>> packet = (direction == EnumPacketDirection.SERVERBOUND ? serverbound : clientbound).get(packetId);
53+
return packet == null ? null : packet.get();
54+
}
55+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.dimdev.vanillafix.bugs.mixins.client;
2+
3+
import net.minecraft.client.network.NetHandlerLoginClient;
4+
import net.minecraft.network.EnumConnectionState;
5+
import net.minecraft.network.NetworkManager;
6+
import net.minecraft.network.login.server.SPacketLoginSuccess;
7+
import org.spongepowered.asm.mixin.Final;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Shadow;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
14+
@Mixin(NetHandlerLoginClient.class)
15+
public final class MixinNetHandlerLoginClient {
16+
17+
@Shadow @Final private NetworkManager networkManager;
18+
19+
/**
20+
* @reason forces reading of the channel when we enable autoread
21+
* Fixes issue with stuck "Logging in..." screen
22+
*/
23+
@Inject(method = "handleLoginSuccess", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;setConnectionState(Lnet/minecraft/network/EnumConnectionState;)V"), cancellable = true)
24+
private void onConnectionStateSet(SPacketLoginSuccess packetIn, CallbackInfo ci) {
25+
ci.cancel();
26+
}
27+
28+
/**
29+
* @reason forces reading of the channel when we enable autoread
30+
* Fixes issue with stuck "Logging in..." screen
31+
*/
32+
@Inject(method = "handleLoginSuccess", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;setNetHandler(Lnet/minecraft/network/INetHandler;)V", shift = At.Shift.AFTER))
33+
private void onNetHandlerSet(SPacketLoginSuccess packetIn, CallbackInfo ci) {
34+
this.networkManager.setConnectionState(EnumConnectionState.PLAY);
35+
}
36+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.dimdev.vanillafix.bugs.mixins.client;
2+
3+
import io.netty.channel.Channel;
4+
import net.minecraft.network.EnumConnectionState;
5+
import net.minecraft.network.NetworkManager;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
@Mixin(NetworkManager.class)
13+
public final class MixinNetworkManager {
14+
15+
@Shadow private Channel channel;
16+
17+
/**
18+
* @reason forces reading of the channel when we enable autoread
19+
* Fixes issue with stuck "Logging in..." screen
20+
*/
21+
@Inject(method = "setConnectionState", at = @At(value = "INVOKE", target = "Lio/netty/channel/ChannelConfig;setAutoRead(Z)Lio/netty/channel/ChannelConfig;", shift = At.Shift.AFTER))
22+
private void onAutoReadEnabled(EnumConnectionState newState, CallbackInfo ci) {
23+
this.channel.read();
24+
}
25+
}

src/main/resources/mixins.vanillafix.bugs.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@
2121
"client.MixinEntityPlayerSP",
2222
"client.MixinIntegratedServer",
2323
"client.MixinEntityRenderer",
24-
"client.MixinThreadDownloadImageData"
24+
"client.MixinThreadDownloadImageData",
25+
"client.MixinEnumConnectionState",
26+
"client.MixinNetHandlerLoginClient",
27+
"client.MixinNetworkManager"
2528
],
2629
"injectors": {
2730
"maxShiftBy": 10

0 commit comments

Comments
 (0)