Jump to content

[1.12.2] Correctly adding EntityAI tasks to EntityAnimals [SOLVED]


Recommended Posts

Posted (edited)

Hello again!

I'm wondering what the best way to add a custom EntityAI thing to all EntityAnimals would be? I'm currently doing it on LivingSpawnEvent, but that feels a bit hacky, and I don't know how to check if the EntityAnimals already have the task. Would the best way to do this be at registration?

 

Here's where I'm doing it:

Spoiler

@SubscribeEvent
public static void AddPettingAITask(LivingSpawnEvent event)
{
  EntityLivingBase livingBase = event.getEntityLiving();

  if(livingBase instanceof EntityAnimal)
  {
    EntityAnimal animalEntity = (EntityAnimal)livingBase;
    animalEntity.tasks.addTask(10, new EntityAIPet(animalEntity));
  }
}

 

 

The EntityAIPet class is basically an AI task that allows the player to pet the animal for a small amount of XP every now and then. I can post the code if need be.

Edited by mirk
Posted

As far as I am aware, that's correct.

  • Thanks 1

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Yeah, I just refined it a bit and I'm coming back to report that it's a success!

 

Here's the refined code for anyone looking to do a similar thing:

Spoiler

@SubscribeEvent
public static void AddPettingAITask(LivingSpawnEvent event)
{
    EntityLivingBase livingBase = event.getEntityLiving();

    if(livingBase instanceof EntityAnimal)
    {
      	EntityAnimal animalEntity = (EntityAnimal)livingBase;

      	boolean addPettingTask = true;
      	for(EntityAITasks.EntityAITaskEntry task : animalEntity.tasks.taskEntries)
      	{
      		if(task.action instanceof EntityAIPet)
      		{
      			addPettingTask = false;
      			break;
      		}
		}

        if(addPettingTask)
        {
        	animalEntity.tasks.addTask(10, new EntityAIPet(animalEntity));
        }
	}
}

 

Sorry if the formatting is a bit off, it's not cooperating with me.

Posted

Now you can check to see if there is any possible way that addPettingTask = false; ever gets called. Its possible that it never does.

  • Thanks 1

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

It is indeed called, at game load, as it looks like the task list is saved at game exit, then loaded on game load, so the EntityAIPet task persists in the task list, and it tries to add another copy of the task as the EntityAnimal spawns in, so addPettingTask = false (sorry, I'm not familiar with the forum formatting options yet) does get set.

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.