diff --git a/gradle.properties b/gradle.properties index 2b1209f..bbe20b2 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.038 +mod_version=1.14.514.039 maven_group=semmiedev archives_base_name=disc_jockey_revive # Dependencies diff --git a/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java b/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java index 87ed68e..0a82858 100644 --- a/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java +++ b/src/main/java/semmiedev/disc_jockey_revive/SongPlayer.java @@ -103,6 +103,10 @@ public class SongPlayer implements ClientTickEvents.StartWorldTick { private boolean isRandomPlaying = false; private int randomIndex = -1; + public synchronized void setSpeed(float speed) { + this.speed = MathHelper.clamp(speed, 0.25f, 4.0f); + } + public synchronized void stopPlaybackThread() { this.playbackThread = null; // Should stop on its own then DebugLogger.log("SongPlayer: 停止播放线程。"); diff --git a/src/main/java/semmiedev/disc_jockey_revive/gui/CustomSliderWidget.java b/src/main/java/semmiedev/disc_jockey_revive/gui/CustomSliderWidget.java new file mode 100644 index 0000000..d8208e6 --- /dev/null +++ b/src/main/java/semmiedev/disc_jockey_revive/gui/CustomSliderWidget.java @@ -0,0 +1,16 @@ +package semmiedev.disc_jockey_revive.gui; + +import net.minecraft.client.gui.widget.SliderWidget; +import net.minecraft.text.Text; + +// 唉 +public abstract class CustomSliderWidget extends SliderWidget { + public CustomSliderWidget(int x, int y, int width, int height, Text text, double value) { + super(x, y, width, height, text, value); + updateMessage(); + } + + public void updateMessagePublic() { + updateMessage(); + } +} 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 5db8bd3..fe180fd 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 @@ -4,12 +4,14 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ConfirmScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.item.ItemStack; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import semmiedev.disc_jockey_revive.*; +import semmiedev.disc_jockey_revive.gui.CustomSliderWidget; import semmiedev.disc_jockey_revive.gui.ProgressBarRenderer; import semmiedev.disc_jockey_revive.gui.SongListWidget; import semmiedev.disc_jockey_revive.gui.hud.BlocksOverlay; @@ -62,6 +64,8 @@ public class DiscJockeyScreen extends Screen { private ProgressBarRenderer progressBarRenderer; + public CustomSliderWidget speedSlider; + public DiscJockeyScreen() { super(Main.NAME); this.progressBarRenderer = new ProgressBarRenderer(); @@ -97,6 +101,7 @@ public class DiscJockeyScreen extends Screen { } } + // 返回 folderUpButton = ButtonWidget.builder(FOLDER_UP, button -> { if (currentFolder != null) { currentFolder = null; @@ -106,6 +111,7 @@ public class DiscJockeyScreen extends Screen { }).dimensions(10, 10, 20, 20).build(); addDrawableChild(folderUpButton); + // 播放模式 playModeButton = ButtonWidget.builder(getPlayModeText(), button -> { switch (currentPlayMode) { case SINGLE_LOOP -> currentPlayMode = PlayMode.LIST_LOOP; @@ -118,6 +124,30 @@ public class DiscJockeyScreen extends Screen { }).dimensions(width - 120, 10, 100, 20).build(); addDrawableChild(playModeButton); + // 我展示速度 + int sliderWidth = 120; + int sliderX = width - 120 - sliderWidth - 10; + int sliderY = 10; + speedSlider = new CustomSliderWidget(sliderX, sliderY, sliderWidth, 20, + Text.translatable(Main.MOD_ID + ".screen.speed"), + (Main.SONG_PLAYER.speed - 0.25f) / (4.0f - 0.25f) + ) { + @Override + protected void updateMessage() { + float currentSpeed = (float) (0.25f + this.value * (4.0f - 0.25f)); + this.setMessage(Text.translatable(Main.MOD_ID + ".screen.speed_value", + String.format("%.2f", currentSpeed))); + } + + @Override + protected void applyValue() { + float newSpeed = (float) (0.25f + this.value * (4.0f - 0.25f)); + Main.SONG_PLAYER.speed = newSpeed; + DebugLogger.log("播放速度设置为: {:.2f}x", newSpeed); + } + }; + addDrawableChild(speedSlider); + int buttonY; if (isLargeScreen){ buttonY = height - 30; @@ -278,7 +308,7 @@ public class DiscJockeyScreen extends Screen { // 显示当前文件夹和播放模式 String folderName = currentFolder == null ? "/" : currentFolder.name; context.drawTextWithShadow(textRenderer, CURRENT_FOLDER.getString() + ": " + folderName, 35, 15, 0xFFFFFF); - context.drawTextWithShadow(textRenderer, PLAY_MODE.getString() + ":", width - 220, 15, 0xFFFFFF); +// context.drawTextWithShadow(textRenderer, PLAY_MODE.getString() + ":", width - 220, 15, 0xFFFFFF); int screenWidth = context.getScaledWindowWidth(); @@ -318,7 +348,8 @@ public class DiscJockeyScreen extends Screen { ); } - DebugLogger.log("DiscJockeyScreen: 初始化界面完成"); + +// DebugLogger.log("DiscJockeyScreen: 初始化界面完成"); } @Override 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 6b8411d..efb673a 100644 --- a/src/main/resources/assets/disc_jockey/lang/en_us.json +++ b/src/main/resources/assets/disc_jockey/lang/en_us.json @@ -93,5 +93,8 @@ "disc_jockey_revive.player.invalid_state_tuning": "Cannot tune: Invalid game state or mode.", "disc_jockey_revive.player.tuned": "Tuning completed。", "text.autoconfig.disc_jockey_revive.option.debugModeEnabled": "Enable Debug Mode", - "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." + "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" } 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 04450c2..ade494c 100644 --- a/src/main/resources/assets/disc_jockey/lang/zh_cn.json +++ b/src/main/resources/assets/disc_jockey/lang/zh_cn.json @@ -93,5 +93,8 @@ "disc_jockey_revive.player.invalid_state_tuning": "无法调音:游戏状态或模式无效。", "disc_jockey_revive.player.tuned": "调音完成。", "text.autoconfig.disc_jockey_revive.option.debugModeEnabled": "启用调试模式", - "text.autoconfig.disc_jockey_revive.option.debugModeEnabled.@Tooltip": "启用详细日志输出以进行调试。\n除非排查问题,否则请保持关闭。\n当然,很多调试用的部分已经移除。\n开启这个可能会导致日志文件占用过大\n老实说,其实这对你并没有什么帮助" + "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" }