Add + Wire up Combat XP Multipliers

This commit is contained in:
nossr50
2019-05-13 03:33:33 -07:00
parent 2e3f9b4a96
commit d8841c6ae7
6 changed files with 87 additions and 73 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}