diff --git a/build.gradle b/build.gradle index 0cb8cc8d..d6f991e5 100644 --- a/build.gradle +++ b/build.gradle @@ -84,7 +84,6 @@ dependencies { api 'net.minidev:json-smart:2.5.1' // Utils - api 'io.papermc:paperlib:1.0.7' api('com.dumptruckman.minecraft:Logging:1.1.1') { exclude group: 'junit', module: 'junit' } @@ -173,7 +172,6 @@ shadowJar { relocate 'com.dumptruckman.minecraft.util.Logging', 'org.mvplugins.multiverse.inventories.utils.InvLogging' relocate 'com.dumptruckman.minecraft.util.DebugLog', 'org.mvplugins.multiverse.inventories.utils.DebugFileLogger' relocate 'com.dumptruckman.bukkit.configuration', 'org.mvplugins.multiverse.inventories.utils.configuration' - relocate 'io.papermc.lib', 'org.mvplugins.multiverse.inventories.utils.paperlib' relocate 'net.minidev', 'org.mvplugins.multiverse.inventories.utils.minidev' configurations = [project.configurations.api] diff --git a/src/main/java/org/mvplugins/multiverse/inventories/CoreDebugListener.java b/src/main/java/org/mvplugins/multiverse/inventories/CoreDebugListener.java deleted file mode 100644 index 3e8e8394..00000000 --- a/src/main/java/org/mvplugins/multiverse/inventories/CoreDebugListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.mvplugins.multiverse.inventories; - -import com.dumptruckman.minecraft.util.Logging; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.mvplugins.multiverse.core.event.MVDebugModeEvent; - -public class CoreDebugListener implements Listener { - - CoreDebugListener(MultiverseInventories plugin) { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler - public void onDebugModeChange(MVDebugModeEvent event) { - Logging.setDebugLevel(event.getLevel()); - } -} diff --git a/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessageProvider.java b/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessageProvider.java index b34e5036..77ca906a 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessageProvider.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessageProvider.java @@ -1,5 +1,6 @@ package org.mvplugins.multiverse.inventories; +import org.jvnet.hk2.annotations.Contract; import org.mvplugins.multiverse.inventories.locale.LazyLocaleMessageProvider; import org.mvplugins.multiverse.inventories.locale.LocalizationLoadingException; import org.mvplugins.multiverse.inventories.locale.Message; @@ -23,6 +24,7 @@ /** * Implementation of MessageProvider. */ +@Contract class DefaultMessageProvider implements LazyLocaleMessageProvider { /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessager.java b/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessager.java index 35afe289..7cee3a00 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/DefaultMessager.java @@ -1,5 +1,8 @@ package org.mvplugins.multiverse.inventories; +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.inventories.locale.MessageProvider; import org.mvplugins.multiverse.inventories.locale.Messager; import org.mvplugins.multiverse.inventories.locale.Message; @@ -13,9 +16,11 @@ /** * Implementation of a Messager and MessageProvider using DefaultMessageProvider to implement the latter. */ +@Service final class DefaultMessager extends DefaultMessageProvider implements Messager, MessageProvider { - public DefaultMessager(JavaPlugin plugin) { + @Inject + public DefaultMessager(@NotNull MultiverseInventories plugin) { super(plugin); } @@ -32,7 +37,7 @@ private void send(Message message, String prefix, CommandSender sender, Object.. */ @Override public void bad(Message message, CommandSender sender, Object... args) { - send(message, ChatColor.RED.toString() + this.getMessage(Message.GENERIC_ERROR), sender, args); + send(message, ChatColor.RED + this.getMessage(Message.GENERIC_ERROR), sender, args); } /** @@ -48,7 +53,7 @@ public void normal(Message message, CommandSender sender, Object... args) { */ @Override public void good(Message message, CommandSender sender, Object... args) { - send(message, ChatColor.GREEN.toString() + this.getMessage(Message.GENERIC_SUCCESS), sender, args); + send(message, ChatColor.GREEN + this.getMessage(Message.GENERIC_SUCCESS), sender, args); } /** @@ -56,7 +61,7 @@ public void good(Message message, CommandSender sender, Object... args) { */ @Override public void info(Message message, CommandSender sender, Object... args) { - send(message, ChatColor.YELLOW.toString() + this.getMessage(Message.GENERIC_INFO), sender, args); + send(message, ChatColor.YELLOW + this.getMessage(Message.GENERIC_INFO), sender, args); } /** @@ -64,7 +69,7 @@ public void info(Message message, CommandSender sender, Object... args) { */ @Override public void help(Message message, CommandSender sender, Object... args) { - send(message, ChatColor.GRAY.toString() + this.getMessage(Message.GENERIC_HELP), sender, args); + send(message, ChatColor.GRAY + this.getMessage(Message.GENERIC_HELP), sender, args); } /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/InventoriesDupingPatch.java b/src/main/java/org/mvplugins/multiverse/inventories/InventoriesDupingPatch.java index c1473552..080ee1b6 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/InventoriesDupingPatch.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/InventoriesDupingPatch.java @@ -17,6 +17,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.InventoryHolder; import org.bukkit.plugin.Plugin; +import org.jvnet.hk2.annotations.Service; /** * This is a simple patch that fixes a @@ -40,7 +41,7 @@ * @author Irmo van den Berge (bergerkiller) * @version 1.0 */ -class InventoriesDupingPatch { +final class InventoriesDupingPatch { private static final int SLOT_TIMEOUT = 5; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventories.java b/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventories.java index 3b2c2f29..8e5f5645 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventories.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventories.java @@ -1,9 +1,9 @@ package org.mvplugins.multiverse.inventories; -import java.io.IOException; import java.util.Locale; import com.dumptruckman.minecraft.util.Logging; +import org.bukkit.entity.Player; import org.mvplugins.multiverse.core.MultiverseCoreApi; import org.mvplugins.multiverse.core.MultiversePlugin; import org.mvplugins.multiverse.core.config.MVCoreConfig; @@ -11,19 +11,21 @@ import org.mvplugins.multiverse.core.utils.StringFormatter; import org.mvplugins.multiverse.inventories.commands.InventoriesCommand; import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.listeners.InventoriesListener; +import org.mvplugins.multiverse.inventories.listeners.SpawnChangeListener; import org.mvplugins.multiverse.inventories.locale.Message; import org.mvplugins.multiverse.inventories.locale.Messager; import org.mvplugins.multiverse.inventories.locale.Messaging; import org.mvplugins.multiverse.inventories.migration.ImportManager; +import org.mvplugins.multiverse.inventories.profile.PersistingProfile; import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; -import org.mvplugins.multiverse.inventories.profile.WorldGroupManager; import org.mvplugins.multiverse.inventories.profile.container.ContainerType; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStore; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.util.Perm; import me.drayshak.WorldInventories.WorldInventories; import org.bukkit.Bukkit; -import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.mvplugins.multiverse.core.commandtools.MVCommandManager; @@ -42,39 +44,28 @@ public class MultiverseInventories extends MultiversePlugin implements Messaging private static final int PROTOCOL = 50; - private static MultiverseInventories inventoriesPlugin; - - public static MultiverseInventories getPlugin() { - return inventoriesPlugin; - } - - private PluginServiceLocator serviceLocator; - @Inject - private Provider configProvider; + private Provider inventoriesConfig; @Inject private Provider commandManager; @Inject private Provider mvCoreConfig; @Inject private Provider inventoriesListener; + @Inject + private Provider worldGroupManager; + @Inject + private Provider profileDataSource; + @Inject + private Provider profileContainerStoreProvider; + @Inject + private Provider importManager; + private PluginServiceLocator serviceLocator; private Messager messager = new DefaultMessager(this); - private WorldGroupManager worldGroupManager = null; - private ProfileContainerStore worldProfileContainerStore = null; - private ProfileContainerStore groupProfileContainerStore = null; - private final ImportManager importManager = new ImportManager(this); - - private FlatFileProfileDataSource data = null; - private InventoriesDupingPatch dupingPatch; - private boolean usingSpawnChangeEvent = false; - { - inventoriesPlugin = this; - } - public MultiverseInventories() { super(); } @@ -119,16 +110,13 @@ private void onMVPluginEnable() { this.reloadConfig(); try { - this.getMessager().setLocale(new Locale(this.getMVIConfig().getLocale())); + this.getMessager().setLocale(new Locale(inventoriesConfig.get().getLocale())); } catch (IllegalArgumentException e) { Logging.severe(e.getMessage()); this.getServer().getPluginManager().disablePlugin(this); return; } - // Initialize data class - //this.getWorldProfileContainerStore().setWorldProfiles(this.getData().getWorldProfiles()); - // Register Events Bukkit.getPluginManager().registerEvents(inventoriesListener.get(), this); try { @@ -141,8 +129,6 @@ private void onMVPluginEnable() { usingSpawnChangeEvent = false; } - new CoreDebugListener(this); - // Register Commands this.registerCommands(); @@ -162,11 +148,13 @@ public void onDisable() { super.onDisable(); for (final Player player : getServer().getOnlinePlayers()) { final String world = player.getWorld().getName(); - //getData().updateLastWorld(player.getName(), world); - if (getMVIConfig().usingLoggingSaveLoad()) { - ShareHandlingUpdater.updateProfile(this, player, new PersistingProfile(Sharables.allOf(), - getWorldProfileContainerStore().getContainer(world).getPlayerData(player))); - getData().setLoadOnLogin(player.getName(), true); + if (inventoriesConfig.get().usingLoggingSaveLoad()) { + ShareHandlingUpdater.updateProfile(this, player, new PersistingProfile( + Sharables.allOf(), + profileContainerStoreProvider.get().getStore(ContainerType.WORLD) + .getContainer(world) + .getPlayerData(player))); + profileDataSource.get().setLoadOnLogin(player.getName(), true); } } @@ -188,21 +176,14 @@ private void hookImportables() { final PluginManager pm = Bukkit.getPluginManager(); Plugin plugin = pm.getPlugin("MultiInv"); if (plugin != null) { - this.getImportManager().hookMultiInv((MultiInv) plugin); + importManager.get().hookMultiInv((MultiInv) plugin); } plugin = pm.getPlugin("WorldInventories"); if (plugin != null) { - this.getImportManager().hookWorldInventories((WorldInventories) plugin); + importManager.get().hookWorldInventories((WorldInventories) plugin); } } - /** - * @return A class used for managing importing data from other similar plugins. - */ - public ImportManager getImportManager() { - return this.importManager; - } - /** * {@inheritDoc} */ @@ -219,60 +200,24 @@ public PluginServiceLocator getServiceLocator() { return serviceLocator; } - /** - * Builds a String containing Multiverse-Inventories' version info. - * - * @return The version info. - */ - public String getVersionInfo() { - StringBuilder versionInfo = new StringBuilder("[Multiverse-Inventories] Multiverse-Inventories Version: " + this.getDescription().getVersion() + '\n' - + "[Multiverse-Inventories] === Settings ===" + '\n' - + "[Multiverse-Inventories] First Run: " + this.getMVIConfig().isFirstRun() + '\n' - + "[Multiverse-Inventories] Using Bypass: " + this.getMVIConfig().isUsingBypass() + '\n' - + "[Multiverse-Inventories] Default Ungrouped Worlds: " + this.getMVIConfig().isDefaultingUngroupedWorlds() + '\n' - + "[Multiverse-Inventories] Save and Load on Log In and Out: " + this.getMVIConfig().usingLoggingSaveLoad() + '\n' - + "[Multiverse-Inventories] Using GameMode Profiles: " + this.getMVIConfig().isUsingGameModeProfiles() + '\n' - + "[Multiverse-Inventories] === Shares ===" + '\n' - + "[Multiverse-Inventories] Optionals for Ungrouped Worlds: " + this.getMVIConfig().usingOptionalsForUngrouped() + '\n' - + "[Multiverse-Inventories] Enabled Optionals: " + this.getMVIConfig().getOptionalShares() + '\n' - + "[Multiverse-Inventories] === Groups ===" + '\n'); - - for (WorldGroup group : this.getGroupManager().getGroups()) { - versionInfo.append("[Multiverse-Inventories] ").append(group.toString()).append('\n'); - } - - return versionInfo.toString(); - } - - private String logAndAddToPasteBinBuffer(String string) { - Logging.info(string); - return Logging.getPrefixedMessage(string + '\n', false); - } - - /** - * @return the Config object which contains settings for this plugin. - */ - public InventoriesConfig getMVIConfig() { - return this.configProvider.get(); - } - /** * Nulls the config object and reloads a new one, also resetting the world groups in memory. */ @Override public void reloadConfig() { try { - this.worldGroupManager = new YamlWorldGroupManager(this, this.configProvider.get().getConfig()); - this.worldProfileContainerStore = new WeakProfileContainerStore(this, ContainerType.WORLD); - this.groupProfileContainerStore = new WeakProfileContainerStore(this, ContainerType.GROUP); + worldGroupManager.get().load().onFailure(e -> { + Logging.severe("Failed to load world groups!"); + Logging.severe(e.getMessage()); + }); + profileContainerStoreProvider.get().clearCache(); - if (data != null) { - this.data.clearCache(); + if (profileDataSource.get() != null) { + profileDataSource.get().clearAllCache(); } - //this.data = null; Logging.fine("Loaded config file!"); - } catch (IOException e) { // Catch errors loading the config file and exit out if found. + } catch (Exception e) { // Catch errors loading the config file and exit out if found. Logging.severe(this.getMessager().getMessage(Message.ERROR_CONFIG_LOAD)); Logging.severe(e.getMessage()); Bukkit.getPluginManager().disablePlugin(this); @@ -283,37 +228,19 @@ public void reloadConfig() { @Override public void run() { // Create initial World Group for first run IF NO GROUPS EXIST - if (getMVIConfig().isFirstRun()) { + if (inventoriesConfig.get().isFirstRun()) { Logging.info("First run!"); - if (getGroupManager().getGroups().isEmpty()) { - getGroupManager().createDefaultGroup(); + if (worldGroupManager.get().getGroups().isEmpty()) { + worldGroupManager.get().createDefaultGroup(); } - getMVIConfig().setFirstRun(false); + inventoriesConfig.get().setFirstRun(false); } - getGroupManager().checkForConflicts(null); + worldGroupManager.get().checkForConflicts(null); } }, 1L); } - /** - * @return the PlayerData object which contains data for this plugin. - */ - public ProfileDataSource getData() { - if (this.data == null) { - // Loads the data - try { - this.data = new FlatFileProfileDataSource(this); - } catch (IOException e) { // Catch errors loading the language file and exit out if found. - Logging.severe(this.getMessager().getMessage(Message.ERROR_DATA_LOAD)); - Logging.severe(e.getMessage()); - Bukkit.getPluginManager().disablePlugin(this); - return null; - } - } - return this.data; - } - /** * {@inheritDoc} */ @@ -333,33 +260,6 @@ public void setMessager(Messager messager) { this.messager = messager; } - /** - * @return The World Group manager for this plugin. - */ - public WorldGroupManager getGroupManager() { - return this.worldGroupManager; - } - - /** - * Returns the world profile container store for this plugin. - *

Player profiles for an individual world can be found here.

- * - * @return the world profile container store for this plugin. - */ - public ProfileContainerStore getWorldProfileContainerStore() { - return worldProfileContainerStore; - } - - /** - * Returns the group profile container store for this plugin. - *

Player profiles for a world group can be found here.

- * - * @return the group profile container store for this plugin. - */ - public ProfileContainerStore getGroupProfileContainerStore() { - return groupProfileContainerStore; - } - public boolean isUsingSpawnChangeEvent() { return usingSpawnChangeEvent; } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventoriesPluginBinder.java b/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventoriesPluginBinder.java index dffbe4fd..18f7000f 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventoriesPluginBinder.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventoriesPluginBinder.java @@ -5,9 +5,9 @@ import org.mvplugins.multiverse.external.glassfish.hk2.utilities.binding.ScopedBindingBuilder; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; -public class MultiverseInventoriesPluginBinder extends JavaPluginBinder { +final class MultiverseInventoriesPluginBinder extends JavaPluginBinder { - protected MultiverseInventoriesPluginBinder(@NotNull MultiverseInventories plugin) { + MultiverseInventoriesPluginBinder(@NotNull MultiverseInventories plugin) { super(plugin); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/ShareHandlingUpdater.java b/src/main/java/org/mvplugins/multiverse/inventories/ShareHandlingUpdater.java index 555f3aed..bf450ead 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/ShareHandlingUpdater.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/ShareHandlingUpdater.java @@ -1,6 +1,9 @@ package org.mvplugins.multiverse.inventories; import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.PersistingProfile; +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; import org.mvplugins.multiverse.inventories.profile.container.ContainerType; import org.mvplugins.multiverse.inventories.share.Sharable; import org.mvplugins.multiverse.inventories.share.Sharables; @@ -11,15 +14,15 @@ import java.util.Objects; import java.util.stream.Collectors; -class ShareHandlingUpdater { +public final class ShareHandlingUpdater { - static void updateProfile(final MultiverseInventories inventories, + public static void updateProfile(final MultiverseInventories inventories, final Player player, final PersistingProfile profile) { new ShareHandlingUpdater(inventories, player, profile).updateProfile(); } - static void updatePlayer(final MultiverseInventories inventories, + public static void updatePlayer(final MultiverseInventories inventories, final Player player, final PersistingProfile profile) { new ShareHandlingUpdater(inventories, player, profile).updatePlayer(); @@ -53,7 +56,7 @@ private void updateProfile() { + " (" + profile.getProfile().getProfileType() + ")" + " for player " + profile.getProfile().getPlayer().getName()); } - inventories.getData().updatePlayerData(profile.getProfile()); + inventories.getServiceLocator().getService(ProfileDataSource.class).updatePlayerData(profile.getProfile()); } private void updatePlayer() { @@ -82,13 +85,14 @@ private void updatePlayer() { } private boolean isSharableUsed(Sharable sharable) { + var config = inventories.getServiceLocator().getService(InventoriesConfig.class); if (sharable.isOptional()) { - if (!inventories.getMVIConfig().getOptionalShares().contains(sharable)) { + if (!config.getOptionalShares().contains(sharable)) { Logging.finest("Ignoring optional share: " + sharable.getNames()[0]); return false; } if (profile.getProfile().getContainerType() == ContainerType.WORLD - && !inventories.getMVIConfig().usingOptionalsForUngrouped()) { + && !config.usingOptionalsForUngrouped()) { Logging.finest("Ignoring optional share '" + sharable.getNames()[0] + "' for ungrouped world!"); return false; } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/WeakProfileContainer.java b/src/main/java/org/mvplugins/multiverse/inventories/WeakProfileContainer.java deleted file mode 100644 index a62aed92..00000000 --- a/src/main/java/org/mvplugins/multiverse/inventories/WeakProfileContainer.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.mvplugins.multiverse.inventories; - -import com.dumptruckman.minecraft.util.Logging; -import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; -import org.mvplugins.multiverse.inventories.profile.ProfileKey; -import org.mvplugins.multiverse.inventories.profile.WorldGroupManager; -import org.mvplugins.multiverse.inventories.profile.ProfileTypes; -import org.mvplugins.multiverse.inventories.profile.container.ContainerType; -import org.mvplugins.multiverse.inventories.profile.PlayerProfile; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; -import org.mvplugins.multiverse.inventories.profile.ProfileType; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStore; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; -import java.util.WeakHashMap; - -/** - * Implementation of ProfileContainer using WeakHashMaps to keep memory usage to a minimum. - */ -final class WeakProfileContainer implements ProfileContainer { - - private Map> playerData = new WeakHashMap<>(); - private final MultiverseInventories inventories; - private final String name; - private final ContainerType type; - - WeakProfileContainer(MultiverseInventories inventories, String name, ContainerType type) { - this.inventories = inventories; - this.name = name; - this.type = type; - } - - /** - * Gets the stored profiles for this player, mapped by ProfileType. - * - * @param name The name of player to get profile map for. - * @return The profile map for the given player. - */ - protected Map getPlayerData(String name) { - return this.playerData.computeIfAbsent(name, k -> new HashMap<>()); - } - - protected ProfileDataSource getDataSource() { - return this.getInventories().getData(); - } - - protected WorldGroupManager getGroupManager() { - return this.getInventories().getGroupManager(); - } - - protected ProfileContainerStore getProfileManager() { - return this.getInventories().getWorldProfileContainerStore(); - } - - protected MultiverseInventories getInventories() { - return this.inventories; - } - - @Override - public PlayerProfile getPlayerData(Player player) { - ProfileType type; - if (inventories.getMVIConfig().isUsingGameModeProfiles()) { - type = ProfileTypes.forGameMode(player.getGameMode()); - } else { - type = ProfileTypes.SURVIVAL; - } - return getPlayerData(type, player); - } - - @Override - public PlayerProfile getPlayerData(ProfileType profileType, OfflinePlayer player) { - Map profileMap = this.getPlayerData(player.getName()); - PlayerProfile playerProfile = profileMap.get(profileType); - if (playerProfile == null) { - playerProfile = getDataSource().getPlayerData(getContainerType(), - getContainerName(), profileType, player.getUniqueId()); - Logging.finer("[%s - %s - %s - %s] not cached, loading from disk...", - profileType, getContainerType(), playerProfile.getContainerName(), player.getName()); - profileMap.put(profileType, playerProfile); - } - return playerProfile; - } - - @Override - public void addPlayerData(PlayerProfile playerProfile) { - this.getPlayerData(playerProfile.getPlayer().getName()).put(playerProfile.getProfileType(), playerProfile); - } - - @Override - public void removeAllPlayerData(OfflinePlayer player) { - this.getPlayerData(player.getName()).clear(); - this.getDataSource().removePlayerData(getContainerType(), getContainerName(), null, player.getName()); - } - - @Override - public void removePlayerData(ProfileType profileType, OfflinePlayer player) { - this.getPlayerData(player.getName()).remove(profileType); - this.getDataSource().removePlayerData(getContainerType(), getContainerName(), profileType, player.getName()); - } - - @Override - public String getContainerName() { - return name; - } - - @Override - public ContainerType getContainerType() { - return type; - } - - @Override - public void clearContainer() { - for (Map profiles : playerData.values()) { - for (PlayerProfile profile : profiles.values()) { - this.getDataSource().clearProfileCache(ProfileKey.createProfileKey(profile)); - } - } - this.playerData.clear(); - } -} diff --git a/src/main/java/org/mvplugins/multiverse/inventories/WeakProfileContainerStore.java b/src/main/java/org/mvplugins/multiverse/inventories/WeakProfileContainerStore.java deleted file mode 100644 index e693b63e..00000000 --- a/src/main/java/org/mvplugins/multiverse/inventories/WeakProfileContainerStore.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.mvplugins.multiverse.inventories; - -import org.mvplugins.multiverse.inventories.profile.container.ContainerType; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStore; - -import java.util.Map; -import java.util.WeakHashMap; - -final class WeakProfileContainerStore implements ProfileContainerStore { - - private final Map containers = new WeakHashMap<>(); - - private final MultiverseInventories inventories; - private final ContainerType containerType; - - WeakProfileContainerStore(MultiverseInventories inventories, ContainerType containerType) { - this.inventories = inventories; - this.containerType = containerType; - } - - private MultiverseInventories getInventories() { - return this.inventories; - } - - @Override - public void addContainer(ProfileContainer container) { - this.containers.put(container.getContainerName().toLowerCase(), container); - } - - @Override - public ProfileContainer getContainer(String containerName) { - ProfileContainer container = this.containers.get(containerName.toLowerCase()); - if (container == null) { - container = new WeakProfileContainer(this.getInventories(), containerName, containerType); - addContainer(container); - } - return container; - } -} - diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/InfoCommand.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/InfoCommand.java index 8d548a38..c0f55b1c 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/InfoCommand.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/InfoCommand.java @@ -1,9 +1,10 @@ package org.mvplugins.multiverse.inventories.commands; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.container.ContainerType; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -19,6 +20,8 @@ import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import java.util.List; import java.util.Set; @@ -28,11 +31,19 @@ class InfoCommand extends InventoriesCommand { private final MultiverseInventories plugin; + private final ProfileContainerStoreProvider profileContainerStoreProvider; + private final WorldGroupManager worldGroupManager; @Inject - InfoCommand(@NotNull MVCommandManager commandManager, @NotNull MultiverseInventories plugin) { + InfoCommand( + @NotNull MVCommandManager commandManager, + @NotNull MultiverseInventories plugin, + @NotNull ProfileContainerStoreProvider profileContainerStoreProvider, + @NotNull WorldGroupManager worldGroupManager) { super(commandManager); this.plugin = plugin; + this.profileContainerStoreProvider = profileContainerStoreProvider; + this.worldGroupManager = worldGroupManager; } @CommandAlias("mvinvinfo|mvinvi") @@ -58,14 +69,14 @@ void onInfoCommand( name = ((Player) sender).getWorld().getName(); } - ProfileContainer worldProfileContainer = this.plugin.getWorldProfileContainerStore().getContainer(name); + ProfileContainer worldProfileContainer = profileContainerStoreProvider.getStore(ContainerType.WORLD).getContainer(name); plugin.getMessager().normal(Message.INFO_WORLD, sender, name); if (worldProfileContainer != null && Bukkit.getWorld(worldProfileContainer.getContainerName()) != null) { worldInfo(sender, worldProfileContainer); } else { plugin.getMessager().normal(Message.ERROR_NO_WORLD_PROFILE, sender, name); } - WorldGroup worldGroup = this.plugin.getGroupManager().getGroup(name); + WorldGroup worldGroup = worldGroupManager.getGroup(name); this.plugin.getMessager().normal(Message.INFO_GROUP, sender, name); if (worldGroup != null) { this.groupInfo(sender, worldGroup); @@ -93,8 +104,7 @@ private void groupInfo(CommandSender sender, WorldGroup worldGroup) { private void worldInfo(CommandSender sender, ProfileContainer worldProfileContainer) { StringBuilder groupsString = new StringBuilder(); - List worldGroups = this.plugin.getGroupManager() - .getGroupsForWorld(worldProfileContainer.getContainerName()); + List worldGroups = worldGroupManager.getGroupsForWorld(worldProfileContainer.getContainerName()); if (worldGroups.isEmpty()) { groupsString.append("N/A"); diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/ListCommand.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/ListCommand.java index 3c7a5b47..a86c013d 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/ListCommand.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/ListCommand.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; import org.bukkit.command.CommandSender; import org.mvplugins.multiverse.core.commandtools.MVCommandManager; @@ -12,6 +12,7 @@ import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import java.util.Collection; @@ -20,11 +21,16 @@ class ListCommand extends InventoriesCommand { private final MultiverseInventories plugin; + private final WorldGroupManager worldGroupManager; @Inject - ListCommand(@NotNull MVCommandManager commandManager, @NotNull MultiverseInventories plugin) { + ListCommand( + @NotNull MVCommandManager commandManager, + @NotNull MultiverseInventories plugin, + @NotNull WorldGroupManager worldGroupManager) { super(commandManager); this.plugin = plugin; + this.worldGroupManager = worldGroupManager; } @CommandAlias("mvinvlist|mvinvl") @@ -32,7 +38,7 @@ class ListCommand extends InventoriesCommand { @CommandPermission("multiverse.inventories.list") @Description("World and Group Information") void onListCommand(@NotNull CommandSender sender) { - Collection groups = this.plugin.getGroupManager().getGroups(); + Collection groups = worldGroupManager.getGroups(); String groupsString = "N/A"; if (!groups.isEmpty()) { StringBuilder builder = new StringBuilder(); diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/ToggleCommand.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/ToggleCommand.java index afd70136..1348a895 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/ToggleCommand.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/ToggleCommand.java @@ -1,6 +1,7 @@ package org.mvplugins.multiverse.inventories.commands; import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; import org.mvplugins.multiverse.inventories.locale.Message; import org.mvplugins.multiverse.inventories.share.Sharable; import org.mvplugins.multiverse.inventories.share.Sharables; @@ -23,11 +24,16 @@ class ToggleCommand extends InventoriesCommand { private final MultiverseInventories plugin; + private final InventoriesConfig inventoriesConfig; @Inject - ToggleCommand(MVCommandManager commandManager, @NotNull MultiverseInventories plugin) { + ToggleCommand( + @NotNull MVCommandManager commandManager, + @NotNull MultiverseInventories plugin, + @NotNull InventoriesConfig inventoriesConfig) { super(commandManager); this.plugin = plugin; + this.inventoriesConfig = inventoriesConfig; } @CommandAlias("mvinvtoggle") @@ -53,17 +59,17 @@ void onToggleCommand( for (Sharable sharable : shares) { if (sharable.isOptional()) { foundOpt = true; - if (this.plugin.getMVIConfig().getOptionalShares().contains(sharable)) { - this.plugin.getMVIConfig().getOptionalShares().remove(sharable); + if (inventoriesConfig.getOptionalShares().contains(sharable)) { + inventoriesConfig.getOptionalShares().remove(sharable); this.plugin.getMessager().normal(Message.NOW_NOT_USING_OPTIONAL, sender, sharable.getNames()[0]); } else { - this.plugin.getMVIConfig().getOptionalShares().add(sharable); + inventoriesConfig.getOptionalShares().add(sharable); this.plugin.getMessager().normal(Message.NOW_USING_OPTIONAL, sender, sharable.getNames()[0]); } } } if (foundOpt) { - this.plugin.getMVIConfig().save(); + inventoriesConfig.save(); } else { this.plugin.getMessager().normal(Message.NO_OPTIONAL_SHARES, sender, shareName); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupCreatePrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupCreatePrompt.java index c473178b..017e9a5c 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupCreatePrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupCreatePrompt.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands.prompts; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; import org.bukkit.command.CommandSender; import org.bukkit.conversations.ConversationContext; @@ -20,13 +20,13 @@ public String getPromptText(final ConversationContext conversationContext) { @Override public Prompt acceptInput(final ConversationContext conversationContext, final String s) { - final WorldGroup group = plugin.getGroupManager().getGroup(s); + final WorldGroup group = worldGroupManager.getGroup(s); if (group == null) { if (s.isEmpty() || !s.matches("^[a-zA-Z0-9][a-zA-Z0-9_]*$")) { messager.normal(Message.GROUP_INVALID_NAME, sender); return this; } - final WorldGroup newGroup = plugin.getGroupManager().newEmptyGroup(s); + final WorldGroup newGroup = worldGroupManager.newEmptyGroup(s); return new GroupWorldsPrompt(plugin, sender, newGroup, new GroupSharesPrompt(plugin, sender, newGroup, Prompt.END_OF_CONVERSATION, true), true); } else { diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupDeletePrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupDeletePrompt.java index a1e64b8b..ff7ba782 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupDeletePrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupDeletePrompt.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands.prompts; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -17,7 +17,7 @@ public GroupDeletePrompt(final MultiverseInventories plugin, final CommandSender @Override public String getPromptText(final ConversationContext conversationContext) { final StringBuilder builder = new StringBuilder(); - for (WorldGroup group : plugin.getGroupManager().getGroups()) { + for (WorldGroup group : worldGroupManager.getGroups()) { if (builder.length() == 0) { builder.append(ChatColor.WHITE); } else { @@ -30,11 +30,11 @@ public String getPromptText(final ConversationContext conversationContext) { @Override public Prompt acceptInput(final ConversationContext conversationContext, final String s) { - final WorldGroup group = plugin.getGroupManager().getGroup(s); + final WorldGroup group = worldGroupManager.getGroup(s); if (group == null) { messager.normal(Message.ERROR_NO_GROUP, sender, s); } else { - plugin.getGroupManager().removeGroup(group); + worldGroupManager.removeGroup(group); messager.normal(Message.GROUP_REMOVED, sender, s); } return Prompt.END_OF_CONVERSATION; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupEditPrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupEditPrompt.java index 67f1b439..0bae766e 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupEditPrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupEditPrompt.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands.prompts; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -17,7 +17,7 @@ public GroupEditPrompt(final MultiverseInventories plugin, final CommandSender s @Override public String getPromptText(final ConversationContext conversationContext) { final StringBuilder builder = new StringBuilder(); - for (WorldGroup group : plugin.getGroupManager().getGroups()) { + for (WorldGroup group : worldGroupManager.getGroups()) { if (builder.length() == 0) { builder.append(ChatColor.WHITE); } else { @@ -30,7 +30,7 @@ public String getPromptText(final ConversationContext conversationContext) { @Override public Prompt acceptInput(final ConversationContext conversationContext, final String s) { - final WorldGroup group = plugin.getGroupManager().getGroup(s); + final WorldGroup group = worldGroupManager.getGroup(s); if (group == null) { messager.normal(Message.ERROR_NO_GROUP, sender, s); } else { diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupModifyPrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupModifyPrompt.java index 17952186..1308957c 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupModifyPrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupModifyPrompt.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands.prompts; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; import org.bukkit.command.CommandSender; import org.bukkit.conversations.ConversationContext; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupSharesPrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupSharesPrompt.java index f20d8668..b6ecb217 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupSharesPrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupSharesPrompt.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands.prompts; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.share.Sharable; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.share.Shares; @@ -47,7 +47,7 @@ public Prompt acceptInput(final ConversationContext conversationContext, final S if (s.equals("@")) { group.getShares().clear(); group.getShares().addAll(this.shares); - plugin.getGroupManager().updateGroup(group); + worldGroupManager.updateGroup(group); if (isCreating) { messager.normal(Message.GROUP_CREATION_COMPLETE, sender); } else { @@ -55,7 +55,7 @@ public Prompt acceptInput(final ConversationContext conversationContext, final S } messager.normal(Message.INFO_GROUP, sender, group.getName()); messager.normal(Message.INFO_GROUPS_INFO, sender, group.getWorlds(), group.getShares()); - plugin.getGroupManager().checkForConflicts(sender); + worldGroupManager.checkForConflicts(sender); return nextPrompt; } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupWorldsPrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupWorldsPrompt.java index 6050ecbf..bcb1bcaf 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupWorldsPrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/GroupWorldsPrompt.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.commands.prompts; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.locale.Message; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -54,7 +54,7 @@ public Prompt acceptInput(final ConversationContext conversationContext, final S group.removeAllWorlds(false); group.addWorlds(worlds, false); if (!isCreating) { - plugin.getGroupManager().updateGroup(group); + worldGroupManager.updateGroup(group); messager.normal(Message.GROUP_UPDATED, sender); messager.normal(Message.INFO_GROUP, sender, group.getName()); messager.normal(Message.INFO_GROUPS_INFO, sender, group.getWorlds(), group.getShares()); diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/InventoriesPrompt.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/InventoriesPrompt.java index c3ed4c52..b1a00c7e 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/InventoriesPrompt.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/InventoriesPrompt.java @@ -5,10 +5,12 @@ import org.bukkit.command.CommandSender; import org.bukkit.conversations.ConversationContext; import org.bukkit.conversations.Prompt; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; abstract class InventoriesPrompt implements Prompt { protected final MultiverseInventories plugin; + protected final WorldGroupManager worldGroupManager; protected final Messager messager; protected final CommandSender sender; @@ -16,6 +18,7 @@ abstract class InventoriesPrompt implements Prompt { this.plugin = plugin; this.messager = plugin.getMessager(); this.sender = sender; + this.worldGroupManager = this.plugin.getServiceLocator().getService(WorldGroupManager.class); } @Override diff --git a/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/package-info.java b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/package-info.java new file mode 100644 index 00000000..474860af --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/inventories/commands/prompts/package-info.java @@ -0,0 +1 @@ +package org.mvplugins.multiverse.inventories.commands.prompts; \ No newline at end of file diff --git a/src/main/java/org/mvplugins/multiverse/inventories/config/InventoriesConfig.java b/src/main/java/org/mvplugins/multiverse/inventories/config/InventoriesConfig.java index eb045d4b..0c0ef631 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/config/InventoriesConfig.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/config/InventoriesConfig.java @@ -9,7 +9,6 @@ import org.mvplugins.multiverse.inventories.share.Sharable; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.share.Shares; -import io.papermc.lib.PaperLib; import org.bukkit.configuration.file.FileConfiguration; import java.io.File; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/config/package-info.java b/src/main/java/org/mvplugins/multiverse/inventories/config/package-info.java new file mode 100644 index 00000000..e8e69681 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/inventories/config/package-info.java @@ -0,0 +1 @@ +package org.mvplugins.multiverse.inventories.config; \ No newline at end of file diff --git a/src/main/java/org/mvplugins/multiverse/inventories/event/GameModeChangeShareHandlingEvent.java b/src/main/java/org/mvplugins/multiverse/inventories/event/GameModeChangeShareHandlingEvent.java index 2a397f1d..26c43d77 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/event/GameModeChangeShareHandlingEvent.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/event/GameModeChangeShareHandlingEvent.java @@ -1,6 +1,6 @@ package org.mvplugins.multiverse.inventories.event; -import org.mvplugins.multiverse.inventories.ShareHandler; +import org.mvplugins.multiverse.inventories.listeners.ShareHandler; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/event/ShareHandlingEvent.java b/src/main/java/org/mvplugins/multiverse/inventories/event/ShareHandlingEvent.java index caea8b93..ef07ad7b 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/event/ShareHandlingEvent.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/event/ShareHandlingEvent.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.inventories.event; -import org.mvplugins.multiverse.inventories.PersistingProfile; -import org.mvplugins.multiverse.inventories.ShareHandler; +import org.mvplugins.multiverse.inventories.profile.PersistingProfile; +import org.mvplugins.multiverse.inventories.listeners.ShareHandler; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/event/WorldChangeShareHandlingEvent.java b/src/main/java/org/mvplugins/multiverse/inventories/event/WorldChangeShareHandlingEvent.java index 71266aa3..f2a715a0 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/event/WorldChangeShareHandlingEvent.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/event/WorldChangeShareHandlingEvent.java @@ -1,6 +1,6 @@ package org.mvplugins.multiverse.inventories.event; -import org.mvplugins.multiverse.inventories.ShareHandler; +import org.mvplugins.multiverse.inventories.listeners.ShareHandler; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/GameModeShareHandler.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/GameModeShareHandler.java similarity index 83% rename from src/main/java/org/mvplugins/multiverse/inventories/GameModeShareHandler.java rename to src/main/java/org/mvplugins/multiverse/inventories/listeners/GameModeShareHandler.java index c8864648..39cfd96d 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/GameModeShareHandler.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/GameModeShareHandler.java @@ -1,6 +1,8 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.event.GameModeChangeShareHandlingEvent; import org.mvplugins.multiverse.inventories.event.ShareHandlingEvent; import org.mvplugins.multiverse.inventories.profile.ProfileType; @@ -23,25 +25,23 @@ final class GameModeShareHandler extends ShareHandler { private final ProfileType fromType; private final ProfileType toType; private final String world; - private final ProfileContainer worldProfileContainer; private final List worldGroups; GameModeShareHandler(MultiverseInventories inventories, Player player, - GameMode fromGameMode, GameMode toGameMode) { + GameMode fromGameMode, GameMode toGameMode) { super(inventories, player); this.fromGameMode = fromGameMode; this.toGameMode = toGameMode; this.fromType = ProfileTypes.forGameMode(fromGameMode); this.toType = ProfileTypes.forGameMode(toGameMode); this.world = player.getWorld().getName(); - this.worldProfileContainer = inventories.getWorldProfileContainerStore().getContainer(world); this.worldGroups = getAffectedWorldGroups(); prepareProfiles(); } private List getAffectedWorldGroups() { - return this.inventories.getGroupManager().getGroupsForWorld(world); + return worldGroupManager.getGroupsForWorld(world); } @Override @@ -53,7 +53,7 @@ private void prepareProfiles() { Logging.finer("=== " + player.getName() + " changing game mode from: " + fromType + " to: " + toType + " for world: " + world + " ==="); - setAlwaysWriteProfile(worldProfileContainer.getPlayerData(fromType, player)); + setAlwaysWriteProfile(worldProfileContainerStore.getContainer(world).getPlayerData(fromType, player)); if (isPlayerAffectedByChange()) { addProfiles(); @@ -78,7 +78,8 @@ private void addProfiles() { worldGroups.forEach(this::addProfilesForWorldGroup); } else { Logging.finer("No groups for world."); - addReadProfile(worldProfileContainer.getPlayerData(toType, player), Sharables.allOf()); + addReadProfile(worldProfileContainerStore.getContainer(world).getPlayerData(toType, player), + Sharables.allOf()); } } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/InventoriesListener.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/InventoriesListener.java similarity index 71% rename from src/main/java/org/mvplugins/multiverse/inventories/InventoriesListener.java rename to src/main/java/org/mvplugins/multiverse/inventories/listeners/InventoriesListener.java index 70999bc1..78a26eda 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/InventoriesListener.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/InventoriesListener.java @@ -1,4 +1,4 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; import org.jvnet.hk2.annotations.Service; @@ -7,9 +7,20 @@ import org.mvplugins.multiverse.core.event.MVDumpsDebugInfoEvent; import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; import org.mvplugins.multiverse.core.world.WorldManager; +import org.mvplugins.multiverse.external.jakarta.inject.Provider; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.ShareHandlingUpdater; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.migration.ImportManager; +import org.mvplugins.multiverse.inventories.profile.PersistingProfile; +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; +import org.mvplugins.multiverse.inventories.profile.container.ContainerType; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.profile.GlobalProfile; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import org.mvplugins.multiverse.inventories.share.Sharables; import me.drayshak.WorldInventories.WorldInventories; import org.bukkit.Bukkit; @@ -51,15 +62,31 @@ public class InventoriesListener implements Listener { private final MultiverseInventories inventories; + private final InventoriesConfig config; private final WorldManager worldManager; + private final WorldGroupManager worldGroupManager; + private final ProfileDataSource profileDataSource; + private final ProfileContainerStoreProvider profileContainerStoreProvider; + private final Provider importManager; private List currentGroups; private Location spawnLoc = null; @Inject - InventoriesListener(@NotNull MultiverseInventories inventories, @NotNull WorldManager worldManager) { + InventoriesListener( + @NotNull MultiverseInventories inventories, InventoriesConfig config, + @NotNull WorldManager worldManager, + @NotNull WorldGroupManager worldGroupManager, + @NotNull ProfileDataSource profileDataSource, + @NotNull ProfileContainerStoreProvider profileContainerStoreProvider, + @NotNull Provider importManager) { this.inventories = inventories; + this.config = config; this.worldManager = worldManager; + this.worldGroupManager = worldGroupManager; + this.profileDataSource = profileDataSource; + this.profileContainerStoreProvider = profileContainerStoreProvider; + this.importManager = importManager; } /** @@ -69,13 +96,38 @@ public class InventoriesListener implements Listener { */ @EventHandler public void dumpsDebugInfoRequest(MVDumpsDebugInfoEvent event) { - event.appendDebugInfo(this.inventories.getVersionInfo()); + event.appendDebugInfo(getDebugInfo()); File configFile = new File(this.inventories.getDataFolder(), "config.yml"); File groupsFile = new File(this.inventories.getDataFolder(), "groups.yml"); event.putDetailedDebugInfo("multiverse-inventories/config.yml", configFile); event.putDetailedDebugInfo("multiverse-inventories/groups.yml", groupsFile); } + /** + * Builds a String containing Multiverse-Inventories' version info. + * + * @return The version info. + */ + public String getDebugInfo() { + StringBuilder versionInfo = new StringBuilder("[Multiverse-Inventories] Multiverse-Inventories Version: " + inventories.getDescription().getVersion() + '\n' + + "[Multiverse-Inventories] === Settings ===" + '\n' + + "[Multiverse-Inventories] First Run: " + config.isFirstRun() + '\n' + + "[Multiverse-Inventories] Using Bypass: " + config.isUsingBypass() + '\n' + + "[Multiverse-Inventories] Default Ungrouped Worlds: " + config.isDefaultingUngroupedWorlds() + '\n' + + "[Multiverse-Inventories] Save and Load on Log In and Out: " + config.usingLoggingSaveLoad() + '\n' + + "[Multiverse-Inventories] Using GameMode Profiles: " + config.isUsingGameModeProfiles() + '\n' + + "[Multiverse-Inventories] === Shares ===" + '\n' + + "[Multiverse-Inventories] Optionals for Ungrouped Worlds: " + config.usingOptionalsForUngrouped() + '\n' + + "[Multiverse-Inventories] Enabled Optionals: " + config.getOptionalShares() + '\n' + + "[Multiverse-Inventories] === Groups ===" + '\n'); + + for (WorldGroup group : worldGroupManager.getGroups()) { + versionInfo.append("[Multiverse-Inventories] ").append(group.toString()).append('\n'); + } + + return versionInfo.toString(); + } + @EventHandler public void onDebugModeChange(MVDebugModeEvent event) { Logging.setDebugLevel(event.getLevel()); @@ -101,9 +153,9 @@ public void configReload(MVConfigReloadEvent event) { public void pluginEnable(PluginEnableEvent event) { try { if (event.getPlugin() instanceof MultiInv) { - this.inventories.getImportManager().hookMultiInv((MultiInv) event.getPlugin()); + importManager.get().hookMultiInv((MultiInv) event.getPlugin()); } else if (event.getPlugin() instanceof WorldInventories) { - this.inventories.getImportManager().hookWorldInventories((WorldInventories) event.getPlugin()); + importManager.get().hookWorldInventories((WorldInventories) event.getPlugin()); } } catch (NoClassDefFoundError ignore) { } @@ -118,9 +170,9 @@ public void pluginEnable(PluginEnableEvent event) { public void pluginDisable(PluginDisableEvent event) { try { if (event.getPlugin() instanceof MultiInv) { - this.inventories.getImportManager().unHookMultiInv(); + importManager.get().unHookMultiInv(); } else if (event.getPlugin() instanceof WorldInventories) { - this.inventories.getImportManager().unHookWorldInventories(); + importManager.get().unHookWorldInventories(); } } catch (NoClassDefFoundError ignore) { } @@ -135,13 +187,13 @@ public void playerPreLogin(AsyncPlayerPreLoginEvent event) { Logging.finer("Loading global profile for Player{name:'%s', uuid:'%s'}.", event.getName(), event.getUniqueId()); - GlobalProfile globalProfile = inventories.getData().getGlobalProfile(event.getName(), event.getUniqueId()); + GlobalProfile globalProfile = profileDataSource.getGlobalProfile(event.getName(), event.getUniqueId()); if (!globalProfile.getLastKnownName().equalsIgnoreCase(event.getName())) { // Data must be migrated Logging.info("Player %s changed name from '%s' to '%s'. Attempting to migrate playerdata...", event.getUniqueId(), globalProfile.getLastKnownName(), event.getName()); try { - inventories.getData().migratePlayerData(globalProfile.getLastKnownName(), event.getName(), + profileDataSource.migratePlayerData(globalProfile.getLastKnownName(), event.getName(), event.getUniqueId(), true); } catch (IOException e) { Logging.severe("An error occurred while trying to migrate playerdata."); @@ -149,7 +201,7 @@ public void playerPreLogin(AsyncPlayerPreLoginEvent event) { } globalProfile.setLastKnownName(event.getName()); - inventories.getData().updateGlobalProfile(globalProfile); + profileDataSource.updateGlobalProfile(globalProfile); Logging.info("Migration complete!"); } } @@ -162,13 +214,17 @@ public void playerPreLogin(AsyncPlayerPreLoginEvent event) { @EventHandler public void playerJoin(final PlayerJoinEvent event) { final Player player = event.getPlayer(); - final GlobalProfile globalProfile = inventories.getData().getGlobalProfile(player.getName(), player.getUniqueId()); + final GlobalProfile globalProfile = profileDataSource.getGlobalProfile(player.getName(), player.getUniqueId()); final String world = globalProfile.getLastWorld(); - if (inventories.getMVIConfig().usingLoggingSaveLoad() && globalProfile.shouldLoadOnLogin()) { - ShareHandlingUpdater.updatePlayer(inventories, player, new PersistingProfile(Sharables.allOf(), - inventories.getWorldProfileContainerStore().getContainer(world).getPlayerData(player))); + if (config.usingLoggingSaveLoad() && globalProfile.shouldLoadOnLogin()) { + ShareHandlingUpdater.updatePlayer(inventories, player, new PersistingProfile( + Sharables.allOf(), + profileContainerStoreProvider.getStore(ContainerType.WORLD) + .getContainer(world) + .getPlayerData(player) + )); } - inventories.getData().setLoadOnLogin(player.getName(), false); + profileDataSource.setLoadOnLogin(player.getName(), false); verifyCorrectWorld(player, player.getWorld().getName(), globalProfile); } @@ -181,24 +237,28 @@ public void playerJoin(final PlayerJoinEvent event) { public void playerQuit(final PlayerQuitEvent event) { final Player player = event.getPlayer(); final String world = event.getPlayer().getWorld().getName(); - inventories.getData().updateLastWorld(player.getName(), world); - if (inventories.getMVIConfig().usingLoggingSaveLoad()) { - ShareHandlingUpdater.updateProfile(inventories, player, new PersistingProfile(Sharables.allOf(), - inventories.getWorldProfileContainerStore().getContainer(world).getPlayerData(player))); - inventories.getData().setLoadOnLogin(player.getName(), true); + profileDataSource.updateLastWorld(player.getName(), world); + if (config.usingLoggingSaveLoad()) { + ShareHandlingUpdater.updateProfile(inventories, player, new PersistingProfile( + Sharables.allOf(), + profileContainerStoreProvider.getStore(ContainerType.WORLD) + .getContainer(world) + .getPlayerData(player) + )); + profileDataSource.setLoadOnLogin(player.getName(), true); } SingleShareWriter.of(this.inventories, player, Sharables.LAST_LOCATION).write(player.getLocation()); } private void verifyCorrectWorld(Player player, String world, GlobalProfile globalProfile) { if (globalProfile.getLastWorld() == null) { - inventories.getData().updateLastWorld(player.getName(), world); + profileDataSource.updateLastWorld(player.getName(), world); } else { if (!world.equals(globalProfile.getLastWorld())) { Logging.fine("Player did not spawn in the world they were last reported to be in!"); new WorldChangeShareHandler(this.inventories, player, globalProfile.getLastWorld(), world).handleSharing(); - inventories.getData().updateLastWorld(player.getName(), world); + profileDataSource.updateLastWorld(player.getName(), world); } } } @@ -210,7 +270,7 @@ private void verifyCorrectWorld(Player player, String world, GlobalProfile globa */ @EventHandler(priority = EventPriority.MONITOR) public void playerGameModeChange(PlayerGameModeChangeEvent event) { - if (event.isCancelled() || !inventories.getMVIConfig().isUsingGameModeProfiles()) { + if (event.isCancelled() || !config.isUsingGameModeProfiles()) { return; } Player player = event.getPlayer(); @@ -240,7 +300,7 @@ public void playerChangedWorld(PlayerChangedWorldEvent event) { } new WorldChangeShareHandler(this.inventories, player, fromWorld.getName(), toWorld.getName()).handleSharing(); - inventories.getData().updateLastWorld(player.getName(), toWorld.getName()); + profileDataSource.updateLastWorld(player.getName(), toWorld.getName()); } /** @@ -252,7 +312,7 @@ public void playerChangedWorld(PlayerChangedWorldEvent event) { public void playerTeleport(PlayerTeleportEvent event) { if (event.isCancelled() || event.getFrom().getWorld().equals(event.getTo().getWorld()) - || !this.inventories.getMVIConfig().getOptionalShares().contains(Sharables.LAST_LOCATION)) { + || !config.getOptionalShares().contains(Sharables.LAST_LOCATION)) { return; } @@ -272,18 +332,18 @@ public void playerTeleport(PlayerTeleportEvent event) { public void playerDeath(PlayerDeathEvent event) { Logging.finer("=== Handling PlayerDeathEvent for: " + event.getEntity().getName() + " ==="); String deathWorld = event.getEntity().getWorld().getName(); - ProfileContainer worldProfileContainer = this.inventories.getWorldProfileContainerStore().getContainer(deathWorld); + ProfileContainer worldProfileContainer = profileContainerStoreProvider.getStore(ContainerType.WORLD).getContainer(deathWorld); PlayerProfile profile = worldProfileContainer.getPlayerData(event.getEntity()); profile.set(Sharables.LEVEL, event.getNewLevel()); profile.set(Sharables.EXPERIENCE, (float) event.getNewExp()); profile.set(Sharables.TOTAL_EXPERIENCE, event.getNewTotalExp()); - this.inventories.getData().updatePlayerData(profile); - for (WorldGroup worldGroup : this.inventories.getGroupManager().getGroupsForWorld(deathWorld)) { + profileDataSource.updatePlayerData(profile); + for (WorldGroup worldGroup : worldGroupManager.getGroupsForWorld(deathWorld)) { profile = worldGroup.getGroupProfileContainer().getPlayerData(event.getEntity()); profile.set(Sharables.LEVEL, event.getNewLevel()); profile.set(Sharables.EXPERIENCE, (float) event.getNewExp()); profile.set(Sharables.TOTAL_EXPERIENCE, event.getNewTotalExp()); - this.inventories.getData().updatePlayerData(profile); + profileDataSource.updatePlayerData(profile); } Logging.finer("=== Finished handling PlayerDeathEvent for: " + event.getEntity().getName() + "! ==="); } @@ -299,7 +359,7 @@ public void playerRespawn(PlayerRespawnEvent event) { Bukkit.getScheduler().scheduleSyncDelayedTask(inventories, new Runnable() { public void run() { verifyCorrectWorld(player, player.getWorld().getName(), - inventories.getData().getGlobalProfile(player.getName(), player.getUniqueId())); + profileDataSource.getGlobalProfile(player.getName(), player.getUniqueId())); } }, 2L); } @@ -313,8 +373,7 @@ public void run() { public void lowestPriorityRespawn(PlayerRespawnEvent event) { if (!event.isBedSpawn()) { World world = event.getPlayer().getWorld(); - this.currentGroups = this.inventories.getGroupManager() - .getGroupsForWorld(world.getName()); + this.currentGroups = worldGroupManager.getGroupsForWorld(world.getName()); this.handleRespawn(event, EventPriority.LOWEST); } } @@ -427,8 +486,8 @@ public void entityPortal(EntityPortalEvent event) { return; } - List fromGroups = inventories.getGroupManager().getGroupsForWorld(fromWorld.getName()); - List toGroups = inventories.getGroupManager().getGroupsForWorld(toWorld.getName()); + List fromGroups = worldGroupManager.getGroupsForWorld(fromWorld.getName()); + List toGroups = worldGroupManager.getGroupsForWorld(toWorld.getName()); // We only care about the groups that have the inventory sharable fromGroups = fromGroups.stream().filter(it -> it.isSharing(Sharables.INVENTORY)).collect(Collectors.toList()); toGroups = toGroups.stream().filter(it -> it.isSharing(Sharables.INVENTORY)).collect(Collectors.toList()); @@ -452,10 +511,11 @@ public void worldUnload(WorldUnloadEvent event) { Logging.finer("Clearing data for world/groups container with '%s' world.", unloadWorldName); - ProfileContainer fromWorldProfileContainer = this.inventories.getWorldProfileContainerStore().getContainer(unloadWorldName); + ProfileContainer fromWorldProfileContainer = profileContainerStoreProvider.getStore(ContainerType.WORLD) + .getContainer(unloadWorldName); fromWorldProfileContainer.clearContainer(); - List fromGroups = this.inventories.getGroupManager().getGroupsForWorld(unloadWorldName); + List fromGroups = worldGroupManager.getGroupsForWorld(unloadWorldName); for (WorldGroup fromGroup : fromGroups) { fromGroup.getGroupProfileContainer().clearContainer(); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/ShareHandler.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/ShareHandler.java similarity index 85% rename from src/main/java/org/mvplugins/multiverse/inventories/ShareHandler.java rename to src/main/java/org/mvplugins/multiverse/inventories/listeners/ShareHandler.java index b7e28fe0..995fba97 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/ShareHandler.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/ShareHandler.java @@ -1,8 +1,15 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.ShareHandlingUpdater; +import org.mvplugins.multiverse.inventories.profile.PersistingProfile; import org.mvplugins.multiverse.inventories.event.ShareHandlingEvent; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; +import org.mvplugins.multiverse.inventories.profile.container.ContainerType; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStore; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import org.mvplugins.multiverse.inventories.share.Shares; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -19,12 +26,18 @@ public abstract class ShareHandler { protected final MultiverseInventories inventories; protected final Player player; + protected final WorldGroupManager worldGroupManager; + protected final ProfileContainerStore worldProfileContainerStore; final AffectedProfiles affectedProfiles; ShareHandler(MultiverseInventories inventories, Player player) { this.inventories = inventories; this.player = player; this.affectedProfiles = new AffectedProfiles(); + this.worldGroupManager = inventories.getServiceLocator().getService(WorldGroupManager.class); + this.worldProfileContainerStore = inventories.getServiceLocator() + .getService(ProfileContainerStoreProvider.class) + .getStore(ContainerType.WORLD); } /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/SingleShareWriter.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/SingleShareWriter.java similarity index 51% rename from src/main/java/org/mvplugins/multiverse/inventories/SingleShareWriter.java rename to src/main/java/org/mvplugins/multiverse/inventories/listeners/SingleShareWriter.java index b83de310..0a98f111 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/SingleShareWriter.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/SingleShareWriter.java @@ -1,7 +1,12 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; import org.bukkit.entity.Player; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.container.ContainerType; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import org.mvplugins.multiverse.inventories.share.Sharable; /** @@ -9,7 +14,7 @@ * * @param The sharable type. */ -public class SingleShareWriter { +final class SingleShareWriter { public static SingleShareWriter of(MultiverseInventories inventories, Player player, Sharable sharable) { return new SingleShareWriter(inventories, player, sharable); @@ -26,20 +31,23 @@ private SingleShareWriter(MultiverseInventories inventories, Player player, Shar } public void write(T value) { - if (sharable.isOptional() && !this.inventories.getMVIConfig().getOptionalShares().contains(sharable)) { + if (sharable.isOptional() && + !inventories.getServiceLocator().getService(InventoriesConfig.class).getOptionalShares().contains(sharable)) { Logging.finer("Skipping write for optional share: " + sharable); return; } Logging.finer("Writing single share: " + sharable.getNames()[0]); String worldName = this.player.getWorld().getName(); - this.inventories.getWorldProfileContainerStore() + var profileContainerStoreProvider = this.inventories.getServiceLocator().getService(ProfileContainerStoreProvider.class); + profileContainerStoreProvider.getStore(ContainerType.WORLD) .getContainer(worldName) .getPlayerData(this.player) .set(this.sharable, value); - this.inventories.getGroupManager().getGroupsForWorld(worldName).forEach(worldGroup -> { - worldGroup.getGroupProfileContainer().getPlayerData(this.player) - .set(this.sharable, value); - }); + this.inventories.getServiceLocator().getService(WorldGroupManager.class) + .getGroupsForWorld(worldName) + .forEach(worldGroup -> + worldGroup.getGroupProfileContainer().getPlayerData(this.player) + .set(this.sharable, value)); } } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/SpawnChangeListener.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/SpawnChangeListener.java similarity index 94% rename from src/main/java/org/mvplugins/multiverse/inventories/SpawnChangeListener.java rename to src/main/java/org/mvplugins/multiverse/inventories/listeners/SpawnChangeListener.java index 64cf3eb5..0e72763c 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/SpawnChangeListener.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/SpawnChangeListener.java @@ -1,4 +1,4 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; import org.bukkit.Location; @@ -10,13 +10,12 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerSpawnChangeEvent; import org.bukkit.event.player.PlayerSpawnChangeEvent.Cause; -import org.mvplugins.multiverse.inventories.profile.PlayerProfile; +import org.mvplugins.multiverse.inventories.MultiverseInventories; import org.mvplugins.multiverse.inventories.share.Sharables; import javax.annotation.Nullable; -import java.util.List; -public class SpawnChangeListener implements Listener { +public final class SpawnChangeListener implements Listener { private final MultiverseInventories inventories; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/WorldChangeShareHandler.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/WorldChangeShareHandler.java similarity index 95% rename from src/main/java/org/mvplugins/multiverse/inventories/WorldChangeShareHandler.java rename to src/main/java/org/mvplugins/multiverse/inventories/listeners/WorldChangeShareHandler.java index e2e1ea75..7f3a4ae3 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/WorldChangeShareHandler.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/WorldChangeShareHandler.java @@ -1,6 +1,8 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.event.ShareHandlingEvent; import org.mvplugins.multiverse.inventories.event.WorldChangeShareHandlingEvent; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; @@ -36,7 +38,7 @@ final class WorldChangeShareHandler extends ShareHandler { } private List getAffectedWorldGroups(String world) { - return this.inventories.getGroupManager().getGroupsForWorld(world); + return worldGroupManager.getGroupsForWorld(world); } @Override @@ -65,7 +67,7 @@ private PlayerProfile getWorldPlayerProfile(String world, Player player) { } private ProfileContainer getWorldProfile(String world) { - return inventories.getWorldProfileContainerStore().getContainer(world); + return worldProfileContainerStore.getContainer(world); } private boolean isPlayerAffectedByChange() { @@ -189,7 +191,7 @@ private PlayerProfile getToWorldPlayerData() { } private ProfileContainer getToWorldProfileContainer() { - return inventories.getWorldProfileContainerStore().getContainer(toWorld); + return worldProfileContainerStore.getContainer(toWorld); } } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/locale/LazyLocaleMessageProvider.java b/src/main/java/org/mvplugins/multiverse/inventories/locale/LazyLocaleMessageProvider.java index a4fb2d58..40d78e89 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/locale/LazyLocaleMessageProvider.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/locale/LazyLocaleMessageProvider.java @@ -1,5 +1,7 @@ package org.mvplugins.multiverse.inventories.locale; +import org.jvnet.hk2.annotations.Contract; + import java.util.Locale; import java.util.Set; @@ -8,6 +10,7 @@ * * This interface describes a Multiverse-MessageProvider that only loads locales when they're needed. */ +@Contract public interface LazyLocaleMessageProvider extends MessageProvider { /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/locale/MessageProvider.java b/src/main/java/org/mvplugins/multiverse/inventories/locale/MessageProvider.java index 610d84ff..dc32aa43 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/locale/MessageProvider.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/locale/MessageProvider.java @@ -1,5 +1,7 @@ package org.mvplugins.multiverse.inventories.locale; +import org.jvnet.hk2.annotations.Contract; + import java.util.List; import java.util.Locale; @@ -8,6 +10,7 @@ * * This interface describes a Multiverse-MessageProvider. */ +@Contract public interface MessageProvider { /** * The default locale. diff --git a/src/main/java/org/mvplugins/multiverse/inventories/locale/Messager.java b/src/main/java/org/mvplugins/multiverse/inventories/locale/Messager.java index 2f4efdc4..5f6c2e0a 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/locale/Messager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/locale/Messager.java @@ -1,12 +1,14 @@ package org.mvplugins.multiverse.inventories.locale; import org.bukkit.command.CommandSender; +import org.jvnet.hk2.annotations.Contract; import java.util.List; /** * This interface describes a Messager which sends messages to CommandSenders. */ +@Contract public interface Messager extends MessageProvider { /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/migration/ImportManager.java b/src/main/java/org/mvplugins/multiverse/inventories/migration/ImportManager.java index 1511eb8c..8b01736b 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/migration/ImportManager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/migration/ImportManager.java @@ -1,6 +1,9 @@ package org.mvplugins.multiverse.inventories.migration; import com.dumptruckman.minecraft.util.Logging; +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.inventories.MultiverseInventories; import org.mvplugins.multiverse.inventories.migration.multiinv.MultiInvImporter; import org.mvplugins.multiverse.inventories.migration.worldinventories.WorldInventoriesImporter; @@ -10,13 +13,15 @@ /** * Manages the import heplers for other similar plugins. */ +@Service public class ImportManager { private MultiInvImporter multiInvImporter = null; private WorldInventoriesImporter worldInventoriesImporter = null; - private MultiverseInventories inventories; + private final MultiverseInventories inventories; - public ImportManager(MultiverseInventories inventories) { + @Inject + public ImportManager(@NotNull MultiverseInventories inventories) { this.inventories = inventories; } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MIPlayerFileLoader.java b/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MIPlayerFileLoader.java index b597d12f..03988746 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MIPlayerFileLoader.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MIPlayerFileLoader.java @@ -1,6 +1,6 @@ package org.mvplugins.multiverse.inventories.migration.multiinv; -import org.mvplugins.multiverse.inventories.PlayerStats; +import org.mvplugins.multiverse.inventories.util.PlayerStats; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.file.YamlConfiguration; import uk.co.tggl.pluckerpluck.multiinv.MultiInv; @@ -12,8 +12,8 @@ */ public class MIPlayerFileLoader { - private YamlConfiguration playerFile; - private File file; + private final YamlConfiguration playerFile; + private final File file; public MIPlayerFileLoader(MultiInv plugin, OfflinePlayer player, String group) { // Find and load configuration file for the player diff --git a/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MultiInvImporter.java b/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MultiInvImporter.java index da976987..8770201a 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MultiInvImporter.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/migration/multiinv/MultiInvImporter.java @@ -2,10 +2,15 @@ import com.dumptruckman.minecraft.util.Logging; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStore; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.profile.ProfileTypes; import org.mvplugins.multiverse.inventories.profile.container.ContainerType; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.migration.DataImporter; import org.mvplugins.multiverse.inventories.migration.MigrationException; @@ -26,12 +31,20 @@ */ public class MultiInvImporter implements DataImporter { - private MultiInv miPlugin; - private MultiverseInventories inventories; + private final MultiInv miPlugin; + private final InventoriesConfig config; + private final WorldGroupManager worldGroupManager; + private final ProfileDataSource profileDataSource; + private final ProfileContainerStore worldProfileContainerStore; public MultiInvImporter(MultiverseInventories inventories, MultiInv miPlugin) { - this.inventories = inventories; this.miPlugin = miPlugin; + this.config = inventories.getServiceLocator().getService(InventoriesConfig.class); + this.worldGroupManager = inventories.getServiceLocator().getService(WorldGroupManager.class); + this.profileDataSource = inventories.getServiceLocator().getService(ProfileDataSource.class); + this.worldProfileContainerStore = inventories.getServiceLocator() + .getService(ProfileContainerStoreProvider.class) + .getStore(ContainerType.WORLD); } /** @@ -61,23 +74,23 @@ public void importData() throws MigrationException { throw new MigrationException("There is no data to import from MultiInv!"); } if (!miGroupMap.isEmpty()) { - WorldGroup defaultWorldGroup = this.inventories.getGroupManager().getDefaultGroup(); + WorldGroup defaultWorldGroup = worldGroupManager.getDefaultGroup(); if (defaultWorldGroup != null) { - this.inventories.getGroupManager().removeGroup(defaultWorldGroup); + worldGroupManager.removeGroup(defaultWorldGroup); Logging.info("Removed automatically created world group in favor of imported groups."); } } for (Map.Entry groupEntry : miGroupMap.entrySet()) { - WorldGroup worldGroup = this.inventories.getGroupManager().getGroup(groupEntry.getValue()); + WorldGroup worldGroup = worldGroupManager.getGroup(groupEntry.getValue()); if (worldGroup == null) { - worldGroup = this.inventories.getGroupManager().newEmptyGroup(groupEntry.getValue()); + worldGroup = worldGroupManager.newEmptyGroup(groupEntry.getValue()); worldGroup.getShares().mergeShares(Sharables.allOf()); Logging.info("Importing group: " + groupEntry.getValue()); - this.inventories.getGroupManager().updateGroup(worldGroup); + worldGroupManager.updateGroup(worldGroup); } worldGroup.addWorld(groupEntry.getValue()); } - this.inventories.getMVIConfig().save(); + config.save(); for (OfflinePlayer player : Bukkit.getServer().getOfflinePlayers()) { Logging.info("Processing MultiInv data for player: " + player.getName()); @@ -114,16 +127,15 @@ private void mergeData(OfflinePlayer player, MIPlayerFileLoader playerFileLoader String dataName, ContainerType type) { PlayerProfile playerProfile; if (type.equals(ContainerType.GROUP)) { - WorldGroup group = this.inventories.getGroupManager() - .getGroup(dataName); + WorldGroup group = worldGroupManager.getGroup(dataName); if (group == null) { Logging.warning("Could not import player data for group: " + dataName); return; } playerProfile = group.getGroupProfileContainer().getPlayerData(ProfileTypes.SURVIVAL, player); } else { - playerProfile = this.inventories.getWorldProfileContainerStore() - .getContainer(dataName).getPlayerData(ProfileTypes.SURVIVAL, player); + playerProfile = worldProfileContainerStore.getContainer(dataName) + .getPlayerData(ProfileTypes.SURVIVAL, player); } MIInventoryInterface inventoryInterface = playerFileLoader.getInventory(GameMode.SURVIVAL.toString()); @@ -135,7 +147,7 @@ private void mergeData(OfflinePlayer player, MIPlayerFileLoader playerFileLoader playerProfile.set(Sharables.TOTAL_EXPERIENCE, playerFileLoader.getTotalExperience()); playerProfile.set(Sharables.LEVEL, playerFileLoader.getLevel()); playerProfile.set(Sharables.FOOD_LEVEL, playerFileLoader.getHunger()); - this.inventories.getData().updatePlayerData(playerProfile); + profileDataSource.updatePlayerData(playerProfile); } /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/migration/worldinventories/WorldInventoriesImporter.java b/src/main/java/org/mvplugins/multiverse/inventories/migration/worldinventories/WorldInventoriesImporter.java index 7b5ff5ea..a97d9306 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/migration/worldinventories/WorldInventoriesImporter.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/migration/worldinventories/WorldInventoriesImporter.java @@ -2,10 +2,16 @@ import com.dumptruckman.minecraft.util.Logging; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.WorldGroup; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; +import org.mvplugins.multiverse.inventories.profile.container.ContainerType; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStore; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; import org.mvplugins.multiverse.inventories.profile.ProfileTypes; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.migration.DataImporter; import org.mvplugins.multiverse.inventories.migration.MigrationException; @@ -31,12 +37,20 @@ */ public class WorldInventoriesImporter implements DataImporter { - private WorldInventories wiPlugin; - private MultiverseInventories inventories; + private final WorldInventories wiPlugin; + private final InventoriesConfig config; + private final WorldGroupManager worldGroupManager; + private final ProfileDataSource profileDataSource; + private final ProfileContainerStore worldProfileContainerStore; public WorldInventoriesImporter(MultiverseInventories inventories, WorldInventories wiPlugin) { - this.inventories = inventories; this.wiPlugin = wiPlugin; + this.config = inventories.getServiceLocator().getService(InventoriesConfig.class); + this.worldGroupManager = inventories.getServiceLocator().getService(WorldGroupManager.class); + this.profileDataSource = inventories.getServiceLocator().getService(ProfileDataSource.class); + this.worldProfileContainerStore = inventories.getServiceLocator() + .getService(ProfileContainerStoreProvider.class) + .getStore(ContainerType.WORLD); } /** @@ -75,16 +89,16 @@ public void importData() throws MigrationException { } if (!wiGroups.isEmpty()) { - WorldGroup defaultWorldGroup = this.inventories.getGroupManager().getDefaultGroup(); + WorldGroup defaultWorldGroup = worldGroupManager.getDefaultGroup(); if (defaultWorldGroup != null) { - this.inventories.getGroupManager().removeGroup(defaultWorldGroup); + worldGroupManager.removeGroup(defaultWorldGroup); Logging.info("Removed automatically created world group in favor of imported groups."); } } this.createGroups(wiGroups); Set noGroupWorlds = this.getWorldsWithoutGroups(); - this.inventories.getMVIConfig().save(); + config.save(); OfflinePlayer[] offlinePlayers = Bukkit.getServer().getOfflinePlayers(); Logging.info("Processing data for " + offlinePlayers.length + " players. The larger than number, the longer" @@ -95,7 +109,7 @@ public void importData() throws MigrationException { Logging.finer("(" + playerCount + "/" + offlinePlayers.length + ")Processing WorldInventories data for player: " + player.getName()); for (Group wiGroup : wiGroups) { - WorldGroup worldGroup = inventories.getGroupManager().getGroup(wiGroup.getName()); + WorldGroup worldGroup = worldGroupManager.getGroup(wiGroup.getName()); if (worldGroup == null) { Logging.finest("Could not import player data for WorldInventories group: " + wiGroup.getName() + " because there is no Multiverse-Inventories group by that name."); @@ -118,7 +132,7 @@ private void createGroups(List wiGroups) { Logging.warning("Group '" + wiGroup.getName() + "' has no worlds." + " You may need to add these manually!"); } - WorldGroup newGroup = inventories.getGroupManager().newEmptyGroup(wiGroup.getName()); + WorldGroup newGroup = worldGroupManager.newEmptyGroup(wiGroup.getName()); for (String worldName : wiGroup.getWorlds()) { newGroup.addWorld(worldName); } @@ -136,7 +150,7 @@ private void createGroups(List wiGroups) { Logging.warning("Group '" + wiGroup.getName() + "' unable to import fully, sharing only inventory."); newGroup.getShares().setSharing(Sharables.ALL_INVENTORY, true); } - this.inventories.getGroupManager().updateGroup(newGroup); + worldGroupManager.updateGroup(newGroup); Logging.info("Created Multiverse-Inventories group: " + wiGroup.getName()); } } @@ -144,9 +158,9 @@ private void createGroups(List wiGroups) { private Set getWorldsWithoutGroups() { Set noGroupWorlds = new LinkedHashSet<>(); for (World world : Bukkit.getWorlds()) { - if (this.inventories.getGroupManager().getGroupsForWorld(world.getName()).isEmpty()) { + if (worldGroupManager.getGroupsForWorld(world.getName()).isEmpty()) { Logging.fine("Added ungrouped world for importing."); - ProfileContainer container = this.inventories.getWorldProfileContainerStore().getContainer(world.getName()); + ProfileContainer container = worldProfileContainerStore.getContainer(world.getName()); noGroupWorlds.add(container); } } @@ -169,7 +183,7 @@ private void transferData(OfflinePlayer player, Group wiGroup, ProfileContainer playerProfile.set(Sharables.EXHAUSTION, wiStats.getExhaustion()); playerProfile.set(Sharables.FOOD_LEVEL, wiStats.getFoodLevel()); } - this.inventories.getData().updatePlayerData(playerProfile); + profileDataSource.updatePlayerData(playerProfile); Logging.finest("Player's data imported successfully for group: " + profileContainer.getContainerName()); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/FlatFileProfileDataSource.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/FlatFileProfileDataSource.java similarity index 97% rename from src/main/java/org/mvplugins/multiverse/inventories/FlatFileProfileDataSource.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/FlatFileProfileDataSource.java index 85ea8b61..666ee66b 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/FlatFileProfileDataSource.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/FlatFileProfileDataSource.java @@ -1,4 +1,4 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.profile; import com.dumptruckman.bukkit.configuration.json.JsonConfiguration; import com.dumptruckman.minecraft.util.Logging; @@ -7,20 +7,18 @@ import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; import org.bukkit.configuration.InvalidConfigurationException; -import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; -import org.mvplugins.multiverse.inventories.profile.ProfileKey; -import org.mvplugins.multiverse.inventories.profile.ProfileTypes; +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.inventories.MultiverseInventories; import org.mvplugins.multiverse.inventories.share.ProfileEntry; import org.mvplugins.multiverse.inventories.share.Sharable; import org.mvplugins.multiverse.inventories.share.SharableEntry; import org.mvplugins.multiverse.inventories.profile.container.ContainerType; -import org.mvplugins.multiverse.inventories.profile.GlobalProfile; -import org.mvplugins.multiverse.inventories.profile.PlayerProfile; -import org.mvplugins.multiverse.inventories.profile.ProfileType; import net.minidev.json.JSONObject; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; +import org.mvplugins.multiverse.inventories.util.DataStrings; import java.io.File; import java.io.IOException; @@ -36,7 +34,8 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; -class FlatFileProfileDataSource implements ProfileDataSource { +@Service +final class FlatFileProfileDataSource implements ProfileDataSource { private static final String JSON = ".json"; @@ -58,6 +57,7 @@ class FlatFileProfileDataSource implements ProfileDataSource { private final File groupFolder; private final File playerFolder; + @Inject FlatFileProfileDataSource(MultiverseInventories plugin) throws IOException { // Make the data folders plugin.getDataFolder().mkdirs(); @@ -592,7 +592,8 @@ public void clearProfileCache(ProfileKey key) { profileCache.invalidate(key); } - void clearCache() { + @Override + public void clearAllCache() { globalProfileCache.invalidateAll(); profileCache.invalidateAll(); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/PersistingProfile.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/PersistingProfile.java similarity index 90% rename from src/main/java/org/mvplugins/multiverse/inventories/PersistingProfile.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/PersistingProfile.java index dc920fcf..ee543114 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/PersistingProfile.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/PersistingProfile.java @@ -1,6 +1,5 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.profile; -import org.mvplugins.multiverse.inventories.profile.PlayerProfile; import org.mvplugins.multiverse.inventories.share.Shares; /** diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSource.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSource.java index dbf8bcef..c9922395 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSource.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileDataSource.java @@ -1,5 +1,6 @@ package org.mvplugins.multiverse.inventories.profile; +import org.jvnet.hk2.annotations.Contract; import org.mvplugins.multiverse.inventories.profile.container.ContainerType; import java.io.IOException; @@ -8,7 +9,8 @@ /** * A source for updating and retrieving player profiles via persistence. */ -public interface ProfileDataSource { +@Contract +public sealed interface ProfileDataSource permits FlatFileProfileDataSource { /** * Updates the persisted data for a player for a specific profile. @@ -100,5 +102,10 @@ public interface ProfileDataSource { * Clears a single profile in cache. */ void clearProfileCache(ProfileKey key); + + /** + * Clears all profiles in cache. + */ + void clearAllCache(); } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileType.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileType.java index b4198653..47134579 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileType.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileType.java @@ -9,7 +9,7 @@ static ProfileType createProfileType(String name) { return new ProfileType(name); } - private String name; + private final String name; private ProfileType(String name) { this.name = name; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileTypes.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileTypes.java index cdf9c061..1db9cd1a 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileTypes.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/ProfileTypes.java @@ -29,16 +29,12 @@ public final class ProfileTypes { * @return The profile type for the given game mode. */ public static ProfileType forGameMode(GameMode mode) { - switch (mode) { - case SURVIVAL: - return SURVIVAL; - case CREATIVE: - return CREATIVE; - case ADVENTURE: - return ADVENTURE; - default: - return SURVIVAL; - } + return switch (mode) { + case SURVIVAL -> SURVIVAL; + case CREATIVE -> CREATIVE; + case ADVENTURE -> ADVENTURE; + default -> SURVIVAL; + }; } private ProfileTypes() { diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainer.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainer.java index 2cd4fb93..97bcd957 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainer.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainer.java @@ -1,31 +1,51 @@ package org.mvplugins.multiverse.inventories.profile.container; -import org.mvplugins.multiverse.inventories.profile.ProfileType; +import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.ProfileDataSource; +import org.mvplugins.multiverse.inventories.profile.ProfileKey; +import org.mvplugins.multiverse.inventories.profile.ProfileTypes; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; +import org.mvplugins.multiverse.inventories.profile.ProfileType; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; /** - * A container for player profiles in a given world or world group (based on {@link #getContainerType()}). - *

Players may have separate profiles per game mode within this container if game mode profiles are enabled.

+ * A container for player profiles in a given world or world group (based on {@link #getContainerType()}), + * using WeakHashMaps to keep memory usage to a minimum. + *
+ * Players may have separate profiles per game mode within this container if game mode profiles are enabled. */ -public interface ProfileContainer { +public final class ProfileContainer { - /** - * Returns the name of this profile container which is primarily used for persistence purposes. - *

The name reflects the world name if this is a world profile container, or the arbitrary group name if - * this is a world group profile container.

- * - * @return The name to use to look up Data. - */ - String getContainerName(); + private final Map> playerData = new WeakHashMap<>(); + private final MultiverseInventories inventories; + private final String name; + private final ContainerType type; + private final ProfileDataSource profileDataSource; + private final InventoriesConfig config; + + ProfileContainer(MultiverseInventories inventories, String name, ContainerType type) { + this.inventories = inventories; + this.name = name; + this.type = type; + this.profileDataSource = inventories.getServiceLocator().getService(ProfileDataSource.class); + this.config = inventories.getServiceLocator().getService(InventoriesConfig.class); + } /** - * Returns the container type for this container. + * Gets the stored profiles for this player, mapped by ProfileType. * - * @return the container type. + * @param name The name of player to get profile map for. + * @return The profile map for the given player. */ - ContainerType getContainerType(); + private Map getPlayerData(String name) { + return this.playerData.computeIfAbsent(name, k -> new HashMap<>()); + } /** * Retrieves the profile for the given player. @@ -35,7 +55,15 @@ public interface ProfileContainer { * @param player Player to get profile for. * @return The profile for the given player. */ - PlayerProfile getPlayerData(Player player); + public PlayerProfile getPlayerData(Player player) { + ProfileType type; + if (config.isUsingGameModeProfiles()) { + type = ProfileTypes.forGameMode(player.getGameMode()); + } else { + type = ProfileTypes.SURVIVAL; + } + return getPlayerData(type, player); + } /** * Retrieves the profile of the given type for the given player. @@ -44,21 +72,37 @@ public interface ProfileContainer { * @param player Player to get profile for. * @return The profile of the given type for the given player. */ - PlayerProfile getPlayerData(ProfileType profileType, OfflinePlayer player); + public PlayerProfile getPlayerData(ProfileType profileType, OfflinePlayer player) { + Map profileMap = this.getPlayerData(player.getName()); + PlayerProfile playerProfile = profileMap.get(profileType); + if (playerProfile == null) { + playerProfile = profileDataSource.getPlayerData(getContainerType(), + getContainerName(), profileType, player.getUniqueId()); + Logging.finer("[%s - %s - %s - %s] not cached, loading from disk...", + profileType, getContainerType(), playerProfile.getContainerName(), player.getName()); + profileMap.put(profileType, playerProfile); + } + return playerProfile; + } /** * Adds a player profile to this profile container. * * @param playerProfile Player player to add. */ - void addPlayerData(PlayerProfile playerProfile); + public void addPlayerData(PlayerProfile playerProfile) { + this.getPlayerData(playerProfile.getPlayer().getName()).put(playerProfile.getProfileType(), playerProfile); + } /** * Removes all of the profile data for a given player in this profile container. * * @param player Player to remove data for. */ - void removeAllPlayerData(OfflinePlayer player); + public void removeAllPlayerData(OfflinePlayer player) { + this.getPlayerData(player.getName()).clear(); + profileDataSource.removePlayerData(getContainerType(), getContainerName(), null, player.getName()); + } /** * Removes the profile data for a specific type of profile in this profile container. @@ -66,11 +110,40 @@ public interface ProfileContainer { * @param profileType The type of profile to remove data for. * @param player Player to remove data for. */ - void removePlayerData(ProfileType profileType, OfflinePlayer player); + public void removePlayerData(ProfileType profileType, OfflinePlayer player) { + this.getPlayerData(player.getName()).remove(profileType); + profileDataSource.removePlayerData(getContainerType(), getContainerName(), profileType, player.getName()); + } + + /** + * Returns the name of this profile container which is primarily used for persistence purposes. + *

The name reflects the world name if this is a world profile container, or the arbitrary group name if + * this is a world group profile container.

+ * + * @return The name to use to look up Data. + */ + public String getContainerName() { + return name; + } + + /** + * Returns the container type for this container. + * + * @return the container type. + */ + public ContainerType getContainerType() { + return type; + } /** * Clears all cached data in the container. */ - void clearContainer(); + public void clearContainer() { + for (Map profiles : playerData.values()) { + for (PlayerProfile profile : profiles.values()) { + profileDataSource.clearProfileCache(ProfileKey.createProfileKey(profile)); + } + } + this.playerData.clear(); + } } - diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStore.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStore.java index 91f5c873..14f83748 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStore.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStore.java @@ -1,16 +1,33 @@ package org.mvplugins.multiverse.inventories.profile.container; +import org.mvplugins.multiverse.inventories.MultiverseInventories; + +import java.util.Map; +import java.util.WeakHashMap; + /** * A utility for storing and retrieving profile containers. */ -public interface ProfileContainerStore { +public final class ProfileContainerStore { + + private final Map containers = new WeakHashMap<>(); + + private final MultiverseInventories inventories; + private final ContainerType containerType; + + ProfileContainerStore(MultiverseInventories inventories, ContainerType containerType) { + this.inventories = inventories; + this.containerType = containerType; + } /** * Adds a profile container to the store. * * @param container profile container to add. */ - void addContainer(ProfileContainer container); + public void addContainer(ProfileContainer container) { + this.containers.put(container.getContainerName().toLowerCase(), container); + } /** * Returns the profile container for the given name. @@ -18,6 +35,13 @@ public interface ProfileContainerStore { * @param containerName Name of the profile container to retrieve. * @return the profile container for given name. */ - ProfileContainer getContainer(String containerName); + public ProfileContainer getContainer(String containerName) { + ProfileContainer container = this.containers.get(containerName.toLowerCase()); + if (container == null) { + container = new ProfileContainer(inventories, containerName, containerType); + addContainer(container); + } + return container; + } } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStoreProvider.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStoreProvider.java new file mode 100644 index 00000000..f3f8bd1a --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/container/ProfileContainerStoreProvider.java @@ -0,0 +1,39 @@ +package org.mvplugins.multiverse.inventories.profile.container; + +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.inventories.MultiverseInventories; + +import java.util.EnumMap; +import java.util.Map; + +/** + * A provider for ProfileContainerStore instances based on ContainerType. + */ +@Service +public class ProfileContainerStoreProvider { + + private final Map stores; + private final MultiverseInventories inventories; + + @Inject + ProfileContainerStoreProvider(@NotNull MultiverseInventories inventories) { + this.inventories = inventories; + stores = new EnumMap<>(ContainerType.class); + } + + /** + * Gets the store for a given container type. + * + * @param type the container type + * @return the store + */ + public ProfileContainerStore getStore(ContainerType type) { + return stores.computeIfAbsent(type, t -> new ProfileContainerStore(inventories, t)); + } + + public void clearCache() { + stores.clear(); + } +} diff --git a/src/main/java/org/mvplugins/multiverse/inventories/AbstractWorldGroupManager.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/AbstractWorldGroupManager.java similarity index 84% rename from src/main/java/org/mvplugins/multiverse/inventories/AbstractWorldGroupManager.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/group/AbstractWorldGroupManager.java index a487454f..b8652ec6 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/AbstractWorldGroupManager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/AbstractWorldGroupManager.java @@ -1,9 +1,12 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.profile.group; import com.dumptruckman.minecraft.util.Logging; +import org.jvnet.hk2.annotations.Contract; import org.mvplugins.multiverse.core.world.WorldManager; -import org.mvplugins.multiverse.inventories.profile.WorldGroupManager; -import org.mvplugins.multiverse.inventories.profile.GroupingConflict; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.share.Shares; import org.mvplugins.multiverse.inventories.locale.Message; @@ -21,16 +24,25 @@ /** * Abstract implementation of GroupManager with no persistence of groups. */ -abstract class AbstractWorldGroupManager implements WorldGroupManager { +@Contract +abstract sealed class AbstractWorldGroupManager implements WorldGroupManager permits YamlWorldGroupManager { static final String DEFAULT_GROUP_NAME = "default"; protected final Map groupNamesMap = new LinkedHashMap<>(); protected final MultiverseInventories plugin; + protected final InventoriesConfig inventoriesConfig; + protected final ProfileContainerStoreProvider profileContainerStoreProvider; protected final WorldManager worldManager; - public AbstractWorldGroupManager(final MultiverseInventories plugin) { + public AbstractWorldGroupManager( + @NotNull MultiverseInventories plugin, + @NotNull InventoriesConfig config, + @NotNull ProfileContainerStoreProvider profileContainerStoreProvider, + @NotNull WorldManager worldManager) { this.plugin = plugin; - this.worldManager = plugin.getServiceLocator().getService(WorldManager.class); + this.inventoriesConfig = config; + this.profileContainerStoreProvider = profileContainerStoreProvider; + this.worldManager = worldManager; } /** @@ -62,7 +74,7 @@ public List getGroupsForWorld(String worldName) { } } // Only use the default group for worlds managed by MV-Core - if (worldGroups.isEmpty() && plugin.getMVIConfig().isDefaultingUngroupedWorlds() && + if (worldGroups.isEmpty() && inventoriesConfig.isDefaultingUngroupedWorlds() && this.worldManager.isWorld(worldName)) { Logging.finer("Returning default group for world: " + worldName); worldGroups.add(getDefaultGroup()); @@ -120,7 +132,7 @@ public WorldGroup newEmptyGroup(String name) { if (getGroup(name) != null) { return null; } - return new WorldGroup(plugin, name); + return new WorldGroup(this, profileContainerStoreProvider, name); } /** @@ -142,7 +154,7 @@ public void createDefaultGroup() { World defaultWorld = Bukkit.getWorlds().get(0); World defaultNether = Bukkit.getWorld(defaultWorld.getName() + "_nether"); World defaultEnd = Bukkit.getWorld(defaultWorld.getName() + "_the_end"); - WorldGroup worldGroup = new WorldGroup(plugin, DEFAULT_GROUP_NAME); + WorldGroup worldGroup = new WorldGroup(this, profileContainerStoreProvider, DEFAULT_GROUP_NAME); worldGroup.getShares().mergeShares(Sharables.allOf()); worldGroup.addWorld(defaultWorld); StringBuilder worlds = new StringBuilder().append(defaultWorld.getName()); @@ -155,7 +167,7 @@ public void createDefaultGroup() { worlds.append(", ").append(defaultEnd.getName()); } updateGroup(worldGroup); - plugin.getMVIConfig().save(); + inventoriesConfig.save(); Logging.info("Created a default group for you containing all of your default worlds: " + worlds.toString()); } @@ -224,7 +236,7 @@ public void checkForConflicts(CommandSender sender) { plugin.getMessager().sendMessage(sender, message); } Logging.fine(message); - List conflicts = plugin.getGroupManager().checkGroups(); + List conflicts = checkGroups(); for (GroupingConflict conflict : conflicts) { message = plugin.getMessager().getMessage(Message.CONFLICT_RESULTS, conflict.getFirstGroup().getName(), conflict.getSecondGroup().getName(), diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/GroupingConflict.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/GroupingConflict.java similarity index 88% rename from src/main/java/org/mvplugins/multiverse/inventories/profile/GroupingConflict.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/group/GroupingConflict.java index cb0fc2fc..c42eba65 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/GroupingConflict.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/GroupingConflict.java @@ -1,6 +1,5 @@ -package org.mvplugins.multiverse.inventories.profile; +package org.mvplugins.multiverse.inventories.profile.group; -import org.mvplugins.multiverse.inventories.WorldGroup; import org.mvplugins.multiverse.inventories.share.Shares; import java.util.ArrayList; @@ -11,9 +10,9 @@ */ public final class GroupingConflict { - private WorldGroup groupOne; - private WorldGroup groupTwo; - private Shares conflictingShares; + private final WorldGroup groupOne; + private final WorldGroup groupTwo; + private final Shares conflictingShares; public GroupingConflict(WorldGroup groupOne, WorldGroup groupTwo, Shares conflictingShares) { this.groupOne = groupOne; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/WorldGroup.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/WorldGroup.java similarity index 87% rename from src/main/java/org/mvplugins/multiverse/inventories/WorldGroup.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/group/WorldGroup.java index a0e6cdd6..2880e98d 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/WorldGroup.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/WorldGroup.java @@ -1,9 +1,12 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.profile.group; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.profile.container.ContainerType; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; import org.mvplugins.multiverse.inventories.share.Sharable; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.share.Shares; -import org.mvplugins.multiverse.inventories.profile.container.ProfileContainer; import org.bukkit.World; import org.bukkit.event.EventPriority; @@ -13,7 +16,8 @@ public final class WorldGroup { - private final MultiverseInventories plugin; + private final WorldGroupManager worldGroupManager; + private final ProfileContainerStoreProvider profileContainerStoreProvider; private final String name; private final HashSet worlds = new HashSet<>(); private final Shares shares = Sharables.noneOf(); @@ -21,8 +25,12 @@ public final class WorldGroup { private String spawnWorld = null; private EventPriority spawnPriority = EventPriority.NORMAL; - WorldGroup(final MultiverseInventories inventories, final String name) { - this.plugin = inventories; + WorldGroup( + final WorldGroupManager worldGroupManager, + final ProfileContainerStoreProvider profileContainerStoreProvider, + final String name) { + this.worldGroupManager = worldGroupManager; + this.profileContainerStoreProvider = profileContainerStoreProvider; this.name = name; } @@ -53,7 +61,7 @@ public void addWorld(String worldName) { public void addWorld(String worldName, boolean updateConfig) { this.getWorlds().add(worldName.toLowerCase()); if (updateConfig) { - plugin.getGroupManager().updateGroup(this); + worldGroupManager.updateGroup(this); } } @@ -84,7 +92,7 @@ public void addWorlds(Collection worlds) { public void addWorlds(Collection worlds, boolean updateConfig) { worlds.forEach(worldName -> this.addWorld(worldName, false)); if (updateConfig) { - this.plugin.getGroupManager().updateGroup(this); + worldGroupManager.updateGroup(this); } } @@ -106,7 +114,7 @@ public void removeWorld(String worldName) { public void removeWorld(String worldName, boolean updateConfig) { this.getWorlds().remove(worldName.toLowerCase()); if (updateConfig) { - plugin.getGroupManager().updateGroup(this); + worldGroupManager.updateGroup(this); } } @@ -134,7 +142,7 @@ public void removeAllWorlds() { public void removeAllWorlds(boolean updateConfig) { this.worlds.clear(); if (updateConfig) { - this.plugin.getGroupManager().updateGroup(this); + worldGroupManager.updateGroup(this); } } @@ -222,7 +230,7 @@ public boolean isDefault() { * @return the profile container for this group. */ public ProfileContainer getGroupProfileContainer() { - return plugin.getGroupProfileContainerStore().getContainer(getName()); + return profileContainerStoreProvider.getStore(ContainerType.GROUP).getContainer(getName()); } @Override diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/WorldGroupManager.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/WorldGroupManager.java similarity index 91% rename from src/main/java/org/mvplugins/multiverse/inventories/profile/WorldGroupManager.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/group/WorldGroupManager.java index a79ca089..3cc7ede4 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/WorldGroupManager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/WorldGroupManager.java @@ -1,14 +1,22 @@ -package org.mvplugins.multiverse.inventories.profile; +package org.mvplugins.multiverse.inventories.profile.group; -import org.mvplugins.multiverse.inventories.WorldGroup; import org.bukkit.command.CommandSender; +import org.jvnet.hk2.annotations.Contract; +import org.mvplugins.multiverse.external.vavr.control.Try; +import java.io.IOException; import java.util.List; /** * Manager class for manipulating the groups of this plugin that are contained in the groups configuration. */ -public interface WorldGroupManager { +@Contract +public sealed interface WorldGroupManager permits AbstractWorldGroupManager { + + /** + *

Loads the groups from storage.

+ */ + Try load(); /** *

Retrieves the world group associated with the given name.

diff --git a/src/main/java/org/mvplugins/multiverse/inventories/YamlWorldGroupManager.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java similarity index 74% rename from src/main/java/org/mvplugins/multiverse/inventories/YamlWorldGroupManager.java rename to src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java index 9ef34daa..b0854893 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/YamlWorldGroupManager.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/group/YamlWorldGroupManager.java @@ -1,11 +1,18 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.profile.group; import com.dumptruckman.minecraft.util.Logging; import com.google.common.collect.Lists; +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.world.WorldManager; import org.mvplugins.multiverse.external.commentedconfiguration.CommentedConfiguration; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.external.vavr.control.Try; +import org.mvplugins.multiverse.inventories.MultiverseInventories; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; +import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider; import org.mvplugins.multiverse.inventories.share.Sharables; import org.mvplugins.multiverse.inventories.util.DeserializationException; -import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.configuration.Configuration; @@ -16,12 +23,12 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +@Service final class YamlWorldGroupManager extends AbstractWorldGroupManager { private final String[] groupSectionComments = { @@ -31,47 +38,57 @@ final class YamlWorldGroupManager extends AbstractWorldGroupManager { "# No support will be given for those who manually edit these groups." }; - private final CommentedConfiguration groupsConfig; + private CommentedConfiguration groupsConfig; - YamlWorldGroupManager(final MultiverseInventories inventories, final Configuration config) throws IOException { - super(inventories); + @Inject + YamlWorldGroupManager( + @NotNull MultiverseInventories plugin, + @NotNull InventoriesConfig inventoriesConfig, + @NotNull ProfileContainerStoreProvider profileContainerStoreProvider, + @NotNull WorldManager worldManager) { + super(plugin, inventoriesConfig, profileContainerStoreProvider, worldManager); + } - // Check if the group config file exists. If not, create it and migrate group data. - File groupsConfigFile = new File(plugin.getDataFolder(), "groups.yml"); - boolean groupsConfigFileExists = groupsConfigFile.exists(); - boolean migrateGroups = false; - if (!groupsConfigFile.exists()) { - Logging.fine("Created groups file."); - groupsConfigFile.createNewFile(); - migrateGroups = true; - } - // Load the configuration file into memory - groupsConfig = new CommentedConfiguration(groupsConfigFile.toPath()); - groupsConfig.load(); + @Override + public Try load() { + return Try.run(() -> { + // Check if the group config file exists. If not, create it and migrate group data. + File groupsConfigFile = new File(plugin.getDataFolder(), "groups.yml"); + boolean migrateGroups = false; + if (!groupsConfigFile.exists()) { + Logging.fine("Created groups file."); + groupsConfigFile.createNewFile(); + migrateGroups = true; + } + // Load the configuration file into memory + groupsConfig = new CommentedConfiguration(groupsConfigFile.toPath()); + groupsConfig.load(); - if (migrateGroups) { - migrateGroups(config); - } + if (migrateGroups) { + migrateGroups(inventoriesConfig.getConfig()); + } - groupsConfig.addComment("groups", groupSectionComments); - if (groupsConfig.get("groups") == null) { - this.getConfig().createSection("groups"); - } + groupsConfig.addComment("groups", groupSectionComments); + if (groupsConfig.get("groups") == null) { + this.getConfig().createSection("groups"); + } - // Saves the configuration from memory to file - groupsConfig.save(); + // Saves the configuration from memory to file + groupsConfig.save(); - // Setup groups in memory - final List worldGroups = getGroupsFromConfig(); - if (worldGroups == null) { - Logging.info("No world groups have been configured!"); - Logging.info("This will cause all worlds configured for Multiverse to have separate player statistics/inventories."); - return; - } + // Setup groups in memory + final List worldGroups = getGroupsFromConfig(); + if (worldGroups == null) { + Logging.info("No world groups have been configured!"); + Logging.info("This will cause all worlds configured for Multiverse to have separate player " + + "statistics/inventories."); + return; + } - for (final WorldGroup worldGroup : worldGroups) { - getGroupNames().put(worldGroup.getName().toLowerCase(), worldGroup); - } + for (final WorldGroup worldGroup : worldGroups) { + getGroupNames().put(worldGroup.getName().toLowerCase(), worldGroup); + } + }); } private void migrateGroups(final Configuration config) { @@ -124,7 +141,7 @@ private List getGroupsFromConfig() { private WorldGroup deserializeGroup(final String name, final Map dataMap) throws DeserializationException { - WorldGroup profile = new WorldGroup(this.plugin, name); + WorldGroup profile = new WorldGroup(this, profileContainerStoreProvider, name); if (dataMap.containsKey("worlds")) { Object worldListObj = dataMap.get("worlds"); if (worldListObj == null) { diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultSerializer.java b/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultSerializer.java index ef524d28..1765b9db 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultSerializer.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultSerializer.java @@ -8,7 +8,7 @@ */ final class DefaultSerializer implements SharableSerializer { - private Class type; + private final Class type; public DefaultSerializer(Class type) { this.type = type; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultStringSerializer.java b/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultStringSerializer.java index f2c2c329..7f5f85d3 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultStringSerializer.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/DefaultStringSerializer.java @@ -15,8 +15,8 @@ */ final class DefaultStringSerializer implements SharableSerializer { - private Method valueOfMethod; - private Class clazz; + private final Method valueOfMethod; + private final Class clazz; DefaultStringSerializer(Class clazz) { this.clazz = clazz; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/InventorySerializer.java b/src/main/java/org/mvplugins/multiverse/inventories/share/InventorySerializer.java index f4cca144..4fdd7e57 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/InventorySerializer.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/InventorySerializer.java @@ -13,7 +13,7 @@ */ public final class InventorySerializer implements SharableSerializer { - private int inventorySize; + private final int inventorySize; public InventorySerializer(final int inventorySize) { this.inventorySize = inventorySize; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/LocationSerializer.java b/src/main/java/org/mvplugins/multiverse/inventories/share/LocationSerializer.java index 98554ddf..a28e3f10 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/LocationSerializer.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/LocationSerializer.java @@ -1,6 +1,6 @@ package org.mvplugins.multiverse.inventories.share; -import org.mvplugins.multiverse.inventories.DataStrings; +import org.mvplugins.multiverse.inventories.util.DataStrings; import org.bukkit.Location; import java.util.Map; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/PotionEffectSerializer.java b/src/main/java/org/mvplugins/multiverse/inventories/share/PotionEffectSerializer.java index 753170b6..191f21f8 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/PotionEffectSerializer.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/PotionEffectSerializer.java @@ -1,6 +1,6 @@ package org.mvplugins.multiverse.inventories.share; -import org.mvplugins.multiverse.inventories.DataStrings; +import org.mvplugins.multiverse.inventories.util.DataStrings; import org.bukkit.potion.PotionEffect; import java.util.ArrayList; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/ProfileEntry.java b/src/main/java/org/mvplugins/multiverse/inventories/share/ProfileEntry.java index 7145eb07..2d19d5d7 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/ProfileEntry.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/ProfileEntry.java @@ -9,11 +9,11 @@ */ public final class ProfileEntry { - private static final Map STATS_MAP = new HashMap(); - private static final Map OTHERS_MAP = new HashMap(); + private static final Map STATS_MAP = new HashMap<>(); + private static final Map OTHERS_MAP = new HashMap<>(); - private boolean isStat; - private String fileTag; + private final boolean isStat; + private final String fileTag; public ProfileEntry(boolean isStat, String fileTag) { this.isStat = isStat; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/SharableGroup.java b/src/main/java/org/mvplugins/multiverse/inventories/share/SharableGroup.java index 80724ddf..dc50a618 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/SharableGroup.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/SharableGroup.java @@ -11,8 +11,8 @@ */ public final class SharableGroup implements Shares { - private String[] names; - private Shares shares; + private final String[] names; + private final Shares shares; public SharableGroup(String name, Shares shares, String... alternateNames) { this.names = new String[alternateNames.length + 1]; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java b/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java index 4cbba286..32362050 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/share/Sharables.java @@ -5,10 +5,11 @@ import org.bukkit.Registry; import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter; import org.mvplugins.multiverse.inventories.MultiverseInventories; -import org.mvplugins.multiverse.inventories.SpawnChangeListener; -import org.mvplugins.multiverse.inventories.WorldGroup; -import org.mvplugins.multiverse.inventories.DataStrings; -import org.mvplugins.multiverse.inventories.PlayerStats; +import org.mvplugins.multiverse.inventories.listeners.SpawnChangeListener; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroup; +import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager; +import org.mvplugins.multiverse.inventories.util.DataStrings; +import org.mvplugins.multiverse.inventories.util.PlayerStats; import org.mvplugins.multiverse.inventories.profile.PlayerProfile; import org.mvplugins.multiverse.inventories.util.MinecraftTools; import org.bukkit.Location; @@ -680,10 +681,10 @@ static boolean register(Sharable sharable) { if (!ALL_SHARABLES.contains(sharable)) { // If the plugin has been enabled, we need to add this sharable to the existing groups with all sharables. if (inventories != null) { - for (WorldGroup group : inventories.getGroupManager().getGroups()) { + var worldGroupManager = inventories.getServiceLocator().getService(WorldGroupManager.class); + for (WorldGroup group : worldGroupManager.getGroups()) { if (group.getShares().isSharing(Sharables.all())) { group.getShares().setSharing(sharable, true); - } } } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/DataStrings.java b/src/main/java/org/mvplugins/multiverse/inventories/util/DataStrings.java similarity index 99% rename from src/main/java/org/mvplugins/multiverse/inventories/DataStrings.java rename to src/main/java/org/mvplugins/multiverse/inventories/util/DataStrings.java index 5c0fe74c..cdf2eff3 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/DataStrings.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/util/DataStrings.java @@ -1,4 +1,4 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.util; import com.dumptruckman.minecraft.util.Logging; import net.minidev.json.JSONArray; diff --git a/src/main/java/org/mvplugins/multiverse/inventories/util/Perm.java b/src/main/java/org/mvplugins/multiverse/inventories/util/Perm.java index 19a57595..2afe533f 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/util/Perm.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/util/Perm.java @@ -8,6 +8,7 @@ import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.PluginManager; +import org.mvplugins.multiverse.inventories.config.InventoriesConfig; /** * @author dumptruckman @@ -182,7 +183,8 @@ public Permission getBypassPermission(String finalNode) { * @return True if player is allowed to bypass. */ public boolean hasBypass(Player player, String name) { - if (inventories != null && !inventories.getMVIConfig().isUsingBypass()) { + if (inventories != null && + !inventories.getServiceLocator().getService(InventoriesConfig.class).isUsingBypass()) { return false; } Permission bypassPerm = this.getBypassPermission(name); @@ -190,7 +192,7 @@ public boolean hasBypass(Player player, String name) { if (hasBypass) { Logging.fine("Player: " + player.getName() + " in World: " + player.getWorld().getName() + " has permission: " + bypassPerm.getName() + "(Default: " - + bypassPerm.getDefault().toString() + ")!"); + + bypassPerm.getDefault() + ")!"); } return hasBypass; } diff --git a/src/main/java/org/mvplugins/multiverse/inventories/PlayerStats.java b/src/main/java/org/mvplugins/multiverse/inventories/util/PlayerStats.java similarity index 96% rename from src/main/java/org/mvplugins/multiverse/inventories/PlayerStats.java rename to src/main/java/org/mvplugins/multiverse/inventories/util/PlayerStats.java index f5bcb332..c7e46921 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/PlayerStats.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/util/PlayerStats.java @@ -1,4 +1,4 @@ -package org.mvplugins.multiverse.inventories; +package org.mvplugins.multiverse.inventories.util; /** * A collection of values relating to a Minecraft player.