Changed doors and beds to no longer log data as two separate blocks

This commit is contained in:
Intelli 2022-02-23 18:56:00 -07:00
parent f9083053b2
commit 262f27da3e
6 changed files with 106 additions and 170 deletions

View file

@ -726,6 +726,13 @@ public class Rollback extends Queue {
}
}
}
else if (changeBlockData instanceof Bed) {
Bed bed = (Bed) changeBlockData;
if (bed.getPart() == Part.FOOT) {
Block adjacentBlock = block.getRelative(bed.getFacing());
Util.prepareTypeAndData(chunkChanges, adjacentBlock, rowType, null, false);
}
}
Util.prepareTypeAndData(chunkChanges, block, rowType, null, physics);
}
@ -817,83 +824,73 @@ public class Rollback extends Queue {
else if ((rowType == Material.NETHER_PORTAL) && rowAction == 0) {
Util.prepareTypeAndData(chunkChanges, block, Material.FIRE, null, true);
}
else if (rowType == Material.IRON_DOOR || BlockGroup.DOORS.contains(rowType)) {
else if (blockData == null && rowData > 0 && (rowType == Material.IRON_DOOR || BlockGroup.DOORS.contains(rowType))) {
if (countBlock) {
blockCount1++;
}
if (blockData != null) {
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, false);
block.setType(rowType, false);
Door door = (Door) block.getBlockData();
if (rowData >= 8) {
door.setHalf(Half.TOP);
rowData = rowData - 8;
}
else {
block.setType(rowType, false);
Door door = (Door) block.getBlockData();
if (rowData >= 8) {
door.setHalf(Half.TOP);
rowData = rowData - 8;
}
else {
door.setHalf(Half.BOTTOM);
}
if (rowData >= 4) {
door.setHinge(Hinge.RIGHT);
rowData = rowData - 4;
}
else {
door.setHinge(Hinge.LEFT);
}
BlockFace face = BlockFace.NORTH;
switch (rowData) {
case 0:
face = BlockFace.EAST;
break;
case 1:
face = BlockFace.SOUTH;
break;
case 2:
face = BlockFace.WEST;
break;
}
door.setFacing(face);
door.setOpen(false);
block.setBlockData(door, false);
door.setHalf(Half.BOTTOM);
}
if (rowData >= 4) {
door.setHinge(Hinge.RIGHT);
rowData = rowData - 4;
}
else {
door.setHinge(Hinge.LEFT);
}
BlockFace face = BlockFace.NORTH;
switch (rowData) {
case 0:
face = BlockFace.EAST;
break;
case 1:
face = BlockFace.SOUTH;
break;
case 2:
face = BlockFace.WEST;
break;
}
door.setFacing(face);
door.setOpen(false);
block.setBlockData(door, false);
}
else if (rowType.name().endsWith("_BED")) {
else if (blockData == null && rowData > 0 && (rowType.name().endsWith("_BED"))) {
if (countBlock) {
blockCount1++;
}
if (blockData != null) {
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, false);
block.setType(rowType, false);
Bed bed = (Bed) block.getBlockData();
BlockFace face = BlockFace.NORTH;
if (rowData > 4) {
bed.setPart(Part.HEAD);
rowData = rowData - 4;
}
else {
block.setType(rowType, false);
Bed bed = (Bed) block.getBlockData();
BlockFace face = BlockFace.NORTH;
if (rowData > 4) {
bed.setPart(Part.HEAD);
rowData = rowData - 4;
}
switch (rowData) {
case 2:
face = BlockFace.WEST;
break;
case 3:
face = BlockFace.EAST;
break;
case 4:
face = BlockFace.SOUTH;
break;
}
bed.setFacing(face);
block.setBlockData(bed, false);
switch (rowData) {
case 2:
face = BlockFace.WEST;
break;
case 3:
face = BlockFace.EAST;
break;
case 4:
face = BlockFace.SOUTH;
break;
}
bed.setFacing(face);
block.setBlockData(bed, false);
}
else if (rowType.name().endsWith("_BANNER")) {
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, false);
@ -964,6 +961,23 @@ public class Rollback extends Queue {
blockCount1++;
}
}
else if (rowType != Material.AIR && rawBlockData instanceof Bed) {
Bed bed = (Bed) rawBlockData;
if (bed.getPart() == Part.FOOT) {
Block adjacentBlock = block.getRelative(bed.getFacing());
Bed bedData = (Bed) rawBlockData.clone();
bedData.setPart(Part.HEAD);
Util.prepareTypeAndData(chunkChanges, adjacentBlock, rowType, bedData, false);
if (countBlock) {
blockCount1++;
}
}
Util.prepareTypeAndData(chunkChanges, block, rowType, blockData, true);
if (countBlock) {
blockCount1++;
}
}
else {
boolean physics = true;
/*

View file

@ -5,12 +5,7 @@ import java.util.List;
import java.util.Locale;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Bed;
import org.bukkit.block.data.type.Door;
import org.bukkit.block.data.type.Door.Hinge;
import net.coreprotect.CoreProtect;
import net.coreprotect.bukkit.BukkitAdapter;
@ -18,7 +13,6 @@ import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.BlockStatement;
import net.coreprotect.database.statement.UserStatement;
import net.coreprotect.event.CoreProtectPreLogEvent;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.utility.Util;
@ -68,97 +62,18 @@ public class BlockPlaceLogger {
int x = block.getX();
int y = block.getY();
int z = block.getZ();
int dx = x;
int dy = y;
int dz = z;
Material doubletype = type;
int doubledata = data;
int logdouble = 0;
if (event.getUser().length() > 0) {
CacheHandler.lookupCache.put("" + x + "." + y + "." + z + "." + wid + "", new Object[] { time, event.getUser(), type });
}
String doubleBlockData = null;
if (type.name().endsWith("_BED") || type == Material.IRON_DOOR || BlockGroup.DOORS.contains(type)) { // properly log double blocks (doors/beds)
BlockData blockStateBlockData = block.getBlockData();
if (blockStateBlockData instanceof Bed) {
Bed bed = (Bed) blockStateBlockData;
Bed.Part bedPart = bed.getPart();
BlockFace face = bed.getFacing();
int bedData = 1;
switch (face) {
case WEST:
dx = ((bedPart == Bed.Part.HEAD) ? (x + 1) : (x - 1));
bedData = 2;
break;
case EAST:
dx = ((bedPart == Bed.Part.HEAD) ? (x - 1) : (x + 1));
bedData = 3;
break;
case SOUTH:
dz = ((bedPart == Bed.Part.HEAD) ? (z - 1) : (z + 1));
bedData = 4;
break;
default:
dz = ((bedPart == Bed.Part.HEAD) ? (z + 1) : (z - 1));
break;
}
if (bedPart == Bed.Part.HEAD) {
data = 4 + bedData;
doubledata = bedData;
bed.setPart(Bed.Part.FOOT);
doubleBlockData = bed.getAsString();
}
else {
data = bedData;
doubledata = 4 + bedData;
bed.setPart(Bed.Part.HEAD);
doubleBlockData = bed.getAsString();
}
}
else if (blockStateBlockData instanceof Door) {
Door door = (Door) blockStateBlockData;
BlockFace face = door.getFacing();
Hinge hinge = door.getHinge();
switch (face) {
case EAST:
data = 0;
break;
case SOUTH:
data = 1;
break;
case WEST:
data = 2;
break;
default:
data = 3;
break;
}
if (hinge.equals(Hinge.RIGHT)) {
data = data + 4;
}
if (data < 8) {
dy = y + 1;
doubledata = data + 8;
}
}
logdouble = 1;
}
int internalType = Util.getBlockId(type.name(), true);
int internalDoubleType = Util.getBlockId(doubletype.name(), true);
if (replacedType > 0 && Util.getType(replacedType) != Material.AIR && Util.getType(replacedType) != Material.CAVE_AIR) {
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, replacedType, replacedData, null, replaceBlockData, 0, 0);
}
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, internalType, data, meta, blockData, 1, 0);
if (logdouble == 1) {
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, dx, dy, dz, internalDoubleType, doubledata, null, doubleBlockData, 1, 0);
}
}
catch (Exception e) {
e.printStackTrace();