diff --git a/pom.xml b/pom.xml index 2297f3b..7781355 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,9 @@ shade + + false + diff --git a/src/main/java/dev/brighten/ac/Anticheat.java b/src/main/java/dev/brighten/ac/Anticheat.java index 20be9db..710e8a3 100644 --- a/src/main/java/dev/brighten/ac/Anticheat.java +++ b/src/main/java/dev/brighten/ac/Anticheat.java @@ -1,12 +1,10 @@ package dev.brighten.ac; -import co.aikar.commands.BaseCommand; import co.aikar.commands.BukkitCommandManager; import com.google.common.util.concurrent.ThreadFactoryBuilder; import dev.brighten.ac.api.AnticheatAPI; import dev.brighten.ac.check.Check; import dev.brighten.ac.check.CheckManager; -import dev.brighten.ac.command.AnticheatCommand; import dev.brighten.ac.data.PlayerRegistry; import dev.brighten.ac.depends.LibraryLoader; import dev.brighten.ac.depends.MavenLibrary; @@ -20,13 +18,10 @@ import dev.brighten.ac.packet.listener.PacketProcessor; import dev.brighten.ac.utils.*; import dev.brighten.ac.utils.annotation.ConfigSetting; import dev.brighten.ac.utils.annotation.Init; -import dev.brighten.ac.utils.annotation.Invoke; import dev.brighten.ac.utils.config.Configuration; import dev.brighten.ac.utils.config.ConfigurationProvider; import dev.brighten.ac.utils.config.YamlConfiguration; import dev.brighten.ac.utils.math.RollingAverageDouble; -import dev.brighten.ac.utils.reflections.types.WrappedClass; -import dev.brighten.ac.utils.reflections.types.WrappedField; import dev.brighten.ac.utils.reflections.types.WrappedMethod; import dev.brighten.ac.utils.timer.Timer; import dev.brighten.ac.utils.timer.impl.TickTimer; @@ -37,8 +32,6 @@ import me.mat1337.loader.plugin.LoaderPlugin; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; import java.io.File; import java.io.IOException; @@ -90,8 +83,6 @@ public class Anticheat extends LoaderPlugin { INSTANCE = this; LibraryLoader.loadAll(getClass()); - findClassMethod = new WrappedClass(getClassLoader2().getClass()).getMethod("findClass", String.class); - scheduler = Executors.newScheduledThreadPool(2, new ThreadFactoryBuilder() .setNameFormat("Anticheat Schedular") .setUncaughtExceptionHandler((t, e) -> RunUtils.task(e::printStackTrace)) @@ -99,11 +90,11 @@ public class Anticheat extends LoaderPlugin { loadConfig(); + IntegrityCheck.checkIntegrity(); + commandManager = new BukkitCommandManager(getPluginInstance()); commandManager.enableUnstableAPI("help"); - commandManager.registerCommand(new AnticheatCommand()); - new CommandPropertiesManager(commandManager, getDataFolder(), getResource2("command-messages.properties")); @@ -111,10 +102,8 @@ public class Anticheat extends LoaderPlugin { new AnticheatAPI(); - initializeScanner(getPluginInstance().getClass(), getPluginInstance(), - null, - true, - true); + ClassScanner.initializeScanner(getPluginInstance().getClass(), getPluginInstance(), + ClassScanner.getNames()); if(!getAnticheatConfig().contains("database.username")) { getAnticheatConfig().set("database.username", "dbuser"); @@ -225,116 +214,10 @@ public class Anticheat extends LoaderPlugin { } } - public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, - boolean loadListeners, boolean loadCommands) { - initializeScanner(mainClass, plugin, loader, ClassScanner.getNames(), loadListeners, - loadCommands); - } - public WorldInfo getWorldInfo(World world) { return worldInfoMap.computeIfAbsent(world.getUID(), key -> new WorldInfo(world)); } - public void initializeScanner(Class mainClass, Plugin plugin, ClassLoader loader, Set names, - boolean loadListeners, boolean loadCommands) { - names.stream() - .map(name -> { - return new WrappedClass(findClassMethod.invoke(getClassLoader2(), name)); - }) - .filter(c -> { - if(c.getParent() == null) { - return false; - } - - Init init = c.getAnnotation(Init.class); - - String[] required = init.requirePlugins(); - - if(required.length > 0) { - if(init.requireType() == Init.RequireType.ALL) { - return Arrays.stream(required) - .allMatch(name -> { - if(name.contains("||")) { - return Arrays.stream(name.split("\\|\\|")) - .anyMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); - } else if(name.contains("&&")) { - return Arrays.stream(name.split("\\|\\|")) - .allMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); - } else return Bukkit.getPluginManager().isPluginEnabled(name); - }); - } else { - return Arrays.stream(required) - .anyMatch(name -> { - if(name.contains("||")) { - return Arrays.stream(name.split("\\|\\|")) - .anyMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); - } else if(name.contains("&&")) { - return Arrays.stream(name.split("\\|\\|")) - .allMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); - } else return Bukkit.getPluginManager().isPluginEnabled(name); - }); - } - } - return true; - }) - .sorted(Comparator.comparing(c -> - c.getAnnotation(Init.class).priority().getPriority(), Comparator.reverseOrder())) - .forEach(c -> { - Object obj = c.getParent().equals(mainClass) ? plugin : c.getConstructor().newInstance(); - Init annotation = c.getAnnotation(Init.class); - - if(loadListeners) { - if(obj instanceof Listener) { - Bukkit.getPluginManager().registerEvents((Listener)obj, plugin); - alog(true,"&7Registered Bukkit listener &e" - + c.getParent().getSimpleName() + "&7."); - } - } - - if(obj instanceof BaseCommand) { - alog(true,"&7Found BaseCommand for class &e" - + c.getParent().getSimpleName() + "&7! Registering commands..."); - commandManager.registerCommand((BaseCommand)obj); - } - - for (WrappedMethod method : c.getMethods()) { - if(method.getMethod().isAnnotationPresent(Invoke.class)) { - alog(true,"&7Invoking method &e" + method.getName() + " &7in &e" - + c.getClass().getSimpleName() + "&7..."); - method.invoke(obj); - } - } - - for (WrappedField field : c.getFields()) { - if(field.isAnnotationPresent(ConfigSetting.class)) { - ConfigSetting setting = field.getAnnotation(ConfigSetting.class); - - String name = setting.name().length() > 0 - ? setting.name() - : field.getField().getName(); - - alog(true, "&7Found ConfigSetting &e%s &7(default=&f%s&7).", - field.getField().getName(), - (setting.hide() ? "HIDDEN" : field.get(obj))); - - - Configuration config = getAnticheatConfig(); - - if(config.get((setting.path().length() > 0 ? setting.path() + "." : "") + name) == null) { - alog(true,"&7Value not set in config! Setting value..."); - config.set((setting.path().length() > 0 ? setting.path() + "." : "") + name, field.get(obj)); - saveConfig(); - } else { - Object configObj = config.get((setting.path().length() > 0 ? setting.path() + "." : "") + name); - alog(true, "&7Set field to value &e%s&7.", - (setting.hide() ? "HIDDEN" : configObj)); - field.set(obj, configObj); - } - } - } - }); - } - public void alog(String log, Object... values) { alog(false, log, values); } diff --git a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java index c76ae7c..e226426 100644 --- a/src/main/java/dev/brighten/ac/command/AnticheatCommand.java +++ b/src/main/java/dev/brighten/ac/command/AnticheatCommand.java @@ -15,6 +15,7 @@ import dev.brighten.ac.utils.Color; import dev.brighten.ac.utils.MiscUtils; import dev.brighten.ac.utils.Pastebin; import dev.brighten.ac.utils.Tuple; +import dev.brighten.ac.utils.annotation.Init; import dev.brighten.ac.utils.msg.ChatBuilder; import io.netty.buffer.Unpooled; import lombok.val; @@ -35,6 +36,7 @@ import java.util.List; import java.util.UUID; import java.util.stream.Collectors; +@Init @CommandAlias("anticheat|ac") @CommandPermission("anticheat.command") public class AnticheatCommand extends BaseCommand { @@ -100,7 +102,6 @@ public class AnticheatCommand extends BaseCommand { } @Subcommand("alerts") - @HelpCommand @CommandPermission("anticheat.command.alerts") @Description("Toggle anticheat alerts") public void onAlerts(Player pl) { diff --git a/src/main/java/dev/brighten/ac/logging/sql/MySQL.java b/src/main/java/dev/brighten/ac/logging/sql/MySQL.java index 8a458e9..9701141 100644 --- a/src/main/java/dev/brighten/ac/logging/sql/MySQL.java +++ b/src/main/java/dev/brighten/ac/logging/sql/MySQL.java @@ -1,10 +1,9 @@ package dev.brighten.ac.logging.sql; import dev.brighten.ac.Anticheat; -import dev.brighten.ac.utils.reflections.Reflections; -import dev.brighten.ac.utils.reflections.types.WrappedConstructor; import lombok.SneakyThrows; import org.bukkit.Bukkit; +import org.h2.jdbc.JdbcConnection; import java.io.File; import java.io.IOException; @@ -27,9 +26,7 @@ public class MySQL { Anticheat.INSTANCE.getLogger().log(Level.SEVERE, "File write error: database.db"); } try { - WrappedConstructor jdbcConnection = Reflections.getClass("org.h2.jdbc.JdbcConnection") - .getConstructor(String.class, Properties.class, String.class, Object.class, boolean.class); - conn = new NonClosableConnection(jdbcConnection.newInstance("jdbc:h2:file:" + + conn = new NonClosableConnection(new JdbcConnection("jdbc:h2:file:" + dataFolder.getAbsolutePath(), new Properties(), "root", "erc5gmv-xvg5CZQ0nzw", false)); conn.setAutoCommit(true); diff --git a/src/main/java/dev/brighten/ac/utils/ClassScanner.java b/src/main/java/dev/brighten/ac/utils/ClassScanner.java index 5d3f7dd..5e76e3e 100644 --- a/src/main/java/dev/brighten/ac/utils/ClassScanner.java +++ b/src/main/java/dev/brighten/ac/utils/ClassScanner.java @@ -1,10 +1,18 @@ package dev.brighten.ac.utils; +import co.aikar.commands.BaseCommand; import dev.brighten.ac.Anticheat; +import dev.brighten.ac.utils.annotation.ConfigSetting; import dev.brighten.ac.utils.annotation.Init; +import dev.brighten.ac.utils.annotation.Invoke; +import dev.brighten.ac.utils.config.Configuration; import dev.brighten.ac.utils.reflections.Reflections; import dev.brighten.ac.utils.reflections.types.WrappedClass; +import dev.brighten.ac.utils.reflections.types.WrappedField; +import dev.brighten.ac.utils.reflections.types.WrappedMethod; import org.bukkit.Bukkit; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; @@ -54,6 +62,105 @@ public class ClassScanner { return toReturn; } + private static WrappedMethod findClassMethod = + new WrappedClass(Anticheat.INSTANCE.getClassLoader2().getClass()).getMethod("findClass", String.class); + public static void initializeScanner(Class mainClass, Plugin plugin, Set names) { + names.stream() + .map(name -> { + return new WrappedClass(findClassMethod.invoke(Anticheat.INSTANCE.getClassLoader2(), name)); + }) + .filter(c -> { + if(c.getParent() == null) { + return false; + } + + Init init = c.getAnnotation(Init.class); + + String[] required = init.requirePlugins(); + + if(required.length > 0) { + if(init.requireType() == Init.RequireType.ALL) { + return Arrays.stream(required) + .allMatch(name -> { + if(name.contains("||")) { + return Arrays.stream(name.split("\\|\\|")) + .anyMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); + } else if(name.contains("&&")) { + return Arrays.stream(name.split("\\|\\|")) + .allMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); + } else return Bukkit.getPluginManager().isPluginEnabled(name); + }); + } else { + return Arrays.stream(required) + .anyMatch(name -> { + if(name.contains("||")) { + return Arrays.stream(name.split("\\|\\|")) + .anyMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); + } else if(name.contains("&&")) { + return Arrays.stream(name.split("\\|\\|")) + .allMatch(n2 -> Bukkit.getPluginManager().isPluginEnabled(n2)); + } else return Bukkit.getPluginManager().isPluginEnabled(name); + }); + } + } + return true; + }) + .sorted(Comparator.comparing(c -> + c.getAnnotation(Init.class).priority().getPriority(), Comparator.reverseOrder())) + .forEach(c -> { + Object obj = c.getParent().equals(mainClass) ? plugin : c.getConstructor().newInstance(); + Init annotation = c.getAnnotation(Init.class); + + if(obj instanceof Listener) { + Bukkit.getPluginManager().registerEvents((Listener)obj, plugin); + Anticheat.INSTANCE.alog(true,"&7Registered Bukkit listener &e" + + c.getParent().getSimpleName() + "&7."); + } + + if(obj instanceof BaseCommand) { + Anticheat.INSTANCE.alog(true,"&7Found BaseCommand for class &e" + + c.getParent().getSimpleName() + "&7! Registering commands..."); + Anticheat.INSTANCE.getCommandManager().registerCommand((BaseCommand)obj); + } + + for (WrappedMethod method : c.getMethods()) { + if(method.getMethod().isAnnotationPresent(Invoke.class)) { + Anticheat.INSTANCE.alog(true,"&7Invoking method &e" + method.getName() + " &7in &e" + + c.getClass().getSimpleName() + "&7..."); + method.invoke(obj); + } + } + + for (WrappedField field : c.getFields()) { + if(field.isAnnotationPresent(ConfigSetting.class)) { + ConfigSetting setting = field.getAnnotation(ConfigSetting.class); + + String name = setting.name().length() > 0 + ? setting.name() + : field.getField().getName(); + + Anticheat.INSTANCE.alog(true, "&7Found ConfigSetting &e%s &7(default=&f%s&7).", + field.getField().getName(), + (setting.hide() ? "HIDDEN" : field.get(obj))); + + + Configuration config = Anticheat.INSTANCE.getAnticheatConfig(); + + if(config.get((setting.path().length() > 0 ? setting.path() + "." : "") + name) == null) { + Anticheat.INSTANCE.alog(true,"&7Value not set in config! Setting value..."); + config.set((setting.path().length() > 0 ? setting.path() + "." : "") + name, field.get(obj)); + Anticheat.INSTANCE.saveConfig(); + } else { + Object configObj = config.get((setting.path().length() > 0 ? setting.path() + "." : "") + name); + Anticheat.INSTANCE.alog(true, "&7Set field to value &e%s&7.", + (setting.hide() ? "HIDDEN" : configObj)); + field.set(obj, configObj); + } + } + } + }); + } + public static Set getClasses(Class annotationClass) { Map map = Anticheat.INSTANCE.getStuffs(); Map loadedClasses = Anticheat.INSTANCE.getLoadedClasses(); @@ -78,7 +185,7 @@ public class ClassScanner { } public static Set getNames() { - Map map = Anticheat.INSTANCE.getStuffs(); + Map map = new HashMap<>(Anticheat.INSTANCE.getStuffs()); Set nameSet = new HashSet<>(); diff --git a/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java b/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java new file mode 100644 index 0000000..56f6f18 --- /dev/null +++ b/src/main/java/dev/brighten/ac/utils/IntegrityCheck.java @@ -0,0 +1,98 @@ +package dev.brighten.ac.utils; + +import dev.brighten.ac.Anticheat; +import dev.brighten.ac.utils.reflections.Reflections; +import dev.brighten.ac.utils.reflections.types.WrappedClass; +import dev.brighten.ac.utils.reflections.types.WrappedMethod; +import it.unimi.dsi.fastutil.longs.LongArrayList; +import it.unimi.dsi.fastutil.longs.LongList; +import lombok.SneakyThrows; +import org.bukkit.plugin.InvalidDescriptionException; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; + +import java.io.*; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.zip.CRC32; + +public class IntegrityCheck { + + private static WrappedClass classSystem = Reflections.getClass("java.lang.System"); + private static WrappedMethod exitMethod = classSystem.getMethod("exit", int.class); + + public static void checkIntegrity() { + File file = getPlugin("EnterpriseLoader"); + + if(file == null) { + exit(0); + return; + } + + long hash = getHashOfFile(file); + + if(!acceptableHashes.contains(hash)) { + System.out.println("Bad loader file!"); + exit(0); + } + } + + private static void exit(int number) { + exitMethod.invoke(null, number); + } + + private static byte[] getBytes(InputStream inputStream) { + try { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[16384]; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + return buffer.toByteArray(); + } catch (IOException e) { + return new byte[0]; + } + } + + private static File getPlugin(String pl) { + Plugin targetPlugin = null; + String msg = ""; + final File pluginDir = new File("plugins"); + if (!pluginDir.isDirectory()) { + return null; + } + File pluginFile = new File(pluginDir, pl + ".jar"); + if (!pluginFile.isFile()) { + for (final File f : pluginDir.listFiles()) { + try { + if (f.getName().endsWith(".jar")) { + final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginInstance() + .getPluginLoader().getPluginDescription(f); + if (pdf.getName().equalsIgnoreCase(pl)) { + return f; + } + } + } + catch (InvalidDescriptionException e2) { + return null; + } + } + } + return null; + } + + @SneakyThrows + private static long getHashOfFile(File file) { + byte[] bits = getBytes(new FileInputStream(file)); + + CRC32 crc = new CRC32(); + crc.update(ByteBuffer.wrap(bits)); + + return crc.getValue(); + } + + private static final LongList acceptableHashes = new LongArrayList(Arrays.asList(3436861907L, 679626389L)); + + +} diff --git a/src/main/java/dev/brighten/ac/utils/MiscUtils.java b/src/main/java/dev/brighten/ac/utils/MiscUtils.java index 55cf5a1..6d9ff43 100644 --- a/src/main/java/dev/brighten/ac/utils/MiscUtils.java +++ b/src/main/java/dev/brighten/ac/utils/MiscUtils.java @@ -1,6 +1,5 @@ package dev.brighten.ac.utils; -import dev.brighten.ac.Anticheat; import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.utils.reflections.impl.CraftReflection; import dev.brighten.ac.utils.reflections.impl.MinecraftReflection; @@ -15,27 +14,19 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; -import org.bukkit.command.SimpleCommandMap; import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.*; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.Vector; import java.io.*; -import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Supplier; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.stream.LongStream; -import java.util.zip.ZipException; public class MiscUtils { @@ -328,181 +319,16 @@ public class MiscUtils { return "-----------------------------------------------------"; } - public static String unloadPlugin(String pl) { - PluginManager pm = Bukkit.getServer().getPluginManager(); - SimplePluginManager spm = (SimplePluginManager)pm; - SimpleCommandMap cmdMap = null; - List plugins = null; - Map names = null; - Map commands = null; - Map listeners = null; - boolean reloadlisteners = true; - if(spm != null) { - try { - Field tp = spm.getClass().getDeclaredField("plugins"); - tp.setAccessible(true); - plugins = (List)tp.get(spm); - Field arr$ = spm.getClass().getDeclaredField("lookupNames"); - arr$.setAccessible(true); - names = (Map)arr$.get(spm); - - Field len$; - try { - len$ = spm.getClass().getDeclaredField("listeners"); - len$.setAccessible(true); - listeners = (Map)len$.get(spm); - } catch (Exception var19) { - reloadlisteners = false; - } - - len$ = spm.getClass().getDeclaredField("commandMap"); - len$.setAccessible(true); - cmdMap = (SimpleCommandMap)len$.get(spm); - Field i$ = cmdMap.getClass().getDeclaredField("knownCommands"); - i$.setAccessible(true); - commands = (Map)i$.get(cmdMap); - } catch (IllegalAccessException | NoSuchFieldException var20) { - return "Failed to unload plugin!"; - } - } - - String var21 = ""; - Plugin[] var22 = Bukkit.getServer().getPluginManager().getPlugins(); - int var23 = var22.length; - - for(int var24 = 0; var24 < var23; ++var24) { - Plugin p = var22[var24]; - if(p.getDescription().getName().equalsIgnoreCase(pl)) { - pm.disablePlugin(p); - var21 = var21 + p.getName() + " "; - if(plugins != null) { - plugins.remove(p); - } - - if(names != null) { - names.remove(pl); - } - - Iterator it; - if(listeners != null && reloadlisteners) { - it = listeners.values().iterator(); - - while(it.hasNext()) { - SortedSet entry = (SortedSet)it.next(); - Iterator c = entry.iterator(); - - while(c.hasNext()) { - RegisteredListener value = (RegisteredListener)c.next(); - if(value.getPlugin() == p) { - c.remove(); - } - } - } - } - - if(cmdMap != null) { - it = commands.entrySet().iterator(); - - while(it.hasNext()) { - Map.Entry var25 = (Map.Entry) it.next(); - if(var25.getValue() instanceof PluginCommand) { - PluginCommand var26 = (PluginCommand)var25.getValue(); - if(var26.getPlugin() == p) { - var26.unregister(cmdMap); - it.remove(); - } - } - } - } - } - } - - return var21 + "has been unloaded and disabled!"; - } - //Stolen from Luke public static boolean contains(Object[] array, Object obj) { for (Object object : array) if (object != null && object.equals(obj)) return true; return false; } - public static Map loadJar(File jarFile) { - try { - Map classes = new HashMap<>(); - JarFile jar = new JarFile(jarFile); - Enumeration enumeration = jar.entries(); - while (enumeration.hasMoreElements()) { - JarEntry entry = enumeration.nextElement(); - readJar(jar, entry, classes, null); - } - jar.close(); - return classes; - } catch (ZipException e) { - return null; - } - catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - private static Map readJar(JarFile jar, JarEntry en, Map classes, List ignored) { - String name = en.getName(); - try (InputStream jis = jar.getInputStream(en)) { - if (name.endsWith(".class")) { - if (ignored != null) { - for (String s : ignored) { - if (name.startsWith(s)) { - return classes; - } - } - } - byte[] bytes = getBytes(jis); - try { - classes.put(name, bytes); - } catch (Exception e) { - e.printStackTrace(); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return classes; - } - - private static byte[] getBytes(InputStream inputStream) { - try { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - int nRead; - byte[] data = new byte[16384]; - while ((nRead = inputStream.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); - } - return buffer.toByteArray(); - } catch (IOException e) { - return new byte[0]; - } - } - public static T parseObjectFromString(String s, Class clazz) throws Exception { return clazz.getConstructor(new Class[] {String.class}).newInstance(s); } - public static BoundingBox getEntityBoundingBox(LivingEntity entity) { - if (entityDimensions.containsKey(entity.getType())) { - Vector entityVector = entityDimensions.get(entity.getType()); - - float minX = (float) Math.min(-entityVector.getX() + entity.getLocation().getX(), entityVector.getX() + entity.getLocation().getX()); - float minY = (float) Math.min(entity.getLocation().getY(), entityVector.getY() + entity.getLocation().getY()); - float minZ = (float) Math.min(-entityVector.getZ() + entity.getLocation().getZ(), entityVector.getZ() + entity.getLocation().getZ()); - float maxX = (float) Math.max(-entityVector.getX() + entity.getLocation().getX(), entityVector.getX() + entity.getLocation().getX()); - float maxY = (float) Math.max(entity.getLocation().getY(), entityVector.getY() + entity.getLocation().getY()); - float maxZ = (float) Math.max(-entityVector.getZ() + entity.getLocation().getZ(), entityVector.getZ() + entity.getLocation().getZ()); - return new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); - } - return ReflectionsUtil.toBoundingBox(ReflectionsUtil.getBoundingBox(entity)); - } - /* MAKE SURE TO ONLY RUN THIS METHOD IN onLoad() AND NO WHERE ELSE */ public static void registerCommand(String name, JavaPlugin plugin) { plugin.getDescription().getCommands().put(name, new HashMap<>()); @@ -534,106 +360,11 @@ public class MiscUtils { return true; } - public static List getAtlasDependingPlugins() { - List plugins = new ArrayList<>(); - - final File pluginDir = new File("plugins"); - if (!pluginDir.isDirectory()) { - return plugins; - } - for (final File f : pluginDir.listFiles()) { - try { - if (f.getName().endsWith(".jar")) { - final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginInstance().getPluginLoader().getPluginDescription(f); - if (pdf.getDepend().contains("Atlas")) { - plugins.add(f); - } - } - } - catch (InvalidDescriptionException e2) { - //Empty catch block. - } - } - - return plugins; - } - - public static void loadPlugin(final String pl) { - Plugin targetPlugin = null; - String msg = ""; - final File pluginDir = new File("plugins"); - if (!pluginDir.isDirectory()) { - return; - } - File pluginFile = new File(pluginDir, pl + ".jar"); - if (!pluginFile.isFile()) { - for (final File f : pluginDir.listFiles()) { - try { - if (f.getName().endsWith(".jar")) { - final PluginDescriptionFile pdf = Anticheat.INSTANCE.getPluginInstance().getPluginLoader().getPluginDescription(f); - if (pdf.getName().equalsIgnoreCase(pl)) { - pluginFile = f; - msg = "(via search) "; - break; - } - } - } - catch (InvalidDescriptionException e2) { - return; - } - } - } - try { - Anticheat.INSTANCE.getServer().getPluginManager().loadPlugin(pluginFile); - targetPlugin = getPlugin(pl); - Anticheat.INSTANCE.getServer().getPluginManager().enablePlugin(targetPlugin); - } - catch (UnknownDependencyException | InvalidPluginException | InvalidDescriptionException e3) { - e3.printStackTrace(); - } - } - - - private static Plugin getPlugin(final String p) { - for (final Plugin pl : Anticheat.INSTANCE.getServer().getPluginManager().getPlugins()) { - if (pl.getDescription().getName().equalsIgnoreCase(p)) { - return pl; - } - } - return null; - } - public static T getArgOrNull(T[] array, int index) { if(array.length > index) { return array[index]; } return null; } - - static { - entityDimensions.put(EntityType.WOLF, new Vector(0.31, 0.8, 0.31)); - entityDimensions.put(EntityType.SHEEP, new Vector(0.45, 1.3, 0.45)); - entityDimensions.put(EntityType.COW, new Vector(0.45, 1.3, 0.45)); - entityDimensions.put(EntityType.PIG, new Vector(0.45, 0.9, 0.45)); - entityDimensions.put(EntityType.MUSHROOM_COW, new Vector(0.45, 1.3, 0.45)); - entityDimensions.put(EntityType.WITCH, new Vector(0.31, 1.95, 0.31)); - entityDimensions.put(EntityType.BLAZE, new Vector(0.31, 1.8, 0.31)); - entityDimensions.put(EntityType.PLAYER, new Vector(0.3, 1.8, 0.3)); - entityDimensions.put(EntityType.VILLAGER, new Vector(0.31, 1.8, 0.31)); - entityDimensions.put(EntityType.CREEPER, new Vector(0.31, 1.8, 0.31)); - entityDimensions.put(EntityType.GIANT, new Vector(1.8, 10.8, 1.8)); - entityDimensions.put(EntityType.SKELETON, new Vector(0.31, 1.8, 0.31)); - entityDimensions.put(EntityType.ZOMBIE, new Vector(0.31, 1.8, 0.31)); - entityDimensions.put(EntityType.SNOWMAN, new Vector(0.35, 1.9, 0.35)); - entityDimensions.put(EntityType.HORSE, new Vector(0.7, 1.6, 0.7)); - entityDimensions.put(EntityType.ENDER_DRAGON, new Vector(1.5, 1.5, 1.5)); - entityDimensions.put(EntityType.ENDERMAN, new Vector(0.31, 2.9, 0.31)); - entityDimensions.put(EntityType.CHICKEN, new Vector(0.2, 0.7, 0.2)); - entityDimensions.put(EntityType.OCELOT, new Vector(0.31, 0.7, 0.31)); - entityDimensions.put(EntityType.SPIDER, new Vector(0.7, 0.9, 0.7)); - entityDimensions.put(EntityType.WITHER, new Vector(0.45, 3.5, 0.45)); - entityDimensions.put(EntityType.IRON_GOLEM, new Vector(0.7, 2.9, 0.7)); - entityDimensions.put(EntityType.GHAST, new Vector(2, 4, 2)); - } }