BSkyBlock/src/main/java/us/tastybento/bskyblock/BSkyBlock.java

366 lines
11 KiB
Java
Executable File

package us.tastybento.bskyblock;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import us.tastybento.bskyblock.api.configuration.BSBConfig;
import us.tastybento.bskyblock.api.configuration.WorldSettings;
import us.tastybento.bskyblock.api.events.BSBReadyEvent;
import us.tastybento.bskyblock.api.placeholders.PlaceholderHandler;
import us.tastybento.bskyblock.api.user.Notifier;
import us.tastybento.bskyblock.commands.AdminCommand;
import us.tastybento.bskyblock.commands.IslandCommand;
import us.tastybento.bskyblock.database.BSBDbSetup;
import us.tastybento.bskyblock.listeners.BannedVisitorCommands;
import us.tastybento.bskyblock.listeners.BlockEndDragon;
import us.tastybento.bskyblock.listeners.JoinLeaveListener;
import us.tastybento.bskyblock.listeners.NetherPortals;
import us.tastybento.bskyblock.listeners.ObsidianToLava;
import us.tastybento.bskyblock.listeners.PanelListenerManager;
import us.tastybento.bskyblock.listeners.protection.FlyingMobEvents;
import us.tastybento.bskyblock.managers.AddonsManager;
import us.tastybento.bskyblock.managers.CommandsManager;
import us.tastybento.bskyblock.managers.FlagsManager;
import us.tastybento.bskyblock.managers.IslandWorldManager;
import us.tastybento.bskyblock.managers.IslandsManager;
import us.tastybento.bskyblock.managers.LocalesManager;
import us.tastybento.bskyblock.managers.PlayersManager;
import us.tastybento.bskyblock.managers.RanksManager;
import us.tastybento.bskyblock.managers.SchemsManager;
import us.tastybento.bskyblock.util.HeadGetter;
/**
* Main BSkyBlock class - provides an island minigame in the sky
* @author tastybento
* @author Poslovitch
*/
public class BSkyBlock extends JavaPlugin {
private static BSkyBlock instance;
// Databases
private PlayersManager playersManager;
private IslandsManager islandsManager;
// Metrics
private Metrics metrics;
// Managers
private CommandsManager commandsManager;
private LocalesManager localesManager;
private AddonsManager addonsManager;
private FlagsManager flagsManager;
private IslandWorldManager islandWorldManager;
private RanksManager ranksManager;
private SchemsManager schemsManager;
// Settings
private Settings settings;
// Notifier
private Notifier notifier;
private HeadGetter headGetter;
private boolean isLoaded;
@Override
public void onEnable(){
// Not loaded
isLoaded = false;
// Store the current millis time so we can tell how many ms it took for BSB to fully load.
final long startMillis = System.currentTimeMillis();
// Save the default config from config.yml
saveDefaultConfig();
setInstance(this);
// Load Flags
flagsManager = new FlagsManager(instance);
// Load settings from config.yml. This will check if there are any issues with it too.
settings = new BSBConfig<>(this, Settings.class).loadConfigObject("");
// Start Database managers
playersManager = new PlayersManager(this);
// Check if this plugin is now disabled (due to bad database handling)
if (!this.isEnabled()) {
return;
}
islandsManager = new IslandsManager(this);
ranksManager = new RanksManager(this);
// Start head getter
headGetter = new HeadGetter(this);
// Load metrics
metrics = new Metrics(instance);
registerCustomCharts();
// Load Notifier
notifier = new Notifier();
// Set up command manager
commandsManager = new CommandsManager();
// These items have to be loaded when the server has done 1 tick.
// Note Worlds are not loaded this early, so any Locations or World reference will be null
// at this point. Therefore, the 1 tick scheduler is required.
getServer().getScheduler().runTask(this, () -> {
// Create the world if it does not exist
islandWorldManager = new IslandWorldManager(instance);
// Load schems manager
schemsManager = new SchemsManager(instance);
// Load the default island schems
schemsManager.loadIslands(getIWM().getBSBIslandWorld());
// Set up commands
new IslandCommand();
new AdminCommand();
// Locales manager must be loaded before addons
localesManager = new LocalesManager(instance);
PlaceholderHandler.register(instance);
// Load addons. Addons may load worlds, so they must go before islands are loaded.
addonsManager = new AddonsManager(instance);
addonsManager.loadAddons();
// Enable addons
addonsManager.enableAddons();
getServer().getScheduler().runTask(instance, () -> {
// Register Listeners
registerListeners();
// Load islands from database - need to wait until all the worlds are loaded
islandsManager.load();
// Save islands & players data asynchronously every X minutes
instance.getServer().getScheduler().runTaskTimer(instance, () -> {
playersManager.save(true);
islandsManager.save(true);
}, getSettings().getDatabaseBackupPeriod() * 20 * 60L, getSettings().getDatabaseBackupPeriod() * 20 * 60L);
isLoaded = true;
flagsManager.registerListeners();
instance.log("#############################################");
instance.log(instance.getDescription().getFullName() + " has been fully enabled.");
instance.log("It took: " + (System.currentTimeMillis() - startMillis + "ms"));
instance.log("Thanks for using our plugin !");
instance.log("- Tastybento and Poslovitch, 2017-2018");
instance.log("#############################################");
// Fire plugin ready event
Bukkit.getServer().getPluginManager().callEvent(new BSBReadyEvent());
});
});
}
/**
* Register listeners
*/
private void registerListeners() {
PluginManager manager = getServer().getPluginManager();
// Player join events
manager.registerEvents(new JoinLeaveListener(this), this);
// Panel listener manager
manager.registerEvents(new PanelListenerManager(), this);
// Nether portals
manager.registerEvents(new NetherPortals(this), this);
// Obsidian to lava helper
manager.registerEvents(new ObsidianToLava(this), this);
// Flying mobs protection
manager.registerEvents(new FlyingMobEvents(this), this);
// End dragon blocking
manager.registerEvents(new BlockEndDragon(this), this);
// Banned visitor commands
manager.registerEvents(new BannedVisitorCommands(this), this);
}
@Override
public void onDisable() {
if (addonsManager != null) {
addonsManager.disableAddons();
}
// Save data
if (playersManager != null) {
playersManager.shutdown();
}
if (islandsManager != null) {
islandsManager.shutdown();
}
// Save settings
if (settings != null) {
new BSBConfig<>(this, Settings.class).saveConfigObject(settings);
}
}
private void registerCustomCharts(){
metrics.addCustomChart(new Metrics.SingleLineChart("islands_count") {
@Override
public int getValue() {
return islandsManager.getCount();
}
});
metrics.addCustomChart(new Metrics.SingleLineChart("created_islands") {
@Override
public int getValue() {
int created = islandsManager.metrics_getCreatedCount();
islandsManager.metrics_setCreatedCount(0);
return created;
}
});
metrics.addCustomChart(new Metrics.SimplePie("default_locale") {
@Override
public String getValue() {
return getSettings().getDefaultLanguage();
}
});
metrics.addCustomChart(new Metrics.SimplePie("database") {
@Override
public String getValue() {
return BSBDbSetup.getDatabase().toString();
}
});
}
/**
* Returns the player database
* @return the player database
*/
public PlayersManager getPlayers(){
return playersManager;
}
/**
* Returns the island database
* @return the island database
*/
public IslandsManager getIslands(){
return islandsManager;
}
private static void setInstance(BSkyBlock plugin) {
BSkyBlock.instance = plugin;
}
public static BSkyBlock getInstance() {
return instance;
}
/**
* @return the Commands manager
*/
public CommandsManager getCommandsManager() {
return commandsManager;
}
/**
* @return the Locales manager
*/
public LocalesManager getLocalesManager() {
return localesManager;
}
/**
* @return the Addons manager
*/
public AddonsManager getAddonsManager() {
return addonsManager;
}
/**
* @return the Flags manager
*/
public FlagsManager getFlagsManager() {
return flagsManager;
}
/**
* @return the ranksManager
*/
public RanksManager getRanksManager() {
return ranksManager;
}
/**
* @return the Island World Manager
*/
public IslandWorldManager getIWM() {
return islandWorldManager;
}
/**
* @return the settings
*/
public Settings getSettings() {
return settings;
}
/**
* @return the notifier
*/
public Notifier getNotifier() {
return notifier;
}
/**
* @return the headGetter
*/
public HeadGetter getHeadGetter() {
return headGetter;
}
public void log(String string) {
getLogger().info(() -> string);
}
public void logDebug(Object object) {
getLogger().info(() -> "DEBUG: " + object);
}
public void logError(String error) {
getLogger().severe(() -> error);
}
public void logWarning(String warning) {
getLogger().warning(warning);
}
/**
* Registers a world as a world to be covered by this plugin
* @param world - Bukkit over world
* @param worldSettings - settings for this world
*/
public void registerWorld(World world, WorldSettings worldSettings) {
islandWorldManager.addWorld(world, worldSettings);
}
/**
* @return the schemsManager
*/
public SchemsManager getSchemsManager() {
return schemsManager;
}
/**
* True if the plugin is loaded and ready
* @return the isLoaded
*/
public boolean isLoaded() {
return isLoaded;
}
}