Начинающий
- Статус
- Оффлайн
- Регистрация
- 4 Авг 2024
- Сообщения
- 133
- Реакции
- 0
- Выберите загрузчик игры
- 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 не понял.