Improve scaffolding logging with fallable blocks

- Log fallable blocks above scaffoldings
- Log scaffolding breaking because blocks below are falling down
This commit is contained in:
Brokkonaut
2019-11-24 06:16:07 +01:00
parent 8214e7d177
commit 59d0794c3d
4 changed files with 42 additions and 28 deletions

View File

@ -78,6 +78,10 @@ public class Consumer extends Thread {
setName("Logblock-Consumer"); setName("Logblock-Consumer");
} }
public LogBlock getLogblock() {
return logblock;
}
/** /**
* Logs any block change. Don't try to combine broken and placed blocks. Queue two block changes or use the queueBLockReplace methods. * Logs any block change. Don't try to combine broken and placed blocks. Queue two block changes or use the queueBLockReplace methods.
* *

View File

@ -36,6 +36,7 @@ public class LogBlock extends JavaPlugin {
private CommandsHandler commandsHandler; private CommandsHandler commandsHandler;
private boolean noDb = false, connected = true; private boolean noDb = false, connected = true;
private PlayerInfoLogging playerInfoLogging; private PlayerInfoLogging playerInfoLogging;
private ScaffoldingLogging scaffoldingLogging;
private Questioner questioner; private Questioner questioner;
private volatile boolean isCompletelyEnabled; private volatile boolean isCompletelyEnabled;
@ -153,7 +154,7 @@ public class LogBlock extends JavaPlugin {
pm.registerEvents(new SnowFadeLogging(this), this); pm.registerEvents(new SnowFadeLogging(this), this);
} }
if (isLogging(Logging.SCAFFOLDING)) { if (isLogging(Logging.SCAFFOLDING)) {
pm.registerEvents(new ScaffoldingLogging(this), this); pm.registerEvents(scaffoldingLogging = new ScaffoldingLogging(this), this);
} }
if (isLogging(Logging.CREEPEREXPLOSION) || isLogging(Logging.TNTEXPLOSION) || isLogging(Logging.GHASTFIREBALLEXPLOSION) || isLogging(Logging.ENDERDRAGON) || isLogging(Logging.MISCEXPLOSION)) { if (isLogging(Logging.CREEPEREXPLOSION) || isLogging(Logging.TNTEXPLOSION) || isLogging(Logging.GHASTFIREBALLEXPLOSION) || isLogging(Logging.ENDERDRAGON) || isLogging(Logging.MISCEXPLOSION)) {
pm.registerEvents(new ExplosionLogging(this), this); pm.registerEvents(new ExplosionLogging(this), this);
@ -337,4 +338,8 @@ public class LogBlock extends JavaPlugin {
public Questioner getQuestioner() { public Questioner getQuestioner() {
return questioner; return questioner;
} }
public ScaffoldingLogging getScaffoldingLogging() {
return scaffoldingLogging;
}
} }

View File

@ -11,7 +11,6 @@ import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
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;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
@ -19,6 +18,7 @@ import org.bukkit.event.block.BlockFadeEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import static de.diddiz.LogBlock.config.Config.isLogging; import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.util.LoggingUtil.smartLogFallables;
public class ScaffoldingLogging extends LoggingListener { public class ScaffoldingLogging extends LoggingListener {
private final static long MAX_SCAFFOLDING_LOG_TIME_MS = 2000; private final static long MAX_SCAFFOLDING_LOG_TIME_MS = 2000;
@ -27,7 +27,7 @@ public class ScaffoldingLogging extends LoggingListener {
private final ArrayDeque<ScaffoldingBreaker> scaffoldingBreakersList = new ArrayDeque<>(); private final ArrayDeque<ScaffoldingBreaker> scaffoldingBreakersList = new ArrayDeque<>();
private final HashMap<Location, ScaffoldingBreaker> scaffoldingBreakersByLocation = new HashMap<>(); private final HashMap<Location, ScaffoldingBreaker> scaffoldingBreakersByLocation = new HashMap<>();
private final HashMap<Location, Player> scaffoldingPlacersByLocation = new HashMap<>(); private final HashMap<Location, Actor> scaffoldingPlacersByLocation = new HashMap<>();
public ScaffoldingLogging(LogBlock lb) { public ScaffoldingLogging(LogBlock lb) {
super(lb); super(lb);
@ -39,22 +39,23 @@ public class ScaffoldingLogging extends LoggingListener {
if (isLogging(block.getWorld(), Logging.SCAFFOLDING)) { if (isLogging(block.getWorld(), Logging.SCAFFOLDING)) {
final Material type = block.getType(); final Material type = block.getType();
if (type == Material.SCAFFOLDING) { if (type == Material.SCAFFOLDING) {
Player placer = scaffoldingPlacersByLocation.get(block.getLocation()); Actor actor = scaffoldingPlacersByLocation.get(block.getLocation()); // get placer before cleanupScaffoldingBreakers
cleanupScaffoldingBreakers(); cleanupScaffoldingBreakers();
if (placer != null) { if (actor == null) {
consumer.queueBlockReplace(Actor.actorFromEntity(placer), block.getState(), event.getNewState()); actor = getScaffoldingBreaker(block);
return; if (actor != null) {
} for (BlockFace dir : NEIGHBOURS_SIDES_AND_UP) {
Player breaker = getScaffoldingBreaker(block); Block otherBlock = block.getRelative(dir);
if (breaker != null) { if (otherBlock.getType() == Material.SCAFFOLDING) {
for (BlockFace dir : NEIGHBOURS_SIDES_AND_UP) { addScaffoldingBreaker(actor, otherBlock);
Block otherBlock = block.getRelative(dir); }
if (otherBlock.getType() == Material.SCAFFOLDING) {
addScaffoldingBreaker(breaker, otherBlock);
} }
} else {
actor = new Actor("ScaffoldingFall");
} }
} }
consumer.queueBlockReplace(breaker == null ? new Actor("ScaffoldingFall") : Actor.actorFromEntity(breaker), block.getState(), event.getNewState()); consumer.queueBlockReplace(actor, block.getState(), event.getNewState());
smartLogFallables(consumer, actor, block);
} }
} }
} }
@ -69,11 +70,11 @@ public class ScaffoldingLogging extends LoggingListener {
for (BlockFace dir : NEIGHBOURS_SIDES_AND_UP) { for (BlockFace dir : NEIGHBOURS_SIDES_AND_UP) {
otherBlock = block.getRelative(dir); otherBlock = block.getRelative(dir);
if (otherBlock.getType() == Material.SCAFFOLDING) { if (otherBlock.getType() == Material.SCAFFOLDING) {
addScaffoldingBreaker(event.getPlayer(), otherBlock); addScaffoldingBreaker(Actor.actorFromEntity(event.getPlayer()), otherBlock);
} }
} }
} else if ((otherBlock = block.getRelative(BlockFace.UP)).getType() == Material.SCAFFOLDING) { } else if ((otherBlock = block.getRelative(BlockFace.UP)).getType() == Material.SCAFFOLDING) {
addScaffoldingBreaker(event.getPlayer(), otherBlock); addScaffoldingBreaker(Actor.actorFromEntity(event.getPlayer()), otherBlock);
} }
} }
} }
@ -84,13 +85,13 @@ public class ScaffoldingLogging extends LoggingListener {
if (isLogging(block.getWorld(), Logging.SCAFFOLDING)) { if (isLogging(block.getWorld(), Logging.SCAFFOLDING)) {
cleanupScaffoldingBreakers(); cleanupScaffoldingBreakers();
if (block.getType() == Material.SCAFFOLDING) { if (block.getType() == Material.SCAFFOLDING) {
scaffoldingPlacersByLocation.put(block.getLocation(), event.getPlayer()); scaffoldingPlacersByLocation.put(block.getLocation(), Actor.actorFromEntity(event.getPlayer()));
} }
} }
} }
private void addScaffoldingBreaker(Player player, Block block) { public void addScaffoldingBreaker(Actor actor, Block block) {
ScaffoldingBreaker breaker = new ScaffoldingBreaker(player, block.getLocation()); ScaffoldingBreaker breaker = new ScaffoldingBreaker(actor, block.getLocation());
scaffoldingBreakersList.addLast(breaker); scaffoldingBreakersList.addLast(breaker);
scaffoldingBreakersByLocation.put(breaker.getLocation(), breaker); scaffoldingBreakersByLocation.put(breaker.getLocation(), breaker);
@ -109,14 +110,14 @@ public class ScaffoldingLogging extends LoggingListener {
} }
} }
private Player getScaffoldingBreaker(Block block) { private Actor getScaffoldingBreaker(Block block) {
if (scaffoldingBreakersList.isEmpty()) { if (scaffoldingBreakersList.isEmpty()) {
return null; return null;
} }
ScaffoldingBreaker breaker = scaffoldingBreakersByLocation.get(block.getLocation()); ScaffoldingBreaker breaker = scaffoldingBreakersByLocation.get(block.getLocation());
if (breaker != null) { if (breaker != null) {
return breaker.getBreaker(); return breaker.getActor();
} }
// Search all connected scaffoldings // Search all connected scaffoldings
@ -130,7 +131,7 @@ public class ScaffoldingLogging extends LoggingListener {
breaker = scaffoldingBreakersByLocation.get(loc); breaker = scaffoldingBreakersByLocation.get(loc);
if (breaker != null) { if (breaker != null) {
return breaker.getBreaker(); return breaker.getActor();
} }
for (BlockFace dir : NEIGHBOURS_SIDES_AND_BELOW) { for (BlockFace dir : NEIGHBOURS_SIDES_AND_BELOW) {
@ -145,18 +146,18 @@ public class ScaffoldingLogging extends LoggingListener {
} }
class ScaffoldingBreaker { class ScaffoldingBreaker {
protected final Player breaker; protected final Actor actor;
protected final long time; protected final long time;
protected final Location location; protected final Location location;
public ScaffoldingBreaker(Player breaker, Location location) { public ScaffoldingBreaker(Actor actor, Location location) {
this.breaker = breaker; this.actor = actor;
this.location = location; this.location = location;
this.time = System.currentTimeMillis(); this.time = System.currentTimeMillis();
} }
public Player getBreaker() { public Actor getActor() {
return breaker; return actor;
} }
public Location getLocation() { public Location getLocation() {

View File

@ -2,6 +2,7 @@ package de.diddiz.util;
import de.diddiz.LogBlock.Actor; import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.Consumer; import de.diddiz.LogBlock.Consumer;
import de.diddiz.LogBlock.Logging;
import de.diddiz.LogBlock.config.WorldConfig; import de.diddiz.LogBlock.config.WorldConfig;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -98,6 +99,9 @@ public class LoggingUtil {
} }
checkBlock = checkBlock.getRelative(BlockFace.UP); checkBlock = checkBlock.getRelative(BlockFace.UP);
} }
if (wcfg.isLogging(Logging.SCAFFOLDING) && checkBlock.getType() == Material.SCAFFOLDING && consumer.getLogblock().getScaffoldingLogging() != null) {
consumer.getLogblock().getScaffoldingLogging().addScaffoldingBreaker(actor, checkBlock);
}
} }
public static void smartLogBlockBreak(Consumer consumer, Actor actor, Block origin) { public static void smartLogBlockBreak(Consumer consumer, Actor actor, Block origin) {