1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00

Merge pull request #3033 from variananora/fix/auto-disenchanter-strict-slot-order

This commit is contained in:
Daniel Walsh 2021-05-09 14:58:39 +01:00 committed by GitHub
commit e7ef924bf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -58,7 +58,7 @@ public class AutoDisenchanter extends AbstractEnchantmentMachine {
ItemStack item = menu.getItemInSlot(slot); ItemStack item = menu.getItemInSlot(slot);
if (!isDisenchantable(item)) { if (!isDisenchantable(item)) {
return null; continue;
} }
// Call an event so other Plugins can modify it. // Call an event so other Plugins can modify it.
@ -83,13 +83,11 @@ public class AutoDisenchanter extends AbstractEnchantmentMachine {
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
private MachineRecipe disenchant(BlockMenu menu, ItemStack item, ItemStack book) { private MachineRecipe disenchant(BlockMenu menu, ItemStack item, ItemStack book) {
Map<Enchantment, Integer> enchantments = new HashMap<>(); Map<Enchantment, Integer> enchantments = new HashMap<>();
int amount = 0;
// Find enchantments // Find enchantments
for (Map.Entry<Enchantment, Integer> entry : item.getEnchantments().entrySet()) { for (Map.Entry<Enchantment, Integer> entry : item.getEnchantments().entrySet()) {
if (isEnchantmentLevelAllowed(entry.getValue())) { if (isEnchantmentLevelAllowed(entry.getValue())) {
enchantments.put(entry.getKey(), entry.getValue()); enchantments.put(entry.getKey(), entry.getValue());
amount++;
} else if (!menu.toInventory().getViewers().isEmpty()) { } else if (!menu.toInventory().getViewers().isEmpty()) {
showEnchantmentLevelWarning(menu); showEnchantmentLevelWarning(menu);
return null; return null;
@ -97,14 +95,14 @@ public class AutoDisenchanter extends AbstractEnchantmentMachine {
} }
// Check if we found any valid enchantments // Check if we found any valid enchantments
if (amount > 0) { if (!enchantments.isEmpty()) {
ItemStack disenchantedItem = item.clone(); ItemStack disenchantedItem = item.clone();
disenchantedItem.setAmount(1); disenchantedItem.setAmount(1);
ItemStack enchantedBook = new ItemStack(Material.ENCHANTED_BOOK); ItemStack enchantedBook = new ItemStack(Material.ENCHANTED_BOOK);
transferEnchantments(disenchantedItem, enchantedBook, enchantments); transferEnchantments(disenchantedItem, enchantedBook, enchantments);
MachineRecipe recipe = new MachineRecipe(90 * amount / this.getSpeed(), new ItemStack[] { book, item }, new ItemStack[] { disenchantedItem, enchantedBook }); MachineRecipe recipe = new MachineRecipe(90 * enchantments.size() / this.getSpeed(), new ItemStack[] { book, item }, new ItemStack[] { disenchantedItem, enchantedBook });
if (!InvUtils.fitAll(menu.toInventory(), recipe.getOutput(), getOutputSlots())) { if (!InvUtils.fitAll(menu.toInventory(), recipe.getOutput(), getOutputSlots())) {
return null; return null;
@ -140,10 +138,7 @@ public class AutoDisenchanter extends AbstractEnchantmentMachine {
} }
private boolean isDisenchantable(@Nullable ItemStack item) { private boolean isDisenchantable(@Nullable ItemStack item) {
if (item == null || item.getType().isAir()) { if (item != null && !item.getType().isAir() && item.getType() != Material.BOOK && !hasIgnoredLore(item)) {
return false;
} else if (item.getType() != Material.BOOK && !hasIgnoredLore(item)) {
// ^ This stops endless checks of getByItem for books
SlimefunItem sfItem = SlimefunItem.getByItem(item); SlimefunItem sfItem = SlimefunItem.getByItem(item);
return sfItem == null || sfItem.isDisenchantable(); return sfItem == null || sfItem.isDisenchantable();
} else { } else {