/* * This file is part of HoloAPI. * * HoloAPI is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HoloAPI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HoloAPI. If not, see <http://www.gnu.org/licenses/>. */ package com.dsh105.holoapi; import com.dsh105.command.CommandListener; import com.dsh105.command.CommandManager; import com.dsh105.commodus.config.Options; import com.dsh105.commodus.config.YAMLConfig; import com.dsh105.commodus.config.YAMLConfigManager; import com.dsh105.commodus.data.Metrics; import com.dsh105.commodus.data.Updater; import com.dsh105.holoapi.api.HoloUpdater; import com.dsh105.holoapi.api.SimpleHoloManager; import com.dsh105.holoapi.api.TagFormatter; import com.dsh105.holoapi.api.visibility.VisibilityMatcher; import com.dsh105.holoapi.command.HoloCommand; import com.dsh105.holoapi.command.sub.*; import com.dsh105.holoapi.config.ConfigType; import com.dsh105.holoapi.config.Lang; import com.dsh105.holoapi.config.Settings; import com.dsh105.holoapi.data.DependencyGraphUtil; import com.dsh105.holoapi.hook.BungeeProvider; import com.dsh105.holoapi.hook.VanishProvider; import com.dsh105.holoapi.hook.VaultProvider; import com.dsh105.holoapi.image.SimpleAnimationLoader; import com.dsh105.holoapi.image.SimpleImageLoader; import com.dsh105.holoapi.listeners.HoloDataLoadListener; import com.dsh105.holoapi.listeners.HoloListener; import com.dsh105.holoapi.listeners.IndicatorListener; import com.dsh105.holoapi.listeners.WorldListener; import com.dsh105.holoapi.protocol.InjectionManager; import com.dsh105.holoapi.script.ScriptLoader; import com.dsh105.holoapi.script.ScriptManager; import com.dsh105.holoapi.util.Debugger; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class HoloAPICore extends JavaPlugin { protected static CommandManager COMMAND_MANAGER; protected static SimpleHoloManager HOLO_MANAGER; protected static SimpleImageLoader IMAGE_LOADER; protected static SimpleAnimationLoader ANIMATION_LOADER; protected static TagFormatter TAG_FORMATTER; protected static VisibilityMatcher VISIBILITY_MATCHER; protected static HoloUpdater HOLO_UPDATER; protected static InjectionManager INJECTION_MANAGER; protected static ScriptManager SCRIPT_MANAGER; protected YAMLConfigManager configManager; private HashMap<ConfigType, YAMLConfig> CONFIG_FILES = new HashMap<>(); private HashMap<ConfigType, Options> SETTINGS = new HashMap<>(); protected VaultProvider vaultProvider; protected VanishProvider vanishProvider; protected BungeeProvider bungeeProvider; // Update Checker stuff public boolean updateAvailable = false; public String updateName = ""; public boolean updateChecked = false; public File file; protected String prefix = ChatColor.WHITE + "[" + ChatColor.BLUE + "%text%" + ChatColor.WHITE + "]" + ChatColor.RESET + " "; @Override public void onDisable() { if (HOLO_MANAGER != null) { HOLO_MANAGER.clearAll(); } if (INJECTION_MANAGER != null) { INJECTION_MANAGER.close(); INJECTION_MANAGER = null; } this.getServer().getScheduler().cancelTasks(this); } @Override public void onEnable() { HoloAPI.setCore(this); PluginManager manager = getServer().getPluginManager(); this.loadConfiguration(); Debugger.getInstance().setOutput(getServer().getConsoleSender()); Debugger.getInstance().setEnabled(Settings.DEBUGGING_ENABLED.getValue()); Debugger.getInstance().setLevel(Settings.DEBUGGING_LEVEL.getValue(10)); INJECTION_MANAGER = new InjectionManager(this); Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); /* try { SCRIPT_MANAGER = new ScriptManager(this); } catch (IOException e) { HoloAPI.LOG.warning("Failed to create the ScriptManager!"); ScriptLoader.SCRIPTING_ENABLED = false; } */ HOLO_UPDATER = new HoloUpdater(); TAG_FORMATTER = new TagFormatter(); VISIBILITY_MATCHER = new VisibilityMatcher(); HOLO_MANAGER = new SimpleHoloManager(); IMAGE_LOADER = new SimpleImageLoader(); ANIMATION_LOADER = new SimpleAnimationLoader(); this.loadCommands(); manager.registerEvents(new HoloListener(), this); manager.registerEvents(new WorldListener(), this); manager.registerEvents(new IndicatorListener(), this); manager.registerEvents(new HoloDataLoadListener(), this); // Vault Hook this.vaultProvider = new VaultProvider(this); // VanishNoPacket Hook this.vanishProvider = new VanishProvider(this); // BungeeCord Hook this.bungeeProvider = new BungeeProvider(this); this.loadHolograms(); /** * All metrics */ try { Metrics metrics = new Metrics(this); metrics.start(); /** * Dependencies */ Metrics.Graph dependingPlugins = metrics.createGraph("Depending Plugins"); synchronized (Bukkit.getPluginManager()) { for (final Plugin otherPlugin : DependencyGraphUtil.getPluginsUnsafe()) { if (!otherPlugin.isEnabled()) { continue; } if (!DependencyGraphUtil.isDepending(otherPlugin, this) && !DependencyGraphUtil.isSoftDepending(otherPlugin, this)) { continue; } dependingPlugins.addPlotter(new Metrics.Plotter(otherPlugin.getName()) { @Override public int getValue() { return 1; } }); } } metrics.addGraph(dependingPlugins); } catch (IOException e) { HoloAPI.LOG.warning("Plugin Metrics (MCStats) has failed to start."); e.printStackTrace(); } this.checkUpdates(); } private void loadCommands() { COMMAND_MANAGER = new CommandManager(this, HoloAPI.getPrefix()); COMMAND_MANAGER.getMessenger().setFormatColour(ChatColor.getByChar(Settings.BASE_CHAT_COLOUR.getValue())); COMMAND_MANAGER.getMessenger().setHighlightColour(ChatColor.getByChar(Settings.HIGHLIGHT_CHAT_COLOUR.getValue())); COMMAND_MANAGER.getHelpService().setIgnoreCommandAccess(false); COMMAND_MANAGER.getHelpService().setIncludePermissionListing(false); CommandListener parent = new HoloCommand(); COMMAND_MANAGER.register(parent); // TODO: A way to do this dynamically COMMAND_MANAGER.nestCommandsIn(parent, new AddLineCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new BuildCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new CopyCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new ClearCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new CreateCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new EditCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new HelpCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new HideCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new IdCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new InfoCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new MoveCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new NearbyCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new ReadTxtCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new RefreshCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new ReloadCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new RemoveCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new ShowCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new TeleportCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new TouchCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new UpdateCommand()); COMMAND_MANAGER.nestCommandsIn(parent, new VisibilityCommand()); } protected void checkUpdates() { if (Settings.CHECK_FOR_UPDATES.getValue()) { file = this.getFile(); final Updater.UpdateType updateType = Settings.CHECK_FOR_UPDATES.getValue() ? Updater.UpdateType.DEFAULT : Updater.UpdateType.NO_DOWNLOAD; getServer().getScheduler().runTaskAsynchronously(this, new Runnable() { @Override public void run() { Updater updater = new Updater(HoloAPI.getCore(), 74914, file, updateType, false); updateAvailable = updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE; if (updateAvailable) { updateName = updater.getLatestName(); HoloAPI.LOG.console(ChatColor.DARK_AQUA + "An update is available: " + updateName); HoloAPI.LOG.console(ChatColor.DARK_AQUA + "Type /holo update to update."); if (!updateChecked) { updateChecked = true; } } } }); } } public void loadHolograms() { HOLO_MANAGER.clearAll(); new BukkitRunnable() { @Override public void run() { IMAGE_LOADER.loadImageConfiguration(getConfig(ConfigType.MAIN)); ANIMATION_LOADER.loadAnimationConfiguration(getConfig(ConfigType.MAIN)); } }.runTaskAsynchronously(this); final ArrayList<String> unprepared = HOLO_MANAGER.loadFileData(); new BukkitRunnable() { @Override public void run() { if (HoloAPI.getImageLoader().isLoaded()) { for (String s : unprepared) { HOLO_MANAGER.loadFromFile(s); } HoloAPI.LOG.info("Holograms loaded"); this.cancel(); } } }.runTaskTimer(this, 20 * 5, 20 * 10); } public void loadConfiguration() { configManager = new YAMLConfigManager(this); YAMLConfig config, dataConfig, langConfig; config = configManager.getNewConfig("config.yml", new String[]{ "HoloAPI", "---------------------", "Configuration File", "", "See the HoloAPI Wiki before editing this file", "(https://github.com/DSH105/HoloAPI/wiki)" }); langConfig = configManager.getNewConfig("messages.yml", new String[]{"HoloAPI", "---------------------", "Language Configuration File"}); dataConfig = configManager.getNewConfig("data.yml"); CONFIG_FILES.put(ConfigType.MAIN, config); CONFIG_FILES.put(ConfigType.LANG, langConfig); CONFIG_FILES.put(ConfigType.DATA, dataConfig); for (YAMLConfig yamlConfig : CONFIG_FILES.values()) { yamlConfig.reloadConfig(); } SETTINGS.put(ConfigType.MAIN, new Settings(config)); SETTINGS.put(ConfigType.LANG, new Lang(langConfig)); } public static InjectionManager getInjectionManager() { if (INJECTION_MANAGER == null) throw new RuntimeException("InjectionManager is NULL!"); return INJECTION_MANAGER; } public static ScriptManager getScriptManager() { if (SCRIPT_MANAGER == null || !ScriptLoader.SCRIPTING_ENABLED) throw new RuntimeException("ScriptManager is NULL or scripting is disabled due to an error!"); return SCRIPT_MANAGER; } public <T extends Options> T getSettings(Class<T> settingsClass) { for (Options options : SETTINGS.values()) { if (options.getClass().equals(settingsClass)) { return (T) options; } } return null; } public Options getSettings(ConfigType configType) { for (Map.Entry<ConfigType, Options> entry : SETTINGS.entrySet()) { if (entry.getKey() == configType) { return entry.getValue(); } } return null; } public YAMLConfig getConfig(ConfigType configType) { return CONFIG_FILES.get(configType); } }