Minecraft 1.16.5模组开发3D盔甲

Minecraft 1.12.2模组开发3D盔甲

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

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


效果演示 效果演示 效果演示

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'//添加这个implementation fg.deobf('software.bernie.geckolib:geckolib-forge-1.19:3.1.36')
}

之后我们重新构建gradle项目

构建好了项目后在项目的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,并下载这个插件

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

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

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

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

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中添加盔甲的手持贴图:

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

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

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

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

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

Minecraft 1.19.2 Forge模组开发 10.3D动画盔甲相关推荐

  1. Minecraft 1.19.2 Forge模组开发 05.矿石生成

    我们本次尝试在主世界生成模组中自定义的矿石 1.由于1.19的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com ...

  2. Minecraft 1.19.2 Forge模组开发 04.动画效果物品

    我们本次实现一个具有动画效果的物品,本次演示的模型代码均在文末给出 效果演示效果演示效果演示 首先,请确保你的开发包中引入了geckolib依赖,相关教程请参考:Minecraft 1.19.2 Fo ...

  3. Minecraft 1.19.2 Forge模组开发 08.生物生成

    Minecraft 1.18.2 生物生成 我们今天尝试在1.19中生成模组中的生物 效果演示效果演示效果演示 1.在你的项目主类中的commonSetup方法中添加模组中生物的生成规则(可参考文末M ...

  4. Minecraft 1.19.2 Forge模组开发 02.物品栏+方块+物品

    今天是1024程序员日,我们尝试在1.19.2的模组中实现物品栏.方块和物品 1.在项目主类Main.java中添加物品栏声明,同时将物品和方块的类进行注册: Main.java package co ...

  5. Minecraft 1.19.2 Forge模组开发 12.自定义鞘翅

    本次我们在模组中实现一个可用于飞行的鞘翅. 1.首先参考3D动画盔甲的教程一.二步制作盔甲的模型.动画文件. 2.模型制作完成,接下来需要制作我们的盔甲类 在items包中新建armor包 -> ...

  6. Minecraft 1.19.2 Forge模组开发 03.动画生物实体

    1.12.2动画生物实体教程 1.16.5动画生物实体教程 1.18.2动画生物实体教程 效 果 展 示 效果展示 效果展示 我们本次尝试在1.19.2中添加一个能够具有各种动画效果动作的生物实体. ...

  7. Minecraft 1.19.2 Forge模组开发 07.拼图建筑(jigsaw)

    如果你看过之前的Minecraft 1.19.2建筑生成的话,想必会更好理解这篇教程. 效果演示效果演示效果演示 1.我们本期准备生成的建筑分为4块,所以首先需要用4个结构方块将整个建筑包括起来: 2 ...

  8. Minecraft 1.19.2 Forge模组开发 06.建筑生成

    1.12.2自定义建筑生成 1.16.5自定义建筑生成 1.18.2自定义建筑生成 我们本次尝试在主世界生成一个自定义的建筑. 效 果 展 示 效果展示 效果展示 由于版本更新缘故,1.19的建筑生成 ...

  9. Minecraft 1.19.2 Fabric模组开发 10.建筑生成

    我们本次尝试在Fabric 1.19.2中生成一个自定义的建筑. 效果展示 效果展示 效果展示 由于版本更新缘故,1.19的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定 ...

最新文章

  1. 深入学习jQuery描述文本内容的3个方法
  2. 计算机三级网络技术查漏补缺
  3. stm32中使用#pragma pack(非常有用的字节对齐用法说明)
  4. Just write about
  5. Sublime Text 3 快捷键总结(拿走)
  6. 一个走过太多坑的老弟对面向对象知识的总结:世上无难事,有的真不行
  7. 【SpringBoot 2】(十一)单元测试JUnit 5 指标监控
  8. Zookeeper 的 5 大核心知识点!
  9. haml VS erb
  10. python 计算物理_计算物理期末报告
  11. 转一篇人生感悟,写的很好
  12. python之列表方法大全
  13. Hadoop之使用LZO压缩并支持分片
  14. 学习手册--没必要装模做样,只有你自己最清楚
  15. 新产品Digi XBee RR无线模块迁移指南
  16. 正点原子潘多拉上STlinkV2.1固件遇到的坑
  17. Exchange 2013 配置MAPI OVER HTTP
  18. net::ERR_CONNECTION_TIMED_OUT 网络连接超时
  19. sqoop迁移oracle数据到TDH
  20. [.NET][ASP.NET MVC 5 网站开发之美]书籍内容介绍及pdf下载

热门文章

  1. 去掉h5播放器中voide标签中的下载按钮
  2. 【AJAX 笔记】AJAX 基本、HTTP 基本、原生 AJAX 的使用,jQuery / Axios / fetch 发送请求、跨域(JSONP/CORS)
  3. Linux 中保存/不保存退出vi,vim编辑
  4. ASP后门、***清理
  5. java内存溢出原因及解决_java内存溢出的原因和解决方法
  6. 【工控老马】详解OPC协议-工业控制和自动化领域的接口标准
  7. 苹果怎么换字体_苹果手机电池容量还剩80,什么时候换很省钱,听卖手机小哥怎么说...
  8. Spring如何整合Mybatis?
  9. VM设置虚拟机网段与主机在同一网段
  10. Unity3D animation import issue | 模型导入,动画无法播放问题