From ba2691daf2932c821e03e70a59b98fd775750960 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Tue, 14 Jun 2022 09:39:58 +0200 Subject: [PATCH] Fixed exp splitting + now supports professions --- .../mmocore/api/event/PlayerLevelUpEvent.java | 4 ++- .../mmocore/api/player/PlayerData.java | 15 ++++---- .../rpg/admin/ExperienceCommandTreeNode.java | 4 +-- .../Indyuce/mmocore/experience/EXPSource.java | 3 ++ .../mmocore/experience/PlayerProfessions.java | 36 ++++++++++++------- .../mmocore/experience/Profession.java | 2 +- .../listener/profession/FishingListener.java | 2 +- .../manager/social/BoosterManager.java | 7 ++-- 8 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/api/event/PlayerLevelUpEvent.java b/src/main/java/net/Indyuce/mmocore/api/event/PlayerLevelUpEvent.java index b02a90bc..0938dc8a 100644 --- a/src/main/java/net/Indyuce/mmocore/api/event/PlayerLevelUpEvent.java +++ b/src/main/java/net/Indyuce/mmocore/api/event/PlayerLevelUpEvent.java @@ -4,11 +4,12 @@ import org.bukkit.event.HandlerList; import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.api.player.PlayerData; +import org.jetbrains.annotations.Nullable; public class PlayerLevelUpEvent extends PlayerDataEvent { private static final HandlerList handlers = new HandlerList(); - // if null, this is main level + // If null, this is main level private final Profession profession; private final int oldLevel, newLevel; @@ -36,6 +37,7 @@ public class PlayerLevelUpEvent extends PlayerDataEvent { return profession != null; } + @Nullable public Profession getProfession() { return profession; } diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 8713d21f..b8e3922c 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -540,18 +540,19 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc return; } - value = MMOCore.plugin.boosterManager.calculateExp(null, value); - value *= 1 + getStats().getStat("ADDITIONAL_EXPERIENCE") / 100; - // Splitting exp through party members - AbstractParty party = getParty(); - if (splitExp && party != null) { - List onlineMembers = getParty().getOnlineMembers(); + AbstractParty party; + if (splitExp && (party = getParty()) != null) { + List onlineMembers = party.getOnlineMembers(); value /= onlineMembers.size(); for (PlayerData member : onlineMembers) - member.giveExperience(value, EXPSource.PARTY_SHARING, null, false); + if (!equals(member)) + member.giveExperience(value, source, null, false); } + // Apply buffs AFTER splitting exp + value *= (1 + getStats().getStat("ADDITIONAL_EXPERIENCE") / 100) * MMOCore.plugin.boosterManager.getMultiplier(null); + PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(this, value, source); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java index 5c4b7664..5bd2d305 100644 --- a/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExperienceCommandTreeNode.java @@ -23,9 +23,9 @@ public class ExperienceCommandTreeNode extends CommandTreeNode { addChild(new ActionCommandTreeNode(this, "set", PlayerData::setExperience, PlayerProfessions::setExperience)); addChild(new ActionCommandTreeNode(this, "give", (data, value) -> data.giveExperience(value, EXPSource.COMMAND), (professions, profession, - value) -> professions.giveExperience(profession, value, EXPSource.COMMAND, professions.getPlayerData().getPlayer().getLocation()))); + value) -> professions.giveExperience(profession, value, EXPSource.COMMAND))); addChild(new ActionCommandTreeNode(this, "take", (data, value) -> data.giveExperience(-value, EXPSource.COMMAND), (professions, profession, - value) -> professions.giveExperience(profession, -value, EXPSource.COMMAND, professions.getPlayerData().getPlayer().getLocation()))); + value) -> professions.giveExperience(profession, -value, EXPSource.COMMAND))); } public static class ActionCommandTreeNode extends CommandTreeNode { diff --git a/src/main/java/net/Indyuce/mmocore/experience/EXPSource.java b/src/main/java/net/Indyuce/mmocore/experience/EXPSource.java index 89f522f3..08ccf6c9 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/EXPSource.java +++ b/src/main/java/net/Indyuce/mmocore/experience/EXPSource.java @@ -19,7 +19,10 @@ public enum EXPSource { /** * When party members share exp + * + * @deprecated Not used anymore */ + @Deprecated PARTY_SHARING, /** diff --git a/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java b/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java index 44f3552c..9b0d11c1 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java +++ b/src/main/java/net/Indyuce/mmocore/experience/PlayerProfessions.java @@ -13,6 +13,7 @@ import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; +import net.Indyuce.mmocore.party.AbstractParty; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -22,6 +23,7 @@ import org.bukkit.configuration.ConfigurationSection; import javax.annotation.Nullable; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -147,15 +149,15 @@ public class PlayerProfessions { giveExperience(profession, total, source); } - public void giveExperience(Profession profession, double value, EXPSource source) { - giveExperience(profession, value, source, null); - } - public boolean hasReachedMaxLevel(Profession profession) { return profession.hasMaxLevel() && getLevel(profession) >= profession.getMaxLevel(); } - public void giveExperience(Profession profession, double value, EXPSource source, @Nullable Location hologramLocation) { + public void giveExperience(Profession profession, double value, EXPSource source) { + giveExperience(profession, value, source, null, true); + } + + public void giveExperience(Profession profession, double value, EXPSource source, @Nullable Location hologramLocation, boolean splitExp) { Validate.isTrue(playerData.isOnline(), "Cannot give experience to offline player"); if (value <= 0) return; @@ -165,23 +167,31 @@ public class PlayerProfessions { return; } - value = MMOCore.plugin.boosterManager.calculateExp(profession, value); + // Splitting exp through party members + AbstractParty party; + if (splitExp && (party = playerData.getParty()) != null) { + List onlineMembers = party.getOnlineMembers(); + value /= onlineMembers.size(); + for (PlayerData member : onlineMembers) + if (!member.equals(playerData)) + member.getCollectionSkills().giveExperience(profession, value, source, null, false); + } - // Adds functionality for additional experience per profession. - value *= 1 + playerData.getStats().getInstance("ADDITIONAL_EXPERIENCE_" + UtilityMethods.enumName(profession.getId())).getTotal() / 100; - - // Display hologram - if (hologramLocation != null) - MMOCoreUtils.displayIndicator(hologramLocation.add(.5, 1.5, .5), MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", "" + value).message()); + // Apply buffs AFTER splitting exp + value *= (1 + playerData.getStats().getStat("ADDITIONAL_EXPERIENCE_" + UtilityMethods.enumName(profession.getId())) / 100) * MMOCore.plugin.boosterManager.getMultiplier(profession); PlayerExperienceGainEvent event = new PlayerExperienceGainEvent(playerData, profession, value, source); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) return; + // Display hologram + if (hologramLocation != null) + MMOCoreUtils.displayIndicator(hologramLocation.add(.5, 1.5, .5), MMOCore.plugin.configManager.getSimpleMessage("exp-hologram", "exp", "" + value).message()); + exp.put(profession.getId(), Math.max(0, exp.getOrDefault(profession.getId(), 0.) + event.getExperience())); int level, oldLevel = getLevel(profession); - double needed,exp; + double needed, exp; /* * Loop for exp overload when leveling up, will continue diff --git a/src/main/java/net/Indyuce/mmocore/experience/Profession.java b/src/main/java/net/Indyuce/mmocore/experience/Profession.java index 42db02b1..ac71dc28 100644 --- a/src/main/java/net/Indyuce/mmocore/experience/Profession.java +++ b/src/main/java/net/Indyuce/mmocore/experience/Profession.java @@ -127,7 +127,7 @@ public class Profession extends PostLoadObject implements ExperienceObject { public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) { hologramLocation = !getOption(Profession.ProfessionOption.EXP_HOLOGRAMS) ? null : hologramLocation; - playerData.getCollectionSkills().giveExperience(this, experience, EXPSource.SOURCE, hologramLocation); + playerData.getCollectionSkills().giveExperience(this, experience, EXPSource.SOURCE, hologramLocation, true); } @Override diff --git a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java index 50c1405c..4f1e0588 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/profession/FishingListener.java @@ -197,7 +197,7 @@ public class FishingListener implements Listener { location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, 0, 4 * (RANDOM.nextDouble() - .5), RANDOM.nextDouble() + 1, 4 * (RANDOM.nextDouble() - .5), .08); if (MMOCore.plugin.fishingManager.hasLinkedProfession()) - playerData.getCollectionSkills().giveExperience(MMOCore.plugin.fishingManager.getLinkedProfession(), experienceDropped, EXPSource.FISHING, location); + playerData.getCollectionSkills().giveExperience(MMOCore.plugin.fishingManager.getLinkedProfession(), experienceDropped, EXPSource.FISHING, location, true); } } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/social/BoosterManager.java b/src/main/java/net/Indyuce/mmocore/manager/social/BoosterManager.java index 113b99ba..9d31ace6 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/social/BoosterManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/social/BoosterManager.java @@ -2,6 +2,7 @@ package net.Indyuce.mmocore.manager.social; import net.Indyuce.mmocore.experience.Booster; import net.Indyuce.mmocore.experience.Profession; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -48,7 +49,7 @@ public class BoosterManager { /** * @return Sums all current experience boosters values */ - public double getMultiplier(Profession profession) { + public double getMultiplier(@Nullable Profession profession) { double d = 1; for (Booster booster : map) @@ -58,10 +59,6 @@ public class BoosterManager { return d; } - public double calculateExp(Profession profession, double exp) { - return (exp * getMultiplier(profession)); - } - /** * @return Collection of currently registered boosters. Some of them can be * expired but are not unregistered yet!