diff --git a/Changelog.txt b/Changelog.txt index 22f314acf..2a2102895 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Version 2.1.60 + Fixed a NPE error if a LivingEntity's target was set to null + Fixed a bug where tamed mobs could kill themselves if their owner shot them once + Corrected a typo when naming entities summoned by COTW (Locale string - Taming.Summon.Name.Format) + Fixed a bug where tamed mobs could have hearts instead of their name in their own death messages + Version 2.1.59 Raised the overfishing limit from 3 to 10 Improved the overfishing messages to be more clear about its mechanics diff --git a/pom.xml b/pom.xml index 5bff90229..d2a593aa6 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.59 + 2.1.60-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -167,7 +167,7 @@ org.spigotmc spigot-api - 1.14-R0.1-SNAPSHOT + 1.14.1-R0.1-SNAPSHOT provided diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 0b64b488a..635472cbd 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -66,16 +66,16 @@ public class BlockListener implements Listener { continue; //TODO: Should just store the amount of drops in the metadata itself and use a loop - if(event.getBlock().getState().getMetadata(mcMMO.doubleDrops).size() > 0) + if(event.getBlock().getMetadata(mcMMO.doubleDrops).size() > 0) { - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - event.getBlock().getState().removeMetadata(mcMMO.doubleDrops, plugin); + event.getBlock().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + event.getBlock().removeMetadata(mcMMO.doubleDrops, plugin); } - else if(event.getBlock().getState().getMetadata(mcMMO.tripleDrops).size() > 0) + else if(event.getBlock().getMetadata(mcMMO.tripleDrops).size() > 0) { - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - event.getBlock().getState().removeMetadata(mcMMO.tripleDrops, plugin); + event.getBlock().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + event.getBlock().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + event.getBlock().removeMetadata(mcMMO.tripleDrops, plugin); } } } diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 6570b65b5..1ceb994f9 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -25,6 +25,7 @@ import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; @@ -72,6 +73,12 @@ public class EntityListener implements Listener { if(!ExperienceConfig.getInstance().isEndermanEndermiteFarmingPrevented()) return; + //It's rare but targets can be null sometimes + if(event.getTarget() == null) + { + return; + } + //Prevent entities from giving XP if they target endermite if(event.getTarget() instanceof Endermite) { @@ -386,24 +393,15 @@ public class EntityListener implements Listener { /** * This sets entity names back to whatever they are supposed to be */ - if(!(attacker instanceof Player) && defender instanceof Player) + if(event.getFinalDamage() >= target.getHealth()) { - if(event.getFinalDamage() >= ((LivingEntity) defender).getHealth()) + if(attacker instanceof LivingEntity) { - List metadataValue = attacker.getMetadata("mcMMO_oldName"); - - if(metadataValue.size() <= 0) - return; - - if(metadataValue != null) - { - OldName oldName = (OldName) metadataValue.get(0); - attacker.setCustomName(oldName.asString()); - attacker.setCustomNameVisible(false); - } + CombatUtils.fixNames(event, (LivingEntity) attacker); } - } + CombatUtils.fixNames(event, target); + } } diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index 944cdd5d1..1ebcb5344 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -231,6 +231,14 @@ public class TamingManager extends SkillManager { } public void attackTarget(LivingEntity target) { + if(target instanceof Tameable) + { + Tameable tameable = (Tameable) target; + if(tameable.getOwner() == getPlayer()) + { + return; + } + } double range = 5; Player player = getPlayer(); @@ -281,36 +289,36 @@ public class TamingManager extends SkillManager { } location = Misc.getLocationOffset(location, 1); - LivingEntity entity = (LivingEntity) player.getWorld().spawnEntity(location, type); + LivingEntity callOfWildEntity = (LivingEntity) player.getWorld().spawnEntity(location, type); - FakeEntityTameEvent event = new FakeEntityTameEvent(entity, player); + FakeEntityTameEvent event = new FakeEntityTameEvent(callOfWildEntity, player); mcMMO.p.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { continue; } - entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); - ((Tameable) entity).setOwner(player); - entity.setRemoveWhenFarAway(false); + callOfWildEntity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue); + ((Tameable) callOfWildEntity).setOwner(player); + callOfWildEntity.setRemoveWhenFarAway(false); - addToTracker(entity); + addToTracker(callOfWildEntity); switch (type) { case OCELOT: - ((Ocelot) entity).setCatType(Ocelot.Type.values()[1 + Misc.getRandom().nextInt(3)]); + ((Ocelot) callOfWildEntity).setCatType(Ocelot.Type.values()[1 + Misc.getRandom().nextInt(3)]); break; case WOLF: - entity.setMaxHealth(20.0); - entity.setHealth(entity.getMaxHealth()); + callOfWildEntity.setMaxHealth(20.0); + callOfWildEntity.setHealth(callOfWildEntity.getMaxHealth()); break; case HORSE: - Horse horse = (Horse) entity; + Horse horse = (Horse) callOfWildEntity; - entity.setMaxHealth(15.0 + (Misc.getRandom().nextDouble() * 15)); - entity.setHealth(entity.getMaxHealth()); + callOfWildEntity.setMaxHealth(15.0 + (Misc.getRandom().nextDouble() * 15)); + callOfWildEntity.setHealth(callOfWildEntity.getMaxHealth()); horse.setColor(Horse.Color.values()[Misc.getRandom().nextInt(Horse.Color.values().length)]); horse.setStyle(Horse.Style.values()[Misc.getRandom().nextInt(Horse.Style.values().length)]); horse.setJumpStrength(Math.max(AdvancedConfig.getInstance().getMinHorseJumpStrength(), Math.min(Math.min(Misc.getRandom().nextDouble(), Misc.getRandom().nextDouble()) * 2, AdvancedConfig.getInstance().getMaxHorseJumpStrength()))); @@ -322,10 +330,10 @@ public class TamingManager extends SkillManager { } if (Permissions.renamePets(player)) { - entity.setCustomName(LocaleLoader.getString("Taming.Summon.Name.Format", player.getName(), StringUtils.getPrettyEntityTypeString(type))); + callOfWildEntity.setCustomName(LocaleLoader.getString("Taming.Summon.Name.Format", player.getName(), StringUtils.getPrettyEntityTypeString(type))); } - ParticleEffectUtils.playCallOfTheWildEffect(entity); + ParticleEffectUtils.playCallOfTheWildEffect(callOfWildEntity); } ItemStack leftovers = new ItemStack(heldItem); 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 5d42b0a12..497782a80 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.util.skills; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; import com.gmail.nossr50.datatypes.interactions.NotificationType; +import com.gmail.nossr50.datatypes.meta.OldName; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; @@ -30,10 +31,12 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.MetadataValue; import org.bukkit.projectiles.ProjectileSource; import java.util.EnumMap; import java.util.HashMap; +import java.util.List; import java.util.Map; public final class CombatUtils { @@ -358,6 +361,26 @@ public final class CombatUtils { } } + /** + * This cleans up names from displaying in chat as hearts + * @param event target event + * @param entity target entity + */ + public static void fixNames(EntityDamageByEntityEvent event, LivingEntity entity) + { + List metadataValue = entity.getMetadata("mcMMO_oldName"); + + if(metadataValue.size() <= 0) + return; + + if(metadataValue != null) + { + OldName oldName = (OldName) metadataValue.get(0); + entity.setCustomName(oldName.asString()); + entity.setCustomNameVisible(false); + } + } + public static int getLimitBreakDamage(Player player, SubSkillType subSkillType) { return RankUtils.getRank(player, subSkillType); } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 1ee3c2e54..5846754c0 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -478,7 +478,7 @@ Taming.Summon.Fail.Ocelot=[[RED]]You have too many ocelots nearby to summon any Taming.Summon.Fail.Wolf=[[RED]]You have too many wolves nearby to summon any more. Taming.Summon.Fail.Horse=[[RED]]You have too many horses nearby to summon any more. Taming.Summon.Fail.TooMany=[[RED]]You have reached the maximum limit of pets to summon. [[YELLOW]]({0}) -Taming.Summon.Name.Format={0}''s {1} +Taming.Summon.Name.Format={0}'s {1} #UNARMED Unarmed.Ability.Bonus.0=Iron Arm Style Unarmed.Ability.Bonus.1=+{0} DMG Upgrade