nossr50 6 年之前
父节点
当前提交
ef71661db1

+ 9 - 0
Changelog.txt

@@ -1,4 +1,13 @@
 Version 2.1.81
 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
 Version 2.1.80
     (Fix) mcMMO now respects the NBT "Unbreakable" tag and does not deal durability damage to items with that tag
     (Fix) mcMMO now respects the NBT "Unbreakable" tag and does not deal durability damage to items with that tag

+ 1 - 1
pom.xml

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

+ 1 - 0
src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java

@@ -147,6 +147,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
     /* EXPLOIT TOGGLES */
     /* EXPLOIT TOGGLES */
     public boolean isEndermanEndermiteFarmingPrevented() { return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); }
     public boolean isEndermanEndermiteFarmingPrevented() { return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); }
     public boolean isPistonExploitPrevented() { return config.getBoolean("ExploitFix.Pistons", false); }
     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 isFishingExploitingPrevented() { return config.getBoolean("ExploitFix.Fishing", true); }
     public boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); }
     public boolean isAcrobaticsExploitingPrevented() { return config.getBoolean("ExploitFix.Acrobatics", true); }

+ 13 - 0
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.mining.MiningManager;
 import com.gmail.nossr50.skills.taming.Taming;
 import com.gmail.nossr50.skills.taming.Taming;
 import com.gmail.nossr50.skills.taming.TamingManager;
 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.BlockUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
@@ -346,6 +347,18 @@ public class EntityListener implements Listener {
             if (projectileSource instanceof LivingEntity) {
             if (projectileSource instanceof LivingEntity) {
                 attacker = (LivingEntity) projectileSource;
                 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) {
         else if (attacker instanceof Tameable) {
             AnimalTamer animalTamer = ((Tameable) attacker).getOwner();
             AnimalTamer animalTamer = ((Tameable) attacker).getOwner();

+ 11 - 4
src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java

@@ -328,10 +328,17 @@ public class RepairManager extends SkillManager {
         boolean downgraded = false;
         boolean downgraded = false;
 
 
         for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
         for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
+            int enchantLevel = enchant.getValue();
+
+            if(!ExperienceConfig.getInstance().allowUnsafeEnchantments()) {
+                if(enchantLevel > enchant.getKey().getMaxLevel()) {
+                    enchantLevel = enchant.getKey().getMaxLevel();
+                }
+            }
+
             Enchantment enchantment = enchant.getKey();
             Enchantment enchantment = enchant.getKey();
 
 
             if (RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getKeepEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING))) {
             if (RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getKeepEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING))) {
-                int enchantLevel = enchant.getValue();
 
 
                 if (ArcaneForging.arcaneForgingDowngrades && enchantLevel > 1
                 if (ArcaneForging.arcaneForgingDowngrades && enchantLevel > 1
                         && (!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(100 - getDowngradeEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING)))) {
                         && (!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(100 - getDowngradeEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING)))) {
@@ -347,13 +354,13 @@ public class RepairManager extends SkillManager {
         Map<Enchantment, Integer> newEnchants = item.getEnchantments();
         Map<Enchantment, Integer> newEnchants = item.getEnchantments();
 
 
         if (newEnchants.isEmpty()) {
         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()) {
         else if (downgraded || newEnchants.size() < enchants.size()) {
-            NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE_FAILED, "Repair.Arcane.Downgrade");
+            NotificationManager.sendPlayerInformationChatOnly(getPlayer(),  "Repair.Arcane.Downgrade");
         }
         }
         else {
         else {
-            NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Repair.Arcane.Perfect");
+            NotificationManager.sendPlayerInformationChatOnly(getPlayer(),  "Repair.Arcane.Perfect");
         }
         }
     }
     }
 
 

+ 16 - 6
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.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 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.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
@@ -214,7 +215,7 @@ public class SalvageManager extends SkillManager {
         Player player = getPlayer();
         Player player = getPlayer();
 
 
         if (!RankUtils.hasUnlockedSubskill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE) || !Permissions.arcaneSalvage(player)) {
         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;
             return null;
         }
         }
 
 
@@ -225,15 +226,24 @@ public class SalvageManager extends SkillManager {
         int arcaneFailureCount = 0;
         int arcaneFailureCount = 0;
 
 
         for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
         for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
+
+            int enchantLevel = enchant.getValue();
+
+            if(!ExperienceConfig.getInstance().allowUnsafeEnchantments()) {
+                if(enchantLevel > enchant.getKey().getMaxLevel()) {
+                    enchantLevel = enchant.getKey().getMaxLevel();
+                }
+            }
+
             if (!Salvage.arcaneSalvageEnchantLoss
             if (!Salvage.arcaneSalvageEnchantLoss
                     || Permissions.hasSalvageEnchantBypassPerk(player)
                     || Permissions.hasSalvageEnchantBypassPerk(player)
                     || RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractFullEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) {
                     || 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
                     && Salvage.arcaneSalvageDowngrades
                     && RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractPartialEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) {
                     && 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;
                 downgraded = true;
             } else {
             } else {
                 arcaneFailureCount++;
                 arcaneFailureCount++;
@@ -242,11 +252,11 @@ public class SalvageManager extends SkillManager {
 
 
         if(failedAllEnchants(arcaneFailureCount, enchants.entrySet().size()))
         if(failedAllEnchants(arcaneFailureCount, enchants.entrySet().size()))
         {
         {
-            NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.ArcaneFailed");
+            NotificationManager.sendPlayerInformationChatOnly(player,  "Salvage.Skills.ArcaneFailed");
             return null;
             return null;
         } else if(downgraded)
         } else if(downgraded)
         {
         {
-            NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.ArcanePartial");
+            NotificationManager.sendPlayerInformationChatOnly(player,  "Salvage.Skills.ArcanePartial");
         }
         }
 
 
         book.setItemMeta(enchantMeta);
         book.setItemMeta(enchantMeta);

+ 1 - 0
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
     #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
     MaxLevelMultiplier: 0.05
 ExploitFix:
 ExploitFix:
+    UnsafeEnchantments: false
     # Prevent many exploits related to fishing
     # Prevent many exploits related to fishing
     Fishing: true
     Fishing: true
     EndermanEndermiteFarms: true
     EndermanEndermiteFarms: true