[MC-10176] Oak/Dark Oak Tree Branches can replace all solid blocks (including Bedrock and Barrier) Created: 23/Feb/13 Updated: 02/Feb/21 Resolved: 16/Jan/15 |
|
| Status: | Resolved |
| Project: | Minecraft: Java Edition |
| Component/s: | None |
| Affects Version/s: | Snapshot 13w07a, Snapshot 13w09a, Snapshot 13w09b, Snapshot 13w11a, Minecraft 1.6.4, Minecraft 13w42b, Minecraft 13w43a, Minecraft 1.7.1, Minecraft 1.7.2, Minecraft 1.7.4, Minecraft 14w02b, Minecraft 14w02c, Minecraft 14w03a, Minecraft 14w03b, Minecraft 14w08a, Minecraft 1.7.5, Minecraft 14w10b, Minecraft 14w10c, Minecraft 14w11b, Minecraft 1.7.6-pre1, Minecraft 1.7.10, Minecraft 14w30c, Minecraft 14w31a, Minecraft 14w32d, Minecraft 14w33c, Minecraft 14w34a, Minecraft 14w34b, Minecraft 14w34c, Minecraft 14w34d, Minecraft 1.8, Minecraft 1.8.1-pre1, Minecraft 1.8.1-pre3, Minecraft 1.8.1 |
| Fix Version/s: | Minecraft 1.8.2-pre4 |
| Type: | Bug | ||
| Reporter: | Michael Schiffner | Assignee: | Unassigned |
| Resolution: | Fixed | Votes: | 31 |
| Labels: | None | ||
| Attachments: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Issue Links: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CHK: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Confirmation Status: | Confirmed | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Game Mode: | Creative | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Description |
|
To reproduce: 1 Build "tube" of any solid block as high as you want, with "open edges" 2 Plant sapling and grow it with bone meal. 3 Remove leaves to see, where wood replaced the solid blocks of the tube. I suppose the kind of the solid block does not matter. |
| Comments |
| Comment by bob [ 20/Jan/15 ] |
|
Sorry. It just didn't have the intermediate versions of the affects versions page and the comment confirming it had been fixed was: |
| Comment by Kumasasa [ 20/Jan/15 ] |
|
FM22, see at the top of this ticket, there is clearly written:
|
| Comment by bob [ 20/Jan/15 ] |
|
present in pre 3... |
| Comment by bob [ 20/Jan/15 ] |
|
present in pre 2... |
| Comment by bob [ 20/Jan/15 ] |
|
present in pre 1... |
| Comment by bob [ 20/Jan/15 ] |
|
Somehow, I dont think Mojang want to admit the version that has the bug fixed. |
| Comment by [Mod] redstonehelper [ 16/Jan/15 ] |
|
Fixed in 1.8.2-pre4, possibly earlier. |
| Comment by [Mod] Pokechu22 [ 16/Jan/15 ] |
|
This also occurs with 2x2 jungle trees if you have a 3 block padding. ██: bedrock ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▓▓ ▓▓ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▓▓ ▓▓ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ██ ██ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ With this structure bedrock in the walls will be replaced by wood in some of the jungle tree branches. |
| Comment by Fenhl (Max Dominik Weber) [ 07/Dec/14 ] |
|
Affects 1.8.1, at least for dark oak. |
| Comment by [Mod] Torabi [ 25/Aug/14 ] |
|
I don't think there's any legitimate reason to break blocks that are specifically designed to not be broken by the player. Bedrock and Barriers are there to give server admins or map creators a way of walling off sections of the world. It hurts gameplay or servers if they can't rely on that. But really, I hope this gets fixed because it can break redstone machinery, most particularly automatic tree farms. Having a tree destroy your pistons or dispensers is a real pain. |
| Comment by Noproct [ 20/Aug/14 ] |
|
In my opinion, breaking bedrock should be implemented as a feature, since it adds gameplay. Literaly 50% of the nether is not accessible without breaking bedrock. And it would be "unfair " towards players who haven't broken through bedrock in their world before it gets fixed. |
| Comment by Joey Sachtleben [ 11/Aug/14 ] |
|
I found it with Jungle trees in 14w32d |
| Comment by Samuel Shank [ 06/Aug/14 ] |
|
confirmed for 14w31a |
| Comment by Masahiro Kurokawa [ 29/Jul/14 ] |
|
confirmed for 14w30c |
| Comment by Itouch2 [ 03/Apr/14 ] |
|
Confirmed for 1.7.6pre |
| Comment by Adam Mercer [ 15/Mar/14 ] |
|
Bug also appears in 14w11b. |
| Comment by Hafsteinn Már [ 07/Mar/14 ] |
|
The same in Snapshot 14w10c |
| Comment by Galaxy_2Alex [ 04/Mar/14 ] |
|
I opened the issue for the public as this issue is basically public due to many well-known Youtubers know it and used it publicly in their videos. |
| Comment by fienxjox [ 19/Feb/14 ] |
|
Still in 14w08a for dark oak |
| Comment by Anon Ymus [ 18/Mar/13 ] |
|
Still in 13w11a. |
| Comment by Tails [ 18/Mar/13 ] |
|
Is this still a concern in the current Minecraft version? If so, please update the affected versions in order to best aid Mojang ensuring bugs are still valid in the latest releases/pre-releases. |
| Comment by Markku [ 28/Feb/13 ] |
|
Affects 13w09b. |
| Comment by Markku [ 24/Feb/13 ] |
|
Two bugs in the play. Reason 1 Fix 1 WorldGenBigTree.checkBlockLine() ...
currentSpot[largestEndDeltaAxis] = from[largestEndDeltaAxis] + blockStep;
currentSpot[axis2] = MathHelper.floor_double((double) from[axis2] + (double) blockStep * axis2Step + 0.5D);
currentSpot[axis3] = MathHelper.floor_double((double) from[axis3] + (double) blockStep * axis3Step + 0.5D);
...
This should prevent the replacement of solid blocks, but does not prevent branches coming through the corners. But that is the next part... Reason 2 Here is the code for the current algorithm (including the fix 1 from above): WorldGenBigTree.checkBlockLine() ...
int endMainCoord = endDelta[largestEndDeltaAxis] + mainStep;
int mainCoord = 0;
for (mainCoord = 0; mainCoord != endMainCoord; mainCoord += mainStep) {
currentSpot[largestEndDeltaAxis] = from[largestEndDeltaAxis] + mainCoord;
currentSpot[axis2] = MathHelper.floor_double((double) from[axis2] + (double) mainCoord * axis2Step + 0.5D);
currentSpot[axis3] = MathHelper.floor_double((double) from[axis3] + (double) mainCoord * axis3Step + 0.5D);
int blockId = this.worldObj.getBlockId(currentSpot[0], currentSpot[1], currentSpot[2]);
if (blockId != 0 && blockId != Block.leaves.blockID)
break;
}
...
Fix 2 - partial ...
do {
// Point of entering the block:
currentSpot[largestEndDeltaAxis] = from[largestEndDeltaAxis] + mainCoord;
// start point + travel so far - half a step
double minor2 = (from[axis2] + 0.5D) + mainCoord * axis2Step - 0.5 * axis2Step;
double minor3 = (from[axis3] + 0.5D) + mainCoord * axis3Step - 0.5 * axis3Step;
currentSpot[axis2] = MathHelper.floor_double(minor2);
currentSpot[axis3] = MathHelper.floor_double(minor3);
// At the end?
if (currentSpot[0] == to[0] && currentSpot[1] == to[1] && currentSpot[2] == to[2])
break;
if (!blockIsOk(currentSpot[0], currentSpot[1], currentSpot[2]))
break;
// Check minor axis at the point of leaving the block:
// start point + travel so far + half a step
//double newminor2 = (from[axis2] + 0.5D) + mainCoord * axis2Step + 0.5 * axis2Step;
//double newminor3 = (from[axis3] + 0.5D) + mainCoord * axis3Step + 0.5 * axis3Step;
double newMinor2 = minor2 + mainStep * axis2Step;
double newMinor3 = minor3 + mainStep * axis3Step;
boolean change2 = MathHelper.floor_double(newMinor2) != currentSpot[axis2];
boolean change3 = MathHelper.floor_double(newMinor3) != currentSpot[axis3];
if (change2 && change3) { // Need to step along both minor axis
// TODO: resolve in which order they should be stepped.
currentSpot[axis2] = MathHelper.floor_double(newMinor2);
if (!blockIsOk(currentSpot[0], currentSpot[1], currentSpot[2]))
break;
currentSpot[axis3] = MathHelper.floor_double(newMinor3);
if (!blockIsOk(currentSpot[0], currentSpot[1], currentSpot[2]))
break;
} else if (change2) { // Need to step along axis 2
currentSpot[axis2] = MathHelper.floor_double(newMinor2);
if (!blockIsOk(currentSpot[0], currentSpot[1], currentSpot[2]))
break;
} else if (change3) { // Need to step along axis 3
currentSpot[axis3] = MathHelper.floor_double(newMinor3);
if (!blockIsOk(currentSpot[0], currentSpot[1], currentSpot[2]))
break;
}
mainCoord += 1;
} while (true);
...
private boolean blockIsOk(int x, int y, int z) {
int blockId = this.worldObj.getBlockId(x, y, z);
if (blockId != 0 && blockId != Block.leaves.blockID)
return false;
return true;
}
The loop is not fully optimized, but that is actually a minor thing compared to the fact that both the original and fixed version use double-values with absolute coordinates. This is bad coding, able to cause some issue at extreme coordinates. The algorithm should work on relative values (i.e. tree root would be always at values 0,0,0), which the block read and write routines would use by first taking 'floor' and then add the offset coordinates as integers. If interested in how it works, I found a page that explains it quite well, although the above version is organized ever so slightly differently, and is for 3D instead of just 2D. http://sinepost.wordpress.com/2012/05/24/drawing-in-a-straight-line/ There is also that minor TODO-point left, but that only causes almost completely imperceptible difference with the "correct" operation. NOTE: the same fix should NOT be applied to the placeBlockLine() method, otherwise branches will look, uh, twisted? Remaining 'issues' |
| Comment by Michael Schiffner [ 24/Feb/13 ] |
|
Looks everytime like this with closed corners/edges. |
| Comment by Dean Baset [ 24/Feb/13 ] |
|
The branches can also destroy bedrock! Voting/ |
| Comment by Anon Ymus [ 23/Feb/13 ] |
|
Confirmed. |