diff --git a/common/net/minecraftforge/event/ForgeEventFactory.java b/common/net/minecraftforge/event/ForgeEventFactory.java index 0210321f5..3f1deeda8 100644 --- a/common/net/minecraftforge/event/ForgeEventFactory.java +++ b/common/net/minecraftforge/event/ForgeEventFactory.java @@ -1,16 +1,23 @@ package net.minecraftforge.event; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.living.LivingSpecialSpawnEvent; -import net.minecraftforge.event.entity.player.*; +import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; +import net.minecraftforge.event.world.WorldEvent; @SuppressWarnings("deprecation") public class ForgeEventFactory @@ -49,14 +56,16 @@ public class ForgeEventFactory public static boolean doSpecialSpawn(EntityLiving entity, World world, float x, float y, float z) { - boolean result = MinecraftForge.EVENT_BUS.post(new LivingSpecialSpawnEvent(entity, world, x, y, z)); - LivingSpawnEvent.SpecialSpawn nEvent = new LivingSpawnEvent.SpecialSpawn(entity, world, x, y, z); + return MinecraftForge.EVENT_BUS.post(new LivingSpawnEvent.SpecialSpawn(entity, world, x, y, z)); + } - if (result) //For the time being, copy the canceled state from the old legacy event - { // Remove when we remove LivingSpecialSpawnEvent. - nEvent.setCanceled(true); + public static List getPotentialSpawns(WorldServer world, EnumCreatureType type, int x, int y, int z, List oldList) + { + WorldEvent.PotentialSpawns event = new WorldEvent.PotentialSpawns(world, type, x, y, z, oldList); + if (MinecraftForge.EVENT_BUS.post(event)) + { + return null; } - - return MinecraftForge.EVENT_BUS.post(nEvent); + return event.list; } } diff --git a/common/net/minecraftforge/event/entity/living/LivingSpecialSpawnEvent.java b/common/net/minecraftforge/event/entity/living/LivingSpecialSpawnEvent.java deleted file mode 100644 index d8c2d4d25..000000000 --- a/common/net/minecraftforge/event/entity/living/LivingSpecialSpawnEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.minecraftforge.event.entity.living; - -import net.minecraft.entity.EntityLiving; -import net.minecraft.world.World; -import net.minecraftforge.event.Cancelable; - -@Deprecated //Remove next MC Version -@Cancelable -public class LivingSpecialSpawnEvent extends LivingEvent -{ - public final World world; - public final float x; - public final float y; - public final float z; - private boolean handeled = false; - - public LivingSpecialSpawnEvent(EntityLiving entity, World world, float x, float y, float z) - { - super(entity); - this.world = world; - this.x = x; - this.y = y; - this.z = z; - } -} diff --git a/common/net/minecraftforge/event/world/WorldEvent.java b/common/net/minecraftforge/event/world/WorldEvent.java index 4e1565128..6ebbffbdd 100644 --- a/common/net/minecraftforge/event/world/WorldEvent.java +++ b/common/net/minecraftforge/event/world/WorldEvent.java @@ -1,6 +1,12 @@ package net.minecraftforge.event.world; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.EnumCreatureType; import net.minecraft.world.World; +import net.minecraft.world.biome.SpawnListEntry; +import net.minecraftforge.event.Cancelable; import net.minecraftforge.event.Event; public class WorldEvent extends Event @@ -26,4 +32,35 @@ public class WorldEvent extends Event { public Save(World world) { super(world); } } + + /** + * Called by WorldServer to gather a list of all possible entities that can spawn at the specified location. + * Canceling the event will result in a empty list, meaning no entity will be spawned. + */ + @Cancelable + public static class PotentialSpawns extends WorldEvent + { + public final EnumCreatureType type; + public final int x; + public final int y; + public final int z; + public final List list; + + public PotentialSpawns(World world, EnumCreatureType type, int x, int y, int z, List oldList) + { + super(world); + this.x = x; + this.y = y; + this.z = z; + this.type = type; + if (oldList != null) + { + this.list = (List)oldList; + } + else + { + this.list = new ArrayList(); + } + } + } } diff --git a/patches/minecraft/net/minecraft/world/WorldServer.java.patch b/patches/minecraft/net/minecraft/world/WorldServer.java.patch index 431675558..ef7233128 100644 --- a/patches/minecraft/net/minecraft/world/WorldServer.java.patch +++ b/patches/minecraft/net/minecraft/world/WorldServer.java.patch @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; -@@ -47,11 +49,18 @@ +@@ -47,11 +49,19 @@ import net.minecraft.world.biome.WorldChunkManager; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; @@ -24,11 +24,12 @@ +import static net.minecraftforge.common.ChestGenHooks.*; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; ++import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.world.WorldEvent; public class WorldServer extends World { -@@ -88,6 +97,10 @@ +@@ -88,6 +98,10 @@ /** An IntHashMap of entity IDs (integers) to their Entity objects. */ private IntHashMap entityIdMap; @@ -39,7 +40,7 @@ public WorldServer(MinecraftServer par1MinecraftServer, ISaveHandler par2ISaveHandler, String par3Str, int par4, WorldSettings par5WorldSettings, Profiler par6Profiler, ILogAgent par7ILogAgent) { super(par2ISaveHandler, par3Str, par5WorldSettings, WorldProvider.getProviderForDimension(par4), par6Profiler, par7ILogAgent); -@@ -122,6 +135,7 @@ +@@ -122,6 +136,7 @@ scoreboardsavedata.func_96499_a(this.field_96442_D); ((ServerScoreboard)this.field_96442_D).func_96547_a(scoreboardsavedata); @@ -47,7 +48,7 @@ } /** -@@ -184,6 +198,10 @@ +@@ -184,6 +199,10 @@ this.villageSiegeObj.tick(); this.theProfiler.endStartSection("portalForcer"); this.field_85177_Q.func_85189_a(this.getTotalWorldTime()); @@ -58,7 +59,15 @@ this.theProfiler.endSection(); this.sendAndApplyBlockEvents(); } -@@ -237,10 +255,7 @@ +@@ -194,6 +213,7 @@ + public SpawnListEntry spawnRandomCreature(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) + { + List list = this.getChunkProvider().getPossibleCreatures(par1EnumCreatureType, par2, par3, par4); ++ list = ForgeEventFactory.getPotentialSpawns(this, par1EnumCreatureType, par2, par3, par4, list); + return list != null && !list.isEmpty() ? (SpawnListEntry)WeightedRandom.getRandomItem(this.rand, list) : null; + } + +@@ -237,10 +257,7 @@ private void resetRainAndThunder() { @@ -70,7 +79,7 @@ } public boolean areAllPlayersAsleep() -@@ -311,6 +326,14 @@ +@@ -311,6 +328,14 @@ int i = 0; int j = 0; Iterator iterator = this.activeChunkSet.iterator(); @@ -85,7 +94,7 @@ while (iterator.hasNext()) { -@@ -321,14 +344,18 @@ +@@ -321,14 +346,18 @@ Chunk chunk = this.getChunkFromChunkCoords(chunkcoordintpair.chunkXPos, chunkcoordintpair.chunkZPos); this.moodSoundAndLightCheck(k, l, chunk); this.theProfiler.endStartSection("tickChunk"); @@ -106,7 +115,7 @@ { this.updateLCG = this.updateLCG * 3 + 1013904223; i1 = this.updateLCG >> 2; -@@ -345,7 +372,7 @@ +@@ -345,7 +374,7 @@ this.theProfiler.endStartSection("iceandsnow"); int i2; @@ -115,7 +124,7 @@ { this.updateLCG = this.updateLCG * 3 + 1013904223; i1 = this.updateLCG >> 2; -@@ -430,7 +457,8 @@ +@@ -430,7 +459,8 @@ public void func_82740_a(int par1, int par2, int par3, int par4, int par5, int par6) { NextTickListEntry nextticklistentry = new NextTickListEntry(par1, par2, par3, par4); @@ -125,7 +134,7 @@ if (this.scheduledUpdatesAreImmediate && par4 > 0) { -@@ -493,7 +521,7 @@ +@@ -493,7 +523,7 @@ */ public void updateEntities() { @@ -134,7 +143,7 @@ { if (this.updateEntityTick++ >= 1200) { -@@ -559,7 +587,8 @@ +@@ -559,7 +589,8 @@ { nextticklistentry = (NextTickListEntry)iterator.next(); iterator.remove(); @@ -144,7 +153,7 @@ if (this.checkChunksExist(nextticklistentry.xCoord - b0, nextticklistentry.yCoord - b0, nextticklistentry.zCoord - b0, nextticklistentry.xCoord + b0, nextticklistentry.yCoord + b0, nextticklistentry.zCoord + b0)) { -@@ -698,16 +727,28 @@ +@@ -698,16 +729,28 @@ { ArrayList arraylist = new ArrayList(); @@ -183,7 +192,7 @@ return arraylist; } -@@ -715,6 +756,11 @@ +@@ -715,6 +758,11 @@ * Called when checking if a certain block can be mined or not. The 'spawn safe zone' check is located here. */ public boolean canMineBlock(EntityPlayer par1EntityPlayer, int par2, int par3, int par4) @@ -195,7 +204,7 @@ { return !this.mcServer.func_96290_a(this, par2, par3, par4, par1EntityPlayer); } -@@ -799,7 +845,7 @@ +@@ -799,7 +847,7 @@ */ protected void createBonusChest() { @@ -204,7 +213,7 @@ for (int i = 0; i < 10; ++i) { -@@ -842,6 +888,7 @@ +@@ -842,6 +890,7 @@ } this.chunkProvider.saveChunks(par1, par2IProgressUpdate); @@ -212,7 +221,7 @@ } } -@@ -853,6 +900,7 @@ +@@ -853,6 +902,7 @@ this.checkSessionLock(); this.saveHandler.saveWorldInfoWithPlayer(this.worldInfo, this.mcServer.getConfigurationManager().getHostPlayerData()); this.mapStorage.saveAllData(); @@ -220,7 +229,7 @@ } /** -@@ -1066,4 +1114,9 @@ +@@ -1066,4 +1116,9 @@ { return this.field_85177_Q; }