Skip to content

Commit a2a25e5

Browse files
ScribbleTASLudTAS
andcommitted
[Savestates] Fixed world resource pack throwing errors during loadstate
Co-authored-by: LudTAS <[email protected]>
1 parent cac9b51 commit a2a25e5

File tree

4 files changed

+126
-4
lines changed

4 files changed

+126
-4
lines changed

src/main/java/com/minecrafttas/tasmod/TASmod.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.minecrafttas.tasmod.playback.metadata.builtin.StartpositionMetadataExtension;
3030
import com.minecrafttas.tasmod.registries.TASmodPackets;
3131
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer;
32+
import com.minecrafttas.tasmod.savestates.handlers.SavestateResourcePackHandler;
3233
import com.minecrafttas.tasmod.savestates.storage.builtin.SavestateMotionStorage;
3334
import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer;
3435
import com.minecrafttas.tasmod.ticksync.TickSyncServer;
@@ -119,6 +120,9 @@ public void onInitialize() {
119120
SavestateMotionStorage motionStorage = new SavestateMotionStorage();
120121
PacketHandlerRegistry.register(motionStorage);
121122
EventListenerRegistry.register(motionStorage);
123+
SavestateResourcePackHandler resourcepackHandler = new SavestateResourcePackHandler();
124+
PacketHandlerRegistry.register(resourcepackHandler);
125+
EventListenerRegistry.register(resourcepackHandler);
122126
PacketHandlerRegistry.register(playUntil);
123127
EventListenerRegistry.register(playUntil);
124128
}

src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ public enum TASmodPackets implements PacketID {
104104
Minecraft mc = Minecraft.getMinecraft();
105105
((ScoreboardDuck) mc.world.getScoreboard()).clearScoreboard();
106106
}),
107+
/**
108+
* <p>Clears the resourcepack on the client side
109+
* <p>SIDE: Client<br>
110+
* ARGS: none
111+
*/
112+
SAVESTATE_CLEAR_RESOURCEPACK,
107113
/**
108114
* <p>Notifies the client to clear all inputs from the input buffer in {@link PlaybackControllerClient}
109115
* <p>SIDE: Both<br>

src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.minecrafttas.tasmod.savestates.files.SavestateDataFile.DataValues;
4141
import com.minecrafttas.tasmod.savestates.files.SavestateTrackerFile;
4242
import com.minecrafttas.tasmod.savestates.handlers.SavestatePlayerHandler;
43+
import com.minecrafttas.tasmod.savestates.handlers.SavestateResourcePackHandler;
4344
import com.minecrafttas.tasmod.savestates.handlers.SavestateWorldHandler;
4445
import com.minecrafttas.tasmod.util.LoggerMarkers;
4546
import com.minecrafttas.tasmod.util.Scheduler.Task;
@@ -386,6 +387,9 @@ public void loadState(int savestateIndex, boolean tickrate0, boolean changeIndex
386387
// Reenable level saving
387388
worldHandler.enableLevelSaving();
388389

390+
// Refresh server resourcepacks on the client
391+
SavestateResourcePackHandler.refreshServerResourcepack(server);
392+
389393
// Incrementing info file
390394
SavestateTrackerFile tracker = new SavestateTrackerFile(savestateDirectory.resolve(worldname + "-info.txt"));
391395
tracker.increaseLoadstateCount();
@@ -755,9 +759,9 @@ private int legacyIndexFile(Path savestateDat) {
755759
public PacketID[] getAcceptedPacketIDs() {
756760
return new TASmodPackets[] {
757761
//@formatter:off
758-
TASmodPackets.SAVESTATE_SAVE,
759-
TASmodPackets.SAVESTATE_LOAD,
760-
TASmodPackets.SAVESTATE_SCREEN,
762+
TASmodPackets.SAVESTATE_SAVE,
763+
TASmodPackets.SAVESTATE_LOAD,
764+
TASmodPackets.SAVESTATE_SCREEN,
761765
TASmodPackets.SAVESTATE_UNLOAD_CHUNKS
762766
//@formatter:on
763767
};
@@ -772,7 +776,7 @@ public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws
772776

773777
switch (packet) {
774778
case SAVESTATE_SAVE:
775-
Integer index = TASmodBufferBuilder.readInt(buf);
779+
int index = TASmodBufferBuilder.readInt(buf);
776780

777781
Task savestateTask = () -> {
778782
try {
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.minecrafttas.tasmod.savestates.handlers;
2+
3+
import java.nio.ByteBuffer;
4+
import java.nio.file.Path;
5+
import java.util.List;
6+
import java.util.concurrent.CompletableFuture;
7+
import java.util.concurrent.ExecutionException;
8+
import java.util.concurrent.TimeUnit;
9+
import java.util.concurrent.TimeoutException;
10+
11+
import com.minecrafttas.mctcommon.networking.Client.Side;
12+
import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException;
13+
import com.minecrafttas.mctcommon.networking.exception.WrongSideException;
14+
import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler;
15+
import com.minecrafttas.mctcommon.networking.interfaces.PacketID;
16+
import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler;
17+
import com.minecrafttas.tasmod.TASmod;
18+
import com.minecrafttas.tasmod.TASmodClient;
19+
import com.minecrafttas.tasmod.events.EventSavestate;
20+
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
21+
import com.minecrafttas.tasmod.registries.TASmodPackets;
22+
import com.minecrafttas.tasmod.savestates.exceptions.SavestateException;
23+
import com.minecrafttas.tasmod.util.Ducks.ResourcePackRepositoryDuck;
24+
import com.minecrafttas.tasmod.util.LoggerMarkers;
25+
26+
import net.minecraft.client.Minecraft;
27+
import net.minecraft.entity.player.EntityPlayerMP;
28+
import net.minecraft.server.MinecraftServer;
29+
30+
public class SavestateResourcePackHandler implements EventSavestate.EventServerLoadstate, ServerPacketHandler, ClientPacketHandler {
31+
32+
private CompletableFuture<String> future;
33+
34+
@Override
35+
public void onServerLoadstate(MinecraftServer server, int index, Path target, Path current) {
36+
if (server.getResourcePackUrl().isEmpty() || server.isDedicatedServer())
37+
return;
38+
39+
String serverOwnerName = server.getServerOwner();
40+
41+
try {
42+
TASmod.server.sendTo(serverOwnerName, new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_RESOURCEPACK));
43+
} catch (Exception e) {
44+
TASmod.LOGGER.catching(e);
45+
}
46+
future = new CompletableFuture<>();
47+
48+
String playername = null;
49+
try {
50+
playername = future.get(2L, TimeUnit.MINUTES);
51+
} catch (TimeoutException e) {
52+
throw new SavestateException(e, "Clearing resourcepacks %s timed out!", serverOwnerName);
53+
} catch (ExecutionException | InterruptedException e) {
54+
throw new SavestateException(e, "Clearing resourcepacks %s", serverOwnerName);
55+
}
56+
57+
TASmod.LOGGER.debug(LoggerMarkers.Savestate, "Cleared resourcepack for player {}", playername);
58+
}
59+
60+
@Override
61+
public PacketID[] getAcceptedPacketIDs() {
62+
return new TASmodPackets[] { TASmodPackets.SAVESTATE_CLEAR_RESOURCEPACK };
63+
}
64+
65+
@Override
66+
public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception {
67+
TASmodPackets packetId = (TASmodPackets) id;
68+
69+
Minecraft mc = Minecraft.getMinecraft();
70+
switch (packetId) {
71+
case SAVESTATE_CLEAR_RESOURCEPACK:
72+
mc.addScheduledTask(() -> {
73+
ResourcePackRepositoryDuck duck = (ResourcePackRepositoryDuck) mc.getResourcePackRepository();
74+
duck.clearServerResourcePackBlocking();
75+
try {
76+
TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_RESOURCEPACK));
77+
} catch (Exception e) {
78+
TASmod.LOGGER.catching(e);
79+
}
80+
});
81+
break;
82+
83+
default:
84+
throw new WrongSideException(packetId, Side.CLIENT);
85+
}
86+
}
87+
88+
@Override
89+
public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception {
90+
TASmodPackets packetId = (TASmodPackets) id;
91+
92+
switch (packetId) {
93+
case SAVESTATE_CLEAR_RESOURCEPACK:
94+
future.complete(username);
95+
break;
96+
97+
default:
98+
throw new WrongSideException(packetId, Side.SERVER);
99+
}
100+
}
101+
102+
public static void refreshServerResourcepack(MinecraftServer server) {
103+
List<EntityPlayerMP> players = server.getPlayerList().getPlayers();
104+
players.forEach((player) -> {
105+
player.loadResourcePack(server.getResourcePackUrl(), server.getResourcePackHash());
106+
});
107+
}
108+
}

0 commit comments

Comments
 (0)