ChestsPlusPlus/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/ChestsPlusPlus.java

188 lines
10 KiB
Java

package com.jamesdpeters.minecraft.chests;
import com.jamesdpeters.minecraft.chests.api.ApiSpecific;
import com.jamesdpeters.minecraft.chests.commands.AutoCraftCommand;
import com.jamesdpeters.minecraft.chests.commands.ChestLinkCommand;
import com.jamesdpeters.minecraft.chests.commands.ChestsPlusPlusCommand;
import com.jamesdpeters.minecraft.chests.crafting.Crafting;
import com.jamesdpeters.minecraft.chests.lang.LangFileProperties;
import com.jamesdpeters.minecraft.chests.listeners.AutoCrafterListener;
import com.jamesdpeters.minecraft.chests.listeners.HopperFilterListener;
import com.jamesdpeters.minecraft.chests.listeners.InventoryListener;
import com.jamesdpeters.minecraft.chests.listeners.LinkedChestHopperListener;
import com.jamesdpeters.minecraft.chests.listeners.StorageListener;
import com.jamesdpeters.minecraft.chests.listeners.WorldListener;
import com.jamesdpeters.minecraft.chests.maventemplates.BuildConstants;
import com.jamesdpeters.minecraft.chests.misc.Permissions;
import com.jamesdpeters.minecraft.chests.misc.ServerType;
import com.jamesdpeters.minecraft.chests.misc.Stats;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.party.PlayerParty;
import com.jamesdpeters.minecraft.chests.party.PlayerPartyStorage;
import com.jamesdpeters.minecraft.chests.serialize.Config;
import com.jamesdpeters.minecraft.chests.serialize.ConfigStorage;
import com.jamesdpeters.minecraft.chests.serialize.LocationInfo;
import com.jamesdpeters.minecraft.chests.serialize.MaterialSerializer;
import com.jamesdpeters.minecraft.chests.serialize.RecipeSerializable;
import com.jamesdpeters.minecraft.chests.serialize.SpigotConfig;
import com.jamesdpeters.minecraft.chests.storage.autocraft.AutoCraftingStorage;
import com.jamesdpeters.minecraft.chests.storage.autocraft.AutoCraftingStorageType;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorage;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorageType;
import com.jamesdpeters.minecraft.chests.versionchecker.UpdateChecker;
import fr.minuskube.inv.InventoryManager;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.event.HandlerList;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.java.annotation.command.Command;
import org.bukkit.plugin.java.annotation.command.Commands;
import org.bukkit.plugin.java.annotation.permission.Permission;
import org.bukkit.plugin.java.annotation.plugin.ApiVersion;
import org.bukkit.plugin.java.annotation.plugin.Description;
import org.bukkit.plugin.java.annotation.plugin.Plugin;
import org.bukkit.plugin.java.annotation.plugin.author.Author;
@Plugin(name = "ChestsPlusPlus", version = BuildConstants.VERSION)
@ApiVersion(ApiVersion.Target.v1_17)
@Description(value = "Minecraft Spigot mod that enhances chests and hoppers, with ChestLinks and Hopper filters!")
@Author(value = "jameslfc19")
@Commands({
@Command(name = "chestlink", desc = "Chests++ ChestLink Commands.", aliases = {"cl"}, usage = "Use /chestlink help for more info."),
@Command(name = "autocraft", desc = "Chests++ AutoCraft Commands.", aliases = {"ac"}, usage = "Use /autocraft help for more info."),
@Command(name = "chests++", desc = "Chests++ Commands.", aliases = {"c++"}, usage = "/chests++ version")})
@Permission(name = Permissions.ADD, desc = "Gives permission to add ChestLinks!", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.OPEN, desc = "Gives permission to open ChestLinks!", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.OPEN_REMOTE, desc = "Gives permission to remotely open ChestLinks!", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.MENU, desc = "Gives permission to open the ChestLink menu!", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.REMOVE, desc = "Gives permission to remove a ChestLink!", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.OPEN_ANY, desc = "Gives permission to open all chests/autocraft stations, for admin use.", defaultValue = PermissionDefault.OP)
@Permission(name = Permissions.MEMBER, desc = "Gives permission to add/remove a member to/from their chestlink.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.SORT, desc = "Gives permission to sort ChestLinks.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.AUTOCRAFT_OPEN, desc = "Gives permission to open AutoCrafting stations.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.AUTOCRAFT_OPEN_REMOTE, desc = "Gives permission to remotely open AutoCrafting stations.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.AUTOCRAFT_ADD, desc = "Gives permission to add AutoCrafting stations.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.AUTOCRAFT_REMOVE, desc = "Gives permission to remove AutoCrafting stations.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.PARTY_CREATE, desc = "Gives permission to create Chests++ parties.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.PARTY_ACCEPT_INVITE, desc = "Gives permission to accept Chests++ party invites.", defaultValue = PermissionDefault.TRUE)
@Permission(name = Permissions.PARTY_INVITE, desc = "Gives permission to invite players to Chests++ parties.", defaultValue = PermissionDefault.TRUE)
public class ChestsPlusPlus extends JavaPlugin {
public static JavaPlugin PLUGIN;
public static InventoryManager INVENTORY_MANAGER;
private static boolean boot = false;
static {
ConfigurationSerialization.registerClass(ConfigStorage.class, "ConfigStorage");
ConfigurationSerialization.registerClass(ChestLinkStorage.class, "ChestLinkStorage");
ConfigurationSerialization.registerClass(MaterialSerializer.class, "Material");
ConfigurationSerialization.registerClass(AutoCraftingStorage.class, "AutoCraftingStorage");
ConfigurationSerialization.registerClass(RecipeSerializable.class, "Recipe");
ConfigurationSerialization.registerClass(LocationInfo.class, "LocationInfo");
ConfigurationSerialization.registerClass(PlayerPartyStorage.class, "PlayerPartyStorage");
ConfigurationSerialization.registerClass(PlayerParty.class, "PlayerParty");
}
@Override
public void onEnable() {
int pluginId = 7166;
Metrics metrics = new Metrics(this, pluginId);
PLUGIN = this;
Utils.copyFromResources(getFile(), "lang");
PluginConfig.load(this);
LangFileProperties.loadLangFile(PluginConfig.LANG_FILE.get());
Stats.addCharts(metrics);
//API initialisation
ApiSpecific.init(this);
//Load storage
ServerType.init();
SpigotConfig.load(this);
INVENTORY_MANAGER = new InventoryManager(this);
INVENTORY_MANAGER.init();
if (PluginConfig.IS_UPDATE_CHECKER_ENABLED.get()) {
String BUKKIT_URL = "https://dev.bukkit.org/projects/chests-plus-plus/files";
UpdateChecker.init(this, 71355, UpdateChecker.VERSION_SCHEME_DECIMAL);
Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> UpdateChecker.get().requestUpdateCheck().whenCompleteAsync((updateResult, throwable) -> {
switch (updateResult.getReason()) {
case NEW_UPDATE:
Bukkit.broadcastMessage(ChatColor.RED + "[Chests++] New version of the plugin was found: " + updateResult.getNewestVersion());
Bukkit.broadcastMessage(ChatColor.RED + "[Chests++] Download at: " + ChatColor.WHITE + BUKKIT_URL);
break;
case UP_TO_DATE:
if (!boot) getLogger().info("Plugin is up to date! Thank you for supporting Chests++!");
break;
}
boot = true;
}), 0, PluginConfig.UPDATE_CHECKER_PERIOD.get() * 20);
}
//Load storages after load.
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
Crafting.load();
new Config();
getLogger().info("Chests++ Successfully Loaded Config and Recipes");
//LinkedChest
if (PluginConfig.CHESTLINKS_ENABLED.get()) {
new ChestLinkCommand().register(this);
getServer().getPluginManager().registerEvents(new LinkedChestHopperListener(), this);
}
//AutoCrafter
if (PluginConfig.AUTOCRAFTERS_ENABLED.get()) {
new AutoCraftCommand().register(this);
getServer().getPluginManager().registerEvents(new AutoCrafterListener(), this);
}
//HopperFilter
if (PluginConfig.HOPPER_FILTERS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(new HopperFilterListener(), this);
}
//Shared
if (PluginConfig.CHESTLINKS_ENABLED.get() || PluginConfig.AUTOCRAFTERS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(new StorageListener(), this);
getServer().getPluginManager().registerEvents(new InventoryListener(), this);
}
//Other
getServer().getPluginManager().registerEvents(new WorldListener(), this);
new ChestsPlusPlusCommand().register(this);
Config.getStorageTypes().forEach(storageType -> {
if (storageType instanceof AutoCraftingStorageType && PluginConfig.AUTOCRAFTERS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(storageType, this);
}
if (storageType instanceof ChestLinkStorageType && PluginConfig.CHESTLINKS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(storageType, this);
}
});
getServer().getPluginManager().registerEvents(ApiSpecific.getNmsProvider().getEntityEventListener(), this);
Bukkit.getWorlds().forEach(world -> ApiSpecific.getNmsProvider().getEntityEventListener().fixEntities(world));
getLogger().info("Chests++ enabled!");
}, 1);
}
@Override
public void onDisable() {
super.onDisable();
Config.save();
HandlerList.unregisterAll(this);
// //Remove entities that could have been left behind from bad save files/crashes etc.
// Utils.fixEntities();
}
}