User Tools

Site Tools


ru:tutorial:shield

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
ru:tutorial:shield [2022/03/26 19:52] – [Adding banner support to your shield (1.15)] furnygoru:tutorial:shield [2022/03/26 20:15] – [Добавление поддержки баннеров на ваш щит (1.14)] furnygo
Line 78: Line 78:
  
  
-===== Adding banner support to your shield (1.17+) ===== +===== Добавление поддержки баннеров на ваш щит (1.17+=====
-Будет добавлено (Лаги в редакторе)+
  
 +Если вы используете 1.17, измените fabric_shield_lib в **gradle.properties** на:
 +\\ 
 +<code java>
 +fabric_shield_lib_version=1.4.5-1.17
 +</code>
 +\\ 
 +
 +Вот тут-то и вступают в дело миксины.
 +
 +Следующее, что вам нужно будет сделать, это изменить //FabricShieldItem// на //FabricBannerShieldItem//, чтобы его можно было создавать с помощью баннеров.
 +
 +<code java>
 +public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(прочность), задержка в тиках, зачаровываемость, предмет для починки)
 +</code>
 +
 +Теперь нам нужно зарегистрировать несколько вещей в нашем ''ClientModInitalizer''.
 +
 +Чтобы создать наш ''ClientModInitalizer'', мы создадим новый класс под названием ''ExampleModClient'' и реализуем ''ClientModInitializer''. Мы также внедрим и переопределим метод ''onInitializeClient'' **(Если у вас уже есть инициализатор клиента, вы можете пропустить следующие 2 шага.)**
 +
 +<code java>
 +public class ExampleModClient implements ClientModInitializer {
 +    @Override
 +    public void onInitializeClient() {
 +    
 +    }
 +}
 +</code>
 +
 +Прежде чем мы выполним какую-либо работу в нашем инициализаторе модов клиента, нам нужно зарегистрировать его точку входа в ''fabric.mod.json''.
 +
 +<code javascript>
 +{
 +  [...]
 +  "entrypoints": {
 +    "main": [
 +      "net.fabricmc.ExampleMod"
 +    ],
 +    "client": [
 +      "net.fabricmc.ExampleModClient"
 +    ]
 +  }
 +  [...]
 +}
 +</code>
 +
 +Итак, теперь, когда это сделано, мы можем работать в нашем клиентском инициализаторе.
 +
 +Во-первых, нам нужно будет создать ''EntityModelLayer'' для последующего использования.
 +<code java>
 +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() {
 +    
 +    }
 +}
 +</code>
 +
 +Далее мы зарегистрируем ''EntityModelLayer'', который мы создали ранее.
 +
 +<code java>
 +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);
 +    }
 +}
 +</code>
 +
 +Затем мы должны зарегистрировать 2 наших ''SpriteIdentifier''.
 +
 +<code java>
 +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"));
 +        });
 +    }
 +}
 +</code>
 +
 +А теперь мы переходим к миксину. Не волнуйтесь, это очень просто.
 +
 +Если это ваш первый раз, [[tutorial:mixin_registration|здесь о том, как зарегистрировать миксины в вашем fabric.mod.json]] //__(Обязательно создайте миксин **client**)__//
 +
 +Мы создадим класс под названием ''RendererMixin'' и напишем:
 +<code java>
 +@Mixin (BuiltinModelItemRenderer.class)
 +public class RendererMixin {
 +
 +}
 +</code>
 +
 +Затем мы создадим необходимые ''Spriteidentifier'' и ''ShieldEntityModel''. ''Spriteidentifier'' будет таким же, как в вашем ''ClientModInitializer''.
 +<code java>
 +@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"));
 +}
 +</code>
 +
 +Далее нам нужно добавить @Shadow для ''entityModelLoader'', чтобы мы могли использовать его для инициализации нашей модели.
 +<code java>
 +@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;
 +}    
 +</code>
 +
 +Теперь мы внедрим метод ''reload'' для инициализации нашей модели.
 +<code java>
 +@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));
 +    }
 +}
 +</code>
 +
 +
 + 
 +Теперь мы переходим к самой важной части миксина. Мы внедрим метод для отображения баннера на нашем щите.
 +  
 +<code java>
 +@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.
 +''
 +        }
 +    }
 +
 +    
 +}
 +</code>     
 +
 +Вот теперь все сложные вещи сделаны! Теперь нам нужно только изменить нашу существующую модель, добавить текстуру ''nopattern'' и переместить наши текстуры в места, которые мы определили ранее.
 +
 +В вашей модели щита, в нашем случае ''netherite_shield.json'', нам нужно изменить родительский элемент и удалить текстуру.
 +<code javascript>
 +{
 +  "parent":"fabricshieldlib:item/fabric_banner_shield",
 +    "overrides": [
 +        {
 +            "predicate": {
 +                "blocking": 1
 +            },
 +            "model": "examplemod:item/netherite_shield_blocking"
 +        }
 +    ]
 +}
 +</code>
 +
 +Вы также должны изменить свою модель блокировки для вашего щита, для нас ''netherite_shield_blocking.json'', на:
 +
 +<code javascript>
 +{
 +  "parent":"fabricshieldlib:item/fabric_banner_shield_blocking"
 +}
 +</code>
 +
 +Для следующего шага добавьте ''_base'' к вашей текущей текстуре щита вот так: ''netherite_shield'' на ''netherite_shield_base''.
 +Затем вам нужно будет создать версию ''nopattern'' для вашей текстуры щита вот так: ''netherite_shield_base_nopattern''. Я рекомендую взглянуть на текстуру ванильного щита ''nopattern''.
 +
 +Затем переместите обе эти текстуры в ''resources/assets/<modid>/textures/entity''.
 +
 +И последнее, вам нужно будет добавить имена для каждого из вариантов цвета вашего щита в ''ru_ru.json''(или ''en_us.json'').
 +<code javascript>
 +{
 +    "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": "Чёрный незеритовый щит"
 +}
 +</code>    
 +
 +Теперь ваш щит готов и имеет поддержку баннера!
  
-===== Adding banner support to your shield (1.15-1.16) =====+===== Добавление поддержки баннеров на ваш щит (1.15-1.16) =====
  
 Вот тут-то и вступают в дело миксины. Вот тут-то и вступают в дело миксины.
Line 96: Line 332:
  
 <code java> <code java>
-public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(durability), cooldownTicksenchantabilityrepairItem)+public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(прочность), задержка в тикахзачаровываемостьпредмет для починки)
 </code> </code>
  
Line 246: Line 482:
 Теперь ваш щит готов и имеет поддержку баннера! Теперь ваш щит готов и имеет поддержку баннера!
  
-===== Adding banner support to your shield (1.14) =====+===== Добавление поддержки баннеров на ваш щит (1.14) =====
  
 Вот тут-то и вступают в дело миксины. Вот тут-то и вступают в дело миксины.
Line 260: Line 496:
  
 <code java> <code java>
-public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(durability), cooldownTicksenchantabilityrepairItem)+public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), 10, 13, Items.NETHERITE_INGOT); // FabricBannerShieldItem(settings.maxDamage(прочность), задержка в тикахзачаровываемостьпредмет для починки)
 </code> </code>
  
ru/tutorial/shield.txt · Last modified: 2022/03/26 20:15 by 127.0.0.1