diff --git a/gradle.properties b/gradle.properties index bbe20b2..aaf8d7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.21.4 yarn_mappings=1.21.4+build.8 loader_version=0.16.10 # Mod Properties -mod_version=1.14.514.039 +mod_version=1.14.514.043 maven_group=semmiedev archives_base_name=disc_jockey_revive # Dependencies diff --git a/src/main/java/semmiedev/disc_jockey_revive/DebugLogger.java b/src/main/java/semmiedev/disc_jockey_revive/DebugLogger.java index b088550..f263364 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/DebugLogger.java +++ b/src/main/java/semmiedev/disc_jockey_revive/DebugLogger.java @@ -1,25 +1,39 @@ package semmiedev.disc_jockey_revive; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import org.apache.logging.log4j.Logger; +import java.util.Arrays; + // 这玩意一般不用,我自己用的,但是不想删 public class DebugLogger { public static void log(String message) { if (Main.config != null && Main.config.debugModeEnabled) { Main.LOGGER.info("[DiscJockeyRevive-调试] " + message); + sendMessage(message); } } public static void log(String format, Object... arguments) { if (Main.config != null && Main.config.debugModeEnabled) { Main.LOGGER.info("[DiscJockeyRevive-调试] " + format, arguments); + sendMessage(format + ": " + Arrays.toString(arguments)); } } public static void log(String message, Throwable t) { if (Main.config != null && Main.config.debugModeEnabled) { Main.LOGGER.error("[DiscJockeyRevive-调试] " + message, t); + sendMessage(message + ": " + t.getMessage()); + } + } + + public static void sendMessage(String message) { + if (Main.config != null && Main.config.debugModeEnabled) { + MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of("[DiscJockeyRevive-调试]"+message.formatted(Formatting.GRAY))); } } } diff --git a/src/main/java/semmiedev/disc_jockey_revive/Main.java b/src/main/java/semmiedev/disc_jockey_revive/Main.java index 8de8800..04fb957 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/Main.java +++ b/src/main/java/semmiedev/disc_jockey_revive/Main.java @@ -84,12 +84,14 @@ public class Main implements ClientModInitializer { } if (openLiveDjScreenKeyBind.wasPressed()) { DebugLogger.log("Main: 打开DJ界面:"+openLiveDjScreenKeyBind); - if (SongLoader.loadingSongs) { - client.inGameHud.getChatHud().addMessage(Text.translatable(Main.MOD_ID+".still_loading").formatted(Formatting.RED)); - SongLoader.showToast = true; - } else { - client.setScreen(new LiveDjScreen()); - } +// if (SongLoader.loadingSongs) { +// client.inGameHud.getChatHud().addMessage(Text.translatable(Main.MOD_ID+".still_loading").formatted(Formatting.RED)); +// SongLoader.showToast = true; +// } else { +// client.setScreen(new LiveDjScreen()); +// } + // 好像这个界面并不需要什么歌曲加载 + client.setScreen(new LiveDjScreen()); } } }); diff --git a/src/main/java/semmiedev/disc_jockey_revive/ModConfig.java b/src/main/java/semmiedev/disc_jockey_revive/ModConfig.java index 3e81cc9..aa38783 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/ModConfig.java +++ b/src/main/java/semmiedev/disc_jockey_revive/ModConfig.java @@ -37,6 +37,11 @@ public class ModConfig implements ConfigData { } } + public enum PlaybackFailureAction { + STOP, + NEXT_SONG + } + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) @ConfigEntry.Gui.Tooltip(count = 4) public ExpectedServerVersion expectedServerVersion = ExpectedServerVersion.All; @@ -50,6 +55,11 @@ public class ModConfig implements ConfigData { @ConfigEntry.Gui.Tooltip(count = 1) public boolean showHudProgressBar = true; + @ConfigEntry.Gui.Tooltip(count = 2) + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + public PlaybackFailureAction playbackFailureAction = PlaybackFailureAction.STOP; + + @ConfigEntry.Gui.Tooltip(count = 1) public boolean debugModeEnabled = false; } diff --git a/src/main/java/semmiedev/disc_jockey_revive/SongLoader.java b/src/main/java/semmiedev/disc_jockey_revive/SongLoader.java index fc8c4e7..175f0fc 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/SongLoader.java +++ b/src/main/java/semmiedev/disc_jockey_revive/SongLoader.java @@ -3,6 +3,7 @@ package semmiedev.disc_jockey_revive; import net.minecraft.client.MinecraftClient; import net.minecraft.client.toast.SystemToast; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import semmiedev.disc_jockey_revive.gui.SongListWidget; import java.io.File; @@ -49,7 +50,10 @@ public class SongLoader { for (Song song : SONGS) SONG_SUGGESTIONS.add(song.displayName); Main.config.favorites.removeIf(favorite -> SongLoader.SONGS.stream().map(song -> song.fileName).noneMatch(favorite::equals)); - if (showToast && MinecraftClient.getInstance().textRenderer != null) SystemToast.add(MinecraftClient.getInstance().getToastManager(), SystemToast.Type.PACK_LOAD_FAILURE, Main.NAME, Text.translatable(Main.MOD_ID+".loading_done")); + if (showToast && MinecraftClient.getInstance().textRenderer != null) { + SystemToast.add(MinecraftClient.getInstance().getToastManager(), SystemToast.Type.PACK_LOAD_FAILURE, Main.NAME, Text.translatable(Main.MOD_ID+".loading_done")); + MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.translatable(Main.MOD_ID+".loading_done").formatted(Formatting.AQUA)); + } showToast = true; loadingSongs = false; }).start(); diff --git a/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java b/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java index 0a82858..9adfbbb 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java +++ b/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java @@ -147,6 +147,23 @@ public class SongPlayer implements ClientTickEvents.StartWorldTick { } } + private synchronized void handlePlaybackFailure() { + DebugLogger.log("处理播放失败,配置选项: {}", Main.config.playbackFailureAction.name()); + + switch (Main.config.playbackFailureAction) { + case NEXT_SONG: // 播放下一首 + stop(); + MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.translatable(Main.MOD_ID+".playback_failure.next_message").formatted(Formatting.GRAY)); + playNextSong(); + break; + + case STOP: // 停止播放(原本) + default: + stop(); + break; + } + } + public synchronized void stop() { DebugLogger.log("SongPlayer: 停止播放。"); //MinecraftClient.getInstance().send(() -> Main.TICK_LISTENERS.remove(this)); @@ -437,6 +454,7 @@ public class SongPlayer implements ClientTickEvents.StartWorldTick { if (!missingNotes.isEmpty()) { ChatHud chatHud = MinecraftClient.getInstance().inGameHud.getChatHud(); chatHud.addMessage(Text.translatable(Main.MOD_ID+".player.invalid_note_blocks").formatted(Formatting.RED)); + DebugLogger.log("播放失败:缺少音符盒"); HashMap missing = new HashMap<>(); for (Note note : missingNotes) { @@ -451,6 +469,8 @@ public class SongPlayer implements ClientTickEvents.StartWorldTick { missingInstrumentBlocks = missing; missing.forEach((block, integer) -> chatHud.addMessage(Text.literal(block.getName().getString()+" × "+integer).formatted(Formatting.RED))); stop(); + handlePlaybackFailure(); + return; } } else if (!tuned) { //tuned = true; diff --git a/src/main/java/semmiedev/disc_jockey_revive/gui/screen/DiscJockeyScreen.java b/src/main/java/semmiedev/disc_jockey_revive/gui/screen/DiscJockeyScreen.java index fe180fd..efbf857 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/gui/screen/DiscJockeyScreen.java +++ b/src/main/java/semmiedev/disc_jockey_revive/gui/screen/DiscJockeyScreen.java @@ -33,9 +33,9 @@ public class DiscJockeyScreen extends Screen { private static final MutableText SELECT_SONG = Text.translatable(Main.MOD_ID+".screen.select_song"), PLAY = Text.translatable(Main.MOD_ID+".screen.play"), - PLAY_STOP = Text.translatable(Main.MOD_ID+".screen.play.stop"), + PLAY_STOP = Text.translatable(Main.MOD_ID+".screen.play.stop").formatted(Formatting.YELLOW), PREVIEW = Text.translatable(Main.MOD_ID+".screen.preview"), - PREVIEW_STOP = Text.translatable(Main.MOD_ID+".screen.preview.stop"), + PREVIEW_STOP = Text.translatable(Main.MOD_ID+".screen.preview.stop").formatted(Formatting.YELLOW), DROP_HINT = Text.translatable(Main.MOD_ID+".screen.drop_hint").formatted(Formatting.GRAY) ; diff --git a/src/main/resources/assets/disc_jockey/lang/en_us.json b/src/main/resources/assets/disc_jockey/lang/en_us.json index efb673a..bd9b2b3 100644 --- a/src/main/resources/assets/disc_jockey/lang/en_us.json +++ b/src/main/resources/assets/disc_jockey/lang/en_us.json @@ -96,5 +96,14 @@ "text.autoconfig.disc_jockey_revive.option.debugModeEnabled.@Tooltip": "Enable detailed logging for debugging.\nKeep it off unless troubleshooting.\nOf course, many debug parts have been removed.\nEnabling this may cause the log file to be too large.\nHonestly, it's not really helpful for you.", "disc_jockey_revive.screen.speed": "Speed", "disc_jockey_revive.screen.speed_value": "Speed: %.2fx", - "disc_jockey_revive.screen.speed.@Tooltip": "Drag to adjust playback speed\n0.25~4" + "disc_jockey_revive.screen.speed.@Tooltip": "Drag to adjust playback speed\n0.25~4", + + "text.autoconfig.disc_jockey_revive.option.playbackFailureAction": "On Playback Failure", + "text.autoconfig.disc_jockey_revive.option.playbackFailureAction.@Tooltip[0]": "Action when playback fails due to missing note blocks\nOptions: Stop (default) or Play Next Song", + + "disc_jockey_revive.playback_failure.stop": "Stop playback", + "disc_jockey_revive.playback_failure.next": "Play next song", + "disc_jockey_revive.playback_failure.next_message": "Playback failure handling: Play next song.", + + "command.failure_action.set": "Playback failure action set to: %s" } diff --git a/src/main/resources/assets/disc_jockey/lang/zh_cn.json b/src/main/resources/assets/disc_jockey/lang/zh_cn.json index ade494c..b6c5cd6 100644 --- a/src/main/resources/assets/disc_jockey/lang/zh_cn.json +++ b/src/main/resources/assets/disc_jockey/lang/zh_cn.json @@ -54,10 +54,10 @@ "text.autoconfig.disc_jockey_revive.option.delayPlaybackStartBySecs.@Tooltip": "调音完成后延迟指定秒数再开始播放(如 0.5 表示延迟半秒)。", "disc_jockey_revive.screen.current_folder": "当前文件夹", "disc_jockey_revive.screen.play_mode": "播放模式", - "disc_jockey_revive.screen.mode_single": "单曲循环", - "disc_jockey_revive.screen.mode_list": "列表循环", - "disc_jockey_revive.screen.mode_random": "随机播放", - "disc_jockey_revive.screen.mode_stop": "播完停止", + "disc_jockey_revive.screen.mode_single": "🔂单曲循环", + "disc_jockey_revive.screen.mode_list": "🔁列表循环", + "disc_jockey_revive.screen.mode_random": "🔀随机播放", + "disc_jockey_revive.screen.mode_stop": "⏹播完停止", "disc_jockey_revive.screen.open_folder": "打开文件夹", "disc_jockey_revive.screen.open_folder_failed": "无法打开文件夹", "disc_jockey_revive.screen.reload": "重新加载", @@ -96,5 +96,14 @@ "text.autoconfig.disc_jockey_revive.option.debugModeEnabled.@Tooltip": "启用详细日志输出以进行调试。\n除非排查问题,否则请保持关闭。\n当然,很多调试用的部分已经移除。\n开启这个可能会导致日志文件占用过大\n老实说,其实这对你并没有什么帮助", "disc_jockey_revive.screen.speed": "速度", "disc_jockey_revive.screen.speed_value": "速度: %.2fx", - "disc_jockey_revive.screen.speed.@Tooltip": "拖动调整播放速度\n0.25~4" + "disc_jockey_revive.screen.speed.@Tooltip": "拖动调整播放速度\n0.25~4", + + "text.autoconfig.disc_jockey_revive.option.playbackFailureAction": "播放失败处理", + "text.autoconfig.disc_jockey_revive.option.playbackFailureAction.@Tooltip[0]": "当因缺少音符盒导致播放失败时的处理方式\n选项: 停止播放(默认) 或 播放下一首", + + "disc_jockey_revive.playback_failure.stop": "停止播放", + "disc_jockey_revive.playback_failure.next": "播放下一首", + "disc_jockey_revive.playback_failure.next_message": "播放失败处理:播放下一首", + + "command.failure_action.set": "播放失败处理方式已设置为: %s" }