package net.knarcraft.minigames; import net.knarcraft.knargui.GUIListener; import net.knarcraft.knarlib.formatting.StringFormatter; import net.knarcraft.knarlib.formatting.Translator; import net.knarcraft.knarlib.property.ColorConversion; import net.knarcraft.minigames.arena.ArenaPlayerRegistry; import net.knarcraft.minigames.arena.ArenaSession; import net.knarcraft.minigames.arena.PlayerVisibilityManager; import net.knarcraft.minigames.arena.dropper.DropperArena; import net.knarcraft.minigames.arena.dropper.DropperArenaData; import net.knarcraft.minigames.arena.dropper.DropperArenaGameMode; import net.knarcraft.minigames.arena.dropper.DropperArenaGroup; import net.knarcraft.minigames.arena.dropper.DropperArenaHandler; import net.knarcraft.minigames.arena.dropper.DropperArenaPlayerRegistry; import net.knarcraft.minigames.arena.dropper.DropperArenaRecordsRegistry; import net.knarcraft.minigames.arena.dropper.DropperPlayerEntryState; import net.knarcraft.minigames.arena.parkour.ParkourArena; import net.knarcraft.minigames.arena.parkour.ParkourArenaData; import net.knarcraft.minigames.arena.parkour.ParkourArenaGameMode; import net.knarcraft.minigames.arena.parkour.ParkourArenaGroup; import net.knarcraft.minigames.arena.parkour.ParkourArenaHandler; import net.knarcraft.minigames.arena.parkour.ParkourArenaPlayerRegistry; import net.knarcraft.minigames.arena.parkour.ParkourArenaRecordsRegistry; import net.knarcraft.minigames.arena.parkour.ParkourPlayerEntryState; import net.knarcraft.minigames.arena.record.IntegerRecord; import net.knarcraft.minigames.arena.record.LongRecord; import net.knarcraft.minigames.arena.reward.CommandReward; import net.knarcraft.minigames.arena.reward.EconomyReward; import net.knarcraft.minigames.arena.reward.ItemReward; import net.knarcraft.minigames.arena.reward.PermissionReward; import net.knarcraft.minigames.arena.reward.RewardCondition; import net.knarcraft.minigames.command.LeaveArenaCommand; import net.knarcraft.minigames.command.MenuCommand; import net.knarcraft.minigames.command.ReloadCommand; import net.knarcraft.minigames.command.SetArenaRewardCommand; import net.knarcraft.minigames.command.SetArenaRewardTabCompleter; import net.knarcraft.minigames.command.dropper.CreateDropperArenaCommand; import net.knarcraft.minigames.command.dropper.DropperGroupListCommand; import net.knarcraft.minigames.command.dropper.DropperGroupSetCommand; import net.knarcraft.minigames.command.dropper.DropperGroupSwapCommand; import net.knarcraft.minigames.command.dropper.EditDropperArenaCommand; import net.knarcraft.minigames.command.dropper.EditDropperArenaTabCompleter; import net.knarcraft.minigames.command.dropper.JoinDropperArenaCommand; import net.knarcraft.minigames.command.dropper.JoinDropperArenaTabCompleter; import net.knarcraft.minigames.command.dropper.ListDropperArenaCommand; import net.knarcraft.minigames.command.dropper.RemoveDropperArenaCommand; import net.knarcraft.minigames.command.dropper.RemoveDropperArenaTabCompleter; import net.knarcraft.minigames.command.parkour.CreateParkourArenaCommand; import net.knarcraft.minigames.command.parkour.EditParkourArenaCommand; import net.knarcraft.minigames.command.parkour.EditParkourArenaTabCompleter; import net.knarcraft.minigames.command.parkour.JoinParkourArenaCommand; import net.knarcraft.minigames.command.parkour.JoinParkourArenaTabCompleter; import net.knarcraft.minigames.command.parkour.ListParkourArenaCommand; import net.knarcraft.minigames.command.parkour.ParkourGroupListCommand; import net.knarcraft.minigames.command.parkour.ParkourGroupSetCommand; import net.knarcraft.minigames.command.parkour.ParkourGroupSwapCommand; import net.knarcraft.minigames.command.parkour.RemoveParkourArenaCommand; import net.knarcraft.minigames.command.parkour.RemoveParkourArenaTabCompleter; import net.knarcraft.minigames.config.DropperConfiguration; import net.knarcraft.minigames.config.MiniGameMessage; import net.knarcraft.minigames.config.ParkourConfiguration; import net.knarcraft.minigames.config.SharedConfiguration; import net.knarcraft.minigames.container.SerializableMaterial; import net.knarcraft.minigames.container.SerializableUUID; import net.knarcraft.minigames.listener.CommandListener; import net.knarcraft.minigames.listener.DamageListener; import net.knarcraft.minigames.listener.InteractListener; import net.knarcraft.minigames.listener.MoveListener; import net.knarcraft.minigames.listener.PlayerStateChangeListener; import net.knarcraft.minigames.manager.EconomyManager; import net.knarcraft.minigames.manager.PermissionManager; import net.knarcraft.minigames.placeholder.DropperExpansion; import net.knarcraft.minigames.placeholder.ParkourExpansion; import net.md_5.bungee.api.ChatColor; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; import org.bukkit.command.PluginCommand; import org.bukkit.command.TabCompleter; import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.ServicesManager; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.UUID; import java.util.logging.Level; /** * The dropper plugin's main class */ @SuppressWarnings("unused") public final class MiniGames extends JavaPlugin { private static MiniGames instance; private SharedConfiguration sharedConfiguration; private DropperConfiguration dropperConfiguration; private ParkourConfiguration parkourConfiguration; private DropperArenaHandler dropperArenaHandler; private ArenaPlayerRegistry dropperArenaPlayerRegistry; private DropperExpansion dropperExpansion; private ParkourExpansion parkourExpansion; private ParkourArenaHandler parkourArenaHandler; private ArenaPlayerRegistry parkourArenaPlayerRegistry; private PlayerVisibilityManager playerVisibilityManager; private Translator translator; private StringFormatter stringFormatter; /** * Gets an instance of this plugin * * @return

An instance of this plugin, or null if not initialized yet.

*/ public static MiniGames getInstance() { return instance; } /** * Gets the dropper arena handler for this instance * * @return

A dropper arena handler

*/ public DropperArenaHandler getDropperArenaHandler() { return this.dropperArenaHandler; } /** * Gets the parkour arena handler for this instance * * @return

A parkour arena handler

*/ public ParkourArenaHandler getParkourArenaHandler() { return this.parkourArenaHandler; } /** * Gets the dropper arena player registry for this instance * * @return

A dropper arena player registry

*/ public ArenaPlayerRegistry getDropperArenaPlayerRegistry() { return this.dropperArenaPlayerRegistry; } /** * Gets the parkour arena player registry for this instance * * @return

A parkour arena player registry

*/ public ArenaPlayerRegistry getParkourArenaPlayerRegistry() { return this.parkourArenaPlayerRegistry; } /** * Gets the shared configuration * *

The configuration for options which don't affect specific types of mini-games.

* * @return

The shared configuration

*/ public SharedConfiguration getSharedConfiguration() { return this.sharedConfiguration; } /** * Gets the dropper configuration * * @return

The dropper configuration

*/ public DropperConfiguration getDropperConfiguration() { return this.dropperConfiguration; } /** * Gets the parkour configuration * * @return

The parkour configuration

*/ public ParkourConfiguration getParkourConfiguration() { return this.parkourConfiguration; } /** * Gets the manager keeping track of player visibility * * @return

The player visibility manager

*/ public PlayerVisibilityManager getPlayerVisibilityManager() { return this.playerVisibilityManager; } /** * Gets the translator to get messages from * * @return

The translator

*/ public Translator getTranslator() { return this.translator; } /** * Gets the string formatter to get formatted messages from * * @return

The string formatter

*/ public StringFormatter getStringFormatter() { return this.stringFormatter; } /** * Gets the current session of the given player * * @param playerId

The id of the player to get a session for

* @return

The player's current session, or null if not found

*/ public @Nullable ArenaSession getSession(@NotNull UUID playerId) { ArenaSession dropperArenaSession = dropperArenaPlayerRegistry.getArenaSession(playerId); if (dropperArenaSession != null) { return dropperArenaSession; } return parkourArenaPlayerRegistry.getArenaSession(playerId); } /** * Logs a message * * @param level

The message level to log at

* @param message

The message to log

*/ public static void log(Level level, String message) { MiniGames.getInstance().getLogger().log(level, message); } /** * Reloads all configurations and data from disk */ public void reload() { // Load all arenas again this.dropperArenaHandler.load(); this.parkourArenaHandler.load(); // Reload configuration this.reloadConfig(); translator.loadLanguages(this.getDataFolder(), "en", getConfig().getString("language", "en")); this.sharedConfiguration.load(this.getConfig()); this.dropperConfiguration.load(this.getConfig()); this.parkourConfiguration.load(this.getConfig()); // Clear record caches this.dropperExpansion.clearCaches(); this.parkourExpansion.clearCaches(); } @Override public void onLoad() { super.onLoad(); // Register serialization classes ConfigurationSerialization.registerClass(SerializableMaterial.class); ConfigurationSerialization.registerClass(DropperArenaRecordsRegistry.class); ConfigurationSerialization.registerClass(SerializableUUID.class); ConfigurationSerialization.registerClass(DropperArenaData.class); ConfigurationSerialization.registerClass(DropperArenaGroup.class); ConfigurationSerialization.registerClass(DropperArenaGameMode.class); ConfigurationSerialization.registerClass(LongRecord.class); ConfigurationSerialization.registerClass(IntegerRecord.class); ConfigurationSerialization.registerClass(ParkourArenaRecordsRegistry.class); ConfigurationSerialization.registerClass(ParkourArenaData.class); ConfigurationSerialization.registerClass(ParkourArenaGroup.class); ConfigurationSerialization.registerClass(ParkourArenaGameMode.class); ConfigurationSerialization.registerClass(DropperPlayerEntryState.class); ConfigurationSerialization.registerClass(ParkourPlayerEntryState.class); ConfigurationSerialization.registerClass(CommandReward.class); ConfigurationSerialization.registerClass(EconomyReward.class); ConfigurationSerialization.registerClass(ItemReward.class); ConfigurationSerialization.registerClass(PermissionReward.class); ConfigurationSerialization.registerClass(RewardCondition.class); } @Override public void onEnable() { // Plugin startup logic instance = this; // Load configuration loadConfiguration(); // Register all listeners registerListeners(); // Register all commands registerCommands(); // Integrate with other plugins doPluginIntegration(); } @Override public void onDisable() { // Kill all sessions before exiting for (DropperArena arena : dropperArenaHandler.getArenas().values()) { dropperArenaPlayerRegistry.removeForArena(arena, true); } for (ParkourArena arena : parkourArenaHandler.getArenas().values()) { parkourArenaPlayerRegistry.removeForArena(arena, true); } } /** * Sets up integration with third-party plugins */ private void doPluginIntegration() { if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { this.dropperExpansion = new DropperExpansion(this); if (!this.dropperExpansion.register()) { log(Level.WARNING, "Unable to register PlaceholderAPI dropper expansion!"); } this.parkourExpansion = new ParkourExpansion(this); if (!this.parkourExpansion.register()) { log(Level.WARNING, "Unable to register PlaceholderAPI parkour expansion!"); } } if (Bukkit.getPluginManager().getPlugin("Vault") != null) { setupVault(); } else { log(Level.WARNING, "Vault not found. Economy and Permission rewards are unavailable."); } } /** * Loads all configuration values used by this plugin */ private void loadConfiguration() { this.saveDefaultConfig(); getConfig().options().copyDefaults(true); saveConfig(); reloadConfig(); setupStringFormatter(); this.sharedConfiguration = new SharedConfiguration(this.getConfig()); this.dropperConfiguration = new DropperConfiguration(this.getConfig()); this.parkourConfiguration = new ParkourConfiguration(this.getConfig()); this.dropperArenaPlayerRegistry = new DropperArenaPlayerRegistry(); this.dropperArenaHandler = new DropperArenaHandler(this.dropperArenaPlayerRegistry); this.dropperArenaHandler.load(); this.parkourArenaPlayerRegistry = new ParkourArenaPlayerRegistry(); this.parkourArenaHandler = new ParkourArenaHandler(this.parkourArenaPlayerRegistry); this.parkourArenaHandler.load(); this.playerVisibilityManager = new PlayerVisibilityManager(); } /** * Registers all listeners used by this plugin */ private void registerListeners() { PluginManager pluginManager = getServer().getPluginManager(); pluginManager.registerEvents(new DamageListener(), this); pluginManager.registerEvents(new MoveListener(this.dropperConfiguration, this.parkourConfiguration), this); pluginManager.registerEvents(new PlayerStateChangeListener(), this); pluginManager.registerEvents(new CommandListener(), this); pluginManager.registerEvents(new GUIListener(true), this); pluginManager.registerEvents(new InteractListener(), this); } /** * Registers a command * * @param commandName

The name of the command to register (defined in plugin.yml)

* @param commandExecutor

The executor for the command

* @param tabCompleter

The tab-completer to use, or null

*/ private void registerCommand(@NotNull String commandName, @NotNull CommandExecutor commandExecutor, @Nullable TabCompleter tabCompleter) { PluginCommand command = this.getCommand(commandName); if (command != null) { command.setExecutor(commandExecutor); if (tabCompleter != null) { command.setTabCompleter(tabCompleter); } } else { log(Level.SEVERE, "Unable to register the command " + commandName); } } /** * Registers all commands used by this plugin */ private void registerCommands() { registerCommand("miniGamesReload", new ReloadCommand(), null); registerCommand("miniGamesLeave", new LeaveArenaCommand(), null); registerCommand("miniGamesMenu", new MenuCommand(), null); registerCommand("miniGamesReward", new SetArenaRewardCommand(), new SetArenaRewardTabCompleter()); registerDropperCommands(); registerParkourCommands(); } /** * Registers all commands related to droppers */ private void registerDropperCommands() { registerCommand("dropperCreate", new CreateDropperArenaCommand(), null); registerCommand("dropperList", new ListDropperArenaCommand(), null); registerCommand("dropperJoin", new JoinDropperArenaCommand(), new JoinDropperArenaTabCompleter()); registerCommand("dropperEdit", new EditDropperArenaCommand(this.dropperConfiguration), new EditDropperArenaTabCompleter()); registerCommand("dropperRemove", new RemoveDropperArenaCommand(), new RemoveDropperArenaTabCompleter()); registerCommand("dropperGroupSet", new DropperGroupSetCommand(), null); registerCommand("dropperGroupSwap", new DropperGroupSwapCommand(), null); registerCommand("dropperGroupList", new DropperGroupListCommand(), null); } /** * Registers all commands related to parkour */ private void registerParkourCommands() { registerCommand("parkourCreate", new CreateParkourArenaCommand(), null); registerCommand("parkourList", new ListParkourArenaCommand(), null); registerCommand("parkourJoin", new JoinParkourArenaCommand(), new JoinParkourArenaTabCompleter()); registerCommand("parkourEdit", new EditParkourArenaCommand(), new EditParkourArenaTabCompleter()); registerCommand("parkourRemove", new RemoveParkourArenaCommand(), new RemoveParkourArenaTabCompleter()); registerCommand("parkourGroupSet", new ParkourGroupSetCommand(), null); registerCommand("parkourGroupSwap", new ParkourGroupSwapCommand(), null); registerCommand("parkourGroupList", new ParkourGroupListCommand(), null); } /** * Sets up the translator and the string formatter */ private void setupStringFormatter() { translator = new Translator(); translator.registerMessageCategory(MiniGameMessage.ERROR_PLAYER_ONLY); translator.loadLanguages(this.getDataFolder(), "en", getConfig().getString("language", "en")); stringFormatter = new StringFormatter(this.getDescription().getName(), translator); stringFormatter.setColorConversion(ColorConversion.RGB); stringFormatter.setNamePrefix("#546EED[&r&l"); stringFormatter.setNameSuffix("#546EED]"); stringFormatter.setErrorColor(ChatColor.RED); stringFormatter.setSuccessColor(ChatColor.GREEN); } /** * Sets up Vault by getting plugins from their providers */ private void setupVault() { ServicesManager servicesManager = this.getServer().getServicesManager(); RegisteredServiceProvider permissionProvider = servicesManager.getRegistration(Permission.class); RegisteredServiceProvider economyProvider = servicesManager.getRegistration(Economy.class); if (permissionProvider != null) { PermissionManager.initialize(permissionProvider.getProvider()); } else { log(Level.WARNING, "No Vault permission provider found. Permission rewards are unavailable."); } if (economyProvider != null) { EconomyManager.initialize(economyProvider.getProvider()); } else { log(Level.WARNING, "No Vault economy provider found. Economy rewards are unavailable."); } } }