--- a/net/minecraft/stats/RecipeBookServer.java
+++ b/net/minecraft/stats/RecipeBookServer.java
@@ -20,6 +20,8 @@
 import net.minecraft.world.item.crafting.RecipeHolder;
 import org.slf4j.Logger;
 
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
 public class RecipeBookServer extends RecipeBook {
 
     public static final String RECIPE_BOOK_TAG = "recipeBook";
@@ -36,7 +38,7 @@
             RecipeHolder<?> recipeholder = (RecipeHolder) iterator.next();
             MinecraftKey minecraftkey = recipeholder.id();
 
-            if (!this.known.contains(minecraftkey) && !recipeholder.value().isSpecial()) {
+            if (!this.known.contains(minecraftkey) && !recipeholder.value().isSpecial() && CraftEventFactory.handlePlayerRecipeListUpdateEvent(entityplayer, minecraftkey)) { // CraftBukkit
                 this.add(minecraftkey);
                 this.addHighlight(minecraftkey);
                 list.add(minecraftkey);
@@ -73,6 +75,7 @@
     }
 
     private void sendRecipes(PacketPlayOutRecipes.Action packetplayoutrecipes_action, EntityPlayer entityplayer, List<MinecraftKey> list) {
+        if (entityplayer.connection == null) return; // SPIGOT-4478 during PlayerLoginEvent
         entityplayer.connection.send(new PacketPlayOutRecipes(packetplayoutrecipes_action, list, Collections.emptyList(), this.getBookSettings()));
     }
 
