diff --git a/pom.xml b/pom.xml index 1018863..6fb7fd4 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ me.SuperRonanCraft BetterRTP jar - 3.6.0 + 3.6.1 1.8 diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java index 98019c2..4a3af92 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java @@ -99,8 +99,8 @@ public class RTP { if (getPl().getSettings().isDelayEnabled() && pWorld.isApplyDelay()) { new RTPDelay(sendi, rtpPlayer, delayTime, cancelOnMove, cancelOnDamage); } else { - teleport.beforeTeleportInstant(sendi, p); - rtpPlayer.randomlyTeleport(sendi); + if (!teleport.beforeTeleportInstant(sendi, p)) + rtpPlayer.randomlyTeleport(sendi); } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java index d8d156c..63791a0 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java @@ -24,10 +24,11 @@ class RTPDelay implements Listener { } private void delay(CommandSender sendi, int delay) { - getPl().getRTP().getTeleport().beforeTeleportDelay(rtp.getPlayer(), delay); - run = Bukkit.getScheduler().scheduleSyncDelayedTask(BetterRTP.getInstance(), run(sendi, this), delay * 20L); - if (cancelOnMove || cancelOnDamage) - Bukkit.getPluginManager().registerEvents(this, BetterRTP.getInstance()); + if (!getPl().getRTP().getTeleport().beforeTeleportDelay(rtp.getPlayer(), delay)) { + run = Bukkit.getScheduler().scheduleSyncDelayedTask(BetterRTP.getInstance(), run(sendi, this), delay * 20L); + if (cancelOnMove || cancelOnDamage) + Bukkit.getPluginManager().registerEvents(this, BetterRTP.getInstance()); + } } @EventHandler @@ -60,7 +61,7 @@ class RTPDelay implements Listener { HandlerList.unregisterAll(this); getPl().getRTP().getTeleport().cancelledTeleport(rtp.getPlayer()); //getPl().getEco().unCharge(rtp.getPlayer(), rtp.pWorld); - getPl().getCooldowns().removeCooldown(rtp.getPlayer(), rtp.pWorld.getWorld()); + getPl().getCooldowns().removeCooldown(rtp.getPlayer(), rtp.worldPlayer.getWorld()); getPl().getpInfo().getRtping().put(rtp.getPlayer(), false); Bukkit.getServer().getPluginManager().callEvent(new RTP_CancelledEvent(rtp.getPlayer())); } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPPlayer.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPPlayer.java index 94686ca..5309184 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPPlayer.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPPlayer.java @@ -1,5 +1,6 @@ package me.SuperRonanCraft.BetterRTP.player.rtp; +import lombok.Getter; import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueData; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler; @@ -18,42 +19,43 @@ import java.util.concurrent.CompletableFuture; public class RTPPlayer { - private final Player p; + @Getter private final Player player; private final RTP settings; - WorldPlayer pWorld; - RTP_TYPE type; - int attempts; + @Getter WorldPlayer worldPlayer; + @Getter RTP_TYPE type; + @Getter int attempts; List attemptedLocations = new ArrayList<>(); - RTPPlayer(Player p, RTP settings, WorldPlayer pWorld, RTP_TYPE type) { - this.p = p; + RTPPlayer(Player player, RTP settings, WorldPlayer worldPlayer, RTP_TYPE type) { + this.player = player; this.settings = settings; - this.pWorld = pWorld; + this.worldPlayer = worldPlayer; this.type = type; } - public Player getPlayer() { - return p; - } - void randomlyTeleport(CommandSender sendi) { if (attempts >= settings.maxAttempts) //Cancel out, too many tries - metMax(sendi, p); + metMax(sendi, player); else { //Try again to find a safe location //Find a location from another Plugin - RTP_FindLocationEvent event = new RTP_FindLocationEvent(p, pWorld); //Find an external plugin location + RTP_FindLocationEvent event = new RTP_FindLocationEvent(this); //Find an external plugin location Bukkit.getServer().getPluginManager().callEvent(event); //Async Location finder + if (event.isCancelled()) { + randomlyTeleport(sendi); + attempts++; + return; + } Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { Location loc; if (event.getLocation() != null) // && WorldPlayer.checkIsValid(event.getLocation(), pWorld)) loc = event.getLocation(); else { - QueueData queueData = QueueHandler.getRandomAsync(pWorld); + QueueData queueData = QueueHandler.getRandomAsync(worldPlayer); if (queueData != null) loc = queueData.getLocation(); else - loc = WorldPlayer.generateLocation(pWorld); + loc = WorldPlayer.generateLocation(worldPlayer); } attempts++; //Add an attempt //Load chunk and find out if safe location (asynchronously) @@ -61,16 +63,16 @@ public class RTPPlayer { chunk.thenAccept(result -> { //BetterRTP.debug("Checking location for " + p.getName()); Location tpLoc; - tpLoc = getSafeLocation(pWorld.getWorldtype(), pWorld.getWorld(), loc, pWorld.getMinY(), pWorld.getMaxY(), pWorld.getBiomes()); + tpLoc = getSafeLocation(worldPlayer.getWorldtype(), worldPlayer.getWorld(), loc, worldPlayer.getMinY(), worldPlayer.getMaxY(), worldPlayer.getBiomes()); attemptedLocations.add(loc); //Valid location? if (tpLoc != null && checkDepends(tpLoc)) { tpLoc.add(0.5, 0, 0.5); //Center location - if (getPl().getEco().charge(p, pWorld)) { - tpLoc.setYaw(p.getLocation().getYaw()); - tpLoc.setPitch(p.getLocation().getPitch()); + if (getPl().getEco().charge(player, worldPlayer)) { + tpLoc.setYaw(player.getLocation().getYaw()); + tpLoc.setPitch(player.getLocation().getPitch()); Bukkit.getScheduler().runTask(BetterRTP.getInstance(), () -> - settings.teleport.sendPlayer(sendi, p, tpLoc, pWorld.getPrice(), attempts, type, pWorld.getWorldtype())); + settings.teleport.sendPlayer(sendi, player, tpLoc, worldPlayer.getPrice(), attempts, type, worldPlayer.getWorldtype())); } } else { randomlyTeleport(sendi); @@ -92,7 +94,7 @@ public class RTPPlayer { // Compressed code for MaxAttempts being met private void metMax(CommandSender sendi, Player p) { settings.teleport.failedTeleport(p, sendi); - getPl().getCooldowns().removeCooldown(p, pWorld.getWorld()); + getPl().getCooldowns().removeCooldown(p, worldPlayer.getWorld()); getPl().getpInfo().getRtping().put(p, false); } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPTeleport.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPTeleport.java index 28a5458..6b53478 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPTeleport.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPTeleport.java @@ -11,6 +11,7 @@ import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WORLD_TYPE; import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; import org.bukkit.scheduler.BukkitRunnable; import java.util.Arrays; @@ -85,19 +86,28 @@ public class RTPTeleport { getPl().getServer().getPluginManager().callEvent(new RTP_TeleportPostEvent(p, loc, oldLoc, type)); } - public void beforeTeleportInstant(CommandSender sendi, Player p) { - effects.getSounds().playDelay(p); - effects.getTitles().showTitle(RTPEffect_Titles.RTP_TITLE_TYPE.NODELAY, p, p.getLocation(), 0, 0); - if (effects.getTitles().sendMsg(RTPEffect_Titles.RTP_TITLE_TYPE.NODELAY)) - MessagesCore.SUCCESS_TELEPORT.send(sendi); - getPl().getServer().getPluginManager().callEvent(new RTP_TeleportPreEvent(p)); + public boolean beforeTeleportInstant(CommandSender sendi, Player p) { + RTP_TeleportPreEvent event = new RTP_TeleportPreEvent(p); + getPl().getServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) { + effects.getSounds().playDelay(p); + effects.getTitles().showTitle(RTPEffect_Titles.RTP_TITLE_TYPE.NODELAY, p, p.getLocation(), 0, 0); + if (effects.getTitles().sendMsg(RTPEffect_Titles.RTP_TITLE_TYPE.NODELAY)) + MessagesCore.SUCCESS_TELEPORT.send(sendi); + } + return event.isCancelled(); } - public void beforeTeleportDelay(Player p, int delay) { //Only Delays should call this - effects.getSounds().playDelay(p); - effects.getTitles().showTitle(RTPEffect_Titles.RTP_TITLE_TYPE.DELAY, p, p.getLocation(), 0, delay); - if (effects.getTitles().sendMsg(RTPEffect_Titles.RTP_TITLE_TYPE.DELAY)) - MessagesCore.DELAY.send(p, delay); + public boolean beforeTeleportDelay(Player p, int delay) { //Only Delays should call this + RTP_TeleportPreEvent event = new RTP_TeleportPreEvent(p); + getPl().getServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) { + effects.getSounds().playDelay(p); + effects.getTitles().showTitle(RTPEffect_Titles.RTP_TITLE_TYPE.DELAY, p, p.getLocation(), 0, delay); + if (effects.getTitles().sendMsg(RTPEffect_Titles.RTP_TITLE_TYPE.DELAY)) + MessagesCore.DELAY.send(p, delay); + } + return event.isCancelled(); } public void cancelledTeleport(Player p) { //Only Delays should call this diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_FindLocationEvent.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_FindLocationEvent.java index 984dc80..7276f0b 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_FindLocationEvent.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_FindLocationEvent.java @@ -1,20 +1,25 @@ package me.SuperRonanCraft.BetterRTP.references.customEvents; +import me.SuperRonanCraft.BetterRTP.player.rtp.RTPPlayer; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; import org.bukkit.Location; import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; import org.jetbrains.annotations.Nullable; //Called when an rtp is finding a valid location -public class RTP_FindLocationEvent extends RTPEvent { +public class RTP_FindLocationEvent extends RTPEvent implements Cancellable { Player p; RTPWorld world; Location loc; //Used to force a location into find event + int attempts; + boolean cancelled; - public RTP_FindLocationEvent(Player p, RTPWorld world) { - this.p = p; - this.world = world; + public RTP_FindLocationEvent(RTPPlayer rtpPlayer) { + this.p = rtpPlayer.getPlayer(); + this.world = rtpPlayer.getWorldPlayer(); + this.attempts = rtpPlayer.getAttempts(); } //A location can be pushed in if a developer wants to inject a custom location @@ -35,4 +40,14 @@ public class RTP_FindLocationEvent extends RTPEvent { public Player getPlayer() { return p; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean b) { + cancelled = b; + } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_TeleportPreEvent.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_TeleportPreEvent.java index 18ed1eb..3f000ae 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_TeleportPreEvent.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/customEvents/RTP_TeleportPreEvent.java @@ -1,17 +1,25 @@ package me.SuperRonanCraft.BetterRTP.references.customEvents; +import lombok.Getter; import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; -public class RTP_TeleportPreEvent extends RTPEvent { //Called upon every rtp call, does not mean player will be teleported +public class RTP_TeleportPreEvent extends RTPEvent implements Cancellable { //Called upon every rtp call, does not mean player will be teleported - Player p; + @Getter Player p; + boolean cancelled; public RTP_TeleportPreEvent(Player p) { this.p = p; } - public Player getPlayer() { - return p; + @Override + public boolean isCancelled() { + return cancelled; } + @Override + public void setCancelled(boolean b) { + cancelled = b; + } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java index ae6a8c2..305527c 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java @@ -1,7 +1,6 @@ package me.SuperRonanCraft.BetterRTP.references.rtpinfo; import me.SuperRonanCraft.BetterRTP.BetterRTP; -import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent; import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_TeleportPostEvent; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseQueue; @@ -11,10 +10,11 @@ import org.bukkit.Location; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.plugin.PluginManager; -import org.bukkit.scheduler.BukkitTask; -import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Random; public class QueueHandler implements Listener { //Randomly queues up some safe locations