package us.tss3.blockparty; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldUnloadEvent; import org.bukkit.plugin.java.JavaPlugin; import us.tss3.blockparty.arena.Arena; import us.tss3.blockparty.arena.ArenaManager; import us.tss3.blockparty.command.BlockPartyCommand; import us.tss3.blockparty.config.ConfigManager; import us.tss3.blockparty.config.MessagesManager; import us.tss3.blockparty.listener.GameplayRestrictionListener; import us.tss3.blockparty.listener.PlayerConnectionListener; import us.tss3.blockparty.persistence.StatsManager; import us.tss3.blockparty.placeholder.BlockPartyExpansion; import us.tss3.blockparty.reward.RewardManager; import us.tss3.blockparty.scoreboard.ScoreboardManager; import us.tss3.blockparty.session.SessionManager; import us.tss3.blockparty.util.SoundUtil; public class BlockPartyPlugin extends JavaPlugin implements Listener { private ConfigManager configManager; private MessagesManager messagesManager; private ArenaManager arenaManager; private SessionManager sessionManager; private ScoreboardManager scoreboardManager; private RewardManager rewardManager; private StatsManager statsManager; private SoundUtil soundUtil; @Override public void onEnable() { saveDefaultConfig(); this.configManager = new ConfigManager(this); configManager.load(); this.messagesManager = new MessagesManager(this); messagesManager.load(); this.sessionManager = new SessionManager(); this.soundUtil = new SoundUtil(this); this.rewardManager = new RewardManager(this); this.statsManager = new StatsManager(this, configManager.getStorageSettings()); statsManager.init(); this.arenaManager = new ArenaManager(this); arenaManager.loadAll(); this.scoreboardManager = new ScoreboardManager(this); scoreboardManager.start(); getServer().getPluginManager().registerEvents(new PlayerConnectionListener(this), this); getServer().getPluginManager().registerEvents(new GameplayRestrictionListener(this), this); getServer().getPluginManager().registerEvents(this, this); BlockPartyCommand commandHandler = new BlockPartyCommand(this); var command = getCommand("blockparty"); if (command != null) { command.setExecutor(commandHandler); command.setTabCompleter(commandHandler); } registerPlaceholderApi(); getLogger().info("BlockParty enabled."); } @Override public void onDisable() { if (arenaManager != null) { arenaManager.shutdownAll(); } if (scoreboardManager != null) { scoreboardManager.stop(); } if (statsManager != null) { statsManager.shutdown(); } getLogger().info("BlockParty disabled."); } /** Reloads config.yml, messages.yml and arena definitions. Arenas mid-match are skipped (see ArenaManager#reloadSafely). */ public void reloadEverything() { configManager.load(); messagesManager.load(); arenaManager.reloadSafely(); } private void registerPlaceholderApi() { if (!configManager.isPlaceholderApiEnabled()) { return; } if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") == null) { return; } try { new BlockPartyExpansion(this).register(); getLogger().info("Hooked into PlaceholderAPI."); } catch (Throwable t) { getLogger().warning("Failed to register PlaceholderAPI expansion: " + t.getMessage()); } } @EventHandler public void onWorldUnload(WorldUnloadEvent event) { for (Arena arena : arenaManager.all()) { if (arena.getConfig().getWorldName() != null && arena.getConfig().getWorldName().equals(event.getWorld().getName())) { getLogger().warning("World '" + event.getWorld().getName() + "' unloaded - disabling arena '" + arena.getConfig().getName() + "'."); arena.disable(); } } } public ConfigManager getConfigManager() { return configManager; } public MessagesManager getMessages() { return messagesManager; } public ArenaManager getArenaManager() { return arenaManager; } public SessionManager getSessionManager() { return sessionManager; } public ScoreboardManager getScoreboardManager() { return scoreboardManager; } public RewardManager getRewardManager() { return rewardManager; } public StatsManager getStatsManager() { return statsManager; } public SoundUtil getSoundUtil() { return soundUtil; } }