diff --git a/Changelog.txt b/Changelog.txt index 33151e218..21312639e 100644 --- a/Changelog.txt +++ b/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 diff --git a/pom.xml b/pom.xml index dc655be5d..10b5b8c72 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.82 + 2.1.83-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java index 0def74ef8..24d21e972 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/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; diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index f771cc1f2..ac6ceb618 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/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(); + + //Hacky stuff for 1.13/1.14 compat + + 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); + } } - - Projectile projectile = event.getEntity(); - - if (!(projectile instanceof Arrow) || projectile.hasMetadata(mcMMO.bowForceKey)) { - return; - } - - projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0)); - projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation())); } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index ea13ab98d..34f84ad60 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/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); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 1778f5737..9186e2206 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/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"; diff --git a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java index b67c72274..3fd7537df 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/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 } } diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 26cd72431..4b82e237f 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/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))