131 lines
7.4 KiB
Diff
131 lines
7.4 KiB
Diff
--- ../src-base/minecraft/net/minecraft/world/SpawnerAnimals.java
|
|
+++ ../src-work/minecraft/net/minecraft/world/SpawnerAnimals.java
|
|
@@ -22,9 +22,15 @@
|
|
import cpw.mods.fml.common.eventhandler.Event.Result;
|
|
import net.minecraftforge.event.ForgeEventFactory;
|
|
|
|
+// CraftBukkit start
|
|
+import org.bukkit.craftbukkit.util.LongHash;
|
|
+import org.bukkit.craftbukkit.util.LongObjectHashMap;
|
|
+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
|
+// CraftBukkit end
|
|
+
|
|
public final class SpawnerAnimals
|
|
{
|
|
- private HashMap eligibleChunksForSpawning = new HashMap();
|
|
+ private LongObjectHashMap<Boolean> eligibleChunksForSpawning = new LongObjectHashMap<Boolean>(); // CraftBukkit - HashMap -> LongObjectHashMap
|
|
private static final String __OBFID = "CL_00000152";
|
|
|
|
protected static ChunkPosition func_151350_a(World p_151350_0_, int p_151350_1_, int p_151350_2_)
|
|
@@ -54,22 +60,30 @@
|
|
int j = MathHelper.floor_double(entityplayer.posX / 16.0D);
|
|
k = MathHelper.floor_double(entityplayer.posZ / 16.0D);
|
|
byte b0 = 8;
|
|
+ // Spigot Start
|
|
+ b0 = p_77192_1_.getSpigotConfig().mobSpawnRange; // Cauldron
|
|
+ b0 = (b0 > p_77192_1_.getSpigotConfig().viewDistance) ? (byte) p_77192_1_.spigotConfig.viewDistance : b0; // Cauldron
|
|
+ b0 = (b0 > 8) ? 8 : b0;
|
|
+ // Spigot End
|
|
|
|
for (int l = -b0; l <= b0; ++l)
|
|
{
|
|
for (int i1 = -b0; i1 <= b0; ++i1)
|
|
{
|
|
boolean flag3 = l == -b0 || l == b0 || i1 == -b0 || i1 == b0;
|
|
- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(l + j, i1 + k);
|
|
+ // CraftBukkit start
|
|
+ long chunkCoords = LongHash.toLong(l + j, i1 + k);
|
|
|
|
if (!flag3)
|
|
{
|
|
- this.eligibleChunksForSpawning.put(chunkcoordintpair, Boolean.valueOf(false));
|
|
+ this.eligibleChunksForSpawning.put(chunkCoords, false);
|
|
}
|
|
- else if (!this.eligibleChunksForSpawning.containsKey(chunkcoordintpair))
|
|
+ else if (!this.eligibleChunksForSpawning.containsKey(chunkCoords))
|
|
{
|
|
- this.eligibleChunksForSpawning.put(chunkcoordintpair, Boolean.valueOf(true));
|
|
+ this.eligibleChunksForSpawning.put(chunkCoords, true);
|
|
}
|
|
+
|
|
+ // CraftBukkit end
|
|
}
|
|
}
|
|
}
|
|
@@ -82,22 +96,46 @@
|
|
for (int k3 = 0; k3 < k; ++k3)
|
|
{
|
|
EnumCreatureType enumcreaturetype = aenumcreaturetype[k3];
|
|
+ // CraftBukkit start - Use per-world spawn limits
|
|
+ int limit = enumcreaturetype.getMaxNumberOfCreature();
|
|
|
|
- if ((!enumcreaturetype.getPeacefulCreature() || p_77192_3_) && (enumcreaturetype.getPeacefulCreature() || p_77192_2_) && (!enumcreaturetype.getAnimal() || p_77192_4_) && p_77192_1_.countEntities(enumcreaturetype, true) <= enumcreaturetype.getMaxNumberOfCreature() * this.eligibleChunksForSpawning.size() / 256)
|
|
+ switch (enumcreaturetype)
|
|
{
|
|
+ case monster:
|
|
+ limit = p_77192_1_.getWorld().getMonsterSpawnLimit();
|
|
+ break;
|
|
+ case creature:
|
|
+ limit = p_77192_1_.getWorld().getAnimalSpawnLimit();
|
|
+ break;
|
|
+ case waterCreature:
|
|
+ limit = p_77192_1_.getWorld().getWaterAnimalSpawnLimit();
|
|
+ break;
|
|
+ case ambient:
|
|
+ limit = p_77192_1_.getWorld().getAmbientSpawnLimit();
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (limit == 0)
|
|
+ {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ // CraftBukkit end
|
|
+
|
|
+ if ((!enumcreaturetype.getPeacefulCreature() || p_77192_3_) && (enumcreaturetype.getPeacefulCreature() || p_77192_2_) && (!enumcreaturetype.getAnimal() || p_77192_4_) && p_77192_1_.countEntities(enumcreaturetype.getCreatureClass()) <= limit * eligibleChunksForSpawning.size() / 256) // CraftBukkit - use per-world limits
|
|
+ {
|
|
Iterator iterator = this.eligibleChunksForSpawning.keySet().iterator();
|
|
- ArrayList<ChunkCoordIntPair> tmp = new ArrayList(eligibleChunksForSpawning.keySet());
|
|
- Collections.shuffle(tmp);
|
|
- iterator = tmp.iterator();
|
|
label110:
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair)iterator.next();
|
|
+ // CraftBukkit start
|
|
+ long key = ((Long) iterator.next()).longValue();
|
|
|
|
- if (!((Boolean)this.eligibleChunksForSpawning.get(chunkcoordintpair1)).booleanValue())
|
|
+ if (!(this.eligibleChunksForSpawning.get(key)))
|
|
{
|
|
- ChunkPosition chunkposition = func_151350_a(p_77192_1_, chunkcoordintpair1.chunkXPos, chunkcoordintpair1.chunkZPos);
|
|
+ ChunkPosition chunkposition = func_151350_a(p_77192_1_, LongHash.msw(key), LongHash.lsw(key));
|
|
+ // CraftBukkit end
|
|
int j1 = chunkposition.chunkPosX;
|
|
int k1 = chunkposition.chunkPosY;
|
|
int l1 = chunkposition.chunkPosZ;
|
|
@@ -170,7 +208,8 @@
|
|
if (canSpawn == Result.ALLOW || (canSpawn == Result.DEFAULT && entityliving.getCanSpawnHere()))
|
|
{
|
|
++i2;
|
|
- p_77192_1_.spawnEntityInWorld(entityliving);
|
|
+ // CraftBukkit start - Added a reason for spawning this creature, moved entityliving.onSpawnWithEgg(ientitylivingdata) up
|
|
+ p_77192_1_.addEntity(entityliving, SpawnReason.NATURAL);
|
|
if (!ForgeEventFactory.doSpecialSpawn(entityliving, p_77192_1_, f, f1, f2))
|
|
{
|
|
ientitylivingdata = entityliving.onSpawnWithEgg(ientitylivingdata);
|
|
@@ -266,8 +305,10 @@
|
|
}
|
|
|
|
entityliving.setLocationAndAngles((double)f, (double)f1, (double)f2, p_77191_6_.nextFloat() * 360.0F, 0.0F);
|
|
- p_77191_0_.spawnEntityInWorld(entityliving);
|
|
+ // CraftBukkit start - Added a reason for spawning this creature, moved entityliving.a(ientitylivingdata) up
|
|
ientitylivingdata = entityliving.onSpawnWithEgg(ientitylivingdata);
|
|
+ p_77191_0_.addEntity(entityliving, SpawnReason.CHUNK_GEN);
|
|
+ // CraftBukkit end
|
|
flag = true;
|
|
}
|
|
|