Skip to content
Permalink
Browse files

Pass through wall improvements

This change simplifies the algorithm greatly.

Additionally, this fixes a bug where if standing in a non-solid block
i.e. a glass pane, //thru, and the nav wand would not work.
  • Loading branch information...
DarkArc committed Jun 29, 2019
1 parent a9b3fb1 commit 917f8a18420e30da17e6784a1b20316a6aae35f4
@@ -394,51 +394,62 @@ public BaseBlock getBlockInHand(HandSide handSide) throws WorldEditException {
}
}

private boolean canPassThroughBlock(Location curBlock) {
BlockVector3 blockPos = curBlock.toVector().toBlockPoint();
BlockState block = curBlock.getExtent().getBlock(blockPos);
return !block.getBlockType().getMaterial().isMovementBlocker();
}

/**
* Get the player's view yaw.
*
* @return yaw
* Advances the block target block until the current block is a wall
* @return true if a wall is found
*/
private boolean advanceToWall(TargetBlock hitBlox) {
Location curBlock;
while ((curBlock = hitBlox.getCurrentBlock()) != null) {
if (!canPassThroughBlock(curBlock)) {
return true;
}

@Override
public boolean passThroughForwardWall(int range) {
int searchDist = 0;
TargetBlock hitBlox = new TargetBlock(this, range, 0.2);
Extent world = getLocation().getExtent();
Location block;
boolean firstBlock = true;
int freeToFind = 2;
boolean inFree = false;

while ((block = hitBlox.getNextBlock()) != null) {
boolean free = !world.getBlock(block.toVector().toBlockPoint()).getBlockType().getMaterial().isMovementBlocker();
hitBlox.getNextBlock();
}

if (firstBlock) {
firstBlock = false;
return false;
}

if (!free) {
--freeToFind;
continue;
}
/**
* Advances the block target block until the current block is a free
* @return true if a free spot is found
*/
private boolean advanceToFree(TargetBlock hitBlox) {
Location curBlock;
while ((curBlock = hitBlox.getCurrentBlock()) != null) {
if (canPassThroughBlock(curBlock)) {
return true;
}

++searchDist;
if (searchDist > 20) {
return false;
}
hitBlox.getNextBlock();
}

if (inFree != free) {
if (free) {
--freeToFind;
}
}
return false;
}

if (freeToFind == 0) {
setOnGround(block);
return true;
}
@Override
public boolean passThroughForwardWall(int range) {
TargetBlock hitBlox = new TargetBlock(this, range, 0.2);

if (!advanceToWall(hitBlox)) {
return false;
}

if (!advanceToFree(hitBlox)) {
return false;
}

inFree = free;
Location foundBlock = hitBlox.getCurrentBlock();
if (foundBlock != null) {
setOnGround(foundBlock);
return true;
}

return false;

0 comments on commit 917f8a1

Please sign in to comment.
You can’t perform that action at this time.