Skip to content

Commit b1b77c4

Browse files
committed
[Savestates] Add temporary savestates for /record and /play
1 parent c47b3bd commit b1b77c4

File tree

6 files changed

+98
-24
lines changed

6 files changed

+98
-24
lines changed

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.minecrafttas.tasmod.commands;
22

33
import com.minecrafttas.tasmod.TASmod;
4-
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
5-
import com.minecrafttas.tasmod.registries.TASmodPackets;
64

75
import net.minecraft.command.CommandBase;
86
import net.minecraft.command.CommandException;
@@ -25,11 +23,7 @@ public String getUsage(ICommandSender sender) {
2523
@Override
2624
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
2725
if (sender instanceof EntityPlayer) {
28-
try {
29-
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_CLEAR_INPUTS));
30-
} catch (Exception e) {
31-
e.printStackTrace();
32-
}
26+
TASmod.playbackControllerServer.clearInputs();
3327
}
3428
}
3529

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public String getName() {
2323

2424
@Override
2525
public String getUsage(ICommandSender sender) {
26-
return "/play";
26+
return "/play [nosave]";
2727
}
2828

2929
@Override
@@ -41,16 +41,23 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4141
if (!(sender instanceof EntityPlayer)) {
4242
return;
4343
}
44-
if (args.length < 1) {
45-
TASmod.playbackControllerServer.togglePlayback();
46-
} else if (args.length > 1) {
44+
if (args.length <= 1) {
45+
boolean loadTempSavestate = true;
46+
if (args.length == 1 && "nosave".equals(args[0])) {
47+
loadTempSavestate = false;
48+
}
49+
TASmod.playbackControllerServer.togglePlayback(loadTempSavestate);
50+
} else if (args.length > 2) {
4751
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Too many arguments. " + getUsage(sender)));
4852
}
4953

5054
}
5155

5256
@Override
5357
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) {
58+
if (args.length == 1) {
59+
return getListOfStringsMatchingLastWord(args, "nosave");
60+
}
5461
return super.getTabCompletions(server, sender, args, targetPos);
5562
}
5663
}

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.minecraft.command.ICommandSender;
1111
import net.minecraft.entity.player.EntityPlayer;
1212
import net.minecraft.server.MinecraftServer;
13+
import net.minecraft.util.math.BlockPos;
1314
import net.minecraft.util.text.TextComponentString;
1415
import net.minecraft.util.text.TextFormatting;
1516

@@ -22,7 +23,7 @@ public String getName() {
2223

2324
@Override
2425
public String getUsage(ICommandSender sender) {
25-
return "/record";
26+
return "/record [nosave]";
2627
}
2728

2829
@Override
@@ -40,14 +41,23 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args
4041
if (!(sender instanceof EntityPlayer)) {
4142
return;
4243
}
43-
if (args.length < 1) {
44-
TASmod.playbackControllerServer.toggleRecording();
45-
// TASmod.tickSchedulerServer.add(() ->{
46-
// TASmod.ktrngHandler.broadcastStartSeed();
47-
// });
44+
if (args.length <= 1) {
45+
boolean saveTempSavestate = true;
46+
if (args.length == 1 && "nosave".equals(args[0])) {
47+
saveTempSavestate = false;
48+
}
49+
TASmod.playbackControllerServer.toggleRecording(saveTempSavestate);
4850
} else if (args.length > 1) {
4951
sender.sendMessage(new TextComponentString(TextFormatting.RED + "Too many arguments. " + getUsage(sender)));
5052
}
5153

5254
}
55+
56+
@Override
57+
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) {
58+
if (args.length == 1) {
59+
return getListOfStringsMatchingLastWord(args, "nosave");
60+
}
61+
return super.getTabCompletions(server, sender, args, targetPos);
62+
}
5363
}

src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerServer.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class PlaybackControllerServer implements ServerPacketHandler {
3333

3434
private TASstate state;
3535

36+
private boolean createState = true;
37+
3638
@Override
3739
public PacketID[] getAcceptedPacketIDs() {
3840
//@formatter:off
@@ -62,7 +64,7 @@ public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws
6264
break;
6365

6466
case PLAYBACK_CLEAR_INPUTS:
65-
TASmod.server.sendToAll(new TASmodBufferBuilder(PLAYBACK_CLEAR_INPUTS));
67+
clearInputs();
6668
break;
6769
case PLAYBACK_FULLPLAY:
6870
case PLAYBACK_FULLRECORD:
@@ -98,14 +100,42 @@ public void setServerState(TASstate stateIn) {
98100
}
99101
}
100102

101-
public void toggleRecording() {
103+
public void toggleRecording(boolean saveSavestate) {
104+
if (state == TASstate.NONE && createState && saveSavestate) {
105+
createState = false;
106+
TASmod.savestateHandlerServer.saveStateTemp((paths) -> {
107+
try {
108+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_SCREEN));
109+
} catch (Exception e) {
110+
TASmod.LOGGER.catching(e);
111+
}
112+
});
113+
}
102114
setState(state == TASstate.RECORDING ? TASstate.NONE : TASstate.RECORDING);
103115
}
104116

105-
public void togglePlayback() {
117+
public void togglePlayback(boolean loadSavestate) {
118+
if (state == TASstate.NONE && loadSavestate) {
119+
TASmod.savestateHandlerServer.loadStateTemp((paths) -> {
120+
try {
121+
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_CLEAR_SCREEN));
122+
} catch (Exception e) {
123+
TASmod.LOGGER.catching(e);
124+
}
125+
});
126+
}
106127
setState(state == TASstate.PLAYBACK ? TASstate.NONE : TASstate.PLAYBACK);
107128
}
108129

130+
public void clearInputs() {
131+
createState = true;
132+
try {
133+
TASmod.server.sendToAll(new TASmodBufferBuilder(PLAYBACK_CLEAR_INPUTS));
134+
} catch (Exception e) {
135+
e.printStackTrace();
136+
}
137+
}
138+
109139
public TASstate getState() {
110140
return state;
111141
}

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,23 @@ public void saveState(int index, String name, SavestateCallback cb, SavestateFla
145145
savestateInner(paths, cb, flags);
146146
}
147147

148+
public void saveStateTemp(SavestateCallback cb) {
149+
SavestatePaths paths = indexer.createTempSavestate();
150+
SavestateFlags[] flags = new SavestateFlags[] { SavestateFlags.BLOCK_CLIENT_SAVESTATE, SavestateFlags.BLOCK_PAUSE_TICKRATE };
151+
savestateInner(paths, cb, flags);
152+
paths.getSavestate().save();
153+
}
154+
148155
private void savestateInner(SavestatePaths paths, SavestateCallback cb, SavestateFlags... flags) {
149156
Path sourceFolder = paths.getSourceFolder();
150157
Path targetFolder = paths.getTargetFolder();
151-
int indexToSave = paths.getSavestate().index;
158+
Integer indexToSave = paths.getSavestate().index;
152159
logger.debug("Source: {}, Target: {}", sourceFolder, targetFolder);
153160
EventListenerRegistry.fireEvent(EventSavestate.EventServerSavestate.class, server, paths);
154161

155162
if (Files.exists(targetFolder)) {
156-
logger.warn(LoggerMarkers.Savestate, "WARNING! Overwriting the savestate with the index {}", indexToSave);
163+
if (indexToSave != null)
164+
logger.warn(LoggerMarkers.Savestate, "WARNING! Overwriting the savestate with the index {}", indexToSave);
157165
deleteFolder(targetFolder);
158166
}
159167

@@ -253,6 +261,15 @@ public void loadState(int index, String name, SavestateCallback cb, SavestateFla
253261
loadStateInner(paths, cb, flags);
254262
}
255263

264+
public void loadStateTemp(SavestateCallback cb) {
265+
SavestatePaths paths = indexer.loadTempSavestate();
266+
if (paths == null)
267+
return;
268+
SavestateFlags[] flags = new SavestateFlags[] { SavestateFlags.BLOCK_CLIENT_SAVESTATE, SavestateFlags.BLOCK_PAUSE_TICKRATE };
269+
loadStateInner(paths, cb, flags);
270+
paths.getSavestate().save();
271+
}
272+
256273
private void loadStateInner(SavestatePaths paths, SavestateCallback cb, SavestateFlags... flags) {
257274
String worldname = server.getFolderName();
258275
Path sourcefolder = paths.getSourceFolder();

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,8 @@ public void run() {
380380
Throwable error = new SavestateException("Savestate.json data file not found in " + savestateBaseDirectory.relativize(savestateDat));
381381
savestate = new FailedSavestate(path, backupIndex, null, null, error);
382382
}
383-
savestateList.put(savestate.getIndex(), savestate.clone());
383+
if (savestate.index != null) // Temporary savestates have no index and are not listed in the savestatelist
384+
savestateList.put(savestate.getIndex(), savestate.clone());
384385
});
385386
sortSavestateList();
386387
try {
@@ -484,7 +485,7 @@ public class Savestate extends AbstractDataFile {
484485
protected Logger logger = TASmod.LOGGER;
485486

486487
private Savestate(Path datFile, Path folder) {
487-
this(datFile, -1, null, null, folder);
488+
this(datFile, null, null, null, folder);
488489
}
489490

490491
private Savestate(Path file, Integer index, String name, Date date, Path folder) {
@@ -746,4 +747,19 @@ public int getNextIndex(int index) {
746747
}
747748
return index;
748749
}
750+
751+
public SavestatePaths createTempSavestate() {
752+
Path sourceDirectory = savesDir.resolve(worldname);
753+
Path targetDirectory = currentSavestateDir.resolve(worldname + "-SavestateTemp");
754+
Savestate tempSavestate = new Savestate(targetDirectory.resolve(savestateFilePath), null, "Temporary Savestate!", new Date(), targetDirectory);
755+
return SavestatePaths.of(tempSavestate, sourceDirectory, targetDirectory);
756+
}
757+
758+
public SavestatePaths loadTempSavestate() {
759+
Path sourceDirectory = currentSavestateDir.resolve(worldname + "-SavestateTemp");
760+
if (!Files.exists(sourceDirectory))
761+
return null;
762+
Path targetDirectory = savesDir.resolve(worldname);
763+
return SavestatePaths.of(currentSavestate.clone(), sourceDirectory, targetDirectory);
764+
}
749765
}

0 commit comments

Comments
 (0)