--- a/net/minecraft/stats/RecipeBookServer.java
+++ b/net/minecraft/stats/RecipeBookServer.java
@@ -29,6 +29,8 @@
 import net.minecraft.world.item.crafting.display.RecipeDisplayId;
 import org.slf4j.Logger;
 
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
 public class RecipeBookServer extends RecipeBook {
 
     public static final String RECIPE_BOOK_TAG = "recipeBook";
@@ -72,7 +74,7 @@
             RecipeHolder<?> recipeholder = (RecipeHolder) iterator.next();
             ResourceKey<IRecipe<?>> resourcekey = recipeholder.id();
 
-            if (!this.known.contains(resourcekey) && !recipeholder.value().isSpecial()) {
+            if (!this.known.contains(resourcekey) && !recipeholder.value().isSpecial() && CraftEventFactory.handlePlayerRecipeListUpdateEvent(entityplayer, resourcekey.location())) { // CraftBukkit
                 this.add(resourcekey);
                 this.addHighlight(resourcekey);
                 this.displayResolver.displaysForRecipe(resourcekey, (recipedisplayentry) -> {
@@ -82,7 +84,7 @@
             }
         }
 
-        if (!list.isEmpty()) {
+        if (!list.isEmpty() && entityplayer.connection != null) { // SPIGOT-4478 during PlayerLoginEvent
             entityplayer.connection.send(new ClientboundRecipeBookAddPacket(list, false));
         }
 
@@ -105,7 +107,7 @@
             }
         }
 
-        if (!list.isEmpty()) {
+        if (!list.isEmpty() && entityplayer.connection != null) { // SPIGOT-4478 during PlayerLoginEvent
             entityplayer.connection.send(new ClientboundRecipeBookRemovePacket(list));
         }
 
