Minecraft 1.16.5模组开发(三十二) 自定义投掷物品实体
如果你了解过之前我们的实体开发教程,那么本次的教程会相对比较好理解。
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模组开发(三十二) 自定义投掷物品实体相关推荐
- Minecraft 1.16.5模组开发(三十四) 自定义载具
想在MC中开车吗?今天我们在MC中制作一辆车. 由于车辆是一个生物实体,所以要首先了解MC中的实体:我的世界实体教程 1.首先我们要制作一个车辆实体的模型(blockbench) 下载地址: 将模型导 ...
- Minecraft 1.16.5模组开发(三十八) 3D盔甲(新)
Minecraft升级到1.16.5后,3D盔甲的制作方法也跟之前版本稍有不同(主要在第二步.第四步),建议先复习一下往期教程: Minecraft 1.12.2模组开发(三十七) 3D盔甲 1.在b ...
- Minecraft 1.16.5模组开发(三十) 自定义成就系统(advancements)
我们本次将尝试在模组中加入属于自己的成就系统 1.打开Minecraft成就生成制作网站进行成就的制作 我的世界成就系统制作网站 在data包下新建advancement文件夹 -> 在文件夹中 ...
- Minecraft 1.12.2模组开发(三十九) 反应器(TileEntity方块实体)
说到方块实体(TileEntity),可以理解为一种功能性方块,比如熔炉,箱子,附魔台等. 我们今天来做一个类似于熔炉的反应器 熔炉逻辑: 放入燃料-> 放入物品 -> 获取产出物品 1. ...
- Minecraft 1.16.5模组开发(五十二) 修改原版生物战利品 (Loot Table)
我们今天尝试对原版中的一些生物的掉落物进行修改 1.我们本次修改的是原版中Zombie的掉落物,所以我们需要找到原版Zombie的战利品表: zombie.json {"type" ...
- Minecraft 1.16.5模组开发(三十一) 自定义建筑生成(structure) (新)
如果你学习过我们之前在1.12.2的建筑生成教程,那么对本次的教程的理解可能会相对轻松. 往期回顾 Minecraft 1.12.2模组开发(十四) 建筑生成 (structure generatio ...
- Minecraft 1.16.5模组开发(四十八) 传送门
Minecraft 1.18.2模组 传送门教程 我们今天在模组中实现一个传送门,让我们可以传送到自己的维度中.(文末附数据包下载链接) 1.在src\main\resources\data中新建一个 ...
- Minecraft 1.16.5模组开发(五十) 书籍词典 (Guide Book)
诸如冰与火之歌.深渊国度等模组,玩家往往可以通过使用模组中的参考书籍来达到快速上手的效果. 冰与火之歌异兽手记冰与火之歌异兽手记冰与火之歌异兽手记 我们今天在模组中实现一本模组参考书籍,方便其他玩家游 ...
- Minecraft 1.16.5模组开发(五十四) 方块探测器(Detector)
我们本次预计实现一个方块探测器,让其可以探测我们想要找到的方块. 1.我们希望将方块放下后,可以探测以其坐标为中心的16×16×16的范围内是否具有目标方块: 新建一个方块类BlockBFS,为了方便 ...
最新文章
- 寻找一个字符串的重复子串 后缀数组
- 用WidgeDuino创建一个SCADA(监控与数据採集)系统
- git 推送本地分支到远程分支 git push origin
- Android SQLite Database的使用模板
- Android MapView简单使用
- Java进阶之对象克隆(复制)
- 风暴事件处理器–每个工作者的GC日志文件
- 虚拟机使用计算机网络,虚拟机技术在计算机网络专业课程教学中的应用
- 逝去的大学生活自己丢了什么
- redistemplate使用_SpringBoot 使用 Redis 缓存
- azure云数据库_Azure SQL数据库中的高级数据安全性–数据发现和分类
- nand ECC 算法记录
- 【单片机】51单片机烧录那些事儿
- Loading 加载中 图片素材
- Maven的安装与配置
- java工程师认证_Java工程师认证工信部考试.doc
- AutoPatch java_EBS开发技术之Patch安装
- MacBook Pro 2018款充电口不能用解决办法
- 支付宝支付二维码显示在商家网站页面,不跳转到支付宝?
- Poser 2014 PRO SR1 资料收集
热门文章
- .net程序员求职简历
- PMI-ACP练习题(13)
- ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge
- 蓝奏云网盘下载链接无法打开的解决方法(详解 全)
- gensim-fast2vec改造、灵活使用大规模外部词向量(具备OOV查询能力)
- Apache ShardingSphere-JDBC基本教程
- 14.利用虚函数实现多态性来求正方体、球体和圆柱体的表面积和体积。
- 阿里正式启动2021届春季校招!java算法工程师,看完跪了
- oracle 京东,【京东工资】oracle dba待遇-看准网
- 阿里云使用体验-阿里云开发者社区