From 7e134aac1d5d1efbb04f1c8a16729afa00858850 Mon Sep 17 00:00:00 2001 From: Jules Date: Sun, 14 May 2023 23:27:11 +0200 Subject: [PATCH] Force class on profile selection --- .../mmocore/api/player/PlayerData.java | 6 +- .../profile/ForceClassProfileDataModule.java | 79 +++++++++++++++++++ .../profile/MMOCoreProfileDataModule.java | 16 +--- .../mmocore/gui/ClassConfirmation.java | 8 +- .../net/Indyuce/mmocore/gui/ClassSelect.java | 2 +- .../data/sql/MMOCoreDataSynchronizer.java | 19 ++--- .../data/yaml/YAMLPlayerDataHandler.java | 30 ++++--- .../mmocore/player/DefaultPlayerData.java | 5 +- .../net/Indyuce/mmocore/MMOCoreBukkit.java | 5 ++ MMOCore-Dist/src/main/resources/config.yml | 3 +- 10 files changed, 127 insertions(+), 46 deletions(-) create mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/ForceClassProfileDataModule.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index ba83c86c..5f90a2bc 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -669,7 +669,11 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD } public void unloadClassInfo(PlayerClass profess) { - classSlots.remove(profess.getId()); + unloadClassInfo(profess.getId()); + } + + public void unloadClassInfo(String profess) { + classSlots.remove(profess); } public Set getWaypoints() { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/ForceClassProfileDataModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/ForceClassProfileDataModule.java new file mode 100644 index 00000000..2a411e3f --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/ForceClassProfileDataModule.java @@ -0,0 +1,79 @@ +package net.Indyuce.mmocore.comp.profile; + +import fr.phoenixdevt.profile.ProfileDataModule; +import fr.phoenixdevt.profile.ProfileProvider; +import fr.phoenixdevt.profile.event.ProfileCreateEvent; +import fr.phoenixdevt.profile.event.ProfileRemoveEvent; +import fr.phoenixdevt.profile.event.ProfileSelectEvent; +import fr.phoenixdevt.profile.event.ProfileUnloadEvent; +import fr.phoenixdevt.profile.placeholder.PlaceholderRequest; +import io.lumine.mythic.lib.api.event.SynchronizedDataLoadEvent; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.manager.InventoryManager; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.plugin.java.JavaPlugin; + +public class ForceClassProfileDataModule implements ProfileDataModule, Listener { + public ForceClassProfileDataModule() { + final ProfileProvider provider = Bukkit.getServicesManager().getRegistration(ProfileProvider.class).getProvider(); + provider.registerModule(this); + } + + @Override + public JavaPlugin getOwningPlugin() { + return MMOCore.plugin; + } + + @Override + public boolean hasPlaceholders() { + return false; + } + + @Override + public String getIdentifier() { + return "mmocore_force_class"; + } + + @Override + public void processPlaceholderRequest(PlaceholderRequest placeholderRequest) { + throw new RuntimeException("Not supported"); + } + + /** + * Force class before profile creation + */ + @EventHandler + public void onProfileCreate(ProfileCreateEvent event) { + final PlayerData playerData = PlayerData.get(event.getPlayerData().getUniqueId()); + InventoryManager.CLASS_SELECT.newInventory(playerData, () -> event.validate(this)).open(); + } + + /** + * Force class before profile selection once MMOCore loaded its data + */ + @EventHandler + public void onDataLoad(SynchronizedDataLoadEvent event) { + if (event.getManager().getOwningPlugin().equals(MMOCore.plugin)) { + final PlayerData playerData = (PlayerData) event.getHolder(); + final ProfileSelectEvent event1 = (ProfileSelectEvent) event.getProfileEvent(); + + // Validate if necessary + if (playerData.getProfess().equals(MMOCore.plugin.classManager.getDefaultClass())) + InventoryManager.CLASS_SELECT.newInventory(playerData, () -> event1.validate(this)).open(); + else event1.validate(this); + } + } + + @EventHandler + public void onProfileRemove(ProfileRemoveEvent event) { + event.validate(this); + } + + @EventHandler + public void onProfileUnload(ProfileUnloadEvent event) { + event.validate(this); + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/MMOCoreProfileDataModule.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/MMOCoreProfileDataModule.java index 57f6c09b..76dfe6d5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/MMOCoreProfileDataModule.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/comp/profile/MMOCoreProfileDataModule.java @@ -2,7 +2,7 @@ package net.Indyuce.mmocore.comp.profile; import fr.phoenixdevt.profile.ProfileDataModule; import fr.phoenixdevt.profile.event.ProfileCreateEvent; -import fr.phoenixdevt.profile.event.ProfileDeleteEvent; +import fr.phoenixdevt.profile.event.ProfileRemoveEvent; import fr.phoenixdevt.profile.placeholder.PlaceholderRequest; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.player.MMOPlayerData; @@ -10,8 +10,6 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.experience.Profession; -import net.Indyuce.mmocore.manager.InventoryManager; -import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -55,19 +53,11 @@ public class MMOCoreProfileDataModule implements ProfileDataModule, Listener { @EventHandler public void onProfileCreate(ProfileCreateEvent event) { - - // Force to choose class first - if (MMOCore.plugin.configManager.forceClassSelection) { - final PlayerData playerData = PlayerData.get(event.getPlayerData().getUniqueId()); - InventoryManager.CLASS_SELECT.newInventory(playerData, () -> event.validate(this)).open(); - } - - // Validate event directly - else event.validate(this); + event.validate(this); } @EventHandler - public void onProfileDelete(ProfileDeleteEvent event) { + public void onProfileDelete(ProfileRemoveEvent event) { event.validate(this); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java index 2d31af07..d94443a4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassConfirmation.java @@ -39,12 +39,12 @@ public class ClassConfirmation extends EditableInventory { return function.equalsIgnoreCase("yes") ? new YesItem(config) : new SimplePlaceholderItem(config); } - public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean subclass) { - return newInventory(data, last, subclass, null); + public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean setClass) { + return newInventory(data, last, setClass, null); } - public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean subclass, @Nullable Runnable profileRunnable) { - return new ClassConfirmationInventory(data, this, playerClass, last, subclass, profileRunnable); + public GeneratedInventory newInventory(PlayerData data, PluginInventory last, boolean setClass, @Nullable Runnable profileRunnable) { + return new ClassConfirmationInventory(data, this, playerClass, last, setClass, profileRunnable); } public class UnlockedItem extends InventoryItem { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java index 7ae2667c..ddb1833a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/ClassSelect.java @@ -143,7 +143,7 @@ public class ClassSelect extends EditableInventory { canClose = true; final PlayerClass playerClass = findDeepestSubclass(playerData, profess); - InventoryManager.CLASS_CONFIRM.get(MMOCoreUtils.ymlName(playerClass.getId())).newInventory(playerData, this, false, profileRunnable).open(); + InventoryManager.CLASS_CONFIRM.get(MMOCoreUtils.ymlName(playerClass.getId())).newInventory(playerData, this, profileRunnable != null, profileRunnable).open(); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/sql/MMOCoreDataSynchronizer.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/sql/MMOCoreDataSynchronizer.java index cc7fc895..16ddddc3 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/sql/MMOCoreDataSynchronizer.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/sql/MMOCoreDataSynchronizer.java @@ -1,6 +1,9 @@ package net.Indyuce.mmocore.manager.data.sql; -import com.google.gson.*; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.data.sql.SQLDataSynchronizer; @@ -32,7 +35,8 @@ public class MMOCoreDataSynchronizer extends SQLDataSynchronizer { @Override public void loadData(ResultSet result) throws SQLException { - //Reset stats linked to triggers + + // Reset stats linked to triggers getData().resetTriggerStats(); getData().setClassPoints(result.getInt("class_points")); @@ -137,16 +141,7 @@ public class MMOCoreDataSynchronizer extends SQLDataSynchronizer { @Override public void loadEmptyData() { - final PlayerDataManager manager = MMOCore.plugin.playerDataManager; - getData().setLevel(manager.getDefaultData().getLevel()); - getData().setClassPoints(manager.getDefaultData().getClassPoints()); - getData().setSkillPoints(manager.getDefaultData().getSkillPoints()); - getData().setSkillReallocationPoints(manager.getDefaultData().getSkillReallocationPoints()); - getData().setAttributePoints(manager.getDefaultData().getAttributePoints()); - getData().setAttributeReallocationPoints(manager.getDefaultData().getAttributeReallocationPoints()); - getData().setExperience(0); - getData().getQuestData().updateBossBar(); - + MMOCore.plugin.playerDataManager.getDefaultData().apply(getData()); UtilityMethods.debug(MMOCore.plugin, "SQL", "Loaded DEFAULT data for: '" + getData().getUniqueId() + "' as no saved data was found."); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java index 351fb0c3..0d11a606 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java @@ -2,13 +2,12 @@ package net.Indyuce.mmocore.manager.data.yaml; import io.lumine.mythic.lib.data.yaml.YAMLSynchronizedDataHandler; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.manager.data.OfflinePlayerData; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.SavedClassInformation; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.guild.provided.Guild; -import net.Indyuce.mmocore.player.DefaultPlayerData; +import net.Indyuce.mmocore.manager.data.OfflinePlayerData; import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skilltree.SkillTreeNode; import org.apache.commons.lang.Validate; @@ -17,7 +16,8 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.UUID; import java.util.logging.Level; import java.util.stream.Collectors; @@ -42,17 +42,21 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler