Improves random enchantment level logic
This commit is contained in:
		| @@ -12,7 +12,9 @@ import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.inventory.meta.Damageable; | ||||
| import org.bukkit.inventory.meta.ItemMeta; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Calendar; | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| import java.util.Random; | ||||
| import java.util.logging.Level; | ||||
| @@ -119,20 +121,27 @@ public class ReforgeSession implements Runnable { | ||||
|             // Abort if randomness isn't on our side, or if max enchantments has been reached | ||||
|             return; | ||||
|         } | ||||
|         // Choose a random enchantment | ||||
|         Enchantment enchantment; | ||||
|         int maxRetries = 100; | ||||
|         int retries = 0; | ||||
|         do { | ||||
|             // Try to find a working enchantment for the re-forged item up to maxRetries times | ||||
|             enchantment = Enchantment.getByKey(NamespacedKey.fromString(enchantments[random.nextInt(enchantments.length)])); | ||||
|         } while ((enchantment == null || !enchantment.canEnchantItem(itemToReforge)) && (retries++ < maxRetries)); | ||||
|  | ||||
|         if (enchantment != null && enchantment.canEnchantItem(itemToReforge)) { | ||||
|             int randomBound = enchantment.getMaxLevel() - enchantment.getStartLevel(); | ||||
|         //Find usable enchantments first | ||||
|         List<Enchantment> usableEnchantments = new ArrayList<>(); | ||||
|         for (String enchantmentName : enchantments) { | ||||
|             Enchantment enchantment = Enchantment.getByKey(NamespacedKey.fromString(enchantmentName)); | ||||
|             if (enchantment != null && enchantment.canEnchantItem(itemToReforge)) { | ||||
|                 usableEnchantments.add(enchantment); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         //Choose a random enchantment | ||||
|         Enchantment randomEnchantment = usableEnchantments.get(random.nextInt(usableEnchantments.size())); | ||||
|         if (randomEnchantment != null) { | ||||
|             int randomBound = randomEnchantment.getMaxLevel() + 1; | ||||
|             //A workaround for the random method's bound sometimes being negative | ||||
|             if (randomBound >= 0) { | ||||
|                 itemToReforge.addEnchantment(enchantment, random.nextInt(randomBound) + enchantment.getStartLevel()); | ||||
|                 int existingLevel = itemToReforge.getEnchantmentLevel(randomEnchantment); | ||||
|                 /* Add a random enchantment whose level is no lower than the start level, and no lower than the | ||||
|                 existing level (to prevent making the item worse) */ | ||||
|                 itemToReforge.addEnchantment(randomEnchantment, Math.max(Math.max(random.nextInt(randomBound), | ||||
|                         randomEnchantment.getStartLevel()), existingLevel)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user