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

@ -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
*

View File

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

View File

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

View File

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

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