SpigotInvTweaks/src/dev/w1zzrd/invtweaks/InvTweaksPlugin.java
2021-06-27 21:57:55 +02:00

237 lines
8.7 KiB
Java

package dev.w1zzrd.invtweaks;
import dev.w1zzrd.invtweaks.command.*;
import dev.w1zzrd.invtweaks.enchantment.CapitatorEnchantment;
import dev.w1zzrd.invtweaks.feature.NamedChestManager;
import dev.w1zzrd.invtweaks.listener.*;
import dev.w1zzrd.invtweaks.serialization.ChestNameConfig;
import dev.w1zzrd.invtweaks.serialization.MagnetConfig;
import dev.w1zzrd.invtweaks.serialization.MagnetData;
import dev.w1zzrd.invtweaks.serialization.SearchConfig;
import dev.w1zzrd.spigot.wizcompat.enchantment.EnchantmentRegistryEntry;
import dev.w1zzrd.spigot.wizcompat.enchantment.ServerEnchantmentRegistry;
import dev.w1zzrd.spigot.wizcompat.serialization.PersistentData;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Objects;
import java.util.logging.Logger;
/**
* Main plugin class
*/
public final class InvTweaksPlugin extends JavaPlugin {
/**
* Plugin logging tag. This should be prepended to any log messages sent by this plugin
*/
public static final String LOG_PLUGIN_NAME = "[InventoryTweaks]";
private static final String PERSISTENT_DATA_NAME = "data";
private static final String ENCHANTMENT_CAPITATOR_NAME = "Capitator";
private final Logger logger = Bukkit.getLogger();
// Command executor references in case I need them or something idk
private SortCommandExecutor sortCommandExecutor;
private MagnetCommandExecutor magnetCommandExecutor;
private SearchCommandExecutor searchCommandExecutor;
private NamedChestCommand namedChestCommandExecutor;
private FindCommandExecutor findCommandExecutor;
private CapitatorCommand capitatorCommand;
private PersistentData data;
private NamedChestManager chestManager;
private EnchantmentRegistryEntry<CapitatorEnchantment> capitatorEnchantment = null;
@Override
public void onEnable() {
logger.fine(LOG_PLUGIN_NAME + " Plugin enabled");
enablePersistentData();
initEnchantments();
initCommands();
initEvents();
}
@Override
public void onDisable() {
logger.fine(LOG_PLUGIN_NAME + " Plugin disabled");
disableEvents();
disableCommands();
disableEnchantments();
disablePersistentData();
}
@Override
public void reloadConfig() {
super.reloadConfig();
getConfig().options().copyDefaults(true);
if (magnetCommandExecutor != null)
magnetCommandExecutor.reloadConfig();
if (searchCommandExecutor != null)
searchCommandExecutor.reloadConfig();
}
/**
* Get a reference to the persistent data store object for this plugin
* @return An instance of {@link PersistentData} for this plugin
*/
public PersistentData getPersistentData() {
return data;
}
private void initEnchantments() {
if (getConfig().getBoolean("capitator", true))
capitatorEnchantment = ServerEnchantmentRegistry.registerEnchantment(
this,
new CapitatorEnchantment(
ENCHANTMENT_CAPITATOR_NAME,
new NamespacedKey(this, ENCHANTMENT_CAPITATOR_NAME)
)
);
}
private void disableEnchantments() {
if (getConfig().getBoolean("capitator", true))
ServerEnchantmentRegistry.unRegisterEnchantment(this, capitatorEnchantment);
capitatorEnchantment = null;
}
/**
* Initialize event listeners for this plugin
*/
private void initEvents() {
final boolean activateCapitator = getConfig().getBoolean("capitator", true);
final boolean activateGhostClick = getConfig().getBoolean("ghostClick", true);
final PluginManager pluginManager = getServer().getPluginManager();
if (activateGhostClick)
pluginManager.registerEvents(new GhostClickListener(), this);
pluginManager.registerEvents(new StackReplaceListener(this), this);
pluginManager.registerEvents(new SortListener(), this);
pluginManager.registerEvents(new MagnetismListener(magnetCommandExecutor), this);
pluginManager.registerEvents(new TabCompletionListener(), this);
pluginManager.registerEvents(new TreeCapitatorListener(activateCapitator ? capitatorEnchantment.getEnchantment() : null), this);
pluginManager.registerEvents(new PlayerMoveRenderListener(chestManager), this);
pluginManager.registerEvents(new ChestBreakListener(chestManager), this);
}
/**
* Do whatever is necessary to disable event listeners
*/
private void disableEvents() {
// Un-register all listeners
HandlerList.unregisterAll(this);
}
/**
* Initialize commands registered by this plugin
*/
private void initCommands() {
final boolean activateCapitator = getConfig().getBoolean("capitator", true);
sortCommandExecutor = new SortCommandExecutor();
magnetCommandExecutor = new MagnetCommandExecutor(this, "magnet", getPersistentData());
searchCommandExecutor = new SearchCommandExecutor(this, "search");
namedChestCommandExecutor = new NamedChestCommand(chestManager);
findCommandExecutor = new FindCommandExecutor(this);
if (activateCapitator)
capitatorCommand = new CapitatorCommand(capitatorEnchantment.getEnchantment());
// TODO: Bind command by annotation
Objects.requireNonNull(getCommand("sort")).setExecutor(sortCommandExecutor);
Objects.requireNonNull(getCommand("magnet")).setExecutor(magnetCommandExecutor);
Objects.requireNonNull(getCommand("search")).setExecutor(searchCommandExecutor);
Objects.requireNonNull(getCommand("chestname")).setExecutor(namedChestCommandExecutor);
Objects.requireNonNull(getCommand("find")).setExecutor(findCommandExecutor);
if (activateCapitator)
Objects.requireNonNull(getCommand("capitator")).setExecutor(capitatorCommand);
}
/**
* Do whatever is necessary to disable commands and their execution
*/
private void disableCommands() {
magnetCommandExecutor.onDisable();
capitatorCommand = null;
findCommandExecutor = null;
namedChestCommandExecutor = null;
searchCommandExecutor = null;
magnetCommandExecutor = null;
sortCommandExecutor = null;
}
/**
* Register type serializers/deserializers for configurations and YAML files
*
* @see #unregisterSerializers()
*/
private void registerSerializers() {
ConfigurationSerialization.registerClass(MagnetConfig.class);
ConfigurationSerialization.registerClass(MagnetData.class);
ConfigurationSerialization.registerClass(SearchConfig.class);
ConfigurationSerialization.registerClass(ChestNameConfig.class);
ConfigurationSerialization.registerClass(ChestNameConfig.ChestNameWorldEntry.class);
ConfigurationSerialization.registerClass(ChestNameConfig.ChestNameWorldEntry.ChestNameChunkEntry.class);
ConfigurationSerialization.registerClass(ChestNameConfig.ChestNameWorldEntry.ChestNameChunkEntry.ChestNameConfigEntry.class);
}
/**
* Unregister type serializers/deserializers for configurations and YAML files
*
* @see #registerSerializers()
*/
private void unregisterSerializers() {
ConfigurationSerialization.registerClass(ChestNameConfig.ChestNameWorldEntry.ChestNameChunkEntry.ChestNameConfigEntry.class);
ConfigurationSerialization.registerClass(ChestNameConfig.ChestNameWorldEntry.ChestNameChunkEntry.class);
ConfigurationSerialization.registerClass(ChestNameConfig.ChestNameWorldEntry.class);
ConfigurationSerialization.registerClass(ChestNameConfig.class);
ConfigurationSerialization.unregisterClass(MagnetConfig.class);
ConfigurationSerialization.unregisterClass(MagnetData.class);
ConfigurationSerialization.unregisterClass(SearchConfig.class);
}
/**
* Initialize persistent data storage sources and handlers
*/
private void enablePersistentData() {
registerSerializers();
getConfig().options().copyDefaults(true);
saveConfig();
// Implicit load
data = new PersistentData(PERSISTENT_DATA_NAME, this);
chestManager = new NamedChestManager(data);
}
/**
* De-activate and finalize persistent data storage sources and handlers
*/
private void disablePersistentData() {
chestManager = null;
data.saveData();
data = null;
//saveConfig();
unregisterSerializers();
}
}