Jump to content

[1.8] [SOLVED] Custom Mob AI problems


Brickfix

Recommended Posts

Hi,

I have a custom entity that shall attack Zombies. But I only can make it run to the next Zombie, but not to attack it.

 

 

This is my Entity Constructor:


public EntityTestMob(World worldIn) 
{
	super(worldIn);

	this.setSize(1.0F, 2.0F);

	this.setEntityToolsAndArmor();


	this.tasks.addTask(0, new EntityAIWander(this, 0.5D));
	//this.tasks.addTask(1, new EntityAIPanic(this, 0.9D));
	this.tasks.addTask(2, new EntityAILookIdle(this));
	this.tasks.addTask(3, new EntityAISwimming(this));
	this.tasks.addTask(4, new EntityAITempt(this, 0.6D, Items.apple, false));
	this.tasks.addTask(5, new EntityAIAvoidEntity(this, new Predicate()
	{
		public boolean shallAvoid(Entity entity)
            {
                return entity instanceof EntityCreeper;
            }
            public boolean apply(Object entityObject)
            {
                return this.shallAvoid((Entity)entityObject);
            }
	}, 6.0F, 1.0D, 1.2D));

	this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityZombie.class, 1.0D, true));

        this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityZombie.class, true));
        this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false, new Class[0]));
}

 

BTW, I noticed that a lot of minecraft Mobs have several tasks assigned with the same value, e.g.


this.tasks.addTask(2, new EntityAILookIdle(this));
this.tasks.addTask(2, new EntityAISwimming(this))

 

Is the integer (the '2' in this case) a unique ranking or a propability value?

 

Thanks for any response (:

Link to comment
Share on other sites

The int value is for ranking an AI above another (I think). For example, if I understand this right, AIAvoidEntity could be ranked above AIWanader so it avoids an entity before it wanders.

 

If I understand you right, your mob isn't attacking the zombie? Do you override onUpdate()? If so make sure to call the super. If not, override onUpdate() and call the super, it should help.

Link to comment
Share on other sites

I didn't override onUptade(), but I did so now as you sad


@Override
public void onUpdate()
{
	super.onUpdate();
}

 

The problem persists, they still only follow the Zomiey (which looks funny enough), but they do not attack it. The only damage the Zombie is taking is from the sunlight.

 

But thanks for the explanation about the AI, now that I look at it it does make sense :D

Link to comment
Share on other sites

The EntityAIAttackOnCollide task is on the same ranking as EntityAINearestAttackableTarget. Try shifting them down like this:

this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityZombie.class, 1.0D, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityZombie.class, true));
this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, false, new Class[0]));

 

Edit: Oh wait, sorry I didn't look very hard. Those are different: task and targetTasks. :) But there is still a problem there, try changing:

this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityZombie.class, 1.0D, true));

to:

this.tasks.addTask(6, new EntityAIAttackOnCollide(this, EntityZombie.class, 1.0D, true));

Link to comment
Share on other sites

Okay, first of all there are a few things going on with how different AI work with each other. First of all, within each list (tasks and targetTasks) there is the priority value. It will check if each AI should start based on the priority. The lower the number, the higher the priority. If two have the same priority, then they'll be checked in the order they were added to the list.

 

You can have multiple AI running at the same time, but sometimes you don't want that (you don't want it wandering at the same time it is attacking), so there are the "mutex" bits. This is a masking system which indicates which tasks should be prevented from running together. This is why the priority matters -- if two AI are prevented by the mutex from running simultaneously, then the one that starts first will always get precedence.

 

Lastly, there are two lists that are both simultaneously active: tasks and targetTasks. The priority list is independent in each, so they don't interact. Technically the targetTasks should simply be setting targets and the tasks should be acting on that information, but practically they can be mixed up -- they are just two lists of functionality running side by side.

 

I have a tutorial on this here: http://jabelarminecraft.blogspot.com/p/minecraft-forge-1721710-custom-entity-ai.html

 

Okay, however the original poster's problem is probably not related to the AI. There are a couple other things that can prevent custom entities from successfully attacking. You should read my tutorial on custom entity attacks: http://jabelarminecraft.blogspot.com/p/minecraft-forge-1721710-custom-entity.html

 

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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