User Tools

Site Tools


ru:tutorial:shield

Создание щита в Minecraft [1.18-1.14]

Поздравляю! Вы только что узнали, как создать свой собственный меч в последнем уроке! Теперь представьте, что вы хотите защититься от этого меча, если он достался вашему другу. Если вы сделали его слишком крутым, обычный щит не подойдет. Итак, мы посмотрим, как сделать пользовательский щит.
К счастью, CrimsonDawn45 уже создал библиотеку, которая поможет в этом! Если бы он этого не сделал, вы, вероятно, сидели бы здесь в течение следующего часа, чтобы следовать этому руководству, так что спасибо CrimsonDawn45!

Источник библиотеки доступен здесь.

Библиотека, скомпилированная в виде jar, доступна здесь.

Добавление библиотеки в ваш проект

Добавьте следующий код к указанным файлам:

gradle.properties

fabric_shield_lib_version=1.5.3-1.18


build.gradle (под dependencies)

modImplementation "com.github.CrimsonDawn45:Fabric-Shield-Lib:v${project.fabric_shield_lib_version}"


На момент написания статьи последняя версия project.fabric_shield_lib_version должна быть 1.5.3-1.18. Эта страница будет обновляться всякий раз, когда выходит новое обновление.

build.gradle (под repositories)

allprojects { repositories { maven { url 'https://jitpack.io' } } }


Создание щита

Если вы хотите, чтобы ваш щит поддерживал оформление баннера, есть дополнительные шаги, которые будут рассмотрены после основного создания.
Переходим к нескучным шагам! Теперь мы сделаем пользовательский щит!

Если вы правильно выполнили описанные выше действия и обновили проект, то у вас будет установлен fabric shield api.
Если это так, то первый шаг, который нужно сделать, - это создать новый экземпляр предмета, например:

public static final Item NETHERITE_SHIELD = new FabricShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricShieldItem(settings.maxDamage(durability), cooldownTicks, enchantability, repairItem)

Затем мы должны зарегистрировать его, вот так:

Registry.register(Registry.ITEM, new Identifier("examplemod", "netherite_shield"), NETHERITE_SHIELD)

И наш щит готов!
Теперь нам нужно создать текстуру и модель щита.
Для текстур вы можете использовать все, что угодно. Хорошее место для начала - посмотреть на изображение щита mojang и изменить его. Поместите его в resources/textures/item/<filename>.png
Теперь, для моделей, мы должны написать несколько файлов .json .
Для файла модели без блокировки мы используем:

{
    "parent":"fabricshieldlib:item/fabric_shield",
    "textures":{
        "shield":"examplemod:item/netherite_shield"
    },
    "overrides": [
        {
            "predicate": {
                "blocking": 1
            },
            "model": "examplemod:item/netherite_shield_blocking"
        }
    ]
}


Поместите его в resources/models/item/netherite_shield.json
Для модели блокировки используйте это:

{
  "parent": "fabricshieldlib:item/fabric_shield_blocking"
}


Поместите его в resources/models/item/netherite_shield_blocking.json

Не забудьте добавить его в ru_ru.json(или en_us.json)

{
  "item.examplemod.netherite_shield": "Незеритовый щит"
}


Ваш щит готов!

Добавление поддержки баннеров на ваш щит (1.17+)

Если вы используете 1.17, измените fabric_shield_lib в gradle.properties на:

fabric_shield_lib_version=1.4.5-1.17


Вот тут-то и вступают в дело миксины.

Следующее, что вам нужно будет сделать, это изменить FabricShieldItem на FabricBannerShieldItem, чтобы его можно было создавать с помощью баннеров.

public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(прочность), задержка в тиках, зачаровываемость, предмет для починки)

Теперь нам нужно зарегистрировать несколько вещей в нашем ClientModInitalizer.

Чтобы создать наш ClientModInitalizer, мы создадим новый класс под названием ExampleModClient и реализуем ClientModInitializer. Мы также внедрим и переопределим метод onInitializeClient (Если у вас уже есть инициализатор клиента, вы можете пропустить следующие 2 шага.)

public class ExampleModClient implements ClientModInitializer {
    @Override
    public void onInitializeClient() {
 
    }
}

Прежде чем мы выполним какую-либо работу в нашем инициализаторе модов клиента, нам нужно зарегистрировать его точку входа в fabric.mod.json.

{
  [...]
  "entrypoints": {
    "main": [
      "net.fabricmc.ExampleMod"
    ],
    "client": [
      "net.fabricmc.ExampleModClient"
    ]
  }
  [...]
}

Итак, теперь, когда это сделано, мы можем работать в нашем клиентском инициализаторе.

Во-первых, нам нужно будет создать EntityModelLayer для последующего использования.

public class ExampleModClient implements ClientModInitializer {
 
    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​
 
    @Override
    public void onInitializeClient() {
 
    }
}

Далее мы зарегистрируем EntityModelLayer, который мы создали ранее.

public class ExampleModClient implements ClientModInitializer {
 
    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​
 
    @Override
    public void onInitializeClient() {
        EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData);
    }
}

Затем мы должны зарегистрировать 2 наших SpriteIdentifier.

public class ExampleModClient implements ClientModInitializer {
 
    public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier("examplemod", "netherite_shield"),"main"); ​
 
    @Override
    public void onInitializeClient() {
        EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, ShieldEntityModel::getTexturedModelData);
        ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).register((atlasTexture, registry) -> {
            registry.register(new Identifier("examplemod", "entity/netherite_shield_base"));
            registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern"));
        });
    }
}

А теперь мы переходим к миксину. Не волнуйтесь, это очень просто.

Если это ваш первый раз, здесь о том, как зарегистрировать миксины в вашем fabric.mod.json (Обязательно создайте миксин client)

Мы создадим класс под названием RendererMixin и напишем:

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
 
}

Затем мы создадим необходимые Spriteidentifier и ShieldEntityModel. Spriteidentifier будет таким же, как в вашем ClientModInitializer.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
    private ShieldEntityModel modelNetheriteShield = new ShieldEntityModel;
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base"));
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));
}

Далее нам нужно добавить @Shadow для entityModelLoader, чтобы мы могли использовать его для инициализации нашей модели.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
    private ShieldEntityModel modelNetheriteShield;
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base"));
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));
 
    @Final
    @Shadow
    private EntityModelLoader entityModelLoader;
}    

Теперь мы внедрим метод reload для инициализации нашей модели.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
   private ShieldEntityModel modelNetheriteShield;
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base"));
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));
 
    @Final
    @Shadow
    private EntityModelLoader entityModelLoader;
 
 
    @Inject(method = "reload", at = @At("HEAD"))
    private void setModelNetheriteShield(CallbackInfo ci){
        modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleModClient.NETHERITE_SHIELD_MODEL_LAYER));
    }
}

Теперь мы переходим к самой важной части миксина. Мы внедрим метод для отображения баннера на нашем щите.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
   private ShieldEntityModel modelNetheriteShield;
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base"));
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));
 
    @Final
    @Shadow
    private EntityModelLoader entityModelLoader;
 
 
    @Inject(method = "reload", at = @At("HEAD"))
    private void setModelNetheriteShield(CallbackInfo ci){
        this.modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleModClient.NETHERITE_SHIELD_MODEL_LAYER));
    }
 
    @Inject(method = "render", at = @At("HEAD"))
    private void mainRender(ItemStack stack, ModelTransformation.Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo ci) {
        if (stack.isOf(ExampleMod.NETHERITE_SHIELD)) {
            FabricShieldLibClient.renderBanner(stack, matrices, vertexConsumers, light, overlay, modelNetheriteShield, NETHERITE_SHIELD_BASE, NETHERITE_SHIELD_BASE_NO_PATTERN); 
            //The first five parameters are taken from the method, while the last 3 you provide yourself. You will provide the model, and then your 2 sprite identifiers in the order of ''//SHIELD_NAME//_BASE'' and then ''//SHIELD_NAME//_BASE_NOPATTERN.
''
        }
    }
 
 
}

Вот теперь все сложные вещи сделаны! Теперь нам нужно только изменить нашу существующую модель, добавить текстуру nopattern и переместить наши текстуры в места, которые мы определили ранее.

В вашей модели щита, в нашем случае netherite_shield.json, нам нужно изменить родительский элемент и удалить текстуру.

{
  "parent":"fabricshieldlib:item/fabric_banner_shield",
    "overrides": [
        {
            "predicate": {
                "blocking": 1
            },
            "model": "examplemod:item/netherite_shield_blocking"
        }
    ]
}

Вы также должны изменить свою модель блокировки для вашего щита, для нас netherite_shield_blocking.json, на:

{
  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"
}

Для следующего шага добавьте _base к вашей текущей текстуре щита вот так: netherite_shield на netherite_shield_base. Затем вам нужно будет создать версию nopattern для вашей текстуры щита вот так: netherite_shield_base_nopattern. Я рекомендую взглянуть на текстуру ванильного щита nopattern.

Затем переместите обе эти текстуры в resources/assets/<modid>/textures/entity.

И последнее, вам нужно будет добавить имена для каждого из вариантов цвета вашего щита в ru_ru.json(или en_us.json).

{
    "item.examplemod.netherite_shield": "Незеритовый щит",
    "item.examplemod.netherite_shield.red": "Красный незеритовый щит",
    "item.examplemod.netherite_shield.orange": "Оранжевый незеритовый щит",
    "item.examplemod.netherite_shield.yellow": "Жёлтый незеритовый щит",
    "item.examplemod.netherite_shield.lime": "Лаймовый незеритовый щит",
    "item.examplemod.netherite_shield.green": "Зелёный незеритовый щит",
    "item.examplemod.netherite_shield.light_blue": "Голубой незеритовый щит",
    "item.examplemod.netherite_shield.cyan": "Бирюзовый незеритовый щит",
    "item.examplemod.netherite_shield.blue": "Синий незеритовый щит",
    "item.examplemod.netherite_shield.purple": "Фиолетовый незеритовый щит",
    "item.examplemod.netherite_shield.magenta": "Пурпурный незеритовый щит",
    "item.examplemod.netherite_shield.pink": "Розовый незеритовый щит",
    "item.examplemod.netherite_shield.brown": "Коричневый незеритовый щит",
    "item.examplemod.netherite_shield.white": "Белый незеритовый щит",
    "item.examplemod.netherite_shield.light_gray": "Светло-серый незеритовый щит",
    "item.examplemod.netherite_shield.gray": "Серый незеритовый щит",
    "item.examplemod.netherite_shield.dark_gray": "Тёмно-серый незеритовый щит",
    "item.examplemod.netherite_shield.black": "Чёрный незеритовый щит"
}

Теперь ваш щит готов и имеет поддержку баннера!

Добавление поддержки баннеров на ваш щит (1.15-1.16)

Вот тут-то и вступают в дело миксины.

Сначала измените fabric_shield_lib в gradle.properties (Если надо замените версию с 1.15 на 1.16)

fabric_shield_lib_version=1.4.5-1.15


Следующее, что вам нужно будет сделать, это изменить FabricShieldItem на FabricBannerShieldItem, чтобы его можно было создавать с помощью баннеров.

public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(прочность), задержка в тиках, зачаровываемость, предмет для починки)

Теперь нам нужно зарегистрировать несколько вещей в нашем ClientModInitalizer.

Чтобы создать наш ClientModInitalizer, мы создадим новый класс под названием ExampleModClient и реализуем ClientModInitializer. Мы также внедрим и переопределим метод onInitializeClient (Если у вас уже есть инициализатор клиента, вы можете пропустить следующие 2 шага.)

public class ExampleModClient implements ClientModInitializer {
    @Override
    public void onInitializeClient() {
 
    }
}

Прежде чем мы выполним какую-либо работу в нашем инициализаторе модов клиента, нам нужно зарегистрировать его точку входа в fabric.mod.json.

{
  [...]
  "entrypoints": {
    "main": [
      "net.fabricmc.ExampleMod"
    ],
    "client": [
      "net.fabricmc.ExampleModClient"
    ]
  }
  [...]
}

Итак, теперь, когда это сделано, мы можем работать в нашем клиентском инициализаторе.

Единственное, что нам нужно будет сделать, это зарегистрировать 2 наших SpriteIdentifier.

public class ExampleModClient implements ClientModInitializer {
 
    @Override
    public void onInitializeClient() {
        ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register((atlasTexture, registry) -> {
            registry.register(new Identifier("examplemod", "entity/netherite_shield_base"));
            registry.register(new Identifier("examplemod", "entity/netherite_shield_base_nopattern"));
        });
    }
}

А теперь мы переходим к миксину. Не волнуйтесь, это очень просто.

Если это ваш первый раз, здесь о том, как зарегистрировать миксины в вашем fabric.mod.json (Обязательно создайте миксин client)

Мы создадим класс под названием RendererMixin и напишем:

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
 
}

Затем мы создадим необходимые Spriteidentifier и ShieldEntityModel. Spriteidentifier будет таким же, как в вашем ClientModInitializer.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
    private ShieldEntityModel modelNetheriteShield = new ShieldEntityModel;
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base"));
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));
}

Теперь мы переходим к самой важной части миксина. Мы внедрим метод для отображения баннера на нашем щите.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
    private ShieldEntityModel modelNetheriteShield = new ShieldEntityModel;
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base"));
    private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, new Identifier("examplemod","entity/netherite_shield_base_nopattern"));
 
    @Inject(method = "render", at = @At("HEAD"))
    private void mainRender(ItemStack stack, ModelTransformation.Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo ci) {
        if (stack.getItem() == ExampleMod.NETHERITE_SHIELD)) {
            FabricShieldLibClient.renderBanner(stack, matrices, vertexConsumers, light, overlay, modelNetheriteShield, NETHERITE_SHIELD_BASE, NETHERITE_SHIELD_BASE_NO_PATTERN); 
            //The first five parameters are taken from the method, while the last 3 you provide yourself. You will provide the model, and then your 2 sprite identifiers in the order of ''//SHIELD_NAME//_BASE'' and then ''//SHIELD_NAME//_BASE_NOPATTERN.
''
        }
    }
 
 
}

Вот теперь все сложные вещи сделаны! Теперь нам нужно только изменить нашу существующую модель, добавить текстуру nopattern и переместить наши текстуры в места, которые мы определили ранее.

В вашей модели щита, в нашем случае netherite_shield.json, нам нужно изменить родительский элемент и удалить текстуру.

{
  "parent":"fabricshieldlib:item/fabric_banner_shield",
    "overrides": [
        {
            "predicate": {
                "blocking": 1
            },
            "model": "examplemod:item/netherite_shield_blocking"
        }
    ]
}

Вы также должны изменить свою модель блокировки для вашего щита, для нас netherite_shield_blocking.json, на:

{
  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"
}

Для следующего шага добавьте _base к вашей текущей текстуре щита вот так: netherite_shield на netherite_shield_base. Затем вам нужно будет создать версию nopattern для вашей текстуры щита вот так: netherite_shield_base_nopattern. Я рекомендую взглянуть на текстуру ванильного щита nopattern.

Затем переместите обе эти текстуры в resources/assets/<modid>/textures/entity.

И последнее, вам нужно будет добавить имена для каждого из вариантов цвета вашего щита в ru_ru.json(или en_us.json).

{
    "item.examplemod.netherite_shield": "Незеритовый щит",
    "item.examplemod.netherite_shield.red": "Красный незеритовый щит",
    "item.examplemod.netherite_shield.orange": "Оранжевый незеритовый щит",
    "item.examplemod.netherite_shield.yellow": "Жёлтый незеритовый щит",
    "item.examplemod.netherite_shield.lime": "Лаймовый незеритовый щит",
    "item.examplemod.netherite_shield.green": "Зелёный незеритовый щит",
    "item.examplemod.netherite_shield.light_blue": "Голубой незеритовый щит",
    "item.examplemod.netherite_shield.cyan": "Бирюзовый незеритовый щит",
    "item.examplemod.netherite_shield.blue": "Синий незеритовый щит",
    "item.examplemod.netherite_shield.purple": "Фиолетовый незеритовый щит",
    "item.examplemod.netherite_shield.magenta": "Пурпурный незеритовый щит",
    "item.examplemod.netherite_shield.pink": "Розовый незеритовый щит",
    "item.examplemod.netherite_shield.brown": "Коричневый незеритовый щит",
    "item.examplemod.netherite_shield.white": "Белый незеритовый щит",
    "item.examplemod.netherite_shield.light_gray": "Светло-серый незеритовый щит",
    "item.examplemod.netherite_shield.gray": "Серый незеритовый щит",
    "item.examplemod.netherite_shield.dark_gray": "Тёмно-серый незеритовый щит",
    "item.examplemod.netherite_shield.black": "Чёрный незеритовый щит"
}

Теперь ваш щит готов и имеет поддержку баннера!

Добавление поддержки баннеров на ваш щит (1.14)

Вот тут-то и вступают в дело миксины.

Сначала измените fabric_shield_lib в gradle.properties

fabric_shield_lib_version=1.4.5-1.14


Следующее, что вам нужно будет сделать, это изменить FabricShieldItem на FabricBannerShieldItem, чтобы его можно было создавать с помощью баннеров.

public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(прочность), задержка в тиках, зачаровываемость, предмет для починки)

Единственное, что нам нужно будет сделать сейчас, это добавить простой миксин.

Если это ваш первый раз, здесь о том, как зарегистрировать миксины в вашем fabric.mod.json (Обязательно создайте миксин client)

Мы создадим класс под названием RendererMixin и напишем:

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
 
}

Затем мы создадим необходимые Identifier. Они будут путем к вашим текстурам, у второго будет дополнительный _nopattern, добавленный к имени файла.

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
    private static final Identifier NETHERITE_SHIELD_BASE = new Identifier("examplemod","entity/netherite_shield_base");
    private static final Identifier NETHERITE_SHIELD_BASE_NO_PATTERN = new Identifier("examplemod","entity/netherite_shield_base_nopattern");
}

Теперь мы переходим к самой важной части миксина. Мы внедрим метод для отображения баннера на нашем щите. Не забудьте отметить ввод с помощью cancellable = true

@Mixin (BuiltinModelItemRenderer.class)
public class RendererMixin {
    private static final Identifier NETHERITE_SHIELD_BASE = new Identifier("examplemod","entity/netherite_shield_base");
    private static final Identifier NETHERITE_SHIELD_BASE_NO_PATTERN = new Identifier("examplemod","entity/netherite_shield_base_nopattern");
 
    @Inject(method = "render", at = @At("HEAD"), cancellable = true)
    private void mainRender(ItemStack stack, CallbackInfo callbackInfo) {
        if (stack.getItem() == ExampleMod.NETHERITE_SHIELD)) {
            //Первый параметр берется из метода, в то время как вы будете указывать свои 2 идентификатора в порядке ''//SHIELD_NAME//_BASE_NOPATTERN'', а затем ''//SHIELD_NAME//_BASE''.
            FabricShieldBannerRendering.render(stack, NETHERITE_SHIELD_BASE_NO_PATTERN, NETHERITE_SHIELD_BASE);
            callbackInfo.cancel();
        }
    }
 
 
}

Вот теперь все сложные вещи сделаны! Теперь нам нужно только изменить нашу существующую модель, добавить текстуру nopattern и переместить наши текстуры в места, которые мы определили ранее.

В вашей модели щита, в нашем случае netherite_shield.json, нам нужно изменить родительский элемент и удалить текстуру.

{
  "parent":"fabricshieldlib:item/fabric_banner_shield",
    "overrides": [
        {
            "predicate": {
                "blocking": 1
            },
            "model": "examplemod:item/netherite_shield_blocking"
        }
    ]
}

Вы также должны изменить свою модель блокировки для вашего щита, для нас netherite_shield_blocking.json, на:

{
  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"
}

Для следующего шага добавьте _base к вашей текущей текстуре щита вот так: netherite_shield на netherite_shield_base. Затем вам нужно будет создать версию nopattern для вашей текстуры щита вот так: netherite_shield_base_nopattern. Я рекомендую взглянуть на текстуру ванильного щита nopattern.

Затем переместите обе эти текстуры в resources/assets/<modid>/textures/entity.

И последнее, вам нужно будет добавить имена для каждого из вариантов цвета вашего щита в ru_ru.json(или en_us.json).

{
    "item.examplemod.netherite_shield": "Незеритовый щит",
    "item.examplemod.netherite_shield.red": "Красный незеритовый щит",
    "item.examplemod.netherite_shield.orange": "Оранжевый незеритовый щит",
    "item.examplemod.netherite_shield.yellow": "Жёлтый незеритовый щит",
    "item.examplemod.netherite_shield.lime": "Лаймовый незеритовый щит",
    "item.examplemod.netherite_shield.green": "Зелёный незеритовый щит",
    "item.examplemod.netherite_shield.light_blue": "Голубой незеритовый щит",
    "item.examplemod.netherite_shield.cyan": "Бирюзовый незеритовый щит",
    "item.examplemod.netherite_shield.blue": "Синий незеритовый щит",
    "item.examplemod.netherite_shield.purple": "Фиолетовый незеритовый щит",
    "item.examplemod.netherite_shield.magenta": "Пурпурный незеритовый щит",
    "item.examplemod.netherite_shield.pink": "Розовый незеритовый щит",
    "item.examplemod.netherite_shield.brown": "Коричневый незеритовый щит",
    "item.examplemod.netherite_shield.white": "Белый незеритовый щит",
    "item.examplemod.netherite_shield.light_gray": "Светло-серый незеритовый щит",
    "item.examplemod.netherite_shield.gray": "Серый незеритовый щит",
    "item.examplemod.netherite_shield.dark_gray": "Тёмно-серый незеритовый щит",
    "item.examplemod.netherite_shield.black": "Чёрный незеритовый щит"
}

Теперь ваш щит готов и имеет поддержку баннера!

ru/tutorial/shield.txt · Last modified: 2022/03/26 20:15 by 127.0.0.1