TotalFreedomMod/src/main/java/me/totalfreedom/totalfreedommod/util/FUtil.java

917 lines
27 KiB
Java
Raw Normal View History

package me.totalfreedom.totalfreedommod.util;
2011-10-13 23:07:52 +00:00
2020-04-08 02:20:01 +00:00
import java.io.BufferedReader;
import java.io.DataOutputStream;
2014-08-23 18:19:25 +00:00
import java.io.File;
import java.io.FileFilter;
2020-04-08 02:20:01 +00:00
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
2020-09-12 03:27:26 +00:00
import java.net.HttpURLConnection;
2020-04-08 02:20:01 +00:00
import java.net.URL;
2012-11-13 01:42:30 +00:00
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
2020-01-12 14:51:29 +00:00
import java.util.TimeZone;
2020-04-08 02:20:01 +00:00
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
2020-04-22 08:23:51 +00:00
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
2020-01-25 06:27:16 +00:00
import org.apache.commons.lang.WordUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
2020-07-14 00:41:44 +00:00
import org.bukkit.Color;
import org.bukkit.Location;
2020-07-01 03:38:29 +00:00
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
2011-10-13 23:07:52 +00:00
import org.bukkit.command.CommandSender;
2019-12-14 03:17:34 +00:00
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
2020-07-01 01:51:06 +00:00
import org.bukkit.event.player.PlayerLoginEvent;
2020-01-08 23:00:15 +00:00
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
2020-07-01 03:38:29 +00:00
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
2020-04-08 02:20:01 +00:00
import org.json.simple.JSONArray;
2020-08-18 02:21:13 +00:00
import static org.bukkit.Bukkit.getServer;
2011-10-13 23:07:52 +00:00
public class FUtil
2011-10-13 23:07:52 +00:00
{
2017-11-27 07:04:53 +00:00
private static final Random RANDOM = new Random();
public static final String SAVED_FLAGS_FILENAME = "savedflags.dat";
2020-08-20 01:19:15 +00:00
/* See https://github.com/TotalFreedom/License - None of the listed names may be removed.
Leaving this list here for anyone running TFM on a cracked server:
public static final List<String> DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "Telesphoreo", "CoolJWB");
2020-08-20 01:19:15 +00:00
*/
public static final List<String> DEVELOPERS = Arrays.asList(
"1156a81a-23fb-435e-9aff-fe9c2ea7e82d", // Madgeek1450
"f9a1982e-252e-4ed3-92ed-52b0506a39c9", // Prozza
"90eb5d86-ed60-4165-a36e-bb77aa3c6664", // WickedGamingUK
"604cbb51-842d-4b43-8b0a-d1d7c6cd2869", // Wild1145
"e67d77c4-fff9-4cea-94cc-9f1f1ab7806b", // aggelosQQ
"0061326b-8b3d-44c8-830a-5f2d59f5dc1b", // scripthead
2020-12-01 00:03:51 +00:00
"67ce0e28-3d6b-469c-ab71-304eec81b614", // CoolJWB
"03b41e15-d03f-4025-86f5-f1812df200fa", // elmon_
"d018f2b8-ce60-4672-a45f-e580e0331299", // speednt
"458de06f-36a5-4e1b-aaa6-ec1d1751c5b6", // SupItsDillon
"c8e5af82-6aba-4dd7-83e8-474381380cc9" // Paldiu
2020-08-20 01:19:15 +00:00
);
public static final List<String> DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu");
2017-11-27 07:04:53 +00:00
public static String DATE_STORAGE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>();
public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList(
ChatColor.DARK_RED,
ChatColor.RED,
ChatColor.GOLD,
ChatColor.YELLOW,
ChatColor.GREEN,
ChatColor.DARK_GREEN,
ChatColor.AQUA,
ChatColor.DARK_AQUA,
ChatColor.BLUE,
ChatColor.DARK_BLUE,
ChatColor.DARK_PURPLE,
ChatColor.LIGHT_PURPLE);
private static Iterator<ChatColor> CHAT_COLOR_ITERATOR;
2020-01-07 20:13:59 +00:00
private static String CHARACTER_STRING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
2020-01-12 14:51:29 +00:00
private static Map<Integer, String> TIMEZONE_LOOKUP = new HashMap<>();
2017-11-27 07:04:53 +00:00
static
{
for (ChatColor chatColor : CHAT_COLOR_POOL)
{
CHAT_COLOR_NAMES.put(chatColor.name().toLowerCase().replace("_", ""), chatColor);
2017-10-13 18:38:05 +00:00
}
2020-01-12 14:51:29 +00:00
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");
}
}
2011-10-24 02:43:52 +00:00
public static void cancel(BukkitTask task)
{
if (task == null)
{
return;
}
try
{
task.cancel();
}
catch (Exception ex)
{
}
}
2018-05-13 19:49:13 +00:00
public static boolean isExecutive(String name)
{
2020-09-14 09:36:25 +00:00
return ConfigEntry.SERVER_OWNERS.getStringList().contains(name) || ConfigEntry.SERVER_EXECUTIVES.getStringList().contains(name);
2018-05-13 19:49:13 +00:00
}
2020-08-20 01:19:15 +00:00
public static boolean isDeveloper(Player player)
2019-08-27 23:25:50 +00:00
{
2021-01-03 18:16:41 +00:00
if (Bukkit.getOnlineMode())
{
return DEVELOPERS.contains(player.getUniqueId().toString());
2021-01-03 18:16:41 +00:00
}
else
{
return DEVELOPERS.contains(player.getName());
}
2019-08-27 23:25:50 +00:00
}
2021-01-03 18:18:14 +00:00
2020-08-01 04:10:44 +00:00
public static boolean inDeveloperMode()
{
return ConfigEntry.DEVELOPER_MODE.getBoolean();
}
2020-01-25 06:27:16 +00:00
public static String formatName(String name)
{
return WordUtils.capitalizeFully(name.replace("_", " "));
}
public static String showS(int count)
{
2020-08-01 04:10:44 +00:00
return (count == 1 ? "" : "s");
2020-01-25 06:27:16 +00:00
}
2019-01-29 04:57:41 +00:00
public static List<String> getPlayerList()
{
List<String> names = new ArrayList<>();
for (Player player : Bukkit.getOnlinePlayers())
{
2020-12-26 23:54:15 +00:00
if (!TotalFreedomMod.getPlugin().al.isVanished(player.getName()))
2020-04-22 08:23:51 +00:00
{
names.add(player.getName());
}
2019-01-29 04:57:41 +00:00
}
return names;
}
2020-05-29 10:14:21 +00:00
public static String listToString(List<String> list)
{
if (list.size() == 0)
{
return null;
}
return String.join(", ", list);
}
public static List<String> stringToList(String string)
{
if (string == null)
{
return new ArrayList<>();
}
return Arrays.asList(string.split(", "));
}
/**
* A way to get a sublist with a page index and a page size.
*
* @param list A list of objects that should be split into pages.
* @param size The size of the pages.
* @param index The page index, if outside of bounds error will be thrown. The page index starts at 0 as with all lists.
* @return A list of objects that is the page that has been selected from the previous last parameter.
*/
public static List<String> getPageFromList(List<String> list, int size, int index)
{
try
{
if (size >= list.size())
{
return list;
}
else if (size * (index + 1) <= list.size())
{
return list.subList(size * index, size * (index + 1));
}
else
{
return list.subList(size * index, (size * index) + (list.size() % size));
}
}
catch (IndexOutOfBoundsException e)
{
return new ArrayList<>();
}
}
2019-01-29 04:57:41 +00:00
public static List<String> getAllMaterialNames()
{
List<String> names = new ArrayList<>();
for (Material material : Material.values())
{
names.add(material.name());
}
return names;
}
2020-04-08 02:20:01 +00:00
public static UUID nameToUUID(String name)
{
try
{
JSONArray json = new JSONArray();
json.add(name);
2020-06-30 07:25:38 +00:00
List<String> headers = new ArrayList<>();
headers.add("Accept:application/json");
headers.add("Content-Type:application/json");
2020-09-14 09:36:25 +00:00
Response response = sendRequest("https://api.mojang.com/profiles/minecraft", "POST", headers, json.toString());
2020-04-08 02:20:01 +00:00
// Don't care how stupid this looks, couldn't find anything to parse a json string to something readable in java with something not horrendously huge, maybe im just retarded
Pattern pattern = Pattern.compile("(?<=\"id\":\")[a-f0-9].{31}");
2020-09-14 09:36:25 +00:00
Matcher matcher = pattern.matcher(response.getMessage());
2020-04-08 02:20:01 +00:00
if (matcher.find())
{
String rawUUID = matcher.group(0).replaceFirst("([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]+)", "$1-$2-$3-$4-$5");
return UUID.fromString(rawUUID);
}
}
catch (Exception e)
{
FLog.severe("Failed to convert name to UUID:\n" + e.toString());
}
return null;
}
public static Response sendRequest(String endpoint, String method, List<String> headers, String body) throws IOException
2020-04-08 02:20:01 +00:00
{
URL url = new URL(endpoint);
2020-09-12 03:27:26 +00:00
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
2020-09-14 09:36:25 +00:00
2020-06-30 07:25:38 +00:00
connection.setRequestMethod(method);
2020-09-14 09:36:25 +00:00
if (headers != null)
{
for (String header : headers)
{
String[] kv = header.split(":");
connection.setRequestProperty(kv[0], kv[1]);
}
}
FLog.info(connection.getRequestMethod());
if (body != null)
2020-06-30 07:25:38 +00:00
{
2020-09-14 09:36:25 +00:00
connection.setDoOutput(true);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(body);
outputStream.flush();
outputStream.close();
2020-06-30 07:25:38 +00:00
}
2020-09-14 09:36:25 +00:00
2020-04-08 02:20:01 +00:00
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null)
{
response.append(inputLine);
}
in.close();
2020-09-14 09:36:25 +00:00
return new Response(connection.getResponseCode(), response.toString());
2020-04-08 02:20:01 +00:00
}
2011-10-24 02:43:52 +00:00
public static void bcastMsg(String message, ChatColor color)
2011-10-13 23:07:52 +00:00
{
2020-04-08 08:34:08 +00:00
bcastMsg(message, color, true);
}
public static void bcastMsg(String message, ChatColor color, Boolean toConsole)
{
if (toConsole)
{
FLog.info(message, true);
}
2011-10-13 23:07:52 +00:00
2013-08-14 14:01:42 +00:00
for (Player player : Bukkit.getOnlinePlayers())
2011-10-13 23:07:52 +00:00
{
2013-08-14 14:01:42 +00:00
player.sendMessage((color == null ? "" : color) + message);
2011-10-13 23:07:52 +00:00
}
}
2020-04-08 08:34:08 +00:00
public static void bcastMsg(String message, Boolean toConsole)
{
bcastMsg(message, null, toConsole);
}
2011-10-24 02:43:52 +00:00
public static void bcastMsg(String message)
2011-10-13 23:07:52 +00:00
{
2020-04-08 08:34:08 +00:00
FUtil.bcastMsg(message, null, true);
2011-10-13 23:07:52 +00:00
}
2013-01-21 18:58:42 +00:00
// Still in use by listeners
public static void playerMsg(CommandSender sender, String message, ChatColor color)
{
sender.sendMessage(color + message);
}
2013-01-21 18:58:42 +00:00
// Still in use by listeners
public static void playerMsg(CommandSender sender, String message)
{
FUtil.playerMsg(sender, message, ChatColor.GRAY);
}
2015-05-13 12:52:01 +00:00
public static void setFlying(Player player, boolean flying)
{
player.setAllowFlight(true);
player.setFlying(flying);
}
public static void adminAction(String adminName, String action, boolean isRed)
{
FUtil.bcastMsg(adminName + " - " + action, (isRed ? ChatColor.RED : ChatColor.AQUA));
}
public static String formatLocation(Location location)
2011-10-13 23:07:52 +00:00
{
return String.format("%s: (%d, %d, %d)",
location.getWorld().getName(),
Math.round(location.getX()),
Math.round(location.getY()),
Math.round(location.getZ()));
2011-10-13 23:07:52 +00:00
}
public static boolean deleteFolder(File file)
2011-10-14 05:31:21 +00:00
{
2013-09-24 12:05:48 +00:00
if (file.exists() && file.isDirectory())
2011-10-14 05:31:21 +00:00
{
2013-09-24 12:05:48 +00:00
return FileUtils.deleteQuietly(file);
2011-10-14 05:31:21 +00:00
}
2013-09-24 12:05:48 +00:00
return false;
2011-10-14 05:31:21 +00:00
}
2011-10-24 02:43:52 +00:00
public static void deleteCoreDumps()
{
final File[] coreDumps = new File(".").listFiles(new FileFilter()
{
@Override
2017-11-27 07:04:53 +00:00
public boolean accept(File file)
{
return file.getName().startsWith("java.core");
}
});
for (File dump : coreDumps)
{
FLog.info("Removing core dump file: " + dump.getName());
dump.delete();
}
}
public static Date parseDateOffset(String time)
{
Pattern timePattern = Pattern.compile(
"(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*mo[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*w[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*d[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*h[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*m[a-z]*[,\\s]*)?"
+ "(?:([0-9]+)\\s*(?:s[a-z]*)?)?", Pattern.CASE_INSENSITIVE);
Matcher m = timePattern.matcher(time);
int years = 0;
int months = 0;
int weeks = 0;
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
boolean found = false;
while (m.find())
{
if (m.group() == null || m.group().isEmpty())
{
continue;
}
for (int i = 0; i < m.groupCount(); i++)
{
if (m.group(i) != null && !m.group(i).isEmpty())
{
found = true;
break;
}
}
if (found)
{
if (m.group(1) != null && !m.group(1).isEmpty())
{
years = Integer.parseInt(m.group(1));
}
if (m.group(2) != null && !m.group(2).isEmpty())
{
months = Integer.parseInt(m.group(2));
}
if (m.group(3) != null && !m.group(3).isEmpty())
{
weeks = Integer.parseInt(m.group(3));
}
if (m.group(4) != null && !m.group(4).isEmpty())
{
days = Integer.parseInt(m.group(4));
}
if (m.group(5) != null && !m.group(5).isEmpty())
{
hours = Integer.parseInt(m.group(5));
}
if (m.group(6) != null && !m.group(6).isEmpty())
{
minutes = Integer.parseInt(m.group(6));
}
if (m.group(7) != null && !m.group(7).isEmpty())
{
seconds = Integer.parseInt(m.group(7));
}
break;
}
}
if (!found)
{
return null;
}
Calendar c = new GregorianCalendar();
if (years > 0)
{
c.add(Calendar.YEAR, years);
}
if (months > 0)
{
c.add(Calendar.MONTH, months);
}
if (weeks > 0)
{
c.add(Calendar.WEEK_OF_YEAR, weeks);
}
if (days > 0)
{
c.add(Calendar.DAY_OF_MONTH, days);
}
if (hours > 0)
{
c.add(Calendar.HOUR_OF_DAY, hours);
}
if (minutes > 0)
{
c.add(Calendar.MINUTE, minutes);
}
if (seconds > 0)
{
c.add(Calendar.SECOND, seconds);
}
return c.getTime();
}
2012-09-18 00:13:13 +00:00
public static String playerListToNames(Set<OfflinePlayer> players)
{
List<String> names = new ArrayList<>();
2013-08-14 14:01:42 +00:00
for (OfflinePlayer player : players)
{
names.add(player.getName());
}
return StringUtils.join(names, ", ");
}
2012-11-13 01:42:30 +00:00
public static String dateToString(Date date)
{
return new SimpleDateFormat(DATE_STORAGE_FORMAT, Locale.ENGLISH).format(date);
}
public static Date stringToDate(String dateString)
2012-11-13 01:42:30 +00:00
{
try
{
return new SimpleDateFormat(DATE_STORAGE_FORMAT, Locale.ENGLISH).parse(dateString);
2012-11-13 01:42:30 +00:00
}
catch (ParseException pex)
2012-11-13 01:42:30 +00:00
{
return new Date(0L);
}
}
2012-11-18 03:57:24 +00:00
public static boolean isFromHostConsole(String senderName)
2012-11-18 03:57:24 +00:00
{
TotalFreedomMod Electrum Version 5.0 This TotalFreedomMod release implements many changes. Most notably, the internals have been completely revamped. TotalFreedomMod now relies on the Aero library for core mechanics such as command handling and services. Another important change is the UUID system. In TotalFreedomMod Electrum, it has been completely removed. The core reason for this is that the system as a whole was very bugged. Additionally, it did not solve the primary reason for its conception: preserving player data when the player changes their username. This is because TotalFreedomMod servers usually run in offline-mode. This meaning that some of the players joining do not have a registerd Mojang UUID whatsoever. All in all, the UUID system was buggy, and it did not fix the reason it was implemented, so it has been completely removed. The admin list and the ban list now use usernames and IPs again. Lastly, many smaller changes have been implemented. Due to the amount of changes, they have not been named individualy. Please refer to the issues below for more details. Fixes #342 Fixes #350 Fixes #380 Fixes #684 Fixes #704 Fixes #716 Fixes #735 Fixes #745 Fixes #784 Fixes #765 Fixes #791 Fixes #805 Fixes #826 Fixes #883 Fixes #1524 Fixes #1534 Fixes #1536 Fixes #1538 Fixes #1545 Fixes #1546 Fixes #1568 Fixes #1627 Resolves #403 Resolves #435 Resolves #597 Resolves #603 Resolves #628 Resolves #690 Resolves #708 Resolves #747 Resolves #748 Resolves #749 Resolves #764 Resolves #767 Resolves #782 Resolves #809 Resolves #803 Resolves #811 Resolves #813 Resolves #830 Resolves #848 Resolves #856 Resolves #876 Resolves #908 Resolves #992 Resolves #1018 Resolves #1432 Resolves #1446 Resolves #1494 Resolves #1501 Resolves #1526 Resolves #1540 Resolves #1550 Resolves #1560 Resolves #1561 Resolves #1578 Resolves #1613
2016-05-12 19:40:39 +00:00
return ConfigEntry.HOST_SENDER_NAMES.getList().contains(senderName.toLowerCase());
}
public static boolean fuzzyIpMatch(String a, String b, int octets)
{
boolean match = true;
String[] aParts = a.split("\\.");
String[] bParts = b.split("\\.");
if (aParts.length != 4 || bParts.length != 4)
{
return false;
}
if (octets > 4)
{
octets = 4;
}
else if (octets < 1)
{
octets = 1;
}
for (int i = 0; i < octets && i < 4; i++)
{
if (aParts[i].equals("*") || bParts[i].equals("*"))
{
continue;
}
if (!aParts[i].equals(bParts[i]))
{
match = false;
break;
}
}
return match;
}
2014-05-16 13:39:40 +00:00
public static String getFuzzyIp(String ip)
{
final String[] ipParts = ip.split("\\.");
if (ipParts.length == 4)
{
return String.format("%s.%s.*.*", ipParts[0], ipParts[1]);
}
return ip;
}
//getField: Borrowed from WorldEdit
@SuppressWarnings("unchecked")
2017-11-27 07:04:53 +00:00
public static <T> T getField(Object from, String name)
{
Class<?> checkClass = from.getClass();
do
{
try
{
Field field = checkClass.getDeclaredField(name);
field.setAccessible(true);
return (T)field.get(from);
2017-11-27 07:04:53 +00:00
}
TotalFreedomMod Electrum Version 5.0 This TotalFreedomMod release implements many changes. Most notably, the internals have been completely revamped. TotalFreedomMod now relies on the Aero library for core mechanics such as command handling and services. Another important change is the UUID system. In TotalFreedomMod Electrum, it has been completely removed. The core reason for this is that the system as a whole was very bugged. Additionally, it did not solve the primary reason for its conception: preserving player data when the player changes their username. This is because TotalFreedomMod servers usually run in offline-mode. This meaning that some of the players joining do not have a registerd Mojang UUID whatsoever. All in all, the UUID system was buggy, and it did not fix the reason it was implemented, so it has been completely removed. The admin list and the ban list now use usernames and IPs again. Lastly, many smaller changes have been implemented. Due to the amount of changes, they have not been named individualy. Please refer to the issues below for more details. Fixes #342 Fixes #350 Fixes #380 Fixes #684 Fixes #704 Fixes #716 Fixes #735 Fixes #745 Fixes #784 Fixes #765 Fixes #791 Fixes #805 Fixes #826 Fixes #883 Fixes #1524 Fixes #1534 Fixes #1536 Fixes #1538 Fixes #1545 Fixes #1546 Fixes #1568 Fixes #1627 Resolves #403 Resolves #435 Resolves #597 Resolves #603 Resolves #628 Resolves #690 Resolves #708 Resolves #747 Resolves #748 Resolves #749 Resolves #764 Resolves #767 Resolves #782 Resolves #809 Resolves #803 Resolves #811 Resolves #813 Resolves #830 Resolves #848 Resolves #856 Resolves #876 Resolves #908 Resolves #992 Resolves #1018 Resolves #1432 Resolves #1446 Resolves #1494 Resolves #1501 Resolves #1526 Resolves #1540 Resolves #1550 Resolves #1560 Resolves #1561 Resolves #1578 Resolves #1613
2016-05-12 19:40:39 +00:00
catch (NoSuchFieldException | IllegalAccessException ex)
{
}
}
while (checkClass.getSuperclass() != Object.class
2017-11-27 07:04:53 +00:00
&& ((checkClass = checkClass.getSuperclass()) != null));
return null;
}
2017-11-27 07:04:53 +00:00
public static ChatColor randomChatColor()
{
return CHAT_COLOR_POOL.get(RANDOM.nextInt(CHAT_COLOR_POOL.size()));
2017-10-13 18:38:05 +00:00
}
2017-12-23 04:07:36 +00:00
2017-11-27 07:04:53 +00:00
public static String rainbowify(String string)
{
CHAT_COLOR_ITERATOR = CHAT_COLOR_POOL.iterator();
2017-12-23 04:07:36 +00:00
StringBuilder newString = new StringBuilder();
char[] chars = string.toCharArray();
2017-12-23 04:07:36 +00:00
2017-11-27 07:04:53 +00:00
for (char c : chars)
{
if (!CHAT_COLOR_ITERATOR.hasNext())
{
CHAT_COLOR_ITERATOR = CHAT_COLOR_POOL.iterator(); //Restart from first colour if there are no more colours in iterator.
}
newString.append(CHAT_COLOR_ITERATOR.next()).append(c);
2017-10-13 18:38:05 +00:00
}
2017-12-23 04:07:36 +00:00
2017-11-27 07:04:53 +00:00
return newString.toString();
}
2013-08-12 10:26:49 +00:00
public static String colorize(String string)
2013-08-12 10:26:49 +00:00
{
2020-07-18 23:51:17 +00:00
if (string != null)
2020-06-30 07:25:38 +00:00
{
2020-07-18 23:51:17 +00:00
Matcher matcher = Pattern.compile("&#[a-f0-9A-F]{6}").matcher(string);
while (matcher.find())
{
String code = matcher.group().replace("&", "");
string = string.replace("&" + code, net.md_5.bungee.api.ChatColor.of(code) + "");
}
2020-06-30 07:25:38 +00:00
2020-07-18 23:51:17 +00:00
string = ChatColor.translateAlternateColorCodes('&', string);
}
2020-06-30 07:25:38 +00:00
return string;
2013-08-12 10:26:49 +00:00
}
2013-09-24 12:05:48 +00:00
public static Date getUnixDate(long unix)
{
return new Date(unix * 1000);
}
public static long getUnixTime()
{
return System.currentTimeMillis() / 1000L;
}
public static long getUnixTime(Date date)
{
if (date == null)
{
return 0;
}
return date.getTime() / 1000L;
}
public static String getNMSVersion()
{
2020-08-18 02:21:13 +00:00
String packageName = getServer().getClass().getPackage().getName();
return packageName.substring(packageName.lastIndexOf('.') + 1);
}
2020-04-08 08:34:08 +00:00
public static int randomInteger(int min, int max)
{
int range = max - min + 1;
int value = (int)(Math.random() * range) + min;
return value;
}
2019-12-11 01:13:47 +00:00
2020-04-08 08:34:08 +00:00
public static String randomString(int length)
{
2020-08-08 05:51:09 +00:00
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789-_=+[]{};:,.<>~";
2020-04-08 08:34:08 +00:00
String randomString = "";
for (int i = 0; i < length; i++)
{
2020-08-08 05:51:09 +00:00
int selectedCharacter = randomInteger(1, characters.length()) - 1;
randomString += characters.charAt(selectedCharacter);
}
return randomString;
2020-04-08 08:34:08 +00:00
2020-08-08 05:51:09 +00:00
}
public static String randomAlphanumericString(int length)
{
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789";
String randomString = "";
for (int i = 0; i < length; i++)
{
2020-04-08 08:34:08 +00:00
int selectedCharacter = randomInteger(1, characters.length()) - 1;
randomString += characters.charAt(selectedCharacter);
}
return randomString;
}
2019-12-11 01:13:47 +00:00
public static boolean isPaper()
{
try
{
Class.forName("com.destroystokyo.paper.PaperConfig");
return true;
}
catch (ClassNotFoundException ex)
{
return false;
}
}
2019-12-14 03:17:34 +00:00
public static void fixCommandVoid(Player player)
{
for (Player p : Bukkit.getOnlinePlayers())
{
for (Entity passengerEntity : p.getPassengers())
{
if (passengerEntity == player)
{
p.removePassenger(passengerEntity);
}
}
}
}
2020-01-07 20:13:59 +00:00
public static char getRandomCharacter()
{
return CHARACTER_STRING.charAt(new Random().nextInt(CHARACTER_STRING.length()));
}
2020-01-08 23:00:15 +00:00
public static void give(Player player, Material material, String coloredName, int amount, String... lore)
{
ItemStack stack = new ItemStack(material, amount);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(FUtil.colorize(coloredName));
List<String> loreList = new ArrayList<>();
for (String entry : lore)
{
loreList.add(FUtil.colorize(entry));
}
meta.setLore(loreList);
stack.setItemMeta(meta);
player.getInventory().setItem(player.getInventory().firstEmpty(), stack);
}
public static Player getRandomPlayer()
{
List<Player> players = new ArrayList<>(Bukkit.getOnlinePlayers());
2020-04-08 08:34:08 +00:00
return players.get(randomInteger(0, players.size() - 1));
2020-01-08 23:00:15 +00:00
}
2020-01-12 14:51:29 +00:00
// 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;
}
2020-04-08 02:20:01 +00:00
2020-07-01 01:51:06 +00:00
public static String getIp(Player player)
{
return player.getAddress().getAddress().getHostAddress().trim();
}
public static String getIp(PlayerLoginEvent event)
{
return event.getAddress().getHostAddress().trim();
}
2020-07-14 00:41:44 +00:00
private static Color interpolateColor(Color c1, Color c2, double factor)
{
long[] c1values = {c1.getRed(), c1.getGreen(), c1.getBlue()};
long[] c2values = {c2.getRed(), c2.getGreen(), c2.getBlue()};
for (int i = 0; i < 3; i++)
{
c1values[i] = Math.round(c1values[i] + factor * (c2values[i] - c1values[i]));
}
return Color.fromRGB((int)c1values[0], (int)c1values[1], (int)c1values[2]);
2020-07-14 00:41:44 +00:00
}
2020-08-01 04:10:44 +00:00
public static boolean isValidIPv4(String ip)
{
if (ip.matches("^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$")
|| ip.matches("^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\\.([*])\\.([*])$"))
2020-08-01 04:10:44 +00:00
{
return true;
}
return false;
}
2020-07-14 00:41:44 +00:00
public static List<Color> createColorGradient(Color c1, Color c2, int steps)
{
double factor = 1.0 / (steps - 1.0);
List<Color> colors = new ArrayList<>();
for (int i = 0; i < steps; i++)
{
colors.add(interpolateColor(c1, c2, factor * i));
}
return colors;
}
public static boolean colorClose(Color first, Color second, int tresHold)
{
int redDelta = Math.abs(first.getRed() - second.getRed());
int greenDelta = Math.abs(first.getGreen() - second.getGreen());
int blueDelta = Math.abs(first.getBlue() - second.getBlue());
return (redDelta + greenDelta + blueDelta) < tresHold;
}
2020-07-14 00:41:44 +00:00
public static Color fromAWT(java.awt.Color color)
{
return Color.fromRGB(color.getRed(), color.getGreen(), color.getBlue());
}
public static java.awt.Color toAWT(Color color)
{
return new java.awt.Color(color.getRed(), color.getGreen(), color.getBlue());
}
2020-07-15 04:23:26 +00:00
public static java.awt.Color getRandomAWTColor()
{
return new java.awt.Color(randomInteger(0, 255), randomInteger(0, 255), randomInteger(0, 255));
}
public static String getHexStringOfAWTColor(java.awt.Color color)
{
String hex = Integer.toHexString(color.getRGB() & 0xFFFFFF);
if (hex.length() < 6)
{
hex = "0" + hex;
}
return "#" + hex;
}
2020-07-01 03:38:29 +00:00
public static void createExplosionOnDelay(Location location, float power, int delay)
{
new BukkitRunnable()
{
@Override
public void run()
{
location.getWorld().createExplosion(location, power);
}
}.runTaskLater(TotalFreedomMod.getPlugin(), delay);
}
public static class PaginationList<T> extends ArrayList<T>
{
private final int epp;
public PaginationList(int epp)
{
super();
this.epp = epp;
}
@SafeVarargs
public PaginationList(int epp, T... elements)
{
super(Arrays.asList(elements));
this.epp = epp;
}
public int getPageCount()
{
return (int)Math.ceil((double)size() / (double)epp);
}
public List<T> getPage(int page)
{
if (page < 1 || page > getPageCount())
{
return null;
}
int startIndex = (page - 1) * epp;
int endIndex = Math.min(startIndex + (epp - 1), this.size() - 1);
return subList(startIndex, endIndex + 1);
}
}
}