Browse Source

Arrow Retrieval will no longer work with piercing enchant

nossr50 6 years ago
parent
commit
c83d38b5c2

+ 4 - 0
Changelog.txt

@@ -1,3 +1,7 @@
+Version 2.1.83
+    Updated hu_HU locale (thanks andris155)
+    (FIX) Arrow Retrieval will no longer work with piercing enchant on crossbows
+
 Version 2.1.82
     Added new WG flag 'mcmmo-hardcore' if set to negative players will not be penalized by hardcore mode (if hardcore mode is enabled) it defaults to true
     Added proper error handling when loading parties file

+ 1 - 1
pom.xml

@@ -2,7 +2,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.gmail.nossr50.mcMMO</groupId>
     <artifactId>mcMMO</artifactId>
-    <version>2.1.82</version>
+    <version>2.1.83-SNAPSHOT</version>
     <name>mcMMO</name>
     <url>https://github.com/mcMMO-Dev/mcMMO</url>
     <scm>

+ 0 - 1
src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java

@@ -25,7 +25,6 @@ import com.gmail.nossr50.util.StringUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.google.common.collect.ImmutableList;
 import org.bukkit.Color;
-import org.bukkit.OfflinePlayer;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Tameable;

+ 26 - 10
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -22,7 +22,9 @@ import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.player.UserManager;
+import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.CombatUtils;
+import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
 import org.bukkit.Material;
@@ -109,7 +111,8 @@ public class EntityListener implements Listener {
 
         ItemStack bow = event.getBow();
 
-        if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) {
+        if (bow != null
+                && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) {
             projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue);
         }
 
@@ -123,9 +126,10 @@ public class EntityListener implements Listener {
         if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
             return;
 
-        if(event.getEntity() instanceof Player)
+        if(event.getEntity().getShooter() instanceof Player)
         {
-            Player player = (Player) event.getEntity();
+
+            Player player = (Player) event.getEntity().getShooter();
 
             /* WORLD GUARD MAIN FLAG CHECK */
             if(WorldGuardUtils.isWorldGuardLoaded())
@@ -133,16 +137,28 @@ public class EntityListener implements Listener {
                 if(!WorldGuardManager.getInstance().hasMainFlag(player))
                     return;
             }
-        }
 
-        Projectile projectile = event.getEntity();
+            Projectile projectile = event.getEntity();
 
-        if (!(projectile instanceof Arrow) || projectile.hasMetadata(mcMMO.bowForceKey)) {
-            return;
-        }
+            //Hacky stuff for 1.13/1.14 compat
 
-        projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0));
-        projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation()));
+            String itemKey = player.getInventory().getItemInMainHand().getType().getKey().toString();
+
+            if(!itemKey.equalsIgnoreCase("minecraft:bow") && !itemKey.equalsIgnoreCase("minecraft:crossbow"))
+                return;
+
+            projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0));
+            projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation()));
+
+            for(Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) {
+                if(enchantment.getName().equalsIgnoreCase("piercing"))
+                    return;
+            }
+
+            if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) {
+                projectile.setMetadata(mcMMO.trackedArrow, mcMMO.metadataValue);
+            }
+        }
     }
 
     /**

+ 6 - 1
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -279,7 +279,7 @@ public class PlayerListener implements Listener {
                 //TODO Update to new API once available! Waiting for case CAUGHT_TREASURE:
                 Item fishingCatch = (Item) event.getCaught();
 
-                if (Config.getInstance().getFishingOverrideTreasures() &&
+                if (Config.getInstance().   getFishingOverrideTreasures() &&
                         fishingCatch.getItemStack().getType() != Material.SALMON &&
                         fishingCatch.getItemStack().getType() != Material.COD &&
                         fishingCatch.getItemStack().getType() != Material.TROPICAL_FISH &&
@@ -450,6 +450,11 @@ public class PlayerListener implements Listener {
             Item drop = event.getItem();
             ItemStack dropStack = drop.getItemStack();
 
+            //Remove tracking
+            if(drop.hasMetadata(mcMMO.trackedArrow)) {
+                drop.removeMetadata(mcMMO.trackedArrow, mcMMO.p);
+            }
+
             if (drop.hasMetadata(mcMMO.disarmedItemKey)) {
                 if (!player.getName().equals(drop.getMetadata(mcMMO.disarmedItemKey).get(0).asString())) {
                     event.setCancelled(true);

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

@@ -118,6 +118,7 @@ public class mcMMO extends JavaPlugin {
     public final static String customVisibleKey    = "mcMMO: Name Visibility";
     public final static String droppedItemKey      = "mcMMO: Tracked Item";
     public final static String infiniteArrowKey    = "mcMMO: Infinite Arrow";
+    public final static String trackedArrow        = "mcMMO: Tracked Arrow";
     public final static String bowForceKey         = "mcMMO: Bow Force";
     public final static String arrowDistanceKey    = "mcMMO: Arrow Distance";
     public final static String BONUS_DROPS_METAKEY = "mcMMO: Double Drops";

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

@@ -16,6 +16,7 @@ import org.bukkit.Location;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
+import org.bukkit.entity.Projectile;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 
@@ -67,9 +68,10 @@ public class ArcheryManager extends SkillManager {
      *
      * @param target The {@link LivingEntity} damaged by the arrow
      */
-    public void retrieveArrows(LivingEntity target) {
-        if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, getPlayer())) {
+    public void retrieveArrows(LivingEntity target, Projectile projectile) {
+        if(projectile.hasMetadata(mcMMO.trackedArrow)) {
             Archery.incrementTrackerValue(target);
+            projectile.removeMetadata(mcMMO.trackedArrow, mcMMO.p); //Only 1 entity per projectile
         }
     }
 

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

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