From b7de3e8c11a204ea59a77c6305945edc20deb272 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Tue, 18 Oct 2022 11:25:47 +0200 Subject: [PATCH] Added max range for exp spliting --- .../mmocore/api/player/PlayerData.java | 34 +++++++++++-------- .../mmocore/manager/ConfigManager.java | 7 ++-- MMOCore-Dist/src/main/resources/config.yml | 5 +++ 3 files changed, 29 insertions(+), 17 deletions(-) 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 24e1a492..4360f3d0 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 @@ -4,8 +4,6 @@ import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.player.cooldown.CooldownMap; import io.lumine.mythic.lib.player.skill.PassiveSkill; -import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; -import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; @@ -32,6 +30,7 @@ import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import net.Indyuce.mmocore.guild.provided.Guild; import net.Indyuce.mmocore.loot.chest.particle.SmallParticleEffect; import net.Indyuce.mmocore.party.AbstractParty; +import net.Indyuce.mmocore.party.provided.MMOCorePartyModule; import net.Indyuce.mmocore.party.provided.Party; import net.Indyuce.mmocore.player.Unlockable; import net.Indyuce.mmocore.skill.ClassSkill; @@ -59,6 +58,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.*; import java.util.logging.Level; +import java.util.stream.Collectors; public class PlayerData extends OfflinePlayerData implements Closable, ExperienceTableClaimer { @@ -299,7 +299,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public void resetSkillTree(SkillTree skillTree) { for (SkillTreeNode node : skillTree.getNodes()) { - node.getExperienceTable().reset(this,node); + node.getExperienceTable().reset(this, node); setNodeLevel(node, 0); } skillTree.setupNodeState(this); @@ -337,7 +337,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public void close() { // Remove from party if it is MMO Party Module - if(MMOCore.plugin.partyModule instanceof MMOCorePartyModule) { + if (MMOCore.plugin.partyModule instanceof MMOCorePartyModule) { AbstractParty party = getParty(); if (party != null && party instanceof Party) ((Party) party).removeMember(this); @@ -751,19 +751,25 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc if (value <= 0) return; - if (hasReachedMaxLevel()) { - setExperience(0); - return; - } - // Splitting exp through party members AbstractParty party; if (splitExp && (party = getParty()) != null) { - List onlineMembers = party.getOnlineMembers(); - value /= onlineMembers.size(); - for (PlayerData member : onlineMembers) - if (!equals(member)) - member.giveExperience(value, source, null, false); + final List nearbyMembers = party.getOnlineMembers().stream() + .filter(pd -> { + if (equals(pd)) + return false; + final double maxDis = MMOCore.plugin.configManager.partyMaxExpSplitRange; + return maxDis <= 0 || pd.getPlayer().getLocation().distanceSquared(getPlayer().getLocation()) < maxDis * maxDis; + }).collect(Collectors.toList()); + value /= nearbyMembers.size(); + for (PlayerData member : nearbyMembers) + member.giveExperience(value, source, null, false); + } + + // Must be placed after exp spliting + if (hasReachedMaxLevel()) { + setExperience(0); + return; } // Apply buffs AFTER splitting exp diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index 6c99ef09..3e5d85ec 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -2,8 +2,8 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.ConfigFile; +import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType; @@ -26,8 +26,8 @@ public class ConfigManager { public String partyChatPrefix, noSkillBoundPlaceholder; public ChatColor staminaFull, staminaHalf, staminaEmpty; public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown; - public double lootChestsChanceWeight, fishingDropsChanceWeight; - public int maxPartyLevelDifference,maxBoundActiveSkills,maxBoundPassiveSkills,waypointWarpTime; + public double lootChestsChanceWeight, fishingDropsChanceWeight, partyMaxExpSplitRange; + public int maxPartyLevelDifference, maxBoundActiveSkills, maxBoundPassiveSkills, waypointWarpTime; private final FileConfiguration messages; @@ -109,6 +109,7 @@ public class ConfigManager { lootChestsChanceWeight = MMOCore.plugin.getConfig().getDouble("chance-stat-weight.loot-chests"); fishingDropsChanceWeight = MMOCore.plugin.getConfig().getDouble("chance-stat-weight.fishing-drops"); maxPartyLevelDifference = MMOCore.plugin.getConfig().getInt("party.max-level-difference"); + partyMaxExpSplitRange = MMOCore.plugin.getConfig().getDouble("party.max-exp-split-range"); splitProfessionExp = MMOCore.plugin.getConfig().getBoolean("party.profession-exp-split"); disableQuestBossBar = MMOCore.plugin.getConfig().getBoolean("mmocore-quests.disable-boss-bar"); diff --git a/MMOCore-Dist/src/main/resources/config.yml b/MMOCore-Dist/src/main/resources/config.yml index 40a456b7..a6d6024c 100644 --- a/MMOCore-Dist/src/main/resources/config.yml +++ b/MMOCore-Dist/src/main/resources/config.yml @@ -149,6 +149,11 @@ party: # that feature. max-level-difference: 3 + # Exp won't be split if players are too far apart. + # + # Set to 0 to disable + max-exp-split-range: 50 + # When enabled, being in a party also splits profession exp profession-exp-split: false