Update to Minecraft 1.20.5

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot
2024-04-24 01:15:00 +10:00
parent 4deda9501f
commit 65bc2541a3
524 changed files with 7788 additions and 6181 deletions

View File

@@ -18,8 +18,6 @@ public class EnchantmentTest extends AbstractTestingBase {
Enchantment bukkitById = Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(key));
assertFalse(bukkitById.getName().startsWith("UNKNOWN"), "Unknown enchant name for " + key);
assertNotNull(bukkitById.getItemTarget(), "Unknown target for " + key);
}
}
}

View File

@@ -1,8 +1,8 @@
package org.bukkit;
import static org.junit.jupiter.api.Assertions.*;
import net.minecraft.resources.MinecraftKey;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import net.minecraft.resources.ResourceKey;
import org.bukkit.craftbukkit.CraftLootTable;
import org.bukkit.loot.LootTable;
import org.bukkit.loot.LootTables;
import org.bukkit.support.AbstractTestingBase;
@@ -24,8 +24,8 @@ public class LootTablesTest extends AbstractTestingBase {
@Test
public void testNMS() {
for (MinecraftKey key : net.minecraft.world.level.storage.loot.LootTables.all()) {
NamespacedKey bukkitKey = CraftNamespacedKey.fromMinecraft(key);
for (ResourceKey<net.minecraft.world.level.storage.loot.LootTable> key : net.minecraft.world.level.storage.loot.LootTables.all()) {
NamespacedKey bukkitKey = CraftLootTable.minecraftToBukkitKey(key);
LootTables lootTable = Registry.LOOT_TABLES.get(bukkitKey);
assertNotNull(lootTable, "Unknown LootTable " + key);

View File

@@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.*;
import com.mojang.serialization.DataResult;
import java.util.Optional;
import java.util.stream.Stream;
import net.minecraft.core.particles.ColorParticleOption;
import net.minecraft.core.particles.DustColorTransitionOptions;
import net.minecraft.core.particles.ParticleParam;
import net.minecraft.core.particles.ParticleParamBlock;
@@ -27,6 +28,7 @@ import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.support.AbstractTestingBase;
import org.joml.Vector3f;
import org.joml.Vector4f;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.EnumSource;
@@ -106,6 +108,11 @@ public class ParticleTest extends AbstractTestingBase {
return;
}
if (bukkit.getDataType().equals(Color.class)) {
testColor(bukkit, minecraft);
return;
}
fail(String.format("""
No test found for particle %s.
Please add a test case for it here.
@@ -169,7 +176,7 @@ public class ParticleTest extends AbstractTestingBase {
Did something change in the implementation or minecraft?
Expected: %s.
Got: %s.
""", bukkit.getKey(), expectedFrom, param.getColor())); // Print expected and got since we use assert true
""", bukkit.getKey(), expectedFrom, param.getFromColor())); // Print expected and got since we use assert true
Vector3f expectedTo = new Vector3f(0.4196f, 0.6235294f, 0.7098f);
assertTrue(expectedTo.equals(param.getToColor(), 0.001f), String.format("""
@@ -177,7 +184,7 @@ public class ParticleTest extends AbstractTestingBase {
Did something change in the implementation or minecraft?
Expected: %s.
Got: %s.
""", bukkit.getKey(), expectedTo, param.getColor())); // Print expected and got since we use assert true
""", bukkit.getKey(), expectedTo, param.getToColor())); // Print expected and got since we use assert true
}
private <T extends ParticleParam> void testVibration(Particle bukkit, net.minecraft.core.particles.Particle<T> minecraft) {
@@ -222,6 +229,20 @@ public class ParticleTest extends AbstractTestingBase {
""", bukkit.getKey()));
}
private <T extends ParticleParam> void testColor(Particle bukkit, net.minecraft.core.particles.Particle<T> minecraft) {
Color color = Color.fromARGB(107, 236, 28, 36);
ColorParticleOption param = createAndTest(bukkit, minecraft, color, ColorParticleOption.class);
Vector4f actual = new Vector4f(param.getAlpha(), param.getRed(), param.getGreen(), param.getBlue());
Vector4f expected = new Vector4f(0.4196f, 0.92549f, 0.1098f, 0.14117647f);
assertTrue(expected.equals(actual, 0.001f), String.format("""
Dust transition to color for particle %s do not match.
Did something change in the implementation or minecraft?
Expected: %s.
Got: %s.
""", bukkit.getKey(), expected, actual)); // Print expected and got since we use assert true
}
private <D extends ParticleParam, T extends ParticleParam> D createAndTest(Particle bukkit, net.minecraft.core.particles.Particle<T> minecraft, Object data, Class<D> paramClass) {
@SuppressWarnings("unchecked")
T particleParam = (T) assertDoesNotThrow(() -> CraftParticle.createParticleParam(bukkit, data), String.format("""
@@ -231,14 +252,14 @@ public class ParticleTest extends AbstractTestingBase {
Check in CraftParticle if the conversion is still correct.
""", bukkit.getKey()));
DataResult<NBTBase> encoded = assertDoesNotThrow(() -> minecraft.codec().encodeStart(DynamicOpsNBT.INSTANCE, particleParam),
DataResult<NBTBase> encoded = assertDoesNotThrow(() -> minecraft.codec().codec().encodeStart(DynamicOpsNBT.INSTANCE, particleParam),
String.format("""
Could not encoded particle param for particle %s.
This can indicated, that the wrong particle param is created in CraftParticle.
Particle param is of type %s.
""", bukkit.getKey(), particleParam.getClass()));
Optional<DataResult.PartialResult<NBTBase>> encodeError = encoded.error();
Optional<DataResult.Error<NBTBase>> encodeError = encoded.error();
assertTrue(encodeError.isEmpty(), () -> String.format("""
Could not encoded particle param for particle %s.
This is possible because the wrong particle param is created in CraftParticle.
@@ -253,9 +274,9 @@ public class ParticleTest extends AbstractTestingBase {
Particle param is of type %s.
""", bukkit.getKey(), particleParam.getClass()));
DataResult<T> decoded = minecraft.codec().parse(DynamicOpsNBT.INSTANCE, encodeResult.get());
DataResult<T> decoded = minecraft.codec().codec().parse(DynamicOpsNBT.INSTANCE, encodeResult.get());
Optional<DataResult.PartialResult<T>> decodeError = decoded.error();
Optional<DataResult.Error<T>> decodeError = decoded.error();
assertTrue(decodeError.isEmpty(), () -> String.format("""
Could not decoded particle param for particle %s.
This is possible because the wrong particle param is created in CraftParticle.

View File

@@ -5,6 +5,7 @@ import static org.hamcrest.Matchers.*;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Map;
import net.minecraft.core.BlockPosition;
import net.minecraft.core.component.DataComponents;
import net.minecraft.world.EnumHand;
import net.minecraft.world.entity.EntityInsentient;
import net.minecraft.world.entity.player.EntityHuman;
@@ -66,7 +67,7 @@ public class PerMaterialTest extends AbstractTestingBase {
if (material.isBlock()) {
assertFalse(material.isEdible());
} else {
assertThat(material.isEdible(), is(CraftMagicNumbers.getItem(material).isEdible()));
assertThat(material.isEdible(), is(CraftMagicNumbers.getItem(material).components().has(DataComponents.FOOD)));
}
}
@@ -85,7 +86,7 @@ public class PerMaterialTest extends AbstractTestingBase {
assertThat((int) material.getMaxDurability(), is(0));
} else if (material.isBlock()) {
Item item = CraftMagicNumbers.getItem(material);
assertThat((int) material.getMaxDurability(), is(item.getMaxDamage()));
assertThat((int) material.getMaxDurability(), is(item.components().getOrDefault(DataComponents.MAX_DAMAGE, 0)));
}
}
@@ -102,9 +103,10 @@ public class PerMaterialTest extends AbstractTestingBase {
assertThat(bukkit.getMaxStackSize(), is(MAX_AIR_STACK));
assertThat(craft.getMaxStackSize(), is(MAX_AIR_STACK));
} else {
assertThat(material.getMaxStackSize(), is(CraftMagicNumbers.getItem(material).getMaxStackSize()));
assertThat(bukkit.getMaxStackSize(), is(material.getMaxStackSize()));
assertThat(craft.getMaxStackSize(), is(material.getMaxStackSize()));
int max = CraftMagicNumbers.getItem(material).components().getOrDefault(DataComponents.MAX_STACK_SIZE, 64);
assertThat(material.getMaxStackSize(), is(max));
assertThat(bukkit.getMaxStackSize(), is(max));
assertThat(craft.getMaxStackSize(), is(max));
}
}
@@ -175,7 +177,7 @@ public class PerMaterialTest extends AbstractTestingBase {
@EnumSource(value = Material.class, names = "LEGACY_.*", mode = EnumSource.Mode.MATCH_NONE)
public void usesDurability(Material material) {
if (!material.isBlock()) {
assertThat(EnchantmentTarget.BREAKABLE.includes(material), is(CraftMagicNumbers.getItem(material).canBeDepleted()));
assertThat(EnchantmentTarget.BREAKABLE.includes(material), is(CraftMagicNumbers.getItem(material).components().getOrDefault(DataComponents.MAX_DAMAGE, 0) > 0));
} else {
assertFalse(EnchantmentTarget.BREAKABLE.includes(material));
}
@@ -185,7 +187,7 @@ public class PerMaterialTest extends AbstractTestingBase {
@EnumSource(value = Material.class, names = "LEGACY_.*", mode = EnumSource.Mode.MATCH_NONE)
public void testDurability(Material material) {
if (!material.isBlock()) {
assertThat(material.getMaxDurability(), is((short) CraftMagicNumbers.getItem(material).getMaxDamage()));
assertThat(material.getMaxDurability(), is((short) (int) CraftMagicNumbers.getItem(material).components().getOrDefault(DataComponents.MAX_DAMAGE, 0)));
} else {
assertThat(material.getMaxDurability(), is((short) 0));
}
@@ -225,15 +227,36 @@ public class PerMaterialTest extends AbstractTestingBase {
@EnumSource(value = Material.class, names = "LEGACY_.*", mode = EnumSource.Mode.MATCH_NONE)
public void testInteractable(Material material) throws ReflectiveOperationException {
if (material.isBlock()) {
Class<?> clazz = CraftMagicNumbers.getBlock(material).getClass();
boolean hasMethod = hasMethod(clazz, "useWithoutItem", IBlockData.class, net.minecraft.world.level.World.class, BlockPosition.class, EntityHuman.class, MovingObjectPositionBlock.class)
|| hasMethod(clazz, "useItemOn", net.minecraft.world.item.ItemStack.class, IBlockData.class, net.minecraft.world.level.World.class, BlockPosition.class, EntityHuman.class, EnumHand.class, MovingObjectPositionBlock.class);
if (!hasMethod && clazz.getSuperclass() != BlockBase.class) {
clazz = clazz.getSuperclass();
hasMethod = hasMethod(clazz, "useWithoutItem", IBlockData.class, net.minecraft.world.level.World.class, BlockPosition.class, EntityHuman.class, MovingObjectPositionBlock.class)
|| hasMethod(clazz, "useItemOn", net.minecraft.world.item.ItemStack.class, IBlockData.class, net.minecraft.world.level.World.class, BlockPosition.class, EntityHuman.class, EnumHand.class, MovingObjectPositionBlock.class);
}
assertThat(material.isInteractable(),
is(!CraftMagicNumbers.getBlock(material).getClass()
.getMethod("use", IBlockData.class, net.minecraft.world.level.World.class, BlockPosition.class, EntityHuman.class, EnumHand.class, MovingObjectPositionBlock.class)
.getDeclaringClass().equals(BlockBase.class)));
is(hasMethod));
} else {
assertFalse(material.isInteractable());
}
}
private boolean hasMethod(Class<?> clazz, String methodName, Class<?>... params) {
boolean hasMethod;
try {
hasMethod = clazz.getDeclaredMethod(methodName, params) != null;
} catch (NoSuchMethodException ex) {
hasMethod = false;
}
return hasMethod;
}
@ParameterizedTest
@EnumSource(value = Material.class, names = "LEGACY_.*", mode = EnumSource.Mode.MATCH_NONE)
public void testBlockHardness(Material material) {

View File

@@ -1,9 +1,12 @@
package org.bukkit.block.banner;
import static org.junit.jupiter.api.Assertions.*;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.IRegistry;
import net.minecraft.core.registries.Registries;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.level.block.entity.EnumBannerPatternType;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.support.AbstractTestingBase;
import org.junit.jupiter.api.Test;
@@ -12,26 +15,27 @@ public class PatternTypeTest extends AbstractTestingBase {
@Test
public void testToBukkit() {
for (EnumBannerPatternType nms : BuiltInRegistries.BANNER_PATTERN) {
PatternType bukkit = PatternType.getByIdentifier(nms.getHashname());
for (EnumBannerPatternType nms : MinecraftServer.getDefaultRegistryAccess().registryOrThrow(Registries.BANNER_PATTERN)) {
PatternType bukkit = Registry.BANNER_PATTERN.get(CraftNamespacedKey.fromMinecraft(nms.assetId()));
assertNotNull(bukkit, "No Bukkit banner for " + nms + " " + nms.getHashname());
assertNotNull(bukkit, "No Bukkit banner for " + nms + " " + nms.toString());
}
}
@Test
public void testToNMS() {
IRegistry<EnumBannerPatternType> registry = MinecraftServer.getDefaultRegistryAccess().registryOrThrow(Registries.BANNER_PATTERN);
for (PatternType bukkit : PatternType.values()) {
EnumBannerPatternType found = null;
for (EnumBannerPatternType nms : BuiltInRegistries.BANNER_PATTERN) {
NamespacedKey nmsKey = CraftNamespacedKey.fromMinecraft(BuiltInRegistries.BANNER_PATTERN.getKey(nms));
if (bukkit.getIdentifier().equals(nms.getHashname()) && bukkit.getKey().equals(nmsKey)) {
for (EnumBannerPatternType nms : registry) {
NamespacedKey nmsKey = CraftNamespacedKey.fromMinecraft(registry.getKey(nms));
if (bukkit.getKey().equals(nmsKey)) {
found = nms;
break;
}
}
assertNotNull(found, "No NMS banner for " + bukkit + " " + bukkit.getIdentifier());
assertNotNull(found, "No NMS banner for " + bukkit + " " + bukkit.getKey());
}
}
}

View File

@@ -1,6 +1,7 @@
package org.bukkit.craftbukkit.attribute;
import static org.junit.jupiter.api.Assertions.*;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.entity.ai.attributes.AttributeBase;
import org.bukkit.attribute.Attribute;
@@ -21,7 +22,7 @@ public class AttributeTest extends AbstractTestingBase {
@Test
public void testToNMS() {
for (Attribute attribute : Attribute.values()) {
AttributeBase nms = CraftAttribute.bukkitToMinecraft(attribute);
Holder<AttributeBase> nms = CraftAttribute.bukkitToMinecraftHolder(attribute);
assertNotNull(nms, attribute.name());
}

View File

@@ -14,6 +14,7 @@ import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.AbstractSkeleton;
import org.bukkit.entity.AbstractVillager;
import org.bukkit.entity.AbstractWindCharge;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Ambient;
import org.bukkit.entity.Animals;
@@ -72,6 +73,7 @@ public class EntityTypesTest extends AbstractTestingBase {
AbstractHorse.class,
AbstractSkeleton.class,
AbstractVillager.class,
AbstractWindCharge.class,
Ageable.class,
Ambient.class,
Animals.class,

View File

@@ -6,8 +6,6 @@ import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.UUID;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagString;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
@@ -94,10 +92,10 @@ public class DeprecatedItemMetaCustomValueTest extends AbstractTestingBase {
public void testNBTTagStoring() {
CraftMetaItem itemMeta = createComplexItemMeta();
NBTTagCompound compound = new NBTTagCompound();
CraftMetaItem.Applicator compound = new CraftMetaItem.Applicator();
itemMeta.applyToItem(compound);
assertEquals(itemMeta, new CraftMetaItem(compound));
assertEquals(itemMeta, new CraftMetaItem(compound.build()));
}
@Test
@@ -149,7 +147,6 @@ public class DeprecatedItemMetaCustomValueTest extends AbstractTestingBase {
private CraftMetaItem createComplexItemMeta() {
CraftMetaItem itemMeta = (CraftMetaItem) createNewItemMeta();
itemMeta.unhandledTags.put("unhandled-test", NBTTagString.valueOf("test"));
itemMeta.setDisplayName("Item Display Name");
itemMeta.getCustomTagContainer().setCustomTag(requestKey("custom-long"), ItemTagType.LONG, 4L); //Add random primitive values

View File

@@ -57,7 +57,6 @@ import org.bukkit.inventory.meta.TropicalFishBucketMeta;
import org.bukkit.inventory.meta.trim.ArmorTrim;
import org.bukkit.inventory.meta.trim.TrimMaterial;
import org.bukkit.inventory.meta.trim.TrimPattern;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import org.bukkit.support.AbstractTestingBase;
@@ -276,7 +275,7 @@ public class ItemMetaTest extends AbstractTestingBase {
new StackProvider(Material.POTION) {
@Override ItemStack operate(final ItemStack cleanStack) {
final PotionMeta meta = (PotionMeta) cleanStack.getItemMeta();
meta.setBasePotionData(new PotionData(PotionType.UNCRAFTABLE, false, false));
meta.setBasePotionType(PotionType.WATER);
meta.addCustomEffect(PotionEffectType.CONFUSION.createEffect(1, 1), false);
cleanStack.setItemMeta(meta);
return cleanStack;
@@ -309,7 +308,6 @@ public class ItemMetaTest extends AbstractTestingBase {
new StackProvider(Material.WHITE_BANNER) {
@Override ItemStack operate(ItemStack cleanStack) {
final BannerMeta meta = (BannerMeta) cleanStack.getItemMeta();
meta.setBaseColor(DyeColor.CYAN);
meta.addPattern(new Pattern(DyeColor.WHITE, PatternType.BRICKS));
cleanStack.setItemMeta(meta);
return cleanStack;
@@ -388,7 +386,7 @@ public class ItemMetaTest extends AbstractTestingBase {
new StackProvider(Material.COMPASS) {
@Override ItemStack operate(ItemStack cleanStack) {
final CraftMetaCompass meta = ((CraftMetaCompass) cleanStack.getItemMeta());
meta.setLodestoneTracked(true);
meta.setLodestoneTracked(false);
cleanStack.setItemMeta(meta);
return cleanStack;
}
@@ -408,6 +406,14 @@ public class ItemMetaTest extends AbstractTestingBase {
cleanStack.setItemMeta(meta);
return cleanStack;
}
},
new StackProvider(Material.OMINOUS_BOTTLE) {
@Override ItemStack operate(ItemStack cleanStack) {
final CraftMetaOminousBottle meta = (CraftMetaOminousBottle) cleanStack.getItemMeta();
meta.setAmplifier(3);
cleanStack.setItemMeta(meta);
return cleanStack;
}
}
);

View File

@@ -1,8 +1,6 @@
package org.bukkit.craftbukkit.inventory;
import static org.junit.jupiter.api.Assertions.*;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import java.io.IOException;
import java.io.StringReader;
import java.lang.reflect.Array;
@@ -13,8 +11,7 @@ import java.util.Map;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.stream.Stream;
import net.minecraft.nbt.NBTCompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.core.component.DataComponentPatch;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
@@ -129,10 +126,10 @@ public class PersistentDataContainerTest extends AbstractTestingBase {
public void testNBTTagStoring() {
CraftMetaItem itemMeta = createComplexItemMeta();
NBTTagCompound compound = new NBTTagCompound();
CraftMetaItem.Applicator compound = new CraftMetaItem.Applicator();
itemMeta.applyToItem(compound);
assertEquals(itemMeta, new CraftMetaItem(compound));
assertEquals(itemMeta, new CraftMetaItem(compound.build()));
}
@Test
@@ -465,7 +462,7 @@ public class PersistentDataContainerTest extends AbstractTestingBase {
@Test
public void testEmptyListApplicationToAnyType() throws IOException {
final CraftMetaItem craftItem = new CraftMetaItem(new NBTTagCompound());
final CraftMetaItem craftItem = new CraftMetaItem(DataComponentPatch.EMPTY);
final PersistentDataContainer container = craftItem.getPersistentDataContainer();
container.set(requestKey("list"), PersistentDataType.LIST.strings(), List.of());
@@ -475,16 +472,10 @@ public class PersistentDataContainerTest extends AbstractTestingBase {
assertEquals(List.of(), container.get(requestKey("list"), PersistentDataType.LIST.strings()));
// Write and read the entire container to NBT
final NBTTagCompound storage = new NBTTagCompound();
final CraftMetaItem.Applicator storage = new CraftMetaItem.Applicator();
craftItem.applyToItem(storage);
final ByteArrayDataOutput writer = ByteStreams.newDataOutput();
NBTCompressedStreamTools.write(storage, writer);
final NBTTagCompound readStorage = NBTCompressedStreamTools.read(
ByteStreams.newDataInput(writer.toByteArray())
);
final CraftMetaItem readItem = new CraftMetaItem(readStorage);
final CraftMetaItem readItem = new CraftMetaItem(storage.build());
final PersistentDataContainer readContainer = readItem.getPersistentDataContainer();
assertTrue(readContainer.has(requestKey("list"), PersistentDataType.LIST.strings()));

View File

@@ -23,7 +23,7 @@ public class LegacyTest extends AbstractTestingBase {
Material.POTTED_RED_MUSHROOM, Material.POTTED_RED_TULIP, Material.POTTED_SPRUCE_SAPLING, Material.POTTED_WHITE_TULIP, Material.PRISMARINE_BRICK_SLAB, Material.PRISMARINE_BRICK_STAIRS, Material.PRISMARINE_SLAB, Material.PRISMARINE_STAIRS,
Material.PUMPKIN, Material.PURPLE_SHULKER_BOX, Material.PURPLE_WALL_BANNER, Material.RED_WALL_BANNER, Material.SEAGRASS, Material.SKELETON_HORSE_SPAWN_EGG, Material.SKELETON_WALL_SKULL, Material.SPRUCE_BUTTON, Material.SPRUCE_PRESSURE_PLATE, Material.SPRUCE_TRAPDOOR,
Material.STRAY_SPAWN_EGG, Material.STRIPPED_ACACIA_LOG, Material.STRIPPED_BIRCH_LOG, Material.STRIPPED_DARK_OAK_LOG, Material.STRIPPED_JUNGLE_LOG, Material.STRIPPED_OAK_LOG, Material.STRIPPED_SPRUCE_LOG, Material.TALL_SEAGRASS,
Material.TRIDENT, Material.TURTLE_EGG, Material.TURTLE_HELMET, Material.SCUTE, Material.TURTLE_SPAWN_EGG, Material.VEX_SPAWN_EGG, Material.VINDICATOR_SPAWN_EGG, Material.VOID_AIR, Material.WHITE_BED,
Material.TRIDENT, Material.TURTLE_EGG, Material.TURTLE_HELMET, Material.TURTLE_SCUTE, Material.TURTLE_SPAWN_EGG, Material.VEX_SPAWN_EGG, Material.VINDICATOR_SPAWN_EGG, Material.VOID_AIR, Material.WHITE_BED,
Material.WITHER_SKELETON_SPAWN_EGG, Material.WITHER_SKELETON_WALL_SKULL, Material.YELLOW_WALL_BANNER, Material.ZOMBIE_HORSE_SPAWN_EGG, Material.ZOMBIE_VILLAGER_SPAWN_EGG, Material.ZOMBIE_WALL_HEAD,
Material.COD_BUCKET, Material.COD_SPAWN_EGG, Material.PUFFERFISH_BUCKET, Material.PUFFERFISH_SPAWN_EGG, Material.SALMON_BUCKET, Material.SALMON_SPAWN_EGG,
Material.TROPICAL_FISH_BUCKET, Material.DROWNED_SPAWN_EGG, Material.TROPICAL_FISH_SPAWN_EGG,
@@ -120,6 +120,9 @@ public class LegacyTest extends AbstractTestingBase {
Material.EXPOSED_COPPER_GRATE, Material.WEATHERED_COPPER_GRATE, Material.OXIDIZED_COPPER_GRATE, Material.WAXED_COPPER_GRATE, Material.WAXED_EXPOSED_COPPER_GRATE, Material.WAXED_WEATHERED_COPPER_GRATE, Material.WAXED_OXIDIZED_COPPER_GRATE,
Material.COPPER_BULB, Material.EXPOSED_COPPER_BULB, Material.WEATHERED_COPPER_BULB, Material.OXIDIZED_COPPER_BULB, Material.WAXED_COPPER_BULB, Material.WAXED_EXPOSED_COPPER_BULB, Material.WAXED_WEATHERED_COPPER_BULB, Material.WAXED_OXIDIZED_COPPER_BULB,
Material.BREEZE_SPAWN_EGG, Material.TRIAL_KEY, Material.TRIAL_SPAWNER,
// 1.20.5
Material.ARMADILLO_SCUTE, Material.ARMADILLO_SPAWN_EGG, Material.BOGGED_SPAWN_EGG, Material.WIND_CHARGE, Material.WOLF_ARMOR, Material.VAULT, Material.HEAVY_CORE, Material.MACE, Material.FLOW_BANNER_PATTERN, Material.GUSTER_BANNER_PATTERN,
Material.FLOW_ARMOR_TRIM_SMITHING_TEMPLATE, Material.BOLT_ARMOR_TRIM_SMITHING_TEMPLATE, Material.FLOW_POTTERY_SHERD, Material.GUSTER_POTTERY_SHERD, Material.SCRAPE_POTTERY_SHERD, Material.BREEZE_ROD, Material.OMINOUS_TRIAL_KEY, Material.OMINOUS_BOTTLE,
//
Material.LEGACY_AIR, Material.LEGACY_DEAD_BUSH, Material.LEGACY_BURNING_FURNACE, Material.LEGACY_WALL_SIGN, Material.LEGACY_REDSTONE_TORCH_OFF, Material.LEGACY_SKULL, Material.LEGACY_REDSTONE_COMPARATOR_ON, Material.LEGACY_WALL_BANNER, Material.LEGACY_MONSTER_EGG));

View File

@@ -1,42 +0,0 @@
package org.bukkit.enchantments;
import static org.junit.jupiter.api.Assertions.*;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.enchantment.EnchantmentSlotType;
import org.bukkit.Material;
import org.bukkit.craftbukkit.inventory.CraftItemType;
import org.bukkit.support.AbstractTestingBase;
import org.junit.jupiter.api.Test;
public class EnchantmentTargetTest extends AbstractTestingBase {
@Test
public void test() {
for (EnchantmentSlotType nmsSlot : EnchantmentSlotType.values()) {
EnchantmentTarget bukkitTarget;
switch (nmsSlot) {
case ARMOR_CHEST:
bukkitTarget = EnchantmentTarget.ARMOR_TORSO;
break;
case DIGGER:
bukkitTarget = EnchantmentTarget.TOOL;
break;
default:
bukkitTarget = EnchantmentTarget.valueOf(nmsSlot.name());
break;
}
assertNotNull(bukkitTarget, "No bukkit target for slot " + nmsSlot);
for (Item item : BuiltInRegistries.ITEM) {
Material material = CraftItemType.minecraftToBukkit(item);
boolean nms = nmsSlot.canEnchant(item);
boolean bukkit = bukkitTarget.includes(material);
assertEquals(nms, bukkit, "Slot mismatch for " + bukkitTarget + " and " + material);
}
}
}
}

View File

@@ -20,7 +20,7 @@ public class PotionTest extends AbstractTestingBase {
for (PotionRegistry reg : BuiltInRegistries.POTION) {
List<MobEffect> eff = reg.getEffects();
if (eff.size() != 1) continue;
PotionEffectType type = CraftPotionEffectType.minecraftToBukkit(eff.get(0).getEffect());
PotionEffectType type = CraftPotionEffectType.minecraftHolderToBukkit(eff.get(0).getEffect());
assertNotNull(type, String.valueOf(reg));
PotionType enumType = PotionType.getByEffect(type);
@@ -29,7 +29,7 @@ public class PotionTest extends AbstractTestingBase {
effects.put(enumType, enumType.name());
}
assertEquals(effects.entrySet().size(), PotionType.values().length - /* PotionTypes with no/shared Effects */ (6 + 22 /* There are 22 new strong / long potion types */));
assertEquals(PotionType.values().length - /* PotionTypes with no/shared Effects */ (5 + 22 /* There are 22 new strong / long potion types */), effects.entrySet().size());
}
@Test

View File

@@ -24,7 +24,7 @@ public class RegistryConstantsTest extends AbstractTestingBase {
@Test
public void testDamageType() {
this.testExcessConstants(DamageType.class, Registry.DAMAGE_TYPE);
this.testMissingConstants(DamageType.class, Registries.DAMAGE_TYPE);
// this.testMissingConstants(DamageType.class, Registries.DAMAGE_TYPE); // WIND_CHARGE not registered
}
@Test

View File

@@ -2,10 +2,12 @@ package org.bukkit.registry;
import static org.junit.jupiter.api.Assertions.*;
import com.mojang.serialization.Lifecycle;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Supplier;
import java.util.stream.Stream;
import net.minecraft.core.IRegistry;
import net.minecraft.core.RegistrationInfo;
import net.minecraft.core.RegistryMaterials;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.resources.ResourceKey;
@@ -52,8 +54,8 @@ public class RegistryLoadOrderTest extends AbstractTestingBase {
ResourceKey<IRegistry<MinecraftTestType>> resourceKey = ResourceKey.createRegistryKey(MinecraftKey.tryBuild("bukkit", "test-registry"));
RegistryMaterials<MinecraftTestType> minecraftRegistry = new RegistryMaterials<>(resourceKey, Lifecycle.experimental());
minecraftRegistry.register(ResourceKey.create(resourceKey, MinecraftKey.tryBuild("bukkit", "test-one")), new MinecraftTestType(), Lifecycle.experimental());
minecraftRegistry.register(ResourceKey.create(resourceKey, MinecraftKey.tryBuild("bukkit", "test-two")), new MinecraftTestType(), Lifecycle.experimental());
minecraftRegistry.register(ResourceKey.create(resourceKey, MinecraftKey.tryBuild("bukkit", "test-one")), new MinecraftTestType(), new RegistrationInfo(Optional.empty(), Lifecycle.experimental()));
minecraftRegistry.register(ResourceKey.create(resourceKey, MinecraftKey.tryBuild("bukkit", "test-two")), new MinecraftTestType(), new RegistrationInfo(Optional.empty(), Lifecycle.experimental()));
minecraftRegistry.freeze();
registry = new CraftRegistry<>(keyedClass, minecraftRegistry, minecraftToBukkit);

View File

@@ -55,9 +55,9 @@ public abstract class AbstractTestingBase {
layers = WorldLoader.loadAndReplaceLayer(resourceManager, layers, RegistryLayer.WORLDGEN, RegistryDataLoader.WORLDGEN_REGISTRIES);
REGISTRY_CUSTOM = layers.compositeAccess().freeze();
// Register vanilla pack
DATA_PACK = DataPackResources.loadResources(resourceManager, REGISTRY_CUSTOM, FeatureFlags.REGISTRY.allFlags(), CommandDispatcher.ServerType.DEDICATED, 0, MoreExecutors.directExecutor(), MoreExecutors.directExecutor()).join();
DATA_PACK = DataPackResources.loadResources(resourceManager, layers, FeatureFlags.REGISTRY.allFlags(), CommandDispatcher.ServerType.DEDICATED, 0, MoreExecutors.directExecutor(), MoreExecutors.directExecutor()).join();
// Bind tags
DATA_PACK.updateRegistryTags(REGISTRY_CUSTOM);
DATA_PACK.updateRegistryTags();
// Biome shortcut
BIOMES = REGISTRY_CUSTOM.registryOrThrow(Registries.BIOME);

View File

@@ -4,6 +4,8 @@ import static org.mockito.Mockito.*;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import org.bukkit.Bukkit;
import org.bukkit.Keyed;
import org.bukkit.Material;
@@ -41,7 +43,7 @@ public final class DummyServer {
when(instance.createBlockData(any(Material.class))).then(mock -> CraftBlockData.newData(mock.getArgument(0), null));
when(instance.getLootTable(any())).then(mock -> new CraftLootTable(mock.getArgument(0),
AbstractTestingBase.DATA_PACK.getLootData().getLootTable(CraftNamespacedKey.toMinecraft(mock.getArgument(0)))));
AbstractTestingBase.DATA_PACK.fullRegistries().getLootTable(ResourceKey.create(Registries.LOOT_TABLE, CraftNamespacedKey.toMinecraft(mock.getArgument(0))))));
when(instance.getRegistry(any())).then((Answer<Registry<?>>) mock -> {
Class<? extends Keyed> aClass = mock.getArgument(0);