economy bug fix involving delays

This commit is contained in:
SuperRonanCraft 2020-09-29 17:38:45 -04:00
parent 5f43ba5590
commit 7b2871f17d
7 changed files with 87 additions and 80 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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() {

View File

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