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

Часть функционала Плащ/cape под fabric 1.21.4

Начинающий
Начинающий
Статус
Онлайн
Регистрация
25 Окт 2025
Сообщения
6
Реакции
0
Выберите загрузчик игры
  1. Fabric
Не знаю надо ли кому то это но ладно

MixinAbstractClientPlayerEntity:
Expand Collapse Copy
package fun.rich.mixins.player.cape;

import fun.rich.features.impl.render.Cape;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.util.SkinTextures;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(AbstractClientPlayerEntity.class)
public abstract class MixinAbstractClientPlayerEntity {

    @Inject(method = "getSkinTextures", at = @At("RETURN"), cancellable = true)
    private void onGetSkinTextures(CallbackInfoReturnable<SkinTextures> cir) {
        // Получаем объект игрока, для которого вызывается этот метод
        AbstractClientPlayerEntity player = (AbstractClientPlayerEntity) (Object) this;

        // Проверяем:
        // 1. Включен ли модуль Cape
        // 2. Является ли этот игрок ТВОИМ персонажем (isMainPlayer)
        if (Cape.isEnabled() && player.isMainPlayer()) {

            Identifier customCape = Cape.getInstance().getCape();

            if (customCape != null) {
                // Получаем оригинальные текстуры (чтобы не сбросить скин)
                SkinTextures original = cir.getReturnValue();

                // Возвращаем новый объект текстур, где меняем только плащ и элитры
                cir.setReturnValue(new SkinTextures(
                        original.texture(),
                        original.textureUrl(),
                        customCape,     // Твой кастомный плащ
                        customCape,     // Твои кастомные элитры
                        original.model(),
                        original.secure()
                ));
            }
        }
    }
}


Cape:
Expand Collapse Copy
package fun.rich.features.impl.render;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.client.texture.NativeImageBackedTexture;
import net.minecraft.util.Identifier;
import fun.rich.features.module.Module;
import fun.rich.features.module.ModuleCategory;
import fun.rich.utils.client.Instance;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

@FieldDefaults(level = AccessLevel.PRIVATE)
public class Cape extends Module {

    public static Cape getInstance() {
        return Instance.get(Cape.class);
    }

    // Переменная для хранения текстуры
    Identifier customCapeTexture = null;

    final String CAPE_PATH = "C:\\Users\\Кирилл\\Desktop\\VibeCode\\src\\main\\resources\\assets\\minecraft\\textures\\cape\\oblachko.png";

    public Cape() {
        super("Cape", "Отображает кастомный плащ", ModuleCategory.RENDER);
    }

    // Тот самый метод, который ищет миксин
    public Identifier getCape() {
        if (customCapeTexture == null) {
            loadCape();
        }
        return customCapeTexture;
    }

    private void loadCape() {
        try {
            File file = new File(CAPE_PATH);
            if (file.exists()) {
                InputStream is = new FileInputStream(file);
                NativeImage image = NativeImage.read(is);
                NativeImageBackedTexture texture = new NativeImageBackedTexture(image);

                // Для 1.21+
                Identifier id = Identifier.of("rich", "custom_cape");

                MinecraftClient.getInstance().getTextureManager().registerTexture(id, texture);

                customCapeTexture = id;
                System.out.println("[Cape] Успешно загружено!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static boolean isEnabled() {
        return getInstance() != null && getInstance().isState();
    }
}

код полностью написан гемини потому что я очень крутой селфкодер
 
Не знаю надо ли кому то это но ладно

MixinAbstractClientPlayerEntity:
Expand Collapse Copy
package fun.rich.mixins.player.cape;

import fun.rich.features.impl.render.Cape;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.util.SkinTextures;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(AbstractClientPlayerEntity.class)
public abstract class MixinAbstractClientPlayerEntity {

    @Inject(method = "getSkinTextures", at = @At("RETURN"), cancellable = true)
    private void onGetSkinTextures(CallbackInfoReturnable<SkinTextures> cir) {
        // Получаем объект игрока, для которого вызывается этот метод
        AbstractClientPlayerEntity player = (AbstractClientPlayerEntity) (Object) this;

        // Проверяем:
        // 1. Включен ли модуль Cape
        // 2. Является ли этот игрок ТВОИМ персонажем (isMainPlayer)
        if (Cape.isEnabled() && player.isMainPlayer()) {

            Identifier customCape = Cape.getInstance().getCape();

            if (customCape != null) {
                // Получаем оригинальные текстуры (чтобы не сбросить скин)
                SkinTextures original = cir.getReturnValue();

                // Возвращаем новый объект текстур, где меняем только плащ и элитры
                cir.setReturnValue(new SkinTextures(
                        original.texture(),
                        original.textureUrl(),
                        customCape,     // Твой кастомный плащ
                        customCape,     // Твои кастомные элитры
                        original.model(),
                        original.secure()
                ));
            }
        }
    }
}


Cape:
Expand Collapse Copy
package fun.rich.features.impl.render;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.client.texture.NativeImageBackedTexture;
import net.minecraft.util.Identifier;
import fun.rich.features.module.Module;
import fun.rich.features.module.ModuleCategory;
import fun.rich.utils.client.Instance;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

@FieldDefaults(level = AccessLevel.PRIVATE)
public class Cape extends Module {

    public static Cape getInstance() {
        return Instance.get(Cape.class);
    }

    // Переменная для хранения текстуры
    Identifier customCapeTexture = null;

    final String CAPE_PATH = "C:\\Users\\Кирилл\\Desktop\\VibeCode\\src\\main\\resources\\assets\\minecraft\\textures\\cape\\oblachko.png";

    public Cape() {
        super("Cape", "Отображает кастомный плащ", ModuleCategory.RENDER);
    }

    // Тот самый метод, который ищет миксин
    public Identifier getCape() {
        if (customCapeTexture == null) {
            loadCape();
        }
        return customCapeTexture;
    }

    private void loadCape() {
        try {
            File file = new File(CAPE_PATH);
            if (file.exists()) {
                InputStream is = new FileInputStream(file);
                NativeImage image = NativeImage.read(is);
                NativeImageBackedTexture texture = new NativeImageBackedTexture(image);

                // Для 1.21+
                Identifier id = Identifier.of("rich", "custom_cape");

                MinecraftClient.getInstance().getTextureManager().registerTexture(id, texture);

                customCapeTexture = id;
                System.out.println("[Cape] Успешно загружено!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static boolean isEnabled() {
        return getInstance() != null && getInstance().isState();
    }
}

код полностью написан гемини потому что я очень крутой селфкодер
А зачем вообще выкладывать то, что ты сделал через Gemini. Если это кому то и нужно сделать будет , то он может сам промт в 5 слов сделать. И кстати https://yougame.biz/threads/361035/ ( noad)
 
Назад
Сверху Снизу