diff --git a/patches/api/Add-BeaconEffectEvent.patch b/patches/api/Add-BeaconEffectEvent.patch index 7d4b19c8b8..93ca07efb8 100644 --- a/patches/api/Add-BeaconEffectEvent.patch +++ b/patches/api/Add-BeaconEffectEvent.patch @@ -19,11 +19,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import org.bukkit.event.block.BlockEvent; +import org.bukkit.potion.PotionEffect; +import org.jetbrains.annotations.ApiStatus; -+import org.jetbrains.annotations.NotNull; ++import org.jspecify.annotations.NullMarked; + +/** + * Called when a beacon effect is being applied to a player. + */ ++@NullMarked +public class BeaconEffectEvent extends BlockEvent implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); @@ -35,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + private boolean cancelled; + + @ApiStatus.Internal -+ public BeaconEffectEvent(@NotNull Block block, @NotNull PotionEffect effect, @NotNull Player player, boolean primary) { ++ public BeaconEffectEvent(final Block block, final PotionEffect effect, final Player player, final boolean primary) { + super(block); + this.effect = effect; + this.player = player; @@ -47,7 +48,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + * + * @return Potion effect + */ -+ @NotNull + public PotionEffect getEffect() { + return this.effect; + } @@ -57,7 +57,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + * + * @param effect Potion effect + */ -+ public void setEffect(@NotNull PotionEffect effect) { ++ public void setEffect(final PotionEffect effect) { + this.effect = effect; + } + @@ -66,7 +66,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + * + * @return Affected player + */ -+ @NotNull + public Player getPlayer() { + return this.player; + } @@ -86,17 +85,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + } + + @Override -+ public void setCancelled(boolean cancel) { ++ public void setCancelled(final boolean cancel) { + this.cancelled = cancel; + } + -+ @NotNull + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + -+ @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } diff --git a/patches/api/Add-BlockBreakBlockEvent.patch b/patches/api/Add-BlockBreakBlockEvent.patch index 981ddd8f87..20c95a9c64 100644 --- a/patches/api/Add-BlockBreakBlockEvent.patch +++ b/patches/api/Add-BlockBreakBlockEvent.patch @@ -12,20 +12,20 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 @@ -0,0 +0,0 @@ +package io.papermc.paper.event.block; + ++import java.util.List; +import org.bukkit.block.Block; +import org.bukkit.event.HandlerList; +import org.bukkit.event.block.BlockExpEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.ApiStatus; -+import org.jetbrains.annotations.NotNull; -+ -+import java.util.List; ++import org.jspecify.annotations.NullMarked; + +/** + * Called when a block forces another block to break and drop items. + *
+ * Currently called for piston's and liquid flows.
+ */
++@NullMarked
+public class BlockBreakBlockEvent extends BlockExpEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -34,18 +34,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private final List
+ * The event hence only exposes the two parent entities in the fertilization process and cannot provide the child entity, as it will only exist at a later point in time.
+ */
++@NullMarked
+public class EntityFertilizeEggEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private final LivingEntity mother;
+ private final LivingEntity father;
-+ private final Player breeder;
-+ private final ItemStack bredWith;
++ private final @Nullable Player breeder;
++ private final @Nullable ItemStack bredWith;
+ private int experience;
+
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityFertilizeEggEvent(@NotNull LivingEntity mother, @NotNull LivingEntity father, @Nullable Player breeder, @Nullable ItemStack bredWith, int experience) {
++ public EntityFertilizeEggEvent(final LivingEntity mother, final LivingEntity father, final @Nullable Player breeder, final @Nullable ItemStack bredWith, final int experience) {
+ super(mother);
+ this.mother = mother;
+ this.father = father;
@@ -60,7 +61,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ this.experience = experience;
+ }
+
-+ @NotNull
+ @Override
+ public LivingEntity getEntity() {
+ return (LivingEntity) super.getEntity();
@@ -72,7 +72,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The "mother" entity.
+ */
-+ @NotNull
+ public LivingEntity getMother() {
+ return this.mother;
+ }
@@ -83,7 +82,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the other parent
+ */
-+ @NotNull
+ public LivingEntity getFather() {
+ return this.father;
+ }
@@ -94,8 +92,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The Entity who initiated fertilization.
+ */
-+ @Nullable
-+ public Player getBreeder() {
++ public @Nullable Player getBreeder() {
+ return this.breeder;
+ }
+
@@ -104,8 +101,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return ItemStack used to initiate fertilization.
+ */
-+ @Nullable
-+ public ItemStack getBredWith() {
++ public @Nullable ItemStack getBredWith() {
+ return this.bredWith;
+ }
+
@@ -124,7 +120,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param experience experience amount
+ */
-+ public void setExperience(int experience) {
++ public void setExperience(final int experience) {
+ this.experience = experience;
+ }
+
@@ -134,17 +130,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-EntityInsideBlockEvent.patch b/patches/api/Add-EntityInsideBlockEvent.patch
index fc1b1084f7..3095d0b233 100644
--- a/patches/api/Add-EntityInsideBlockEvent.patch
+++ b/patches/api/Add-EntityInsideBlockEvent.patch
@@ -18,7 +18,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when an entity enters the hitbox of a block.
@@ -53,6 +53,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * Cancelling this event resets the entity's readiness
+ * regarding the current portal.
+ */
++@NullMarked
+public class EntityPortalReadyEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private final PortalType portalType;
-+ private World targetWorld;
++ private @Nullable World targetWorld;
+
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityPortalReadyEvent(final @NotNull Entity entity, final @Nullable World targetWorld, final @NotNull PortalType portalType) {
++ public EntityPortalReadyEvent(final Entity entity, final @Nullable World targetWorld, final PortalType portalType) {
+ super(entity);
+ this.targetWorld = targetWorld;
+ this.portalType = portalType;
@@ -81,7 +82,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the portal type
+ */
-+ public @NotNull PortalType getPortalType() {
++ public PortalType getPortalType() {
+ return this.portalType;
+ }
+
@@ -96,11 +97,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public @NotNull HandlerList getHandlers() {
++ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ public static @NotNull HandlerList getHandlerList() {
++ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/patches/api/Add-EntityTeleportEndGatewayEvent.patch b/patches/api/Add-EntityTeleportEndGatewayEvent.patch
index 497c6b8b0e..557ae6b07c 100644
--- a/patches/api/Add-EntityTeleportEndGatewayEvent.patch
+++ b/patches/api/Add-EntityTeleportEndGatewayEvent.patch
@@ -17,17 +17,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.entity.Entity;
+import org.bukkit.event.entity.EntityTeleportEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired any time an entity attempts to teleport in an end gateway
+ */
++@NullMarked
+public class EntityTeleportEndGatewayEvent extends EntityTeleportEvent {
+
-+ @NotNull private final EndGateway gateway;
++ private final EndGateway gateway;
+
+ @ApiStatus.Internal
-+ public EntityTeleportEndGatewayEvent(@NotNull Entity entity, @NotNull Location from, @NotNull Location to, @NotNull EndGateway gateway) {
++ public EntityTeleportEndGatewayEvent(final Entity entity, final Location from, final Location to, final EndGateway gateway) {
+ super(entity, from, to);
+ this.gateway = gateway;
+ }
@@ -37,7 +38,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return EndGateway used
+ */
-+ @NotNull
+ public EndGateway getGateway() {
+ return this.gateway;
+ }
diff --git a/patches/api/Add-EntityZapEvent.patch b/patches/api/Add-EntityZapEvent.patch
index 9f421e0861..856680d690 100644
--- a/patches/api/Add-EntityZapEvent.patch
+++ b/patches/api/Add-EntityZapEvent.patch
@@ -12,28 +12,28 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@
+package com.destroystokyo.paper.event.entity;
+
++import java.util.Collections;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LightningStrike;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityTransformEvent;
-+
-+import java.util.Collections;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired when lightning strikes an entity
+ */
++@NullMarked
+public class EntityZapEvent extends EntityTransformEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final LightningStrike bolt;
++ private final LightningStrike bolt;
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityZapEvent(@NotNull final Entity entity, @NotNull final LightningStrike bolt, @NotNull final Entity replacementEntity) {
++ public EntityZapEvent(final Entity entity, final LightningStrike bolt, final Entity replacementEntity) {
+ super(entity, Collections.singletonList(replacementEntity), TransformReason.LIGHTNING);
+ this.bolt = bolt;
+ }
@@ -43,7 +43,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The lightning bolt responsible for this event
+ */
-+ @NotNull
+ public LightningStrike getBolt() {
+ return this.bolt;
+ }
@@ -53,7 +52,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The entity that will replace the struck entity
+ */
-+ @NotNull
+ public Entity getReplacementEntity() {
+ return super.getTransformedEntity();
+ }
@@ -64,17 +62,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-GS4-Query-event.patch b/patches/api/Add-GS4-Query-event.patch
index 52156b15cb..62c78852a4 100644
--- a/patches/api/Add-GS4-Query-event.patch
+++ b/patches/api/Add-GS4-Query-event.patch
@@ -14,17 +14,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
-+import org.bukkit.Server;
-+import org.bukkit.event.Event;
-+import org.bukkit.event.HandlerList;
-+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
++import org.bukkit.Server;
++import org.bukkit.event.Event;
++import org.bukkit.event.HandlerList;
++import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
++import org.jetbrains.annotations.ApiStatus;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * This event is fired if server is getting queried over GS4 Query protocol.
@@ -33,6 +33,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @author Mark Vainomaa
+ */
++@NullMarked
+public final class GS4QueryEvent extends Event {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -42,7 +43,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private QueryResponse response;
+
+ @ApiStatus.Internal
-+ public GS4QueryEvent(@NotNull QueryType queryType, @NotNull InetAddress querierAddress, @NotNull QueryResponse response) {
++ public GS4QueryEvent(final QueryType queryType, final InetAddress querierAddress, final QueryResponse response) {
+ super(true); // should always be called async
+ this.queryType = queryType;
+ this.querierAddress = querierAddress;
@@ -54,7 +55,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return query type
+ */
-+ @NotNull
+ public QueryType getQueryType() {
+ return this.queryType;
+ }
@@ -64,7 +64,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return querier address
+ */
-+ @NotNull
+ public InetAddress getQuerierAddress() {
+ return this.querierAddress;
+ }
@@ -74,7 +73,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return query response
+ */
-+ @NotNull
+ public QueryResponse getResponse() {
+ return this.response;
+ }
@@ -84,17 +82,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param response query response
+ */
-+ public void setResponse(@NotNull QueryResponse response) {
++ public void setResponse(final QueryResponse response) {
+ this.response = Preconditions.checkNotNull(response, "response");
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
@@ -115,7 +111,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ FULL
+ }
+
-+ public final static class QueryResponse {
++ public static final class QueryResponse {
+
+ private final String motd;
+ private final String gameVersion;
@@ -128,7 +124,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private final String serverVersion;
+ private final Collection
@@ -76,16 +75,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * The event may be invoked asynchronously or synchronously. Plugins should check
+ * {@link Event#isAsynchronous()} and handle accordingly.
+ */
++@NullMarked
+public class PlayerConnectionCloseEvent extends Event {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final UUID playerUniqueId;
-+ @NotNull private final String playerName;
-+ @NotNull private final InetAddress ipAddress;
++ private final UUID playerUniqueId;
++ private final String playerName;
++ private final InetAddress ipAddress;
+
+ @ApiStatus.Internal
-+ public PlayerConnectionCloseEvent(@NotNull final UUID playerUniqueId, @NotNull final String playerName, @NotNull final InetAddress ipAddress, final boolean async) {
++ public PlayerConnectionCloseEvent(final UUID playerUniqueId, final String playerName, final InetAddress ipAddress, final boolean async) {
+ super(async);
+ this.playerUniqueId = playerUniqueId;
+ this.playerName = playerName;
@@ -95,7 +95,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * Returns the {@code UUID} of the player disconnecting.
+ */
-+ @NotNull
+ public UUID getPlayerUniqueId() {
+ return this.playerUniqueId;
+ }
@@ -103,7 +102,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * Returns the name of the player disconnecting.
+ */
-+ @NotNull
+ public String getPlayerName() {
+ return this.playerName;
+ }
@@ -111,18 +109,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * Returns the player's IP address.
+ */
-+ @NotNull
+ public InetAddress getIpAddress() {
+ return this.ipAddress;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-PlayerShearBlockEvent.patch b/patches/api/Add-PlayerShearBlockEvent.patch
index aeb51b79b3..7e0edab036 100644
--- a/patches/api/Add-PlayerShearBlockEvent.patch
+++ b/patches/api/Add-PlayerShearBlockEvent.patch
@@ -12,6 +12,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@
+package io.papermc.paper.event.block;
+
++import java.util.List;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
@@ -20,9 +21,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+
-+import java.util.List;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when a player uses sheers on a block.
@@ -32,6 +31,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * Examples include shearing a pumpkin to turn it into a carved pumpkin or shearing a beehive to get honeycomb.
+ */
++@NullMarked
+public class PlayerShearBlockEvent extends PlayerEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -44,7 +44,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public PlayerShearBlockEvent(@NotNull Player player, @NotNull Block block, @NotNull ItemStack item, @NotNull EquipmentSlot hand, @NotNull List
+ * The event is fired prior to the newly created shulker, accessible via {@link #getEntity()}, being added to the world.
+ */
++@NullMarked
+public class ShulkerDuplicateEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -32,7 +33,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public ShulkerDuplicateEvent(@NotNull Shulker child, @NotNull Shulker parent) {
++ public ShulkerDuplicateEvent(final Shulker child, final Shulker parent) {
+ super(child);
+ this.parent = parent;
+ }
@@ -44,7 +45,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return the newly duplicated shulker.
+ */
+ @Override
-+ @NotNull
+ public Shulker getEntity() {
+ return (Shulker) super.getEntity();
+ }
@@ -55,7 +55,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the previously existing shulker which duplicated.
+ */
-+ @NotNull
+ public Shulker getParent() {
+ return this.parent;
+ }
@@ -66,17 +65,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-TameableDeathMessageEvent.patch b/patches/api/Add-TameableDeathMessageEvent.patch
index 69049c2934..a696f088f1 100644
--- a/patches/api/Add-TameableDeathMessageEvent.patch
+++ b/patches/api/Add-TameableDeathMessageEvent.patch
@@ -18,11 +18,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when a {@link Tameable} dies and sends a death message.
+ */
++@NullMarked
+public class TameableDeathMessageEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -31,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public TameableDeathMessageEvent(@NotNull Tameable tameable, @NotNull Component deathMessage) {
++ public TameableDeathMessageEvent(final Tameable tameable, final Component deathMessage) {
+ super(tameable);
+ this.deathMessage = deathMessage;
+ }
@@ -41,7 +42,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param deathMessage Death message to appear
+ */
-+ public void deathMessage(@NotNull Component deathMessage) {
++ public void deathMessage(final Component deathMessage) {
+ this.deathMessage = deathMessage;
+ }
+
@@ -50,12 +51,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Death message to appear
+ */
-+ @NotNull
+ public Component deathMessage() {
+ return this.deathMessage;
+ }
+
-+ @NotNull
+ @Override
+ public Tameable getEntity() {
+ return (Tameable) super.getEntity();
@@ -67,17 +66,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-TargetHitEvent-API.patch b/patches/api/Add-TargetHitEvent-API.patch
index 9ddfd8c4d9..fb7d945401 100644
--- a/patches/api/Add-TargetHitEvent-API.patch
+++ b/patches/api/Add-TargetHitEvent-API.patch
@@ -19,8 +19,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.ProjectileHitEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Range;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when a Target Block is hit by a projectile.
@@ -29,6 +29,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * and in the case that the shooter is a player, will stop them from receiving
+ * advancement criteria.
+ */
++@NullMarked
+public class TargetHitEvent extends ProjectileHitEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -36,7 +37,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private int signalStrength;
+
+ @ApiStatus.Internal
-+ public TargetHitEvent(@NotNull Projectile projectile, @NotNull Block block, @NotNull BlockFace blockFace, int signalStrength) {
++ public TargetHitEvent(final Projectile projectile, final Block block, final BlockFace blockFace, final int signalStrength) {
+ super(projectile, null, block, blockFace);
+ this.signalStrength = signalStrength;
+ }
@@ -55,18 +56,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param signalStrength the strength of the redstone signal to be emitted
+ */
-+ public void setSignalStrength(@Range(from = 0, to = 15) int signalStrength) {
++ public void setSignalStrength(final @Range(from = 0, to = 15) int signalStrength) {
+ Preconditions.checkArgument(signalStrength >= 0 && signalStrength <= 15, "Signal strength out of range (%s), must be in range [0,15]", signalStrength);
+ this.signalStrength = signalStrength;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-ThrownEggHatchEvent.patch b/patches/api/Add-ThrownEggHatchEvent.patch
index 52e8097808..4398dfba7e 100644
--- a/patches/api/Add-ThrownEggHatchEvent.patch
+++ b/patches/api/Add-ThrownEggHatchEvent.patch
@@ -20,13 +20,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when a thrown egg might hatch.
+ *
+ * This event fires for all thrown eggs that may hatch, players, dispensers, etc.
+ */
++@NullMarked
+public class ThrownEggHatchEvent extends Event {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -37,7 +38,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private EntityType hatchType;
+
+ @ApiStatus.Internal
-+ public ThrownEggHatchEvent(@NotNull final Egg egg, final boolean hatching, final byte numHatches, @NotNull final EntityType hatchingType) {
++ public ThrownEggHatchEvent(final Egg egg, final boolean hatching, final byte numHatches, final EntityType hatchingType) {
+ this.egg = egg;
+ this.hatching = hatching;
+ this.numHatches = numHatches;
@@ -49,7 +50,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the egg involved in this event
+ */
-+ @NotNull
+ public Egg getEgg() {
+ return this.egg;
+ }
@@ -68,9 +68,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * Sets whether the egg will hatch or not.
+ *
+ * @param hatching {@code true} if you want the egg to hatch, {@code false} if you want it
-+ * not to
++ * not to
+ */
-+ public void setHatching(boolean hatching) {
++ public void setHatching(final boolean hatching) {
+ this.hatching = hatching;
+ }
+
@@ -79,7 +79,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The type of the mob being hatched by the egg
+ */
-+ @NotNull
+ public EntityType getHatchingType() {
+ return this.hatchType;
+ }
@@ -89,13 +88,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param hatchType The type of the mob being hatched by the egg
+ */
-+ public void setHatchingType(@NotNull EntityType hatchType) {
++ public void setHatchingType(final EntityType hatchType) {
+ Preconditions.checkArgument(hatchType.isSpawnable(), "Can't spawn that entity type from an egg!");
+ this.hatchType = hatchType;
+ }
+
+ /**
-+ * Get the number of mob hatches from the egg. By default the number will
++ * Get the number of mob hatches from the egg. By default, the number will
+ * be the number the server would've done
+ *
+ * If the event is cancelled, the warden's anger level will not change.
+ */
++@NullMarked
+public class WardenAngerChangeEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -40,7 +41,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public WardenAngerChangeEvent(@NotNull final Warden warden, @NotNull final Entity target, final int oldAnger, final int newAnger) {
++ public WardenAngerChangeEvent(final Warden warden, final Entity target, final int oldAnger, final int newAnger) {
+ super(warden);
+ this.target = target;
+ this.oldAnger = oldAnger;
@@ -52,7 +53,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return triggering entity
+ */
-+ @NotNull
+ public Entity getTarget() {
+ return this.target;
+ }
@@ -63,8 +63,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return old anger level
+ * @see Warden#getAnger(Entity)
+ */
-+ @Range(from = 0, to = 150)
-+ public int getOldAnger() {
++ public @Range(from = 0, to = 150) int getOldAnger() {
+ return this.oldAnger;
+ }
+
@@ -74,8 +73,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return new anger level
+ * @see Warden#getAnger(Entity)
+ */
-+ @Range(from = 0, to = 150)
-+ public int getNewAnger() {
++ public @Range(from = 0, to = 150) int getNewAnger() {
+ return this.newAnger;
+ }
+
@@ -85,15 +83,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * The anger of a warden is capped at 150.
+ *
+ * @param newAnger the new anger level, max 150
-+ * @see Warden#setAnger(Entity, int)
+ * @throws IllegalArgumentException if newAnger is greater than 150
++ * @see Warden#setAnger(Entity, int)
+ */
-+ public void setNewAnger(@Range(from = 0, to = 150) int newAnger) {
++ public void setNewAnger(final @Range(from = 0, to = 150) int newAnger) {
+ Preconditions.checkArgument(newAnger <= 150, "newAnger must not be greater than 150");
+ this.newAnger = newAnger;
+ }
+
-+ @NotNull
+ @Override
+ public Warden getEntity() {
+ return (Warden) super.getEntity();
@@ -105,17 +102,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-WaterBottleSplashEvent.patch b/patches/api/Add-WaterBottleSplashEvent.patch
index 6c2b8843d7..040bcd9e53 100644
--- a/patches/api/Add-WaterBottleSplashEvent.patch
+++ b/patches/api/Add-WaterBottleSplashEvent.patch
@@ -23,28 +23,29 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.entity.ThrownPotion;
+import org.bukkit.event.entity.PotionSplashEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.Unmodifiable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Called when a splash water potion "splashes" and affects
+ * different entities in different ways.
+ */
++@NullMarked
+public class WaterBottleSplashEvent extends PotionSplashEvent {
+
-+ private final @NotNull Set WARNING: TAMPERING WITH THIS EVENT CAN BE DANGEROUS
+ * Intended for use to re-register custom recipes, advancements that may be lost during a reload like this.
+ */
++@NullMarked
+public class ServerResourcesReloadedEvent extends ServerEvent {
+
+ public static final HandlerList HANDLER_LIST = new HandlerList();
@@ -29,7 +30,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private final Cause cause;
+
+ @ApiStatus.Internal
-+ public ServerResourcesReloadedEvent(@NotNull Cause cause) {
++ public ServerResourcesReloadedEvent(final Cause cause) {
+ this.cause = cause;
+ }
+
@@ -38,17 +39,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the reload cause
+ */
-+ @NotNull
+ public Cause getCause() {
+ return this.cause;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
diff --git a/patches/api/AnvilDamageEvent.patch b/patches/api/AnvilDamageEvent.patch
index 24896322f5..8dcb163dd2 100644
--- a/patches/api/AnvilDamageEvent.patch
+++ b/patches/api/AnvilDamageEvent.patch
@@ -20,12 +20,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.inventory.AnvilInventory;
+import org.bukkit.inventory.InventoryView;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Called when an anvil is damaged from being used
+ */
++@NullMarked
+public class AnvilDamagedEvent extends InventoryEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -34,12 +35,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public AnvilDamagedEvent(@NotNull InventoryView inventory, @Nullable BlockData blockData) {
++ public AnvilDamagedEvent(final InventoryView inventory, final @Nullable BlockData blockData) {
+ super(inventory);
+ this.damageState = DamageState.getState(blockData);
+ }
+
-+ @NotNull
+ @Override
+ public AnvilInventory getInventory() {
+ return (AnvilInventory) super.getInventory();
@@ -50,7 +50,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Damage state
+ */
-+ @NotNull
+ public DamageState getDamageState() {
+ return this.damageState;
+ }
@@ -60,7 +59,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param damageState Damage state
+ */
-+ public void setDamageState(@NotNull DamageState damageState) {
++ public void setDamageState(final DamageState damageState) {
+ this.damageState = damageState;
+ }
+
@@ -78,7 +77,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param breaking {@code true} if breaking
+ */
-+ public void setBreaking(boolean breaking) {
++ public void setBreaking(final boolean breaking) {
+ if (breaking) {
+ this.damageState = DamageState.BROKEN;
+ } else if (this.damageState == DamageState.BROKEN) {
@@ -92,16 +91,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
@@ -117,7 +114,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+
+ private final Material material;
+
-+ DamageState(@NotNull Material material) {
++ DamageState(final Material material) {
+ this.material = material;
+ }
+
@@ -126,7 +123,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Material
+ */
-+ @NotNull
+ public Material getMaterial() {
+ return this.material;
+ }
@@ -138,8 +134,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return DamageState
+ * @throws IllegalArgumentException If non anvil block data is given
+ */
-+ @NotNull
-+ public static DamageState getState(@Nullable BlockData blockData) {
++ public static DamageState getState(final @Nullable BlockData blockData) {
+ return blockData == null ? BROKEN : getState(blockData.getMaterial());
+ }
+
@@ -150,12 +145,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return DamageState
+ * @throws IllegalArgumentException If non anvil material is given
+ */
-+ @NotNull
-+ public static DamageState getState(@Nullable Material material) {
++ public static DamageState getState(final @Nullable Material material) {
+ if (material == null) {
+ return BROKEN;
+ }
-+ for (DamageState state : values()) {
++ for (final DamageState state : values()) {
+ if (state.getMaterial() == material) {
+ return state;
+ }
diff --git a/patches/api/AsyncTabCompleteEvent.patch b/patches/api/AsyncTabCompleteEvent.patch
index 72e1f5992c..4ee92d170e 100644
--- a/patches/api/AsyncTabCompleteEvent.patch
+++ b/patches/api/AsyncTabCompleteEvent.patch
@@ -48,6 +48,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+
+import com.google.common.base.Preconditions;
+import io.papermc.paper.util.TransformingRandomAccessList;
++import java.util.ArrayList;
++import java.util.List;
++import java.util.Objects;
++import java.util.stream.Stream;
+import net.kyori.adventure.text.Component;
+import net.kyori.examination.Examinable;
+import net.kyori.examination.ExaminableProperty;
@@ -58,14 +62,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
-+
-+import java.util.ArrayList;
-+import java.util.List;
-+import java.util.Objects;
-+import java.util.stream.Stream;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Allows plugins to compute tab completion results asynchronously.
@@ -76,15 +75,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * Only 1 process will be allowed to provide completions, the Async Event, or the standard process.
+ */
++@NullMarked
+public class AsyncTabCompleteEvent extends Event implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final CommandSender sender;
-+ @NotNull private final String buffer;
++ private final CommandSender sender;
++ private final String buffer;
+ private final boolean isCommand;
-+ @Nullable
-+ private final Location location;
++ private final @Nullable Location location;
+ private final List
+ * Events such as leaves decaying, pistons retracting (where the block is moving), does NOT fire this event.
+ */
++@NullMarked
+public class BlockDestroyEvent extends BlockExpEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final BlockData newState;
++ private final BlockData newState;
+ private boolean willDrop;
+ private boolean playEffect = true;
+ private BlockData effectBlock;
@@ -48,7 +49,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public BlockDestroyEvent(@NotNull Block block, @NotNull BlockData newState, @NotNull BlockData effectBlock, int xp, boolean willDrop) {
++ public BlockDestroyEvent(final Block block, final BlockData newState, final BlockData effectBlock, final int xp, final boolean willDrop) {
+ super(block, xp);
+ this.newState = newState;
+ this.effectBlock = effectBlock;
@@ -60,7 +61,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return block break effect
+ */
-+ @NotNull
+ public BlockData getEffectBlock() {
+ return this.effectBlock;
+ }
@@ -72,14 +72,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param effectBlock block effect
+ */
-+ public void setEffectBlock(@NotNull BlockData effectBlock) {
++ public void setEffectBlock(final BlockData effectBlock) {
+ this.effectBlock = effectBlock;
+ }
+
+ /**
+ * @return The new state of this block (Air, or a Fluid type)
+ */
-+ public @NotNull BlockData getNewState() {
++ public BlockData getNewState() {
+ return this.newState.clone();
+ }
+
@@ -93,7 +93,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @param willDrop If the server is going to drop the block in question with this destroy event
+ */
-+ public void setWillDrop(boolean willDrop) {
++ public void setWillDrop(final boolean willDrop) {
+ this.willDrop = willDrop;
+ }
+
@@ -107,7 +107,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @param playEffect If the server should play the sound effect for this destruction
+ */
-+ public void setPlayEffect(boolean playEffect) {
++ public void setPlayEffect(final boolean playEffect) {
+ this.playEffect = playEffect;
+ }
+
@@ -123,17 +123,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * If the event is cancelled, the block will remain in its previous state.
+ */
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Brigadier-based-command-API.patch b/patches/api/Brigadier-based-command-API.patch
index eee696886b..0e916dfd38 100644
--- a/patches/api/Brigadier-based-command-API.patch
+++ b/patches/api/Brigadier-based-command-API.patch
@@ -115,7 +115,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired any time a Brigadier RootCommandNode is generated for a player to inform the client of commands.
@@ -138,6 +138,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * This is a draft/experimental API and is subject to change.
-+ * If this escape normally would of resulted in damage avoidance such as indirect,
++ * If this escape normally had resulted in damage avoidance such as indirect,
+ * the enderman will now take damage.
+ */
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Entity-AddTo-RemoveFrom-World-Events.patch b/patches/api/Entity-AddTo-RemoveFrom-World-Events.patch
index 4b61acb2f1..da68ef3129 100644
--- a/patches/api/Entity-AddTo-RemoveFrom-World-Events.patch
+++ b/patches/api/Entity-AddTo-RemoveFrom-World-Events.patch
@@ -18,21 +18,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired any time an entity is being added to the world for any reason (including a chunk loading).
+ *
+ * Not to be confused with {@link CreatureSpawnEvent}
+ */
++@NullMarked
+public class EntityAddToWorldEvent extends EntityEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final World world;
++ private final World world;
+
+ @ApiStatus.Internal
-+ public EntityAddToWorldEvent(@NotNull Entity entity, @NotNull World world) {
++ public EntityAddToWorldEvent(final Entity entity, final World world) {
+ super(entity);
+ this.world = world;
+ }
@@ -40,17 +41,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The world that the entity is being added to
+ */
-+ @NotNull
+ public World getWorld() {
+ return this.world;
+ }
+
-+ @NotNull
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
@@ -68,20 +66,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired any time an entity is being removed from a world for any reason (including a chunk unloading).
+ * Note: The entity is updated prior to this event being called, as such, the entity's world may not be equal to {@link #getWorld()}.
+ */
++@NullMarked
+public class EntityRemoveFromWorldEvent extends EntityEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final World world;
++ private final World world;
+
+ @ApiStatus.Internal
-+ public EntityRemoveFromWorldEvent(@NotNull Entity entity, @NotNull World world) {
++ public EntityRemoveFromWorldEvent(final Entity entity, final World world) {
+ super(entity);
+ this.world = world;
+ }
@@ -89,17 +88,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The world that the entity is being removed from
+ */
-+ @NotNull
+ public World getWorld() {
+ return this.world;
+ }
+
-+ @NotNull
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Entity-Jump-API.patch b/patches/api/Entity-Jump-API.patch
index 9f9850fcc3..98f335e051 100644
--- a/patches/api/Entity-Jump-API.patch
+++ b/patches/api/Entity-Jump-API.patch
@@ -17,13 +17,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when an entity jumps
+ *
+ * Cancelling the event will stop the entity from jumping
+ */
++@NullMarked
+public class EntityJumpEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -31,11 +32,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityJumpEvent(@NotNull LivingEntity entity) {
++ public EntityJumpEvent(final LivingEntity entity) {
+ super(entity);
+ }
+
-+ @NotNull
+ @Override
+ public LivingEntity getEntity() {
+ return (LivingEntity) super.getEntity();
@@ -45,17 +45,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ return this.cancelled;
+ }
+
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/EntityMoveEvent.patch b/patches/api/EntityMoveEvent.patch
index 93a4bcba4e..837a36b522 100644
--- a/patches/api/EntityMoveEvent.patch
+++ b/patches/api/EntityMoveEvent.patch
@@ -20,13 +20,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.entity.EntityEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Holds information for living entity movement events
+ *
+ * Does not fire for players; use {@link PlayerMoveEvent} for player movement.
+ */
++@NullMarked
+public class EntityMoveEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -37,14 +38,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityMoveEvent(@NotNull LivingEntity entity, @NotNull Location from, @NotNull Location to) {
++ public EntityMoveEvent(final LivingEntity entity, final Location from, final Location to) {
+ super(entity);
+ this.from = from;
+ this.to = to;
+ }
+
+ @Override
-+ @NotNull
+ public LivingEntity getEntity() {
+ return (LivingEntity) super.getEntity();
+ }
@@ -54,7 +54,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Location the entity moved from
+ */
-+ @NotNull
+ public Location getFrom() {
+ return this.from;
+ }
@@ -64,8 +63,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param from New location to mark as the entity's previous location
+ */
-+ public void setFrom(@NotNull Location from) {
-+ validateLocation(from);
++ public void setFrom(final Location from) {
++ this.validateLocation(from);
+ this.from = from;
+ }
+
@@ -74,7 +73,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Location the entity moved to
+ */
-+ @NotNull
+ public Location getTo() {
+ return this.to;
+ }
@@ -84,8 +82,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param to New Location this entity will move to
+ */
-+ public void setTo(@NotNull Location to) {
-+ validateLocation(to);
++ public void setTo(final Location to) {
++ this.validateLocation(to);
+ this.to = to;
+ }
+
@@ -95,7 +93,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return whether the entity has changed position or not
+ */
+ public boolean hasChangedPosition() {
-+ return hasExplicitlyChangedPosition() || !this.from.getWorld().equals(this.to.getWorld());
++ return this.hasExplicitlyChangedPosition() || !this.from.getWorld().equals(this.to.getWorld());
+ }
+
+ /**
@@ -113,7 +111,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return whether the entity has moved to a new block or not
+ */
+ public boolean hasChangedBlock() {
-+ return hasExplicitlyChangedBlock() || !from.getWorld().equals(to.getWorld());
++ return this.hasExplicitlyChangedBlock() || !this.from.getWorld().equals(this.to.getWorld());
+ }
+
+ /**
@@ -134,7 +132,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ return this.from.getPitch() != this.to.getPitch() || this.from.getYaw() != this.to.getYaw();
+ }
+
-+ private void validateLocation(@NotNull Location loc) {
++ private void validateLocation(final Location loc) {
+ Preconditions.checkArgument(loc != null, "Cannot use null location!");
+ Preconditions.checkArgument(loc.getWorld() != null, "Cannot use null location with null world!");
+ }
@@ -145,17 +143,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @Override
-+ @NotNull
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/EntityPathfindEvent.patch b/patches/api/EntityPathfindEvent.patch
index bc48f8deb6..5c904661c2 100644
--- a/patches/api/EntityPathfindEvent.patch
+++ b/patches/api/EntityPathfindEvent.patch
@@ -19,8 +19,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Fired when an Entity decides to start moving towards a location.
@@ -28,16 +28,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * This event does not fire for the entities actual movement. Only when it
+ * is choosing to start moving to a location.
+ */
++@NullMarked
+public class EntityPathfindEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @Nullable private final Entity targetEntity;
-+ @NotNull private final Location location;
++ private final @Nullable Entity targetEntity;
++ private final Location location;
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityPathfindEvent(@NotNull Entity entity, @NotNull Location location, @Nullable Entity targetEntity) {
++ public EntityPathfindEvent(final Entity entity, final Location location, final @Nullable Entity targetEntity) {
+ super(entity);
+ this.targetEntity = targetEntity;
+ this.location = location;
@@ -48,7 +49,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The Entity that is pathfinding.
+ */
-+ @NotNull
+ public Entity getEntity() {
+ return this.entity;
+ }
@@ -56,12 +56,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * If the Entity is trying to pathfind to an entity, this is the entity in relation.
+ *
+ * See {@link #setResult(Result)} to change behavior
+ */
++@NullMarked
+public class BlockLockCheckEvent extends BlockEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private final Player player;
-+ private Component lockedMessage;
-+ private Sound lockedSound;
-+ private ItemStack itemStack;
++ private @Nullable Component lockedMessage;
++ private @Nullable Sound lockedSound;
++ private @Nullable ItemStack itemStack;
+ private Result result = Result.DEFAULT;
+
+ @ApiStatus.Internal
-+ public BlockLockCheckEvent(final @NotNull Block block, final @NotNull Player player, final @NotNull Component lockedMessage, final @NotNull Sound lockedSound) {
++ public BlockLockCheckEvent(final Block block, final Player player, final Component lockedMessage, final Sound lockedSound) {
+ super(block);
+ this.player = player;
+ this.lockedMessage = lockedMessage;
@@ -74,7 +74,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the snapshot block state.
+ */
-+ public @NotNull LockableTileState getBlockState() {
++ public LockableTileState getBlockState() {
+ final BlockState blockState = this.getBlock().getState();
+ Preconditions.checkState(blockState instanceof LockableTileState, "Block state of lock-checked block is no longer a lockable tile state!");
+ return (LockableTileState) blockState;
@@ -85,7 +85,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the player
+ */
-+ public @NotNull Player getPlayer() {
++ public Player getPlayer() {
+ return this.player;
+ }
+
@@ -98,7 +98,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return the item being used as the key item
+ * @see #isUsingCustomKeyItemStack()
+ */
-+ public @NotNull ItemStack getKeyItem() {
++ public ItemStack getKeyItem() {
+ return Objects.requireNonNullElseGet(this.itemStack, this.player.getInventory()::getItemInMainHand);
+ }
+
@@ -108,7 +108,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @param stack the stack to use as a key
+ * @see #resetKeyItem() to clear a custom key item
+ */
-+ public void setKeyItem(@NotNull ItemStack stack) {
++ public void setKeyItem(final ItemStack stack) {
+ Preconditions.checkArgument(stack != null, "stack cannot be null");
+ this.itemStack = stack;
+ }
@@ -135,7 +135,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return the result
+ * @see #setResult(Result)
+ */
-+ public @NotNull Result getResult() {
++ public Result getResult() {
+ return this.result;
+ }
+
@@ -148,7 +148,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param result the result of this event
+ */
-+ public void setResult(@NotNull Result result) {
++ public void setResult(final Result result) {
+ this.result = result;
+ }
+
@@ -157,9 +157,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * the locked message and locked sound.
+ *
+ * @param lockedMessage the message to show if locked (or {@code null} for none)
-+ * @param lockedSound the sound to play if locked (or {@code null} for none)
++ * @param lockedSound the sound to play if locked (or {@code null} for none)
+ */
-+ public void denyWithMessageAndSound(@Nullable Component lockedMessage, @Nullable Sound lockedSound) {
++ public void denyWithMessageAndSound(final @Nullable Component lockedMessage, final @Nullable Sound lockedSound) {
+ this.result = Result.DENY;
+ this.lockedMessage = lockedMessage;
+ this.lockedSound = lockedSound;
@@ -181,7 +181,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param lockedMessage the locked message (or {@code null} for none)
+ */
-+ public void setLockedMessage(@Nullable Component lockedMessage) {
++ public void setLockedMessage(final @Nullable Component lockedMessage) {
+ this.lockedMessage = lockedMessage;
+ }
+
@@ -201,16 +201,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param lockedSound the locked sound (or {@code null} for none)
+ */
-+ public void setLockedSound(@Nullable Sound lockedSound) {
++ public void setLockedSound(final @Nullable Sound lockedSound) {
+ this.lockedSound = lockedSound;
+ }
+
+ @Override
-+ public @NotNull HandlerList getHandlers() {
++ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ public static @NotNull HandlerList getHandlerList() {
++ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/patches/api/Add-BlockPreDispenseEvent.patch b/patches/api/Add-BlockPreDispenseEvent.patch
index 9991c2c31e..8f9677c2fe 100644
--- a/patches/api/Add-BlockPreDispenseEvent.patch
+++ b/patches/api/Add-BlockPreDispenseEvent.patch
@@ -18,8 +18,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.block.BlockEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
++@NullMarked
+public class BlockPreDispenseEvent extends BlockEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -30,7 +31,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public BlockPreDispenseEvent(@NotNull Block block, @NotNull ItemStack itemStack, int slot) {
++ public BlockPreDispenseEvent(final Block block, final ItemStack itemStack, final int slot) {
+ super(block);
+ this.itemStack = itemStack;
+ this.slot = slot;
@@ -41,7 +42,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The item to be dispensed
+ */
-+ @NotNull
+ public ItemStack getItemStack() {
+ return this.itemStack;
+ }
@@ -61,16 +61,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-CompostItemEvent-and-EntityCompostItemEvent.patch b/patches/api/Add-CompostItemEvent-and-EntityCompostItemEvent.patch
index 0a745c8a19..912fbf2570 100644
--- a/patches/api/Add-CompostItemEvent-and-EntityCompostItemEvent.patch
+++ b/patches/api/Add-CompostItemEvent-and-EntityCompostItemEvent.patch
@@ -18,12 +18,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when an item is about to be composted by a hopper.
+ * To prevent hoppers from moving items into composters, cancel the {@link InventoryMoveItemEvent}.
+ */
++@NullMarked
+public class CompostItemEvent extends BlockEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -32,7 +33,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean willRaiseLevel;
+
+ @ApiStatus.Internal
-+ public CompostItemEvent(@NotNull Block composter, @NotNull ItemStack item, boolean willRaiseLevel) {
++ public CompostItemEvent(final Block composter, final ItemStack item, final boolean willRaiseLevel) {
+ super(composter);
+ this.item = item;
+ this.willRaiseLevel = willRaiseLevel;
@@ -43,7 +44,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the item
+ */
-+ @NotNull
+ public ItemStack getItem() {
+ return this.item;
+ }
@@ -62,16 +62,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param willRaiseLevel {@code true} if the composter should rise a level
+ */
-+ public void setWillRaiseLevel(boolean willRaiseLevel) {
++ public void setWillRaiseLevel(final boolean willRaiseLevel) {
+ this.willRaiseLevel = willRaiseLevel;
+ }
+
+ @Override
-+ public @NotNull HandlerList getHandlers() {
++ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
@@ -91,18 +90,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.Cancellable;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when an item is about to be composted by an entity.
+ */
++@NullMarked
+public class EntityCompostItemEvent extends CompostItemEvent implements Cancellable {
+
+ private final Entity entity;
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityCompostItemEvent(@NotNull Entity entity, @NotNull Block composter, @NotNull ItemStack item, boolean willRaiseLevel) {
++ public EntityCompostItemEvent(final Entity entity, final Block composter, final ItemStack item, final boolean willRaiseLevel) {
+ super(composter, item, willRaiseLevel);
+ this.entity = entity;
+ }
@@ -112,7 +112,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the entity that composted an item.
+ */
-+ @NotNull
+ public Entity getEntity() {
+ return this.entity;
+ }
@@ -123,7 +122,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
diff --git a/patches/api/Add-ElderGuardianAppearanceEvent.patch b/patches/api/Add-ElderGuardianAppearanceEvent.patch
index 32b03d0ae1..e6c5445e28 100644
--- a/patches/api/Add-ElderGuardianAppearanceEvent.patch
+++ b/patches/api/Add-ElderGuardianAppearanceEvent.patch
@@ -18,11 +18,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Is called when an {@link ElderGuardian} appears in front of a {@link Player}.
+ */
++@NullMarked
+public class ElderGuardianAppearanceEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -31,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public ElderGuardianAppearanceEvent(@NotNull ElderGuardian guardian, @NotNull Player affectedPlayer) {
++ public ElderGuardianAppearanceEvent(final ElderGuardian guardian, final Player affectedPlayer) {
+ super(guardian);
+ this.affectedPlayer = affectedPlayer;
+ }
@@ -41,7 +42,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Player affected by the appearance
+ */
-+ @NotNull
+ public Player getAffectedPlayer() {
+ return this.affectedPlayer;
+ }
@@ -51,7 +51,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The elder guardian
+ */
-+ @NotNull
+ public ElderGuardian getEntity() {
+ return (ElderGuardian) super.getEntity();
+ }
@@ -62,17 +61,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch b/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch
index a67b22d742..82546010c5 100644
--- a/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch
+++ b/patches/api/Add-EntityDyeEvent-and-CollarColorable-interface.patch
@@ -53,24 +53,25 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Called when an entity is dyed. Currently, this is called for {@link Sheep}
+ * being dyed, and {@link Wolf}/{@link Cat} collars being dyed.
+ */
++@NullMarked
+public class EntityDyeEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ private final Player player;
++ private final @Nullable Player player;
+ private DyeColor dyeColor;
+
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public EntityDyeEvent(@NotNull Entity entity, @NotNull DyeColor dyeColor, @Nullable Player player) {
++ public EntityDyeEvent(final Entity entity, final DyeColor dyeColor, final @Nullable Player player) {
+ super(entity);
+ this.dyeColor = dyeColor;
+ this.player = player;
@@ -81,7 +82,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the DyeColor the entity is being dyed
+ */
-+ public @NotNull DyeColor getColor() {
++ public DyeColor getColor() {
+ return this.dyeColor;
+ }
+
@@ -90,7 +91,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param dyeColor the DyeColor the entity will be dyed
+ */
-+ public void setColor(@NotNull DyeColor dyeColor) {
++ public void setColor(final DyeColor dyeColor) {
+ this.dyeColor = dyeColor;
+ }
+
@@ -109,16 +110,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @Override
-+ public @NotNull HandlerList getHandlers() {
++ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ public static @NotNull HandlerList getHandlerList() {
++ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/patches/api/Add-EntityFertilizeEggEvent.patch b/patches/api/Add-EntityFertilizeEggEvent.patch
index 18c8a8b34e..6b1faa8b1a 100644
--- a/patches/api/Add-EntityFertilizeEggEvent.patch
+++ b/patches/api/Add-EntityFertilizeEggEvent.patch
@@ -21,8 +21,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.entity.EntityEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Called when two entities mate and the mating process results in a fertilization.
@@ -35,23 +35,24 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ *
extends PlayerEvent {
+
+ private static final HandlerList handlers = new HandlerList();
@@ -145,7 +146,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private final boolean hasFiredAsync;
+
+ @ApiStatus.Internal
-+ public AsyncPlayerSendCommandsEvent(@NotNull Player player, @NotNull RootCommandNode node, boolean hasFiredAsync) {
++ public AsyncPlayerSendCommandsEvent(final Player player, final RootCommandNode node, final boolean hasFiredAsync) {
+ super(player, !Bukkit.isPrimaryThread());
+ this.node = node;
+ this.hasFiredAsync = hasFiredAsync;
@@ -156,8 +157,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the root command node
+ */
-+ public @NotNull RootCommandNode getCommandNode() {
-+ return node;
++ public RootCommandNode getCommandNode() {
++ return this.node;
+ }
+
+ /**
@@ -166,15 +167,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @return whether this event has already fired asynchronously
+ */
+ public boolean hasFiredAsync() {
-+ return hasFiredAsync;
++ return this.hasFiredAsync;
+ }
+
-+ @NotNull
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
@@ -194,13 +193,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when sending {@link Suggestions} to the client. Will be called asynchronously if a plugin
+ * marks the {@link com.destroystokyo.paper.event.server.AsyncTabCompleteEvent} event handled asynchronously,
+ * otherwise called synchronously.
+ */
++@NullMarked
+public class AsyncPlayerSendSuggestionsEvent extends PlayerEvent implements Cancellable {
+
+ private static final HandlerList handlers = new HandlerList();
@@ -210,7 +210,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private final String buffer;
+
+ @ApiStatus.Internal
-+ public AsyncPlayerSendSuggestionsEvent(@NotNull Player player, @NotNull Suggestions suggestions, @NotNull String buffer) {
++ public AsyncPlayerSendSuggestionsEvent(final Player player, final Suggestions suggestions, final String buffer) {
+ super(player, !Bukkit.isPrimaryThread());
+ this.suggestions = suggestions;
+ this.buffer = buffer;
@@ -221,8 +221,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the input buffer
+ */
-+ public @NotNull String getBuffer() {
-+ return buffer;
++ public String getBuffer() {
++ return this.buffer;
+ }
+
+ /**
@@ -230,8 +230,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the suggestions
+ */
-+ public @NotNull Suggestions getSuggestions() {
-+ return suggestions;
++ public Suggestions getSuggestions() {
++ return this.suggestions;
+ }
+
+ /**
@@ -239,7 +239,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param suggestions suggestions
+ */
-+ public void setSuggestions(@NotNull Suggestions suggestions) {
++ public void setSuggestions(final Suggestions suggestions) {
+ this.suggestions = suggestions;
+ }
+
@@ -256,16 +256,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * {@inheritDoc}
+ */
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
diff --git a/patches/api/Build-system-changes.patch b/patches/api/Build-system-changes.patch
index ff417ed46c..415a144846 100644
--- a/patches/api/Build-system-changes.patch
+++ b/patches/api/Build-system-changes.patch
@@ -32,6 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ compileOnlyApi(checkerQual)
+ testCompileOnly(checkerQual)
+ // Paper end
++ api("org.jspecify:jspecify:1.0.0") // Paper - add jspecify
+
testImplementation("org.apache.commons:commons-lang3:3.12.0")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
diff --git a/patches/api/EnderDragon-Events.patch b/patches/api/EnderDragon-Events.patch
index 5ee4c46487..d6224a8034 100644
--- a/patches/api/EnderDragon-Events.patch
+++ b/patches/api/EnderDragon-Events.patch
@@ -12,30 +12,30 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@
+package com.destroystokyo.paper.event.entity;
+
++import java.util.Collection;
+import org.bukkit.entity.AreaEffectCloud;
+import org.bukkit.entity.DragonFireball;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
-+
-+import java.util.Collection;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired when a DragonFireball collides with a block/entity and spawns an AreaEffectCloud
+ */
++@NullMarked
+public class EnderDragonFireballHitEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final Collection
-+ * Otherwise this will return {@code null}.
++ * Otherwise, this will return {@code null}.
+ *
+ * @return The entity target or {@code null}
+ */
-+ @Nullable
-+ public Entity getTargetEntity() {
++ public @Nullable Entity getTargetEntity() {
+ return this.targetEntity;
+ }
+
@@ -72,7 +71,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return Location of where the entity is trying to pathfind to.
+ */
-+ @NotNull
+ public Location getLoc() {
+ return this.location.clone();
+ }
@@ -83,17 +81,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/ExperienceOrb-merging-stacking-API.patch b/patches/api/ExperienceOrb-merging-stacking-API.patch
index d3de8e8496..307668e18d 100644
--- a/patches/api/ExperienceOrb-merging-stacking-API.patch
+++ b/patches/api/ExperienceOrb-merging-stacking-API.patch
@@ -46,22 +46,23 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired anytime the server is about to merge 2 experience orbs into one
+ */
++@NullMarked
+public class ExperienceOrbMergeEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final ExperienceOrb mergeTarget;
-+ @NotNull private final ExperienceOrb mergeSource;
++ private final ExperienceOrb mergeTarget;
++ private final ExperienceOrb mergeSource;
+
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public ExperienceOrbMergeEvent(@NotNull ExperienceOrb mergeTarget, @NotNull ExperienceOrb mergeSource) {
++ public ExperienceOrbMergeEvent(final ExperienceOrb mergeTarget, final ExperienceOrb mergeSource) {
+ super(mergeTarget);
+ this.mergeTarget = mergeTarget;
+ this.mergeSource = mergeSource;
@@ -70,7 +71,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The orb that will absorb the other experience orb
+ */
-+ @NotNull
+ public ExperienceOrb getMergeTarget() {
+ return this.mergeTarget;
+ }
@@ -78,7 +78,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The orb that is subject to being removed and merged into the target orb
+ */
-+ @NotNull
+ public ExperienceOrb getMergeSource() {
+ return this.mergeSource;
+ }
@@ -92,17 +91,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @param cancel {@code true} if you wish to cancel this event, and prevent the orbs from merging
+ */
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/Introduce-beacon-activation-deactivation-events.patch b/patches/api/Introduce-beacon-activation-deactivation-events.patch
index 9024ef0525..b5117f60b7 100644
--- a/patches/api/Introduce-beacon-activation-deactivation-events.patch
+++ b/patches/api/Introduce-beacon-activation-deactivation-events.patch
@@ -17,18 +17,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.block.BlockEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called when a beacon is activated.
+ * Activation occurs when the beacon beam becomes visible.
+ */
++@NullMarked
+public class BeaconActivatedEvent extends BlockEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ @ApiStatus.Internal
-+ public BeaconActivatedEvent(@NotNull Block block) {
++ public BeaconActivatedEvent(final Block block) {
+ super(block);
+ }
+
@@ -37,18 +38,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return the beacon that was activated.
+ */
-+ @NotNull
+ public Beacon getBeacon() {
+ return (Beacon) this.block.getState();
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
@@ -67,18 +65,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.block.BlockEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Called when a beacon is deactivated, either because its base block(s) or itself were destroyed.
+ */
++@NullMarked
+public class BeaconDeactivatedEvent extends BlockEvent {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ @ApiStatus.Internal
-+ public BeaconDeactivatedEvent(@NotNull Block block) {
++ public BeaconDeactivatedEvent(final Block block) {
+ super(block);
+ }
+
@@ -89,18 +88,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @return The beacon that got deactivated, or {@code null} if it does not exist.
+ */
-+ @Nullable
-+ public Beacon getBeacon() {
++ public @Nullable Beacon getBeacon() {
+ return this.block.getType() == Material.BEACON ? (Beacon) this.block.getState() : null;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/PlayerNaturallySpawnCreaturesEvent.patch b/patches/api/PlayerNaturallySpawnCreaturesEvent.patch
index 9f9ac299bb..719e81941d 100644
--- a/patches/api/PlayerNaturallySpawnCreaturesEvent.patch
+++ b/patches/api/PlayerNaturallySpawnCreaturesEvent.patch
@@ -21,11 +21,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Fired when the server is calculating what chunks to try to spawn monsters in every Monster Spawn Tick event
+ */
++@NullMarked
+public class PlayerNaturallySpawnCreaturesEvent extends PlayerEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -34,7 +35,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public PlayerNaturallySpawnCreaturesEvent(@NotNull Player player, byte radius) {
++ public PlayerNaturallySpawnCreaturesEvent(final Player player, final byte radius) {
+ super(player);
+ this.radius = radius;
+ }
@@ -49,12 +50,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @param radius The radius of chunks around this player to be included in natural spawn selection
+ */
-+ public void setSpawnRadius(byte radius) {
++ public void setSpawnRadius(final byte radius) {
+ this.radius = radius;
+ }
+
+ /**
-+ * @return If this players chunks will be excluded from natural spawns
++ * @return If this player's chunks will be excluded from natural spawns
+ */
+ @Override
+ public boolean isCancelled() {
@@ -62,20 +63,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ /**
-+ * @param cancel {@code true} if you wish to cancel this event, and not include this players chunks for natural spawning
++ * @param cancel {@code true} if you wish to cancel this event, and not include this player's chunks for natural spawning
+ */
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/PreCreatureSpawnEvent.patch b/patches/api/PreCreatureSpawnEvent.patch
index 682486ea45..4dc3223c35 100644
--- a/patches/api/PreCreatureSpawnEvent.patch
+++ b/patches/api/PreCreatureSpawnEvent.patch
@@ -29,7 +29,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * WARNING: This event only fires for a limited number of cases, and not for every case that {@link CreatureSpawnEvent} does.
@@ -41,19 +41,20 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * Currently: NATURAL and SPAWNER based reasons.
+ * Also, Plugins that replace Entity Registrations with their own custom entities might not fire this event.
+ */
++@NullMarked
+public class PreCreatureSpawnEvent extends Event implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final Location location;
-+ @NotNull private final EntityType type;
-+ @NotNull private final CreatureSpawnEvent.SpawnReason reason;
++ private final Location location;
++ private final EntityType type;
++ private final CreatureSpawnEvent.SpawnReason reason;
+ private boolean shouldAbortSpawn;
+
+ private boolean cancelled;
+
+ @ApiStatus.Internal
-+ public PreCreatureSpawnEvent(@NotNull Location location, @NotNull EntityType type, @NotNull CreatureSpawnEvent.SpawnReason reason) {
++ public PreCreatureSpawnEvent(final Location location, final EntityType type, final CreatureSpawnEvent.SpawnReason reason) {
+ this.location = location;
+ this.type = type;
+ this.reason = reason;
@@ -62,7 +63,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The location this creature is being spawned at
+ */
-+ @NotNull
+ public Location getSpawnLocation() {
+ return this.location.clone();
+ }
@@ -70,7 +70,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The type of creature being spawned
+ */
-+ @NotNull
+ public EntityType getType() {
+ return this.type;
+ }
@@ -78,7 +77,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return Reason this creature is spawning (ie, NATURAL vs SPAWNER)
+ */
-+ @NotNull
+ public CreatureSpawnEvent.SpawnReason getReason() {
+ return this.reason;
+ }
@@ -96,7 +94,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ *
+ * @param shouldAbortSpawn Set if the spawn process should be aborted vs trying more attempts
+ */
-+ public void setShouldAbortSpawn(boolean shouldAbortSpawn) {
++ public void setShouldAbortSpawn(final boolean shouldAbortSpawn) {
+ this.shouldAbortSpawn = shouldAbortSpawn;
+ }
+
@@ -114,17 +112,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @param cancel {@code true} if you wish to cancel this event, and abort the spawn of this creature
+ */
+ @Override
-+ public void setCancelled(boolean cancel) {
++ public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
diff --git a/patches/api/PreSpawnerSpawnEvent.patch b/patches/api/PreSpawnerSpawnEvent.patch
index 8b692cb5c2..851de19a81 100644
--- a/patches/api/PreSpawnerSpawnEvent.patch
+++ b/patches/api/PreSpawnerSpawnEvent.patch
@@ -22,7 +22,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.entity.EntityType;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Called before an entity is spawned into a world by a spawner.
@@ -30,17 +30,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * This only includes the spawner's location and not the full BlockState snapshot for performance reasons.
+ * If you really need it you have to get the spawner yourself.
+ */
++@NullMarked
+public class PreSpawnerSpawnEvent extends PreCreatureSpawnEvent {
+
-+ @NotNull private final Location spawnerLocation;
++ private final Location spawnerLocation;
+
+ @ApiStatus.Internal
-+ public PreSpawnerSpawnEvent(@NotNull Location location, @NotNull EntityType type, @NotNull Location spawnerLocation) {
++ public PreSpawnerSpawnEvent(final Location location, final EntityType type, final Location spawnerLocation) {
+ super(location, type, CreatureSpawnEvent.SpawnReason.SPAWNER);
+ this.spawnerLocation = spawnerLocation;
+ }
+
-+ @NotNull
+ public Location getSpawnerLocation() {
+ return this.spawnerLocation.clone();
+ }
diff --git a/patches/api/Profile-Lookup-Events.patch b/patches/api/Profile-Lookup-Events.patch
index 2fb070da82..2dcb861407 100644
--- a/patches/api/Profile-Lookup-Events.patch
+++ b/patches/api/Profile-Lookup-Events.patch
@@ -18,9 +18,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
-+
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
++import org.jspecify.annotations.NullMarked;
+
+/**
+ * Allows a plugin to be notified anytime AFTER a Profile has been looked up from the Mojang API
@@ -29,14 +28,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * No guarantees are made about thread execution context for this event. If you need to know, check
+ * {@link Event#isAsynchronous()}
+ */
++@NullMarked
+public class LookupProfileEvent extends Event {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final PlayerProfile profile;
++ private final PlayerProfile profile;
+
+ @ApiStatus.Internal
-+ public LookupProfileEvent(@NotNull PlayerProfile profile) {
++ public LookupProfileEvent(final PlayerProfile profile) {
+ super(!Bukkit.isPrimaryThread());
+ this.profile = profile;
+ }
@@ -44,18 +44,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ /**
+ * @return The profile that was recently looked up. This profile can be mutated
+ */
-+ @NotNull
+ public PlayerProfile getPlayerProfile() {
+ return this.profile;
+ }
+
-+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
-+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
@@ -69,16 +66,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+package com.destroystokyo.paper.event.profile;
+
+import com.destroystokyo.paper.profile.ProfileProperty;
-+import org.bukkit.Bukkit;
-+import org.bukkit.event.Event;
-+import org.bukkit.event.HandlerList;
-+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
++import org.bukkit.Bukkit;
++import org.bukkit.event.Event;
++import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.ApiStatus;
-+import org.jetbrains.annotations.NotNull;
-+import org.jetbrains.annotations.Nullable;
++import org.jspecify.annotations.NullMarked;
++import org.jspecify.annotations.Nullable;
+
+/**
+ * Allows a plugin to intercept a Profile Lookup for a Profile by name
@@ -90,17 +86,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * No guarantees are made about thread execution context for this event. If you need to know, check
+ * {@link Event#isAsynchronous()}
+ */
++@NullMarked
+public class PreLookupProfileEvent extends Event {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
-+ @NotNull private final String name;
++ private final String name;
+
-+ private UUID uuid;
-+ @NotNull private Set