Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

How would I make my tameable mob stay in one place when it is right clicked. I have looked thorugh the wolf code and can't find much on when it is right clicked.

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()).

  • Author

I had a feeling it was something like that as I saw it but I couldn't wrap my head round how it toggled. I will give it a shot now, thanks.

  • Author

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);

            }

  • Author

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.

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.

  • Author

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;

        }

    }

 

 

...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.

  • Author

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.

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/

  • Author

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

 

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

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

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.

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/

^^^ 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.

  • Author

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.

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/

  • Author

Ahhhh yes, that would make a lot of sense considering it tells me my player name as soon as I log in on the console  (Player891 or whatever).

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.