Jump to content

Recommended Posts

Posted

You're on the right track, you do have to use the interact method. However, there are a few things you need to do to make this work. First, you need to make it sit on the server side, by checking if the world is remote. Second, you need to add the AI task for sitting. Then you just toggle whether or not it's sitting by using setSitting(!this.isSitting()).

Posted

I added this to the interact method but nothing seems to be working...

 

if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !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);

            }

Posted

Never mind I still had setSitting(true) somewhere else so it didn't change. Now I am wondering if there are any methods that I need to make it attack like a wolf, so if something hurts the owner it will attack.

Posted

Okay. Open up the code for EntiyWolf. Read through the AI it has, read the methods for attacking it has, copy and modify them to your needs.

We all stuff up sometimes... But I seem to be at the bottom of that pot.

Posted

I used this method, which seems correct, but it doesn't seem to be doing anything. I am really new to modding so I apologize if I am being blind but I want to get into modding.

 

public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase)

    {

        if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast))

        {

            if (par1EntityLivingBase instanceof EntityWolf)

            {

                EntityWolf entitywolf = (EntityWolf)par1EntityLivingBase;

 

                if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase)

                {

                    return false;

                }

            }

 

            return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer)par2EntityLivingBase).canAttackPlayer((EntityPlayer)par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse)par1EntityLivingBase).isTame();

        }

        else

        {

            return false;

        }

    }

 

 

Posted

...not what meant. I'm not at my computer right now so I can't give you the method names. But for the AI, you need to add targetTasks for attacking (look at EntityWilf's constructor). Aside from that, hit ctrl + f in while in the EntityWolf file and search for "attack". Then see what methods have it in their name and copy those and modify them.

We all stuff up sometimes... But I seem to be at the bottom of that pot.

Posted

I can't believe I forgot that, I had it commented out :P Now he will try to attack the mob but do no damage and just bump into it, so I will have a look at why that is.

Posted

As I think you've figured out, most of the stuff you've encountered is related to AI.  I have a tutorial on it that might be of interest:  http://jabelarminecraft.blogspot.com/p/custom-entity-ai.html

 

Regarding the attacking without damage, I think I had the same thing once.  I think it was related to the entity attributes -- by default there is no attack damage registered for Entities.  You have to both register and set that attribute.  Here is my tutorial on that:  http://jabelarminecraft.blogspot.com/p/stylebackground-color-white-color.html

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

Posted

I registered and set the damage like so but nothing changed:

 

this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage);

this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D);

Posted

Like I said, there is a method something along the lines of attackEntityAsMob() and you have to return an int which is your damage :P look around for a method similar to that in EntityWolf

We all stuff up sometimes... But I seem to be at the bottom of that pot.

Posted

The damage done during an attack is actually very convoluted in the Minecraft code.  It is done in the attackEntityAsMob() method which you need to override (it is inherited in EntityLivingBase class where it does nothing but update the last attacker)

 

In the EntityWolf class I think it does something like:

    @Override
public boolean attackEntityAsMob(Entity par1Entity)
    {
        int i = isTamed() ? 4 : 2;
        return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), i);
    }

 

However that isn't really good coding because it should really call the super method to ensure the last attacker is updated and also it should get the damage value from the attribute instead of hard-coded as 2 (or 4 if tamed).

 

However, the weird thing is that I think the EntityLivingBase attackEntityAsMob() method has an error in it -- it has this.setLastAttacker(par1Entity) but that is backwards I think -- should be par1Entity.setLastAttacker(this).  Anyone else agree.

 

Anyway, since the wolf class seems to not care about setting last attacker and because it seems backwards to me, I guess just leave it out.  But normally you'd want to consider calling or copying the super method.

 

Overall, to get damage occurring you can modify the method to be something like:

    @Override
public boolean attackEntityAsMob(Entity par1Entity)
    {
        return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue());
    }

 

As you can see, this doesn't deal damage directly because it wants to let the entity that is hit fully process the attack (for example maybe it has hurt resistance in effect) before fully deciding the damage to deal.

 

Anyway, hope this helps.

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

Posted

^^^ What he said. The methods I was referring to though were:

/**
     * Called when the entity is attacked.
     */
    public boolean attackEntityFrom(DamageSource par1DamageSource, float par2)
    {
        if (this.isEntityInvulnerable())
        {
            return false;
        }
        else
        {
            Entity entity = par1DamageSource.getEntity();
            this.aiSit.setSitting(false);

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

            return super.attackEntityFrom(par1DamageSource, par2);
        }
    }

    public boolean attackEntityAsMob(Entity par1Entity)
    {
        int i = this.isTamed() ? 4 : 2;
        return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float)i);
    }

 

Those are exact copies from EntityWolf.

We all stuff up sometimes... But I seem to be at the bottom of that pot.

Posted

Ok another problem is that although it works, when I quit the game and relog, I cant make it unsit if you understand, so it doesnt follow me unless I spawn a new one and tame it again.

Posted

Ok another problem is that although it works, when I quit the game and relog, I cant make it unsit if you understand, so it doesnt follow me unless I spawn a new one and tame it again.

 

This is due to your Eclipse setup.  If you follow most setup tutorials they give you certain application parameters to use in your Run configuration.  However, if they don't tell you about username, then every time you login you get a random player username.  So if you want the player to have consistent association to other code (like owner id for a tamed pet) then you need to specify the username.

 

I think (just google for it) that in your run configuration you should add the parameter --username testUser or similar.  I think you can put any name in for the test user.  Then every time you run it should have same user and then things like taming should persist.

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

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.