net.minecraft.util.math.BlockPos#equals ( )源码实例Demo

下面列出了net.minecraft.util.math.BlockPos#equals ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: the-hallow   文件: BloodBlock.java
@Override
public void onEntityCollision(BlockState blockState, World world, BlockPos pos, Entity entity) {
	if(!world.isClient) {
		if (pos.equals(entity.getBlockPos())) {
			if (entity instanceof ItemEntity && !((ItemEntity) entity).getStack().isEmpty()) {
				ItemEntity itemEntity = (ItemEntity) entity;
				ItemStack stack = itemEntity.getStack();
				if (stack.getItem() instanceof DyeableItem) {
					DyeableItem item = (DyeableItem) stack.getItem();
					if (item.hasColor(stack)) item.setColor(stack, 0xFF0000 | item.getColor(stack));
					else item.setColor(stack, 0xFF0000);

					return;
				}
			}
		}
	}

	super.onEntityCollision(blockState, world, pos, entity);
}
 
源代码2 项目: GT-Classic   文件: GTUtility.java
public static boolean tryExplodeOtherAbsorbers(World world, BlockPos checkPos) {
	Iterable<BlockPos> surroundingPos = BlockPos.getAllInBox(checkPos.offset(EnumFacing.SOUTH, 4).offset(EnumFacing.WEST, 4), checkPos.offset(EnumFacing.NORTH, 4).offset(EnumFacing.EAST, 4));
	for (BlockPos absorberPos : surroundingPos) {
		if (absorberPos.equals(checkPos)) {
			continue;
		}
		TileEntity tile = world.getTileEntity(absorberPos);
		if (tile instanceof GTTileMagicEnergyAbsorber) {
			GTTileMagicEnergyAbsorber absorber = (GTTileMagicEnergyAbsorber) tile;
			if (absorber.portalMode && absorber.isAbovePortal) {
				world.setBlockToAir(absorberPos);
				world.removeTileEntity(absorberPos);
				world.createExplosion(null, absorberPos.getX(), absorberPos.getY(), absorberPos.getZ(), 8.0F, true);
				return true;
			}
		}
	}
	return false;
}
 
源代码3 项目: GT-Classic   文件: GTItemJackHammer.java
public boolean shouldBreak(EntityPlayer playerIn, World worldIn, BlockPos originalPos, BlockPos pos) {
	if (originalPos.equals(pos)) {
		return false;
	}
	IBlockState blockState = worldIn.getBlockState(pos);
	if (blockState.getMaterial() == Material.AIR) {
		return false;
	}
	if (blockState.getMaterial().isLiquid()) {
		return false;
	}
	float blockHardness = blockState.getPlayerRelativeBlockHardness(playerIn, worldIn, pos);
	if (blockHardness == -1.0F) {
		return false;
	}
	float originalHardness = worldIn.getBlockState(originalPos).getPlayerRelativeBlockHardness(playerIn, worldIn, originalPos);
	if ((originalHardness / blockHardness) > 10.0F) {
		return false;
	}
	return true;
}
 
源代码4 项目: BetterChests   文件: UpgradePlanting.java
@Override
public void update(IUpgradableBlock chest, ItemStack stack) {
	if (!UpgradeHelper.INSTANCE.isFirstUpgrade(chest, stack) || chest.getWorldObj().isRemote || !hasUpgradeOperationCost(chest)) {
		return;
	}
	int range = chest.getAmountUpgrades(stack) * 4 + 1;
	int states = UpgradeHelper.INSTANCE.getFrequencyTick(chest, stack, range * range);
	int xOffset = states % range - range / 2;
	int zOffset = states / range - range / 2;

	World world = chest.getWorldObj();
	BlockPos pos = chest.getPosition().add(xOffset, 0, zOffset);
	if (pos.equals(chest.getPosition())) {
		return;
	}
	IBlockState state = world.getBlockState(pos);
	if (state.getBlock().isReplaceable(world, pos)) {
		world.setBlockToAir(pos);
	}
	plantBlock((IBetterChest) chest, pos, stack);
}
 
源代码5 项目: BaseMetals   文件: BlockMetalDoor.java
@Override
  public boolean onBlockActivated(final World world, final BlockPos coord, IBlockState blockstate, 
  		                        final EntityPlayer player,
                                  final EnumHand hand, ItemStack heldItem,
                                  final EnumFacing face,
  		                        final float partialX, final float partialY, final float partialZ) {
if (this.metal.getToolHarvestLevel() > 1) {
          return false;
      }
      final BlockPos pos = (blockstate.getValue(BlockDoor.HALF) == EnumDoorHalf.LOWER) ? coord : coord.down();
      final IBlockState bs = coord.equals(pos) ? blockstate : world.getBlockState(pos);
      if (bs.getBlock() != this) {
          return false;
      }
      blockstate = bs.cycleProperty(BlockDoor.OPEN);
      world.setBlockState(pos, blockstate, 2);
      world.markBlockRangeForRenderUpdate(pos, coord);
      world.playEvent(player, ((Boolean)blockstate.getValue(BlockDoor.OPEN)) ? 1003 : 1006, coord, 0);
      return true;
  }
 
源代码6 项目: TofuCraftReload   文件: TofuVillageCollection.java
private boolean positionInList(BlockPos pos) {
    for (BlockPos blockpos : this.villagerPositionsList) {
        if (blockpos.equals(pos)) {
            return true;
        }
    }

    return false;
}
 
源代码7 项目: Sakura_mod   文件: WorldGenBigSakura.java
/**
 * Generates additional wood blocks to fill out the bases of different leaf nodes that would otherwise degrade.
 */
void generateLeafNodeBases()
{
    for (WorldGenBigSakura.FoliageCoordinates worldgenbigtree$foliagecoordinates : this.foliageCoords)
    {
        int i = worldgenbigtree$foliagecoordinates.getBranchBase();
        BlockPos blockpos = new BlockPos(this.basePos.getX(), i, this.basePos.getZ());

        if (!blockpos.equals(worldgenbigtree$foliagecoordinates) && this.leafNodeNeedsBase(i - this.basePos.getY()))
        {
            this.limb(blockpos, worldgenbigtree$foliagecoordinates, BlockLoader.SAKURA_LOG);
        }
    }
}
 
源代码8 项目: Sakura_mod   文件: WorldGenBigMaple.java
/**
 * Generates additional wood blocks to fill out the bases of different leaf nodes that would otherwise degrade.
 */
void generateLeafNodeBases()
{
    for (WorldGenBigMaple.FoliageCoordinates worldgenbigtree$foliagecoordinates : this.foliageCoords)
    {
        int i = worldgenbigtree$foliagecoordinates.getBranchBase();
        BlockPos blockpos = new BlockPos(this.basePos.getX(), i, this.basePos.getZ());

        if (!blockpos.equals(worldgenbigtree$foliagecoordinates) && this.leafNodeNeedsBase(i - this.basePos.getY()))
        {
            this.limb(blockpos, worldgenbigtree$foliagecoordinates,metaWood.getBlock());
        }
    }
}
 
private void updateConnectedCrystals() {
    this.connectedCrystalsIds.clear();
    final double maxDistance = 64 * 64;
    List<EntityEnderCrystal> enderCrystals = Arrays.stream(BiomeEndDecorator.getSpikesForWorld(getWorld()))
        .flatMap(endSpike -> getWorld().getEntitiesWithinAABB(EntityEnderCrystal.class, endSpike.getTopBoundingBox()).stream())
        .filter(crystal -> crystal.getDistanceSq(getPos()) < maxDistance)
        .collect(Collectors.toList());

    for (EntityEnderCrystal entityEnderCrystal : enderCrystals) {
        BlockPos beamTarget = entityEnderCrystal.getBeamTarget();
        if (beamTarget == null) {
            //if beam target is null, set ourselves as beam target
            entityEnderCrystal.setBeamTarget(getPos());
            this.connectedCrystalsIds.add(entityEnderCrystal.getEntityId());
        } else if (beamTarget.equals(getPos())) {
            //if beam target is ourselves, just add it to list
            this.connectedCrystalsIds.add(entityEnderCrystal.getEntityId());
        }
    }

    for (EntityDragon entityDragon : getWorld().getEntities(EntityDragon.class, EntitySelectors.IS_ALIVE)) {
        if (entityDragon.healingEnderCrystal != null && connectedCrystalsIds.contains(entityDragon.healingEnderCrystal.getEntityId())) {
            //if dragon is healing from crystal we draw energy from, reset it's healing crystal
            entityDragon.healingEnderCrystal = null;
            //if dragon is holding pattern, than deal damage and set it's phase to attack ourselves
            if (entityDragon.getPhaseManager().getCurrentPhase().getType() == PhaseList.HOLDING_PATTERN) {
                entityDragon.attackEntityFrom(DamageSource.causeExplosionDamage((EntityLivingBase) null), 10.0f);
                entityDragon.getPhaseManager().setPhase(PhaseList.CHARGING_PLAYER);
                ((PhaseChargingPlayer) entityDragon.getPhaseManager().getCurrentPhase()).setTarget(new Vec3d(getPos()));
            }
        }
    }
}
 
源代码10 项目: GT-Classic   文件: GTIBlockFilters.java
@Override
public boolean isValidBlock(World world, BlockPos blockPos) {
	Block block = world.getBlockState(blockPos).getBlock();
	if (block == GTBlocks.tileLESU) {
		if (blockPos.equals(this.tile.getPos())) {
			return false;
		}
		TileEntity worldTile = world.getTileEntity(blockPos);
		if (worldTile instanceof GTTileMultiLESU) {
			((GTTileMultiLESU) worldTile).enabled = false;
		}
		return false;
	}
	return block == GTBlocks.casingLapotron;
}
 
源代码11 项目: ForgeWurst   文件: TunnellerHack.java
@Override
public void run()
{
	BlockPos player = new BlockPos(WMinecraft.getPlayer());
	KeyBinding forward = mc.gameSettings.keyBindForward;
	
	Vec3d diffVec = new Vec3d(player.subtract(start));
	Vec3d dirVec = new Vec3d(direction.getDirectionVec());
	double dotProduct = diffVec.dotProduct(dirVec);
	
	BlockPos pos1 = start.offset(direction, (int)dotProduct);
	if(!player.equals(pos1))
	{
		RotationUtils.faceVectorForWalking(toVec3d(pos1));
		KeyBindingUtils.setPressed(forward, true);
		return;
	}
	
	BlockPos pos2 = start.offset(direction, Math.max(0, length - 10));
	if(!player.equals(pos2))
	{
		RotationUtils.faceVectorForWalking(toVec3d(pos2));
		KeyBindingUtils.setPressed(forward, true);
		WMinecraft.getPlayer().setSprinting(true);
		return;
	}
	
	BlockPos pos3 = start.offset(direction, length + 1);
	RotationUtils.faceVectorForWalking(toVec3d(pos3));
	KeyBindingUtils.setPressed(forward, false);
	WMinecraft.getPlayer().setSprinting(false);
	
	if(disableTimer > 0)
	{
		disableTimer--;
		return;
	}
	
	setEnabled(false);
}
 
源代码12 项目: enderutilities   文件: RenderEventHandler.java
protected void updatePointedBlockHilight(World world, BlockPos pos, IBlockState state, BlockEnderUtilities block, float partialTicks)
{
    EnumFacing facing = state.getValue(block.propFacing);

    if (pos.equals(this.pointedPosLast) == false || facing != this.pointedBlockFacingLast)
    {
        block.updateBlockHilightBoxes(world, pos, facing);
        this.pointedPosLast = pos;
        this.pointedBlockFacingLast = facing;
    }

    this.partialTicks = partialTicks;
}
 
源代码13 项目: litematica   文件: SchematicPlacementManager.java
public void setPositionOfCurrentSelectionTo(BlockPos pos, Minecraft mc)
{
    SchematicPlacement schematicPlacement = this.getSelectedSchematicPlacement();

    if (schematicPlacement != null)
    {
        if (schematicPlacement.isLocked())
        {
            InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "litematica.message.placement.cant_modify_is_locked");
            return;
        }

        boolean movingBox = schematicPlacement.getSelectedSubRegionPlacement() != null;

        if (movingBox)
        {
            this.moveSubRegionTo(schematicPlacement, schematicPlacement.getSelectedSubRegionName(), pos, InfoUtils.INFO_MESSAGE_CONSUMER);

            String posStr = String.format("x: %d, y: %d, z: %d", pos.getX(), pos.getY(), pos.getZ());
            InfoUtils.showGuiOrActionBarMessage(MessageType.SUCCESS, "litematica.message.placement.moved_subregion_to", posStr);
        }
        // Moving the origin point
        else
        {
            BlockPos old = schematicPlacement.getOrigin();
            this.setOrigin(schematicPlacement, pos, InfoUtils.INFO_MESSAGE_CONSUMER);

            if (old.equals(schematicPlacement.getOrigin()) == false)
            {
                String posStrOld = String.format("x: %d, y: %d, z: %d", old.getX(), old.getY(), old.getZ());
                String posStrNew = String.format("x: %d, y: %d, z: %d", pos.getX(), pos.getY(), pos.getZ());
                InfoUtils.showGuiOrActionBarMessage(MessageType.SUCCESS, "litematica.message.placement.moved_placement_origin", posStrOld, posStrNew);
            }
        }
    }
}
 
源代码14 项目: litematica   文件: SubRegionPlacement.java
void setPos(BlockPos pos)
{
    BlockPos newPos = PositionUtils.getModifiedPartiallyLockedPosition(this.pos, pos, this.coordinateLockMask);

    if (newPos.equals(this.pos) == false)
    {
        this.pos = newPos;
    }
    else if (pos.equals(this.pos) == false && this.coordinateLockMask != 0)
    {
        InfoUtils.showGuiOrInGameMessage(MessageType.ERROR, 2000, "litematica.error.schematic_placements.coordinate_locked");
    }
}
 
源代码15 项目: enderutilities   文件: PortalFormer.java
private EnumFacing checkFramePositionIgnoringSide(BlockPos posIn, EnumFacing ignoreSide)
{
    BlockPos pos = posIn;
    IBlockState state;
    Block block;
    EnumFacing continueTo = null;
    int frames = 0;

    if (this.visited.contains(posIn))
    {
        return null;
    }

    for (EnumFacing side : EnumFacing.values())
    {
        if (side != ignoreSide)
        {
            pos = posIn.offset(side);

            if (pos.equals(this.lastPos))
            {
                continue;
            }

            state = this.world.getBlockState(pos);
            block = state.getBlock();

            if (block.isAir(state, this.world, pos) || block == this.blockPortal)
            {
                this.checkForCorner(pos, false);

                // This is to fix single block portals not getting found via the checkForCorner() method.
                // The actual portal block count will be skewed, but it isn't used for anything other than a "> 0" check anyway.
                if (block == this.blockPortal)
                {
                    this.portalsFound++;
                }
            }
            else if (block == this.blockFrame)
            {
                if (this.visited.contains(pos) == false)
                {
                    if (frames == 0)
                    {
                        continueTo = side;
                    }
                    else
                    {
                        this.branches.add(pos);
                    }
                }
                frames++;
            }
        }
    }

    this.visited.add(posIn);
    this.lastPos = posIn;

    return continueTo;
}
 
源代码16 项目: CommunityMod   文件: JobSetBlock.java
@Override
public void finishJob(boolean near)
{
	if (near)
	{
		IBlockState oldstate_actual = this.gnome.world.getBlockState(this.pos);
		Block oldblock_actual = oldstate_actual.getBlock();
		if (oldblock_actual == this.assign.oldblock)	// no mismatch, continue
		{
			if (!this.gnome.world.isRemote)
			{	
				// if destroying a block, need line of sight
				if (this.assign.type == EnumAssignType.DESTROY || this.assign.type == EnumAssignType.HARVEST)
				{
					// first, check if there's another block in the way
					BlockPos hitpos = WorldHelper.getTargetBlockTowards(this.gnome.world, this.gnome, this.pos);
					
					if (hitpos != null && !hitpos.equals(this.pos) && !this.gnome.world.isAirBlock(hitpos)) // if there's another block in the way, potentially break it
					{
						Block hitblock = WorldHelper.getBlock(this.gnome.world, hitpos);
						if (this.gnome.canDigBlock(hitpos))	// if can dig, break it
						{
							GnomeAssignment newAssign = new GnomeAssignment(hitpos, hitblock, Blocks.AIR, EnumAssignType.DESTROY);
							this.gnome.finishSetBlock(newAssign, true, false, false);
							this.setBlock(newAssign);
						}
						// finish the original setblock job to return it to the gnode if necessary
						this.gnome.finishSetBlock(this.assign, true, true, true);
					}
					else
					{
						// otherwise, continue
						this.gnome.finishSetBlock(this.assign, true, false, true);	
						this.setBlock(this.assign);
					}
				}
				else
				{
					this.gnome.finishSetBlock(this.assign, true, false, true);	
					this.setBlock(this.assign);
				}
			}
		}
		else	// mismatch, invalid job, return to blueprint
		{
			this.gnome.finishSetBlock(this.assign, true, true, true);
		}
	}
	else	// failed and not near yet
	{// do gnome-specific end-of-job stuff
		this.gnome.finishSetBlock(this.assign, false, false, true);
	}
}
 
源代码17 项目: Wurst7   文件: TunnellerHack.java
@Override
public void run()
{
	BlockPos player = new BlockPos(MC.player.getPos());
	KeyBinding forward = MC.options.keyForward;
	
	Vec3d diffVec = Vec3d.of(player.subtract(start));
	Vec3d dirVec = Vec3d.of(direction.getVector());
	double dotProduct = diffVec.dotProduct(dirVec);
	
	BlockPos pos1 = start.offset(direction, (int)dotProduct);
	if(!player.equals(pos1))
	{
		WURST.getRotationFaker()
			.faceVectorClientIgnorePitch(toVec3d(pos1));
		forward.setPressed(true);
		return;
	}
	
	BlockPos pos2 = start.offset(direction, Math.max(0, length - 10));
	if(!player.equals(pos2))
	{
		WURST.getRotationFaker()
			.faceVectorClientIgnorePitch(toVec3d(pos2));
		forward.setPressed(true);
		MC.player.setSprinting(true);
		return;
	}
	
	BlockPos pos3 = start.offset(direction, length + 1);
	WURST.getRotationFaker().faceVectorClientIgnorePitch(toVec3d(pos3));
	forward.setPressed(false);
	MC.player.setSprinting(false);
	
	if(disableTimer > 0)
	{
		disableTimer--;
		return;
	}
	
	setEnabled(false);
}
 
源代码18 项目: fabric-carpet   文件: OptimizedExplosion.java
private static void blastCalc(Explosion e){
    ExplosionAccessor eAccess = (ExplosionAccessor) e;
    if(blastChanceLocation == null || blastChanceLocation.getSquaredDistance(eAccess.getX(), eAccess.getY(), eAccess.getZ(), false) > 200) return;
    chances.clear();
    for (int j = 0; j < 16; ++j) {
        for (int k = 0; k < 16; ++k) {
            for (int l = 0; l < 16; ++l) {
                if (j == 0 || j == 15 || k == 0 || k == 15 || l == 0 || l == 15) {
                    double d0 = (double) ((float) j / 15.0F * 2.0F - 1.0F);
                    double d1 = (double) ((float) k / 15.0F * 2.0F - 1.0F);
                    double d2 = (double) ((float) l / 15.0F * 2.0F - 1.0F);
                    double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
                    d0 = d0 / d3;
                    d1 = d1 / d3;
                    d2 = d2 / d3;
                    float f = eAccess.getPower() * (0.7F + 0.6F);
                    double d4 = eAccess.getX();
                    double d6 = eAccess.getY();
                    double d8 = eAccess.getZ();
                    boolean found = false;

                    for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
                        BlockPos blockpos = new BlockPos(d4, d6, d8);
                        BlockState state = eAccess.getWorld().getBlockState(blockpos);
                        FluidState fluidState = eAccess.getWorld().getFluidState(blockpos);

                        if (state.getMaterial() != Material.AIR) {
                            float f2 = Math.max(state.getBlock().getBlastResistance(), fluidState.getBlastResistance());
                            if (eAccess.getEntity() != null)
                                f2 = eAccess.getEntity().getEffectiveExplosionResistance(e, eAccess.getWorld(), blockpos, state, fluidState, f2);
                            f -= (f2 + 0.3F) * 0.3F;
                        }

                        if (f > 0.0F && (eAccess.getEntity() == null ||
                                eAccess.getEntity().canExplosionDestroyBlock(e, eAccess.getWorld(), blockpos, state, f))) {
                            if(!found && blockpos.equals(blastChanceLocation)){
                                chances.add(f);
                                found = true;
                            }
                        }

                        d4 += d0 * 0.30000001192092896D;
                        d6 += d1 * 0.30000001192092896D;
                        d8 += d2 * 0.30000001192092896D;
                    }
                }
            }
        }
    }

    showTNTblastChance(e);
}
 
源代码19 项目: enderutilities   文件: PortalFormer.java
private boolean walkFrameLoop(BlockPos pos, EnumFacing.Axis axis, EnumFacing frameSide, int distanceLimit)
{
    int counter = 0;
    int turns = 0;
    int tries = 0;
    IBlockState state;
    Block block;
    BlockPos startPos = pos;
    BlockPos posLast = startPos;
    EnumFacing firstTrySide = frameSide;
    EnumFacing moveDirection = frameSide;

    while (counter < distanceLimit)
    {
        moveDirection = firstTrySide;

        for (tries = 0; tries < 4; tries++)
        {
            pos = posLast.offset(moveDirection);
            state = this.world.getBlockState(pos);
            block = state.getBlock();

            if (block.isAir(state, this.world, pos))
            {
                posLast = pos;

                // The firstTrySide is facing into the adjacent portal frame when traveling
                // along a straight frame. Thus we need to rotate it once to keep going straight.
                // If we need to rotate it more than once, then we have hit a "right hand corner".
                if (tries > 1)
                {
                    turns++;
                }
                // If we didn't have to rotate the firstTrySide at all, then we hit a "left hand turn"
                // ie. traveled through an outer bend.
                else if (tries == 0)
                {
                    turns--;
                }

                // Set the firstTrySide one rotation back from the side that we successfully moved to
                // so that we can go around possible outer bends.
                firstTrySide = moveDirection.rotateAround(axis).getOpposite();

                break;
            }
            // Found a portal frame block, try the next adjacent side...
            else if (block == this.blockFrame)
            {
                moveDirection = moveDirection.rotateAround(axis);
            }
            // Found a non-air, non-portal-frame block -> invalid area.
            else
            {
                return false;
            }
        }

        // If we can return to the starting position hugging the portal frame,
        // then this is a valid portal frame loop.
        // Note that it is only valid if it forms an inside area, thus the turns check.
        // the tries == 4 && counter == 0 check is for a 1x1 area special case
        if ((tries == 4 && counter == 0) || pos.equals(startPos))
        {
            return turns >= 0;
        }

        counter++;
    }

    return false;
}
 
源代码20 项目: Valkyrien-Skies   文件: ItemRelayWire.java
@Override
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos,
    EnumHand hand,
    EnumFacing facing, float hitX, float hitY, float hitZ) {
    IBlockState clickedState = worldIn.getBlockState(pos);
    Block block = clickedState.getBlock();
    TileEntity currentTile = worldIn.getTileEntity(pos);
    ItemStack stack = player.getHeldItem(hand);

    if (currentTile instanceof IVSNodeProvider && !worldIn.isRemote) {
        ICapabilityLastRelay inst = stack
            .getCapability(ValkyrienSkiesControl.lastRelayCapability, null);
        if (inst != null) {
            if (!inst.hasLastRelay()) {
                inst.setLastRelay(pos);
                // Draw a wire in the player's hand after this
            } else {
                BlockPos lastPos = inst.getLastRelay();
                double distanceSq = lastPos.distanceSq(pos);
                TileEntity lastPosTile = worldIn.getTileEntity(lastPos);
                // System.out.println(lastPos.toString());

                if (!lastPos.equals(pos) && lastPosTile != null && currentTile != null) {
                    if (distanceSq < VSConfig.relayWireLength * VSConfig.relayWireLength) {
                        IVSNode lastPosNode = ((IVSNodeProvider) lastPosTile).getNode();
                        IVSNode currentPosNode = ((IVSNodeProvider) currentTile).getNode();
                        if (lastPosNode != null && currentPosNode != null) {
                            if (currentPosNode.isLinkedToNode(lastPosNode)) {
                                player.sendMessage(
                                    new TextComponentString("These nodes are already linked!"));
                            } else if (currentPosNode.canLinkToOtherNode(lastPosNode)) {
                                currentPosNode.makeConnection(lastPosNode);
                                stack.damageItem(1, player);
                            } else {
                                // Tell the player what they did wrong
                                player.sendMessage(new TextComponentString(TextFormatting.RED +
                                    I18n.format("message.vs_control.error_relay_wire_limit", VSConfig.networkRelayLimit)));
                            }
                            inst.setLastRelay(null);
                        }
                    } else {
                        player.sendMessage(
                            new TextComponentString(TextFormatting.RED +
                                I18n.format("message.vs_control.error_relay_wire_length")));
                        inst.setLastRelay(null);
                    }
                } else {
                    inst.setLastRelay(pos);
                }
            }
        }
    }

    if (currentTile instanceof IVSNodeProvider) {
        return EnumActionResult.SUCCESS;
    }

    return EnumActionResult.PASS;
}