This commit is contained in:
BRanulf 2025-07-08 21:45:41 +08:00
parent b928cb9956
commit ad44ffec5b
6 changed files with 62 additions and 5 deletions

View File

@ -6,7 +6,7 @@ minecraft_version=1.21.4
yarn_mappings=1.21.4+build.8 yarn_mappings=1.21.4+build.8
loader_version=0.16.10 loader_version=0.16.10
# Mod Properties # Mod Properties
mod_version=1.14.514.038 mod_version=1.14.514.039
maven_group=semmiedev maven_group=semmiedev
archives_base_name=disc_jockey_revive archives_base_name=disc_jockey_revive
# Dependencies # Dependencies

View File

@ -103,6 +103,10 @@ public class SongPlayer implements ClientTickEvents.StartWorldTick {
private boolean isRandomPlaying = false; private boolean isRandomPlaying = false;
private int randomIndex = -1; private int randomIndex = -1;
public synchronized void setSpeed(float speed) {
this.speed = MathHelper.clamp(speed, 0.25f, 4.0f);
}
public synchronized void stopPlaybackThread() { public synchronized void stopPlaybackThread() {
this.playbackThread = null; // Should stop on its own then this.playbackThread = null; // Should stop on its own then
DebugLogger.log("SongPlayer: 停止播放线程。"); DebugLogger.log("SongPlayer: 停止播放线程。");

View File

@ -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();
}
}

View File

@ -4,12 +4,14 @@ import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ConfirmScreen; import net.minecraft.client.gui.screen.ConfirmScreen;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.text.MutableText; import net.minecraft.text.MutableText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import semmiedev.disc_jockey_revive.*; 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.ProgressBarRenderer;
import semmiedev.disc_jockey_revive.gui.SongListWidget; import semmiedev.disc_jockey_revive.gui.SongListWidget;
import semmiedev.disc_jockey_revive.gui.hud.BlocksOverlay; import semmiedev.disc_jockey_revive.gui.hud.BlocksOverlay;
@ -62,6 +64,8 @@ public class DiscJockeyScreen extends Screen {
private ProgressBarRenderer progressBarRenderer; private ProgressBarRenderer progressBarRenderer;
public CustomSliderWidget speedSlider;
public DiscJockeyScreen() { public DiscJockeyScreen() {
super(Main.NAME); super(Main.NAME);
this.progressBarRenderer = new ProgressBarRenderer(); this.progressBarRenderer = new ProgressBarRenderer();
@ -97,6 +101,7 @@ public class DiscJockeyScreen extends Screen {
} }
} }
// 返回
folderUpButton = ButtonWidget.builder(FOLDER_UP, button -> { folderUpButton = ButtonWidget.builder(FOLDER_UP, button -> {
if (currentFolder != null) { if (currentFolder != null) {
currentFolder = null; currentFolder = null;
@ -106,6 +111,7 @@ public class DiscJockeyScreen extends Screen {
}).dimensions(10, 10, 20, 20).build(); }).dimensions(10, 10, 20, 20).build();
addDrawableChild(folderUpButton); addDrawableChild(folderUpButton);
// 播放模式
playModeButton = ButtonWidget.builder(getPlayModeText(), button -> { playModeButton = ButtonWidget.builder(getPlayModeText(), button -> {
switch (currentPlayMode) { switch (currentPlayMode) {
case SINGLE_LOOP -> currentPlayMode = PlayMode.LIST_LOOP; case SINGLE_LOOP -> currentPlayMode = PlayMode.LIST_LOOP;
@ -118,6 +124,30 @@ public class DiscJockeyScreen extends Screen {
}).dimensions(width - 120, 10, 100, 20).build(); }).dimensions(width - 120, 10, 100, 20).build();
addDrawableChild(playModeButton); 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; int buttonY;
if (isLargeScreen){ if (isLargeScreen){
buttonY = height - 30; buttonY = height - 30;
@ -278,7 +308,7 @@ public class DiscJockeyScreen extends Screen {
// 显示当前文件夹和播放模式 // 显示当前文件夹和播放模式
String folderName = currentFolder == null ? "/" : currentFolder.name; String folderName = currentFolder == null ? "/" : currentFolder.name;
context.drawTextWithShadow(textRenderer, CURRENT_FOLDER.getString() + ": " + folderName, 35, 15, 0xFFFFFF); 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(); int screenWidth = context.getScaledWindowWidth();
@ -318,7 +348,8 @@ public class DiscJockeyScreen extends Screen {
); );
} }
DebugLogger.log("DiscJockeyScreen: 初始化界面完成");
// DebugLogger.log("DiscJockeyScreen: 初始化界面完成");
} }
@Override @Override

View File

@ -93,5 +93,8 @@
"disc_jockey_revive.player.invalid_state_tuning": "Cannot tune: Invalid game state or mode.", "disc_jockey_revive.player.invalid_state_tuning": "Cannot tune: Invalid game state or mode.",
"disc_jockey_revive.player.tuned": "Tuning completed。", "disc_jockey_revive.player.tuned": "Tuning completed。",
"text.autoconfig.disc_jockey_revive.option.debugModeEnabled": "Enable Debug Mode", "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"
} }

View File

@ -93,5 +93,8 @@
"disc_jockey_revive.player.invalid_state_tuning": "无法调音:游戏状态或模式无效。", "disc_jockey_revive.player.invalid_state_tuning": "无法调音:游戏状态或模式无效。",
"disc_jockey_revive.player.tuned": "调音完成。", "disc_jockey_revive.player.tuned": "调音完成。",
"text.autoconfig.disc_jockey_revive.option.debugModeEnabled": "启用调试模式", "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"
} }