Fixed rollbacks/restores not correctly updating all blocks (#175)
This commit is contained in:
parent
2763952dc6
commit
d97f5482ee
1 changed files with 22 additions and 18 deletions
|
|
@ -526,16 +526,24 @@ public class Rollback extends Queue {
|
||||||
boolean countBlock = true;
|
boolean countBlock = true;
|
||||||
Material changeType = block.getType();
|
Material changeType = block.getType();
|
||||||
BlockData changeBlockData = block.getBlockData();
|
BlockData changeBlockData = block.getBlockData();
|
||||||
|
BlockData pendingChangeData = chunkChanges.get(block);
|
||||||
|
Material pendingChangeType = changeType;
|
||||||
|
if (pendingChangeData != null) {
|
||||||
|
pendingChangeType = pendingChangeData.getMaterial();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pendingChangeData = changeBlockData;
|
||||||
|
}
|
||||||
|
|
||||||
if (rowRolledBack == 1 && rollbackType == 0) { // rollback
|
if (rowRolledBack == 1 && rollbackType == 0) { // rollback
|
||||||
countBlock = false;
|
countBlock = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rowType == changeType) && ((!BukkitAdapter.ADAPTER.isItemFrame(oldTypeMaterial)) && (oldTypeMaterial != Material.PAINTING) && (oldTypeMaterial != Material.ARMOR_STAND)) && (oldTypeMaterial != Material.END_CRYSTAL)) {
|
if ((rowType == pendingChangeType) && ((!BukkitAdapter.ADAPTER.isItemFrame(oldTypeMaterial)) && (oldTypeMaterial != Material.PAINTING) && (oldTypeMaterial != Material.ARMOR_STAND)) && (oldTypeMaterial != Material.END_CRYSTAL)) {
|
||||||
// block is already changed!
|
// block is already changed!
|
||||||
BlockData checkData = rowType == Material.AIR ? blockData : rawBlockData;
|
BlockData checkData = rowType == Material.AIR ? blockData : rawBlockData;
|
||||||
if (checkData != null) {
|
if (checkData != null) {
|
||||||
if (checkData.getAsString().equals(changeBlockData.getAsString()) || checkData instanceof MultipleFacing || checkData instanceof Stairs || checkData instanceof RedstoneWire) {
|
if (checkData.getAsString().equals(pendingChangeData.getAsString()) || checkData instanceof MultipleFacing || checkData instanceof Stairs || checkData instanceof RedstoneWire) {
|
||||||
if (rowType != Material.CHEST && rowType != Material.TRAPPED_CHEST) { // always update double chests
|
if (rowType != Material.CHEST && rowType != Material.TRAPPED_CHEST) { // always update double chests
|
||||||
changeBlock = false;
|
changeBlock = false;
|
||||||
}
|
}
|
||||||
|
|
@ -547,11 +555,11 @@ public class Rollback extends Queue {
|
||||||
|
|
||||||
countBlock = false;
|
countBlock = false;
|
||||||
}
|
}
|
||||||
else if ((changeType != Material.AIR) && (changeType != Material.CAVE_AIR)) {
|
else if ((pendingChangeType != Material.AIR) && (pendingChangeType != Material.CAVE_AIR)) {
|
||||||
countBlock = true;
|
countBlock = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((changeType == Material.WATER) && (rowType != Material.AIR) && (rowType != Material.CAVE_AIR) && blockData != null) {
|
if ((pendingChangeType == Material.WATER) && (rowType != Material.AIR) && (rowType != Material.CAVE_AIR) && blockData != null) {
|
||||||
if (blockData instanceof Waterlogged) {
|
if (blockData instanceof Waterlogged) {
|
||||||
if (Material.WATER.createBlockData().equals(block.getBlockData())) {
|
if (Material.WATER.createBlockData().equals(block.getBlockData())) {
|
||||||
Waterlogged waterlogged = (Waterlogged) blockData;
|
Waterlogged waterlogged = (Waterlogged) blockData;
|
||||||
|
|
@ -628,11 +636,10 @@ public class Rollback extends Queue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((rowType == Material.AIR) && ((oldTypeMaterial == Material.WATER))) {
|
else if ((rowType == Material.AIR) && ((oldTypeMaterial == Material.WATER))) {
|
||||||
BlockData existingBlockData = block.getBlockData();
|
if (pendingChangeData instanceof Waterlogged) {
|
||||||
if (existingBlockData instanceof Waterlogged) {
|
Waterlogged waterlogged = (Waterlogged) pendingChangeData;
|
||||||
Waterlogged waterlogged = (Waterlogged) existingBlockData;
|
|
||||||
waterlogged.setWaterlogged(false);
|
waterlogged.setWaterlogged(false);
|
||||||
block.setBlockData(waterlogged);
|
Util.prepareTypeAndData(chunkChanges, block, null, waterlogged, false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, true);
|
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, true);
|
||||||
|
|
@ -693,16 +700,14 @@ public class Rollback extends Queue {
|
||||||
|
|
||||||
boolean remove = true;
|
boolean remove = true;
|
||||||
if ((rowType == Material.AIR)) {
|
if ((rowType == Material.AIR)) {
|
||||||
BlockData currentBlockData = block.getBlockData();
|
if (pendingChangeData instanceof Waterlogged) {
|
||||||
if (currentBlockData instanceof Waterlogged) {
|
Waterlogged waterlogged = (Waterlogged) pendingChangeData;
|
||||||
Waterlogged waterlogged = (Waterlogged) currentBlockData;
|
|
||||||
if (waterlogged.isWaterlogged()) {
|
if (waterlogged.isWaterlogged()) {
|
||||||
boolean physics = (changeBlockData instanceof Chest);
|
Util.prepareTypeAndData(chunkChanges, block, Material.WATER, Material.WATER.createBlockData(), true);
|
||||||
Util.prepareTypeAndData(chunkChanges, block, Material.WATER, Material.WATER.createBlockData(), physics);
|
|
||||||
remove = false;
|
remove = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((changeType == Material.WATER)) {
|
else if ((pendingChangeType == Material.WATER)) {
|
||||||
if (rawBlockData instanceof Waterlogged) {
|
if (rawBlockData instanceof Waterlogged) {
|
||||||
Waterlogged waterlogged = (Waterlogged) rawBlockData;
|
Waterlogged waterlogged = (Waterlogged) rawBlockData;
|
||||||
if (waterlogged.isWaterlogged()) {
|
if (waterlogged.isWaterlogged()) {
|
||||||
|
|
@ -819,11 +824,10 @@ public class Rollback extends Queue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((rowType == Material.WATER)) {
|
else if ((rowType == Material.WATER)) {
|
||||||
BlockData existingBlockData = block.getBlockData();
|
if (pendingChangeData instanceof Waterlogged) {
|
||||||
if (existingBlockData instanceof Waterlogged) {
|
Waterlogged waterlogged = (Waterlogged) pendingChangeData;
|
||||||
Waterlogged waterlogged = (Waterlogged) existingBlockData;
|
|
||||||
waterlogged.setWaterlogged(true);
|
waterlogged.setWaterlogged(true);
|
||||||
block.setBlockData(waterlogged);
|
Util.prepareTypeAndData(chunkChanges, block, null, waterlogged, false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, false);
|
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, false);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue