diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java new file mode 100644 index 00000000..00b695df --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java @@ -0,0 +1,227 @@ +package WayofTime.bloodmagic.alchemyArray; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyArrayEffect; +import WayofTime.bloodmagic.tile.TileAlchemyArray; + +import com.google.common.base.Predicate; + +/** + * Credits for the initial code go to Crazy Pants of EIO. + */ +public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect +{ + private EntitySkeleton turret; + + public static Predicate checkSkeleton = new Predicate() + { + @Override + public boolean apply(EntityMob input) + { + return !(input instanceof EntitySkeleton); + } + }; + + public AlchemyArrayEffectSkeletonTurret(String key) + { + super(key); + } + + @Override + public boolean update(TileEntity tile, int ticksActive) + { +// if (tile.getWorld().isRemote) +// { +// return false; +// } + + BlockPos pos = tile.getPos(); + + if (turret != null && !turret.isDead) + { + double x = (pos.getX() + 0.5D - turret.posX); + double y = (pos.getY() + 1D - turret.posY); + double z = (pos.getZ() + 0.5D - turret.posZ); + double distance = Math.sqrt(x * x + y * y + z * z); + + if (distance < 2) + { +// turret.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 100, 100)); + return false; + } + } + + World world = tile.getWorld(); + + List skeletonsInRange = world.getEntitiesWithinAABB(EntitySkeleton.class, getBounds(pos)); + + for (EntitySkeleton entity : skeletonsInRange) + { + if (!entity.isDead)// && isMobInFilter(ent)) + { + modifyAITargetTasks(entity); + turret = entity; + break; + } + } + + return false; + } + + public AxisAlignedBB getBounds(BlockPos pos) + { + return new AxisAlignedBB(pos).expand(getRange(), getRange(), getRange()); + } + + public float getRange() + { + return 0; + } + +// private void onUntracked(EntityLiving e) +// { +// e.getEntityData().setBoolean("BM:tracked", false); +// } +// +// private void onTracked(EntityLiving e) +// { +// e.getEntityData().setBoolean("BM:tracked", true); +// } + + private boolean modifyAITargetTasks(EntitySkeleton entity) + { + cancelCurrentTargetTasks(entity); + +// entity.setCombatTask(); + entity.targetTasks.addTask(1, new EntityAINearestAttackableTarget(entity, EntityMob.class, 10, true, false, checkSkeleton)); + entity.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0); + entity.getEntityAttribute(SharedMonsterAttributes.KNOCKBACK_RESISTANCE).setBaseValue(1); + return true; + } + + private void cancelCurrentTargetTasks(EntityLiving entity) + { + Iterator iterator = entity.targetTasks.taskEntries.iterator(); + + List currentTasks = new ArrayList(); + while (iterator.hasNext()) + { + EntityAITaskEntry entityaitaskentry = iterator.next(); + if (entityaitaskentry != null)// && entityaitaskentry.action instanceof EntityAITarget) + { + currentTasks.add(entityaitaskentry); + } + } + + for (EntityAITaskEntry task : currentTasks) + { + entity.targetTasks.removeTask(task.action); + } + } + + private static class AttractTask extends EntityAIBase + { + private EntityLiving mob; + private BlockPos coord; + private FakePlayer target; + private int updatesSincePathing; + + private boolean started = false; + + private AttractTask(EntityLiving mob, FakePlayer target, BlockPos coord) + { + this.mob = mob; + this.coord = coord; + this.target = target; + } + + @Override + public boolean shouldExecute() + { + return continueExecuting(); + } + + @Override + public void resetTask() + { + started = false; + updatesSincePathing = 0; + } + + @Override + public boolean continueExecuting() + { + boolean res = false; + //TODO: + TileEntity te = mob.worldObj.getTileEntity(coord); + if (te instanceof TileAlchemyArray) + { + res = true; + } + + return res; + } + + @Override + public boolean isInterruptible() + { + return true; + } + + @Override + public void updateTask() + { + if (!started || updatesSincePathing > 20) + { + started = true; + int speed = 1; + // mob.getNavigator().setAvoidsWater(false); + boolean res = mob.getNavigator().tryMoveToEntityLiving(target, speed); + if (!res) + { + mob.getNavigator().tryMoveToXYZ(target.posX, target.posY + 1, target.posZ, speed); + } + updatesSincePathing = 0; + } else + { + updatesSincePathing++; + } + } + + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectSkeletonTurret(key); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java index 33e1a9ce..e1ac51b5 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java @@ -18,6 +18,7 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectAttractor; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectMovement; +import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSkeletonTurret; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.altar.EnumAltarTier; import WayofTime.bloodmagic.api.compress.CompressionRegistry; @@ -231,7 +232,7 @@ public class ModRecipes AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ROTTEN_FLESH), new ItemStack(Items.ROTTEN_FLESH), new AlchemyArrayEffectAttractor("attractor"), new AttractorAlchemyCircleRenderer()); AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.FEATHER), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectMovement("movement"), new StaticAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ARROW), new ItemStack(Items.FEATHER), new AlchemyArrayEffectMovement("skeletonTurret"), new DualAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png"))); + AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ARROW), new ItemStack(Items.FEATHER), new AlchemyArrayEffectSkeletonTurret("skeletonTurret"), new DualAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png"))); } public static void addCompressionHandlers() diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json index a76baac7..477b3ece 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json +++ b/src/main/resources/assets/bloodmagic/blockstates/item/ItemComponent.json @@ -141,7 +141,7 @@ "layer0": "bloodmagic:items/Antiseptic" } }, - "reagentHolding": { + "reagentholding": { "textures": { "layer0": "bloodmagic:items/ReagentHolding" } diff --git a/src/main/resources/assets/bloodmagic/textures/items/ReagentHolding.png b/src/main/resources/assets/bloodmagic/textures/items/ReagentHolding.png new file mode 100644 index 00000000..f6530434 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/items/ReagentHolding.png differ