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) { if (args.length == 2) {
for (Player p : Bukkit.getOnlinePlayers()) for (Player p : Bukkit.getOnlinePlayers())
if (p.getDisplayName().toLowerCase().startsWith(args[1].toLowerCase())) if (p.getDisplayName().toLowerCase().startsWith(args[1].toLowerCase()))
list.add(p.getDisplayName()); list.add(p.getName());
} else if (args.length == 3) { } else if (args.length == 3) {
for (World w : Bukkit.getWorlds()) for (World w : Bukkit.getWorlds())
if (w.getName().startsWith(args[2]) && !Main.getInstance().getRTP().disabledWorlds().contains(w.getName())) 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) { 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 { class RTPDelay implements Listener {
private int run; private int run;
private final WorldPlayer pWorld;
private final boolean cancelOnMove, cancelOnDamage; private final boolean cancelOnMove, cancelOnDamage;
private final RTPPlayer rtp; private final RTPPlayer rtp;
RTPDelay(CommandSender sendi, RTPPlayer rtp, WorldPlayer pWorld, int delay, boolean cancelOnMove, boolean cancelOnDamage) { RTPDelay(CommandSender sendi, RTPPlayer rtp, int delay, boolean cancelOnMove, boolean cancelOnDamage) {
this.pWorld = pWorld;
this.cancelOnMove = cancelOnMove; this.cancelOnMove = cancelOnMove;
this.cancelOnDamage = cancelOnDamage; this.cancelOnDamage = cancelOnDamage;
this.rtp = rtp; this.rtp = rtp;
@ -26,7 +24,7 @@ class RTPDelay implements Listener {
} }
private void delay(CommandSender sendi, int delay) { 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); run = Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), run(sendi, this), delay * 20);
if (cancelOnMove || cancelOnDamage) if (cancelOnMove || cancelOnDamage)
Bukkit.getPluginManager().registerEvents(this, Main.getInstance()); Bukkit.getPluginManager().registerEvents(this, Main.getInstance());
@ -36,7 +34,7 @@ class RTPDelay implements Listener {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private void event(PlayerMoveEvent e) { private void event(PlayerMoveEvent e) {
if (cancelOnMove) if (cancelOnMove)
if (e.getPlayer().equals(pWorld.getPlayer()) && if (e.getPlayer().equals(rtp.getPlayer()) &&
(e.getTo() != null && (e.getTo() != null &&
(e.getTo().getBlockX() != e.getFrom().getBlockX() || (e.getTo().getBlockX() != e.getFrom().getBlockX() ||
e.getTo().getBlockY() != e.getFrom().getBlockY() || e.getTo().getBlockY() != e.getFrom().getBlockY() ||
@ -51,7 +49,7 @@ class RTPDelay implements Listener {
private void event(EntityDamageEvent e) { private void event(EntityDamageEvent e) {
if (cancelOnDamage) if (cancelOnDamage)
if (e.getEntity() instanceof Player){ if (e.getEntity() instanceof Player){
if (e.getEntity().equals(pWorld.getPlayer())) if (e.getEntity().equals(rtp.getPlayer()))
cancel(); cancel();
} }
} }
@ -60,18 +58,18 @@ class RTPDelay implements Listener {
Bukkit.getScheduler().cancelTask(run); Bukkit.getScheduler().cancelTask(run);
if (!Bukkit.getScheduler().isCurrentlyRunning(run)) { if (!Bukkit.getScheduler().isCurrentlyRunning(run)) {
HandlerList.unregisterAll(this); HandlerList.unregisterAll(this);
getPl().getRTP().getTeleport().cancelledTeleport(pWorld.getPlayer()); getPl().getRTP().getTeleport().cancelledTeleport(rtp.getPlayer());
getPl().getEco().unCharge(pWorld.getPlayer(), pWorld.getPrice()); getPl().getEco().unCharge(rtp.getPlayer(), rtp.pWorld);
getPl().getCmd().cooldowns.remove(pWorld.getPlayer().getUniqueId()); getPl().getCmd().cooldowns.remove(rtp.getPlayer().getUniqueId());
getPl().getCmd().rtping.put(pWorld.getPlayer().getUniqueId(), false); getPl().getCmd().rtping.put(rtp.getPlayer().getUniqueId(), false);
} }
} }
private Runnable run(final CommandSender sendi, final RTPDelay cls) { private Runnable run(final CommandSender sendi, final RTPDelay cls) {
return () -> { return () -> {
HandlerList.unregisterAll(cls); HandlerList.unregisterAll(cls);
if (getPl().getCmd().rtping.containsKey(pWorld.getPlayer().getUniqueId())) if (getPl().getCmd().rtping.containsKey(rtp.getPlayer().getUniqueId()))
rtp.findSafeLocation(sendi, pWorld); rtp.randomlyTeleport(sendi);
}; };
} }

View File

@ -3,7 +3,6 @@ package me.SuperRonanCraft.BetterRTP.player.rtp;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import me.SuperRonanCraft.BetterRTP.Main; import me.SuperRonanCraft.BetterRTP.Main;
import me.SuperRonanCraft.BetterRTP.references.worlds.*; import me.SuperRonanCraft.BetterRTP.references.worlds.*;
import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
@ -18,64 +17,28 @@ public class RTPPlayer {
private final Player p; private final Player p;
private final RTP settings; private final RTP settings;
WorldPlayer pWorld;
RTPPlayer(Player p, RTP settings) { RTPPlayer(Player p, RTP settings, WorldPlayer pWorld) {
this.p = p; this.p = p;
this.settings = settings; this.settings = settings;
this.pWorld = pWorld;
} }
public void teleport(CommandSender sendi, String worldName, List<String> biomes, boolean delay) { public Player getPlayer() {
// Check overrides return p;
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);
}
} }
void findSafeLocation(CommandSender sendi, WorldPlayer pWorld) { void randomlyTeleport(CommandSender sendi) {
if (pWorld.getAttempts() >= settings.maxAttempts) //Cancel out, too many tried 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 else { //Try again to find a safe location
Location loc = pWorld.generateRandomXZ(settings.defaultWorld); //randomLoc(pWorld); Location loc = pWorld.generateRandomXZ(settings.defaultWorld); //randomLoc(pWorld);
CompletableFuture<Chunk> chunk = PaperLib.getChunkAtAsync(pWorld.getWorld(), loc.getBlockX(), loc.getBlockZ()); CompletableFuture<Chunk> chunk = PaperLib.getChunkAtAsync(pWorld.getWorld(), loc.getBlockX(), loc.getBlockZ());
chunk.thenAccept(result -> { chunk.thenAccept(result -> {
Location tpLoc; Location tpLoc;
float yaw = pWorld.getPlayer().getLocation().getYaw(); float yaw = p.getLocation().getYaw();
float pitch = pWorld.getPlayer().getLocation().getPitch(); float pitch = p.getLocation().getPitch();
switch (pWorld.getWorldtype()) { //Get a Y position and check for bad blocks switch (pWorld.getWorldtype()) { //Get a Y position and check for bad blocks
case NETHER: case NETHER:
tpLoc = getLocAtNether(loc.getBlockX(), loc.getBlockZ(), pWorld.getWorld(), yaw, pitch, pWorld); break; 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); tpLoc = getLocAtNormal(loc.getBlockX(), loc.getBlockZ(), pWorld.getWorld(), yaw, pitch, pWorld);
} }
if (tpLoc != null && checkDepends(tpLoc)) 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 else
findSafeLocation(sendi, pWorld); randomlyTeleport(sendi);
}); });
} }
} }
// Compressed code for MaxAttempts being met // 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) if (p == sendi)
getPl().getText().getFailedNotSafe(sendi, settings.maxAttempts); getPl().getText().getFailedNotSafe(sendi, settings.maxAttempts);
else else
getPl().getText().getOtherNotSafe(sendi, settings.maxAttempts, p.getDisplayName()); getPl().getText().getOtherNotSafe(sendi, settings.maxAttempts, p.getName());
getPl().getCmd().cooldowns.remove(p.getUniqueId()); getPl().getCmd().cooldowns.remove(p.getUniqueId());
getPl().getEco().unCharge(p, price); getPl().getEco().unCharge(p, pWorld);
getPl().getCmd().rtping.put(p.getUniqueId(), false); getPl().getCmd().rtping.put(p.getUniqueId(), false);
} }

View File

@ -57,7 +57,7 @@ public class RTPTeleport {
public void run() { public void run() {
afterTeleport(p, loc, price, attempts); afterTeleport(p, loc, price, attempts);
if (sendi != p) //Tell player who requested that the player rtp'd 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 getPl().getCmd().rtping.remove(p.getUniqueId()); //No longer rtp'ing
} }
}); });
@ -76,14 +76,14 @@ public class RTPTeleport {
ePotions.giveEffects(p); ePotions.giveEffects(p);
eTitles.showTitle(RTPTitles.RTP_TITLE_TYPE.TELEPORT, p, loc, attempts, 0); eTitles.showTitle(RTPTitles.RTP_TITLE_TYPE.TELEPORT, p, loc, attempts, 0);
if (eTitles.sendMsg(RTPTitles.RTP_TITLE_TYPE.TELEPORT)) 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); eSounds.playDelay(p);
eTitles.showTitle(RTPTitles.RTP_TITLE_TYPE.NODELAY, p, p.getLocation(), 0, 0); eTitles.showTitle(RTPTitles.RTP_TITLE_TYPE.NODELAY, p, p.getLocation(), 0, 0);
if (eTitles.sendMsg(RTPTitles.RTP_TITLE_TYPE.NODELAY)) 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 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.references.file.FileBasics;
import me.SuperRonanCraft.BetterRTP.Main; import me.SuperRonanCraft.BetterRTP.Main;
import me.SuperRonanCraft.BetterRTP.references.worlds.WorldPlayer;
import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse; import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.RegisteredServiceProvider;
@ -13,14 +15,17 @@ public class DepEconomy {
private int hunger = 0; private int hunger = 0;
private boolean checked = false; private boolean checked = false;
public boolean charge(Player player, int price) { public boolean charge(CommandSender sendi, WorldPlayer pWorld) {
check(false); check(false);
Player player = pWorld.getPlayer();
//Hunger Stuff //Hunger Stuff
boolean took_food = false; 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; boolean has_hunger = player.getFoodLevel() > hunger;
if (!has_hunger) { if (!has_hunger) {
Main.getInstance().getText().getFailedHunger(player); Main.getInstance().getText().getFailedHunger(sendi);
return false; return false;
} else { } else {
player.setFoodLevel(player.getFoodLevel() - hunger); player.setFoodLevel(player.getFoodLevel() - hunger);
@ -28,15 +33,16 @@ public class DepEconomy {
} }
} }
//Economy Stuff //Economy Stuff
if (e != null && price != 0 && !Main.getInstance().getPerms().getBypassEconomy(player)) { if (e != null && pWorld.getPrice() != 0 && !Main.getInstance().getPerms().getBypassEconomy(sendi)) {
try { try {
EconomyResponse r = e.withdrawPlayer(player, price); EconomyResponse r = e.withdrawPlayer(player, pWorld.getPrice());
boolean passed_economy = r.transactionSuccess(); boolean passed_economy = r.transactionSuccess();
if (!passed_economy) { if (!passed_economy) {
Main.getInstance().getText().getFailedPrice(player, price); Main.getInstance().getText().getFailedPrice(sendi, pWorld.getPrice());
if (took_food) if (took_food)
player.setFoodLevel(player.getFoodLevel() + hunger); player.setFoodLevel(player.getFoodLevel() + hunger);
} } else
pWorld.eco_money_taken = true;
return passed_economy; return passed_economy;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -46,10 +52,9 @@ public class DepEconomy {
return true; return true;
} }
public void unCharge(Player p, int price) { public void unCharge(Player p, WorldPlayer pWorld) {
if (e != null) if (e != null && pWorld.getPrice() != 0 && pWorld.eco_money_taken)
if (price != 0) e.depositPlayer(p, pWorld.getPrice());
e.depositPlayer(p, price);
} }
public void load() { public void load() {

View File

@ -20,6 +20,8 @@ public class WorldPlayer implements RTPWorld {
private final World world; private final World world;
private WORLD_TYPE world_type; private WORLD_TYPE world_type;
private RTPPermissionGroup.RTPPermConfiguration config = null; private RTPPermissionGroup.RTPPermConfiguration config = null;
//Economy
public boolean eco_money_taken = false;
public WorldPlayer(CommandSender p, World world) { public WorldPlayer(CommandSender p, World world) {
this.p = p; this.p = p;