ru:tutorial:shield
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| ru:tutorial:shield [2022/03/26 19:52] – [Adding banner support to your shield (1.15)] furnygo | ru: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, измените fabric_shield_lib в **gradle.properties** на: | ||
| + | \\ | ||
| + | <code java> | ||
| + | fabric_shield_lib_version=1.4.5-1.17 | ||
| + | </ | ||
| + | \\ | ||
| + | |||
| + | Вот тут-то и вступают в дело миксины. | ||
| + | |||
| + | Следующее, | ||
| + | |||
| + | <code java> | ||
| + | public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), | ||
| + | </ | ||
| + | |||
| + | Теперь нам нужно зарегистрировать несколько вещей в нашем '' | ||
| + | |||
| + | Чтобы создать наш '' | ||
| + | |||
| + | <code java> | ||
| + | public class ExampleModClient implements ClientModInitializer { | ||
| + | @Override | ||
| + | public void onInitializeClient() { | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Прежде чем мы выполним какую-либо работу в нашем инициализаторе модов клиента, | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | [...] | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ], | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | } | ||
| + | [...] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Итак, теперь, | ||
| + | |||
| + | Во-первых, | ||
| + | <code java> | ||
| + | public class ExampleModClient implements ClientModInitializer { | ||
| + | |||
| + | public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier(" | ||
| + | |||
| + | @Override | ||
| + | public void onInitializeClient() { | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Далее мы зарегистрируем '' | ||
| + | |||
| + | <code java> | ||
| + | public class ExampleModClient implements ClientModInitializer { | ||
| + | |||
| + | public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier(" | ||
| + | |||
| + | @Override | ||
| + | public void onInitializeClient() { | ||
| + | EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Затем мы должны зарегистрировать 2 наших '' | ||
| + | |||
| + | <code java> | ||
| + | public class ExampleModClient implements ClientModInitializer { | ||
| + | |||
| + | public static final EntityModelLayer NETHERITE_SHIELD_MODEL_LAYER = new EntityModelLayer(new Identifier(" | ||
| + | |||
| + | @Override | ||
| + | public void onInitializeClient() { | ||
| + | EntityModelLayerRegistry.registerModelLayer(NETHERITE_SHIELD_MODEL_LAYER, | ||
| + | ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).register((atlasTexture, | ||
| + | registry.register(new Identifier(" | ||
| + | registry.register(new Identifier(" | ||
| + | }); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | А теперь мы переходим к миксину. Не волнуйтесь, | ||
| + | |||
| + | Если это ваш первый раз, [[tutorial: | ||
| + | |||
| + | Мы создадим класс под названием '' | ||
| + | <code java> | ||
| + | @Mixin (BuiltinModelItemRenderer.class) | ||
| + | public class RendererMixin { | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | Затем мы создадим необходимые '' | ||
| + | <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, | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Далее нам нужно добавить @Shadow для '' | ||
| + | <code java> | ||
| + | @Mixin (BuiltinModelItemRenderer.class) | ||
| + | public class RendererMixin { | ||
| + | private ShieldEntityModel modelNetheriteShield; | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
| + | |||
| + | @Final | ||
| + | @Shadow | ||
| + | private EntityModelLoader entityModelLoader; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Теперь мы внедрим метод '' | ||
| + | <code java> | ||
| + | @Mixin (BuiltinModelItemRenderer.class) | ||
| + | public class RendererMixin { | ||
| + | | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
| + | |||
| + | @Final | ||
| + | @Shadow | ||
| + | private EntityModelLoader entityModelLoader; | ||
| + | |||
| + | |||
| + | @Inject(method = " | ||
| + | private void setModelNetheriteShield(CallbackInfo ci){ | ||
| + | modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleModClient.NETHERITE_SHIELD_MODEL_LAYER)); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | Теперь мы переходим к самой важной части миксина. Мы внедрим метод для отображения баннера на нашем щите. | ||
| + | | ||
| + | <code java> | ||
| + | @Mixin (BuiltinModelItemRenderer.class) | ||
| + | public class RendererMixin { | ||
| + | | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
| + | private static final SpriteIdentifier NETHERITE_SHIELD_BASE_NO_PATTERN = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, | ||
| + | |||
| + | @Final | ||
| + | @Shadow | ||
| + | private EntityModelLoader entityModelLoader; | ||
| + | |||
| + | |||
| + | @Inject(method = " | ||
| + | private void setModelNetheriteShield(CallbackInfo ci){ | ||
| + | this.modelNetheriteShield = new ShieldEntityModel(this.entityModelLoader.getModelPart(ExampleModClient.NETHERITE_SHIELD_MODEL_LAYER)); | ||
| + | } | ||
| + | | ||
| + | @Inject(method = " | ||
| + | private void mainRender(ItemStack stack, ModelTransformation.Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, | ||
| + | if (stack.isOf(ExampleMod.NETHERITE_SHIELD)) { | ||
| + | FabricShieldLibClient.renderBanner(stack, | ||
| + | //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 ''// | ||
| + | '' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Вот теперь все сложные вещи сделаны! Теперь нам нужно только изменить нашу существующую модель, | ||
| + | |||
| + | В вашей модели щита, в нашем случае '' | ||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | } | ||
| + | ] | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Вы также должны изменить свою модель блокировки для вашего щита, для нас '' | ||
| + | |||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Для следующего шага добавьте '' | ||
| + | Затем вам нужно будет создать версию '' | ||
| + | |||
| + | Затем переместите обе эти текстуры в '' | ||
| + | |||
| + | И последнее, | ||
| + | <code javascript> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Теперь ваш щит готов и имеет поддержку баннера! | ||
| - | ===== Adding banner support to your shield | + | ===== Добавление поддержки баннеров на ваш щит |
| Вот тут-то и вступают в дело миксины. | Вот тут-то и вступают в дело миксины. | ||
| Line 96: | Line 332: | ||
| <code java> | <code java> | ||
| - | public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), | + | public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), |
| </ | </ | ||
| Line 246: | Line 482: | ||
| Теперь ваш щит готов и имеет поддержку баннера! | Теперь ваш щит готов и имеет поддержку баннера! | ||
| - | ===== Adding banner support to your shield | + | ===== Добавление поддержки баннеров на ваш щит |
| Вот тут-то и вступают в дело миксины. | Вот тут-то и вступают в дело миксины. | ||
| Line 260: | Line 496: | ||
| <code java> | <code java> | ||
| - | public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), | + | public static final Item NETHERITE_SHIELD = new FabricBannerShieldItem(new FabricItemSettings().maxDamage(2500).group(ItemGroup.COMBAT), |
| </ | </ | ||
ru/tutorial/shield.1648324375.txt.gz · Last modified: 2022/03/26 19:52 by furnygo