如果你了解过之前我们的实体开发教程,那么本次的教程会相对比较好理解。

Minecraft 1.12.2模组开发(七) 实体(魔改Zombie)

我们本次将参考雪球在MC中制作一个属于我们自己的可投掷实体。

雪球(Snowball)-[MC] 我的世界原版 (Minecraft)

1.首先,我们要知道,我们的可投掷物品是一个实体,所以我们需要对这个实体进行建模

可以使用BlockBench进行建模工作:
BlockBench下载地址

相关教程

国外中英字幕
酒石酸菌(国人大神%%%)

使用BlockBench进行实体建模工作:

之后导出物品模型

将我们的模型.json文件放入resources\assets\模组名\models\item文件夹下:

2.在entity包下创建投掷物实体类(以EntityM1897B为例):

在EntityM1897B.java中编写代码:

package com.joy187.re8joymod.common.entity;import com.joy187.re8joymod.common.init.EntityInit;
import com.joy187.re8joymod.common.init.ModItems;
import io.netty.buffer.Unpooled;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.monster.BlazeEntity;
import net.minecraft.entity.monster.RavagerEntity;
import net.minecraft.entity.monster.WitherSkeletonEntity;
import net.minecraft.entity.projectile.ProjectileItemEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.IPacket;
import net.minecraft.network.PacketBuffer;
import net.minecraft.particles.IParticleData;
import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.EntityRayTraceResult;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.network.NetworkHooks;public class EntityM1897B extends ProjectileItemEntity {public int explosionPower = 1,id=91087;public Entity shootingEntity;private double damage;public EntityM1897B(EntityType<? extends EntityM1897B> p_i50159_1_, World p_i50159_2_) {super(p_i50159_1_, p_i50159_2_);this.damage=2.5;}public EntityM1897B(World world, LivingEntity entity) {super(EntityInit.M1897B.get(), entity, world);this.damage=5;}public EntityM1897B(World p_i1775_1_, double p_i1775_2_, double p_i1775_4_, double p_i1775_6_) {super(EntityInit.M1897B.get(), p_i1775_2_, p_i1775_4_, p_i1775_6_, p_i1775_1_);}//打击到生物上产生的效果protected void onHitEntity(EntityRayTraceResult p_213868_1_) {super.onHitEntity(p_213868_1_);Entity entity = p_213868_1_.getEntity();int i = 5;if(entity instanceof BlazeEntity || entity instanceof WitherSkeletonEntity){i = 7;}if(entity instanceof EntityEthan || entity instanceof EntityHeisen || entity instanceof EntityFrank6){i= 9;}if(entity instanceof EntitySamca || entity instanceof EntityFrank4){i= 3;}entity.hurt(DamageSource.thrown(this, this.getOwner()), (float)(i+random.nextFloat()*0.5*this.damage));}//投掷物撞击到物体所产生的效果protected void onHit(RayTraceResult p_70227_1_) {super.onHit(p_70227_1_);if (!this.level.isClientSide) {this.level.broadcastEntityEvent(this, (byte)3);//你可以增加爆炸效果
//            this.level.explode((Entity)null, this.getX(), this.getY(), this.getZ(), (float)this.explosionPower, false, Explosion.Mode.DESTROY);this.remove();}}//投掷物产生的粒子效果@OnlyIn(Dist.CLIENT)private IParticleData getParticle() {ItemStack itemstack = this.getItemRaw();return (IParticleData)(itemstack.isEmpty() ? ParticleTypes.FLAME : new ItemParticleData(ParticleTypes.ITEM, itemstack));}@OnlyIn(Dist.CLIENT)public void handleEntityEvent(byte p_70103_1_) {if (p_70103_1_ == 3) {IParticleData iparticledata = this.getParticle();for(int i = 0; i < 8; ++i) {this.level.addParticle(iparticledata, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D);}}}@Overrideprotected Item getDefaultItem() {return ModItems.M1897B.get();}//这个函数很重要,因为我们的投掷物实体不被原版所识别,所以需要将数据包专门传给EventBusSubscriber进行处理@Overridepublic IPacket<?> getAddEntityPacket() {PacketBuffer pack = new PacketBuffer(Unpooled.buffer());pack.writeDouble(getX());pack.writeDouble(getY());pack.writeDouble(getZ());pack.writeInt(getId());pack.writeUUID(getUUID());return NetworkHooks.getEntitySpawningPacket(this);}public IPacket<?> getEntitySpawningPacket() {return NetworkHooks.getEntitySpawningPacket(this);}}

3.创建完实体之后,需要对实体进行渲染,在render包下新建实体渲染类(以RenderM1897B为例):

在RenderM1897B.java中编写:

package com.joy187.re8joymod.common.entity.render;import com.joy187.re8joymod.Utils;
import com.joy187.re8joymod.common.entity.EntityM1897B;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Matrix3f;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.fml.client.registry.IRenderFactory;public class RenderM1897B extends EntityRenderer<EntityM1897B> {//这个是我们的投掷物的贴图,一般放在我们贴图文件夹下的生物文件夹内public static final ResourceLocation TEXTURE = new ResourceLocation(Utils.MOD_ID ,"textures/entity/m1897.png");private static final RenderType field_229044_e_ = RenderType.entityCutoutNoCull(TEXTURE);public RenderM1897B(EntityRendererManager manager) {super(manager);}protected int getSkyLightLevel(EntityM1897B p_239381_1_, BlockPos p_239381_2_) {return 15;}public void render(EntityM1897B entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) {matrixStackIn.pushPose();matrixStackIn.scale(2.0F, 2.0F, 2.0F);matrixStackIn.mulPose(this.entityRenderDispatcher.cameraOrientation());matrixStackIn.mulPose(Vector3f.YP.rotationDegrees(180.F));MatrixStack.Entry matrixstack$entry = matrixStackIn.last();Matrix4f matrix4f = matrixstack$entry.pose();Matrix3f matrix3f = matrixstack$entry.normal();IVertexBuilder ivertexbuilder = bufferIn.getBuffer(field_229044_e_);func_229045_a_(ivertexbuilder, matrix4f, matrix3f, packedLightIn, 0.0F, 0, 0, 1);func_229045_a_(ivertexbuilder, matrix4f, matrix3f, packedLightIn, 1.0F, 0, 1, 1);func_229045_a_(ivertexbuilder, matrix4f, matrix3f, packedLightIn, 1.0F, 1, 1, 0);func_229045_a_(ivertexbuilder, matrix4f, matrix3f, packedLightIn, 0.0F, 1, 0, 0);matrixStackIn.popPose();super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn);}@Overridepublic ResourceLocation getTextureLocation(EntityM1897B  p_110775_1_) {return TEXTURE;}private static void func_229045_a_(IVertexBuilder p_229045_0_, Matrix4f p_229045_1_, Matrix3f p_229045_2_, int p_229045_3_, float p_229045_4_, int p_229045_5_, int p_229045_6_, int p_229045_7_) {p_229045_0_.vertex(p_229045_1_, p_229045_4_ - 0.5F, (float)p_229045_5_ - 0.25F, 0.0F).color(255, 255, 255, 255).overlayCoords(OverlayTexture.NO_OVERLAY).normal(p_229045_2_, 0.0F, 1.0F, 0.0F).endVertex();}//对物品进行游戏内渲染工作public static class RenderFactory implements IRenderFactory<EntityM1897B> {@Overridepublic EntityRenderer<? super EntityM1897B> createRenderFor(EntityRendererManager manager) {manager.setRenderShadow(false);return new RenderM1897B(manager);}}
}

4.在EntityInit.java中添加我们的投掷物的制作信息

//注意我们的投掷类物品不是生物,所以分类为MISC
public static final RegistryObject<EntityType<EntityM1851B>> M1897B =ENTITY_TYPES.register("m1897b", () -> EntityType.Builder.<EntityM1851B>of(EntityM1851B::new, EntityClassification.MISC).sized(0.25F, 0.25F).setTrackingRange(4).updateInterval(10).build("m1897"));

5.在ClientModEventSubscriber.java中添加我们的实体注册信息:

        //注意可投掷实体不是真的生物所以要用SpriteRenderer进行渲染RenderingRegistry.registerEntityRenderingHandler(EntityInit.M1897B.get(),renderManager -> new SpriteRenderer(renderManager, Minecraft.getInstance().getItemRenderer()));

6.我们的投掷物品是一个物品,所以需要创建一个专门的物品类(以ItemM1897B为例)

在Items包下新建ItemM1897B.java,在文件中编写:

package com.joy187.re8joymod.common.items;import com.joy187.re8joymod.common.entity.EntityM1897B;
import com.joy187.re8joymod.events.RegistryEvents;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;public class ItemM1897B extends Item {public ItemM1897B() {super(new Properties().tab(RegistryEvents.RE8GROUP).stacksTo(16));}//我们的投掷类物品类似于箭,所以可以参考箭的相关代码public EntityM1897B createArrow(World p_200887_1_, ItemStack p_200887_2_, LivingEntity p_200887_3_) {EntityM1897B arrowentity = new EntityM1897B(p_200887_1_, p_200887_3_);return arrowentity;}//判断我们的子弹是否有限(比如创造模式下一根箭就代表着无限支箭)public boolean isInfinite(ItemStack stack, ItemStack bow, net.minecraft.entity.player.PlayerEntity player) {int enchant = net.minecraft.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.enchantment.Enchantments.INFINITY_ARROWS, bow);return enchant <= 0 ? false : this.getClass() == ItemM1897B.class;}
}

在ModItems包下添加物品的注册信息:

    public static RegistryObject<Item> M1897B = ITEMS.register("m1897b",()->{return new ItemM1897B();});

7.在resources包中的en_us.json文件中添加物品的语言信息:

  "item.re8joymod.m1897b":"Shotgun Bullet","entity.re8joymod.m1897b": "Shotgun Bullet",

8.至此所有的代码工作已经结束,进入游戏进行演示:

首先将我们的物品丢出来进行展示:

使用枪支将可投掷物品射出去:

MC枪支制作教程

OK,大功告成!

Minecraft 1.16.5模组开发(三十二) 自定义投掷物品实体相关推荐

  1. Minecraft 1.16.5模组开发(三十四) 自定义载具

    想在MC中开车吗?今天我们在MC中制作一辆车. 由于车辆是一个生物实体,所以要首先了解MC中的实体:我的世界实体教程 1.首先我们要制作一个车辆实体的模型(blockbench) 下载地址: 将模型导 ...

  2. Minecraft 1.16.5模组开发(三十八) 3D盔甲(新)

    Minecraft升级到1.16.5后,3D盔甲的制作方法也跟之前版本稍有不同(主要在第二步.第四步),建议先复习一下往期教程: Minecraft 1.12.2模组开发(三十七) 3D盔甲 1.在b ...

  3. Minecraft 1.16.5模组开发(三十) 自定义成就系统(advancements)

    我们本次将尝试在模组中加入属于自己的成就系统 1.打开Minecraft成就生成制作网站进行成就的制作 我的世界成就系统制作网站 在data包下新建advancement文件夹 -> 在文件夹中 ...

  4. Minecraft 1.12.2模组开发(三十九) 反应器(TileEntity方块实体)

    说到方块实体(TileEntity),可以理解为一种功能性方块,比如熔炉,箱子,附魔台等. 我们今天来做一个类似于熔炉的反应器 熔炉逻辑: 放入燃料-> 放入物品 -> 获取产出物品 1. ...

  5. Minecraft 1.16.5模组开发(五十二) 修改原版生物战利品 (Loot Table)

    我们今天尝试对原版中的一些生物的掉落物进行修改 1.我们本次修改的是原版中Zombie的掉落物,所以我们需要找到原版Zombie的战利品表: zombie.json {"type" ...

  6. Minecraft 1.16.5模组开发(三十一) 自定义建筑生成(structure) (新)

    如果你学习过我们之前在1.12.2的建筑生成教程,那么对本次的教程的理解可能会相对轻松. 往期回顾 Minecraft 1.12.2模组开发(十四) 建筑生成 (structure generatio ...

  7. Minecraft 1.16.5模组开发(四十八) 传送门

    Minecraft 1.18.2模组 传送门教程 我们今天在模组中实现一个传送门,让我们可以传送到自己的维度中.(文末附数据包下载链接) 1.在src\main\resources\data中新建一个 ...

  8. Minecraft 1.16.5模组开发(五十) 书籍词典 (Guide Book)

    诸如冰与火之歌.深渊国度等模组,玩家往往可以通过使用模组中的参考书籍来达到快速上手的效果. 冰与火之歌异兽手记冰与火之歌异兽手记冰与火之歌异兽手记 我们今天在模组中实现一本模组参考书籍,方便其他玩家游 ...

  9. Minecraft 1.16.5模组开发(五十四) 方块探测器(Detector)

    我们本次预计实现一个方块探测器,让其可以探测我们想要找到的方块. 1.我们希望将方块放下后,可以探测以其坐标为中心的16×16×16的范围内是否具有目标方块: 新建一个方块类BlockBFS,为了方便 ...

最新文章

  1. 寻找一个字符串的重复子串 后缀数组
  2. 用WidgeDuino创建一个SCADA(监控与数据採集)系统
  3. git 推送本地分支到远程分支 git push origin
  4. Android SQLite Database的使用模板
  5. Android MapView简单使用
  6. Java进阶之对象克隆(复制)
  7. 风暴事件处理器–每个工作者的GC日志文件
  8. 虚拟机使用计算机网络,虚拟机技术在计算机网络专业课程教学中的应用
  9. 逝去的大学生活自己丢了什么
  10. redistemplate使用_SpringBoot 使用 Redis 缓存
  11. azure云数据库_Azure SQL数据库中的高级数据安全性–数据发现和分类
  12. nand ECC 算法记录
  13. 【单片机】51单片机烧录那些事儿
  14. Loading 加载中 图片素材
  15. Maven的安装与配置
  16. java工程师认证_Java工程师认证工信部考试.doc
  17. AutoPatch java_EBS开发技术之Patch安装
  18. MacBook Pro 2018款充电口不能用解决办法
  19. 支付宝支付二维码显示在商家网站页面,不跳转到支付宝?
  20. Poser 2014 PRO SR1 资料收集

热门文章

  1. .net程序员求职简历
  2. PMI-ACP练习题(13)
  3. ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge
  4. 蓝奏云网盘下载链接无法打开的解决方法(详解 全)
  5. gensim-fast2vec改造、灵活使用大规模外部词向量(具备OOV查询能力)
  6. Apache ShardingSphere-JDBC基本教程
  7. 14.利用虚函数实现多态性来求正方体、球体和圆柱体的表面积和体积。
  8. 阿里正式启动2021届春季校招!java算法工程师,看完跪了
  9. oracle 京东,【京东工资】oracle dba待遇-看准网
  10. 阿里云使用体验-阿里云开发者社区