Исходник Создаем лоудер на Java | Loader для пастеров

Начинающий
Статус
Оффлайн
Регистрация
23 Апр 2024
Сообщения
302
Реакции[?]
0
Поинты[?]
1K
Запасайтесь чипсами, ведь если вы пастер, то вы здесь на долго.
Специально для новичков каждый блок был обозначен, если вам не знакомы некоторые слова советую почитать о них в интернете.

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

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

видео с игрой с лоудера

Создаем новый проект с использованием java 17 если у вас чит экспенсив/экселлент и т.д.

1. Создание приложения с инициализацией всего необходимого.

После создание проекта вам нужно добавить в ваш Main класс всю основу

Java:
package loader.starter;

import loader.objects.SettingObject;
import loader.objects.SquareObject;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

public class Main {

    /**
     * Главный класс
     * Добавление классов
     */
    public static void main(String[] args) {
        ImageIcon icon = new ImageIcon(Main.class.getResource("/loader/assets/logo.png"));

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Loader");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setIconImage(icon.getImage());
            frame.setSize(707, 509);
            frame.setLocationRelativeTo(null);

            frame.setResizable(false);

            JPanel parentPanel = new JPanel(new CardLayout());
            CardLayout cardLayout = (CardLayout) parentPanel.getLayout();

            SquareObject mainPanel = new SquareObject(cardLayout, parentPanel);
            SettingObject settingsPanel = new SettingObject(cardLayout, parentPanel);

            parentPanel.add(mainPanel, "mainPanel");
            parentPanel.add(settingsPanel, "settingsPanel");

            frame.add(parentPanel);
            frame.setVisible(true);
        });
    }
}
2. Создание рендера/конструкторов

Для начала нужно создать класс с цветами которые мы будем использовать, чтобы каждый раз не искать нужный цвет.

Java:
package loader.utils;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс, содержащий все цвета которые можно заюзать
*/
public class ColorUtil extends JPanel {

    public static Color background = new Color(45, 45, 45);

    public static Color headerColor = new Color(29, 29, 31);

    public static Color buttonColor1 = new Color(66, 91, 129);

    public static Color buttonColor2 = new Color(14, 93, 213);
}
Объект рендера главного меню

Java:
package loader.objects;

import loader.objects.buttons.StartButton;
import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс от части всего рендера
*/
public class SquareObject extends JPanel {
    private StartButton startButton;
    private ImageIcon settingsIcon;
    private CardLayout cardLayout;
    private JPanel parentPanel;
    private boolean isRunning = false;
    private boolean isHovered = false;

    /**
     * Конструктор инициализирует главное меню с кнопкой запуска и иконкой настроек
     *
     * @param cardLayout макет для переключения меню
     * @param parentPanel панель для переключения
     */
    public SquareObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        /**
         * Рендер заднего фона
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        /**
         * Рендер кнопки "Запустить"
         */
        startButton = new StartButton("Запустить");
        startButton.setBackground(ColorUtil.buttonColor1);
        startButton.setForeground(Color.WHITE);
        startButton.setFont(new Font("Arial", Font.BOLD, 20));

        startButton.setPreferredSize(new Dimension(200, 50));
        startButton.setBounds((707 - 200) / 2, (509 - 50) / 2 + 50, 200, 50);
        add(startButton);

        startButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (!isRunning) {
                    startButton.setBackground(Color.GREEN);
                    startButton.setText("Ожидайте");

                    /**
                     * Запуск майнкрафт в отдельном потоке
                     */
                    new Thread(() -> {
                        loader.starter.Start.main(new String[]{});
                    }).start();

                    isRunning = true;

                    /**
                     * Закрытие лоудера через минуту
                     * Можете поменять значение как вам угодно
                     */
                    Timer timer = new Timer(60000, evt -> {
                        Window window = SwingUtilities.getWindowAncestor(SquareObject.this);
                        if (window != null) {
                            window.dispose();
                        }
                    });
                    timer.setRepeats(false);
                    timer.start();
                }
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                isHovered = true;
                updateButtonAppearance();
            }

            @Override
            public void mouseExited(MouseEvent e) {
                isHovered = false;
                updateButtonAppearance();
            }
        });

        settingsIcon = new ImageIcon(SquareObject.class.getResource("/loader/assets/setting.png"));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int iconX = getWidth() - 50;
                int iconY = 4;
                int iconWidth = 47;
                int iconHeight = 43;

                if (e.getX() >= iconX && e.getX() <= iconX + iconWidth && e.getY() >= iconY && e.getY() <= iconY + iconHeight) {
                    SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "settingsPanel"));
                }
            }
        });
    }

    /**
     * Отрисовка компонентов
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер полосы сверху
         */
        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        /**
         * Рендер текста
         */
        String versionText = "v1.0";
        String text = "Minecraft Loader";
        g.setColor(Color.WHITE);

        g.setFont(new Font("Arial", Font.BOLD, 40));
        FontMetrics titleMetrics = g.getFontMetrics(g.getFont());
        int titleX = (getWidth() - titleMetrics.stringWidth(text)) / 2 + 15;
        int titleY = titleMetrics.getHeight() - 6;
        g.drawString(text, titleX, titleY);

        g.setFont(new Font("Arial", Font.BOLD, 20));
        FontMetrics metrics = g.getFontMetrics(g.getFont());
        int x = getWidth() - metrics.stringWidth(versionText) - 10;
        int y = getHeight() - metrics.getHeight() + metrics.getAscent() - 10;
        g.drawString(versionText, x, y);

        if (settingsIcon != null) {
            int iconX = getWidth() - 50;
            int iconY = 4;
            g.drawImage(settingsIcon.getImage(), iconX, iconY, 47, 43, this);
        }
    }

    private void updateButtonAppearance() {
        if (isRunning) {
            startButton.setBackground(Color.GREEN);
            startButton.setText("Ожидайте");
        } else {
            if (isHovered) {
                startButton.setBackground(ColorUtil.buttonColor2);
            } else {
                startButton.setBackground(ColorUtil.buttonColor1);
            }
        }
    }
}
Создание класса объекта меню настроек

Java:
package loader.objects;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Объект настроек с возможностью возврата к главному меню
*/
public class SettingObject extends JPanel {
    private CardLayout cardLayout;
    private JPanel parentPanel;

    private int clickableTextX = 20;
    private int clickableTextY = 150;
    private int clickableTextWidth = 300;
    private int clickableTextHeight = 20;
    /**
     * Отрисовка меню
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер фона и элементов интерфейса
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        g.setColor(Color.WHITE);
        g.setFont(new Font("Arial", Font.PLAIN, 20));


        int textX = 20;
        int textY = 100;

        g.drawString("Информация", textX, textY);
        g.drawString("Данный лоудер просто прототип", textX, textY + 30);
        g.drawString("Вы можете наложить свою обфускацию по желанию", textX, textY + 60);

        FontMetrics fm = g.getFontMetrics();
        String clickableText = "Ссылка на канал Tense client";
        int textWidth = fm.stringWidth(clickableText);
        g.setColor(Color.WHITE);
        g.drawString(clickableText, clickableTextX, clickableTextY + 35);


        Rectangle clickableArea = new Rectangle(clickableTextX, clickableTextY - fm.getAscent() + 35, textWidth, fm.getHeight());
        addClickableArea(clickableArea);


    }

    /**
     * Добавляет область кликабельной зоны
     *
     * @param clickableArea кликабельная область
     */
    private void addClickableArea(Rectangle clickableArea) {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (clickableArea.contains(e.getPoint())) {
                    openBrowser("https://www.youtube.com/@rarchik/videos");
                }
            }
        });
    }

    /**
     * Открывает браузер с указанной ссылкой
     *
     * @param url URL для открытия в браузере
     */
    private void openBrowser(String url) {
        try {
            Desktop.getDesktop().browse(new URI(url));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Конструктор кнопки возврата
     *
     * @param cardLayout макет для переключения панелей
     * @param parentPanel панель для переключения
     */
    public SettingObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        JLabel backButton = new JLabel(new ImageIcon(SettingObject.class.getResource("/loader/assets/back_arrow.png")));
        backButton.setBounds(10, 10, 100, 100);
        backButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "mainPanel"));
            }
        });
        add(backButton);

        JLabel settingsLabel = new JLabel("Настройки", SwingConstants.CENTER);
        settingsLabel.setFont(new Font("Arial", Font.BOLD, 40));
        settingsLabel.setForeground(Color.WHITE);
        settingsLabel.setBounds(0, 50, getWidth(), 50);
        add(settingsLabel);

    }
}
Класс кнопки старта

Java:
package loader.objects.buttons;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.RoundRectangle2D;

/** @author BossThisGame for product tense
* <p>
*  Version 1.0
* <p>
* Minecraft loader
*/

/**
* Добавление кнопки "Запуск"
*/
public class StartButton extends JButton {

    public StartButton(String text) {
        super(text);
        setContentAreaFilled(false);
        setFocusPainted(false);

        /**
         * Установка стандартных цветов фона и текста
         */
        setBackground(ColorUtil.buttonColor1);
        setForeground(Color.WHITE);


        /**
         * Обработчик событий мыши для эффекта наведения
         */
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                setBackground(ColorUtil.buttonColor2);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(ColorUtil.buttonColor1);
            }
        });


        /**
         * Установка шрифта для текста кнопки
         */
        setFont(new Font("Arial", Font.BOLD, 20));
    }

    /**
     * Кастомное рисование компонента кнопки
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(getBackground());
        g2.fill(new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(), 30, 30));
        super.paintComponent(g2);
        g2.dispose();
    }

    /**
     * Обновление свойств кнопки
     */
    @Override
    public void updateUI() {
        super.updateUI();
        setOpaque(false);
        setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    }
}
Java:
package loader.starter;

import java.util.Arrays;

import net.minecraft.client.main.Main;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/



public class Start
{


    public static void main(String[] args)
    {
        String assets = System.getenv().containsKey("assetDirectory") ? System.getenv("assetDirectory") : "assets";
        Main.main(concat(new String[] {"--version", "mcp", "--accessToken", "0", "--assetsDir", assets, "--assetIndex", "1.16", "--userProperties", "{}"}, args));
    }

  
    public static <T> T[] concat(T[] first, T[] second)
    {
        T[] result = Arrays.copyOf(first, first.length + second.length);
        System.arraycopy(second, 0, result, first.length, second.length);
        return result;
    }
}
3. Нужно создать папку с ресурсами (png)
Можете сделать как у меня
Посмотреть вложение 280336

Дальше обязательно нужно сделать манифест чтобы лоудер можно было запускать как исполняемый файл
Посмотреть вложение 280338

Код:
Manifest-Version: 1.0
Can-Retransform-Classes: true
Main-Class: loader.starter.Main
SplashScreen-Image: l.png
Дальше нужно создать директорию где будет хранится ваш чит. У меня это будет здесь (Не забудьте про нативки)
Посмотреть вложение 280339


Дальше использую imgur так как на форуме лимит загрузки изображений

Нужно добавить вашу джарку в библиотеку
Пожалуйста, авторизуйтесь для просмотра ссылки.


Теперь осталось забилдить проект. Заходим в
Пожалуйста, авторизуйтесь для просмотра ссылки.


Создаем новый
Пожалуйста, авторизуйтесь для просмотра ссылки.


Дальше можно выбрать название с каким названием будет сохранятся ваша джарка (НЕ ОБЯЗАТЕЛЬНО)

И делаем как на
Пожалуйста, авторизуйтесь для просмотра ссылки.


Важно: С какой джавы вы билдили проект с такой джавы и нужно запускать джарку

Сохраняем,
Пожалуйста, авторизуйтесь для просмотра ссылки.
Build - Build Artifacts и выбираем наш артифакт

После билда можете запускать ваш лоудер.

Так же не пишите мне за ассетсы майнкрафта, к примеру в Экселленте ассесты грузятся из диска C, а добавить их самостоятельно вы и сами сможете.
Пожалуйста, авторизуйтесь для просмотра ссылки.


Я вам не скинул целый уже готовый проект чтобы вы поняли как это делать. Удачи. Так же вы должны учесть, что это не протект лоудер. Здесь нету проверки хвида и т.д. Систему хвида сделать не сложно, поэтому используйте лоудер как хотите
А какой смысл если .jar файл можно и без лоадера запустить? Нет не авторизационной системы, не выбора кол-ва оперативной памяти.
 
Начинающий
Статус
Оффлайн
Регистрация
7 Мар 2024
Сообщения
294
Реакции[?]
6
Поинты[?]
4K
А какой смысл если .jar файл можно и без лоадера запустить? Нет не авторизационной системы, не выбора кол-ва оперативной памяти.
через батник что ли?) Написано же что прототип, здесь отдельное окно настроек есть там делай что хочешь, пиздец
 
Начинающий
Статус
Оффлайн
Регистрация
24 Май 2024
Сообщения
62
Реакции[?]
0
Поинты[?]
0
Как в лоадер ассеты закинуть?
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
27 Май 2024
Сообщения
265
Реакции[?]
10
Поинты[?]
10K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
3 Окт 2022
Сообщения
165
Реакции[?]
1
Поинты[?]
1K
Запасайтесь чипсами, ведь если вы пастер, то вы здесь на долго.
Специально для новичков каждый блок был обозначен, если вам не знакомы некоторые слова советую почитать о них в интернете.

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

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

видео с игрой с лоудера

Создаем новый проект с использованием java 17 если у вас чит экспенсив/экселлент и т.д.

1. Создание приложения с инициализацией всего необходимого.

После создание проекта вам нужно добавить в ваш Main класс всю основу

Java:
package loader.starter;

import loader.objects.SettingObject;
import loader.objects.SquareObject;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

public class Main {

    /**
     * Главный класс
     * Добавление классов
     */
    public static void main(String[] args) {
        ImageIcon icon = new ImageIcon(Main.class.getResource("/loader/assets/logo.png"));

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Loader");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setIconImage(icon.getImage());
            frame.setSize(707, 509);
            frame.setLocationRelativeTo(null);

            frame.setResizable(false);

            JPanel parentPanel = new JPanel(new CardLayout());
            CardLayout cardLayout = (CardLayout) parentPanel.getLayout();

            SquareObject mainPanel = new SquareObject(cardLayout, parentPanel);
            SettingObject settingsPanel = new SettingObject(cardLayout, parentPanel);

            parentPanel.add(mainPanel, "mainPanel");
            parentPanel.add(settingsPanel, "settingsPanel");

            frame.add(parentPanel);
            frame.setVisible(true);
        });
    }
}
2. Создание рендера/конструкторов

Для начала нужно создать класс с цветами которые мы будем использовать, чтобы каждый раз не искать нужный цвет.

Java:
package loader.utils;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс, содержащий все цвета которые можно заюзать
*/
public class ColorUtil extends JPanel {

    public static Color background = new Color(45, 45, 45);

    public static Color headerColor = new Color(29, 29, 31);

    public static Color buttonColor1 = new Color(66, 91, 129);

    public static Color buttonColor2 = new Color(14, 93, 213);
}
Объект рендера главного меню

Java:
package loader.objects;

import loader.objects.buttons.StartButton;
import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс от части всего рендера
*/
public class SquareObject extends JPanel {
    private StartButton startButton;
    private ImageIcon settingsIcon;
    private CardLayout cardLayout;
    private JPanel parentPanel;
    private boolean isRunning = false;
    private boolean isHovered = false;

    /**
     * Конструктор инициализирует главное меню с кнопкой запуска и иконкой настроек
     *
     * @param cardLayout макет для переключения меню
     * @param parentPanel панель для переключения
     */
    public SquareObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        /**
         * Рендер заднего фона
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        /**
         * Рендер кнопки "Запустить"
         */
        startButton = new StartButton("Запустить");
        startButton.setBackground(ColorUtil.buttonColor1);
        startButton.setForeground(Color.WHITE);
        startButton.setFont(new Font("Arial", Font.BOLD, 20));

        startButton.setPreferredSize(new Dimension(200, 50));
        startButton.setBounds((707 - 200) / 2, (509 - 50) / 2 + 50, 200, 50);
        add(startButton);

        startButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (!isRunning) {
                    startButton.setBackground(Color.GREEN);
                    startButton.setText("Ожидайте");

                    /**
                     * Запуск майнкрафт в отдельном потоке
                     */
                    new Thread(() -> {
                        loader.starter.Start.main(new String[]{});
                    }).start();

                    isRunning = true;

                    /**
                     * Закрытие лоудера через минуту
                     * Можете поменять значение как вам угодно
                     */
                    Timer timer = new Timer(60000, evt -> {
                        Window window = SwingUtilities.getWindowAncestor(SquareObject.this);
                        if (window != null) {
                            window.dispose();
                        }
                    });
                    timer.setRepeats(false);
                    timer.start();
                }
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                isHovered = true;
                updateButtonAppearance();
            }

            @Override
            public void mouseExited(MouseEvent e) {
                isHovered = false;
                updateButtonAppearance();
            }
        });

        settingsIcon = new ImageIcon(SquareObject.class.getResource("/loader/assets/setting.png"));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int iconX = getWidth() - 50;
                int iconY = 4;
                int iconWidth = 47;
                int iconHeight = 43;

                if (e.getX() >= iconX && e.getX() <= iconX + iconWidth && e.getY() >= iconY && e.getY() <= iconY + iconHeight) {
                    SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "settingsPanel"));
                }
            }
        });
    }

    /**
     * Отрисовка компонентов
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер полосы сверху
         */
        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        /**
         * Рендер текста
         */
        String versionText = "v1.0";
        String text = "Minecraft Loader";
        g.setColor(Color.WHITE);

        g.setFont(new Font("Arial", Font.BOLD, 40));
        FontMetrics titleMetrics = g.getFontMetrics(g.getFont());
        int titleX = (getWidth() - titleMetrics.stringWidth(text)) / 2 + 15;
        int titleY = titleMetrics.getHeight() - 6;
        g.drawString(text, titleX, titleY);

        g.setFont(new Font("Arial", Font.BOLD, 20));
        FontMetrics metrics = g.getFontMetrics(g.getFont());
        int x = getWidth() - metrics.stringWidth(versionText) - 10;
        int y = getHeight() - metrics.getHeight() + metrics.getAscent() - 10;
        g.drawString(versionText, x, y);

        if (settingsIcon != null) {
            int iconX = getWidth() - 50;
            int iconY = 4;
            g.drawImage(settingsIcon.getImage(), iconX, iconY, 47, 43, this);
        }
    }

    private void updateButtonAppearance() {
        if (isRunning) {
            startButton.setBackground(Color.GREEN);
            startButton.setText("Ожидайте");
        } else {
            if (isHovered) {
                startButton.setBackground(ColorUtil.buttonColor2);
            } else {
                startButton.setBackground(ColorUtil.buttonColor1);
            }
        }
    }
}
Создание класса объекта меню настроек

Java:
package loader.objects;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Объект настроек с возможностью возврата к главному меню
*/
public class SettingObject extends JPanel {
    private CardLayout cardLayout;
    private JPanel parentPanel;

    private int clickableTextX = 20;
    private int clickableTextY = 150;
    private int clickableTextWidth = 300;
    private int clickableTextHeight = 20;
    /**
     * Отрисовка меню
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер фона и элементов интерфейса
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        g.setColor(Color.WHITE);
        g.setFont(new Font("Arial", Font.PLAIN, 20));


        int textX = 20;
        int textY = 100;

        g.drawString("Информация", textX, textY);
        g.drawString("Данный лоудер просто прототип", textX, textY + 30);
        g.drawString("Вы можете наложить свою обфускацию по желанию", textX, textY + 60);

        FontMetrics fm = g.getFontMetrics();
        String clickableText = "Ссылка на канал Tense client";
        int textWidth = fm.stringWidth(clickableText);
        g.setColor(Color.WHITE);
        g.drawString(clickableText, clickableTextX, clickableTextY + 35);


        Rectangle clickableArea = new Rectangle(clickableTextX, clickableTextY - fm.getAscent() + 35, textWidth, fm.getHeight());
        addClickableArea(clickableArea);


    }

    /**
     * Добавляет область кликабельной зоны
     *
     * @param clickableArea кликабельная область
     */
    private void addClickableArea(Rectangle clickableArea) {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (clickableArea.contains(e.getPoint())) {
                    openBrowser("https://www.youtube.com/@rarchik/videos");
                }
            }
        });
    }

    /**
     * Открывает браузер с указанной ссылкой
     *
     * @param url URL для открытия в браузере
     */
    private void openBrowser(String url) {
        try {
            Desktop.getDesktop().browse(new URI(url));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Конструктор кнопки возврата
     *
     * @param cardLayout макет для переключения панелей
     * @param parentPanel панель для переключения
     */
    public SettingObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        JLabel backButton = new JLabel(new ImageIcon(SettingObject.class.getResource("/loader/assets/back_arrow.png")));
        backButton.setBounds(10, 10, 100, 100);
        backButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "mainPanel"));
            }
        });
        add(backButton);

        JLabel settingsLabel = new JLabel("Настройки", SwingConstants.CENTER);
        settingsLabel.setFont(new Font("Arial", Font.BOLD, 40));
        settingsLabel.setForeground(Color.WHITE);
        settingsLabel.setBounds(0, 50, getWidth(), 50);
        add(settingsLabel);

    }
}
Класс кнопки старта

Java:
package loader.objects.buttons;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.RoundRectangle2D;

/** @author BossThisGame for product tense
* <p>
*  Version 1.0
* <p>
* Minecraft loader
*/

/**
* Добавление кнопки "Запуск"
*/
public class StartButton extends JButton {

    public StartButton(String text) {
        super(text);
        setContentAreaFilled(false);
        setFocusPainted(false);

        /**
         * Установка стандартных цветов фона и текста
         */
        setBackground(ColorUtil.buttonColor1);
        setForeground(Color.WHITE);


        /**
         * Обработчик событий мыши для эффекта наведения
         */
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                setBackground(ColorUtil.buttonColor2);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(ColorUtil.buttonColor1);
            }
        });


        /**
         * Установка шрифта для текста кнопки
         */
        setFont(new Font("Arial", Font.BOLD, 20));
    }

    /**
     * Кастомное рисование компонента кнопки
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(getBackground());
        g2.fill(new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(), 30, 30));
        super.paintComponent(g2);
        g2.dispose();
    }

    /**
     * Обновление свойств кнопки
     */
    @Override
    public void updateUI() {
        super.updateUI();
        setOpaque(false);
        setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    }
}
Java:
package loader.starter;

import java.util.Arrays;

import net.minecraft.client.main.Main;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/



public class Start
{


    public static void main(String[] args)
    {
        String assets = System.getenv().containsKey("assetDirectory") ? System.getenv("assetDirectory") : "assets";
        Main.main(concat(new String[] {"--version", "mcp", "--accessToken", "0", "--assetsDir", assets, "--assetIndex", "1.16", "--userProperties", "{}"}, args));
    }

  
    public static <T> T[] concat(T[] first, T[] second)
    {
        T[] result = Arrays.copyOf(first, first.length + second.length);
        System.arraycopy(second, 0, result, first.length, second.length);
        return result;
    }
}
3. Нужно создать папку с ресурсами (png)
Можете сделать как у меня
Посмотреть вложение 280336

Дальше обязательно нужно сделать манифест чтобы лоудер можно было запускать как исполняемый файл
Посмотреть вложение 280338

Код:
Manifest-Version: 1.0
Can-Retransform-Classes: true
Main-Class: loader.starter.Main
SplashScreen-Image: l.png
Дальше нужно создать директорию где будет хранится ваш чит. У меня это будет здесь (Не забудьте про нативки)
Посмотреть вложение 280339


Дальше использую imgur так как на форуме лимит загрузки изображений

Нужно добавить вашу джарку в библиотеку
Пожалуйста, авторизуйтесь для просмотра ссылки.


Теперь осталось забилдить проект. Заходим в
Пожалуйста, авторизуйтесь для просмотра ссылки.


Создаем новый
Пожалуйста, авторизуйтесь для просмотра ссылки.


Дальше можно выбрать название с каким названием будет сохранятся ваша джарка (НЕ ОБЯЗАТЕЛЬНО)

И делаем как на
Пожалуйста, авторизуйтесь для просмотра ссылки.


Важно: С какой джавы вы билдили проект с такой джавы и нужно запускать джарку

Сохраняем,
Пожалуйста, авторизуйтесь для просмотра ссылки.
Build - Build Artifacts и выбираем наш артифакт

После билда можете запускать ваш лоудер.

Так же не пишите мне за ассетсы майнкрафта, к примеру в Экселленте ассесты грузятся из диска C, а добавить их самостоятельно вы и сами сможете.
Пожалуйста, авторизуйтесь для просмотра ссылки.


Я вам не скинул целый уже готовый проект чтобы вы поняли как это делать. Удачи. Так же вы должны учесть, что это не протект лоудер. Здесь нету проверки хвида и т.д. Систему хвида сделать не сложно, поэтому используйте лоудер как хотите
Или это я ебень, или автор не так объяснил, СХУЯЛИ когда я жму кнопку запустить открывается 2 лоадер а нем майн? (кто может помочь дс: wensy_yt )
 
Начинающий
Статус
Оффлайн
Регистрация
7 Мар 2024
Сообщения
294
Реакции[?]
6
Поинты[?]
4K
Или это я ебень, или автор не так объяснил, СХУЯЛИ когда я жму кнопку запустить открывается 2 лоадер а нем майн? (кто может помочь дс: wensy_yt )
ты запускаешь чит в отдельном потоке, а сам лоудер должен закрыться.
 
Начинающий
Статус
Оффлайн
Регистрация
21 Июн 2024
Сообщения
7
Реакции[?]
0
Поинты[?]
0
Пастер на Hunger обиделся? Он так и не разобрался в умном инвентори клеанере
Ты можешь со мной в дс пойти? Я не понимаю как все это сделать что ты там написал? Дс "qurmex"
 
Начинающий
Статус
Оффлайн
Регистрация
22 Июл 2024
Сообщения
154
Реакции[?]
2
Поинты[?]
2K
C:\Users\User\.jdks\corretto-17.0.12\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=49658:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 loader.starter.Main
Error: Could not find or load main class loader.starter.Main
Caused by: java.lang.ClassNotFoundException: loader.starter.Main

Process finished with exit code 1


Че делать
 
Начинающий
Статус
Оффлайн
Регистрация
21 Окт 2022
Сообщения
229
Реакции[?]
1
Поинты[?]
2K
C:\Users\User\.jdks\corretto-17.0.12\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=49658:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 loader.starter.Main
Error: Could not find or load main class loader.starter.Main
Caused by: java.lang.ClassNotFoundException: loader.starter.Main

Process finished with exit code 1


Че делать
не пастить
 
Начинающий
Статус
Онлайн
Регистрация
14 Дек 2022
Сообщения
18
Реакции[?]
1
Поинты[?]
1K
Запасайтесь чипсами, ведь если вы пастер, то вы здесь на долго.
Специально для новичков каждый блок был обозначен, если вам не знакомы некоторые слова советую почитать о них в интернете.

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

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

видео с игрой с лоудера

Создаем новый проект с использованием java 17 если у вас чит экспенсив/экселлент и т.д.

1. Создание приложения с инициализацией всего необходимого.

После создание проекта вам нужно добавить в ваш Main класс всю основу

Java:
package loader.starter;

import loader.objects.SettingObject;
import loader.objects.SquareObject;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

public class Main {

    /**
     * Главный класс
     * Добавление классов
     */
    public static void main(String[] args) {
        ImageIcon icon = new ImageIcon(Main.class.getResource("/loader/assets/logo.png"));

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Loader");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setIconImage(icon.getImage());
            frame.setSize(707, 509);
            frame.setLocationRelativeTo(null);

            frame.setResizable(false);

            JPanel parentPanel = new JPanel(new CardLayout());
            CardLayout cardLayout = (CardLayout) parentPanel.getLayout();

            SquareObject mainPanel = new SquareObject(cardLayout, parentPanel);
            SettingObject settingsPanel = new SettingObject(cardLayout, parentPanel);

            parentPanel.add(mainPanel, "mainPanel");
            parentPanel.add(settingsPanel, "settingsPanel");

            frame.add(parentPanel);
            frame.setVisible(true);
        });
    }
}
2. Создание рендера/конструкторов

Для начала нужно создать класс с цветами которые мы будем использовать, чтобы каждый раз не искать нужный цвет.

Java:
package loader.utils;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс, содержащий все цвета которые можно заюзать
*/
public class ColorUtil extends JPanel {

    public static Color background = new Color(45, 45, 45);

    public static Color headerColor = new Color(29, 29, 31);

    public static Color buttonColor1 = new Color(66, 91, 129);

    public static Color buttonColor2 = new Color(14, 93, 213);
}
Объект рендера главного меню

Java:
package loader.objects;

import loader.objects.buttons.StartButton;
import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс от части всего рендера
*/
public class SquareObject extends JPanel {
    private StartButton startButton;
    private ImageIcon settingsIcon;
    private CardLayout cardLayout;
    private JPanel parentPanel;
    private boolean isRunning = false;
    private boolean isHovered = false;

    /**
     * Конструктор инициализирует главное меню с кнопкой запуска и иконкой настроек
     *
     * @param cardLayout макет для переключения меню
     * @param parentPanel панель для переключения
     */
    public SquareObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        /**
         * Рендер заднего фона
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        /**
         * Рендер кнопки "Запустить"
         */
        startButton = new StartButton("Запустить");
        startButton.setBackground(ColorUtil.buttonColor1);
        startButton.setForeground(Color.WHITE);
        startButton.setFont(new Font("Arial", Font.BOLD, 20));

        startButton.setPreferredSize(new Dimension(200, 50));
        startButton.setBounds((707 - 200) / 2, (509 - 50) / 2 + 50, 200, 50);
        add(startButton);

        startButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (!isRunning) {
                    startButton.setBackground(Color.GREEN);
                    startButton.setText("Ожидайте");

                    /**
                     * Запуск майнкрафт в отдельном потоке
                     */
                    new Thread(() -> {
                        loader.starter.Start.main(new String[]{});
                    }).start();

                    isRunning = true;

                    /**
                     * Закрытие лоудера через минуту
                     * Можете поменять значение как вам угодно
                     */
                    Timer timer = new Timer(60000, evt -> {
                        Window window = SwingUtilities.getWindowAncestor(SquareObject.this);
                        if (window != null) {
                            window.dispose();
                        }
                    });
                    timer.setRepeats(false);
                    timer.start();
                }
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                isHovered = true;
                updateButtonAppearance();
            }

            @Override
            public void mouseExited(MouseEvent e) {
                isHovered = false;
                updateButtonAppearance();
            }
        });

        settingsIcon = new ImageIcon(SquareObject.class.getResource("/loader/assets/setting.png"));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int iconX = getWidth() - 50;
                int iconY = 4;
                int iconWidth = 47;
                int iconHeight = 43;

                if (e.getX() >= iconX && e.getX() <= iconX + iconWidth && e.getY() >= iconY && e.getY() <= iconY + iconHeight) {
                    SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "settingsPanel"));
                }
            }
        });
    }

    /**
     * Отрисовка компонентов
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер полосы сверху
         */
        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        /**
         * Рендер текста
         */
        String versionText = "v1.0";
        String text = "Minecraft Loader";
        g.setColor(Color.WHITE);

        g.setFont(new Font("Arial", Font.BOLD, 40));
        FontMetrics titleMetrics = g.getFontMetrics(g.getFont());
        int titleX = (getWidth() - titleMetrics.stringWidth(text)) / 2 + 15;
        int titleY = titleMetrics.getHeight() - 6;
        g.drawString(text, titleX, titleY);

        g.setFont(new Font("Arial", Font.BOLD, 20));
        FontMetrics metrics = g.getFontMetrics(g.getFont());
        int x = getWidth() - metrics.stringWidth(versionText) - 10;
        int y = getHeight() - metrics.getHeight() + metrics.getAscent() - 10;
        g.drawString(versionText, x, y);

        if (settingsIcon != null) {
            int iconX = getWidth() - 50;
            int iconY = 4;
            g.drawImage(settingsIcon.getImage(), iconX, iconY, 47, 43, this);
        }
    }

    private void updateButtonAppearance() {
        if (isRunning) {
            startButton.setBackground(Color.GREEN);
            startButton.setText("Ожидайте");
        } else {
            if (isHovered) {
                startButton.setBackground(ColorUtil.buttonColor2);
            } else {
                startButton.setBackground(ColorUtil.buttonColor1);
            }
        }
    }
}
Создание класса объекта меню настроек

Java:
package loader.objects;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Объект настроек с возможностью возврата к главному меню
*/
public class SettingObject extends JPanel {
    private CardLayout cardLayout;
    private JPanel parentPanel;

    private int clickableTextX = 20;
    private int clickableTextY = 150;
    private int clickableTextWidth = 300;
    private int clickableTextHeight = 20;
    /**
     * Отрисовка меню
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер фона и элементов интерфейса
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        g.setColor(Color.WHITE);
        g.setFont(new Font("Arial", Font.PLAIN, 20));


        int textX = 20;
        int textY = 100;

        g.drawString("Информация", textX, textY);
        g.drawString("Данный лоудер просто прототип", textX, textY + 30);
        g.drawString("Вы можете наложить свою обфускацию по желанию", textX, textY + 60);

        FontMetrics fm = g.getFontMetrics();
        String clickableText = "Ссылка на канал Tense client";
        int textWidth = fm.stringWidth(clickableText);
        g.setColor(Color.WHITE);
        g.drawString(clickableText, clickableTextX, clickableTextY + 35);


        Rectangle clickableArea = new Rectangle(clickableTextX, clickableTextY - fm.getAscent() + 35, textWidth, fm.getHeight());
        addClickableArea(clickableArea);


    }

    /**
     * Добавляет область кликабельной зоны
     *
     * @param clickableArea кликабельная область
     */
    private void addClickableArea(Rectangle clickableArea) {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (clickableArea.contains(e.getPoint())) {
                    openBrowser("https://www.youtube.com/@rarchik/videos");
                }
            }
        });
    }

    /**
     * Открывает браузер с указанной ссылкой
     *
     * @param url URL для открытия в браузере
     */
    private void openBrowser(String url) {
        try {
            Desktop.getDesktop().browse(new URI(url));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Конструктор кнопки возврата
     *
     * @param cardLayout макет для переключения панелей
     * @param parentPanel панель для переключения
     */
    public SettingObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        JLabel backButton = new JLabel(new ImageIcon(SettingObject.class.getResource("/loader/assets/back_arrow.png")));
        backButton.setBounds(10, 10, 100, 100);
        backButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "mainPanel"));
            }
        });
        add(backButton);

        JLabel settingsLabel = new JLabel("Настройки", SwingConstants.CENTER);
        settingsLabel.setFont(new Font("Arial", Font.BOLD, 40));
        settingsLabel.setForeground(Color.WHITE);
        settingsLabel.setBounds(0, 50, getWidth(), 50);
        add(settingsLabel);

    }
}
Класс кнопки старта

Java:
package loader.objects.buttons;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.RoundRectangle2D;

/** @author BossThisGame for product tense
* <p>
*  Version 1.0
* <p>
* Minecraft loader
*/

/**
* Добавление кнопки "Запуск"
*/
public class StartButton extends JButton {

    public StartButton(String text) {
        super(text);
        setContentAreaFilled(false);
        setFocusPainted(false);

        /**
         * Установка стандартных цветов фона и текста
         */
        setBackground(ColorUtil.buttonColor1);
        setForeground(Color.WHITE);


        /**
         * Обработчик событий мыши для эффекта наведения
         */
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                setBackground(ColorUtil.buttonColor2);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(ColorUtil.buttonColor1);
            }
        });


        /**
         * Установка шрифта для текста кнопки
         */
        setFont(new Font("Arial", Font.BOLD, 20));
    }

    /**
     * Кастомное рисование компонента кнопки
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(getBackground());
        g2.fill(new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(), 30, 30));
        super.paintComponent(g2);
        g2.dispose();
    }

    /**
     * Обновление свойств кнопки
     */
    @Override
    public void updateUI() {
        super.updateUI();
        setOpaque(false);
        setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    }
}
Java:
package loader.starter;

import java.util.Arrays;

import net.minecraft.client.main.Main;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/



public class Start
{


    public static void main(String[] args)
    {
        String assets = System.getenv().containsKey("assetDirectory") ? System.getenv("assetDirectory") : "assets";
        Main.main(concat(new String[] {"--version", "mcp", "--accessToken", "0", "--assetsDir", assets, "--assetIndex", "1.16", "--userProperties", "{}"}, args));
    }

  
    public static <T> T[] concat(T[] first, T[] second)
    {
        T[] result = Arrays.copyOf(first, first.length + second.length);
        System.arraycopy(second, 0, result, first.length, second.length);
        return result;
    }
}
3. Нужно создать папку с ресурсами (png)
Можете сделать как у меня
Посмотреть вложение 280336

Дальше обязательно нужно сделать манифест чтобы лоудер можно было запускать как исполняемый файл
Посмотреть вложение 280338

Код:
Manifest-Version: 1.0
Can-Retransform-Classes: true
Main-Class: loader.starter.Main
SplashScreen-Image: l.png
Дальше нужно создать директорию где будет хранится ваш чит. У меня это будет здесь (Не забудьте про нативки)
Посмотреть вложение 280339


Дальше использую imgur так как на форуме лимит загрузки изображений

Нужно добавить вашу джарку в библиотеку
Пожалуйста, авторизуйтесь для просмотра ссылки.


Теперь осталось забилдить проект. Заходим в
Пожалуйста, авторизуйтесь для просмотра ссылки.


Создаем новый
Пожалуйста, авторизуйтесь для просмотра ссылки.


Дальше можно выбрать название с каким названием будет сохранятся ваша джарка (НЕ ОБЯЗАТЕЛЬНО)

И делаем как на
Пожалуйста, авторизуйтесь для просмотра ссылки.


Важно: С какой джавы вы билдили проект с такой джавы и нужно запускать джарку

Сохраняем,
Пожалуйста, авторизуйтесь для просмотра ссылки.
Build - Build Artifacts и выбираем наш артифакт

После билда можете запускать ваш лоудер.

Так же не пишите мне за ассетсы майнкрафта, к примеру в Экселленте ассесты грузятся из диска C, а добавить их самостоятельно вы и сами сможете.
Пожалуйста, авторизуйтесь для просмотра ссылки.


Я вам не скинул целый уже готовый проект чтобы вы поняли как это делать. Удачи. Так же вы должны учесть, что это не протект лоудер. Здесь нету проверки хвида и т.д. Систему хвида сделать не сложно, поэтому используйте лоудер как хотите
Боже даже для пастеров это кринж, в чём проблема уже написать лоалдер на sh и не дристят этот кал
 
Начинающий
Статус
Оффлайн
Регистрация
31 Май 2024
Сообщения
27
Реакции[?]
1
Поинты[?]
1K
Запасайтесь чипсами, ведь если вы пастер, то вы здесь на долго.
Специально для новичков каждый блок был обозначен, если вам не знакомы некоторые слова советую почитать о них в интернете.

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

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

видео с игрой с лоудера

Создаем новый проект с использованием java 17 если у вас чит экспенсив/экселлент и т.д.

1. Создание приложения с инициализацией всего необходимого.

После создание проекта вам нужно добавить в ваш Main класс всю основу

Java:
package loader.starter;

import loader.objects.SettingObject;
import loader.objects.SquareObject;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

public class Main {

    /**
     * Главный класс
     * Добавление классов
     */
    public static void main(String[] args) {
        ImageIcon icon = new ImageIcon(Main.class.getResource("/loader/assets/logo.png"));

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Loader");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setIconImage(icon.getImage());
            frame.setSize(707, 509);
            frame.setLocationRelativeTo(null);

            frame.setResizable(false);

            JPanel parentPanel = new JPanel(new CardLayout());
            CardLayout cardLayout = (CardLayout) parentPanel.getLayout();

            SquareObject mainPanel = new SquareObject(cardLayout, parentPanel);
            SettingObject settingsPanel = new SettingObject(cardLayout, parentPanel);

            parentPanel.add(mainPanel, "mainPanel");
            parentPanel.add(settingsPanel, "settingsPanel");

            frame.add(parentPanel);
            frame.setVisible(true);
        });
    }
}
2. Создание рендера/конструкторов

Для начала нужно создать класс с цветами которые мы будем использовать, чтобы каждый раз не искать нужный цвет.

Java:
package loader.utils;

import javax.swing.*;
import java.awt.*;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс, содержащий все цвета которые можно заюзать
*/
public class ColorUtil extends JPanel {

    public static Color background = new Color(45, 45, 45);

    public static Color headerColor = new Color(29, 29, 31);

    public static Color buttonColor1 = new Color(66, 91, 129);

    public static Color buttonColor2 = new Color(14, 93, 213);
}
Объект рендера главного меню

Java:
package loader.objects;

import loader.objects.buttons.StartButton;
import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Класс от части всего рендера
*/
public class SquareObject extends JPanel {
    private StartButton startButton;
    private ImageIcon settingsIcon;
    private CardLayout cardLayout;
    private JPanel parentPanel;
    private boolean isRunning = false;
    private boolean isHovered = false;

    /**
     * Конструктор инициализирует главное меню с кнопкой запуска и иконкой настроек
     *
     * @param cardLayout макет для переключения меню
     * @param parentPanel панель для переключения
     */
    public SquareObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        /**
         * Рендер заднего фона
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        /**
         * Рендер кнопки "Запустить"
         */
        startButton = new StartButton("Запустить");
        startButton.setBackground(ColorUtil.buttonColor1);
        startButton.setForeground(Color.WHITE);
        startButton.setFont(new Font("Arial", Font.BOLD, 20));

        startButton.setPreferredSize(new Dimension(200, 50));
        startButton.setBounds((707 - 200) / 2, (509 - 50) / 2 + 50, 200, 50);
        add(startButton);

        startButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (!isRunning) {
                    startButton.setBackground(Color.GREEN);
                    startButton.setText("Ожидайте");

                    /**
                     * Запуск майнкрафт в отдельном потоке
                     */
                    new Thread(() -> {
                        loader.starter.Start.main(new String[]{});
                    }).start();

                    isRunning = true;

                    /**
                     * Закрытие лоудера через минуту
                     * Можете поменять значение как вам угодно
                     */
                    Timer timer = new Timer(60000, evt -> {
                        Window window = SwingUtilities.getWindowAncestor(SquareObject.this);
                        if (window != null) {
                            window.dispose();
                        }
                    });
                    timer.setRepeats(false);
                    timer.start();
                }
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                isHovered = true;
                updateButtonAppearance();
            }

            @Override
            public void mouseExited(MouseEvent e) {
                isHovered = false;
                updateButtonAppearance();
            }
        });

        settingsIcon = new ImageIcon(SquareObject.class.getResource("/loader/assets/setting.png"));

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int iconX = getWidth() - 50;
                int iconY = 4;
                int iconWidth = 47;
                int iconHeight = 43;

                if (e.getX() >= iconX && e.getX() <= iconX + iconWidth && e.getY() >= iconY && e.getY() <= iconY + iconHeight) {
                    SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "settingsPanel"));
                }
            }
        });
    }

    /**
     * Отрисовка компонентов
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер полосы сверху
         */
        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        /**
         * Рендер текста
         */
        String versionText = "v1.0";
        String text = "Minecraft Loader";
        g.setColor(Color.WHITE);

        g.setFont(new Font("Arial", Font.BOLD, 40));
        FontMetrics titleMetrics = g.getFontMetrics(g.getFont());
        int titleX = (getWidth() - titleMetrics.stringWidth(text)) / 2 + 15;
        int titleY = titleMetrics.getHeight() - 6;
        g.drawString(text, titleX, titleY);

        g.setFont(new Font("Arial", Font.BOLD, 20));
        FontMetrics metrics = g.getFontMetrics(g.getFont());
        int x = getWidth() - metrics.stringWidth(versionText) - 10;
        int y = getHeight() - metrics.getHeight() + metrics.getAscent() - 10;
        g.drawString(versionText, x, y);

        if (settingsIcon != null) {
            int iconX = getWidth() - 50;
            int iconY = 4;
            g.drawImage(settingsIcon.getImage(), iconX, iconY, 47, 43, this);
        }
    }

    private void updateButtonAppearance() {
        if (isRunning) {
            startButton.setBackground(Color.GREEN);
            startButton.setText("Ожидайте");
        } else {
            if (isHovered) {
                startButton.setBackground(ColorUtil.buttonColor2);
            } else {
                startButton.setBackground(ColorUtil.buttonColor1);
            }
        }
    }
}
Создание класса объекта меню настроек

Java:
package loader.objects;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/

/**
* Объект настроек с возможностью возврата к главному меню
*/
public class SettingObject extends JPanel {
    private CardLayout cardLayout;
    private JPanel parentPanel;

    private int clickableTextX = 20;
    private int clickableTextY = 150;
    private int clickableTextWidth = 300;
    private int clickableTextHeight = 20;
    /**
     * Отрисовка меню
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        /**
         * Рендер фона и элементов интерфейса
         */
        setBackground(ColorUtil.background);
        setLayout(null);

        g.setColor(ColorUtil.headerColor);
        g.fillRect(0, 0, getWidth(), 50);

        g.setColor(Color.WHITE);
        g.setFont(new Font("Arial", Font.PLAIN, 20));


        int textX = 20;
        int textY = 100;

        g.drawString("Информация", textX, textY);
        g.drawString("Данный лоудер просто прототип", textX, textY + 30);
        g.drawString("Вы можете наложить свою обфускацию по желанию", textX, textY + 60);

        FontMetrics fm = g.getFontMetrics();
        String clickableText = "Ссылка на канал Tense client";
        int textWidth = fm.stringWidth(clickableText);
        g.setColor(Color.WHITE);
        g.drawString(clickableText, clickableTextX, clickableTextY + 35);


        Rectangle clickableArea = new Rectangle(clickableTextX, clickableTextY - fm.getAscent() + 35, textWidth, fm.getHeight());
        addClickableArea(clickableArea);


    }

    /**
     * Добавляет область кликабельной зоны
     *
     * @param clickableArea кликабельная область
     */
    private void addClickableArea(Rectangle clickableArea) {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (clickableArea.contains(e.getPoint())) {
                    openBrowser("https://www.youtube.com/@rarchik/videos");
                }
            }
        });
    }

    /**
     * Открывает браузер с указанной ссылкой
     *
     * @param url URL для открытия в браузере
     */
    private void openBrowser(String url) {
        try {
            Desktop.getDesktop().browse(new URI(url));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Конструктор кнопки возврата
     *
     * @param cardLayout макет для переключения панелей
     * @param parentPanel панель для переключения
     */
    public SettingObject(CardLayout cardLayout, JPanel parentPanel) {
        this.cardLayout = cardLayout;
        this.parentPanel = parentPanel;

        JLabel backButton = new JLabel(new ImageIcon(SettingObject.class.getResource("/loader/assets/back_arrow.png")));
        backButton.setBounds(10, 10, 100, 100);
        backButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                SwingUtilities.invokeLater(() -> cardLayout.show(parentPanel, "mainPanel"));
            }
        });
        add(backButton);

        JLabel settingsLabel = new JLabel("Настройки", SwingConstants.CENTER);
        settingsLabel.setFont(new Font("Arial", Font.BOLD, 40));
        settingsLabel.setForeground(Color.WHITE);
        settingsLabel.setBounds(0, 50, getWidth(), 50);
        add(settingsLabel);

    }
}
Класс кнопки старта

Java:
package loader.objects.buttons;

import loader.utils.ColorUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.RoundRectangle2D;

/** @author BossThisGame for product tense
* <p>
*  Version 1.0
* <p>
* Minecraft loader
*/

/**
* Добавление кнопки "Запуск"
*/
public class StartButton extends JButton {

    public StartButton(String text) {
        super(text);
        setContentAreaFilled(false);
        setFocusPainted(false);

        /**
         * Установка стандартных цветов фона и текста
         */
        setBackground(ColorUtil.buttonColor1);
        setForeground(Color.WHITE);


        /**
         * Обработчик событий мыши для эффекта наведения
         */
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                setBackground(ColorUtil.buttonColor2);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(ColorUtil.buttonColor1);
            }
        });


        /**
         * Установка шрифта для текста кнопки
         */
        setFont(new Font("Arial", Font.BOLD, 20));
    }

    /**
     * Кастомное рисование компонента кнопки
     *
     * @param g объект Graphics для защиты
     */
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(getBackground());
        g2.fill(new RoundRectangle2D.Float(0, 0, getWidth(), getHeight(), 30, 30));
        super.paintComponent(g2);
        g2.dispose();
    }

    /**
     * Обновление свойств кнопки
     */
    @Override
    public void updateUI() {
        super.updateUI();
        setOpaque(false);
        setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15));
    }
}
Java:
package loader.starter;

import java.util.Arrays;

import net.minecraft.client.main.Main;

/** @author BossThisGame for product tense
* <p>
* Version 1.0
* <p>
* Minecraft loader
*/



public class Start
{


    public static void main(String[] args)
    {
        String assets = System.getenv().containsKey("assetDirectory") ? System.getenv("assetDirectory") : "assets";
        Main.main(concat(new String[] {"--version", "mcp", "--accessToken", "0", "--assetsDir", assets, "--assetIndex", "1.16", "--userProperties", "{}"}, args));
    }

  
    public static <T> T[] concat(T[] first, T[] second)
    {
        T[] result = Arrays.copyOf(first, first.length + second.length);
        System.arraycopy(second, 0, result, first.length, second.length);
        return result;
    }
}
3. Нужно создать папку с ресурсами (png)
Можете сделать как у меня
Посмотреть вложение 280336

Дальше обязательно нужно сделать манифест чтобы лоудер можно было запускать как исполняемый файл
Посмотреть вложение 280338

Код:
Manifest-Version: 1.0
Can-Retransform-Classes: true
Main-Class: loader.starter.Main
SplashScreen-Image: l.png
Дальше нужно создать директорию где будет хранится ваш чит. У меня это будет здесь (Не забудьте про нативки)
Посмотреть вложение 280339


Дальше использую imgur так как на форуме лимит загрузки изображений

Нужно добавить вашу джарку в библиотеку
Пожалуйста, авторизуйтесь для просмотра ссылки.


Теперь осталось забилдить проект. Заходим в
Пожалуйста, авторизуйтесь для просмотра ссылки.


Создаем новый
Пожалуйста, авторизуйтесь для просмотра ссылки.


Дальше можно выбрать название с каким названием будет сохранятся ваша джарка (НЕ ОБЯЗАТЕЛЬНО)

И делаем как на
Пожалуйста, авторизуйтесь для просмотра ссылки.


Важно: С какой джавы вы билдили проект с такой джавы и нужно запускать джарку

Сохраняем,
Пожалуйста, авторизуйтесь для просмотра ссылки.
Build - Build Artifacts и выбираем наш артифакт

После билда можете запускать ваш лоудер.

Так же не пишите мне за ассетсы майнкрафта, к примеру в Экселленте ассесты грузятся из диска C, а добавить их самостоятельно вы и сами сможете.
Пожалуйста, авторизуйтесь для просмотра ссылки.


Я вам не скинул целый уже готовый проект чтобы вы поняли как это делать. Удачи. Так же вы должны учесть, что это не протект лоудер. Здесь нету проверки хвида и т.д. Систему хвида сделать не сложно, поэтому используйте лоудер как хотите
Как пофиксить Что Жалуется на import net.minecraft.client.main.Main;
 
Начинающий
Статус
Оффлайн
Регистрация
24 Май 2024
Сообщения
62
Реакции[?]
0
Поинты[?]
0
Как пофиксить Что Жалуется на import net.minecraft.client.main.Main;
тебе нужно загрузить сам софт.
То есть сделать его в либку, это есть в гайде.

Без всего этого ты софтяру не запустишь.
 
Новичок
Статус
Оффлайн
Регистрация
28 Май 2024
Сообщения
1
Реакции[?]
0
Поинты[?]
0
Error: Could not find or load main class Main
Caused by: java.lang.ClassNotFoundException: Main
что делать если пишет это?
 
Сверху Снизу