Progress on the debug logging API

This commit is contained in:
Alexander Söderberg 2020-06-21 15:50:49 +02:00
parent d07d32e28b
commit 1dcf8d3995
No known key found for this signature in database
GPG Key ID: C0207FF7EA146678
8 changed files with 109 additions and 11 deletions

View File

@ -401,6 +401,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
if (!plot.getFlag(RedstoneFlag.class)) { if (!plot.getFlag(RedstoneFlag.class)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug("Prevented comparator update because redstone = false");
} }
return; return;
} }
@ -423,6 +424,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
if (plot.getFlag(DisablePhysicsFlag.class)) { if (plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug("Prevented block physics because disable-physics = true");
} }
return; return;
} }
@ -460,6 +462,7 @@ public class PlayerEvents extends PlotListener implements Listener {
Plot newPlot = area.getOwnedPlotAbs(location); Plot newPlot = area.getOwnedPlotAbs(location);
if (!plot.equals(newPlot)) { if (!plot.equals(newPlot)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection");
return; return;
} }
} }
@ -2959,6 +2962,8 @@ public class PlayerEvents extends PlotListener implements Listener {
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT,
Captions.PERMISSION_ADMIN_BUILD_OTHER); Captions.PERMISSION_ADMIN_BUILD_OTHER);
event.setCancelled(true); event.setCancelled(true);
plot.debug(player.getName() + " could not place " + event.getBlock().getType()
+ " because of the place flag");
return; return;
} }
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
@ -2973,6 +2978,7 @@ public class PlayerEvents extends PlotListener implements Listener {
Block block = event.getBlockPlaced(); Block block = event.getBlockPlaced();
if (block.getType().hasGravity()) { if (block.getType().hasGravity()) {
sendBlockChange(block.getLocation(), block.getBlockData()); sendBlockChange(block.getLocation(), block.getBlockData());
plot.debug(event.getBlock().getType() + " did not fall because of disable-physics = true");
} }
} }
} else if (!Permissions.hasPermission(pp, Captions.PERMISSION_ADMIN_BUILD_ROAD)) { } else if (!Permissions.hasPermission(pp, Captions.PERMISSION_ADMIN_BUILD_ROAD)) {
@ -2991,6 +2997,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return; return;
} }
if (plot.getFlag(InvincibleFlag.class)) { if (plot.getFlag(InvincibleFlag.class)) {
plot.debug(event.getEntity().getName() + " could not take damage because invincible = true");
event.setCancelled(true); event.setCancelled(true);
} }
} }
@ -3005,6 +3012,7 @@ public class PlayerEvents extends PlotListener implements Listener {
UUID uuid = pp.getUUID(); UUID uuid = pp.getUUID();
if (!plot.isAdded(uuid)) { if (!plot.isAdded(uuid)) {
if (!plot.getFlag(ItemDropFlag.class)) { if (!plot.getFlag(ItemDropFlag.class)) {
plot.debug(player.getName() + " could not drop item because of item-drop = false");
event.setCancelled(true); event.setCancelled(true);
} }
} }
@ -3021,6 +3029,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
UUID uuid = pp.getUUID(); UUID uuid = pp.getUUID();
if (!plot.isAdded(uuid) && plot.getFlag(DropProtectionFlag.class)) { if (!plot.isAdded(uuid) && plot.getFlag(DropProtectionFlag.class)) {
plot.debug(player.getName() + " could not pick up item because of drop-protection = true");
event.setCancelled(true); event.setCancelled(true);
} }
} }
@ -3029,6 +3038,7 @@ public class PlayerEvents extends PlotListener implements Listener {
@EventHandler public void onDeath(final PlayerDeathEvent event) { @EventHandler public void onDeath(final PlayerDeathEvent event) {
final Plot plot = BukkitUtil.getPlayer(event.getEntity()).getCurrentPlot(); final Plot plot = BukkitUtil.getPlayer(event.getEntity()).getCurrentPlot();
if (plot != null && plot.getFlag(KeepInventoryFlag.class)) { if (plot != null && plot.getFlag(KeepInventoryFlag.class)) {
plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true");
event.setKeepInventory(true); event.setKeepInventory(true);
} }
} }

View File

@ -52,7 +52,7 @@ public abstract class SetCommand extends SubCommand {
return false; return false;
} }
} }
if (!plot.isOwner(player.getUUID()) && !plot.getTrusted().contains(player.getUUID())) { if (!plot.isOwner(player.getUUID())) {
if (!Permissions.hasPermission(player, CaptionUtility if (!Permissions.hasPermission(player, CaptionUtility
.format(player, Captions.PERMISSION_ADMIN_COMMAND.getTranslated(), getFullId()))) { .format(player, Captions.PERMISSION_ADMIN_COMMAND.getTranslated(), getFullId()))) {
MainUtil.sendMessage(player, Captions.NO_PERMISSION, CaptionUtility MainUtil.sendMessage(player, Captions.NO_PERMISSION, CaptionUtility

View File

@ -47,7 +47,7 @@ public class Toggle extends Command {
aliases = {"spy"}, aliases = {"spy"},
permission = "plots.admin.command.chat", permission = "plots.admin.command.chat",
description = "Toggle plot chat spy") description = "Toggle plot chat spy")
public void chatspy(Command command, PlotPlayer player, String[] args, public void chatspy(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) { RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "chatspy")) { if (toggle(player, "chatspy")) {
@ -61,7 +61,7 @@ public class Toggle extends Command {
aliases = {"we", "wea"}, aliases = {"we", "wea"},
permission = "plots.worldedit.bypass", permission = "plots.worldedit.bypass",
description = "Toggle worldedit area restrictions") description = "Toggle worldedit area restrictions")
public void worldedit(Command command, PlotPlayer player, String[] args, public void worldedit(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) { RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "worldedit")) { if (toggle(player, "worldedit")) {
@ -74,7 +74,7 @@ public class Toggle extends Command {
@CommandDeclaration(command = "chat", @CommandDeclaration(command = "chat",
permission = "plots.toggle.chat", permission = "plots.toggle.chat",
description = "Toggle plot chat") description = "Toggle plot chat")
public void chat(Command command, PlotPlayer player, String[] args, public void chat(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) { RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "chat")) { if (toggle(player, "chat")) {
@ -87,7 +87,7 @@ public class Toggle extends Command {
@CommandDeclaration(command = "clear-confirmation", @CommandDeclaration(command = "clear-confirmation",
permission = "plots.admin.command.autoclear", permission = "plots.admin.command.autoclear",
description = "Toggle autoclear confirmation") description = "Toggle autoclear confirmation")
public void clearConfirmation(Command command, PlotPlayer player, String[] args, public void clearConfirmation(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) { RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "ignoreExpireTask")) { if (toggle(player, "ignoreExpireTask")) {
@ -100,7 +100,7 @@ public class Toggle extends Command {
@CommandDeclaration(command = "titles", @CommandDeclaration(command = "titles",
permission = "plots.toggle.titles", permission = "plots.toggle.titles",
description = "Toggle plot title messages") description = "Toggle plot title messages")
public void titles(Command command, PlotPlayer player, String[] args, public void titles(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) { RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "disabletitles")) { if (toggle(player, "disabletitles")) {
@ -113,7 +113,7 @@ public class Toggle extends Command {
@CommandDeclaration(command = "time", @CommandDeclaration(command = "time",
permission = "plots.toggle.time", permission = "plots.toggle.time",
description = "Toggle plot time settings") description = "Toggle plot time settings")
public void time(Command command, PlotPlayer player, String[] args, public void time(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm, RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) { RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "disabletime")) { if (toggle(player, "disabletime")) {
@ -123,7 +123,21 @@ public class Toggle extends Command {
} }
} }
public boolean toggle(PlotPlayer player, String key) { @CommandDeclaration(command = "debug",
permission = "plots.toggle.debug",
description = "Toggle plot debugging")
public void debug(Command command, PlotPlayer<?> player, String[] args,
RunnableVal3<Command, Runnable, Runnable> confirm,
RunnableVal2<Command, CommandResult> whenDone) {
if (toggle(player, "debug")) {
MainUtil.sendMessage(player, Captions.TOGGLE_ENABLED, command.toString());
} else {
MainUtil.sendMessage(player, Captions.TOGGLE_DISABLED, command.toString());
}
player.refreshDebug();
}
public boolean toggle(PlotPlayer<?> player, String key) {
if (player.getAttribute(key)) { if (player.getAttribute(key)) {
player.removeAttribute(key); player.removeAttribute(key);
return true; return true;

View File

@ -190,6 +190,7 @@ public enum Captions implements Caption {
PERMISSION_BACKUP_LOAD("plots.backup.load", "static.permissions"), PERMISSION_BACKUP_LOAD("plots.backup.load", "static.permissions"),
PERMISSION_ADMIN_BACKUP_OTHER("plots.admin.backup.other", "static.permissions"), PERMISSION_ADMIN_BACKUP_OTHER("plots.admin.backup.other", "static.permissions"),
PERMISSION_ADMIN_ALLOW_UNSAFE("plots.admin.unsafe", "static.permissions"), PERMISSION_ADMIN_ALLOW_UNSAFE("plots.admin.unsafe", "static.permissions"),
PERMISSION_ADMIN_DEBUG_OTHER("plots.admin.debug.other", "static.permissions"),
//</editor-fold> //</editor-fold>
//<editor-fold desc="Confirm"> //<editor-fold desc="Confirm">
EXPIRED_CONFIRM("$2Confirmation has expired, please run the command again!", "Confirm"), EXPIRED_CONFIRM("$2Confirmation has expired, please run the command again!", "Confirm"),
@ -803,6 +804,10 @@ public enum Captions implements Caption {
SINGLE_AREA_CREATED("$1The area was created successfully!", "Single"), SINGLE_AREA_CREATED("$1The area was created successfully!", "Single"),
//</editor-fold> //</editor-fold>
//<editor-fold desc="Debug">
PLOT_DEBUG("$1Plot Debug ($2%plot%$1): %message%", "Plot-Debug"),
//</editor-fold>
/** /**
* Legacy Configuration Conversion * Legacy Configuration Conversion
*/ */

View File

@ -56,8 +56,11 @@ import lombok.NonNull;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -72,12 +75,17 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
public static final String META_LAST_PLOT = "lastplot"; public static final String META_LAST_PLOT = "lastplot";
public static final String META_LOCATION = "location"; public static final String META_LOCATION = "location";
// Used to track debug mode
private static final Set<PlotPlayer<?>> debugModeEnabled = Collections.synchronizedSet(new HashSet<>());
private static final Map<Class, PlotPlayerConverter> converters = new HashMap<>(); private static final Map<Class, PlotPlayerConverter> converters = new HashMap<>();
private Map<String, byte[]> metaMap = new HashMap<>(); private Map<String, byte[]> metaMap = new HashMap<>();
/** /**
* The metadata map. * The metadata map.
*/ */
private ConcurrentHashMap<String, Object> meta; private ConcurrentHashMap<String, Object> meta;
private int hash;
public static <T> PlotPlayer from(@NonNull final T object) { public static <T> PlotPlayer from(@NonNull final T object) {
if (!converters.containsKey(object.getClass())) { if (!converters.containsKey(object.getClass())) {
@ -93,6 +101,19 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
converters.put(clazz, converter); converters.put(clazz, converter);
} }
public static Collection<PlotPlayer<?>> getDebugModePlayerInPlot(@NotNull final Plot plot) {
if (debugModeEnabled.isEmpty()) {
return Collections.emptyList();
}
final Collection<PlotPlayer<?>> players = new LinkedList<>();
for (final PlotPlayer<?> player : debugModeEnabled) {
if (player.getCurrentPlot().equals(plot)) {
players.add(player);
}
}
return players;
}
/** /**
* Efficiently wrap a Player, or OfflinePlayer object to get a PlotPlayer (or fetch if it's already cached)<br> * Efficiently wrap a Player, or OfflinePlayer object to get a PlotPlayer (or fetch if it's already cached)<br>
* - Accepts sponge/bukkit Player (online) * - Accepts sponge/bukkit Player (online)
@ -519,6 +540,15 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
*/ */
public abstract void kick(String message); public abstract void kick(String message);
public void refreshDebug() {
final boolean debug = this.getAttribute("debug");
if (debug && !debugModeEnabled.contains(this)) {
debugModeEnabled.add(this);
} else if (!debug) {
debugModeEnabled.remove(this);
}
}
/** /**
* Called when this player quits. * Called when this player quits.
*/ */
@ -556,6 +586,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
} }
PlotSquared.imp().getPlayerManager().removePlayer(this); PlotSquared.imp().getPlayerManager().removePlayer(this);
PlotSquared.get().IMP.unregister(this); PlotSquared.get().IMP.unregister(this);
debugModeEnabled.remove(this);
} }
/** /**
@ -603,6 +635,10 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
return; return;
} }
if (PlotPlayer.this.getAttribute("debug")) {
debugModeEnabled.add(PlotPlayer.this);
}
if (!Settings.Teleport.ON_LOGIN) { if (!Settings.Teleport.ON_LOGIN) {
return; return;
} }
@ -693,10 +729,27 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
public abstract void stopSpectating(); public abstract void stopSpectating();
public boolean hasDebugMode() {
return this.getAttribute("debug");
}
@Override public int hashCode() {
if (this.hash == 0 || this.hash == 485) {
this.hash = 485 + this.getUUID().hashCode();
}
return this.hash;
}
@Override public boolean equals(final Object obj) {
if (!(obj instanceof PlotPlayer)) {
return false;
}
final PlotPlayer<?> other = (PlotPlayer<?>) obj;
return this.getUUID().equals(other.getUUID());
}
/** /**
* The amount of money this Player has. * The amount of money this Player has.
*
* @return
*/ */
public double getMoney() { public double getMoney() {
return EconHandler.manager == null ? 0 : EconHandler.manager.getMoney(this); return EconHandler.manager == null ? 0 : EconHandler.manager.getMoney(this);

View File

@ -2924,6 +2924,21 @@ public class Plot {
}, 1); }, 1);
} }
public void debug(@NotNull final String message) {
final Collection<PlotPlayer<?>> players = PlotPlayer.getDebugModePlayerInPlot(this);
if (players.isEmpty()) {
return;
}
final String string = Captions.PLOT_DEBUG.getTranslated().replace("%plot%", this.toString())
.replace("%message%", message);
for (final PlotPlayer<?> player : players) {
if (isOwner(player.getUUID()) ||
Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_DEBUG_OTHER)) {
player.sendMessage(string);
}
}
}
/** /**
* Gets all the corners of the plot (supports non-rectangular shapes). * Gets all the corners of the plot (supports non-rectangular shapes).
* *

View File

@ -90,6 +90,7 @@ public final class EntityUtil {
if (mobs[i] >= cap) { if (mobs[i] >= cap) {
plot.setMeta("EntityCount", mobs); plot.setMeta("EntityCount", mobs);
plot.setMeta("EntityCountTime", System.currentTimeMillis()); plot.setMeta("EntityCountTime", System.currentTimeMillis());
plot.debug("Prevented spawning of mob because it would exceed " + flag.getName());
return true; return true;
} }
} }

View File

@ -49,7 +49,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
* *
* @param plotPlayer Player to remove * @param plotPlayer Player to remove
*/ */
public void removePlayer(@NotNull final PlotPlayer plotPlayer) { public void removePlayer(@NotNull final PlotPlayer<?> plotPlayer) {
synchronized (playerLock) { synchronized (playerLock) {
this.playerMap.remove(plotPlayer.getUUID()); this.playerMap.remove(plotPlayer.getUUID());
} }