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.Material;
import org.bukkit.Note;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Openable;
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.inventory.ItemStack;
@ -100,7 +105,7 @@ public class BlockChange implements LookupCacheElement {
if (actor != null) {
msg.append(actor.getName()).append(" ");
}
if (type.equals(replaced)) {
if (type.getMaterial().equals(replaced.getMaterial())) {
if (BukkitUtils.isEmpty(type.getMaterial())) {
msg.append("did an unspecified action");
} else if (ca != null) {
@ -117,13 +122,20 @@ public class BlockChange implements LookupCacheElement {
// Door, Trapdoor, Fence gate
msg.append(((Openable)type).isOpen() ? "opened" : "closed").append(" ").append(type.getMaterial().name());
} 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) {
msg.append("pressed ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.CAKE) {
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) {
msg.append("changed ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.NOTE_BLOCK) {
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) {
msg.append("stepped on ").append(type.getMaterial().name());
} else if (type.getMaterial() == Material.TRIPWIRE) {

View File

@ -8,7 +8,7 @@ public enum Logging {
PRESUREPLATEINTERACT, TRIPWIREINTERACT, CREATURECROPTRAMPLE, CROPTRAMPLE,
NATURALSTRUCTUREGROW, GRASSGROWTH, MYCELIUMSPREAD, VINEGROWTH, MUSHROOMSPREAD,
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;
private final boolean defaultEnabled;

View File

@ -7,10 +7,21 @@ import de.diddiz.LogBlock.config.WorldConfig;
import de.diddiz.util.BukkitUtils;
import org.bukkit.Location;
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.BlockFace;
import org.bukkit.block.data.Bisected.Half;
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.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -51,27 +62,52 @@ public class InteractLogging extends LoggingListener {
case ACACIA_TRAPDOOR:
case DARK_OAK_TRAPDOOR:
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;
case CAKE:
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;
case NOTE_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;
case REPEATER:
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;
case COMPARATOR:
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;
case OAK_PRESSURE_PLATE:
@ -104,14 +140,27 @@ public class InteractLogging extends LoggingListener {
}
break;
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) {
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) {
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 Map<EntityType, Material> projectileItems;
private static final EnumSet<Material> buttons;
private static final EnumSet<Material> pressurePlates;
private static final EnumSet<Material> woodenDoors;
static {
EnumSet<Material> pressurePlates = EnumSet.noneOf(Material.class);
pressurePlates = EnumSet.noneOf(Material.class);
pressurePlates.add(Material.OAK_PRESSURE_PLATE);
pressurePlates.add(Material.SPRUCE_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.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);
saplings.add(Material.OAK_SAPLING);
saplings.add(Material.SPRUCE_SAPLING);
@ -103,6 +114,15 @@ public class BukkitUtils {
slabs.add(Material.DARK_PRISMARINE_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.add(Material.GRASS);
singleBlockPlants.add(Material.FERN);
@ -142,13 +162,7 @@ public class BukkitUtils {
relativeBreakable = EnumSet.noneOf(Material.class);
relativeBreakable.add(Material.WALL_SIGN);
relativeBreakable.add(Material.LADDER);
relativeBreakable.add(Material.STONE_BUTTON);
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.addAll(buttons);
relativeBreakable.add(Material.REDSTONE_WALL_TORCH);
relativeBreakable.add(Material.LEVER);
relativeBreakable.add(Material.WALL_TORCH);
@ -180,12 +194,7 @@ public class BukkitUtils {
relativeTopBreakable.add(Material.WALL_TORCH);
relativeTopBreakable.add(Material.REDSTONE_TORCH);
relativeTopBreakable.add(Material.REDSTONE_WALL_TORCH);
relativeTopBreakable.add(Material.OAK_DOOR);
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.addAll(woodenDoors);
relativeTopBreakable.add(Material.IRON_DOOR);
relativeTopBreakable.addAll(carpets);
relativeTopBreakable.addAll(doublePlants);
@ -577,6 +586,14 @@ public class BukkitUtils {
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) {
return m == Material.AIR || m == Material.CAVE_AIR || m == Material.VOID_AIR;
}