Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
зарегай функцию в FunctionRegistryскажите пожалуйста как это пофикситьПосмотреть вложение 286125
зарегай функцию в FunctionRegistryскажите пожалуйста как это пофикситьПосмотреть вложение 286125
/delДержите панельку с музыкой + гайд как его делать(шрифты и некоторые элементы чуть кривые и требуют доработки, но в общем выглядит неплохо)
SS =Пожалуйста, авторизуйтесь для просмотра ссылки.
1: Создаете класс MusicPlayerUI в папке с функциями
2: Ставите этот код
3: Заходите в основной класс(Expensive или другой) и делаете как написано нижеJava:package im.expensive.functions.impl.misc; import im.expensive.functions.api.Category; import im.expensive.functions.api.Function; import im.expensive.functions.api.FunctionRegister; import im.expensive.functions.settings.impl.BindSetting; @FunctionRegister(name = "MusicPlayerUI", type = Category.Misc) public class MusicPlayerUI extends Function { public BindSetting setting = new BindSetting("Кнопка открытия", -1); public MusicPlayerUI() { addSettings(setting); } }
P.S. Некоторые строки кода для вас будут выглядеть не так как для меня, потому что я писал команды и др.
Шаг 1. Вставьте на 130 строке этот код
Шаг 2. На 202 строке ставите этот кодJava:private MusicPlayerUI musicPlayerUI;
Шаг 3. На 227 строке вставляете этоJava:musicPlayerUI = new MusicPlayerUI(new StringTextComponent(""));
4: Создаете класс по пути im.expensive.ui.musicplayer с названием MusicPlayerUIJava:if (this.functionRegistry.getMusicPlayerUI().isState() && this.functionRegistry.getMusicPlayerUI().setting.get() == key) { Minecraft.getInstance().displayGuiScreen(musicPlayerUI); }
Вот и все готово, осталось прописать в FunctionRegistry нашу функциюJava:package im.expensive.ui.musicplayer; import com.mojang.blaze3d.matrix.MatrixStack; import im.expensive.utils.client.IMinecraft; import im.expensive.utils.math.MathUtil; import im.expensive.utils.render.ColorUtils; import im.expensive.utils.render.DisplayUtils; import im.expensive.utils.render.Scissor; import im.expensive.utils.render.font.Fonts; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.math.vector.Vector4f; import net.minecraft.util.text.ITextComponent; import javax.sound.sampled.*; import java.awt.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MusicPlayerUI extends Screen implements IMinecraft { private List<File> musicFiles = new ArrayList<>(); private File musicDirectory = new File("wonderful/music"); private String message = "Папка с музыкой пуста =("; private int selectedMusicIndex = -1; private boolean isPlaying = false; private boolean isRepeat = false; private Clip clip; private float volume = 0.3f; private MatrixStack matrixStack; private enum Category { LOCAL } private Category currentCategory = Category.LOCAL; public MusicPlayerUI(ITextComponent titleIn) { super(titleIn); } @Override protected void init() { super.init(); loadMusicFiles(); } private void loadMusicFiles() { musicFiles.clear(); try { if (currentCategory == Category.LOCAL) { if (musicDirectory.exists() && musicDirectory.isDirectory()) { File[] files = musicDirectory.listFiles((dir, name) -> name.endsWith(".wav")); if (files != null) { for (File file : files) { musicFiles.add(file); } } } if (musicFiles.isEmpty()) { message = "Папка с музыкой пуста =(\nЧтобы добавить музыку, поместите её в папку 'wonderful/music'"; } } } catch (Exception e) { e.printStackTrace(); message = "Произошла ошибка при загрузке треков."; musicFiles.clear(); } } @Override public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { renderBackground(matrixStack); int windowWidth = mc.getMainWindow().getScaledWidth(); int windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; DisplayUtils.drawShadow(x, y, width, height, 10, ColorUtils.rgba(17, 17, 17, 128)); DisplayUtils.drawRoundedRect(x, y, width, height, new Vector4f(7, 7, 7, 7), ColorUtils.rgba(17, 17, 17, 255)); Fonts.montserrat.drawCenteredText(matrixStack, "Музыкальный плеер", x + width / 2f, y + 10, ColorUtils.rgb(255, 255, 255), 12); drawCategoryButton(matrixStack, x + 20, y + 10, "Локальный", currentCategory == Category.LOCAL); float openFolderX = x + width - 30; float openFolderY = y + 10; DisplayUtils.drawRoundedRect(openFolderX, openFolderY, 20, 20, 5, ColorUtils.rgba(30, 30, 30, 255)); Fonts.montserrat.drawText(matrixStack, "Folder", openFolderX + 5, openFolderY + 5, ColorUtils.rgb(255, 255, 255), 10); if (musicFiles.isEmpty()) { Fonts.montserrat.drawCenteredText(matrixStack, message, x + width / 2f, y + height / 2f - 30, ColorUtils.rgb(255, 0, 0), 12); } else { Scissor.push(); Scissor.setFromComponentCoordinates(x, y + 40, width, height - 160); float listX = x + 20; float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { File music = musicFiles.get(i); boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, listY + i * 25, width - 40, 25); if (hovered) { DisplayUtils.drawRoundedRect(listX, listY + i * 25, width - 40, 25, 3, ColorUtils.rgba(30, 30, 30, 255)); } String songName = trimSongName(music.getName().replaceAll("\\.wav", ""), width - 80); Fonts.montserrat.drawText(matrixStack, songName, listX + 5, listY + i * 25 + 5, ColorUtils.rgb(255, 255, 255), 10); if (selectedMusicIndex == i) { Fonts.montserrat.drawText(matrixStack, "Select", listX + width - 60, listY + i * 25 + 5, ColorUtils.rgb(0, 255, 0), 10); } } Scissor.unset(); Scissor.pop(); renderPlayerPanel(matrixStack, x, y, width, height); } super.render(matrixStack, mouseX, mouseY, partialTicks); } private void drawCategoryButton(MatrixStack matrixStack, float x, float y, String label, boolean selected) { int buttonColor = selected ? ColorUtils.rgba(60, 60, 60, 255) : ColorUtils.rgba(30, 30, 30, 255); DisplayUtils.drawRoundedRect(x, y, 90, 20, 5, buttonColor); Fonts.montserrat.drawCenteredText(matrixStack, label, x + 45, y + 5, ColorUtils.rgb(255, 255, 255), 10); } private String trimSongName(String name, float maxWidth) { float textWidth = Fonts.montserrat.getStringWidth(name, 10); if (textWidth > maxWidth) { while (textWidth > maxWidth && name.length() > 3) { name = name.substring(0, name.length() - 1); textWidth = Fonts.montserrat.getStringWidth(name + "...", 10); } name += "..."; } return name; } private void renderPlayerPanel(MatrixStack matrixStack, float x, float y, float width, float height) { float panelHeight = 100; float panelY = y + height - panelHeight - 10; DisplayUtils.drawRoundedRect(x + 10, panelY + 30, width - 20, panelHeight - 30, 10, ColorUtils.rgba(30, 30, 30, 255)); if (selectedMusicIndex != -1) { renderPlayer(matrixStack, x + 10, panelY, width - 20, panelHeight); } } private void renderPlayer(MatrixStack matrixStack, float x, float y, float width, float height) { String songName = trimSongName(musicFiles.get(selectedMusicIndex).getName().replaceAll("\\.wav", ""), width - 80); Fonts.montserrat.drawText(matrixStack, songName, x + 10, y + 35, ColorUtils.rgb(255, 255, 255), 12); float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(prevButtonX, prevButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, "<<", prevButtonX + buttonSize / 2f, prevButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(playPauseButtonX, playPauseButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, isPlaying ? "Pause" : "Play", playPauseButtonX + buttonSize / 2f, playPauseButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(nextButtonX, nextButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, ">>", nextButtonX + buttonSize / 2f, nextButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; int repeatButtonColor = isRepeat ? ColorUtils.rgba(0, 0, 255, 255) : ColorUtils.rgba(60, 60, 60, 255); DisplayUtils.drawRoundedRect(repeatButtonX, repeatButtonY, buttonSize, buttonSize, 5, repeatButtonColor); Fonts.montserrat.drawCenteredText(matrixStack, "R", repeatButtonX + buttonSize / 2f, repeatButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 55; float volumeSliderY = y + height / 2f - 4 + 10; float volumeSliderWidth = width / 4f - 15; DisplayUtils.drawRoundedRect(volumeSliderX, volumeSliderY, volumeSliderWidth, 10, 5, ColorUtils.rgba(60, 60, 60, 255)); DisplayUtils.drawRoundedRect(volumeSliderX, volumeSliderY, volumeSliderWidth * volume, 10, 5, ColorUtils.rgba(0, 255, 0, 255)); float timeSliderX = x + 10; float timeSliderY = y + height - 20; float timeSliderWidth = width - 20; DisplayUtils.drawRoundedRect(timeSliderX, timeSliderY, timeSliderWidth, 5, 2.5f, ColorUtils.rgba(60, 60, 60, 255)); DisplayUtils.drawRoundedRect(timeSliderX, timeSliderY, timeSliderWidth * getCurrentPlaybackPosition(), 5, 2.5f, ColorUtils.rgba(0, 255, 0, 255)); } public float getCurrentPlaybackPosition() { if (clip != null) { return clip.getMicrosecondPosition() / (float) clip.getMicrosecondLength(); } return 0; } public String getCurrentSongName() { if (selectedMusicIndex != -1 && selectedMusicIndex < musicFiles.size()) { return musicFiles.get(selectedMusicIndex).getName().replace(".wav", ""); } return ""; } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 0) { float windowWidth = mc.getMainWindow().getScaledWidth(); float windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; float panelHeight = 100; float panelY = y + height - panelHeight - 10; float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, prevButtonX, prevButtonY, buttonSize, buttonSize)) { selectPreviousMusic(); return true; } float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, playPauseButtonX, playPauseButtonY, buttonSize, buttonSize)) { togglePlayPause(); return true; } float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, nextButtonX, nextButtonY, buttonSize, buttonSize)) { selectNextMusic(); return true; } float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; if (MathUtil.isHovered((float) mouseX, (float) mouseY, repeatButtonX, repeatButtonY, buttonSize, buttonSize)) { isRepeat = !isRepeat; return true; } float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 53; float volumeSliderY = panelY + panelHeight / 2f - 5 + 10; float volumeSliderWidth = width / 4f - 15; if (MathUtil.isHovered((float) mouseX, (float) mouseY, volumeSliderX, volumeSliderY, volumeSliderWidth, 10)) { volume = (float) ((mouseX - volumeSliderX) / volumeSliderWidth); setVolume(volume); return true; } float timeSliderX = x + 8; float timeSliderY = panelY + panelHeight - 20; float timeSliderWidth = width - 20; if (MathUtil.isHovered((float) mouseX, (float) mouseY, timeSliderX, timeSliderY, timeSliderWidth, 5)) { seek((float) ((mouseX - timeSliderX) / timeSliderWidth)); return true; } float openFolderX = x + width - 30; float openFolderY = y + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, openFolderX, openFolderY, buttonSize, buttonSize)) { openMusicFolder(); return true; } float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { if (MathUtil.isHovered((float) mouseX, (float) mouseY, x + 20, listY + i * 25, width - 40, 25)) { selectedMusicIndex = i; playSelectedMusic(); return true; } } } return super.mouseClicked(mouseX, mouseY, button); } private void selectPreviousMusic() { if (musicFiles.isEmpty()) return; if (selectedMusicIndex > 0) { selectedMusicIndex--; } else { selectedMusicIndex = musicFiles.size() - 1; } playSelectedMusic(); } private void selectNextMusic() { if (musicFiles.isEmpty()) return; if (selectedMusicIndex < musicFiles.size() - 1) { selectedMusicIndex++; } else { selectedMusicIndex = 0; } playSelectedMusic(); } private void togglePlayPause() { if (clip == null) return; if (isPlaying) { clip.stop(); isPlaying = false; } else { clip.setFramePosition(clip.getFramePosition()); clip.start(); isPlaying = true; } } private void openMusicFolder() { try { Desktop.getDesktop().open(musicDirectory); } catch (IOException e) { e.printStackTrace(); } } private void setVolume(float volume) { if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); float dB = (float) (Math.log(volume) / Math.log(10) * 20); gainControl.setValue(dB); } } private void seek(float position) { if (clip != null) { clip.setMicrosecondPosition((long) (clip.getMicrosecondLength() * position)); } } public boolean isVisible() { return this.minecraft.currentScreen == this; } public boolean isPlaying() { return isPlaying; } private void playSelectedMusic() { if (selectedMusicIndex == -1 || musicFiles.isEmpty()) return; if (clip != null && clip.isOpen()) { clip.stop(); clip.close(); } File music = musicFiles.get(selectedMusicIndex); try { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(music); clip = AudioSystem.getClip(); clip.open(audioInputStream); setVolume(volume); isPlaying = true; clip.addLineListener(event -> { if (event.getType() == LineEvent.Type.STOP && isPlaying) { if (clip.getMicrosecondPosition() >= clip.getMicrosecondLength()) { if (isRepeat) { clip.setFramePosition(0); clip.start(); } else { selectNextMusic(); } } } }); clip.start(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { e.printStackTrace(); } } @Override public boolean isPauseScreen() { return false; } }
Для этого вставляете код
и в методе init прописываетеJava:private MusicPlayerUI musicPlayerUI;
Если не ошибаюсь все готово, вы можете заменить текст на свои элементы шрифта или же пнгшки, тут уже на ваше усмотрениеJava:musicPlayerUI = new MusicPlayerUI()
не в фиксе дело, мне вот похуй, да криво. я не буду пользоваться этим, я не буду это фиксить, просто тоже скажу что криво пиздец.пофикси по x, y, в чём проблема?
за 20рублей помогупомоги утснаовить в дс пж
у меня не получаеться(
ds: maslovvadim
помоги установить это прошу
дс : maslovvadim
Что делать?Держите панельку с музыкой + гайд как его делать(шрифты и некоторые элементы чуть кривые и требуют доработки, но в общем выглядит неплохо)
SS =Пожалуйста, авторизуйтесь для просмотра ссылки.
1: Создаете класс MusicPlayerUI в папке с функциями
2: Ставите этот код
3: Заходите в основной класс(Expensive или другой) и делаете как написано нижеJava:package im.expensive.functions.impl.misc; import im.expensive.functions.api.Category; import im.expensive.functions.api.Function; import im.expensive.functions.api.FunctionRegister; import im.expensive.functions.settings.impl.BindSetting; @FunctionRegister(name = "MusicPlayerUI", type = Category.Misc) public class MusicPlayerUI extends Function { public BindSetting setting = new BindSetting("Кнопка открытия", -1); public MusicPlayerUI() { addSettings(setting); } }
P.S. Некоторые строки кода для вас будут выглядеть не так как для меня, потому что я писал команды и др.
Шаг 1. Вставьте на 130 строке этот код
Шаг 2. На 202 строке ставите этот кодJava:private MusicPlayerUI musicPlayerUI;
Шаг 3. На 227 строке вставляете этоJava:musicPlayerUI = new MusicPlayerUI(new StringTextComponent(""));
4: Создаете класс по пути im.expensive.ui.musicplayer с названием MusicPlayerUIJava:if (this.functionRegistry.getMusicPlayerUI().isState() && this.functionRegistry.getMusicPlayerUI().setting.get() == key) { Minecraft.getInstance().displayGuiScreen(musicPlayerUI); }
Вот и все готово, осталось прописать в FunctionRegistry нашу функциюJava:package im.expensive.ui.musicplayer; import com.mojang.blaze3d.matrix.MatrixStack; import im.expensive.utils.client.IMinecraft; import im.expensive.utils.math.MathUtil; import im.expensive.utils.render.ColorUtils; import im.expensive.utils.render.DisplayUtils; import im.expensive.utils.render.Scissor; import im.expensive.utils.render.font.Fonts; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.math.vector.Vector4f; import net.minecraft.util.text.ITextComponent; import javax.sound.sampled.*; import java.awt.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MusicPlayerUI extends Screen implements IMinecraft { private List<File> musicFiles = new ArrayList<>(); private File musicDirectory = new File("wonderful/music"); private String message = "Папка с музыкой пуста =("; private int selectedMusicIndex = -1; private boolean isPlaying = false; private boolean isRepeat = false; private Clip clip; private float volume = 0.3f; private MatrixStack matrixStack; private enum Category { LOCAL } private Category currentCategory = Category.LOCAL; public MusicPlayerUI(ITextComponent titleIn) { super(titleIn); } @Override protected void init() { super.init(); loadMusicFiles(); } private void loadMusicFiles() { musicFiles.clear(); try { if (currentCategory == Category.LOCAL) { if (musicDirectory.exists() && musicDirectory.isDirectory()) { File[] files = musicDirectory.listFiles((dir, name) -> name.endsWith(".wav")); if (files != null) { for (File file : files) { musicFiles.add(file); } } } if (musicFiles.isEmpty()) { message = "Папка с музыкой пуста =(\nЧтобы добавить музыку, поместите её в папку 'wonderful/music'"; } } } catch (Exception e) { e.printStackTrace(); message = "Произошла ошибка при загрузке треков."; musicFiles.clear(); } } @Override public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { renderBackground(matrixStack); int windowWidth = mc.getMainWindow().getScaledWidth(); int windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; DisplayUtils.drawShadow(x, y, width, height, 10, ColorUtils.rgba(17, 17, 17, 128)); DisplayUtils.drawRoundedRect(x, y, width, height, new Vector4f(7, 7, 7, 7), ColorUtils.rgba(17, 17, 17, 255)); Fonts.montserrat.drawCenteredText(matrixStack, "Музыкальный плеер", x + width / 2f, y + 10, ColorUtils.rgb(255, 255, 255), 12); drawCategoryButton(matrixStack, x + 20, y + 10, "Локальный", currentCategory == Category.LOCAL); float openFolderX = x + width - 30; float openFolderY = y + 10; DisplayUtils.drawRoundedRect(openFolderX, openFolderY, 20, 20, 5, ColorUtils.rgba(30, 30, 30, 255)); Fonts.montserrat.drawText(matrixStack, "Folder", openFolderX + 5, openFolderY + 5, ColorUtils.rgb(255, 255, 255), 10); if (musicFiles.isEmpty()) { Fonts.montserrat.drawCenteredText(matrixStack, message, x + width / 2f, y + height / 2f - 30, ColorUtils.rgb(255, 0, 0), 12); } else { Scissor.push(); Scissor.setFromComponentCoordinates(x, y + 40, width, height - 160); float listX = x + 20; float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { File music = musicFiles.get(i); boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, listY + i * 25, width - 40, 25); if (hovered) { DisplayUtils.drawRoundedRect(listX, listY + i * 25, width - 40, 25, 3, ColorUtils.rgba(30, 30, 30, 255)); } String songName = trimSongName(music.getName().replaceAll("\\.wav", ""), width - 80); Fonts.montserrat.drawText(matrixStack, songName, listX + 5, listY + i * 25 + 5, ColorUtils.rgb(255, 255, 255), 10); if (selectedMusicIndex == i) { Fonts.montserrat.drawText(matrixStack, "Select", listX + width - 60, listY + i * 25 + 5, ColorUtils.rgb(0, 255, 0), 10); } } Scissor.unset(); Scissor.pop(); renderPlayerPanel(matrixStack, x, y, width, height); } super.render(matrixStack, mouseX, mouseY, partialTicks); } private void drawCategoryButton(MatrixStack matrixStack, float x, float y, String label, boolean selected) { int buttonColor = selected ? ColorUtils.rgba(60, 60, 60, 255) : ColorUtils.rgba(30, 30, 30, 255); DisplayUtils.drawRoundedRect(x, y, 90, 20, 5, buttonColor); Fonts.montserrat.drawCenteredText(matrixStack, label, x + 45, y + 5, ColorUtils.rgb(255, 255, 255), 10); } private String trimSongName(String name, float maxWidth) { float textWidth = Fonts.montserrat.getStringWidth(name, 10); if (textWidth > maxWidth) { while (textWidth > maxWidth && name.length() > 3) { name = name.substring(0, name.length() - 1); textWidth = Fonts.montserrat.getStringWidth(name + "...", 10); } name += "..."; } return name; } private void renderPlayerPanel(MatrixStack matrixStack, float x, float y, float width, float height) { float panelHeight = 100; float panelY = y + height - panelHeight - 10; DisplayUtils.drawRoundedRect(x + 10, panelY + 30, width - 20, panelHeight - 30, 10, ColorUtils.rgba(30, 30, 30, 255)); if (selectedMusicIndex != -1) { renderPlayer(matrixStack, x + 10, panelY, width - 20, panelHeight); } } private void renderPlayer(MatrixStack matrixStack, float x, float y, float width, float height) { String songName = trimSongName(musicFiles.get(selectedMusicIndex).getName().replaceAll("\\.wav", ""), width - 80); Fonts.montserrat.drawText(matrixStack, songName, x + 10, y + 35, ColorUtils.rgb(255, 255, 255), 12); float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(prevButtonX, prevButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, "<<", prevButtonX + buttonSize / 2f, prevButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(playPauseButtonX, playPauseButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, isPlaying ? "Pause" : "Play", playPauseButtonX + buttonSize / 2f, playPauseButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(nextButtonX, nextButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, ">>", nextButtonX + buttonSize / 2f, nextButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; int repeatButtonColor = isRepeat ? ColorUtils.rgba(0, 0, 255, 255) : ColorUtils.rgba(60, 60, 60, 255); DisplayUtils.drawRoundedRect(repeatButtonX, repeatButtonY, buttonSize, buttonSize, 5, repeatButtonColor); Fonts.montserrat.drawCenteredText(matrixStack, "R", repeatButtonX + buttonSize / 2f, repeatButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 55; float volumeSliderY = y + height / 2f - 4 + 10; float volumeSliderWidth = width / 4f - 15; DisplayUtils.drawRoundedRect(volumeSliderX, volumeSliderY, volumeSliderWidth, 10, 5, ColorUtils.rgba(60, 60, 60, 255)); DisplayUtils.drawRoundedRect(volumeSliderX, volumeSliderY, volumeSliderWidth * volume, 10, 5, ColorUtils.rgba(0, 255, 0, 255)); float timeSliderX = x + 10; float timeSliderY = y + height - 20; float timeSliderWidth = width - 20; DisplayUtils.drawRoundedRect(timeSliderX, timeSliderY, timeSliderWidth, 5, 2.5f, ColorUtils.rgba(60, 60, 60, 255)); DisplayUtils.drawRoundedRect(timeSliderX, timeSliderY, timeSliderWidth * getCurrentPlaybackPosition(), 5, 2.5f, ColorUtils.rgba(0, 255, 0, 255)); } public float getCurrentPlaybackPosition() { if (clip != null) { return clip.getMicrosecondPosition() / (float) clip.getMicrosecondLength(); } return 0; } public String getCurrentSongName() { if (selectedMusicIndex != -1 && selectedMusicIndex < musicFiles.size()) { return musicFiles.get(selectedMusicIndex).getName().replace(".wav", ""); } return ""; } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 0) { float windowWidth = mc.getMainWindow().getScaledWidth(); float windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; float panelHeight = 100; float panelY = y + height - panelHeight - 10; float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, prevButtonX, prevButtonY, buttonSize, buttonSize)) { selectPreviousMusic(); return true; } float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, playPauseButtonX, playPauseButtonY, buttonSize, buttonSize)) { togglePlayPause(); return true; } float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, nextButtonX, nextButtonY, buttonSize, buttonSize)) { selectNextMusic(); return true; } float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; if (MathUtil.isHovered((float) mouseX, (float) mouseY, repeatButtonX, repeatButtonY, buttonSize, buttonSize)) { isRepeat = !isRepeat; return true; } float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 53; float volumeSliderY = panelY + panelHeight / 2f - 5 + 10; float volumeSliderWidth = width / 4f - 15; if (MathUtil.isHovered((float) mouseX, (float) mouseY, volumeSliderX, volumeSliderY, volumeSliderWidth, 10)) { volume = (float) ((mouseX - volumeSliderX) / volumeSliderWidth); setVolume(volume); return true; } float timeSliderX = x + 8; float timeSliderY = panelY + panelHeight - 20; float timeSliderWidth = width - 20; if (MathUtil.isHovered((float) mouseX, (float) mouseY, timeSliderX, timeSliderY, timeSliderWidth, 5)) { seek((float) ((mouseX - timeSliderX) / timeSliderWidth)); return true; } float openFolderX = x + width - 30; float openFolderY = y + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, openFolderX, openFolderY, buttonSize, buttonSize)) { openMusicFolder(); return true; } float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { if (MathUtil.isHovered((float) mouseX, (float) mouseY, x + 20, listY + i * 25, width - 40, 25)) { selectedMusicIndex = i; playSelectedMusic(); return true; } } } return super.mouseClicked(mouseX, mouseY, button); } private void selectPreviousMusic() { if (musicFiles.isEmpty()) return; if (selectedMusicIndex > 0) { selectedMusicIndex--; } else { selectedMusicIndex = musicFiles.size() - 1; } playSelectedMusic(); } private void selectNextMusic() { if (musicFiles.isEmpty()) return; if (selectedMusicIndex < musicFiles.size() - 1) { selectedMusicIndex++; } else { selectedMusicIndex = 0; } playSelectedMusic(); } private void togglePlayPause() { if (clip == null) return; if (isPlaying) { clip.stop(); isPlaying = false; } else { clip.setFramePosition(clip.getFramePosition()); clip.start(); isPlaying = true; } } private void openMusicFolder() { try { Desktop.getDesktop().open(musicDirectory); } catch (IOException e) { e.printStackTrace(); } } private void setVolume(float volume) { if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); float dB = (float) (Math.log(volume) / Math.log(10) * 20); gainControl.setValue(dB); } } private void seek(float position) { if (clip != null) { clip.setMicrosecondPosition((long) (clip.getMicrosecondLength() * position)); } } public boolean isVisible() { return this.minecraft.currentScreen == this; } public boolean isPlaying() { return isPlaying; } private void playSelectedMusic() { if (selectedMusicIndex == -1 || musicFiles.isEmpty()) return; if (clip != null && clip.isOpen()) { clip.stop(); clip.close(); } File music = musicFiles.get(selectedMusicIndex); try { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(music); clip = AudioSystem.getClip(); clip.open(audioInputStream); setVolume(volume); isPlaying = true; clip.addLineListener(event -> { if (event.getType() == LineEvent.Type.STOP && isPlaying) { if (clip.getMicrosecondPosition() >= clip.getMicrosecondLength()) { if (isRepeat) { clip.setFramePosition(0); clip.start(); } else { selectNextMusic(); } } } }); clip.start(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { e.printStackTrace(); } } @Override public boolean isPauseScreen() { return false; } }
Для этого вставляете код
и в методе init прописываетеJava:private MusicPlayerUI musicPlayerUI;
Если не ошибаюсь все готово, вы можете заменить текст на свои элементы шрифта или же пнгшки, тут уже на ваше усмотрениеJava:musicPlayerUI = new MusicPlayerUI()
alt enterПосмотреть вложение 286176 Что делать?
чо делать?Держите панельку с музыкой + гайд как его делать(шрифты и некоторые элементы чуть кривые и требуют доработки, но в общем выглядит неплохо)
SS =Пожалуйста, авторизуйтесь для просмотра ссылки.
1: Создаете класс MusicPlayerUI в папке с функциями
2: Ставите этот код
3: Заходите в основной класс(Expensive или другой) и делаете как написано нижеJava:package im.expensive.functions.impl.misc; import im.expensive.functions.api.Category; import im.expensive.functions.api.Function; import im.expensive.functions.api.FunctionRegister; import im.expensive.functions.settings.impl.BindSetting; @FunctionRegister(name = "MusicPlayerUI", type = Category.Misc) public class MusicPlayerUI extends Function { public BindSetting setting = new BindSetting("Кнопка открытия", -1); public MusicPlayerUI() { addSettings(setting); } }
P.S. Некоторые строки кода для вас будут выглядеть не так как для меня, потому что я писал команды и др.
Шаг 1. Вставьте на 130 строке этот код
Шаг 2. На 202 строке ставите этот кодJava:private MusicPlayerUI musicPlayerUI;
Шаг 3. На 227 строке вставляете этоJava:musicPlayerUI = new MusicPlayerUI(new StringTextComponent(""));
4: Создаете класс по пути im.expensive.ui.musicplayer с названием MusicPlayerUIJava:if (this.functionRegistry.getMusicPlayerUI().isState() && this.functionRegistry.getMusicPlayerUI().setting.get() == key) { Minecraft.getInstance().displayGuiScreen(musicPlayerUI); }
Вот и все готово, осталось прописать в FunctionRegistry нашу функциюJava:package im.expensive.ui.musicplayer; import com.mojang.blaze3d.matrix.MatrixStack; import im.expensive.utils.client.IMinecraft; import im.expensive.utils.math.MathUtil; import im.expensive.utils.render.ColorUtils; import im.expensive.utils.render.DisplayUtils; import im.expensive.utils.render.Scissor; import im.expensive.utils.render.font.Fonts; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.math.vector.Vector4f; import net.minecraft.util.text.ITextComponent; import javax.sound.sampled.*; import java.awt.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class MusicPlayerUI extends Screen implements IMinecraft { private List<File> musicFiles = new ArrayList<>(); private File musicDirectory = new File("wonderful/music"); private String message = "Папка с музыкой пуста =("; private int selectedMusicIndex = -1; private boolean isPlaying = false; private boolean isRepeat = false; private Clip clip; private float volume = 0.3f; private MatrixStack matrixStack; private enum Category { LOCAL } private Category currentCategory = Category.LOCAL; public MusicPlayerUI(ITextComponent titleIn) { super(titleIn); } @Override protected void init() { super.init(); loadMusicFiles(); } private void loadMusicFiles() { musicFiles.clear(); try { if (currentCategory == Category.LOCAL) { if (musicDirectory.exists() && musicDirectory.isDirectory()) { File[] files = musicDirectory.listFiles((dir, name) -> name.endsWith(".wav")); if (files != null) { for (File file : files) { musicFiles.add(file); } } } if (musicFiles.isEmpty()) { message = "Папка с музыкой пуста =(\nЧтобы добавить музыку, поместите её в папку 'wonderful/music'"; } } } catch (Exception e) { e.printStackTrace(); message = "Произошла ошибка при загрузке треков."; musicFiles.clear(); } } @Override public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { renderBackground(matrixStack); int windowWidth = mc.getMainWindow().getScaledWidth(); int windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; DisplayUtils.drawShadow(x, y, width, height, 10, ColorUtils.rgba(17, 17, 17, 128)); DisplayUtils.drawRoundedRect(x, y, width, height, new Vector4f(7, 7, 7, 7), ColorUtils.rgba(17, 17, 17, 255)); Fonts.montserrat.drawCenteredText(matrixStack, "Музыкальный плеер", x + width / 2f, y + 10, ColorUtils.rgb(255, 255, 255), 12); drawCategoryButton(matrixStack, x + 20, y + 10, "Локальный", currentCategory == Category.LOCAL); float openFolderX = x + width - 30; float openFolderY = y + 10; DisplayUtils.drawRoundedRect(openFolderX, openFolderY, 20, 20, 5, ColorUtils.rgba(30, 30, 30, 255)); Fonts.montserrat.drawText(matrixStack, "Folder", openFolderX + 5, openFolderY + 5, ColorUtils.rgb(255, 255, 255), 10); if (musicFiles.isEmpty()) { Fonts.montserrat.drawCenteredText(matrixStack, message, x + width / 2f, y + height / 2f - 30, ColorUtils.rgb(255, 0, 0), 12); } else { Scissor.push(); Scissor.setFromComponentCoordinates(x, y + 40, width, height - 160); float listX = x + 20; float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { File music = musicFiles.get(i); boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, listY + i * 25, width - 40, 25); if (hovered) { DisplayUtils.drawRoundedRect(listX, listY + i * 25, width - 40, 25, 3, ColorUtils.rgba(30, 30, 30, 255)); } String songName = trimSongName(music.getName().replaceAll("\\.wav", ""), width - 80); Fonts.montserrat.drawText(matrixStack, songName, listX + 5, listY + i * 25 + 5, ColorUtils.rgb(255, 255, 255), 10); if (selectedMusicIndex == i) { Fonts.montserrat.drawText(matrixStack, "Select", listX + width - 60, listY + i * 25 + 5, ColorUtils.rgb(0, 255, 0), 10); } } Scissor.unset(); Scissor.pop(); renderPlayerPanel(matrixStack, x, y, width, height); } super.render(matrixStack, mouseX, mouseY, partialTicks); } private void drawCategoryButton(MatrixStack matrixStack, float x, float y, String label, boolean selected) { int buttonColor = selected ? ColorUtils.rgba(60, 60, 60, 255) : ColorUtils.rgba(30, 30, 30, 255); DisplayUtils.drawRoundedRect(x, y, 90, 20, 5, buttonColor); Fonts.montserrat.drawCenteredText(matrixStack, label, x + 45, y + 5, ColorUtils.rgb(255, 255, 255), 10); } private String trimSongName(String name, float maxWidth) { float textWidth = Fonts.montserrat.getStringWidth(name, 10); if (textWidth > maxWidth) { while (textWidth > maxWidth && name.length() > 3) { name = name.substring(0, name.length() - 1); textWidth = Fonts.montserrat.getStringWidth(name + "...", 10); } name += "..."; } return name; } private void renderPlayerPanel(MatrixStack matrixStack, float x, float y, float width, float height) { float panelHeight = 100; float panelY = y + height - panelHeight - 10; DisplayUtils.drawRoundedRect(x + 10, panelY + 30, width - 20, panelHeight - 30, 10, ColorUtils.rgba(30, 30, 30, 255)); if (selectedMusicIndex != -1) { renderPlayer(matrixStack, x + 10, panelY, width - 20, panelHeight); } } private void renderPlayer(MatrixStack matrixStack, float x, float y, float width, float height) { String songName = trimSongName(musicFiles.get(selectedMusicIndex).getName().replaceAll("\\.wav", ""), width - 80); Fonts.montserrat.drawText(matrixStack, songName, x + 10, y + 35, ColorUtils.rgb(255, 255, 255), 12); float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(prevButtonX, prevButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, "<<", prevButtonX + buttonSize / 2f, prevButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(playPauseButtonX, playPauseButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, isPlaying ? "Pause" : "Play", playPauseButtonX + buttonSize / 2f, playPauseButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = y + height / 2f - buttonSize / 2f + 10; DisplayUtils.drawRoundedRect(nextButtonX, nextButtonY, buttonSize, buttonSize, 5, ColorUtils.rgba(60, 60, 60, 255)); Fonts.montserrat.drawCenteredText(matrixStack, ">>", nextButtonX + buttonSize / 2f, nextButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; int repeatButtonColor = isRepeat ? ColorUtils.rgba(0, 0, 255, 255) : ColorUtils.rgba(60, 60, 60, 255); DisplayUtils.drawRoundedRect(repeatButtonX, repeatButtonY, buttonSize, buttonSize, 5, repeatButtonColor); Fonts.montserrat.drawCenteredText(matrixStack, "R", repeatButtonX + buttonSize / 2f, repeatButtonY + 5, ColorUtils.rgb(255, 255, 255), 10); float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 55; float volumeSliderY = y + height / 2f - 4 + 10; float volumeSliderWidth = width / 4f - 15; DisplayUtils.drawRoundedRect(volumeSliderX, volumeSliderY, volumeSliderWidth, 10, 5, ColorUtils.rgba(60, 60, 60, 255)); DisplayUtils.drawRoundedRect(volumeSliderX, volumeSliderY, volumeSliderWidth * volume, 10, 5, ColorUtils.rgba(0, 255, 0, 255)); float timeSliderX = x + 10; float timeSliderY = y + height - 20; float timeSliderWidth = width - 20; DisplayUtils.drawRoundedRect(timeSliderX, timeSliderY, timeSliderWidth, 5, 2.5f, ColorUtils.rgba(60, 60, 60, 255)); DisplayUtils.drawRoundedRect(timeSliderX, timeSliderY, timeSliderWidth * getCurrentPlaybackPosition(), 5, 2.5f, ColorUtils.rgba(0, 255, 0, 255)); } public float getCurrentPlaybackPosition() { if (clip != null) { return clip.getMicrosecondPosition() / (float) clip.getMicrosecondLength(); } return 0; } public String getCurrentSongName() { if (selectedMusicIndex != -1 && selectedMusicIndex < musicFiles.size()) { return musicFiles.get(selectedMusicIndex).getName().replace(".wav", ""); } return ""; } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 0) { float windowWidth = mc.getMainWindow().getScaledWidth(); float windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; float panelHeight = 100; float panelY = y + height - panelHeight - 10; float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, prevButtonX, prevButtonY, buttonSize, buttonSize)) { selectPreviousMusic(); return true; } float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, playPauseButtonX, playPauseButtonY, buttonSize, buttonSize)) { togglePlayPause(); return true; } float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, nextButtonX, nextButtonY, buttonSize, buttonSize)) { selectNextMusic(); return true; } float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; if (MathUtil.isHovered((float) mouseX, (float) mouseY, repeatButtonX, repeatButtonY, buttonSize, buttonSize)) { isRepeat = !isRepeat; return true; } float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 53; float volumeSliderY = panelY + panelHeight / 2f - 5 + 10; float volumeSliderWidth = width / 4f - 15; if (MathUtil.isHovered((float) mouseX, (float) mouseY, volumeSliderX, volumeSliderY, volumeSliderWidth, 10)) { volume = (float) ((mouseX - volumeSliderX) / volumeSliderWidth); setVolume(volume); return true; } float timeSliderX = x + 8; float timeSliderY = panelY + panelHeight - 20; float timeSliderWidth = width - 20; if (MathUtil.isHovered((float) mouseX, (float) mouseY, timeSliderX, timeSliderY, timeSliderWidth, 5)) { seek((float) ((mouseX - timeSliderX) / timeSliderWidth)); return true; } float openFolderX = x + width - 30; float openFolderY = y + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, openFolderX, openFolderY, buttonSize, buttonSize)) { openMusicFolder(); return true; } float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { if (MathUtil.isHovered((float) mouseX, (float) mouseY, x + 20, listY + i * 25, width - 40, 25)) { selectedMusicIndex = i; playSelectedMusic(); return true; } } } return super.mouseClicked(mouseX, mouseY, button); } private void selectPreviousMusic() { if (musicFiles.isEmpty()) return; if (selectedMusicIndex > 0) { selectedMusicIndex--; } else { selectedMusicIndex = musicFiles.size() - 1; } playSelectedMusic(); } private void selectNextMusic() { if (musicFiles.isEmpty()) return; if (selectedMusicIndex < musicFiles.size() - 1) { selectedMusicIndex++; } else { selectedMusicIndex = 0; } playSelectedMusic(); } private void togglePlayPause() { if (clip == null) return; if (isPlaying) { clip.stop(); isPlaying = false; } else { clip.setFramePosition(clip.getFramePosition()); clip.start(); isPlaying = true; } } private void openMusicFolder() { try { Desktop.getDesktop().open(musicDirectory); } catch (IOException e) { e.printStackTrace(); } } private void setVolume(float volume) { if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); float dB = (float) (Math.log(volume) / Math.log(10) * 20); gainControl.setValue(dB); } } private void seek(float position) { if (clip != null) { clip.setMicrosecondPosition((long) (clip.getMicrosecondLength() * position)); } } public boolean isVisible() { return this.minecraft.currentScreen == this; } public boolean isPlaying() { return isPlaying; } private void playSelectedMusic() { if (selectedMusicIndex == -1 || musicFiles.isEmpty()) return; if (clip != null && clip.isOpen()) { clip.stop(); clip.close(); } File music = musicFiles.get(selectedMusicIndex); try { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(music); clip = AudioSystem.getClip(); clip.open(audioInputStream); setVolume(volume); isPlaying = true; clip.addLineListener(event -> { if (event.getType() == LineEvent.Type.STOP && isPlaying) { if (clip.getMicrosecondPosition() >= clip.getMicrosecondLength()) { if (isRepeat) { clip.setFramePosition(0); clip.start(); } else { selectNextMusic(); } } } }); clip.start(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { e.printStackTrace(); } } @Override public boolean isPauseScreen() { return false; } }
Для этого вставляете код
и в методе init прописываетеJava:private MusicPlayerUI musicPlayerUI;
Если не ошибаюсь все готово, вы можете заменить текст на свои элементы шрифта или же пнгшки, тут уже на ваше усмотрениеJava:musicPlayerUI = new MusicPlayerUI()
alt enter
Ты серьёзно? Даже нормально спастить не смог, как ты ваще чит делаешь?Посмотреть вложение 286176 Что делать?
я с таким не работал вот и не знаюТы серьёзно? Даже нормально спастить не смог, как ты ваще чит делаешь?
а ты еще свое говно по 200р продаешь...
ну и кривая залупа
"шрифты и некоторые элементы чуть кривые и требуют доработки"Пизда криво
сорянчик что так долго, в метод onKeyPressed засунь
там же ясен хер что не в регистрации команд ты пропишешь себе гуишку связаную с функцией, лично у меня, учитывая команды и тд было на тех строчках, которые указал
фикс ректов в 2к24 сложный да(/del
у меня 10-и летний брат который кодит как курица лапой лучше сделает
не в фиксе дело, мне вот похуй, да криво. я не буду пользоваться этим, я не буду это фиксить, просто тоже скажу что криво пиздец.
он своим мнением просто делится.
да очень сложно я ахуел жоско фиксеть невозможно, 10ч подрят фиксел в итоге идею удалил"шрифты и некоторые элементы чуть кривые и требуют доработки"
я дал базу для проигрывателя со всеми корректно работающими методами, тебе так тяжело переписать метод drawText на drawImage со своими кастом пнг и сделать глоу?)
сорянчик что так долго, в метод onKeyPressed засунь
там же ясен хер что не в регистрации команд ты пропишешь себе гуишку связаную с функцией, лично у меня, учитывая команды и тд было на тех строчках, которые указал
фикс ректов в 2к24 сложный да(
тут все отлично работает, за исключением мелкой херни в методе mouseClicked которая не сильно на что то влияет в целом и фулл рабочие методы броСука, используйте Javafx, лучше вообще такие темы не создавать если в итоге это бесполезно и это нужно фулл переделывать
да я просто хуею с типов которым дают нормальные методы которые отлично работают, но они не могут сделать ебучий список с ректами и картинками xdда очень сложно я ахуел жоско фиксеть невозможно, 10ч подрят фиксел в итоге идею удалил
откат дайУ меня не нажимается play помоги пж
мне кажется ты только знаешь что такое метод,слишком много ты в свой бессмысленный текст впихнул это словотут все отлично работает, за исключением мелкой херни в методе mouseClicked которая не сильно на что то влияет в целом и фулл рабочие методы бро
да я просто хуею с типов которым дают нормальные методы которые отлично работают, но они не могут сделать ебучий список с ректами и картинками xd
ну так раз такой умный, скажи че тут не такмне кажется ты только знаешь что такое метод,слишком много ты в свой бессмысленный текст впихнул это слово
говнокод от аину так раз такой умный, скажи че тут не так
что именно тут говно, ты мне скажиговнокод от аи
это такая поебота от чат гпт =0000loat windowWidth = mc.getMainWindow().getScaledWidth(); float windowHeight = mc.getMainWindow().getScaledHeight(); float width = 400; float height = 400; float x = windowWidth / 2f - width / 2f; float y = windowHeight / 2f - height / 2f; float panelHeight = 100; float panelY = y + height - panelHeight - 10; float buttonSize = 20; float buttonSpacing = 10; float prevButtonX = x + width / 2f - buttonSize - buttonSpacing - 5; float prevButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, prevButtonX, prevButtonY, buttonSize, buttonSize)) { selectPreviousMusic(); return true; } float playPauseButtonX = x + width / 2f - buttonSize / 2f; float playPauseButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, playPauseButtonX, playPauseButtonY, buttonSize, buttonSize)) { togglePlayPause(); return true; } float nextButtonX = x + width / 2f + buttonSpacing + 5; float nextButtonY = panelY + panelHeight / 2f - buttonSize / 2f + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, nextButtonX, nextButtonY, buttonSize, buttonSize)) { selectNextMusic(); return true; } float repeatButtonX = nextButtonX + buttonSize + buttonSpacing + 5; float repeatButtonY = nextButtonY; if (MathUtil.isHovered((float) mouseX, (float) mouseY, repeatButtonX, repeatButtonY, buttonSize, buttonSize)) { isRepeat = !isRepeat; return true; } float volumeSliderX = nextButtonX + buttonSize + buttonSpacing + 53; float volumeSliderY = panelY + panelHeight / 2f - 5 + 10; float volumeSliderWidth = width / 4f - 15; if (MathUtil.isHovered((float) mouseX, (float) mouseY, volumeSliderX, volumeSliderY, volumeSliderWidth, 10)) { volume = (float) ((mouseX - volumeSliderX) / volumeSliderWidth); setVolume(volume); return true; } float timeSliderX = x + 8; float timeSliderY = panelY + panelHeight - 20; float timeSliderWidth = width - 20; if (MathUtil.isHovered((float) mouseX, (float) mouseY, timeSliderX, timeSliderY, timeSliderWidth, 5)) { seek((float) ((mouseX - timeSliderX) / timeSliderWidth)); return true; } float openFolderX = x + width - 30; float openFolderY = y + 10; if (MathUtil.isHovered((float) mouseX, (float) mouseY, openFolderX, openFolderY, buttonSize, buttonSize)) { openMusicFolder(); return true; } float listY = y + 40; for (int i = 0; i < musicFiles.size(); i++) { if (MathUtil.isHovered((float) mouseX, (float) mouseY, x + 20, listY + i * 25, width - 40, 25)) { selectedMusicIndex = i; playSelectedMusic(); return true; } } } return super.mouseClicked(mouseX, mouseY, button); }
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz