Skip to content

Commit 9fe51d1

Browse files
committed
[Savestates] Fix game hanging when failing to load a temp savestate
- Add proper error handling in SavestateTempHandler
1 parent afccc26 commit 9fe51d1

File tree

2 files changed

+77
-9
lines changed

2 files changed

+77
-9
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ [email protected]
1616
# TASmod properties
1717
group=com.minecrafttas
1818
artifact=TASmod-1.12.2
19-
version=Beta2
19+
version=Beta2.1
2020
release=false

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

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.minecrafttas.tasmod.savestates.handlers;
22

3+
import static com.minecrafttas.tasmod.TASmod.LOGGER;
34
import static com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate.NONE;
45
import static com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate.PLAYBACK;
56
import static com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate.RECORDING;
@@ -12,7 +13,12 @@
1213
import com.minecrafttas.tasmod.events.EventPlaybackServer.EventControllerStateChange;
1314
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
1415
import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate;
16+
import com.minecrafttas.tasmod.registries.TASmodPackets;
1517
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer;
18+
import com.minecrafttas.tasmod.savestates.exceptions.SavestateException;
19+
import com.minecrafttas.tasmod.util.Component;
20+
21+
import net.minecraft.util.text.TextFormatting;
1622

1723
/**
1824
* <p>Handles the creation of temporary savestates when recording/playing back a TAS
@@ -48,23 +54,85 @@ public void onControllerStateChange(TASstate newstate, TASstate oldstate) {
4854
if (newstate == RECORDING && createState) {
4955
logger.info("Creating temporary savestate");
5056
createState = false;
51-
handler.saveStateTemp((paths) -> {
57+
try {
58+
handler.saveStateTemp((paths) -> {
59+
try {
60+
TASmod.server.sendToAll(new TASmodBufferBuilder(SAVESTATE_CLEAR_SCREEN));
61+
} catch (Exception e) {
62+
logger.catching(e);
63+
}
64+
});
65+
} catch (SavestateException e) {
66+
TASmod.getServerInstance().getServer().getPlayerList().sendMessage(Component.translatable(e.getMessage()).withStyle(TextFormatting.RED).build());
67+
5268
try {
53-
TASmod.server.sendToAll(new TASmodBufferBuilder(SAVESTATE_CLEAR_SCREEN));
54-
} catch (Exception e) {
69+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.TICKRATE_0_WARN));
70+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.CLEAR_SCREEN));
71+
} catch (Exception e1) {
5572
logger.catching(e);
5673
}
57-
});
74+
75+
LOGGER.error("Failed to create a temp savestate");
76+
LOGGER.catching(e);
77+
} catch (Exception e) {
78+
Throwable cause = e.getCause();
79+
if (cause == null) {
80+
cause = e;
81+
}
82+
TASmod.getServerInstance().getPlayerList().sendMessage(Component.translatable("msg.tasmod.savestate.failure", e.getMessage()).withStyle(TextFormatting.RED).build());
83+
84+
try {
85+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.TICKRATE_0_WARN));
86+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.CLEAR_SCREEN));
87+
} catch (Exception e1) {
88+
logger.catching(e);
89+
}
90+
91+
LOGGER.error("Failed to create a temp savestate");
92+
LOGGER.catching(e);
93+
} finally {
94+
handler.resetState();
95+
}
5896
} else if (newstate == PLAYBACK) {
5997
logger.info("Loading temporary savestate");
6098
createState = false;
61-
handler.loadStateTemp((paths) -> {
99+
try {
100+
handler.loadStateTemp((paths) -> {
101+
try {
102+
TASmod.server.sendToAll(new TASmodBufferBuilder(SAVESTATE_CLEAR_SCREEN));
103+
} catch (Exception e) {
104+
logger.catching(e);
105+
}
106+
});
107+
} catch (SavestateException e) {
108+
TASmod.getServerInstance().getServer().getPlayerList().sendMessage(Component.translatable(e.getMessage()).withStyle(TextFormatting.RED).build());
109+
110+
try {
111+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.CLEAR_SCREEN));
112+
} catch (Exception e1) {
113+
logger.catching(e);
114+
}
115+
116+
LOGGER.error("Failed to load a temp savestate");
117+
LOGGER.catching(e);
118+
} catch (Exception e) {
119+
Throwable cause = e.getCause();
120+
if (cause == null) {
121+
cause = e;
122+
}
123+
TASmod.getServerInstance().getPlayerList().sendMessage(Component.translatable("msg.tasmod.savestate.failure", e.getMessage()).withStyle(TextFormatting.RED).build());
124+
62125
try {
63-
TASmod.server.sendToAll(new TASmodBufferBuilder(SAVESTATE_CLEAR_SCREEN));
64-
} catch (Exception e) {
126+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.CLEAR_SCREEN));
127+
} catch (Exception e1) {
65128
logger.catching(e);
66129
}
67-
});
130+
131+
LOGGER.error("Failed to load a temp savestate");
132+
LOGGER.catching(e);
133+
} finally {
134+
handler.resetState();
135+
}
68136
}
69137
}
70138

0 commit comments

Comments
 (0)