package net.t7seven7t.craftfx; import net.t7seven7t.craftfx.effect.EffectRegistry; import net.t7seven7t.craftfx.effect.EffectSpec; import net.t7seven7t.craftfx.event.ItemsLoadedEvent; import net.t7seven7t.craftfx.event.RegistriesLoadedEvent; import net.t7seven7t.craftfx.item.ItemLoader; import net.t7seven7t.craftfx.item.ItemRegistry; import net.t7seven7t.craftfx.listener.PlayerListener; import net.t7seven7t.craftfx.listener.RecipeListener; import net.t7seven7t.craftfx.nms.FallbackNMSAdapter; import net.t7seven7t.craftfx.nms.NMSInterface; import net.t7seven7t.craftfx.target.TargetSelectorRegistry; import net.t7seven7t.craftfx.target.TargetSelectorSpec; import net.t7seven7t.craftfx.trigger.TriggerRegistry; import net.t7seven7t.craftfx.trigger.TriggerSpec; import net.t7seven7t.craftfx.util.LogHelper; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.Event; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; import java.util.Locale; /** * */ public class CraftFX { private static CraftFX instance; private final LogHelper logHelper = new LogHelper(); private final CraftFXPlugin plugin; private final NMSInterface nmsInterface; private ItemRegistry itemRegistry; private Registry<TriggerSpec> triggerRegistry; private Registry<EffectSpec> effectRegistry; private Registry<TargetSelectorSpec> targetSelectorRegistry; CraftFX(CraftFXPlugin plugin) { CraftFX.instance = this; this.plugin = plugin; this.nmsInterface = selectNMSVersion(); startMetrics(); updateConfig(); ConfigType.values().forEach(desc -> { try { if (!desc.equals(ConfigType.DEFAULT)) desc.load(); } catch (IOException e) { logHelper.severe(e.getMessage(), e); } }); registerListener(new RecipeListener()); registerListener(new PlayerListener()); setupRegistries(); // run after all plugins have loaded Bukkit.getScheduler().runTask(plugin, () -> { Event event = new RegistriesLoadedEvent(); Bukkit.getPluginManager().callEvent(event); loadItems(); }); } public static CraftFX instance() { return instance; } public static boolean debug() { return instance().getConfig().getBoolean("debug", false); } public static LogHelper log() { return instance().logHelper; } public static JavaPlugin plugin() { return instance().plugin; } private void setupRegistries() { itemRegistry = new ItemRegistry(); triggerRegistry = new TriggerRegistry(); effectRegistry = new EffectRegistry(); targetSelectorRegistry = new TargetSelectorRegistry(); } private void loadItems() { ItemLoader itemLoader = new ItemLoader(); itemLoader.loadItems(); Bukkit.getPluginManager().callEvent(new ItemsLoadedEvent(itemRegistry)); } public void reload() { updateConfig(); ConfigType.values().forEach(desc -> { try { if (!desc.equals(ConfigType.DEFAULT)) desc.load(); } catch (IOException e) { logHelper.severe(e.getMessage(), e); } }); setupRegistries(); Event event = new RegistriesLoadedEvent(); Bukkit.getPluginManager().callEvent(event); loadItems(); } public NMSInterface getNmsInterface() { return nmsInterface; } private NMSInterface selectNMSVersion() { String version; try { version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",") .split(",")[3]; log().info("Attempting to select NMSAdapter for version %s", version); Class<?> clazz = getClass().getClassLoader() .loadClass("net.t7seven7t.craftfx.nms." + version + ".NMSAdapter"); return (NMSInterface) clazz.getConstructor().newInstance(); } catch (Exception e) { log().warning("NMSAdapter wasn't properly selected. " + "Some things may not work right.", e); return new FallbackNMSAdapter(); } } public FileConfiguration getMessages(Locale locale) { // todo: add locale support? return ConfigType.MESSAGES.get(); } public Registry<TargetSelectorSpec> getTargetSelectorRegistry() { return targetSelectorRegistry; } public Registry<EffectSpec> getEffectRegistry() { return effectRegistry; } public Registry<TriggerSpec> getTriggerRegistry() { return triggerRegistry; } public ItemRegistry getItemRegistry() { return itemRegistry; } public FileConfiguration getConfig() { return ConfigType.DEFAULT.get(); } private void startMetrics() { try { Metrics metrics = new Metrics(plugin()); metrics.start(); } catch (IOException e) { // ignore } } private void updateConfig() { if (!plugin.getDataFolder().exists()) { plugin.getDataFolder().mkdir(); } plugin.saveResource("config.yml", false); plugin.reloadConfig(); } private void registerListener(Listener l) { Bukkit.getPluginManager().registerEvents(l, plugin); } }