diff --git a/pom.xml b/pom.xml index 45e89a318..776c0c19e 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ UTF-8 PlotSquared - 3.2.22 + 3.2.23 PlotSquared jar diff --git a/src/main/java/com/intellectualcrafters/plot/PS.java b/src/main/java/com/intellectualcrafters/plot/PS.java index a5d67f3b3..428bd4be2 100644 --- a/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/src/main/java/com/intellectualcrafters/plot/PS.java @@ -1336,17 +1336,17 @@ public class PS { } case "f": case "floor": { - config.set(base + "plot.floor", Arrays.asList(StringMan.join(Configuration.BLOCKLIST.parseString(value), ",").split(","))); + config.set(base + "plot.floor", new ArrayList(Arrays.asList(StringMan.join(Configuration.BLOCKLIST.parseString(value), ",").split(",")))); break; } case "m": case "main": { - config.set(base + "plot.filling", Arrays.asList(StringMan.join(Configuration.BLOCKLIST.parseString(value), ",").split(","))); + config.set(base + "plot.filling", new ArrayList(Arrays.asList(StringMan.join(Configuration.BLOCKLIST.parseString(value), ",").split(",")))); break; } case "w": case "wall": { - config.set(base + "wall.filling", Arrays.asList(StringMan.join(Configuration.BLOCKLIST.parseString(value), ",").split(","))); + config.set(base + "wall.filling", Configuration.BLOCK.parseString(value).toString()); break; } case "b": diff --git a/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java b/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java index 9c650ad2d..3d56b97a7 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java @@ -218,7 +218,7 @@ public class DebugExec extends SubCommand { return false; } final String flag = args[1]; - for (final Plot plot : PS.get().getPlots()) { + for (final Plot plot : PS.get().getBasePlots()) { if (FlagManager.getPlotFlagRaw(plot, flag) != null) { FlagManager.removePlotFlag(plot, flag); } @@ -409,6 +409,49 @@ public class DebugExec extends SubCommand { } break; } + case "allcmd": { + if (args.length < 3) { + C.COMMAND_SYNTAX.send(player, "/plot debugexec allcmd "); + return false; + } + long start = System.currentTimeMillis(); + Command cmd = MainCommand.getInstance().getCommand(args[3]); + String[] params = Arrays.copyOfRange(args, 4, args.length); + if (args[1].equals("true")) { + Location loc = (Location) player.getMeta("location"); + Plot plot = (Plot) player.getMeta("lastplot"); + for (Plot current : PS.get().getBasePlots()) { + player.setMeta("location", current.getBottomAbs()); + player.setMeta("lastplot", current); + cmd.onCommand(player, params); + } + if (loc == null) { + player.deleteMeta("location"); + } else { + player.setMeta("location", loc); + } + if (plot == null) { + player.deleteMeta("lastplot"); + } else { + player.setMeta("lastplot", plot); + } + player.sendMessage("&c> " + (System.currentTimeMillis() - start)); + return true; + } + init(); + scope.put("_2", params); + scope.put("_3", cmd); + script = "_1=PS.getBasePlots().iterator();while(_1.hasNext()){plot=_1.next();if(" + args[1] + "){PlotPlayer.setMeta(\"location\",plot.getBottomAbs());PlotPlayer.setMeta(\"lastplot\",plot);_3.onCommand(PlotPlayer,_2)}}"; + break; + } + case "all": { + if (args.length < 3) { + C.COMMAND_SYNTAX.send(player, "/plot debugexec all "); + return false; + } + script = "_1=PS.getBasePlots().iterator();while(_1.hasNext()){plot=_1.next();if(" + args[1] + "){" + StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ") + "}}"; + break; + } default: { script = StringMan.join(args, " "); } diff --git a/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java b/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java index cc9a81376..0eaf5577e 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java @@ -210,6 +210,8 @@ public class MainCommand extends CommandManager { int help_index = -1; String category = null; Location loc = null; + Plot plot = null; + boolean tp = false; switch (args.length) { case 0: { help_index = 0; @@ -268,15 +270,21 @@ public class MainCommand extends CommandManager { default: { if (args.length >= 2) { String world = player.getLocation().getWorld(); - Plot plot = Plot.fromString(world, args[0]); - if (plot == null) { + Plot newPlot = Plot.fromString(world, args[0]); + if (newPlot == null) { break; } - if (!ConsolePlayer.isConsole(player) && (!plot.world.equals(world) || plot.isDenied(player.getUUID())) && !Permissions.hasPermission(player, C.PERMISSION_ADMIN)) { + if (!ConsolePlayer.isConsole(player) && (!newPlot.world.equals(world) || newPlot.isDenied(player.getUUID())) && !Permissions.hasPermission(player, C.PERMISSION_ADMIN)) { break; } + // Save meta loc = (Location) player.getMeta("location"); - player.setMeta("location", plot.getBottomAbs()); + plot = (Plot) player.getMeta("lastplot"); + tp = true; + // Set loc + player.setMeta("location", newPlot.getBottomAbs()); + player.setMeta("lastplot", newPlot); + // Trim command args = Arrays.copyOfRange(args, 1, args.length); } } @@ -292,8 +300,18 @@ public class MainCommand extends CommandManager { } String fullCmd = StringMan.join(args, " "); getInstance().handle(player, cmd + " " + fullCmd); - if (loc != null) { - player.setMeta("location", loc); + // Restore location + if (tp) { + if (loc == null) { + player.deleteMeta("location"); + } else { + player.setMeta("location", loc); + } + if (plot == null) { + player.deleteMeta("lastplot"); + } else { + player.setMeta("lastplot", plot); + } } return true; } diff --git a/src/main/java/com/intellectualcrafters/plot/object/ConsolePlayer.java b/src/main/java/com/intellectualcrafters/plot/object/ConsolePlayer.java index 140b73f10..927565866 100644 --- a/src/main/java/com/intellectualcrafters/plot/object/ConsolePlayer.java +++ b/src/main/java/com/intellectualcrafters/plot/object/ConsolePlayer.java @@ -15,7 +15,6 @@ import com.intellectualcrafters.plot.util.PlotWeather; public class ConsolePlayer extends PlotPlayer { private static ConsolePlayer instance; - private Location loc; private final HashMap meta; public static ConsolePlayer getConsole() { @@ -38,8 +37,9 @@ public class ConsolePlayer extends PlotPlayer { } else { world = "world"; } - loc = new Location(world, 0, 0, 0); meta = new HashMap<>(); + Location loc = new Location(world, 0, 0, 0); + setMeta("location", loc); } public static boolean isConsole(final PlotPlayer plr) { @@ -53,12 +53,12 @@ public class ConsolePlayer extends PlotPlayer { @Override public Location getLocation() { - return loc; + return (Location) getMeta("location"); } @Override public Location getLocationFull() { - return loc; + return (Location) getMeta("location"); } @Override @@ -85,7 +85,7 @@ public class ConsolePlayer extends PlotPlayer { public void teleport(final Location loc) { final Plot plot = MainUtil.getPlot(loc); setMeta("lastplot", plot); - this.loc = loc; + setMeta("location", loc); } @Override diff --git a/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java b/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java index 401350c00..4bd7dfe9f 100644 --- a/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java +++ b/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java @@ -7,14 +7,15 @@ import java.util.concurrent.ConcurrentHashMap; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.commands.RequiredType; import com.intellectualcrafters.plot.config.Settings; +import com.intellectualcrafters.plot.util.CmdConfirm; import com.intellectualcrafters.plot.util.EventUtil; import com.intellectualcrafters.plot.util.ExpireManager; import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.PlotGamemode; import com.intellectualcrafters.plot.util.PlotWeather; +import com.intellectualcrafters.plot.util.SetupUtils; import com.intellectualcrafters.plot.util.UUIDHandler; import com.plotsquared.general.commands.CommandCaller; -import com.plotsquared.listener.PlotListener; /** * The PlotPlayer class
@@ -321,17 +322,19 @@ public abstract class PlotPlayer implements CommandCaller { public void unregister() { final Plot plot = getCurrentPlot(); if (plot != null) { - PlotListener.plotExit(this, plot); + EventUtil.manager.callLeave(this, plot); } - ExpireManager.dates.put(getUUID(), System.currentTimeMillis()); - EventUtil.unregisterPlayer(this); if (Settings.DELETE_PLOTS_ON_BAN && isBanned()) { for (final Plot owned : PS.get().getPlotsInWorld(getName())) { owned.deletePlot(null); PS.debug(String.format("&cPlot &6%s &cwas deleted + cleared due to &6%s&c getting banned", plot.getId(), getName())); } } - UUIDHandler.getPlayers().remove(getName()); + String name = getName(); + ExpireManager.dates.put(getUUID(), System.currentTimeMillis()); + SetupUtils.setupMap.remove(name); + CmdConfirm.removePending(name); + UUIDHandler.getPlayers().remove(name); PS.get().IMP.unregister(this); } } diff --git a/src/main/java/com/intellectualcrafters/plot/object/PlotWorld.java b/src/main/java/com/intellectualcrafters/plot/object/PlotWorld.java index 5781a0c25..4f57f4866 100644 --- a/src/main/java/com/intellectualcrafters/plot/object/PlotWorld.java +++ b/src/main/java/com/intellectualcrafters/plot/object/PlotWorld.java @@ -284,6 +284,11 @@ public abstract class PlotWorld { } } + @Override + public String toString() { + return worldname; + } + /** * Used for the /plot setup command Return null if you do not want to support this feature * diff --git a/src/main/java/com/intellectualcrafters/plot/util/EventUtil.java b/src/main/java/com/intellectualcrafters/plot/util/EventUtil.java index f5c7e88f2..c9b090f89 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/EventUtil.java +++ b/src/main/java/com/intellectualcrafters/plot/util/EventUtil.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.UUID; -import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.flag.Flag; import com.intellectualcrafters.plot.flag.FlagManager; @@ -22,15 +21,6 @@ public abstract class EventUtil { public static EventUtil manager = null; - public static void unregisterPlayer(final PlotPlayer player) { - final String name = player.getName(); - if (SetupUtils.setupMap.containsKey(name)) { - SetupUtils.setupMap.remove(name); - } - CmdConfirm.removePending(name); - PS.get().IMP.unregister(player); - } - public abstract Rating callRating(final PlotPlayer player, final Plot plot, final Rating rating); public abstract boolean callClaim(final PlotPlayer player, final Plot plot, final boolean auto); diff --git a/src/main/java/com/intellectualcrafters/plot/util/UUIDHandlerImplementation.java b/src/main/java/com/intellectualcrafters/plot/util/UUIDHandlerImplementation.java index 3004c965e..cdcb49e5b 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/UUIDHandlerImplementation.java +++ b/src/main/java/com/intellectualcrafters/plot/util/UUIDHandlerImplementation.java @@ -108,27 +108,32 @@ public abstract class UUIDHandlerImplementation { * lazy UUID conversion: * - Useful if the person misconfigured the database, or settings before PlotMe conversion */ - if (!Settings.OFFLINE_MODE) { - UUID offline = UUID.nameUUIDFromBytes(("OfflinePlayer:" + name.value).getBytes(Charsets.UTF_8)); - if (!unknown.contains(offline) && !name.value.equals(name.value.toLowerCase())) { - offline = UUID.nameUUIDFromBytes(("OfflinePlayer:" + name.value).getBytes(Charsets.UTF_8)); - if (!unknown.contains(offline)) { - offline = null; - } - } - if (offline != null && !offline.equals(uuid)) { - unknown.remove(offline); - final Set plots = PS.get().getPlots(offline); - if (plots.size() > 0) { - for (final Plot plot : plots) { - plot.owner = uuid; + if (!Settings.OFFLINE_MODE && unknown.size() > 0) { + TaskManager.runTaskAsync(new Runnable() { + @Override + public void run() { + UUID offline = UUID.nameUUIDFromBytes(("OfflinePlayer:" + name.value).getBytes(Charsets.UTF_8)); + if (!unknown.contains(offline) && !name.value.equals(name.value.toLowerCase())) { + offline = UUID.nameUUIDFromBytes(("OfflinePlayer:" + name.value.toLowerCase()).getBytes(Charsets.UTF_8)); + if (!unknown.contains(offline)) { + offline = null; + } + } + if (offline != null && !offline.equals(uuid)) { + unknown.remove(offline); + final Set plots = PS.get().getPlots(offline); + if (plots.size() > 0) { + for (final Plot plot : plots) { + plot.owner = uuid; + } + DBFunc.replaceUUID(offline, uuid); + PS.debug("&cDetected invalid UUID stored for: " + name.value); + PS.debug("&7 - Did you recently switch to online-mode storage without running `uuidconvert`?"); + PS.debug("&6PlotSquared will update incorrect entries when the user logs in, or you can reconstruct your database."); + } } - DBFunc.replaceUUID(offline, uuid); - PS.debug("&cDetected invalid UUID stored for: " + name.value); - PS.debug("&7 - Did you recently switch to online-mode storage without running `uuidconvert`?"); - PS.debug("&6PlotSquared will update incorrect entries when the user logs in, or you can reconstruct your database."); } - } + }); } try { final UUID offline = uuidMap.put(name, uuid); diff --git a/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java b/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java index 53318f7c7..83ee7bfa0 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java @@ -74,9 +74,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerEggThrowEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -96,7 +94,6 @@ import org.bukkit.util.Vector; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.Settings; -import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.flag.Flag; import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.object.Location; @@ -407,57 +404,48 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen } } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onConnect(final PlayerLoginEvent event) { final Player player = event.getPlayer(); - final String name = player.getName(); + BukkitUtil.getPlayer(event.getPlayer()).unregister(); final PlotPlayer pp = BukkitUtil.getPlayer(player); - if (name.equals("PlotSquared") || pp.getUUID().equals(DBFunc.everyone)) { - event.disallow(Result.KICK_WHITELIST, "This account is reserved"); - BukkitUtil.removePlayer(pp.getName()); - } - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onJoin(final PlayerJoinEvent event) { - final Player player = event.getPlayer(); - if (!player.hasPlayedBefore()) { - player.saveData(); - } - BukkitUtil.getPlayer(event.getPlayer()).unregister();; - final PlotPlayer pp = BukkitUtil.getPlayer(player); - - // Set last location - pp.setMeta("location", BukkitUtil.getLocation(player.getLocation())); - - final String username = pp.getName(); - final StringWrapper name = new StringWrapper(username); + // Now + String name = pp.getName(); + StringWrapper sw = new StringWrapper(name); final UUID uuid = pp.getUUID(); - UUIDHandler.add(name, uuid); - ExpireManager.dates.put(uuid, System.currentTimeMillis()); - if (BukkitMain.worldEdit != null) { - if (pp.getAttribute("worldedit")) { - MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASSED); - } + UUIDHandler.add(sw, uuid); + + Location loc = pp.getLocation(); + final Plot plot = MainUtil.getPlotAbs(loc); + if (plot != null) { + plotEntry(pp, plot); } - if ((PS.get().update != null) && Permissions.hasPermission(pp, C.PERMISSION_ADMIN_UPDATE) && Settings.UPDATE_NOTIFICATIONS) { - TaskManager.runTaskLater(new Runnable() { - @Override - public void run() { + // Delayed + { + + } + // Async + TaskManager.runTaskLaterAsync(new Runnable() { + @Override + public void run() { + if (!player.hasPlayedBefore()) { + player.saveData(); + } + ExpireManager.dates.put(uuid, System.currentTimeMillis()); + if (BukkitMain.worldEdit != null) { + if (pp.getAttribute("worldedit")) { + MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASSED); + } + } + if ((PS.get().update != null) && Permissions.hasPermission(pp, C.PERMISSION_ADMIN_UPDATE) && Settings.UPDATE_NOTIFICATIONS) { MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update"); } - }, 20); - } - final Location loc = BukkitUtil.getLocation(player.getLocation()); - final Plot plot = MainUtil.getPlot(loc); - if (plot == null) { - return; - } - if (Settings.TELEPORT_ON_LOGIN) { - MainUtil.teleportPlayer(pp, pp.getLocation(), plot); - MainUtil.sendMessage(pp, C.TELEPORTED_TO_ROAD); - } - plotEntry(pp, plot); + if (Settings.TELEPORT_ON_LOGIN && plot != null) { + MainUtil.teleportPlayer(pp, pp.getLocation(), plot); + MainUtil.sendMessage(pp, C.TELEPORTED_TO_ROAD); + } + } + }, 20); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -740,8 +728,7 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen } } if (Settings.PERMISSION_CACHING) { - ((BukkitPlayer) pp).hasPerm = new HashSet<>(); - ((BukkitPlayer) pp).noPerm = new HashSet<>(); + pp.deleteMeta("perm"); } } @@ -1225,9 +1212,8 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen if (entity instanceof Player) { return; } - final Location loc = BukkitUtil.getLocation(event.getLocation()); - final String world = loc.getWorld(); - final PlotWorld plotworld = PS.get().getPlotWorld(world); + final Location loc = BukkitUtil.getLocation(entity.getLocation()); + final PlotWorld plotworld = loc.getPlotWorld(); if (plotworld == null) { return; } @@ -1235,18 +1221,28 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen return; } final CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason(); - if (((reason == CreatureSpawnEvent.SpawnReason.SPAWNER_EGG) || (reason == CreatureSpawnEvent.SpawnReason.DISPENSE_EGG)) && !plotworld.SPAWN_EGGS) { - event.setCancelled(true); - return; - } else if ((reason == CreatureSpawnEvent.SpawnReason.BREEDING) && !plotworld.SPAWN_BREEDING) { - event.setCancelled(true); - return; - } else if ((reason == CreatureSpawnEvent.SpawnReason.CUSTOM) && !plotworld.SPAWN_CUSTOM && !(event.getEntityType().getTypeId() == 30)) { - event.setCancelled(true); - return; + switch (reason) { + case SPAWNER_EGG: + case DISPENSE_EGG: + if (!plotworld.SPAWN_EGGS) { + event.setCancelled(true); + return; + } + break; + case BREEDING: + if (!plotworld.SPAWN_BREEDING) { + event.setCancelled(true); + return; + } + break; + case CUSTOM: + if (!plotworld.SPAWN_CUSTOM && entity.getType().getTypeId() != 30) { + event.setCancelled(true); + return; + } + break; } - - final Plot plot = MainUtil.getPlot(loc); + final Plot plot = MainUtil.getPlotAbs(loc); if (checkEntity(entity, plot)) { event.setCancelled(true); return; @@ -1342,116 +1338,116 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen } public boolean checkEntity(final Entity entity, final Plot plot) { - if ((plot != null) && (plot.owner != null)) { - switch (entity.getType()) { - case PLAYER: { - return false; - } - case SMALL_FIREBALL: - case FIREBALL: - case DROPPED_ITEM: - case EGG: - case THROWN_EXP_BOTTLE: - case SPLASH_POTION: - case SNOWBALL: - case ENDER_PEARL: - case ARROW: { - // projectile - } - case PRIMED_TNT: - case FALLING_BLOCK: { - // Block entities - } - case ENDER_CRYSTAL: - case COMPLEX_PART: - case FISHING_HOOK: - case ENDER_SIGNAL: - case EXPERIENCE_ORB: - case LEASH_HITCH: - case FIREWORK: - case WEATHER: - case LIGHTNING: - case WITHER_SKULL: - case UNKNOWN: { - // non moving / unremovable - return checkEntity(plot, "entity-cap"); - } - case ITEM_FRAME: - case PAINTING: - case ARMOR_STAND: { - return checkEntity(plot, "entity-cap", "misc-cap"); - // misc - } - case MINECART: - case MINECART_CHEST: - case MINECART_COMMAND: - case MINECART_FURNACE: - case MINECART_HOPPER: - case MINECART_MOB_SPAWNER: - case MINECART_TNT: - case BOAT: { - return checkEntity(plot, "entity-cap", "vehicle-cap"); - } - case RABBIT: - case SHEEP: - case MUSHROOM_COW: - case OCELOT: - case PIG: - case HORSE: - case SQUID: - case VILLAGER: - case IRON_GOLEM: - case WOLF: - case CHICKEN: - case COW: - case SNOWMAN: - case BAT: { - // animal - return checkEntity(plot, "entity-cap", "mob-cap", "animal-cap"); - } - case BLAZE: - case CAVE_SPIDER: - case CREEPER: - case ENDERMAN: - case ENDERMITE: - case ENDER_DRAGON: - case GHAST: - case GIANT: - case GUARDIAN: - case MAGMA_CUBE: - case PIG_ZOMBIE: - case SILVERFISH: - case SKELETON: - case SLIME: - case SPIDER: - case WITCH: - case WITHER: - case ZOMBIE: { - // monster - return checkEntity(plot, "entity-cap", "mob-cap", "hostile-cap"); - } - default: { - String[] types; - if (entity instanceof LivingEntity) { - if (entity instanceof Animals) { - types = new String[] { "entity-cap", "mob-cap", "animal-cap" }; - } else if (entity instanceof Monster) { - types = new String[] { "entity-cap", "mob-cap", "hostile-cap" }; - } else { - types = new String[] { "entity-cap", "mob-cap" }; - } - } else if (entity instanceof Vehicle) { - types = new String[] { "entity-cap", "vehicle-cap" }; - } else if (entity instanceof Hanging) { - types = new String[] { "entity-cap", "misc-cap" }; + if (plot == null || plot.owner == null || plot.settings == null || (plot.settings.flags.size() == 0 && plot.getWorld().DEFAULT_FLAGS.size() == 0)) { + return false; + } + switch (entity.getType()) { + case PLAYER: { + return false; + } + case SMALL_FIREBALL: + case FIREBALL: + case DROPPED_ITEM: + case EGG: + case THROWN_EXP_BOTTLE: + case SPLASH_POTION: + case SNOWBALL: + case ENDER_PEARL: + case ARROW: { + // projectile + } + case PRIMED_TNT: + case FALLING_BLOCK: { + // Block entities + } + case ENDER_CRYSTAL: + case COMPLEX_PART: + case FISHING_HOOK: + case ENDER_SIGNAL: + case EXPERIENCE_ORB: + case LEASH_HITCH: + case FIREWORK: + case WEATHER: + case LIGHTNING: + case WITHER_SKULL: + case UNKNOWN: { + // non moving / unremovable + return checkEntity(plot, "entity-cap"); + } + case ITEM_FRAME: + case PAINTING: + case ARMOR_STAND: { + return checkEntity(plot, "entity-cap", "misc-cap"); + // misc + } + case MINECART: + case MINECART_CHEST: + case MINECART_COMMAND: + case MINECART_FURNACE: + case MINECART_HOPPER: + case MINECART_MOB_SPAWNER: + case MINECART_TNT: + case BOAT: { + return checkEntity(plot, "entity-cap", "vehicle-cap"); + } + case RABBIT: + case SHEEP: + case MUSHROOM_COW: + case OCELOT: + case PIG: + case HORSE: + case SQUID: + case VILLAGER: + case IRON_GOLEM: + case WOLF: + case CHICKEN: + case COW: + case SNOWMAN: + case BAT: { + // animal + return checkEntity(plot, "entity-cap", "mob-cap", "animal-cap"); + } + case BLAZE: + case CAVE_SPIDER: + case CREEPER: + case ENDERMAN: + case ENDERMITE: + case ENDER_DRAGON: + case GHAST: + case GIANT: + case GUARDIAN: + case MAGMA_CUBE: + case PIG_ZOMBIE: + case SILVERFISH: + case SKELETON: + case SLIME: + case SPIDER: + case WITCH: + case WITHER: + case ZOMBIE: { + // monster + return checkEntity(plot, "entity-cap", "mob-cap", "hostile-cap"); + } + default: { + String[] types; + if (entity instanceof LivingEntity) { + if (entity instanceof Animals) { + types = new String[] { "entity-cap", "mob-cap", "animal-cap" }; + } else if (entity instanceof Monster) { + types = new String[] { "entity-cap", "mob-cap", "hostile-cap" }; } else { - types = new String[] { "entity-cap" }; + types = new String[] { "entity-cap", "mob-cap" }; } - return checkEntity(plot, types); + } else if (entity instanceof Vehicle) { + types = new String[] { "entity-cap", "vehicle-cap" }; + } else if (entity instanceof Hanging) { + types = new String[] { "entity-cap", "misc-cap" }; + } else { + types = new String[] { "entity-cap" }; } + return checkEntity(plot, types); } } - return false; } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java b/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java index 545457dc3..43b88245a 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java @@ -65,37 +65,41 @@ public class PlotPlusListener extends PlotListener implements Listener { plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { @Override public void run() { - for (final Iterator> iter = healRunnable.entrySet().iterator(); iter.hasNext();) { - final Entry entry = iter.next(); - final Interval value = entry.getValue(); - ++value.count; - if (value.count == value.interval) { - value.count = 0; - final Player player = Bukkit.getPlayer(entry.getKey()); - if (player == null) { - iter.remove(); - continue; - } - final double level = player.getHealth(); - if (level != value.max) { - player.setHealth(Math.min(level + value.amount, value.max)); + if (healRunnable.size() > 0) { + for (final Iterator> iter = healRunnable.entrySet().iterator(); iter.hasNext();) { + final Entry entry = iter.next(); + final Interval value = entry.getValue(); + ++value.count; + if (value.count == value.interval) { + value.count = 0; + final Player player = Bukkit.getPlayer(entry.getKey()); + if (player == null) { + iter.remove(); + continue; + } + final double level = player.getHealth(); + if (level != value.max) { + player.setHealth(Math.min(level + value.amount, value.max)); + } } } } - for (final Iterator> iter = feedRunnable.entrySet().iterator(); iter.hasNext();) { - final Entry entry = iter.next(); - final Interval value = entry.getValue(); - ++value.count; - if (value.count == value.interval) { - value.count = 0; - final Player player = Bukkit.getPlayer(entry.getKey()); - if (player == null) { - iter.remove(); - continue; - } - final int level = player.getFoodLevel(); - if (level != value.max) { - player.setFoodLevel(Math.min(level + value.amount, value.max)); + if (feedRunnable.size() > 0) { + for (final Iterator> iter = feedRunnable.entrySet().iterator(); iter.hasNext();) { + final Entry entry = iter.next(); + final Interval value = entry.getValue(); + ++value.count; + if (value.count == value.interval) { + value.count = 0; + final Player player = Bukkit.getPlayer(entry.getKey()); + if (player == null) { + iter.remove(); + continue; + } + final int level = player.getFoodLevel(); + if (level != value.max) { + player.setFoodLevel(Math.min(level + value.amount, value.max)); + } } } } diff --git a/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java b/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java index ad379eaf1..851e2c995 100644 --- a/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java +++ b/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java @@ -1,6 +1,5 @@ package com.plotsquared.bukkit.object; -import java.util.HashSet; import java.util.UUID; import org.bukkit.Bukkit; @@ -29,8 +28,6 @@ public class BukkitPlayer extends PlotPlayer { private UUID uuid; private String name; private long last = 0; - public HashSet hasPerm = new HashSet<>(); - public HashSet noPerm = new HashSet<>(); public boolean offline; /** diff --git a/target/PlotSquared-Bukkit.jar b/target/PlotSquared-Bukkit.jar index c4711815f..1acf86e83 100644 Binary files a/target/PlotSquared-Bukkit.jar and b/target/PlotSquared-Bukkit.jar differ