diff --git a/paper-api/src/main/java/com/destroystokyo/paper/MaterialTags.java b/paper-api/src/main/java/com/destroystokyo/paper/MaterialTags.java index 679f78e07..f9af51c18 100644 --- a/paper-api/src/main/java/com/destroystokyo/paper/MaterialTags.java +++ b/paper-api/src/main/java/com/destroystokyo/paper/MaterialTags.java @@ -568,8 +568,8 @@ public class MaterialTags { Material.FLINT_AND_STEEL, Material.CARROT_ON_A_STICK, Material.WARPED_FUNGUS_ON_A_STICK, Material.BRUSH, Material.CARVED_PUMPKIN, Material.COMPASS, Material.SKELETON_SKULL, Material.WITHER_SKELETON_SKULL, Material.PLAYER_HEAD, Material.ZOMBIE_HEAD, - Material.CREEPER_HEAD, Material.DRAGON_HEAD, Material.PIGLIN_HEAD) - .ensureSize("ENCHANTABLE", 75).lock(); + Material.CREEPER_HEAD, Material.DRAGON_HEAD, Material.PIGLIN_HEAD, Material.MACE) + .ensureSize("ENCHANTABLE", 76).lock(); /** * Covers the variants of raw ores. diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/DataComponentTypes.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/DataComponentTypes.java index 5d0717198..abcfbc610 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/DataComponentTypes.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/DataComponentTypes.java @@ -367,7 +367,7 @@ public final class DataComponentTypes { // TODO: This is a eitherholder? Why specifically the chicken?? Oh wait this is prolly for chicken egg cause legacy item loading public static final DataComponentType.Valued CHICKEN_VARIANT = valued("chicken/variant"); public static final DataComponentType.Valued FROG_VARIANT = valued("frog/variant"); - public static final DataComponentType.Valued HORSE_VARIANT = valued("horse/variant"); + public static final DataComponentType.Valued HORSE_VARIANT = valued("horse/variant"); public static final DataComponentType.Valued PAINTING_VARIANT = valued("painting/variant"); public static final DataComponentType.Valued LLAMA_VARIANT = valued("llama/variant"); public static final DataComponentType.Valued AXOLOTL_VARIANT = valued("axolotl/variant"); diff --git a/paper-api/src/main/java/org/bukkit/Registry.java b/paper-api/src/main/java/org/bukkit/Registry.java index e1dc02621..b64fdfe97 100644 --- a/paper-api/src/main/java/org/bukkit/Registry.java +++ b/paper-api/src/main/java/org/bukkit/Registry.java @@ -525,6 +525,13 @@ public interface Registry extends Iterable { */ Stream stream(); + /** + * Returns a new stream, which contains all registry keys, which are registered to the registry. + * + * @return a stream of all registry keys + */ + Stream keyStream(); + /** * Attempts to match the registered object with the given key. *

@@ -591,6 +598,11 @@ public interface Registry extends Iterable { return this.map.values().iterator(); } + @Override + public Stream keyStream() { + return this.map.keySet().stream(); + } + @ApiStatus.Internal @Deprecated(since = "1.20.6", forRemoval = true) public Class getType() { @@ -606,6 +618,11 @@ public interface Registry extends Iterable { return StreamSupport.stream(this.spliterator(), false); } + @Override + public Stream keyStream() { + return stream().map(this::getKey); + } + @Override public int size() { return Iterables.size(this); diff --git a/paper-api/src/main/java/org/bukkit/block/Block.java b/paper-api/src/main/java/org/bukkit/block/Block.java index d309e28d7..32f5d2631 100644 --- a/paper-api/src/main/java/org/bukkit/block/Block.java +++ b/paper-api/src/main/java/org/bukkit/block/Block.java @@ -817,4 +817,11 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr return this.getBlockData().getDestroySpeed(itemStack, considerEnchants); } // Paper end - destroy speed API + + /** + * Checks if the block can suffocate. + * + * @return {@code true} if the block can suffocate + */ + boolean isSuffocating(); } diff --git a/paper-api/src/main/java/org/bukkit/block/BlockState.java b/paper-api/src/main/java/org/bukkit/block/BlockState.java index 2c430a7fb..ce7cdcf0c 100644 --- a/paper-api/src/main/java/org/bukkit/block/BlockState.java +++ b/paper-api/src/main/java/org/bukkit/block/BlockState.java @@ -5,12 +5,16 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.metadata.Metadatable; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; +import java.util.Collection; /** * Represents a captured state of a block, which will not change @@ -226,14 +230,14 @@ public interface BlockState extends Metadatable { * @deprecated Magic value */ @Deprecated(since = "1.6.2", forRemoval = true) - public byte getRawData(); + byte getRawData(); /** * @param data The new data value for the block. * @deprecated Magic value */ @Deprecated(since = "1.6.2", forRemoval = true) - public void setRawData(byte data); + void setRawData(byte data); /** * Returns whether this state is placed in the world. @@ -246,7 +250,6 @@ public interface BlockState extends Metadatable { */ boolean isPlaced(); - // Paper start /** * Checks if this block state is collidable. * @@ -261,7 +264,7 @@ public interface BlockState extends Metadatable { * @throws IllegalStateException if this block state is not placed */ @NotNull - default java.util.@org.jetbrains.annotations.Unmodifiable Collection getDrops() { + default @Unmodifiable Collection getDrops() { return this.getDrops(null); } @@ -274,7 +277,7 @@ public interface BlockState extends Metadatable { * @throws IllegalStateException if this block state is not placed */ @NotNull - default java.util.@org.jetbrains.annotations.Unmodifiable Collection getDrops(@Nullable org.bukkit.inventory.ItemStack tool) { + default @Unmodifiable Collection getDrops(@Nullable ItemStack tool) { return this.getDrops(tool, null); } @@ -288,6 +291,14 @@ public interface BlockState extends Metadatable { * @throws IllegalStateException if this block state is not placed */ @NotNull - java.util.@org.jetbrains.annotations.Unmodifiable Collection getDrops(@Nullable org.bukkit.inventory.ItemStack tool, @Nullable org.bukkit.entity.Entity entity); - // Paper end + @Unmodifiable + Collection getDrops(@Nullable ItemStack tool, @Nullable Entity entity); + + /** + * Checks if the block state can suffocate. + * + * @return {@code true} if the block state can suffocate + * @throws IllegalStateException if this block state is not placed + */ + boolean isSuffocating(); } diff --git a/paper-api/src/main/java/org/bukkit/block/BlockType.java b/paper-api/src/main/java/org/bukkit/block/BlockType.java index b7aa24cf4..ae42c2ddc 100644 --- a/paper-api/src/main/java/org/bukkit/block/BlockType.java +++ b/paper-api/src/main/java/org/bukkit/block/BlockType.java @@ -121,7 +121,6 @@ import org.bukkit.block.data.type.WallHangingSign; import org.bukkit.block.data.type.WallSign; import org.bukkit.block.data.type.WallSkull; import org.bukkit.inventory.ItemType; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; diff --git a/paper-server/patches/features/0016-Fix-entity-tracker-desync-when-new-players-are-added.patch b/paper-server/patches/features/0016-Fix-entity-tracker-desync-when-new-players-are-added.patch index 9e490b8a7..4a6adb3c0 100644 --- a/paper-server/patches/features/0016-Fix-entity-tracker-desync-when-new-players-are-added.patch +++ b/paper-server/patches/features/0016-Fix-entity-tracker-desync-when-new-players-are-added.patch @@ -60,7 +60,7 @@ index 1463c31ba980ab0eb2174e3e891d1423a505e9dc..886340232b58afd59caa6df29e211589 } else if (this.seenBy.remove(player.connection)) { this.serverEntity.removePairing(player); diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java -index 0005a1784ccaa00e5d6d67e7be98445150487982..257ecbcf7d463eefb951867a5426eaf24e356305 100644 +index a1ae77b70f69852d9e4332bf1cb3409c33b21de0..b118e91f1e0b5a8b8c0b2a4a32faabc5a34a5954 100644 --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java @@ -103,6 +103,13 @@ public class ServerEntity { @@ -77,7 +77,7 @@ index 0005a1784ccaa00e5d6d67e7be98445150487982..257ecbcf7d463eefb951867a5426eaf2 public void sendChanges() { // Paper start - optimise collisions if (((ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity)this.entity).moonrise$isHardColliding()) { -@@ -136,7 +143,7 @@ public class ServerEntity { +@@ -141,7 +148,7 @@ public class ServerEntity { this.sendDirtyEntityData(); } @@ -86,7 +86,7 @@ index 0005a1784ccaa00e5d6d67e7be98445150487982..257ecbcf7d463eefb951867a5426eaf2 byte b = Mth.packDegrees(this.entity.getYRot()); byte b1 = Mth.packDegrees(this.entity.getXRot()); boolean flag = Math.abs(b - this.lastSentYRot) >= 1 || Math.abs(b1 - this.lastSentXRot) >= 1; -@@ -171,7 +178,7 @@ public class ServerEntity { +@@ -176,7 +183,7 @@ public class ServerEntity { long l1 = this.positionCodec.encodeY(vec3); long l2 = this.positionCodec.encodeZ(vec3); boolean flag5 = l < -32768L || l > 32767L || l1 < -32768L || l1 > 32767L || l2 < -32768L || l2 > 32767L; @@ -95,7 +95,7 @@ index 0005a1784ccaa00e5d6d67e7be98445150487982..257ecbcf7d463eefb951867a5426eaf2 this.wasOnGround = this.entity.onGround(); this.teleportDelay = 0; packet = ClientboundEntityPositionSyncPacket.of(this.entity); -@@ -236,6 +243,7 @@ public class ServerEntity { +@@ -241,6 +248,7 @@ public class ServerEntity { } this.entity.hasImpulse = false; diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerEntity.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerEntity.java.patch index 1de63e2c7..2254ee134 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerEntity.java.patch @@ -28,7 +28,15 @@ this.level = level; this.broadcast = broadcast; this.entity = entity; -@@ -106,13 +_,14 @@ +@@ -103,16 +_,22 @@ + if (!passengers.equals(this.lastPassengers)) { + List list = this.mountedOrDismounted(passengers).map(Entity::getUUID).toList(); + this.broadcastWithIgnore.accept(new ClientboundSetPassengersPacket(this.entity), list); ++ // Paper start - Allow riding players ++ if (this.entity instanceof ServerPlayer player) { ++ player.connection.send(new ClientboundSetPassengersPacket(this.entity)); ++ } ++ // Paper end - Allow riding players this.lastPassengers = passengers; } diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index bd3057712..276770750 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -1237,14 +1237,21 @@ } else { Component component1 = Component.translatable("build.tooHigh", maxY).withStyle(ChatFormatting.RED); this.player.sendSystemMessage(component1, true); -@@ -1268,6 +_,7 @@ +@@ -1268,13 +_,7 @@ this.player.connection.send(new ClientboundBlockUpdatePacket(serverLevel, blockPos)); this.player.connection.send(new ClientboundBlockUpdatePacket(serverLevel, blockPos.relative(direction))); +- } else { +- LOGGER.warn( +- "Rejecting UseItemOnPacket from {}: Location {} too far away from hit block {}.", +- this.player.getGameProfile().getName(), +- location, +- blockPos +- ); + if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. - } else { - LOGGER.warn( - "Rejecting UseItemOnPacket from {}: Location {} too far away from hit block {}.", + } + } + } @@ -1284,6 +_,8 @@ @Override public void handleUseItem(ServerboundUseItemPacket packet) { diff --git a/paper-server/patches/sources/net/minecraft/world/level/portal/PortalShape.java.patch b/paper-server/patches/sources/net/minecraft/world/level/portal/PortalShape.java.patch index 1441958ee..89e152588 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/portal/PortalShape.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/portal/PortalShape.java.patch @@ -122,7 +122,7 @@ } + // CraftBukkit start - left and right + blocks.setBlock(checkPos.set(pos).move(Direction.UP, i).move(direction, -1), level.getBlockState(checkPos), 18); -+ blocks.setBlock(checkPos.set(pos).move(Direction.UP, i).move(direction, i), level.getBlockState(checkPos), 18); ++ blocks.setBlock(checkPos.set(pos).move(Direction.UP, i).move(direction, width), level.getBlockState(checkPos), 18); // Paper - fix block list + // CraftBukkit end } diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java index b07f26920..841b5bc9b 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java @@ -50,21 +50,24 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.util.Unit; +import net.minecraft.world.item.EitherHolder; import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.component.InstrumentComponent; import net.minecraft.world.item.component.MapPostProcessing; +import net.minecraft.world.item.component.ProvidesTrimMaterial; import org.bukkit.DyeColor; import org.bukkit.craftbukkit.CraftArt; import org.bukkit.craftbukkit.CraftMusicInstrument; -import org.bukkit.craftbukkit.entity.CraftAxolotl; +import org.bukkit.craftbukkit.CraftRegistry; import org.bukkit.craftbukkit.entity.CraftCat; import org.bukkit.craftbukkit.entity.CraftChicken; import org.bukkit.craftbukkit.entity.CraftCow; import org.bukkit.craftbukkit.entity.CraftFrog; -import org.bukkit.craftbukkit.entity.CraftPainting; import org.bukkit.craftbukkit.entity.CraftPig; import org.bukkit.craftbukkit.entity.CraftVillager; import org.bukkit.craftbukkit.entity.CraftWolf; import org.bukkit.craftbukkit.inventory.CraftMetaFirework; +import org.bukkit.craftbukkit.inventory.trim.CraftTrimMaterial; import org.bukkit.craftbukkit.util.Handleable; import org.bukkit.entity.Axolotl; import org.bukkit.entity.Horse; @@ -139,9 +142,8 @@ public final class DataComponentAdapters { // entity data // bucket entity data // block entity data - //register(DataComponents.INSTRUMENT, CraftMusicInstrument::minecraftHolderToBukkit, CraftMusicInstrument::bukkitToMinecraftHolder); // TODO - registerIdentity(DataComponents.INSTRUMENT); - registerIdentity(DataComponents.PROVIDES_TRIM_MATERIAL); // TODO + register(DataComponents.INSTRUMENT, nms -> CraftMusicInstrument.minecraftHolderToBukkit(nms.instrument().unwrap(CraftRegistry.getMinecraftRegistry()).orElseThrow()), api -> new InstrumentComponent(CraftMusicInstrument.bukkitToMinecraftHolder(api))); + register(DataComponents.PROVIDES_TRIM_MATERIAL, nms -> CraftTrimMaterial.minecraftHolderToBukkit(nms.material().unwrap(CraftRegistry.getMinecraftRegistry()).orElseThrow()), api -> new ProvidesTrimMaterial(CraftTrimMaterial.bukkitToMinecraftHolder(api))); register(DataComponents.OMINOUS_BOTTLE_AMPLIFIER, PaperOminousBottleAmplifier::new); register(DataComponents.JUKEBOX_PLAYABLE, PaperJukeboxPlayable::new); register(DataComponents.PROVIDES_BANNER_PATTERNS, PaperRegistries::fromNms, PaperRegistries::toNms); @@ -162,8 +164,7 @@ public final class DataComponentAdapters { // bees // register(DataComponents.LOCK, PaperLockCode::new); register(DataComponents.CONTAINER_LOOT, PaperSeededContainerLoot::new); - register(DataComponents.BREAK_SOUND, nms -> PaperAdventure.asAdventureKey(nms.unwrapKey().get()), api -> BuiltInRegistries.SOUND_EVENT.getOrThrow(PaperAdventure.asVanilla(Registries.SOUND_EVENT, api))); - // TODO break_sound, provides_, entity data + register(DataComponents.BREAK_SOUND, nms -> PaperAdventure.asAdventure(nms.value().location()), PaperAdventure::resolveSound); register(DataComponents.TOOLTIP_DISPLAY, PaperTooltipDisplay::new); register(DataComponents.WEAPON, PaperWeapon::new); register(DataComponents.BLOCKS_ATTACKS, PaperBlocksAttacks::new); @@ -173,22 +174,22 @@ public final class DataComponentAdapters { register(DataComponents.WOLF_COLLAR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData())); register(DataComponents.WOLF_SOUND_VARIANT, CraftWolf.CraftSoundVariant::minecraftHolderToBukkit, CraftWolf.CraftSoundVariant::bukkitToMinecraftHolder); register(DataComponents.FOX_VARIANT, nms -> org.bukkit.entity.Fox.Type.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.Fox.Variant.byId(api.ordinal())); - register(DataComponents.SALMON_SIZE, (nms) -> Salmon.Variant.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.Salmon.Variant.values()[api.ordinal()]); - register(DataComponents.PARROT_VARIANT, (nms) -> Parrot.Variant.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.Parrot.Variant.byId(api.ordinal())); - register(DataComponents.TROPICAL_FISH_PATTERN, (nms) -> TropicalFish.Pattern.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.TropicalFish.Pattern.byId(api.ordinal())); + register(DataComponents.SALMON_SIZE, nms -> Salmon.Variant.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.Salmon.Variant.values()[api.ordinal()]); + register(DataComponents.PARROT_VARIANT, nms -> Parrot.Variant.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.Parrot.Variant.byId(api.ordinal())); + register(DataComponents.TROPICAL_FISH_PATTERN, nms -> TropicalFish.Pattern.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.TropicalFish.Pattern.values()[api.ordinal()]); register(DataComponents.TROPICAL_FISH_BASE_COLOR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData())); register(DataComponents.TROPICAL_FISH_PATTERN_COLOR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData())); - register(DataComponents.MOOSHROOM_VARIANT, (nms) -> MushroomCow.Variant.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.MushroomCow.Variant.values()[api.ordinal()]); - register(DataComponents.RABBIT_VARIANT, (nms) -> Rabbit.Type.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.Rabbit.Variant.byId(api.ordinal())); + register(DataComponents.MOOSHROOM_VARIANT, nms -> MushroomCow.Variant.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.MushroomCow.Variant.values()[api.ordinal()]); + register(DataComponents.RABBIT_VARIANT, nms -> Rabbit.Type.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.Rabbit.Variant.byId(api.ordinal())); register(DataComponents.PIG_VARIANT, CraftPig.CraftVariant::minecraftHolderToBukkit, CraftPig.CraftVariant::bukkitToMinecraftHolder); register(DataComponents.COW_VARIANT, CraftCow.CraftVariant::minecraftHolderToBukkit, CraftCow.CraftVariant::bukkitToMinecraftHolder); - // TODO: We should probably find a cleaner pattern for handling this which retains the EitherHolder, this does kinda suck in terms of exposure, however - register(DataComponents.CHICKEN_VARIANT, CraftChicken.CraftVariant::minecraftEitherHolderToBukkit, CraftChicken.CraftVariant::bukkitToMinecraftEitherHolder); + // TODO: We should probably find a better pattern for handling this which retains the EitherHolder, this does kinda suck in terms of exposure, however + register(DataComponents.CHICKEN_VARIANT, nms -> CraftChicken.CraftVariant.minecraftHolderToBukkit(nms.unwrap(CraftRegistry.getMinecraftRegistry()).orElseThrow()), api -> new EitherHolder<>(CraftChicken.CraftVariant.bukkitToMinecraftHolder(api))); register(DataComponents.FROG_VARIANT, CraftFrog.CraftVariant::minecraftHolderToBukkit, CraftFrog.CraftVariant::bukkitToMinecraftHolder); - register(DataComponents.HORSE_VARIANT, (nms) -> Horse.Style.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.horse.Variant.byId(api.ordinal())); + register(DataComponents.HORSE_VARIANT, nms -> Horse.Color.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.horse.Variant.byId(api.ordinal())); register(DataComponents.PAINTING_VARIANT, CraftArt::minecraftHolderToBukkit, CraftArt::bukkitToMinecraftHolder); - register(DataComponents.LLAMA_VARIANT, (nms) -> Llama.Color.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.horse.Llama.Variant.byId(api.ordinal())); - register(DataComponents.AXOLOTL_VARIANT, (nms) -> Axolotl.Variant.values()[nms.ordinal()], (api) -> net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.byId(api.ordinal())); + register(DataComponents.LLAMA_VARIANT, nms -> Llama.Color.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.horse.Llama.Variant.byId(api.ordinal())); + register(DataComponents.AXOLOTL_VARIANT, nms -> Axolotl.Variant.values()[nms.ordinal()], api -> net.minecraft.world.entity.animal.axolotl.Axolotl.Variant.byId(api.ordinal())); register(DataComponents.CAT_VARIANT, CraftCat.CraftType::minecraftHolderToBukkit, CraftCat.CraftType::bukkitToMinecraftHolder); register(DataComponents.CAT_COLLAR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData())); register(DataComponents.SHEEP_COLOR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData())); diff --git a/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java b/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java index 8147fe865..3bc2ef90f 100644 --- a/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java +++ b/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java @@ -49,6 +49,11 @@ public final class DelayedRegistry> imple return this.delegate().stream(); } + @Override + public Stream keyStream() { + return this.delegate().keyStream(); + } + @Override public int size() { return this.delegate().size(); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java index f46618d3f..408c56166 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java @@ -233,6 +233,12 @@ public class CraftRegistry implements Registry { return this.minecraftRegistry.keySet().stream().map(minecraftKey -> this.get(CraftNamespacedKey.fromMinecraft(minecraftKey))); } + @NotNull + @Override + public Stream keyStream() { + return this.minecraftRegistry.keySet().stream().map(CraftNamespacedKey::fromMinecraft); + } + @Override public int size() { return this.minecraftRegistry.size(); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index e9ca19c86..a4d5c65ed 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -697,6 +697,11 @@ public class CraftBlock implements Block { return this.getNMS().getBlock().getDescriptionId(); } + @Override + public boolean isSuffocating() { + return this.getNMS().isSuffocating(this.world, this.position); + } + // Paper start @Override public com.destroystokyo.paper.block.BlockSoundGroup getSoundGroup() { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index c0a765977..196835bdf 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -75,6 +75,7 @@ public class CraftBlockState implements BlockState { // Returns null if weakWorld is not available and the BlockState is not placed. // If this returns a World instead of only a GeneratorAccess, this implies that this BlockState is placed. + @Nullable public LevelAccessor getWorldHandle() { if (this.weakWorld == null) { return this.isPlaced() ? this.world.getHandle() : null; @@ -177,7 +178,7 @@ public class CraftBlockState implements BlockState { @Override public Material getType() { - return this.data.getBukkitMaterial(); // Paper - optimise getType calls + return this.data.getBukkitMaterial(); } public void setFlags(int flags) { @@ -357,7 +358,6 @@ public class CraftBlockState implements BlockState { return new CraftBlockState(this, location); } - // Paper start @Override public boolean isCollidable() { return this.data.getBlock().hasCollision; @@ -381,5 +381,10 @@ public class CraftBlockState implements BlockState { return java.util.Collections.emptyList(); } } - // Paper end + + @Override + public boolean isSuffocating() { + this.requirePlaced(); + return this.data.isSuffocating(this.getWorldHandle(), this.position); + } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java index 802bc9085..9210c84bb 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java @@ -1,19 +1,14 @@ package org.bukkit.craftbukkit.entity; import com.google.common.base.Preconditions; -import io.papermc.paper.adventure.PaperAdventure; import io.papermc.paper.registry.HolderableBase; import net.minecraft.core.Holder; -import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; import net.minecraft.world.entity.animal.ChickenVariant; -import net.minecraft.world.item.EitherHolder; import org.bukkit.craftbukkit.CraftRegistry; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.Chicken; import org.jspecify.annotations.NullMarked; -import java.util.Optional; @NullMarked public class CraftChicken extends CraftAnimals implements Chicken { @@ -54,26 +49,6 @@ public class CraftChicken extends CraftAnimals implements Chicken { return CraftRegistry.minecraftHolderToBukkit(minecraft, Registries.CHICKEN_VARIANT); } - public static Variant minecraftEitherHolderToBukkit(EitherHolder minecraft) { - final Optional> left = minecraft.contents().left(); - if (left.isPresent()) { - return CraftRegistry.minecraftHolderToBukkit(left.get(), Registries.CHICKEN_VARIANT); - } - final Optional> right = minecraft.contents().right(); - if (right.isPresent()) { - final Holder.Reference orThrow = CraftRegistry.getMinecraftRegistry(right.get().registryKey()).getOrThrow(right.get()); - return minecraftToBukkit(orThrow.value()); - } - throw new IllegalStateException("Cannot map entry for " + minecraft); - } - - public static EitherHolder bukkitToMinecraftEitherHolder(Variant variant) { - final Registry chickenVariantRegistry = CraftRegistry.getMinecraftRegistry(Registries.CHICKEN_VARIANT); - final Optional> chickenVariantReference = chickenVariantRegistry.get(PaperAdventure.asVanilla(variant.key())); - return chickenVariantReference.map(EitherHolder::new).orElseGet(() -> new EitherHolder<>(PaperAdventure.asVanilla(chickenVariantRegistry.key(), variant.key()))); - - } - public static ChickenVariant bukkitToMinecraft(Variant bukkit) { return CraftRegistry.bukkitToMinecraft(bukkit); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/components/CraftJukeboxComponent.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/components/CraftJukeboxComponent.java index 4ef956c36..eff1cad2c 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/components/CraftJukeboxComponent.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/components/CraftJukeboxComponent.java @@ -52,7 +52,7 @@ public final class CraftJukeboxComponent implements JukeboxPlayableComponent { @Override public JukeboxSong getSong() { Optional> song = this.handle.song().unwrap(CraftRegistry.getMinecraftRegistry()); - return (song.isPresent()) ? CraftJukeboxSong.minecraftHolderToBukkit(song.get()) : null; + return song.map(CraftJukeboxSong::minecraftHolderToBukkit).orElse(null); } @Override