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");
}
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.
*

View File

@ -36,6 +36,7 @@ public class LogBlock extends JavaPlugin {
private CommandsHandler commandsHandler;
private boolean noDb = false, connected = true;
private PlayerInfoLogging playerInfoLogging;
private ScaffoldingLogging scaffoldingLogging;
private Questioner questioner;
private volatile boolean isCompletelyEnabled;
@ -153,7 +154,7 @@ public class LogBlock extends JavaPlugin {
pm.registerEvents(new SnowFadeLogging(this), this);
}
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)) {
pm.registerEvents(new ExplosionLogging(this), this);
@ -337,4 +338,8 @@ public class LogBlock extends JavaPlugin {
public Questioner getQuestioner() {
return questioner;
}
public ScaffoldingLogging getScaffoldingLogging() {
return scaffoldingLogging;
}
}

View File

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

View File

@ -2,6 +2,7 @@ package de.diddiz.util;
import de.diddiz.LogBlock.Actor;
import de.diddiz.LogBlock.Consumer;
import de.diddiz.LogBlock.Logging;
import de.diddiz.LogBlock.config.WorldConfig;
import org.bukkit.Location;
import org.bukkit.Material;
@ -98,6 +99,9 @@ public class LoggingUtil {
}
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) {