mirror of
https://github.com/RonanPlugins/BetterRTP.git
synced 2025-08-17 17:15:47 +00:00
economy bug fix involving delays
This commit is contained in:
parent
5f43ba5590
commit
7b2871f17d
@ -40,7 +40,7 @@ public class CmdPlayer implements RTPCommand, RTPCommandHelpable {
|
||||
if (args.length == 2) {
|
||||
for (Player p : Bukkit.getOnlinePlayers())
|
||||
if (p.getDisplayName().toLowerCase().startsWith(args[1].toLowerCase()))
|
||||
list.add(p.getDisplayName());
|
||||
list.add(p.getName());
|
||||
} else if (args.length == 3) {
|
||||
for (World w : Bukkit.getWorlds())
|
||||
if (w.getName().startsWith(args[2]) && !Main.getInstance().getRTP().disabledWorlds().contains(w.getName()))
|
||||
|
@ -137,6 +137,45 @@ public class RTP {
|
||||
}
|
||||
|
||||
public void start(Player p, CommandSender sendi, String world_name, List<String> biomes, boolean delay) {
|
||||
new RTPPlayer(p, this).teleport(sendi, world_name, biomes, delay);
|
||||
// Check overrides
|
||||
if (world_name == null)
|
||||
world_name = p.getWorld().getName();
|
||||
if (overriden.containsKey(world_name))
|
||||
world_name = overriden.get(world_name);
|
||||
// Not forced and has 'betterrtp.world.<world>'
|
||||
if (sendi == p && !getPl().getPerms().getAWorld(sendi, world_name)) {
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
getPl().getText().getNoPermissionWorld(p, world_name);
|
||||
return;
|
||||
}
|
||||
// Check disabled worlds
|
||||
if (disabledWorlds.contains(world_name)) {
|
||||
getPl().getText().getDisabledWorld(sendi, world_name);
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
// Check if nulled or world doesnt exist
|
||||
if (Bukkit.getWorld(world_name) == null) {
|
||||
getPl().getText().getNotExist(sendi, world_name);
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
WorldPlayer pWorld = getPlayerWorld(p, world_name, biomes, true);
|
||||
// Economy
|
||||
if (!getPl().getEco().charge(sendi, pWorld)) {
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
//Cooldown
|
||||
getPl().getCmd().cooldowns.add(p.getUniqueId());
|
||||
// Delaying? Else, just go
|
||||
getPl().getCmd().rtping.put(p.getUniqueId(), true); //Cache player so they cant run '/rtp' again while rtp'ing
|
||||
RTPPlayer rtp = new RTPPlayer(p, this, pWorld);
|
||||
if (getPl().getSettings().delayEnabled && delay) {
|
||||
new RTPDelay(sendi, rtp, delayTime, cancelOnMove, cancelOnDamage);
|
||||
} else {
|
||||
teleport.beforeTeleportInstant(sendi, p);
|
||||
rtp.randomlyTeleport(sendi);
|
||||
}
|
||||
}
|
||||
}
|
@ -13,12 +13,10 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
||||
|
||||
class RTPDelay implements Listener {
|
||||
private int run;
|
||||
private final WorldPlayer pWorld;
|
||||
private final boolean cancelOnMove, cancelOnDamage;
|
||||
private final RTPPlayer rtp;
|
||||
|
||||
RTPDelay(CommandSender sendi, RTPPlayer rtp, WorldPlayer pWorld, int delay, boolean cancelOnMove, boolean cancelOnDamage) {
|
||||
this.pWorld = pWorld;
|
||||
RTPDelay(CommandSender sendi, RTPPlayer rtp, int delay, boolean cancelOnMove, boolean cancelOnDamage) {
|
||||
this.cancelOnMove = cancelOnMove;
|
||||
this.cancelOnDamage = cancelOnDamage;
|
||||
this.rtp = rtp;
|
||||
@ -26,7 +24,7 @@ class RTPDelay implements Listener {
|
||||
}
|
||||
|
||||
private void delay(CommandSender sendi, int delay) {
|
||||
getPl().getRTP().getTeleport().beforeTeleportDelay(pWorld.getPlayer(), delay);
|
||||
getPl().getRTP().getTeleport().beforeTeleportDelay(rtp.getPlayer(), delay);
|
||||
run = Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), run(sendi, this), delay * 20);
|
||||
if (cancelOnMove || cancelOnDamage)
|
||||
Bukkit.getPluginManager().registerEvents(this, Main.getInstance());
|
||||
@ -36,7 +34,7 @@ class RTPDelay implements Listener {
|
||||
@SuppressWarnings("unused")
|
||||
private void event(PlayerMoveEvent e) {
|
||||
if (cancelOnMove)
|
||||
if (e.getPlayer().equals(pWorld.getPlayer()) &&
|
||||
if (e.getPlayer().equals(rtp.getPlayer()) &&
|
||||
(e.getTo() != null &&
|
||||
(e.getTo().getBlockX() != e.getFrom().getBlockX() ||
|
||||
e.getTo().getBlockY() != e.getFrom().getBlockY() ||
|
||||
@ -51,7 +49,7 @@ class RTPDelay implements Listener {
|
||||
private void event(EntityDamageEvent e) {
|
||||
if (cancelOnDamage)
|
||||
if (e.getEntity() instanceof Player){
|
||||
if (e.getEntity().equals(pWorld.getPlayer()))
|
||||
if (e.getEntity().equals(rtp.getPlayer()))
|
||||
cancel();
|
||||
}
|
||||
}
|
||||
@ -60,18 +58,18 @@ class RTPDelay implements Listener {
|
||||
Bukkit.getScheduler().cancelTask(run);
|
||||
if (!Bukkit.getScheduler().isCurrentlyRunning(run)) {
|
||||
HandlerList.unregisterAll(this);
|
||||
getPl().getRTP().getTeleport().cancelledTeleport(pWorld.getPlayer());
|
||||
getPl().getEco().unCharge(pWorld.getPlayer(), pWorld.getPrice());
|
||||
getPl().getCmd().cooldowns.remove(pWorld.getPlayer().getUniqueId());
|
||||
getPl().getCmd().rtping.put(pWorld.getPlayer().getUniqueId(), false);
|
||||
getPl().getRTP().getTeleport().cancelledTeleport(rtp.getPlayer());
|
||||
getPl().getEco().unCharge(rtp.getPlayer(), rtp.pWorld);
|
||||
getPl().getCmd().cooldowns.remove(rtp.getPlayer().getUniqueId());
|
||||
getPl().getCmd().rtping.put(rtp.getPlayer().getUniqueId(), false);
|
||||
}
|
||||
}
|
||||
|
||||
private Runnable run(final CommandSender sendi, final RTPDelay cls) {
|
||||
return () -> {
|
||||
HandlerList.unregisterAll(cls);
|
||||
if (getPl().getCmd().rtping.containsKey(pWorld.getPlayer().getUniqueId()))
|
||||
rtp.findSafeLocation(sendi, pWorld);
|
||||
if (getPl().getCmd().rtping.containsKey(rtp.getPlayer().getUniqueId()))
|
||||
rtp.randomlyTeleport(sendi);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,6 @@ package me.SuperRonanCraft.BetterRTP.player.rtp;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import me.SuperRonanCraft.BetterRTP.Main;
|
||||
import me.SuperRonanCraft.BetterRTP.references.worlds.*;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
@ -18,64 +17,28 @@ public class RTPPlayer {
|
||||
|
||||
private final Player p;
|
||||
private final RTP settings;
|
||||
WorldPlayer pWorld;
|
||||
|
||||
RTPPlayer(Player p, RTP settings) {
|
||||
RTPPlayer(Player p, RTP settings, WorldPlayer pWorld) {
|
||||
this.p = p;
|
||||
this.settings = settings;
|
||||
this.pWorld = pWorld;
|
||||
}
|
||||
|
||||
public void teleport(CommandSender sendi, String worldName, List<String> biomes, boolean delay) {
|
||||
// Check overrides
|
||||
if (worldName == null)
|
||||
worldName = p.getWorld().getName();
|
||||
if (settings.overriden.containsKey(worldName))
|
||||
worldName = settings.overriden.get(worldName);
|
||||
// Not forced and has 'betterrtp.world.<world>'
|
||||
if (sendi == p && !getPl().getPerms().getAWorld(sendi, worldName)) {
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
getPl().getText().getNoPermissionWorld(p, worldName);
|
||||
return;
|
||||
}
|
||||
// Check disabled worlds
|
||||
if (settings.disabledWorlds.contains(worldName)) {
|
||||
getPl().getText().getDisabledWorld(sendi, worldName);
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
// Check if nulled or world doesnt exist
|
||||
if (Bukkit.getWorld(worldName) == null) {
|
||||
getPl().getText().getNotExist(sendi, worldName);
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
WorldPlayer pWorld = settings.getPlayerWorld(p, worldName, biomes, true);
|
||||
// Economy
|
||||
if (!getPl().getEco().charge(p, pWorld.getPrice())) {
|
||||
//getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
//Cooldown
|
||||
getPl().getCmd().cooldowns.add(p.getUniqueId());
|
||||
// Delaying? Else, just go
|
||||
getPl().getCmd().rtping.put(p.getUniqueId(), true); //Cache player so they cant run '/rtp' again while rtp'ing
|
||||
if (getPl().getSettings().delayEnabled && delay) {
|
||||
new RTPDelay(sendi, this, pWorld, settings.delayTime, settings.cancelOnMove, settings.cancelOnDamage);
|
||||
} else {
|
||||
settings.teleport.beforeTeleportInstant(p);
|
||||
findSafeLocation(sendi, pWorld);
|
||||
}
|
||||
public Player getPlayer() {
|
||||
return p;
|
||||
}
|
||||
|
||||
void findSafeLocation(CommandSender sendi, WorldPlayer pWorld) {
|
||||
void randomlyTeleport(CommandSender sendi) {
|
||||
if (pWorld.getAttempts() >= settings.maxAttempts) //Cancel out, too many tried
|
||||
metMax(sendi, pWorld.getPlayer(), pWorld.getPrice());
|
||||
metMax(sendi, p);
|
||||
else { //Try again to find a safe location
|
||||
Location loc = pWorld.generateRandomXZ(settings.defaultWorld); //randomLoc(pWorld);
|
||||
CompletableFuture<Chunk> chunk = PaperLib.getChunkAtAsync(pWorld.getWorld(), loc.getBlockX(), loc.getBlockZ());
|
||||
chunk.thenAccept(result -> {
|
||||
Location tpLoc;
|
||||
float yaw = pWorld.getPlayer().getLocation().getYaw();
|
||||
float pitch = pWorld.getPlayer().getLocation().getPitch();
|
||||
float yaw = p.getLocation().getYaw();
|
||||
float pitch = p.getLocation().getPitch();
|
||||
switch (pWorld.getWorldtype()) { //Get a Y position and check for bad blocks
|
||||
case NETHER:
|
||||
tpLoc = getLocAtNether(loc.getBlockX(), loc.getBlockZ(), pWorld.getWorld(), yaw, pitch, pWorld); break;
|
||||
@ -84,21 +47,21 @@ public class RTPPlayer {
|
||||
tpLoc = getLocAtNormal(loc.getBlockX(), loc.getBlockZ(), pWorld.getWorld(), yaw, pitch, pWorld);
|
||||
}
|
||||
if (tpLoc != null && checkDepends(tpLoc))
|
||||
settings.teleport.sendPlayer(sendi, pWorld.getPlayer(), tpLoc, pWorld.getPrice(), pWorld.getAttempts());
|
||||
settings.teleport.sendPlayer(sendi, p, tpLoc, pWorld.getPrice(), pWorld.getAttempts());
|
||||
else
|
||||
findSafeLocation(sendi, pWorld);
|
||||
randomlyTeleport(sendi);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Compressed code for MaxAttempts being met
|
||||
private void metMax(CommandSender sendi, Player p, int price) {
|
||||
private void metMax(CommandSender sendi, Player p) {
|
||||
if (p == sendi)
|
||||
getPl().getText().getFailedNotSafe(sendi, settings.maxAttempts);
|
||||
else
|
||||
getPl().getText().getOtherNotSafe(sendi, settings.maxAttempts, p.getDisplayName());
|
||||
getPl().getText().getOtherNotSafe(sendi, settings.maxAttempts, p.getName());
|
||||
getPl().getCmd().cooldowns.remove(p.getUniqueId());
|
||||
getPl().getEco().unCharge(p, price);
|
||||
getPl().getEco().unCharge(p, pWorld);
|
||||
getPl().getCmd().rtping.put(p.getUniqueId(), false);
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ public class RTPTeleport {
|
||||
public void run() {
|
||||
afterTeleport(p, loc, price, attempts);
|
||||
if (sendi != p) //Tell player who requested that the player rtp'd
|
||||
sendSuccessMsg(sendi, p.getDisplayName(), loc, price, false, attempts);
|
||||
sendSuccessMsg(sendi, p.getName(), loc, price, false, attempts);
|
||||
getPl().getCmd().rtping.remove(p.getUniqueId()); //No longer rtp'ing
|
||||
}
|
||||
});
|
||||
@ -76,14 +76,14 @@ public class RTPTeleport {
|
||||
ePotions.giveEffects(p);
|
||||
eTitles.showTitle(RTPTitles.RTP_TITLE_TYPE.TELEPORT, p, loc, attempts, 0);
|
||||
if (eTitles.sendMsg(RTPTitles.RTP_TITLE_TYPE.TELEPORT))
|
||||
sendSuccessMsg(p, p.getDisplayName(), loc, price, true, attempts);
|
||||
sendSuccessMsg(p, p.getName(), loc, price, true, attempts);
|
||||
}
|
||||
|
||||
public void beforeTeleportInstant(Player p) {
|
||||
public void beforeTeleportInstant(CommandSender sendi, Player p) {
|
||||
eSounds.playDelay(p);
|
||||
eTitles.showTitle(RTPTitles.RTP_TITLE_TYPE.NODELAY, p, p.getLocation(), 0, 0);
|
||||
if (eTitles.sendMsg(RTPTitles.RTP_TITLE_TYPE.NODELAY))
|
||||
getPl().getText().getSuccessTeleport(p);
|
||||
getPl().getText().getSuccessTeleport(sendi);
|
||||
}
|
||||
|
||||
public void beforeTeleportDelay(Player p, int delay) { //Only Delays should call this
|
||||
|
@ -2,9 +2,11 @@ package me.SuperRonanCraft.BetterRTP.references.depends;
|
||||
|
||||
import me.SuperRonanCraft.BetterRTP.references.file.FileBasics;
|
||||
import me.SuperRonanCraft.BetterRTP.Main;
|
||||
import me.SuperRonanCraft.BetterRTP.references.worlds.WorldPlayer;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
@ -13,14 +15,17 @@ public class DepEconomy {
|
||||
private int hunger = 0;
|
||||
private boolean checked = false;
|
||||
|
||||
public boolean charge(Player player, int price) {
|
||||
public boolean charge(CommandSender sendi, WorldPlayer pWorld) {
|
||||
check(false);
|
||||
Player player = pWorld.getPlayer();
|
||||
//Hunger Stuff
|
||||
boolean took_food = false;
|
||||
if (hunger != 0 && (player.getGameMode() == GameMode.SURVIVAL || player.getGameMode() == GameMode.ADVENTURE)) {
|
||||
if (hunger != 0
|
||||
&& sendi == player
|
||||
&& (player.getGameMode() == GameMode.SURVIVAL || player.getGameMode() == GameMode.ADVENTURE)) {
|
||||
boolean has_hunger = player.getFoodLevel() > hunger;
|
||||
if (!has_hunger) {
|
||||
Main.getInstance().getText().getFailedHunger(player);
|
||||
Main.getInstance().getText().getFailedHunger(sendi);
|
||||
return false;
|
||||
} else {
|
||||
player.setFoodLevel(player.getFoodLevel() - hunger);
|
||||
@ -28,15 +33,16 @@ public class DepEconomy {
|
||||
}
|
||||
}
|
||||
//Economy Stuff
|
||||
if (e != null && price != 0 && !Main.getInstance().getPerms().getBypassEconomy(player)) {
|
||||
if (e != null && pWorld.getPrice() != 0 && !Main.getInstance().getPerms().getBypassEconomy(sendi)) {
|
||||
try {
|
||||
EconomyResponse r = e.withdrawPlayer(player, price);
|
||||
EconomyResponse r = e.withdrawPlayer(player, pWorld.getPrice());
|
||||
boolean passed_economy = r.transactionSuccess();
|
||||
if (!passed_economy) {
|
||||
Main.getInstance().getText().getFailedPrice(player, price);
|
||||
Main.getInstance().getText().getFailedPrice(sendi, pWorld.getPrice());
|
||||
if (took_food)
|
||||
player.setFoodLevel(player.getFoodLevel() + hunger);
|
||||
}
|
||||
} else
|
||||
pWorld.eco_money_taken = true;
|
||||
return passed_economy;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@ -46,10 +52,9 @@ public class DepEconomy {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void unCharge(Player p, int price) {
|
||||
if (e != null)
|
||||
if (price != 0)
|
||||
e.depositPlayer(p, price);
|
||||
public void unCharge(Player p, WorldPlayer pWorld) {
|
||||
if (e != null && pWorld.getPrice() != 0 && pWorld.eco_money_taken)
|
||||
e.depositPlayer(p, pWorld.getPrice());
|
||||
}
|
||||
|
||||
public void load() {
|
||||
|
@ -20,6 +20,8 @@ public class WorldPlayer implements RTPWorld {
|
||||
private final World world;
|
||||
private WORLD_TYPE world_type;
|
||||
private RTPPermissionGroup.RTPPermConfiguration config = null;
|
||||
//Economy
|
||||
public boolean eco_money_taken = false;
|
||||
|
||||
public WorldPlayer(CommandSender p, World world) {
|
||||
this.p = p;
|
||||
|
Loading…
x
Reference in New Issue
Block a user