          if (this.blockExists(par1, 0, par2))
          {
              Chunk var3 = this.getChunkFromBlockCoords(par1, par2);
-@@ -162,8 +186,11 @@
+@@ -163,7 +187,15 @@
          this.theProfiler = par5Profiler;
          this.worldInfo = new WorldInfo(par4WorldSettings, par2Str);
          this.provider = par3WorldProvider;
 -        this.mapStorage = new MapStorage(par1ISaveHandler);
--        par3WorldProvider.registerWorld(this);
-+    }
++    }
++
 +    // Broken up so that the WorldClient gets the chance to set the mapstorage object before the dimension initializes
 +    @SideOnly(Side.CLIENT)
-+    protected void finishSetup() {
++    protected void finishSetup()
++    {
++        this.provider.registerWorld(this);
++
++        this.mapStorage = new MapStorage(saveHandler);
+         VillageCollection var6 = (VillageCollection)this.mapStorage.loadData(VillageCollection.class, "villages");
+ 
+         if (var6 == null)
+@@ -177,7 +209,7 @@
+             this.villageCollectionObj.func_82566_a(this);
+         }
+ 
+-        par3WorldProvider.registerWorld(this);
 +        this.provider.registerWorld(this);
          this.chunkProvider = this.createChunkProvider();
          this.calculateInitialSkylight();
          this.calculateInitialWeather();
-@@ -177,7 +204,7 @@
+@@ -191,7 +223,7 @@
          this.isRemote = false;
          this.saveHandler = par1ISaveHandler;
          this.theProfiler = par5Profiler;

     {
         float var3 = this.getCelestialAngle(par2);
         float var4 = MathHelper.cos(var3 * (float)Math.PI * 2.0F) * 2.0F + 0.5F;
@@ -1658,6 +1717,12 @@
     @SideOnly(Side.CLIENT)
     public Vec3 drawClouds(float par1)
     {

         {
             par1Entity.lastTickPosX = par1Entity.posX;
             par1Entity.lastTickPosY = par1Entity.posY;
@@ -2257,6 +2345,14 @@
                         {
                             return true;
                         }
