Часть функционала MediaPlayerRenderer | Exp Ready | Для всех аудио-потоков

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Июн 2023
Сообщения
111
Реакции
1
Выберите загрузчик игры
  1. OptiFine
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на
1741641534449.png
для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory:
1741641564478.png
и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

1741641991096.png

MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
 

Вложения

Последнее редактирование:
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805

Всех благ ;)
Ещё забыл, в DisplayUtils.hud замените на свой рендер ректа как в других зубах

Когда уже одобрят суцко
 
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
("Медиаплеер (мощные пк)").get() ?
 
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
Если бы добавить BufferedImage и надписи если выходит за лимит не ... а альфу для буквы плавную то ваще ахуенно
 
Если бы добавить BufferedImage и надписи если выходит за лимит не ... а альфу для буквы плавную то ваще ахуенно
Насчёт рендера картинки у меня он был в коде но решил вырезать, а что насчёт продления ректа то идея хорошая, но если трек (slowed remix + reversed + speed up + nightcore ) в названии то уже пиздец на пол экрана :)
 
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
фу боже бизнес мне обрушил
 
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
было до слива = сваг!
 
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
Солью вам свою , так уж и быть
 
1741833842884.png

Либка полезная, но на котлине она нормально не работает, после переката ее на джаву все работает без проблем
 
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
Expand Collapse Copy
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}

и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
/up, спастил годноту:seemsgood:
 
Назад
Сверху Снизу