Fix race condition in resource pack recording (fixes #521)
If the server sends the resource pack right on connect (rather than when switching to a sub-server), then `mc.getNetworkHandler()` will be null.
This commit is contained in:
@@ -26,6 +26,7 @@ import io.netty.buffer.Unpooled;
|
|||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.network.ClientConnection;
|
||||||
import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket;
|
import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket;
|
||||||
import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket;
|
import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket;
|
||||||
import net.minecraft.network.packet.s2c.play.ItemPickupAnimationS2CPacket;
|
import net.minecraft.network.packet.s2c.play.ItemPickupAnimationS2CPacket;
|
||||||
@@ -339,7 +340,8 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
//#if MC>=10800
|
//#if MC>=10800
|
||||||
if (packet instanceof ResourcePackSendS2CPacket) {
|
if (packet instanceof ResourcePackSendS2CPacket) {
|
||||||
save(resourcePackRecorder.handleResourcePack((ResourcePackSendS2CPacket) packet));
|
ClientConnection connection = ctx.pipeline().get(ClientConnection.class);
|
||||||
|
save(resourcePackRecorder.handleResourcePack(connection, (ResourcePackSendS2CPacket) packet));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//#else
|
//#else
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
//#else
|
//#else
|
||||||
//$$ import com.google.common.util.concurrent.ListenableFuture;
|
//$$ import com.google.common.util.concurrent.ListenableFuture;
|
||||||
//#endif
|
//#endif
|
||||||
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
|
||||||
import net.minecraft.network.ClientConnection;
|
import net.minecraft.network.ClientConnection;
|
||||||
//#else
|
//#else
|
||||||
//$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor;
|
//$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor;
|
||||||
@@ -111,10 +110,8 @@ public class ResourcePackRecorder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public synchronized ResourcePackSendS2CPacket handleResourcePack(ResourcePackSendS2CPacket packet) {
|
public synchronized ResourcePackSendS2CPacket handleResourcePack(ClientConnection netManager, ResourcePackSendS2CPacket packet) {
|
||||||
final int requestId = nextRequestId++;
|
final int requestId = nextRequestId++;
|
||||||
final ClientPlayNetworkHandler netHandler = mc.getNetworkHandler();
|
|
||||||
final ClientConnection netManager = netHandler.getConnection();
|
|
||||||
final String url = packet.getURL();
|
final String url = packet.getURL();
|
||||||
final String hash = packet.getSHA1();
|
final String hash = packet.getSHA1();
|
||||||
|
|
||||||
@@ -138,7 +135,7 @@ public class ResourcePackRecorder {
|
|||||||
final ServerInfo serverData = mc.getCurrentServerEntry();
|
final ServerInfo serverData = mc.getCurrentServerEntry();
|
||||||
if (serverData != null && serverData.getResourcePack() == ServerInfo.ResourcePackState.ENABLED) {
|
if (serverData != null && serverData.getResourcePack() == ServerInfo.ResourcePackState.ENABLED) {
|
||||||
netManager.send(makeStatusPacket(hash, Status.ACCEPTED));
|
netManager.send(makeStatusPacket(hash, Status.ACCEPTED));
|
||||||
downloadResourcePackFuture(requestId, url, hash);
|
downloadResourcePackFuture(netManager, requestId, url, hash);
|
||||||
} else if (serverData != null && serverData.getResourcePack() != ServerInfo.ResourcePackState.PROMPT) {
|
} else if (serverData != null && serverData.getResourcePack() != ServerInfo.ResourcePackState.PROMPT) {
|
||||||
netManager.send(makeStatusPacket(hash, Status.DECLINED));
|
netManager.send(makeStatusPacket(hash, Status.DECLINED));
|
||||||
} else {
|
} else {
|
||||||
@@ -156,7 +153,7 @@ public class ResourcePackRecorder {
|
|||||||
}
|
}
|
||||||
if (result) {
|
if (result) {
|
||||||
netManager.send(makeStatusPacket(hash, Status.ACCEPTED));
|
netManager.send(makeStatusPacket(hash, Status.ACCEPTED));
|
||||||
downloadResourcePackFuture(requestId, url, hash);
|
downloadResourcePackFuture(netManager, requestId, url, hash);
|
||||||
} else {
|
} else {
|
||||||
netManager.send(makeStatusPacket(hash, Status.DECLINED));
|
netManager.send(makeStatusPacket(hash, Status.DECLINED));
|
||||||
}
|
}
|
||||||
@@ -180,10 +177,10 @@ public class ResourcePackRecorder {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadResourcePackFuture(int requestId, String url, final String hash) {
|
private void downloadResourcePackFuture(ClientConnection connection, int requestId, String url, final String hash) {
|
||||||
addCallback(downloadResourcePack(requestId, url, hash),
|
addCallback(downloadResourcePack(requestId, url, hash),
|
||||||
result -> mc.getNetworkHandler().sendPacket(makeStatusPacket(hash, Status.SUCCESSFULLY_LOADED)),
|
result -> connection.send(makeStatusPacket(hash, Status.SUCCESSFULLY_LOADED)),
|
||||||
throwable -> mc.getNetworkHandler().sendPacket(makeStatusPacket(hash, Status.FAILED_DOWNLOAD)));
|
throwable -> connection.send(makeStatusPacket(hash, Status.FAILED_DOWNLOAD)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
Reference in New Issue
Block a user