--- a/net/minecraft/stats/RecipeBookServer.java
+++ b/net/minecraft/stats/RecipeBookServer.java
@@ -26,6 +26,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";
@@ -68,7 +70,7 @@
         for (RecipeHolder<?> recipeholder : collection) {
             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) -> {
@@ -78,7 +80,7 @@
             }
         }
 
-        if (!list.isEmpty()) {
+        if (!list.isEmpty() && entityplayer.connection != null) { // SPIGOT-4478 during PlayerLoginEvent
             entityplayer.connection.send(new ClientboundRecipeBookAddPacket(list, false));
         }
 
@@ -99,7 +101,7 @@
             }
         }
 
-        if (!list.isEmpty()) {
+        if (!list.isEmpty() && entityplayer.connection != null) { // SPIGOT-4478 during PlayerLoginEvent
             entityplayer.connection.send(new ClientboundRecipeBookRemovePacket(list));
         }