当前位置:首页 > CN2资讯 > 正文内容

我的世界could not create java virtual machine 我的世界1.19基岩版下载

4天前CN2资讯


Minecraft 1.16.5模组开发3D盔甲

Minecraft 1.12.2模组开发3D盔甲

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

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


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

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

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 nonstop if (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 item List<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 slots List<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" }) @Override public void registerControllers(AnimationData data) { data.addAnimationController(new AnimationController(this, "controller", 20, this::predicate)); } @Override public 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> { //盔甲模型文件地址 @Override public ResourceLocation getModelResource(ChandlierArmorItem object) { return new ResourceLocation(Main.MOD_ID, "geo/chandlier.geo.json"); } //盔甲材质文件地址 @Override public ResourceLocation getTextureResource(ChandlierArmorItem object) { return new ResourceLocation(Main.MOD_ID, "textures/models/armor/chandlier_layer_1.png"); } //盔甲动画文件地址 @Override public 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{ @SubscribeEvent public 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.保存所有文件 -> 进行测试:

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


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21780.html

    分享给朋友:

    “我的世界could not create java virtual machine 我的世界1.19基岩版下载” 的相关文章

    CN2中转:提高数据传输效率的最佳选择

    CN2中转概述 当我第一次接触CN2中转时,我就被它的高效和可靠性所吸引。CN2中转是一种通过中国电信的CN2线路进行数据传输的方式。这条线路不仅仅是简单的网络连接,它被誉为“二类全业务”数据专线,能够提供高速、低时延、低抖动和低丢包率的优质网络服务。帮助用户更好地访问境外数据,这一点让我感到它的重...

    LightLayer云服务器评测与应用案例分析

    在我日常工作中,云服务器的选择至关重要,而我最近了解到的LightLayer云服务器,给我留下了深刻的印象。作为Megalayer旗下的品牌,LightLayer在全球多个重要地点部署了服务器,尤其是在美国洛杉矶、中国台湾台北和菲律宾马尼拉。这些选择不仅为用户提供了更快速的访问速度,也为他们的云计算...

    DigitalOcean与Vultr的全面比较与选择建议

    DigitalOcean与Vultr概述 1.1 DigitalOcean简介 DigitalOcean成立于2012年,总部位于美国纽约,这家公司一开始就定位于为开发者提供高效的云计算服务。最初的目标是简化云计算,让更多人能够轻松使用这一新兴技术。随着时间的推移,DigitalOcean不断扩展其...

    LeaseWeb旧金山数据中心:为企业提供高效IT基础设施解决方案

    在谈到全球范围内的IT基础设施解决方案时,LeaseWeb无疑是一个重要的名字。成立于荷兰的LeaseWeb,凭借其卓越的服务和强大的网络能力,已经发展成为一家全球性的科技公司。它不仅提供传统的独立服务器服务,还涵盖了云计算、服务器托管等多样化的解决方案。对我而言,LeaseWeb就像是一座桥梁,连...

    Zolerani云服务器评测与市场分析:高性价比的选择

    Zolerani是一个充满活力的云服务器品牌,属于葡萄牙的HLISTAN ZOLERANI, UNIPESSOAL LDA公司旗下。最近,我对这个品牌进行了深入的研究,发现它在全球VPS云服务器市场上取得了显著的发展。Digitalcloud是Zolerani的主打品牌,于2023年2月正式成立,专...

    莱卡云:高性价比云服务器解决方案,助力企业发展

    莱卡云概述 莱卡云,这个名字你或许已经听说过。成立于2019年,它在云计算服务领域迅速崭露头角,成为一些企业的首选合作伙伴。凭借持有的多个《中华人民共和国增值电信业务经营许可证》,莱卡云有效地展开了多种多样的服务,充分满足了市场需求。与三大公有云的合作让它在竞争激烈的市场中站稳了脚跟,提供的解决方案...