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>
<artifactId>BetterRTP</artifactId>
<packaging>jar</packaging>
<version>3.6.0</version>
<version>3.6.1</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>

View File

@ -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);
}
}

View File

@ -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()));
}

View File

@ -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<Location> 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);
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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