SPIGOT-6026: Pull PotionEffectType and Enchantment from registry

By: DerFrZocker <derrieple@gmail.com>
This commit is contained in:
CraftBukkit/Spigot
2023-12-06 03:40:00 +11:00
parent 8398e12b34
commit dd8ca5c2dc
9 changed files with 226 additions and 265 deletions

View File

@@ -1,9 +1,14 @@
package org.bukkit.craftbukkit.enchantments;
import com.google.common.base.Preconditions;
import net.minecraft.core.IRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.item.enchantment.EnchantmentBinding;
import net.minecraft.world.item.enchantment.EnchantmentVanishing;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.enchantments.Enchantment;
@@ -12,171 +17,133 @@ import org.bukkit.enchantments.EnchantmentWrapper;
import org.bukkit.inventory.ItemStack;
public class CraftEnchantment extends Enchantment {
private final net.minecraft.world.item.enchantment.Enchantment target;
public CraftEnchantment(net.minecraft.world.item.enchantment.Enchantment target) {
super(CraftNamespacedKey.fromMinecraft(BuiltInRegistries.ENCHANTMENT.getKey(target)));
this.target = target;
public static Enchantment minecraftToBukkit(net.minecraft.world.item.enchantment.Enchantment minecraft) {
Preconditions.checkArgument(minecraft != null);
IRegistry<net.minecraft.world.item.enchantment.Enchantment> registry = CraftRegistry.getMinecraftRegistry(Registries.ENCHANTMENT);
Enchantment bukkit = Registry.ENCHANTMENT.get(CraftNamespacedKey.fromMinecraft(registry.getResourceKey(minecraft).orElseThrow().location()));
Preconditions.checkArgument(bukkit != null);
return bukkit;
}
public static net.minecraft.world.item.enchantment.Enchantment bukkitToMinecraft(Enchantment bukkit) {
Preconditions.checkArgument(bukkit != null);
return ((CraftEnchantment) bukkit).getHandle();
}
private final NamespacedKey key;
private final net.minecraft.world.item.enchantment.Enchantment handle;
private final int id;
public CraftEnchantment(NamespacedKey key, net.minecraft.world.item.enchantment.Enchantment handle) {
this.key = key;
this.handle = handle;
this.id = BuiltInRegistries.ENCHANTMENT.getId(handle);
}
public net.minecraft.world.item.enchantment.Enchantment getHandle() {
return handle;
}
@Override
public NamespacedKey getKey() {
return key;
}
@Override
public int getMaxLevel() {
return target.getMaxLevel();
return handle.getMaxLevel();
}
@Override
public int getStartLevel() {
return target.getMinLevel();
return handle.getMinLevel();
}
@Override
public EnchantmentTarget getItemTarget() {
switch (target.category) {
case ARMOR:
return EnchantmentTarget.ARMOR;
case ARMOR_FEET:
return EnchantmentTarget.ARMOR_FEET;
case ARMOR_HEAD:
return EnchantmentTarget.ARMOR_HEAD;
case ARMOR_LEGS:
return EnchantmentTarget.ARMOR_LEGS;
case ARMOR_CHEST:
return EnchantmentTarget.ARMOR_TORSO;
case DIGGER:
return EnchantmentTarget.TOOL;
case WEAPON:
return EnchantmentTarget.WEAPON;
case BOW:
return EnchantmentTarget.BOW;
case FISHING_ROD:
return EnchantmentTarget.FISHING_ROD;
case BREAKABLE:
return EnchantmentTarget.BREAKABLE;
case WEARABLE:
return EnchantmentTarget.WEARABLE;
case TRIDENT:
return EnchantmentTarget.TRIDENT;
case CROSSBOW:
return EnchantmentTarget.CROSSBOW;
case VANISHABLE:
return EnchantmentTarget.VANISHABLE;
default:
return null;
}
return switch (handle.category) {
case ARMOR -> EnchantmentTarget.ARMOR;
case ARMOR_FEET -> EnchantmentTarget.ARMOR_FEET;
case ARMOR_HEAD -> EnchantmentTarget.ARMOR_HEAD;
case ARMOR_LEGS -> EnchantmentTarget.ARMOR_LEGS;
case ARMOR_CHEST -> EnchantmentTarget.ARMOR_TORSO;
case DIGGER -> EnchantmentTarget.TOOL;
case WEAPON -> EnchantmentTarget.WEAPON;
case BOW -> EnchantmentTarget.BOW;
case FISHING_ROD -> EnchantmentTarget.FISHING_ROD;
case BREAKABLE -> EnchantmentTarget.BREAKABLE;
case WEARABLE -> EnchantmentTarget.WEARABLE;
case TRIDENT -> EnchantmentTarget.TRIDENT;
case CROSSBOW -> EnchantmentTarget.CROSSBOW;
case VANISHABLE -> EnchantmentTarget.VANISHABLE;
};
}
@Override
public boolean isTreasure() {
return target.isTreasureOnly();
return handle.isTreasureOnly();
}
@Override
public boolean isCursed() {
return target instanceof EnchantmentBinding || target instanceof EnchantmentVanishing;
return handle instanceof EnchantmentBinding || handle instanceof EnchantmentVanishing;
}
@Override
public boolean canEnchantItem(ItemStack item) {
return target.canEnchant(CraftItemStack.asNMSCopy(item));
return handle.canEnchant(CraftItemStack.asNMSCopy(item));
}
@Override
public String getName() {
// PAIL: migration paths
switch (BuiltInRegistries.ENCHANTMENT.getId(target)) {
case 0:
return "PROTECTION_ENVIRONMENTAL";
case 1:
return "PROTECTION_FIRE";
case 2:
return "PROTECTION_FALL";
case 3:
return "PROTECTION_EXPLOSIONS";
case 4:
return "PROTECTION_PROJECTILE";
case 5:
return "OXYGEN";
case 6:
return "WATER_WORKER";
case 7:
return "THORNS";
case 8:
return "DEPTH_STRIDER";
case 9:
return "FROST_WALKER";
case 10:
return "BINDING_CURSE";
case 11:
return "SOUL_SPEED";
case 12:
return "SWIFT_SNEAK";
case 13:
return "DAMAGE_ALL";
case 14:
return "DAMAGE_UNDEAD";
case 15:
return "DAMAGE_ARTHROPODS";
case 16:
return "KNOCKBACK";
case 17:
return "FIRE_ASPECT";
case 18:
return "LOOT_BONUS_MOBS";
case 19:
return "SWEEPING_EDGE";
case 20:
return "DIG_SPEED";
case 21:
return "SILK_TOUCH";
case 22:
return "DURABILITY";
case 23:
return "LOOT_BONUS_BLOCKS";
case 24:
return "ARROW_DAMAGE";
case 25:
return "ARROW_KNOCKBACK";
case 26:
return "ARROW_FIRE";
case 27:
return "ARROW_INFINITE";
case 28:
return "LUCK";
case 29:
return "LURE";
case 30:
return "LOYALTY";
case 31:
return "IMPALING";
case 32:
return "RIPTIDE";
case 33:
return "CHANNELING";
case 34:
return "MULTISHOT";
case 35:
return "QUICK_CHARGE";
case 36:
return "PIERCING";
case 37:
return "MENDING";
case 38:
return "VANISHING_CURSE";
default:
return "UNKNOWN_ENCHANT_" + BuiltInRegistries.ENCHANTMENT.getId(target);
}
}
public static net.minecraft.world.item.enchantment.Enchantment getRaw(Enchantment enchantment) {
if (enchantment instanceof EnchantmentWrapper) {
enchantment = ((EnchantmentWrapper) enchantment).getEnchantment();
}
if (enchantment instanceof CraftEnchantment) {
return ((CraftEnchantment) enchantment).target;
}
return null;
return switch (id) {
case 0 -> "PROTECTION_ENVIRONMENTAL";
case 1 -> "PROTECTION_FIRE";
case 2 -> "PROTECTION_FALL";
case 3 -> "PROTECTION_EXPLOSIONS";
case 4 -> "PROTECTION_PROJECTILE";
case 5 -> "OXYGEN";
case 6 -> "WATER_WORKER";
case 7 -> "THORNS";
case 8 -> "DEPTH_STRIDER";
case 9 -> "FROST_WALKER";
case 10 -> "BINDING_CURSE";
case 11 -> "SOUL_SPEED";
case 12 -> "SWIFT_SNEAK";
case 13 -> "DAMAGE_ALL";
case 14 -> "DAMAGE_UNDEAD";
case 15 -> "DAMAGE_ARTHROPODS";
case 16 -> "KNOCKBACK";
case 17 -> "FIRE_ASPECT";
case 18 -> "LOOT_BONUS_MOBS";
case 19 -> "SWEEPING_EDGE";
case 20 -> "DIG_SPEED";
case 21 -> "SILK_TOUCH";
case 22 -> "DURABILITY";
case 23 -> "LOOT_BONUS_BLOCKS";
case 24 -> "ARROW_DAMAGE";
case 25 -> "ARROW_KNOCKBACK";
case 26 -> "ARROW_FIRE";
case 27 -> "ARROW_INFINITE";
case 28 -> "LUCK";
case 29 -> "LURE";
case 30 -> "LOYALTY";
case 31 -> "IMPALING";
case 32 -> "RIPTIDE";
case 33 -> "CHANNELING";
case 34 -> "MULTISHOT";
case 35 -> "QUICK_CHARGE";
case 36 -> "PIERCING";
case 37 -> "MENDING";
case 38 -> "VANISHING_CURSE";
default -> getKey().toString();
};
}
@Override
@@ -188,10 +155,29 @@ public class CraftEnchantment extends Enchantment {
return false;
}
CraftEnchantment ench = (CraftEnchantment) other;
return !target.isCompatibleWith(ench.target);
return !handle.isCompatibleWith(ench.getHandle());
}
public net.minecraft.world.item.enchantment.Enchantment getHandle() {
return target;
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof CraftEnchantment)) {
return false;
}
return getKey().equals(((Enchantment) other).getKey());
}
@Override
public int hashCode() {
return getKey().hashCode();
}
@Override
public String toString() {
return "CraftEnchantment[" + getKey() + "]";
}
}