88import java .util .regex .Pattern ;
99
1010import com .minecrafttas .tasmod .TASmod ;
11- import com .minecrafttas .tasmod .TASmodClient ;
1211import com .minecrafttas .tasmod .networking .TASmodBufferBuilder ;
13- import com .minecrafttas .tasmod .registries .TASmodConfig ;
1412import com .minecrafttas .tasmod .registries .TASmodPackets ;
1513import com .minecrafttas .tasmod .savestates .SavestateHandlerServer .SavestateCallback ;
1614import 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 {
0 commit comments