diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java index e893d9122..115b01944 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java @@ -4,7 +4,6 @@ import com.github.intellectualsites.plotsquared.bukkit.generator.BukkitPlotGener import com.github.intellectualsites.plotsquared.bukkit.listeners.ChunkListener; import com.github.intellectualsites.plotsquared.bukkit.listeners.EntitySpawnListener; import com.github.intellectualsites.plotsquared.bukkit.listeners.PlayerEvents; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlotPlusListener; import com.github.intellectualsites.plotsquared.bukkit.listeners.SingleWorldListener; import com.github.intellectualsites.plotsquared.bukkit.listeners.WorldEvents; import com.github.intellectualsites.plotsquared.bukkit.placeholders.PlaceholderFormatter; @@ -13,7 +12,6 @@ import com.github.intellectualsites.plotsquared.bukkit.util.BukkitChatManager; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitChunkManager; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitCommand; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEconHandler; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEventUtil; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitHybridUtils; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitInventoryUtil; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitSchematicHandler; @@ -588,11 +586,6 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain getServer().getPluginManager().registerEvents(new EntitySpawnListener(), this); } - @Override public void registerPlotPlusEvents() { - PlotPlusListener.startRunnable(this); - getServer().getPluginManager().registerEvents(new PlotPlusListener(), this); - } - @Override public void registerForceFieldEvents() { } @@ -672,10 +665,6 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain return new BukkitChunkManager(); } - @Override public EventUtil initEventUtil() { - return new BukkitEventUtil(); - } - @Override public void unregister(@NonNull final PlotPlayer player) { BukkitUtil.removePlayer(player.getName()); } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerClaimPlotEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerClaimPlotEvent.java deleted file mode 100644 index 269b64296..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerClaimPlotEvent.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; - -public class PlayerClaimPlotEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private final Plot plot; - private final boolean auto; - private boolean cancelled; - - /** - * PlayerClaimPlotEvent: Called when a plot is claimed. - * - * @param player Player that claimed the plot - * @param plot Plot that was claimed - */ - public PlayerClaimPlotEvent(Player player, Plot plot, boolean auto) { - super(player); - this.plot = plot; - this.auto = auto; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - /** - * Get the plot involved - * - * @return Plot - */ - public Plot getPlot() { - return this.plot; - } - - /** - * @return true if it was an automated claim, else false - */ - public boolean wasAuto() { - return this.auto; - } - - @Override public HandlerList getHandlers() { - return handlers; - } - - @Override public boolean isCancelled() { - return this.cancelled; - } - - @Override public void setCancelled(boolean b) { - this.cancelled = b; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerEnterPlotEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerEnterPlotEvent.java deleted file mode 100644 index a40365b40..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerEnterPlotEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; - -public class PlayerEnterPlotEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - private final Plot plot; - - /** - * Called when a player leaves a plot. - * - * @param player Player that entered the plot - * @param plot Plot that was entered - */ - public PlayerEnterPlotEvent(Player player, Plot plot) { - super(player); - this.plot = plot; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - /** - * Get the plot involved. - * - * @return Plot - */ - public Plot getPlot() { - return this.plot; - } - - @Override public HandlerList getHandlers() { - return handlers; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerLeavePlotEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerLeavePlotEvent.java deleted file mode 100644 index 36482d44c..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerLeavePlotEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; - -/** - * - */ -public class PlayerLeavePlotEvent extends PlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - private final Plot plot; - - /** - * PlayerLeavePlotEvent: Called when a player leaves a plot - * - * @param player Player that left the plot - * @param plot Plot that was left - */ - public PlayerLeavePlotEvent(Player player, Plot plot) { - super(player); - this.plot = plot; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - /** - * Get the plot involved - * - * @return Plot - */ - public Plot getPlot() { - return this.plot; - } - - @Override public HandlerList getHandlers() { - return handlers; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerTeleportToPlotEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerTeleportToPlotEvent.java deleted file mode 100644 index 79d43391e..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerTeleportToPlotEvent.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; - -/** - * Called when a player teleports to a plot - */ -public class PlayerTeleportToPlotEvent extends PlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private final Location from; - private final Plot plot; - private boolean cancelled; - - /** - * PlayerTeleportToPlotEvent: Called when a player teleports to a plot - * - * @param player That was teleported - * @param from Start location - * @param plot Plot to which the player was teleported - */ - public PlayerTeleportToPlotEvent(Player player, Location from, Plot plot) { - super(player); - this.from = from; - this.plot = plot; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override public HandlerList getHandlers() { - return handlers; - } - - /** - * Get the from location - * - * @return Location - */ - public Location getFrom() { - return this.from; - } - - /** - * Get the plot involved - * - * @return Plot - */ - public Plot getPlot() { - return this.plot; - } - - @Override public boolean isCancelled() { - return this.cancelled; - } - - @Override public void setCancelled(boolean cancelled) { - this.cancelled = cancelled; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotComponentSetEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotComponentSetEvent.java deleted file mode 100644 index 6911ccdd4..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotComponentSetEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import org.bukkit.event.HandlerList; - -/** - * Called when a plot component is set - */ -public class PlotComponentSetEvent extends PlotEvent { - - private static final HandlerList handlers = new HandlerList(); - private final String component; - - public PlotComponentSetEvent(Plot plot, String component) { - super(plot); - this.component = component; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - /** - * Get the PlotId - * - * @return PlotId - */ - public PlotId getPlotId() { - return getPlot().getId(); - } - - /** - * Get the world name - * - * @return String - */ - public String getWorld() { - return getPlot().getWorldName(); - } - - /** - * Get the component which was set - * - * @return Component name - */ - public String getComponent() { - return this.component; - } - - @Override public HandlerList getHandlers() { - return handlers; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotEvent.java deleted file mode 100644 index ae4b0c1d7..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.event.Event; - -public abstract class PlotEvent extends Event { - - private final Plot plot; - - public PlotEvent(Plot plot) { - this.plot = plot; - } - - public final Plot getPlot() { - return this.plot; - } - -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagAddEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagAddEvent.java deleted file mode 100644 index 6f28f707c..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagAddEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -/** - * Called when a Flag is added to a plot. - */ -public class PlotFlagAddEvent extends PlotFlagEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private boolean cancelled; - - /** - * PlotFlagAddEvent: Called when a Flag is added to a plot. - * - * @param flag Flag that was added - * @param plot Plot to which the flag was added - */ - public PlotFlagAddEvent(PlotFlag flag, Plot plot) { - super(plot, flag); - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override public HandlerList getHandlers() { - return handlers; - } - - @Override public final boolean isCancelled() { - return this.cancelled; - } - - @Override public final void setCancelled(boolean cancelled) { - this.cancelled = cancelled; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagRemoveEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagRemoveEvent.java deleted file mode 100644 index d0d5724d4..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagRemoveEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -/** - * Called when a flag is removed from a plot - */ -public class PlotFlagRemoveEvent extends PlotFlagEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private boolean cancelled; - - /** - * PlotFlagRemoveEvent: Called when a flag is removed from a plot - * - * @param flag Flag that was removed - * @param plot Plot from which the flag was removed - */ - public PlotFlagRemoveEvent(PlotFlag flag, Plot plot) { - super(plot, flag); - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override public HandlerList getHandlers() { - return handlers; - } - - @Override public final boolean isCancelled() { - return this.cancelled; - } - - @Override public final void setCancelled(boolean cancelled) { - this.cancelled = cancelled; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotMergeEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotMergeEvent.java deleted file mode 100644 index 55488011e..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotMergeEvent.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.World; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -/** - * Event called when several plots are merged - * {@inheritDoc} - */ -public final class PlotMergeEvent extends PlotEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - @Getter private final int dir; - @Getter private final int max; - @Getter private final World world; - @Getter @Setter private boolean cancelled; - - /** - * PlotMergeEvent: Called when plots are merged - * - * @param world World in which the event occurred - * @param plot Plot that was merged - * @param dir The direction of the merge - * @param max Max merge size - */ - public PlotMergeEvent(@NotNull final World world, @NotNull final Plot plot, - @NotNull final int dir, @NotNull final int max) { - super(plot); - this.world = world; - this.dir = dir; - this.max = max; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override public HandlerList getHandlers() { - return handlers; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotRateEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotRateEvent.java deleted file mode 100644 index b6ca46593..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotRateEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.Rating; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public class PlotRateEvent extends PlotEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private final PlotPlayer rater; - private Rating rating; - private boolean cancelled = false; - - public PlotRateEvent(PlotPlayer rater, Rating rating, Plot plot) { - super(plot); - this.rater = rater; - this.rating = rating; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - public PlotPlayer getRater() { - return this.rater; - } - - public Rating getRating() { - return this.rating; - } - - public void setRating(Rating rating) { - this.rating = rating; - } - - @Override public HandlerList getHandlers() { - return handlers; - } - - @Override public boolean isCancelled() { - return this.cancelled; - } - - @Override public void setCancelled(boolean cancelled) { - this.cancelled = cancelled; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotUnlinkEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotUnlinkEvent.java deleted file mode 100644 index 5db7d04d4..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotUnlinkEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; - -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.World; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -/** - * Event called when several merged plots are unlinked - * {@inheritDoc} - */ -public final class PlotUnlinkEvent extends Event implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private final List plots; - @Getter private final World world; - @Getter private final PlotArea area; - @Getter @Setter private boolean cancelled; - - /** - * Called when a mega-plot is unlinked. - * - * @param world World in which the event occurred - * @param plots Plots that are involved in the event - */ - public PlotUnlinkEvent(@NotNull final World world, @NotNull final PlotArea area, - @NotNull final List plots) { - this.plots = plots; - this.world = world; - this.area = area; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - /** - * Get the plots involved. - * - * @return Unmodifiable list containing {@link PlotId PlotIds} of the plots involved - */ - public List getPlots() { - return Collections.unmodifiableList(this.plots); - } - - @Override public HandlerList getHandlers() { - return handlers; - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlayerEvents.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlayerEvents.java index 3f4867aef..93738cda0 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlayerEvents.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlayerEvents.java @@ -8,51 +8,7 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.AnimalAttackFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.AnimalCapFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.AnimalInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.BlockBurnFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.BlockIgnitionFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.BlockedCmdsFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.BreakFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.DenyTeleportFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.DisablePhysicsFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.EntityCapFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.ExplosionFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.GrassGrowFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.HangingBreakFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.HangingPlaceFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.HostileAttackFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.HostileCapFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.HostileInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.IceFormFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.IceMeltFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.KelpGrowFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.LiquidFlowFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MiscBreakFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MiscCapFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MiscInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MobCapFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MobPlaceFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MycelGrowFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.PlaceFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.PlayerInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.PveFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.PvpFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.RedstoneFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.SnowFormFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.SnowMeltFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.SoilDryFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.TamedAttackFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.TamedInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.UntrustedVisitFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.UseFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.VehicleBreakFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.VehicleCapFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.VehicleUseFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.VillagerInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.VineGrowFlag; +import com.github.intellectualsites.plotsquared.plot.flags.implementations.*; import com.github.intellectualsites.plotsquared.plot.flags.types.BlockTypeWrapper; import com.github.intellectualsites.plotsquared.plot.listener.PlayerBlockEventType; import com.github.intellectualsites.plotsquared.plot.listener.PlotListener; @@ -66,7 +22,6 @@ import com.github.intellectualsites.plotsquared.plot.object.PlotMessage; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.StringWrapper; import com.github.intellectualsites.plotsquared.plot.util.EntityUtil; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.Permissions; @@ -76,11 +31,7 @@ import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.world.block.BlockType; import io.papermc.lib.PaperLib; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.FluidCollisionMode; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; @@ -130,36 +81,12 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.block.BlockSpreadEvent; import org.bukkit.event.block.EntityBlockFormEvent; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.entity.LingeringPotionSplashEvent; -import org.bukkit.event.entity.PotionSplashEvent; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.entity.*; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.event.player.PlayerBucketFillEvent; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerEggThrowEvent; -import org.bukkit.event.player.PlayerEvent; -import org.bukkit.event.player.PlayerInteractAtEntityEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.*; import org.bukkit.event.vehicle.VehicleCreateEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; @@ -196,7 +123,8 @@ import java.util.regex.Pattern; /** * Player Events involving plots. */ -@SuppressWarnings("unused") public class PlayerEvents extends PlotListener implements Listener { +@SuppressWarnings("unused") +public class PlayerEvents extends PlotListener implements Listener { private boolean pistonBlocks = true; private float lastRadius; @@ -237,8 +165,8 @@ import java.util.regex.Pattern; } public static boolean checkEntity(Entity entity, Plot plot) { - if (plot == null || !plot.hasOwner() || plot.getFlags().isEmpty() && plot - .getArea().getFlagContainer().getFlagMap().isEmpty()) { + if (plot == null || !plot.hasOwner() || plot.getFlags().isEmpty() && plot.getArea() + .getFlagContainer().getFlagMap().isEmpty()) { return false; } switch (entity.getType()) { @@ -277,8 +205,7 @@ import java.util.regex.Pattern; case ARMOR_STAND: case ITEM_FRAME: case PAINTING: - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, MiscCapFlag.MISC_CAP_UNLIMITED); // misc case BOAT: @@ -289,8 +216,7 @@ import java.util.regex.Pattern; case MINECART_HOPPER: case MINECART_MOB_SPAWNER: case MINECART_TNT: - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, VehicleCapFlag.VEHICLE_CAP_UNLIMITED); case BAT: case CHICKEN: @@ -324,10 +250,8 @@ import java.util.regex.Pattern; case WOLF: case ZOMBIE_HORSE: // animal - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, - MobCapFlag.MOB_CAP_UNLIMITED, - AnimalCapFlag.ANIMAL_CAP_UNLIMITED); + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, + MobCapFlag.MOB_CAP_UNLIMITED, AnimalCapFlag.ANIMAL_CAP_UNLIMITED); case BLAZE: case CAVE_SPIDER: case CREEPER: @@ -361,37 +285,27 @@ import java.util.regex.Pattern; case PHANTOM: case RAVAGER: // monster - return EntityUtil - .checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, - MobCapFlag.MOB_CAP_UNLIMITED, - HostileCapFlag.HOSTILE_CAP_UNLIMITED); + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, + MobCapFlag.MOB_CAP_UNLIMITED, HostileCapFlag.HOSTILE_CAP_UNLIMITED); default: if (entity instanceof LivingEntity) { if (entity instanceof Animals || entity instanceof WaterMob) { - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, - MobCapFlag.MOB_CAP_UNLIMITED, - AnimalCapFlag.ANIMAL_CAP_UNLIMITED); + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, + MobCapFlag.MOB_CAP_UNLIMITED, AnimalCapFlag.ANIMAL_CAP_UNLIMITED); } else if (entity instanceof Monster) { - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, - MobCapFlag.MOB_CAP_UNLIMITED, - HostileCapFlag.HOSTILE_CAP_UNLIMITED); + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, + MobCapFlag.MOB_CAP_UNLIMITED, HostileCapFlag.HOSTILE_CAP_UNLIMITED); } else { - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, MobCapFlag.MOB_CAP_UNLIMITED); } } if (entity instanceof Vehicle) { - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, VehicleCapFlag.VEHICLE_CAP_UNLIMITED); } if (entity instanceof Hanging) { - return EntityUtil.checkEntity(plot, - EntityCapFlag.ENTITY_CAP_UNLIMITED, + return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED, MiscCapFlag.MISC_CAP_UNLIMITED); } return EntityUtil.checkEntity(plot, EntityCapFlag.ENTITY_CAP_UNLIMITED); @@ -793,26 +707,38 @@ import java.util.regex.Pattern; if (!player.hasPlayedBefore() && player.isOnline()) { player.saveData(); } - EventUtil.manager.doJoinTask(pp); + PlotSquared.get().getEventDispatcher().doJoinTask(pp); }, 20); if (pp.hasPermission(Captions.PERMISSION_ADMIN_UPDATE_NOTIFICATION.getTranslated()) - && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { + && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { try { - HttpsURLConnection connection = (HttpsURLConnection) new URL("https://api.spigotmc.org/legacy/update.php?resource=1177").openConnection(); + HttpsURLConnection connection = (HttpsURLConnection) new URL( + "https://api.spigotmc.org/legacy/update.php?resource=1177").openConnection(); connection.setRequestMethod("GET"); - spigotVersion = (new BufferedReader(new InputStreamReader(connection.getInputStream()))).readLine(); + spigotVersion = + (new BufferedReader(new InputStreamReader(connection.getInputStream()))) + .readLine(); } catch (IOException e) { - new PlotMessage(Captions.PREFIX + "Unable to check for updates, check console for further information.").color("$13"); + new PlotMessage(Captions.PREFIX + + "Unable to check for updates, check console for further information.") + .color("$13"); PlotSquared.log(Captions.PREFIX + "&cUnable to check for updates because: " + e); return; } if (!UpdateUtility.internalVersion.equals(UpdateUtility.spigotVersion)) { new PlotMessage("-----------------------------------").send(pp); - new PlotMessage(Captions.PREFIX + "There appears to be a PlotSquared update available!").color("$1").tooltip("https://www.spigotmc.org/resources/1177/updates").send(pp); - new PlotMessage(Captions.PREFIX + "The latest version is " + spigotVersion).color("$1").tooltip("https://www.spigotmc.org/resources/1177/updates").send(pp); - new PlotMessage(Captions.PREFIX + "https://www.spigotmc.org/resources/1177/updates").color("$1").tooltip("https://www.spigotmc.org/resources/1177/updates").send(pp); + new PlotMessage( + Captions.PREFIX + "There appears to be a PlotSquared update available!") + .color("$1").tooltip("https://www.spigotmc.org/resources/1177/updates") + .send(pp); + new PlotMessage(Captions.PREFIX + "The latest version is " + spigotVersion) + .color("$1").tooltip("https://www.spigotmc.org/resources/1177/updates") + .send(pp); + new PlotMessage(Captions.PREFIX + "https://www.spigotmc.org/resources/1177/updates") + .color("$1").tooltip("https://www.spigotmc.org/resources/1177/updates") + .send(pp); new PlotMessage("-----------------------------------").send(pp); } } @@ -822,7 +748,7 @@ import java.util.regex.Pattern; public void playerRespawn(PlayerRespawnEvent event) { Player player = event.getPlayer(); PlotPlayer pp = BukkitUtil.getPlayer(player); - EventUtil.manager.doRespawnTask(pp); + PlotSquared.get().getEventDispatcher().doRespawnTask(pp); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -850,7 +776,8 @@ import java.util.regex.Pattern; // to is identical to the plot's home location, and untrusted-visit is true // i.e. untrusted-visit can override deny-teleport // this is acceptable, because otherwise it wouldn't make sense to have both flags set - if (!result && !(plot.getFlag(UntrustedVisitFlag.class) && plot.getHome().equals(BukkitUtil.getLocationFull(to)))) { + if (!result && !(plot.getFlag(UntrustedVisitFlag.class) && plot.getHome() + .equals(BukkitUtil.getLocationFull(to)))) { MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_ENTRY_DENIED); event.setCancelled(true); @@ -1109,8 +1036,8 @@ import java.util.regex.Pattern; } if (!spies.isEmpty()) { String spyMessage = Captions.PLOT_CHAT_SPY_FORMAT.getTranslated() - .replace("%plot_id%", id.x + ";" + id.y) - .replace("%sender%", sender).replace("%msg%", message); + .replace("%plot_id%", id.x + ";" + id.y).replace("%sender%", sender) + .replace("%msg%", message); for (Player player : spies) { player.sendMessage(spyMessage); } @@ -1410,8 +1337,19 @@ import java.util.regex.Pattern; if (area == null) { return; } + if (player.getGameMode() != GameMode.SURVIVAL) { + return; + } Plot plot = area.getPlot(location); if (plot != null) { + if (plot.getFlag(InstabreakFlag.class)) { + Block block = event.getBlock(); + BlockBreakEvent call = new BlockBreakEvent(block, player); + Bukkit.getServer().getPluginManager().callEvent(call); + if (!call.isCancelled()) { + event.getBlock().breakNaturally(); + } + } if (location.getY() == 0) { event.setCancelled(true); return; @@ -1429,7 +1367,9 @@ import java.util.regex.Pattern; if (!plot.isAdded(plotPlayer.getUUID())) { List destroy = plot.getFlag(BreakFlag.class); Block block = event.getBlock(); - if (destroy.contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType()))) || Permissions + if (destroy + .contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType()))) + || Permissions .hasPermission(plotPlayer, Captions.PERMISSION_ADMIN_DESTROY_OTHER)) { return; } @@ -1522,14 +1462,14 @@ import java.util.regex.Pattern; v <-----O-----> x */ - if (BukkitUtil.getPlot(location.clone().add(-1, 0, 1) /* A */ ) != null || - BukkitUtil.getPlot(location.clone().add(1, 0, 0) /* B */ ) != null || - BukkitUtil.getPlot(location.clone().add(1, 0, 1) /* C */ ) != null || - BukkitUtil.getPlot(location.clone().add(-1, 0, 0) /* D */ ) != null || - BukkitUtil.getPlot(location.clone().add(1, 0, 0) /* E */ ) != null || - BukkitUtil.getPlot(location.clone().add(-1, 0, -1) /* F */ ) != null || - BukkitUtil.getPlot(location.clone().add(0, 0, -1) /* G */ ) != null || - BukkitUtil.getPlot(location.clone().add(1, 0, 1) /* H */ ) != null) { + if (BukkitUtil.getPlot(location.clone().add(-1, 0, 1) /* A */) != null + || BukkitUtil.getPlot(location.clone().add(1, 0, 0) /* B */) != null + || BukkitUtil.getPlot(location.clone().add(1, 0, 1) /* C */) != null + || BukkitUtil.getPlot(location.clone().add(-1, 0, 0) /* D */) != null + || BukkitUtil.getPlot(location.clone().add(1, 0, 0) /* E */) != null + || BukkitUtil.getPlot(location.clone().add(-1, 0, -1) /* F */) != null + || BukkitUtil.getPlot(location.clone().add(0, 0, -1) /* G */) != null + || BukkitUtil.getPlot(location.clone().add(1, 0, 1) /* H */) != null) { event.setCancelled(true); } } @@ -1886,14 +1826,14 @@ import java.util.regex.Pattern; PlotPlayer pp = BukkitUtil.getPlayer(e.getPlayer()); if (plot == null) { if (!Permissions.hasPermission(pp, "plots.admin.interact.road")) { - MainUtil - .sendMessage(pp, Captions.NO_PERMISSION_EVENT, "plots.admin.interact.road"); + MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, "plots.admin.interact.road"); e.setCancelled(true); } } else { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { if (!Permissions.hasPermission(pp, Captions.PERMISSION_ADMIN_BUILD_OTHER)) { - MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_BUILD_OTHER); + MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, + Captions.PERMISSION_ADMIN_BUILD_OTHER); e.setCancelled(true); return; } @@ -1975,8 +1915,9 @@ import java.util.regex.Pattern; Block block = player.getTargetBlockExact(5, FluidCollisionMode.SOURCE_ONLY); if (block != null && block.getType() != Material.AIR) { Location location = BukkitUtil.getLocation(block.getLocation()); - if (!EventUtil.manager - .checkPlayerBlockEvent(pp, PlayerBlockEventType.SPAWN_MOB, location, null, true)) { + if (!PlotSquared.get().getEventDispatcher() + .checkPlayerBlockEvent(pp, PlayerBlockEventType.SPAWN_MOB, location, null, + true)) { event.setCancelled(true); event.setUseItemInHand(Event.Result.DENY); } @@ -1998,7 +1939,8 @@ import java.util.regex.Pattern; Block block = event.getClickedBlock(); Location location = BukkitUtil.getLocation(block.getLocation()); Action action = event.getAction(); - outer: switch (action) { + outer: + switch (action) { case PHYSICAL: { eventType = PlayerBlockEventType.TRIGGER_PHYSICAL; blocktype1 = BukkitAdapter.asBlockType(block.getType()); @@ -2105,11 +2047,13 @@ import java.util.regex.Pattern; return; } if (PlotSquared.get().worldedit != null && pp.getAttribute("worldedit")) { - if (event.getMaterial() == Material.getMaterial(PlotSquared.get().worldedit.getConfiguration().wandItem)) { + if (event.getMaterial() == Material + .getMaterial(PlotSquared.get().worldedit.getConfiguration().wandItem)) { return; } } - if (!EventUtil.manager.checkPlayerBlockEvent(pp, eventType, location, blocktype1, true)) { + if (!PlotSquared.get().getEventDispatcher() + .checkPlayerBlockEvent(pp, eventType, location, blocktype1, true)) { event.setCancelled(true); event.setUseInteractedBlock(Event.Result.DENY); } @@ -2308,12 +2252,11 @@ import java.util.regex.Pattern; Block ignitingBlock = event.getIgnitingBlock(); Plot plotIgnited = BukkitUtil.getLocation(ignitingBlock.getLocation()).getPlot(); if (igniteCause == BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL && ( - !plot.getFlag(BlockIgnitionFlag.class) || plotIgnited == null - || !plotIgnited.equals(plot)) || - (igniteCause == BlockIgniteEvent.IgniteCause.SPREAD - || igniteCause == BlockIgniteEvent.IgniteCause.LAVA) && ( - !plot.getFlag(BlockIgnitionFlag.class) || plotIgnited == null - || !plotIgnited.equals(plot))) { + !plot.getFlag(BlockIgnitionFlag.class) || plotIgnited == null || !plotIgnited + .equals(plot)) || (igniteCause == BlockIgniteEvent.IgniteCause.SPREAD + || igniteCause == BlockIgniteEvent.IgniteCause.LAVA) && ( + !plot.getFlag(BlockIgnitionFlag.class) || plotIgnited == null || !plotIgnited + .equals(plot))) { event.setCancelled(true); } } @@ -2602,8 +2545,8 @@ import java.util.regex.Pattern; if (entity instanceof Animals && plot.getFlag(AnimalInteractFlag.class)) { return; } - if (entity instanceof Tameable && ((Tameable) entity).isTamed() && plot.getFlag( - TamedInteractFlag.class)) { + if (entity instanceof Tameable && ((Tameable) entity).isTamed() && plot + .getFlag(TamedInteractFlag.class)) { return; } if (entity instanceof Vehicle && plot.getFlag(VehicleUseFlag.class)) { @@ -2824,8 +2767,10 @@ import java.util.regex.Pattern; if (plot != null && (plot.getFlag(HangingBreakFlag.class)) || plot .isAdded(plotPlayer.getUUID())) { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { - if (!Permissions.hasPermission(plotPlayer, Captions.PERMISSION_ADMIN_BUILD_OTHER)) { - MainUtil.sendMessage(plotPlayer, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_BUILD_OTHER); + if (!Permissions + .hasPermission(plotPlayer, Captions.PERMISSION_ADMIN_BUILD_OTHER)) { + MainUtil.sendMessage(plotPlayer, Captions.NO_PERMISSION_EVENT, + Captions.PERMISSION_ADMIN_BUILD_OTHER); return false; } } @@ -2848,8 +2793,8 @@ import java.util.regex.Pattern; } } else if (victim instanceof Monster || victim instanceof EnderDragon) { // victim is monster - if (plot != null && (plot.getFlag(HostileAttackFlag.class) || plot.getFlag(PveFlag.class) || - plot.isAdded(plotPlayer.getUUID()))) { + if (plot != null && (plot.getFlag(HostileAttackFlag.class) || plot + .getFlag(PveFlag.class) || plot.isAdded(plotPlayer.getUUID()))) { return true; } if (!Permissions.hasPermission(plotPlayer, "plots.admin.pve." + stub)) { @@ -2858,8 +2803,8 @@ import java.util.regex.Pattern; return false; } } else if (victim instanceof Tameable) { // victim is tameable - if (plot != null && (plot.getFlag(TamedAttackFlag.class) || plot.getFlag(PveFlag.class) || - plot.isAdded(plotPlayer.getUUID()))) { + if (plot != null && (plot.getFlag(TamedAttackFlag.class) || plot + .getFlag(PveFlag.class) || plot.isAdded(plotPlayer.getUUID()))) { return true; } if (!Permissions.hasPermission(plotPlayer, "plots.admin.pve." + stub)) { @@ -2884,8 +2829,8 @@ import java.util.regex.Pattern; return false; } } else if (victim instanceof Creature) { // victim is animal - if (plot != null && (plot.getFlag(AnimalAttackFlag.class) || plot.getFlag(PveFlag.class) - || plot.isAdded(plotPlayer.getUUID()))) { + if (plot != null && (plot.getFlag(AnimalAttackFlag.class) || plot + .getFlag(PveFlag.class) || plot.isAdded(plotPlayer.getUUID()))) { return true; } if (!Permissions.hasPermission(plotPlayer, "plots.admin.pve." + stub)) { @@ -2980,9 +2925,10 @@ import java.util.regex.Pattern; } else if (!plot.isAdded(pp.getUUID())) { List place = plot.getFlag(PlaceFlag.class); if (place != null) { - Block block = event.getBlock(); - if (place.contains(BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType())))) { - return; + Block block = event.getBlock(); + if (place.contains( + BlockTypeWrapper.get(BukkitAdapter.asBlockType(block.getType())))) { + return; } } if (!Permissions.hasPermission(pp, Captions.PERMISSION_ADMIN_BUILD_OTHER)) { @@ -3008,7 +2954,51 @@ import java.util.regex.Pattern; } else if (!Permissions.hasPermission(pp, Captions.PERMISSION_ADMIN_BUILD_ROAD)) { MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_BUILD_ROAD); - event.setCancelled(true); + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGH) public void onDamage(EntityDamageEvent event) { + if (event.getEntityType() != EntityType.PLAYER) { + return; + } + Plot plot = BukkitUtil.getLocation(event.getEntity()).getOwnedPlot(); + if (plot == null) { + return; + } + if (plot.getFlag(InvincibleFlag.class)) { + event.setCancelled(true); + } + } + + @EventHandler public void onItemDrop(PlayerDropItemEvent event) { + Player player = event.getPlayer(); + PlotPlayer pp = BukkitUtil.getPlayer(player); + Plot plot = BukkitUtil.getLocation(player).getOwnedPlot(); + if (plot == null) { + return; + } + UUID uuid = pp.getUUID(); + if (!plot.isAdded(uuid)) { + if (!plot.getFlag(ItemDropFlag.class)) { + event.setCancelled(true); + } + } + } + + @EventHandler public void onItemPickup(EntityPickupItemEvent event) { + LivingEntity ent = event.getEntity(); + if (ent instanceof Player) { + Player player = (Player) ent; + PlotPlayer pp = BukkitUtil.getPlayer(player); + Plot plot = BukkitUtil.getLocation(player).getOwnedPlot(); + if (plot == null) { + return; + } + UUID uuid = pp.getUUID(); + if (!plot.isAdded(uuid) && plot.getFlag(DropProtectionFlag.class)) { + event.setCancelled(true); + } + } } } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlotPlusListener.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlotPlusListener.java deleted file mode 100644 index 05cb01894..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/listeners/PlotPlusListener.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.listeners; - -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerEnterPlotEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerLeavePlotEvent; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitUtil; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.DropProtectionFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.FeedFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.HealFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.InstabreakFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.InvincibleFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.ItemDropFlag; -import com.github.intellectualsites.plotsquared.plot.flags.types.TimedFlag; -import com.github.intellectualsites.plotsquared.plot.listener.PlotListener; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.block.Block; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityPickupItemEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; -import java.util.UUID; - -@SuppressWarnings("unused") public class PlotPlusListener extends PlotListener implements Listener { - - private static final HashMap feedRunnable = new HashMap<>(); - private static final HashMap healRunnable = new HashMap<>(); - - public static void startRunnable(JavaPlugin plugin) { - plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, () -> { - if (!healRunnable.isEmpty()) { - for (Iterator> iterator = - healRunnable.entrySet().iterator(); iterator.hasNext(); ) { - Entry entry = iterator.next(); - Interval value = entry.getValue(); - ++value.count; - if (value.count == value.interval) { - value.count = 0; - Player player = Bukkit.getPlayer(entry.getKey()); - if (player == null) { - iterator.remove(); - continue; - } - double level = player.getHealth(); - if (level != value.max) { - player.setHealth(Math.min(level + value.amount, value.max)); - } - } - } - } - if (!feedRunnable.isEmpty()) { - for (Iterator> iterator = - feedRunnable.entrySet().iterator(); iterator.hasNext(); ) { - Entry entry = iterator.next(); - Interval value = entry.getValue(); - ++value.count; - if (value.count == value.interval) { - value.count = 0; - Player player = Bukkit.getPlayer(entry.getKey()); - if (player == null) { - iterator.remove(); - continue; - } - int level = player.getFoodLevel(); - if (level != value.max) { - player.setFoodLevel(Math.min(level + value.amount, value.max)); - } - } - } - } - }, 0L, 20L); - } - - @EventHandler(priority = EventPriority.HIGH) public void onInteract(BlockDamageEvent event) { - Player player = event.getPlayer(); - if (player.getGameMode() != GameMode.SURVIVAL) { - return; - } - Plot plot = BukkitUtil.getLocation(player).getOwnedPlot(); - if (plot == null) { - return; - } - if (plot.getFlag(InstabreakFlag.class)) { - Block block = event.getBlock(); - BlockBreakEvent call = new BlockBreakEvent(block, player); - Bukkit.getServer().getPluginManager().callEvent(call); - if (!call.isCancelled()) { - event.getBlock().breakNaturally(); - } - } - } - - @EventHandler(priority = EventPriority.HIGH) public void onDamage(EntityDamageEvent event) { - if (event.getEntityType() != EntityType.PLAYER) { - return; - } - Plot plot = BukkitUtil.getLocation(event.getEntity()).getOwnedPlot(); - if (plot == null) { - return; - } - if (plot.getFlag(InvincibleFlag.class)) { - event.setCancelled(true); - } - } - - @EventHandler public void onItemDrop(PlayerDropItemEvent event) { - Player player = event.getPlayer(); - PlotPlayer pp = BukkitUtil.getPlayer(player); - Plot plot = BukkitUtil.getLocation(player).getOwnedPlot(); - if (plot == null) { - return; - } - UUID uuid = pp.getUUID(); - if (!plot.isAdded(uuid)) { - if (!plot.getFlag(ItemDropFlag.class)) { - event.setCancelled(true); - } - } - } - - @EventHandler public void onPlotEnter(PlayerEnterPlotEvent event) { - Player player = event.getPlayer(); - Plot plot = event.getPlot(); - TimedFlag.Timed feed = plot.getFlag(FeedFlag.class); - if (feed.getInterval() != 0 && feed.getValue() != 0) { - feedRunnable.put(player.getUniqueId(), new Interval(feed.getInterval(), feed.getValue(), 20)); - } - TimedFlag.Timed heal = plot.getFlag(HealFlag.class); - if (heal.getInterval() != 0 && heal.getValue() != 0) { - healRunnable.put(player.getUniqueId(), new Interval(heal.getInterval(), heal.getValue(), 20)); - } - } - - @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { - Player player = event.getPlayer(); - feedRunnable.remove(player.getUniqueId()); - healRunnable.remove(player.getUniqueId()); - } - - @EventHandler public void onPlotLeave(PlayerLeavePlotEvent event) { - Player leaver = event.getPlayer(); - Plot plot = event.getPlot(); - if (!plot.hasOwner()) { - return; - } - BukkitUtil.getPlayer(leaver); - feedRunnable.remove(leaver.getUniqueId()); - healRunnable.remove(leaver.getUniqueId()); - } - - @EventHandler public void onItemPickup(EntityPickupItemEvent event) { - LivingEntity ent = event.getEntity(); - if (ent instanceof Player) { - Player player = (Player) ent; - PlotPlayer pp = BukkitUtil.getPlayer(player); - Plot plot = BukkitUtil.getLocation(player).getOwnedPlot(); - if (plot == null) { - return; - } - UUID uuid = pp.getUUID(); - if (!plot.isAdded(uuid) && plot.getFlag(DropProtectionFlag.class)) { - event.setCancelled(true); - } - } - } - - private static class Interval { - - final int interval; - final int amount; - final int max; - int count = 0; - - Interval(int interval, int amount, int max) { - this.interval = interval; - this.amount = amount; - this.max = max; - } - } - -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java index f897f89d3..ba5f26cdd 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java @@ -1,6 +1,5 @@ package com.github.intellectualsites.plotsquared.bukkit.object; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEventUtil; import com.github.intellectualsites.plotsquared.bukkit.util.BukkitUtil; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; @@ -8,7 +7,6 @@ import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.TeleportCause; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.PlotWeather; import com.github.intellectualsites.plotsquared.plot.util.StringMan; @@ -204,7 +202,7 @@ public class BukkitPlayer extends PlotPlayer { } final org.bukkit.Location bukkitLocation = new org.bukkit.Location(BukkitUtil.getWorld(location.getWorld()), location.getX() + 0.5, location.getY(), location.getZ() + 0.5, location.getYaw(), location.getPitch()); - PaperLib.teleportAsync(player, bukkitLocation, ((BukkitEventUtil) EventUtil.manager).getTeleportCause(cause)); + PaperLib.teleportAsync(player, bukkitLocation, getTeleportCause(cause)); } @Override public String getName() { @@ -313,4 +311,15 @@ public class BukkitPlayer extends PlotPlayer { @Override public boolean isBanned() { return this.player.isBanned(); } + + + public PlayerTeleportEvent.TeleportCause getTeleportCause(@NotNull final TeleportCause cause) { + switch (cause) { + case COMMAND: + return PlayerTeleportEvent.TeleportCause.COMMAND; + case PLUGIN: + return PlayerTeleportEvent.TeleportCause.PLUGIN; + default: return PlayerTeleportEvent.TeleportCause.UNKNOWN; + } + } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitEventUtil.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitEventUtil.java deleted file mode 100644 index 58d6b6c11..000000000 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitEventUtil.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.github.intellectualsites.plotsquared.bukkit.util; - -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerClaimPlotEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerEnterPlotEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerLeavePlotEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerPlotDeniedEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerPlotHelperEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerPlotTrustedEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlayerTeleportToPlotEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotAutoMergeEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotChangeOwnerEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotClearEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotComponentSetEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotDeleteEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotFlagAddEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotFlagRemoveEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotMergeEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotRateEvent; -import com.github.intellectualsites.plotsquared.bukkit.events.PlotUnlinkEvent; -import com.github.intellectualsites.plotsquared.bukkit.object.BukkitPlayer; -import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.Rating; -import com.github.intellectualsites.plotsquared.plot.object.TeleportCause; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.UUID; - -/** - * Utility class for handling Bukkit Events. - */ -public final class BukkitEventUtil extends EventUtil { - - @Nullable public Player getPlayer(final PlotPlayer player) { - if (player instanceof BukkitPlayer) { - return ((BukkitPlayer) player).player; - } - return null; - } - - private boolean callEvent(@NotNull final Event event) { - Bukkit.getServer().getPluginManager().callEvent(event); - return !(event instanceof Cancellable) || !((Cancellable) event).isCancelled(); - } - - @Override public boolean callClaim(PlotPlayer player, Plot plot, boolean auto) { - return callEvent(new PlayerClaimPlotEvent(getPlayer(player), plot, auto)); - } - - @Override public boolean callTeleport(PlotPlayer player, Location from, Plot plot) { - return callEvent(new PlayerTeleportToPlotEvent(getPlayer(player), from, plot)); - } - - @Override public boolean callComponentSet(Plot plot, String component) { - return callEvent(new PlotComponentSetEvent(plot, component)); - } - - @Override public boolean callClear(Plot plot) { - return callEvent(new PlotClearEvent(plot)); - } - - @Override public boolean callDelete(Plot plot) { - return callEvent(new PlotDeleteEvent(plot)); - } - - @Override public boolean callFlagAdd(PlotFlag flag, Plot plot) { - return callEvent(new PlotFlagAddEvent(flag, plot)); - } - - @Override public boolean callFlagRemove(PlotFlag flag, Plot plot, Object value) { - return callEvent(new PlotFlagRemoveEvent(flag, plot)); - } - - @Override public boolean callMerge(Plot plot, int dir, int max) { - return callEvent( - new PlotMergeEvent(BukkitUtil.getWorld(plot.getWorldName()), plot, dir, max)); - } - - @Override public boolean callAutoMerge(Plot plot, List plots) { - return callEvent( - new PlotAutoMergeEvent(BukkitUtil.getWorld(plot.getWorldName()), plot, plots)); - } - - @Override public boolean callUnlink(PlotArea area, List plots) { - return callEvent(new PlotUnlinkEvent(BukkitUtil.getWorld(area.worldname), area, plots)); - } - - @Override public void callEntry(PlotPlayer player, Plot plot) { - callEvent(new PlayerEnterPlotEvent(getPlayer(player), plot)); - } - - @Override public void callLeave(PlotPlayer player, Plot plot) { - callEvent(new PlayerLeavePlotEvent(getPlayer(player), plot)); - } - - @Override public void callDenied(PlotPlayer initiator, Plot plot, UUID player, boolean added) { - callEvent(new PlayerPlotDeniedEvent(getPlayer(initiator), plot, player, added)); - } - - @Override public void callTrusted(PlotPlayer initiator, Plot plot, UUID player, boolean added) { - callEvent(new PlayerPlotTrustedEvent(getPlayer(initiator), plot, player, added)); - } - - @Override public void callMember(PlotPlayer initiator, Plot plot, UUID player, boolean added) { - callEvent(new PlayerPlotHelperEvent(getPlayer(initiator), plot, player, added)); - } - - @Override - public boolean callOwnerChange(PlotPlayer initiator, Plot plot, UUID oldOwner, UUID newOwner, - boolean hasOldOwner) { - return callEvent( - new PlotChangeOwnerEvent(getPlayer(initiator), plot, oldOwner, newOwner, hasOldOwner)); - } - - @Override @Nullable public Rating callRating(PlotPlayer player, Plot plot, Rating rating) { - PlotRateEvent event = new PlotRateEvent(player, rating, plot); - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return null; - } - return event.getRating(); - } - - public PlayerTeleportEvent.TeleportCause getTeleportCause(@NotNull final TeleportCause cause) { - switch (cause) { - case COMMAND: - return PlayerTeleportEvent.TeleportCause.COMMAND; - case PLUGIN: - return PlayerTeleportEvent.TeleportCause.PLUGIN; - default: return PlayerTeleportEvent.TeleportCause.UNKNOWN; - } - } -} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java index 6dd860099..bd77facdb 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/util/BukkitUtil.java @@ -42,10 +42,13 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; +import java.util.UUID; import java.util.List; import java.util.Set; -@SuppressWarnings({"unused", "WeakerAccess"}) public class BukkitUtil extends WorldUtil { + +@SuppressWarnings({"unused", "WeakerAccess"}) +public class BukkitUtil extends WorldUtil { private static Method biomeSetter; static { @@ -138,6 +141,18 @@ import java.util.Set; return PlotPlayer.wrap(player); } + /** + * Gets the PlotPlayer for a UUID. The PlotPlayer is usually cached and + * will provide useful functions relating to players. + * + * @param uuid the uuid to wrap + * @return a {@code PlotPlayer} + * @see PlotPlayer#wrap(Object) + */ + @Override public PlotPlayer wrapPlayer(UUID uuid) { + return PlotPlayer.wrap(Bukkit.getOfflinePlayer(uuid)); + } + /** * Gets the number of plots, which the player is able to build in. * @@ -231,9 +246,9 @@ import java.util.Set; } public static Location getLocationFull(@NonNull final org.bukkit.Location location) { - return new Location(location.getWorld().getName(), MathMan.roundInt(location.getX()), - MathMan.roundInt(location.getY()), MathMan.roundInt(location.getZ()), - location.getYaw(), location.getPitch()); + return new Location(location.getWorld().getName(), MathMan.roundInt(location.getX()), + MathMan.roundInt(location.getY()), MathMan.roundInt(location.getZ()), location.getYaw(), + location.getPitch()); } public static org.bukkit.Location getLocation(@NonNull final Location location) { @@ -315,7 +330,8 @@ import java.util.Set; } @Override @Nullable public String[] getSign(@NonNull final Location location) { - Block block = getWorld(location.getWorld()).getBlockAt(location.getX(), location.getY(), location.getZ()); + Block block = getWorld(location.getWorld()) + .getBlockAt(location.getX(), location.getY(), location.getZ()); return TaskManager.IMP.sync(new RunnableVal() { @Override public void run(String[] value) { if (block.getState() instanceof Sign) { @@ -395,7 +411,8 @@ import java.util.Set; Inventory inv = holder.getInventory(); for (int i = 0; i < items.types.length; i++) { // ItemStack item = new ItemStack(LegacyMappings.fromLegacyId(items.id[i]).getMaterial(), items.amount[i], items.data[i]); - ItemStack item = new ItemStack(BukkitAdapter.adapt(items.types[i]), items.amount[i]); + ItemStack item = + new ItemStack(BukkitAdapter.adapt(items.types[i]), items.amount[i]); inv.addItem(item); } state.update(true); @@ -432,7 +449,8 @@ import java.util.Set; } final Biome biome = BukkitAdapter.adapt(biomeType); for (int x = region.getMinimumPoint().getX(); x <= region.getMaximumPoint().getX(); x++) { - for (int z = region.getMinimumPoint().getZ(); z <= region.getMaximumPoint().getZ(); z++) { + for (int z = region.getMinimumPoint().getZ(); + z <= region.getMaximumPoint().getZ(); z++) { for (int y = 0; y < world.getMaxHeight(); y++) { try { if (biomeSetter != null) { @@ -462,4 +480,20 @@ import java.util.Set; @Override public String getMainWorld() { return Bukkit.getWorlds().get(0).getName(); } + + @Override public double getHealth(PlotPlayer player) { + return Bukkit.getPlayer(player.getUUID()).getHealth(); + } + + @Override public int getFoodLevel(PlotPlayer player) { + return Bukkit.getPlayer(player.getUUID()).getFoodLevel(); + } + + @Override public void setHealth(PlotPlayer player, double health) { + Bukkit.getPlayer(player.getUUID()).setHealth(health); + } + + @Override public void setFoodLevel(PlotPlayer player, int foodLevel) { + Bukkit.getPlayer(player.getUUID()).setFoodLevel(foodLevel); + } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/api/PlotAPI.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/api/PlotAPI.java index 7e7b4dc73..222677e86 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/api/PlotAPI.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/api/PlotAPI.java @@ -7,10 +7,7 @@ import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotArea; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; +import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue; import com.github.intellectualsites.plotsquared.plot.uuid.UUIDWrapper; import lombok.NoArgsConstructor; @@ -201,4 +198,14 @@ import java.util.UUID; public PlotPlayer wrapPlayer(String player) { return PlotPlayer.wrap(player); } + + /** + * Registers a listener for PlotSquared Events + * + * @param listener the listener class to register + * @see EventDispatcher#registerListener(Object) + */ + public void registerListener(Object listener) { + PlotSquared.get().getEventDispatcher().registerListener(listener); + } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/IPlotMain.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/IPlotMain.java index 48f87a96e..c2c0a5a83 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/IPlotMain.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/IPlotMain.java @@ -8,7 +8,6 @@ import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.util.ChatManager; import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.InventoryUtil; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; import com.github.intellectualsites.plotsquared.plot.util.SetupUtils; @@ -130,11 +129,6 @@ public interface IPlotMain extends ILogger { */ void registerPlayerEvents(); - /** - * Register plot plus related events. - */ - void registerPlotPlusEvents(); - /** * Register force field events. */ @@ -162,11 +156,6 @@ public interface IPlotMain extends ILogger { */ WorldUtil initWorldUtil(); - /** - * Gets the EventUtil class. - */ - EventUtil initEventUtil(); - /** * Gets the chunk manager. * diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java index 4356891ab..a66f6edaa 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/PlotSquared.java @@ -41,7 +41,7 @@ import com.github.intellectualsites.plotsquared.plot.util.ChatManager; import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; import com.github.intellectualsites.plotsquared.plot.util.CommentManager; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; +import com.github.intellectualsites.plotsquared.plot.util.EventDispatcher; import com.github.intellectualsites.plotsquared.plot.util.InventoryUtil; import com.github.intellectualsites.plotsquared.plot.util.LegacyConverter; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; @@ -73,8 +73,6 @@ import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; -import java.net.URLConnection; -import java.nio.file.Files; import java.sql.SQLException; import java.util.ArrayDeque; import java.util.ArrayList; @@ -82,7 +80,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -132,6 +129,7 @@ import java.util.zip.ZipInputStream; @Getter private File jarFile = null; // This file private File storageFile; @Getter private PlotAreaManager plotAreaManager; + @Getter private EventDispatcher eventDispatcher; /** * Initialize PlotSquared with the desired Implementation class. @@ -215,7 +213,6 @@ import java.util.zip.ZipInputStream; } if (Settings.Enabled_Components.EVENTS) { this.IMP.registerPlayerEvents(); - this.IMP.registerPlotPlusEvents(); } // Required this.IMP.registerWorldEvents(); @@ -231,8 +228,8 @@ import java.util.zip.ZipInputStream; UUIDHandler.add(new StringWrapper("*"), DBFunc.EVERYONE); startExpiryTasks(); } - // create event util class - EventUtil.manager = this.IMP.initEventUtil(); + // Create Event utility class + eventDispatcher = new EventDispatcher(); // create Hybrid utility class HybridUtils.manager = this.IMP.initHybridUtils(); // Inventory utility class @@ -1053,7 +1050,7 @@ import java.util.zip.ZipInputStream; return false; } if (callEvent) { - EventUtil.manager.callDelete(plot); + eventDispatcher.callDelete(plot); } if (plot.getArea().removePlot(plot.getId())) { PlotId last = (PlotId) plot.getArea().getMeta("lastPlot"); @@ -1527,6 +1524,7 @@ import java.util.zip.ZipInputStream; */ public void disable() { try { + eventDispatcher.unregisterAll(); // Validate that all data in the db is correct final HashSet plots = new HashSet<>(); try { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java index 70e3a71eb..5009017f5 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java @@ -2,13 +2,13 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.Command; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; @@ -78,7 +78,7 @@ public class Add extends Command { } } plot.addMember(uuid); - EventUtil.manager.callMember(player, plot, uuid, true); + PlotSquared.get().getEventDispatcher().callMember(player, plot, uuid, true); MainUtil.sendMessage(player, Captions.MEMBER_ADDED); } }, null); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Auto.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Auto.java index 86c540a42..0f361f861 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Auto.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Auto.java @@ -6,6 +6,10 @@ import com.github.intellectualsites.plotsquared.plot.config.CaptionUtility; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; +import com.github.intellectualsites.plotsquared.plot.events.PlayerAutoPlotEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotAutoMergeEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotMergeEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.object.Direction; import com.github.intellectualsites.plotsquared.plot.object.Expression; import com.github.intellectualsites.plotsquared.plot.object.Plot; @@ -21,6 +25,7 @@ import com.github.intellectualsites.plotsquared.plot.util.TaskManager; import com.google.common.primitives.Ints; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Set; @CommandDeclaration(command = "auto", @@ -125,11 +130,20 @@ public class Auto extends SubCommand { player.deleteMeta(Auto.class.getName()); if (plot == null) { MainUtil.sendMessage(player, Captions.NO_FREE_PLOTS); - } else if (checkAllowedPlots(player, area, allowedPlots, 1, 1)) { + return; + } + + if (checkAllowedPlots(player, area, allowedPlots, 1, 1)) { plot.claim(player, true, schematic, false); if (area.AUTO_MERGE) { - plot.autoMerge(Direction.ALL, Integer.MAX_VALUE, player.getUUID(), - true); + PlotMergeEvent event = PlotSquared.get().getEventDispatcher() + .callMerge(plot, Direction.ALL, Integer.MAX_VALUE, player); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Auto merge"); + } else { + plot.autoMerge(event.getDir(), event.getMax(), player.getUUID(), + true); + } } } else { DBFunc.delete(plot); @@ -176,46 +190,61 @@ public class Auto extends SubCommand { int size_x = 1; int size_z = 1; String schematic = null; + boolean mega = false; if (args.length > 0) { - if (Permissions.hasPermission(player, Captions.PERMISSION_AUTO_MEGA)) { - try { - String[] split = args[0].split(",|;"); - if (split[1] == null) { - MainUtil.sendMessage(player, "Correct use /plot auto [length,width]"); + try { + String[] split = args[0].split(",|;"); + switch (split.length) { + case 1: size_x = 1; size_z = 1; - } else { + break; + case 2: size_x = Integer.parseInt(split[0]); size_z = Integer.parseInt(split[1]); - } - if (size_x < 1 || size_z < 1) { - MainUtil.sendMessage(player, "Error: size<=0"); - } - if (args.length > 1) { - schematic = args[1]; - } - } catch (NumberFormatException ignored) { - size_x = 1; - size_z = 1; - schematic = args[0]; - // PlayerFunctions.sendMessage(plr, - // "&cError: Invalid size (X,Y)"); - // return false; + break; + default: + MainUtil.sendMessage(player, "Correct use /plot auto [length,width]"); + return true; } - } else { + if (size_x < 1 || size_z < 1) { + MainUtil.sendMessage(player, "Error: size<=0"); + } + if (args.length > 1) { + schematic = args[1]; + } + mega = true; + } catch (NumberFormatException ignored) { + size_x = 1; + size_z = 1; schematic = args[0]; - // PlayerFunctions.sendMessage(plr, Captions.NO_PERMISSION); + // PlayerFunctions.sendMessage(plr, + // "&cError: Invalid size (X,Y)"); // return false; } } - if (size_x * size_z > Settings.Claim.MAX_AUTO_AREA) { + PlayerAutoPlotEvent event = PlotSquared.get().getEventDispatcher() + .callAuto(player, plotarea, schematic, size_x, size_z); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Auto claim"); + return true; + } + boolean force = event.getEventResult() == Result.FORCE; + size_x = event.getSize_x(); + size_z = event.getSize_z(); + schematic = event.getSchematic(); + if (!force && mega && !Permissions.hasPermission(player, Captions.PERMISSION_AUTO_MEGA)) { + MainUtil.sendMessage(player, Captions.NO_PERMISSION, + CaptionUtility.format(player, Captions.PERMISSION_AUTO_MEGA)); + } + if (!force && size_x * size_z > Settings.Claim.MAX_AUTO_AREA) { MainUtil.sendMessage(player, Captions.CANT_CLAIM_MORE_PLOTS_NUM, Settings.Claim.MAX_AUTO_AREA + ""); return false; } final int allowed_plots = player.getAllowedPlots(); - if (player.getMeta(Auto.class.getName(), false) || !checkAllowedPlots(player, plotarea, - allowed_plots, size_x, size_z)) { + if (!force && (player.getMeta(Auto.class.getName(), false) || !checkAllowedPlots(player, plotarea, + allowed_plots, size_x, size_z))) { return false; } @@ -224,7 +253,7 @@ public class Auto extends SubCommand { sendMessage(player, Captions.SCHEMATIC_INVALID, "non-existent: " + schematic); return true; } - if (!Permissions.hasPermission(player, CaptionUtility + if (!force && !Permissions.hasPermission(player, CaptionUtility .format(player, Captions.PERMISSION_CLAIM_SCHEMATIC.getTranslated(), schematic)) && !Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_SCHEMATIC)) { @@ -241,7 +270,7 @@ public class Auto extends SubCommand { player.getPlotCount(plotarea.worldname))); cost = (size_x * size_z) * cost; if (cost > 0d) { - if (EconHandler.manager.getMoney(player) < cost) { + if (!force && EconHandler.manager.getMoney(player) < cost) { sendMessage(player, Captions.CANNOT_AFFORD_PLOT, "" + cost); return true; } @@ -273,7 +302,15 @@ public class Auto extends SubCommand { plot.claim(player, teleport, null); } } - if (!plotarea.mergePlots(MainUtil.getPlotSelectionIds(start, end), true)) { + ArrayList plotIds = MainUtil.getPlotSelectionIds(start, end); + final PlotId pos1 = plotIds.get(0); + final PlotAutoMergeEvent mergeEvent = PlotSquared.get().getEventDispatcher() + .callAutoMerge(plotarea.getPlotAbs(pos1), plotIds); + if (!force && mergeEvent.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Auto merge"); + return false; + } + if (!plotarea.mergePlots(mergeEvent.getPlots(), true)) { return false; } break; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java index dbfee3067..1768ae7f3 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java @@ -2,7 +2,11 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.Command; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.PriceFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; @@ -60,7 +64,11 @@ public class Buy extends Command { if (owner != null) { Captions.PLOT_SOLD.send(owner, plot.getId(), player.getName(), price); } - plot.removeFlag(PriceFlag.class); + PlotFlag plotFlag = plot.getFlagContainer().getFlag(PriceFlag.class); + PlotFlagRemoveEvent event = PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot); + if(event.getEventResult() != Result.DENY) { + plot.removeFlag(event.getFlag()); + } plot.setOwner(player.getUUID()); Captions.CLAIMED.send(player); whenDone.run(Buy.this, CommandResult.SUCCESS); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Claim.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Claim.java index d07cb96c5..371062006 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Claim.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Claim.java @@ -1,17 +1,15 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.CaptionUtility; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; -import com.github.intellectualsites.plotsquared.plot.object.Direction; -import com.github.intellectualsites.plotsquared.plot.object.Expression; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; +import com.github.intellectualsites.plotsquared.plot.events.PlayerClaimPlotEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotMergeEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.TaskManager; @@ -27,7 +25,7 @@ import com.google.common.primitives.Ints; public class Claim extends SubCommand { @Override public boolean onCommand(final PlotPlayer player, String[] args) { - String schematic = ""; + String schematic = null; if (args.length >= 1) { schematic = args[0]; } @@ -36,11 +34,18 @@ public class Claim extends SubCommand { if (plot == null) { return sendMessage(player, Captions.NOT_IN_PLOT); } + PlayerClaimPlotEvent event = PlotSquared.get().getEventDispatcher().callClaim(player, plot, schematic); + schematic = event.getSchematic(); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Claim"); + return true; + } + boolean force = event.getEventResult() == Result.FORCE; int currentPlots = Settings.Limit.GLOBAL ? player.getPlotCount() : player.getPlotCount(location.getWorld()); int grants = 0; - if (currentPlots >= player.getAllowedPlots()) { + if (currentPlots >= player.getAllowedPlots() && !force) { if (player.hasPersistentMeta("grantedPlots")) { grants = Ints.fromByteArray(player.getPersistentMeta("grantedPlots")); if (grants <= 0) { @@ -55,7 +60,7 @@ public class Claim extends SubCommand { return sendMessage(player, Captions.PLOT_IS_CLAIMED); } final PlotArea area = plot.getArea(); - if (!schematic.isEmpty()) { + if (schematic != null && !schematic.isEmpty()) { if (area.SCHEMATIC_CLAIM_SPECIFY) { if (!area.SCHEMATICS.contains(schematic.toLowerCase())) { return sendMessage(player, Captions.SCHEMATIC_INVALID, @@ -64,16 +69,12 @@ public class Claim extends SubCommand { if (!Permissions.hasPermission(player, CaptionUtility .format(player, Captions.PERMISSION_CLAIM_SCHEMATIC.getTranslated(), schematic)) && !Permissions - .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_SCHEMATIC)) { + .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_SCHEMATIC) && !force) { return sendMessage(player, Captions.NO_SCHEMATIC_PERMISSION, schematic); } } } - int border = area.getBorder(); - if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border) { - return !sendMessage(player, Captions.BORDER); - } - if ((EconHandler.manager != null) && area.USE_ECONOMY) { + if ((EconHandler.manager != null) && area.USE_ECONOMY && !force) { Expression costExr = area.PRICES.get("claim"); double cost = costExr.evaluate((double) currentPlots); if (cost > 0d) { @@ -92,21 +93,26 @@ public class Claim extends SubCommand { } sendMessage(player, Captions.REMOVED_GRANTED_PLOT, "1", "" + (grants - 1)); } - if (plot.canClaim(player)) { - plot.owner = player.getUUID(); - final String finalSchematic = schematic; - DBFunc.createPlotSafe(plot, () -> TaskManager.IMP.sync(new RunnableVal() { - @Override public void run(Object value) { - plot.claim(player, true, finalSchematic, false); - if (area.AUTO_MERGE) { - plot.autoMerge(Direction.ALL, Integer.MAX_VALUE, player.getUUID(), true); + int border = area.getBorder(); + if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) { + return !sendMessage(player, Captions.BORDER); + } + plot.owner = player.getUUID(); + final String finalSchematic = schematic; + DBFunc.createPlotSafe(plot, () -> TaskManager.IMP.sync(new RunnableVal() { + @Override public void run(Object value) { + plot.claim(player, true, finalSchematic); + if (area.AUTO_MERGE) { + PlotMergeEvent event = PlotSquared.get().getEventDispatcher() + .callMerge(plot, Direction.ALL, Integer.MAX_VALUE, player); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Auto merge on claim"); + } else { + plot.autoMerge(event.getDir(), event.getMax(), player.getUUID(), true); } } - }), () -> sendMessage(player, Captions.PLOT_NOT_CLAIMED)); - return true; - } else { - sendMessage(player, Captions.PLOT_NOT_CLAIMED); - } - return false; + } + }), () -> sendMessage(player, Captions.PLOT_NOT_CLAIMED)); + return true; } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java index d9a2bb1e1..e8cd8ece5 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java @@ -2,8 +2,12 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.Command; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.AnalysisFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; @@ -16,6 +20,8 @@ import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue import java.util.concurrent.CompletableFuture; +import static com.github.intellectualsites.plotsquared.plot.commands.SubCommand.sendMessage; + @CommandDeclaration(command = "clear", description = "Clear the plot you stand on", requiredType = RequiredType.NONE, @@ -38,11 +44,18 @@ public class Clear extends Command { RunnableVal2 whenDone) throws CommandException { checkTrue(args.length == 0, Captions.COMMAND_SYNTAX, getUsage()); final Plot plot = check(player.getCurrentPlot(), Captions.NOT_IN_PLOT); - checkTrue(plot.isOwner(player.getUUID()) || Permissions + Result eventResult = + PlotSquared.get().getEventDispatcher().callClear(plot).getEventResult(); + if (eventResult == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Clear"); + return CompletableFuture.completedFuture(true); + } + boolean force = eventResult == Result.FORCE; + checkTrue(force || plot.isOwner(player.getUUID()) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_CLEAR), Captions.NO_PLOT_PERMS); checkTrue(plot.getRunning() == 0, Captions.WAIT_FOR_TIMER); - checkTrue(!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || Permissions + checkTrue(force || !Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot) || Permissions .hasPermission(player, Captions.PERMISSION_CONTINUE), Captions.DONE_ALREADY_DONE); confirm.run(this, () -> { final long start = System.currentTimeMillis(); @@ -52,10 +65,21 @@ public class Clear extends Command { plot.removeRunning(); // If the state changes, then mark it as no longer done if (DoneFlag.isDone(plot)) { - plot.removeFlag(DoneFlag.class); + PlotFlag plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class); + PlotFlagRemoveEvent event = + PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot); + if (event.getEventResult() != Result.DENY) { + plot.removeFlag(event.getFlag()); + } } if (!plot.getFlag(AnalysisFlag.class).isEmpty()) { - plot.removeFlag(AnalysisFlag.class); + PlotFlag plotFlag = + plot.getFlagContainer().getFlag(AnalysisFlag.class); + PlotFlagRemoveEvent event = + PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot); + if (event.getEventResult() != Result.DENY) { + plot.removeFlag(event.getFlag()); + } } MainUtil.sendMessage(player, Captions.CLEARING_DONE, "" + (System.currentTimeMillis() - start)); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Continue.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Continue.java index 76dae49ff..1a11cc567 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Continue.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Continue.java @@ -1,8 +1,12 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; @@ -41,7 +45,14 @@ public class Continue extends SubCommand { MainUtil.sendMessage(player, Captions.WAIT_FOR_TIMER); return false; } - plot.removeFlag(DoneFlag.class); + PlotFlag plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class); + PlotFlagRemoveEvent event = + PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Done flag removal"); + return true; + } + plot.removeFlag(event.getFlag()); MainUtil.sendMessage(player, Captions.DONE_REMOVED); return true; } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java index 0a40120a9..fdd4c2f8d 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java @@ -6,6 +6,8 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.generator.HybridUtils; @@ -23,7 +25,6 @@ import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; @@ -145,7 +146,7 @@ public class DebugExec extends SubCommand { this.scope.put("ChunkManager", ChunkManager.manager); this.scope.put("BlockManager", WorldUtil.IMP); this.scope.put("SetupUtils", SetupUtils.manager); - this.scope.put("EventUtil", EventUtil.manager); + this.scope.put("EventUtil", PlotSquared.get().getEventDispatcher()); this.scope.put("EconHandler", EconHandler.manager); this.scope.put("UUIDHandler", UUIDHandler.implementation); this.scope.put("DBFunc", DBFunc.dbManager); @@ -226,7 +227,11 @@ public class DebugExec extends SubCommand { GlobalFlagContainer.getInstance().getFlagFromString(flag); if (flagInstance != null) { for (Plot plot : PlotSquared.get().getBasePlots()) { - plot.removeFlag(flagInstance); + PlotFlagRemoveEvent event = PlotSquared.get().getEventDispatcher() + .callFlagRemove(flagInstance, plot); + if (event.getEventResult() != Result.DENY) { + plot.removeFlag(event.getFlag()); + } } } return MainUtil.sendMessage(player, "Cleared flag: " + flag); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Delete.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Delete.java index 4ec8dcc48..36c21a1e4 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Delete.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Delete.java @@ -1,8 +1,11 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; +import com.github.intellectualsites.plotsquared.plot.config.CaptionUtility; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.object.Expression; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; @@ -37,7 +40,13 @@ public class Delete extends SubCommand { if (!plot.hasOwner()) { return !sendMessage(player, Captions.PLOT_UNOWNED); } - if (!plot.isOwner(player.getUUID()) && !Permissions + Result eventResult = PlotSquared.get().getEventDispatcher().callDelete(plot).getEventResult(); + if (eventResult == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Delete"); + return true; + } + boolean force = eventResult == Result.FORCE; + if (!force && !plot.isOwner(player.getUUID()) && !Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_DELETE)) { return !sendMessage(player, Captions.NO_PLOT_PERMS); } @@ -46,33 +55,29 @@ public class Delete extends SubCommand { final int currentPlots = Settings.Limit.GLOBAL ? player.getPlotCount() : player.getPlotCount(location.getWorld()); - Runnable run = new Runnable() { - @Override public void run() { - if (plot.getRunning() > 0) { - MainUtil.sendMessage(player, Captions.WAIT_FOR_TIMER); - return; - } - final long start = System.currentTimeMillis(); - boolean result = plot.deletePlot(new Runnable() { - @Override public void run() { - plot.removeRunning(); - if ((EconHandler.manager != null) && plotArea.USE_ECONOMY) { - Expression valueExr = plotArea.PRICES.get("sell"); - double value = plots.size() * valueExr.evaluate((double) currentPlots); - if (value > 0d) { - EconHandler.manager.depositMoney(player, value); - sendMessage(player, Captions.ADDED_BALANCE, String.valueOf(value)); - } - } - MainUtil.sendMessage(player, Captions.DELETING_DONE, - System.currentTimeMillis() - start); + Runnable run = () -> { + if (plot.getRunning() > 0) { + MainUtil.sendMessage(player, Captions.WAIT_FOR_TIMER); + return; + } + final long start = System.currentTimeMillis(); + boolean result = plot.deletePlot(() -> { + plot.removeRunning(); + if ((EconHandler.manager != null) && plotArea.USE_ECONOMY) { + Expression valueExr = plotArea.PRICES.get("sell"); + double value = plots.size() * valueExr.evaluate((double) currentPlots); + if (value > 0d) { + EconHandler.manager.depositMoney(player, value); + sendMessage(player, Captions.ADDED_BALANCE, String.valueOf(value)); } - }); - if (result) { - plot.addRunning(); - } else { - MainUtil.sendMessage(player, Captions.WAIT_FOR_TIMER); } + MainUtil.sendMessage(player, Captions.DELETING_DONE, + System.currentTimeMillis() - start); + }); + if (result) { + plot.addRunning(); + } else { + MainUtil.sendMessage(player, Captions.WAIT_FOR_TIMER); } }; if (hasConfirmation(player)) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Deny.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Deny.java index 912188109..b1d738cb1 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Deny.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Deny.java @@ -8,7 +8,6 @@ import com.github.intellectualsites.plotsquared.plot.database.DBFunc; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; @@ -72,7 +71,7 @@ public class Deny extends SubCommand { plot.removeTrusted(uuid); } plot.addDenied(uuid); - EventUtil.manager.callDenied(player, plot, uuid, true); + PlotSquared.get().getEventDispatcher().callDenied(player, plot, uuid, true); if (!uuid.equals(DBFunc.EVERYONE)) { handleKick(UUIDHandler.getPlayer(uuid), plot); } else { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Desc.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Desc.java index 76883593e..b97d2b2c8 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Desc.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Desc.java @@ -1,8 +1,11 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; -import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagAddEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.flags.implementations.DescriptionFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; @@ -19,13 +22,23 @@ public class Desc extends SetCommand { @Override public boolean set(PlotPlayer player, Plot plot, String desc) { if (desc.isEmpty()) { - plot.removeFlag(DescriptionFlag.class); + PlotFlagRemoveEvent event = PlotSquared.get().getEventDispatcher() + .callFlagRemove(plot.getFlagContainer().getFlag(DescriptionFlag.class), plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Description removal"); + return false; + } + plot.removeFlag(event.getFlag()); MainUtil.sendMessage(player, Captions.DESC_UNSET); return true; } - boolean result = plot.setFlag( - GlobalFlagContainer.getInstance().getFlag(DescriptionFlag.class) - .createFlagInstance(desc)); + PlotFlagAddEvent event = PlotSquared.get().getEventDispatcher().callFlagAdd( + plot.getFlagContainer().getFlag(DescriptionFlag.class).createFlagInstance(desc), plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Description set"); + return false; + } + boolean result = plot.setFlag(event.getFlag()); if (!result) { MainUtil.sendMessage(player, Captions.FLAG_NOT_ADDED); return false; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Done.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Done.java index 444d6b748..9722f3366 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Done.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Done.java @@ -1,8 +1,13 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotDoneEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagAddEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag; import com.github.intellectualsites.plotsquared.plot.generator.HybridUtils; import com.github.intellectualsites.plotsquared.plot.object.Location; @@ -28,7 +33,13 @@ public class Done extends SubCommand { if ((plot == null) || !plot.hasOwner()) { return !sendMessage(player, Captions.NOT_IN_PLOT); } - if (!plot.isOwner(player.getUUID()) && !Permissions + PlotDoneEvent event = PlotSquared.get().getEventDispatcher().callDone(plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Done"); + return true; + } + boolean force = event.getEventResult() == Result.FORCE; + if (!force && !plot.isOwner(player.getUUID()) && !Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_DONE)) { MainUtil.sendMessage(player, Captions.NO_PLOT_PERMS); return false; @@ -61,12 +72,19 @@ public class Done extends SubCommand { } private void finish(Plot plot, PlotPlayer pp, boolean success) { - if (success) { - long flagValue = System.currentTimeMillis() / 1000; - plot.setFlag(DoneFlag.class, Long.toString(flagValue)); - MainUtil.sendMessage(pp, Captions.DONE_SUCCESS); - } else { + if (!success) { MainUtil.sendMessage(pp, Captions.DONE_INSUFFICIENT_COMPLEXITY); + return; } + long flagValue = System.currentTimeMillis() / 1000; + PlotFlag plotFlag = plot.getFlagContainer().getFlag(DoneFlag.class) + .createFlagInstance(Long.toString(flagValue)); + PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(pp, Captions.EVENT_DENIED, "Done flag addition"); + return; + } + plot.setFlag(plotFlag); + MainUtil.sendMessage(pp, Captions.DONE_SUCCESS); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/FlagCommand.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/FlagCommand.java index b9a0abf5d..e0cc4f878 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/FlagCommand.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/FlagCommand.java @@ -6,6 +6,9 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.CaptionUtility; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagAddEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.flags.FlagParseException; import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; import com.github.intellectualsites.plotsquared.plot.flags.InternalFlag; @@ -270,8 +273,15 @@ public final class FlagCommand extends Command { if (plotFlag == null) { return; } + Plot plot = player.getLocation().getPlotAbs(); + PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Flag set"); + return; + } + boolean force = event.getEventResult() == Result.FORCE; final String value = StringMan.join(Arrays.copyOfRange(args, 1, args.length), " "); - if (!checkPermValue(player, plotFlag, args[0], value)) { + if (!force && !checkPermValue(player, plotFlag, args[0], value)) { return; } final PlotFlag parsed; @@ -283,7 +293,7 @@ public final class FlagCommand extends Command { .replace("%flag_value%", e.getValue()).replace("%error%", e.getErrorMessage())); return; } - player.getLocation().getPlotAbs().setFlag(parsed); + plot.setFlag(parsed); MainUtil.sendMessage(player, Captions.FLAG_ADDED); } @@ -304,24 +314,32 @@ public final class FlagCommand extends Command { MainUtil.sendMessage(player, Captions.COMMAND_SYNTAX, "/plot flag add "); return; } - final PlotFlag flag = getFlag(player, args[0]); - if (flag == null) { + final PlotFlag plotFlag = getFlag(player, args[0]); + if (plotFlag == null) { return; } - final PlotFlag localFlag = - player.getLocation().getPlotAbs().getFlagContainer().getFlag(flag.getClass()); - for (String entry : args[1].split(",")) { - if (!checkPermValue(player, flag, args[0], entry)) { - return; - } + Plot plot = player.getLocation().getPlotAbs(); + PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Flag add"); + return; } - final String value = StringMan.join(Arrays.copyOfRange(args, 1, args.length), " "); + boolean force = event.getEventResult() == Result.FORCE; + final PlotFlag localFlag = player.getLocation().getPlotAbs().getFlagContainer() + .getFlag(event.getFlag().getClass()); + if (!force) { + for (String entry : args[1].split(",")) { + if (!checkPermValue(player, event.getFlag(), args[0], entry)) { + return; + } + } + } final String value = StringMan.join(Arrays.copyOfRange(args, 1, args.length), " "); final PlotFlag parsed; try { - parsed = flag.parse(value); + parsed = event.getFlag().parse(value); } catch (FlagParseException e) { MainUtil.sendMessage(player, - Captions.FLAG_PARSE_ERROR.getTranslated().replace("%flag_name%", flag.getName()) + Captions.FLAG_PARSE_ERROR.getTranslated().replace("%flag_name%", plotFlag.getName()) .replace("%flag_value%", e.getValue()).replace("%error%", e.getErrorMessage())); return; } @@ -352,11 +370,19 @@ public final class FlagCommand extends Command { .sendMessage(player, Captions.COMMAND_SYNTAX, "/plot flag remove [values]"); return; } - final PlotFlag flag = getFlag(player, args[0]); + PlotFlag flag = getFlag(player, args[0]); if (flag == null) { return; } - if (!Permissions.hasPermission(player, CaptionUtility + final Plot plot = player.getLocation().getPlotAbs(); + PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(flag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Flag remove"); + return; + } + boolean force = event.getEventResult() == Result.FORCE; + flag = event.getFlag(); + if (!force && !Permissions.hasPermission(player, CaptionUtility .format(player, Captions.PERMISSION_SET_FLAG_KEY.getTranslated(), args[0].toLowerCase()))) { if (args.length != 2) { @@ -366,7 +392,6 @@ public final class FlagCommand extends Command { return; } } - final Plot plot = player.getLocation().getPlotAbs(); if (args.length == 2 && flag instanceof ListFlag) { String value = StringMan.join(Arrays.copyOfRange(args, 1, args.length), " "); final ListFlag listFlag = (ListFlag) flag; @@ -397,7 +422,13 @@ public final class FlagCommand extends Command { } } else { // MainUtil.sendMessage(player, Captions.FLAG_REMOVED); - if (plot.setFlag(parsedFlag.createFlagInstance(list))) { + PlotFlag plotFlag = parsedFlag.createFlagInstance(list); + PlotFlagAddEvent addEvent = new PlotFlagAddEvent(plotFlag, plot); + if (addEvent.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Re-addition of " + plotFlag.getName()); + return; + } + if (plot.setFlag(addEvent.getFlag())) { MainUtil.sendMessage(player, Captions.FLAG_PARTIALLY_REMOVED); return; } else { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java index 658cc383f..46853c67e 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java @@ -2,12 +2,12 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.Command; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import java.util.UUID; @@ -38,10 +38,10 @@ public class Leave extends Command { UUID uuid = player.getUUID(); if (plot.isAdded(uuid)) { if (plot.removeTrusted(uuid)) { - EventUtil.manager.callTrusted(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callTrusted(player, plot, uuid, false); } if (plot.removeMember(uuid)) { - EventUtil.manager.callMember(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callMember(player, plot, uuid, false); } MainUtil.sendMessage(player, Captions.PLOT_LEFT, player.getName()); } else { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Like.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Like.java index 2d94a9e39..e1751696e 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Like.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Like.java @@ -5,12 +5,12 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; +import com.github.intellectualsites.plotsquared.plot.events.PlotRateEvent; import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.Rating; import com.github.intellectualsites.plotsquared.plot.object.TeleportCause; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.TaskManager; @@ -99,9 +99,10 @@ public class Like extends SubCommand { rating = 1; } plot.addRating(uuid, new Rating(rating)); - final Rating result = EventUtil.manager.callRating(player, plot, new Rating(rating)); - if (result != null) { - plot.addRating(uuid, result); + final PlotRateEvent + event = PlotSquared.get().getEventDispatcher().callRating(player, plot, new Rating(rating)); + if (event.getRating() != null) { + plot.addRating(uuid, event.getRating()); if (like) { sendMessage(player, Captions.RATING_LIKED, plot.getId().toString()); } else { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Merge.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Merge.java index b89eb6ec3..e1748a3f9 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Merge.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Merge.java @@ -1,8 +1,11 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotMergeEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.object.Direction; import com.github.intellectualsites.plotsquared.plot.object.Expression; import com.github.intellectualsites.plotsquared.plot.object.Location; @@ -65,31 +68,7 @@ public class Merge extends SubCommand { MainUtil.sendMessage(player, Captions.PLOT_UNOWNED); return false; } - UUID uuid = player.getUUID(); - if (!plot.isOwner(uuid)) { - if (!Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_MERGE)) { - MainUtil.sendMessage(player, Captions.NO_PLOT_PERMS); - return false; - } else { - uuid = plot.guessOwner(); - } - } - final PlotArea plotArea = plot.getArea(); - Expression priceExr = plotArea.PRICES.getOrDefault("merge", null); - final int size = plot.getConnectedPlots().size(); - final double price = priceExr == null ? 0d : priceExr.evaluate((double) size); - if (EconHandler.manager != null && plotArea.USE_ECONOMY && price > 0d - && EconHandler.manager.getMoney(player) < price) { - sendMessage(player, Captions.CANNOT_AFFORD_MERGE, String.valueOf(price)); - return false; - } - final int maxSize = - Permissions.hasPermissionRange(player, "plots.merge", Settings.Limit.MAX_PLOTS); - if (size - 1 > maxSize) { - MainUtil.sendMessage(player, Captions.NO_PERMISSION, "plots.merge." + (size + 1)); - return false; - } - Direction direction = Direction.ALL; + Direction direction = null; if (args.length == 0) { switch (direction(player.getLocationFull().getYaw())) { case "NORTH": @@ -106,29 +85,6 @@ public class Merge extends SubCommand { break; } } else { - if ("all".equalsIgnoreCase(args[0]) || "auto".equalsIgnoreCase(args[0])) { - boolean terrain = true; - if (args.length == 2) { - terrain = "true".equalsIgnoreCase(args[1]); - } - if (!terrain && !Permissions - .hasPermission(player, Captions.PERMISSION_MERGE_KEEP_ROAD)) { - MainUtil.sendMessage(player, Captions.NO_PERMISSION, - Captions.PERMISSION_MERGE_KEEP_ROAD.getTranslated()); - return true; - } - if (plot.autoMerge(Direction.ALL, maxSize, uuid, terrain)) { - if (EconHandler.manager != null && plotArea.USE_ECONOMY && price > 0d) { - EconHandler.manager.withdrawMoney(player, price); - sendMessage(player, Captions.REMOVED_BALANCE, String.valueOf(price)); - } - MainUtil.sendMessage(player, Captions.SUCCESS_MERGE); - return true; - } - MainUtil.sendMessage(player, Captions.NO_AVAILABLE_AUTOMERGE); - return false; - - } for (int i = 0; i < values.length; i++) { if (args[0].equalsIgnoreCase(values[i]) || args[0].equalsIgnoreCase(aliases[i])) { direction = getFromIndex(i); @@ -136,20 +92,76 @@ public class Merge extends SubCommand { } } } - if (direction == Direction.ALL) { + if (direction == null) { MainUtil.sendMessage(player, Captions.COMMAND_SYNTAX, "/plot merge <" + StringMan.join(values, "|") + "> [removeroads]"); MainUtil.sendMessage(player, Captions.DIRECTION.getTranslated() .replaceAll("%dir%", direction(location.getYaw()))); return false; } + final int size = plot.getConnectedPlots().size(); + int max = Permissions.hasPermissionRange(player, "plots.merge", Settings.Limit.MAX_PLOTS); + PlotMergeEvent event = + PlotSquared.get().getEventDispatcher().callMerge(plot, direction, max, player); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Merge"); + return false; + } + boolean force = event.getEventResult() == Result.FORCE; + direction = event.getDir(); + final int maxSize = event.getMax(); + + if (!force && size - 1 > maxSize) { + MainUtil.sendMessage(player, Captions.NO_PERMISSION, "plots.merge." + (size + 1)); + return false; + } + final PlotArea plotArea = plot.getArea(); + Expression priceExr = plotArea.PRICES.getOrDefault("merge", null); + final double price = priceExr == null ? 0d : priceExr.evaluate((double) size); + + UUID uuid = player.getUUID(); + if (direction == Direction.ALL) { + boolean terrain = true; + if (args.length == 2) { + terrain = "true".equalsIgnoreCase(args[1]); + } + if (!force && !terrain && !Permissions + .hasPermission(player, Captions.PERMISSION_MERGE_KEEP_ROAD)) { + MainUtil.sendMessage(player, Captions.NO_PERMISSION, + Captions.PERMISSION_MERGE_KEEP_ROAD.getTranslated()); + return true; + } + if (plot.autoMerge(Direction.ALL, maxSize, uuid, terrain)) { + if (EconHandler.manager != null && plotArea.USE_ECONOMY && price > 0d) { + EconHandler.manager.withdrawMoney(player, price); + sendMessage(player, Captions.REMOVED_BALANCE, String.valueOf(price)); + } + MainUtil.sendMessage(player, Captions.SUCCESS_MERGE); + return true; + } + MainUtil.sendMessage(player, Captions.NO_AVAILABLE_AUTOMERGE); + return false; + } + if (!force && !plot.isOwner(uuid)) { + if (!Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_MERGE)) { + MainUtil.sendMessage(player, Captions.NO_PLOT_PERMS); + return false; + } else { + uuid = plot.guessOwner(); + } + } + if (!force && EconHandler.manager != null && plotArea.USE_ECONOMY && price > 0d + && EconHandler.manager.getMoney(player) < price) { + sendMessage(player, Captions.CANNOT_AFFORD_MERGE, String.valueOf(price)); + return false; + } final boolean terrain; if (args.length == 2) { terrain = "true".equalsIgnoreCase(args[1]); } else { terrain = true; } - if (!terrain && !Permissions.hasPermission(player, Captions.PERMISSION_MERGE_KEEP_ROAD)) { + if (!force && !terrain && !Permissions.hasPermission(player, Captions.PERMISSION_MERGE_KEEP_ROAD)) { MainUtil.sendMessage(player, Captions.NO_PERMISSION, Captions.PERMISSION_MERGE_KEEP_ROAD.getTranslated()); return true; @@ -164,11 +176,11 @@ public class Merge extends SubCommand { } Plot adjacent = plot.getRelative(direction); if (adjacent == null || !adjacent.hasOwner() || adjacent - .getMerged((direction.getIndex() + 2) % 4) || adjacent.isOwner(uuid)) { + .getMerged((direction.getIndex() + 2) % 4) || (!force && adjacent.isOwner(uuid))) { MainUtil.sendMessage(player, Captions.NO_AVAILABLE_AUTOMERGE); return false; } - if (!Permissions.hasPermission(player, Captions.PERMISSION_MERGE_OTHER)) { + if (!force && !Permissions.hasPermission(player, Captions.PERMISSION_MERGE_OTHER)) { MainUtil.sendMessage(player, Captions.NO_PERMISSION, Captions.PERMISSION_MERGE_OTHER); return false; } @@ -176,7 +188,7 @@ public class Merge extends SubCommand { boolean isOnline = false; for (final UUID owner : uuids) { final PlotPlayer accepter = UUIDHandler.getPlayer(owner); - if (accepter == null) { + if (!force && accepter == null) { continue; } isOnline = true; @@ -190,7 +202,7 @@ public class Merge extends SubCommand { return; } if (EconHandler.manager != null && plotArea.USE_ECONOMY && price > 0d) { - if (EconHandler.manager.getMoney(player) < price) { + if (!force && EconHandler.manager.getMoney(player) < price) { sendMessage(player, Captions.CANNOT_AFFORD_MERGE, String.valueOf(price)); return; } @@ -199,14 +211,14 @@ public class Merge extends SubCommand { } MainUtil.sendMessage(player, Captions.SUCCESS_MERGE); }; - if (hasConfirmation(player)) { + if (!force && hasConfirmation(player)) { CmdConfirm.addPending(accepter, Captions.MERGE_REQUEST_CONFIRM.getTranslated() .replaceAll("%s", player.getName()), run); } else { run.run(); } } - if (!isOnline) { + if (!force && !isOnline) { MainUtil.sendMessage(player, Captions.NO_AVAILABLE_AUTOMERGE); return false; } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Music.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Music.java index 4d712eeba..42e12edb9 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Music.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Music.java @@ -2,13 +2,12 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; import com.github.intellectualsites.plotsquared.plot.config.Captions; -import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagAddEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.MusicFlag; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotInventory; -import com.github.intellectualsites.plotsquared.plot.object.PlotItemStack; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; +import com.github.intellectualsites.plotsquared.plot.object.*; import com.sk89q.worldedit.world.item.ItemTypes; import java.util.Arrays; @@ -45,11 +44,24 @@ public class Music extends SubCommand { return true; } if (item.getType() == ItemTypes.BEDROCK) { - plot.removeFlag(MusicFlag.class); + PlotFlag plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) + .createFlagInstance(item.getType()); + PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(plotFlag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Music removal"); + return true; + } + plot.removeFlag(event.getFlag()); Captions.FLAG_REMOVED.send(player); } else if (item.name.toLowerCase(Locale.ENGLISH).contains("disc")) { - plot.setFlag(GlobalFlagContainer.getInstance().getFlag(MusicFlag.class) - .createFlagInstance(item.getType())); + PlotFlag plotFlag = plot.getFlagContainer().getFlag(MusicFlag.class) + .createFlagInstance(item.getType()); + PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, plot); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Music addition"); + return true; + } + plot.setFlag(event.getFlag()); Captions.FLAG_ADDED.send(player); } else { Captions.FLAG_NOT_ADDED.send(player); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Owner.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Owner.java index 41f340ea1..e0baa49ef 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Owner.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Owner.java @@ -1,15 +1,15 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotChangeOwnerEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotUnlinkEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.util.CmdConfirm; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.Permissions; -import com.github.intellectualsites.plotsquared.plot.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; +import com.github.intellectualsites.plotsquared.plot.util.*; import java.util.Set; import java.util.UUID; @@ -31,43 +31,61 @@ public class Owner extends SetCommand { } Set plots = plot.getConnectedPlots(); UUID uuid = null; - String name = null; + String name; if (value.length() == 36) { try { uuid = UUID.fromString(value); - name = MainUtil.getName(uuid); } catch (Exception ignored) { } } else { uuid = UUIDHandler.getUUID(value, null); - name = uuid == null ? value : UUIDHandler.getName(uuid); - name = name == null ? value : name; } - if (uuid == null || value.equalsIgnoreCase("-")) { - if (value.equalsIgnoreCase("none") || value.equalsIgnoreCase("null") || value - .equalsIgnoreCase("-")) { - if (!Permissions.hasPermission(player, - Captions.PERMISSION_ADMIN_COMMAND_SET_OWNER.getTranslated(), true)) { - return false; - } - Set connected = plot.getConnectedPlots(); - plot.unlinkPlot(false, false); - for (Plot current : connected) { - current.unclaim(); - current.removeSign(); - } - MainUtil.sendMessage(player, Captions.SET_OWNER); - return true; - } + if (uuid == null) { Captions.INVALID_PLAYER.send(player, value); return false; } + if (value.equalsIgnoreCase("none") || value.equalsIgnoreCase("null") || value + .equalsIgnoreCase("-")) { + uuid = null; + } + PlotChangeOwnerEvent event = PlotSquared.get().getEventDispatcher() + .callOwnerChange(player, plot, plot.hasOwner() ? plot.owner : null, uuid, + plot.hasOwner()); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Owner change"); + return false; + } + uuid = event.getNewOwner(); + name = uuid == null ? value : UUIDHandler.getName(uuid); + boolean force = event.getEventResult() == Result.FORCE; + if (uuid == null) { + if (!force && !Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_SET_OWNER.getTranslated(), + true)) { + return false; + } + PlotUnlinkEvent unlinkEvent = PlotSquared.get().getEventDispatcher() + .callUnlink(plot.getArea(), plot, false, false, PlotUnlinkEvent.REASON.NEW_OWNER); + if (unlinkEvent.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Unlink on owner change"); + return true; + } + plot.unlinkPlot(unlinkEvent.isCreateRoad(), unlinkEvent.isCreateRoad()); + Set connected = plot.getConnectedPlots(); + for (Plot current : connected) { + current.unclaim(); + current.removeSign(); + } + MainUtil.sendMessage(player, Captions.SET_OWNER); + return true; + } final PlotPlayer other = UUIDHandler.getPlayer(uuid); if (plot.isOwner(uuid)) { Captions.ALREADY_OWNER.send(player, MainUtil.getName(uuid)); return false; } - if (!Permissions.hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_SET_OWNER)) { + if (!force && !Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_SET_OWNER)) { if (other == null) { Captions.INVALID_PLAYER_OFFLINE.send(player, value); return false; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Rate.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Rate.java index e1c17b80d..88f455e7d 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Rate.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Rate.java @@ -6,6 +6,7 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; +import com.github.intellectualsites.plotsquared.plot.events.PlotRateEvent; import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotInventory; @@ -13,7 +14,6 @@ import com.github.intellectualsites.plotsquared.plot.object.PlotItemStack; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.Rating; import com.github.intellectualsites.plotsquared.plot.object.TeleportCause; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.Permissions; @@ -117,10 +117,10 @@ public class Rate extends SubCommand { index.increment(); if (index.getValue() >= Settings.Ratings.CATEGORIES.size()) { int rV = rating.getValue(); - Rating result = - EventUtil.manager.callRating(this.player, plot, new Rating(rV)); - if (result != null) { - plot.addRating(this.player.getUUID(), result); + PlotRateEvent event = + PlotSquared.get().getEventDispatcher().callRating(this.player, plot, new Rating(rV)); + if (event.getRating() != null) { + plot.addRating(this.player.getUUID(), event.getRating()); sendMessage(this.player, Captions.RATING_APPLIED, plot.getId().toString()); if (Permissions @@ -186,9 +186,9 @@ public class Rate extends SubCommand { sendMessage(player, Captions.RATING_ALREADY_EXISTS, plot.getId().toString()); return; } - Rating result = EventUtil.manager.callRating(player, plot, new Rating(rating)); - if (result != null) { - plot.addRating(uuid, result); + PlotRateEvent event = PlotSquared.get().getEventDispatcher().callRating(player, plot, new Rating(rating)); + if (event.getRating() != null) { + plot.addRating(uuid, event.getRating()); sendMessage(player, Captions.RATING_APPLIED, plot.getId().toString()); } }; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Remove.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Remove.java index f20d63a92..28e0789d7 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Remove.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Remove.java @@ -2,12 +2,12 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.Argument; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; @@ -72,28 +72,29 @@ public class Remove extends SubCommand { for (UUID uuid : uuids) { if (plot.getTrusted().contains(uuid)) { if (plot.removeTrusted(uuid)) { - EventUtil.manager.callTrusted(player, plot, uuid, false); + PlotSquared + .get().getEventDispatcher().callTrusted(player, plot, uuid, false); count++; } } else if (plot.getMembers().contains(uuid)) { if (plot.removeMember(uuid)) { - EventUtil.manager.callMember(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callMember(player, plot, uuid, false); count++; } } else if (plot.getDenied().contains(uuid)) { if (plot.removeDenied(uuid)) { - EventUtil.manager.callDenied(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callDenied(player, plot, uuid, false); count++; } } else if (uuid == DBFunc.EVERYONE) { if (plot.removeTrusted(uuid)) { - EventUtil.manager.callTrusted(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callTrusted(player, plot, uuid, false); count++; } else if (plot.removeMember(uuid)) { - EventUtil.manager.callMember(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callMember(player, plot, uuid, false); count++; } else if (plot.removeDenied(uuid)) { - EventUtil.manager.callDenied(player, plot, uuid, false); + PlotSquared.get().getEventDispatcher().callDenied(player, plot, uuid, false); count++; } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java index 7acb0cf1f..beb6af5ff 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java @@ -2,13 +2,13 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.Command; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; @@ -81,7 +81,7 @@ public class Trust extends Command { } } currentPlot.addTrusted(uuid); - EventUtil.manager.callTrusted(player, currentPlot, uuid, true); + PlotSquared.get().getEventDispatcher().callTrusted(player, currentPlot, uuid, true); MainUtil.sendMessage(player, Captions.TRUSTED_ADDED); } }, null); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Unlink.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Unlink.java index b66f17eff..1f2fde14b 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Unlink.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Unlink.java @@ -1,7 +1,10 @@ package com.github.intellectualsites.plotsquared.plot.commands; import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; +import com.github.intellectualsites.plotsquared.plot.events.PlotUnlinkEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; @@ -29,10 +32,6 @@ public class Unlink extends SubCommand { if (!plot.hasOwner()) { return !sendMessage(player, Captions.PLOT_UNOWNED); } - if (!plot.isOwner(player.getUUID()) && !Permissions - .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_UNLINK)) { - return sendMessage(player, Captions.NO_PLOT_PERMS); - } if (!plot.isMerged()) { return sendMessage(player, Captions.UNLINK_IMPOSSIBLE); } @@ -46,6 +45,19 @@ public class Unlink extends SubCommand { } else { createRoad = true; } + + PlotUnlinkEvent event = PlotSquared.get().getEventDispatcher() + .callUnlink(plot.getArea(), plot, createRoad, createRoad, + PlotUnlinkEvent.REASON.PLAYER_COMMAND); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Unlink"); + return true; + } + boolean force = event.getEventResult() == Result.FORCE; + if (!force && !plot.isOwner(player.getUUID()) && !Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_UNLINK)) { + return sendMessage(player, Captions.NO_PLOT_PERMS); + } Runnable runnable = () -> { if (!plot.unlinkPlot(createRoad, createRoad)) { MainUtil.sendMessage(player, Captions.UNMERGE_CANCELLED); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/Captions.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/Captions.java index 7bd22112f..7ba027a29 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/Captions.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/config/Captions.java @@ -716,6 +716,10 @@ public enum Captions implements Caption { GRANTED_PLOT_FAILED("$1Grant failed: $2%s", "Grants"), // + // + EVENT_DENIED("$1%s $2Cancelled by external plugin.", "Events"), + // + /** * Legacy Configuration Conversion */ diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/CancellablePlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/CancellablePlotEvent.java new file mode 100644 index 000000000..15616edaa --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/CancellablePlotEvent.java @@ -0,0 +1,16 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +/** + * PlotSquared event with {@link Result} to cancel, force, or allow. + */ +public interface CancellablePlotEvent { + + Result getEventResult(); + + void setEventResult(Result eventResult); + + default int getEventResultRaw() { + return getEventResult().getValue(); + } + +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerAutoPlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerAutoPlotEvent.java new file mode 100644 index 000000000..a82647408 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerAutoPlotEvent.java @@ -0,0 +1,61 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.PlotArea; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; +import lombok.Getter; +import lombok.Setter; + +import javax.annotation.Nullable; + +public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEvent { + + private Result eventResult; + private String schematic; + @Getter private PlotPlayer player; + @Getter private PlotArea plotArea; + @Getter @Setter private int size_x; + @Getter @Setter private int size_z; + + /** + * PlayerAutoPlotEvent: called when a player attempts to auto claim a plot. + * + * @param player The player attempting to auto claim + * @param plotArea The applicable plot area + * @param schematic The schematic defined or null + * @param size_x The size of the auto area + * @param size_z The size of the auto area + */ + public PlayerAutoPlotEvent(PlotPlayer player, PlotArea plotArea, @Nullable String schematic, + int size_x, int size_z) { + super(null); + this.player = player; + this.plotArea = plotArea; + this.schematic = schematic; + this.size_x = size_x; + this.size_z = size_z; + } + + /** + * Obtain the schematic string as used by the {@link com.github.intellectualsites.plotsquared.plot.commands.Claim} command or null. + * + * @return schematic string + */ + @Nullable public String getSchematic() { + return this.schematic; + } + + /** + * Set the schematic string used in the claim. + */ + public void setSchematic(String schematic) { + this.schematic = schematic; + } + + @Override public Result getEventResult() { + return eventResult; + } + + @Override public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerClaimPlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerClaimPlotEvent.java new file mode 100644 index 000000000..9a2f409ef --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerClaimPlotEvent.java @@ -0,0 +1,48 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; + +import javax.annotation.Nullable; + +public class PlayerClaimPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent { + + private Result eventResult; + private String schematic; + + /** + * PlayerClaimPlotEvent: Called when a plot is claimed. + * + * @param player Player that claimed the plot + * @param plot Plot that was claimed + * @param schematic The schematic defined or null + */ + public PlayerClaimPlotEvent(PlotPlayer player, Plot plot, @Nullable String schematic) { + super(player, plot); + this.schematic = schematic; + } + + /** + * Obtain the schematic string as used by the {@link com.github.intellectualsites.plotsquared.plot.commands.Claim} command or null. + * + * @return schematic string + */ + @Nullable public String getSchematic() { + return this.schematic; + } + + /** + * Set the schematic string used in the claim. + */ + public void setSchematic(String schematic) { + this.schematic = schematic; + } + + @Override public Result getEventResult() { + return eventResult; + } + + @Override public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerEnterPlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerEnterPlotEvent.java new file mode 100644 index 000000000..3f90cd9ee --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerEnterPlotEvent.java @@ -0,0 +1,17 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; + +public class PlayerEnterPlotEvent extends PlotPlayerEvent { + + /** + * Called when a player leaves a plot. + * + * @param player Player that entered the plot + * @param plot Plot that was entered + */ + public PlayerEnterPlotEvent(PlotPlayer player, Plot plot) { + super(player, plot); + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerLeavePlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerLeavePlotEvent.java new file mode 100644 index 000000000..f2ff8185a --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerLeavePlotEvent.java @@ -0,0 +1,20 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; + +/** + * + */ +public class PlayerLeavePlotEvent extends PlotPlayerEvent { + + /** + * PlayerLeavePlotEvent: Called when a player leaves a plot + * + * @param player Player that left the plot + * @param plot Plot that was left + */ + public PlayerLeavePlotEvent(PlotPlayer player, Plot plot) { + super(player, plot); + } +} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotDeniedEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotDeniedEvent.java similarity index 66% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotDeniedEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotDeniedEvent.java index c9c4d56b9..1f497dabc 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotDeniedEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotDeniedEvent.java @@ -1,15 +1,13 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import java.util.UUID; public class PlayerPlotDeniedEvent extends PlotEvent { - private static final HandlerList handlers = new HandlerList(); - private final Player initiator; + private final PlotPlayer initiator; private final boolean added; private final UUID player; @@ -21,17 +19,13 @@ public class PlayerPlotDeniedEvent extends PlotEvent { * @param player Player that was denied/un-denied * @param added true of add to deny list, false if removed */ - public PlayerPlotDeniedEvent(Player initiator, Plot plot, UUID player, boolean added) { + public PlayerPlotDeniedEvent(PlotPlayer initiator, Plot plot, UUID player, boolean added) { super(plot); this.initiator = initiator; this.added = added; this.player = player; } - public static HandlerList getHandlerList() { - return handlers; - } - /** * If a user was added. * @@ -53,13 +47,9 @@ public class PlayerPlotDeniedEvent extends PlotEvent { /** * The player initiating the action. * - * @return Player + * @return PlotPlayer */ - public Player getInitiator() { + public PlotPlayer getInitiator() { return this.initiator; } - - @Override public HandlerList getHandlers() { - return handlers; - } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotHelperEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotHelperEvent.java similarity index 66% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotHelperEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotHelperEvent.java index 573d53ea8..319d350ff 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotHelperEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotHelperEvent.java @@ -1,8 +1,7 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import java.util.UUID; @@ -11,8 +10,7 @@ import java.util.UUID; */ public class PlayerPlotHelperEvent extends PlotEvent { - private static final HandlerList handlers = new HandlerList(); - private final Player initiator; + private final PlotPlayer initiator; private final boolean added; private final UUID player; @@ -24,17 +22,13 @@ public class PlayerPlotHelperEvent extends PlotEvent { * @param player Player that was added/removed from the helper list * @param added true of the player was added, false if the player was removed */ - public PlayerPlotHelperEvent(Player initiator, Plot plot, UUID player, boolean added) { + public PlayerPlotHelperEvent(PlotPlayer initiator, Plot plot, UUID player, boolean added) { super(plot); this.initiator = initiator; this.added = added; this.player = player; } - public static HandlerList getHandlerList() { - return handlers; - } - /** * If a player was added * @@ -56,13 +50,10 @@ public class PlayerPlotHelperEvent extends PlotEvent { /** * The player initiating the action * - * @return Player + * @return PlotPlayer */ - public Player getInitiator() { + public PlotPlayer getInitiator() { return this.initiator; } - @Override public HandlerList getHandlers() { - return handlers; - } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotTrustedEvent.java similarity index 66% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotTrustedEvent.java index f2f9efe71..bce50a6e1 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerPlotTrustedEvent.java @@ -1,15 +1,13 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import java.util.UUID; public class PlayerPlotTrustedEvent extends PlotEvent { - private static final HandlerList handlers = new HandlerList(); - private final Player initiator; + private final PlotPlayer initiator; private final boolean added; private final UUID player; @@ -21,17 +19,13 @@ public class PlayerPlotTrustedEvent extends PlotEvent { * @param player Player that was added/removed from the trusted list * @param added true of the player was added, false if the player was removed */ - public PlayerPlotTrustedEvent(Player initiator, Plot plot, UUID player, boolean added) { + public PlayerPlotTrustedEvent(PlotPlayer initiator, Plot plot, UUID player, boolean added) { super(plot); this.initiator = initiator; this.added = added; this.player = player; } - public static HandlerList getHandlerList() { - return handlers; - } - /** * If a player was added * @@ -53,13 +47,9 @@ public class PlayerPlotTrustedEvent extends PlotEvent { /** * The player initiating the action * - * @return Player + * @return PlotPlayer */ - public Player getInitiator() { + public PlotPlayer getInitiator() { return this.initiator; } - - @Override public HandlerList getHandlers() { - return handlers; - } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerTeleportToPlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerTeleportToPlotEvent.java new file mode 100644 index 000000000..c5dbf5798 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlayerTeleportToPlotEvent.java @@ -0,0 +1,45 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Location; +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; + +/** + * Called when a player teleports to a plot + */ +public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent { + + private final Location from; + private Result eventResult; + + /** + * PlayerTeleportToPlotEvent: Called when a player teleports to a plot + * + * @param player That was teleported + * @param from Start location + * @param plot Plot to which the player was teleported + */ + public PlayerTeleportToPlotEvent(PlotPlayer player, Location from, Plot plot) { + super(player, plot); + this.from = from; + } + + /** + * Get the from location + * + * @return Location + */ + public Location getFrom() { + return this.from; + } + + @Override + public Result getEventResult() { + return eventResult; + } + + @Override + public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotAutoMergeEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotAutoMergeEvent.java similarity index 64% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotAutoMergeEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotAutoMergeEvent.java index 059b296cf..009e7bcff 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotAutoMergeEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotAutoMergeEvent.java @@ -1,12 +1,8 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotId; import lombok.Getter; -import lombok.Setter; -import org.bukkit.World; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -16,12 +12,11 @@ import java.util.List; * Event called when plots are automatically merged with /plot auto * {@inheritDoc} */ -public final class PlotAutoMergeEvent extends PlotEvent implements Cancellable { +public final class PlotAutoMergeEvent extends PlotEvent implements CancellablePlotEvent { - private static final HandlerList handlers = new HandlerList(); private final List plots; - @Getter private final World world; - @Getter @Setter private boolean cancelled; + @Getter private final String world; + private Result eventResult; /** * PlotAutoMergeEvent: Called when plots are automatically merged with /plot auto @@ -30,17 +25,12 @@ public final class PlotAutoMergeEvent extends PlotEvent implements Cancellable { * @param plot Plot that was merged * @param plots A list of plots involved in the event */ - public PlotAutoMergeEvent(@NotNull final World world, @NotNull final Plot plot, + public PlotAutoMergeEvent(@NotNull final String world, @NotNull final Plot plot, @NotNull final List plots) { super(plot); this.world = world; this.plots = plots; } - - public static HandlerList getHandlerList() { - return handlers; - } - /** * Get the plots being added. * @@ -50,7 +40,13 @@ public final class PlotAutoMergeEvent extends PlotEvent implements Cancellable { return Collections.unmodifiableList(this.plots); } - @Override public HandlerList getHandlers() { - return handlers; + @Override + public Result getEventResult() { + return eventResult; + } + + @Override + public void setEventResult(Result e) { + this.eventResult = e; } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotChangeOwnerEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotChangeOwnerEvent.java similarity index 53% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotChangeOwnerEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotChangeOwnerEvent.java index 3fba03284..73fe1fd35 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotChangeOwnerEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotChangeOwnerEvent.java @@ -1,31 +1,31 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; +import org.jetbrains.annotations.Nullable; import java.util.UUID; -public class PlotChangeOwnerEvent extends PlotEvent implements Cancellable { +public class PlotChangeOwnerEvent extends PlotEvent implements CancellablePlotEvent { - private static final HandlerList handlers = new HandlerList(); - private final Player initiator; - private final UUID newOwner; - private final UUID oldOwner; + private final PlotPlayer initiator; + @Nullable private final UUID oldOwner; + @Nullable private UUID newOwner; private boolean hasOldOwner; - private boolean cancelled; + private Result eventResult; /** * PlotChangeOwnerEvent: Called when a plot's owner is change. * - * @param newOwner The new owner of the plot - * @param oldOwner The old owner of the plot - * @param plot The plot having its owner changed + * @param initiator The player attempting to set the plot's owner + * @param plot The plot having its owner changed + * @param oldOwner The old owner of the plot or null + * @param newOwner The new owner of the plot or null + * @param hasOldOwner If the plot has an old owner */ - public PlotChangeOwnerEvent(Player initiator, Plot plot, UUID oldOwner, UUID newOwner, - boolean hasOldOwner) { + public PlotChangeOwnerEvent(PlotPlayer initiator, Plot plot, @Nullable UUID oldOwner, + @Nullable UUID newOwner, boolean hasOldOwner) { super(plot); this.initiator = initiator; this.newOwner = newOwner; @@ -33,10 +33,6 @@ public class PlotChangeOwnerEvent extends PlotEvent implements Cancellable { this.hasOldOwner = hasOldOwner; } - public static HandlerList getHandlerList() { - return handlers; - } - /** * Get the PlotId. * @@ -60,7 +56,7 @@ public class PlotChangeOwnerEvent extends PlotEvent implements Cancellable { * * @return Player */ - public Player getInitiator() { + public PlotPlayer getInitiator() { return this.initiator; } @@ -69,7 +65,7 @@ public class PlotChangeOwnerEvent extends PlotEvent implements Cancellable { * * @return UUID */ - public UUID getOldOwner() { + @Nullable public UUID getOldOwner() { return this.oldOwner; } @@ -78,10 +74,20 @@ public class PlotChangeOwnerEvent extends PlotEvent implements Cancellable { * * @return UUID */ - public UUID getNewOwner() { + @Nullable public UUID getNewOwner() { return this.newOwner; } + + /** + * Set the new owner of the plot. Null for no owner. + * + * @param newOwner the new owner or null + */ + public void setNewOwner(@Nullable UUID newOwner) { + this.newOwner = newOwner; + } + /** * Get if the plot had an old owner * @@ -91,15 +97,11 @@ public class PlotChangeOwnerEvent extends PlotEvent implements Cancellable { return this.hasOldOwner; } - @Override public HandlerList getHandlers() { - return handlers; + @Override public Result getEventResult() { + return eventResult; } - @Override public boolean isCancelled() { - return this.cancelled; - } - - @Override public void setCancelled(boolean b) { - this.cancelled = b; + @Override public void setEventResult(Result e) { + this.eventResult = e; } } diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotClearEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotClearEvent.java similarity index 52% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotClearEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotClearEvent.java index b4ab469a2..0b2ecab1c 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotClearEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotClearEvent.java @@ -1,26 +1,19 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; /** * Called when a plot is cleared */ -public class PlotClearEvent extends PlotEvent implements Cancellable { +public class PlotClearEvent extends PlotEvent implements CancellablePlotEvent { - private static final HandlerList handlers = new HandlerList(); - private boolean cancelled; + private Result eventResult; public PlotClearEvent(Plot plot) { super(plot); } - public static HandlerList getHandlerList() { - return handlers; - } - /** * Get the PlotId. * @@ -39,15 +32,13 @@ public class PlotClearEvent extends PlotEvent implements Cancellable { return getPlot().getWorldName(); } - @Override public HandlerList getHandlers() { - return handlers; + @Override + public Result getEventResult() { + return eventResult; } - @Override public boolean isCancelled() { - return this.cancelled; - } - - @Override public void setCancelled(boolean b) { - this.cancelled = b; + @Override + public void setEventResult(Result e) { + this.eventResult = e; } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotComponentSetEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotComponentSetEvent.java new file mode 100644 index 000000000..a87595ad6 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotComponentSetEvent.java @@ -0,0 +1,82 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotId; +import com.sk89q.worldedit.function.pattern.Pattern; + +/** + * Called when a plot component is set + */ +public class PlotComponentSetEvent extends PlotEvent { + + private String component; + private Pattern pattern; + + /** + * PlotComponentSetEvent: Called when a player attempts to set the component of a plot (e.g. walls) + * + * @param plot The plot having its component set + * @param component The component being set + * @param pattern The pattern the component is being set to + */ + public PlotComponentSetEvent(Plot plot, String component, Pattern pattern) { + super(plot); + this.component = component; + this.pattern = pattern; + } + + /** + * Get the PlotId + * + * @return PlotId + */ + public PlotId getPlotId() { + return getPlot().getId(); + } + + /** + * Get the world name + * + * @return String + */ + public String getWorld() { + return getPlot().getWorldName(); + } + + /** + * Get the component which was set + * + * @return Component name + */ + public String getComponent() { + return this.component; + } + + /** + * Change the component being set + * + * @param component the component to set + */ + public void setComponent(String component) { + this.component = component; + } + + /** + * Get the pattern being set + * + * @return Pattern + */ + public Pattern getPattern() { + return this.pattern; + } + + /** + * Change the pattern being set + * + * @param pattern the pattern to set + */ + public void setPattern(Pattern pattern) { + this.pattern = pattern; + } + +} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotDeleteEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotDeleteEvent.java similarity index 52% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotDeleteEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotDeleteEvent.java index 5199496ff..084bdc34c 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotDeleteEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotDeleteEvent.java @@ -1,26 +1,19 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; /** * Called when a plot is deleted */ -public class PlotDeleteEvent extends PlotEvent implements Cancellable { +public class PlotDeleteEvent extends PlotEvent implements CancellablePlotEvent { - private static final HandlerList handlers = new HandlerList(); - private boolean cancelled; + private Result eventResult; public PlotDeleteEvent(Plot plot) { super(plot); } - public static HandlerList getHandlerList() { - return handlers; - } - /** * Get the PlotId. * @@ -39,15 +32,13 @@ public class PlotDeleteEvent extends PlotEvent implements Cancellable { return getPlot().getWorldName(); } - @Override public HandlerList getHandlers() { - return handlers; + @Override + public Result getEventResult() { + return eventResult; } - @Override public boolean isCancelled() { - return this.cancelled; - } - - @Override public void setCancelled(boolean b) { - this.cancelled = b; + @Override + public void setEventResult(Result e) { + this.eventResult = e; } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotDoneEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotDoneEvent.java new file mode 100644 index 000000000..1a1155ab2 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotDoneEvent.java @@ -0,0 +1,47 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotId; + +/** + * Called when a plot is cleared + */ +public class PlotDoneEvent extends PlotEvent implements CancellablePlotEvent { + + private Result eventResult; + + /** + * PlotDoneEvent: Called when a plot is being set as done + * + * @param plot The plot being set as done + */ + public PlotDoneEvent(Plot plot) { + super(plot); + } + + /** + * Get the PlotId. + * + * @return PlotId + */ + public PlotId getPlotId() { + return getPlot().getId(); + } + + /** + * Get the world name. + * + * @return String + */ + public String getWorld() { + return getPlot().getWorldName(); + } + + @Override public Result getEventResult() { + return eventResult; + } + + @Override public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotEvent.java new file mode 100644 index 000000000..ea37cd010 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotEvent.java @@ -0,0 +1,39 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +public abstract class PlotEvent { + + private final Plot plot; + private String name; + + public PlotEvent(Plot plot) { + this.plot = plot; + } + + /** + * Obtain the plot involved in the event + * + * @return Plot + */ + public final Plot getPlot() { + return this.plot; + } + + /** + * Obtain the event's class name + * + * @return the event class name + */ + @NotNull public String getEventName() { + if (name == null) { + name = getClass().getSimpleName(); + } + return name; + } + +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagAddEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagAddEvent.java new file mode 100644 index 000000000..180d28ff7 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagAddEvent.java @@ -0,0 +1,32 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; +import com.github.intellectualsites.plotsquared.plot.object.Plot; + +/** + * Called when a Flag is added to a plot. + */ +public class PlotFlagAddEvent extends PlotFlagEvent implements CancellablePlotEvent { + + private Result eventResult; + + /** + * PlotFlagAddEvent: Called when a Flag is added to a plot. + * + * @param flag Flag that was added + * @param plot Plot to which the flag was added + */ + public PlotFlagAddEvent(PlotFlag flag, Plot plot) { + super(plot, flag); + } + + @Override + public Result getEventResult() { + return eventResult; + } + + @Override + public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagEvent.java similarity index 88% rename from Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagEvent.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagEvent.java index 424349239..63eee217b 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlotFlagEvent.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagEvent.java @@ -1,4 +1,4 @@ -package com.github.intellectualsites.plotsquared.bukkit.events; +package com.github.intellectualsites.plotsquared.plot.events; import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.object.Plot; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagRemoveEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagRemoveEvent.java new file mode 100644 index 000000000..d5f62b980 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotFlagRemoveEvent.java @@ -0,0 +1,32 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; +import com.github.intellectualsites.plotsquared.plot.object.Plot; + +/** + * Called when a flag is removed from a plot + */ +public class PlotFlagRemoveEvent extends PlotFlagEvent implements CancellablePlotEvent { + + private Result eventResult; + + /** + * PlotFlagRemoveEvent: Called when a flag is removed from a plot + * + * @param flag Flag that was removed + * @param plot Plot from which the flag was removed + */ + public PlotFlagRemoveEvent(PlotFlag flag, Plot plot) { + super(plot, flag); + } + + @Override + public Result getEventResult() { + return eventResult; + } + + @Override + public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotMergeEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotMergeEvent.java new file mode 100644 index 000000000..4fe04ec6e --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotMergeEvent.java @@ -0,0 +1,48 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Direction; +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +/** + * Event called when several plots are merged + * {@inheritDoc} + */ +public final class PlotMergeEvent extends PlotPlayerEvent implements CancellablePlotEvent { + + @Getter private final String world; + @Getter @Setter private Direction dir; + @Getter @Setter private int max; + private Result eventResult; + @Getter private PlotPlayer player; + + /** + * PlotMergeEvent: Called when plots are merged + * + * @param world World in which the event occurred + * @param plot Plot that was merged + * @param dir The direction of the merge + * @param max Max merge size + * @param player The player attempting the merge + */ + public PlotMergeEvent(@NotNull final String world, @NotNull final Plot plot, + @NotNull final Direction dir, final int max, PlotPlayer player) { + super(player, plot); + this.world = world; + this.dir = dir; + this.max = max; + this.player = player; + } + + + @Override public Result getEventResult() { + return eventResult; + } + + @Override public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotPlayerEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotPlayerEvent.java new file mode 100644 index 000000000..50938d58d --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotPlayerEvent.java @@ -0,0 +1,19 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; + +public abstract class PlotPlayerEvent extends PlotEvent { + + private final PlotPlayer plotPlayer; + + public PlotPlayerEvent(PlotPlayer plotPlayer, Plot plot) { + super(plot); + this.plotPlayer = plotPlayer; + } + + public PlotPlayer getPlotPlayer() { + return this.plotPlayer; + } + +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotRateEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotRateEvent.java new file mode 100644 index 000000000..6626220f2 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotRateEvent.java @@ -0,0 +1,46 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; +import com.github.intellectualsites.plotsquared.plot.object.Rating; +import org.jetbrains.annotations.Nullable; + +public class PlotRateEvent extends PlotEvent implements CancellablePlotEvent { + + private final PlotPlayer rater; + @Nullable private Rating rating; + private Result eventResult; + + /** + * PlotRateEvent: Called when a player rates a plot + * + * @param rater The player rating the plot + * @param rating The rating being given + * @param plot The plot being rated + */ + public PlotRateEvent(PlotPlayer rater, @Nullable Rating rating, Plot plot) { + super(plot); + this.rater = rater; + this.rating = rating; + } + + public PlotPlayer getRater() { + return this.rater; + } + + @Nullable public Rating getRating() { + return this.rating; + } + + public void setRating(@Nullable Rating rating) { + this.rating = rating; + } + + @Override public Result getEventResult() { + return eventResult; + } + + @Override public void setEventResult(Result e) { + this.eventResult = e; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotUnlinkEvent.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotUnlinkEvent.java new file mode 100644 index 000000000..03e5efeff --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/PlotUnlinkEvent.java @@ -0,0 +1,50 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotArea; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +/** + * Event called when several merged plots are unlinked + * {@inheritDoc} + */ +public final class PlotUnlinkEvent extends PlotEvent implements CancellablePlotEvent { + + @Getter private final PlotArea area; + @Getter @Setter boolean createRoad; + @Getter @Setter boolean createSign; + @Getter REASON reason; + private Result eventResult = Result.ACCEPT; + + /** + * PlotUnlinkEvent: Called when a mega plot is unlinked + * + * @param area The applicable plot area + * @param plot The plot being unlinked from + * @param createRoad Whether to regenerate the road + * @param createSign Whether to regenerate signs + * @param reason The {@link REASON} for the unlink + */ + public PlotUnlinkEvent(@NotNull final PlotArea area, Plot plot, boolean createRoad, + boolean createSign, REASON reason) { + super(plot); + this.area = area; + this.createRoad = createRoad; + this.createSign = createSign; + this.reason = reason; + } + + @Override public Result getEventResult() { + return eventResult; + } + + @Override public void setEventResult(Result e) { + this.eventResult = e; + } + + public enum REASON { + NEW_OWNER, PLAYER_COMMAND, CLEAR, DELETE, EXPIRE_DELETE + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/Result.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/Result.java new file mode 100644 index 000000000..78ae8d964 --- /dev/null +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/events/Result.java @@ -0,0 +1,50 @@ +package com.github.intellectualsites.plotsquared.plot.events; + +import java.util.HashMap; +import java.util.Map; + +/** + * Enum for {@link CancellablePlotEvent}. + *

+ * DENY: do not allow the event to happen + * ALLOW: allow the event to continue as normal, subject to standard checks + * FORCE: force the event to occur, even if normal checks would deny. + * WARNING: this may have unintended consequences! Make sure you study the appropriate code before using! + */ +public enum Result { + + DENY(0), ACCEPT(1), FORCE(2); + + private static Map map = new HashMap<>(); + + static { + for (Result eventResult : Result.values()) { + map.put(eventResult.value, eventResult); + } + } + + private int value; + + Result(int value) { + this.value = value; + } + + /** + * Obtain the Result enum associated with the int value + * + * @param eventResult the int value + * @return the corresponding Result + */ + public static Result valueOf(int eventResult) { + return map.get(eventResult); + } + + /** + * Get int value of enum + * + * @return integer value + */ + public int getValue() { + return value; + } +} diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java index ab2ee6199..8cd3f12c5 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/generator/HybridUtils.java @@ -2,7 +2,10 @@ package com.github.intellectualsites.plotsquared.plot.generator; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagAddEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.AnalysisFlag; import com.github.intellectualsites.plotsquared.plot.listener.WEExtent; import com.github.intellectualsites.plotsquared.plot.object.Location; @@ -288,7 +291,14 @@ public abstract class HybridUtils { result.add(whenDone.value.data_sd); result.add(whenDone.value.air_sd); result.add(whenDone.value.variety_sd); - origin.setFlag(GlobalFlagContainer.getInstance().getFlag(AnalysisFlag.class).createFlagInstance(result)); + PlotFlag plotFlag = + GlobalFlagContainer.getInstance().getFlag(AnalysisFlag.class) + .createFlagInstance(result); + PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, origin); + if (event.getEventResult() == Result.DENY) { + return; + } + origin.setFlag(event.getFlag()); TaskManager.runTask(whenDone); return; } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/PlotListener.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/PlotListener.java index 98c76a6e2..0cc4251ed 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/PlotListener.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/listener/PlotListener.java @@ -1,33 +1,20 @@ package com.github.intellectualsites.plotsquared.plot.listener; +import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.DenyExitFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.FarewellFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.FlightFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.GamemodeFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.GreetingFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.GuestGamemodeFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MusicFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.NotifyEnterFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.NotifyLeaveFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.WeatherFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.TimeFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.TitlesFlag; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagRemoveEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; +import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; +import com.github.intellectualsites.plotsquared.plot.flags.implementations.*; +import com.github.intellectualsites.plotsquared.plot.flags.types.TimedFlag; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotArea; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; -import com.github.intellectualsites.plotsquared.plot.util.ByteArrayUtilities; -import com.github.intellectualsites.plotsquared.plot.util.CommentManager; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.Permissions; -import com.github.intellectualsites.plotsquared.plot.util.PlotWeather; -import com.github.intellectualsites.plotsquared.plot.util.StringMan; -import com.github.intellectualsites.plotsquared.plot.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; +import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.expiry.ExpireManager; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -35,11 +22,60 @@ import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.UUID; public class PlotListener { + private static final HashMap feedRunnable = new HashMap<>(); + private static final HashMap healRunnable = new HashMap<>(); + + public static void startRunnable() { + TaskManager.runTaskRepeat(() -> { + if (!healRunnable.isEmpty()) { + for (Iterator> iterator = + healRunnable.entrySet().iterator(); iterator.hasNext(); ) { + Map.Entry entry = iterator.next(); + Interval value = entry.getValue(); + ++value.count; + if (value.count == value.interval) { + value.count = 0; + PlotPlayer player = WorldUtil.IMP.wrapPlayer(entry.getKey()); + if (player == null) { + iterator.remove(); + continue; + } + double level = WorldUtil.IMP.getHealth(player); + if (level != value.max) { + WorldUtil.IMP.setHealth(player, Math.min(level + value.amount, value.max)); + } + } + } + } + if (!feedRunnable.isEmpty()) { + for (Iterator> iterator = + feedRunnable.entrySet().iterator(); iterator.hasNext(); ) { + Map.Entry entry = iterator.next(); + Interval value = entry.getValue(); + ++value.count; + if (value.count == value.interval) { + value.count = 0; + PlotPlayer player = WorldUtil.IMP.wrapPlayer(entry.getKey()); + if (player == null) { + iterator.remove(); + continue; + } + int level = WorldUtil.IMP.getFoodLevel(player); + if (level != value.max) { + WorldUtil.IMP.setFoodLevel(player, Math.min(level + value.amount, value.max)); + } + } + } + } + }, 20); + } + public static boolean plotEntry(final PlotPlayer player, final Plot plot) { if (plot.isDenied(player.getUUID()) && !Permissions .hasPermission(player, "plots.admin.entry.denied")) { @@ -53,7 +89,7 @@ public class PlotListener { ExpireManager.IMP.handleEntry(player, plot); } player.setMeta(PlotPlayer.META_LAST_PLOT, plot); - EventUtil.manager.callEntry(player, plot); + PlotSquared.get().getEventDispatcher().callEntry(player, plot); if (plot.hasOwner()) { // This will inherit values from PlotArea final TitlesFlag.TitlesFlagValue titleFlag = plot.getFlag(TitlesFlag.class); @@ -131,7 +167,13 @@ public class PlotListener { try { player.setTime(time); } catch (Exception ignored) { - plot.removeFlag(TimeFlag.class); + PlotFlag plotFlag = + GlobalFlagContainer.getInstance().getFlag(TimeFlag.class); + PlotFlagRemoveEvent event = + PlotSquared.get().getEventDispatcher().callFlagRemove(plotFlag, plot); + if (event.getEventResult() != Result.DENY) { + plot.removeFlag(event.getFlag()); + } } } @@ -190,6 +232,15 @@ public class PlotListener { }, 20); } } + + TimedFlag.Timed feed = plot.getFlag(FeedFlag.class); + if (feed != null && feed.getInterval() != 0 && feed.getValue() != 0) { + feedRunnable.put(player.getUUID(), new Interval(feed.getInterval(), feed.getValue(), 20)); + } + TimedFlag.Timed heal = plot.getFlag(HealFlag.class); + if (heal != null && heal.getInterval() != 0 && heal.getValue() != 0) { + healRunnable.put(player.getUUID(), new Interval(heal.getInterval(), heal.getValue(), 20)); + } return true; } return true; @@ -197,7 +248,7 @@ public class PlotListener { public static boolean plotExit(final PlotPlayer player, Plot plot) { Object previous = player.deleteMeta(PlotPlayer.META_LAST_PLOT); - EventUtil.manager.callLeave(player, plot); + PlotSquared.get().getEventDispatcher().callLeave(player, plot); if (plot.hasOwner()) { PlotArea pw = plot.getArea(); if (pw == null) { @@ -277,7 +328,29 @@ public class PlotListener { player.deleteMeta("music"); player.playMusic(lastLoc, ItemTypes.AIR); } + + feedRunnable.remove(player.getUUID()); + healRunnable.remove(player.getUUID()); } return true; } + + public static void logout(UUID uuid) { + feedRunnable.remove(uuid); + healRunnable.remove(uuid); + } + + private static class Interval { + + final int interval; + final int amount; + final int max; + int count = 0; + + Interval(int interval, int amount, int max) { + this.interval = interval; + this.amount = amount; + this.max = max; + } + } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java index 5e4718d16..39f809e0b 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/Plot.java @@ -1,10 +1,15 @@ package com.github.intellectualsites.plotsquared.plot.object; import com.github.intellectualsites.plotsquared.plot.PlotSquared; +import com.github.intellectualsites.plotsquared.plot.config.CaptionUtility; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Configuration; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; +import com.github.intellectualsites.plotsquared.plot.events.PlotComponentSetEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotMergeEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotUnlinkEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.flags.FlagContainer; import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; import com.github.intellectualsites.plotsquared.plot.flags.InternalFlag; @@ -14,16 +19,7 @@ import com.github.intellectualsites.plotsquared.plot.generator.SquarePlotWorld; import com.github.intellectualsites.plotsquared.plot.listener.PlotListener; import com.github.intellectualsites.plotsquared.plot.object.comment.PlotComment; import com.github.intellectualsites.plotsquared.plot.object.schematic.Schematic; -import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.MathMan; -import com.github.intellectualsites.plotsquared.plot.util.Permissions; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; -import com.github.intellectualsites.plotsquared.plot.util.StringMan; -import com.github.intellectualsites.plotsquared.plot.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; -import com.github.intellectualsites.plotsquared.plot.util.WorldUtil; +import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; import com.github.intellectualsites.plotsquared.plot.util.expiry.ExpireManager; @@ -66,6 +62,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import static com.github.intellectualsites.plotsquared.plot.commands.SubCommand.sendMessage; + /** * The plot class
* [IMPORTANT] @@ -826,11 +824,6 @@ public class Plot { * @return boolean */ public boolean setOwner(UUID owner, PlotPlayer initiator) { - boolean result = EventUtil.manager - .callOwnerChange(initiator, this, owner, hasOwner() ? this.owner : null, hasOwner()); - if (!result) { - return false; - } if (!hasOwner()) { this.owner = owner; create(); @@ -867,22 +860,18 @@ public class Plot { if (checkRunning && this.getRunning() != 0) { return false; } - if (isDelete) { - if (!EventUtil.manager.callDelete(this)) { - return false; - } - } else { - if (!EventUtil.manager.callClear(this)) { - return false; - } - } final Set regions = this.getRegions(); final Set plots = this.getConnectedPlots(); final ArrayDeque queue = new ArrayDeque<>(plots); if (isDelete) { this.removeSign(); } - this.unlinkPlot(true, !isDelete); + PlotUnlinkEvent event = PlotSquared.get().getEventDispatcher() + .callUnlink(getArea(), this, true, !isDelete, + isDelete ? PlotUnlinkEvent.REASON.DELETE : PlotUnlinkEvent.REASON.CLEAR); + if (event.getEventResult() != Result.DENY) { + this.unlinkPlot(event.isCreateRoad(), event.isCreateSign()); + } final PlotManager manager = this.area.getPlotManager(); Runnable run = new Runnable() { @Override public void run() { @@ -996,10 +985,6 @@ public class Plot { current.setHome(null); ids.add(current.getId()); } - boolean result = EventUtil.manager.callUnlink(this.area, ids); - if (!result) { - return false; - } this.clearRatings(); if (createSign) { this.removeSign(); @@ -1105,9 +1090,6 @@ public class Plot { * @return A boolean indicating whether or not the operation succeeded */ public boolean setFlag(PlotFlag flag) { - if (!EventUtil.manager.callFlagAdd(flag, origin)) { - return false; - } if (flag instanceof KeepFlag && ExpireManager.IMP != null) { ExpireManager.IMP.updateExpired(this); } @@ -1205,13 +1187,6 @@ public class Plot { if (value == null) { continue; } - if (plot == origin) { - boolean result = EventUtil.manager.callFlagRemove(flag, plot, value); - if (!result) { - plot.getFlagContainer().addFlag(flag); - continue; - } - } plot.reEnter(); DBFunc.removeFlag(plot, flag); removed = true; @@ -1613,9 +1588,9 @@ public class Plot { public boolean claim(final PlotPlayer player, boolean teleport, String schematic, boolean updateDB) { - boolean result = EventUtil.manager.callClaim(player, this, false); + if (updateDB) { - if (!result || (!create(player.getUUID(), true))) { + if (!create(player.getUUID(), true)) { return false; } } else { @@ -1689,7 +1664,14 @@ public class Plot { DBFunc.createPlotAndSettings(this, () -> { PlotArea plotworld = Plot.this.area; if (notify && plotworld.AUTO_MERGE) { - Plot.this.autoMerge(Direction.ALL, Integer.MAX_VALUE, uuid, true); + PlotPlayer player = WorldUtil.IMP.wrapPlayer(uuid); + PlotMergeEvent event = PlotSquared.get().getEventDispatcher() + .callMerge(this, Direction.ALL, Integer.MAX_VALUE, player); + if (event.getEventResult() == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Auto merge on claim"); + return; + } + Plot.this.autoMerge(event.getDir(), event.getMax(), uuid, true); } }); return true; @@ -2338,10 +2320,6 @@ public class Plot { if (this.owner == null) { return false; } - //Call the merge event - if (!EventUtil.manager.callMerge(this, dir.getIndex(), max)) { - return false; - } Set connected = this.getConnectedPlots(); HashSet merged = connected.stream().map(Plot::getId).collect(Collectors.toCollection(HashSet::new)); @@ -2899,38 +2877,39 @@ public class Plot { */ public boolean teleportPlayer(final PlotPlayer player, TeleportCause cause) { Plot plot = this.getBasePlot(false); - boolean result = EventUtil.manager.callTeleport(player, player.getLocation(), plot); - if (result) { - final Location location; - if (this.area.HOME_ALLOW_NONMEMBER || plot.isAdded(player.getUUID())) { - location = this.getHome(); - } else { - location = this.getDefaultHome(false); - } - if (Settings.Teleport.DELAY == 0 || Permissions - .hasPermission(player, "plots.teleport.delay.bypass")) { - MainUtil.sendMessage(player, Captions.TELEPORTED_TO_PLOT); - player.teleport(location, cause); - return true; - } - MainUtil - .sendMessage(player, Captions.TELEPORT_IN_SECONDS, Settings.Teleport.DELAY + ""); - final String name = player.getName(); - TaskManager.TELEPORT_QUEUE.add(name); - TaskManager.runTaskLater(() -> { - if (!TaskManager.TELEPORT_QUEUE.contains(name)) { - MainUtil.sendMessage(player, Captions.TELEPORT_FAILED); - return; - } - TaskManager.TELEPORT_QUEUE.remove(name); - if (player.isOnline()) { - MainUtil.sendMessage(player, Captions.TELEPORTED_TO_PLOT); - player.teleport(location, cause); - } - }, Settings.Teleport.DELAY * 20); + Result result = + PlotSquared.get().getEventDispatcher().callTeleport(player, player.getLocation(), plot).getEventResult(); + if (result == Result.DENY) { + sendMessage(player, Captions.EVENT_DENIED, "Teleport"); + return false; + } + final Location location; + if (this.area.HOME_ALLOW_NONMEMBER || plot.isAdded(player.getUUID())) { + location = this.getHome(); + } else { + location = this.getDefaultHome(false); + } + if (Settings.Teleport.DELAY == 0 || Permissions + .hasPermission(player, "plots.teleport.delay.bypass")) { + MainUtil.sendMessage(player, Captions.TELEPORTED_TO_PLOT); + player.teleport(location, cause); return true; } - return false; + MainUtil.sendMessage(player, Captions.TELEPORT_IN_SECONDS, Settings.Teleport.DELAY + ""); + final String name = player.getName(); + TaskManager.TELEPORT_QUEUE.add(name); + TaskManager.runTaskLater(() -> { + if (!TaskManager.TELEPORT_QUEUE.contains(name)) { + MainUtil.sendMessage(player, Captions.TELEPORT_FAILED); + return; + } + TaskManager.TELEPORT_QUEUE.remove(name); + if (player.isOnline()) { + MainUtil.sendMessage(player, Captions.TELEPORTED_TO_PLOT); + player.teleport(location, cause); + } + }, Settings.Teleport.DELAY * 20); + return true; } /** @@ -2963,9 +2942,9 @@ public class Plot { * @return */ public boolean setComponent(String component, Pattern blocks) { - if (StringMan.isEqualToAny(component, getManager().getPlotComponents(this.getId()))) { - EventUtil.manager.callComponentSet(this, component); - } + PlotComponentSetEvent event = PlotSquared.get().getEventDispatcher().callComponentSet(this, component, blocks); + component = event.getComponent(); + blocks = event.getPattern(); return this.getManager().setComponent(this.getId(), component, blocks); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotArea.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotArea.java index 3118033a5..d2b29170a 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotArea.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotArea.java @@ -13,7 +13,6 @@ import com.github.intellectualsites.plotsquared.plot.flags.implementations.DoneF import com.github.intellectualsites.plotsquared.plot.generator.GridPlotWorld; import com.github.intellectualsites.plotsquared.plot.generator.IndependentPlotGenerator; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.StringMan; @@ -828,11 +827,6 @@ public abstract class PlotArea { final PlotId pos2 = plotIds.get(plotIds.size() - 1); final PlotManager manager = getPlotManager(); - final boolean result = EventUtil.manager.callAutoMerge(getPlotAbs(pos1), plotIds); - if (!result) { - return false; - } - manager.startPlotMerge(plotIds); final Set trusted = new HashSet<>(); final Set members = new HashSet<>(); diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java index bb8865c88..f971d798e 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java @@ -12,7 +12,6 @@ import com.github.intellectualsites.plotsquared.plot.object.worlds.PlotAreaManag import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea; import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager; import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.PlotWeather; import com.github.intellectualsites.plotsquared.plot.util.TaskManager; @@ -522,7 +521,7 @@ public abstract class PlotPlayer implements CommandCaller, OfflinePlotPlayer { removePersistentMeta("quitLoc"); } if (plot != null) { - EventUtil.manager.callLeave(this, plot); + PlotSquared.get().getEventDispatcher().callLeave(this, plot); } if (Settings.Enabled_Components.BAN_DELETER && isBanned()) { for (Plot owned : getPlots()) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/EventUtil.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/EventDispatcher.java similarity index 50% rename from Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/EventUtil.java rename to Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/EventDispatcher.java index a2d3f1f2e..1b81a1468 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/EventUtil.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/EventDispatcher.java @@ -4,77 +4,171 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.CaptionUtility; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; +import com.github.intellectualsites.plotsquared.plot.events.*; import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.DeviceInteractFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MiscPlaceFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.MobPlaceFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.PlaceFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.UseFlag; -import com.github.intellectualsites.plotsquared.plot.flags.implementations.VehiclePlaceFlag; +import com.github.intellectualsites.plotsquared.plot.flags.implementations.*; import com.github.intellectualsites.plotsquared.plot.flags.types.BlockTypeWrapper; import com.github.intellectualsites.plotsquared.plot.listener.PlayerBlockEventType; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.Rating; +import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea; import com.github.intellectualsites.plotsquared.plot.util.expiry.ExpireManager; +import com.google.common.eventbus.EventBus; +import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.UUID; -public abstract class EventUtil { +public class EventDispatcher { - public static EventUtil manager = null; + private EventBus eventBus = new EventBus("PlotSquaredEvents"); - /** - * Submit a plot rate event and return the updated rating - * - * @param player Player that rated the plot - * @param plot Plot that was rated - * @param rating Rating given to the plot - * @return Updated rating or null if the event was cancelled - */ - @Nullable public abstract Rating callRating(PlotPlayer player, Plot plot, Rating rating); + private List listeners = new ArrayList<>(); - public abstract boolean callClaim(PlotPlayer player, Plot plot, boolean auto); + public void registerListener(Object listener) { + eventBus.register(listener); + listeners.add(listener); + } - public abstract boolean callTeleport(PlotPlayer player, Location from, Plot plot); + public void unregisterListener(Object listener) { + eventBus.unregister(listener); + listeners.remove(listener); + } - public abstract boolean callComponentSet(Plot plot, String component); + public void unregisterAll() { + for (Object listener : listeners) { + eventBus.unregister(listener); + } + } - public abstract boolean callClear(Plot plot); + public void callEvent(@NotNull final PlotEvent event) { + eventBus.post(event); + } - public abstract boolean callDelete(Plot plot); + public PlayerClaimPlotEvent callClaim(PlotPlayer player, Plot plot, String schematic) { + PlayerClaimPlotEvent event = new PlayerClaimPlotEvent(player, plot, schematic); + callEvent(event); + return event; + } - public abstract boolean callFlagAdd(PlotFlag flag, Plot plot); + public PlayerAutoPlotEvent callAuto(PlotPlayer player, PlotArea area, String schematic, + int size_x, int size_z) { + PlayerAutoPlotEvent event = + new PlayerAutoPlotEvent(player, area, schematic, size_x, size_z); + callEvent(event); + return event; + } - public abstract boolean callFlagRemove(PlotFlag flag, Plot plot, Object value); + public PlayerTeleportToPlotEvent callTeleport(PlotPlayer player, Location from, Plot plot) { + PlayerTeleportToPlotEvent event = new PlayerTeleportToPlotEvent(player, from, plot); + callEvent(event); + return event; + } - public abstract boolean callMerge(Plot plot, int dir, int max); + public PlotComponentSetEvent callComponentSet(Plot plot, String component, Pattern pattern) { + PlotComponentSetEvent event = new PlotComponentSetEvent(plot, component, pattern); + callEvent(event); + return event; + } - public abstract boolean callAutoMerge(Plot plot, List plots); + public PlotClearEvent callClear(Plot plot) { + PlotClearEvent event = new PlotClearEvent(plot); + callEvent(event); + return event; + } - public abstract boolean callUnlink(PlotArea area, List plots); + public PlotDeleteEvent callDelete(Plot plot) { + PlotDeleteEvent event = new PlotDeleteEvent(plot); + callEvent(event); + return event; + } - public abstract void callEntry(PlotPlayer player, Plot plot); + public PlotFlagAddEvent callFlagAdd(PlotFlag flag, Plot plot) { + PlotFlagAddEvent event = new PlotFlagAddEvent(flag, plot); + callEvent(event); + return event; + } - public abstract void callLeave(PlotPlayer player, Plot plot); + public PlotFlagRemoveEvent callFlagRemove(PlotFlag flag, Plot plot) { + PlotFlagRemoveEvent event = new PlotFlagRemoveEvent(flag, plot); + callEvent(event); + return event; + } - public abstract void callDenied(PlotPlayer initiator, Plot plot, UUID player, boolean added); + public PlotMergeEvent callMerge(Plot plot, Direction dir, int max, PlotPlayer player) { + PlotMergeEvent event = new PlotMergeEvent(plot.getWorldName(), plot, dir, max, player); + callEvent(event); + return event; + } - public abstract void callTrusted(PlotPlayer initiator, Plot plot, UUID player, boolean added); + public PlotAutoMergeEvent callAutoMerge(Plot plot, List plots) { + PlotAutoMergeEvent event = new PlotAutoMergeEvent(plot.getWorldName(), plot, plots); + callEvent(event); + return event; + } - public abstract void callMember(PlotPlayer initiator, Plot plot, UUID player, boolean added); + public PlotUnlinkEvent callUnlink(PlotArea area, Plot plot, boolean createRoad, + boolean createSign, PlotUnlinkEvent.REASON reason) { + PlotUnlinkEvent event = new PlotUnlinkEvent(area, plot, createRoad, createSign, reason); + callEvent(event); + return event; + } - public abstract boolean callOwnerChange(PlotPlayer initiator, Plot plot, UUID newOwner, - UUID oldOwner, boolean hasOldOwner); + public PlayerEnterPlotEvent callEntry(PlotPlayer player, Plot plot) { + PlayerEnterPlotEvent event = new PlayerEnterPlotEvent(player, plot); + callEvent(event); + return event; + } + + public PlayerLeavePlotEvent callLeave(PlotPlayer player, Plot plot) { + PlayerLeavePlotEvent event = new PlayerLeavePlotEvent(player, plot); + callEvent(event); + return event; + } + + public PlayerPlotDeniedEvent callDenied(PlotPlayer initiator, Plot plot, UUID player, + boolean added) { + PlayerPlotDeniedEvent event = new PlayerPlotDeniedEvent(initiator, plot, player, added); + callEvent(event); + return event; + } + + public PlayerPlotTrustedEvent callTrusted(PlotPlayer initiator, Plot plot, UUID player, + boolean added) { + PlayerPlotTrustedEvent event = new PlayerPlotTrustedEvent(initiator, plot, player, added); + callEvent(event); + return event; + } + + public PlayerPlotHelperEvent callMember(PlotPlayer initiator, Plot plot, UUID player, + boolean added) { + PlayerPlotHelperEvent event = new PlayerPlotHelperEvent(initiator, plot, player, added); + callEvent(event); + return event; + } + + public PlotChangeOwnerEvent callOwnerChange(PlotPlayer initiator, Plot plot, UUID oldOwner, + UUID newOwner, boolean hasOldOwner) { + PlotChangeOwnerEvent event = + new PlotChangeOwnerEvent(initiator, plot, oldOwner, newOwner, hasOldOwner); + callEvent(event); + return event; + } + + public PlotRateEvent callRating(PlotPlayer player, Plot plot, Rating rating) { + PlotRateEvent event = new PlotRateEvent(player, rating, plot); + eventBus.post(event); + return event; + } + + public PlotDoneEvent callDone(Plot plot) { + PlotDoneEvent event = new PlotDoneEvent(plot); + callEvent(event); + return event; + } public void doJoinTask(final PlotPlayer player) { if (player == null) { @@ -93,8 +187,8 @@ public abstract class EventUtil { .getArea() instanceof SinglePlotArea)) { TaskManager.runTask(() -> plot.teleportPlayer(player)); MainUtil.sendMessage(player, - CaptionUtility.format(player, Captions.TELEPORTED_TO_ROAD.getTranslated()) + " (on-login) " + "(" + plot.getId().x + ";" + plot - .getId().y + ")"); + CaptionUtility.format(player, Captions.TELEPORTED_TO_ROAD.getTranslated()) + + " (on-login) " + "(" + plot.getId().x + ";" + plot.getId().y + ")"); } } @@ -132,13 +226,15 @@ public abstract class EventUtil { } final List use = plot.getFlag(UseFlag.class); for (final BlockTypeWrapper blockTypeWrapper : use) { - if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper.accepts(blockType)) { + if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper + .accepts(blockType)) { return true; } } - return Permissions.hasPermission(player, - Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), false) || !( - !notifyPerms || MainUtil.sendMessage(player, Captions.FLAG_TUTORIAL_USAGE, + return Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), + false) || !(!notifyPerms || MainUtil + .sendMessage(player, Captions.FLAG_TUTORIAL_USAGE, Captions.FLAG_USE.getTranslated())); } case TRIGGER_PHYSICAL: { @@ -155,12 +251,14 @@ public abstract class EventUtil { } List use = plot.getFlag(UseFlag.class); for (final BlockTypeWrapper blockTypeWrapper : use) { - if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper.accepts(blockType)) { + if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper + .accepts(blockType)) { return true; } } - return Permissions.hasPermission(player, - Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), false); + return Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), + false); } case SPAWN_MOB: { if (plot == null) { @@ -176,18 +274,19 @@ public abstract class EventUtil { } List place = plot.getFlag(PlaceFlag.class); for (final BlockTypeWrapper blockTypeWrapper : place) { - if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper.accepts(blockType)) { + if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper + .accepts(blockType)) { return true; } } - if (Permissions.hasPermission(player, - Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), false)) { + if (Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), + false)) { return true; } - return !(!notifyPerms || MainUtil - .sendMessage(player, Captions.FLAG_TUTORIAL_USAGE, - Captions.FLAG_MOB_PLACE.getTranslated() + '/' + Captions.FLAG_PLACE - .getTranslated())); + return !(!notifyPerms || MainUtil.sendMessage(player, Captions.FLAG_TUTORIAL_USAGE, + Captions.FLAG_MOB_PLACE.getTranslated() + '/' + Captions.FLAG_PLACE + .getTranslated())); } case PLACE_MISC: { if (plot == null) { @@ -203,18 +302,19 @@ public abstract class EventUtil { } List place = plot.getFlag(PlaceFlag.class); for (final BlockTypeWrapper blockTypeWrapper : place) { - if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper.accepts(blockType)) { + if (blockTypeWrapper.accepts(BlockTypes.AIR) || blockTypeWrapper + .accepts(blockType)) { return true; } } - if (Permissions.hasPermission(player, - Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), false)) { + if (Permissions + .hasPermission(player, Captions.PERMISSION_ADMIN_INTERACT_OTHER.getTranslated(), + false)) { return true; } - return !(!notifyPerms || MainUtil - .sendMessage(player, Captions.FLAG_TUTORIAL_USAGE, - Captions.FLAG_MISC_PLACE.getTranslated() + '/' + Captions.FLAG_PLACE - .getTranslated())); + return !(!notifyPerms || MainUtil.sendMessage(player, Captions.FLAG_TUTORIAL_USAGE, + Captions.FLAG_MISC_PLACE.getTranslated() + '/' + Captions.FLAG_PLACE + .getTranslated())); } case PLACE_VEHICLE: if (plot == null) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java index 712f24937..3d7188187 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/WorldUtil.java @@ -3,6 +3,7 @@ package com.github.intellectualsites.plotsquared.plot.util; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; +import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; import com.github.intellectualsites.plotsquared.plot.object.schematic.PlotItem; import com.sk89q.jnbt.CompoundTag; @@ -157,4 +158,14 @@ public abstract class WorldUtil { } public abstract boolean isBlockSame(BlockState block1, BlockState block2); + + public abstract PlotPlayer wrapPlayer(UUID uuid); + + public abstract double getHealth(PlotPlayer player); + + public abstract void setHealth(PlotPlayer player, double health); + + public abstract int getFoodLevel(PlotPlayer player); + + public abstract void setFoodLevel(PlotPlayer player, int foodLevel); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/expiry/ExpireManager.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/expiry/ExpireManager.java index 9861ed143..359f8324d 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/expiry/ExpireManager.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/util/expiry/ExpireManager.java @@ -4,7 +4,11 @@ import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.config.Captions; import com.github.intellectualsites.plotsquared.plot.config.Settings; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; +import com.github.intellectualsites.plotsquared.plot.events.PlotFlagAddEvent; +import com.github.intellectualsites.plotsquared.plot.events.PlotUnlinkEvent; +import com.github.intellectualsites.plotsquared.plot.events.Result; import com.github.intellectualsites.plotsquared.plot.flags.GlobalFlagContainer; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.AnalysisFlag; import com.github.intellectualsites.plotsquared.plot.flags.implementations.KeepFlag; import com.github.intellectualsites.plotsquared.plot.generator.HybridUtils; @@ -306,8 +310,13 @@ public class ExpireManager { confirmation); } }, () -> { - newPlot.setFlag(GlobalFlagContainer.getInstance() - .getFlag(AnalysisFlag.class).createFlagInstance(changed.asList())); + PlotFlag plotFlag = GlobalFlagContainer.getInstance() + .getFlag(AnalysisFlag.class).createFlagInstance(changed.asList()); + PlotFlagAddEvent event = new PlotFlagAddEvent(plotFlag, newPlot); + if (event.getEventResult() == Result.DENY) { + return; + } + newPlot.setFlag(event.getFlag()); TaskManager.runTaskLaterAsync(task, 20); }); } @@ -366,7 +375,12 @@ public class ExpireManager { public void deleteWithMessage(Plot plot, Runnable whenDone) { if (plot.isMerged()) { - plot.unlinkPlot(true, false); + PlotUnlinkEvent event = PlotSquared.get().getEventDispatcher() + .callUnlink(plot.getArea(), plot, true, false, + PlotUnlinkEvent.REASON.EXPIRE_DELETE); + if (event.getEventResult() != Result.DENY) { + plot.unlinkPlot(event.isCreateRoad(), event.isCreateSign()); + } } for (UUID helper : plot.getTrusted()) { PlotPlayer player = UUIDHandler.getPlayer(helper); diff --git a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/FlagTest.java b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/FlagTest.java index 9d08981a6..f4e262a3c 100644 --- a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/FlagTest.java +++ b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/FlagTest.java @@ -2,8 +2,6 @@ package com.github.intellectualsites.plotsquared.plot; import com.github.intellectualsites.plotsquared.plot.database.AbstractDBTest; import com.github.intellectualsites.plotsquared.plot.database.DBFunc; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; -import com.github.intellectualsites.plotsquared.plot.util.EventUtilTest; import com.sk89q.worldedit.world.item.ItemType; import org.junit.Before; @@ -14,7 +12,7 @@ public class FlagTest { private ItemType testBlock; @Before public void setUp() throws Exception { - EventUtil.manager = new EventUtilTest(); + //EventUtil.manager = new EventUtilTest(); DBFunc.dbManager = new AbstractDBTest(); } diff --git a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/EventDispatcherTest.java b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/EventDispatcherTest.java new file mode 100644 index 000000000..1e789a4da --- /dev/null +++ b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/EventDispatcherTest.java @@ -0,0 +1,101 @@ +package com.github.intellectualsites.plotsquared.plot.util; + +import com.github.intellectualsites.plotsquared.plot.events.*; +import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; +import com.github.intellectualsites.plotsquared.plot.object.*; +import com.sk89q.worldedit.function.pattern.Pattern; + +import java.util.List; +import java.util.UUID; + +public class EventDispatcherTest extends EventDispatcher { + + @Override public PlotRateEvent callRating(PlotPlayer player, Plot plot, Rating rating) { + return null; + } + + @Override + public PlayerClaimPlotEvent callClaim(PlotPlayer player, Plot plot, String schematic) { + return null; + } + + @Override + public PlayerAutoPlotEvent callAuto(PlotPlayer player, PlotArea area, String schematic, + int size_x, int size_z) { + return null; + } + + @Override + public PlayerTeleportToPlotEvent callTeleport(PlotPlayer player, Location from, Plot plot) { + return null; + } + + @Override + public PlotComponentSetEvent callComponentSet(Plot plot, String component, Pattern pattern) { + return null; + } + + @Override public PlotClearEvent callClear(Plot plot) { + return null; + } + + @Override public PlotDeleteEvent callDelete(Plot plot) { + return null; + } + + @Override public PlotFlagAddEvent callFlagAdd(PlotFlag flag, Plot plot) { + return null; + } + + @Override public PlotFlagRemoveEvent callFlagRemove(PlotFlag flag, Plot plot) { + return null; + } + + @Override + public PlotMergeEvent callMerge(Plot plot, Direction dir, int max, PlotPlayer player) { + return null; + } + + @Override public PlotAutoMergeEvent callAutoMerge(Plot plot, List plots) { + return null; + } + + @Override public PlotUnlinkEvent callUnlink(PlotArea area, Plot plot, boolean createRoad, + boolean createSign, PlotUnlinkEvent.REASON reason) { + return null; + } + + @Override public PlayerEnterPlotEvent callEntry(PlotPlayer player, Plot plot) { + return null; + } + + @Override public PlayerLeavePlotEvent callLeave(PlotPlayer player, Plot plot) { + return null; + } + + @Override public PlayerPlotDeniedEvent callDenied(PlotPlayer initiator, Plot plot, UUID player, + boolean added) { + return null; + } + + @Override + public PlayerPlotTrustedEvent callTrusted(PlotPlayer initiator, Plot plot, UUID player, + boolean added) { + return null; + } + + @Override public PlayerPlotHelperEvent callMember(PlotPlayer initiator, Plot plot, UUID player, + boolean added) { + return null; + } + + @Override + public PlotChangeOwnerEvent callOwnerChange(PlotPlayer initiator, Plot plot, UUID newOwner, + UUID oldOwner, boolean hasOldOwner) { + return null; + } + + @Override public PlotDoneEvent callDone(Plot plot) { + return null; + } +} diff --git a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/EventUtilTest.java b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/EventUtilTest.java deleted file mode 100644 index d4fb9ad31..000000000 --- a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/EventUtilTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.github.intellectualsites.plotsquared.plot.util; - -import com.github.intellectualsites.plotsquared.plot.flags.PlotFlag; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.Rating; - -import java.util.List; -import java.util.UUID; - -public class EventUtilTest extends EventUtil { - - @Override public Rating callRating(PlotPlayer player, Plot plot, Rating rating) { - return null; - } - - @Override public boolean callClaim(PlotPlayer player, Plot plot, boolean auto) { - return false; - } - - @Override public boolean callTeleport(PlotPlayer player, Location from, Plot plot) { - return false; - } - - @Override public boolean callComponentSet(Plot plot, String component) { - return false; - } - - @Override public boolean callClear(Plot plot) { - return false; - } - - @Override public boolean callDelete(Plot plot) { - return false; - } - - @Override public boolean callFlagAdd(PlotFlag flag, Plot plot) { - return true; - } - - @Override public boolean callFlagRemove(PlotFlag flag, Plot plot, Object value) { - return true; - } - - @Override public boolean callMerge(Plot plot, int dir, int max) { - return false; - } - - @Override public boolean callAutoMerge(Plot plot, List plots) { - return false; - } - - @Override public boolean callUnlink(PlotArea area, List plots) { - return false; - } - - @Override public void callEntry(PlotPlayer player, Plot plot) { - } - - @Override public void callLeave(PlotPlayer player, Plot plot) { - } - - @Override public void callDenied(PlotPlayer initiator, Plot plot, UUID player, boolean added) { - } - - @Override public void callTrusted(PlotPlayer initiator, Plot plot, UUID player, boolean added) { - } - - @Override public void callMember(PlotPlayer initiator, Plot plot, UUID player, boolean added) { - } - - @Override - public boolean callOwnerChange(PlotPlayer initiator, Plot plot, UUID newOwner, UUID oldOwner, - boolean hasOldOwner) { - return false; - } -} diff --git a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/UUIDHandlerImplementationTest.java b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/UUIDHandlerImplementationTest.java index 58e43ff65..1d4244510 100644 --- a/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/UUIDHandlerImplementationTest.java +++ b/Core/src/test/java/com/github/intellectualsites/plotsquared/plot/util/UUIDHandlerImplementationTest.java @@ -15,7 +15,6 @@ public class UUIDHandlerImplementationTest extends UUIDHandlerImplementation { } @Before public void setUp() throws Exception { - EventUtil.manager = new EventUtilTest(); DBFunc.dbManager = new AbstractDBTest(); }