From 939e0730fd9b604b2ba6c7625415156082e5591c Mon Sep 17 00:00:00 2001 From: Super_ Date: Sun, 12 Jan 2020 09:51:29 -0500 Subject: [PATCH] realtime and the superior sword --- TotalFreedomMod.iml | 112 ++++++------------ .../totalfreedommod/AntiNuke.java | 6 +- .../totalfreedommod/TotalFreedomMod.java | 3 + .../blocking/BlockBlocker.java | 20 +++- .../totalfreedommod/command/Command_gtfo.java | 31 +++++ .../command/Command_realtime.java | 64 ++++++++++ .../totalfreedommod/command/Command_shop.java | 25 ++-- .../totalfreedommod/fun/ItemFun.java | 66 +++++++++-- .../totalfreedommod/fun/RealTimer.java | 71 +++++++++++ .../playerverification/VPlayer.java | 10 ++ .../totalfreedommod/shop/ShopData.java | 10 +- .../totalfreedommod/util/FUtil.java | 54 +++++++++ 12 files changed, 368 insertions(+), 104 deletions(-) create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/command/Command_realtime.java create mode 100644 src/main/java/me/totalfreedom/totalfreedommod/fun/RealTimer.java diff --git a/TotalFreedomMod.iml b/TotalFreedomMod.iml index 13f64d00..2b8dccab 100644 --- a/TotalFreedomMod.iml +++ b/TotalFreedomMod.iml @@ -47,80 +47,42 @@ + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -150,18 +112,16 @@ - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java b/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java index c32d5bd4..a25334d9 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/AntiNuke.java @@ -43,7 +43,8 @@ public class AntiNuke extends FreedomService if (fPlayer.incrementAndGetBlockDestroyCount() > ConfigEntry.NUKE_MONITOR_COUNT_BREAK.getInteger()) { FUtil.bcastMsg(player.getName() + " is breaking blocks too fast!", ChatColor.RED); - plugin.ae.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server."); + //plugin.ae.autoEject(player, "You are breaking blocks too fast. Nukers are not permitted on this server."); + player.kickPlayer(ChatColor.RED + "You are breaking blocks too fast. Nukers are not permitted on this server."); fPlayer.resetBlockDestroyCount(); @@ -66,7 +67,8 @@ public class AntiNuke extends FreedomService if (fPlayer.incrementAndGetBlockPlaceCount() > ConfigEntry.NUKE_MONITOR_COUNT_PLACE.getInteger()) { FUtil.bcastMsg(player.getName() + " is placing blocks too fast!", ChatColor.RED); - plugin.ae.autoEject(player, "You are placing blocks too fast."); + //plugin.ae.autoEject(player, "You are placing blocks too fast."); + player.kickPlayer(ChatColor.RED + "You are placing blocks too fast."); fPlayer.resetBlockPlaceCount(); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index fcb4913f..f48d8e58 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -34,6 +34,7 @@ import me.totalfreedom.totalfreedommod.fun.Jumppads; import me.totalfreedom.totalfreedommod.fun.Landminer; import me.totalfreedom.totalfreedommod.fun.MP44; import me.totalfreedom.totalfreedommod.fun.MobStacker; +import me.totalfreedom.totalfreedommod.fun.RealTimer; import me.totalfreedom.totalfreedommod.fun.Trailer; import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon; import me.totalfreedom.totalfreedommod.masterbuilder.MasterBuilder; @@ -127,6 +128,7 @@ public class TotalFreedomMod extends AeroPlugin public SignBlocker snp; public PlayerVerification pv; public EntityWiper ew; + public RealTimer rt; //public HubWorldRestrictions hwr; // // Bridges @@ -240,6 +242,7 @@ public class TotalFreedomMod extends AeroPlugin mp = services.registerService(MP44.class); jp = services.registerService(Jumppads.class); tr = services.registerService(Trailer.class); + rt = services.registerService(RealTimer.class); // HTTPD hd = services.registerService(HTTPDaemon.class); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/blocking/BlockBlocker.java b/src/main/java/me/totalfreedom/totalfreedommod/blocking/BlockBlocker.java index f7f9ae9d..8fefaab1 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/blocking/BlockBlocker.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/blocking/BlockBlocker.java @@ -1,16 +1,18 @@ package me.totalfreedom.totalfreedommod.blocking; +import java.util.List; import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; +import me.totalfreedom.totalfreedommod.util.Groups; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.block.Banner; import org.bukkit.block.Block; -import org.bukkit.block.Chest; -import org.bukkit.block.ShulkerBox; import org.bukkit.block.Skull; +import org.bukkit.block.banner.Pattern; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -177,5 +179,19 @@ public class BlockBlocker extends FreedomService } } + if (Groups.BANNERS.contains(event.getBlockPlaced().getType())) + { + Banner banner = (Banner) event.getBlockPlaced().getState(); + List patterns = banner.getPatterns(); + Banner handBanner = (Banner) (((Block) event.getItemInHand()).getState()); + List handPatterns = banner.getPatterns(); + if (patterns.size() >= 2) + { + banner.setPatterns(patterns.subList(0, 2)); + handBanner.setPatterns(handPatterns.subList(0, 2)); + player.sendMessage(ChatColor.GRAY + "Your banner had too many patterns on it, so some were removed."); + } + } + } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gtfo.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gtfo.java index 2132a6fe..2d10256d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gtfo.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gtfo.java @@ -19,6 +19,8 @@ import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; @CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.BOTH, blockHostConsole = true) @CommandParameters(description = "Bans a player", usage = "/ [reason] [-nrb]", aliases = "ban") @@ -82,6 +84,7 @@ public class Command_gtfo extends FreedomCommand String reason = null; Boolean cancelRollback = false; + Boolean epicFail = false; if (args.length >= 2) { if (args[args.length - 1].equalsIgnoreCase("-nrb")) @@ -92,6 +95,14 @@ public class Command_gtfo extends FreedomCommand reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); } } + if (args[args.length - 1].equalsIgnoreCase("-ef")) + { + epicFail = true; + if (args.length >= 3) + { + reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length - 1), " "); + } + } else { reason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " "); @@ -121,6 +132,26 @@ public class Command_gtfo extends FreedomCommand } } + if (epicFail) + { + for (int i = 0; i < 25; i++) + { + player.setVelocity(player.getVelocity().clone().add(new Vector(0, 50, 0))); + new BukkitRunnable() + { + public void run() + { + for (int i = 0; i < 8; i++) + { + player.getWorld().strikeLightning(player.getLocation()); + //FUtil. + } + } + }.runTaskLater(plugin, 2L * 20L); + } + return true; + } + if (player != null) { FUtil.bcastMsg(player.getName() + " has been a VERY naughty, naughty boy.", ChatColor.RED); diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_realtime.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_realtime.java new file mode 100644 index 00000000..71150c4d --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_realtime.java @@ -0,0 +1,64 @@ +package me.totalfreedom.totalfreedommod.command; + +import me.totalfreedom.totalfreedommod.playerverification.VPlayer; +import me.totalfreedom.totalfreedommod.rank.Rank; +import me.totalfreedom.totalfreedommod.util.FUtil; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) +@CommandParameters(description = "Sync your time up with the real world time.", usage = "/ | off>", aliases = "rt") +public class Command_realtime extends FreedomCommand +{ + @Override + public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) + { + VPlayer player = plugin.pv.getVerificationPlayer(playerSender); + if (args.length == 0 || args.length > 2) + { + return false; + } + if (args.length == 2) + { + if (args[0].equalsIgnoreCase("on")) + { + int tz; + try + { + tz = Integer.parseInt(args[1]); + } + catch (NumberFormatException ex) + { + msg("Invalid UTC offset."); + return true; + } + if (FUtil.timeZoneOutOfBounds(tz)) + { + msg("Invalid UTC offset."); + return true; + } + player.setUtcOffset(tz); + player.setRealTime(true); + plugin.rt.enable(playerSender); + plugin.pv.save(); + msg("Your in-game time is now synced with real time."); + return true; + } + } + if (args[0].equalsIgnoreCase("off")) + { + if (!player.isRealTime()) + { + msg("You aren't on real time."); + return true; + } + player.setRealTime(false); + msg("Your in-game time is no longer synced with real time."); + plugin.rt.disable(playerSender); + plugin.pv.save(); + return true; + } + return true; + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java index e0cee9b5..23223e7d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java @@ -6,7 +6,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; -import java.util.TimerTask; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.shop.ShopData; @@ -19,6 +18,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; @CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Access the shop", usage = "/ | action | list>") @@ -57,7 +57,7 @@ public class Command_shop extends FreedomCommand sd.setCoins(sd.getCoins() + 100); plugin.sh.save(sd); msg(prefix + ChatColor.GREEN + "You received your 100 coins!"); - cooldown(86400, args[0]); + cooldown(86400, sender, args[0]); return true; } case "search": @@ -67,7 +67,7 @@ public class Command_shop extends FreedomCommand sd.setCoins(sd.getCoins() + amount); plugin.sh.save(sd); msg(prefix + ChatColor.AQUA + location + ChatColor.GREEN + " - Found " + ChatColor.RED + amount + ChatColor.GREEN + " coins!"); - cooldown(30, args[0]); + cooldown(30, sender, args[0]); return true; } case "list": @@ -80,11 +80,16 @@ public class Command_shop extends FreedomCommand } return true; } - default: - { - return false; - } } + Player player = getPlayer(args[0]); + if (player == null) + { + msg(PLAYER_NOT_FOUND); + return true; + } + ShopData psd = plugin.sh.getData(player); + msg(prefix + ChatColor.AQUA + player.getName() + ChatColor.GREEN + "'s balance: " + ChatColor.RED + psd.getCoins()); + return true; } if (args.length != 2) { @@ -150,17 +155,17 @@ public class Command_shop extends FreedomCommand } } - private void cooldown(int seconds, String feature) + private void cooldown(int seconds, CommandSender sender, String feature) { featureCooldown.put(sender, feature); - FreedomCommandExecutor.timer.schedule(new TimerTask() + new BukkitRunnable() { @Override public void run() { featureCooldown.remove(sender); } - }, seconds * 1000); + }.runTaskLater(plugin, seconds * 20); } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java index 8e88b76e..d84d0d01 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/ItemFun.java @@ -21,6 +21,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.Location; import org.bukkit.Material; @@ -45,29 +47,28 @@ public class ItemFun extends FreedomService private final Random random = new Random(); - private static final String COOLDOWN_MESSAGE = ChatColor.RED + "You're on cooldown for this item."; + private static final String COOLDOWN_MESSAGE = ChatColor.RED + "You're on cooldown for this feature."; - private final Timer timer = new Timer(); - private final Map cooldownTracker = new HashMap<>(); + private final Map cooldownTracker = new HashMap<>(); private final Map orientationTracker = new HashMap<>(); - private void cooldown(Player player, Material material, int seconds) + private void cooldown(Player player, String feature, int seconds) { - cooldownTracker.put(player, material); - timer.schedule(new TimerTask() + cooldownTracker.put(player, feature); + new BukkitRunnable() { @Override public void run() { cooldownTracker.remove(player); } - }, seconds * 1000); + }.runTaskLater(plugin, seconds * 20); } - public boolean onCooldown(Player player, Material material) + public boolean onCooldown(Player player, String feature) { - return cooldownTracker.containsKey(player) && cooldownTracker.containsValue(material); + return cooldownTracker.containsKey(player) && cooldownTracker.containsValue(feature); } public ItemFun(TotalFreedomMod plugin) @@ -319,7 +320,7 @@ public class ItemFun extends FreedomService case NETHER_STAR: { - if (onCooldown(player, Material.NETHER_STAR)) + if (onCooldown(player, "nether_star")) { FUtil.playerMsg(player, COOLDOWN_MESSAGE); break; @@ -340,27 +341,66 @@ public class ItemFun extends FreedomService { player.getWorld().strikeLightning(targetBlock.getLocation()); } + + boolean superior = FUtil.random(1, 100) == 50; Player rplayer = FUtil.getRandomPlayer(); - FUtil.bcastMsg("Thor's Star has granted " + rplayer.getName() + " an " + ChatColor.YELLOW + "Electrical Diamond Sword" + ChatColor.RED + "!", ChatColor.RED); ShopData psd = plugin.sh.getData(rplayer); String key = FUtil.generateKey(8); psd.giveRawItem(key); plugin.sh.save(psd); - FUtil.give(rplayer, Material.DIAMOND_SWORD, "&eElectrical Diamond Sword", 1, "&7RMB - Strike lightning", ChatColor.DARK_GRAY + key); - cooldown(player, Material.NETHER_STAR, 600); + if (superior) + { + for (int i = 0; i < 25; i++) + { + rplayer.getWorld().strikeLightning(rplayer.getLocation()); + } + FUtil.bcastMsg("THOR'S STAR HAS GRANTED " + rplayer.getName().toUpperCase() + " A " + ChatColor.GOLD + "SUPERIOR SWORD" + ChatColor.RED + "!!!!", ChatColor.RED); + FUtil.give(rplayer, Material.GOLDEN_SWORD, "&6Superior Sword", 1, "&7RMB - Shoot fireball", ChatColor.DARK_GRAY + key); + } + else + { + FUtil.bcastMsg("Thor's Star has granted " + rplayer.getName() + " an " + ChatColor.YELLOW + "Electrical Diamond Sword" + ChatColor.RED + "!", ChatColor.RED); + FUtil.give(rplayer, Material.DIAMOND_SWORD, "&eElectrical Diamond Sword", 1, "&7RMB - Strike lightning", ChatColor.DARK_GRAY + key); + } + cooldown(player, "nether_star", 600); break; } case DIAMOND_SWORD: { + if (onCooldown(player, "eds")) + { + FUtil.playerMsg(player, COOLDOWN_MESSAGE); + break; + } + ShopData sd = plugin.sh.getData(player); ItemStack stack = player.getInventory().getItemInMainHand(); if (sd.validate(stack, "Electrical Diamond Sword")) { player.getWorld().strikeLightning(player.getTargetBlock(null, 20).getLocation()); + cooldown(player, "eds", 60); } break; } + + case GOLDEN_SWORD: + { + if (onCooldown(player, "ss")) + { + FUtil.playerMsg(player, COOLDOWN_MESSAGE); + break; + } + + ShopData sd = plugin.sh.getData(player); + ItemStack stack = player.getInventory().getItemInMainHand(); + if (sd.validate(stack, "Superior Sword")) + { + Entity fireball = player.getWorld().spawnEntity(player.getLocation(), EntityType.FIREBALL); + fireball.setVelocity(player.getLocation().getDirection()); + cooldown(player, "ss", 60); + } + } } } diff --git a/src/main/java/me/totalfreedom/totalfreedommod/fun/RealTimer.java b/src/main/java/me/totalfreedom/totalfreedommod/fun/RealTimer.java new file mode 100644 index 00000000..ea7d042f --- /dev/null +++ b/src/main/java/me/totalfreedom/totalfreedommod/fun/RealTimer.java @@ -0,0 +1,71 @@ +package me.totalfreedom.totalfreedommod.fun; + +import java.util.HashMap; +import java.util.Map; +import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.playerverification.VPlayer; +import me.totalfreedom.totalfreedommod.util.FUtil; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +public class RealTimer extends FreedomService +{ + public RealTimer(TotalFreedomMod plugin) + { + super(plugin); + } + + private Map tasks = new HashMap<>(); + + @Override + protected void onStart() + { + } + + @Override + protected void onStop() + { + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerJoin(PlayerJoinEvent event) + { + enable(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerQuit(PlayerQuitEvent event) + { + disable(event.getPlayer()); + } + + public void enable(Player player) + { + VPlayer vPlayer = plugin.pv.getVerificationPlayer(player); + if (vPlayer.isRealTime()) + { + tasks.put(player, new BukkitRunnable() + { + @Override + public void run() + { + player.setPlayerTime(FUtil.getTimeInTicks(vPlayer.getUtcOffset()), false); + } + }.runTaskTimer(plugin, 0L, 20)); + } + } + + public void disable(Player player) + { + if (!tasks.containsKey(player)) + return; + tasks.get(player).cancel(); + tasks.remove(player); + } +} diff --git a/src/main/java/me/totalfreedom/totalfreedommod/playerverification/VPlayer.java b/src/main/java/me/totalfreedom/totalfreedommod/playerverification/VPlayer.java index f0a6c74a..f28b0b1d 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/playerverification/VPlayer.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/playerverification/VPlayer.java @@ -41,6 +41,12 @@ public class VPlayer implements ConfigLoadable, ConfigSavable, Validatable @Getter @Setter private ChatColor color = null; + @Getter + @Setter + private int utcOffset = 0; + @Getter + @Setter + private boolean realTime = false; public VPlayer(String name) { @@ -64,6 +70,8 @@ public class VPlayer implements ConfigLoadable, ConfigSavable, Validatable clearChatOptOut = cs.getBoolean("clearChatOptOut", false); rideMode = cs.getString("rideMode", rideMode); color = ChatColor.getByChar(String.valueOf(cs.get("color"))); + utcOffset = cs.getInt("utcOffset", 0); + realTime = cs.getBoolean("realTime", false); } @Override @@ -78,6 +86,8 @@ public class VPlayer implements ConfigLoadable, ConfigSavable, Validatable cs.set("clearChatOptOut", clearChatOptOut); cs.set("rideMode", rideMode); cs.set("color", color == null ? null : color.getChar()); + cs.set("utcOffset", utcOffset); + cs.set("realTime", realTime); } public List getIps() diff --git a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopData.java b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopData.java index 0a0e5368..8adf6321 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopData.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/shop/ShopData.java @@ -100,7 +100,15 @@ public class ShopData implements ConfigLoadable, ConfigSavable, Validatable { for (String i : items) { - int id = Integer.valueOf(i.substring(0, 1)); + int id; + try + { + id = Integer.valueOf(i.substring(0, 1)); + } + catch (NumberFormatException ex) + { + continue; + } if (item.ordinal() == id) { return true; diff --git a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java index efe296ac..83731ea7 100644 --- a/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java +++ b/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java @@ -18,6 +18,7 @@ import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import me.totalfreedom.totalfreedommod.config.ConfigEntry; @@ -27,6 +28,7 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.OfflinePlayer; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; @@ -61,6 +63,7 @@ public class FUtil ChatColor.LIGHT_PURPLE); private static Iterator CHAT_COLOR_ITERATOR; private static String CHARACTER_STRING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + private static Map TIMEZONE_LOOKUP = new HashMap<>(); static { @@ -68,6 +71,24 @@ public class FUtil { CHAT_COLOR_NAMES.put(chatColor.name().toLowerCase().replace("_", ""), chatColor); } + + for (int i = -12; i <= 12; i++) + { + String sec = String.valueOf(i).replace("-", ""); + if (i > -10 && i < 10) + { + sec = "0" + sec; + } + if (i >= 0) + { + sec = "+" + sec; + } + else + { + sec = "-" + sec; + } + TIMEZONE_LOOKUP.put(i, "GMT" + sec + ":00"); + } } public static void cancel(BukkitTask task) @@ -529,4 +550,37 @@ public class FUtil List players = new ArrayList<>(Bukkit.getOnlinePlayers()); return players.get(random(0, players.size() - 1)); } + + // convert the current time + public static int getTimeInTicks(int tz) + { + if (timeZoneOutOfBounds(tz)) + { + return -1; + } + Calendar date = Calendar.getInstance(TimeZone.getTimeZone(TIMEZONE_LOOKUP.get(tz))); + int res = 0; + for (int i = 0; i < date.get(Calendar.HOUR_OF_DAY) - 6; i++) // oh yeah i don't know why this is 6 hours ahead + { + res += 1000; + } + int addExtra = 0; // we're adding extra to account for repeating decimals + for (int i = 0; i < date.get(Calendar.MINUTE); i++) + { + res += 16; + addExtra++; + if (addExtra == 3) + { + res += 1; + addExtra = 0; + } + } + // this is the best it can be. trust me. + return res; + } + + public static boolean timeZoneOutOfBounds(int tz) + { + return tz < -12 || tz > 12; + } }