forked from LogBlock/LogBlock
Improved + rollbackable interact logging
Rollback door openings, comparator, repeater and noteblock modifications and similar things
This commit is contained in:
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user