mirror of
https://github.com/alexcrea/CustomAnvil.git
synced 2026-06-23 16:16:17 +02:00
Fix enchantment being applied to the left item when trying to combine.
Fix conflict not being applied on some situation.
This commit is contained in:
parent
19806773a6
commit
5e42bf3a90
5 changed files with 83 additions and 51 deletions
|
|
@ -0,0 +1,34 @@
|
||||||
|
package xyz.alexcrea.cuanvil.enchant;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface AdditionalTestEnchantment {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if the provided enchantments can be compatible with this enchantment. only non-Custom Anvil conflict.
|
||||||
|
* @param enchantments Immutable map of validated enchantments for the item.
|
||||||
|
* @param itemMat Material of the tested item.
|
||||||
|
* @return If there is a conflict with the enchantments.
|
||||||
|
*/
|
||||||
|
boolean isEnchantConflict(
|
||||||
|
@NotNull Map<CAEnchantment, Integer> enchantments,
|
||||||
|
@NotNull Material itemMat);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if the provided item can be compatible with this enchantment. only non-Custom Anvil conflict.
|
||||||
|
* @param enchantments Immutable map of validated enchantments for the item.
|
||||||
|
* @param itemMat Material of the tested item.
|
||||||
|
* @param item Provide a new instance of the used item stack with the partial enchantment applied.
|
||||||
|
* @return If there is a conflict with the enchantment and the item.
|
||||||
|
*/
|
||||||
|
boolean isItemConflict(
|
||||||
|
@NotNull Map<CAEnchantment, Integer> enchantments,
|
||||||
|
@NotNull Material itemMat,
|
||||||
|
@NotNull ItemStack item);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -89,19 +89,6 @@ public interface CAEnchantment {
|
||||||
*/
|
*/
|
||||||
@NotNull Collection<EnchantConflictGroup> getConflicts();
|
@NotNull Collection<EnchantConflictGroup> getConflicts();
|
||||||
|
|
||||||
/**
|
|
||||||
* Test if the provided item can be compatible with this enchantment. only non-Custom Anvil conflict.
|
|
||||||
* @param baseEnchantments Validated enchantments for the item.
|
|
||||||
* @param itemMat Material of the tested item.
|
|
||||||
* @param itemSupply Provide a new instance of used item stack but with baseEnchantments as enchantments.
|
|
||||||
* @return Type of conflict this enchantment has with the provided item.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
ConflictType testOtherConflicts(
|
|
||||||
@NotNull Map<CAEnchantment, Integer> baseEnchantments,
|
|
||||||
@NotNull Material itemMat,
|
|
||||||
@NotNull Supplier<ItemStack> itemSupply);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current level of the enchantment.
|
* Get current level of the enchantment.
|
||||||
* @param item Item to search the level for.
|
* @param item Item to search the level for.
|
||||||
|
|
|
||||||
|
|
@ -112,12 +112,4 @@ public abstract class CAEnchantmentBase implements CAEnchantment {
|
||||||
return conflicts;
|
return conflicts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ConflictType testOtherConflicts(
|
|
||||||
@NotNull Map<CAEnchantment, Integer> baseEnchantments,
|
|
||||||
@NotNull Material itemMat,
|
|
||||||
@NotNull Supplier<ItemStack> itemSupply) {
|
|
||||||
return ConflictType.NO_CONFLICT;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,13 @@ import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
import xyz.alexcrea.cuanvil.enchant.CAEnchantment;
|
||||||
import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
|
import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity;
|
||||||
|
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment;
|
||||||
import xyz.alexcrea.cuanvil.group.ConflictType;
|
import xyz.alexcrea.cuanvil.group.ConflictType;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class CAEcoEnchant extends CAVanillaEnchantment {
|
public class CAEcoEnchant extends CAVanillaEnchantment implements AdditionalTestEnchantment {
|
||||||
|
|
||||||
private final @NotNull EcoEnchant ecoEnchant;
|
private final @NotNull EcoEnchant ecoEnchant;
|
||||||
|
|
||||||
|
|
@ -22,36 +23,37 @@ public class CAEcoEnchant extends CAVanillaEnchantment {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull ConflictType testOtherConflicts(
|
public boolean isEnchantConflict(@NotNull Map<CAEnchantment, Integer> enchantments, @NotNull Material itemMat) {
|
||||||
@NotNull Map<CAEnchantment, Integer> baseEnchantments,
|
if(!enchantments.isEmpty()) {
|
||||||
@NotNull Material itemMat,
|
if (this.ecoEnchant.getConflictsWithEverything()) {
|
||||||
@NotNull Supplier<ItemStack> itemSupply) {
|
return true;
|
||||||
|
|
||||||
if(!baseEnchantments.isEmpty()){
|
|
||||||
if(this.ecoEnchant.getConflictsWithEverything()){
|
|
||||||
return ConflictType.ENCHANTMENT_CONFLICT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (CAEnchantment other : baseEnchantments.keySet()) {
|
for (CAEnchantment other : enchantments.keySet()) {
|
||||||
if(other instanceof CAVanillaEnchantment otherVanilla //TODO ISSUE FOUND: if vanilla is applied first conflcit is ignored. maybe export only enchantment conflict but keep target from ecoEnchant.
|
if(other instanceof CAVanillaEnchantment otherVanilla
|
||||||
&& this.ecoEnchant.conflictsWith(otherVanilla.getEnchant())){
|
&& this.ecoEnchant.conflictsWith(otherVanilla.getEnchant())){
|
||||||
return ConflictType.ENCHANTMENT_CONFLICT;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Allow enchanted book
|
@Override
|
||||||
|
public boolean isItemConflict(@NotNull Map<CAEnchantment, Integer> enchantments,
|
||||||
|
@NotNull Material itemMat,
|
||||||
|
@NotNull ItemStack item) {
|
||||||
if(Material.ENCHANTED_BOOK.equals(itemMat)){
|
if(Material.ENCHANTED_BOOK.equals(itemMat)){
|
||||||
return ConflictType.NO_CONFLICT;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack item = itemSupply.get();
|
|
||||||
for (EnchantmentTarget target : this.ecoEnchant.getTargets()) {
|
for (EnchantmentTarget target : this.ecoEnchant.getTargets()) {
|
||||||
if(target.matches(item)){
|
if(target.matches(item)){
|
||||||
return ConflictType.NO_CONFLICT;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ConflictType.ITEM_CONFLICT;
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,11 @@ import org.bukkit.NamespacedKey
|
||||||
import org.bukkit.configuration.ConfigurationSection
|
import org.bukkit.configuration.ConfigurationSection
|
||||||
import org.bukkit.enchantments.Enchantment
|
import org.bukkit.enchantments.Enchantment
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import xyz.alexcrea.cuanvil.enchant.AdditionalTestEnchantment
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
|
import xyz.alexcrea.cuanvil.enchant.CAEnchantment
|
||||||
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry
|
import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry
|
||||||
import java.util.function.Supplier
|
import java.util.*
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
class EnchantConflictManager {
|
class EnchantConflictManager {
|
||||||
|
|
||||||
|
|
@ -166,23 +168,38 @@ class EnchantConflictManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test conflict with other conflict system.
|
val immutableEnchants = Collections.unmodifiableMap(appliedEnchants)
|
||||||
val otherConflict = newEnchant.testOtherConflicts(appliedEnchants, mat, reEnchantSupplier(item, appliedEnchants))
|
for (appliedEnchant in appliedEnchants) {
|
||||||
|
if(appliedEnchant is AdditionalTestEnchantment){
|
||||||
return result.getWorstConflict(otherConflict)
|
val doConflict = appliedEnchant.isEnchantConflict(immutableEnchants, mat)
|
||||||
|
if(doConflict){
|
||||||
|
return ConflictType.ENCHANTMENT_CONFLICT
|
||||||
|
}
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun reEnchantSupplier(item: ItemStack, enchantments: Map<CAEnchantment, Int>): Supplier<ItemStack> {
|
if((result != ConflictType.ITEM_CONFLICT) && (newEnchant is AdditionalTestEnchantment)){
|
||||||
return Supplier {
|
val partialItem = createPartialResult(item, immutableEnchants)
|
||||||
|
|
||||||
|
if(newEnchant.isItemConflict(immutableEnchants, mat, partialItem)){
|
||||||
|
return ConflictType.ITEM_CONFLICT
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createPartialResult(item: ItemStack, enchantments: Map<CAEnchantment, Int>): ItemStack {
|
||||||
val newItem = item.clone()
|
val newItem = item.clone()
|
||||||
|
|
||||||
CAEnchantment.clearEnchants(newItem)
|
CAEnchantment.clearEnchants(newItem)
|
||||||
enchantments.forEach{//TODO maybe bulk add if possible
|
enchantments.forEach{//TODO maybe bulk add if possible
|
||||||
enchantment -> enchantment.key.addEnchantmentUnsafe(item, enchantment.value)
|
enchantment -> enchantment.key.addEnchantmentUnsafe(newItem, enchantment.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
return@Supplier newItem
|
return newItem
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue