diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java index 7e04139609..2eb48298b9 100644 --- a/src/main/java/net/minecraft/server/SpawnerCreature.java +++ b/src/main/java/net/minecraft/server/SpawnerCreature.java @@ -1,255 +1,255 @@ -package net.minecraft.server; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -// CraftBukkit -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; - -public final class SpawnerCreature { - - private static Set b = new HashSet(); - protected static final Class[] a = new Class[] { EntitySpider.class, EntityZombie.class, EntitySkeleton.class}; - - public SpawnerCreature() {} - - protected static ChunkPosition a(World world, int i, int j) { - int k = i + world.random.nextInt(16); - int l = world.random.nextInt(128); - int i1 = j + world.random.nextInt(16); - - return new ChunkPosition(k, l, i1); - } - - public static final int spawnEntities(World world, boolean flag, boolean flag1) { - if (!flag && !flag1) { - return 0; - } else { - b.clear(); - - int i; - int j; - - for (i = 0; i < world.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) world.players.get(i); - int k = MathHelper.floor(entityhuman.locX / 16.0D); - - j = MathHelper.floor(entityhuman.locZ / 16.0D); - byte b0 = 8; - - for (int l = -b0; l <= b0; ++l) { - for (int i1 = -b0; i1 <= b0; ++i1) { - b.add(new ChunkCoordIntPair(l + k, i1 + j)); - } - } - } - - i = 0; - ChunkCoordinates chunkcoordinates = world.getSpawn(); - EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values(); - - j = aenumcreaturetype.length; - - for (int j1 = 0; j1 < j; ++j1) { - EnumCreatureType enumcreaturetype = aenumcreaturetype[j1]; - - if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && world.a(enumcreaturetype.a()) <= enumcreaturetype.b() * b.size() / 256) { - Iterator iterator = b.iterator(); - - label113: - while (iterator.hasNext()) { - ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next(); - BiomeBase biomebase = world.getWorldChunkManager().a(chunkcoordintpair); - List list = biomebase.a(enumcreaturetype); - - if (list != null && !list.isEmpty()) { - int k1 = 0; - - BiomeMeta biomemeta; - - for (Iterator iterator1 = list.iterator(); iterator1.hasNext(); k1 += biomemeta.b) { - biomemeta = (BiomeMeta) iterator1.next(); - } - - int l1 = world.random.nextInt(k1); - - biomemeta = (BiomeMeta) list.get(0); - Iterator iterator2 = list.iterator(); - - while (iterator2.hasNext()) { - BiomeMeta biomemeta1 = (BiomeMeta) iterator2.next(); - - l1 -= biomemeta1.b; - if (l1 < 0) { - biomemeta = biomemeta1; - break; - } - } - - ChunkPosition chunkposition = a(world, chunkcoordintpair.x * 16, chunkcoordintpair.z * 16); - int i2 = chunkposition.x; - int j2 = chunkposition.y; - int k2 = chunkposition.z; - - if (!world.d(i2, j2, k2) && world.getMaterial(i2, j2, k2) == enumcreaturetype.c()) { - int l2 = 0; - - for (int i3 = 0; i3 < 3; ++i3) { - int j3 = i2; - int k3 = j2; - int l3 = k2; - byte b1 = 6; - - for (int i4 = 0; i4 < 4; ++i4) { - j3 += world.random.nextInt(b1) - world.random.nextInt(b1); - k3 += world.random.nextInt(1) - world.random.nextInt(1); - l3 += world.random.nextInt(b1) - world.random.nextInt(b1); - if (a(enumcreaturetype, world, j3, k3, l3)) { - float f = (float) j3 + 0.5F; - float f1 = (float) k3; - float f2 = (float) l3 + 0.5F; - - if (world.a((double) f, (double) f1, (double) f2, 24.0D) == null) { - float f3 = f - (float) chunkcoordinates.x; - float f4 = f1 - (float) chunkcoordinates.y; - float f5 = f2 - (float) chunkcoordinates.z; - float f6 = f3 * f3 + f4 * f4 + f5 * f5; - - if (f6 >= 576.0F) { - EntityLiving entityliving; - - try { - entityliving = (EntityLiving) biomemeta.a.getConstructor(new Class[] { World.class}).newInstance(new Object[] { world}); - } catch (Exception exception) { - exception.printStackTrace(); - return i; - } - - entityliving.setPositionRotation((double) f, (double) f1, (double) f2, world.random.nextFloat() * 360.0F, 0.0F); - if (entityliving.d()) { - ++l2; - // CraftBukkit - added a reason for spawning this creature - world.addEntity(entityliving, SpawnReason.NATURAL); - a(entityliving, world, f, f1, f2); - if (l2 >= entityliving.l()) { - continue label113; - } - } - - i += l2; - } - } - } - } - } - } - } - } - } - } - - return i; - } - } - - private static boolean a(EnumCreatureType enumcreaturetype, World world, int i, int j, int k) { - return enumcreaturetype.c() == Material.WATER ? world.getMaterial(i, j, k).isLiquid() && !world.d(i, j + 1, k) : world.d(i, j - 1, k) && !world.d(i, j, k) && !world.getMaterial(i, j, k).isLiquid() && !world.d(i, j + 1, k); - } - - private static void a(EntityLiving entityliving, World world, float f, float f1, float f2) { - if (entityliving instanceof EntitySpider && world.random.nextInt(100) == 0) { - EntitySkeleton entityskeleton = new EntitySkeleton(world); - - entityskeleton.setPositionRotation((double) f, (double) f1, (double) f2, entityliving.yaw, 0.0F); - // CraftBukkit - added a reason for spawning this creature - world.addEntity(entityskeleton, SpawnReason.NATURAL); - entityskeleton.mount(entityliving); - } else if (entityliving instanceof EntitySheep) { - ((EntitySheep) entityliving).setColor(EntitySheep.a(world.random)); - } - } - - public static boolean a(World world, List list) { - boolean flag = false; - Pathfinder pathfinder = new Pathfinder(world); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - Class[] aclass = a; - - if (aclass != null && aclass.length != 0) { - boolean flag1 = false; - - for (int i = 0; i < 20 && !flag1; ++i) { - int j = MathHelper.floor(entityhuman.locX) + world.random.nextInt(32) - world.random.nextInt(32); - int k = MathHelper.floor(entityhuman.locZ) + world.random.nextInt(32) - world.random.nextInt(32); - int l = MathHelper.floor(entityhuman.locY) + world.random.nextInt(16) - world.random.nextInt(16); - - if (l < 1) { - l = 1; - } else if (l > 128) { - l = 128; - } - - int i1 = world.random.nextInt(aclass.length); - - int j1; - - for (j1 = l; j1 > 2 && !world.d(j, j1 - 1, k); --j1) { - ; - } - - while (!a(EnumCreatureType.MONSTER, world, j, j1, k) && j1 < l + 16 && j1 < 128) { - ++j1; - } - - if (j1 < l + 16 && j1 < 128) { - float f = (float) j + 0.5F; - float f1 = (float) j1; - float f2 = (float) k + 0.5F; - - EntityLiving entityliving; - - try { - entityliving = (EntityLiving) aclass[i1].getConstructor(new Class[] { World.class}).newInstance(new Object[] { world}); - } catch (Exception exception) { - exception.printStackTrace(); - return flag; - } - - entityliving.setPositionRotation((double) f, (double) f1, (double) f2, world.random.nextFloat() * 360.0F, 0.0F); - if (entityliving.d()) { - PathEntity pathentity = pathfinder.a(entityliving, entityhuman, 32.0F); - - if (pathentity != null && pathentity.a > 1) { - PathPoint pathpoint = pathentity.c(); - - if (Math.abs((double) pathpoint.a - entityhuman.locX) < 1.5D && Math.abs((double) pathpoint.c - entityhuman.locZ) < 1.5D && Math.abs((double) pathpoint.b - entityhuman.locY) < 1.5D) { - ChunkCoordinates chunkcoordinates = BlockBed.g(world, MathHelper.floor(entityhuman.locX), MathHelper.floor(entityhuman.locY), MathHelper.floor(entityhuman.locZ), 1); - - if (chunkcoordinates == null) { - chunkcoordinates = new ChunkCoordinates(j, j1 + 1, k); - } - - entityliving.setPositionRotation((double) ((float) chunkcoordinates.x + 0.5F), (double) chunkcoordinates.y, (double) ((float) chunkcoordinates.z + 0.5F), 0.0F, 0.0F); - // CraftBukkit - added a reason for spawning this creature - world.addEntity(entityliving, SpawnReason.BED); - a(entityliving, world, (float) chunkcoordinates.x + 0.5F, (float) chunkcoordinates.y, (float) chunkcoordinates.z + 0.5F); - entityhuman.a(true, false, false); - entityliving.P(); - flag = true; - flag1 = true; - } - } - } - } - } - } - } - - return flag; - } +package net.minecraft.server; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +// CraftBukkit +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + +public final class SpawnerCreature { + + private static Set b = new HashSet(); + protected static final Class[] a = new Class[] { EntitySpider.class, EntityZombie.class, EntitySkeleton.class}; + + public SpawnerCreature() {} + + protected static ChunkPosition a(World world, int i, int j) { + int k = i + world.random.nextInt(16); + int l = world.random.nextInt(128); + int i1 = j + world.random.nextInt(16); + + return new ChunkPosition(k, l, i1); + } + + public static final int spawnEntities(World world, boolean flag, boolean flag1) { + if (!flag && !flag1) { + return 0; + } else { + b.clear(); + + int i; + int j; + + for (i = 0; i < world.players.size(); ++i) { + EntityHuman entityhuman = (EntityHuman) world.players.get(i); + int k = MathHelper.floor(entityhuman.locX / 16.0D); + + j = MathHelper.floor(entityhuman.locZ / 16.0D); + byte b0 = 8; + + for (int l = -b0; l <= b0; ++l) { + for (int i1 = -b0; i1 <= b0; ++i1) { + b.add(new ChunkCoordIntPair(l + k, i1 + j)); + } + } + } + + i = 0; + ChunkCoordinates chunkcoordinates = world.getSpawn(); + EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values(); + + j = aenumcreaturetype.length; + + for (int j1 = 0; j1 < j; ++j1) { + EnumCreatureType enumcreaturetype = aenumcreaturetype[j1]; + + if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && world.a(enumcreaturetype.a()) <= enumcreaturetype.b() * b.size() / 256) { + Iterator iterator = b.iterator(); + + label113: + while (iterator.hasNext()) { + ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next(); + BiomeBase biomebase = world.getWorldChunkManager().a(chunkcoordintpair); + List list = biomebase.a(enumcreaturetype); + + if (list != null && !list.isEmpty()) { + int k1 = 0; + + BiomeMeta biomemeta; + + for (Iterator iterator1 = list.iterator(); iterator1.hasNext(); k1 += biomemeta.b) { + biomemeta = (BiomeMeta) iterator1.next(); + } + + int l1 = world.random.nextInt(k1); + + biomemeta = (BiomeMeta) list.get(0); + Iterator iterator2 = list.iterator(); + + while (iterator2.hasNext()) { + BiomeMeta biomemeta1 = (BiomeMeta) iterator2.next(); + + l1 -= biomemeta1.b; + if (l1 < 0) { + biomemeta = biomemeta1; + break; + } + } + + ChunkPosition chunkposition = a(world, chunkcoordintpair.x * 16, chunkcoordintpair.z * 16); + int i2 = chunkposition.x; + int j2 = chunkposition.y; + int k2 = chunkposition.z; + + if (!world.d(i2, j2, k2) && world.getMaterial(i2, j2, k2) == enumcreaturetype.c()) { + int l2 = 0; + + for (int i3 = 0; i3 < 3; ++i3) { + int j3 = i2; + int k3 = j2; + int l3 = k2; + byte b1 = 6; + + for (int i4 = 0; i4 < 4; ++i4) { + j3 += world.random.nextInt(b1) - world.random.nextInt(b1); + k3 += world.random.nextInt(1) - world.random.nextInt(1); + l3 += world.random.nextInt(b1) - world.random.nextInt(b1); + if (a(enumcreaturetype, world, j3, k3, l3)) { + float f = (float) j3 + 0.5F; + float f1 = (float) k3; + float f2 = (float) l3 + 0.5F; + + if (world.a((double) f, (double) f1, (double) f2, 24.0D) == null) { + float f3 = f - (float) chunkcoordinates.x; + float f4 = f1 - (float) chunkcoordinates.y; + float f5 = f2 - (float) chunkcoordinates.z; + float f6 = f3 * f3 + f4 * f4 + f5 * f5; + + if (f6 >= 576.0F) { + EntityLiving entityliving; + + try { + entityliving = (EntityLiving) biomemeta.a.getConstructor(new Class[] { World.class}).newInstance(new Object[] { world}); + } catch (Exception exception) { + exception.printStackTrace(); + return i; + } + + entityliving.setPositionRotation((double) f, (double) f1, (double) f2, world.random.nextFloat() * 360.0F, 0.0F); + if (entityliving.d()) { + ++l2; + // CraftBukkit - added a reason for spawning this creature + world.addEntity(entityliving, SpawnReason.NATURAL); + a(entityliving, world, f, f1, f2); + if (l2 >= entityliving.l()) { + continue label113; + } + } + + i += l2; + } + } + } + } + } + } + } + } + } + } + + return i; + } + } + + private static boolean a(EnumCreatureType enumcreaturetype, World world, int i, int j, int k) { + return enumcreaturetype.c() == Material.WATER ? world.getMaterial(i, j, k).isLiquid() && !world.d(i, j + 1, k) : world.d(i, j - 1, k) && !world.d(i, j, k) && !world.getMaterial(i, j, k).isLiquid() && !world.d(i, j + 1, k); + } + + private static void a(EntityLiving entityliving, World world, float f, float f1, float f2) { + if (entityliving instanceof EntitySpider && world.random.nextInt(100) == 0) { + EntitySkeleton entityskeleton = new EntitySkeleton(world); + + entityskeleton.setPositionRotation((double) f, (double) f1, (double) f2, entityliving.yaw, 0.0F); + // CraftBukkit - added a reason for spawning this creature + world.addEntity(entityskeleton, SpawnReason.NATURAL); + entityskeleton.mount(entityliving); + } else if (entityliving instanceof EntitySheep) { + ((EntitySheep) entityliving).setColor(EntitySheep.a(world.random)); + } + } + + public static boolean a(World world, List list) { + boolean flag = false; + Pathfinder pathfinder = new Pathfinder(world); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { + EntityHuman entityhuman = (EntityHuman) iterator.next(); + Class[] aclass = a; + + if (aclass != null && aclass.length != 0) { + boolean flag1 = false; + + for (int i = 0; i < 20 && !flag1; ++i) { + int j = MathHelper.floor(entityhuman.locX) + world.random.nextInt(32) - world.random.nextInt(32); + int k = MathHelper.floor(entityhuman.locZ) + world.random.nextInt(32) - world.random.nextInt(32); + int l = MathHelper.floor(entityhuman.locY) + world.random.nextInt(16) - world.random.nextInt(16); + + if (l < 1) { + l = 1; + } else if (l > 128) { + l = 128; + } + + int i1 = world.random.nextInt(aclass.length); + + int j1; + + for (j1 = l; j1 > 2 && !world.d(j, j1 - 1, k); --j1) { + ; + } + + while (!a(EnumCreatureType.MONSTER, world, j, j1, k) && j1 < l + 16 && j1 < 128) { + ++j1; + } + + if (j1 < l + 16 && j1 < 128) { + float f = (float) j + 0.5F; + float f1 = (float) j1; + float f2 = (float) k + 0.5F; + + EntityLiving entityliving; + + try { + entityliving = (EntityLiving) aclass[i1].getConstructor(new Class[] { World.class}).newInstance(new Object[] { world}); + } catch (Exception exception) { + exception.printStackTrace(); + return flag; + } + + entityliving.setPositionRotation((double) f, (double) f1, (double) f2, world.random.nextFloat() * 360.0F, 0.0F); + if (entityliving.d()) { + PathEntity pathentity = pathfinder.a(entityliving, entityhuman, 32.0F); + + if (pathentity != null && pathentity.a > 1) { + PathPoint pathpoint = pathentity.c(); + + if (Math.abs((double) pathpoint.a - entityhuman.locX) < 1.5D && Math.abs((double) pathpoint.c - entityhuman.locZ) < 1.5D && Math.abs((double) pathpoint.b - entityhuman.locY) < 1.5D) { + ChunkCoordinates chunkcoordinates = BlockBed.g(world, MathHelper.floor(entityhuman.locX), MathHelper.floor(entityhuman.locY), MathHelper.floor(entityhuman.locZ), 1); + + if (chunkcoordinates == null) { + chunkcoordinates = new ChunkCoordinates(j, j1 + 1, k); + } + + entityliving.setPositionRotation((double) ((float) chunkcoordinates.x + 0.5F), (double) chunkcoordinates.y, (double) ((float) chunkcoordinates.z + 0.5F), 0.0F, 0.0F); + // CraftBukkit - added a reason for spawning this creature + world.addEntity(entityliving, SpawnReason.BED); + a(entityliving, world, (float) chunkcoordinates.x + 0.5F, (float) chunkcoordinates.y, (float) chunkcoordinates.z + 0.5F); + entityhuman.a(true, false, false); + entityliving.P(); + flag = true; + flag1 = true; + } + } + } + } + } + } + } + + return flag; + } } \ No newline at end of file