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.16)] 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>
 +\\ 
  
-===== Adding banner support to your shield (1.15) =====+Вот тут-то и вступают в дело миксины. 
 + 
 +Следующее, что вам нужно будет сделать, это изменить //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":
 +            }, 
 +            "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>     
 + 
 +Теперь ваш щит готов и имеет поддержку баннера! 
 + 
 +===== Добавление поддержки баннеров на ваш щит (1.15-1.16) =====
  
 Вот тут-то и вступают в дело миксины. Вот тут-то и вступают в дело миксины.
  
-Сначала измените fabric_shield_lib в **gradle.properties**+Сначала измените fabric_shield_lib в **gradle.properties** (Если надо замените версию с 1.15 на 1.16)
 \\  \\ 
 <code java> <code java>
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.1648324332.txt.gz · Last modified: 2022/03/26 19:52 by furnygo