好几天没更新教程也是因为这几天都在研究投掷物
终于小有成果来写一篇教程
1.新建Entity
创建如下3个包
 
 
在Entity内新建一个EntityIcebullet.java
并继承EntityThrowable,把必要的构造函数和onImpact复写一下
public class EntityIcebullet extends EntityThrowable{
public EntityIcebullet(World worldIn){
super(worldIn);
}
public EntityIcebullet(World worldIn, EntityLivingBase throwerIn){
super(worldIn, throwerIn);
}
public EntityIcebullet(World worldIn, double x, double y, double z){
super(worldIn, x, y, z);
}
@Override
protected void onImpact(RayTraceResult result) {
                
}
}
1.新建Render
接下来到Render包下面创建RenderIcebullet.java,继承 RenderSnowball
public class RenderIcebullet extends RenderSnowball<EntityIcebullet>{
public RenderIcebullet(RenderManager renderManagerIn, Item itemIn, RenderItem itemRendererIn) {
super(renderManagerIn, itemIn, itemRendererIn);
}
}
构造函数里的RenderItem项我们直接改成Minecraft.getMinecraft().getRenderItem()
物品也直接给定为原版的雪球
public class RenderIcebullet extends RenderSnowball<EntityIcebullet>{
public RenderIcebullet(RenderManager renderManagerIn) {
super(renderManagerIn,Items.SNOWBALL, Minecraft.getMinecraft().getRenderItem());
}
}
3.注册
我们先回到Main里创建一个Main实例
public class Main {
        
@Instance(Name.MOD_ID)
public static Main instance;
        
@SidedProxy(clientSide = Name.CLIENT_PROXY_CLASS,serverSide = Name.SERVER_PROXY_CLASS)
再创建一个注册入口文件
 
 
在ModEntity里面输入
public class ModEntity {
public static void init(){
}
public static void register(){
}
        
private static int entityID = 0;
        
public static void initregister(String name,Class<? extends Entity> entityClass ,int r,int tick ,boolean sendupdata){
final ResourceLocation registryName = new ResourceLocation(Name.MOD_ID, name);
EntityRegistry.registerModEntity(registryName, entityClass, registryName.toString(), entityID++, Main.instance, r, tick, sendupdata);
}
}
initregister方法是方便我们以后注册多个实体简化代码
好,现在把注册信息填进去
public static void init(){
initregister("icebullet", EntityIcebullet.class, 64, 10, true);
}
        
public static void register(){
RenderingRegistry.registerEntityRenderingHandler(EntityIcebullet.class, renderManager -> new RenderIcebullet(renderManager));
}
"icebullet":实体名称
EntityIcebullet.class:实体文件
64:渲染距离(距离玩家64格内开始渲染)
20:逻辑更新频率,和渲染频率无关(单位=1tick?)
true:是否传输动态位置更新?
init方法拿来注册Entity,而register()注册Render
所以很明显init()丢到Main去读取
register()丢到ClientProxy去读取
Main.java
@EventHandler
public void preInit(FMLPreInitializationEvent event){
ModItems.init();
ModEntity.init();
ModAchivenent.init();
proxy.init();
}
ClientProxy.java
public void init(){
ModItems.register();
ModEntity.register();
}
现在我们的Icebullet已经注册完毕存在于mc里了
但是我们还没有一个让他出来的方法
所以我们先用ItemIceicon右击时生产一个Icebullet
ItemIceicon.java
@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
ItemStack item = player.getHeldItemMainhand();
player.addStat(ModAchivenent.iceSkillslist[item.getMetadata()]);
            
if(!world.isRemote && item.getMetadata() == 0){
EntityIcebullet icebullet = new EntityIcebullet(world, player);
icebullet.setHeadingFromThrower(player, player.rotationPitch, player.rotationYaw, 0.0F, 1.5F, 1.0F);
world.spawnEntityInWorld(icebullet);
}
return super.onItemRightClick(world, player, hand);
}
我们用getMetadata()判断只有Metadata为0的呢个物品可以释放冰弹
这里要!world.isRemote一下不然一下子射出两个,然后其中一个又会突然消失
呢个消失的其实就是客户端生成的,但和服务端同步数据后发现不对则么
多了一颗,然后他就消失了
而前面获取成就客户端有没有执行其实没什么影响所以我就没限制了
 
 
现在就可以看到一个雪球被丢出去咯!
然而现在的渲染还是十分简单,一个物品贴图
而且不管以什么角度看都是呢个物品贴图
而下一章,我们要把他做成像箭一样的立体渲染
源代码
 src_教程9.rar
(25.89 KB, 下载次数: 30)
src_教程9.rar
(25.89 KB, 下载次数: 30)
 
终于小有成果来写一篇教程
1.新建Entity
创建如下3个包
 
在Entity内新建一个EntityIcebullet.java
并继承EntityThrowable,把必要的构造函数和onImpact复写一下
public class EntityIcebullet extends EntityThrowable{
public EntityIcebullet(World worldIn){
super(worldIn);
}
public EntityIcebullet(World worldIn, EntityLivingBase throwerIn){
super(worldIn, throwerIn);
}
public EntityIcebullet(World worldIn, double x, double y, double z){
super(worldIn, x, y, z);
}
@Override
protected void onImpact(RayTraceResult result) {
}
}
1.新建Render
接下来到Render包下面创建RenderIcebullet.java,继承 RenderSnowball
public class RenderIcebullet extends RenderSnowball<EntityIcebullet>{
public RenderIcebullet(RenderManager renderManagerIn, Item itemIn, RenderItem itemRendererIn) {
super(renderManagerIn, itemIn, itemRendererIn);
}
}
构造函数里的RenderItem项我们直接改成Minecraft.getMinecraft().getRenderItem()
物品也直接给定为原版的雪球
public class RenderIcebullet extends RenderSnowball<EntityIcebullet>{
public RenderIcebullet(RenderManager renderManagerIn) {
super(renderManagerIn,Items.SNOWBALL, Minecraft.getMinecraft().getRenderItem());
}
}
3.注册
我们先回到Main里创建一个Main实例
public class Main {
@Instance(Name.MOD_ID)
public static Main instance;
@SidedProxy(clientSide = Name.CLIENT_PROXY_CLASS,serverSide = Name.SERVER_PROXY_CLASS)
再创建一个注册入口文件
 
在ModEntity里面输入
public class ModEntity {
public static void init(){
}
public static void register(){
}
private static int entityID = 0;
public static void initregister(String name,Class<? extends Entity> entityClass ,int r,int tick ,boolean sendupdata){
final ResourceLocation registryName = new ResourceLocation(Name.MOD_ID, name);
EntityRegistry.registerModEntity(registryName, entityClass, registryName.toString(), entityID++, Main.instance, r, tick, sendupdata);
}
}
initregister方法是方便我们以后注册多个实体简化代码
好,现在把注册信息填进去
public static void init(){
initregister("icebullet", EntityIcebullet.class, 64, 10, true);
}
public static void register(){
RenderingRegistry.registerEntityRenderingHandler(EntityIcebullet.class, renderManager -> new RenderIcebullet(renderManager));
}
"icebullet":实体名称
EntityIcebullet.class:实体文件
64:渲染距离(距离玩家64格内开始渲染)
20:逻辑更新频率,和渲染频率无关(单位=1tick?)
true:是否传输动态位置更新?
init方法拿来注册Entity,而register()注册Render
所以很明显init()丢到Main去读取
register()丢到ClientProxy去读取
Main.java
@EventHandler
public void preInit(FMLPreInitializationEvent event){
ModItems.init();
ModEntity.init();
ModAchivenent.init();
proxy.init();
}
ClientProxy.java
public void init(){
ModItems.register();
ModEntity.register();
}
现在我们的Icebullet已经注册完毕存在于mc里了
但是我们还没有一个让他出来的方法
所以我们先用ItemIceicon右击时生产一个Icebullet
ItemIceicon.java
@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
ItemStack item = player.getHeldItemMainhand();
player.addStat(ModAchivenent.iceSkillslist[item.getMetadata()]);
if(!world.isRemote && item.getMetadata() == 0){
EntityIcebullet icebullet = new EntityIcebullet(world, player);
icebullet.setHeadingFromThrower(player, player.rotationPitch, player.rotationYaw, 0.0F, 1.5F, 1.0F);
world.spawnEntityInWorld(icebullet);
}
return super.onItemRightClick(world, player, hand);
}
我们用getMetadata()判断只有Metadata为0的呢个物品可以释放冰弹
这里要!world.isRemote一下不然一下子射出两个,然后其中一个又会突然消失
呢个消失的其实就是客户端生成的,但和服务端同步数据后发现不对则么
多了一颗,然后他就消失了
而前面获取成就客户端有没有执行其实没什么影响所以我就没限制了
 
现在就可以看到一个雪球被丢出去咯!
然而现在的渲染还是十分简单,一个物品贴图
而且不管以什么角度看都是呢个物品贴图
而下一章,我们要把他做成像箭一样的立体渲染
源代码