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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I am not using hardcoded recipes, I'm using Vanilla's already existing code for leather armor dying. (via extending and implementing DyeableArmorItem / DyeableLeatherItem respectively) I have actually figured out that it's something to do with registering item colors to the ItemColors instance, but I'm trying to figure out where exactly in my mod's code I would be placing a call to the required event handler. Unfortunately the tutorial is criminally undescriptive. The most I've found is that it has to be done during client initialization. I'm currently trying to do the necessary setup via hijacking the item registry since trying to modify the item classes directly (via using SubscribeEvent in the item's constructor didn't work. Class so far: // mrrp mrow - mcmod item painter v1.0 - catzrule ch package catzadvitems.init; import net.minecraft.client.color.item.ItemColors; import net.minecraft.world.item.Item; import net.minecraftforge.registries.ObjectHolder; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.client.event.ColorHandlerEvent; import catzadvitems.item.DyeableWoolArmorItem; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class Painter { @ObjectHolder("cai:dyeable_wool_chestplate") public static final Item W_CHEST = null; @ObjectHolder("cai:dyeable_wool_leggings") public static final Item W_LEGS = null; @ObjectHolder("cai:dyeable_wool_boots") public static final Item W_SOCKS = null; public Painter() { // left blank, idk if forge throws a fit if constructors are missing, not taking the chance of it happening. } @SubscribeEvent public static void init(FMLClientSetupEvent event) { new Painter(); } @Mod.EventBusSubscriber private static class ForgeBusEvents { @SubscribeEvent public static void registerItemColors(ColorHandlerEvent.Item event) { ItemColors col = event.getItemColors(); col.register(DyeableUnderArmorItem::getItemDyedColor, W_CHEST, W_LEGS, W_SOCKS); //placeholder for other dye-able items here later.. } } } (for those wondering, i couldn't think of a creative wool helmet name)
    • nvm found out it was because i had create h and not f
    • Maybe there's something happening in the 'leather armor + dye' recipe itself that would be updating the held item texture?
    • @SubscribeEvent public static void onRenderPlayer(RenderPlayerEvent.Pre e) { e.setCanceled(true); model.renderToBuffer(e.getPoseStack(), pBuffer, e.getPackedLight(), 0f, 0f, 0f, 0f, 0f); //ToaPlayerRenderer.render(); } Since getting the render method from a separate class is proving to be bit of a brick wall for me (but seems to be the solution in older versions of minecraft/forge) I've decided to try and pursue using the renderToBuffer method directly from the model itself. I've tried this route before but can't figure out what variables to feed it for the vertexConsumer and still can't seem to figure it out; if this is even a path to pursue.  The vanilla model files do not include any form of render methods, and seem to be fully constructed from their layer definitions? Their renderer files seem to take their layers which are used by the render method in the vanilla MobRenderer class. But for modded entities we @Override this function and don't have to feed the method variables because of that? I assume that the render method in the extended renderer takes the layer definitions from the renderer classes which take those from the model files. Or maybe instead of trying to use a render method I should be calling the super from the renderer like   new ToaPlayerRenderer(context, false); Except I'm not sure what I would provide for context? There's a context method in the vanilla EntityRendererProvider class which doesn't look especially helpful. I've been trying something like <e.getEntity(), model<e.getEntity()>> since that generally seems to be what is provided to the renderers for context, but I don't know if it's THE context I'm looking for? Especially since the method being called doesn't want to take this or variations of this.   In short; I feel like I'm super super close but I have to be missing something obvious? Maybe this insane inane ramble post will provide some insight into this puzzle?
  • Topics

×
×
  • Create New...

Important Information

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