Move mutually exclusive check to constructor
This commit is contained in:
parent
1fe5bc2634
commit
5fb902d46f
@ -23,6 +23,7 @@ public class EnchantmentContainer implements Iterable<Map.Entry<Enchantment, Int
|
|||||||
{
|
{
|
||||||
this(enchantments);
|
this(enchantments);
|
||||||
filter(plugin.getConfigLoader().allowedEnchantments());
|
filter(plugin.getConfigLoader().allowedEnchantments());
|
||||||
|
filterMutuallyExclusive();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,6 +92,27 @@ public class EnchantmentContainer implements Iterable<Map.Entry<Enchantment, Int
|
|||||||
return new EnchantmentContainer(meta.getStoredEnchants(), plugin);
|
return new EnchantmentContainer(meta.getStoredEnchants(), plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all enchantments that are mutually exclusive with the provided enchantment.
|
||||||
|
* <br>This does <b>not</b> include the provided enchantment
|
||||||
|
*
|
||||||
|
* @param enchantment The enchantment to get the mutually exclusives of
|
||||||
|
* @return A linked list containing all the mutually exclusive enchantments
|
||||||
|
*/
|
||||||
|
private static List<Enchantment> getMutuallyExclusiveEnchantments(Enchantment enchantment)
|
||||||
|
{
|
||||||
|
List<Enchantment> enchantments = new LinkedList<>();
|
||||||
|
for (List<Enchantment> mutuallyExclusiveEnchantments : ArmoredElytra.getInstance().getConfigLoader().getMutuallyExclusiveEnchantments())
|
||||||
|
for (Enchantment mutuallyExclusiveEnchantment : mutuallyExclusiveEnchantments)
|
||||||
|
if (mutuallyExclusiveEnchantment.equals(enchantment))
|
||||||
|
{
|
||||||
|
enchantments.addAll(mutuallyExclusiveEnchantments.stream()
|
||||||
|
.filter(i -> !i.equals(enchantment)).toList());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return enchantments;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the total number of enchantments in this container.
|
* Gets the total number of enchantments in this container.
|
||||||
*
|
*
|
||||||
@ -112,6 +134,21 @@ public class EnchantmentContainer implements Iterable<Map.Entry<Enchantment, Int
|
|||||||
enchantments.keySet().retainAll(allowed);
|
enchantments.keySet().retainAll(allowed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove any entries form the list of enchantments that are mutually exclusive to each other.
|
||||||
|
* <br>First instance of a mutually exclusive enchantment gets priority
|
||||||
|
*/
|
||||||
|
public void filterMutuallyExclusive()
|
||||||
|
{
|
||||||
|
final List<Enchantment> disallowedEnchantments = new LinkedList<>();
|
||||||
|
for (Map.Entry<Enchantment, Integer> entry : enchantments.entrySet())
|
||||||
|
{
|
||||||
|
if (disallowedEnchantments.contains(entry.getKey())) continue;
|
||||||
|
disallowedEnchantments.addAll(getMutuallyExclusiveEnchantments(entry.getKey()));
|
||||||
|
}
|
||||||
|
disallowedEnchantments.forEach(enchantments.keySet()::remove);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the enchantments to an itemstack.
|
* Applies the enchantments to an itemstack.
|
||||||
*
|
*
|
||||||
@ -154,27 +191,6 @@ public class EnchantmentContainer implements Iterable<Map.Entry<Enchantment, Int
|
|||||||
return enchantments.isEmpty();
|
return enchantments.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of all enchantments that are mutually exclusive with the provided enchantment.
|
|
||||||
* <br>This does <b>not</b> include the provided enchantment
|
|
||||||
*
|
|
||||||
* @param enchantment The enchantment to get the mutually exclusives of
|
|
||||||
* @return A linked list containing all the mutually exclusive enchantments
|
|
||||||
*/
|
|
||||||
public static List<Enchantment> getMutuallyExclusiveEnchantments(Enchantment enchantment)
|
|
||||||
{
|
|
||||||
List<Enchantment> enchantments = new LinkedList<>();
|
|
||||||
for (List<Enchantment> mutuallyExclusiveEnchantments : ArmoredElytra.getInstance().getConfigLoader().getMutuallyExclusiveEnchantments())
|
|
||||||
for (Enchantment mutuallyExclusiveEnchantment : mutuallyExclusiveEnchantments)
|
|
||||||
if (mutuallyExclusiveEnchantment.equals(enchantment))
|
|
||||||
{
|
|
||||||
enchantments.addAll(mutuallyExclusiveEnchantments.stream()
|
|
||||||
.filter(i -> !i.equals(enchantment)).toList());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return enchantments;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merges two enchantment containers.
|
* Merges two enchantment containers.
|
||||||
*
|
*
|
||||||
@ -204,27 +220,8 @@ public class EnchantmentContainer implements Iterable<Map.Entry<Enchantment, Int
|
|||||||
return second;
|
return second;
|
||||||
|
|
||||||
final Map<Enchantment, Integer> combined = new HashMap<>();
|
final Map<Enchantment, Integer> combined = new HashMap<>();
|
||||||
final List<Enchantment> disallowedEnchantments = new LinkedList<>();
|
|
||||||
final List<Enchantment> allowedEnchantments = new LinkedList<>();
|
|
||||||
// Filter first item for mutually exclusive enchantments before adding to combined
|
|
||||||
for (Map.Entry<Enchantment, Integer> entry : first.entrySet())
|
|
||||||
{
|
|
||||||
if (disallowedEnchantments.contains(entry.getKey())) continue;
|
|
||||||
disallowedEnchantments.addAll(getMutuallyExclusiveEnchantments(entry.getKey()));
|
|
||||||
allowedEnchantments.add(entry.getKey());
|
|
||||||
combined.put(entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map.Entry<Enchantment, Integer> entry : second.entrySet())
|
for (Map.Entry<Enchantment, Integer> entry : second.entrySet())
|
||||||
{
|
{
|
||||||
// Check for mutually exclusive enchantments
|
|
||||||
// No need to update allow list as Minecraft doesn't allow multiple of the same enchant on one item
|
|
||||||
if (!allowedEnchantments.contains(entry.getKey()))
|
|
||||||
{
|
|
||||||
if (disallowedEnchantments.contains(entry.getKey())) continue;
|
|
||||||
disallowedEnchantments.addAll(getMutuallyExclusiveEnchantments(entry.getKey()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for enchants with higher level
|
// Check for enchants with higher level
|
||||||
Integer enchantLevel = combined.get(entry.getKey());
|
Integer enchantLevel = combined.get(entry.getKey());
|
||||||
if (enchantLevel != null)
|
if (enchantLevel != null)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user