Визуальная часть EventsRenderer | отображение эвентов

Начинающий
Начинающий
Статус
Онлайн
Регистрация
13 Окт 2024
Сообщения
398
Реакции
0
Выберите загрузчик игры
  1. Vanilla

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

за базу взял https://yougame.biz/threads/353792/
там же и гайд где свои куки найти
SEEELFCODE(gpt):
Expand Collapse Copy
package client.display.hud.impl;

import client.display.hud.ElementRenderer;
import client.events.EventRenderer2D;
import client.main.module.impl.visuals.HUD;
import client.util.display.render.ColorUtil;
import client.util.display.render.font.Fonts;
import client.util.display.text.GradientUtil;
import client.util.drag.Dragging;
import client.util.player.projections.BetterText;
import com.google.common.eventbus.Subscribe;
import net.minecraft.util.text.ITextComponent;
import lombok.experimental.FieldDefaults;
import lombok.RequiredArgsConstructor;
import lombok.AccessLevel;
import com.mojang.blaze3d.matrix.MatrixStack;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class EventsRenderer implements ElementRenderer {
    final Dragging dragging;
    float width;
    float height;
    float headerHeight;
    float eventsHeight;
    float spacingGap = 1.0f;
    private static final String API_URL = "https://cheathub.tech/api/telegram-data";
    private static final String COOKIE = "ВАШИ КУКИ";
    private static final int MAX_EVENTS = 10;
    private final List<EventInfo> events = new ArrayList<>();
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
    private boolean isInitialized = false;
    private long lastUpdateTime = 0;
    private long lastSuccessfulFetch = 0;
    private boolean fetchInProgress = false;

    private static class EventInfo {
        private final String server;
        private final String timeRemaining;
        private int seconds;

        public EventInfo(String server, String timeRemaining, int seconds) {
            this.server = server;
            this.timeRemaining = timeRemaining;
            this.seconds = seconds;
        }

        public String getServer() {
            return server;
        }

        public String getTimeRemaining() {
            return timeRemaining;
        }

        public int getSeconds() {
            return seconds;
        }

        public void setSeconds(int seconds) {
            this.seconds = seconds;
        }

        public void decrementSeconds() {
            if (seconds > 0) {
                seconds--;
            }
        }
    }

    private void initialize() {
        if (isInitialized) return;
        isInitialized = true;
        scheduler.scheduleAtFixedRate(this::fetchEvents, 0, 5, TimeUnit.SECONDS);
        scheduler.scheduleAtFixedRate(this::updateCountdown, 1, 1, TimeUnit.SECONDS);
    }

    private void updateCountdown() {
        synchronized (events) {
            for (EventInfo event : events) {
                event.decrementSeconds();
            }

            events.removeIf(event -> event.getSeconds() <= 0);
        }
    }

    private void fetchEvents() {
        if (fetchInProgress) {
            return;
        }

        long currentTime = System.currentTimeMillis();
        if (currentTime - lastUpdateTime < 3000) {
            return;
        }

        fetchInProgress = true;
        lastUpdateTime = currentTime;

        CompletableFuture.runAsync(() -> {
            HttpURLConnection connection = null;
            try {
                URL url = new URL(API_URL);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000);
                connection.setReadTimeout(5000);
                connection.setRequestProperty("Cookie", COOKIE);

                int responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    StringBuilder response = new StringBuilder();
                    String line;

                    while ((line = reader.readLine()) != null) {
                        response.append(line);
                    }
                    reader.close();

                    parseEvents(response.toString());
                    lastSuccessfulFetch = System.currentTimeMillis();
                }
            } catch (Exception e) {
                System.err.println("Error fetching events: " + e.getMessage());
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
                fetchInProgress = false;
            }
        });
    }

    private void parseEvents(String jsonResponse) {
        try {
            List<EventInfo> newEvents = new ArrayList<>();
            Gson gson = new Gson();
            JsonObject jsonObject = gson.fromJson(jsonResponse, JsonObject.class);

            if (jsonObject != null && jsonObject.has("upcomingEvents")) {
                JsonArray upcomingEvents = jsonObject.getAsJsonArray("upcomingEvents");

                for (JsonElement eventElement : upcomingEvents) {
                    JsonObject eventObj = eventElement.getAsJsonObject();
                    String type = eventObj.get("type").getAsString();
                    String server = eventObj.get("server").getAsString();


                    if (type.equals("🤔 Неизвестное событие") && server.contains("Анархия")) {
                        String timeRemaining = eventObj.get("timeRemaining").getAsString();
                        int seconds = parseTimeToSeconds(timeRemaining);

                        if (seconds > 0) {

                            String serverNumber = server.replaceAll(".*?#(\\d+)", "Anarchy #$1");
                            newEvents.add(new EventInfo(serverNumber, timeRemaining, seconds));
                        }
                    }
                }
            }


            newEvents.sort(Comparator.comparingInt(EventInfo::getSeconds));

            synchronized (events) {
                events.clear();

                int count = Math.min(MAX_EVENTS, newEvents.size());
                events.addAll(newEvents.subList(0, count));
            }
        } catch (Exception e) {
            System.err.println("Error parsing events: " + e.getMessage());
        }
    }

    private int parseTimeToSeconds(String timeString) {
        try {
            if (timeString.contains("м") && timeString.contains("с")) {

                String[] parts = timeString.split("м|с");
                int minutes = Integer.parseInt(parts[0].trim());
                int seconds = Integer.parseInt(parts[1].trim());
                return minutes * 60 + seconds;
            } else if (timeString.contains("м")) {

                int minutes = Integer.parseInt(timeString.replaceAll("[^0-9]", "").trim());
                return minutes * 60;
            } else if (timeString.contains("с")) {

                return Integer.parseInt(timeString.replaceAll("[^0-9]", "").trim());
            }
            return 0;
        } catch (Exception e) {
            return 0;
        }
    }

    @Subscribe
    public void render(EventRenderer2D eventDisplay) {
        betterText.update();
        if (!isInitialized) {
            initialize();
        }

        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = dragging.getX();
        float posY = dragging.getY();
        float fontSize = 6.5F;
        float padding = 5;

        boolean dataStale = System.currentTimeMillis() - lastSuccessfulFetch > 15000 && lastSuccessfulFetch > 0;


        float maxWidth = Fonts.regular_medium.getWidth("Events", fontSize) + padding * 2;
        eventsHeight = 0;

        synchronized (events) {
            for (EventInfo event : events) {
                String eventText = event.getServer() + ": " + event.getTimeRemaining();
                float textWidth = Fonts.regular_medium.getWidth(eventText, fontSize) + padding * 2;
                maxWidth = Math.max(maxWidth, textWidth);
                eventsHeight += (fontSize + padding);
            }
        }

        width = Math.max(maxWidth, 80);
        headerHeight = fontSize + padding * 2;
        height = headerHeight + spacingGap + eventsHeight - 2;
        dragging.setWidth(width);
        dragging.setHeight(height);


        HUD.drawClientRect(posX - 5, posY, width, height, ms, 5);


        ITextComponent ico = GradientUtil.gradient("Events", ColorUtil.rgb(190, 190, 190), ColorUtil.rgb(70, 70, 70));
        Fonts.regular_medium.drawCenteredText(ms, ico, posX + 10, posY + 4f, 6.5F, 255, 0.05F);


        if (events.isEmpty()) {
            String statusText = lastSuccessfulFetch == 0 ? "Loading" + betterText.getOutput() : "No unknown events";
            if (dataStale) {
                statusText = "Connection to host";
            }
            Fonts.regular_medium.drawText(ms, statusText,
                    (float) (posX - 1 + width / 3.5F),
                    posY - 8 + headerHeight + padding,
                    dataStale ? ColorUtil.rgba(255, 100, 100, 255) : ColorUtil.rgb(170, 170, 170),
                    6.5F, 0.05F);
            return;
        }


        float currentY = posY + headerHeight - 2;
        synchronized (events) {
            for (EventInfo event : events) {
                String eventText = event.getServer() + ": " + event.getTimeRemaining();

                int color;
                if (event.getSeconds() <= 30) {
                    long time = System.currentTimeMillis();
                    float frequency = 2.0f;
                    float alphaWave = (float) ((Math.sin(time / 1000.0 * frequency * Math.PI) + 1) / 2);
                    int alpha = (int) (100 + 155 * alphaWave);
                    color = ColorUtil.rgba(255, 135, 135, alpha);
                } else if (event.getSeconds() <= 300) {
                    color = ColorUtil.rgba(255, 200, 100, 255);
                } else {
                    color = ColorUtil.rgba(200, 200, 200, 255);
                }

                Fonts.regular_medium.drawText(ms, eventText, posX - 1, currentY, color, 6.5F, 0.05F);
                currentY += fontSize + padding;
            }
        }
    }

    private final BetterText betterText = new BetterText(List.of(
            "...", "...", "..."
    ), 100);
}
2025-07-19_12.43.34.png
 
так это же дефолтные ивенты с литки ты приколист?
 
1753001445667.png
крутой рендер
 
1каждую мили секунду он будед с https и это жрет фпс
2 СМЫСАЛ ПРЕДЕЛАВАТЬ ПОМЕНЯЛ НАЗВАНИЯ САЙТА И ХУКИ
3 ты вобще умейш делать рендер и визуалы нечего нету
4 /del
 
1каждую мили секунду он будед с https и это жрет фпс
2 СМЫСАЛ ПРЕДЕЛАВАТЬ ПОМЕНЯЛ НАЗВАНИЯ САЙТА И ХУКИ
3 ты вобще умейш делать рендер и визуалы нечего нету
4 /del
с каких пор запросы на сайте жрут фпс? тем более когда тип отправляет их с задержкой в 5 секунд, второе я так и не понял что ты высрал, 3 - причем тут сообственно рендер? 4 - себя делитни фрик
 
с каких пор запросы на сайте жрут фпс? тем более когда тип отправляет их с задержкой в 5 секунд, второе я так и не понял что ты высрал, 3 - причем тут сообственно рендер? 4 - себя делитни фрик
тк фоновый режим и еще с сайта гетать это много фпс жрет
 
тк фоновый режим и еще с сайта гетать это много фпс жрет
тк фоновый режим и еще с сайта гетать это много фпс жрет
запросы идут в отдельном потоке асинхронно (CompletableFuture.runAsync()), он не блокирует никаким образом основной поток рендера, каким же он хуем будет фпс жрать?
 
запросы идут в отдельном потоке асинхронно (CompletableFuture.runAsync()), он не блокирует никаким образом основной поток рендера, каким же он хуем будет фпс жрать?
он фрик, забей
 
запросы идут в отдельном потоке асинхронно (CompletableFuture.runAsync()), он не блокирует никаким образом основной поток рендера, каким же он хуем будет фпс жрать?
с хуариль начет умне 15 бпс дефолт 600 фпс
 
1каждую мили секунду он будед с https и это жрет фпс
2 СМЫСАЛ ПРЕДЕЛАВАТЬ ПОМЕНЯЛ НАЗВАНИЯ САЙТА И ХУКИ
3 ты вобще умейш делать рендер и визуалы нечего нету
4 /del
Ты свой рендер видел?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1каждую мили секунду он будед с https и это жрет фпс
2 СМЫСАЛ ПРЕДЕЛАВАТЬ ПОМЕНЯЛ НАЗВАНИЯ САЙТА И ХУКИ
3 ты вобще умейш делать рендер и визуалы нечего нету
4 /del
Давай на твои худы посмотрим и вырвим глаза
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Назад
Сверху Снизу