Added event hooks to control to allow mod control of mob spawning. PR: #337
Deprecated LivingSpecialSpawnEvent in favor of new LivingSpawnEvent.SpecialSpawn
This commit is contained in:
parent
3e484deafc
commit
3a9c7b4532
4 changed files with 94 additions and 5 deletions
|
@ -1,12 +1,18 @@
|
||||||
package net.minecraftforge.event;
|
package net.minecraftforge.event;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.entity.EntityLiving;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
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.*;
|
||||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public class ForgeEventFactory
|
public class ForgeEventFactory
|
||||||
{
|
{
|
||||||
public static boolean doPlayerHarvestCheck(EntityPlayer player, Block block, boolean success)
|
public static boolean doPlayerHarvestCheck(EntityPlayer player, Block block, boolean success)
|
||||||
|
@ -33,4 +39,24 @@ public class ForgeEventFactory
|
||||||
{
|
{
|
||||||
MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(player, stack));
|
MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(player, stack));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Result canEntitySpawn(EntityLiving entity, World world, float x, float y, float z)
|
||||||
|
{
|
||||||
|
LivingSpawnEvent.CheckSpawn event = new LivingSpawnEvent.CheckSpawn(entity, world, x, y, z);
|
||||||
|
MinecraftForge.EVENT_BUS.post(event);
|
||||||
|
return event.getResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (result) //For the time being, copy the canceled state from the old legacy event
|
||||||
|
{ // Remove when we remove LivingSpecialSpawnEvent.
|
||||||
|
nEvent.setCanceled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MinecraftForge.EVENT_BUS.post(nEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
package net.minecraftforge.event.entity.living;
|
||||||
|
|
||||||
|
import net.minecraft.entity.EntityLiving;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.event.Cancelable;
|
||||||
|
import net.minecraftforge.event.Event.HasResult;
|
||||||
|
|
||||||
|
public class LivingSpawnEvent extends LivingEvent
|
||||||
|
{
|
||||||
|
public final World world;
|
||||||
|
public final float x;
|
||||||
|
public final float y;
|
||||||
|
public final float z;
|
||||||
|
|
||||||
|
public LivingSpawnEvent(EntityLiving entity, World world, float x, float y, float z)
|
||||||
|
{
|
||||||
|
super(entity);
|
||||||
|
this.world = world;
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fires before mob spawn events.
|
||||||
|
*
|
||||||
|
* Result is significant:
|
||||||
|
* DEFAULT: use vanilla spawn rules
|
||||||
|
* ALLOW: allow the spawn
|
||||||
|
* DENY: deny the spawn
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@HasResult
|
||||||
|
public static class CheckSpawn extends LivingSpawnEvent
|
||||||
|
{
|
||||||
|
public CheckSpawn(EntityLiving entity, World world, float x, float y, float z)
|
||||||
|
{
|
||||||
|
super(entity, world, x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Cancelable
|
||||||
|
public static class SpecialSpawn extends LivingSpawnEvent
|
||||||
|
{
|
||||||
|
public SpecialSpawn(EntityLiving entity, World world, float x, float y, float z)
|
||||||
|
{
|
||||||
|
super(entity, world, x, y, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import net.minecraft.entity.EntityLiving;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.event.Cancelable;
|
import net.minecraftforge.event.Cancelable;
|
||||||
|
|
||||||
|
@Deprecated //Remove next MC Version
|
||||||
@Cancelable
|
@Cancelable
|
||||||
public class LivingSpecialSpawnEvent extends LivingEvent
|
public class LivingSpecialSpawnEvent extends LivingEvent
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,17 +8,19 @@
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -19,6 +21,9 @@
|
@@ -19,6 +21,11 @@
|
||||||
import net.minecraft.world.biome.SpawnListEntry;
|
import net.minecraft.world.biome.SpawnListEntry;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
|
||||||
+import net.minecraftforge.common.MinecraftForge;
|
+import net.minecraftforge.common.MinecraftForge;
|
||||||
|
+import net.minecraftforge.event.Event.Result;
|
||||||
|
+import net.minecraftforge.event.ForgeEventFactory;
|
||||||
+import net.minecraftforge.event.entity.living.LivingSpecialSpawnEvent;
|
+import net.minecraftforge.event.entity.living.LivingSpecialSpawnEvent;
|
||||||
+
|
+
|
||||||
public final class SpawnerAnimals
|
public final class SpawnerAnimals
|
||||||
{
|
{
|
||||||
/** The 17x17 area around the player where mobs can spawn */
|
/** The 17x17 area around the player where mobs can spawn */
|
||||||
@@ -93,6 +98,9 @@
|
@@ -93,6 +100,9 @@
|
||||||
if ((!var35.getPeacefulCreature() || par2) && (var35.getPeacefulCreature() || par1) && (!var35.getAnimal() || par3) && par0WorldServer.countEntities(var35.getCreatureClass()) <= var35.getMaxNumberOfCreature() * eligibleChunksForSpawning.size() / 256)
|
if ((!var35.getPeacefulCreature() || par2) && (var35.getPeacefulCreature() || par1) && (!var35.getAnimal() || par3) && par0WorldServer.countEntities(var35.getCreatureClass()) <= var35.getMaxNumberOfCreature() * eligibleChunksForSpawning.size() / 256)
|
||||||
{
|
{
|
||||||
Iterator var37 = eligibleChunksForSpawning.keySet().iterator();
|
Iterator var37 = eligibleChunksForSpawning.keySet().iterator();
|
||||||
|
@ -28,7 +30,17 @@
|
||||||
label110:
|
label110:
|
||||||
|
|
||||||
while (var37.hasNext())
|
while (var37.hasNext())
|
||||||
@@ -221,7 +229,8 @@
|
@@ -169,7 +179,8 @@
|
||||||
|
|
||||||
|
var39.setLocationAndAngles((double)var24, (double)var25, (double)var26, par0WorldServer.rand.nextFloat() * 360.0F, 0.0F);
|
||||||
|
|
||||||
|
- if (var39.getCanSpawnHere())
|
||||||
|
+ Result canSpawn = ForgeEventFactory.canEntitySpawn(var39, par0WorldServer, var24, var25, var26);
|
||||||
|
+ if (canSpawn == Result.ALLOW || (canSpawn == Result.DEFAULT && var39.getCanSpawnHere()))
|
||||||
|
{
|
||||||
|
++var16;
|
||||||
|
par0WorldServer.spawnEntityInWorld(var39);
|
||||||
|
@@ -221,7 +232,8 @@
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int var5 = par1World.getBlockId(par2, par3 - 1, par4);
|
int var5 = par1World.getBlockId(par2, par3 - 1, par4);
|
||||||
|
@ -38,11 +50,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,6 +239,11 @@
|
@@ -230,6 +242,11 @@
|
||||||
*/
|
*/
|
||||||
private static void creatureSpecificInit(EntityLiving par0EntityLiving, World par1World, float par2, float par3, float par4)
|
private static void creatureSpecificInit(EntityLiving par0EntityLiving, World par1World, float par2, float par3, float par4)
|
||||||
{
|
{
|
||||||
+ if (MinecraftForge.EVENT_BUS.post(new LivingSpecialSpawnEvent(par0EntityLiving, par1World, par2, par3, par4)))
|
+ if (ForgeEventFactory.doSpecialSpawn(par0EntityLiving, par1World, par2, par3, par4))
|
||||||
+ {
|
+ {
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
|
|
Loading…
Reference in a new issue