Posted April 6, 201411 yr Hello, I want to be able to make passive mobs attack player, if attacked, and adjust their damage according to their custom level that I have assigned. Is there a way to replace enemy AI or will I have to simulate that by teleporting the entity to player and on their collision the enemy takes damage. I think my method is long winded and I'm hoping someone else might have a better idea. All help is appreciated. Thank You. Don't be afraid to ask question when modding, there are no stupid question! Unless you don't know java then all your questions are stupid!
April 8, 201411 yr Not sure but you could try something like this: Make an event handler for EntityJoinWorldEvent, and in that event handler have something like: if (entity instanceof (entity you want to modify) entity.tasks.removeTask(AI's that you want to remove) entity.tasks.addTask(Your AI here)
April 8, 201411 yr That method is in the right direction. Just be sure to not add the tasks that looks for something to attack. However, there is probably more to do. I think you will have to extend EntityMob to your custom entity and then set the render to be that of your passive mob or the attack functionality won't be there. After that, you should looke for the normal entity to be spawned and replace it with your custome mob. Look at the entity code for the passive you are looking for and then the entity code for a mob and you should be able to tell what to do. Long time Bukkit & Forge Programmer Happy to try and help
April 8, 201411 yr Well he could also use a custom AI to add his own attack functionality without replacing every pig in the entire game and probably causing some compatibility problems, but it is up to him, as that can be a more difficult task.
April 8, 201411 yr Note that I'm not sure that removing the vanilla AI tasks is that easy unless you know the instance of the actual AI task. If you look at the removetask method you'll see that it needs the actual AI instance (not just it's general class). In my own custom mobs, I usually record the instance of each AI class I add so I can easily remove it later (or in subclasses). I think there may be a couple workarounds though. I think the AI tasks ultimately are just some sort of list structure, so you can clear it. Also, I haven't fully got an understanding of the "priority" parameter in the task list. It may be that adding an AI task with same priority may overwrite the original -- in other words, maybe it is just an array index not actually an array. Check out my tutorials here: http://jabelarminecraft.blogspot.com/
April 9, 201411 yr Note that I'm not sure that removing the vanilla AI tasks is that easy unless you know the instance of the actual AI task. If you look at the removetask method you'll see that it needs the actual AI instance (not just it's general class). In my own custom mobs, I usually record the instance of each AI class I add so I can easily remove it later (or in subclasses). I think there may be a couple workarounds though. I think the AI tasks ultimately are just some sort of list structure, so you can clear it. Also, I haven't fully got an understanding of the "priority" parameter in the task list. It may be that adding an AI task with same priority may overwrite the original -- in other words, maybe it is just an array index not actually an array. He could iterate through the tasks.taskEntries to find the task. Also, the priority value is not for an array, it is actually compared with a >= sign, which allows you to use negative values in your AIs.
April 10, 201411 yr EntityAITasks.EntityAITaskEntry is basically an object that stores the AI and its priority. This code is called to see if the AI is able to be called, and if it can continue. this.theProfiler.startSection("canUse"); Iterator iterator = this.taskEntries.iterator(); while (iterator.hasNext()) { EntityAITasks.EntityAITaskEntry entityaitaskentry = (EntityAITasks.EntityAITaskEntry)iterator.next(); if (entityaitaskentry != par1EntityAITaskEntry) { if (par1EntityAITaskEntry.priority >= entityaitaskentry.priority) { if (this.executingTaskEntries.contains(entityaitaskentry) && !this.areTasksCompatible(par1EntityAITaskEntry, entityaitaskentry)) { this.theProfiler.endSection(); return false; } } else if (this.executingTaskEntries.contains(entityaitaskentry) && !entityaitaskentry.action.isInterruptible()) { this.theProfiler.endSection(); return false; } } } this.theProfiler.endSection(); return true;
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.