Сегодня мы делаем долгожданного моба.
Начнем! Мы будем использовать модель человека.
Для начала создаем прокси(урок 17)
Регистрируем ID яйца спавна. под названием
startEntityIdДалее в лоад пишем это
EntityRegistry.registerModEntity(EntityMan.class, "Man", 0, this, 80, 3, true);
EntityRegistry.addSpawn(EntityMan.class, 10, 2, 4, EnumCreatureType.monster, BiomeGenBase.desert, BiomeGenBase.desertHills, BiomeGenBase.forest);
LanguageRegistry.instance().addStringLocalization("entity.TestMod.Man.name", "Man Mob");
registerEntityEgg(EntityMan.class, 0xffffff, 0x000000);
Разберем!
EntityRegistry.registerModEntity(EntityMan.class, "Man", 0, this, 80, 3, true);
Регистрация моба
EntityMan.class - класс нашего моба
Man - название (дальше будет использоваться при регистрации)
0 - ID моба (ЕСЛИ ДЕЛАТЬ ЕЩЕ Entity(Моб, стрела и т.д.) то ставим ID другой)
EntityRegistry.addSpawn(EntityMan.class, 10, 2, 4, EnumCreatureType.monster, BiomeGenBase.desert, BiomeGenBase.desertHills, BiomeGenBase.forest);
10 - редкость
2 - минимум мобов в чанке
4 - максимум мобов в чанке
EnumCreatureType.monster - моб - злой, спавн - ночью
BiomeGenBase.desert..... - биомы спавна
LanguageRegistry.instance().addStringLocalization("entity.TestMod.Man.name", "Man Mob")
TestMod - id мода который вы указали вверху главного класса
registerEntityEgg(EntityMan.class, 0xffffff, 0x000000);
Цвета яйца
Теперь после функции load(ну после этого
}) пишем
public static int getUniqueEntityId()
{
do
{
startEntityId++;
}
while (EntityList.getStringFromID(startEntityId) != null);
return startEntityId;
}
public static void registerEntityEgg(Class entity, int primaryColor, int secondaryColor)
{
int id = getUniqueEntityId();
EntityList.IDtoClassMapping.put(id, entity);
EntityList.entityEggs.put(id, new EntityEggInfo(id, primaryColor, secondaryColor));
}
Это получение цвета яйца спана
Дальше делаем класс
EntityMan
package ru.testmod.src;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EnumCreatureAttribute;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIBreakDoor;
import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.entity.ai.EntityAINearestAttackableTarget;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class EntityMan extends EntityMob
{
public EntityMan(World par1World)
{
super(par1World);
this.texture = "/mods/testmod/textures/man.png";
this.moveSpeed = 0.25F;
this.tasks.addTask(0, new EntityAISwimming(this));
this.tasks.addTask(1, new EntityAIBreakDoor(this));
this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, this.moveSpeed, false));
this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F));
this.tasks.addTask(4, new EntityAIWander(this, this.moveSpeed));
this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 16.0F, 0, true));
}
public int getAttackStrength(Entity par1Entity) { return 4; }
protected boolean isAIEnabled()
{
return true;
}
public int getMaxHealth()
{
return 20;
}
public int getTotalArmorValue()
{
return 2;
}
public void onLivingUpdate()
{
if (this.worldObj.isDaytime() && !this.worldObj.isRemote && !this.isChild())
{
float var1 = this.getBrightness(1.0F);
if (var1 > 0.5F && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)))
{
boolean var2 = true;
ItemStack var3 = this.getCurrentItemOrArmor(4);
if (var3 != null)
{
if (var3.isItemStackDamageable())
{
var3.setItemDamage(var3.getItemDamageForDisplay() + this.rand.nextInt(2));
if (var3.getItemDamageForDisplay() >= var3.getMaxDamage())
{
this.renderBrokenItemStack(var3);
this.setCurrentItemOrArmor(4, (ItemStack)null);
}
}
var2 = false;
}
if (var2)
{
this.setFire(8);
}
}
}
super.onLivingUpdate();
}
protected String getLivingSound()
{
return "mob.zombie.say";
}
protected String getHurtSound()
{
return "mob.zombie.hurt";
}
protected String getDeathSound()
{
return "mob.zombie.death";
}
protected void playStepSound(int par1, int par2, int par3, int par4)
{
this.worldObj.playSoundAtEntity(this, "mob.zombie.step", 0.15F, 1.0F);
}
protected void dropRareDrop(int par1)
{
switch (this.rand.nextInt(2))
{
case 0:
this.dropItem(Item.ingotIron.itemID, 1);
break;
case 1:
this.dropItem(Item.helmetSteel.itemID, 1);
break;
}
}
protected int getDropItemId()
{
return Item.diamond.itemID;
}
public EnumCreatureAttribute getCreatureAttribute()
{
return EnumCreatureAttribute.UNDEAD;
}
}
Разберем!
this.texture = "/mods/testmod/textures/man.png";
Путь к текстуре
this.moveSpeed = 0.25F;
Скорость
public int getAttackStrength(Entity par1Entity) { return 4; }
Сила атаки
public int getMaxHealth()
{
return 20;
}
Здоровье(в полусердечках)
public int getTotalArmorValue()
{
return 2;
}
Кол-во брони на мобе(защита)
public void onLivingUpdate()
{
if (this.worldObj.isDaytime() && !this.worldObj.isRemote && !this.isChild())
{
float var1 = this.getBrightness(1.0F);
if (var1 > 0.5F && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)))
{
boolean var2 = true;
ItemStack var3 = this.getCurrentItemOrArmor(4);
if (var3 != null)
{
if (var3.isItemStackDamageable())
{
var3.setItemDamage(var3.getItemDamageForDisplay() + this.rand.nextInt(2));
if (var3.getItemDamageForDisplay() >= var3.getMaxDamage())
{
this.renderBrokenItemStack(var3);
this.setCurrentItemOrArmor(4, (ItemStack)null);
}
}
var2 = false;
}
if (var2)
{
this.setFire(8);
}
}
}
super.onLivingUpdate();
}
Горение днем
protected String getLivingSound()
{
return "mob.zombie.say";
}
protected String getHurtSound()
{
return "mob.zombie.hurt";
}
protected String getDeathSound()
{
return "mob.zombie.death";
}
protected void playStepSound(int par1, int par2, int par3, int par4)
{
this.worldObj.playSoundAtEntity(this, "mob.zombie.step", 0.15F, 1.0F);
}
Звуки
protected void dropRareDrop(int par1)
{
switch (this.rand.nextInt(2))
{
case 0:
this.dropItem(Item.ingotIron.itemID, 1);
break;
case 1:
this.dropItem(Item.helmetSteel.itemID, 1);
break;
}
}
Редкий дроп(или железный слиток или железный шлем)
protected int getDropItemId()
{
return Item.diamond.itemID;
}
Дроп - алмазик
А теперь в
ClientProxy после super.
initMod(); пишем
RenderingRegistry.registerEntityRenderingHandler(EntityMan.class, new RenderMan(new ModelBiped(), 0.3F));
Тут мы регаем рендер нашего моба с моделью человека
И жямкаем Ctrl+Shift+O
Далее делаем класс
RenderManackage ru.testmod.src;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.entity.RenderLiving;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
public class RenderMan extends RenderLiving
{
protected ModelBiped model;
public RenderMan (ModelBiped modelBiped, float f)
{
super(modelBiped, f);
model = ((ModelBiped)mainModel);
}
public void renderMan(EntityMan entity, double par2, double par4, double par6, float par8, float par9)
{
super.doRenderLiving(entity, par2, par4, par6, par8, par9);
}
public void doRenderLiving(EntityLiving par1EntityLiving, double par2, double par4, double par6, float par8, float par9)
{
renderMan((EntityMan)par1EntityLiving, par2, par4, par6, par8, par9);
}
public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
{
renderMan((EntityMan)par1Entity, par2, par4, par6, par8, par9);
}
}
Ну тут все просто
EntityMan - наш моб
RenderMan - наш рендер
ModelBiped - модель зомби/стива и т.д
Ну вроде все!