From 9c040540170dbab8b0f9b2e64d09ea5c33a38d64 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 12 Jun 2019 12:23:58 -0700 Subject: [PATCH 1/5] 2.1.80 --- Changelog.txt | 3 +++ pom.xml | 2 +- .../com/gmail/nossr50/config/skills/repair/RepairConfig.java | 1 - .../com/gmail/nossr50/skills/salvage/SalvageManager.java | 5 ++++- .../com/gmail/nossr50/skills/woodcutting/Woodcutting.java | 4 ++-- .../java/com/gmail/nossr50/util/TextComponentFactory.java | 1 - src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java | 3 ++- 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index e1ca54312..d138ed574 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,6 @@ +Version 2.1.80 + (Fix) mcMMO now respects the NBT "Unbreakable" tag and does not deal durability damage to items with that tag + Version 2.1.79 Updated Japanese locale (Thanks snake0053) Fixed a NPE that could happen when using Tree Feller with an unenchanted Axe diff --git a/pom.xml b/pom.xml index 19bafd5c1..23d233350 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.79 + 2.1.80 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java index 6aebb9841..c04a98676 100644 --- a/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java +++ b/src/main/java/com/gmail/nossr50/config/skills/repair/RepairConfig.java @@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.skills.MaterialType; import com.gmail.nossr50.skills.repair.repairables.Repairable; import com.gmail.nossr50.skills.repair.repairables.RepairableFactory; import com.gmail.nossr50.util.ItemUtils; -import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java index 70b4990b1..5dcf8f867 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -10,7 +10,10 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; -import com.gmail.nossr50.util.*; +import com.gmail.nossr50.util.EventUtils; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceSkillStatic; import com.gmail.nossr50.util.random.RandomChanceUtil; diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java index ff9039365..03459492e 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java @@ -149,8 +149,8 @@ public final class Woodcutting { */ protected static boolean handleDurabilityLoss(Set treeFellerBlocks, ItemStack inHand) { - if(inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) != null - && inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) >= 1) { + if((inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) != null && inHand.getItemMeta().getEnchants().get(Enchantment.DURABILITY) >= 1) + || (inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable())) { return true; } diff --git a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index e63dc1bdb..6d93218c8 100644 --- a/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.util; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.RankConfig; -import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.json.McMMOUrl; import com.gmail.nossr50.datatypes.json.McMMOWebLinks; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index 9269cac95..c3247606d 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -243,7 +243,8 @@ public class SkillUtils { * @param maxDamageModifier the amount to adjust the max damage by */ public static void handleDurabilityChange(ItemStack itemStack, double durabilityModifier, double maxDamageModifier) { - if (itemStack.getEnchantments().get(Enchantment.DURABILITY) != null && itemStack.getEnchantments().get(Enchantment.DURABILITY) >= 1) { + if((itemStack.getItemMeta().getEnchants().get(Enchantment.DURABILITY) != null && itemStack.getItemMeta().getEnchants().get(Enchantment.DURABILITY) >= 1) + || (itemStack.getItemMeta() != null && itemStack.getItemMeta().isUnbreakable())) { return; } From adefda42dff07b2517e23f2bb008e44dde2d5d63 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 12 Jun 2019 14:43:13 -0700 Subject: [PATCH 2/5] Dev mode --- Changelog.txt | 2 ++ pom.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index d138ed574..146aa67b2 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,5 @@ +Version 2.1.81 + Version 2.1.80 (Fix) mcMMO now respects the NBT "Unbreakable" tag and does not deal durability damage to items with that tag diff --git a/pom.xml b/pom.xml index 23d233350..5908de545 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.80 + 2.1.81-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO From ef71661db1719e599cb082ed50803a77438c6781 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 14 Jun 2019 20:39:57 -0700 Subject: [PATCH 3/5] 2.1.81 --- Changelog.txt | 9 ++++++++ pom.xml | 2 +- .../config/experience/ExperienceConfig.java | 1 + .../nossr50/listeners/EntityListener.java | 13 +++++++++++ .../nossr50/skills/repair/RepairManager.java | 15 +++++++++---- .../skills/salvage/SalvageManager.java | 22 ++++++++++++++----- src/main/resources/experience.yml | 1 + 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 146aa67b2..0696b54d7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,13 @@ Version 2.1.81 + Fixed a bug where Arrow Deflect would never trigger outside of PVP + Fixed a bug where failing to salvage enchantments incorrectly colored the text + mcMMO no longer allows players to keep enchantments exceeding normal limitations by default when salvaging or repairing (you can turn this off in the config, see below) + Added new setting 'ExploitFix.UnsafeEnchantments' to experience.yml, turn this on to allow players to salvage/repair enchantments higher than normal game restrictions + + NOTES: + If a player tries to salvage/repair an item with an illegal enchant (for example Sharpness X) it will downgrade that item to the highest legal version when calculating rewards + If you don't like this change you can turn it off in experience.yml under 'ExploitFix.UnsafeEnchantments' + Version 2.1.80 (Fix) mcMMO now respects the NBT "Unbreakable" tag and does not deal durability damage to items with that tag diff --git a/pom.xml b/pom.xml index 5908de545..65095a77f 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.81-SNAPSHOT + 2.1.81 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java index 3f134cf66..641b0e4a7 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -147,6 +147,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { /* EXPLOIT TOGGLES */ public boolean isEndermanEndermiteFarmingPrevented() { return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); } public boolean isPistonExploitPrevented() { return config.getBoolean("ExploitFix.Pistons", false); } + public boolean allowUnsafeEnchantments() { return config.getBoolean("ExploitFix.UnsafeEnchantments", false); } public boolean isFishingExploitingPrevented() { return config.getBoolean("ExploitFix.Fishing", true); } public boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); } diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index b548f1668..c7f26431c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -17,6 +17,7 @@ import com.gmail.nossr50.skills.mining.BlastMining; import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.taming.Taming; import com.gmail.nossr50.skills.taming.TamingManager; +import com.gmail.nossr50.skills.unarmed.UnarmedManager; import com.gmail.nossr50.util.BlockUtils; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -346,6 +347,18 @@ public class EntityListener implements Listener { if (projectileSource instanceof LivingEntity) { attacker = (LivingEntity) projectileSource; } + + if(defender instanceof Player) { + Player playerDefender = (Player) defender; + UnarmedManager unarmedManager = UserManager.getPlayer(playerDefender).getUnarmedManager(); + + if (unarmedManager.canDeflect()) { + if(unarmedManager.deflectCheck()) { + event.setCancelled(true); + return; + } + } + } } else if (attacker instanceof Tameable) { AnimalTamer animalTamer = ((Tameable) attacker).getOwner(); diff --git a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java index 31d8c7e5f..1f36ad650 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -328,10 +328,17 @@ public class RepairManager extends SkillManager { boolean downgraded = false; for (Entry enchant : enchants.entrySet()) { + int enchantLevel = enchant.getValue(); + + if(!ExperienceConfig.getInstance().allowUnsafeEnchantments()) { + if(enchantLevel > enchant.getKey().getMaxLevel()) { + enchantLevel = enchant.getKey().getMaxLevel(); + } + } + Enchantment enchantment = enchant.getKey(); if (RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getKeepEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING))) { - int enchantLevel = enchant.getValue(); if (ArcaneForging.arcaneForgingDowngrades && enchantLevel > 1 && (!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(100 - getDowngradeEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING)))) { @@ -347,13 +354,13 @@ public class RepairManager extends SkillManager { Map newEnchants = item.getEnchantments(); if (newEnchants.isEmpty()) { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE_FAILED, "Repair.Arcane.Fail"); + NotificationManager.sendPlayerInformationChatOnly(getPlayer(), "Repair.Arcane.Fail"); } else if (downgraded || newEnchants.size() < enchants.size()) { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE_FAILED, "Repair.Arcane.Downgrade"); + NotificationManager.sendPlayerInformationChatOnly(getPlayer(), "Repair.Arcane.Downgrade"); } else { - NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Repair.Arcane.Perfect"); + NotificationManager.sendPlayerInformationChatOnly(getPlayer(), "Repair.Arcane.Perfect"); } } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java index 5dcf8f867..e7fd5bb44 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.skills.salvage; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; @@ -214,7 +215,7 @@ public class SalvageManager extends SkillManager { Player player = getPlayer(); if (!RankUtils.hasUnlockedSubskill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE) || !Permissions.arcaneSalvage(player)) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.ArcaneFailed"); + NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.ArcaneFailed"); return null; } @@ -225,15 +226,24 @@ public class SalvageManager extends SkillManager { int arcaneFailureCount = 0; for (Entry enchant : enchants.entrySet()) { + + int enchantLevel = enchant.getValue(); + + if(!ExperienceConfig.getInstance().allowUnsafeEnchantments()) { + if(enchantLevel > enchant.getKey().getMaxLevel()) { + enchantLevel = enchant.getKey().getMaxLevel(); + } + } + if (!Salvage.arcaneSalvageEnchantLoss || Permissions.hasSalvageEnchantBypassPerk(player) || RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractFullEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) { - enchantMeta.addStoredEnchant(enchant.getKey(), enchant.getValue(), true); + enchantMeta.addStoredEnchant(enchant.getKey(), enchantLevel, true); } - else if (enchant.getValue() > 1 + else if (enchantLevel > 1 && Salvage.arcaneSalvageDowngrades && RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractPartialEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) { - enchantMeta.addStoredEnchant(enchant.getKey(), enchant.getValue() - 1, true); + enchantMeta.addStoredEnchant(enchant.getKey(), enchantLevel - 1, true); downgraded = true; } else { arcaneFailureCount++; @@ -242,11 +252,11 @@ public class SalvageManager extends SkillManager { if(failedAllEnchants(arcaneFailureCount, enchants.entrySet().size())) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.ArcaneFailed"); + NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.ArcaneFailed"); return null; } else if(downgraded) { - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.ArcanePartial"); + NotificationManager.sendPlayerInformationChatOnly(player, "Salvage.Skills.ArcanePartial"); } book.setItemMeta(enchantMeta); diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 8c7959fc9..d2a291463 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -27,6 +27,7 @@ EarlyGameBoost: #Used to determine the cap of the max boot, with default level cap it will be 5 on standard, and 50 on retro MaxLevelMultiplier: 0.05 ExploitFix: + UnsafeEnchantments: false # Prevent many exploits related to fishing Fishing: true EndermanEndermiteFarms: true From 8f55a6277a522a65a7ab162418cf876643de9c4d Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 14 Jun 2019 20:44:33 -0700 Subject: [PATCH 4/5] Fix Repair enchant logic --- .../java/com/gmail/nossr50/skills/repair/RepairManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java index 1f36ad650..ce1d1775d 100644 --- a/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java +++ b/src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java @@ -333,6 +333,8 @@ public class RepairManager extends SkillManager { if(!ExperienceConfig.getInstance().allowUnsafeEnchantments()) { if(enchantLevel > enchant.getKey().getMaxLevel()) { enchantLevel = enchant.getKey().getMaxLevel(); + + item.addEnchantment(enchant.getKey(), enchantLevel); } } From c3f38cdabd46fea8c0579d063ca50a90762dd145 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 15 Jun 2019 21:22:21 -0700 Subject: [PATCH 5/5] A few typos in javdocs --- .../java/com/gmail/nossr50/util/player/NotificationManager.java | 2 +- .../java/com/gmail/nossr50/util/random/RandomChanceUtil.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java index f33432d05..09d9aa697 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -26,7 +26,7 @@ import org.bukkit.entity.Player; public class NotificationManager { /** * Sends players notifications from mcMMO - * This does this by sending out an event so other plugins can cancel it + * Does so by sending out an event so other plugins can cancel it * @param player target player * @param notificationType notifications defined type * @param key the locale key for the notifications defined message diff --git a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java index 6bb213c5e..cf4817a65 100644 --- a/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java +++ b/src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java @@ -28,7 +28,7 @@ public class RandomChanceUtil * @param skillActivationType this value represents what kind of activation procedures this sub-skill uses * @param subSkillType The identifier for this specific sub-skill * @param player The owner of this sub-skill - * @return returns true if all conditions are met and they event is not cancelled + * @return returns true if all conditions are met and the event is not cancelled */ public static boolean isActivationSuccessful(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) {