Skip to content

Commit 895344d

Browse files
committed
[Savestates] Add command feedback
- Add command help if no savestates are available and running /savestate
1 parent 90e7c43 commit 895344d

File tree

7 files changed

+217
-942
lines changed

7 files changed

+217
-942
lines changed

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

Lines changed: 157 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
import java.util.regex.Pattern;
99

1010
import com.minecrafttas.tasmod.TASmod;
11-
import com.minecrafttas.tasmod.TASmodClient;
1211
import com.minecrafttas.tasmod.networking.TASmodBufferBuilder;
13-
import com.minecrafttas.tasmod.registries.TASmodConfig;
1412
import com.minecrafttas.tasmod.registries.TASmodPackets;
1513
import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateCallback;
1614
import com.minecrafttas.tasmod.savestates.SavestateIndexer.ErrorRunnable;
@@ -50,7 +48,7 @@ public String getName() {
5048

5149
@Override
5250
public String getUsage(ICommandSender sender) {
53-
return "/savestate save|load|delete|reload|rename|info|import";
51+
return "/savestate save|load|delete|reload|rename|info";
5452
}
5553

5654
@Override
@@ -218,9 +216,9 @@ else if ("info".equals(first)) {
218216
}
219217
}
220218

221-
else if ("import".equals(first)) {
222-
importing(sender);
223-
}
219+
// else if ("import".equals(first)) {
220+
// importing(sender);
221+
// }
224222

225223
throw new WrongUsageException(getUsage(sender));
226224
}
@@ -289,11 +287,16 @@ private void infoIndex(ICommandSender sender, Integer index) {
289287
infoIndexAmount(sender, index, null);
290288
}
291289

290+
@SuppressWarnings("unused")
292291
private void infoIndexAmount(ICommandSender sender, Integer indexToDisplay, Integer amount) {
293292
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command InfoIndexAmount {}|{}", indexToDisplay, amount);
294293

295294
int currentIndex = TASmod.savestateHandlerServer.getCurrentIndex();
296295
int size = TASmod.savestateHandlerServer.size();
296+
297+
if (size == 0)
298+
sendHelp(sender);
299+
297300
if (indexToDisplay == null) {
298301
indexToDisplay = currentIndex;
299302
}
@@ -303,13 +306,16 @@ private void infoIndexAmount(ICommandSender sender, Integer indexToDisplay, Inte
303306

304307
sender.sendMessage(Component.literal("").build()); // Print an empty line
305308

306-
String format = I18n.format("msg.tasmod.savestate.dateformat");
309+
String format = "MM/dd/yyyy hh:mm:ss a"; // TODO Add server config
310+
if (!sender.getServer().isDedicatedServer()) {
311+
format = I18n.format("msg.tasmod.savestate.dateformat");
312+
}
307313
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
308314

309315
List<Savestate> savestateList = TASmod.savestateHandlerServer.getSavestateInfo(indexToDisplay, amount);
310316

311317
if (savestateList.size() < size && once) {
312-
sender.sendMessage(Component.translatable("gui.tasmod.savestate.omitted", "/savestate info all").withStyle(TextFormatting.RED, TextFormatting.ITALIC).build());
318+
sender.sendMessage(Component.translatable("msg.tasmod.savestate.omitted", "/savestate info all").withStyle(TextFormatting.RED, TextFormatting.ITALIC).build());
313319
once = false;
314320
}
315321

@@ -348,7 +354,7 @@ private void infoIndexAmount(ICommandSender sender, Integer indexToDisplay, Inte
348354
CHoverEvent.create(HoverEvent.Action.SHOW_TEXT, Component.literal(date).withStyle(TextFormatting.GOLD)
349355
)));
350356
} else {
351-
if(!TASmodClient.config.getBoolean(TASmodConfig.SAVESTATE_SHOW_CONTROLS)) {
357+
if(/*!TASmodClient.config.getBoolean(TASmodConfig.SAVESTATE_SHOW_CONTROLS)*/false) { // TODO Add server config
352358
msg = Component.translatable("%s: %s",
353359
Component.literal(index).withStyle(indexColor),
354360
Component.literal(name).withStyle(nameColor))
@@ -406,71 +412,140 @@ private void infoIndexAmount(ICommandSender sender, Integer indexToDisplay, Inte
406412
}
407413
}
408414

415+
private void sendHelp(ICommandSender sender) {
416+
UnaryOperator<Style> hover = t -> t.setHoverEvent(CHoverEvent.create(HoverEvent.Action.SHOW_TEXT, Component.translatable("Click me!").withStyle(TextFormatting.AQUA)));
417+
UnaryOperator<Style> click;
418+
419+
sender.sendMessage(Component.translatable("You currently do not have any savestates!").withStyle(TextFormatting.RED).build());
420+
sender.sendMessage(Component.literal("").build());
421+
click = t -> t.setClickEvent(CClickEvent.create(ClickEvent.Action.SUGGEST_COMMAND, "/savestate save My first savestate!"));
422+
sender.sendMessage(Component.translatable("Use %s to create one", Component.literal("/savestate save [name]").withStyle(hover).withStyle(click).withStyle(TextFormatting.AQUA, TextFormatting.BOLD)).withStyle(TextFormatting.YELLOW).build());
423+
click = t -> t.setClickEvent(CClickEvent.create(ClickEvent.Action.SUGGEST_COMMAND, "/savestate load"));
424+
sender.sendMessage(Component.translatable("then use %s to load it.", Component.literal("/savestate load").withStyle(hover).withStyle(click).withStyle(TextFormatting.AQUA, TextFormatting.BOLD)).withStyle(TextFormatting.YELLOW).build());
425+
sender.sendMessage(Component.translatable("This can also be done with the hotkeys J and K respectively.").withStyle(TextFormatting.YELLOW).build());
426+
click = t -> t.setClickEvent(CClickEvent.create(ClickEvent.Action.SUGGEST_COMMAND, "/savestate"));
427+
sender.sendMessage(Component.translatable("Running %s will display all savestates", Component.literal("/savestate").withStyle(hover).withStyle(click).withStyle(TextFormatting.AQUA, TextFormatting.BOLD)).withStyle(TextFormatting.YELLOW).build());
428+
sender.sendMessage(Component.translatable("(You can click on the %s!)", Component.translatable("commands").withStyle(TextFormatting.AQUA)).withStyle(TextFormatting.GREEN).build());
429+
}
430+
409431
private void infoAll(ICommandSender sender) {
410432
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command InfoAll");
411433
}
412434

413435
private void saveNew(ICommandSender sender) {
414436
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command SaveNew");
415437

416-
try {
417-
TASmod.savestateHandlerServer.saveState(createCallback(sender));
418-
} catch (SavestateException e) {
419-
onFailure(sender, e);
420-
}
438+
SavestateCallback cb = createChatMessageCallback(sender, "msg.tasmod.savestate.save.end");
439+
440+
TASmod.gameLoopSchedulerServer.add(() -> {
441+
442+
try {
443+
TASmod.savestateHandlerServer.saveState(cb);
444+
} catch (SavestateException e) {
445+
onFailure(sender, e);
446+
}
447+
});
421448
}
422449

423450
private void saveIndex(ICommandSender sender, int index) {
424451
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command SaveIndex {}", index);
425452

426-
try {
427-
TASmod.savestateHandlerServer.saveState(index, createCallback(sender));
428-
} catch (SavestateException e) {
429-
onFailure(sender, e);
453+
SavestateCallback cb = createChatMessageCallback(sender, "msg.tasmod.savestate.save.end");
454+
455+
if (index == 0) {
456+
onFailure(sender, new SavestateException("msg.tasmod.savestate.save.error.zero"));
457+
return;
458+
} else if (index < 0) {
459+
sender.sendMessage(Component.translatable("msg.tasmod.savestate.save.negative").withStyle(TextFormatting.YELLOW).build());
430460
}
461+
462+
TASmod.gameLoopSchedulerServer.add(() -> {
463+
try {
464+
TASmod.savestateHandlerServer.saveState(index, cb);
465+
} catch (SavestateException e) {
466+
onFailure(sender, e);
467+
}
468+
});
431469
}
432470

433471
private void saveIndexName(ICommandSender sender, int index, String name) {
434472
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command SaveNameIndex {}|{}", index, name);
435-
try {
436-
TASmod.savestateHandlerServer.saveState(index, name, createCallback(sender));
437-
} catch (SavestateException e) {
438-
onFailure(sender, e);
473+
474+
if (index == 0) {
475+
onFailure(sender, new SavestateException("msg.tasmod.savestate.save.error.zero"));
476+
return;
477+
} else if (index < 0) {
478+
sender.sendMessage(Component.translatable("msg.tasmod.savestate.save.negative").withStyle(TextFormatting.YELLOW).build());
439479
}
480+
481+
SavestateCallback cb = createChatMessageCallback(sender, "msg.tasmod.savestate.save.end");
482+
483+
TASmod.gameLoopSchedulerServer.add(() -> {
484+
try {
485+
TASmod.savestateHandlerServer.saveState(index, name, cb);
486+
} catch (SavestateException e) {
487+
onFailure(sender, e);
488+
}
489+
});
440490
}
441491

442492
private void saveName(ICommandSender sender, String name) {
443493
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command SaveName {}", name);
444-
try {
445-
TASmod.savestateHandlerServer.saveState(name, createCallback(sender));
446-
} catch (SavestateException e) {
447-
onFailure(sender, e);
448-
}
494+
495+
SavestateCallback cb = createChatMessageCallback(sender, "msg.tasmod.savestate.save.end");
496+
497+
TASmod.gameLoopSchedulerServer.add(() -> {
498+
try {
499+
TASmod.savestateHandlerServer.saveState(name, cb);
500+
} catch (SavestateException e) {
501+
onFailure(sender, e);
502+
}
503+
});
449504
}
450505

451506
private void loadRecent(ICommandSender sender) {
452507
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command LoadRecent");
453-
try {
454-
TASmod.savestateHandlerServer.loadState(createCallback(sender));
455-
} catch (LoadstateException e) {
456-
onFailure(sender, e);
457-
}
508+
509+
SavestateCallback cb = createChatMessageCallback(sender, "msg.tasmod.savestate.load.end");
510+
511+
TASmod.gameLoopSchedulerServer.add(() -> {
512+
try {
513+
TASmod.savestateHandlerServer.loadState(cb);
514+
} catch (LoadstateException e) {
515+
onFailure(sender, e);
516+
}
517+
});
458518
}
459519

460520
private void loadIndex(ICommandSender sender, int index) {
461521
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command LoadIndex {}", index);
462-
try {
463-
TASmod.savestateHandlerServer.loadState(index, createCallback(sender));
464-
} catch (LoadstateException e) {
465-
onFailure(sender, e);
522+
523+
if (index < 0) {
524+
sender.sendMessage(Component.translatable("msg.tasmod.savestate.load.negative").withStyle(TextFormatting.YELLOW).build());
466525
}
526+
527+
SavestateCallback cb = createChatMessageCallback(sender, "msg.tasmod.savestate.load.end");
528+
529+
TASmod.gameLoopSchedulerServer.add(() -> {
530+
try {
531+
TASmod.savestateHandlerServer.loadState(index, cb);
532+
} catch (LoadstateException e) {
533+
onFailure(sender, e);
534+
}
535+
});
467536
}
468537

469538
private void delete(ICommandSender sender, int index) {
470539
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command Delete {}", index);
471540

472541
SavestateCallback cb = (paths) -> {
473-
sender.sendMessage(Component.translatable("msg.tasmod.savestate.delete", paths.getSavestate().getIndex()).withStyle(TextFormatting.GREEN).build());
542+
//@formatter:off
543+
sender.getServer().getPlayerList().sendMessage(
544+
Component.translatable("msg.tasmod.savestate.delete",
545+
Component.literal(Integer.toString(paths.getSavestate().getIndex()))
546+
.withStyle(TextFormatting.AQUA)
547+
).withStyle(TextFormatting.GREEN).build());
548+
//@formatter:on
474549
};
475550

476551
try {
@@ -486,6 +561,7 @@ private void deleteMore(ICommandSender sender, int indexFrom, int indexTo) {
486561

487562
if (count < 0) {
488563
onFailure(sender, new SavestateDeleteException("msg.tasmod.savestate.deleteMore.error.negative", count));
564+
return;
489565
}
490566

491567
String translationKey = "msg.tasmod.savestate.deleteMore" + (count == 1 ? ".singular" : ".plural");
@@ -514,7 +590,7 @@ private void deleteDis(ICommandSender sender, int indexFrom, int indexTo) {
514590
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command DeleteDis {}|{}", indexFrom, indexTo);
515591

516592
SavestateCallback cb = (paths) -> {
517-
sender.sendMessage(Component.translatable("msg.tasmod.savestate.delete", paths.getSavestate().getIndex()).withStyle(TextFormatting.GREEN).build());
593+
sender.getServer().getPlayerList().sendMessage(Component.translatable("msg.tasmod.savestate.delete", paths.getSavestate().getIndex()).withStyle(TextFormatting.GREEN).build());
518594
};
519595

520596
ErrorRunnable onErr = (exception) -> {
@@ -530,18 +606,35 @@ private void deleteDis(ICommandSender sender, int indexFrom, int indexTo) {
530606

531607
private void reload(ICommandSender sender) {
532608
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command Reload");
609+
610+
sender.getServer().getPlayerList().sendMessage(Component.translatable("msg.tasmod.savestate.reload").withStyle(TextFormatting.GREEN).build());
533611
TASmod.savestateHandlerServer.reload();
534612
}
535613

536614
private void rename(ICommandSender sender, int index, String name) {
537615
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command Rename {}|{}", index, name);
538-
TASmod.savestateHandlerServer.rename(index, name);
539-
}
540616

541-
private void importing(ICommandSender sender) {
542-
TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command Import");
617+
SavestateCallback cb = (paths) -> {
618+
//@formatter:off
619+
sender.getServer().getPlayerList().sendMessage(
620+
Component.translatable("msg.tasmod.savestate.rename",
621+
Component.literal(Integer.toString(paths.getSavestate().getIndex()))
622+
.withStyle(TextFormatting.AQUA),
623+
Component.literal(paths.getSavestate().getName())
624+
.withStyle(TextFormatting.YELLOW)
625+
)
626+
.withStyle(TextFormatting.GREEN).build()
627+
);
628+
//@formatter:on
629+
};
543630

631+
TASmod.savestateHandlerServer.rename(index, name, cb);
544632
}
633+
//
634+
// private void importing(ICommandSender sender) {
635+
// TASmod.LOGGER.trace(LoggerMarkers.Savestate, "Command Import");
636+
//
637+
// }
545638
// ======================================================================
546639

547640
private int processIndex(String arg) throws CommandException {
@@ -565,7 +658,7 @@ private int processIndex(String arg) throws CommandException {
565658
* @return True if the string is numeric
566659
*/
567660
private boolean isNumeric(String string) {
568-
return Pattern.matches("~|((~-?)?\\d+)", string);
661+
return Pattern.matches("~|(~?-?\\d+)", string);
569662
}
570663

571664
private String getRestArgsAsString(int start, String[] args) {
@@ -587,12 +680,31 @@ private static void onFailure(ICommandSender sender, Throwable e) {
587680
mc.displayGuiScreen(null);
588681
});
589682

590-
sender.sendMessage(Component.literal(e.getMessage()).withStyle(TextFormatting.RED).build());
683+
sender.getServer().getPlayerList().sendMessage(Component.translatable(e.getMessage()).withStyle(TextFormatting.RED).build());
591684
TASmod.LOGGER.catching(e);
592685
TASmod.savestateHandlerServer.resetState();
593686
}
594687

595-
private SavestateCallback createCallback(ICommandSender sender) {
688+
public static SavestateCallback createChatMessageCallback(ICommandSender sender, String translationKey) {
689+
return (paths) -> {
690+
691+
createClearScreenCallback(sender).invoke(paths); // Yes it's a callback in a callback...
692+
693+
//@formatter:off
694+
sender.getServer().getPlayerList().sendMessage(
695+
Component.translatable(translationKey,
696+
Component.literal(paths.getSavestate().getName())
697+
.withStyle(TextFormatting.YELLOW),
698+
Component.literal(Integer.toString(paths.getSavestate().getIndex()))
699+
.withStyle(TextFormatting.AQUA)
700+
)
701+
.withStyle(TextFormatting.GREEN).build()
702+
);
703+
//@formatter:on
704+
};
705+
}
706+
707+
public static SavestateCallback createClearScreenCallback(ICommandSender sender) {
596708
return (paths -> {
597709
if (sender instanceof EntityPlayerMP) {
598710
try {

src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.minecrafttas.tasmod.util.Ducks.ScoreboardDuck;
1515

1616
import net.minecraft.client.Minecraft;
17+
import net.minecraft.client.gui.GuiDownloadTerrain;
1718
import net.minecraft.nbt.NBTTagCompound;
1819

1920
/**
@@ -80,12 +81,12 @@ public enum TASmodPackets implements PacketID {
8081
SAVESTATE_RENAME_SCREEN,
8182
/**
8283
* <p>Clears the screen on the client, if it's a savestate screen
83-
* <p>SIDE: Client<br>
84+
* <p>SIDE: Both<br>
8485
* ARGS: None
8586
*/
8687
SAVESTATE_CLEAR_SCREEN(Side.CLIENT, (buf, clientID) -> {
8788
Minecraft mc = Minecraft.getMinecraft();
88-
if (mc.currentScreen instanceof GuiSavestate) {
89+
if (mc.currentScreen instanceof GuiSavestate || mc.currentScreen instanceof GuiDownloadTerrain) {
8990
mc.displayGuiScreen(null);
9091
}
9192
}),

0 commit comments

Comments
 (0)