Jump to content

[1.7.10] Mob dies immediately when spawned.


Ms_Raven

Recommended Posts

I have a generic EntityPet class that's basically copied EntityWolf code. It has a bunch of variables like health and damage that I want to set in the classes that extend it so the code in those new classes is shorter and easier to edit.

 

But when my Cat mob is spawned, it just immediately rolls over and dies while printing the following log.

 

Why is its health 0 if its attributes are set correctly?

 

[16:43:27] [Client thread/INFO] [LOG]: 'Cat' mob spawned with the following attributes:
[16:43:27] [Client thread/INFO] [LOG]: Breeding item: item.fish
[16:43:27] [Client thread/INFO] [LOG]: Befriending item: item.ball_of_yarn
[16:43:27] [Client thread/INFO] [LOG]: Healing item: item.tuna
[16:43:27] [Client thread/INFO] [LOG]: Dropped item: item.cat_tail
[16:43:27] [Client thread/INFO] [LOG]: Eye height: 0.7
[16:43:27] [Client thread/INFO] [LOG]: Speed: 0.30000001192092896
[16:43:27] [Client thread/INFO] [LOG]: Damage when tamed: 6.0
[16:43:27] [Client thread/INFO] [LOG]: Damage when wild: 4.0
[16:43:27] [Client thread/INFO] [LOG]: Health when tamed: 25.0
[16:43:27] [Client thread/INFO] [LOG]: Health when wild: 6.0
[16:43:27] [Client thread/INFO] [LOG]: Current health: 0.0

 

Cat class:

public class Cat extends EntityPet
{
public Cat(World world)
{
	super(world);

        this.setSize(0.5F, 0.7F);
        this.getNavigator().setAvoidsWater(true);
        this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntityWolf.class, 200, false));
        //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntityInsect.class, 200, false));
        //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, Mouse.class, 200, false));
        
	this.breedingItem = Items.fish;
	this.befriendingItem = BPItems.ball_of_yarn;
	this.healingItem = BPItems.tuna;
	this.droppedItem = BPItems.cat_tail;

	this.eyeHeight = 0.7F;
	this.speed = 0.3F;
	this.tamedDamage = 6;
	this.defaultDamage = 4;
	this.defaultHealth = 6;
	this.tamedHealth = 25;

	this.printEntityData("Cat");
}

    public boolean canMateWith(EntityAnimal p_70878_1_)
    {
        if (p_70878_1_ == this)
        	{return false;}
        else if (!this.isTamed())
        	{return false;}
        else if (!(p_70878_1_ instanceof Cat))
        	{return false;}
        else
        {
        	Cat thisPet = (Cat)p_70878_1_;
            return !thisPet.isTamed() ? false : (thisPet.isSitting() ? false : this.isInLove() && thisPet.isInLove());
        }
    }
    protected String getLivingSound()
    {
        return this.isTamed() ? (this.isInLove() ? "mob.cat.purr" : (this.rand.nextInt(4) == 0 ? "mob.cat.purreow" : "mob.cat.meow")) : "";
    }
    protected String getHurtSound()
    	{return "mob.cat.hitt";}
    protected String getDeathSound()
    	{return "mob.cat.hitt";}

    @Override
    public Cat createChild(EntityAgeable p_90011_1_)
    {
        Cat cat = new Cat(this.worldObj);
        String s = this.func_152113_b();

        if (s != null && s.trim().length() > 0)
        {
            cat.func_152115_b(s);
            cat.setTamed(true);
        }
        return cat;
    }
    
    public static void createEntity(Class entityClass, String entityName, int solidColour, int spotColour)
    {
    	int id = EntityRegistry.findGlobalUniqueEntityId();
    	EntityRegistry.registerGlobalEntityID(entityClass, entityName, id);
    	EntityRegistry.registerModEntity(entityClass, entityName, id, Main.instance, 64, 1, true);
    	EntityList.entityEggs.put(Integer.valueOf(id), new EntityList.EntityEggInfo(id, solidColour, spotColour));
    }
}

 

EntityPet class

public class EntityPet extends EntityTameable
{
public Item breedingItem, befriendingItem, healingItem, droppedItem;
public double speed, defaultHealth, tamedHealth, damage;
public float defaultDamage, tamedDamage, eyeHeight;
public boolean isEvolved;

    public EntityPet(World p_i1696_1_)
    {
        super(p_i1696_1_);
        this.tasks.addTask(1, new EntityAISwimming(this));
        this.tasks.addTask(2, this.aiSit);
        this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F));
        this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
        this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
        this.tasks.addTask(6, new EntityAIMate(this, 1.0D));
        this.tasks.addTask(7, new EntityAIWander(this, 1.0D));
        this.tasks.addTask(8, new Beg(this, 8.0F));
        this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
        this.tasks.addTask(9, new EntityAILookIdle(this));
        this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
        this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
        this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true));
        this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false));
        this.setTamed(false);
        isEvolved = false;
    }
    public void printEntityData(String name)
    {
	Tools.println("'" + name + "' mob spawned with the following attributes:");
	Tools.println("Breeding item: " + breedingItem.getUnlocalizedName());
	Tools.println("Befriending item: " + befriendingItem.getUnlocalizedName());
	Tools.println("Healing item: " + healingItem.getUnlocalizedName());
	Tools.println("Dropped item: " + droppedItem.getUnlocalizedName());

	Tools.println("Eye height: " + eyeHeight);
	Tools.println("Speed: " + speed);
	Tools.println("Damage when tamed: " + tamedDamage);
	Tools.println("Damage when wild: " + defaultDamage);
	Tools.println("Health when tamed: " + tamedHealth);
	Tools.println("Health when wild: " + defaultHealth);
	Tools.println("Current health: " + this.getHealth());
    }
    protected void applyEntityAttributes()
    {
        super.applyEntityAttributes();
        this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speed);

        if (this.isTamed())
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tamedHealth);
        }
        else
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(defaultHealth);
        }
    }
    public boolean isAIEnabled()
    {
        return true;
    }
    public void setAttackTarget(EntityLivingBase p_70624_1_)
    {
        super.setAttackTarget(p_70624_1_);

        if (p_70624_1_ == null)
        {
            this.setAngry(false);
        }
        else if (!this.isTamed())
        {
            this.setAngry(true);
        }
    }
    protected void updateAITick()
    {
        this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth()));
    }

    protected void entityInit()
    {
        super.entityInit();
        this.dataWatcher.addObject(18, new Float(this.getHealth()));
        this.dataWatcher.addObject(19, new Byte((byte)0));
    }
    public void writeEntityToNBT(NBTTagCompound p_70014_1_)
    {
        super.writeEntityToNBT(p_70014_1_);
        p_70014_1_.setBoolean("Angry", this.isAngry());
    }
    public void readEntityFromNBT(NBTTagCompound p_70037_1_)
    {
        super.readEntityFromNBT(p_70037_1_);
        this.setAngry(p_70037_1_.getBoolean("Angry"));
    }
    protected Item getDropItem()
    {
        return this.droppedItem;
    }
    public void onUpdate()
    {
        super.onUpdate();
        if (this.func_70922_bv())
        {
            this.numTicksToChaseTarget = 10;
        }
    }
    public float getEyeHeight()
    {
        return this.height * eyeHeight;
    }
    public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_)
    {
        if (this.isEntityInvulnerable())
        {
            return false;
        }
        else
        {
            Entity entity = p_70097_1_.getEntity();
            this.aiSit.setSitting(false);

            if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow))
            {
                p_70097_2_ = (p_70097_2_ + 1.0F) / 2.0F;
            }

            return super.attackEntityFrom(p_70097_1_, p_70097_2_);
        }
    }
    public boolean attackEntityAsMob(Entity p_70652_1_)
    {
        float i = this.isTamed() ? defaultDamage : tamedDamage;
        return p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), i);
    }

    public void setTamed(boolean p_70903_1_)
    {
        super.setTamed(p_70903_1_);

        if (p_70903_1_)
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tamedHealth);
        }
        else
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(defaultHealth);
        }
    }
    public boolean interact(EntityPlayer p_70085_1_)
    {
        ItemStack itemstack = p_70085_1_.inventory.getCurrentItem();

        if (this.isTamed())
        {
            if (itemstack != null)
            {
                if (itemstack.getItem() instanceof ItemFood)
                {
                    ItemFood itemfood = (ItemFood)itemstack.getItem();

                    if (itemfood == healingItem && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F)
                    {
                        if (!p_70085_1_.capabilities.isCreativeMode)
                        {
                            --itemstack.stackSize;
                        }

                        this.heal((float)itemfood.func_150905_g(itemstack));

                        if (itemstack.stackSize <= 0)
                        {
                            p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
                        }

                        return true;
                    }
                }
            }

            if (this.func_152114_e(p_70085_1_) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack))
            {
                this.aiSit.setSitting(!this.isSitting());
                this.isJumping = false;
                this.setPathToEntity((PathEntity)null);
                this.setTarget((Entity)null);
                this.setAttackTarget((EntityLivingBase)null);
            }
        }
        else if (itemstack != null && itemstack.getItem() == befriendingItem && !this.isAngry())
        {
            if (!p_70085_1_.capabilities.isCreativeMode)
            {
                --itemstack.stackSize;
            }

            if (itemstack.stackSize <= 0)
            {
                p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
            }

            if (!this.worldObj.isRemote)
            {
                if (this.rand.nextInt(3) == 0)
                {
                    this.setTamed(true);
                    this.setPathToEntity((PathEntity)null);
                    this.setAttackTarget((EntityLivingBase)null);
                    this.aiSit.setSitting(true);
                    this.setHealth(20.0F);
                    this.func_152115_b(p_70085_1_.getUniqueID().toString());
                    this.playTameEffect(true);
                    this.worldObj.setEntityState(this, (byte)7);
                }
                else
                {
                    this.playTameEffect(false);
                    this.worldObj.setEntityState(this, (byte)6);
                }
            }

            return true;
        }

        return super.interact(p_70085_1_);
    }
    public boolean isBreedingItem(ItemStack p_70877_1_)
    {
        return p_70877_1_ == null ? false : (!(p_70877_1_.getItem() == breedingItem) ? false : ((ItemFood)p_70877_1_.getItem()).isWolfsFavoriteMeat());
    }
    public int getMaxSpawnedInChunk()
    {
        return 5;
    }
    public boolean isAngry()
    {
        return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0;
    }
    public void setAngry(boolean p_70916_1_)
    {
        byte b0 = this.dataWatcher.getWatchableObjectByte(16);

        if (p_70916_1_)
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 2)));
        }
        else
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -3)));
        }
    }
    public void func_70918_i(boolean p_70918_1_)
    {
        if (p_70918_1_)
        {
            this.dataWatcher.updateObject(19, Byte.valueOf((byte)1));
        }
        else
        {
            this.dataWatcher.updateObject(19, Byte.valueOf((byte)0));
        }
    }
    public boolean func_70922_bv()
    {
        return this.dataWatcher.getWatchableObjectByte(19) == 1;
    }

    protected boolean canDespawn()
    {
        return !this.isTamed() && this.ticksExisted > 2400;
    }

    public boolean func_142018_a(EntityLivingBase p_142018_1_, EntityLivingBase p_142018_2_)
    {
        if (!(p_142018_1_ instanceof EntityCreeper) && !(p_142018_1_ instanceof EntityGhast))
        {
            if (p_142018_1_ instanceof EntityPet)
            {
            	EntityPet entitywolf = (EntityPet)p_142018_1_;

                if (entitywolf.isTamed() && entitywolf.getOwner() == p_142018_2_)
                {
                    return false;
                }
            }

            return p_142018_1_ instanceof EntityPlayer && p_142018_2_ instanceof EntityPlayer && !((EntityPlayer)p_142018_2_).canAttackPlayer((EntityPlayer)p_142018_1_) ? false : !(p_142018_1_ instanceof EntityHorse) || !((EntityHorse)p_142018_1_).isTame();
        }
        else
        {
            return false;
        }
    }

@Override
public EntityAgeable createChild(EntityAgeable p_90011_1_)
{
	return null;
}
}

Link to comment
Share on other sites

I don't see anything obviously wrong after quick scan of your code.

 

What I do in these situations is to override the setDead() method. You just call super.setDead() but you can then put console statements there, and more importantly you can put a breakpoint and go into debug mode to try to figure out what called the method. Then it might give you a clue -- was it a despawn, was it suffocating because you placed it partially in a block?

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

The problem is that the applyEntityAttributes method is called before any of the variables are set in Cat's constructor.

The constructor recognises the correct variables but applyEntityAttributes thinks they're still 0.

 

Applying the attributes from the Cat class instead of EntityPet doesn't have any effect, neither does doing anything with setDead()...

 

How do I get applyEntityAttributes() to read the variables AFTER they've been set ?

Link to comment
Share on other sites

Best part - you can't (in clean code).

When you have problems like this one you should think about your design.

 

The easiest (fast) to code would be making protected void addAttribsAfter() which would have all your attribute-adding from Pet's side and would be called at end of Cat's constructor.

 

Above is, in my eyes, like the worst possible design, literally saying "I don't give a damn about inheritance", but it will work.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

I redid the whole pet structure and got it to work by just adding setHealth(defaultHealth); at the end of the constructor.

 

But now it doesn't follow the player (still teleports when moving away, but doesn't follow) and its only movement is when it jumps to attack a mob. Its speed is also 0.30000001192092896F like the Wolf instead of the very first variable which is clearly 0.3....

 

New cat class:

public class PetCat extends UniversalPet
{
public float speed = 0.3;
public float defaultHealth = 6;
public float tamedHealth = 25;
public float defaultDamage = 4;
public float tamedDamage = 6;
public float eyeHeight = 0.7F;
public boolean isEvolved = false;

public PetCat(World world)
{
	super(world);

        this.breedingItem = Items.fish;
        this.befriendingItem = BPItems.ball_of_yarn;
        this.healingItem = BPItems.tuna;
        this.droppedItem = BPItems.cat_tail;

        this.setSize(0.5F, 0.7F);
        this.getNavigator().setAvoidsWater(true);
        this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntityWolf.class, 200, false));
        this.tasks.addTask(1, new EntityAISwimming(this));
        this.tasks.addTask(2, this.aiSit);
        this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F));
        this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
        this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
        this.tasks.addTask(6, new EntityAIMate(this, 1.0D));
        this.tasks.addTask(7, new EntityAIWander(this, 1.0D));
        this.tasks.addTask(8, new BegUniversal(this, 8.0F));
        this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
        this.tasks.addTask(9, new EntityAILookIdle(this));
        this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
        this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
        this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true));
        this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false));
        this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntityWolf.class, 200, false));
        //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntityInsect.class, 200, false));
        //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, Mouse.class, 200, false));
    	
        this.setTamed(false);
        this.setHealth(defaultHealth);
        
	this.printEntityData("Cat");

}
    public void printEntityData(String name)
    {
	Tools.println("[printEntityData()]:");
	Tools.println( "'" + name + "' mob spawned.");
	Tools.println("Breeding item: " + breedingItem.getUnlocalizedName());
	Tools.println("Befriending item: " + befriendingItem.getUnlocalizedName());
	Tools.println("Healing item: " + healingItem.getUnlocalizedName());
	Tools.println("Dropped item: " + droppedItem.getUnlocalizedName());

	Tools.println("Eye height: " + eyeHeight);
	Tools.println("Speed: " + speed);
	Tools.println("Damage when tamed: " + tamedDamage);
	Tools.println("Damage when wild: " + defaultDamage);
	Tools.println("Health when tamed: " + tamedHealth);
	Tools.println("Health when wild: " + defaultHealth);
	Tools.println("Current health: " + this.getHealth());
    }
    protected void applyEntityAttributes()
    {
        super.applyEntityAttributes();
        Tools.println("[applyEntityAttributes()]:");
        
        this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(speed);
        Tools.println("Speed set to: " + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue());

        if (this.isTamed())
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tamedHealth);
        }
        else
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(defaultHealth);
        }
        Tools.println("Max health set to: " + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).getAttributeValue());
    }
    public boolean isAIEnabled()
    {
        return true;
    }
    public void setAttackTarget(EntityLivingBase p_70624_1_)
    {
        super.setAttackTarget(p_70624_1_);

        if (p_70624_1_ == null)
        {
            this.setAngry(false);
        }
        else if (!this.isTamed())
        {
            this.setAngry(true);
        }
    }
    protected void updateAITick()
    {
        this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth()));
    }

    protected void entityInit()
    {
        super.entityInit();
        this.dataWatcher.addObject(18, new Float(this.getHealth()));
        this.dataWatcher.addObject(19, new Byte((byte)0));
    }
    public void writeEntityToNBT(NBTTagCompound p_70014_1_)
    {
        super.writeEntityToNBT(p_70014_1_);
        p_70014_1_.setBoolean("Angry", this.isAngry());
    }
    public void readEntityFromNBT(NBTTagCompound p_70037_1_)
    {
        super.readEntityFromNBT(p_70037_1_);
        this.setAngry(p_70037_1_.getBoolean("Angry"));
    }
    protected Item getDropItem()
    {
        return this.droppedItem;
    }
    public void onUpdate()
    {
        super.onUpdate();
        if (this.func_70922_bv())
        {
            this.numTicksToChaseTarget = 10;
        }
    }
    public float getEyeHeight()
    {
        return this.height * eyeHeight;
    }
    public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_)
    {
        if (this.isEntityInvulnerable())
        {
            return false;
        }
        else
        {
            Entity entity = p_70097_1_.getEntity();
            this.aiSit.setSitting(false);

            if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow))
            {
                p_70097_2_ = (p_70097_2_ + 1.0F) / 2.0F;
            }

            return super.attackEntityFrom(p_70097_1_, p_70097_2_);
        }
    }
    public boolean attackEntityAsMob(Entity p_70652_1_)
    {
        float i = this.isTamed() ? defaultDamage : tamedDamage;
        return p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), i);
    }

    public void setTamed(boolean p_70903_1_)
    {
        super.setTamed(p_70903_1_);

        if (p_70903_1_)
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tamedHealth);
        }
        else
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(defaultHealth);
        }
    }
    public boolean interact(EntityPlayer p_70085_1_)
    {
        ItemStack itemstack = p_70085_1_.inventory.getCurrentItem();

        if (this.isTamed())
        {
            if (itemstack != null)
            {
                if (itemstack.getItem() instanceof ItemFood)
                {
                    ItemFood itemfood = (ItemFood)itemstack.getItem();

                    if (itemfood == healingItem && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F)
                    {
                        if (!p_70085_1_.capabilities.isCreativeMode)
                        {
                            --itemstack.stackSize;
                        }

                        this.heal((float)itemfood.func_150905_g(itemstack));

                        if (itemstack.stackSize <= 0)
                        {
                            p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
                        }

                        return true;
                    }
                }
            }

            if (this.func_152114_e(p_70085_1_) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack))
            {
                this.aiSit.setSitting(!this.isSitting());
                this.isJumping = false;
                this.setPathToEntity((PathEntity)null);
                this.setTarget((Entity)null);
                this.setAttackTarget((EntityLivingBase)null);
            }
        }
        else if (itemstack != null && itemstack.getItem() == befriendingItem && !this.isAngry())
        {
            if (!p_70085_1_.capabilities.isCreativeMode)
            {
                --itemstack.stackSize;
            }

            if (itemstack.stackSize <= 0)
            {
                p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
            }

            if (!this.worldObj.isRemote)
            {
                if (this.rand.nextInt(3) == 0)
                {
                    this.setTamed(true);
                    this.setPathToEntity((PathEntity)null);
                    this.setAttackTarget((EntityLivingBase)null);
                    this.aiSit.setSitting(true);
                    this.setHealth(20.0F);
                    this.func_152115_b(p_70085_1_.getUniqueID().toString());
                    this.playTameEffect(true);
                    this.worldObj.setEntityState(this, (byte)7);
                }
                else
                {
                    this.playTameEffect(false);
                    this.worldObj.setEntityState(this, (byte)6);
                }
            }

            return true;
        }

        return super.interact(p_70085_1_);
    }
    public boolean isBreedingItem(ItemStack p_70877_1_)
    {
        return p_70877_1_ == null ? false : (!(p_70877_1_.getItem() == breedingItem) ? false : ((ItemFood)p_70877_1_.getItem()).isWolfsFavoriteMeat());
    }
    public int getMaxSpawnedInChunk()
    {
        return 5;
    }
    public boolean isAngry()
    {
        return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0;
    }
    public void setAngry(boolean p_70916_1_)
    {
        byte b0 = this.dataWatcher.getWatchableObjectByte(16);

        if (p_70916_1_)
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 2)));
        }
        else
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -3)));
        }
    }
    public void func_70918_i(boolean p_70918_1_)
    {
        if (p_70918_1_)
        {
            this.dataWatcher.updateObject(19, Byte.valueOf((byte)1));
        }
        else
        {
            this.dataWatcher.updateObject(19, Byte.valueOf((byte)0));
        }
    }
    public boolean func_70922_bv()
    {
        return this.dataWatcher.getWatchableObjectByte(19) == 1;
    }

    protected boolean canDespawn()
    {
        return !this.isTamed() && this.ticksExisted > 2400;
    }

    public boolean func_142018_a(EntityLivingBase p_142018_1_, EntityLivingBase p_142018_2_)
    {
        if (!(p_142018_1_ instanceof EntityCreeper) && !(p_142018_1_ instanceof EntityGhast))
        {
            if (p_142018_1_ instanceof EntityTameable)
            {
            	EntityTameable pet = (EntityTameable)p_142018_1_;

                if (pet.isTamed() && pet.getOwner() == p_142018_2_)
                {
                    return false;
                }
            }

            return p_142018_1_ instanceof EntityPlayer && p_142018_2_ instanceof EntityPlayer && !((EntityPlayer)p_142018_2_).canAttackPlayer((EntityPlayer)p_142018_1_) ? false : !(p_142018_1_ instanceof EntityHorse) || !((EntityHorse)p_142018_1_).isTame();
        }
        else
        {
            return false;
        }
    }
    
    @Override
    public void setDead()
    {
    	super.setDead();
    }

    public boolean canMateWith(EntityAnimal p_70878_1_)
    {
        if (p_70878_1_ == this)
        	{return false;}
        else if (!this.isTamed())
        	{return false;}
        else if (!(p_70878_1_ instanceof PetCat))
        	{return false;}
        else
        {
        	PetCat thisPet = (PetCat)p_70878_1_;
            return !thisPet.isTamed() ? false : (thisPet.isSitting() ? false : this.isInLove() && thisPet.isInLove());
        }
    }
    protected String getLivingSound()
    {
        return this.isTamed() ? (this.isInLove() ? "mob.cat.purr" : (this.rand.nextInt(4) == 0 ? "mob.cat.purreow" : "mob.cat.meow")) : "";
    }
    protected String getHurtSound()
    	{return "mob.cat.hitt";}
    protected String getDeathSound()
    	{return "mob.cat.hitt";}

    @Override
    public PetCat createChild(EntityAgeable p_90011_1_)
    {
        PetCat cat = new PetCat(this.worldObj);
        String s = this.func_152113_b();

        if (s != null && s.trim().length() > 0)
        {
            cat.func_152115_b(s);
            cat.setTamed(true);
        }
        return cat;
    }
    
    public static void createEntity(Class entityClass, String entityName, int solidColour, int spotColour)
    {
    	int id = EntityRegistry.findGlobalUniqueEntityId();
    	EntityRegistry.registerGlobalEntityID(entityClass, entityName, id);
    	EntityRegistry.registerModEntity(entityClass, entityName, id, Main.instance, 64, 1, true);
    	EntityList.entityEggs.put(Integer.valueOf(id), new EntityList.EntityEggInfo(id, solidColour, spotColour));
    }
}

 

New pet class, made just so the Beg AI can be used for all pets:

public class UniversalPet extends EntityTameable
{
    public Item breedingItem;
public Item befriendingItem;
public Item healingItem;
public Item droppedItem;

    public UniversalPet(World p_i1696_1_)
    {
        super(p_i1696_1_);
        this.setTamed(false);
        
    }
    protected void applyEntityAttributes()
    {
        super.applyEntityAttributes();
        
        this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(2);

        if (this.isTamed())
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20);
        }
        else
        {
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10);
        }
    }
    public void func_70918_i(boolean p_70918_1_)
    {
        if (p_70918_1_)
        {
            this.dataWatcher.updateObject(19, Byte.valueOf((byte)1));
        }
        else
        {
            this.dataWatcher.updateObject(19, Byte.valueOf((byte)0));
        }
    }
@Override
public EntityAgeable createChild(EntityAgeable p_90011_1_)
{
	return null;
}
}

Link to comment
Share on other sites

I am not seeing anything wrong, but I do something similar, take a look at my GitHub at my entity MoChicken class. https://github.com/saxon564/MoChickens/blob/master/src/main/java/me/saxon564/mochickens/entities/mobs/EntityMoChicken.java

All mine runs off config options, but you can still cross check how it works and see if you can figure out why it's not working.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.