1111import java .util .List ;
1212import java .util .stream .Collectors ;
1313
14+ import org .apache .commons .lang3 .ArrayUtils ;
1415import org .apache .logging .log4j .Logger ;
1516
1617import com .minecrafttas .mctcommon .events .EventListenerRegistry ;
@@ -135,11 +136,20 @@ public void saveState(int index, String name, SavestateCallback cb, SavestateFla
135136
136137 logger .trace ("Create new savestate index via indexer" );
137138 SavestatePaths paths = indexer .createSavestate (index , name , !SavestateFlags .BLOCK_CHANGE_INDEX .isBlocked (flags ));
139+
140+ if (paths .getSavestate ().index == 0 ) {
141+ if (!ArrayUtils .contains (flags , SavestateFlags .BLOCK_CLIENT_SAVESTATE ))
142+ flags = ArrayUtils .add (flags , SavestateFlags .BLOCK_CLIENT_SAVESTATE );
143+ }
144+
145+ savestateInner (paths , cb , flags );
146+ }
147+
148+ private void savestateInner (SavestatePaths paths , SavestateCallback cb , SavestateFlags ... flags ) {
138149 Path sourceFolder = paths .getSourceFolder ();
139150 Path targetFolder = paths .getTargetFolder ();
140151 int indexToSave = paths .getSavestate ().index ;
141152 logger .debug ("Source: {}, Target: {}" , sourceFolder , targetFolder );
142-
143153 EventListenerRegistry .fireEvent (EventSavestate .EventServerSavestate .class , server , paths );
144154
145155 if (Files .exists (targetFolder )) {
@@ -151,7 +161,7 @@ public void saveState(int index, String name, SavestateCallback cb, SavestateFla
151161 * Prevents creating an InputSavestate when saving at index 0 (Index 0 is the
152162 * savestate when starting a recording)
153163 */
154- if (index != 0 ) {
164+ if (! SavestateFlags . BLOCK_CLIENT_SAVESTATE . isBlocked ( flags ) ) {
155165 /*
156166 * Send the name of the world to all players. This will make a savestate of the
157167 * recording on the client with that name
@@ -235,10 +245,18 @@ public void loadState(int index, String name, SavestateCallback cb, SavestateFla
235245 SavestatePaths paths = indexer .loadSavestate (index , !SavestateFlags .BLOCK_CHANGE_INDEX .isBlocked (flags ));
236246 logger .debug (LoggerMarkers .Savestate , "Source: {}, Target: {}" , paths .getSourceFolder (), paths .getTargetFolder ());
237247
248+ if (paths .getSavestate ().index == 0 ) {
249+ if (!ArrayUtils .contains (flags , SavestateFlags .BLOCK_CLIENT_SAVESTATE ))
250+ flags = ArrayUtils .add (flags , SavestateFlags .BLOCK_CLIENT_SAVESTATE );
251+ }
252+
253+ loadStateInner (paths , cb , flags );
254+ }
255+
256+ private void loadStateInner (SavestatePaths paths , SavestateCallback cb , SavestateFlags ... flags ) {
238257 String worldname = server .getFolderName ();
239258 Path sourcefolder = paths .getSourceFolder ();
240259 Path targetfolder = paths .getTargetFolder ();
241- int indexToLoad = paths .getSavestate ().index ;
242260
243261 EventListenerRegistry .fireEvent (EventSavestate .EventServerLoadstate .class , server , paths );
244262
@@ -247,7 +265,7 @@ public void loadState(int index, String name, SavestateCallback cb, SavestateFla
247265 * savestate when starting a recording. Not doing this will load an empty
248266 * InputSavestate)
249267 */
250- if (indexToLoad != 0 ) {
268+ if (! SavestateFlags . BLOCK_CLIENT_SAVESTATE . isBlocked ( flags ) ) {
251269 try {
252270 // loadstate inputs client
253271 TASmod .server .sendToAll (new TASmodBufferBuilder (TASmodPackets .SAVESTATE_LOAD ).writeString (paths .getSavestate ().folder .toString ()));
@@ -576,6 +594,10 @@ public static enum SavestateFlags {
576594 * Stops updating the current index when savestating/loadstating
577595 */
578596 BLOCK_CHANGE_INDEX ,
597+ /**
598+ * Stops the creation/loading of a client savestate
599+ */
600+ BLOCK_CLIENT_SAVESTATE ,
579601 /**
580602 * Stops setting the tickrate to 0 after a savestate/loadstate
581603 */
0 commit comments