ExcellentEnchants-spigot/V1_19_R3/src/main/java/su/nightexpress/excellentenchants/nms/v1_19_R3/CustomEnchantment.java

150 lines
5.3 KiB
Java

package su.nightexpress.excellentenchants.nms.v1_19_R3;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.EnchantmentCategory;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.v1_19_R3.CraftEquipmentSlot;
import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey;
import org.jetbrains.annotations.NotNull;
import su.nightexpress.excellentenchants.api.EnchantingBridge;
import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
import su.nightexpress.excellentenchants.api.enchantment.distribution.VanillaOptions;
public class CustomEnchantment extends Enchantment {
private final EnchantmentData enchantmentData;
private VanillaOptions vanillaOptions;
public CustomEnchantment(@NotNull EnchantmentData enchantmentData) {
super(nmsRarity(enchantmentData), nmsCategory(enchantmentData), nmsSlots(enchantmentData));
this.enchantmentData = enchantmentData;
if (enchantmentData.getDistributionOptions() instanceof VanillaOptions options) {
this.vanillaOptions = options;
}
}
@Override
public int getMinLevel() {
return this.enchantmentData.getMinLevel();
}
@Override
public int getMaxLevel() {
return this.enchantmentData.getMaxLevel();
}
@Override
public int getMinCost(int level) {
return this.enchantmentData.getMinCost(level);
}
@Override
public int getMaxCost(int level) {
return this.enchantmentData.getMaxCost(level);
}
@Override
protected boolean checkCompatibility(Enchantment other) {
ResourceLocation location = BuiltInRegistries.ENCHANTMENT.getKey(other);
if (location == null) return false;
NamespacedKey key = CraftNamespacedKey.fromMinecraft(location);
String id = key.getKey();
// Expensive probably.
//org.bukkit.enchantments.Enchantment bukkit = CraftEnchantment.minecraftToBukkit(other);
//String id = bukkit.getKey().getKey();
return !this.enchantmentData.getConflicts().contains(id);
}
@Override
public boolean canEnchant(ItemStack item) {
if (!super.canEnchant(item)) return false;
return this.canEnchant(CraftItemStack.asBukkitCopy(item));
}
public boolean canEnchant(@NotNull org.bukkit.inventory.ItemStack bukkitItem) {
if (!this.enchantmentData.hasItemCategory()) {
if (this.enchantmentData.checkEnchantCategory(bukkitItem)) return true;
}
return this.enchantmentData.checkItemCategory(bukkitItem);
}
@Override
public boolean isTreasureOnly() {
return this.enchantmentData.isTreasure() || this.isCurse();
}
@Override
public boolean isCurse() {
return this.enchantmentData.isCurse();
}
@Override
public boolean isTradeable() {
return this.vanillaOptions != null && this.vanillaOptions.isTradeable();
}
@Override
public boolean isDiscoverable() {
org.bukkit.inventory.ItemStack bukkitItem = EnchantingBridge.getEnchantingItem();
if (bukkitItem != null && !this.canEnchant(bukkitItem)) {
return false;
}
return this.vanillaOptions != null && this.vanillaOptions.isDiscoverable();
}
public static Rarity nmsRarity(@NotNull EnchantmentData data) {
return switch (data.getRarity()) {
case RARE -> Rarity.RARE;
case COMMON -> Rarity.COMMON;
case UNCOMMON -> Rarity.UNCOMMON;
case VERY_RARE -> Rarity.VERY_RARE;
};
}
@NotNull
public static EnchantmentCategory nmsCategory(@NotNull EnchantmentData data) {
return switch (data.getCategory()) {
case WEAPON -> EnchantmentCategory.WEAPON;
case TOOL -> EnchantmentCategory.DIGGER;
case ARMOR -> EnchantmentCategory.ARMOR;
case BOW -> EnchantmentCategory.BOW;
case TRIDENT -> EnchantmentCategory.TRIDENT;
case CROSSBOW -> EnchantmentCategory.CROSSBOW;
case WEARABLE -> EnchantmentCategory.WEARABLE;
case BREAKABLE -> EnchantmentCategory.BREAKABLE;
case ARMOR_FEET -> EnchantmentCategory.ARMOR_FEET;
case ARMOR_HEAD -> EnchantmentCategory.ARMOR_HEAD;
case ARMOR_LEGS -> EnchantmentCategory.ARMOR_LEGS;
case ARMOR_TORSO -> EnchantmentCategory.ARMOR_CHEST;
case VANISHABLE -> EnchantmentCategory.VANISHABLE;
case FISHING_ROD -> EnchantmentCategory.FISHING_ROD;
default -> throw new IllegalStateException("Unexpected value: " + data.getCategory());
};
}
public static EquipmentSlot[] nmsSlots(@NotNull EnchantmentData data) {
org.bukkit.inventory.EquipmentSlot[] slots = data.getSlots();
EquipmentSlot[] nmsSlots = new EquipmentSlot[slots.length];
for (int index = 0; index < nmsSlots.length; index++) {
org.bukkit.inventory.EquipmentSlot bukkitSlot = slots[index];
nmsSlots[index] = CraftEquipmentSlot.getNMS(bukkitSlot);
}
return nmsSlots;
}
}