mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 02:53:43 +01:00 
			
		
		
		
	some work on experience rewrites
This commit is contained in:
		
							
								
								
									
										12
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								pom.xml
									
									
									
									
									
								
							@@ -116,6 +116,8 @@
 | 
				
			|||||||
                            <include>net.kyori:adventure-text-serializer-bungeecord</include>
 | 
					                            <include>net.kyori:adventure-text-serializer-bungeecord</include>
 | 
				
			||||||
                            <include>net.kyori:adventure-text-serializer-craftbukkit</include>
 | 
					                            <include>net.kyori:adventure-text-serializer-craftbukkit</include>
 | 
				
			||||||
                            <include>co.aikar:acf-bukkit</include>
 | 
					                            <include>co.aikar:acf-bukkit</include>
 | 
				
			||||||
 | 
					                            <include>com.neetgames:mcMMO-API</include>
 | 
				
			||||||
 | 
					                            <include>com.neetgames:jmal</include>
 | 
				
			||||||
                        </includes>
 | 
					                        </includes>
 | 
				
			||||||
                    </artifactSet>
 | 
					                    </artifactSet>
 | 
				
			||||||
<!--                    <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>-->
 | 
					<!--                    <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>-->
 | 
				
			||||||
@@ -193,6 +195,16 @@
 | 
				
			|||||||
        <!-- ... -->
 | 
					        <!-- ... -->
 | 
				
			||||||
    </repositories>
 | 
					    </repositories>
 | 
				
			||||||
    <dependencies>
 | 
					    <dependencies>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>com.neetgames</groupId>
 | 
				
			||||||
 | 
					            <artifactId>mcMMO-API</artifactId>
 | 
				
			||||||
 | 
					            <version>0.01.00-SNAPSHOT</version>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>com.neetgames</groupId>
 | 
				
			||||||
 | 
					            <artifactId>jmal</artifactId>
 | 
				
			||||||
 | 
					            <version>0.01.00-SNAPSHOT</version>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>co.aikar</groupId>
 | 
					            <groupId>co.aikar</groupId>
 | 
				
			||||||
            <artifactId>acf-bukkit</artifactId> <!-- Don't forget to replace this -->
 | 
					            <artifactId>acf-bukkit</artifactId> <!-- Don't forget to replace this -->
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.experience.context.NullExperienceContext;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExperienceContextBuilder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final @NotNull NullExperienceContext nullExperienceContext = new NullExperienceContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Return a null experience context
 | 
				
			||||||
 | 
					     * @return a null experience context
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static NullExperienceContext nullContext() {
 | 
				
			||||||
 | 
					        return nullExperienceContext;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
				
			||||||
 | 
					import org.bukkit.NamespacedKey;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ExperienceGain {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the target skill for this XP gain
 | 
				
			||||||
 | 
					     * We define this by a String to allow for custom skills
 | 
				
			||||||
 | 
					     * @return The target skill
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @NotNull UUID getTargetSkill();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Value of the experience gain, this is the raw value before any mutations are done via modifiers or otherwise
 | 
				
			||||||
 | 
					     * @return the value of this {@link ExperienceGain}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    int getValue();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExperienceGainBuilder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
package com.gmail.nossr50.datatypes.player;
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.gmail.nossr50.config.Config;
 | 
					import com.gmail.nossr50.config.Config;
 | 
				
			||||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
					import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
				
			||||||
@@ -7,6 +7,8 @@ import com.gmail.nossr50.datatypes.experience.SkillXpGain;
 | 
				
			|||||||
import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
					import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.experience.XPGainSource;
 | 
					import com.gmail.nossr50.datatypes.experience.XPGainSource;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.party.Party;
 | 
					import com.gmail.nossr50.datatypes.party.Party;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.player.PersistentPlayerData;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
					import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
				
			||||||
import com.gmail.nossr50.mcMMO;
 | 
					import com.gmail.nossr50.mcMMO;
 | 
				
			||||||
import com.gmail.nossr50.party.ShareHandler;
 | 
					import com.gmail.nossr50.party.ShareHandler;
 | 
				
			||||||
@@ -26,19 +28,24 @@ import org.jetbrains.annotations.NotNull;
 | 
				
			|||||||
import org.jetbrains.annotations.Nullable;
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class ExperienceManager {
 | 
					public class ExperienceManager {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean isUsingUnarmed = false;
 | 
					    private boolean isUsingUnarmed = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final @NotNull PersistentPlayerData persistentPlayerDataRef;
 | 
					    private final @NotNull PersistentPlayerData persistentPlayerDataRef;
 | 
				
			||||||
    private final @NotNull McMMOPlayer mmoPlayer;
 | 
					    private @Nullable McMMOPlayer mmoPlayer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public ExperienceManager(@NotNull McMMOPlayer mmoPlayer) {
 | 
					    public ExperienceManager(@NotNull McMMOPlayer mmoPlayer) {
 | 
				
			||||||
        this.mmoPlayer = mmoPlayer;
 | 
					        this.mmoPlayer = mmoPlayer;
 | 
				
			||||||
        this.persistentPlayerDataRef = mmoPlayer.getPersistentPlayerData();
 | 
					        this.persistentPlayerDataRef = mmoPlayer.getPersistentPlayerData();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExperienceManager(@NotNull PersistentPlayerData persistentPlayerData) {
 | 
				
			||||||
 | 
					        this.persistentPlayerDataRef = persistentPlayerData;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Gets the power level of this player.
 | 
					     * Gets the power level of this player.
 | 
				
			||||||
     * A power level is the sum of all skill levels for this player
 | 
					     * A power level is the sum of all skill levels for this player
 | 
				
			||||||
@@ -60,7 +67,7 @@ public class ExperienceManager {
 | 
				
			|||||||
     * @param primarySkillType target skill
 | 
					     * @param primarySkillType target skill
 | 
				
			||||||
     * @return the value of raw XP for target skill
 | 
					     * @return the value of raw XP for target skill
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public float getSkillXpLevelRaw(PrimarySkillType primarySkillType) {
 | 
					    public float getSkillXpLevelRaw(@NotNull PrimarySkillType primarySkillType) {
 | 
				
			||||||
        return persistentPlayerDataRef.getSkillsExperienceMap().get(primarySkillType);
 | 
					        return persistentPlayerDataRef.getSkillsExperienceMap().get(primarySkillType);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -289,7 +296,7 @@ public class ExperienceManager {
 | 
				
			|||||||
    public float getRegisteredXpGain(@NotNull PrimarySkillType primarySkillType) {
 | 
					    public float getRegisteredXpGain(@NotNull PrimarySkillType primarySkillType) {
 | 
				
			||||||
        float xp = 0F;
 | 
					        float xp = 0F;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (rollingSkillsXp.get(primarySkillType) != null) {
 | 
					        if (get(primarySkillType) != null) { //??
 | 
				
			||||||
            xp = rollingSkillsXp.get(primarySkillType);
 | 
					            xp = rollingSkillsXp.get(primarySkillType);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -359,15 +366,18 @@ public class ExperienceManager {
 | 
				
			|||||||
     * @param xp Experience amount to add
 | 
					     * @param xp Experience amount to add
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void applyXpGain(@NotNull PrimarySkillType primarySkillType, float xp, @NotNull XPGainReason xpGainReason, @NotNull XPGainSource xpGainSource) {
 | 
					    public void applyXpGain(@NotNull PrimarySkillType primarySkillType, float xp, @NotNull XPGainReason xpGainReason, @NotNull XPGainSource xpGainSource) {
 | 
				
			||||||
        if (!primarySkillType.getPermissions(mmoPlayer.getPlayer())) {
 | 
					        //Only check for permissions if the player is online, otherwise just assume a command is being executed by an admin or some other means and add the XP
 | 
				
			||||||
            return;
 | 
					        if(mmoPlayer != null) {
 | 
				
			||||||
 | 
					            if (!primarySkillType.getPermissions(mmoPlayer.getPlayer())) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (primarySkillType.isChildSkill()) {
 | 
					        if (primarySkillType.isChildSkill()) {
 | 
				
			||||||
            Set<PrimarySkillType> parentSkills = FamilyTree.getParents(primarySkillType);
 | 
					            Set<PrimarySkillType> parentSkills = FamilyTree.getParents(primarySkillType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (PrimarySkillType parentSkill : parentSkills) {
 | 
					            for (PrimarySkillType parentSkill : parentSkills) {
 | 
				
			||||||
                applyXpGain(mmoPlayer, parentSkill, xp / parentSkills.size(), xpGainReason, xpGainSource);
 | 
					                applyXpGain(parentSkill, xp / parentSkills.size(), xpGainReason, xpGainSource);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -377,16 +387,22 @@ public class ExperienceManager {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mmoPlayer.getExperienceManager().setUsingUnarmed(primarySkillType == PrimarySkillType.UNARMED);
 | 
					        setUsingUnarmed(primarySkillType == PrimarySkillType.UNARMED);
 | 
				
			||||||
        updateLevelStats(mmoPlayer, primarySkillType, xpGainReason, xpGainSource);
 | 
					        updateLevelStats(primarySkillType, xpGainReason, xpGainSource);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void processPostXpEvent(@NotNull PrimarySkillType primarySkillType, @NotNull Plugin plugin, @NotNull XPGainSource xpGainSource)
 | 
					    public void processPostXpEvent(@NotNull PrimarySkillType primarySkillType, @NotNull Plugin plugin, @NotNull XPGainSource xpGainSource)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					         * Everything in this method requires an online player, so if they aren't online we don't waste our time
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        if(mmoPlayer == null)
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //Check if they've reached the power level cap just now
 | 
					        //Check if they've reached the power level cap just now
 | 
				
			||||||
        if(mmoPlayer.getExperienceManager().hasReachedPowerLevelCap()) {
 | 
					        if(hasReachedPowerLevelCap()) {
 | 
				
			||||||
            NotificationManager.sendPlayerInformationChatOnly(mmoPlayer.getPlayer(), "LevelCap.PowerLevel", String.valueOf(Config.getInstance().getPowerLevelCap()));
 | 
					            NotificationManager.sendPlayerInformationChatOnly(mmoPlayer.getPlayer(), "LevelCap.PowerLevel", String.valueOf(Config.getInstance().getPowerLevelCap()));
 | 
				
			||||||
        } else if(mmoPlayer.getExperienceManager().hasReachedLevelCap(primarySkillType)) {
 | 
					        } else if(hasReachedLevelCap(primarySkillType)) {
 | 
				
			||||||
            NotificationManager.sendPlayerInformationChatOnly(mmoPlayer.getPlayer(), "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(primarySkillType)), primarySkillType.getName());
 | 
					            NotificationManager.sendPlayerInformationChatOnly(mmoPlayer.getPlayer(), "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(primarySkillType)), primarySkillType.getName());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -407,25 +423,24 @@ public class ExperienceManager {
 | 
				
			|||||||
     * @param primarySkillType The skill to check
 | 
					     * @param primarySkillType The skill to check
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void updateLevelStats(@NotNull PrimarySkillType primarySkillType, @NotNull XPGainReason xpGainReason, @NotNull XPGainSource xpGainSource) {
 | 
					    public void updateLevelStats(@NotNull PrimarySkillType primarySkillType, @NotNull XPGainReason xpGainReason, @NotNull XPGainSource xpGainSource) {
 | 
				
			||||||
        ExperienceManager em = mmoPlayer.getExperienceManager();
 | 
					        if(hasReachedLevelCap(primarySkillType))
 | 
				
			||||||
        if(em.hasReachedLevelCap(primarySkillType))
 | 
					 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (em.getSkillXpLevelRaw(primarySkillType) < em.getXpToLevel(primarySkillType)) {
 | 
					        if (getSkillXpLevelRaw(primarySkillType) < getXpToLevel(primarySkillType)) {
 | 
				
			||||||
            processPostXpEvent(mmoPlayer, primarySkillType, mcMMO.p, xpGainSource);
 | 
					            processPostXpEvent(primarySkillType, mcMMO.p, xpGainSource);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int levelsGained = 0;
 | 
					        int levelsGained = 0;
 | 
				
			||||||
        float xpRemoved = 0;
 | 
					        float xpRemoved = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while (em.getSkillXpLevelRaw(primarySkillType) >= em.getXpToLevel(primarySkillType)) {
 | 
					        while (getSkillXpLevelRaw(primarySkillType) >= getXpToLevel(primarySkillType)) {
 | 
				
			||||||
            if (em.hasReachedLevelCap(primarySkillType)) {
 | 
					            if (hasReachedLevelCap(primarySkillType)) {
 | 
				
			||||||
                em.setSkillXpValue(primarySkillType, 0);
 | 
					                setSkillXpValue(primarySkillType, 0);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            xpRemoved += em.levelUp(primarySkillType);
 | 
					            xpRemoved += levelUp(primarySkillType);
 | 
				
			||||||
            levelsGained++;
 | 
					            levelsGained++;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -441,10 +456,10 @@ public class ExperienceManager {
 | 
				
			|||||||
         * Check to see if the player unlocked any new skills
 | 
					         * Check to see if the player unlocked any new skills
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NotificationManager.sendPlayerLevelUpNotification(mmoPlayer, primarySkillType, levelsGained, em.getSkillLevel(primarySkillType));
 | 
					        NotificationManager.sendPlayerLevelUpNotification(mmoPlayer, primarySkillType, levelsGained, getSkillLevel(primarySkillType));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //UPDATE XP BARS
 | 
					        //UPDATE XP BARS
 | 
				
			||||||
        processPostXpEvent(mmoPlayer, primarySkillType, mcMMO.p, xpGainSource);
 | 
					        processPostXpEvent(primarySkillType, mcMMO.p, xpGainSource);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExperienceProcessor {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public enum ExperienceVector {
 | 
				
			||||||
 | 
					    ALL,
 | 
				
			||||||
 | 
					    TARGETED,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface PartyExperienceGain extends ExperienceGain {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The original value of this experience gain
 | 
				
			||||||
 | 
					     * This is not equivalent to the amount of XP the players in party will get, but it was the value of the XP before it was distributed to party members
 | 
				
			||||||
 | 
					     * @return the original value of the experience gain
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    int originalValue();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.capture;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.experience.context.ExperienceContext;
 | 
				
			||||||
 | 
					import com.neetgames.mcmmo.skill.SkillIdentity;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExperienceCapture {
 | 
				
			||||||
 | 
					    private @NotNull ExperienceContext experienceContext;
 | 
				
			||||||
 | 
					    private @NotNull HashSet<SkillIdentity> affectedSkills;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExperienceCapture(@NotNull ExperienceContext experienceContext, @NotNull HashSet<SkillIdentity> affectedSkills) {
 | 
				
			||||||
 | 
					        this.experienceContext = experienceContext;
 | 
				
			||||||
 | 
					        this.affectedSkills = affectedSkills;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check whether or not a skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     * @param skillIdentity target skill
 | 
				
			||||||
 | 
					     * @return true if this skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean isSkillAffected(@NotNull SkillIdentity skillIdentity) {
 | 
				
			||||||
 | 
					        return affectedSkills.contains(skillIdentity);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.capture;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.player.PlayerProfile;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.skills.SkillIdentity;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ExperienceSnapshot {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check whether or not a skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param skillIdentity target skill
 | 
				
			||||||
 | 
					     * @return true if this skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    boolean isSkillAffected(@NotNull SkillIdentity skillIdentity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check whether or not a skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param skillId target skill
 | 
				
			||||||
 | 
					     * @return true if this skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    boolean isSkillAffected(@NotNull String skillId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check whether or not a skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param primarySkillType target skill
 | 
				
			||||||
 | 
					     * @return true if this skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     * @deprecated the {@link PrimarySkillType} type is going to be phased out in favour of {@link SkillIdentity} at some point in the future
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated
 | 
				
			||||||
 | 
					    boolean isSkillAffected(@NotNull PrimarySkillType primarySkillType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @NotNull PlayerProfile[] getPlayers();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.experience.capture.ExperienceCapture;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.experience.context.ExperienceContext;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.skills.SkillIdentity;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MultiExperienceCapture extends ExperienceCapture {
 | 
				
			||||||
 | 
					    private @NotNull ExperienceContext experienceContext;
 | 
				
			||||||
 | 
					    private @NotNull HashSet<SkillIdentity> affectedSkills;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExperienceCapture(@NotNull ExperienceContext experienceContext, @NotNull HashSet<SkillIdentity> affectedSkills) {
 | 
				
			||||||
 | 
					        this.experienceContext = experienceContext;
 | 
				
			||||||
 | 
					        this.affectedSkills = affectedSkills;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public MultiExperienceCapture(@NotNull ExperienceContext experienceContext, @NotNull HashSet<SkillIdentity> affectedSkills) {
 | 
				
			||||||
 | 
					        super(experienceContext, affectedSkills);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check whether or not a skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     * @param skillIdentity target skill
 | 
				
			||||||
 | 
					     * @return true if this skill is targeted in this experience capture
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean isSkillAffected(@NotNull SkillIdentity skillIdentity) {
 | 
				
			||||||
 | 
					        return affectedSkills.contains(skillIdentity);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.block.Block;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class BlockExperienceContext implements ExperienceContext {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @NotNull Block blockExperienceContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public BlockExperienceContext(@NotNull Block block) {
 | 
				
			||||||
 | 
					        this.blockExperienceContext = block;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Nullable
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Object getContext() {
 | 
				
			||||||
 | 
					        return blockExperienceContext;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the Block involved in this experience context
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return the {@link Block} involved in this experience context
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public @NotNull Block getBlockExperienceContext() {
 | 
				
			||||||
 | 
					        return blockExperienceContext;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.entity.LivingEntity;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class CombatContext implements ExperienceContext {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final @NotNull LivingEntity livingEntity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public CombatContext(@NotNull LivingEntity livingEntity) {
 | 
				
			||||||
 | 
					        this.livingEntity = livingEntity;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Nullable
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Object getContext() {
 | 
				
			||||||
 | 
					        return livingEntity;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the {@link LivingEntity} involved in this experience context
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return the {@link LivingEntity} involved in this experience context
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public @NotNull LivingEntity getLivingEntity() {
 | 
				
			||||||
 | 
					        return livingEntity;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.annotation.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ExperienceContext {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The source for this experience gain, can be anything from a block to an entity, etc
 | 
				
			||||||
 | 
					     * Context is available as long as it can be
 | 
				
			||||||
 | 
					     * @return the context (source) of this experience
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Nullable Object getContext();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Represents an experience context with an undefined source
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class NullExperienceContext implements ExperienceContext {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public @Nullable Object getContext() {
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.experience.context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface SharedExperienceContext {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The {@link McMMOPlayer} who originally gained the XP that was then shared
 | 
				
			||||||
 | 
					     * @return the {@link McMMOPlayer} to which this experience context originates
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @NotNull McMMOPlayer getSharedContextSource();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package com.gmail.nossr50.datatypes.player;
 | 
					package com.gmail.nossr50.datatypes.player;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.gmail.nossr50.datatypes.MobHealthBarType;
 | 
					import com.gmail.nossr50.datatypes.MobHealthBarType;
 | 
				
			||||||
 | 
					import com.gmail.nossr50.datatypes.experience.ExperienceManager;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.party.Party;
 | 
					import com.gmail.nossr50.datatypes.party.Party;
 | 
				
			||||||
import com.gmail.nossr50.mcMMO;
 | 
					import com.gmail.nossr50.mcMMO;
 | 
				
			||||||
import org.bukkit.entity.Player;
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes.skills;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface PrimarySkill {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -18,6 +18,9 @@ import org.jetbrains.annotations.Nullable;
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * Skills with parents do not gain experience, and instead their intended effects will be based on the strength of the parent skill (its level)
 | 
					 * Skills with parents do not gain experience, and instead their intended effects will be based on the strength of the parent skill (its level)
 | 
				
			||||||
 * Skills are registered, no two skills can share the same fully qualified name (in this case, a combination of the namespace and skill name)
 | 
					 * Skills are registered, no two skills can share the same fully qualified name (in this case, a combination of the namespace and skill name)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A fully qualified name is generated based on the namespace and skill name
 | 
				
			||||||
 | 
					 * @see #genFullyQualifiedName()
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class SkillIdentity {
 | 
					public class SkillIdentity {
 | 
				
			||||||
    @NotNull private final String nameSpace;
 | 
					    @NotNull private final String nameSpace;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.events.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.entity.Player;
 | 
				
			||||||
 | 
					import org.bukkit.event.HandlerList;
 | 
				
			||||||
 | 
					import org.bukkit.event.player.PlayerEvent;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExperienceCaptureEvent extends PlayerEvent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ExperienceCaptureEvent(@NotNull Player who) {
 | 
				
			||||||
 | 
					        super(who);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final HandlerList handlers = new HandlerList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public @NotNull HandlerList getHandlers() {
 | 
				
			||||||
 | 
					        return handlers;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static HandlerList getHandlerList() {
 | 
				
			||||||
 | 
					        return handlers;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -258,7 +258,7 @@ public class HerbalismManager extends SkillManager {
 | 
				
			|||||||
    public void checkDoubleDropsOnBrokenPlants(Player player, Collection<Block> brokenPlants) {
 | 
					    public void checkDoubleDropsOnBrokenPlants(Player player, Collection<Block> brokenPlants) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //Only proceed if skill unlocked and permission enabled
 | 
					        //Only proceed if skill unlocked and permission enabled
 | 
				
			||||||
        if (!RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS)
 | 
					        if (!RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.HERBALISM_DOUBLE_DROPS)
 | 
				
			||||||
                || !Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS)) {
 | 
					                || !Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,23 +1,12 @@
 | 
				
			|||||||
package com.gmail.nossr50.util.experience;
 | 
					package com.gmail.nossr50.util.experience;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.gmail.nossr50.config.Config;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
					import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.experience.XPGainSource;
 | 
					import com.gmail.nossr50.datatypes.experience.XPGainSource;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.player.ExperienceManager;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
					import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
					import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
				
			||||||
import com.gmail.nossr50.mcMMO;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.skills.child.FamilyTree;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.util.EventUtils;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.util.player.NotificationManager;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.util.sounds.SoundManager;
 | 
					 | 
				
			||||||
import com.gmail.nossr50.util.sounds.SoundType;
 | 
					 | 
				
			||||||
import org.bukkit.plugin.Plugin;
 | 
					import org.bukkit.plugin.Plugin;
 | 
				
			||||||
import org.jetbrains.annotations.NotNull;
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ExperienceUtils {
 | 
					public class ExperienceUtils {
 | 
				
			||||||
    private ExperienceUtils() {}
 | 
					    private ExperienceUtils() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user