diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java index a54fb5c..264dd11 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/Commands.java @@ -129,30 +129,34 @@ public class Commands { } private boolean checkDelay(CommandSender sendi, Player player) { - if (rtping.containsKey(player.getUniqueId())) //Already rtp'ing - if (rtping.get(player.getUniqueId())) { - pl.getText().getAlready(player); - return false; - } - else if (sendi != player || pl.getPerms().getBypassCooldown(player)) //Bypassing/Forced? + if (rtping.containsKey(player.getUniqueId()) && rtping.get(player.getUniqueId())) { + pl.getText().getAlready(player); + return false; + } else if (sendi != player || pl.getPerms().getBypassCooldown(player)) { //Bypassing/Forced? return true; - else if (cooldowns.enabled) { //Cooling down? + } else if (cooldowns.enabled) { //Cooling down? Player p = (Player) sendi; - if (cooldowns.exists(p.getUniqueId())) { - long Left = cooldowns.timeLeft(p.getUniqueId()); - if (!pl.getPerms().getBypassDelay(p)) - Left = Left + delayTimer; - if (Left > 0) { - //Still cooling down - pl.getText().getCooldown(sendi, String.valueOf(Left)); + UUID id = p.getUniqueId(); + if (cooldowns.exists(id)) { + if (cooldowns.locked(id)) { //Infinite cooldown + pl.getText().getNoPermission(sendi); return false; - } else { - //Reset timer, but allow them to tp - cooldowns.add(p.getUniqueId()); - return true; + } else { //Normal cooldown + long Left = cooldowns.timeLeft(id); + if (!pl.getPerms().getBypassDelay(p)) + Left = Left + delayTimer; + if (Left > 0) { + //Still cooling down + pl.getText().getCooldown(sendi, String.valueOf(Left)); + return false; + } else { + //Reset timer, but allow them to tp + cooldowns.add(id); + return true; + } } } else - cooldowns.add(p.getUniqueId()); + cooldowns.add(id); } return true; } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Join.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Join.java index 0c69606..4d22432 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Join.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Join.java @@ -3,6 +3,7 @@ package me.SuperRonanCraft.BetterRTP.player.events; import me.SuperRonanCraft.BetterRTP.references.Updater; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import me.SuperRonanCraft.BetterRTP.Main; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerJoinEvent; @@ -24,9 +25,8 @@ public class Join { //RTP on first join private void rtpOnFirstJoin(Player p) { - if (getPl().getSettings().firstJoinRtp && !p.hasPlayedBefore()) { - - } + if (getPl().getSettings().rtpOnFirstJoin && !p.hasPlayedBefore()) + getPl().getCmd().tp(p, Bukkit.getConsoleSender(), getPl().getSettings().rtpOnFirstJoinWorld, null); //Console is sender to override delays } private Main getPl() { diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPCooldown.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPCooldown.java index 95fb8ed..42f68c2 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPCooldown.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPCooldown.java @@ -1,35 +1,142 @@ package me.SuperRonanCraft.BetterRTP.player.rtp; +import me.SuperRonanCraft.BetterRTP.Main; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.UUID; public class RTPCooldown { - public HashMap cooldowns = new HashMap<>(); + private HashMap cooldowns = new HashMap<>(); //Cooldown timer for each player + private HashMap locked = null; //Players locked from rtp'ing ever again public boolean enabled; - private int timer; + private int + timer, //Cooldown timer + lockedAfter; //Rtp's before being locked public void load() { + cooldowns.clear(); + if (locked != null) + locked.clear(); FileBasics.FILETYPE config = FileBasics.FILETYPE.CONFIG; enabled = config.getBoolean("Settings.Cooldown.Enabled"); - timer = config.getInt("Settings.Cooldown.Time"); + if (enabled) { + timer = config.getInt("Settings.Cooldown.Time"); + lockedAfter = config.getInt("Settings.Cooldown.LockAfter"); + if (lockedAfter > 0) + locked = new HashMap<>(); + loadFile(); + } } public void add(UUID id) { cooldowns.put(id, System.currentTimeMillis()); + if (lockedAfter > 0) { + if (locked.containsKey(id)) + locked.put(id, locked.get(id) + 1); + else + locked.put(id, 1); + savePlayer(id, true, cooldowns.get(id), locked.get(id)); + } else + savePlayer(id, true, cooldowns.get(id), 0); } public boolean exists(UUID id) { + System.out.println("Exists " + id + " " + cooldowns.containsKey(id)); return cooldowns.containsKey(id); } public long timeLeft(UUID id) { - return ((cooldowns.getOrDefault(id, (long) 0) / 1000) + timer) - (System.currentTimeMillis() / 1000); + long cooldown = cooldowns.getOrDefault(id, 0L); + return ((cooldown / 1000) + timer) - (System.currentTimeMillis() / 1000); + } + + public boolean locked(UUID id) { + if (locked != null && locked.containsKey(id)) + return locked.get(id) >= lockedAfter; + return false; } public void remove(UUID id) { - cooldowns.remove(id); + if (lockedAfter > 0) { + locked.put(id, locked.getOrDefault(id, 1) - 1); + if (locked.get(id) <= 0) { //Remove completely + cooldowns.remove(id); + savePlayer(id, false, 0L, 0); + } else { //Keep the player cached + savePlayer(id, false, cooldowns.get(id), locked.get(id)); + } + } else { //Remove completely + cooldowns.remove(id); + savePlayer(id, false, 0L, 0); + } + } + + private void savePlayer(UUID id, boolean adding, long time, int attempts) { + YamlConfiguration config = getFile(); + assert config != null; + if (adding) { //Add player to file + config.set(id.toString() + ".Time", time); + if (attempts > 0) + config.set(id.toString() + ".Attempts", attempts); + } else { //Remove player from the file + config.set(id.toString(), null); + } + try { + config.save(configfile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private YamlConfiguration config; + private File configfile; + + private YamlConfiguration getFile() { + if (config != null) { + return config; + } else { + if (!configfile.exists()) { + try { + configfile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + config = new YamlConfiguration(); + config.load(configfile); + return config; + } catch (IOException | InvalidConfigurationException e) { + e.printStackTrace(); + } + return null; + } + } + + private void loadFile() { + config = null; + configfile = new File(Main.getInstance().getDataFolder(), "cooldowns.yml"); + YamlConfiguration config = getFile(); + assert config != null; + for (String id : config.getKeys(false)) { + try { + UUID uuid = UUID.fromString(id); + Long time = config.getLong(id + ".Time"); + cooldowns.put(uuid, time); + if (lockedAfter > 0) { + int attempts = config.getInt(id + ".Attempts"); + locked.put(uuid, attempts); + } + } catch (IllegalArgumentException e) { + Main.getInstance().getLogger().info("UUID of `" + id + "` is invalid, please delete this!"); + //Bad uuid + } + } } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/settings/Settings.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/settings/Settings.java index e4576c1..6f05a11 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/settings/Settings.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/settings/Settings.java @@ -7,7 +7,8 @@ public class Settings { public boolean debug; public boolean delayEnabled; - public boolean firstJoinRtp; + public boolean rtpOnFirstJoin; + public String rtpOnFirstJoinWorld; //Dependencies private SoftDepends depends = new SoftDepends(); @@ -16,7 +17,8 @@ public class Settings { FileBasics.FILETYPE config = getPl().getFiles().getType(FileBasics.FILETYPE.CONFIG); debug = config.getBoolean("Settings.Debugger"); delayEnabled = config.getBoolean("Settings.Delay.Enabled"); - firstJoinRtp = config.getBoolean("Settings.FirstJoinRtp"); + rtpOnFirstJoin = config.getBoolean("Settings.RtpOnFirstJoin.Enabled"); + rtpOnFirstJoinWorld = config.getString("Settings.RtpOnFirstJoin.World"); } public SoftDepends getsDepends() { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 59eb286..9c8baa2 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -16,7 +16,9 @@ Settings: MinRadius: 25 ## Maximum amount of tries before BetterRTP gives up and sends a NotSafeMessage # MaxAttempts: 15 - FirstJoinRtp: false # Make the player rtp when joining the server for the first time + RtpOnFirstJoin: # Will execute as console to override delays + Enabled: false # Make the player rtp when joining the server for the first time + World: 'world' # World to first rtp in Cooldown: Enabled: true # Enabled or disabled cooldown timer LockAfter: 0 # Lock the player in an infinite cooldown after # rtp's (0 to disable) diff --git a/src/main/resources/lang/chn.yml b/src/main/resources/lang/chn.yml index fe01b2f..dccd2b4 100644 --- a/src/main/resources/lang/chn.yml +++ b/src/main/resources/lang/chn.yml @@ -18,6 +18,7 @@ Messages: ## %world% is the world the player is in that is disabled to rtp in! # DisabledWorld: '&c%world%世界已被禁止使用此命令,&7无法传送!' Cooldown: '&c对不起,&7你需要在&c%time%&7秒后才能传送!' + Locked: '&cSorry! &7You''ve used up all your RTP''s!' Invalid: '&c无效的参数,使用''/%command% help''查看帮助。' NotOnline: '&c玩家&7%player%&c不在线!' Delay: '&a即将在&f%time%&a秒后传送,乖乖站好!' diff --git a/src/main/resources/lang/cht.yml b/src/main/resources/lang/cht.yml index aa992c1..344e394 100644 --- a/src/main/resources/lang/cht.yml +++ b/src/main/resources/lang/cht.yml @@ -18,6 +18,7 @@ Messages: ## %world% 是玩家嘗試傳送到但設定已禁用的世界! # DisabledWorld: '&c%world%世界已被禁止使用此指令,&7您無法傳送!' Cooldown: '&c抱歉,&7您需要在&c%time%&7秒後才能嘗試傳送!' + Locked: '&cSorry! &7You''ve used up all your RTP''s!' Invalid: '&c無效的參數,請使用''/%command% help''查看幫助。' NotOnline: '&c玩家&7%player%&c不在線!' Delay: '&a即將在&f%time%&a秒後傳送,請站好!' diff --git a/src/main/resources/lang/en.yml b/src/main/resources/lang/en.yml index 0248914..a4b9479 100644 --- a/src/main/resources/lang/en.yml +++ b/src/main/resources/lang/en.yml @@ -18,6 +18,7 @@ Messages: ## %world% is the world the player is in that is disabled to rtp in! # DisabledWorld: '&cDisabled World %world%! &7Could not RTP!' Cooldown: '&cSorry! &7You can''t rtp for another &c%time% &7seconds!' + Locked: '&cSorry! &7You''ve used up all your RTP''s!' Invalid: '&cInvalid argument. Try ''/%command% help''' NotOnline: '&cThe player &7%player% &cis not online!' Delay: '&aTeleporting in &f%time% &aseconds! Don''t move!' diff --git a/src/main/resources/lang/fr.yml b/src/main/resources/lang/fr.yml index 463b74b..18e880d 100644 --- a/src/main/resources/lang/fr.yml +++ b/src/main/resources/lang/fr.yml @@ -18,6 +18,7 @@ Messages: ## %world% Est le monde dans lequel le joueur est téléporter ! # DisabledWorld: '&cLe monde %world% est désactivé! &7Impossible de se téléporter!' Cooldown: '&cDésoler! &7Tu ne peut pas te téléporter pour encore &c%time% &7secondes!' + Locked: '&cSorry! &7You''ve used up all your RTP''s!' Invalid: '&cArgument invalide. Essaye ''/%command% help''' NotOnline: '&cLe joueur &7%player% &cn''est pas en ligne!' Delay: '&aTéléportation dans &f%time% &asecondes! Ne bouge pas!' diff --git a/src/main/resources/lang/ja.yml b/src/main/resources/lang/ja.yml index a33c8ac..71a4e52 100644 --- a/src/main/resources/lang/ja.yml +++ b/src/main/resources/lang/ja.yml @@ -18,6 +18,7 @@ Messages: ## DisabledWorld: '&cワールド%world%は無効です! &7RTPできませんでした!' Cooldown: '&cごめんなさい! &7あなたは&c%time%&7秒間RTPできません!' + Locked: '&cSorry! &7You''ve used up all your RTP''s!' Invalid: '&c無効な引数。 ''/%command% help''を試してください。' NotOnline: '&cプレイヤー&7%player%&cはオンラインではありません!' Delay: '&f%time%&a秒でテレポートします! 動かないで!' diff --git a/src/main/resources/lang/ru.yml b/src/main/resources/lang/ru.yml index 6631829..1f850d3 100644 --- a/src/main/resources/lang/ru.yml +++ b/src/main/resources/lang/ru.yml @@ -18,6 +18,7 @@ Messages: ## %world% is the world the player is in that is disabled to rtp in! # DisabledWorld: '&cОтключенный мир %world%! &7Не удалось телепортироваться!' Cooldown: '&cИзвините! &7Вы не сможете использовать rtp ближайшие &c%time% &7сек.!' + Locked: '&cSorry! &7You''ve used up all your RTP''s!' Invalid: '&cНеправильные параметры. Попробуйте ''/%command% help''' NotOnline: '&cИгрок &7%player% &cне онлайн!' Delay: '&aТелепортация через &f%time% &aсек.! Не двигайтесь!'