Skip to content

Commit b070d48

Browse files
committed
[Savestates] Properly implement savestate deletion
1 parent cfb0079 commit b070d48

File tree

3 files changed

+92
-24
lines changed

3 files changed

+92
-24
lines changed

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

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.minecrafttas.tasmod.registries.TASmodConfig;
1414
import com.minecrafttas.tasmod.registries.TASmodPackets;
1515
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateCallback;
16+
import com.minecrafttas.tasmod.savestates.SavestateIndexer.ErrorRunnable;
1617
import com.minecrafttas.tasmod.savestates.SavestateIndexer.FailedSavestate;
1718
import com.minecrafttas.tasmod.savestates.SavestateIndexer.Savestate;
1819
import com.minecrafttas.tasmod.savestates.exceptions.LoadstateException;
@@ -24,6 +25,7 @@
2425
import com.minecrafttas.tasmod.util.I18n;
2526
import com.minecrafttas.tasmod.util.LoggerMarkers;
2627

28+
import net.minecraft.client.Minecraft;
2729
import net.minecraft.command.CommandBase;
2830
import net.minecraft.command.CommandException;
2931
import net.minecraft.command.ICommandSender;
@@ -416,15 +418,15 @@ private void saveNew(ICommandSender sender) {
416418
try {
417419
TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_RENAME_SCREEN).writeInt(paths.getSavestate().getIndex()).writeString(sender.getName()));
418420
} catch (Exception e) {
419-
TASmod.LOGGER.catching(e);
421+
onFailure(sender, e);
420422
}
421423
}
422424
});
423425

424426
try {
425427
TASmod.savestateHandlerServer.saveState(doneSavingCallback);
426428
} catch (SavestateException e) {
427-
TASmod.LOGGER.catching(e);
429+
onFailure(sender, e);
428430
}
429431
}
430432

@@ -433,7 +435,7 @@ private void saveIndex(ICommandSender sender, int index) {
433435
try {
434436
TASmod.savestateHandlerServer.saveState(index, null);
435437
} catch (SavestateException e) {
436-
TASmod.LOGGER.catching(e);
438+
onFailure(sender, e);
437439
}
438440
}
439441

@@ -442,7 +444,7 @@ private void saveIndexName(ICommandSender sender, int index, String name) {
442444
try {
443445
TASmod.savestateHandlerServer.saveState(index, name, null);
444446
} catch (SavestateException e) {
445-
TASmod.LOGGER.catching(e);
447+
onFailure(sender, e);
446448
}
447449
}
448450

@@ -451,7 +453,7 @@ private void saveName(ICommandSender sender, String name) {
451453
try {
452454
TASmod.savestateHandlerServer.saveState(name, null);
453455
} catch (SavestateException e) {
454-
TASmod.LOGGER.catching(e);
456+
onFailure(sender, e);
455457
}
456458
}
457459

@@ -460,7 +462,7 @@ private void loadRecent(ICommandSender sender) {
460462
try {
461463
TASmod.savestateHandlerServer.loadState(null);
462464
} catch (LoadstateException e) {
463-
TASmod.LOGGER.catching(e);
465+
onFailure(sender, e);
464466
}
465467
}
466468

@@ -469,30 +471,69 @@ private void loadIndex(ICommandSender sender, int index) {
469471
try {
470472
TASmod.savestateHandlerServer.loadState(index, null);
471473
} catch (LoadstateException e) {
472-
TASmod.LOGGER.catching(e);
474+
onFailure(sender, e);
473475
}
474476
}
475477

476478
private void delete(ICommandSender sender, int index) {
477479
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command Delete {}", index);
480+
481+
SavestateCallback cb = (paths) -> {
482+
sender.sendMessage(Component.translatable("msg.lotaslight.savestate.delete", paths.getSavestate().getIndex()).withStyle(TextFormatting.GREEN).build());
483+
};
484+
478485
try {
479-
TASmod.savestateHandlerServer.deleteSavestate(index);
486+
TASmod.savestateHandlerServer.deleteSavestate(index, cb);
480487
} catch (SavestateDeleteException e) {
481-
e.printStackTrace();
488+
onFailure(sender, e);
482489
}
483490
}
484491

485492
private void deleteMore(ICommandSender sender, int indexFrom, int indexTo) {
486493
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command DeleteMore {}|{}", indexFrom, indexTo);
487-
deleteDis(sender, indexFrom, indexTo);
494+
int count = (indexTo + 1) - indexFrom;
495+
496+
if (count < 0) {
497+
onFailure(sender, new SavestateDeleteException("msg.tasmod.savestate.deleteMore.error.negative", count));
498+
}
499+
500+
String translationKey = "msg.tasmod.savestate.deleteMore" + (count == 1 ? ".singular" : ".plural");
501+
502+
//@formatter:off
503+
Component countComponent = Component.literal(Integer.toString(count)).withStyle(TextFormatting.RED);
504+
505+
Component confirmationComponent = Component.wrap(Component.translatable("msg.tasmod.savestate.deleteMore.clickable", true)
506+
.withStyle(
507+
style -> style
508+
.setClickEvent(
509+
CClickEvent.create(ClickEvent.Action.RUN_COMMAND, String.format("/savestate delete %s %s force", indexFrom, indexTo))
510+
)
511+
.setHoverEvent(
512+
CHoverEvent.create(HoverEvent.Action.SHOW_TEXT, Component.translatable("msg.tasmod.savestate.deleteMore.hover").withStyle(TextFormatting.DARK_RED)))
513+
)).withStyle(TextFormatting.GREEN);
514+
515+
516+
sender.sendMessage(
517+
Component.translatable(translationKey, countComponent, confirmationComponent).withStyle(TextFormatting.YELLOW).build()
518+
);
519+
//@formatter:on
488520
}
489521

490522
private void deleteDis(ICommandSender sender, int indexFrom, int indexTo) {
491523
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command DeleteDis {}|{}", indexFrom, indexTo);
524+
525+
SavestateCallback cb = (paths) -> {
526+
sender.sendMessage(Component.translatable("msg.tasmod.savestate.delete", paths.getSavestate().getIndex()).withStyle(TextFormatting.GREEN).build());
527+
};
528+
529+
ErrorRunnable onErr = (exception) -> {
530+
onFailure(sender, exception);
531+
};
532+
492533
try {
493-
TASmod.savestateHandlerServer.deleteSavestate(indexFrom, indexTo, null, null);
534+
TASmod.savestateHandlerServer.deleteSavestate(indexFrom, indexTo, cb, onErr);
494535
} catch (SavestateDeleteException e) {
495-
e.printStackTrace();
536+
onFailure(sender, e);
496537
}
497538
}
498539

@@ -548,4 +589,15 @@ private List<String> getIndexes(String[] args) {
548589
});
549590
return getListOfStringsMatchingLastWord(args, out);
550591
}
592+
593+
private static void onFailure(ICommandSender sender, Throwable e) {
594+
Minecraft mc = Minecraft.getMinecraft();
595+
mc.addScheduledTask(() -> {
596+
mc.displayGuiScreen(null);
597+
});
598+
599+
sender.sendMessage(Component.literal(e.getMessage()).withStyle(TextFormatting.RED).build());
600+
TASmod.LOGGER.catching(e);
601+
TASmod.savestateHandlerServer.resetState();
602+
}
551603
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,18 +350,23 @@ private void createIndexer(MinecraftServer server) {
350350
this.indexer = new SavestateIndexer(logger, savesDirectory, savestateBaseDirectory, worldname);
351351
}
352352

353-
public void deleteSavestate(int index) throws SavestateDeleteException {
353+
public void deleteSavestate(int index, SavestateCallback cb) throws SavestateDeleteException {
354354
logger.warn(LoggerMarkers.Savestate, "Deleting savestate {}", index);
355-
this.indexer.deleteSavestate(index);
355+
SavestatePaths paths = this.indexer.deleteSavestate(index);
356+
357+
if (cb != null)
358+
cb.invoke(paths);
356359
}
357360

358361
public void deleteSavestate(int from, int to, SavestateCallback cb, ErrorRunnable err) throws SavestateDeleteException {
359362
logger.warn(LoggerMarkers.Savestate, "Deleting multiple savestates from {} to {}", from, to);
360363
if (state == SavestateState.SAVING) {
361-
throw new SavestateDeleteException("A savestating operation is already being carried out");
364+
err.run(new SavestateDeleteException("msg.tasmod.savestate.save.error"));
365+
return;
362366
}
363367
if (state == SavestateState.LOADING) {
364-
throw new SavestateDeleteException("A loadstate operation is being carried out");
368+
err.run(new SavestateDeleteException("msg.tasmod.savestate.load.error"));
369+
return;
365370
}
366371

367372
DeletionRunnable onDelete = (paths) -> {
Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
11
package com.minecrafttas.tasmod.savestates.exceptions;
22

3-
public class SavestateDeleteException extends Exception {
4-
/**
5-
*
6-
*/
7-
private static final long serialVersionUID = -3117656644168896404L;
8-
9-
public SavestateDeleteException(String s) {
10-
super(s);
3+
public class SavestateDeleteException extends RuntimeException {
4+
5+
public SavestateDeleteException() {
6+
}
7+
8+
public SavestateDeleteException(String msg) {
9+
super(msg);
10+
}
11+
12+
public SavestateDeleteException(String msg, Object... args) {
13+
super(String.format(msg, args));
14+
}
15+
16+
public SavestateDeleteException(Throwable t, String msg) {
17+
super(msg, t);
18+
}
19+
20+
public SavestateDeleteException(Throwable t, String msg, Object... args) {
21+
super(String.format(msg, args), t);
1122
}
1223
}

0 commit comments

Comments
 (0)