Cooldowns per world save + Player rtp usage saving

This commit is contained in:
RonanCraft
2022-04-04 17:45:07 -04:00
parent 098925d61a
commit ed4b0ea492
24 changed files with 328 additions and 115 deletions

View File

@@ -65,7 +65,7 @@ public class MagicStickEvents implements Listener {
if (listener.p == e.getPlayer()) if (listener.p == e.getPlayer())
return; return;
//Rtp the player //Rtp the player
HelperRTP.tp(e.getPlayer(), e.getPlayer().getWorld().getName(), null, RTP_TYPE.ADDON_MAGICSTICK); HelperRTP.tp(e.getPlayer(), e.getPlayer().getWorld(), null, RTP_TYPE.ADDON_MAGICSTICK);
if (this.take) if (this.take)
teleportingPlayers.add(new PlayerListener(e.getPlayer())); teleportingPlayers.add(new PlayerListener(e.getPlayer()));
} }

View File

@@ -3,9 +3,12 @@ package me.SuperRonanCraft.BetterRTPAddons.addons.parties;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import lombok.Getter; import lombok.Getter;
import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.PermissionNode;
import me.SuperRonanCraft.BetterRTP.references.Permissions;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_TeleportPostEvent; import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_TeleportPostEvent;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownData; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownData;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent;
@@ -79,7 +82,7 @@ public class PartyData {
} }
public void tpAll(RTP_TeleportPostEvent e) { public void tpAll(RTP_TeleportPostEvent e) {
CooldownData cooldownData = BetterRTP.getInstance().getPlayerDataManager().getData(getLeader()).getCooldown(); //HashMap<World, CooldownData> cooldownData = BetterRTP.getInstance().getPlayerDataManager().getData(getLeader()).getCooldowns();
members.forEach((p, ready) -> { members.forEach((p, ready) -> {
if (!p.equals(getLeader())) { if (!p.equals(getLeader())) {
Location loc = e.getLocation(); Location loc = e.getLocation();
@@ -94,8 +97,9 @@ public class PartyData {
BetterRTP.getInstance().getRTP().getTeleport().afterTeleport(p, loc, 0, 0, e.getOldLocation(), e.getType()); BetterRTP.getInstance().getRTP().getTeleport().afterTeleport(p, loc, 0, 0, e.getOldLocation(), e.getType());
}); });
//Set cooldowns //Set cooldowns
if (cooldownData != null) if (!PermissionNode.BYPASS_COOLDOWN.check(p))
BetterRTP.getInstance().getPlayerDataManager().getData(p).setCooldown(new CooldownData(p.getUniqueId(), cooldownData.getTime(), cooldownData.getUses())); BetterRTP.getInstance().getPlayerDataManager().getData(p).getCooldowns().put(loc.getWorld(),
new CooldownData(p.getUniqueId(), System.currentTimeMillis(), loc.getWorld()));
} }
}); });
} }

View File

@@ -9,6 +9,7 @@ import me.SuperRonanCraft.BetterRTPAddons.addons.portals.region.PortalsRegionInf
import me.SuperRonanCraft.BetterRTPAddons.util.Files; import me.SuperRonanCraft.BetterRTPAddons.util.Files;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@@ -58,8 +59,8 @@ public class PortalsEvents implements Listener {
if (ploc.getBlockY() <= Math.max(loc1.getBlockY(), loc2.getBlockY()) if (ploc.getBlockY() <= Math.max(loc1.getBlockY(), loc2.getBlockY())
&& ploc.getBlockY() >= Math.min(loc1.getBlockY(), loc2.getBlockY())) { && ploc.getBlockY() >= Math.min(loc1.getBlockY(), loc2.getBlockY())) {
playerPortaling.put(e.getPlayer(), portal); playerPortaling.put(e.getPlayer(), portal);
HelperRTP.tp(e.getPlayer(), e.getPlayer(), World world = portal.getWorld() != null ? Bukkit.getWorld(portal.getWorld()) : null;
portal.getWorld(), null, RTP_TYPE.ADDON_PORTAL, ignoreCooldown, ignoreDelay); HelperRTP.tp(e.getPlayer(), e.getPlayer(), world, null, RTP_TYPE.ADDON_PORTAL, ignoreCooldown, ignoreDelay);
return; return;
} }
} }

View File

@@ -2,6 +2,7 @@ package me.SuperRonanCraft.BetterRTP.player.commands;
import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.player.commands.types.CmdTeleport; import me.SuperRonanCraft.BetterRTP.player.commands.types.CmdTeleport;
import me.SuperRonanCraft.BetterRTP.references.PermissionNode;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_CommandEvent_After; import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_CommandEvent_After;
import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP; import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownData; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownData;
@@ -41,7 +42,7 @@ public class Commands {
} }
public void commandExecuted(CommandSender sendi, String label, String[] args) { public void commandExecuted(CommandSender sendi, String label, String[] args) {
if (pl.getPerms().getUse(sendi)) { if (PermissionNode.USE.check(sendi)) {
if (args != null && args.length > 0) { if (args != null && args.length > 0) {
for (RTPCommand cmd : commands) { for (RTPCommand cmd : commands) {
if (cmd.getName().equalsIgnoreCase(args[0])) { if (cmd.getName().equalsIgnoreCase(args[0])) {

View File

@@ -1,6 +1,5 @@
package me.SuperRonanCraft.BetterRTP.player.commands; package me.SuperRonanCraft.BetterRTP.player.commands;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import java.util.List; import java.util.List;

View File

@@ -125,7 +125,7 @@ public class CmdInfo implements RTPCommand, RTPCommandHelpable {
info.add("&7- &6Overriden: " + _true + " &7- target `" + pl.getRTP().overriden.get(w.getName()) + "`"); info.add("&7- &6Overriden: " + _true + " &7- target `" + pl.getRTP().overriden.get(w.getName()) + "`");
else { else {
info.add("&7- &6Overriden&7: " + _false); info.add("&7- &6Overriden&7: " + _false);
WorldPlayer _rtpworld = BetterRTP.getInstance().getRTP().getPlayerWorld(new RTPSetupInformation(w.getName(), player != null ? player : sendi, player, player != null)); WorldPlayer _rtpworld = BetterRTP.getInstance().getRTP().getPlayerWorld(new RTPSetupInformation(w, player != null ? player : sendi, player, player != null));
WorldDefault worldDefault = BetterRTP.getInstance().getRTP().defaultWorld; WorldDefault worldDefault = BetterRTP.getInstance().getRTP().defaultWorld;
info.add("&7- &eSetup Type&7: " + _rtpworld.setup_type.name() + getInfo(_rtpworld, worldDefault, "setup")); info.add("&7- &eSetup Type&7: " + _rtpworld.setup_type.name() + getInfo(_rtpworld, worldDefault, "setup"));
info.add("&7- &6Use World Border&7: " + (_rtpworld.getUseWorldborder() ? _true : _false)); info.add("&7- &6Use World Border&7: " + (_rtpworld.getUseWorldborder() ? _true : _false));

View File

@@ -9,6 +9,7 @@ import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldLocations; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldLocations;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -83,12 +84,12 @@ public class CmdLocation implements RTPCommand, RTPCommandHelpable {
} }
//Get locations a player has access to //Get locations a player has access to
public static HashMap<String, RTPWorld> getLocations(CommandSender sendi, @Nullable String world) { public static HashMap<String, RTPWorld> getLocations(CommandSender sendi, @Nullable World world) {
if (BetterRTP.getInstance().getSettings().isLocationNeedPermission()) { if (BetterRTP.getInstance().getSettings().isLocationNeedPermission()) {
HashMap<String, RTPWorld> locations = new HashMap<>(); HashMap<String, RTPWorld> locations = new HashMap<>();
for (Map.Entry<String, RTPWorld> location : getLocations().entrySet()) for (Map.Entry<String, RTPWorld> location : getLocations().entrySet())
if (BetterRTP.getInstance().getPerms().getLocation(sendi, location.getKey())) { if (BetterRTP.getInstance().getPerms().getLocation(sendi, location.getKey())) {
if (world == null || location.getValue().getWorld().getName().equals(world)) if (world == null || location.getValue().getWorld().equals(world))
locations.put(location.getKey(), location.getValue()); locations.put(location.getKey(), location.getValue());
} }
return locations; return locations;

View File

@@ -26,7 +26,7 @@ public class CmdPlayer implements RTPCommand, RTPCommandHelpable {
public void execute(CommandSender sendi, String label, String[] args) { public void execute(CommandSender sendi, String label, String[] args) {
if (args.length == 2) if (args.length == 2)
if (Bukkit.getPlayer(args[1]) != null && Bukkit.getPlayer(args[1]).isOnline()) if (Bukkit.getPlayer(args[1]) != null && Bukkit.getPlayer(args[1]).isOnline())
HelperRTP.tp(Bukkit.getPlayer(args[1]), sendi, Bukkit.getPlayer(args[1]).getWorld().getName(), null, RTP_TYPE.FORCED); HelperRTP.tp(Bukkit.getPlayer(args[1]), sendi, Bukkit.getPlayer(args[1]).getWorld(), null, RTP_TYPE.FORCED);
else if (Bukkit.getPlayer(args[1]) != null) else if (Bukkit.getPlayer(args[1]) != null)
BetterRTP.getInstance().getText().getNotOnline(sendi, args[1]); BetterRTP.getInstance().getText().getNotOnline(sendi, args[1]);
else else
@@ -35,7 +35,7 @@ public class CmdPlayer implements RTPCommand, RTPCommandHelpable {
if (Bukkit.getPlayer(args[1]) != null && Bukkit.getPlayer(args[1]).isOnline()) { if (Bukkit.getPlayer(args[1]) != null && Bukkit.getPlayer(args[1]).isOnline()) {
World world = Bukkit.getWorld(args[2]); World world = Bukkit.getWorld(args[2]);
if (world != null) { if (world != null) {
HelperRTP.tp(Bukkit.getPlayer(args[1]), sendi, world.getName(), HelperRTP_Info.getBiomes(args, 3, sendi), RTP_TYPE.FORCED); HelperRTP.tp(Bukkit.getPlayer(args[1]), sendi, world, HelperRTP_Info.getBiomes(args, 3, sendi), RTP_TYPE.FORCED);
} else } else
BetterRTP.getInstance().getText().getNotExist(sendi, args[2]); BetterRTP.getInstance().getText().getNotExist(sendi, args[2]);
} else if (Bukkit.getPlayer(args[1]) != null) } else if (Bukkit.getPlayer(args[1]) != null)

View File

@@ -14,7 +14,7 @@ import java.util.List;
public class CmdTeleport implements RTPCommand { public class CmdTeleport implements RTPCommand {
//Label is the %command% placeholder in messages //Label is the %command% placeholder in messages
public static void teleport(CommandSender sendi, String label, String world, List<String> biomes) { public static void teleport(CommandSender sendi, String label, World world, List<String> biomes) {
if (sendi instanceof Player) if (sendi instanceof Player)
HelperRTP.tp((Player) sendi, sendi, world, biomes, RTP_TYPE.COMMAND); HelperRTP.tp((Player) sendi, sendi, world, biomes, RTP_TYPE.COMMAND);
else else

View File

@@ -22,9 +22,13 @@ public class CmdWorld implements RTPCommand, RTPCommandHelpable {
//rtp world <world> <biome1, biome2...> //rtp world <world> <biome1, biome2...>
public void execute(CommandSender sendi, String label, String[] args) { public void execute(CommandSender sendi, String label, String[] args) {
if (args.length >= 2) if (args.length >= 2) {
CmdTeleport.teleport(sendi, label, args[1], HelperRTP_Info.getBiomes(args, 2, sendi)); World world = Bukkit.getWorld(args[1]);
else if (world != null)
CmdTeleport.teleport(sendi, label, world, HelperRTP_Info.getBiomes(args, 2, sendi));
else
BetterRTP.getInstance().getText().getNotExist(sendi, args[1]);
} else
usage(sendi, label); usage(sendi, label);
} }

View File

@@ -31,7 +31,7 @@ public class Join {
//RTP on first join //RTP on first join
private void rtpOnFirstJoin(Player p) { private void rtpOnFirstJoin(Player p) {
if (getPl().getSettings().isRtpOnFirstJoin_Enabled() && !p.hasPlayedBefore()) if (getPl().getSettings().isRtpOnFirstJoin_Enabled() && !p.hasPlayedBefore())
HelperRTP.tp(p, Bukkit.getConsoleSender(), getPl().getSettings().getRtpOnFirstJoin_World(), null, RTP_TYPE.JOIN); //Console is sender to override delays HelperRTP.tp(p, Bukkit.getConsoleSender(), Bukkit.getWorld(getPl().getSettings().getRtpOnFirstJoin_World()), null, RTP_TYPE.JOIN); //Console is sender to override delays
} }
private BetterRTP getPl() { private BetterRTP getPl() {

View File

@@ -66,7 +66,7 @@ public class RTP {
} }
public WorldPlayer getPlayerWorld(RTPSetupInformation setup_info) { public WorldPlayer getPlayerWorld(RTPSetupInformation setup_info) {
WorldPlayer pWorld = new WorldPlayer(setup_info.getPlayer(), Bukkit.getWorld(setup_info.getWorld())); WorldPlayer pWorld = new WorldPlayer(setup_info.getPlayer(), setup_info.getWorld());
//Random Location //Random Location
if (setup_info.getLocation() == null && BetterRTP.getInstance().getSettings().isUseLocationIfAvailable()) { if (setup_info.getLocation() == null && BetterRTP.getInstance().getSettings().isUseLocationIfAvailable()) {
@@ -111,7 +111,7 @@ public class RTP {
pWorld.config = group; pWorld.config = group;
} }
//Custom World //Custom World
else if (customWorlds.containsKey(setup_info.getWorld())) { else if (customWorlds.containsKey(setup_info.getWorld().getName())) {
RTPWorld cWorld = customWorlds.get(pWorld.getWorld().getName()); RTPWorld cWorld = customWorlds.get(pWorld.getWorld().getName());
pWorld.setup(null, cWorld, setup_info.getBiomes(), setup_info.isPersonalized()); pWorld.setup(null, cWorld, setup_info.getBiomes(), setup_info.isPersonalized());
} }
@@ -121,11 +121,11 @@ public class RTP {
} }
//World type //World type
WORLD_TYPE world_type; WORLD_TYPE world_type;
if (this.world_type.containsKey(setup_info.getWorld())) if (this.world_type.containsKey(setup_info.getWorld().getName()))
world_type = this.world_type.get(setup_info.getWorld()); world_type = this.world_type.get(setup_info.getWorld().getName());
else { else {
world_type = WORLD_TYPE.NORMAL; world_type = WORLD_TYPE.NORMAL;
this.world_type.put(setup_info.getWorld(), world_type); //Defaults this so the error message isn't spammed this.world_type.put(setup_info.getWorld().getName(), world_type); //Defaults this so the error message isn't spammed
getPl().getLogger().warning("Seems like the world `" + setup_info.getWorld() + "` does not have a `WorldType` declared. " + getPl().getLogger().warning("Seems like the world `" + setup_info.getWorld() + "` does not have a `WorldType` declared. " +
"Please add/fix this in the config.yml file! " + "Please add/fix this in the config.yml file! " +
"This world will be treated as an overworld!"); "This world will be treated as an overworld!");
@@ -141,44 +141,49 @@ public class RTP {
return; return;
} }
String world_name = setup_info.getWorld(); World world_name = setup_info.getWorld();
Player p = setup_info.getPlayer(); Player p = setup_info.getPlayer();
CommandSender sendi = setup_info.getSender(); CommandSender sendi = setup_info.getSender();
// Locations // Locations
if (setup_info.getLocation() != null) { if (setup_info.getLocation() != null) {
WorldLocations location = setup_info.getLocation(); WorldLocations location = setup_info.getLocation();
world_name = location.getWorld().getName(); world_name = location.getWorld();
setup_info.setWorld(world_name); setup_info.setWorld(world_name);
setup_info.setBiomes(location.getBiomes()); setup_info.setBiomes(location.getBiomes());
} }
// Check overrides // Check overrides
if (world_name == null) { if (world_name == null && p != null) {
world_name = p.getWorld().getName(); world_name = p.getWorld();
} else { // Check if nulled or world doesnt exist }// else { // Check if nulled or world doesnt exist
World _world = Bukkit.getWorld(world_name); //World _world = world_name;//Bukkit.getWorld(world_name);
if (_world == null) { //Check if world has spaces instead of underscores /*if (_world == null) { //Check if world has spaces instead of underscores
_world = Bukkit.getWorld(world_name.replace("_", " ")); _world = Bukkit.getWorld(world_name.replace("_", " "));
world_name = world_name.replace("_", ""); world_name = world_name.replace("_", "");
} }
if (_world == null) { if (_world == null) {
getPl().getText().getNotExist(sendi, world_name); getPl().getText().getNotExist(sendi, world_name);
return; return;
} }*/
//}
//No World was sent???
if (world_name == null) {
BetterRTP.getInstance().getText().error(sendi);
return;
} }
if (overriden.containsKey(world_name)) { if (overriden.containsKey(world_name.getName())) {
world_name = overriden.get(world_name); world_name = Bukkit.getWorld(overriden.get(world_name.getName()));
setup_info.setWorld(world_name); setup_info.setWorld(world_name);
} }
// Not forced and has 'betterrtp.world.<world>' // Not forced and has 'betterrtp.world.<world>'
if (sendi == p && !getPl().getPerms().getAWorld(sendi, world_name)) { if (sendi == p && !getPl().getPerms().getAWorld(sendi, world_name.getName())) {
getPl().getText().getNoPermissionWorld(p, world_name); getPl().getText().getNoPermissionWorld(p, world_name.getName());
return; return;
} }
// Check disabled worlds // Check disabled worlds
if (disabledWorlds.contains(world_name)) { if (disabledWorlds.contains(world_name.getName())) {
getPl().getText().getDisabledWorld(sendi, world_name); getPl().getText().getDisabledWorld(sendi, world_name.getName());
return; return;
} }
WorldPlayer pWorld = getPlayerWorld(setup_info); WorldPlayer pWorld = getPlayerWorld(setup_info);
@@ -193,7 +198,7 @@ public class RTP {
Player p = pWorld.getPlayer(); Player p = pWorld.getPlayer();
//p.sendMessage("Cooling down: " + cooldown); //p.sendMessage("Cooling down: " + cooldown);
if (cooldown) if (cooldown)
getPl().getCooldowns().add(p); getPl().getCooldowns().add(p, pWorld.getWorld());
getPl().getpInfo().getRtping().put(p, true); //Cache player so they cant run '/rtp' again while rtp'ing getPl().getpInfo().getRtping().put(p, true); //Cache player so they cant run '/rtp' again while rtp'ing
//Setup player rtp methods //Setup player rtp methods
RTPPlayer rtpPlayer = new RTPPlayer(p, this, pWorld, type); RTPPlayer rtpPlayer = new RTPPlayer(p, this, pWorld, type);

View File

@@ -60,7 +60,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()); getPl().getCooldowns().removeCooldown(rtp.getPlayer(), rtp.pWorld.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

@@ -81,7 +81,7 @@ public class RTPPlayer {
getPl().getText().getFailedNotSafe(sendi, settings.maxAttempts); getPl().getText().getFailedNotSafe(sendi, settings.maxAttempts);
else else
getPl().getText().getOtherNotSafe(sendi, settings.maxAttempts, p.getName());*/ getPl().getText().getOtherNotSafe(sendi, settings.maxAttempts, p.getName());*/
getPl().getCooldowns().removeCooldown(p); getPl().getCooldowns().removeCooldown(p, pWorld.getWorld());
//getPl().getEco().unCharge(p, pWorld); //getPl().getEco().unCharge(p, pWorld);
getPl().getpInfo().getRtping().put(p, false); getPl().getpInfo().getRtping().put(p, false);
} }

View File

@@ -8,6 +8,7 @@ import me.SuperRonanCraft.BetterRTP.player.commands.types.CmdLocation;
import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP; import me.SuperRonanCraft.BetterRTP.references.helpers.HelperRTP;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldLocations; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldLocations;
import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -19,7 +20,7 @@ import java.util.Random;
public class RTPSetupInformation { public class RTPSetupInformation {
//Will provide information to setup an RTP attempt //Will provide information to setup an RTP attempt
@Getter @Setter private String world; @Getter @Setter private World world;
@Getter @NonNull private final CommandSender sender; @Getter @NonNull private final CommandSender sender;
@Getter @Nullable private final Player player; @Getter @Nullable private final Player player;
@Getter private final boolean personalized; @Getter private final boolean personalized;
@@ -29,14 +30,14 @@ public class RTPSetupInformation {
@Getter private final boolean delay; @Getter private final boolean delay;
@Getter @Nullable private final RTP_TYPE rtp_type; @Getter @Nullable private final RTP_TYPE rtp_type;
public RTPSetupInformation(@Nullable String world, public RTPSetupInformation(@Nullable World world,
@NonNull CommandSender sender, @NonNull CommandSender sender,
@Nullable Player player, @Nullable Player player,
boolean personalized) { boolean personalized) {
this(world, sender, player, personalized, null, false, null, null); this(world, sender, player, personalized, null, false, null, null);
} }
public RTPSetupInformation(@Nullable String world, public RTPSetupInformation(@Nullable World world,
@NonNull CommandSender sender, @NonNull CommandSender sender,
@Nullable Player player, @Nullable Player player,
boolean personalized, boolean personalized,
@@ -47,7 +48,7 @@ public class RTPSetupInformation {
this(world, sender, player, personalized, biomes, delay, rtp_type, location, true); this(world, sender, player, personalized, biomes, delay, rtp_type, location, true);
} }
public RTPSetupInformation(@Nullable String world, public RTPSetupInformation(@Nullable World world,
@NonNull CommandSender sender, @NonNull CommandSender sender,
@Nullable Player player, @Nullable Player player,
boolean personalized, boolean personalized,
@@ -66,9 +67,9 @@ public class RTPSetupInformation {
this.location = location; this.location = location;
if (this.world == null) { if (this.world == null) {
if (player != null) if (player != null)
this.world = player.getWorld().getName(); this.world = player.getWorld();
else if (this.location != null) else if (this.location != null)
this.world = this.location.getWorld().getName(); this.world = this.location.getWorld();
} }
this.cooldown = cooldown; this.cooldown = cooldown;
} }

View File

@@ -0,0 +1,66 @@
package me.SuperRonanCraft.BetterRTP.references;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.depends.DepPerms;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
public enum PermissionNode {
USE("use"),
BYPASS_ECONOMY("bypass.economy"),
BYPASS_HUNGER("bypass.hunger"),
BYPASS_COOLDOWN("bypass.cooldown"),
BYPASS_DELAY("bypass.delay"),
RELOAD("reload"),
SETTINGS("settings"),
INFO("info"),
UPDATER("updater"),
RTP_OTHER("player"),
BIOME("biome"),
WORLD("world"),
SIGN_CREATE("sign"),
TEST("test"),
VERSION("version"),
EDIT("edit"),
LOCATION("location"),
;
private final String node;
private static final String prefix = "betterrtp.";
PermissionNode(String node) {
this.node = prefix + node;
}
public boolean check(CommandSender sendi) {
return BetterRTP.getInstance().getPerms().checkPerm(node, sendi);
}
public static boolean check(CommandSender sendi, String check) {
return BetterRTP.getInstance().getPerms().checkPerm(check, sendi);
}
public static boolean getAWorld(CommandSender sendi, String world) {
if (check(sendi, prefix + "world.*"))
return true;
else if (world == null) {
for (World w : Bukkit.getWorlds())
if (check(sendi, prefix + "world." + w.getName()))
return true;
} else
return check(sendi, prefix + "world." + world);
return false;
}
public static boolean getLocation(CommandSender sendi, String location) {
return check(sendi, prefix + "location." + location);
}
public static boolean getPermissionGroup(CommandSender sendi, String group) {
return check(sendi, prefix + "group." + group);
}
}

View File

@@ -27,7 +27,7 @@ public class DatabaseCooldownsGlobal extends SQLite {
UUID("uuid", "varchar(32) PRIMARY KEY"), UUID("uuid", "varchar(32) PRIMARY KEY"),
//COOLDOWN DATA //COOLDOWN DATA
COOLDOWN_DATE("date", "long"), COOLDOWN_DATE("date", "long"),
USES("uses", "integer"), //USES("uses", "integer"),
; ;
public final String name; public final String name;
@@ -60,8 +60,8 @@ public class DatabaseCooldownsGlobal extends SQLite {
rs = ps.executeQuery(); rs = ps.executeQuery();
if (rs.next()) { if (rs.next()) {
Long time = rs.getLong(COLUMNS.COOLDOWN_DATE.name); Long time = rs.getLong(COLUMNS.COOLDOWN_DATE.name);
int uses = rs.getInt(COLUMNS.USES.name); //int uses = rs.getInt(COLUMNS.USES.name);
return new CooldownData(uuid, time, uses, null); return new CooldownData(uuid, time, null);
} }
} catch (SQLException ex) { } catch (SQLException ex) {
BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex); BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex);
@@ -76,13 +76,13 @@ public class DatabaseCooldownsGlobal extends SQLite {
String pre = "INSERT OR REPLACE INTO "; String pre = "INSERT OR REPLACE INTO ";
String sql = pre + tables.get(0) + " (" String sql = pre + tables.get(0) + " ("
+ COLUMNS.UUID.name + ", " + COLUMNS.UUID.name + ", "
+ COLUMNS.COOLDOWN_DATE.name + ", " + COLUMNS.COOLDOWN_DATE.name + " "
+ COLUMNS.USES.name + " " //+ COLUMNS.USES.name + " "
+ ") VALUES(?, ?, ?)"; + ") VALUES(?, ?)";
List<Object> params = new ArrayList<Object>() {{ List<Object> params = new ArrayList<Object>() {{
add(data.getUuid().toString()); add(data.getUuid().toString());
add(data.getTime()); add(data.getTime());
add(data.getUses()); //add(data.getUses());
}}; }};
sqlUpdate(sql, params); sqlUpdate(sql, params);
} }
@@ -92,14 +92,14 @@ public class DatabaseCooldownsGlobal extends SQLite {
String pre = "INSERT OR REPLACE INTO "; String pre = "INSERT OR REPLACE INTO ";
String sql = pre + tables.get(0) + " (" String sql = pre + tables.get(0) + " ("
+ COLUMNS.UUID.name + ", " + COLUMNS.UUID.name + ", "
+ COLUMNS.COOLDOWN_DATE.name + ", " + COLUMNS.COOLDOWN_DATE.name + " "
+ COLUMNS.USES.name + " " //+ COLUMNS.USES.name + " "
+ ") VALUES(?, ?, ?)"; + ") VALUES(?, ?)";
for (CooldownData data : cooldownData) { for (CooldownData data : cooldownData) {
List<Object> param = new ArrayList<Object>() {{ List<Object> param = new ArrayList<Object>() {{
add(data.getUuid().toString()); add(data.getUuid().toString());
add(data.getTime()); add(data.getTime());
add(data.getUses()); //add(data.getUses());
}}; }};
sqlUpdate(sql, param); sqlUpdate(sql, param);
} }

View File

@@ -32,7 +32,7 @@ public class DatabaseCooldownsWorlds extends SQLite {
UUID("uuid", "varchar(32) PRIMARY KEY"), UUID("uuid", "varchar(32) PRIMARY KEY"),
//COOLDOWN DATA //COOLDOWN DATA
COOLDOWN_DATE("date", "long"), COOLDOWN_DATE("date", "long"),
USES("uses", "integer"), //USES("uses", "integer"),
; ;
public final String name; public final String name;
@@ -65,8 +65,8 @@ public class DatabaseCooldownsWorlds extends SQLite {
rs = ps.executeQuery(); rs = ps.executeQuery();
if (rs.next()) { if (rs.next()) {
Long time = rs.getLong(COLUMNS.COOLDOWN_DATE.name); Long time = rs.getLong(COLUMNS.COOLDOWN_DATE.name);
int uses = rs.getInt(COLUMNS.USES.name); //int uses = rs.getInt(COLUMNS.USES.name);
return new CooldownData(uuid, time, uses, world); return new CooldownData(uuid, time, world);
} }
} catch (SQLException ex) { } catch (SQLException ex) {
BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex); BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex);
@@ -81,13 +81,13 @@ public class DatabaseCooldownsWorlds extends SQLite {
String pre = "INSERT OR REPLACE INTO "; String pre = "INSERT OR REPLACE INTO ";
String sql = pre + data.getWorld().getName() + " (" String sql = pre + data.getWorld().getName() + " ("
+ COLUMNS.UUID.name + ", " + COLUMNS.UUID.name + ", "
+ COLUMNS.COOLDOWN_DATE.name + ", " + COLUMNS.COOLDOWN_DATE.name + " "
+ COLUMNS.USES.name + " " //+ COLUMNS.USES.name + " "
+ ") VALUES(?, ?, ?)"; + ") VALUES(?, ?)";
List<Object> params = new ArrayList<Object>() {{ List<Object> params = new ArrayList<Object>() {{
add(data.getUuid().toString()); add(data.getUuid().toString());
add(data.getTime()); add(data.getTime());
add(data.getUses()); //add(data.getUses());
}}; }};
sqlUpdate(sql, params); sqlUpdate(sql, params);
} }

View File

@@ -0,0 +1,112 @@
package me.SuperRonanCraft.BetterRTP.references.database;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.player.playerdata.PlayerData;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownData;
import org.bukkit.Bukkit;
import org.bukkit.World;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
public class DatabasePlayers extends SQLite {
public DatabasePlayers() {
super(DATABASE_TYPE.PLAYERS);
}
@Override
public List<String> getTables() {
List<String> list = new ArrayList<>();
list.add("Players");
return list;
}
public enum COLUMNS {
UUID("uuid", "varchar(32) PRIMARY KEY"),
//COOLDOWN DATA
COUNT("count", "long"),
//USES("uses", "integer"),
;
public final String name;
public final String type;
COLUMNS(String name, String type) {
this.name = name;
this.type = type;
}
}
public boolean removePlayer(UUID uuid, World world) {
String sql = "DELETE FROM " + world.getName() + " WHERE "
+ COLUMNS.UUID.name + " = ?";
List<Object> params = new ArrayList<Object>() {{
add(uuid.toString());
}};
return sqlUpdate(sql, params);
}
public int getCount(UUID uuid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = getSQLConnection();
ps = conn.prepareStatement("SELECT * FROM " + tables.get(0) + " WHERE " + COLUMNS.UUID.name + " = ?");
ps.setString(1, uuid.toString());
rs = ps.executeQuery();
if (rs.next()) {
long time = rs.getLong(COLUMNS.COUNT.name);
//int uses = rs.getInt(COLUMNS.USES.name);
return Math.toIntExact(time);
}
} catch (SQLException ex) {
BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex);
} finally {
close(ps, rs, conn);
}
return 0;
}
//Set a player Cooldown
public void setCount(PlayerData data) {
String pre = "INSERT OR REPLACE INTO ";
String sql = pre + tables.get(0) + " ("
+ COLUMNS.UUID.name + ", "
+ COLUMNS.COUNT.name + " "
//+ COLUMNS.USES.name + " "
+ ") VALUES(?, ?)";
List<Object> params = new ArrayList<Object>() {{
add(data.player.getUniqueId().toString());
add(data.getRtpCount());
//add(data.getUses());
}};
sqlUpdate(sql, params);
}
//Update multiple players cooldowns
/*public void setCooldown(List<CooldownData> cooldownData) {
String pre = "INSERT OR REPLACE INTO ";
String sql = pre + table + " ("
+ COLUMNS.UUID.name + ", "
+ COLUMNS.COOLDOWN_DATE.name + ", "
+ COLUMNS.USES.name + " "
+ ") VALUES(?, ?, ?)";
for (CooldownData data : cooldownData) {
List<Object> param = new ArrayList<Object>() {{
add(data.getUuid().toString());
add(data.getTime());
add(data.getUses());
}};
sqlUpdate(sql, param);
}
}*/
}

View File

@@ -76,6 +76,7 @@ public abstract class SQLite {
public void load() { public void load() {
loaded = false; loaded = false;
tables = getTables();
/*switch (type) { /*switch (type) {
case COOLDOWN: table = "BetterRTP_Cooldown"; break; case COOLDOWN: table = "BetterRTP_Cooldown"; break;
} }
@@ -244,6 +245,7 @@ public abstract class SQLite {
} }
public enum DATABASE_TYPE { public enum DATABASE_TYPE {
PLAYERS,
COOLDOWN, COOLDOWN,
COOLDOWN_GLOBAL, //Table to know last time in general player has a cooldown for COOLDOWN_GLOBAL, //Table to know last time in general player has a cooldown for
} }

View File

@@ -8,8 +8,11 @@ import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownData;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownHandler; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.CooldownHandler;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld;
import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldLocations; import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.WorldLocations;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -20,25 +23,29 @@ import java.util.Random;
public class HelperRTP { public class HelperRTP {
//Teleporter and sender are the same //Teleporter and sender are the same
public static void tp(Player player, String world, List<String> biomes, RTP_TYPE rtpType) { public static void tp(Player player, World world, List<String> biomes, RTP_TYPE rtpType) {
tp(player, player, world, biomes, rtpType, false, false); tp(player, player, world, biomes, rtpType, false, false);
} }
//Teleported and Sender MAY be different //Teleported and Sender MAY be different
public static void tp(Player player, CommandSender sendi, String world, List<String> biomes, RTP_TYPE rtpType) { public static void tp(Player player, CommandSender sendi, World world, List<String> biomes, RTP_TYPE rtpType) {
tp(player, sendi, world, biomes, rtpType, false, false); tp(player, sendi, world, biomes, rtpType, false, false);
} }
// //
public static void tp(Player player, CommandSender sendi, String world, List<String> biomes, RTP_TYPE rtpType, public static void tp(Player player, CommandSender sendi, World world, List<String> biomes, RTP_TYPE rtpType,
boolean ignoreCooldown, boolean ignoreDelay) { boolean ignoreCooldown, boolean ignoreDelay) {
tp(player, sendi, world, biomes, rtpType, ignoreCooldown, ignoreDelay, null); tp(player, sendi, world, biomes, rtpType, ignoreCooldown, ignoreDelay, null);
} }
public static void tp(Player player, CommandSender sendi, String world, List<String> biomes, RTP_TYPE rtpType, public static void tp(@NotNull Player player, CommandSender sendi, @Nullable World world, List<String> biomes, RTP_TYPE rtpType,
boolean ignoreCooldown, boolean ignoreDelay, WorldLocations locations) { boolean ignoreCooldown, boolean ignoreDelay, WorldLocations locations) {
if (isRTPing(player, sendi)) { //Is RTP'ing if (isRTPing(player, sendi)) { //Is RTP'ing
if (ignoreCooldown || isCoolingDown(sendi, player)) { //Is Cooling down if (world == null)
world = player.getWorld();
if (BetterRTP.getInstance().getRTP().overriden.containsKey(world.getName()))
world = Bukkit.getWorld(BetterRTP.getInstance().getRTP().overriden.get(world.getName()));
if (ignoreCooldown || isCoolingDown(sendi, player, world)) { //Is Cooling down
boolean delay = false; boolean delay = false;
if (!ignoreDelay && sendi == player) //Forced? if (!ignoreDelay && sendi == player) //Forced?
if (getPl().getSettings().isDelayEnabled() && getPl().getSettings().getDelayTime() > 0) //Delay enabled? if (getPl().getSettings().isDelayEnabled() && getPl().getSettings().getDelayTime() > 0) //Delay enabled?
@@ -59,7 +66,7 @@ public class HelperRTP {
return true; return true;
} }
private static boolean isCoolingDown(CommandSender sendi, Player player) { private static boolean isCoolingDown(CommandSender sendi, Player player, World world) {
if (cooldownApplies(sendi, player)) { //Bypassing/Forced? if (cooldownApplies(sendi, player)) { //Bypassing/Forced?
CooldownHandler cooldownHandler = getPl().getCooldowns(); CooldownHandler cooldownHandler = getPl().getCooldowns();
if (!cooldownHandler.isLoaded() || !cooldownHandler.loadedPlayer(player)) { //Cooldowns have yet to download if (!cooldownHandler.isLoaded() || !cooldownHandler.loadedPlayer(player)) { //Cooldowns have yet to download
@@ -67,9 +74,9 @@ public class HelperRTP {
return false; return false;
} }
//Cooldown Data //Cooldown Data
CooldownData cooldownData = getPl().getCooldowns().get(player); CooldownData cooldownData = getPl().getCooldowns().get(player, world);
if (cooldownData != null) { if (cooldownData != null) {
if (cooldownHandler.locked(cooldownData)) { //Infinite cooldown (locked) if (cooldownHandler.locked(player)) { //Infinite cooldown (locked)
getPl().getText().getNoPermission(sendi); getPl().getText().getNoPermission(sendi);
return false; return false;
} else { //Normal cooldown } else { //Normal cooldown
@@ -109,7 +116,7 @@ public class HelperRTP {
} }
@Nullable @Nullable
public static WorldLocations getRandomLocation(CommandSender sender, String world) { public static WorldLocations getRandomLocation(CommandSender sender, World world) {
HashMap<String, RTPWorld> locations_permissible = CmdLocation.getLocations(sender, world); HashMap<String, RTPWorld> locations_permissible = CmdLocation.getLocations(sender, world);
if (!locations_permissible.isEmpty()) { if (!locations_permissible.isEmpty()) {
List<String> valuesList = new ArrayList<>(locations_permissible.keySet()); List<String> valuesList = new ArrayList<>(locations_permissible.keySet());

View File

@@ -18,8 +18,9 @@ public class PlayerData {
@Getter final PlayerData_Menus menu = new PlayerData_Menus(); @Getter final PlayerData_Menus menu = new PlayerData_Menus();
//Player Data //Player Data
@Getter final HashMap<World, CooldownData> cooldowns = new HashMap<>(); @Getter final HashMap<World, CooldownData> cooldowns = new HashMap<>();
@Getter @Setter CooldownData globalCooldown; //@Getter @Setter CooldownData globalCooldown;
@Getter @Setter boolean rtping; @Getter @Setter boolean rtping;
@Getter @Setter int rtpCount;
PlayerData(Player player) { PlayerData(Player player) {
this.player = player; this.player = player;

View File

@@ -7,15 +7,14 @@ import org.bukkit.World;
import java.util.UUID; import java.util.UUID;
public class CooldownData { public class CooldownData {
@Getter private final UUID uuid; @Getter private final UUID uuid;
@Getter @Setter private Long time; @Getter @Setter private Long time;
@Getter @Setter int uses;
@Getter private final World world; @Getter private final World world;
public CooldownData(UUID uuid, Long time, int uses, World world) { public CooldownData(UUID uuid, Long time, World world) {
this.uuid = uuid; this.uuid = uuid;
this.time = time; this.time = time;
this.uses = uses;
this.world = world; this.world = world;
} }
} }

View File

@@ -3,6 +3,7 @@ package me.SuperRonanCraft.BetterRTP.references.rtpinfo;
import lombok.Getter; import lombok.Getter;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsWorlds; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsWorlds;
import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsGlobal; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsGlobal;
import me.SuperRonanCraft.BetterRTP.references.database.DatabasePlayers;
import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics;
import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer; import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer;
@@ -13,6 +14,7 @@ import org.bukkit.entity.Player;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -24,7 +26,8 @@ public class CooldownHandler {
lockedAfter; //Rtp's before being locked lockedAfter; //Rtp's before being locked
private final List<Player> downloading = new ArrayList<>(); private final List<Player> downloading = new ArrayList<>();
private final DatabaseCooldownsWorlds cooldowns = new DatabaseCooldownsWorlds(); private final DatabaseCooldownsWorlds cooldowns = new DatabaseCooldownsWorlds();
private final DatabaseCooldownsGlobal globalCooldown = new DatabaseCooldownsGlobal(); private final DatabasePlayers players = new DatabasePlayers();
//private final DatabaseCooldownsGlobal globalCooldown = new DatabaseCooldownsGlobal();
public void load() { public void load() {
//configfile = new File(BetterRTP.getInstance().getDataFolder(), "data/cooldowns.yml"); //configfile = new File(BetterRTP.getInstance().getDataFolder(), "data/cooldowns.yml");
@@ -37,7 +40,8 @@ public class CooldownHandler {
lockedAfter = config.getInt("Settings.Cooldown.LockAfter"); lockedAfter = config.getInt("Settings.Cooldown.LockAfter");
} }
Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> {
globalCooldown.load(); //globalCooldown.load();
players.load();
cooldowns.load(); cooldowns.load();
checkLater(); checkLater();
}); });
@@ -45,11 +49,15 @@ public class CooldownHandler {
private void checkLater() { private void checkLater() {
Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> { Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> {
AtomicBoolean loaded = new AtomicBoolean(true); //AtomicBoolean loaded = new AtomicBoolean(true);
if (!globalCooldown.isLoaded()) { //if (!globalCooldown.isLoaded()) {
checkLater(); // checkLater();
return; // return;
} else if (!cooldowns.isLoaded()) { //} else
if (!cooldowns.isLoaded()) {
checkLater();
return;
} else if (!players.isLoaded()) {
checkLater(); checkLater();
return; return;
} }
@@ -62,14 +70,15 @@ public class CooldownHandler {
public void add(Player player, World world) { public void add(Player player, World world) {
if (!enabled) return; if (!enabled) return;
CooldownData data = getData(player).getCooldown(); PlayerData playerData = getData(player);
if (data == null) HashMap<World, CooldownData> cooldowns = playerData.getCooldowns();
data = new CooldownData(player.getUniqueId(), 0L, 0, world); CooldownData data = cooldowns.getOrDefault(world, new CooldownData(player.getUniqueId(), 0L, world));
if (lockedAfter > 0) if (lockedAfter > 0)
data.setUses(data.getUses() + 1); playerData.setRtpCount(playerData.getRtpCount() + 1);
data.setTime(System.currentTimeMillis()); data.setTime(System.currentTimeMillis());
getData(player).setCooldown(data); cooldowns.put(world, data);
savePlayer(data, false); //getData(player).setCooldowns(data);
savePlayer(player, data, false);
} }
public boolean exists(Player p) { public boolean exists(Player p) {
@@ -78,64 +87,65 @@ public class CooldownHandler {
@Nullable @Nullable
public CooldownData get(Player p, World world) { public CooldownData get(Player p, World world) {
List<CooldownData> data = getData(p).getCooldowns(); HashMap<World, CooldownData> data = getData(p).getCooldowns();
if (data != null) if (data != null)
for (CooldownData cd : data) return data.getOrDefault(world, null);
if (cd.getWorld() == world)
return cd;
return null; return null;
} }
@Nullable //@Nullable
public CooldownData getGlobal(Player p) { //public CooldownData getGlobal(Player p) {
return globalCooldown.getCooldown(p.getUniqueId()); // return globalCooldown.getCooldown(p.getUniqueId());
} //}
public long timeLeft(CooldownData data) { public long timeLeft(CooldownData data) {
long cooldown = data.getTime(); long cooldown = data.getTime();
return ((cooldown / 1000) + timer) - (System.currentTimeMillis() / 1000); return ((cooldown / 1000) + timer) - (System.currentTimeMillis() / 1000);
} }
public boolean locked(CooldownData data) { public boolean locked(Player player) {
return lockedAfter > 0 && data.uses >= lockedAfter; return lockedAfter > 0 && getData(player).getRtpCount() >= lockedAfter;
} }
public void removeCooldown(Player player) { public void removeCooldown(Player player, World world) {
if (!enabled) return; if (!enabled) return;
CooldownData data = getData(player).getCooldown(); PlayerData playerData = getData(player);
if (data != null) CooldownData cooldownData = playerData.getCooldowns().getOrDefault(world, null);
if (cooldownData != null)
if (lockedAfter > 0) { if (lockedAfter > 0) {
//uses.put(id, uses.getOrDefault(id, 1) - 1); //uses.put(id, uses.getOrDefault(id, 1) - 1);
if (data.getUses() <= 0) { //Remove from file as well if (playerData.getRtpCount() <= 0) { //Remove from file as well
savePlayer(data, true); savePlayer(player, cooldownData, true);
getData(player).setCooldown(null); getData(player).getCooldowns().put(world, null);
} else { //Keep the player cached } else { //Keep the player cached
savePlayer(data, false); savePlayer(player, cooldownData, false);
} }
} else { //Remove completely } else { //Remove completely
getData(player).setCooldown(null); getData(player).getCooldowns().remove(world);
savePlayer(data, true); savePlayer(player, cooldownData, true);
} }
} }
private void savePlayer(CooldownData data, boolean remove) { private void savePlayer(Player player, CooldownData data, boolean remove) {
Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> {
if (!remove) { if (!remove) {
getDatabase(data.getWorld()).setCooldown(data); getDatabaseWorlds().setCooldown(data);
} else { } else {
getDatabase(data.getWorld()).removePlayer(data.getUuid(), data.getWorld()); getDatabaseWorlds().removePlayer(data.getUuid(), data.getWorld());
} }
players.setCount(getData(player));
}); });
} }
public void loadPlayer(Player player) { public void loadPlayer(Player player) {
if (!isEnabled()) return; if (!isEnabled()) return;
downloading.add(player); downloading.add(player);
List<CooldownData> cooldowns = new ArrayList<>();
for (World world : Bukkit.getWorlds()) { for (World world : Bukkit.getWorlds()) {
PlayerData playerData = getData(player);
CooldownData cooldown = getDatabaseWorlds().getCooldown(player.getUniqueId(), world); CooldownData cooldown = getDatabaseWorlds().getCooldown(player.getUniqueId(), world);
if (cooldown != null) if (cooldown != null)
getData(player).getCooldowns().add(cooldown); playerData.getCooldowns().put(world, cooldown);
playerData.setRtpCount(players.getCount(player.getUniqueId()));
} }
downloading.remove(player); downloading.remove(player);
} }