From 4d0858ad84ea60056832347b20e833dce39a0e58 Mon Sep 17 00:00:00 2001 From: _OfTeN_ Date: Tue, 7 Dec 2021 14:08:04 +0300 Subject: [PATCH] Added AntigriefManager#canPickupItem and created and implemented DropQueuePushEvent event --- .../com/willfp/eco/core/drops/DropQueue.java | 18 ++- .../eco/core/events/DropQueuePushEvent.java | 117 ++++++++++++++++++ .../antigrief/AntigriefManager.java | 12 ++ .../antigrief/AntigriefWrapper.java | 11 ++ .../antigrief/AntigriefCrashClaim.kt | 4 + .../antigrief/AntigriefDeluxeCombat.kt | 4 + .../antigrief/AntigriefFactionsUUID.kt | 4 + .../antigrief/AntigriefGriefPrevention.kt | 4 + .../antigrief/AntigriefIridiumSkyblock.kt | 5 + .../antigrief/AntigriefKingdoms.kt | 4 + .../integrations/antigrief/AntigriefLands.kt | 5 + .../antigrief/AntigriefSuperiorSkyblock2.kt | 93 ++++++++++---- .../integrations/antigrief/AntigriefTowny.kt | 4 + .../antigrief/AntigriefWorldGuard.kt | 7 ++ 14 files changed, 270 insertions(+), 22 deletions(-) create mode 100644 eco-api/src/main/java/com/willfp/eco/core/events/DropQueuePushEvent.java diff --git a/eco-api/src/main/java/com/willfp/eco/core/drops/DropQueue.java b/eco-api/src/main/java/com/willfp/eco/core/drops/DropQueue.java index 884174ef..125ee888 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/drops/DropQueue.java +++ b/eco-api/src/main/java/com/willfp/eco/core/drops/DropQueue.java @@ -1,6 +1,9 @@ package com.willfp.eco.core.drops; import com.willfp.eco.core.Eco; +import com.willfp.eco.core.events.DropQueuePushEvent; +import com.willfp.eco.core.integrations.antigrief.AntigriefManager; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -18,6 +21,11 @@ import java.util.Collection; * @see com.willfp.eco.util.TelekinesisUtils */ public class DropQueue { + + private Location location; + private boolean forceTelekinesis = false; + private final Player player; + /** * The internally used {@link DropQueue}. */ @@ -28,6 +36,7 @@ public class DropQueue { */ public DropQueue(@NotNull final Player player) { handle = Eco.getHandler().getDropQueueFactory().create(player); + this.player = player; } /** @@ -71,6 +80,7 @@ public class DropQueue { */ public DropQueue setLocation(@NotNull final Location location) { handle.setLocation(location); + this.location = location; return this; } @@ -81,6 +91,7 @@ public class DropQueue { */ public DropQueue forceTelekinesis() { handle.forceTelekinesis(); + this.forceTelekinesis = true; return this; } @@ -88,6 +99,11 @@ public class DropQueue { * Push the queue. */ public void push() { - handle.push(); + if (!AntigriefManager.canPickupItem(this.player, this.location)) return; + DropQueuePushEvent event = new DropQueuePushEvent(this.player, this.handle, this, this.forceTelekinesis); + Bukkit.getServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) { + handle.push(); + } } } diff --git a/eco-api/src/main/java/com/willfp/eco/core/events/DropQueuePushEvent.java b/eco-api/src/main/java/com/willfp/eco/core/events/DropQueuePushEvent.java new file mode 100644 index 00000000..b4e8483d --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/events/DropQueuePushEvent.java @@ -0,0 +1,117 @@ +package com.willfp.eco.core.events; + +import com.willfp.eco.core.drops.DropQueue; +import com.willfp.eco.core.drops.InternalDropQueue; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class DropQueuePushEvent extends PlayerEvent implements Cancellable { + + /** + * Queue handle. + */ + private final InternalDropQueue handle; + + /** + * Queue itself. + */ + private final DropQueue queue; + + /** + * Cancel state. + */ + private boolean cancelled; + + /** + * Force telekinesis state + */ + private final boolean forceTelekinesis; + + /** + * Bukkit parity. + */ + private static final HandlerList HANDLERS = new HandlerList(); + + /** + * Create a new ArmorEquipEvent. + * + * @param player The player. + */ + public DropQueuePushEvent(@NotNull final Player player, @NotNull final InternalDropQueue handle, @NotNull final DropQueue queue, final boolean forceTelekinesis) { + super(player); + this.handle = handle; + this.queue = queue; + this.forceTelekinesis = forceTelekinesis; + } + + /** + * Gets a list of handlers handling this event. + * + * @return A list of handlers handling this event. + */ + @Override + @NotNull + public HandlerList getHandlers() { + return HANDLERS; + } + + /** + * Bukkit parity. + * + * @return The handler list. + */ + public static HandlerList getHandlerList() { + return HANDLERS; + } + + /** + * Get cancel state. + * + * @return The cancel state. + */ + @Override + public boolean isCancelled() { + return this.cancelled; + } + + /** + * Set cancel state. + * + * @param b The state. + */ + @Override + public void setCancelled(boolean b) { + this.cancelled = b; + } + + /** + * Get queue handle. + * + * @return The handle. + */ + public InternalDropQueue getHandle() { + return handle; + } + + /** + * Get queue. + * + * @return The queue. + */ + public DropQueue getQueue() { + return queue; + } + + /** + * Get force telekinesis state. + * + * @return The force telekinesis state. + */ + public boolean isForceTelekinesis() { + return this.forceTelekinesis; + } + +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefManager.java b/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefManager.java index 0b363027..b92c6749 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefManager.java +++ b/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefManager.java @@ -2,6 +2,7 @@ package com.willfp.eco.core.integrations.antigrief; import org.bukkit.Location; import org.bukkit.block.Block; +import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -37,6 +38,17 @@ public final class AntigriefManager { REGISTERED.remove(antigrief); } + /** + * Can player pickup item. + * + * @param player The player. + * @param location The location. + * @return If player can pick up item. + */ + public static boolean canPickupItem(@NotNull final Player player, @NotNull final Location location) { + return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPickupItem(player, location)); + } + /** * Can player break block. * diff --git a/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefWrapper.java b/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefWrapper.java index 7c1278e3..d71a4797 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefWrapper.java +++ b/eco-api/src/main/java/com/willfp/eco/core/integrations/antigrief/AntigriefWrapper.java @@ -5,6 +5,7 @@ import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; /** * Wrapper class for antigrief integrations. @@ -45,4 +46,14 @@ public interface AntigriefWrapper extends Integration { * @return If player can injure. */ boolean canInjure(Player player, LivingEntity victim); + + /** + * Can player pick up item. + * + * @param player The player. + * @param location The location. + * @return If player can pick up item. + */ + boolean canPickupItem(@NotNull final Player player, @NotNull final Location location); + } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefCrashClaim.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefCrashClaim.kt index 3be20b37..7e5f5c1a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefCrashClaim.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefCrashClaim.kt @@ -48,6 +48,10 @@ class AntigriefCrashClaim : AntigriefWrapper { } } + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + override fun getPluginName(): String { return "CrashClaim" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefDeluxeCombat.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefDeluxeCombat.kt index 26f0cd1c..4fbea3bd 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefDeluxeCombat.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefDeluxeCombat.kt @@ -31,4 +31,8 @@ class AntigriefDeluxeCombat: AntigriefWrapper { else -> true } } + + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } } \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefFactionsUUID.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefFactionsUUID.kt index d64037eb..3ddf9187 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefFactionsUUID.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefFactionsUUID.kt @@ -65,6 +65,10 @@ class AntigriefFactionsUUID : AntigriefWrapper { return true } + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + override fun getPluginName(): String { return "FactionsUUID" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefGriefPrevention.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefGriefPrevention.kt index de6eb790..9eced761 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefGriefPrevention.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefGriefPrevention.kt @@ -51,6 +51,10 @@ class AntigriefGriefPrevention : AntigriefWrapper { } } + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + override fun getPluginName(): String { return "GriefPrevention" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefIridiumSkyblock.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefIridiumSkyblock.kt index 36d67007..7a16f20a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefIridiumSkyblock.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefIridiumSkyblock.kt @@ -48,6 +48,11 @@ class AntigriefIridiumSkyblock : AntigriefWrapper { } } + override fun canPickupItem(player: Player, location: Location): Boolean { + val api = IridiumSkyblockAPI.getInstance() ?: return true + return api.getIslandPermission(api.getIslandViaLocation(location).orElse(null) ?: return true, api.getUser(player), PermissionType.PICKUP_ITEMS) + } + override fun getPluginName(): String { return "IridiumSkyblock" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefKingdoms.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefKingdoms.kt index 8c71c150..ba820865 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefKingdoms.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefKingdoms.kt @@ -65,6 +65,10 @@ class AntigriefKingdoms : AntigriefWrapper { } } + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + override fun getPluginName(): String { return "Kingdoms" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefLands.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefLands.kt index 0feede36..49b241f8 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefLands.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefLands.kt @@ -52,6 +52,11 @@ class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper { } } + override fun canPickupItem(player: Player, location: Location): Boolean { + val area = landsIntegration.getAreaByLoc(location) ?: return true + return area.hasFlag(player, Flags.ITEM_PICKUP, false) + } + override fun getPluginName(): String { return "Lands" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefSuperiorSkyblock2.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefSuperiorSkyblock2.kt index 5e26a042..d7514cc7 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefSuperiorSkyblock2.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefSuperiorSkyblock2.kt @@ -2,14 +2,13 @@ package com.willfp.eco.internal.spigot.integrations.antigrief import com.bgsoftware.superiorskyblock.api.SuperiorSkyblockAPI import com.bgsoftware.superiorskyblock.api.enums.HitActionResult +import com.bgsoftware.superiorskyblock.api.island.Island import com.bgsoftware.superiorskyblock.api.island.IslandPrivilege +import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper import org.bukkit.Location import org.bukkit.block.Block -import org.bukkit.entity.Animals -import org.bukkit.entity.LivingEntity -import org.bukkit.entity.Monster -import org.bukkit.entity.Player +import org.bukkit.entity.* class AntigriefSuperiorSkyblock2 : AntigriefWrapper { override fun getPluginName(): String { @@ -17,11 +16,29 @@ class AntigriefSuperiorSkyblock2 : AntigriefWrapper { } override fun canBreakBlock(player: Player, block: Block): Boolean { - if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) { + val island: Island? = + SuperiorSkyblockAPI.getIslandAt(block.location) + val superiorPlayer: SuperiorPlayer = + SuperiorSkyblockAPI.getPlayer(player) + + if (island == null) { + if (!superiorPlayer.hasBypassModeEnabled() && SuperiorSkyblockAPI.getSuperiorSkyblock().grid + .isIslandsWorld(superiorPlayer.world) + ) { + return false + } return true } - return SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("Break")) - || SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("BREAK")) + + if (!island.hasPermission(superiorPlayer, IslandPrivilege.getByName("BREAK"))) { + return false + } + + if (!island.isInsideRange(block.location)) { + return false + } + + return true } override fun canCreateExplosion(player: Player, location: Location): Boolean { @@ -32,26 +49,60 @@ class AntigriefSuperiorSkyblock2 : AntigriefWrapper { } override fun canPlaceBlock(player: Player, block: Block): Boolean { - if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) { + val island: Island? = + SuperiorSkyblockAPI.getIslandAt(block.location) + val superiorPlayer: SuperiorPlayer = + SuperiorSkyblockAPI.getPlayer(player) + + if (island == null) { + if (!superiorPlayer.hasBypassModeEnabled() && SuperiorSkyblockAPI.getSuperiorSkyblock().grid + .isIslandsWorld(superiorPlayer.world) + ) { + return false + } return true } - return SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("Place")) - || SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("PLACE")) + + if (!island.hasPermission(superiorPlayer, IslandPrivilege.getByName("BUILD"))) { + return false + } + + if (!island.isInsideRange(block.location)) { + return false + } + + return true } override fun canInjure(player: Player, victim: LivingEntity): Boolean { - if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) { - return true + + val island: Island? = SuperiorSkyblockAPI.getSuperiorSkyblock().grid.getIslandAt(victim.location) + + if (victim is Player) return SuperiorSkyblockAPI.getPlayer(player).canHit(SuperiorSkyblockAPI.getPlayer(victim)).equals(HitActionResult.SUCCESS) + + val islandPermission = when (victim) { + is Monster -> IslandPrivilege.getByName("MONSTER_DAMAGE") + else -> IslandPrivilege.getByName("ANIMAL_DAMAGE") } - return when (victim) { - is Player -> SuperiorSkyblockAPI.getPlayer(player).canHit(SuperiorSkyblockAPI.getPlayer(victim)).equals(HitActionResult.SUCCESS) - is Animals -> { - return SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("ANIMAL_DAMAGE")) - } - is Monster -> { - return SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("MONSTER_DAMAGE")) - } - else -> true + + if (island != null && !island.hasPermission(player, islandPermission)) { + return false } + + return true + } + + override fun canPickupItem(player: Player, location: Location): Boolean { + val superiorPlayer: SuperiorPlayer = + SuperiorSkyblockAPI.getPlayer(player) + val island: Island? = + SuperiorSkyblockAPI.getSuperiorSkyblock().grid.getIslandAt(location) + if (island != null && + !island.hasPermission(superiorPlayer, IslandPrivilege.getByName("PICKUP_DROPS")) + ) { + return false + } + + return true } } \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefTowny.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefTowny.kt index 0dd4396c..f6c0f61c 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefTowny.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefTowny.kt @@ -69,6 +69,10 @@ class AntigriefTowny : AntigriefWrapper { return townBlock.permissions.pvp } + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + override fun getPluginName(): String { return "Towny" } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefWorldGuard.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefWorldGuard.kt index c307a630..00b496eb 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefWorldGuard.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefWorldGuard.kt @@ -98,6 +98,13 @@ class AntigriefWorldGuard : AntigriefWrapper { } } + override fun canPickupItem(player: Player, location: Location): Boolean { + val localPlayer: LocalPlayer = WorldGuardPlugin.inst().wrapPlayer(player) + val container: RegionContainer = WorldGuard.getInstance().platform.regionContainer + val query: RegionQuery = container.createQuery() + return query.testState(BukkitAdapter.adapt(location), localPlayer, Flags.ITEM_PICKUP) + } + override fun getPluginName(): String { return "WorldGuard" }