diff --git a/CHANGELOG.md b/CHANGELOG.md index 5608c4fc..a86722c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,19 @@ # Changelog -## 7.0.8 (beta) +## 7.0.8 * Add support for MC 1.19 * Add skulk-growth flag and config option -* Fix possible error when using Paper's entity origin API. +* Add copper-fade flag +* Add data packs to report output +* Add protection for allay inventory slot +* Categorize allay item pickups under item-pickup flag +* Categorize dragon egg interaction (teleporting) as building +* Ignore most NPC-based actions for Player events +* Optimize handling of tamed animals where the owner was offline (Paper only) +* Optimize additional InventoryHolder accesses (Paper only) +* Fix an exception that occurred when plugins created portals with non-player entities +* Fix possible error when using Paper's entity origin API +* Update bstats and squirrelid libs ## 7.0.7 * Add rock-growth flag for budding amethyst and pointed dripstone. diff --git a/config/checkstyle/import-control.xml b/config/checkstyle/import-control.xml index a5053d0b..b00f80c2 100644 --- a/config/checkstyle/import-control.xml +++ b/config/checkstyle/import-control.xml @@ -31,7 +31,6 @@ - diff --git a/worldguard-bukkit/build.gradle.kts b/worldguard-bukkit/build.gradle.kts index 8d7f57c8..e7d66697 100644 --- a/worldguard-bukkit/build.gradle.kts +++ b/worldguard-bukkit/build.gradle.kts @@ -12,10 +12,6 @@ repositories { name = "paper" url = uri("https://repo.papermc.io/repository/maven-public/") } - maven { - name = "aikar-timings" - url = uri("https://repo.aikar.co/nexus/content/groups/aikar/") - } } configurations { @@ -33,7 +29,6 @@ dependencies { "compileOnly"("com.sk89q:commandbook:2.3") { isTransitive = false } "shadeOnly"("io.papermc:paperlib:1.0.8") "shadeOnly"("org.bstats:bstats-bukkit:3.0.1") - "shadeOnly"("co.aikar:minecraft-timings:1.0.4") } tasks.named("processResources") { diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitConfigurationManager.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitConfigurationManager.java index 506ece66..3e898e19 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitConfigurationManager.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitConfigurationManager.java @@ -37,7 +37,6 @@ public class BukkitConfigurationManager extends YamlConfigurationManager { private boolean hasCommandBookGodMode; boolean extraStats; - boolean timedSessionHandlers; /** * Construct the object. @@ -57,7 +56,6 @@ public class BukkitConfigurationManager extends YamlConfigurationManager { public void load() { super.load(); this.extraStats = getConfig().getBoolean("custom-metrics-charts", true); - this.timedSessionHandlers = getConfig().getBoolean("extra-timings.session-handlers", true); } @Override diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java index 0da78f7d..aeee1a44 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldGuardPlatform.java @@ -139,7 +139,6 @@ public class BukkitWorldGuardPlatform implements WorldGuardPlatform { sessionManager = new BukkitSessionManager(); configuration = new BukkitConfigurationManager(WorldGuardPlugin.inst()); configuration.load(); - sessionManager.setUsingTimings(configuration.timedSessionHandlers); regionContainer = new BukkitRegionContainer(WorldGuardPlugin.inst()); regionContainer.initialize(); debugHandler = new BukkitDebugHandler(WorldGuardPlugin.inst()); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java index 0c6003c3..f3847b33 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java @@ -27,7 +27,9 @@ import com.sk89q.worldguard.bukkit.internal.WGMetadata; import com.sk89q.worldguard.bukkit.util.Entities; import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; +import org.bukkit.entity.AnimalTamer; import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; @@ -107,6 +109,12 @@ public final class Cause { return false; } + if (object instanceof Tameable tameable && tameable.isTamed()) { + // if they're tamed but also the root cause, the owner is offline + // otherwise the owner will be the root cause (and known) + return false; + } + if (object instanceof TNTPrimed || object instanceof Vehicle) { if (!PaperLib.isPaper()) { return false; @@ -300,9 +308,24 @@ public final class Cause { } else if (o instanceof AreaEffectCloud) { indirect = true; addAll(((AreaEffectCloud) o).getSource()); - } else if (o instanceof Tameable) { + } else if (o instanceof Tameable tameable) { indirect = true; - addAll(((Tameable) o).getOwner()); + if (PaperLib.isPaper()) { + UUID ownerId = tameable.getOwnerUniqueId(); + if (ownerId != null) { + Player owner = Bukkit.getPlayer(ownerId); + if (owner != null) { + addAll(owner); + } + } + } else { + // this will cause offline player loads if the player is offline + // too bad for spigot users + AnimalTamer owner = tameable.getOwner(); + if (owner instanceof OfflinePlayer player) { + addAll(player.getPlayer()); // player object if online, else null + } + } } else if (o instanceof Creature && ((Creature) o).getTarget() != null) { indirect = true; addAll(((Creature) o).getTarget()); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java index 7d96bbef..2882ca25 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java @@ -113,6 +113,7 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityInteractEvent; +import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityTameEvent; import org.bukkit.event.entity.EntityUnleashEvent; import org.bukkit.event.entity.ExpBottleEvent; @@ -919,6 +920,12 @@ public class EventAbstractionListener extends AbstractListener { pickupDebounce.debounce(event.getPlayer(), item, event, new DestroyEntityEvent(event, create(event.getPlayer()), event.getItem())); } + @EventHandler(ignoreCancelled = true) + public void onEntityPickupItem(EntityPickupItemEvent event) { + Item item = event.getItem(); + pickupDebounce.debounce(event.getEntity(), item, event, new DestroyEntityEvent(event, create(event.getEntity()), event.getItem())); + } + @EventHandler(ignoreCancelled = true) public void onPlayerDropItem(PlayerDropItemEvent event) { Events.fireToCancel(event, new SpawnEntityEvent(event, create(event.getPlayer()), event.getItemDrop())); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java index 925ecaa1..0db9cf82 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/PlayerMoveListener.java @@ -28,8 +28,8 @@ import com.sk89q.worldguard.session.Session; import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Entity; -import org.bukkit.entity.Horse; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -99,7 +99,7 @@ public class PlayerMoveListener extends AbstractListener { moveType = MoveType.GLIDE; } else if (event.getPlayer().isSwimming()) { moveType = MoveType.SWIM; - } else if (event.getPlayer().getVehicle() != null && event.getPlayer().getVehicle() instanceof Horse) { + } else if (event.getPlayer().getVehicle() != null && event.getPlayer().getVehicle() instanceof AbstractHorse) { moveType = MoveType.RIDE; } com.sk89q.worldedit.util.Location weLocation = session.testMoveTo(localPlayer, BukkitAdapter.adapt(to), moveType); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java index ea59fb5d..67e2c8b8 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java @@ -25,13 +25,17 @@ import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.BukkitWorldConfiguration; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.bukkit.cause.Cause; import com.sk89q.worldguard.bukkit.util.Entities; +import com.sk89q.worldguard.bukkit.util.InteropUtils; import com.sk89q.worldguard.config.ConfigurationManager; import com.sk89q.worldguard.config.WorldConfiguration; import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.FailedLoadRegionSet; import com.sk89q.worldguard.protection.association.RegionAssociable; import com.sk89q.worldguard.protection.flags.Flags; import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.flags.StateFlag.State; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; import com.sk89q.worldguard.protection.regions.RegionQuery; @@ -653,35 +657,46 @@ public class WorldGuardEntityListener extends AbstractListener { public void onCreatePortal(PortalCreateEvent event) { WorldConfiguration wcfg = getWorldConfig(event.getWorld()); - if (wcfg.regionNetherPortalProtection + if (wcfg.useRegions && wcfg.regionNetherPortalProtection && event.getReason() == PortalCreateEvent.CreateReason.NETHER_PAIR && !event.getBlocks().isEmpty()) { final com.sk89q.worldedit.world.World world = BukkitAdapter.adapt(event.getWorld()); - final RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer() - .get(world); - if (regionManager == null) return; - LocalPlayer associable = null; - if (event.getEntity() instanceof Player player) { - associable = getPlugin().wrapPlayer(player); - if (WorldGuard.getInstance().getPlatform().getSessionManager().hasBypass(associable, world)) { + final Cause cause = Cause.create(event.getEntity()); + LocalPlayer localPlayer = null; + if (cause.getRootCause() instanceof Player player) { + if (wcfg.fakePlayerBuildOverride && InteropUtils.isFakePlayer(player)) { + return; + } + localPlayer = getPlugin().wrapPlayer(player); + if (WorldGuard.getInstance().getPlatform().getSessionManager().hasBypass(localPlayer, world)) { return; } } - BlockVector3 min = null; - BlockVector3 max = null; - for (BlockState block : event.getBlocks()) { - BlockVector3 loc = BlockVector3.at(block.getX(), block.getY(), block.getZ()); - min = min == null ? loc : loc.getMinimum(min); - max = max == null ? loc : loc.getMaximum(max); + final RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer() + .get(world); + ApplicableRegionSet regions; + if (regionManager == null) { + regions = FailedLoadRegionSet.getInstance(); + } else { + BlockVector3 min = null; + BlockVector3 max = null; + for (BlockState block : event.getBlocks()) { + BlockVector3 loc = BlockVector3.at(block.getX(), block.getY(), block.getZ()); + min = min == null ? loc : loc.getMinimum(min); + max = max == null ? loc : loc.getMaximum(max); + } + ProtectedCuboidRegion target = new ProtectedCuboidRegion("__portal_check", true, min, max); + regions = regionManager.getApplicableRegions(target); } - ProtectedCuboidRegion target = new ProtectedCuboidRegion("__portal_check", true, min, max); - final ApplicableRegionSet regions = regionManager.getApplicableRegions(target); - if (!regions.testState(associable, Flags.BUILD, Flags.BLOCK_PLACE)) { - if (associable != null) { + final RegionAssociable associable = createRegionAssociable(cause); + final State buildState = StateFlag.denyToNone(regions.queryState(associable, Flags.BUILD)); + if (!StateFlag.test(buildState, regions.queryState(associable, Flags.BLOCK_BREAK)) + || !StateFlag.test(buildState, regions.queryState(associable, Flags.BLOCK_PLACE))) { + if (localPlayer != null && !cause.isIndirect()) { // NB there is no way to cancel the teleport without PTA (since PlayerPortal doesn't have block info) // removing PTA was a mistake - String message = regions.queryValue(associable, Flags.DENY_MESSAGE); - RegionProtectionListener.formatAndSendDenyMessage("create portals", associable, message); + String message = regions.queryValue(localPlayer, Flags.DENY_MESSAGE); + RegionProtectionListener.formatAndSendDenyMessage("create portals", localPlayer, message); } event.setCancelled(true); } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardPlayerListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardPlayerListener.java index f2538062..6685f617 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardPlayerListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardPlayerListener.java @@ -258,13 +258,11 @@ public class WorldGuardPlayerListener extends AbstractListener { } if (wcfg.useRegions) { - //Block placedIn = block.getRelative(event.getBlockFace()); - ApplicableRegionSet set = - WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().getApplicableRegions(BukkitAdapter.adapt(block.getLocation())); - //ApplicableRegionSet placedInSet = plugin.getRegionContainer().createQuery().getApplicableRegions(placedIn.getLocation()); LocalPlayer localPlayer = getPlugin().wrapPlayer(player); if (item != null && item.getType().getKey().toString().equals(wcfg.regionWand) && getPlugin().hasPermission(player, "worldguard.region.wand")) { + ApplicableRegionSet set = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery() + .getApplicableRegions(BukkitAdapter.adapt(block.getLocation()), RegionQuery.QueryOption.SORT); if (set.size() > 0) { player.sendMessage(ChatColor.YELLOW + "Can you build? " + (set.testState(localPlayer, Flags.BUILD) ? "Yes" : "No")); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java index e01d5a35..df589cbc 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java @@ -28,7 +28,6 @@ import com.sk89q.worldguard.bukkit.event.player.ProcessPlayerEvent; import com.sk89q.worldguard.bukkit.util.Entities; import com.sk89q.worldguard.session.AbstractSessionManager; import com.sk89q.worldguard.session.Session; -import com.sk89q.worldguard.session.handler.Handler; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -42,13 +41,6 @@ import java.util.Collection; */ public class BukkitSessionManager extends AbstractSessionManager implements Runnable, Listener { - private boolean useTimings; - - @Override - protected Handler.Factory wrapForRegistration(Handler.Factory factory) { - return useTimings ? new TimedHandlerFactory(factory) : factory; - } - /** * Re-initialize handlers and clear "last position," "last state," etc. * information for all players. @@ -94,14 +86,6 @@ public class BukkitSessionManager extends AbstractSessionManager implements Runn return super.hasBypass(player, world); } - public boolean isUsingTimings() { - return useTimings; - } - - public void setUsingTimings(boolean useTimings) { - this.useTimings = useTimings; - } - public void shutdown() { for (Player player : Bukkit.getServer().getOnlinePlayers()) { LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/TimedHandlerFactory.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/TimedHandlerFactory.java deleted file mode 100644 index 4db5118c..00000000 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/TimedHandlerFactory.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * WorldGuard, a suite of tools for Minecraft - * Copyright (C) sk89q - * Copyright (C) WorldGuard team and contributors - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldguard.bukkit.session; - -import co.aikar.timings.lib.MCTiming; -import co.aikar.timings.lib.TimingManager; -import com.sk89q.worldedit.util.Location; -import com.sk89q.worldguard.LocalPlayer; -import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.protection.ApplicableRegionSet; -import com.sk89q.worldguard.protection.flags.StateFlag; -import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import com.sk89q.worldguard.session.MoveType; -import com.sk89q.worldguard.session.Session; -import com.sk89q.worldguard.session.handler.Handler; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - - -import javax.annotation.Nullable; -import java.security.CodeSource; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -class TimedHandlerFactory extends Handler.Factory { - - private static final TimingManager TIMINGS = TimingManager.of(WorldGuardPlugin.inst()); - private static final MCTiming UNKNOWN_SOURCE = TIMINGS.of("Third-Party Session Handlers"); - private static final Map PLUGIN_SOURCES = new HashMap<>(); - - private final Handler.Factory factory; - private final MCTiming timing; - - TimedHandlerFactory(Handler.Factory factory) { - this.factory = factory; - this.timing = makeTiming(); - } - - private MCTiming makeTiming() { - CodeSource codeSource = factory.getClass().getProtectionDomain().getCodeSource(); - TimingManager owner = PLUGIN_SOURCES.computeIfAbsent(codeSource, source -> { - for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) { - CodeSource pluginSource = plugin.getClass().getProtectionDomain().getCodeSource(); - if (Objects.equals(pluginSource, source)) { - return TimingManager.of(plugin); - } - } - return null; - }); - String handlerName = factory.getClass().getEnclosingClass().getSimpleName(); - return owner == null - ? TIMINGS.of(handlerName, UNKNOWN_SOURCE) - : owner.of(handlerName, owner.of("Session Handlers")); - } - - @Override - public Handler create(Session session) { - return new TimedHandler(factory.create(session), session, timing); - } - - static class TimedHandler extends Handler { - private final Handler handler; - private final MCTiming timing; - - TimedHandler(Handler innerHandler, Session session, MCTiming timing) { - super(session); - this.handler = innerHandler; - this.timing = timing; - } - - @Override - public void initialize(LocalPlayer player, Location current, ApplicableRegionSet set) { - try (MCTiming ignored = timing.startTiming()) { - handler.initialize(player, current, set); - } - } - - @Override - public boolean testMoveTo(LocalPlayer player, Location from, Location to, ApplicableRegionSet toSet, MoveType moveType) { - try (MCTiming ignored = timing.startTiming()) { - return handler.testMoveTo(player, from, to, toSet, moveType); - } - } - - @Override - public boolean onCrossBoundary(LocalPlayer player, Location from, Location to, ApplicableRegionSet toSet, Set entered, Set exited, MoveType moveType) { - try (MCTiming ignored = timing.startTiming()) { - return handler.onCrossBoundary(player, from, to, toSet, entered, exited, moveType); - } - } - - @Override - public void tick(LocalPlayer player, ApplicableRegionSet set) { - try (MCTiming ignored = timing.startTiming()) { - handler.tick(player, set); - } - } - - @Nullable - @Override - public StateFlag.State getInvincibility(LocalPlayer player) { - try (MCTiming ignored = timing.startTiming()) { - return handler.getInvincibility(player); - } - } - - @Override - public Handler getWrappedHandler() { - return handler; - } - } - -} diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Entities.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Entities.java index 3ebf1a62..a477d52a 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Entities.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Entities.java @@ -19,6 +19,7 @@ package com.sk89q.worldguard.bukkit.util; +import org.bukkit.entity.Allay; import org.bukkit.entity.Ambient; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Arrow; @@ -218,6 +219,7 @@ public final class Entities { return entity instanceof Hanging || entity instanceof ArmorStand || entity instanceof EnderCrystal + || entity instanceof Allay || entity instanceof Minecart && entity instanceof InventoryHolder; } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java index 90c30f79..ab4fe660 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java @@ -1317,6 +1317,7 @@ public final class Materials { return type == Material.REPEATER || type == Material.COMPARATOR || type == Material.CAKE + || type == Material.DRAGON_EGG || Tag.FLOWER_POTS.isTagged(type) || Tag.CANDLES.isTagged(type) || Tag.CANDLE_CAKES.isTagged(type); diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java b/worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java index 19618d5d..68bfac19 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java @@ -44,10 +44,8 @@ import com.sk89q.worldguard.session.handler.WeatherLockFlag; import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.Arrays; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.function.BiPredicate; @@ -75,8 +73,6 @@ public abstract class AbstractSessionManager implements SessionManager { createSession(key.playerRef.get()))); private boolean hasCustom = false; - // - private Map, Handler.Factory> wrappedHandlers = new HashMap<>(); private List> handlers = new LinkedList<>(); private static final List> defaultHandlers = new LinkedList<>(); @@ -110,27 +106,20 @@ public abstract class AbstractSessionManager implements SessionManager { return hasCustom; } - protected Handler.Factory wrapForRegistration(Handler.Factory factory) { - return factory; - } - @Override public boolean registerHandler(Handler.Factory factory, @Nullable Handler.Factory after) { if (factory == null) return false; WorldGuard.logger.log(Level.INFO, "Registering session handler " + factory.getClass().getEnclosingClass().getName()); hasCustom = true; - Handler.Factory wrappedFactory = wrapForRegistration(factory); if (after == null) { - handlers.add(wrappedFactory); + handlers.add(factory); } else { - Handler.Factory wrappedAfter = wrappedHandlers.get(after); - int index = handlers.indexOf(wrappedAfter != null ? wrappedAfter : after); + int index = handlers.indexOf(after); if (index == -1) return false; handlers.add(index + 1, factory); // shifts "after" right one, and everything after "after" right one } - wrappedHandlers.put(factory, wrappedFactory); return true; } @@ -142,7 +131,6 @@ public abstract class AbstractSessionManager implements SessionManager { } else { WorldGuard.logger.log(Level.INFO, "Unregistering session handler " + factory.getClass().getEnclosingClass().getName()); - factory = wrappedHandlers.remove(factory); } return handlers.remove(factory); } diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java b/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java index f1f3166b..cdc8401a 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java @@ -34,10 +34,10 @@ import com.sk89q.worldguard.protection.regions.RegionQuery; import com.sk89q.worldguard.session.handler.Handler; import com.sk89q.worldguard.util.Locations; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; @@ -69,7 +69,7 @@ public class Session { * @param handler A new handler */ public void register(Handler handler) { - handlers.put(handler.getWrappedHandler().getClass(), handler); + handlers.put(handler.getClass(), handler); } /** @@ -91,7 +91,7 @@ public class Session { @Nullable @SuppressWarnings("unchecked") public T getHandler(Class type) { - return (T) handlers.get(type).getWrappedHandler(); + return (T) handlers.get(type); } /** diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/session/handler/Handler.java b/worldguard-core/src/main/java/com/sk89q/worldguard/session/handler/Handler.java index 92962de2..de9ec544 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/session/handler/Handler.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/session/handler/Handler.java @@ -148,11 +148,4 @@ public abstract class Handler { return null; } - /** - * Get the handler wrapped by this handler object, if applicable, or just return this if no handler is wrapped. - * @return any wrapped handler, or this handler itself - */ - public Handler getWrappedHandler() { - return this; - } }