diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java index 7fb9c2fde..e3152a8a7 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java @@ -39,7 +39,6 @@ import com.plotsquared.bukkit.database.plotme.PlotMeConnector_017; import com.plotsquared.bukkit.generator.BukkitPlotGenerator; import com.plotsquared.bukkit.listeners.ChunkListener; import com.plotsquared.bukkit.listeners.EntitySpawnListener; -import com.plotsquared.bukkit.listeners.ForceFieldListener; import com.plotsquared.bukkit.listeners.PlayerEvents; import com.plotsquared.bukkit.listeners.PlayerEvents183; import com.plotsquared.bukkit.listeners.PlayerEvents_1_8; @@ -401,7 +400,6 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain @Override public void registerForceFieldEvents() { - getServer().getPluginManager().registerEvents(new ForceFieldListener(), this); } @Override diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/ForceFieldListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/ForceFieldListener.java index a4258421c..d32185f23 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/ForceFieldListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/ForceFieldListener.java @@ -8,14 +8,13 @@ import com.intellectualcrafters.plot.object.PlotPlayer; import com.plotsquared.bukkit.object.BukkitPlayer; import com.plotsquared.bukkit.util.BukkitUtil; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; import org.bukkit.util.Vector; import java.util.HashSet; import java.util.Set; import java.util.UUID; -public class ForceFieldListener implements Listener { +public class ForceFieldListener { private static Set getNearbyPlayers(Player player, Plot plot) { Set players = new HashSet<>(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java index 47a6ca301..d0a37ee77 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java @@ -484,7 +484,7 @@ public class PlayerEvents extends PlotListener implements Listener { pp.deleteMeta("lastplot"); return; } - Plot now = area.getPlot(loc); + Plot now = area.getPlotAbs(loc); Plot lastPlot = pp.getMeta("lastplot"); if (now == null) { if (lastPlot != null && !plotExit(pp, lastPlot)) { diff --git a/Core/src/main/java/com/intellectualcrafters/plot/PS.java b/Core/src/main/java/com/intellectualcrafters/plot/PS.java index 00c70d52d..b9374448d 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/PS.java @@ -171,7 +171,6 @@ public class PS { this.IMP.registerPlayerEvents(); this.IMP.registerInventoryEvents(); this.IMP.registerPlotPlusEvents(); - this.IMP.registerForceFieldEvents(); } // Required this.IMP.registerWorldEvents(); diff --git a/Sponge/src/main/java/com/plotsquared/sponge/SpongeMain.java b/Sponge/src/main/java/com/plotsquared/sponge/SpongeMain.java index 0ceef43dc..d895d3eb2 100644 --- a/Sponge/src/main/java/com/plotsquared/sponge/SpongeMain.java +++ b/Sponge/src/main/java/com/plotsquared/sponge/SpongeMain.java @@ -242,14 +242,11 @@ public class SpongeMain implements IPlotMain { @Override public void registerPlotPlusEvents() { - // TODO Auto-generated method stub PS.log("registerPlotPlusEvents is not implemented!"); } @Override public void registerForceFieldEvents() { - // TODO Auto-generated method stub - PS.log("registerForceFieldEvents is not implemented!"); } @Override diff --git a/Sponge/src/main/java/com/plotsquared/sponge/listener/ForceFieldListener.java b/Sponge/src/main/java/com/plotsquared/sponge/listener/ForceFieldListener.java new file mode 100644 index 000000000..0b5e4c3ca --- /dev/null +++ b/Sponge/src/main/java/com/plotsquared/sponge/listener/ForceFieldListener.java @@ -0,0 +1,97 @@ +package com.plotsquared.sponge.listener; + +import com.flowpowered.math.vector.Vector3d; +import com.intellectualcrafters.plot.flag.Flags; +import com.intellectualcrafters.plot.object.Location; +import com.intellectualcrafters.plot.object.Plot; +import com.intellectualcrafters.plot.object.PlotPlayer; +import com.plotsquared.sponge.object.SpongePlayer; +import com.plotsquared.sponge.util.SpongeUtil; +import org.spongepowered.api.entity.Entity; +import org.spongepowered.api.entity.EntityTypes; +import org.spongepowered.api.entity.living.player.Player; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class ForceFieldListener { + + private static Set getNearbyPlayers(Player player, Plot plot) { + Set players = new HashSet<>(); + for (Entity nearbyEntity : player.getNearbyEntities(entity -> entity.getType().equals(EntityTypes.PLAYER))) { + Player nearbyPlayer = (Player) nearbyEntity; + PlotPlayer plotPlayer; + if ((plotPlayer = SpongeUtil.getPlayer(nearbyPlayer)) == null || !plot.equals(plotPlayer.getCurrentPlot())) { + continue; + } + if (!plot.isAdded(plotPlayer.getUUID())) { + players.add(plotPlayer); + } + + } + return players; + } + + private static PlotPlayer hasNearbyPermitted(Player player, Plot plot) { + for (Entity nearbyEntity : player.getNearbyEntities(entity -> entity.getType().equals(EntityTypes.PLAYER))) { + Player nearbyPlayer = (Player) nearbyEntity; + PlotPlayer plotPlayer; + if ((plotPlayer = SpongeUtil.getPlayer(nearbyPlayer)) == null || !plot.equals(plotPlayer.getCurrentPlot())) { + continue; + } + if (plot.isAdded(plotPlayer.getUUID())) { + return plotPlayer; + } + } + return null; + } + + private static Vector3d calculateVelocity(PlotPlayer player, PlotPlayer e) { + Location playerLocation = player.getLocationFull(); + Location oPlayerLocation = e.getLocation(); + double playerX = playerLocation.getX(); + double playerY = playerLocation.getY(); + double playerZ = playerLocation.getZ(); + double oPlayerX = oPlayerLocation.getX(); + double oPlayerY = oPlayerLocation.getY(); + double oPlayerZ = oPlayerLocation.getZ(); + double x = 0d; + if (playerX < oPlayerX) { + x = 1.0d; + } else if (playerX > oPlayerX) { + x = -1.0d; + } + double y = 0d; + if (playerY < oPlayerY) { + y = 0.5d; + } else if (playerY > oPlayerY) { + y = -0.5d; + } + double z = 0d; + if (playerZ < oPlayerZ) { + z = 1.0d; + } else if (playerZ > oPlayerZ) { + z = -1.0d; + } + return new Vector3d(x, y, z); + } + + public static void handleForcefield(Player player, PlotPlayer plotPlayer, Plot plot) { + if (Flags.FORCEFIELD.isTrue(plot)) { + UUID uuid = plotPlayer.getUUID(); + if (plot.isAdded(uuid)) { + Set players = getNearbyPlayers(player, plot); + for (PlotPlayer oPlayer : players) { + ((SpongePlayer) oPlayer).player.setVelocity(calculateVelocity(plotPlayer, oPlayer)); + } + } else { + PlotPlayer oPlayer = hasNearbyPermitted(player, plot); + if (oPlayer == null) { + return; + } + player.setVelocity(calculateVelocity(oPlayer, plotPlayer)); + } + } + } +} diff --git a/Sponge/src/main/java/com/plotsquared/sponge/listener/MainListener.java b/Sponge/src/main/java/com/plotsquared/sponge/listener/MainListener.java index cd44889ee..c2d256c30 100644 --- a/Sponge/src/main/java/com/plotsquared/sponge/listener/MainListener.java +++ b/Sponge/src/main/java/com/plotsquared/sponge/listener/MainListener.java @@ -662,6 +662,7 @@ public class MainListener { return; } } else if (now.equals(lastPlot)) { + ForceFieldListener.handleForcefield(player, pp, now); return; } else if (!PlotListener.plotEntry(pp, now)) { MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_ENTRY_DENIED); @@ -711,6 +712,7 @@ public class MainListener { return; } } else if (now.equals(lastPlot)) { + ForceFieldListener.handleForcefield(player, pp, now); return; } else if (!PlotListener.plotEntry(pp, now)) { MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_ENTRY_DENIED);