Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Визуальная часть CustomSphereSkin - инновация! Exp 3.1 READY

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Сен 2024
Сообщения
394
Реакции
4
Выберите загрузчик игры
  1. Прочие моды
Всем привет, недавно игрался с функцией из чита Nix (noad), а именно "CustomSphereSkin", и как я увидел, скин на сферу получается так:
1776620710714.png

SS:
Я решил заинтересоваться что вообще значит данный код, и просто ввел его в Goggle, где мне выдался сайт Minecraft Head (noad), на котором есть всякие скины на головы и так далее, пролистав вниз я увидел так называемый раздел "Для разработчиков", в котором как раз таки и находился данный код, который получал скин.
Так вот, я решил сделать мод в котором можно будет вставить любой скин, что довольно круто, так вот, я это сделал (codex), не бейте ногами пожалуйста, вот код:

module:
Expand Collapse Copy
package vesence.modules.impl.render;

import com.google.common.eventbus.Subscribe;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import vesence.events.EventUpdate;
import vesence.modules.api.Category;
import vesence.modules.api.Module;
import vesence.modules.api.ModuleInfo;
import vesence.modules.api.impl.ModeSetting;
import vesence.modules.api.impl.StringSetting;

@ModuleInfo(
        name = "CustomSphereSkin",
        desc = "Позволяет визуально изменить скин головы",
        type = Category.Misc
)
public class CustomSphere extends Module {

    private static final ModeSetting mode = new ModeSetting(
            "Скин сферы",
            "Тыква",
            "Тыква",
            "Скелет",
            "Призрак",
            "Кастом",
            "Стив"
    );

    public static final StringSetting customCode = new StringSetting(
            "Код сайта (Value for Developers)",
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=",
            "Код головы"
    ).setVisible(() -> mode.is("Кастом"));

    private static final String PUMPKIN =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=";

    private static final String SKELETON =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmJlY2M2NDVmMTI5YzhiYzJmYWE0ZDgxNDU0ODFmYWIxMWFkMmVlNzU3NDlkNjI4ZGNkOTk5YWE5NGU3In19fQ==";

    private static final String GHOST =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGZhMTMwMzJmYTkzOWYxODRkYWE2YTRlMTFlNmYzYTkxM2U0OGYyNTA0OTgxNjVjNTY2NWNjZjQ5YzcyYTE0MCJ9fX0=";

    private static final String STEVE =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmJjZmYwZTNiNzY0ZjFkYzkwNzYxZjIzN2IwZTgwYjQ4ZTU3YzU1NDE5NDgwZmNjNzA2OTVkNzIwZTZjYTI5In19fQ==";

    public CustomSphere() {
        addSettings(mode, customCode);
    }

    @Subscribe
    private void onUpdate(EventUpdate event) {
        if (mc.player == null) {
            return;
        }

        String value = PUMPKIN;

        switch ((String) mode.get()) {
            case "Скелет":
                value = SKELETON;
                break;
            case "Призрак":
                value = GHOST;
                break;
            case "Кастом":
                value = customCode.get();
                break;
            case "Стив":
                value = STEVE;
                break;
            default:
                break;
        }

        value = value.trim();
        if (value.isEmpty()) {
            return;
        }

        for (EquipmentSlotType slot : new EquipmentSlotType[]{EquipmentSlotType.MAINHAND, EquipmentSlotType.OFFHAND, EquipmentSlotType.HEAD}) {
            ItemStack stack = mc.player.getItemStackFromSlot(slot);
            if (stack.getItem() != Items.PLAYER_HEAD) {
                continue;
            }

            CompoundNBT tag = stack.getOrCreateTag();
            CompoundNBT skullOwner = tag.contains("SkullOwner", 10) ? tag.getCompound("SkullOwner") : new CompoundNBT();
            CompoundNBT properties = skullOwner.contains("Properties", 10) ? skullOwner.getCompound("Properties") : new CompoundNBT();
            ListNBT textures = properties.contains("textures", 9) ? properties.getList("textures", 10) : new ListNBT();

            if (textures.isEmpty()) {
                textures.add(0, new CompoundNBT());
            }

            textures.getCompound(0).putString("Value", value);
            properties.put("textures", textures);
            skullOwner.put("Properties", properties);
            tag.put("SkullOwner", skullOwner);
        }
    }

    public static CustomSphere getInstance() {
        return Module.getInstance(CustomSphere.class);
    }
}
Также для обновления скина моментально, вам нужно обновить StringComponent (в вашем случае надо будет перенести система обновления текста в ваш код) P.S в коде StringComponent используются утилки Excellent Recode (можете заменить на свои):
setting:
Expand Collapse Copy
package vesence.display.clickgui.settings;

import com.mojang.blaze3d.matrix.MatrixStack;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.Minecraft;
import org.joml.Vector2f;
import org.lwjgl.glfw.GLFW;
import vesence.display.clickgui.ClickGuiScreen;
import vesence.display.clickgui.impl.Components;
import vesence.modules.api.impl.StringSetting;
import vesence.util.math.main.MathUtil;
import vesence.util.visual.components.Cursors;
import vesence.util.visual.components.Scissor;
import vesence.util.visual.components.TextAlign;
import vesence.util.visual.components.TextBox;
import vesence.util.visual.main.color.ColorUtil;
import vesence.util.visual.main.fonts.Fonts;
import vesence.util.visual.main.render.Draw2DRender;
import vesence.util.visual.main.render.Corner;

@FieldDefaults(level = AccessLevel.PRIVATE)
public class StringComponent extends Components {

    final StringSetting setting;
    final TextBox textBox;
    boolean typing;
    boolean inputHovered;

    public StringComponent(StringSetting setting) {
        this.setting = setting;
        this.textBox = new TextBox(
                new Vector2f(0, 0),
                Fonts.SF_MEDIUM,
                6f,
                ColorUtil.rgba(255, 255, 255, 255),
                TextAlign.LEFT,
                setting.getDisplayDescription(),
                0f,
                false,
                false
        );
        this.setHeight(measureHeight());
    }

    @Override
    public float measureHeight() {
        return 27;
    }

    @Override
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        super.render(stack, mouseX, mouseY);

        if (typing) {
            ClickGuiScreen.markTextInputActive();
            ClickGuiScreen.releaseMovementKeysIfNeeded();
        }

        if (!typing && !setting.get().equals(textBox.getText())) {
            textBox.setText(setting.get());
        }

        float alpha = (float) (ClickGuiScreen.getRenderAnimationValue());
        float rowAlpha = (float) settingsAnim.get() * alpha;
        float rowX = getX();
        float rowY = getY();
        float rowW = getWidth();
        float inputX = rowX + 5f;
        float inputY = rowY + 9f;
        float inputW = rowW - 10f;
        float inputH = 11;

        Fonts.SF_SEMIBOLD.draw(stack, setting.getDisplayName(), rowX + 6f, rowY - 1f,
                ColorUtil.replAlpha(-1, (int) (255 * rowAlpha)), 6.5f, -0.2f);

        Draw2DRender.Rounded.smooth(stack, inputX, inputY, inputW, inputH,
                ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
                Corner.of(2f));
        Draw2DRender.Rounded.roundedOutline(stack, inputX, inputY, inputW, inputH, 1f,
                ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
                Corner.of(2f));

        textBox.getPosition().set(inputX + 3.5f, inputY + 3);
        textBox.setWidth(inputW - 4f);
        textBox.setColor(ColorUtil.replAlpha(-1, (int) (255 * alpha)));
        textBox.setEmptyText(setting.getDisplayDescription());
        textBox.setSelected(typing);

        Scissor.push();
        Scissor.setFromComponentCoordinates(inputX + 1f, inputY + 1f, inputW - 2f, inputH - 2f);
        textBox.draw(stack, rowAlpha);
        Scissor.unset();
        Scissor.pop();

        syncSettingFromTextBox();

        boolean hoveredNow = MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH);
        if (hoveredNow) {
            if (!inputHovered) {
                GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.IBEAM);
                inputHovered = true;
            }
        } else if (inputHovered) {
            GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.ARROW);
            inputHovered = false;
        }

        setHeight(measureHeight());
    }

    private void syncSettingFromTextBox() {
        String value = textBox.getText();

        if (setting.isOnlyNumber()) {
            value = value.replaceAll("[^0-9.-]", "");
        }

        if (!value.equals(textBox.getText())) {
            int cursor = Math.min(textBox.getCursor(), value.length());
            textBox.setText(value);
            textBox.setCursor(cursor);
        }

        if (!value.equals(setting.get())) {
            setting.set(value);
        }
    }

    @Override
    public void charTyped(char codePoint, int modifiers) {
        if (typing) {
            textBox.charTyped(codePoint);
            syncSettingFromTextBox();
        }
        super.charTyped(codePoint, modifiers);
    }

    @Override
    public void keyPressed(int key, int scanCode, int modifiers) {
        if (typing) {
            if (key == GLFW.GLFW_KEY_ENTER || key == GLFW.GLFW_KEY_ESCAPE) {
                typing = false;
                textBox.setSelected(false);
            } else {
                textBox.keyPressed(key);
                syncSettingFromTextBox();
            }
        }
        super.keyPressed(key, scanCode, modifiers);
    }

    @Override
    public boolean mouseClick(float mouseX, float mouseY, int mouse) {
        float inputX = getX() + 5f;
        float inputY = getY() + 9f;
        float inputW = getWidth() - 10f;
        float inputH = 8f;

        if (MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH) && mouse == 0) {
            typing = true;
            textBox.setSelected(true);
            return true;
        } else {
            typing = false;
            textBox.setSelected(false);
        }
        return super.mouseClick(mouseX, mouseY, mouse);
    }

    @Override
    public boolean isVisible() {
        return setting.visible.get();
    }
}
Ну вроде все, вот так вот, прикольно и кайфово, а также мемно, думаю зайдет многим
 
Последнее редактирование:
Всем привет, недавно игрался с функцией из чита Nix (noad), а именно "CustomSphereSkin", и как я увидел, скин на сферу получается так:
Посмотреть вложение 333665
Я решил заинтересоваться что вообще значит данный код, и просто ввел его в Goggle, где мне выдался сайт Minecraft Head (noad), на котором есть всякие скины на головы и так далее, пролистав вниз я увидел так называемый раздел "Для разработчиков", в котором как раз таки и находился данный код, который получал скин.
Так вот, я решил сделать мод в котором можно будет вставить любой скин, что довольно круто, так вот, я это сделал (codex), не бейте ногами пожалуйста, вот код:

module:
Expand Collapse Copy
package vesence.modules.impl.render;

import com.google.common.eventbus.Subscribe;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import vesence.events.EventUpdate;
import vesence.modules.api.Category;
import vesence.modules.api.Module;
import vesence.modules.api.ModuleInfo;
import vesence.modules.api.impl.ModeSetting;
import vesence.modules.api.impl.StringSetting;

@ModuleInfo(
        name = "CustomSphereSkin",
        desc = "Позволяет визуально изменить скин головы",
        type = Category.Misc
)
public class CustomSphere extends Module {

    private static final ModeSetting mode = new ModeSetting(
            "Скин сферы",
            "Тыква",
            "Тыква",
            "Скелет",
            "Призрак",
            "Кастом",
            "Стив"
    );

    public static final StringSetting customCode = new StringSetting(
            "Код сайта (Value for Developers)",
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=",
            "Код головы"
    ).setVisible(() -> mode.is("Кастом"));

    private static final String PUMPKIN =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=";

    private static final String SKELETON =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmJlY2M2NDVmMTI5YzhiYzJmYWE0ZDgxNDU0ODFmYWIxMWFkMmVlNzU3NDlkNjI4ZGNkOTk5YWE5NGU3In19fQ==";

    private static final String GHOST =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGZhMTMwMzJmYTkzOWYxODRkYWE2YTRlMTFlNmYzYTkxM2U0OGYyNTA0OTgxNjVjNTY2NWNjZjQ5YzcyYTE0MCJ9fX0=";

    private static final String STEVE =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmJjZmYwZTNiNzY0ZjFkYzkwNzYxZjIzN2IwZTgwYjQ4ZTU3YzU1NDE5NDgwZmNjNzA2OTVkNzIwZTZjYTI5In19fQ==";

    public CustomSphere() {
        addSettings(mode, customCode);
    }

    @Subscribe
    private void onUpdate(EventUpdate event) {
        if (mc.player == null) {
            return;
        }

        String value = PUMPKIN;

        switch ((String) mode.get()) {
            case "Скелет":
                value = SKELETON;
                break;
            case "Призрак":
                value = GHOST;
                break;
            case "Кастом":
                value = customCode.get();
                break;
            case "Стив":
                value = STEVE;
                break;
            default:
                break;
        }

        value = value.trim();
        if (value.isEmpty()) {
            return;
        }

        for (EquipmentSlotType slot : new EquipmentSlotType[]{EquipmentSlotType.MAINHAND, EquipmentSlotType.OFFHAND, EquipmentSlotType.HEAD}) {
            ItemStack stack = mc.player.getItemStackFromSlot(slot);
            if (stack.getItem() != Items.PLAYER_HEAD) {
                continue;
            }

            CompoundNBT tag = stack.getOrCreateTag();
            CompoundNBT skullOwner = tag.contains("SkullOwner", 10) ? tag.getCompound("SkullOwner") : new CompoundNBT();
            CompoundNBT properties = skullOwner.contains("Properties", 10) ? skullOwner.getCompound("Properties") : new CompoundNBT();
            ListNBT textures = properties.contains("textures", 9) ? properties.getList("textures", 10) : new ListNBT();

            if (textures.isEmpty()) {
                textures.add(0, new CompoundNBT());
            }

            textures.getCompound(0).putString("Value", value);
            properties.put("textures", textures);
            skullOwner.put("Properties", properties);
            tag.put("SkullOwner", skullOwner);
        }
    }

    public static CustomSphere getInstance() {
        return Module.getInstance(CustomSphere.class);
    }
}
Также для обновления скина моментально, вам нужно обновить StringComponent (в вашем случае надо будет перенести система обновления текста в ваш код) P.S в коде StringComponent используются утилки Excellent Recode (можете заменить на свои):
setting:
Expand Collapse Copy
package vesence.display.clickgui.settings;

import com.mojang.blaze3d.matrix.MatrixStack;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.Minecraft;
import org.joml.Vector2f;
import org.lwjgl.glfw.GLFW;
import vesence.display.clickgui.ClickGuiScreen;
import vesence.display.clickgui.impl.Components;
import vesence.modules.api.impl.StringSetting;
import vesence.util.math.main.MathUtil;
import vesence.util.visual.components.Cursors;
import vesence.util.visual.components.Scissor;
import vesence.util.visual.components.TextAlign;
import vesence.util.visual.components.TextBox;
import vesence.util.visual.main.color.ColorUtil;
import vesence.util.visual.main.fonts.Fonts;
import vesence.util.visual.main.render.Draw2DRender;
import vesence.util.visual.main.render.Corner;

@FieldDefaults(level = AccessLevel.PRIVATE)
public class StringComponent extends Components {

    final StringSetting setting;
    final TextBox textBox;
    boolean typing;
    boolean inputHovered;

    public StringComponent(StringSetting setting) {
        this.setting = setting;
        this.textBox = new TextBox(
                new Vector2f(0, 0),
                Fonts.SF_MEDIUM,
                6f,
                ColorUtil.rgba(255, 255, 255, 255),
                TextAlign.LEFT,
                setting.getDisplayDescription(),
                0f,
                false,
                false
        );
        this.setHeight(measureHeight());
    }

    @Override
    public float measureHeight() {
        return 27;
    }

    @Override
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        super.render(stack, mouseX, mouseY);

        if (typing) {
            ClickGuiScreen.markTextInputActive();
            ClickGuiScreen.releaseMovementKeysIfNeeded();
        }

        if (!typing && !setting.get().equals(textBox.getText())) {
            textBox.setText(setting.get());
        }

        float alpha = (float) (ClickGuiScreen.getRenderAnimationValue());
        float rowAlpha = (float) settingsAnim.get() * alpha;
        float rowX = getX();
        float rowY = getY();
        float rowW = getWidth();
        float inputX = rowX + 5f;
        float inputY = rowY + 9f;
        float inputW = rowW - 10f;
        float inputH = 11;

        Fonts.SF_SEMIBOLD.draw(stack, setting.getDisplayName(), rowX + 6f, rowY - 1f,
                ColorUtil.replAlpha(-1, (int) (255 * rowAlpha)), 6.5f, -0.2f);

        Draw2DRender.Rounded.smooth(stack, inputX, inputY, inputW, inputH,
                ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
                Corner.of(2f));
        Draw2DRender.Rounded.roundedOutline(stack, inputX, inputY, inputW, inputH, 1f,
                ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
                Corner.of(2f));

        textBox.getPosition().set(inputX + 3.5f, inputY + 3);
        textBox.setWidth(inputW - 4f);
        textBox.setColor(ColorUtil.replAlpha(-1, (int) (255 * alpha)));
        textBox.setEmptyText(setting.getDisplayDescription());
        textBox.setSelected(typing);

        Scissor.push();
        Scissor.setFromComponentCoordinates(inputX + 1f, inputY + 1f, inputW - 2f, inputH - 2f);
        textBox.draw(stack, rowAlpha);
        Scissor.unset();
        Scissor.pop();

        syncSettingFromTextBox();

        boolean hoveredNow = MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH);
        if (hoveredNow) {
            if (!inputHovered) {
                GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.IBEAM);
                inputHovered = true;
            }
        } else if (inputHovered) {
            GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.ARROW);
            inputHovered = false;
        }

        setHeight(measureHeight());
    }

    private void syncSettingFromTextBox() {
        String value = textBox.getText();

        if (setting.isOnlyNumber()) {
            value = value.replaceAll("[^0-9.-]", "");
        }

        if (!value.equals(textBox.getText())) {
            int cursor = Math.min(textBox.getCursor(), value.length());
            textBox.setText(value);
            textBox.setCursor(cursor);
        }

        if (!value.equals(setting.get())) {
            setting.set(value);
        }
    }

    @Override
    public void charTyped(char codePoint, int modifiers) {
        if (typing) {
            textBox.charTyped(codePoint);
            syncSettingFromTextBox();
        }
        super.charTyped(codePoint, modifiers);
    }

    @Override
    public void keyPressed(int key, int scanCode, int modifiers) {
        if (typing) {
            if (key == GLFW.GLFW_KEY_ENTER || key == GLFW.GLFW_KEY_ESCAPE) {
                typing = false;
                textBox.setSelected(false);
            } else {
                textBox.keyPressed(key);
                syncSettingFromTextBox();
            }
        }
        super.keyPressed(key, scanCode, modifiers);
    }

    @Override
    public boolean mouseClick(float mouseX, float mouseY, int mouse) {
        float inputX = getX() + 5f;
        float inputY = getY() + 9f;
        float inputW = getWidth() - 10f;
        float inputH = 8f;

        if (MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH) && mouse == 0) {
            typing = true;
            textBox.setSelected(true);
            return true;
        } else {
            typing = false;
            textBox.setSelected(false);
        }
        return super.mouseClick(mouseX, mouseY, mouse);
    }

    @Override
    public boolean isVisible() {
        return setting.visible.get();
    }
}
Ну вроде все, вот так вот, прикольно и кайфово, а также мемно, думаю зайдет многим
/up: ss:
 
Всем привет, недавно игрался с функцией из чита Nix (noad), а именно "CustomSphereSkin", и как я увидел, скин на сферу получается так:
Посмотреть вложение 333665
SS:
Я решил заинтересоваться что вообще значит данный код, и просто ввел его в Goggle, где мне выдался сайт Minecraft Head (noad), на котором есть всякие скины на головы и так далее, пролистав вниз я увидел так называемый раздел "Для разработчиков", в котором как раз таки и находился данный код, который получал скин.
Так вот, я решил сделать мод в котором можно будет вставить любой скин, что довольно круто, так вот, я это сделал (codex), не бейте ногами пожалуйста, вот код:

module:
Expand Collapse Copy
package vesence.modules.impl.render;

import com.google.common.eventbus.Subscribe;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import vesence.events.EventUpdate;
import vesence.modules.api.Category;
import vesence.modules.api.Module;
import vesence.modules.api.ModuleInfo;
import vesence.modules.api.impl.ModeSetting;
import vesence.modules.api.impl.StringSetting;

@ModuleInfo(
        name = "CustomSphereSkin",
        desc = "Позволяет визуально изменить скин головы",
        type = Category.Misc
)
public class CustomSphere extends Module {

    private static final ModeSetting mode = new ModeSetting(
            "Скин сферы",
            "Тыква",
            "Тыква",
            "Скелет",
            "Призрак",
            "Кастом",
            "Стив"
    );

    public static final StringSetting customCode = new StringSetting(
            "Код сайта (Value for Developers)",
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=",
            "Код головы"
    ).setVisible(() -> mode.is("Кастом"));

    private static final String PUMPKIN =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=";

    private static final String SKELETON =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmJlY2M2NDVmMTI5YzhiYzJmYWE0ZDgxNDU0ODFmYWIxMWFkMmVlNzU3NDlkNjI4ZGNkOTk5YWE5NGU3In19fQ==";

    private static final String GHOST =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGZhMTMwMzJmYTkzOWYxODRkYWE2YTRlMTFlNmYzYTkxM2U0OGYyNTA0OTgxNjVjNTY2NWNjZjQ5YzcyYTE0MCJ9fX0=";

    private static final String STEVE =
            "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmJjZmYwZTNiNzY0ZjFkYzkwNzYxZjIzN2IwZTgwYjQ4ZTU3YzU1NDE5NDgwZmNjNzA2OTVkNzIwZTZjYTI5In19fQ==";

    public CustomSphere() {
        addSettings(mode, customCode);
    }

    @Subscribe
    private void onUpdate(EventUpdate event) {
        if (mc.player == null) {
            return;
        }

        String value = PUMPKIN;

        switch ((String) mode.get()) {
            case "Скелет":
                value = SKELETON;
                break;
            case "Призрак":
                value = GHOST;
                break;
            case "Кастом":
                value = customCode.get();
                break;
            case "Стив":
                value = STEVE;
                break;
            default:
                break;
        }

        value = value.trim();
        if (value.isEmpty()) {
            return;
        }

        for (EquipmentSlotType slot : new EquipmentSlotType[]{EquipmentSlotType.MAINHAND, EquipmentSlotType.OFFHAND, EquipmentSlotType.HEAD}) {
            ItemStack stack = mc.player.getItemStackFromSlot(slot);
            if (stack.getItem() != Items.PLAYER_HEAD) {
                continue;
            }

            CompoundNBT tag = stack.getOrCreateTag();
            CompoundNBT skullOwner = tag.contains("SkullOwner", 10) ? tag.getCompound("SkullOwner") : new CompoundNBT();
            CompoundNBT properties = skullOwner.contains("Properties", 10) ? skullOwner.getCompound("Properties") : new CompoundNBT();
            ListNBT textures = properties.contains("textures", 9) ? properties.getList("textures", 10) : new ListNBT();

            if (textures.isEmpty()) {
                textures.add(0, new CompoundNBT());
            }

            textures.getCompound(0).putString("Value", value);
            properties.put("textures", textures);
            skullOwner.put("Properties", properties);
            tag.put("SkullOwner", skullOwner);
        }
    }

    public static CustomSphere getInstance() {
        return Module.getInstance(CustomSphere.class);
    }
}
Также для обновления скина моментально, вам нужно обновить StringComponent (в вашем случае надо будет перенести система обновления текста в ваш код) P.S в коде StringComponent используются утилки Excellent Recode (можете заменить на свои):
setting:
Expand Collapse Copy
package vesence.display.clickgui.settings;

import com.mojang.blaze3d.matrix.MatrixStack;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.Minecraft;
import org.joml.Vector2f;
import org.lwjgl.glfw.GLFW;
import vesence.display.clickgui.ClickGuiScreen;
import vesence.display.clickgui.impl.Components;
import vesence.modules.api.impl.StringSetting;
import vesence.util.math.main.MathUtil;
import vesence.util.visual.components.Cursors;
import vesence.util.visual.components.Scissor;
import vesence.util.visual.components.TextAlign;
import vesence.util.visual.components.TextBox;
import vesence.util.visual.main.color.ColorUtil;
import vesence.util.visual.main.fonts.Fonts;
import vesence.util.visual.main.render.Draw2DRender;
import vesence.util.visual.main.render.Corner;

@FieldDefaults(level = AccessLevel.PRIVATE)
public class StringComponent extends Components {

    final StringSetting setting;
    final TextBox textBox;
    boolean typing;
    boolean inputHovered;

    public StringComponent(StringSetting setting) {
        this.setting = setting;
        this.textBox = new TextBox(
                new Vector2f(0, 0),
                Fonts.SF_MEDIUM,
                6f,
                ColorUtil.rgba(255, 255, 255, 255),
                TextAlign.LEFT,
                setting.getDisplayDescription(),
                0f,
                false,
                false
        );
        this.setHeight(measureHeight());
    }

    @Override
    public float measureHeight() {
        return 27;
    }

    @Override
    public void render(MatrixStack stack, float mouseX, float mouseY) {
        super.render(stack, mouseX, mouseY);

        if (typing) {
            ClickGuiScreen.markTextInputActive();
            ClickGuiScreen.releaseMovementKeysIfNeeded();
        }

        if (!typing && !setting.get().equals(textBox.getText())) {
            textBox.setText(setting.get());
        }

        float alpha = (float) (ClickGuiScreen.getRenderAnimationValue());
        float rowAlpha = (float) settingsAnim.get() * alpha;
        float rowX = getX();
        float rowY = getY();
        float rowW = getWidth();
        float inputX = rowX + 5f;
        float inputY = rowY + 9f;
        float inputW = rowW - 10f;
        float inputH = 11;

        Fonts.SF_SEMIBOLD.draw(stack, setting.getDisplayName(), rowX + 6f, rowY - 1f,
                ColorUtil.replAlpha(-1, (int) (255 * rowAlpha)), 6.5f, -0.2f);

        Draw2DRender.Rounded.smooth(stack, inputX, inputY, inputW, inputH,
                ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
                Corner.of(2f));
        Draw2DRender.Rounded.roundedOutline(stack, inputX, inputY, inputW, inputH, 1f,
                ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
                Corner.of(2f));

        textBox.getPosition().set(inputX + 3.5f, inputY + 3);
        textBox.setWidth(inputW - 4f);
        textBox.setColor(ColorUtil.replAlpha(-1, (int) (255 * alpha)));
        textBox.setEmptyText(setting.getDisplayDescription());
        textBox.setSelected(typing);

        Scissor.push();
        Scissor.setFromComponentCoordinates(inputX + 1f, inputY + 1f, inputW - 2f, inputH - 2f);
        textBox.draw(stack, rowAlpha);
        Scissor.unset();
        Scissor.pop();

        syncSettingFromTextBox();

        boolean hoveredNow = MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH);
        if (hoveredNow) {
            if (!inputHovered) {
                GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.IBEAM);
                inputHovered = true;
            }
        } else if (inputHovered) {
            GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.ARROW);
            inputHovered = false;
        }

        setHeight(measureHeight());
    }

    private void syncSettingFromTextBox() {
        String value = textBox.getText();

        if (setting.isOnlyNumber()) {
            value = value.replaceAll("[^0-9.-]", "");
        }

        if (!value.equals(textBox.getText())) {
            int cursor = Math.min(textBox.getCursor(), value.length());
            textBox.setText(value);
            textBox.setCursor(cursor);
        }

        if (!value.equals(setting.get())) {
            setting.set(value);
        }
    }

    @Override
    public void charTyped(char codePoint, int modifiers) {
        if (typing) {
            textBox.charTyped(codePoint);
            syncSettingFromTextBox();
        }
        super.charTyped(codePoint, modifiers);
    }

    @Override
    public void keyPressed(int key, int scanCode, int modifiers) {
        if (typing) {
            if (key == GLFW.GLFW_KEY_ENTER || key == GLFW.GLFW_KEY_ESCAPE) {
                typing = false;
                textBox.setSelected(false);
            } else {
                textBox.keyPressed(key);
                syncSettingFromTextBox();
            }
        }
        super.keyPressed(key, scanCode, modifiers);
    }

    @Override
    public boolean mouseClick(float mouseX, float mouseY, int mouse) {
        float inputX = getX() + 5f;
        float inputY = getY() + 9f;
        float inputW = getWidth() - 10f;
        float inputH = 8f;

        if (MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH) && mouse == 0) {
            typing = true;
            textBox.setSelected(true);
            return true;
        } else {
            typing = false;
            textBox.setSelected(false);
        }
        return super.mouseClick(mouseX, mouseY, mouse);
    }

    @Override
    public boolean isVisible() {
        return setting.visible.get();
    }
}
Ну вроде все, вот так вот, прикольно и кайфово, а также мемно, думаю зайдет многим
дефолт
 
Назад
Сверху Снизу