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
ru:tutorial:shield [2022/03/26 19:52] – [Adding banner support to your shield (1.15)] furnygoru:tutorial:shield [2022/03/26 20:15] (current) – external edit 127.0.0.1
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.1648324375.txt.gz · Last modified: 2022/03/26 19:52 by furnygo