summaryrefslogtreecommitdiffstats
path: root/src/main/java/net/minecraft/server/World.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/minecraft/server/World.java')
-rw-r--r--src/main/java/net/minecraft/server/World.java279
1 files changed, 174 insertions, 105 deletions
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 5c9936d3..494c2262 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -1,6 +1,7 @@
package net.minecraft.server;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -36,12 +37,13 @@ public class World implements IBlockAccess {
private TreeSet E = new TreeSet();
private Set F = new HashSet();
public List c = new ArrayList();
+ private List G = new ArrayList();
public List players = new ArrayList();
public List e = new ArrayList();
- private long G = 16777215L;
+ private long H = 16777215L;
public int f = 0;
protected int g = (new Random()).nextInt();
- protected int h = 1013904223;
+ protected final int h = 1013904223;
protected float i;
protected float j;
protected float k;
@@ -49,7 +51,7 @@ public class World implements IBlockAccess {
protected int m = 0;
public int n = 0;
public boolean suppressPhysics = false;
- private long H = System.currentTimeMillis();
+ private long I = System.currentTimeMillis();
protected int p = 40;
public int spawnMonsters;
public Random random = new Random();
@@ -60,16 +62,17 @@ public class World implements IBlockAccess {
protected final IDataManager w;
public WorldData worldData; // CraftBukkit - protected -> public
public boolean isLoading;
- private boolean I;
+ private boolean J;
public WorldMapCollection worldMaps;
- private ArrayList J = new ArrayList();
- private int K = 0;
+ private ArrayList K = new ArrayList();
+ private boolean L;
+ private int M = 0;
public boolean allowMonsters = true; // CraftBukkit - private -> public
public boolean allowAnimals = true; // CraftBukkit - private -> public
static int A = 0;
- private Set N = new HashSet();
- private int O;
- private List P;
+ private Set P = new HashSet();
+ private int Q;
+ private List R;
public boolean isStatic;
public WorldChunkManager getWorldChunkManager() {
@@ -107,8 +110,8 @@ public class World implements IBlockAccess {
this.world = new CraftWorld((WorldServer) this, gen, env);
// CraftBukkit end
- this.O = this.random.nextInt(12000);
- this.P = new ArrayList();
+ this.Q = this.random.nextInt(12000);
+ this.R = new ArrayList();
this.isStatic = false;
this.w = idatamanager;
this.worldMaps = new WorldMapCollection(idatamanager);
@@ -407,7 +410,7 @@ public class World implements IBlockAccess {
this.b(i, k, j, i, l, j);
}
- public void h(int i, int j, int k) {
+ public void i(int i, int j, int k) {
for (int l = 0; l < this.u.size(); ++l) {
((IWorldAccess) this.u.get(l)).a(i, j, k, i, j, k);
}
@@ -454,7 +457,7 @@ public class World implements IBlockAccess {
return this.getChunkAt(i >> 4, k >> 4).c(i & 15, j, k & 15);
}
- public int j(int i, int j, int k) {
+ public int k(int i, int j, int k) {
if (j < 0) {
return 0;
} else {
@@ -520,7 +523,7 @@ public class World implements IBlockAccess {
}
}
- public boolean l(int i, int j, int k) {
+ public boolean m(int i, int j, int k) {
if (i >= -32000000 && k >= -32000000 && i < 32000000 && k <= 32000000) {
if (j < 0) {
return false;
@@ -558,7 +561,7 @@ public class World implements IBlockAccess {
if (!this.worldProvider.e || enumskyblock != EnumSkyBlock.SKY) {
if (this.isLoaded(i, j, k)) {
if (enumskyblock == EnumSkyBlock.SKY) {
- if (this.l(i, j, k)) {
+ if (this.m(i, j, k)) {
l = 15;
}
} else if (enumskyblock == EnumSkyBlock.BLOCK) {
@@ -619,7 +622,7 @@ public class World implements IBlockAccess {
}
}
- public float m(int i, int j, int k) {
+ public float n(int i, int j, int k) {
return this.worldProvider.f[this.getLightLevel(i, j, k)];
}
@@ -648,7 +651,7 @@ public class World implements IBlockAccess {
int l1 = this.getData(l, i1, j1);
Block block = Block.byId[k1];
- if ((!flag1 || block == null || block.d(this, l, i1, j1) != null) && k1 > 0 && block.a(l1, flag)) {
+ if ((!flag1 || block == null || block.e(this, l, i1, j1) != null) && k1 > 0 && block.a(l1, flag)) {
MovingObjectPosition movingobjectposition = block.a(this, l, i1, j1, vec3d, vec3d1);
if (movingobjectposition != null) {
@@ -776,7 +779,7 @@ public class World implements IBlockAccess {
int j2 = this.getData(l, i1, j1);
Block block1 = Block.byId[i2];
- if ((!flag1 || block1 == null || block1.d(this, l, i1, j1) != null) && i2 > 0 && block1.a(j2, flag)) {
+ if ((!flag1 || block1 == null || block1.e(this, l, i1, j1) != null) && i2 > 0 && block1.a(j2, flag)) {
MovingObjectPosition movingobjectposition1 = block1.a(this, l, i1, j1, vec3d, vec3d1);
if (movingobjectposition1 != null) {
@@ -906,10 +909,10 @@ public class World implements IBlockAccess {
this.everyoneSleeping();
}
- int i = entity.bG;
- int j = entity.bI;
+ int i = entity.bH;
+ int j = entity.bJ;
- if (entity.bF && this.isChunkLoaded(i, j)) {
+ if (entity.bG && this.isChunkLoaded(i, j)) {
this.getChunkAt(i, j).b(entity);
}
@@ -922,7 +925,7 @@ public class World implements IBlockAccess {
}
public List getEntities(Entity entity, AxisAlignedBB axisalignedbb) {
- this.J.clear();
+ this.K.clear();
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
@@ -937,7 +940,7 @@ public class World implements IBlockAccess {
Block block = Block.byId[this.getTypeId(k1, i2, l1)];
if (block != null) {
- block.a(this, k1, i2, l1, axisalignedbb, this.J);
+ block.a(this, k1, i2, l1, axisalignedbb, this.K);
}
}
}
@@ -951,16 +954,16 @@ public class World implements IBlockAccess {
AxisAlignedBB axisalignedbb1 = ((Entity) list.get(j2)).e_();
if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) {
- this.J.add(axisalignedbb1);
+ this.K.add(axisalignedbb1);
}
axisalignedbb1 = entity.a_((Entity) list.get(j2));
if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) {
- this.J.add(axisalignedbb1);
+ this.K.add(axisalignedbb1);
}
}
- return this.J;
+ return this.K;
}
public int a(float f) {
@@ -1058,7 +1061,7 @@ public class World implements IBlockAccess {
continue;
}
// CraftBukkit end
- entity.o_();
+ entity.m_();
if (entity.dead) {
this.e.remove(i--);
}
@@ -1071,9 +1074,9 @@ public class World implements IBlockAccess {
for (i = 0; i < this.D.size(); ++i) {
entity = (Entity) this.D.get(i);
- j = entity.bG;
- k = entity.bI;
- if (entity.bF && this.isChunkLoaded(j, k)) {
+ j = entity.bH;
+ k = entity.bJ;
+ if (entity.bG && this.isChunkLoaded(j, k)) {
this.getChunkAt(j, k).b(entity);
}
}
@@ -1100,9 +1103,9 @@ public class World implements IBlockAccess {
}
if (entity.dead) {
- j = entity.bG;
- k = entity.bI;
- if (entity.bF && this.isChunkLoaded(j, k)) {
+ j = entity.bH;
+ k = entity.bJ;
+ if (entity.bG && this.isChunkLoaded(j, k)) {
this.getChunkAt(j, k).b(entity);
}
@@ -1111,10 +1114,57 @@ public class World implements IBlockAccess {
}
}
- for (i = 0; i < this.c.size(); ++i) {
- TileEntity tileentity = (TileEntity) this.c.get(i);
+ this.L = true;
+ Iterator iterator = this.c.iterator();
- tileentity.g_();
+ while (iterator.hasNext()) {
+ TileEntity tileentity = (TileEntity) iterator.next();
+
+ if (!tileentity.g()) {
+ tileentity.g_();
+ }
+
+ if (tileentity.g()) {
+ iterator.remove();
+ Chunk chunk = this.getChunkAt(tileentity.x >> 4, tileentity.z >> 4);
+
+ if (chunk != null) {
+ chunk.e(tileentity.x & 15, tileentity.y, tileentity.z & 15);
+ }
+ }
+ }
+
+ this.L = false;
+ if (!this.G.isEmpty()) {
+ Iterator iterator1 = this.G.iterator();
+
+ while (iterator1.hasNext()) {
+ TileEntity tileentity1 = (TileEntity) iterator1.next();
+
+ if (!tileentity1.g()) {
+ if (!this.c.contains(tileentity1)) {
+ this.c.add(tileentity1);
+ }
+
+ Chunk chunk1 = this.getChunkAt(tileentity1.x >> 4, tileentity1.z >> 4);
+
+ if (chunk1 != null) {
+ chunk1.a(tileentity1.x & 15, tileentity1.y, tileentity1.z & 15, tileentity1);
+ }
+
+ this.notify(tileentity1.x, tileentity1.y, tileentity1.z);
+ }
+ }
+
+ this.G.clear();
+ }
+ }
+
+ public void a(Collection collection) {
+ if (this.L) {
+ this.G.addAll(collection);
+ } else {
+ this.c.addAll(collection);
}
}
@@ -1133,11 +1183,11 @@ public class World implements IBlockAccess {
entity.bq = entity.locZ;
entity.lastYaw = entity.yaw;
entity.lastPitch = entity.pitch;
- if (flag && entity.bF) {
+ if (flag && entity.bG) {
if (entity.vehicle != null) {
- entity.D();
+ entity.E();
} else {
- entity.o_();
+ entity.m_();
}
}
@@ -1165,20 +1215,20 @@ public class World implements IBlockAccess {
int l = MathHelper.floor(entity.locY / 16.0D);
int i1 = MathHelper.floor(entity.locZ / 16.0D);
- if (!entity.bF || entity.bG != k || entity.bH != l || entity.bI != i1) {
- if (entity.bF && this.isChunkLoaded(entity.bG, entity.bI)) {
- this.getChunkAt(entity.bG, entity.bI).a(entity, entity.bH);
+ if (!entity.bG || entity.bH != k || entity.bI != l || entity.bJ != i1) {
+ if (entity.bG && this.isChunkLoaded(entity.bH, entity.bJ)) {
+ this.getChunkAt(entity.bH, entity.bJ).a(entity, entity.bI);
}
if (this.isChunkLoaded(k, i1)) {
- entity.bF = true;
+ entity.bG = true;
this.getChunkAt(k, i1).a(entity);
} else {
- entity.bF = false;
+ entity.bG = false;
}
}
- if (flag && entity.bF && entity.passenger != null) {
+ if (flag && entity.bG && entity.passenger != null) {
if (!entity.passenger.dead && entity.passenger.vehicle == entity) {
this.playerJoinedWorld(entity.passenger);
} else {
@@ -1474,18 +1524,38 @@ public class World implements IBlockAccess {
}
public void setTileEntity(int i, int j, int k, TileEntity tileentity) {
- Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
+ if (!tileentity.g()) {
+ if (this.L) {
+ tileentity.x = i;
+ tileentity.y = j;
+ tileentity.z = k;
+ this.G.add(tileentity);
+ } else {
+ this.c.add(tileentity);
+ Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
- if (chunk != null) {
- chunk.a(i & 15, j, k & 15, tileentity);
+ if (chunk != null) {
+ chunk.a(i & 15, j, k & 15, tileentity);
+ }
+ }
}
}
public void o(int i, int j, int k) {
- Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
+ TileEntity tileentity = this.getTileEntity(i, j, k);
+
+ if (tileentity != null && this.L) {
+ tileentity.h();
+ } else {
+ if (tileentity != null) {
+ this.c.remove(tileentity);
+ }
- if (chunk != null) {
- chunk.e(i & 15, j, k & 15);
+ Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
+
+ if (chunk != null) {
+ chunk.e(i & 15, j, k & 15);
+ }
}
}
@@ -1495,23 +1565,23 @@ public class World implements IBlockAccess {
return block == null ? false : block.a();
}
- public boolean d(int i, int j, int k) {
+ public boolean e(int i, int j, int k) {
Block block = Block.byId[this.getTypeId(i, j, k)];
return block == null ? false : block.material.h() && block.b();
}
public boolean doLighting() {
- if (this.K >= 50) {
+ if (this.M >= 50) {
return false;
} else {
- ++this.K;
-
- boolean flag;
+ ++this.M;
try {
int i = 500;
+ boolean flag;
+
while (this.C.size() > 0) {
--i;
if (i <= 0) {
@@ -1523,11 +1593,10 @@ public class World implements IBlockAccess {
}
flag = false;
+ return flag;
} finally {
- --this.K;
+ --this.M;
}
-
- return flag;
}
}
@@ -1547,37 +1616,37 @@ public class World implements IBlockAccess {
int k1 = (l + i) / 2;
int l1 = (j1 + k) / 2;
- if (!this.isLoaded(k1, 64, l1)) {
- return;
- }
-
- if (this.getChunkAtWorldCoords(k1, l1).isEmpty()) {
- return;
- }
+ if (this.isLoaded(k1, 64, l1)) {
+ if (this.getChunkAtWorldCoords(k1, l1).isEmpty()) {
+ return;
+ }
- int i2 = this.C.size();
- int j2;
+ int i2 = this.C.size();
+ int j2;
- if (flag) {
- j2 = 5;
- if (j2 > i2) {
- j2 = i2;
- }
+ if (flag) {
+ j2 = 5;
+ if (j2 > i2) {
+ j2 = i2;
+ }
- for (int k2 = 0; k2 < j2; ++k2) {
- MetadataChunkBlock metadatachunkblock = (MetadataChunkBlock) this.C.get(this.C.size() - k2 - 1);
+ for (int k2 = 0; k2 < j2; ++k2) {
+ MetadataChunkBlock metadatachunkblock = (MetadataChunkBlock) this.C.get(this.C.size() - k2 - 1);
- if (metadatachunkblock.a == enumskyblock && metadatachunkblock.a(i, j, k, l, i1, j1)) {
- return;
+ if (metadatachunkblock.a == enumskyblock && metadatachunkblock.a(i, j, k, l, i1, j1)) {
+ return;
+ }
}
}
- }
- this.C.add(new MetadataChunkBlock(enumskyblock, i, j, k, l, i1, j1));
- j2 = 1000000;
- if (this.C.size() > 1000000) {
- System.out.println("More than " + j2 + " updates, aborting lighting updates");
- this.C.clear();
+ this.C.add(new MetadataChunkBlock(enumskyblock, i, j, k, l, i1, j1));
+ j2 = 1000000;
+ if (this.C.size() > 1000000) {
+ System.out.println("More than " + j2 + " updates, aborting lighting updates");
+ this.C.clear();
+ }
+
+ return;
}
} finally {
--A;
@@ -1754,7 +1823,7 @@ public class World implements IBlockAccess {
}
protected void j() {
- this.N.clear();
+ this.P.clear();
int i;
int j;
@@ -1770,16 +1839,16 @@ public class World implements IBlockAccess {
for (k = -b0; k <= b0; ++k) {
for (l = -b0; l <= b0; ++l) {
- this.N.add(new ChunkCoordIntPair(k + i, l + j));
+ this.P.add(new ChunkCoordIntPair(k + i, l + j));
}
}
}
- if (this.O > 0) {
- --this.O;
+ if (this.Q > 0) {
+ --this.Q;
}
- Iterator iterator = this.N.iterator();
+ Iterator iterator = this.P.iterator();
while (iterator.hasNext()) {
ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next();
@@ -1791,8 +1860,8 @@ public class World implements IBlockAccess {
int k1;
int l1;
- if (this.O == 0) {
- this.g = this.g * 3 + this.h;
+ if (this.Q == 0) {
+ this.g = this.g * 3 + 1013904223;
k = this.g >> 2;
l = k & 15;
j1 = k >> 8 & 15;
@@ -1800,18 +1869,18 @@ public class World implements IBlockAccess {
l1 = chunk.getTypeId(l, k1, j1);
l += i;
j1 += j;
- if (l1 == 0 && this.j(l, k1, j1) <= this.random.nextInt(8) && this.a(EnumSkyBlock.SKY, l, k1, j1) <= 0) {
+ if (l1 == 0 && this.k(l, k1, j1) <= this.random.nextInt(8) && this.a(EnumSkyBlock.SKY, l, k1, j1) <= 0) {
EntityHuman entityhuman1 = this.a((double) l + 0.5D, (double) k1 + 0.5D, (double) j1 + 0.5D, 8.0D);
if (entityhuman1 != null && entityhuman1.d((double) l + 0.5D, (double) k1 + 0.5D, (double) j1 + 0.5D) > 4.0D) {
this.makeSound((double) l + 0.5D, (double) k1 + 0.5D, (double) j1 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.random.nextFloat() * 0.2F);
- this.O = this.random.nextInt(12000) + 6000;
+ this.Q = this.random.nextInt(12000) + 6000;
}
}
}
if (this.random.nextInt(100000) == 0 && this.v() && this.u()) {
- this.g = this.g * 3 + this.h;
+ this.g = this.g * 3 + 1013904223;
k = this.g >> 2;
l = i + (k & 15);
j1 = j + (k >> 8 & 15);
@@ -1825,7 +1894,7 @@ public class World implements IBlockAccess {
int i2;
if (this.random.nextInt(16) == 0) {
- this.g = this.g * 3 + this.h;
+ this.g = this.g * 3 + 1013904223;
k = this.g >> 2;
l = k & 15;
j1 = k >> 8 & 15;
@@ -1861,7 +1930,7 @@ public class World implements IBlockAccess {
}
for (k = 0; k < 80; ++k) {
- this.g = this.g * 3 + this.h;
+ this.g = this.g * 3 + 1013904223;
l = this.g >> 2;
j1 = l & 15;
k1 = l >> 8 & 15;
@@ -1909,7 +1978,7 @@ public class World implements IBlockAccess {
}
public List b(Entity entity, AxisAlignedBB axisalignedbb) {
- this.P.clear();
+ this.R.clear();
int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D);
int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D);
int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D);
@@ -1918,12 +1987,12 @@ public class World implements IBlockAccess {
for (int i1 = i; i1 <= j; ++i1) {
for (int j1 = k; j1 <= l; ++j1) {
if (this.isChunkLoaded(i1, j1)) {
- this.getChunkAt(i1, j1).a(entity, axisalignedbb, this.P);
+ this.getChunkAt(i1, j1).a(entity, axisalignedbb, this.R);
}
}
}
- return this.P;
+ return this.R;
}
public List a(Class oclass, AxisAlignedBB axisalignedbb) {
@@ -1992,7 +2061,7 @@ public class World implements IBlockAccess {
int j1 = this.getTypeId(j, k, l);
Block block = Block.byId[j1];
Block block1 = Block.byId[i];
- AxisAlignedBB axisalignedbb = block1.d(this, j, k, l);
+ AxisAlignedBB axisalignedbb = block1.e(this, j, k, l);
if (flag) {
axisalignedbb = null;
@@ -2053,7 +2122,7 @@ public class World implements IBlockAccess {
public boolean isBlockFacePowered(int i, int j, int k, int l) {
int i1 = this.getTypeId(i, j, k);
- return i1 == 0 ? false : Block.byId[i1].c(this, i, j, k, l);
+ return i1 == 0 ? false : Block.byId[i1].d(this, i, j, k, l);
}
public boolean isBlockPowered(int i, int j, int k) {
@@ -2061,7 +2130,7 @@ public class World implements IBlockAccess {
}
public boolean isBlockFaceIndirectlyPowered(int i, int j, int k, int l) {
- if (this.d(i, j, k)) {
+ if (this.e(i, j, k)) {
return this.isBlockPowered(i, j, k);
} else {
int i1 = this.getTypeId(i, j, k);
@@ -2206,7 +2275,7 @@ public class World implements IBlockAccess {
}
public void everyoneSleeping() {
- this.I = !this.players.isEmpty();
+ this.J = !this.players.isEmpty();
Iterator iterator = this.players.iterator();
while (iterator.hasNext()) {
@@ -2214,7 +2283,7 @@ public class World implements IBlockAccess {
// CraftBukkit
if (!entityhuman.isSleeping() && !entityhuman.fauxSleeping) {
- this.I = false;
+ this.J = false;
break;
}
}
@@ -2231,7 +2300,7 @@ public class World implements IBlockAccess {
// CraftBukkit end
protected void s() {
- this.I = false;
+ this.J = false;
Iterator iterator = this.players.iterator();
while (iterator.hasNext()) {
@@ -2246,7 +2315,7 @@ public class World implements IBlockAccess {
}
public boolean everyoneDeeplySleeping() {
- if (this.I && !this.isStatic) {
+ if (this.J && !this.isStatic) {
Iterator iterator = this.players.iterator();
// CraftBukkit - This allows us to assume that some people are in bed but not really, allowing time to pass in spite of AFKers