Jump to content

Editing a mobs AI!


Mecblader

Recommended Posts

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!

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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;

Link to comment
Share on other sites

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.