--- a/net/minecraft/server/ItemWrittenBook.java
+++ b/net/minecraft/server/ItemWrittenBook.java
@@ -62,6 +62,23 @@
 
                     Object object;
 
+                    // CraftBukkit start
+                    // Some commands use the worldserver variable but we leave it full of null values,
+                    // so we must temporarily populate it with the world of the commandsender
+                    WorldServer[] prev = MinecraftServer.getServer().worldServer;
+                    MinecraftServer server = MinecraftServer.getServer();
+                    server.worldServer = new WorldServer[server.worlds.size()];
+                    server.worldServer[0] = (WorldServer) entityhuman.getWorld();
+                    int bpos = 0;
+                    for (int pos = 1; pos < server.worldServer.length; pos++) {
+                        WorldServer world = server.worlds.get(bpos++);
+                        if (server.worldServer[0] == world) {
+                            pos--;
+                            continue;
+                        }
+                        server.worldServer[pos] = world;
+                    }
+                    // CraftBukkit end
                     try {
                         IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.b(s);
 
@@ -69,6 +86,7 @@
                     } catch (Exception exception) {
                         object = new ChatComponentText(s);
                     }
+                    finally { MinecraftServer.getServer().worldServer = prev; } // CraftBukkit
 
                     nbttaglist.set(i, (NBTBase) (new NBTTagString(IChatBaseComponent.ChatSerializer.a((IChatBaseComponent) object))));
                 }