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 extends Handler> wrapForRegistration(Handler.Factory extends Handler> 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 extends Handler>> 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 extends Handler> wrapForRegistration(Handler.Factory extends Handler> factory) {
- return factory;
- }
-
@Override
public boolean registerHandler(Handler.Factory extends Handler> factory, @Nullable Handler.Factory extends Handler> after) {
if (factory == null) return false;
WorldGuard.logger.log(Level.INFO, "Registering session handler "
+ factory.getClass().getEnclosingClass().getName());
hasCustom = true;
- Handler.Factory extends Handler> wrappedFactory = wrapForRegistration(factory);
if (after == null) {
- handlers.add(wrappedFactory);
+ handlers.add(factory);
} else {
- Handler.Factory extends Handler> 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;
- }
}