Skip to content

Commit 27c01a8

Browse files
ScribbleScribble
authored andcommitted
Redoing messages in SavestateCommand
-Moved the logic to stop people from deleting/overwriting savestate 0 from the SavestateHandler to the savestate command -Modifying the savestate/loadstate packet, so you can save and load at a custom index with that packet
1 parent 547b01f commit 27c01a8

File tree

6 files changed

+227
-87
lines changed

6 files changed

+227
-87
lines changed

src/main/java/de/scribble/lp/tasmod/savestates/server/LoadstatePacket.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,30 @@
55

66
public class LoadstatePacket implements IMessage{
77

8+
public int index;
9+
10+
/**
11+
* Load a savestate at the current index
12+
*/
813
public LoadstatePacket() {
14+
index=-1;
15+
}
16+
17+
/**
18+
* Load the savestate at the specified index
19+
* @param index The index to load the savestate
20+
*/
21+
public LoadstatePacket(int index) {
22+
this.index = index;
923
}
24+
1025
@Override
1126
public void fromBytes(ByteBuf buf) {
27+
index=buf.readInt();
1228
}
1329

1430
@Override
1531
public void toBytes(ByteBuf buf) {
32+
buf.writeInt(index);
1633
}
1734
}

src/main/java/de/scribble/lp/tasmod/savestates/server/LoadstatePacketHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public IMessage onMessage(LoadstatePacket message, MessageContext ctx) {
2323
return;
2424
}
2525
try {
26-
TASmod.savestateHandler.loadState();
26+
TASmod.savestateHandler.loadState(message.index);
2727
} catch (LoadstateException e) {
2828
player.sendMessage(new TextComponentString(TextFormatting.RED+"Failed to load a savestate: "+e.getMessage()));
2929
} catch (Exception e) {

src/main/java/de/scribble/lp/tasmod/savestates/server/SavestateCommand.java

Lines changed: 172 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,23 @@
33
import java.io.IOException;
44
import java.util.List;
55

6+
import com.mojang.realmsclient.gui.ChatFormatting;
7+
8+
import de.scribble.lp.tasmod.ClientProxy;
69
import de.scribble.lp.tasmod.TASmod;
710
import de.scribble.lp.tasmod.savestates.server.exceptions.LoadstateException;
811
import de.scribble.lp.tasmod.savestates.server.exceptions.SavestateDeleteException;
912
import de.scribble.lp.tasmod.savestates.server.exceptions.SavestateException;
13+
import de.scribble.lp.tasmod.virtual.VirtualInput;
14+
import de.scribble.lp.tasmod.virtual.VirtualKeyboard;
15+
import net.minecraft.client.Minecraft;
1016
import net.minecraft.command.CommandBase;
1117
import net.minecraft.command.CommandException;
1218
import net.minecraft.command.ICommandSender;
1319
import net.minecraft.server.MinecraftServer;
1420
import net.minecraft.util.math.BlockPos;
1521
import net.minecraft.util.text.TextComponentString;
22+
import net.minecraft.util.text.event.ClickEvent;
1623

1724
public class SavestateCommand extends CommandBase {
1825

@@ -34,95 +41,195 @@ public int getRequiredPermissionLevel() {
3441
@Override
3542
public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
3643
if (args.length == 0) {
37-
int currentIndex = TASmod.savestateHandler.getCurrentIndex();
38-
sender.sendMessage(new TextComponentString(String.format("The current savestate index is %s", currentIndex)));
39-
sender.sendMessage(new TextComponentString(String.format("Available indexes are%s", TASmod.savestateHandler.getIndexesAsString())));
40-
sender.sendMessage(new TextComponentString(" "));
41-
sender.sendMessage(new TextComponentString("/savestate <save|load|delete|info> [index]"));
42-
sender.sendMessage(new TextComponentString("/savestate save - Make a savestate at the next index"));
43-
sender.sendMessage(new TextComponentString("/savestate save <index> - Make a savestate at the specified index"));
44-
sender.sendMessage(new TextComponentString("/savestate load - Load the savestate at the current index"));
45-
sender.sendMessage(new TextComponentString("/savestate load <index> - Load the savestate at the specified index"));
46-
sender.sendMessage(new TextComponentString("/savestate delete <index> - Delete the savestate at the specified index"));
47-
sender.sendMessage(new TextComponentString("/savestate delete <from> <to> - Delete the savestates from the first to the second index"));
48-
sender.sendMessage(new TextComponentString(""));
49-
sender.sendMessage(new TextComponentString("Instead of <index> you can use ~ to specify an index relative to the current one e.g. ~-1 will load " + (currentIndex - 1)));
44+
sendHelp(sender);
5045
} else if (args.length >= 1) {
5146
if ("save".equals(args[0])) {
5247
if (args.length == 1) {
53-
try {
54-
TASmod.savestateHandler.saveState();
55-
} catch (SavestateException e) {
56-
throw new CommandException(e.getMessage(), new Object[] {});
57-
} catch (IOException e) {
58-
e.printStackTrace();
59-
throw new CommandException(e.getMessage(), new Object[] {});
60-
} finally {
61-
TASmod.savestateHandler.state = SavestateState.NONE;
62-
}
48+
saveLatest();
6349
} else if (args.length == 2) {
64-
try {
65-
TASmod.savestateHandler.saveState(processIndex(args[1]));
66-
} catch (SavestateException e) {
67-
throw new CommandException(e.getMessage(), new Object[] {});
68-
} catch (IOException e) {
69-
e.printStackTrace();
70-
throw new CommandException(e.getMessage(), new Object[] {});
71-
} finally {
72-
TASmod.savestateHandler.state = SavestateState.NONE;
73-
}
50+
saveWithIndex(args);
7451
} else {
7552
throw new CommandException("Too many arguments!", new Object[] {});
7653
}
7754
} else if ("load".equals(args[0])) {
7855
if (args.length == 1) {
79-
try {
80-
TASmod.savestateHandler.loadState();
81-
} catch (LoadstateException e) {
82-
throw new CommandException(e.getMessage(), new Object[] {});
83-
} catch (IOException e) {
84-
e.printStackTrace();
85-
throw new CommandException(e.getMessage(), new Object[] {});
86-
} finally {
87-
TASmod.savestateHandler.state = SavestateState.NONE;
88-
}
56+
loadLatest();
8957
} else if (args.length == 2) {
90-
try {
91-
TASmod.savestateHandler.loadState(processIndex(args[1]));
92-
} catch (LoadstateException e) {
93-
throw new CommandException(e.getMessage(), new Object[] {});
94-
} catch (IOException e) {
95-
e.printStackTrace();
96-
throw new CommandException(e.getMessage(), new Object[] {});
97-
} finally {
98-
TASmod.savestateHandler.state = SavestateState.NONE;
99-
}
58+
loadLatest(args);
10059
} else {
10160
throw new CommandException("Too many arguments!", new Object[] {});
10261
}
10362
} else if ("delete".equals(args[0])) {
10463
if (args.length == 2) {
105-
try {
106-
TASmod.savestateHandler.deleteSavestate(processIndex(args[1]));
107-
} catch (SavestateDeleteException e) {
108-
throw new CommandException(e.getMessage(), new Object[] {});
109-
}
64+
delete(args);
11065
} else if (args.length == 3) {
111-
try {
112-
TASmod.savestateHandler.deleteSavestate(processIndex(args[1]), processIndex(args[2]));
113-
} catch (SavestateDeleteException e) {
114-
throw new CommandException(e.getMessage(), new Object[] {});
115-
}
66+
int args1 = processIndex(args[1]);
67+
int args2 = processIndex(args[2]);
68+
int count = args2 - args1;
69+
TextComponentString confirm = new TextComponentString(ChatFormatting.YELLOW + "Are you sure you want to delete " + count + (count == 1 ? " savestate? " : " savestates? ") + ChatFormatting.GREEN + "[YES]");
70+
confirm.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/savestate deletDis %s %s", args[1], args[2])));
71+
sender.sendMessage(confirm);
11672
} else {
11773
throw new CommandException("Too many arguments!", new Object[] {});
11874
}
75+
} else if ("deletDis".equals(args[0])) {
76+
if (args.length == 3) {
77+
deleteMultiple(args);
78+
}
11979
} else if ("info".equals(args[0])) {
120-
sender.sendMessage(new TextComponentString(String.format("The current savestate index is %s", TASmod.savestateHandler.getCurrentIndex())));
121-
sender.sendMessage(new TextComponentString(String.format("Available indexes are%s", TASmod.savestateHandler.getIndexesAsString())));
80+
sender.sendMessage(new TextComponentString(String.format("The current savestate index is %s%s", ChatFormatting.AQUA, TASmod.savestateHandler.getCurrentIndex())));
81+
sender.sendMessage(new TextComponentString(String.format("Available indexes are %s%s", ChatFormatting.AQUA, TASmod.savestateHandler.getIndexesAsString())));
82+
} else if ("help".equals(args[0])) {
83+
if (args.length == 1) {
84+
sendHelp(sender);
85+
} else if (args.length == 2) {
86+
int i = 1;
87+
try {
88+
i = Integer.parseInt(args[1]);
89+
} catch (NumberFormatException e) {
90+
throw new CommandException("Page number was not a number %s", new Object[] { args[1] });
91+
}
92+
sendHelp(sender, i);
93+
} else {
94+
throw new CommandException("Too many arguments", new Object[] {});
95+
}
96+
97+
}
98+
}
99+
}
100+
101+
private void sendHelp(ICommandSender sender) throws CommandException {
102+
sendHelp(sender, 1);
103+
}
104+
105+
private void sendHelp(ICommandSender sender, int i) throws CommandException {
106+
int currentIndex = TASmod.savestateHandler.getCurrentIndex();
107+
if (i > 3) {
108+
throw new CommandException("This help page doesn't exist (yet?)", new Object[] {});
109+
}
110+
if(i==1) {
111+
sender.sendMessage(new TextComponentString(ChatFormatting.GOLD+"-------------------Savestate Help 1--------------------\n"+ChatFormatting.RESET
112+
+ "Makes a backup of the minecraft world you are currently playing.\n\n"
113+
+ "The mod will keep track of the number of savestates you made in the 'current index' number which is currently "+ChatFormatting.AQUA+currentIndex+ChatFormatting.RESET
114+
+ String.format(". If you make a new savestate via %s/savestate save%s or by pressing %sJ%s by default, ", ChatFormatting.AQUA, ChatFormatting.RESET, ChatFormatting.AQUA, ChatFormatting.RESET)
115+
+ "the current index will increase by one. "
116+
+ String.format("If you load a savestate with %s/savestate load%s or %sK%s by default, it will load the savestate at the current index.\n", ChatFormatting.AQUA, ChatFormatting.RESET, ChatFormatting.AQUA, ChatFormatting.RESET)));
117+
}else if(i==2) {
118+
sender.sendMessage(new TextComponentString(String.format("%1$s-------------------Savestate Help 2--------------------\n"
119+
+ "You can load or save savestates in different indexes by specifying the index: %3$s/savestate %4$s<save|load> %5$s<index>%2$s\n"
120+
+ "This will change the %5$scurrent index%2$s to the index you specified.\n\n"
121+
+ "So, if you have the savestates %3$s1, 2, 3%2$s and your %5$scurrent index%2$s is %3$s3%2$s, %3$s/savestate %4$sload %5$s2%2$s will load the second savestate and will set the %5$scurrent index%2$s to %3$s2%2$s.\n"
122+
+ "But if you savestate again you will OVERWRITE the third savestate, so keep that in mind!!\n\n"
123+
+ "The savestate at index 0 will be the savestate when you started the TAS recording and can't be deleted or overwritten with this command"
124+
, /*1*/ChatFormatting.GOLD, /*2*/ChatFormatting.RESET, /*3*/ChatFormatting.AQUA, /*4*/ChatFormatting.GREEN, /*5*/ChatFormatting.YELLOW)));
125+
}else if(i==3) {
126+
sender.sendMessage(new TextComponentString(String.format("%1$s-------------------Savestate Help 3--------------------\n%2$s"
127+
+ "%3$s/savestate %4$ssave%2$s - Make a savestate at the next index\n"
128+
+ "%3$s/savestate %4$ssave%5$s <index>%2$s - Make a savestate at the specified index\n"
129+
+ "%3$s/savestate %4$sload%2$s - Load the savestate at the current index\n"
130+
+ "%3$s/savestate %4$sload%5$s <index>%2$s - Load the savestate at the specified index\n"
131+
+ "%3$s/savestate %4$sdelete%5$s <index>%2$s - Delete the savestate at the specified index\n"
132+
+ "%3$s/savestate %4$sdelete%5$s <fromIndex> <toIndex>%2$s - Delete the savestates from the fromIndex to the toIndex\n"
133+
+ "%3$s/savestate %4$sinfo%2$s - Shows the current index as well as the available indexes\n"
134+
+ "\nInstead of %4$s<index> %2$syou can use ~ to specify an index relative to the current index e.g. %3$s~-1%2$s will currently load %6$s\n",
135+
/*1*/ChatFormatting.GOLD, /*2*/ChatFormatting.RESET, /*3*/ChatFormatting.AQUA, /*4*/ChatFormatting.GREEN, /*5*/ChatFormatting.YELLOW, /*6*/(currentIndex - 1))));
136+
return;
137+
}
138+
TextComponentString nextPage=new TextComponentString(ChatFormatting.GOLD+"Click here to go to the next help page ("+(i+1)+")\n");
139+
nextPage.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/savestate help "+(i+1)+""));
140+
sender.sendMessage(nextPage);
141+
}
142+
143+
@Override
144+
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) {
145+
if (args.length == 1) {
146+
return getListOfStringsMatchingLastWord(args, new String[] { "save", "load", "delete", "info", "help"});
147+
} else if (args.length == 2 && !"info".equals(args[0])) {
148+
sender.sendMessage(new TextComponentString("Available indexes: " + ChatFormatting.AQUA + TASmod.savestateHandler.getIndexesAsString()));
149+
}
150+
return super.getTabCompletions(server, sender, args, targetPos);
151+
}
152+
153+
// ======================================================================
154+
155+
private void saveLatest() throws CommandException {
156+
try {
157+
TASmod.savestateHandler.saveState();
158+
} catch (SavestateException e) {
159+
throw new CommandException(e.getMessage(), new Object[] {});
160+
} catch (IOException e) {
161+
e.printStackTrace();
162+
throw new CommandException(e.getMessage(), new Object[] {});
163+
} finally {
164+
TASmod.savestateHandler.state = SavestateState.NONE;
165+
}
166+
}
167+
168+
private void saveWithIndex(String[] args) throws CommandException {
169+
try {
170+
int indexToSave = processIndex(args[1]);
171+
if (indexToSave <= 0) { // Disallow to save on Savestate 0
172+
indexToSave = -1;
122173
}
174+
TASmod.savestateHandler.saveState(indexToSave);
175+
} catch (SavestateException e) {
176+
throw new CommandException(e.getMessage(), new Object[] {});
177+
} catch (IOException e) {
178+
e.printStackTrace();
179+
throw new CommandException(e.getMessage(), new Object[] {});
180+
} finally {
181+
TASmod.savestateHandler.state = SavestateState.NONE;
182+
}
183+
}
184+
185+
private void loadLatest() throws CommandException {
186+
try {
187+
TASmod.savestateHandler.loadState();
188+
} catch (LoadstateException e) {
189+
throw new CommandException(e.getMessage(), new Object[] {});
190+
} catch (IOException e) {
191+
e.printStackTrace();
192+
throw new CommandException(e.getMessage(), new Object[] {});
193+
} finally {
194+
TASmod.savestateHandler.state = SavestateState.NONE;
195+
}
196+
}
197+
198+
private void loadLatest(String[] args) throws CommandException {
199+
try {
200+
TASmod.savestateHandler.loadState(processIndex(args[1]));
201+
} catch (LoadstateException e) {
202+
throw new CommandException(e.getMessage(), new Object[] {});
203+
} catch (IOException e) {
204+
e.printStackTrace();
205+
throw new CommandException(e.getMessage(), new Object[] {});
206+
} finally {
207+
TASmod.savestateHandler.state = SavestateState.NONE;
123208
}
124209
}
125210

211+
private void delete(String[] args) throws CommandException {
212+
int arg1 = processIndex(args[1]);
213+
if (arg1 == 0) {
214+
throw new CommandException("Cannot delete savestate 0", new Object[] {});
215+
}
216+
try {
217+
TASmod.savestateHandler.deleteSavestate(arg1);
218+
} catch (SavestateDeleteException e) {
219+
throw new CommandException(e.getMessage(), new Object[] {});
220+
}
221+
}
222+
223+
private void deleteMultiple(String[] args) throws CommandException {
224+
try {
225+
TASmod.savestateHandler.deleteSavestate(processIndex(args[1]), processIndex(args[2]));
226+
} catch (SavestateDeleteException e) {
227+
throw new CommandException(e.getMessage(), new Object[] {});
228+
}
229+
}
230+
231+
// ======================================================================
232+
126233
private int processIndex(String arg) throws CommandException {
127234
if ("~".equals(arg)) {
128235
return TASmod.savestateHandler.getCurrentIndex();
@@ -140,14 +247,4 @@ private int processIndex(String arg) throws CommandException {
140247
return i;
141248
}
142249
}
143-
144-
@Override
145-
public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) {
146-
if (args.length == 1) {
147-
return getListOfStringsMatchingLastWord(args, new String[] { "save", "load", "delete", "info" });
148-
} else if (args.length == 2 && !"info".equals(args[0])) {
149-
sender.sendMessage(new TextComponentString("Available indexes: " + TASmod.savestateHandler.getIndexesAsString()));
150-
}
151-
return super.getTabCompletions(server, sender, args, targetPos);
152-
}
153250
}

src/main/java/de/scribble/lp/tasmod/savestates/server/SavestateHandler.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public void saveState(int savestateIndex) throws SavestateException, IOException
127127
refresh();
128128

129129
// Setting the current index depending on the savestateIndex.
130-
if (savestateIndex <= 0) {
130+
if (savestateIndex < 0) {
131131
setCurrentIndex(currentIndex + 1); // If the savestateIndex <= 0, create a savestate at currentIndex+1
132132
} else {
133133
setCurrentIndex(savestateIndex);
@@ -357,11 +357,14 @@ private String getSavestateName(int index) {
357357
* @throws SavestateDeleteException
358358
*/
359359
public void deleteSavestate(int index) throws SavestateDeleteException {
360-
if (state != SavestateState.NONE) {
361-
throw new SavestateDeleteException("A savestate operation is currently being carried out");
360+
if (state == SavestateState.SAVING) {
361+
throw new SavestateDeleteException("A savestating operation is already being carried out");
362362
}
363-
if (index <= 0) {
364-
throw new SavestateDeleteException("Cannot delete the indexes below or exactly zero");
363+
if (state == SavestateState.LOADING) {
364+
throw new SavestateDeleteException("A loadstate operation is being carried out");
365+
}
366+
if (index < 0) {
367+
throw new SavestateDeleteException("Cannot delete the negative indexes");
365368
}
366369
File toDelete = getSavestateFile(index);
367370
if (toDelete.exists()) {
@@ -390,13 +393,19 @@ public void deleteSavestate(int index) throws SavestateDeleteException {
390393
* @throws SavestateDeleteException
391394
*/
392395
public void deleteSavestate(int from, int to) throws SavestateDeleteException {
393-
if (state != SavestateState.NONE) {
394-
throw new SavestateDeleteException("A savestate operation is currently being carried out");
396+
if (state == SavestateState.SAVING) {
397+
throw new SavestateDeleteException("A savestating operation is already being carried out");
398+
}
399+
if (state == SavestateState.LOADING) {
400+
throw new SavestateDeleteException("A loadstate operation is being carried out");
395401
}
396402
if (from >= to) {
397-
throw new SavestateDeleteException("The 'from-index' is smaller or equal to the 'to-index'");
403+
throw new SavestateDeleteException("Can't delete amounts that are negative or 0");
398404
}
399405
for (int i = from; i < to; i++) {
406+
if (i == 0) {
407+
continue;
408+
}
400409
try {
401410
deleteSavestate(i);
402411
} catch (SavestateDeleteException e) {
@@ -410,7 +419,7 @@ public String getIndexesAsString() {
410419
refresh();
411420
String out = "";
412421
for (int i : indexList) {
413-
out = out.concat(" " + i + ",");
422+
out = out.concat(" " + i + (i==indexList.size()-1?"":","));
414423
}
415424
return out;
416425
}

0 commit comments

Comments
 (0)