• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Прочее Премиум функции | Excellent Recode

  • Автор темы Автор темы Sinklyy
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
4 Авг 2024
Сообщения
133
Реакции
0
Выберите загрузчик игры
  1. OptiFine
Всем здарова. В данной теме я солью вам премиум функции, взял идею на это из Nursultan, и реализовал идею в Excellent. Сразу говорю жду в Excellent Plus, и в других пастах на базе Excellent

Контакты​

  • Discord: leakerzxc (По вопросам, если что то было не понятно или же не поняли как сделать)
  • Сайт/Форум: YouGame.biz
  • Для удобства можете скачать мою базу Excellent Fix. Я её использовал и делал на ней данную функцию.
SS - Предоставил в самом внизу

Я разделил всё по этапам.

Первый этап. Делаем регистрацию чтобы делать премиум функции​


Переходим мы в класс ModuleInfo, и вставляем код ниже:

ModuleInfo:
Expand Collapse Copy
package org.excellent.client.managers.module;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public [USER=1340661]@interface[/USER] ModuleInfo {
    String name();

    Category category();

    int key() default -1;

    boolean autoEnabled() default false;

    boolean allowDisable() default true;

    boolean hidden() default false;

    boolean premium() default false;
}
Что же этим мы сделали: Мы сделали то что теперь мы можем при помощи premium = true зарегистрировать модуль как премиум.

Второй этап. Делаем уведомление о том то что функция премиум, и её могут использовать только премиум пользователи.​


В классе Module, заменяем всё на:

Module:
Expand Collapse Copy
package org.excellent.client.managers.module;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Data;
import org.apache.commons.lang3.NotImplementedException;
import org.excellent.client.Excellent;
import org.excellent.client.api.annotations.Beta;
import org.excellent.client.api.client.Constants;
import org.excellent.client.api.interfaces.IMinecraft;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.module.impl.misc.Notifications;
import org.excellent.client.managers.module.impl.render.Hud;
import org.excellent.client.managers.module.settings.Setting;
import org.excellent.client.managers.other.notification.NotificationType;
import org.excellent.client.utils.animation.Animation;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.other.SoundUtil;
import org.excellent.client.utils.render.color.ColorFormatting;
import org.excellent.client.utils.render.color.ColorUtil;
import org.excellent.client.utils.render.font.StripFont;

import java.util.List;

[USER=54968]@data[/USER]
public abstract class Module implements IMinecraft {
    private final List<Setting<?>> settings = new ObjectArrayList<>();
    private ModuleInfo moduleInfo;
    private String name;
    private Category category;
    private boolean enabled;
    private boolean autoEnabled;
    private boolean allowDisable;
    private boolean hidden;
    private boolean premium;
    private int key;
    private final Animation animation = new Animation();
    private final StripFont stripFont = new StripFont();

    public Module() {
        Class<? extends Module> clazz = this.getClass();
        ModuleInfo moduleInfo = clazz.getAnnotation(ModuleInfo.class);

        if (moduleInfo == null) {
            throw new NotImplementedException("@ModuleInfo annotation not found on " + clazz.getSimpleName());
        }

        this.moduleInfo = moduleInfo;
        this.name = moduleInfo.name().trim().replaceAll(" ", "");
        this.category = moduleInfo.category();
        this.autoEnabled = moduleInfo.autoEnabled();
        this.allowDisable = moduleInfo.allowDisable();
        this.hidden = moduleInfo.hidden();
        this.premium = moduleInfo.premium();
        this.key = moduleInfo.key();

        setup();
    }

    public void toggle() {
        setEnabled(!enabled);
    }

    public void setEnabled(final boolean enabled) {
        setEnabled(enabled, true);
    }

    public void setEnabled(final boolean enabled, boolean notification) {
        if (this.premium && !permissionPremium()) {
            if (this.enabled) {
                forceDisable();
            }
            if (enabled) {
                errorPremiumNotification();
            }
            return;
        }

        if (this.enabled == enabled || (!this.allowDisable && !enabled)) {
            return;
        }

        this.enabled = enabled;
        final boolean beta = this.getClass().isAnnotationPresent(Beta.class);
        Notifications notifications = Notifications.getInstance();

        if (!this.isHidden() && notification && notifications.isEnabled()) {
            Excellent.inst().notificationManager().register(
                    (beta ? ColorFormatting.getColor(ColorUtil.RED) + "(beta) " + ColorFormatting.reset() : "") +
                            "Модуль" +
                            (enabled ? ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.GREEN, ColorUtil.WHITE)) :
                                    ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE))) +
                            " " + this.name + ColorFormatting.reset() + " " +
                            (enabled ? "включён" : "выключен"),
                    NotificationType.INFO,
                    1500
            );

            if (notifications.sound().getValue()) {
                SoundUtil.playSound(enabled ? "enabled.wav" : "disabled.wav", notifications.volume().getValue() / 100F);
            }
        }

        if (enabled) {
            superEnable();
        } else {
            superDisable();
        }

        if (Hud.getInstance().checks().getValue("Keybinds") || Hud.getInstance().checks().getValue("ArrayList")) {
            animation.run(enabled ? 1 : 0, 0.5F, Easings.EXPO_OUT, false);
        }
    }

    private void forceDisable() {
        if (this.enabled) {
            this.enabled = false;
            superDisable();
        }
    }

    private void errorPremiumNotification() {
        Theme theme = Theme.getInstance();
        int textColor = theme != null ? theme.textlogoColor() : ColorUtil.WHITE;
        int accentColor = ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE);

        Excellent.inst().notificationManager().register(
                ColorFormatting.getColor(textColor) + "Извините, но функция " +
                        ColorFormatting.getColor(accentColor) + this.name +
                        ColorFormatting.getColor(textColor) + " доступна только премиум пользователям!",
                NotificationType.WARN,
                1500
        );

        SoundUtil.playSound("disabled.wav", 0.5F);
    }

    private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

    private void eventEnable() {
        Excellent.eventHandler().subscribe(this);
    }

    private void eventDisable() {
        Excellent.eventHandler().unsubscribe(this);
    }

    private void superEnable() {
        if (mc.player != null) onEnable();
        eventEnable();
    }

    private void superDisable() {
        if (mc.player != null) onDisable();
        eventDisable();
    }

    public void setup() {
    }

    protected void onEnable() {
    }

    protected void onDisable() {
    }
}
Что мы сделали: Мы сделали то что теперь если у игрока нету премиума то ему будет приходить уведомление о том то что функция доступна только премиум пользователям. А так же мы сделали кто сможет использовать данную премиум функцию. Это мы сделали в:

Кто может использовать премиум функции:
Expand Collapse Copy
private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

Третий этап. Делаем Warn Notification.​


В WarnNotification
WarnNotification:
Expand Collapse Copy
package org.excellent.client.managers.other.notification.impl;

import net.mojang.blaze3d.matrix.MatrixStack;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.other.notification.Notification;
import org.excellent.client.utils.animation.util.Easing;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.render.color.ColorUtil;

public class WarnNotification extends Notification {
    public WarnNotification(String content, long delay, int index) {
        super(content, delay, index);
        animationY.set(index);
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack matrix, int multiplier) {
        Theme theme = Theme.getInstance();
        boolean finished = finished();

        animation.update();
        animationY.update();

        Easing easing = finished ? Easings.EXPO_IN : Easings.EXPO_OUT;

        float margin = 5;
        float width = margin + font.getWidth(content, fontSize) + margin;
        float height = margin + fontSize + margin;
        animation.run(finished ? 0 : 1, (wait / 1000F) / 2F, easing, true);
        animationY.run(multiplier, (wait / 1000F) / 2F, Easings.CUBIC_OUT, true);

        float x = width() - margin - (width * animation.get());
        float y = height() - height - 32 - ((animationY.get() * (height + (margin / 2F))));

        float alpha = (float) Math.pow(animation.get(), 4);

        matrix.push();
        matrix.translate((x + width), (y + height / 2F), 0);
        matrix.scale(1, animation.get(), 1);
        matrix.translate(-(x + width), -(y + height / 2F), 0);
        theme.drawClientRect(matrix, x, y, width, height, alpha, 4);
        font.drawOutline(matrix, content, x + margin, y + margin, ColorUtil.multAlpha(theme.clientColor(), alpha), fontSize);
        matrix.pop();
    }
}

Четвёртый завершающий этап. Мы реализуем чтобы у функции которая премиум писалось PREMIUM.​


В ModuleComponent на 153 строчке вставляем:

ModuleComponent:
Expand Collapse Copy
if (module.getClass().isAnnotationPresent(Beta.class)) {
            Fonts.SF_BOLD.draw(matrix, "BETA", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getModuleInfo().premium()) {
            Fonts.SF_BOLD.draw(matrix, "PREMIUM", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(Funtime.class)) {
            Fonts.SF_BOLD.draw(matrix, "FT", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(HolyWorld.class)) {
            Fonts.SF_BOLD.draw(matrix, "HW", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        }

Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
1748154956736.png
1748154963092.png


ВАЖНО!!!

Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER)
- Это без премиума

А вот так должно выглядеть с премиумом:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER, premium = true)
- Это с премиумом.

Мы добавили: premium = true.


Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.

И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.
 
Уроооо одобрили
 
Всем здарова. В данной теме я солью вам премиум функции, взял идею на это из Nursultan, и реализовал идею в Excellent. Сразу говорю жду в Excellent Plus, и в других пастах на базе Excellent

Контакты​

  • Discord: leakerzxc (По вопросам, если что то было не понятно или же не поняли как сделать)
  • Сайт/Форум: YouGame.biz
  • Для удобства можете скачать мою базу Excellent Fix. Я её использовал и делал на ней данную функцию.
SS - Предоставил в самом внизу

Я разделил всё по этапам.

Первый этап. Делаем регистрацию чтобы делать премиум функции​


Переходим мы в класс ModuleInfo, и вставляем код ниже:

ModuleInfo:
Expand Collapse Copy
package org.excellent.client.managers.module;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public [USER=1340661]@interface[/USER] ModuleInfo {
    String name();

    Category category();

    int key() default -1;

    boolean autoEnabled() default false;

    boolean allowDisable() default true;

    boolean hidden() default false;

    boolean premium() default false;
}
Что же этим мы сделали: Мы сделали то что теперь мы можем при помощи premium = true зарегистрировать модуль как премиум.

Второй этап. Делаем уведомление о том то что функция премиум, и её могут использовать только премиум пользователи.​


В классе Module, заменяем всё на:

Module:
Expand Collapse Copy
package org.excellent.client.managers.module;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Data;
import org.apache.commons.lang3.NotImplementedException;
import org.excellent.client.Excellent;
import org.excellent.client.api.annotations.Beta;
import org.excellent.client.api.client.Constants;
import org.excellent.client.api.interfaces.IMinecraft;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.module.impl.misc.Notifications;
import org.excellent.client.managers.module.impl.render.Hud;
import org.excellent.client.managers.module.settings.Setting;
import org.excellent.client.managers.other.notification.NotificationType;
import org.excellent.client.utils.animation.Animation;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.other.SoundUtil;
import org.excellent.client.utils.render.color.ColorFormatting;
import org.excellent.client.utils.render.color.ColorUtil;
import org.excellent.client.utils.render.font.StripFont;

import java.util.List;

[USER=54968]@data[/USER]
public abstract class Module implements IMinecraft {
    private final List<Setting<?>> settings = new ObjectArrayList<>();
    private ModuleInfo moduleInfo;
    private String name;
    private Category category;
    private boolean enabled;
    private boolean autoEnabled;
    private boolean allowDisable;
    private boolean hidden;
    private boolean premium;
    private int key;
    private final Animation animation = new Animation();
    private final StripFont stripFont = new StripFont();

    public Module() {
        Class<? extends Module> clazz = this.getClass();
        ModuleInfo moduleInfo = clazz.getAnnotation(ModuleInfo.class);

        if (moduleInfo == null) {
            throw new NotImplementedException("@ModuleInfo annotation not found on " + clazz.getSimpleName());
        }

        this.moduleInfo = moduleInfo;
        this.name = moduleInfo.name().trim().replaceAll(" ", "");
        this.category = moduleInfo.category();
        this.autoEnabled = moduleInfo.autoEnabled();
        this.allowDisable = moduleInfo.allowDisable();
        this.hidden = moduleInfo.hidden();
        this.premium = moduleInfo.premium();
        this.key = moduleInfo.key();

        setup();
    }

    public void toggle() {
        setEnabled(!enabled);
    }

    public void setEnabled(final boolean enabled) {
        setEnabled(enabled, true);
    }

    public void setEnabled(final boolean enabled, boolean notification) {
        if (this.premium && !permissionPremium()) {
            if (this.enabled) {
                forceDisable();
            }
            if (enabled) {
                errorPremiumNotification();
            }
            return;
        }

        if (this.enabled == enabled || (!this.allowDisable && !enabled)) {
            return;
        }

        this.enabled = enabled;
        final boolean beta = this.getClass().isAnnotationPresent(Beta.class);
        Notifications notifications = Notifications.getInstance();

        if (!this.isHidden() && notification && notifications.isEnabled()) {
            Excellent.inst().notificationManager().register(
                    (beta ? ColorFormatting.getColor(ColorUtil.RED) + "(beta) " + ColorFormatting.reset() : "") +
                            "Модуль" +
                            (enabled ? ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.GREEN, ColorUtil.WHITE)) :
                                    ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE))) +
                            " " + this.name + ColorFormatting.reset() + " " +
                            (enabled ? "включён" : "выключен"),
                    NotificationType.INFO,
                    1500
            );

            if (notifications.sound().getValue()) {
                SoundUtil.playSound(enabled ? "enabled.wav" : "disabled.wav", notifications.volume().getValue() / 100F);
            }
        }

        if (enabled) {
            superEnable();
        } else {
            superDisable();
        }

        if (Hud.getInstance().checks().getValue("Keybinds") || Hud.getInstance().checks().getValue("ArrayList")) {
            animation.run(enabled ? 1 : 0, 0.5F, Easings.EXPO_OUT, false);
        }
    }

    private void forceDisable() {
        if (this.enabled) {
            this.enabled = false;
            superDisable();
        }
    }

    private void errorPremiumNotification() {
        Theme theme = Theme.getInstance();
        int textColor = theme != null ? theme.textlogoColor() : ColorUtil.WHITE;
        int accentColor = ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE);

        Excellent.inst().notificationManager().register(
                ColorFormatting.getColor(textColor) + "Извините, но функция " +
                        ColorFormatting.getColor(accentColor) + this.name +
                        ColorFormatting.getColor(textColor) + " доступна только премиум пользователям!",
                NotificationType.WARN,
                1500
        );

        SoundUtil.playSound("disabled.wav", 0.5F);
    }

    private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

    private void eventEnable() {
        Excellent.eventHandler().subscribe(this);
    }

    private void eventDisable() {
        Excellent.eventHandler().unsubscribe(this);
    }

    private void superEnable() {
        if (mc.player != null) onEnable();
        eventEnable();
    }

    private void superDisable() {
        if (mc.player != null) onDisable();
        eventDisable();
    }

    public void setup() {
    }

    protected void onEnable() {
    }

    protected void onDisable() {
    }
}
Что мы сделали: Мы сделали то что теперь если у игрока нету премиума то ему будет приходить уведомление о том то что функция доступна только премиум пользователям. А так же мы сделали кто сможет использовать данную премиум функцию. Это мы сделали в:

Кто может использовать премиум функции:
Expand Collapse Copy
private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

Третий этап. Делаем Warn Notification.​


В WarnNotification
WarnNotification:
Expand Collapse Copy
package org.excellent.client.managers.other.notification.impl;

import net.mojang.blaze3d.matrix.MatrixStack;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.other.notification.Notification;
import org.excellent.client.utils.animation.util.Easing;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.render.color.ColorUtil;

public class WarnNotification extends Notification {
    public WarnNotification(String content, long delay, int index) {
        super(content, delay, index);
        animationY.set(index);
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack matrix, int multiplier) {
        Theme theme = Theme.getInstance();
        boolean finished = finished();

        animation.update();
        animationY.update();

        Easing easing = finished ? Easings.EXPO_IN : Easings.EXPO_OUT;

        float margin = 5;
        float width = margin + font.getWidth(content, fontSize) + margin;
        float height = margin + fontSize + margin;
        animation.run(finished ? 0 : 1, (wait / 1000F) / 2F, easing, true);
        animationY.run(multiplier, (wait / 1000F) / 2F, Easings.CUBIC_OUT, true);

        float x = width() - margin - (width * animation.get());
        float y = height() - height - 32 - ((animationY.get() * (height + (margin / 2F))));

        float alpha = (float) Math.pow(animation.get(), 4);

        matrix.push();
        matrix.translate((x + width), (y + height / 2F), 0);
        matrix.scale(1, animation.get(), 1);
        matrix.translate(-(x + width), -(y + height / 2F), 0);
        theme.drawClientRect(matrix, x, y, width, height, alpha, 4);
        font.drawOutline(matrix, content, x + margin, y + margin, ColorUtil.multAlpha(theme.clientColor(), alpha), fontSize);
        matrix.pop();
    }
}

Четвёртый завершающий этап. Мы реализуем чтобы у функции которая премиум писалось PREMIUM.​


В ModuleComponent на 153 строчке вставляем:

ModuleComponent:
Expand Collapse Copy
if (module.getClass().isAnnotationPresent(Beta.class)) {
            Fonts.SF_BOLD.draw(matrix, "BETA", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getModuleInfo().premium()) {
            Fonts.SF_BOLD.draw(matrix, "PREMIUM", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(Funtime.class)) {
            Fonts.SF_BOLD.draw(matrix, "FT", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(HolyWorld.class)) {
            Fonts.SF_BOLD.draw(matrix, "HW", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        }

Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
Посмотреть вложение 307164Посмотреть вложение 307165

ВАЖНО!!!

Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER)
- Это без премиума

А вот так должно выглядеть с премиумом:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER, premium = true)
- Это с премиумом.

Мы добавили: premium = true.


Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.

И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.
бля ну нахуй вы это постите щас в каждом ебучем паста клиенте появится ебучий премиум и школьние же это сожрут и купят прем подписку (мне тоже передтся)
 
бля ну нахуй вы это постите щас в каждом ебучем паста клиенте появится ебучий премиум и школьние же это сожрут и купят прем подписку (мне тоже передтся)
Не думаю то что пастеры осилят это спастить. Ну а если даже осилят то их пасту всё равно крякнут и сольют.
 
Всем здарова. В данной теме я солью вам премиум функции, взял идею на это из Nursultan, и реализовал идею в Excellent. Сразу говорю жду в Excellent Plus, и в других пастах на базе Excellent

Контакты​

  • Discord: leakerzxc (По вопросам, если что то было не понятно или же не поняли как сделать)
  • Сайт/Форум: YouGame.biz
  • Для удобства можете скачать мою базу Excellent Fix. Я её использовал и делал на ней данную функцию.
SS - Предоставил в самом внизу

Я разделил всё по этапам.

Первый этап. Делаем регистрацию чтобы делать премиум функции​


Переходим мы в класс ModuleInfo, и вставляем код ниже:

ModuleInfo:
Expand Collapse Copy
package org.excellent.client.managers.module;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public [USER=1340661]@interface[/USER] ModuleInfo {
    String name();

    Category category();

    int key() default -1;

    boolean autoEnabled() default false;

    boolean allowDisable() default true;

    boolean hidden() default false;

    boolean premium() default false;
}
Что же этим мы сделали: Мы сделали то что теперь мы можем при помощи premium = true зарегистрировать модуль как премиум.

Второй этап. Делаем уведомление о том то что функция премиум, и её могут использовать только премиум пользователи.​


В классе Module, заменяем всё на:

Module:
Expand Collapse Copy
package org.excellent.client.managers.module;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Data;
import org.apache.commons.lang3.NotImplementedException;
import org.excellent.client.Excellent;
import org.excellent.client.api.annotations.Beta;
import org.excellent.client.api.client.Constants;
import org.excellent.client.api.interfaces.IMinecraft;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.module.impl.misc.Notifications;
import org.excellent.client.managers.module.impl.render.Hud;
import org.excellent.client.managers.module.settings.Setting;
import org.excellent.client.managers.other.notification.NotificationType;
import org.excellent.client.utils.animation.Animation;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.other.SoundUtil;
import org.excellent.client.utils.render.color.ColorFormatting;
import org.excellent.client.utils.render.color.ColorUtil;
import org.excellent.client.utils.render.font.StripFont;

import java.util.List;

[USER=54968]@data[/USER]
public abstract class Module implements IMinecraft {
    private final List<Setting<?>> settings = new ObjectArrayList<>();
    private ModuleInfo moduleInfo;
    private String name;
    private Category category;
    private boolean enabled;
    private boolean autoEnabled;
    private boolean allowDisable;
    private boolean hidden;
    private boolean premium;
    private int key;
    private final Animation animation = new Animation();
    private final StripFont stripFont = new StripFont();

    public Module() {
        Class<? extends Module> clazz = this.getClass();
        ModuleInfo moduleInfo = clazz.getAnnotation(ModuleInfo.class);

        if (moduleInfo == null) {
            throw new NotImplementedException("@ModuleInfo annotation not found on " + clazz.getSimpleName());
        }

        this.moduleInfo = moduleInfo;
        this.name = moduleInfo.name().trim().replaceAll(" ", "");
        this.category = moduleInfo.category();
        this.autoEnabled = moduleInfo.autoEnabled();
        this.allowDisable = moduleInfo.allowDisable();
        this.hidden = moduleInfo.hidden();
        this.premium = moduleInfo.premium();
        this.key = moduleInfo.key();

        setup();
    }

    public void toggle() {
        setEnabled(!enabled);
    }

    public void setEnabled(final boolean enabled) {
        setEnabled(enabled, true);
    }

    public void setEnabled(final boolean enabled, boolean notification) {
        if (this.premium && !permissionPremium()) {
            if (this.enabled) {
                forceDisable();
            }
            if (enabled) {
                errorPremiumNotification();
            }
            return;
        }

        if (this.enabled == enabled || (!this.allowDisable && !enabled)) {
            return;
        }

        this.enabled = enabled;
        final boolean beta = this.getClass().isAnnotationPresent(Beta.class);
        Notifications notifications = Notifications.getInstance();

        if (!this.isHidden() && notification && notifications.isEnabled()) {
            Excellent.inst().notificationManager().register(
                    (beta ? ColorFormatting.getColor(ColorUtil.RED) + "(beta) " + ColorFormatting.reset() : "") +
                            "Модуль" +
                            (enabled ? ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.GREEN, ColorUtil.WHITE)) :
                                    ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE))) +
                            " " + this.name + ColorFormatting.reset() + " " +
                            (enabled ? "включён" : "выключен"),
                    NotificationType.INFO,
                    1500
            );

            if (notifications.sound().getValue()) {
                SoundUtil.playSound(enabled ? "enabled.wav" : "disabled.wav", notifications.volume().getValue() / 100F);
            }
        }

        if (enabled) {
            superEnable();
        } else {
            superDisable();
        }

        if (Hud.getInstance().checks().getValue("Keybinds") || Hud.getInstance().checks().getValue("ArrayList")) {
            animation.run(enabled ? 1 : 0, 0.5F, Easings.EXPO_OUT, false);
        }
    }

    private void forceDisable() {
        if (this.enabled) {
            this.enabled = false;
            superDisable();
        }
    }

    private void errorPremiumNotification() {
        Theme theme = Theme.getInstance();
        int textColor = theme != null ? theme.textlogoColor() : ColorUtil.WHITE;
        int accentColor = ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE);

        Excellent.inst().notificationManager().register(
                ColorFormatting.getColor(textColor) + "Извините, но функция " +
                        ColorFormatting.getColor(accentColor) + this.name +
                        ColorFormatting.getColor(textColor) + " доступна только премиум пользователям!",
                NotificationType.WARN,
                1500
        );

        SoundUtil.playSound("disabled.wav", 0.5F);
    }

    private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

    private void eventEnable() {
        Excellent.eventHandler().subscribe(this);
    }

    private void eventDisable() {
        Excellent.eventHandler().unsubscribe(this);
    }

    private void superEnable() {
        if (mc.player != null) onEnable();
        eventEnable();
    }

    private void superDisable() {
        if (mc.player != null) onDisable();
        eventDisable();
    }

    public void setup() {
    }

    protected void onEnable() {
    }

    protected void onDisable() {
    }
}
Что мы сделали: Мы сделали то что теперь если у игрока нету премиума то ему будет приходить уведомление о том то что функция доступна только премиум пользователям. А так же мы сделали кто сможет использовать данную премиум функцию. Это мы сделали в:

Кто может использовать премиум функции:
Expand Collapse Copy
private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

Третий этап. Делаем Warn Notification.​


В WarnNotification
WarnNotification:
Expand Collapse Copy
package org.excellent.client.managers.other.notification.impl;

import net.mojang.blaze3d.matrix.MatrixStack;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.other.notification.Notification;
import org.excellent.client.utils.animation.util.Easing;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.render.color.ColorUtil;

public class WarnNotification extends Notification {
    public WarnNotification(String content, long delay, int index) {
        super(content, delay, index);
        animationY.set(index);
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack matrix, int multiplier) {
        Theme theme = Theme.getInstance();
        boolean finished = finished();

        animation.update();
        animationY.update();

        Easing easing = finished ? Easings.EXPO_IN : Easings.EXPO_OUT;

        float margin = 5;
        float width = margin + font.getWidth(content, fontSize) + margin;
        float height = margin + fontSize + margin;
        animation.run(finished ? 0 : 1, (wait / 1000F) / 2F, easing, true);
        animationY.run(multiplier, (wait / 1000F) / 2F, Easings.CUBIC_OUT, true);

        float x = width() - margin - (width * animation.get());
        float y = height() - height - 32 - ((animationY.get() * (height + (margin / 2F))));

        float alpha = (float) Math.pow(animation.get(), 4);

        matrix.push();
        matrix.translate((x + width), (y + height / 2F), 0);
        matrix.scale(1, animation.get(), 1);
        matrix.translate(-(x + width), -(y + height / 2F), 0);
        theme.drawClientRect(matrix, x, y, width, height, alpha, 4);
        font.drawOutline(matrix, content, x + margin, y + margin, ColorUtil.multAlpha(theme.clientColor(), alpha), fontSize);
        matrix.pop();
    }
}

Четвёртый завершающий этап. Мы реализуем чтобы у функции которая премиум писалось PREMIUM.​


В ModuleComponent на 153 строчке вставляем:

ModuleComponent:
Expand Collapse Copy
if (module.getClass().isAnnotationPresent(Beta.class)) {
            Fonts.SF_BOLD.draw(matrix, "BETA", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getModuleInfo().premium()) {
            Fonts.SF_BOLD.draw(matrix, "PREMIUM", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(Funtime.class)) {
            Fonts.SF_BOLD.draw(matrix, "FT", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(HolyWorld.class)) {
            Fonts.SF_BOLD.draw(matrix, "HW", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        }

Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
Посмотреть вложение 307164Посмотреть вложение 307165

ВАЖНО!!!

Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER)
- Это без премиума

А вот так должно выглядеть с премиумом:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER, premium = true)
- Это с премиумом.

Мы добавили: premium = true.


Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.

И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.
молодец
 
Всем здарова. В данной теме я солью вам премиум функции, взял идею на это из Nursultan, и реализовал идею в Excellent. Сразу говорю жду в Excellent Plus, и в других пастах на базе Excellent

Контакты​

  • Discord: leakerzxc (По вопросам, если что то было не понятно или же не поняли как сделать)
  • Сайт/Форум: YouGame.biz
  • Для удобства можете скачать мою базу Excellent Fix. Я её использовал и делал на ней данную функцию.
SS - Предоставил в самом внизу

Я разделил всё по этапам.

Первый этап. Делаем регистрацию чтобы делать премиум функции​


Переходим мы в класс ModuleInfo, и вставляем код ниже:

ModuleInfo:
Expand Collapse Copy
package org.excellent.client.managers.module;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public [USER=1340661]@interface[/USER] ModuleInfo {
    String name();

    Category category();

    int key() default -1;

    boolean autoEnabled() default false;

    boolean allowDisable() default true;

    boolean hidden() default false;

    boolean premium() default false;
}
Что же этим мы сделали: Мы сделали то что теперь мы можем при помощи premium = true зарегистрировать модуль как премиум.

Второй этап. Делаем уведомление о том то что функция премиум, и её могут использовать только премиум пользователи.​


В классе Module, заменяем всё на:

Module:
Expand Collapse Copy
package org.excellent.client.managers.module;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Data;
import org.apache.commons.lang3.NotImplementedException;
import org.excellent.client.Excellent;
import org.excellent.client.api.annotations.Beta;
import org.excellent.client.api.client.Constants;
import org.excellent.client.api.interfaces.IMinecraft;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.module.impl.misc.Notifications;
import org.excellent.client.managers.module.impl.render.Hud;
import org.excellent.client.managers.module.settings.Setting;
import org.excellent.client.managers.other.notification.NotificationType;
import org.excellent.client.utils.animation.Animation;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.other.SoundUtil;
import org.excellent.client.utils.render.color.ColorFormatting;
import org.excellent.client.utils.render.color.ColorUtil;
import org.excellent.client.utils.render.font.StripFont;

import java.util.List;

[USER=54968]@data[/USER]
public abstract class Module implements IMinecraft {
    private final List<Setting<?>> settings = new ObjectArrayList<>();
    private ModuleInfo moduleInfo;
    private String name;
    private Category category;
    private boolean enabled;
    private boolean autoEnabled;
    private boolean allowDisable;
    private boolean hidden;
    private boolean premium;
    private int key;
    private final Animation animation = new Animation();
    private final StripFont stripFont = new StripFont();

    public Module() {
        Class<? extends Module> clazz = this.getClass();
        ModuleInfo moduleInfo = clazz.getAnnotation(ModuleInfo.class);

        if (moduleInfo == null) {
            throw new NotImplementedException("@ModuleInfo annotation not found on " + clazz.getSimpleName());
        }

        this.moduleInfo = moduleInfo;
        this.name = moduleInfo.name().trim().replaceAll(" ", "");
        this.category = moduleInfo.category();
        this.autoEnabled = moduleInfo.autoEnabled();
        this.allowDisable = moduleInfo.allowDisable();
        this.hidden = moduleInfo.hidden();
        this.premium = moduleInfo.premium();
        this.key = moduleInfo.key();

        setup();
    }

    public void toggle() {
        setEnabled(!enabled);
    }

    public void setEnabled(final boolean enabled) {
        setEnabled(enabled, true);
    }

    public void setEnabled(final boolean enabled, boolean notification) {
        if (this.premium && !permissionPremium()) {
            if (this.enabled) {
                forceDisable();
            }
            if (enabled) {
                errorPremiumNotification();
            }
            return;
        }

        if (this.enabled == enabled || (!this.allowDisable && !enabled)) {
            return;
        }

        this.enabled = enabled;
        final boolean beta = this.getClass().isAnnotationPresent(Beta.class);
        Notifications notifications = Notifications.getInstance();

        if (!this.isHidden() && notification && notifications.isEnabled()) {
            Excellent.inst().notificationManager().register(
                    (beta ? ColorFormatting.getColor(ColorUtil.RED) + "(beta) " + ColorFormatting.reset() : "") +
                            "Модуль" +
                            (enabled ? ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.GREEN, ColorUtil.WHITE)) :
                                    ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE))) +
                            " " + this.name + ColorFormatting.reset() + " " +
                            (enabled ? "включён" : "выключен"),
                    NotificationType.INFO,
                    1500
            );

            if (notifications.sound().getValue()) {
                SoundUtil.playSound(enabled ? "enabled.wav" : "disabled.wav", notifications.volume().getValue() / 100F);
            }
        }

        if (enabled) {
            superEnable();
        } else {
            superDisable();
        }

        if (Hud.getInstance().checks().getValue("Keybinds") || Hud.getInstance().checks().getValue("ArrayList")) {
            animation.run(enabled ? 1 : 0, 0.5F, Easings.EXPO_OUT, false);
        }
    }

    private void forceDisable() {
        if (this.enabled) {
            this.enabled = false;
            superDisable();
        }
    }

    private void errorPremiumNotification() {
        Theme theme = Theme.getInstance();
        int textColor = theme != null ? theme.textlogoColor() : ColorUtil.WHITE;
        int accentColor = ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE);

        Excellent.inst().notificationManager().register(
                ColorFormatting.getColor(textColor) + "Извините, но функция " +
                        ColorFormatting.getColor(accentColor) + this.name +
                        ColorFormatting.getColor(textColor) + " доступна только премиум пользователям!",
                NotificationType.WARN,
                1500
        );

        SoundUtil.playSound("disabled.wav", 0.5F);
    }

    private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

    private void eventEnable() {
        Excellent.eventHandler().subscribe(this);
    }

    private void eventDisable() {
        Excellent.eventHandler().unsubscribe(this);
    }

    private void superEnable() {
        if (mc.player != null) onEnable();
        eventEnable();
    }

    private void superDisable() {
        if (mc.player != null) onDisable();
        eventDisable();
    }

    public void setup() {
    }

    protected void onEnable() {
    }

    protected void onDisable() {
    }
}
Что мы сделали: Мы сделали то что теперь если у игрока нету премиума то ему будет приходить уведомление о том то что функция доступна только премиум пользователям. А так же мы сделали кто сможет использовать данную премиум функцию. Это мы сделали в:

Кто может использовать премиум функции:
Expand Collapse Copy
private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

Третий этап. Делаем Warn Notification.​


В WarnNotification
WarnNotification:
Expand Collapse Copy
package org.excellent.client.managers.other.notification.impl;

import net.mojang.blaze3d.matrix.MatrixStack;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.other.notification.Notification;
import org.excellent.client.utils.animation.util.Easing;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.render.color.ColorUtil;

public class WarnNotification extends Notification {
    public WarnNotification(String content, long delay, int index) {
        super(content, delay, index);
        animationY.set(index);
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack matrix, int multiplier) {
        Theme theme = Theme.getInstance();
        boolean finished = finished();

        animation.update();
        animationY.update();

        Easing easing = finished ? Easings.EXPO_IN : Easings.EXPO_OUT;

        float margin = 5;
        float width = margin + font.getWidth(content, fontSize) + margin;
        float height = margin + fontSize + margin;
        animation.run(finished ? 0 : 1, (wait / 1000F) / 2F, easing, true);
        animationY.run(multiplier, (wait / 1000F) / 2F, Easings.CUBIC_OUT, true);

        float x = width() - margin - (width * animation.get());
        float y = height() - height - 32 - ((animationY.get() * (height + (margin / 2F))));

        float alpha = (float) Math.pow(animation.get(), 4);

        matrix.push();
        matrix.translate((x + width), (y + height / 2F), 0);
        matrix.scale(1, animation.get(), 1);
        matrix.translate(-(x + width), -(y + height / 2F), 0);
        theme.drawClientRect(matrix, x, y, width, height, alpha, 4);
        font.drawOutline(matrix, content, x + margin, y + margin, ColorUtil.multAlpha(theme.clientColor(), alpha), fontSize);
        matrix.pop();
    }
}

Четвёртый завершающий этап. Мы реализуем чтобы у функции которая премиум писалось PREMIUM.​


В ModuleComponent на 153 строчке вставляем:

ModuleComponent:
Expand Collapse Copy
if (module.getClass().isAnnotationPresent(Beta.class)) {
            Fonts.SF_BOLD.draw(matrix, "BETA", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getModuleInfo().premium()) {
            Fonts.SF_BOLD.draw(matrix, "PREMIUM", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(Funtime.class)) {
            Fonts.SF_BOLD.draw(matrix, "FT", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(HolyWorld.class)) {
            Fonts.SF_BOLD.draw(matrix, "HW", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        }

Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
Посмотреть вложение 307164Посмотреть вложение 307165

ВАЖНО!!!

Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER)
- Это без премиума

А вот так должно выглядеть с премиумом:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER, premium = true)
- Это с премиумом.

Мы добавили: premium = true.


Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.

И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.
лол это сделать за 2 секунды нах пастерам сливать
 
Всем здарова. В данной теме я солью вам премиум функции, взял идею на это из Nursultan, и реализовал идею в Excellent. Сразу говорю жду в Excellent Plus, и в других пастах на базе Excellent

Контакты​

  • Discord: leakerzxc (По вопросам, если что то было не понятно или же не поняли как сделать)
  • Сайт/Форум: YouGame.biz
  • Для удобства можете скачать мою базу Excellent Fix. Я её использовал и делал на ней данную функцию.
SS - Предоставил в самом внизу

Я разделил всё по этапам.

Первый этап. Делаем регистрацию чтобы делать премиум функции​


Переходим мы в класс ModuleInfo, и вставляем код ниже:

ModuleInfo:
Expand Collapse Copy
package org.excellent.client.managers.module;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public [USER=1340661]@interface[/USER] ModuleInfo {
    String name();

    Category category();

    int key() default -1;

    boolean autoEnabled() default false;

    boolean allowDisable() default true;

    boolean hidden() default false;

    boolean premium() default false;
}
Что же этим мы сделали: Мы сделали то что теперь мы можем при помощи premium = true зарегистрировать модуль как премиум.

Второй этап. Делаем уведомление о том то что функция премиум, и её могут использовать только премиум пользователи.​


В классе Module, заменяем всё на:

Module:
Expand Collapse Copy
package org.excellent.client.managers.module;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Data;
import org.apache.commons.lang3.NotImplementedException;
import org.excellent.client.Excellent;
import org.excellent.client.api.annotations.Beta;
import org.excellent.client.api.client.Constants;
import org.excellent.client.api.interfaces.IMinecraft;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.module.impl.misc.Notifications;
import org.excellent.client.managers.module.impl.render.Hud;
import org.excellent.client.managers.module.settings.Setting;
import org.excellent.client.managers.other.notification.NotificationType;
import org.excellent.client.utils.animation.Animation;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.other.SoundUtil;
import org.excellent.client.utils.render.color.ColorFormatting;
import org.excellent.client.utils.render.color.ColorUtil;
import org.excellent.client.utils.render.font.StripFont;

import java.util.List;

[USER=54968]@data[/USER]
public abstract class Module implements IMinecraft {
    private final List<Setting<?>> settings = new ObjectArrayList<>();
    private ModuleInfo moduleInfo;
    private String name;
    private Category category;
    private boolean enabled;
    private boolean autoEnabled;
    private boolean allowDisable;
    private boolean hidden;
    private boolean premium;
    private int key;
    private final Animation animation = new Animation();
    private final StripFont stripFont = new StripFont();

    public Module() {
        Class<? extends Module> clazz = this.getClass();
        ModuleInfo moduleInfo = clazz.getAnnotation(ModuleInfo.class);

        if (moduleInfo == null) {
            throw new NotImplementedException("@ModuleInfo annotation not found on " + clazz.getSimpleName());
        }

        this.moduleInfo = moduleInfo;
        this.name = moduleInfo.name().trim().replaceAll(" ", "");
        this.category = moduleInfo.category();
        this.autoEnabled = moduleInfo.autoEnabled();
        this.allowDisable = moduleInfo.allowDisable();
        this.hidden = moduleInfo.hidden();
        this.premium = moduleInfo.premium();
        this.key = moduleInfo.key();

        setup();
    }

    public void toggle() {
        setEnabled(!enabled);
    }

    public void setEnabled(final boolean enabled) {
        setEnabled(enabled, true);
    }

    public void setEnabled(final boolean enabled, boolean notification) {
        if (this.premium && !permissionPremium()) {
            if (this.enabled) {
                forceDisable();
            }
            if (enabled) {
                errorPremiumNotification();
            }
            return;
        }

        if (this.enabled == enabled || (!this.allowDisable && !enabled)) {
            return;
        }

        this.enabled = enabled;
        final boolean beta = this.getClass().isAnnotationPresent(Beta.class);
        Notifications notifications = Notifications.getInstance();

        if (!this.isHidden() && notification && notifications.isEnabled()) {
            Excellent.inst().notificationManager().register(
                    (beta ? ColorFormatting.getColor(ColorUtil.RED) + "(beta) " + ColorFormatting.reset() : "") +
                            "Модуль" +
                            (enabled ? ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.GREEN, ColorUtil.WHITE)) :
                                    ColorFormatting.getColor(ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE))) +
                            " " + this.name + ColorFormatting.reset() + " " +
                            (enabled ? "включён" : "выключен"),
                    NotificationType.INFO,
                    1500
            );

            if (notifications.sound().getValue()) {
                SoundUtil.playSound(enabled ? "enabled.wav" : "disabled.wav", notifications.volume().getValue() / 100F);
            }
        }

        if (enabled) {
            superEnable();
        } else {
            superDisable();
        }

        if (Hud.getInstance().checks().getValue("Keybinds") || Hud.getInstance().checks().getValue("ArrayList")) {
            animation.run(enabled ? 1 : 0, 0.5F, Easings.EXPO_OUT, false);
        }
    }

    private void forceDisable() {
        if (this.enabled) {
            this.enabled = false;
            superDisable();
        }
    }

    private void errorPremiumNotification() {
        Theme theme = Theme.getInstance();
        int textColor = theme != null ? theme.textlogoColor() : ColorUtil.WHITE;
        int accentColor = ColorUtil.overCol(ColorUtil.RED, ColorUtil.WHITE);

        Excellent.inst().notificationManager().register(
                ColorFormatting.getColor(textColor) + "Извините, но функция " +
                        ColorFormatting.getColor(accentColor) + this.name +
                        ColorFormatting.getColor(textColor) + " доступна только премиум пользователям!",
                NotificationType.WARN,
                1500
        );

        SoundUtil.playSound("disabled.wav", 0.5F);
    }

    private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

    private void eventEnable() {
        Excellent.eventHandler().subscribe(this);
    }

    private void eventDisable() {
        Excellent.eventHandler().unsubscribe(this);
    }

    private void superEnable() {
        if (mc.player != null) onEnable();
        eventEnable();
    }

    private void superDisable() {
        if (mc.player != null) onDisable();
        eventDisable();
    }

    public void setup() {
    }

    protected void onEnable() {
    }

    protected void onDisable() {
    }
}
Что мы сделали: Мы сделали то что теперь если у игрока нету премиума то ему будет приходить уведомление о том то что функция доступна только премиум пользователям. А так же мы сделали кто сможет использовать данную премиум функцию. Это мы сделали в:

Кто может использовать премиум функции:
Expand Collapse Copy
private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }

Третий этап. Делаем Warn Notification.​


В WarnNotification
WarnNotification:
Expand Collapse Copy
package org.excellent.client.managers.other.notification.impl;

import net.mojang.blaze3d.matrix.MatrixStack;
import org.excellent.client.managers.module.impl.client.Theme;
import org.excellent.client.managers.other.notification.Notification;
import org.excellent.client.utils.animation.util.Easing;
import org.excellent.client.utils.animation.util.Easings;
import org.excellent.client.utils.render.color.ColorUtil;

public class WarnNotification extends Notification {
    public WarnNotification(String content, long delay, int index) {
        super(content, delay, index);
        animationY.set(index);
    }

    [USER=1367676]@override[/USER]
    public void render(MatrixStack matrix, int multiplier) {
        Theme theme = Theme.getInstance();
        boolean finished = finished();

        animation.update();
        animationY.update();

        Easing easing = finished ? Easings.EXPO_IN : Easings.EXPO_OUT;

        float margin = 5;
        float width = margin + font.getWidth(content, fontSize) + margin;
        float height = margin + fontSize + margin;
        animation.run(finished ? 0 : 1, (wait / 1000F) / 2F, easing, true);
        animationY.run(multiplier, (wait / 1000F) / 2F, Easings.CUBIC_OUT, true);

        float x = width() - margin - (width * animation.get());
        float y = height() - height - 32 - ((animationY.get() * (height + (margin / 2F))));

        float alpha = (float) Math.pow(animation.get(), 4);

        matrix.push();
        matrix.translate((x + width), (y + height / 2F), 0);
        matrix.scale(1, animation.get(), 1);
        matrix.translate(-(x + width), -(y + height / 2F), 0);
        theme.drawClientRect(matrix, x, y, width, height, alpha, 4);
        font.drawOutline(matrix, content, x + margin, y + margin, ColorUtil.multAlpha(theme.clientColor(), alpha), fontSize);
        matrix.pop();
    }
}

Четвёртый завершающий этап. Мы реализуем чтобы у функции которая премиум писалось PREMIUM.​


В ModuleComponent на 153 строчке вставляем:

ModuleComponent:
Expand Collapse Copy
if (module.getClass().isAnnotationPresent(Beta.class)) {
            Fonts.SF_BOLD.draw(matrix, "BETA", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getModuleInfo().premium()) {
            Fonts.SF_BOLD.draw(matrix, "PREMIUM", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(Funtime.class)) {
            Fonts.SF_BOLD.draw(matrix, "FT", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        } else if (module.getClass().isAnnotationPresent(HolyWorld.class)) {
            Fonts.SF_BOLD.draw(matrix, "HW", position.x + (size.x / 2F) + (font.getWidth(moduleText, moduleFontSize + (hoverAnimation.get() / 2F)) / 2F) + 1F, position.y + (size.y / 2F) - (moduleFontSize / 2F), ColorUtil.multAlpha(Theme.getInstance().doptextColor(), 0.5F), 5);
        }

Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
Посмотреть вложение 307164Посмотреть вложение 307165

ВАЖНО!!!

Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER)
- Это без премиума

А вот так должно выглядеть с премиумом:

Код:
Expand Collapse Copy
@ModuleInfo(name = "TargetPearl", category = Category.PLAYER, premium = true)
- Это с премиумом.

Мы добавили: premium = true.


Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.

И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.
можно было и легче сделать
 
так это же ну типо ваще как будто бы очень очень легко сделать
 
Назад
Сверху Снизу