Skip to content

API Changes in 1.21.4

All API Changes
All API Additions
  • ItemStack#copyDataFrom(ItemStack source, Predicate<DataComponentType> filter)
  • World#save(boolean flush)
  • ChunkyGenerator#getHeight(HeightMap heightMap, int x, int z): int
  • Skull#customName(): Component
  • Skull#customName(Component component)
  • ClientTickEndEvent extends PlayerEvent
  • Player#getDeathScreenScore(): int
  • Player#setDeathScreenScore(int score)
  • Creaking#getHome(): Location
  • Creaking#activate(Player player)
  • Creaking#deactivate()
  • Creaking#isActive()
  • Bukkit.restart()
  • JavaPlugin#registerCommand(String label, BasicCommand BasicCommand)
  • JavaPlugin#registerCommand(String label, String description, BasicCommand BasicCommand)
  • JavaPlugin#registerCommand(String label, Collection<String> aliases, BasicCommand BasicCommand)
  • JavaPlugin#registerCommand(String label, String description, Collection<String> aliases, BasicCommand BasicCommand)
  • EntityEquipmentChangedEvent extends EntityEvent
  • EntityAttemptSmashAttackEvent extends EntityEvent
  • ItemStack#editPersistentDataContainer(Consumer<PersistentDataContainer> consumer): boolean
  • TrialSpawner#getCooldownEnd(): long
  • TrialSpawner#setCooldownEnd(long ticks)
  • TrialSpawner#getNextSpawnAttempt(): long
  • TrialSpawner#setNextSpawnAttempt(long ticks)
  • Vault#getActivationRange(): double
  • Vault#setActivationRange(double deactivationRange)
  • Vault#getDeactivationRange(): double
  • Vault#setDeactivationRange(double deactivationRange)
  • Vault#getKeyItem(): ItemStack
  • Vault#setKeyItem(ItemStack key)
  • Vault#getLootTable(): LootTable
  • Vault#setLootTable(LootTable lootTable)
  • Vault#getDisplayedLootTable(): LootTable
  • Vault#setDisplayedLootTable(LootTable lootTable)
  • Vault#getNextStateUpdateTime(): long
  • Vault#setNextStateUpdateTime(long nextStateUpdateTime)
  • Vault#getRewardedPlayers(): Collection<UUID>
  • Vault#addRewardedPlayer(UUID playerUUID)
  • Vault#removeRewardedPlayer(UUID playerUUID)
  • Vault#hasRewardedPlayer(UUID playerUUID)
  • Vault#getConnectedPlayers(): Set<UUID>
  • Vault#hasConnectedPlayers(UUID playerUUID)
  • Vault#getDisplayedItem(): ItemStack
  • Vault#setDisplayedItem(ItemStack displayedItem)
  • AbstractArrow#getAttachedBlocks(): List<Block>
  • PlayerGiveResult
  • Player#give(ItemStack... items): PlayerGiveResult
  • Player#give(Collection<ItemStack> items): PlayerGiveResult
  • Player#give(Collection<ItemStack> items, boolean dropIfFull): PlayerGiveResult
  • PlayerClientLoadedWorldEvent extends PlayerEvent
  • PositionedRayTraceConfigurationBuilder
  • RayTraceTarget
  • World#rayTrace(Consumer<PositionedRayTraceConfigurationBuilder> builderConsumer): RayTraceResult
  • BlockType#createBlockDataStates(): Collection<? extends BlockData>
  • EntityEffectTickEvent extends EntityEvent implements Cancellable
  • HumanEntity#getPotentialRespawnLocation(): Location
  • CommandSourceStack#withExecutor(Entity entity)
  • CommandSourceStack#withLocation(Location location)
  • Bukkit.createMerchant(): Merchant
  • Server.createMerchant(): Merchant
  • InventoryViewBuilder<V extends InventoryView>
  • LocationInventoryViewBuilder<V extends InventoryView> extends InventoryViewBuilder<V>
  • MerchantInventoryViewBuilder<V extends InventoryView> extends InventoryViewBuilder<V>
  • Location#addRotation(float yaw, float pitch): Location
  • Location#subtractRotation(float yaw, float pitch): Location
  • Location#setRotation(float yaw, float pitch): Location
  • Server#sendRichMessage(String message)
  • Server#sendRichMessage(String message, TagResolver... resolvers)
  • Server#sendPlainMessage(String message)
  • HumanEntity#dropItem(int slot): Item
  • HumanEntity#dropItem(int slot, int amount): Item
  • HumanEntity#dropItem(int slot, int amount, boolean throwRandomly, Consumer<Item> entityOperation): Item
  • HumanEntity#dropItem(EquipmentSlot slot): Item
  • HumanEntity#dropItem(EquipmentSlot slot, int amount): Item
  • HumanEntity#dropItem(EquipmentSlot slot, int amount, boolean throwRandomly, Consumer<Item> entityOperation): Item
  • HumanEntity#dropItem(ItemStack): Item
  • HumanEntity#dropItem(ItemStack, boolean throwRandomly, Consumer<Item> entityOperation): Item
  • DatapackRegistrar
  • DiscoveredDatapack
  • DatapackSource.PLUGIN: DatapackSource
  • LifecycleEvents.DATAPACK_DISCOVERY: LifecycleEventType.Prioritizable<BootstrapContext, RegistrarEvent<DatapackRegistrar>>
  • DamageTypeRegistryEntry
  • RegistryEvents.DAMAGE_TYPE: RegistryEventProvider<DamageType, DamageTypeRegistryEntry.Builder>
  • DamageEffect.getDamageEffect(String key): DamageEffect
  • BannerPatternRegistryEntry
  • RegistryEvents.BANNER_PATTERN: RegistryEventProvider<PatternType, BannerPatternRegistryEntry.Builder>
  • EntitySerializationFlag
  • UnsafeValues#serializeEntity(Entity entity): byte[]
  • UnsafeValues#serializeEntity(Entity entity, EntitySerializationFlag... serializationFlag): byte[]
  • UnsafeValues#deserializeEntity(byte[] data, World world): Entity
  • UnsafeValues#deserializeEntity(byte[] data, World world, boolean preserveUUID): Entity
  • UnsafeValues#deserializeEntity(byte[] data, World world, boolean preserveUUID, boolean preservePassengers): Entity
  • Entity#spawnAt(Location location): boolean
  • Entity#spawnAt(Location location, CreatureSpawnEvent.SpawnReason reason): boolean
  • RegistryBuilderFactory
  • RegistryKey#typedKey(Key key): TypedKey<T>
  • RegistryKey#typedKey(String key): TypedKey<T>
  • WritableRegistry#register(TypedKey<T> key, Consumer<? super B> value)
  • WritableRegistry#registerWith(TypedKey<T> key, Consumer<RegistryBuilderFactory<T, B>> value)
  • TypedKey.create(RegistryKey<T> registryKey, String key): <T>
  • Tag.ITEMS_STONE_CRAFTING_MATERIALS: Tag<Material>
  • Registry#getTag(TagKey<T> key): Tag<T>
  • Registry#getTags(): Collection<Tag<T>>
  • ItemStack#effectiveName(): Component
  • Entity#lookAt(double x, double y, double z, LookAnchor entityAnchor)
  • Entity#lookAt(io.papermc.paper.math.Position position, LookAnchor entityAnchor)
  • Bogged#isSheared(): boolean
  • Bogged#setSheared(boolean flag)
  • Sheep#isSheared(): boolean
  • Sheep#setSheared(boolean flag)
  • MaterialTags: MaterialSetTag COMMAND_BLOCKS
  • ItemMeta#hasCustomName()
  • ItemMeta#customName(): Component
  • ItemMeta#customName(Component customName)
  • All API Deprecations
  • Bukkit.spigot(): Server.Spigot
  • All of Server.Spigot
  • Server#spigot(): Spigot
  • Server#restart()
  • AbstractArrow#getAttachedBlock(): Block
  • Bukkit.setSpawnRadius(int value)
  • Server#setSpawnRadius(int value)
  • UnsafeValues#getSpawnEggLayerColor(EntityType entityType, int layer): Color
  • Turtle#isDigging(): boolean
  • HumanEntity#getPotentialBedLocation(): Location
  • Bukkit.createMerchant(Component title): Merchant
  • Server#createMerchant(Component title): Merchant
  • HumanEntity#openWorkbench(Location location, boolean force): InventoryView
  • HumanEntity#openEnchanting(Location location, boolean force): InventoryView
  • HumanEntity#openMerchant(Villager trader, boolean force): InventoryView
  • HumanEntity#openMerchant(Merchant merchant, boolean force): InventoryView
  • HumanEntity#openAnvil(Location location, boolean force): InventoryView
  • HumanEntity#openCartographyTable(Location location, boolean force): InventoryView
  • HumanEntity#openGrindstone(Location location, boolean force): InventoryView
  • HumanEntity#openLoom(Location location, boolean force): InventoryView
  • HumanEntity#openSmithingTable(Location location, boolean force): InventoryView
  • HumanEntity#openStonecutter(Location location, boolean force): InventoryView
  • Tag.ITEMS_FURNACE_MATERIALS: Tag<Material>
  • All Class Inheritance Changes
  • Sittable now extends Entity
  • Datapack now extends DiscoveredDatapack
  • Now Obsolete
  • PlayerArmorChangeEvent
  • HumanEntity#dropItem(boolean dropAll): boolean
  • ItemMeta#displayName()
  • ItemMeta#displayName(Component displayName)
  • Library Changes
  • Bumped Adventure to 4.20
  • #224 Bump to adventure 4.20.0

    Libraries:

    • Bumped Adventure to 4.20

    #221 Add ItemStack#copyDataFrom

    Additions:

    • ItemStack#copyDataFrom(ItemStack source, Predicate<DataComponentType> filter)

    #219 Add flush parameter to World#save

    Additions:

    • World#save(boolean flush)

    #218 ChunkGenerator - add getHeight to ChunkData

    Additions:

    • ChunkyGenerator#getHeight(HeightMap heightMap, int x, int z): int

    #214 Skull - get/set customName

    Additions:

    • Skull#customName(): Component
    • Skull#customName(Component component)

    #205 Add client tick end event

    Additions:

    • ClientTickEndEvent extends PlayerEvent

    #196 Player - Expose player score

    Additions:

    • Player#getDeathScreenScore(): int
    • Player#setDeathScreenScore(int score)

    #182 Add methods for Creaking

    Additions:

    • Creaking#getHome(): Location
    • Creaking#activate(Player player)
    • Creaking#deactivate()
    • Creaking#isActive()

    #180 Deprecate server config getters

    Additions:

    • Bukkit.restart()

    Deprecations:

    • Bukkit.spigot(): Server.Spigot
    • All of Server.Spigot
    • Server#spigot(): Spigot
    • Server#restart()

    #170 add simpler javaplugin command registration

    Additions:

    • JavaPlugin#registerCommand(String label, BasicCommand BasicCommand)
    • JavaPlugin#registerCommand(String label, String description, BasicCommand BasicCommand)
    • JavaPlugin#registerCommand(String label, Collection<String> aliases, BasicCommand BasicCommand)
    • JavaPlugin#registerCommand(String label, String description, Collection<String> aliases, BasicCommand BasicCommand)

    #157 Add EntityEquipmentChangedEvent

    Additions:

    • EntityEquipmentChangedEvent extends EntityEvent

    Obsolete API:

    • PlayerArmorChangeEvent

    #155 Add EntityAttemptSmashAttackEvent

    Additions:

    • EntityAttemptSmashAttackEvent extends EntityEvent

    #153 add method on ItemStack to edit pdc

    Additions:

    • ItemStack#editPersistentDataContainer(Consumer<PersistentDataContainer> consumer): boolean

    #150 Add TrialSpawner methods for end of cooldown and next mob spawn time

    Additions:

    • TrialSpawner#getCooldownEnd(): long
    • TrialSpawner#setCooldownEnd(long ticks)
    • TrialSpawner#getNextSpawnAttempt(): long
    • TrialSpawner#setNextSpawnAttempt(long ticks)

    #149 Add Vault block API

    Additions:

    • Vault#getActivationRange(): double
    • Vault#setActivationRange(double deactivationRange)
    • Vault#getDeactivationRange(): double
    • Vault#setDeactivationRange(double deactivationRange)
    • Vault#getKeyItem(): ItemStack
    • Vault#setKeyItem(ItemStack key)
    • Vault#getLootTable(): LootTable
    • Vault#setLootTable(LootTable lootTable)
    • Vault#getDisplayedLootTable(): LootTable
    • Vault#setDisplayedLootTable(LootTable lootTable)
    • Vault#getNextStateUpdateTime(): long
    • Vault#setNextStateUpdateTime(long nextStateUpdateTime)
    • Vault#getRewardedPlayers(): Collection<UUID>
    • Vault#addRewardedPlayer(UUID playerUUID)
    • Vault#removeRewardedPlayer(UUID playerUUID)
    • Vault#hasRewardedPlayer(UUID playerUUID)
    • Vault#getConnectedPlayers(): Set<UUID>
    • Vault#hasConnectedPlayers(UUID playerUUID)
    • Vault#getDisplayedItem(): ItemStack
    • Vault#setDisplayedItem(ItemStack displayedItem)

    #148 Add proper attached blocks API to AbstractArrow

    Additions:

    • AbstractArrow#getAttachedBlocks(): List<Block>

    Deprecations:

    • AbstractArrow#getAttachedBlock(): Block

    #144 Deprecate Server#setSpawnRadius

    Deprecations:

    • Bukkit.setSpawnRadius(int value)
    • Server#setSpawnRadius(int value)

    #140 Make Sittable interface extend Entity

    Extensions:

    • Sittable now extends Entity

    #136 Deprecate UnsafeValues#getSpawnEggLayerColor

    Deprecations:

    • UnsafeValues#getSpawnEggLayerColor(EntityType entityType, int layer): Color

    #127 Add Player#give

    Additions:

    • PlayerGiveResult
    • Player#give(ItemStack... items): PlayerGiveResult
    • Player#give(Collection<ItemStack> items): PlayerGiveResult
    • Player#give(Collection<ItemStack> items, boolean dropIfFull): PlayerGiveResult

    #126 Add PlayerLoadedWorldEvent

    Additions:

    • PlayerClientLoadedWorldEvent extends PlayerEvent

    #123 Add RayTraceConfigurationBuilder

    Additions:

    • PositionedRayTraceConfigurationBuilder
    • RayTraceTarget
    • World#rayTrace(Consumer<PositionedRayTraceConfigurationBuilder> builderConsumer): RayTraceResult

    #107 Remove deprecation from EntityRemoveEvent

    #104 Expose all possible block data states

    Additions:

    • BlockType#createBlockDataStates(): Collection<? extends BlockData>

    #101 Deprecate Turtle#isDigging

    Deprecations:

    • Turtle#isDigging(): boolean

    #99 Add EntityEffectTickEvent

    Additions:

    • EntityEffectTickEvent extends EntityEvent implements Cancellable

    #97 Rename getPotentialBedLocation to getPotentialRespawnLocation

    Additions:

    • HumanEntity#getPotentialRespawnLocation(): Location

    Deprecations:

    • HumanEntity#getPotentialBedLocation(): Location

    #95 Feat: Add 'with' methods to CommandSourceStack

    Additions:

    • CommandSourceStack#withExecutor(Entity entity)
    • CommandSourceStack#withLocation(Location location)

    #94 MenuType API addition InventoryView Builders

    Additions:

    • Bukkit.createMerchant(): Merchant
    • Server.createMerchant(): Merchant
    • InventoryViewBuilder<V extends InventoryView>
    • LocationInventoryViewBuilder<V extends InventoryView> extends InventoryViewBuilder<V>
    • MerchantInventoryViewBuilder<V extends InventoryView> extends InventoryViewBuilder<V>

    Deprecations:

    • Bukkit.createMerchant(Component title): Merchant
    • Server#createMerchant(Component title): Merchant
    • HumanEntity#openWorkbench(Location location, boolean force): InventoryView
    • HumanEntity#openEnchanting(Location location, boolean force): InventoryView
    • HumanEntity#openMerchant(Villager trader, boolean force): InventoryView
    • HumanEntity#openMerchant(Merchant merchant, boolean force): InventoryView
    • HumanEntity#openAnvil(Location location, boolean force): InventoryView
    • HumanEntity#openCartographyTable(Location location, boolean force): InventoryView
    • HumanEntity#openGrindstone(Location location, boolean force): InventoryView
    • HumanEntity#openLoom(Location location, boolean force): InventoryView
    • HumanEntity#openSmithingTable(Location location, boolean force): InventoryView
    • HumanEntity#openStonecutter(Location location, boolean force): InventoryView

    #75 Add pattern methods for orientation in Location

    Additions:

    • Location#addRotation(float yaw, float pitch): Location
    • Location#subtractRotation(float yaw, float pitch): Location
    • Location#setRotation(float yaw, float pitch): Location

    #69 Add sendRich/PlainMessage methods to Server

    Additions:

    • Server#sendRichMessage(String message)
    • Server#sendRichMessage(String message, TagResolver... resolvers)
    • Server#sendPlainMessage(String message)

    #64 Extend HumanEntity#dropItem API

    Additions:

    • HumanEntity#dropItem(int slot): Item
    • HumanEntity#dropItem(int slot, int amount): Item
    • HumanEntity#dropItem(int slot, int amount, boolean throwRandomly, Consumer<Item> entityOperation): Item
    • HumanEntity#dropItem(EquipmentSlot slot): Item
    • HumanEntity#dropItem(EquipmentSlot slot, int amount): Item
    • HumanEntity#dropItem(EquipmentSlot slot, int amount, boolean throwRandomly, Consumer<Item> entityOperation): Item
    • HumanEntity#dropItem(ItemStack): Item
    • HumanEntity#dropItem(ItemStack, boolean throwRandomly, Consumer<Item> entityOperation): Item

    Obsolete API:

    • HumanEntity#dropItem(boolean dropAll): boolean

    #63 Add datapack registration lifecycle event

    Additions:

    • DatapackRegistrar
    • DiscoveredDatapack
    • DatapackSource.PLUGIN: DatapackSource
    • LifecycleEvents.DATAPACK_DISCOVERY: LifecycleEventType.Prioritizable<BootstrapContext, RegistrarEvent<DatapackRegistrar>>

    Extensions:

    • Datapack now extends DiscoveredDatapack

    #59 Add DamageType RegistryEvent

    Additions:

    • DamageTypeRegistryEntry
    • RegistryEvents.DAMAGE_TYPE: RegistryEventProvider<DamageType, DamageTypeRegistryEntry.Builder>
    • DamageEffect.getDamageEffect(String key): DamageEffect

    #49 Banner pattern registry modification

    Additions:

    • BannerPatternRegistryEntry
    • RegistryEvents.BANNER_PATTERN: RegistryEventProvider<PatternType, BannerPatternRegistryEntry.Builder>

    #48 Expand on entity serialization API

    Additions:

    • EntitySerializationFlag
    • UnsafeValues#serializeEntity(Entity entity): byte[]
    • UnsafeValues#serializeEntity(Entity entity, EntitySerializationFlag... serializationFlag): byte[]
    • UnsafeValues#deserializeEntity(byte[] data, World world): Entity
    • UnsafeValues#deserializeEntity(byte[] data, World world, boolean preserveUUID): Entity
    • UnsafeValues#deserializeEntity(byte[] data, World world, boolean preserveUUID, boolean preservePassengers): Entity
    • Entity#spawnAt(Location location): boolean
    • Entity#spawnAt(Location location, CreatureSpawnEvent.SpawnReason reason): boolean

    #47 For new registry values, allow copying from existing

    Additions:

    • RegistryBuilderFactory
    • RegistryKey#typedKey(Key key): TypedKey<T>
    • RegistryKey#typedKey(String key): TypedKey<T>
    • WritableRegistry#register(TypedKey<T> key, Consumer<? super B> value)
    • WritableRegistry#registerWith(TypedKey<T> key, Consumer<RegistryBuilderFactory<T, B>> value)
    • TypedKey.create(RegistryKey<T> registryKey, String key): <T>

    #42 Deprecate #furnace_materials item tag

    Additions:

    • Tag.ITEMS_STONE_CRAFTING_MATERIALS: Tag<Material>

    Deprecations:

    • Tag.ITEMS_FURNACE_MATERIALS: Tag<Material>

    #40 Add Registry#getTags

    Additions:

    • Registry#getTag(TagKey<T> key): Tag<T>
    • Registry#getTags(): Collection<Tag<T>>

    #39 Add effective name to ItemStack

    Additions:

    • ItemStack#effectiveName(): Component

    #34 Port basic lookAt methods from Player to Entity

    Additions:

    • Entity#lookAt(double x, double y, double z, LookAnchor entityAnchor)
    • Entity#lookAt(io.papermc.paper.math.Position position, LookAnchor entityAnchor)

    #11 Readd shear methods from bukkit Shearable

    Additions:

    • Bogged#isSheared(): boolean
    • Bogged#setSheared(boolean flag)
    • Sheep#isSheared(): boolean
    • Sheep#setSheared(boolean flag)

    #9 Add command block material tags

    Additions:

    • MaterialTags: MaterialSetTag COMMAND_BLOCKS

    #5 Add ItemMeta customName methods

    Additions:

    • ItemMeta#hasCustomName()
    • ItemMeta#customName(): Component
    • ItemMeta#customName(Component customName)

    Obsolete API:

    • ItemMeta#displayName()
    • ItemMeta#displayName(Component displayName)

    Learn Paper Dev is licensed under CC BY-NC-SA 4.0