New world event for controlling potential entity spawnlists. For #430

This commit is contained in:
LexManos 2013-03-04 20:29:05 -08:00
parent ebdc10eb1d
commit 20db933cee
4 changed files with 80 additions and 50 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<SpawnListEntry> 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<SpawnListEntry>)oldList;
}
else
{
this.list = new ArrayList<SpawnListEntry>();
}
}
}
}

View File

@ -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;
}