mirk Posted February 9, 2019 Posted February 9, 2019 (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: Reveal hidden contents @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 February 10, 2019 by mirk Quote
Draco18s Posted February 9, 2019 Posted February 9, 2019 As far as I am aware, that's correct. 1 Quote 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.
mirk Posted February 10, 2019 Author Posted February 10, 2019 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: Reveal hidden contents @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. Quote
Draco18s Posted February 10, 2019 Posted February 10, 2019 Now you can check to see if there is any possible way that addPettingTask = false; ever gets called. Its possible that it never does. 1 Quote 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.
mirk Posted February 10, 2019 Author Posted February 10, 2019 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. Quote
Recommended Posts
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.