mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-10-31 01:03:44 +01:00 
			
		
		
		
	Add + Wire up Combat XP Multipliers
This commit is contained in:
		| @@ -126,21 +126,6 @@ public class ExperienceConfig extends ConfigValidated { | ||||
|      * XP SETTINGS | ||||
|      */ | ||||
|  | ||||
|     /* Combat XP Multipliers */ | ||||
|     public double getCombatXP(EntityType entity) { | ||||
|         return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER, StringUtils.getEntityConfigName(entity)); | ||||
|     } | ||||
|  | ||||
|     public double getAnimalsXP(EntityType entity) { | ||||
|         return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER, StringUtils.getEntityConfigName(entity)); | ||||
|     } | ||||
|  | ||||
|     public boolean hasCombatXP(EntityType entity) { | ||||
|         return hasNode(EXPERIENCE, COMBAT, MULTIPLIER, StringUtils.getEntityConfigName(entity)); | ||||
|     } | ||||
|  | ||||
|     /* Materials  */ | ||||
|  | ||||
|     /** | ||||
|      * Gets the raw XP given for breaking this block, this does not include modifiers | ||||
|      * | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package com.gmail.nossr50.config.hocon.experience; | ||||
|  | ||||
| import com.gmail.nossr50.datatypes.experience.SpecialXPKey; | ||||
| import ninja.leaping.configurate.objectmapping.Setting; | ||||
| import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; | ||||
|  | ||||
| @@ -9,7 +10,7 @@ import java.util.HashMap; | ||||
| public class ConfigExperienceCombat { | ||||
|  | ||||
|     private static final HashMap<String, Float> COMBAT_EXPERIENCE_DEFAULT; | ||||
|     private static final HashMap<String, Float> SPECIAL_COMBAT_EXPERIENCE_DEFAULT; | ||||
|     private static final HashMap<SpecialXPKey, Float> SPECIAL_COMBAT_EXPERIENCE_DEFAULT; | ||||
|     private static final boolean PVP_XP_ENABLED_DEFAULT = false; | ||||
|  | ||||
|     static { | ||||
| @@ -75,17 +76,23 @@ public class ConfigExperienceCombat { | ||||
|  | ||||
|         //SPECIAL | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT = new HashMap<>(); | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put("animals", 1.0F); //TODO: this seems like a dumb config option | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put("spawned", 0.0F); | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put("pvp", 1.0F); | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put("player-bred-mobs", 1.0F); | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put(SpecialXPKey.ANIMALS, 1.0F); //TODO: this seems like a dumb config option | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put(SpecialXPKey.SPAWNED, 0.0F); | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put(SpecialXPKey.PVP, 1.0F); | ||||
|         SPECIAL_COMBAT_EXPERIENCE_DEFAULT.put(SpecialXPKey.PETS, 1.0F); | ||||
|     } | ||||
|  | ||||
|     @Setting(value = "Combat-XP-Multipliers") | ||||
|     private HashMap<String, Float> combatExperienceMap = COMBAT_EXPERIENCE_DEFAULT; | ||||
|  | ||||
|     @Setting(value = "Special-Combat-XP-Multipliers") | ||||
|     private HashMap<String, Float> specialCombatExperienceMap = SPECIAL_COMBAT_EXPERIENCE_DEFAULT; | ||||
|     @Setting(value = "Special-Combat-XP-Multipliers", comment = "Special XP settings which apply to a mobs matching certain criteria" + | ||||
|             "\nAnimals - Non-hostile mobs, anything not considered a Monster" + | ||||
|             "\nSpawned - Unnatural mobs, can be from mob spawners, eggs, or otherwise" + | ||||
|             "\nPVP - XP gains relating to hitting other players" + | ||||
|             "\nPets - Either tamed or from breeding" + | ||||
|             "\nThese all default to 1.0 except for spawned, which defaults to 0.0" + | ||||
|             "\nIf you want spawned mobs to give XP simply turn the value for spawned above 0.0") | ||||
|     private HashMap<SpecialXPKey, Float> specialCombatExperienceMap = SPECIAL_COMBAT_EXPERIENCE_DEFAULT; | ||||
|  | ||||
|     @Setting(value = "PVP-XP", comment = "If true, players will gain XP from PVP interactions." + | ||||
|             "\nBe careful turning this on as this can potentially allow for unwanted behaviour from players." + | ||||
| @@ -100,23 +107,7 @@ public class ConfigExperienceCombat { | ||||
|         return combatExperienceMap; | ||||
|     } | ||||
|  | ||||
|     public float getSpawnedMobXPMult() { | ||||
|         return specialCombatExperienceMap.get("mobspawners"); | ||||
|     } | ||||
|  | ||||
|     public float getPVPXPMult() { | ||||
|         return specialCombatExperienceMap.get("pvp"); | ||||
|     } | ||||
|  | ||||
|     public float getAnimalsXPMult() { | ||||
|         return specialCombatExperienceMap.get("animals"); | ||||
|     } | ||||
|  | ||||
|     public float getPlayerBredMobsXPMult() { | ||||
|         return specialCombatExperienceMap.get("player-bred-mobs"); | ||||
|     } | ||||
|  | ||||
|     public HashMap<String, Float> getSpecialCombatExperienceMap() { | ||||
|     public HashMap<SpecialXPKey, Float> getSpecialCombatExperienceMap() { | ||||
|         return specialCombatExperienceMap; | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,6 @@ | ||||
| package com.gmail.nossr50.config.hocon.experience; | ||||
|  | ||||
| import com.gmail.nossr50.datatypes.experience.SpecialXPKey; | ||||
| import ninja.leaping.configurate.objectmapping.Setting; | ||||
| import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; | ||||
|  | ||||
| @@ -47,10 +48,6 @@ public class ConfigExperienceSkills { | ||||
|      * BOILER PLATE GETTERS | ||||
|      */ | ||||
|  | ||||
|     public float getPlayerBredMobsXPMult() { | ||||
|         return experienceCombat.getPlayerBredMobsXPMult(); | ||||
|     } | ||||
|  | ||||
|     public ConfigExperienceAcrobatics getExperienceAcrobatics() { | ||||
|         return experienceAcrobatics; | ||||
|     } | ||||
| @@ -171,7 +168,7 @@ public class ConfigExperienceSkills { | ||||
|         return experienceCombat.getCombatExperienceMap(); | ||||
|     } | ||||
|  | ||||
|     public HashMap<String, Float> getSpecialCombatExperienceMap() { | ||||
|     public HashMap<SpecialXPKey, Float> getSpecialCombatExperienceMap() { | ||||
|         return experienceCombat.getSpecialCombatExperienceMap(); | ||||
|     } | ||||
|  | ||||
| @@ -198,16 +195,4 @@ public class ConfigExperienceSkills { | ||||
|     public int getShakeXP() { | ||||
|         return experienceFishing.getShakeXP(); | ||||
|     } | ||||
|  | ||||
|     public float getSpawnedMobXPMult() { | ||||
|         return experienceCombat.getSpawnedMobXPMult(); | ||||
|     } | ||||
|  | ||||
|     public float getPVPXPMult() { | ||||
|         return experienceCombat.getPVPXPMult(); | ||||
|     } | ||||
|  | ||||
|     public float getAnimalsXPMult() { | ||||
|         return experienceCombat.getAnimalsXPMult(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,8 @@ | ||||
| package com.gmail.nossr50.datatypes.experience; | ||||
|  | ||||
| public enum SpecialXPKey { | ||||
|     ANIMALS, //Non-hostile mobs | ||||
|     SPAWNED, //Unnatural, can be from mob spawners, eggs, etc | ||||
|     PVP, //Players attacking players | ||||
|     PETS //Player owned | ||||
| } | ||||
| @@ -1,6 +1,7 @@ | ||||
| package com.gmail.nossr50.util.experience; | ||||
|  | ||||
| import com.gmail.nossr50.api.exceptions.UndefinedSkillBehaviour; | ||||
| import com.gmail.nossr50.datatypes.experience.SpecialXPKey; | ||||
| import com.gmail.nossr50.datatypes.skills.PrimarySkillType; | ||||
| import com.gmail.nossr50.mcMMO; | ||||
| import org.bukkit.Material; | ||||
| @@ -19,12 +20,13 @@ public class ExperienceMapManager { | ||||
|     private HashMap<String, Integer> excavationFullyQualifiedBlockXpMap; | ||||
|     private HashMap<EntityType, Float> tamingExperienceMap; | ||||
|     private HashMap<EntityType, Float> combatXPMultiplierMap; | ||||
|     private HashMap<EntityType, Float> specialCombatXPMultiplierMap; //Applies to "groups" of things for convenience | ||||
|     private HashMap<SpecialXPKey, Float> specialCombatXPMultiplierMap; //Applies to "groups" of things for convenience | ||||
|  | ||||
|     private double globalXpMult; | ||||
|  | ||||
|     public ExperienceMapManager() { | ||||
|         initExperienceMaps(); | ||||
|         registerDefaultValues(); | ||||
|  | ||||
|         //Register with unloader | ||||
|     } | ||||
| @@ -39,6 +41,12 @@ public class ExperienceMapManager { | ||||
|         tamingExperienceMap = new HashMap<>(); | ||||
|     } | ||||
|  | ||||
|     private void registerDefaultValues() | ||||
|     { | ||||
|         fillCombatXPMultiplierMap(mcMMO.getConfigManager().getConfigExperience().getCombatExperienceMap()); | ||||
|         buildBlockXPMaps(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Fills the combat XP multiplier map with values from a platform generic map | ||||
|      * Platform safe map, is just a map which uses strings to define target entities/etc | ||||
| @@ -46,6 +54,7 @@ public class ExperienceMapManager { | ||||
|      * @param platformSafeMap the platform safe map | ||||
|      */ | ||||
|     public void fillCombatXPMultiplierMap(HashMap<String, Float> platformSafeMap) { | ||||
|         mcMMO.p.getLogger().info("Registering combat XP values..."); | ||||
|         for(String entityString : platformSafeMap.keySet()) | ||||
|         { | ||||
|             //Iterate over all EntityType(s) | ||||
| @@ -69,6 +78,12 @@ public class ExperienceMapManager { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void copySpecialCombatXPMultiplierMap(HashMap<SpecialXPKey, Float> map) | ||||
|     { | ||||
|         mcMMO.p.getLogger().info("Registering special combat XP values..."); | ||||
|         specialCombatXPMultiplierMap = map; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Builds fully qualified name to xp value maps of blocks for XP lookups | ||||
|      * This method servers two purposes | ||||
| @@ -312,4 +327,34 @@ public class ExperienceMapManager { | ||||
|     public int getExcavationXp(Material material) { | ||||
|         return excavationFullyQualifiedBlockXpMap.get(material.getKey()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the XP multiplier value for a special XP group | ||||
|      * @param specialXPKey target special XP group | ||||
|      * @return XP multiplier for target special XP group | ||||
|      */ | ||||
|     public float getSpecialCombatXP(SpecialXPKey specialXPKey) | ||||
|     { | ||||
|         return specialCombatXPMultiplierMap.get(specialXPKey); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gets the combat XP multiplier for this entity type | ||||
|      * @param entityType target entity type | ||||
|      * @return the combat XP multiplier for this entity | ||||
|      */ | ||||
|     public float getCombatXPMultiplier(EntityType entityType) | ||||
|     { | ||||
|         return combatXPMultiplierMap.get(entityType); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns true/false if a EntityType has a defined XP multiplier (from the config typically) | ||||
|      * @param entityType target entity type | ||||
|      * @return true if entity type has XP | ||||
|      */ | ||||
|     public boolean hasCombatXP(EntityType entityType) | ||||
|     { | ||||
|         return combatXPMultiplierMap.get(entityType) != null; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package com.gmail.nossr50.util.skills; | ||||
|  | ||||
| import com.gmail.nossr50.config.experience.ExperienceConfig; | ||||
| import com.gmail.nossr50.core.MetadataConstants; | ||||
| import com.gmail.nossr50.datatypes.experience.SpecialXPKey; | ||||
| import com.gmail.nossr50.datatypes.experience.XPGainReason; | ||||
| import com.gmail.nossr50.datatypes.interactions.NotificationType; | ||||
| import com.gmail.nossr50.datatypes.player.McMMOPlayer; | ||||
| @@ -532,7 +533,7 @@ public final class CombatUtils { | ||||
|      * @param primarySkillType The skill being used | ||||
|      */ | ||||
|     private static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) { | ||||
|         double baseXP = 0; | ||||
|         float baseXPMultiplier = 0; | ||||
|         XPGainReason xpGainReason; | ||||
|  | ||||
|         if (target instanceof Player) { | ||||
| @@ -544,7 +545,7 @@ public final class CombatUtils { | ||||
|             Player defender = (Player) target; | ||||
|  | ||||
|             if (defender.isOnline() && SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { | ||||
|                 baseXP = 20 * mcMMO.getConfigManager().getConfigExperience().getPVPXPMult(); | ||||
|                 baseXPMultiplier = 20 * mcMMO.getConfigManager().getConfigExperience().getPVPXPMult(); | ||||
|             } | ||||
|         } else { | ||||
|             /*if (mcMMO.getModManager().isCustomEntity(target)) { | ||||
| @@ -552,45 +553,44 @@ public final class CombatUtils { | ||||
|             }*/ | ||||
|             //else if (target instanceof Animals) { | ||||
|             if (target instanceof Animals) { | ||||
|                 EntityType type = target.getType(); | ||||
|                 baseXP = mcMMO.getConfigManager().getConfigExperience().getAnimalsXPMult(); | ||||
|                 baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getSpecialCombatXP(SpecialXPKey.ANIMALS); | ||||
|             } else if (target instanceof Monster) { | ||||
|                 EntityType type = target.getType(); | ||||
|                 baseXP = ExperienceConfig.getInstance().getCombatXP(type); | ||||
|                 baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getCombatXPMultiplier(type); | ||||
|             } else { | ||||
|                 EntityType type = target.getType(); | ||||
|  | ||||
|                 if (ExperienceConfig.getInstance().hasCombatXP(type)) { | ||||
|                 if (mcMMO.getDynamicSettingsManager().getExperienceMapManager().hasCombatXP(type)) { | ||||
|                     //Exploit stuff | ||||
|                     if (type == EntityType.IRON_GOLEM) { | ||||
|                         if (!((IronGolem) target).isPlayerCreated()) { | ||||
|                             baseXP = ExperienceConfig.getInstance().getCombatXP(type); | ||||
|                             baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getCombatXPMultiplier(type); | ||||
|                         } | ||||
|                     } else { | ||||
|                         baseXP = ExperienceConfig.getInstance().getCombatXP(type); | ||||
|                         baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getCombatXPMultiplier(type); | ||||
|                     } | ||||
|                 } else { | ||||
|                     baseXP = 1.0; | ||||
|                     //mcMMO.getModManager().addCustomEntity(target); | ||||
|                     baseXPMultiplier = 1.0f; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (target.hasMetadata(MetadataConstants.UNNATURAL_MOB_METAKEY)) { | ||||
|                 baseXP *= mcMMO.getConfigManager().getConfigExperience().getSpawnedMobXPMult(); | ||||
|                 baseXPMultiplier *= mcMMO.getConfigManager().getConfigExperience().getSpawnedMobXPMult(); | ||||
|             } | ||||
|  | ||||
|             if (target.hasMetadata(MetadataConstants.BRED_ANIMAL_TRACKING_METAKEY)) { | ||||
|                 baseXP *= mcMMO.getConfigManager().getConfigExperience().getPlayerBredMobsXPMult(); | ||||
|                 baseXPMultiplier *= mcMMO.getConfigManager().getConfigExperience().getPlayerBredMobsXPMult(); | ||||
|             } | ||||
|  | ||||
|             xpGainReason = XPGainReason.PVE; | ||||
|  | ||||
|             baseXP *= 10; | ||||
|             baseXPMultiplier *= 10; | ||||
|         } | ||||
|  | ||||
|         baseXP *= multiplier; | ||||
|         baseXPMultiplier *= multiplier; | ||||
|  | ||||
|         if (baseXP != 0) { | ||||
|             new AwardCombatXpTask(mcMMOPlayer, primarySkillType, baseXP, target, xpGainReason).runTaskLater(mcMMO.p, 0); | ||||
|         if (baseXPMultiplier != 0) { | ||||
|             new AwardCombatXpTask(mcMMOPlayer, primarySkillType, baseXPMultiplier, target, xpGainReason).runTaskLater(mcMMO.p, 0); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nossr50
					nossr50