mirror of
https://github.com/TotalFreedomMC/TF-EssentialsX.git
synced 2025-02-13 04:36:44 +00:00
396 lines
9.5 KiB
Java
396 lines
9.5 KiB
Java
package com.earth2me.essentials;
|
|
|
|
import static com.earth2me.essentials.I18n._;
|
|
import java.text.DecimalFormat;
|
|
import java.text.DecimalFormatSymbols;
|
|
import java.util.*;
|
|
import java.util.logging.Logger;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.Material;
|
|
import org.bukkit.World;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.entity.LivingEntity;
|
|
|
|
|
|
public class Util
|
|
{
|
|
private Util()
|
|
{
|
|
}
|
|
private final static Logger logger = Logger.getLogger("Minecraft");
|
|
|
|
public static String sanitizeFileName(String name)
|
|
{
|
|
return name.toLowerCase(Locale.ENGLISH).replaceAll("[^a-z0-9]", "_");
|
|
}
|
|
|
|
public static String formatDateDiff(long date)
|
|
{
|
|
Calendar c = new GregorianCalendar();
|
|
c.setTimeInMillis(date);
|
|
Calendar now = new GregorianCalendar();
|
|
return Util.formatDateDiff(now, c);
|
|
}
|
|
|
|
public static String formatDateDiff(Calendar fromDate, Calendar toDate)
|
|
{
|
|
boolean future = false;
|
|
if (toDate.equals(fromDate))
|
|
{
|
|
return _("now");
|
|
}
|
|
if (toDate.after(fromDate))
|
|
{
|
|
future = true;
|
|
}
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
int[] types = new int[]
|
|
{
|
|
Calendar.YEAR,
|
|
Calendar.MONTH,
|
|
Calendar.DAY_OF_MONTH,
|
|
Calendar.HOUR_OF_DAY,
|
|
Calendar.MINUTE,
|
|
Calendar.SECOND
|
|
};
|
|
String[] names = new String[]
|
|
{
|
|
_("year"),
|
|
_("years"),
|
|
_("month"),
|
|
_("months"),
|
|
_("day"),
|
|
_("days"),
|
|
_("hour"),
|
|
_("hours"),
|
|
_("minute"),
|
|
_("minutes"),
|
|
_("second"),
|
|
_("seconds")
|
|
};
|
|
for (int i = 0; i < types.length; i++)
|
|
{
|
|
int diff = dateDiff(types[i], fromDate, toDate, future);
|
|
if (diff > 0)
|
|
{
|
|
sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]);
|
|
}
|
|
}
|
|
if (sb.length() == 0)
|
|
{
|
|
return "now";
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
private static int dateDiff(int type, Calendar fromDate, Calendar toDate, boolean future)
|
|
{
|
|
int diff = 0;
|
|
long savedDate = fromDate.getTimeInMillis();
|
|
while ((future && !fromDate.after(toDate)) || (!future && !fromDate.before(toDate)))
|
|
{
|
|
savedDate = fromDate.getTimeInMillis();
|
|
fromDate.add(type, future ? 1 : -1);
|
|
diff++;
|
|
}
|
|
diff--;
|
|
fromDate.setTimeInMillis(savedDate);
|
|
return diff;
|
|
}
|
|
|
|
public static long parseDateDiff(String time, boolean future) throws Exception
|
|
{
|
|
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)
|
|
{
|
|
throw new Exception(_("illegalDate"));
|
|
}
|
|
Calendar c = new GregorianCalendar();
|
|
if (years > 0)
|
|
{
|
|
c.add(Calendar.YEAR, years * (future ? 1 : -1));
|
|
}
|
|
if (months > 0)
|
|
{
|
|
c.add(Calendar.MONTH, months * (future ? 1 : -1));
|
|
}
|
|
if (weeks > 0)
|
|
{
|
|
c.add(Calendar.WEEK_OF_YEAR, weeks * (future ? 1 : -1));
|
|
}
|
|
if (days > 0)
|
|
{
|
|
c.add(Calendar.DAY_OF_MONTH, days * (future ? 1 : -1));
|
|
}
|
|
if (hours > 0)
|
|
{
|
|
c.add(Calendar.HOUR_OF_DAY, hours * (future ? 1 : -1));
|
|
}
|
|
if (minutes > 0)
|
|
{
|
|
c.add(Calendar.MINUTE, minutes * (future ? 1 : -1));
|
|
}
|
|
if (seconds > 0)
|
|
{
|
|
c.add(Calendar.SECOND, seconds * (future ? 1 : -1));
|
|
}
|
|
return c.getTimeInMillis();
|
|
}
|
|
// The player can stand inside these materials
|
|
private static final Set<Integer> AIR_MATERIALS = new HashSet<Integer>();
|
|
private static final HashSet<Byte> AIR_MATERIALS_TARGET = new HashSet<Byte>();
|
|
|
|
static
|
|
{
|
|
AIR_MATERIALS.add(Material.AIR.getId());
|
|
AIR_MATERIALS.add(Material.SAPLING.getId());
|
|
AIR_MATERIALS.add(Material.POWERED_RAIL.getId());
|
|
AIR_MATERIALS.add(Material.DETECTOR_RAIL.getId());
|
|
AIR_MATERIALS.add(Material.LONG_GRASS.getId());
|
|
AIR_MATERIALS.add(Material.DEAD_BUSH.getId());
|
|
AIR_MATERIALS.add(Material.YELLOW_FLOWER.getId());
|
|
AIR_MATERIALS.add(Material.RED_ROSE.getId());
|
|
AIR_MATERIALS.add(Material.BROWN_MUSHROOM.getId());
|
|
AIR_MATERIALS.add(Material.RED_MUSHROOM.getId());
|
|
AIR_MATERIALS.add(Material.TORCH.getId());
|
|
AIR_MATERIALS.add(Material.REDSTONE_WIRE.getId());
|
|
AIR_MATERIALS.add(Material.SEEDS.getId());
|
|
AIR_MATERIALS.add(Material.SIGN_POST.getId());
|
|
AIR_MATERIALS.add(Material.WOODEN_DOOR.getId());
|
|
AIR_MATERIALS.add(Material.LADDER.getId());
|
|
AIR_MATERIALS.add(Material.RAILS.getId());
|
|
AIR_MATERIALS.add(Material.WALL_SIGN.getId());
|
|
AIR_MATERIALS.add(Material.LEVER.getId());
|
|
AIR_MATERIALS.add(Material.STONE_PLATE.getId());
|
|
AIR_MATERIALS.add(Material.IRON_DOOR_BLOCK.getId());
|
|
AIR_MATERIALS.add(Material.WOOD_PLATE.getId());
|
|
AIR_MATERIALS.add(Material.REDSTONE_TORCH_OFF.getId());
|
|
AIR_MATERIALS.add(Material.REDSTONE_TORCH_ON.getId());
|
|
AIR_MATERIALS.add(Material.STONE_BUTTON.getId());
|
|
AIR_MATERIALS.add(Material.SUGAR_CANE_BLOCK.getId());
|
|
AIR_MATERIALS.add(Material.DIODE_BLOCK_OFF.getId());
|
|
AIR_MATERIALS.add(Material.DIODE_BLOCK_ON.getId());
|
|
AIR_MATERIALS.add(Material.TRAP_DOOR.getId());
|
|
AIR_MATERIALS.add(Material.PUMPKIN_STEM.getId());
|
|
AIR_MATERIALS.add(Material.MELON_STEM.getId());
|
|
AIR_MATERIALS.add(Material.VINE.getId());
|
|
//TODO: Add 1.9 materials
|
|
|
|
for (Integer integer : AIR_MATERIALS)
|
|
{
|
|
AIR_MATERIALS_TARGET.add(integer.byteValue());
|
|
}
|
|
AIR_MATERIALS_TARGET.add((byte)Material.WATER.getId());
|
|
AIR_MATERIALS_TARGET.add((byte)Material.STATIONARY_WATER.getId());
|
|
}
|
|
|
|
public static Location getTarget(final LivingEntity entity) throws Exception
|
|
{
|
|
final Block block = entity.getTargetBlock(AIR_MATERIALS_TARGET, 300);
|
|
if (block == null)
|
|
{
|
|
throw new Exception("Not targeting a block");
|
|
}
|
|
return block.getLocation();
|
|
}
|
|
|
|
public static Location getSafeDestination(final Location loc) throws Exception
|
|
{
|
|
if (loc == null || loc.getWorld() == null)
|
|
{
|
|
throw new Exception(_("destinationNotSet"));
|
|
}
|
|
final World world = loc.getWorld();
|
|
int x = loc.getBlockX();
|
|
int y = (int)Math.round(loc.getY());
|
|
int z = loc.getBlockZ();
|
|
|
|
while (isBlockAboveAir(world, x, y, z))
|
|
{
|
|
y -= 1;
|
|
if (y < 0)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
while (isBlockUnsafe(world, x, y, z))
|
|
{
|
|
y += 1;
|
|
if (y >= 127)
|
|
{
|
|
x += 1;
|
|
break;
|
|
}
|
|
}
|
|
while (isBlockUnsafe(world, x, y, z))
|
|
{
|
|
y -= 1;
|
|
if (y <= 1)
|
|
{
|
|
y = 127;
|
|
x += 1;
|
|
if (x - 32 > loc.getBlockX())
|
|
{
|
|
throw new Exception(_("holeInFloor"));
|
|
}
|
|
}
|
|
}
|
|
return new Location(world, x + 0.5D, y, z + 0.5D, loc.getYaw(), loc.getPitch());
|
|
}
|
|
|
|
private static boolean isBlockAboveAir(final World world, final int x, final int y, final int z)
|
|
{
|
|
return AIR_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType().getId());
|
|
}
|
|
|
|
public static boolean isBlockUnsafe(final World world, final int x, final int y, final int z)
|
|
{
|
|
final Block below = world.getBlockAt(x, y - 1, z);
|
|
if (below.getType() == Material.LAVA || below.getType() == Material.STATIONARY_LAVA)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (below.getType() == Material.FIRE)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if ((!AIR_MATERIALS.contains(world.getBlockAt(x, y, z).getType().getId()))
|
|
|| (!AIR_MATERIALS.contains(world.getBlockAt(x, y + 1, z).getType().getId())))
|
|
{
|
|
return true;
|
|
}
|
|
return isBlockAboveAir(world, x, y, z);
|
|
}
|
|
private static DecimalFormat df = new DecimalFormat("#0.00", DecimalFormatSymbols.getInstance(Locale.US));
|
|
|
|
public static String formatCurrency(final double value, final IEssentials ess)
|
|
{
|
|
String str = ess.getSettings().getCurrencySymbol() + df.format(value);
|
|
if (str.endsWith(".00"))
|
|
{
|
|
str = str.substring(0, str.length() - 3);
|
|
}
|
|
return str;
|
|
}
|
|
|
|
public static double roundDouble(final double d)
|
|
{
|
|
return Math.round(d * 100.0) / 100.0;
|
|
}
|
|
|
|
public static boolean isInt(final String sInt)
|
|
{
|
|
try
|
|
{
|
|
Integer.parseInt(sInt);
|
|
}
|
|
catch (NumberFormatException e)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static String joinList(Object... list)
|
|
{
|
|
return joinList(", ", list);
|
|
}
|
|
|
|
public static String joinList(String seperator, Object... list)
|
|
{
|
|
StringBuilder buf = new StringBuilder();
|
|
for (Object each : list)
|
|
{
|
|
if (buf.length() > 0)
|
|
{
|
|
buf.append(seperator);
|
|
}
|
|
|
|
if (each instanceof List)
|
|
{
|
|
buf.append(joinList(seperator, ((List)each).toArray()));
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
buf.append(each.toString());
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
buf.append(each.toString());
|
|
}
|
|
}
|
|
}
|
|
return buf.toString();
|
|
}
|
|
}
|