TpPre & FindLocation Event cancellable

This commit is contained in:
RonanCraft 2022-11-11 09:42:41 -05:00
parent 865a6cead9
commit 33a25bccab
8 changed files with 88 additions and 52 deletions

View File

@ -7,7 +7,7 @@
<groupId>me.SuperRonanCraft</groupId> <groupId>me.SuperRonanCraft</groupId>
<artifactId>BetterRTP</artifactId> <artifactId>BetterRTP</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>3.6.0</version> <version>3.6.1</version>
<properties> <properties>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>

View File

@ -99,8 +99,8 @@ public class RTP {
if (getPl().getSettings().isDelayEnabled() && pWorld.isApplyDelay()) { if (getPl().getSettings().isDelayEnabled() && pWorld.isApplyDelay()) {
new RTPDelay(sendi, rtpPlayer, delayTime, cancelOnMove, cancelOnDamage); new RTPDelay(sendi, rtpPlayer, delayTime, cancelOnMove, cancelOnDamage);
} else { } else {
teleport.beforeTeleportInstant(sendi, p); if (!teleport.beforeTeleportInstant(sendi, p))
rtpPlayer.randomlyTeleport(sendi); rtpPlayer.randomlyTeleport(sendi);
} }
} }

View File

@ -24,10 +24,11 @@ class RTPDelay implements Listener {
} }
private void delay(CommandSender sendi, int delay) { private void delay(CommandSender sendi, int delay) {
getPl().getRTP().getTeleport().beforeTeleportDelay(rtp.getPlayer(), delay); if (!getPl().getRTP().getTeleport().beforeTeleportDelay(rtp.getPlayer(), delay)) {
run = Bukkit.getScheduler().scheduleSyncDelayedTask(BetterRTP.getInstance(), run(sendi, this), delay * 20L); run = Bukkit.getScheduler().scheduleSyncDelayedTask(BetterRTP.getInstance(), run(sendi, this), delay * 20L);
if (cancelOnMove || cancelOnDamage) if (cancelOnMove || cancelOnDamage)
Bukkit.getPluginManager().registerEvents(this, BetterRTP.getInstance()); Bukkit.getPluginManager().registerEvents(this, BetterRTP.getInstance());
}
} }
@EventHandler @EventHandler
@ -60,7 +61,7 @@ class RTPDelay implements Listener {
HandlerList.unregisterAll(this); HandlerList.unregisterAll(this);
getPl().getRTP().getTeleport().cancelledTeleport(rtp.getPlayer()); getPl().getRTP().getTeleport().cancelledTeleport(rtp.getPlayer());
//getPl().getEco().unCharge(rtp.getPlayer(), rtp.pWorld); //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); getPl().getpInfo().getRtping().put(rtp.getPlayer(), false);
Bukkit.getServer().getPluginManager().callEvent(new RTP_CancelledEvent(rtp.getPlayer())); Bukkit.getServer().getPluginManager().callEvent(new RTP_CancelledEvent(rtp.getPlayer()));
} }

View File

@ -1,5 +1,6 @@
package me.SuperRonanCraft.BetterRTP.player.rtp; package me.SuperRonanCraft.BetterRTP.player.rtp;
import lombok.Getter;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent; import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueData; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueData;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler;
@ -18,42 +19,43 @@ import java.util.concurrent.CompletableFuture;
public class RTPPlayer { public class RTPPlayer {
private final Player p; @Getter private final Player player;
private final RTP settings; private final RTP settings;
WorldPlayer pWorld; @Getter WorldPlayer worldPlayer;
RTP_TYPE type; @Getter RTP_TYPE type;
int attempts; @Getter int attempts;
List<Location> attemptedLocations = new ArrayList<>(); List<Location> attemptedLocations = new ArrayList<>();
RTPPlayer(Player p, RTP settings, WorldPlayer pWorld, RTP_TYPE type) { RTPPlayer(Player player, RTP settings, WorldPlayer worldPlayer, RTP_TYPE type) {
this.p = p; this.player = player;
this.settings = settings; this.settings = settings;
this.pWorld = pWorld; this.worldPlayer = worldPlayer;
this.type = type; this.type = type;
} }
public Player getPlayer() {
return p;
}
void randomlyTeleport(CommandSender sendi) { void randomlyTeleport(CommandSender sendi) {
if (attempts >= settings.maxAttempts) //Cancel out, too many tries if (attempts >= settings.maxAttempts) //Cancel out, too many tries
metMax(sendi, p); metMax(sendi, player);
else { //Try again to find a safe location else { //Try again to find a safe location
//Find a location from another Plugin //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); Bukkit.getServer().getPluginManager().callEvent(event);
//Async Location finder //Async Location finder
if (event.isCancelled()) {
randomlyTeleport(sendi);
attempts++;
return;
}
Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> {
Location loc; Location loc;
if (event.getLocation() != null) // && WorldPlayer.checkIsValid(event.getLocation(), pWorld)) if (event.getLocation() != null) // && WorldPlayer.checkIsValid(event.getLocation(), pWorld))
loc = event.getLocation(); loc = event.getLocation();
else { else {
QueueData queueData = QueueHandler.getRandomAsync(pWorld); QueueData queueData = QueueHandler.getRandomAsync(worldPlayer);
if (queueData != null) if (queueData != null)
loc = queueData.getLocation(); loc = queueData.getLocation();
else else
loc = WorldPlayer.generateLocation(pWorld); loc = WorldPlayer.generateLocation(worldPlayer);
} }
attempts++; //Add an attempt attempts++; //Add an attempt
//Load chunk and find out if safe location (asynchronously) //Load chunk and find out if safe location (asynchronously)
@ -61,16 +63,16 @@ public class RTPPlayer {
chunk.thenAccept(result -> { chunk.thenAccept(result -> {
//BetterRTP.debug("Checking location for " + p.getName()); //BetterRTP.debug("Checking location for " + p.getName());
Location tpLoc; 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); attemptedLocations.add(loc);
//Valid location? //Valid location?
if (tpLoc != null && checkDepends(tpLoc)) { if (tpLoc != null && checkDepends(tpLoc)) {
tpLoc.add(0.5, 0, 0.5); //Center location tpLoc.add(0.5, 0, 0.5); //Center location
if (getPl().getEco().charge(p, pWorld)) { if (getPl().getEco().charge(player, worldPlayer)) {
tpLoc.setYaw(p.getLocation().getYaw()); tpLoc.setYaw(player.getLocation().getYaw());
tpLoc.setPitch(p.getLocation().getPitch()); tpLoc.setPitch(player.getLocation().getPitch());
Bukkit.getScheduler().runTask(BetterRTP.getInstance(), () -> 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 { } else {
randomlyTeleport(sendi); randomlyTeleport(sendi);
@ -92,7 +94,7 @@ public class RTPPlayer {
// Compressed code for MaxAttempts being met // Compressed code for MaxAttempts being met
private void metMax(CommandSender sendi, Player p) { private void metMax(CommandSender sendi, Player p) {
settings.teleport.failedTeleport(p, sendi); settings.teleport.failedTeleport(p, sendi);
getPl().getCooldowns().removeCooldown(p, pWorld.getWorld()); getPl().getCooldowns().removeCooldown(p, worldPlayer.getWorld());
getPl().getpInfo().getRtping().put(p, false); getPl().getpInfo().getRtping().put(p, false);
} }

View File

@ -11,6 +11,7 @@ import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WORLD_TYPE;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.Arrays; import java.util.Arrays;
@ -85,19 +86,28 @@ public class RTPTeleport {
getPl().getServer().getPluginManager().callEvent(new RTP_TeleportPostEvent(p, loc, oldLoc, type)); getPl().getServer().getPluginManager().callEvent(new RTP_TeleportPostEvent(p, loc, oldLoc, type));
} }
public void beforeTeleportInstant(CommandSender sendi, Player p) { public boolean beforeTeleportInstant(CommandSender sendi, Player p) {
effects.getSounds().playDelay(p); RTP_TeleportPreEvent event = new RTP_TeleportPreEvent(p);
effects.getTitles().showTitle(RTPEffect_Titles.RTP_TITLE_TYPE.NODELAY, p, p.getLocation(), 0, 0); getPl().getServer().getPluginManager().callEvent(event);
if (effects.getTitles().sendMsg(RTPEffect_Titles.RTP_TITLE_TYPE.NODELAY)) if (!event.isCancelled()) {
MessagesCore.SUCCESS_TELEPORT.send(sendi); effects.getSounds().playDelay(p);
getPl().getServer().getPluginManager().callEvent(new RTP_TeleportPreEvent(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 public boolean beforeTeleportDelay(Player p, int delay) { //Only Delays should call this
effects.getSounds().playDelay(p); RTP_TeleportPreEvent event = new RTP_TeleportPreEvent(p);
effects.getTitles().showTitle(RTPEffect_Titles.RTP_TITLE_TYPE.DELAY, p, p.getLocation(), 0, delay); getPl().getServer().getPluginManager().callEvent(event);
if (effects.getTitles().sendMsg(RTPEffect_Titles.RTP_TITLE_TYPE.DELAY)) if (!event.isCancelled()) {
MessagesCore.DELAY.send(p, delay); 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 public void cancelledTeleport(Player p) { //Only Delays should call this

View File

@ -1,20 +1,25 @@
package me.SuperRonanCraft.BetterRTP.references.customEvents; package me.SuperRonanCraft.BetterRTP.references.customEvents;
import me.SuperRonanCraft.BetterRTP.player.rtp.RTPPlayer;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
//Called when an rtp is finding a valid location //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; Player p;
RTPWorld world; RTPWorld world;
Location loc; //Used to force a location into find event Location loc; //Used to force a location into find event
int attempts;
boolean cancelled;
public RTP_FindLocationEvent(Player p, RTPWorld world) { public RTP_FindLocationEvent(RTPPlayer rtpPlayer) {
this.p = p; this.p = rtpPlayer.getPlayer();
this.world = world; this.world = rtpPlayer.getWorldPlayer();
this.attempts = rtpPlayer.getAttempts();
} }
//A location can be pushed in if a developer wants to inject a custom location //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() { public Player getPlayer() {
return p; return p;
} }
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean b) {
cancelled = b;
}
} }

View File

@ -1,17 +1,25 @@
package me.SuperRonanCraft.BetterRTP.references.customEvents; package me.SuperRonanCraft.BetterRTP.references.customEvents;
import lombok.Getter;
import org.bukkit.entity.Player; 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) { public RTP_TeleportPreEvent(Player p) {
this.p = p; this.p = p;
} }
public Player getPlayer() { @Override
return p; public boolean isCancelled() {
return cancelled;
} }
@Override
public void setCancelled(boolean b) {
cancelled = b;
}
} }

View File

@ -1,7 +1,6 @@
package me.SuperRonanCraft.BetterRTP.references.rtpinfo; package me.SuperRonanCraft.BetterRTP.references.rtpinfo;
import me.SuperRonanCraft.BetterRTP.BetterRTP; 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.customEvents.RTP_TeleportPostEvent;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseQueue; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseQueue;
@ -11,10 +10,11 @@ import org.bukkit.Location;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.plugin.PluginManager; 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 public class QueueHandler implements Listener { //Randomly queues up some safe locations