Updated the hp/damage/etc logic of the corrupted mobs in general, and made it so the sheep will cast resistance on hurt allies when nearby on a cooldown.

Added an alchemy array layer (WIP) for the sheep when it is casting a "spell".
This commit is contained in:
WayofTime 2016-09-18 18:44:18 -04:00
parent cbd2609fe2
commit d6c1d59e5d
11 changed files with 652 additions and 31 deletions

View file

@ -0,0 +1,105 @@
package WayofTime.bloodmagic.entity.ai;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase;
import WayofTime.bloodmagic.inversion.CorruptionHandler;
public class EntityAIEatAndCorruptBlock extends EntityAIBase
{
/** The entity owner of this AITask */
private final EntityAspectedDemonBase grassEaterEntity;
/** The world the grass eater entity is eating from */
private final World world;
/** Number of ticks since the entity started to eat grass */
int eatingGrassTimer;
public EntityAIEatAndCorruptBlock(EntityAspectedDemonBase entity)
{
this.grassEaterEntity = entity;
this.world = entity.worldObj;
this.setMutexBits(7);
}
/**
* Returns whether the EntityAIBase should begin execution.
*/
public boolean shouldExecute()
{
if (this.grassEaterEntity.getRNG().nextInt(50) != 0)
{
return false;
} else
{
BlockPos pos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ).down();
IBlockState offsetState = world.getBlockState(pos);
Block offsetBlock = offsetState.getBlock();
return CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), pos, offsetState, offsetBlock);
}
}
/**
* Execute a one shot task or start executing a continuous task
*/
public void startExecuting()
{
this.eatingGrassTimer = 40;
this.world.setEntityState(this.grassEaterEntity, (byte) 10);
this.grassEaterEntity.getNavigator().clearPathEntity();
}
/**
* Resets the task
*/
public void resetTask()
{
this.eatingGrassTimer = 0;
}
/**
* Returns whether an in-progress EntityAIBase should continue executing
*/
public boolean continueExecuting()
{
return this.eatingGrassTimer > 0;
}
/**
* Number of ticks since the entity started to eat grass
*/
public int getEatingGrassTimer()
{
return this.eatingGrassTimer;
}
/**
* Updates the task
*/
public void updateTask()
{
this.eatingGrassTimer = Math.max(0, this.eatingGrassTimer - 1);
if (this.eatingGrassTimer == 4)
{
BlockPos blockpos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ);
BlockPos offsetPos = blockpos.down();
IBlockState offsetState = world.getBlockState(offsetPos);
Block offsetBlock = offsetState.getBlock();
if (CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), offsetPos, offsetState, offsetBlock))
{
// if (this.world.getGameRules().getBoolean("mobGriefing"))
{
this.world.playEvent(2001, offsetPos, Block.getIdFromBlock(offsetBlock));
CorruptionHandler.corruptSurroundingBlocks(world, grassEaterEntity.getType(), offsetPos, 2, 0.5, 0.5);
}
this.grassEaterEntity.eatGrassBonus();
}
}
}
}

View file

@ -0,0 +1,107 @@
package WayofTime.bloodmagic.entity.ai;
import java.util.List;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.world.World;
import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase;
import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep;
public class EntityAIProtectAlly extends EntityAIBase
{
/** The entity owner of this AITask */
private final EntityCorruptedSheep entity;
/** The world the grass eater entity is eating from */
private final World world;
/** Number of ticks since the entity started to eat grass */
int castTimer;
public EntityAIProtectAlly(EntityCorruptedSheep entity)
{
this.entity = entity;
this.world = entity.worldObj;
this.setMutexBits(7);
}
public int getCastTimer()
{
return this.castTimer;
}
/**
* Returns whether the EntityAIBase should begin execution.
*/
@Override
public boolean shouldExecute()
{
AxisAlignedBB bb = new AxisAlignedBB(entity.posX - 0.5, entity.posY - 0.5, entity.posZ - 0.5, entity.posX + 0.5, entity.posY + 0.5, entity.posZ + 0.5).expandXyz(5);
List<EntityLivingBase> list = world.getEntitiesWithinAABB(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType()));
for (EntityLivingBase testEntity : list)
{
if (testEntity != this.entity)
{
if (this.entity.canProtectAlly(testEntity))
{
return true;
}
}
}
return false;
}
/**
* Execute a one shot task or start executing a continuous task
*/
@Override
public void startExecuting()
{
this.castTimer = 100;
this.world.setEntityState(this.entity, (byte) 53);
this.entity.getNavigator().clearPathEntity();
}
/**
* Resets the task
*/
@Override
public void resetTask()
{
this.castTimer = 0;
}
/**
* Returns whether an in-progress EntityAIBase should continue executing
*/
@Override
public boolean continueExecuting()
{
return castTimer > 0;
}
/**
* Updates the task
*/
@Override
public void updateTask()
{
this.castTimer = Math.max(0, this.castTimer - 1);
if (castTimer == 0)
{
AxisAlignedBB bb = new AxisAlignedBB(entity.posX - 0.5, entity.posY - 0.5, entity.posZ - 0.5, entity.posX + 0.5, entity.posY + 0.5, entity.posZ + 0.5).expandXyz(5);
List<EntityLivingBase> list = world.getEntitiesWithinAABB(EntityLivingBase.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType()));
for (EntityLivingBase testEntity : list)
{
if (testEntity != this.entity)
{
if (this.entity.applyProtectionToAlly(testEntity))
{
return;
}
}
}
}
}
}