Browse Source

Rewrote how Arrow Retrieval subskill is handled

nossr50 6 years ago
parent
commit
80beb92a06

+ 1 - 0
Changelog.txt

@@ -32,6 +32,7 @@ Version 2.2.0
     Acrobatic's Dodge XP increased from 120 -> 480
     Acrobatic's Dodge XP increased from 120 -> 480
     Fishing's always catch fish setting now defaults to true instead of false
     Fishing's always catch fish setting now defaults to true instead of false
     Optimized code related to Fishing
     Optimized code related to Fishing
+    Tracking arrows for Arrow Retrieval with Archery has been rewritten to a much more efficient system
     Added a new command 'mcmmoreload' to reload config values
     Added a new command 'mcmmoreload' to reload config values
     Added new locale string 'Commands.Reload.Start'
     Added new locale string 'Commands.Reload.Start'
     Added new locale string 'Commands.Reload.Finished'
     Added new locale string 'Commands.Reload.Finished'

+ 10 - 1
src/main/java/com/gmail/nossr50/config/hocon/experience/ConfigExperienceArchery.java

@@ -6,7 +6,8 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 @ConfigSerializable
 @ConfigSerializable
 public class ConfigExperienceArchery {
 public class ConfigExperienceArchery {
 
 
-    public static final double DISTANCE_MULTIPLIER_DEFAULT = 0.025;
+    private static final double DISTANCE_MULTIPLIER_DEFAULT = 0.025;
+    private static final double ARROW_FORCE_XP_MULTIPLIER = 2.0D;
 
 
     @Setting(value = "Distance-Multiplier", comment = "The distance multiplier is multiplied against the distance an " +
     @Setting(value = "Distance-Multiplier", comment = "The distance multiplier is multiplied against the distance an " +
             "arrow travels before hitting its target to determine final XP values awarded." +
             "arrow travels before hitting its target to determine final XP values awarded." +
@@ -16,6 +17,14 @@ public class ConfigExperienceArchery {
             "\nDefault value: " + DISTANCE_MULTIPLIER_DEFAULT)
             "\nDefault value: " + DISTANCE_MULTIPLIER_DEFAULT)
     private double distanceMultiplier = DISTANCE_MULTIPLIER_DEFAULT;
     private double distanceMultiplier = DISTANCE_MULTIPLIER_DEFAULT;
 
 
+    @Setting(value = "Arrow-Force-XP-Multiplier", comment = "How much velocity the arrow has after leaving the players bow is used in the XP formula for handing out Archery XP." +
+            "\nDefault value: "+ARROW_FORCE_XP_MULTIPLIER)
+    private double forceMultiplier = ARROW_FORCE_XP_MULTIPLIER;
+
+    public double getForceMultiplier() {
+        return forceMultiplier;
+    }
+
     public double getDistanceMultiplier() {
     public double getDistanceMultiplier() {
         return distanceMultiplier;
         return distanceMultiplier;
     }
     }

+ 1 - 12
src/main/java/com/gmail/nossr50/config/hocon/skills/archery/ConfigArchery.java

@@ -7,17 +7,6 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
 @ConfigSerializable
 @ConfigSerializable
 public class ConfigArchery {
 public class ConfigArchery {
 
 
-    /* ARCHERY */
-
-//
-//    public double getDazeBonusDamage() {
-//        return getDoubleValue(SKILLS, ARCHERY, DAZE, BONUS_DAMAGE);
-//    }
-//
-//    public double getForceMultiplier() {
-//        return getDoubleValue(SKILLS, ARCHERY, FORCE_MULTIPLIER);
-//    }
-
     @Setting(value = "Daze")
     @Setting(value = "Daze")
     private ConfigArcheryDaze daze = new ConfigArcheryDaze();
     private ConfigArcheryDaze daze = new ConfigArcheryDaze();
 
 
@@ -49,6 +38,6 @@ public class ConfigArchery {
     }
     }
 
 
     public double getBonusDamage() {
     public double getBonusDamage() {
-        return daze.getBonusDamage();
+        return daze.getDazeBonusDamage();
     }
     }
 }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/config/hocon/skills/archery/ConfigArcheryDaze.java

@@ -30,7 +30,7 @@ public class ConfigArcheryDaze {
         return maxBonusLevel;
         return maxBonusLevel;
     }
     }
 
 
-    public double getBonusDamage() {
+    public double getDazeBonusDamage() {
         return bonusDamage;
         return bonusDamage;
     }
     }
 }
 }

+ 1 - 0
src/main/java/com/gmail/nossr50/core/MetadataConstants.java

@@ -22,6 +22,7 @@ public class MetadataConstants {
     public final static String INFINITE_ARROW_METAKEY = "mcMMO: Infinite Arrow";
     public final static String INFINITE_ARROW_METAKEY = "mcMMO: Infinite Arrow";
     public final static String BOW_FORCE_METAKEY = "mcMMO: Bow Force";
     public final static String BOW_FORCE_METAKEY = "mcMMO: Bow Force";
     public final static String ARROW_DISTANCE_METAKEY = "mcMMO: Arrow Distance";
     public final static String ARROW_DISTANCE_METAKEY = "mcMMO: Arrow Distance";
+    public final static String ARROW_TRACKER_METAKEY = "mcMMO: Arrow Tracker";
     public final static String BONUS_DROPS_METAKEY = "mcMMO: Bonus Drops";
     public final static String BONUS_DROPS_METAKEY = "mcMMO: Bonus Drops";
     public final static String DISARMED_ITEM_METAKEY = "mcMMO: Disarmed Item";
     public final static String DISARMED_ITEM_METAKEY = "mcMMO: Disarmed Item";
     public final static String PLAYER_DATA_METAKEY = "mcMMO: Player Data";
     public final static String PLAYER_DATA_METAKEY = "mcMMO: Player Data";

+ 18 - 0
src/main/java/com/gmail/nossr50/datatypes/meta/TrackedArrowMeta.java

@@ -0,0 +1,18 @@
+package com.gmail.nossr50.datatypes.meta;
+
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class TrackedArrowMeta extends FixedMetadataValue {
+    /**
+     * Initializes a FixedMetadataValue with an Object
+     *
+     * @param owningPlugin the {@link Plugin} that created this metadata value
+     * @param value        the value assigned to this metadata value
+     */
+    public TrackedArrowMeta(@NotNull Plugin owningPlugin, @Nullable Integer value) {
+        super(owningPlugin, value);
+    }
+}

+ 4 - 2
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.listeners;
 package com.gmail.nossr50.listeners;
 
 
-import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.WorldBlacklist;
 import com.gmail.nossr50.config.WorldBlacklist;
 import com.gmail.nossr50.core.MetadataConstants;
 import com.gmail.nossr50.core.MetadataConstants;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
@@ -103,7 +102,10 @@ public class EntityListener implements Listener {
             projectile.setMetadata(MetadataConstants.INFINITE_ARROW_METAKEY, MetadataConstants.metadataValue);
             projectile.setMetadata(MetadataConstants.INFINITE_ARROW_METAKEY, MetadataConstants.metadataValue);
         }
         }
 
 
-        projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY, new FixedMetadataValue(plugin, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0)));
+        projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY,
+                new FixedMetadataValue(plugin,
+                        Math.min(event.getForce()
+                                * mcMMO.getConfigManager().getConfigExperience().getExperienceArchery().getForceMultiplier(), 1.0)));
         projectile.setMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY, new FixedMetadataValue(plugin, projectile.getLocation()));
         projectile.setMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY, new FixedMetadataValue(plugin, projectile.getLocation()));
     }
     }
 
 

+ 21 - 73
src/main/java/com/gmail/nossr50/skills/archery/Archery.java

@@ -1,6 +1,7 @@
 package com.gmail.nossr50.skills.archery;
 package com.gmail.nossr50.skills.archery;
 
 
-import com.gmail.nossr50.config.AdvancedConfig;
+import com.gmail.nossr50.core.MetadataConstants;
+import com.gmail.nossr50.datatypes.meta.TrackedArrowMeta;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
@@ -9,101 +10,48 @@ import org.bukkit.Material;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import org.bukkit.metadata.FixedMetadataValue;
 
 
 public class Archery {
 public class Archery {
-    private static List<TrackedEntity> trackedEntities;
-
-    private static double skillShotDamageCap;
-
-    private static double dazeBonusDamage;
-
-    private static double distanceXpMultiplier;
-
-    private static Archery archery;
-
-    public Archery() {
-        List<TrackedEntity> trackedEntities = new ArrayList<>();
-
-        skillShotDamageCap = AdvancedConfig.getInstance().getSkillShotDamageMax();
-
-        dazeBonusDamage = AdvancedConfig.getInstance().getDazeBonusDamage();
-
-        distanceXpMultiplier = mcMMO.getConfigManager().getConfigExperience().getDistanceMultiplier();
-    }
-
-    public static Archery getInstance() {
-        if (archery == null)
-            archery = new Archery();
-
-        return archery;
-    }
-
-    protected static void incrementTrackerValue(LivingEntity livingEntity) {
-        for (TrackedEntity trackedEntity : trackedEntities) {
-            if (trackedEntity.getLivingEntity().getEntityId() == livingEntity.getEntityId()) {
-                trackedEntity.incrementArrowCount();
-                return;
-            }
-        }
-
-        addToTracker(livingEntity); // If the entity isn't tracked yet
-    }
-
-    protected static void addToTracker(LivingEntity livingEntity) {
-        TrackedEntity trackedEntity = new TrackedEntity(livingEntity);
-
-        trackedEntity.incrementArrowCount();
-        trackedEntities.add(trackedEntity);
-    }
-
-    protected static void removeFromTracker(TrackedEntity trackedEntity) {
-        trackedEntities.remove(trackedEntity);
-    }
-
     /**
     /**
      * Check for arrow retrieval.
      * Check for arrow retrieval.
      *
      *
      * @param livingEntity The entity hit by the arrows
      * @param livingEntity The entity hit by the arrows
      */
      */
     public static void arrowRetrievalCheck(LivingEntity livingEntity) {
     public static void arrowRetrievalCheck(LivingEntity livingEntity) {
-        for (Iterator<TrackedEntity> entityIterator = trackedEntities.iterator(); entityIterator.hasNext(); ) {
-            TrackedEntity trackedEntity = entityIterator.next();
+        if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
+            Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt());
+        }
+    }
 
 
-            if (trackedEntity.getID() == livingEntity.getUniqueId()) {
-                Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount());
-                entityIterator.remove();
-                return;
-            }
+    public static void incrementArrowCount(LivingEntity livingEntity) {
+        if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
+            int arrowCount = livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt();
+            livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).set(0, new FixedMetadataValue(mcMMO.p, arrowCount + 1));
+        } else {
+            livingEntity.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, new TrackedArrowMeta(mcMMO.p, 1));
         }
         }
     }
     }
 
 
     public static double getSkillShotBonusDamage(Player player, double oldDamage) {
     public static double getSkillShotBonusDamage(Player player, double oldDamage) {
         double damageBonusPercent = getDamageBonusPercent(player);
         double damageBonusPercent = getDamageBonusPercent(player);
         double newDamage = oldDamage + (oldDamage * damageBonusPercent);
         double newDamage = oldDamage + (oldDamage * damageBonusPercent);
-        return Math.min(newDamage, Archery.skillShotDamageCap);
+        return Math.min(newDamage, getSkillShotDamageCap());
     }
     }
 
 
     public static double getDamageBonusPercent(Player player) {
     public static double getDamageBonusPercent(Player player) {
-        return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * AdvancedConfig.getInstance().getSkillShotRankDamageMultiplier()) / 100.0D;
-    }
-
-    public List<TrackedEntity> getTrackedEntities() {
-        return trackedEntities;
+        return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * mcMMO.getConfigManager().getConfigArchery().getSkillShotDamageMultiplier()) / 100.0D;
     }
     }
 
 
-    public double getSkillShotDamageCap() {
-        return skillShotDamageCap;
+    public static double getSkillShotDamageCap() {
+        return mcMMO.getConfigManager().getConfigArchery().getSkillShotDamageCeiling();
     }
     }
 
 
-    public double getDazeBonusDamage() {
-        return dazeBonusDamage;
+    public static double getDazeBonusDamage() {
+        return mcMMO.getConfigManager().getConfigArchery().getDaze().getDazeBonusDamage();
     }
     }
 
 
-    public double getDistanceXpMultiplier() {
-        return distanceXpMultiplier;
+    public static double getDistanceXpMultiplier() {
+        return mcMMO.getConfigManager().getConfigExperience().getExperienceArchery().getDistanceMultiplier();
     }
     }
 }
 }

+ 4 - 4
src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java

@@ -59,7 +59,7 @@ public class ArcheryManager extends SkillManager {
             return 1;
             return 1;
         }
         }
 
 
-        return 1 + Math.min(firedLocation.distance(targetLocation), 50) * Archery.getInstance().getDistanceXpMultiplier();
+        return 1 + Math.min(firedLocation.distance(targetLocation), 50) * Archery.getDistanceXpMultiplier();
     }
     }
 
 
     /**
     /**
@@ -67,9 +67,9 @@ public class ArcheryManager extends SkillManager {
      *
      *
      * @param target The {@link LivingEntity} damaged by the arrow
      * @param target The {@link LivingEntity} damaged by the arrow
      */
      */
-    public void retrieveArrows(LivingEntity target) {
+    public void processArrowRetrievalActivation(LivingEntity target) {
         if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, getPlayer())) {
         if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, getPlayer())) {
-            Archery.incrementTrackerValue(target);
+            Archery.incrementArrowCount(target);
         }
         }
     }
     }
 
 
@@ -98,7 +98,7 @@ public class ArcheryManager extends SkillManager {
             NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed");
             NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed");
         }
         }
 
 
-        return Archery.getInstance().getDazeBonusDamage();
+        return Archery.getDazeBonusDamage();
     }
     }
 
 
     /**
     /**

+ 0 - 44
src/main/java/com/gmail/nossr50/skills/archery/TrackedEntity.java

@@ -1,44 +0,0 @@
-package com.gmail.nossr50.skills.archery;
-
-import com.gmail.nossr50.mcMMO;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.scheduler.BukkitRunnable;
-
-import java.util.UUID;
-
-public class TrackedEntity extends BukkitRunnable {
-    private LivingEntity livingEntity;
-    private UUID id;
-    private int arrowCount;
-
-    protected TrackedEntity(LivingEntity livingEntity) {
-        this.livingEntity = livingEntity;
-        this.id = livingEntity.getUniqueId();
-
-        this.runTaskTimer(mcMMO.p, 12000, 12000);
-    }
-
-    @Override
-    public void run() {
-        if (!livingEntity.isValid()) {
-            Archery.removeFromTracker(this);
-            this.cancel();
-        }
-    }
-
-    protected LivingEntity getLivingEntity() {
-        return livingEntity;
-    }
-
-    protected UUID getID() {
-        return id;
-    }
-
-    protected int getArrowCount() {
-        return arrowCount;
-    }
-
-    protected void incrementArrowCount() {
-        arrowCount++;
-    }
-}

+ 1 - 1
src/main/java/com/gmail/nossr50/util/Misc.java

@@ -105,7 +105,7 @@ public final class Misc {
             return null;
             return null;
         }
         }
 
 
-        return location.getWorld().dropItem(location, itemStack);
+        return location.getWorld().dropItemNaturally(location, itemStack);
     }
     }
 
 
     public static void profileCleanup(String playerName) {
     public static void profileCleanup(String playerName) {

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

@@ -218,7 +218,7 @@ public final class CombatUtils {
         }
         }
 
 
         if (!arrow.hasMetadata(MetadataConstants.INFINITE_ARROW_METAKEY) && archeryManager.canRetrieveArrows()) {
         if (!arrow.hasMetadata(MetadataConstants.INFINITE_ARROW_METAKEY) && archeryManager.canRetrieveArrows()) {
-            archeryManager.retrieveArrows(target);
+            archeryManager.processArrowRetrievalActivation(target);
         }
         }
 
 
         if (canUseLimitBreak(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {
         if (canUseLimitBreak(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {