--- ../src-base/minecraft/net/minecraft/world/gen/ChunkProviderEnd.java
+++ ../src-work/minecraft/net/minecraft/world/gen/ChunkProviderEnd.java
@@ -15,6 +15,9 @@
 import net.minecraft.world.chunk.Chunk;
 import net.minecraft.world.chunk.ChunkPrimer;
 import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraftforge.common.*;
+import net.minecraftforge.fml.common.eventhandler.Event.*;
+import net.minecraftforge.event.terraingen.*;
 
 public class ChunkProviderEnd implements IChunkProvider
 {
@@ -43,6 +46,14 @@
         this.field_73199_l = new NoiseGeneratorOctaves(this.field_73204_i, 8);
         this.field_73196_a = new NoiseGeneratorOctaves(this.field_73204_i, 10);
         this.field_73194_b = new NoiseGeneratorOctaves(this.field_73204_i, 16);
+
+        NoiseGenerator[] noiseGens = {field_73201_j, field_73202_k, field_73199_l, field_73196_a, field_73194_b};
+        noiseGens = TerrainGen.getModdedNoiseGenerators(p_i2007_1_, this.field_73204_i, noiseGens);
+        this.field_73201_j = (NoiseGeneratorOctaves)noiseGens[0];
+        this.field_73202_k = (NoiseGeneratorOctaves)noiseGens[1];
+        this.field_73199_l = (NoiseGeneratorOctaves)noiseGens[2];
+        this.field_73196_a = (NoiseGeneratorOctaves)noiseGens[3];
+        this.field_73194_b = (NoiseGeneratorOctaves)noiseGens[4];
     }
 
     public void func_180520_a(int p_180520_1_, int p_180520_2_, ChunkPrimer p_180520_3_)
@@ -115,6 +126,9 @@
 
     public void func_180519_a(ChunkPrimer p_180519_1_)
     {
+        ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(this, chunkX, chunkZ, p_180519_1_, this.field_73200_m);
+        MinecraftForge.EVENT_BUS.post(event);
+        if (event.getResult() == Result.DENY) return;
         for (int i = 0; i < 16; ++i)
         {
             for (int j = 0; j < 16; ++j)
@@ -164,8 +178,10 @@
         }
     }
 
+    private int chunkX=0, chunkZ=0;
     public Chunk func_73154_d(int p_73154_1_, int p_73154_2_)
     {
+        chunkX = p_73154_1_; chunkZ = p_73154_2_;
         this.field_73204_i.setSeed((long)p_73154_1_ * 341873128712L + (long)p_73154_2_ * 132897987541L);
         ChunkPrimer chunkprimer = new ChunkPrimer();
         this.field_73198_o = this.field_73200_m.func_72959_q().func_76933_b(this.field_73198_o, p_73154_1_ * 16, p_73154_2_ * 16, 16, 16);
@@ -185,6 +201,10 @@
 
     private double[] func_73187_a(double[] p_73187_1_, int p_73187_2_, int p_73187_3_, int p_73187_4_, int p_73187_5_, int p_73187_6_, int p_73187_7_)
     {
+        ChunkProviderEvent.InitNoiseField event = new ChunkProviderEvent.InitNoiseField(this, p_73187_1_, p_73187_2_, p_73187_3_, p_73187_4_, p_73187_5_, p_73187_6_, p_73187_7_);
+        MinecraftForge.EVENT_BUS.post(event);
+        if (event.getResult() == Result.DENY) return event.noisefield;
+
         if (p_73187_1_ == null)
         {
             p_73187_1_ = new double[p_73187_5_ * p_73187_6_ * p_73187_7_];
@@ -275,8 +295,14 @@
     public void func_73153_a(IChunkProvider p_73153_1_, int p_73153_2_, int p_73153_3_)
     {
         BlockFalling.field_149832_M = true;
+
+        MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(p_73153_1_, field_73200_m, field_73200_m.field_73012_v, p_73153_2_, p_73153_3_, false));
+
         BlockPos blockpos = new BlockPos(p_73153_2_ * 16, 0, p_73153_3_ * 16);
         this.field_73200_m.func_180494_b(blockpos.func_177982_a(16, 0, 16)).func_180624_a(this.field_73200_m, this.field_73200_m.field_73012_v, blockpos);
+
+        MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Post(p_73153_1_, field_73200_m, field_73200_m.field_73012_v, p_73153_2_, p_73153_3_, false));
+
         BlockFalling.field_149832_M = false;
     }
 
