Начинающий
			
			
				
					
				
			
		- Статус
 - Оффлайн
 
- Регистрация
 - 4 Авг 2024
 
- Сообщения
 - 142
 
- Реакции
 - 1
 
- Выберите загрузчик игры
 - OptiFine
 
Всем здарова. В данной теме я солью вам премиум функции, взял идею на это из Nursultan, и реализовал идею в Excellent. Сразу говорю жду в Excellent Plus, и в других пастах на базе Excellent
Я разделил всё по этапам.
Переходим мы в класс ModuleInfo, и вставляем код ниже:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Что же этим мы сделали: Мы сделали то что теперь мы можем при помощи premium = true зарегистрировать модуль как премиум.
В классе Module, заменяем всё на:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Что мы сделали: Мы сделали то что теперь если у игрока нету премиума то ему будет приходить уведомление о том то что функция доступна только премиум пользователям. А так же мы сделали кто сможет использовать данную премиум функцию. Это мы сделали в:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
В WarnNotification
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
В ModuleComponent на 153 строчке вставляем:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
		
		
	
	
		
	
		
	
ВАЖНО!!!
Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
 - Это без премиума
А вот так должно выглядеть с премиумом:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
 - Это с премиумом.
Мы добавили: premium = true.
Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.
И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.
				
			Контакты
- Discord: leakerzxc (По вопросам, если что то было не понятно или же не поняли как сделать)
 - Сайт/Форум: YouGame.biz
 - Для удобства можете скачать мою базу Excellent Fix. Я её использовал и делал на ней данную функцию.
 
Я разделил всё по этапам.
Первый этап. Делаем регистрацию чтобы делать премиум функции
Переходим мы в класс ModuleInfo, и вставляем код ниже:
			
				ModuleInfo:
			
		
		
		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;
}
	Второй этап. Делаем уведомление о том то что функция премиум, и её могут использовать только премиум пользователи.
В классе Module, заменяем всё на:
			
				Module:
			
		
		
		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() {
    }
}
	
			
				Кто может использовать премиум функции:
			
		
		
		private boolean permissionPremium() {
        String release = Constants.RELEASE;
        return release.equals("Premium") ||
                release.equals("Alpha") ||
                release.equals("Beta") ||
                release.equals("Development");
    }
	Третий этап. Делаем Warn Notification.
В WarnNotification
			
				WarnNotification:
			
		
		
		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:
			
		
		
		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);
        }
	Всё гайд подошёл к концу. Я конечно же не забываю про скриншоты:
ВАЖНО!!!
Если было не понятно как сделать чтобы функция была премиум. Вот гайд:
Например есть функция TargetPearl. Она находиться не в премиум. Надо в @ModuleInfo вставить premium = true. То есть вот есть:
			
				Код:
			
		
		
		@ModuleInfo(name = "TargetPearl", category = Category.PLAYER)
	А вот так должно выглядеть с премиумом:
			
				Код:
			
		
		
		@ModuleInfo(name = "TargetPearl", category = Category.PLAYER, premium = true)
	Мы добавили: premium = true.
Я это написал чтобы не было вопросов а как сделать чтобы была премиум если всё сделал и т.д.
И да ещё можно вопрос модератору. Мою прошлую тему удалили по 1.4, а где я 1.4 нарушил, ладно 1.2, я понял но 1.4 не понял.