1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-21 04:05:48 +00:00
Slimefun4/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java

599 lines
23 KiB
Java
Raw Normal View History

2016-04-14 16:24:03 +00:00
package me.mrCookieSlime.Slimefun;
2017-06-22 14:43:49 +00:00
import java.io.File;
import java.util.Arrays;
import java.util.Set;
2019-08-31 10:54:54 +00:00
import java.util.logging.Level;
import java.util.stream.Collectors;
2017-06-22 14:43:49 +00:00
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
2017-06-22 14:43:49 +00:00
import org.bukkit.plugin.java.JavaPlugin;
import io.github.thebusybiscuit.cscorelib2.config.Config;
2019-09-01 16:53:02 +00:00
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionManager;
2019-10-29 08:13:32 +00:00
import io.github.thebusybiscuit.cscorelib2.recipes.RecipeSnapshot;
2019-10-01 11:14:50 +00:00
import io.github.thebusybiscuit.cscorelib2.reflection.ReflectionUtils;
2020-02-16 11:17:14 +00:00
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
import io.github.thebusybiscuit.slimefun4.api.gps.GPSNetwork;
import io.github.thebusybiscuit.slimefun4.api.network.NetworkManager;
import io.github.thebusybiscuit.slimefun4.core.SlimefunRegistry;
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
import io.github.thebusybiscuit.slimefun4.core.services.AutoSavingService;
2020-02-08 19:50:21 +00:00
import io.github.thebusybiscuit.slimefun4.core.services.BackupService;
import io.github.thebusybiscuit.slimefun4.core.services.BlockDataService;
import io.github.thebusybiscuit.slimefun4.core.services.CustomItemDataService;
import io.github.thebusybiscuit.slimefun4.core.services.CustomTextureService;
import io.github.thebusybiscuit.slimefun4.core.services.LocalizationService;
2020-03-10 20:44:24 +00:00
import io.github.thebusybiscuit.slimefun4.core.services.PermissionsService;
import io.github.thebusybiscuit.slimefun4.core.services.UpdaterService;
import io.github.thebusybiscuit.slimefun4.core.services.github.GitHubService;
import io.github.thebusybiscuit.slimefun4.core.services.metrics.MetricsService;
2020-03-12 02:32:04 +00:00
import io.github.thebusybiscuit.slimefun4.core.services.plugins.ThirdPartyPluginService;
2020-01-12 10:05:35 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.AncientAltarListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BlockListener;
2020-01-12 10:01:29 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.BlockPhysicsListener;
2020-03-12 02:32:04 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ButcherAndroidListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.CoolerListener;
2020-01-11 22:58:05 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.DeathpointListener;
2020-01-12 01:05:33 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.DebugFishListener;
2020-02-22 23:59:55 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.DispenserListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.EnhancedFurnaceListener;
2020-03-05 20:52:34 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.EntityKillListener;
2020-01-11 22:58:05 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ExplosionsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.FireworksListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.GadgetsListener;
2019-12-29 17:30:48 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.GrapplingHookListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.IronGolemListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.ItemPickupListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.MultiBlockListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.NetworkListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.PlayerProfileListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunBootsListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunBowListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunGuideListener;
2020-03-12 02:32:04 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunItemConsumeListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SlimefunItemListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.SoulboundListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.TalismanListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.TeleporterListener;
2020-03-01 08:29:37 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.VampireBladeListener;
2020-01-12 10:01:29 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.VanillaMachinesListener;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.WitherListener;
2019-12-29 13:14:51 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.listeners.WorldListener;
2020-03-05 20:28:50 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.resources.GEOResourcesSetup;
2020-03-15 14:12:44 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.setup.PostSetup;
2020-02-02 17:27:32 +00:00
import io.github.thebusybiscuit.slimefun4.implementation.setup.ResearchSetup;
import io.github.thebusybiscuit.slimefun4.implementation.setup.SlimefunItemSetup;
import io.github.thebusybiscuit.slimefun4.implementation.tasks.ArmorTask;
import io.github.thebusybiscuit.slimefun4.implementation.tasks.TickerTask;
2016-04-14 16:24:03 +00:00
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor;
2016-04-14 16:24:03 +00:00
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.PlayerProfile;
2016-04-14 16:24:03 +00:00
import me.mrCookieSlime.Slimefun.api.Slimefun;
2019-08-22 19:37:09 +00:00
import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu;
2016-04-14 16:24:03 +00:00
/**
* This is the main class of Slimefun.
* This is where all the magic starts, take a look around.
* Feel like home.
*
* @author TheBusyBiscuit
*
*/
2020-02-16 11:17:14 +00:00
public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon {
public static SlimefunPlugin instance;
2020-03-15 16:43:51 +00:00
private final SlimefunRegistry registry = new SlimefunRegistry();
2020-03-14 00:12:52 +00:00
private MinecraftVersion minecraftVersion = MinecraftVersion.UNKNOWN;
2020-03-10 20:44:24 +00:00
// Services - Systems that fulfill certain tasks, treat them as a black box
private final CustomItemDataService itemDataService = new CustomItemDataService(this, "slimefun_item");
private final CustomTextureService textureService = new CustomTextureService(this);
private final BlockDataService blockDataService = new BlockDataService(this, "slimefun_block");
private final GitHubService gitHubService = new GitHubService("TheBusyBiscuit/Slimefun4");
private final UpdaterService updaterService = new UpdaterService(this, getFile());
private final AutoSavingService autoSavingService = new AutoSavingService();
private final BackupService backupService = new BackupService();
private final MetricsService metricsService = new MetricsService(this);
2020-03-10 20:44:24 +00:00
private final PermissionsService permissionsService = new PermissionsService(this);
2020-03-12 02:32:04 +00:00
private final ThirdPartyPluginService thirdPartySupportService = new ThirdPartyPluginService(this);
private LocalizationService local;
2020-03-12 02:32:04 +00:00
2020-03-15 16:43:51 +00:00
private GPSNetwork gpsNetwork;
private NetworkManager networkManager;
2020-03-12 02:32:04 +00:00
private ProtectionManager protections;
private TickerTask ticker;
2020-03-15 16:43:51 +00:00
private SlimefunCommand command;
private RecipeSnapshot recipeSnapshot;
private Config researches;
private Config items;
private Config whitelist;
private Config config;
// Listeners that need to be accessed elsewhere
private AncientAltarListener ancientAltarListener;
private BackpackListener backpackListener;
private GrapplingHookListener grapplingHookListener;
private SlimefunBowListener bowListener;
@Override
public void onEnable() {
if (getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) {
2020-03-14 00:12:52 +00:00
// We wanna ensure that the Server uses a compatible version of Minecraft
if (isVersionUnsupported()) {
getServer().getPluginManager().disablePlugin(this);
return;
}
instance = this;
// Creating all necessary Folders
getLogger().log(Level.INFO, "Loading Files...");
createDirectories();
getLogger().log(Level.INFO, "Loading Config...");
// Setup config.yml
config = new Config(this);
2020-03-15 16:43:51 +00:00
registry.load(config);
// Loading all extra configs
researches = new Config(this, "Researches.yml");
items = new Config(this, "Items.yml");
whitelist = new Config(this, "whitelist.yml");
2020-03-10 20:44:24 +00:00
// Setup various config files
2020-03-10 14:20:59 +00:00
textureService.load();
2020-03-10 20:44:24 +00:00
permissionsService.load();
local = new LocalizationService(this, config.getString("options.language"));
// Setting up Network classes
networkManager = new NetworkManager(config.getInt("options.max-network-size"));
// Setting up other stuff
2020-03-15 16:43:51 +00:00
gpsNetwork = new GPSNetwork();
// Setting up bStats
metricsService.start();
// Starting the Auto-Updater
if (config.getBoolean("options.auto-update")) {
getLogger().log(Level.INFO, "Starting Auto-Updater...");
updaterService.start();
}
else {
updaterService.disable();
}
// Registering all GEO Resources
getLogger().log(Level.INFO, "Loading GEO-Resources...");
GEOResourcesSetup.setup();
getLogger().log(Level.INFO, "Loading Items...");
2020-03-15 14:12:44 +00:00
PostSetup.setupItemSettings();
try {
SlimefunItemSetup.setup(this);
}
catch (Throwable x) {
getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + getVersion(), x);
}
getLogger().log(Level.INFO, "Loading Researches...");
try {
ResearchSetup.setupResearches();
}
catch (Throwable x) {
getLogger().log(Level.SEVERE, "An Error occured while initializing Slimefun Researches for Slimefun " + getVersion(), x);
}
2020-03-10 14:20:59 +00:00
2020-03-15 16:43:51 +00:00
registry.setResearchingEnabled(getResearchCfg().getBoolean("enable-researching"));
2020-03-15 14:12:44 +00:00
PostSetup.setupWiki();
// Setting up GitHub Connectors...
2020-03-10 00:49:55 +00:00
gitHubService.connect(false);
// All Slimefun Listeners
new SlimefunBootsListener(this);
new SlimefunItemListener(this);
2020-03-12 02:32:04 +00:00
new SlimefunItemConsumeListener(this);
new BlockPhysicsListener(this);
new MultiBlockListener(this);
new GadgetsListener(this);
new DispenserListener(this);
new EntityKillListener(this);
new BlockListener(this);
new EnhancedFurnaceListener(this);
new ItemPickupListener(this);
new DeathpointListener(this);
new ExplosionsListener(this);
new DebugFishListener(this);
new VanillaMachinesListener(this);
new FireworksListener(this);
new WitherListener(this);
new IronGolemListener(this);
bowListener = new SlimefunBowListener(this);
ancientAltarListener = new AncientAltarListener();
grapplingHookListener = new GrapplingHookListener();
// Toggleable Listeners for performance
2020-03-12 02:32:04 +00:00
if (config.getBoolean("items.talismans")) {
new TalismanListener(this);
}
if (config.getBoolean("items.soulbound")) {
new SoulboundListener(this);
}
if (config.getBoolean("items.backpacks")) {
backpackListener = new BackpackListener(this);
}
// Handle Slimefun Guide being given on Join
new SlimefunGuideListener(this, config.getBoolean("options.give-guide-on-first-join"));
// Load/Unload Worlds in Slimefun
new WorldListener(this);
// Clear the Slimefun Guide History upon Player Leaving
new PlayerProfileListener(this);
// Initiating various Stuff and all Items with a slightly delay (0ms after the Server finished loading)
Slimefun.runSync(() -> {
2020-03-10 20:44:24 +00:00
textureService.register(registry.getAllSlimefunItems());
permissionsService.register(registry.getAllSlimefunItems());
recipeSnapshot = new RecipeSnapshot(this);
protections = new ProtectionManager(getServer());
2020-03-10 20:44:24 +00:00
2020-03-15 14:12:44 +00:00
PostSetup.loadItems();
for (World world : Bukkit.getWorlds()) {
new BlockStorage(world);
}
2020-03-12 02:32:04 +00:00
if (isEnabled("ANCIENT_ALTAR")) {
ancientAltarListener.load(this);
}
2020-03-12 02:32:04 +00:00
if (isEnabled("GRAPPLING_HOOK")) {
grapplingHookListener.load(this);
}
2020-03-12 02:32:04 +00:00
if (isEnabled("BLADE_OF_VAMPIRES")) {
new VampireBladeListener(this);
}
2020-03-12 02:32:04 +00:00
if (isEnabled("COOLER")) {
new CoolerListener(this);
}
2020-03-12 02:32:04 +00:00
if (isEnabled("ELEVATOR_PLATE", "GPS_ACTIVATION_DEVICE_SHARED", "GPS_ACTIVATION_DEVICE_PERSONAL")) {
new TeleporterListener(this);
}
if (isEnabled("PROGRAMMABLE_ANDROID_BUTCHER", "PROGRAMMABLE_ANDROID_2_BUTCHER", "PROGRAMMABLE_ANDROID_3_BUTCHER")) {
new ButcherAndroidListener(this);
}
if (isEnabled("ENERGY_REGULATOR", "CARGO_MANAGER")) {
new NetworkListener(this);
}
}, 0);
// Setting up the command /sf and all subcommands
command = new SlimefunCommand(this);
// Armor Update Task
if (config.getBoolean("options.enable-armor-effects")) {
getServer().getScheduler().runTaskTimerAsynchronously(this, new ArmorTask(), 0L, config.getInt("options.armor-update-interval") * 20L);
}
ticker = new TickerTask();
autoSavingService.start(this, config.getInt("options.auto-save-delay-in-minutes"));
// Starting all ASYNC Tasks
getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
try {
ticker.run();
}
catch (Exception x) {
getLogger().log(Level.SEVERE, "An Exception was caught while ticking the Block Tickers Task for Slimefun v" + getVersion(), x);
ticker.abortTick();
}
}, 100L, config.getInt("URID.custom-ticker-delay"));
gitHubService.start(this);
// Hooray!
getLogger().log(Level.INFO, "Finished!");
2020-03-12 02:32:04 +00:00
thirdPartySupportService.start();
// Do not show /sf elevator command in our Log, it could get quite spammy
CSCoreLib.getLib().filterLog("([A-Za-z0-9_]{3,16}) issued server command: /sf elevator (.{0,})");
}
else {
getLogger().log(Level.INFO, "#################### - INFO - ####################");
getLogger().log(Level.INFO, " ");
getLogger().log(Level.INFO, "Slimefun could not be loaded (yet).");
getLogger().log(Level.INFO, "It appears that you have not installed CS-CoreLib.");
getLogger().log(Level.INFO, "Please download and install CS-CoreLib manually:");
getLogger().log(Level.INFO, "https://thebusybiscuit.github.io/builds/TheBusyBiscuit/CS-CoreLib/master/");
getCommand("slimefun").setExecutor((sender, cmd, label, args) -> {
sender.sendMessage("You have forgotten to install CS-CoreLib! Slimefun is disabled.");
sender.sendMessage("https://thebusybiscuit.github.io/builds/TheBusyBiscuit/CS-CoreLib/master/");
return true;
});
}
}
2020-03-12 02:32:04 +00:00
private boolean isEnabled(String... itemIds) {
for (String id : itemIds) {
SlimefunItem item = SlimefunItem.getByID(id);
if (item != null && !item.isDisabled()) {
return true;
}
}
return false;
}
private boolean isVersionUnsupported() {
String currentVersion = ReflectionUtils.getVersion();
if (currentVersion.startsWith("v")) {
2020-03-14 00:12:52 +00:00
for (MinecraftVersion version : MinecraftVersion.values()) {
if (version.matches(currentVersion)) {
minecraftVersion = version;
return false;
}
}
// Looks like you are using an unsupported Minecraft Version
2020-03-14 00:12:52 +00:00
getLogger().log(Level.SEVERE, "### Slimefun was not installed correctly!");
getLogger().log(Level.SEVERE, "### You are using the wrong version of Minecraft!");
getLogger().log(Level.SEVERE, "###");
getLogger().log(Level.SEVERE, "### You are using Minecraft " + ReflectionUtils.getVersion());
getLogger().log(Level.SEVERE, "### but Slimefun v" + getDescription().getVersion() + " requires you to be using");
getLogger().log(Level.SEVERE, "### Minecraft {0}", String.join(" / ", MinecraftVersion.getSupportedVersions()));
return true;
}
2020-03-15 16:43:51 +00:00
getLogger().log(Level.WARNING, "We could not determine the version of Minecraft you were using ({0})", currentVersion);;
return false;
}
@Override
public void onDisable() {
// CS-CoreLib wasn't loaded, just disabling
if (instance == null) return;
Bukkit.getScheduler().cancelTasks(this);
if (ticker != null) {
// Finishes all started movements/removals of block data
ticker.halt();
ticker.run();
}
PlayerProfile.iterator().forEachRemaining(profile -> {
if (profile.isDirty()) {
profile.save();
}
});
for (World world : Bukkit.getWorlds()) {
try {
BlockStorage storage = BlockStorage.getStorage(world);
if (storage != null) {
storage.save(true);
}
else {
getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"" + world.getName() + "\"");
}
}
catch (Exception x) {
getLogger().log(Level.SEVERE, "An Error occured while saving Slimefun-Blocks in World '" + world.getName() + "' for Slimefun " + getVersion(), x);
}
}
for (UniversalBlockMenu menu : registry.getUniversalInventories().values()) {
menu.save();
}
backupService.run();
// Prevent Memory Leaks
AContainer.processing = null;
AContainer.progress = null;
AGenerator.processing = null;
AGenerator.progress = null;
AReactor.processing = null;
AReactor.progress = null;
instance = null;
for (Player p : Bukkit.getOnlinePlayers()) {
p.closeInventory();
}
}
private void createDirectories() {
String[] storage = { "Players", "blocks", "stored-blocks", "stored-inventories", "stored-chunks", "universal-inventories", "waypoints", "block-backups" };
String[] general = { "scripts", "generators", "error-reports", "cache/github" };
for (String file : storage) {
createDir("data-storage/Slimefun/" + file);
}
for (String file : general) {
createDir("plugins/Slimefun/" + file);
}
}
private void createDir(String path) {
File file = new File(path);
if (!file.exists()) file.mkdirs();
}
public static Config getCfg() {
return instance.config;
}
public static Config getResearchCfg() {
return instance.researches;
}
public static Config getItemCfg() {
return instance.items;
}
public static Config getWhitelist() {
return instance.whitelist;
}
public static GPSNetwork getGPSNetwork() {
2020-03-15 16:43:51 +00:00
return instance.gpsNetwork;
}
public static TickerTask getTicker() {
return instance.ticker;
}
2020-03-07 10:35:29 +00:00
/**
* This returns the version of Slimefun that is currently installed.
*
* @return The currently installed version of Slimefun
*/
public static String getVersion() {
return instance.getDescription().getVersion();
}
public static ProtectionManager getProtectionManager() {
return instance.protections;
}
public static LocalizationService getLocal() {
return instance.local;
}
public static RecipeSnapshot getMinecraftRecipes() {
return instance.recipeSnapshot;
}
public static CustomItemDataService getItemDataService() {
return instance.itemDataService;
}
public static CustomTextureService getItemTextureService() {
return instance.textureService;
}
2020-03-10 20:44:24 +00:00
public static PermissionsService getPermissionsService() {
return instance.permissionsService;
}
public static BlockDataService getBlockDataService() {
return instance.blockDataService;
}
2020-03-12 02:32:04 +00:00
public static ThirdPartyPluginService getThirdPartySupportService() {
return instance.thirdPartySupportService;
}
2020-03-07 10:35:29 +00:00
/**
* This method returns the {@link UpdaterService} of Slimefun.
* It is used to handle automatic updates.
*
* @return The {@link UpdaterService} for Slimefun
*/
public static UpdaterService getUpdater() {
return instance.updaterService;
}
2020-03-07 10:35:29 +00:00
/**
* This method returns the {@link GitHubService} of Slimefun.
* It is used to retrieve data from GitHub repositories.
*
* @return The {@link GitHubService} for Slimefun
*/
public static GitHubService getGitHubService() {
return instance.gitHubService;
}
public static SlimefunRegistry getRegistry() {
return instance.registry;
}
public static NetworkManager getNetworkManager() {
return instance.networkManager;
}
public static AncientAltarListener getAncientAltarListener() {
return instance.ancientAltarListener;
}
public static GrapplingHookListener getGrapplingHookListener() {
return instance.grapplingHookListener;
}
public static BackpackListener getBackpackListener() {
return instance.backpackListener;
}
public static SlimefunBowListener getBowListener() {
return instance.bowListener;
}
2020-03-07 10:35:29 +00:00
/**
* This method returns a {@link Set} of every {@link Plugin} that lists Slimefun
* as a required or optional dependency.
*
* We will just assume this to be a list of our addons.
*
* @return A {@link Set} of every {@link Plugin} that is dependent on Slimefun
*/
public static Set<Plugin> getInstalledAddons() {
return Arrays.stream(instance.getServer().getPluginManager().getPlugins()).filter(plugin -> plugin.getDescription().getDepend().contains(instance.getName()) || plugin.getDescription().getSoftDepend().contains(instance.getName())).collect(Collectors.toSet());
}
public static SlimefunCommand getCommand() {
return instance.command;
}
2020-03-14 00:12:52 +00:00
public static MinecraftVersion getMinecraftVersion() {
return instance.minecraftVersion;
}
@Override
public JavaPlugin getJavaPlugin() {
return this;
}
@Override
public String getBugTrackerURL() {
return "https://github.com/TheBusyBiscuit/Slimefun4/issues";
}
2020-02-16 11:17:14 +00:00
2016-04-14 16:24:03 +00:00
}