From 421aa77c0268d21530dd8a2e927a85d37656ca92 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 23 Aug 2016 19:41:05 -0400 Subject: [PATCH] Worked on mimic spawning and death - needs some adjustments --- .../bloodmagic/block/BlockMimic.java | 2 +- .../bloodmagic/entity/mob/EntityMimic.java | 145 +++++++++++++++++- .../WayofTime/bloodmagic/tile/TileMimic.java | 34 +++- 3 files changed, 169 insertions(+), 12 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java index d7a122dd..0ee45824 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java @@ -36,7 +36,7 @@ import WayofTime.bloodmagic.tile.TileMimic; public class BlockMimic extends BlockStringContainer implements IVariantProvider { - + public static final int sentientMimicMeta = 4; public static final String[] names = { "nohitbox", "solidopaque", "solidclear", "solidlight", "sentient" }; public BlockMimic() diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java index ae5980c4..3bd2fd8c 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.entity.mob; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; @@ -15,19 +16,27 @@ import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; +import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.pathfinding.PathNavigate; import net.minecraft.pathfinding.PathNavigateClimber; import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import WayofTime.bloodmagic.block.BlockMimic; +import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.tile.TileMimic; public class EntityMimic extends EntityMob { @@ -35,6 +44,13 @@ public class EntityMimic extends EntityMob * Copy of EntitySpider's AI (should be pretty evident...) */ private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityMimic.class, DataSerializers.BYTE); +// private static final DataParameter> ITEMSTACK = EntityDataManager.>createKey(EntityMimic.class, DataSerializers.OPTIONAL_ITEM_STACK); + + public boolean dropItemsOnBreak = true; + public NBTTagCompound tileTag = new NBTTagCompound(); + public int metaOfReplacedBlock = 0; + +// public ItemStack heldStack = null; public EntityMimic(World worldIn) { @@ -42,11 +58,6 @@ public class EntityMimic extends EntityMob this.setSize(1.4F, 0.9F); } - public ItemStack getItemStack() - { - return new ItemStack(Blocks.CHEST); - } - protected void initEntityAI() { this.tasks.addTask(1, new EntityAISwimming(this)); @@ -60,6 +71,127 @@ public class EntityMimic extends EntityMob this.targetTasks.addTask(3, new EntityMimic.AISpiderTarget(this, EntityIronGolem.class)); } + @Override + public void writeEntityToNBT(NBTTagCompound tag) + { + super.writeEntityToNBT(tag); + + tag.setBoolean("dropItemsOnBreak", dropItemsOnBreak); + tag.setTag("tileTag", tileTag); + tag.setInteger("metaOfReplacedBlock", metaOfReplacedBlock); + +// NBTTagCompound itemTag = new NBTTagCompound(); +// if (heldStack != null) +// { +// heldStack.writeToNBT(itemTag); +// } +// +// tag.setTag("heldItem", itemTag); + } + + @Override + public void readEntityFromNBT(NBTTagCompound tag) + { + super.readEntityFromNBT(tag); + + dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); + tileTag = tag.getCompoundTag("tileTag"); + metaOfReplacedBlock = tag.getInteger("metaOfReplacedBlock"); +// NBTTagCompound itemTag = tag.getCompoundTag("heldItem"); +// +// if (!itemTag.hasNoTags()) +// { +// heldStack = ItemStack.loadItemStackFromNBT(itemTag); +// } +// mimicedTile = getTileFromStackWithTag(worldObj, pos, getStackInSlot(0), tileTag, metaOfReplacedBlock); + } + + public ItemStack getItemStack() + { +// System.out.println(heldStack); + return this.getItemStackFromSlot(EntityEquipmentSlot.CHEST); +// return ItemStack.copyItemStack(heldStack); + } + + public void setItemStack(ItemStack stack) + { + this.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack); + } + + public boolean spawnHeldBlockOnDeath(World world, BlockPos pos) + { + return world.isAirBlock(pos) && TileMimic.replaceMimicWithBlockActual(world, pos, getItemStack(), tileTag, metaOfReplacedBlock); + } + + public boolean spawnMimicBlockAtPosition(World world, BlockPos pos) + { + if (world.isAirBlock(pos)) + { + IBlockState mimicState = ModBlocks.mimic.getStateFromMeta(BlockMimic.sentientMimicMeta); + world.setBlockState(pos, mimicState, 3); + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof TileMimic) + { + TileMimic mimic = (TileMimic) tile; + mimic.metaOfReplacedBlock = metaOfReplacedBlock; + mimic.tileTag = tileTag; + mimic.setInventorySlotContents(0, getItemStack()); + mimic.dropItemsOnBreak = dropItemsOnBreak; + mimic.refreshTileEntity(); + } + } + + return false; + } + + public void initializeMimic(ItemStack heldStack, NBTTagCompound tileTag, boolean dropItemsOnBreak, int metaOfReplacedBlock) + { + this.setItemStack(heldStack); + this.tileTag = tileTag; + this.dropItemsOnBreak = dropItemsOnBreak; + this.metaOfReplacedBlock = metaOfReplacedBlock; + } + + @Override + public void onDeath(DamageSource cause) + { + super.onDeath(cause); + + if (!worldObj.isRemote) + { + BlockPos centerPos = this.getPosition(); + + int horizontalRadius = 1; + int verticalRadius = 1; + + for (int hR = 0; hR <= horizontalRadius; hR++) + { + for (int vR = 0; vR <= verticalRadius; vR++) + { + for (int i = -hR; i <= hR; i++) + { + for (int k = -hR; k <= hR; k++) + { + for (int j = -vR; j <= vR; j += 2 * vR + (vR > 0 ? 0 : 1)) + { + if (!(Math.abs(i) == hR || Math.abs(k) == hR)) + { + continue; + } + + BlockPos newPos = centerPos.add(i, j, k); + if (spawnHeldBlockOnDeath(worldObj, newPos)) + { + return; + } + } + } + } + } + } + } + } + /** * Returns the Y offset from the entity's position for any entity riding * this one. @@ -84,6 +216,7 @@ public class EntityMimic extends EntityMob { super.entityInit(); this.dataManager.register(CLIMBING, Byte.valueOf((byte) 0)); +// this.dataManager.register(ITEMSTACK, null); } /** diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java index c3ec6def..eec8cf98 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java @@ -17,6 +17,8 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.ReflectionHelper; +import WayofTime.bloodmagic.block.BlockMimic; +import WayofTime.bloodmagic.entity.mob.EntityMimic; import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.util.Utils; @@ -67,6 +69,28 @@ public class TileMimic extends TileInventory public boolean performSpecialAbility() { + switch (this.getBlockMetadata()) + { + case BlockMimic.sentientMimicMeta: + if (this.getStackInSlot(0) == null || worldObj.isRemote) + { + return false; + } + + EntityMimic mimicEntity = new EntityMimic(worldObj); + mimicEntity.setPosition(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + + mimicEntity.initializeMimic(getStackInSlot(0), tileTag, dropItemsOnBreak, metaOfReplacedBlock); + tileTag = null; + mimicedTile = null; + this.setInventorySlotContents(0, null); + + worldObj.spawnEntityInWorld(mimicEntity); + + worldObj.setBlockToAir(pos); + + return true; + } return false; } @@ -107,15 +131,15 @@ public class TileMimic extends TileInventory World world = mimic.getWorld(); BlockPos pos = mimic.getPos(); - replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag); + replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.metaOfReplacedBlock); } - public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag) + public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, NBTTagCompound tileTag, int replacedMeta) { if (stack != null && stack.getItem() instanceof ItemBlock) { Block block = ((ItemBlock) stack.getItem()).getBlock(); - IBlockState state = block.onBlockPlaced(world, pos, EnumFacing.UP, 0, 0, 0, stack.getItemDamage(), null); + IBlockState state = block.getStateFromMeta(replacedMeta); if (world.setBlockState(pos, state, 3)) { TileEntity tile = world.getTileEntity(pos); @@ -125,9 +149,9 @@ public class TileMimic extends TileInventory tileTag.setInteger("y", pos.getY()); tileTag.setInteger("z", pos.getZ()); tile.readFromNBT(tileTag); - - return true; } + + return true; } }