Minecraft 1.19.2 Forge模组开发 10.3D动画盔甲

news/2023/6/7 1:09:56

Minecraft 1.16.5模组开发3D盔甲

Minecraft 1.12.2模组开发3D盔甲

Minecraft 1.18.2模组开发3D动画盔甲

我们本次在1.19.2的版本中实现具有动画效果的3D盔甲

hat.gif
效果演示效果演示效果演示

1.首先,为了实现这些效果,我们需要首先使用到一个模组:geckolib(下载地址)

找到项目的build.gradle文件,在repositoriesdependencies中添加依赖。

repositories {//添加这个maven { url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' }}
dependencies {minecraft 'net.minecraftforge:forge:1.19.2-43.1.1'//添加这个modImplementation 'software.bernie.geckolib:geckolib-fabric-1.19:3.1.18'}

之后我们重新构建gradle项目

cr5.png

构建好了项目后在项目的Main类中添加一句geckolib的初始化语句:

Main.java

	public Main() {IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();ItemInit.ITEMS.register(bus);//添加GeckoLib初始化函数GeckoLib.initialize();MinecraftForge.EVENT_BUS.register(this);}

2.之后,与之前的教程一样,我们需要在blockbench中制作一个模组中的3D盔甲:

进入软件后我们要找到一个插件按钮,然后再搜索栏中输入GeckoLib Animation Utils,并下载这个插件

cr6.png

将我们制作好的生物实体进行模型转换工作,找到Convert Project,之后选择Geckolib Animated Model

cr7.png

在这之后,你会发现你的生物实体栏多了一个Animate栏,点击进去:

ani.jpg

具体动作制作的视频:Blockbench动画制作

在制作好所有的动画后我们导出模型和动画json文件。

cc.png

3.模型制作完成,接下来需要制作我们的盔甲类

在items包中新建armor包 -> armor包中新建我们的套装类ChandlierArmorItem

ChandlierArmorItem.java

package net.joy187.joyggd.item.armor;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import net.joy187.joyggd.Main;
import net.joy187.joyggd.init.ItemInit;
import net.joy187.joyggd.item.CustomArmorMaterial;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.decoration.ArmorStand;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Item.Properties;
import net.minecraft.world.level.Level;
import software.bernie.geckolib3.core.IAnimatable;
import software.bernie.geckolib3.core.PlayState;
import software.bernie.geckolib3.core.builder.AnimationBuilder;
import software.bernie.geckolib3.core.controller.AnimationController;
import software.bernie.geckolib3.core.event.predicate.AnimationEvent;
import software.bernie.geckolib3.core.manager.AnimationData;
import software.bernie.geckolib3.core.manager.AnimationFactory;
import software.bernie.geckolib3.item.GeoArmorItem;public class ChandlierArmorItem extends GeoArmorItem implements IAnimatable{private AnimationFactory factory = new AnimationFactory(this);public ChandlierArmorItem(ArmorMaterial materialIn, EquipmentSlot slot, Properties builder) {super(materialIn, slot, builder.tab(Main.ITEM_TAB));}//动画状态机,判断每个时刻我们的盔甲的动画状态@SuppressWarnings("unused")private <P extends IAnimatable> PlayState predicate(AnimationEvent<P> event) {List<EquipmentSlot> slotData = event.getExtraDataOfType(EquipmentSlot.class);List<ItemStack> stackData = event.getExtraDataOfType(ItemStack.class);LivingEntity livingEntity = event.getExtraDataOfType(LivingEntity.class).get(0);if(!event.isMoving()){event.getController().setAnimation(new AnimationBuilder().addAnimation("animation.chandlier.rotate", true));}// If the living entity is an armorstand just play the animation nonstopif (livingEntity instanceof ArmorStand) {return PlayState.CONTINUE;}else if (livingEntity instanceof Player) {Player player = (Player) livingEntity;// Get all the equipment, aka the armor, currently held item, and offhand itemList<Item> equipmentList = new ArrayList<>();player.getAllSlots().forEach((x) -> equipmentList.add(x.getItem()));//我们本次只制作一个头盔,所以subList为(5,6)// elements 2 to 6 are the armor so we take the sublist. Armorlist now only// contains the 4 armor slotsList<Item> armorList = equipmentList.subList(5, 6);boolean isWearingAll = armorList.containsAll(Arrays.asList(ItemInit.CHANDLIER.get()));return isWearingAll ? PlayState.CONTINUE : PlayState.STOP;}return PlayState.STOP;}//将我们的待机动画进行注册@SuppressWarnings({ "unchecked", "rawtypes" })@Overridepublic void registerControllers(AnimationData data) {data.addAnimationController(new AnimationController(this, "controller", 20, this::predicate));}@Overridepublic AnimationFactory getFactory() {return this.factory;}//穿上盔甲后是否给予我们特殊效果
//    @Override
//    public void onArmorTick(ItemStack stack, Level world, Player player) {
//        if(!world.isClientSide()) {
//            if(!player.getInventory().getArmor(3).isEmpty()) {
//                MobEffectInstance mapStatusEffect1 = new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 20*60, 1);
//                MobEffectInstance mapStatusEffect2 = new MobEffectInstance(MobEffects.NIGHT_VISION, 20*60, 1);
//
//                ArmorItem helmet = ((ArmorItem)player.getInventory().getArmor(3).getItem());
//                if(helmet.getMaterial() == CustomArmorMaterial.ARMOR_MATERIAL_ADASUIT) {
//                    boolean hasPlayerEffect = player.hasEffect(mapStatusEffect1.getEffect());
//                    if(!hasPlayerEffect) {
//                        player.addEffect(new MobEffectInstance(mapStatusEffect1.getEffect(),mapStatusEffect1.getDuration(), mapStatusEffect1.getAmplifier()));
//                        player.addEffect(new MobEffectInstance(mapStatusEffect2.getEffect(),mapStatusEffect2.getDuration(), mapStatusEffect2.getAmplifier()));
//                    }
//                }
//            	//player.addEffect(new MobEffectInstance(EffectInit.ZENHEART.get(), 100, 1));
//            }
//        }
//    }}

之后我们需要在armor包中新建model包->model包中新建我们的盔甲的模型类ModelChandlier

ModelChandlier.java

package net.joy187.joyggd.item.armor.model;import net.joy187.joyggd.Main;
import net.joy187.joyggd.item.armor.ChandlierArmorItem;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib3.model.AnimatedGeoModel;public class ModelChandlier extends AnimatedGeoModel<ChandlierArmorItem> {//盔甲模型文件地址@Overridepublic ResourceLocation getModelResource(ChandlierArmorItem object) {return new ResourceLocation(Main.MOD_ID, "geo/chandlier.geo.json");}//盔甲材质文件地址@Overridepublic ResourceLocation getTextureResource(ChandlierArmorItem object) {return new ResourceLocation(Main.MOD_ID, "textures/models/armor/chandlier_layer_1.png");}//盔甲动画文件地址@Overridepublic ResourceLocation getAnimationResource(ChandlierArmorItem animatable) {return new ResourceLocation(Main.MOD_ID, "animations/chandlier.animation.json");}
}

之后我们需要在armor包中新建render包->render包中新建我们的盔甲的渲染类RenderChandlier

RenderChandlier.java

package net.joy187.joyggd.item.armor.render;import net.joy187.joyggd.item.armor.ChandlierArmorItem;
import net.joy187.joyggd.item.armor.model.ModelChandlier;
import software.bernie.geckolib3.renderers.geo.GeoArmorRenderer;public class RenderChandlier extends GeoArmorRenderer<ChandlierArmorItem> {//渲染盔甲穿在身上的每一个部位的效果public RenderChandlier() {super(new ModelChandlier());//这里要和第二步你blockbench中建模的名称一一对应this.headBone = "Head";this.bodyBone = "chestplate";this.rightArmBone = "rightArm";this.leftArmBone = "leftArm";this.rightLegBone = "rightLeg";this.leftLegBone = "leftLeg";this.rightBootBone = "rightBoot";this.leftBootBone = "leftBoot";}}

4.在ClientModEventSubscriber类中将我们的盔甲渲染类进行注册:

ClientModEventSubscriber.java

@Mod.EventBusSubscriber(modid = Main.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ClientModEventSubscriber extends ModEventSubscriber{@SubscribeEventpublic static void registerRenderers(final EntityRenderersEvent.AddLayers event) {//渲染类进行注册GeoArmorRenderer.registerArmorRenderer(ChandlierArmorItem.class, RenderChandlier::new);}
}

5.在ItemInit类中将我们的盔甲进行声明,盔甲属性请参考1.18的教程,一模一样:1.18.2 盔甲套装:

ItemInit.java

    //头盔public static final RegistryObject<ChandlierArmorItem> CHANDLIER = ITEMS.register("chandlier",() -> new ChandlierArmorItem(CustomArmorMaterial.ARMOR_MATERIAL_CHANDLIER, EquipmentSlot.HEAD, new Item.Properties()));

6.代码部分结束,之后来到材质包制作环节:

resources\assets\你的modid中的lang包中的en_us.json添加盔甲的英文名称:

"item.joyggd.chandlier":"Chandlier",

models\item包中添加所有盔甲的模型文件:

chandlier.json

{"parent":"minecraft:item/generated","textures":{"layer0":"joyggd:item/chandlier"}
}

textures\item中添加盔甲的手持贴图:

39383_761f3eec0f-crr2.jpg

textures\models\armor中添加盔甲的穿戴后贴图:

39383_dcd4c5260f-crr3.jpg

新建一个geo包和animation包,把第二步中的模型和动画文件分别放进去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WsicCPoq-1674035205067)(https://cdn.acwing.com/media/article/image/2023/01/18/39383_6f88aeac97-360截图20230118174221226.jpg)]

8.保存所有文件 -> 进行测试:

穿上盔甲,如果可以正常显示,就说明我们成功了!

2023-01-18_17.45.46.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4554302.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

[Qt6][QML][教程]QML创建一个漂亮的音乐显示弹窗

1. 前言 以前的弹窗效果有些看腻了&#xff0c;这次更新下界面。 教程被应用在MediaStateT中, Tag v1.5 MediaStateT Github项目地址: https://github.com/taxue-alfred/MediaStateT MediaStateT Gitee项目地址: https://gitee.com/MediaState/MediaStateT 2. 效果展示 以前界…

计算机重启是把电脑关了的意思吗,电脑是不是应该每晚都关机?休眠、睡眠、关机又有什么区别!...

原标题&#xff1a;电脑是不是应该每晚都关机&#xff1f;休眠、睡眠、关机又有什么区别&#xff01;你可能听过晚上把电脑关机会对它有害的说法&#xff0c;但是你一定也听过完全不同的观点&#xff0c;就是长时间不用电脑的时候其实应该关机。那怎样才是正确的做法呢&#xf…

跟着阿杜拆书:《慢思考》

阅读本文大约需要7分钟。互联网构建了一个“扁平”的世界&#xff0c;给人们的生活带来了很多的便利&#xff0c;同时也让人们的生活节奏越来越快&#xff0c;但是&#xff0c;也让人们的深度思考变得越来越少。回想一下&#xff0c;下面一些场景是不是很熟悉&#xff1a;钉钉消…

第三招:通过8大途径程序员如何赚「睡后」收入

我的副业故事 从 2014 年中到 2017 年中&#xff0c;这三年多的时间里&#xff0c;我本职工作表现优秀的同时&#xff0c;还做过下列 9 类副业&#xff1a; 写书 视频课程 企业内训 公众号 语音问答 知乎 Live 视频直播课程 GitChat付费 Chat 职业规划咨询 写书 2013…

腾讯一天的生活……

很多小伙伴好奇腾讯的工作节奏&#xff0c;这确实也是选择一家公司或部门的重要指标。当初去头条就是被薪酬蒙蔽了双眼&#xff0c;去了才知道工作强度到底有多强&#xff0c;走了不少冤枉路。为了让大家心里有个底&#xff0c;今天就来给大家介绍下在腾讯一天的生活。一日之计…

【进阶】Spring Boot配置文件(.properties提示有问题版)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、配置文件作用二、配置文件的格式三、properties配置文件说明1. properties 基本语法2. 读取配置文件3. properties缺点分析四、 yml配置文件说明1. yml基本语法2. yml使用进阶3. 注意&#xff1a;value值加单双引…

助眠好物推荐,帮助睡眠最好的办法

统计显示&#xff0c;在我国现阶段超3亿人存有失眠病&#xff0c;在其中近1/3的人要等到零晨1点之后才会入眠。忙学习培训、忙工作中、忙家中、忙社交媒体、忙加班加点……大白天&#xff0c;快速的生活的节奏产生各种各样工作压力&#xff0c;夜里&#xff0c;拥有是自身的可支…

提高效能 自我关怀的六个习惯(来自fastcompany)

追求和保持高效产出并不意味着按部就班的工作方式&#xff0c;又或者简单地记录下自己的每一个步骤。它的真正含义是自我关怀。在你做每一件事之前&#xff0c;以下的几条建议都能帮助到你。星期二上午8点&#xff0c;两位来自旧金山的企业家正在向未来投资者们介绍他们的商业方…