Browse Source

Add + Wire up Combat XP Multipliers

nossr50 6 years ago
parent
commit
d8841c6ae7

+ 0 - 15
src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java

@@ -126,21 +126,6 @@ public class ExperienceConfig extends ConfigValidated {
      * XP SETTINGS
      * 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
      * Gets the raw XP given for breaking this block, this does not include modifiers
      *
      *

+ 15 - 24
src/main/java/com/gmail/nossr50/config/hocon/experience/ConfigExperienceCombat.java

@@ -1,5 +1,6 @@
 package com.gmail.nossr50.config.hocon.experience;
 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.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
 
@@ -9,7 +10,7 @@ import java.util.HashMap;
 public class ConfigExperienceCombat {
 public class ConfigExperienceCombat {
 
 
     private static final HashMap<String, Float> COMBAT_EXPERIENCE_DEFAULT;
     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;
     private static final boolean PVP_XP_ENABLED_DEFAULT = false;
 
 
     static {
     static {
@@ -75,17 +76,23 @@ public class ConfigExperienceCombat {
 
 
         //SPECIAL
         //SPECIAL
         SPECIAL_COMBAT_EXPERIENCE_DEFAULT = new HashMap<>();
         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")
     @Setting(value = "Combat-XP-Multipliers")
     private HashMap<String, Float> combatExperienceMap = COMBAT_EXPERIENCE_DEFAULT;
     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." +
     @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." +
             "\nBe careful turning this on as this can potentially allow for unwanted behaviour from players." +
@@ -100,23 +107,7 @@ public class ConfigExperienceCombat {
         return combatExperienceMap;
         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;
         return specialCombatExperienceMap;
     }
     }
 }
 }

+ 2 - 17
src/main/java/com/gmail/nossr50/config/hocon/experience/ConfigExperienceSkills.java

@@ -1,5 +1,6 @@
 package com.gmail.nossr50.config.hocon.experience;
 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.Setting;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 
 
@@ -47,10 +48,6 @@ public class ConfigExperienceSkills {
      * BOILER PLATE GETTERS
      * BOILER PLATE GETTERS
      */
      */
 
 
-    public float getPlayerBredMobsXPMult() {
-        return experienceCombat.getPlayerBredMobsXPMult();
-    }
-
     public ConfigExperienceAcrobatics getExperienceAcrobatics() {
     public ConfigExperienceAcrobatics getExperienceAcrobatics() {
         return experienceAcrobatics;
         return experienceAcrobatics;
     }
     }
@@ -171,7 +168,7 @@ public class ConfigExperienceSkills {
         return experienceCombat.getCombatExperienceMap();
         return experienceCombat.getCombatExperienceMap();
     }
     }
 
 
-    public HashMap<String, Float> getSpecialCombatExperienceMap() {
+    public HashMap<SpecialXPKey, Float> getSpecialCombatExperienceMap() {
         return experienceCombat.getSpecialCombatExperienceMap();
         return experienceCombat.getSpecialCombatExperienceMap();
     }
     }
 
 
@@ -198,16 +195,4 @@ public class ConfigExperienceSkills {
     public int getShakeXP() {
     public int getShakeXP() {
         return experienceFishing.getShakeXP();
         return experienceFishing.getShakeXP();
     }
     }
-
-    public float getSpawnedMobXPMult() {
-        return experienceCombat.getSpawnedMobXPMult();
-    }
-
-    public float getPVPXPMult() {
-        return experienceCombat.getPVPXPMult();
-    }
-
-    public float getAnimalsXPMult() {
-        return experienceCombat.getAnimalsXPMult();
-    }
 }
 }

+ 8 - 0
src/main/java/com/gmail/nossr50/datatypes/experience/SpecialXPKey.java

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

+ 46 - 1
src/main/java/com/gmail/nossr50/util/experience/ExperienceMapManager.java

@@ -1,6 +1,7 @@
 package com.gmail.nossr50.util.experience;
 package com.gmail.nossr50.util.experience;
 
 
 import com.gmail.nossr50.api.exceptions.UndefinedSkillBehaviour;
 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.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import org.bukkit.Material;
 import org.bukkit.Material;
@@ -19,12 +20,13 @@ public class ExperienceMapManager {
     private HashMap<String, Integer> excavationFullyQualifiedBlockXpMap;
     private HashMap<String, Integer> excavationFullyQualifiedBlockXpMap;
     private HashMap<EntityType, Float> tamingExperienceMap;
     private HashMap<EntityType, Float> tamingExperienceMap;
     private HashMap<EntityType, Float> combatXPMultiplierMap;
     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;
     private double globalXpMult;
 
 
     public ExperienceMapManager() {
     public ExperienceMapManager() {
         initExperienceMaps();
         initExperienceMaps();
+        registerDefaultValues();
 
 
         //Register with unloader
         //Register with unloader
     }
     }
@@ -39,6 +41,12 @@ public class ExperienceMapManager {
         tamingExperienceMap = new HashMap<>();
         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
      * 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
      * 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
      * @param platformSafeMap the platform safe map
      */
      */
     public void fillCombatXPMultiplierMap(HashMap<String, Float> platformSafeMap) {
     public void fillCombatXPMultiplierMap(HashMap<String, Float> platformSafeMap) {
+        mcMMO.p.getLogger().info("Registering combat XP values...");
         for(String entityString : platformSafeMap.keySet())
         for(String entityString : platformSafeMap.keySet())
         {
         {
             //Iterate over all EntityType(s)
             //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
      * Builds fully qualified name to xp value maps of blocks for XP lookups
      * This method servers two purposes
      * This method servers two purposes
@@ -312,4 +327,34 @@ public class ExperienceMapManager {
     public int getExcavationXp(Material material) {
     public int getExcavationXp(Material material) {
         return excavationFullyQualifiedBlockXpMap.get(material.getKey());
         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;
+    }
 }
 }

+ 16 - 16
src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java

@@ -2,6 +2,7 @@ package com.gmail.nossr50.util.skills;
 
 
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.core.MetadataConstants;
 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.experience.XPGainReason;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
@@ -532,7 +533,7 @@ public final class CombatUtils {
      * @param primarySkillType The skill being used
      * @param primarySkillType The skill being used
      */
      */
     private static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
     private static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
-        double baseXP = 0;
+        float baseXPMultiplier = 0;
         XPGainReason xpGainReason;
         XPGainReason xpGainReason;
 
 
         if (target instanceof Player) {
         if (target instanceof Player) {
@@ -544,7 +545,7 @@ public final class CombatUtils {
             Player defender = (Player) target;
             Player defender = (Player) target;
 
 
             if (defender.isOnline() && SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) {
             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 {
         } else {
             /*if (mcMMO.getModManager().isCustomEntity(target)) {
             /*if (mcMMO.getModManager().isCustomEntity(target)) {
@@ -552,45 +553,44 @@ public final class CombatUtils {
             }*/
             }*/
             //else if (target instanceof Animals) {
             //else if (target instanceof Animals) {
             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) {
             } else if (target instanceof Monster) {
                 EntityType type = target.getType();
                 EntityType type = target.getType();
-                baseXP = ExperienceConfig.getInstance().getCombatXP(type);
+                baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getCombatXPMultiplier(type);
             } else {
             } else {
                 EntityType type = target.getType();
                 EntityType type = target.getType();
 
 
-                if (ExperienceConfig.getInstance().hasCombatXP(type)) {
+                if (mcMMO.getDynamicSettingsManager().getExperienceMapManager().hasCombatXP(type)) {
+                    //Exploit stuff
                     if (type == EntityType.IRON_GOLEM) {
                     if (type == EntityType.IRON_GOLEM) {
                         if (!((IronGolem) target).isPlayerCreated()) {
                         if (!((IronGolem) target).isPlayerCreated()) {
-                            baseXP = ExperienceConfig.getInstance().getCombatXP(type);
+                            baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getCombatXPMultiplier(type);
                         }
                         }
                     } else {
                     } else {
-                        baseXP = ExperienceConfig.getInstance().getCombatXP(type);
+                        baseXPMultiplier = mcMMO.getDynamicSettingsManager().getExperienceMapManager().getCombatXPMultiplier(type);
                     }
                     }
                 } else {
                 } else {
-                    baseXP = 1.0;
-                    //mcMMO.getModManager().addCustomEntity(target);
+                    baseXPMultiplier = 1.0f;
                 }
                 }
             }
             }
 
 
             if (target.hasMetadata(MetadataConstants.UNNATURAL_MOB_METAKEY)) {
             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)) {
             if (target.hasMetadata(MetadataConstants.BRED_ANIMAL_TRACKING_METAKEY)) {
-                baseXP *= mcMMO.getConfigManager().getConfigExperience().getPlayerBredMobsXPMult();
+                baseXPMultiplier *= mcMMO.getConfigManager().getConfigExperience().getPlayerBredMobsXPMult();
             }
             }
 
 
             xpGainReason = XPGainReason.PVE;
             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);
         }
         }
     }
     }