Jump to content

[SOLVED][1.11.2] BlockPos doesn't work correctly


Yurim64

Recommended Posts

Hi guys, I don't know why but my code doesn't work.
Thw autodrill should dig a 3x3 area. But when i activate the block to the south or north the block dig a 1x3 area. And when to the up or down dig a cross. But work correctly if i look at west or east.
Someone can help me?

 

This is the AutoDrill class

public class AutoDrill2 extends Block {

	private final String name = "autodrill2";

	public AutoDrill2() {
		super(Material.IRON);
		this.setRegistryName(this.name);
		this.setUnlocalizedName(this.name);
		this.setResistance(2.0F);
		this.setHardness(5.0F);
		this.setHarvestLevel("pickaxe", 0);
	}

	@Override
	public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn,
			EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
		BlockPos newPos = getPos(pos, facing);
		worldIn.destroyBlock(pos, false);
		BlockPos[] p = new BlockPos[9];	
		p = initPositions(p, newPos, facing);
		for (int i = 0; i < 64; i++) {
			for (int j = 0; j < p.length; j++) {
				if (worldIn.getBlockState(p[j]).getBlock() == Blocks.BEDROCK)
					continue;
				worldIn.destroyBlock(p[j], true);
				p[j] = getPos(p[j], facing);
			}
		}
		return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ);
	}

	private BlockPos[] initPositions(BlockPos[] pos, BlockPos center, EnumFacing facing) {
		pos[0] = center;
		pos[1] = center.up();
		pos[2] = center.down();
		switch (facing) {
		case DOWN: {
			pos[1] = new BlockPos(center.getX() + 1, center.getY(), center.getZ());
			pos[2] = new BlockPos(center.getX() - 1, center.getY(), center.getZ());
			pos[3] = new BlockPos(center.getX(), center.getY(), center.getZ() + 1);
			pos[4] = new BlockPos(center.getX(), center.getY(), center.getZ() - 1);
			pos[5] = new BlockPos(center.getX() + 1, center.getY(), center.getZ() + 1);
			pos[6] = new BlockPos(center.getX() + 1, center.getY(), center.getZ() - 1);
			pos[7] = new BlockPos(center.getX() - 1, center.getY(), center.getZ() + 1);
			pos[8] = new BlockPos(center.getX() - 1, center.getY(), center.getZ() - 1);
		}
		case UP: {
			pos[1] = new BlockPos(center.getX() + 1, center.getY(), center.getZ());
			pos[2] = new BlockPos(center.getX() - 1, center.getY(), center.getZ());
			pos[3] = new BlockPos(center.getX() + 1, center.getY(), center.getZ() + 1);
			pos[4] = new BlockPos(center.getX() + 1, center.getY(), center.getZ() - 1);
			pos[5] = new BlockPos(center.getX() - 1, center.getY(), center.getZ() + 1);
			pos[6] = new BlockPos(center.getX() - 1, center.getY(), center.getZ() - 1);
			pos[7] = new BlockPos(center.getX(), center.getY(), center.getZ() + 1);
			pos[8] = new BlockPos(center.getX(), center.getY(), center.getZ() - 1);
		}
		case NORTH: {
			pos[3] = new BlockPos(center.getX() + 1, center.getY(), center.getZ());
			pos[4] = new BlockPos(center.getX() - 1, center.getY(), center.getZ());
			pos[5] = new BlockPos(center.getX() + 1, center.getY() + 1, center.getZ());
			pos[6] = new BlockPos(center.getX() + 1, center.getY() - 1, center.getZ());
			pos[7] = new BlockPos(center.getX() - 1, center.getY() + 1, center.getZ());
			pos[8] = new BlockPos(center.getX() - 1, center.getY() - 1, center.getZ());
		}
		case SOUTH: {
			pos[3] = new BlockPos(center.getX() + 1, center.getY(), center.getZ());
			pos[4] = new BlockPos(center.getX() - 1, center.getY(), center.getZ());
			pos[5] = new BlockPos(center.getX() + 1, center.getY() + 1, center.getZ());
			pos[6] = new BlockPos(center.getX() + 1, center.getY() - 1, center.getZ());
			pos[7] = new BlockPos(center.getX() - 1, center.getY() + 1, center.getZ());
			pos[8] = new BlockPos(center.getX() - 1, center.getY() - 1, center.getZ());
		}
		case EAST: {
			pos[3] = new BlockPos(center.getX(), center.getY(), center.getZ() + 1);
			pos[4] = new BlockPos(center.getX(), center.getY(), center.getZ() - 1);
			pos[5] = new BlockPos(center.getX(), center.getY() + 1, center.getZ() + 1);
			pos[6] = new BlockPos(center.getX(), center.getY() - 1, center.getZ() + 1);
			pos[7] = new BlockPos(center.getX(), center.getY() + 1, center.getZ() - 1);
			pos[8] = new BlockPos(center.getX(), center.getY() - 1, center.getZ() - 1);
		}
		case WEST: {
			pos[3] = new BlockPos(center.getX(), center.getY(), center.getZ() + 1);
			pos[4] = new BlockPos(center.getX(), center.getY(), center.getZ() - 1);
			pos[5] = new BlockPos(center.getX(), center.getY() + 1, center.getZ() + 1);
			pos[6] = new BlockPos(center.getX(), center.getY() - 1, center.getZ() + 1);
			pos[7] = new BlockPos(center.getX(), center.getY() + 1, center.getZ() - 1);
			pos[8] = new BlockPos(center.getX(), center.getY() - 1, center.getZ() - 1);
		}
		}
		return pos;
	}

	private BlockPos getPos(BlockPos pos, EnumFacing facing) {
		switch (facing) {
		case DOWN: {
			return pos.up();
		}
		case UP: {
			return pos.down();
		}
		case NORTH: {
			return pos.south();
		}
		case SOUTH: {
			return pos.north();
		}
		case EAST: {
			return pos.west();
		}
		case WEST: {
			return pos.east();
		}
		}
		throw new IllegalArgumentException("Invalid Facing " + facing.name());
	}

}

 

Edited by Yurim64
Link to comment
Share on other sites

Ok, I update the code but it doesn't work anyway

Thi is the new class

public class CoalDrillTileEntity extends TileEntity implements ITickable {

	private int cooldown;
	private String customName;
	private ItemStackHandler handler;
	private boolean isFinished;
	private EnumFacing facing;
	private int index = 0;

	public CoalDrillTileEntity() {
		this.cooldown = 0;
		this.customName = "Coal Drill T.1";
		this.isFinished = false;
		this.facing = EnumFacing.DOWN;
		this.handler = new ItemStackHandler(1);
	}

	@Override
	public void readFromNBT(NBTTagCompound nbt) {
		this.cooldown = nbt.getInteger("Cooldown");
		this.customName = nbt.getString("CustomName");
		this.isFinished = nbt.getBoolean("Is Finished");
		this.handler.deserializeNBT(nbt.getCompoundTag("ItemStackHandler"));
		super.readFromNBT(nbt);
	}

	@Override
	public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
		nbt.setInteger("Cooldown", cooldown);
		nbt.setBoolean("Is Finished", isFinished);
		nbt.setString("CustomName", customName);
		nbt.setTag("ItemStackHandler", handler.serializeNBT());
		return super.writeToNBT(nbt);
	}

	public String getCustomName() {
		return customName;
	}

	public void setCustomName(String customName) {
		this.customName = customName;
	}

	@Override
	public void update() {
		if (!this.world.isRemote && !isFinished) {
			this.cooldown++;
			this.cooldown %= 100;
			if (this.cooldown == 0 && this.getCoal() > 0) {
				BlockPos pos = this.pos.offset(this.facing);
				int distance = 0;
				for (int i = 0; i < 8; distance++) {
					Block b = this.world.getBlockState(pos).getBlock();
					if (distance == 200 || b == Blocks.BEDROCK) {
						isFinished = true;
						return;
					}
					if (b == Blocks.AIR) {
						pos = pos.offset(this.facing);
						continue;
					}
					this.world.destroyBlock(pos, false);
					if (this.world.getBlockState(this.pos.up()).getBlock() == Blocks.CHEST) {
						ItemStack item = new ItemStack(b.getItemDropped(b.getDefaultState(), new Random(), 0), 1);
						TileEntityChest chest = (TileEntityChest) this.world.getTileEntity(this.pos.up());
						IItemHandler handler = chest.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
						int k = 0;
						while (k < handler.getSlots() && handler.insertItem(k, item, false) != ItemStack.EMPTY)
							k++;
						if (k == handler.getSlots())
							b.dropBlockAsItem(this.world, this.pos, b.getDefaultState(), 0);
					} else {
						b.dropBlockAsItem(this.world, this.pos, b.getDefaultState(), 0);
					}
					pos = pos.offset(this.facing);
					i++;
				}
			}
		}
	}

	public void changeFacing() {
		index++;
		if (index == EnumFacing.values().length)
			index = 0;
		this.facing = EnumFacing.values()[index];
	}

	public EnumFacing getFacing() {
		return facing;
	}

	private boolean isInventoryFull() {
		int filledSlots = 0;
		for (int slot = 0; slot < handler.getSlots(); slot++) {
			if (handler.getStackInSlot(slot).getCount() == handler.getSlotLimit(slot))
				filledSlots++;
		}
		return filledSlots == handler.getSlots();
	}

	private int getCoal() {
		ItemStack stack = this.handler.getStackInSlot(0);
		if (stack == ItemStack.EMPTY)
			return 0;
		else if (stack.getItem() == Items.COAL) {
			this.handler.extractItem(0, 1, false);
			return 1;
		} else
			return 0;
	}

	@Override
	public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
		if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
			return (T) this.handler;
		return super.getCapability(capability, facing);
	}

	@Override
	public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
		if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
			return true;
		return super.hasCapability(capability, facing);
	}

	@Override
	public SPacketUpdateTileEntity getUpdatePacket() {
		NBTTagCompound nbt = new NBTTagCompound();
		this.writeToNBT(nbt);
		int metadata = getBlockMetadata();
		return new SPacketUpdateTileEntity(this.pos, metadata, nbt);
	}

	@Override
	public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
		this.readFromNBT(pkt.getNbtCompound());
	}

	@Override
	public NBTTagCompound getUpdateTag() {
		NBTTagCompound nbt = new NBTTagCompound();
		this.writeToNBT(nbt);
		return nbt;
	}

	@Override
	public void handleUpdateTag(NBTTagCompound tag) {
		this.readFromNBT(tag);
	}

	@Override
	public NBTTagCompound getTileData() {
		NBTTagCompound nbt = new NBTTagCompound();
		this.writeToNBT(nbt);
		return nbt;
	}

}

 

Link to comment
Share on other sites

Hypothetically, when you update the digging direction from the guide, the block should start digging in the set direction.
The problem is that when I call the changeFacing () method from the button action the direction only changes within the method. When the update is called, the facing variable returns to its original value.

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.

×
×
  • Create New...

Important Information

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