Improved + rollbackable interact logging

Rollback door openings, comparator, repeater and noteblock modifications and similar things
This commit is contained in:
Brokkonaut
2018-08-02 02:47:20 +02:00
parent 3dbb7a6c43
commit 33d97ed971
4 changed files with 107 additions and 29 deletions

View File

@@ -7,9 +7,14 @@ import de.diddiz.util.Utils;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Note;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Openable; import org.bukkit.block.data.Openable;
import org.bukkit.block.data.Powerable; import org.bukkit.block.data.Powerable;
import org.bukkit.block.data.type.Comparator;
import org.bukkit.block.data.type.DaylightDetector;
import org.bukkit.block.data.type.NoteBlock;
import org.bukkit.block.data.type.Repeater;
import org.bukkit.block.data.type.Switch; import org.bukkit.block.data.type.Switch;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -100,7 +105,7 @@ public class BlockChange implements LookupCacheElement {
if (actor != null) { if (actor != null) {
msg.append(actor.getName()).append(" "); msg.append(actor.getName()).append(" ");
} }
if (type.equals(replaced)) { if (type.getMaterial().equals(replaced.getMaterial())) {
if (BukkitUtils.isEmpty(type.getMaterial())) { if (BukkitUtils.isEmpty(type.getMaterial())) {
msg.append("did an unspecified action"); msg.append("did an unspecified action");
} else if (ca != null) { } else if (ca != null) {
@@ -117,13 +122,20 @@ public class BlockChange implements LookupCacheElement {
// Door, Trapdoor, Fence gate // Door, Trapdoor, Fence gate
msg.append(((Openable)type).isOpen() ? "opened" : "closed").append(" ").append(type.getMaterial().name()); msg.append(((Openable)type).isOpen() ? "opened" : "closed").append(" ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.LEVER) { } else if (type.getMaterial() == Material.LEVER) {
msg.append("switched ").append(type.getMaterial().name()); msg.append("switched ").append(type.getMaterial().name()).append(" ").append(((Switch) type).isPowered() ? "on" : "off");
} else if (type instanceof Switch) { } else if (type instanceof Switch) {
msg.append("pressed ").append(type.getMaterial().name()); msg.append("pressed ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.CAKE) { } else if (type.getMaterial() == Material.CAKE) {
msg.append("ate a piece of ").append(type.getMaterial().name()); msg.append("ate a piece of ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.NOTE_BLOCK || type.getMaterial() == Material.REPEATER || type.getMaterial() == Material.COMPARATOR || type.getMaterial() == Material.DAYLIGHT_DETECTOR) { } else if (type.getMaterial() == Material.NOTE_BLOCK) {
msg.append("changed ").append(type.getMaterial().name()); Note note = ((NoteBlock) type).getNote();
msg.append("set ").append(type.getMaterial().name()).append(" to ").append(note.getTone().name()).append(note.isSharped() ? "#" : "");
} else if (type.getMaterial() == Material.REPEATER) {
msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((Repeater) type).getDelay()).append(" ticks delay");
} else if (type.getMaterial() == Material.COMPARATOR) {
msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((Comparator) type).getMode());
} else if (type.getMaterial() == Material.DAYLIGHT_DETECTOR) {
msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((DaylightDetector) type).isInverted() ? "inverted" : "normal");
} else if (type instanceof Powerable) { } else if (type instanceof Powerable) {
msg.append("stepped on ").append(type.getMaterial().name()); msg.append("stepped on ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.TRIPWIRE) { } else if (type.getMaterial() == Material.TRIPWIRE) {

View File

@@ -8,7 +8,7 @@ public enum Logging {
PRESUREPLATEINTERACT, TRIPWIREINTERACT, CREATURECROPTRAMPLE, CROPTRAMPLE, PRESUREPLATEINTERACT, TRIPWIREINTERACT, CREATURECROPTRAMPLE, CROPTRAMPLE,
NATURALSTRUCTUREGROW, GRASSGROWTH, MYCELIUMSPREAD, VINEGROWTH, MUSHROOMSPREAD, NATURALSTRUCTUREGROW, GRASSGROWTH, MYCELIUMSPREAD, VINEGROWTH, MUSHROOMSPREAD,
WITHER(true), WITHER_SKULL(true), BONEMEALSTRUCTUREGROW, WORLDEDIT, TNTMINECARTEXPLOSION(true), WITHER(true), WITHER_SKULL(true), BONEMEALSTRUCTUREGROW, WORLDEDIT, TNTMINECARTEXPLOSION(true),
ENDERCRYSTALEXPLOSION(true), BEDEXPLOSION(true), DRAGONEGGTELEPORT(true); ENDERCRYSTALEXPLOSION(true), BEDEXPLOSION(true), DRAGONEGGTELEPORT(true), DAYLIGHTDETECTORINTERACT;
public static final int length = Logging.values().length; public static final int length = Logging.values().length;
private final boolean defaultEnabled; private final boolean defaultEnabled;

View File

@@ -7,10 +7,21 @@ import de.diddiz.LogBlock.config.WorldConfig;
import de.diddiz.util.BukkitUtils; import de.diddiz.util.BukkitUtils;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Tag; import org.bukkit.Note;
import org.bukkit.Note.Tone;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.data.Bisected.Half;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Openable;
import org.bukkit.block.data.type.Cake;
import org.bukkit.block.data.type.Comparator;
import org.bukkit.block.data.type.Comparator.Mode;
import org.bukkit.block.data.type.DaylightDetector;
import org.bukkit.block.data.type.Door;
import org.bukkit.block.data.type.NoteBlock;
import org.bukkit.block.data.type.Repeater;
import org.bukkit.block.data.type.Switch;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@@ -51,27 +62,52 @@ public class InteractLogging extends LoggingListener {
case ACACIA_TRAPDOOR: case ACACIA_TRAPDOOR:
case DARK_OAK_TRAPDOOR: case DARK_OAK_TRAPDOOR:
if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); Openable newBlockData = (Openable) blockData.clone();
newBlockData.setOpen(!newBlockData.isOpen());
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
} }
break; break;
case CAKE: case CAKE:
if (wcfg.isLogging(Logging.CAKEEAT) && event.getAction() == Action.RIGHT_CLICK_BLOCK && player.getFoodLevel() < 20) { if (wcfg.isLogging(Logging.CAKEEAT) && event.getAction() == Action.RIGHT_CLICK_BLOCK && player.getFoodLevel() < 20) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); Cake newBlockData = (Cake) blockData.clone();
if (newBlockData.getBites() < 6) {
newBlockData.setBites(newBlockData.getBites() + 1);
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
} else {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, Material.AIR.createBlockData());
}
} }
break; break;
case NOTE_BLOCK: case NOTE_BLOCK:
if (wcfg.isLogging(Logging.NOTEBLOCKINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (wcfg.isLogging(Logging.NOTEBLOCKINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); NoteBlock newBlockData = (NoteBlock) blockData.clone();
if (newBlockData.getNote().getOctave() == 2) {
newBlockData.setNote(new Note(0, Tone.F, true));
} else {
newBlockData.setNote(newBlockData.getNote().sharped());
}
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
} }
break; break;
case REPEATER: case REPEATER:
if (wcfg.isLogging(Logging.DIODEINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (wcfg.isLogging(Logging.DIODEINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); Repeater newBlockData = (Repeater) blockData.clone();
newBlockData.setDelay((newBlockData.getDelay() % 4) + 1);
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
} }
break; break;
case COMPARATOR: case COMPARATOR:
if (wcfg.isLogging(Logging.COMPARATORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (wcfg.isLogging(Logging.COMPARATORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); Comparator newBlockData = (Comparator) blockData.clone();
newBlockData.setMode(newBlockData.getMode() == Mode.COMPARE ? Mode.SUBTRACT : Mode.COMPARE);
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
}
break;
case DAYLIGHT_DETECTOR:
if (wcfg.isLogging(Logging.DAYLIGHTDETECTORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
DaylightDetector newBlockData = (DaylightDetector) blockData.clone();
newBlockData.setInverted(!newBlockData.isInverted());
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
} }
break; break;
case OAK_PRESSURE_PLATE: case OAK_PRESSURE_PLATE:
@@ -104,14 +140,27 @@ public class InteractLogging extends LoggingListener {
} }
break; break;
default: default:
if (Tag.BUTTONS.isTagged(type) || type == Material.LEVER) { if (BukkitUtils.isButton(type) || type == Material.LEVER) {
if (wcfg.isLogging(Logging.SWITCHINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (wcfg.isLogging(Logging.SWITCHINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); Switch newBlockData = (Switch) blockData.clone();
if (!newBlockData.isPowered() || type == Material.LEVER) {
newBlockData.setPowered(!newBlockData.isPowered());
}
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
} }
} }
if (Tag.WOODEN_DOORS.isTagged(type)) { if (BukkitUtils.isWoodenDoor(type)) {
if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); Door newBlockData = (Door) blockData.clone();
newBlockData.setOpen(!newBlockData.isOpen());
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData);
Block otherBlock = clicked.getRelative(newBlockData.getHalf() == Half.TOP ? BlockFace.DOWN : BlockFace.UP);
if (otherBlock.getType() == type) {
BlockData blockData2 = otherBlock.getBlockData();
Door newBlockData2 = (Door) blockData2.clone();
newBlockData2.setOpen(!newBlockData2.isOpen());
consumer.queueBlock(Actor.actorFromEntity(player), otherBlock.getLocation(), blockData2, newBlockData2);
}
} }
} }
} }

View File

@@ -43,9 +43,12 @@ public class BukkitUtils {
private static final Set<Material> bedBlocks; private static final Set<Material> bedBlocks;
private static final Map<EntityType, Material> projectileItems; private static final Map<EntityType, Material> projectileItems;
private static final EnumSet<Material> buttons;
private static final EnumSet<Material> pressurePlates;
private static final EnumSet<Material> woodenDoors;
static { static {
EnumSet<Material> pressurePlates = EnumSet.noneOf(Material.class); pressurePlates = EnumSet.noneOf(Material.class);
pressurePlates.add(Material.OAK_PRESSURE_PLATE); pressurePlates.add(Material.OAK_PRESSURE_PLATE);
pressurePlates.add(Material.SPRUCE_PRESSURE_PLATE); pressurePlates.add(Material.SPRUCE_PRESSURE_PLATE);
pressurePlates.add(Material.BIRCH_PRESSURE_PLATE); pressurePlates.add(Material.BIRCH_PRESSURE_PLATE);
@@ -56,6 +59,14 @@ public class BukkitUtils {
pressurePlates.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE); pressurePlates.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE);
pressurePlates.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE); pressurePlates.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE);
woodenDoors = EnumSet.noneOf(Material.class);
woodenDoors.add(Material.OAK_DOOR);
woodenDoors.add(Material.SPRUCE_DOOR);
woodenDoors.add(Material.BIRCH_DOOR);
woodenDoors.add(Material.JUNGLE_DOOR);
woodenDoors.add(Material.ACACIA_DOOR);
woodenDoors.add(Material.DARK_OAK_DOOR);
EnumSet<Material> saplings = EnumSet.noneOf(Material.class); EnumSet<Material> saplings = EnumSet.noneOf(Material.class);
saplings.add(Material.OAK_SAPLING); saplings.add(Material.OAK_SAPLING);
saplings.add(Material.SPRUCE_SAPLING); saplings.add(Material.SPRUCE_SAPLING);
@@ -103,6 +114,15 @@ public class BukkitUtils {
slabs.add(Material.DARK_PRISMARINE_SLAB); slabs.add(Material.DARK_PRISMARINE_SLAB);
slabs.add(Material.PRISMARINE_BRICK_SLAB); slabs.add(Material.PRISMARINE_BRICK_SLAB);
buttons = EnumSet.noneOf(Material.class);
buttons.add(Material.STONE_BUTTON);
buttons.add(Material.OAK_BUTTON);
buttons.add(Material.SPRUCE_BUTTON);
buttons.add(Material.BIRCH_BUTTON);
buttons.add(Material.JUNGLE_BUTTON);
buttons.add(Material.ACACIA_BUTTON);
buttons.add(Material.DARK_OAK_BUTTON);
singleBlockPlants = EnumSet.noneOf(Material.class); singleBlockPlants = EnumSet.noneOf(Material.class);
singleBlockPlants.add(Material.GRASS); singleBlockPlants.add(Material.GRASS);
singleBlockPlants.add(Material.FERN); singleBlockPlants.add(Material.FERN);
@@ -142,13 +162,7 @@ public class BukkitUtils {
relativeBreakable = EnumSet.noneOf(Material.class); relativeBreakable = EnumSet.noneOf(Material.class);
relativeBreakable.add(Material.WALL_SIGN); relativeBreakable.add(Material.WALL_SIGN);
relativeBreakable.add(Material.LADDER); relativeBreakable.add(Material.LADDER);
relativeBreakable.add(Material.STONE_BUTTON); relativeBreakable.addAll(buttons);
relativeBreakable.add(Material.OAK_BUTTON);
relativeBreakable.add(Material.SPRUCE_BUTTON);
relativeBreakable.add(Material.BIRCH_BUTTON);
relativeBreakable.add(Material.JUNGLE_BUTTON);
relativeBreakable.add(Material.ACACIA_BUTTON);
relativeBreakable.add(Material.DARK_OAK_BUTTON);
relativeBreakable.add(Material.REDSTONE_WALL_TORCH); relativeBreakable.add(Material.REDSTONE_WALL_TORCH);
relativeBreakable.add(Material.LEVER); relativeBreakable.add(Material.LEVER);
relativeBreakable.add(Material.WALL_TORCH); relativeBreakable.add(Material.WALL_TORCH);
@@ -180,12 +194,7 @@ public class BukkitUtils {
relativeTopBreakable.add(Material.WALL_TORCH); relativeTopBreakable.add(Material.WALL_TORCH);
relativeTopBreakable.add(Material.REDSTONE_TORCH); relativeTopBreakable.add(Material.REDSTONE_TORCH);
relativeTopBreakable.add(Material.REDSTONE_WALL_TORCH); relativeTopBreakable.add(Material.REDSTONE_WALL_TORCH);
relativeTopBreakable.add(Material.OAK_DOOR); relativeTopBreakable.addAll(woodenDoors);
relativeTopBreakable.add(Material.SPRUCE_DOOR);
relativeTopBreakable.add(Material.BIRCH_DOOR);
relativeTopBreakable.add(Material.JUNGLE_DOOR);
relativeTopBreakable.add(Material.ACACIA_DOOR);
relativeTopBreakable.add(Material.DARK_OAK_DOOR);
relativeTopBreakable.add(Material.IRON_DOOR); relativeTopBreakable.add(Material.IRON_DOOR);
relativeTopBreakable.addAll(carpets); relativeTopBreakable.addAll(carpets);
relativeTopBreakable.addAll(doublePlants); relativeTopBreakable.addAll(doublePlants);
@@ -577,6 +586,14 @@ public class BukkitUtils {
return doublePlants.contains(m); return doublePlants.contains(m);
} }
public static boolean isWoodenDoor(Material m) {
return woodenDoors.contains(m);
}
public static boolean isButton(Material m) {
return buttons.contains(m);
}
public static boolean isEmpty(Material m) { public static boolean isEmpty(Material m) {
return m == Material.AIR || m == Material.CAVE_AIR || m == Material.VOID_AIR; return m == Material.AIR || m == Material.CAVE_AIR || m == Material.VOID_AIR;
} }