Skip to content

Commit 157c30e

Browse files
committed
[Savestates] Fix loading savestates with RPs from commands softlocking
1 parent a2a25e5 commit 157c30e

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

src/main/java/com/minecrafttas/tasmod/commands/CommandSavestate.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,41 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4242
} else if (args.length >= 1) {
4343
if ("save".equals(args[0])) {
4444
if (args.length == 1) {
45-
saveLatest();
45+
TASmod.gameLoopSchedulerServer.add(() -> {
46+
try {
47+
saveLatest();
48+
} catch (CommandException e) {
49+
e.printStackTrace();
50+
}
51+
});
4652
} else if (args.length == 2) {
47-
saveWithIndex(args);
53+
TASmod.gameLoopSchedulerServer.add(() -> {
54+
try {
55+
saveWithIndex(args);
56+
} catch (CommandException e) {
57+
e.printStackTrace();
58+
}
59+
});
4860
} else {
4961
throw new CommandException("Too many arguments!", new Object[] {});
5062
}
5163
} else if ("load".equals(args[0])) {
5264
if (args.length == 1) {
53-
loadLatest();
65+
TASmod.gameLoopSchedulerServer.add(() -> {
66+
try {
67+
loadLatest();
68+
} catch (CommandException e) {
69+
e.printStackTrace();
70+
}
71+
});
5472
} else if (args.length == 2) {
55-
loadLatest(args);
73+
TASmod.gameLoopSchedulerServer.add(() -> {
74+
try {
75+
loadLatest(args);
76+
} catch (CommandException e) {
77+
e.printStackTrace();
78+
}
79+
});
5680
} else {
5781
throw new CommandException("Too many arguments!", new Object[] {});
5882
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.minecrafttas.tasmod.mixin.savestates;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.injection.At;
5+
import org.spongepowered.asm.mixin.injection.Inject;
6+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
7+
8+
import com.minecrafttas.tasmod.savestates.handlers.SavestateResourcePackHandler;
9+
10+
import net.minecraft.server.MinecraftServer;
11+
12+
@Mixin(MinecraftServer.class)
13+
public class MixinMinecraftServer {
14+
15+
@Inject(method = "reload", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/players/PlayerList;reloadResources()V"))
16+
public void inject_reload(CallbackInfo ci) {
17+
if (SavestateResourcePackHandler.clientRPLatch != null && SavestateResourcePackHandler.clientRPLatch.getCount() > 0) {
18+
System.out.println("Countdown");
19+
SavestateResourcePackHandler.clientRPLatch.countDown();
20+
}
21+
}
22+
}

src/main/java/com/minecrafttas/tasmod/savestates/handlers/SavestateResourcePackHandler.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.nio.file.Path;
55
import java.util.List;
66
import java.util.concurrent.CompletableFuture;
7+
import java.util.concurrent.CountDownLatch;
78
import java.util.concurrent.ExecutionException;
89
import java.util.concurrent.TimeUnit;
910
import java.util.concurrent.TimeoutException;
@@ -31,6 +32,8 @@ public class SavestateResourcePackHandler implements EventSavestate.EventServerL
3132

3233
private CompletableFuture<String> future;
3334

35+
public static CountDownLatch clientRPLatch;
36+
3437
@Override
3538
public void onServerLoadstate(MinecraftServer server, int index, Path target, Path current) {
3639
if (server.getResourcePackUrl().isEmpty() || server.isDedicatedServer())
@@ -70,8 +73,16 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws
7073
switch (packetId) {
7174
case SAVESTATE_CLEAR_RESOURCEPACK:
7275
mc.addScheduledTask(() -> {
76+
clientRPLatch = new CountDownLatch(1);
7377
ResourcePackRepositoryDuck duck = (ResourcePackRepositoryDuck) mc.getResourcePackRepository();
7478
duck.clearServerResourcePackBlocking();
79+
80+
try {
81+
clientRPLatch.await(30, TimeUnit.SECONDS);
82+
} catch (InterruptedException e) {
83+
e.printStackTrace();
84+
}
85+
7586
try {
7687
TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_RESOURCEPACK));
7788
} catch (Exception e) {

src/main/resources/tasmod.mixin.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"savestates.MixinChunkProviderServer",
1717
"savestates.MixinNetHandlerPlayServer",
1818
"savestates.MixinScoreboard",
19+
"savestates.MixinMinecraftServer",
1920

2021
// Events
2122
"events.MixinEntityPlayerMP",

0 commit comments

Comments
 (0)