package com.dre.brewery; import com.dre.brewery.filedata.BConfig; import com.dre.brewery.filedata.BData; import com.dre.brewery.filedata.DataSave; import com.dre.brewery.filedata.LanguageReader; import com.dre.brewery.filedata.UpdateChecker; import com.dre.brewery.integration.IntegrationListener; import com.dre.brewery.integration.barrel.LogBlockBarrel; import com.dre.brewery.listeners.*; import com.dre.brewery.recipe.BCauldronRecipe; import com.dre.brewery.recipe.BRecipe; import com.dre.brewery.utility.BUtil; import com.dre.brewery.utility.LegacyUtil; import org.apache.commons.lang.math.NumberUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.util.HashMap; import java.util.Map; public class P extends JavaPlugin { public static P p; public static boolean debug; public static boolean useUUID; public static boolean useNBT; public static boolean use1_9; public static boolean use1_11; public static boolean use1_13; public static boolean use1_14; // Listeners public BlockListener blockListener; public PlayerListener playerListener; public EntityListener entityListener; public InventoryListener inventoryListener; public WorldListener worldListener; public IntegrationListener integrationListener; // Language public String language; public LanguageReader languageReader; // Metrics public int brewsCreated; public int brewsCreatedCmd; // Created by command public int exc, good, norm, bad, terr; // Brews drunken with quality @Override public void onEnable() { p = this; // Version check String v = Bukkit.getBukkitVersion(); useUUID = !v.matches("(^|.*[^.\\d])1\\.[0-6]([^\\d].*|$)") && !v.matches("(^|.*[^.\\d])1\\.7\\.[0-5]([^\\d].*|$)"); use1_9 = !v.matches("(^|.*[^.\\d])1\\.[0-8]([^\\d].*|$)"); use1_11 = !v.matches("(^|.*[^.\\d])1\\.10([^\\d].*|$)") && !v.matches("(^|.*[^.\\d])1\\.[0-9]([^\\d].*|$)"); use1_13 = !v.matches("(^|.*[^.\\d])1\\.1[0-2]([^\\d].*|$)") && !v.matches("(^|.*[^.\\d])1\\.[0-9]([^\\d].*|$)"); use1_14 = !v.matches("(^|.*[^.\\d])1\\.1[0-3]([^\\d].*|$)") && !v.matches("(^|.*[^.\\d])1\\.[0-9]([^\\d].*|$)"); //MC 1.13 uses a different NBT API than the newer versions.. // We decide here which to use, the new or the old or none at all P.debug = true; if (LegacyUtil.initNbt()) { useNBT = true; } if (use1_14) { // Campfires are weird // Initialize once now so it doesn't lag later when we check for campfires under Cauldrons getServer().createBlockData(Material.CAMPFIRE); } // load the Config try { FileConfiguration cfg = BConfig.loadConfigFile(); if (cfg == null || !BConfig.readConfig(cfg)) { p = null; getServer().getPluginManager().disablePlugin(this); return; } } catch (Exception e) { e.printStackTrace(); p = null; getServer().getPluginManager().disablePlugin(this); return; } BData.readData(); // Setup Metrics setupMetrics(); // Listeners blockListener = new BlockListener(); playerListener = new PlayerListener(); entityListener = new EntityListener(); inventoryListener = new InventoryListener(); worldListener = new WorldListener(); integrationListener = new IntegrationListener(); getCommand("Brewery").setExecutor(new CommandListener()); getCommand("Brewery").setTabCompleter(new TabListener()); p.getServer().getPluginManager().registerEvents(blockListener, p); p.getServer().getPluginManager().registerEvents(playerListener, p); p.getServer().getPluginManager().registerEvents(entityListener, p); p.getServer().getPluginManager().registerEvents(inventoryListener, p); p.getServer().getPluginManager().registerEvents(worldListener, p); p.getServer().getPluginManager().registerEvents(integrationListener, p); if (use1_9) { p.getServer().getPluginManager().registerEvents(new CauldronListener(), p); } // Heartbeat p.getServer().getScheduler().runTaskTimer(p, new BreweryRunnable(), 650, 1200); p.getServer().getScheduler().runTaskTimer(p, new DrunkRunnable(), 120, 120); if (BConfig.updateCheck) { try { p.getServer().getScheduler().runTaskLaterAsynchronously(p, new UpdateChecker(), 135); } catch (Exception e) { e.printStackTrace(); } } this.log(this.getDescription().getName() + " enabled!"); } @Override public void onDisable() { // Disable listeners HandlerList.unregisterAll(this); // Stop shedulers getServer().getScheduler().cancelTasks(this); if (p == null) { return; } // save Data to Disk DataSave.save(true); // delete Data from Ram Barrel.barrels.clear(); BCauldron.bcauldrons.clear(); BRecipe.getConfigRecipes().clear(); BRecipe.numConfigRecipes = 0; BCauldronRecipe.acceptedMaterials.clear(); BCauldronRecipe.acceptedCustom.clear(); BCauldronRecipe.acceptedSimple.clear(); BCauldronRecipe.getConfigRecipes().clear(); BCauldronRecipe.numConfigRecipes = 0; BConfig.customItems.clear(); BConfig.hasSlimefun = null; BConfig.hasMMOItems = null; BPlayer.clear(); Brew.legacyPotions.clear(); Wakeup.wakeups.clear(); DistortChat.words.clear(); DistortChat.ignoreText.clear(); DistortChat.commands = null; this.log(this.getDescription().getName() + " disabled!"); } public void reload(CommandSender sender) { if (sender != null && !sender.equals(getServer().getConsoleSender())) { BConfig.reloader = sender; } FileConfiguration cfg = BConfig.loadConfigFile(); if (cfg == null) { // Could not read yml file, do not proceed return; } // clear all existent config Data BRecipe.getConfigRecipes().clear(); BRecipe.numConfigRecipes = 0; BCauldronRecipe.acceptedMaterials.clear(); BCauldronRecipe.acceptedCustom.clear(); BCauldronRecipe.acceptedSimple.clear(); BCauldronRecipe.getConfigRecipes().clear(); BCauldronRecipe.numConfigRecipes = 0; BConfig.customItems.clear(); BConfig.hasSlimefun = null; BConfig.hasMMOItems = null; DistortChat.commands = null; BConfig.drainItems.clear(); if (BConfig.useLB) { try { LogBlockBarrel.clear(); } catch (Exception e) { e.printStackTrace(); } } // load the Config try { if (!BConfig.readConfig(cfg)) { p = null; getServer().getPluginManager().disablePlugin(this); return; } } catch (Exception e) { e.printStackTrace(); p = null; getServer().getPluginManager().disablePlugin(this); return; } // Reload Recipes boolean successful = true; for (Brew brew : Brew.legacyPotions.values()) { if (!brew.reloadRecipe()) { successful = false; } } if (!successful && sender != null) { msg(sender, p.languageReader.get("Error_Recipeload")); } else { p.msg(sender, p.languageReader.get("CMD_Reload")); } BConfig.reloader = null; } public static P getInstance() { return p; } private void setupMetrics() { /*try { Metrics metrics = new Metrics(this); metrics.addCustomChart(new Metrics.SingleLineChart("drunk_players", BPlayer::numDrunkPlayers)); metrics.addCustomChart(new Metrics.SingleLineChart("brews_in_existence", () -> brewsCreated)); metrics.addCustomChart(new Metrics.SingleLineChart("barrels_built", () -> Barrel.barrels.size())); metrics.addCustomChart(new Metrics.SingleLineChart("cauldrons_boiling", () -> BCauldron.bcauldrons.size())); metrics.addCustomChart(new Metrics.AdvancedPie("brew_quality", () -> { Map map = new HashMap<>(8); map.put("excellent", exc); map.put("good", good); map.put("normal", norm); map.put("bad", bad); map.put("terrible", terr); return map; })); metrics.addCustomChart(new Metrics.AdvancedPie("brews_created", () -> { Map map = new HashMap<>(4); map.put("by command", brewsCreatedCmd); map.put("brewing", brewsCreated - brewsCreatedCmd); return map; })); metrics.addCustomChart(new Metrics.SimplePie("number_of_recipes", () -> { int recipes = BRecipe.getAllRecipes().size(); if (recipes < 7) { return "Less than 7"; } else if (recipes < 11) { return "7-10"; } else if (recipes == 11) { // There are 11 default recipes, so show this as its own slice return "11"; } else if (recipes <= 31) { if (recipes % 2 == 0) { return recipes + "-" + (recipes + 1); } else { return (recipes - 1) + "-" + recipes; } } else { return "More than 31"; } })); metrics.addCustomChart(new Metrics.SimplePie("v2_mc_version", () -> { String mcv = Bukkit.getBukkitVersion(); mcv = mcv.substring(0, mcv.indexOf('.', 2)); if (mcv.matches("^\\d\\.\\d{1,2}$")) { // Start, digit, dot, 1-2 digits, end return mcv; } else { return "undef"; } })); metrics.addCustomChart(new Metrics.DrilldownPie("plugin_mc_version", () -> { Map> map = new HashMap<>(3); String mcv = Bukkit.getBukkitVersion(); mcv = mcv.substring(0, mcv.indexOf('.', 2)); if (mcv.matches("^\\d\\.\\d{1,2}$")) { // Start, digit, dot, 1-2 digits, end mcv = "MC " + mcv; } else { mcv = "undef"; } Map innerMap = new HashMap<>(3); innerMap.put(mcv, 1); map.put(getDescription().getVersion(), innerMap); return map; })); metrics.addCustomChart(new Metrics.SimplePie("language", () -> language)); metrics.addCustomChart(new Metrics.SimplePie("config_scramble", () -> BConfig.enableEncode ? "enabled" : "disabled")); metrics.addCustomChart(new Metrics.SimplePie("config_lore_color", () -> { if (BConfig.colorInBarrels) { if (BConfig.colorInBrewer) { return "both"; } else { return "in barrels"; } } else { if (BConfig.colorInBrewer) { return "in distiller"; } else { return "none"; } } })); metrics.addCustomChart(new Metrics.SimplePie("config_always_show", () -> { if (BConfig.alwaysShowQuality) { if (BConfig.alwaysShowAlc) { return "both"; } else { return "quality stars"; } } else { if (BConfig.alwaysShowAlc) { return "alc content"; } else { return "none"; } } })); } catch (Throwable e) { e.printStackTrace(); }*/ } public void metricsForCreate(boolean byCmd) { if (brewsCreated == Integer.MAX_VALUE) return; brewsCreated++; if (byCmd) { if (brewsCreatedCmd == Integer.MAX_VALUE) return; brewsCreatedCmd++; } } public void metricsForDrink(Brew brew) { if (brew.getQuality() >= 9) { exc++; } else if (brew.getQuality() >= 7) { good++; } else if (brew.getQuality() >= 5) { norm++; } else if (brew.getQuality() >= 3) { bad++; } else { terr++; } } // Utility public void msg(CommandSender sender, String msg) { sender.sendMessage(color("&2[Brewery] &f" + msg)); } public void log(String msg) { this.msg(Bukkit.getConsoleSender(), msg); } public void debugLog(String msg) { if (debug) { this.msg(Bukkit.getConsoleSender(), "&2[Debug] &f" + msg); } } public void errorLog(String msg) { Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_GREEN + "[Brewery] " + ChatColor.DARK_RED + "ERROR: " + ChatColor.RED + msg); if (BConfig.reloader != null) { BConfig.reloader.sendMessage(ChatColor.DARK_GREEN + "[Brewery] " + ChatColor.DARK_RED + "ERROR: " + ChatColor.RED + msg); } } public int parseInt(String string) { return NumberUtils.toInt(string, 0); } public String color(String msg) { return BUtil.color(msg); } // Runnables public static class DrunkRunnable implements Runnable { @Override public void run() { if (!BPlayer.isEmpty()) { BPlayer.drunkeness(); } } } public class BreweryRunnable implements Runnable { @Override public void run() { long t1 = System.nanoTime(); BConfig.reloader = null; for (BCauldron cauldron : BCauldron.bcauldrons.values()) { cauldron.onUpdate();// runs every min to update cooking time } long t2 = System.nanoTime(); Barrel.onUpdate();// runs every min to check and update ageing time long t3 = System.nanoTime(); if (use1_14) MCBarrel.onUpdate(); long t4 = System.nanoTime(); BPlayer.onUpdate();// updates players drunkeness long t5 = System.nanoTime(); DataSave.autoSave(); long t6 = System.nanoTime(); debugLog("BreweryRunnable: " + "t1: " + (t2 - t1) / 1000000.0 + "ms" + " | t2: " + (t3 - t2) / 1000000.0 + "ms" + " | t3: " + (t4 - t3) / 1000000.0 + "ms" + " | t4: " + (t5 - t4) / 1000000.0 + "ms" + " | t5: " + (t6 - t5) / 1000000.0 + "ms" ); } } }