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