Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 85 additions & 107 deletions src/main/java/net/minecraft/server/World.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,13 @@ public abstract class World implements IBlockAccess {
private ArrayList L;
private boolean M;
int[] I;

public int mhvari;
public int mhvarj;
public int mhvark;
public int mhvarl;
public int mhvari1;
public int mhvarj1;

public BiomeBase getBiome(int i, int j) {
if (this.isLoaded(i, 0, j)) {
Expand Down Expand Up @@ -114,6 +121,23 @@ public CraftWorld getWorld() {
public CraftServer getServer() {
return (CraftServer) Bukkit.getServer();
}

public boolean inBounds(int a, int b) {
if(a >= -30000000 && b >= -30000000 && a < 30000000 && b < 30000000) {
return true;
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need the return true/return false bits – just return the value of the test without the if statement at all.

} else {
return false;
}
}

public void generateMHValues(AxisAlignedBB axisalignedbb) {
mhvari = MathHelper.floor(axisalignedbb.a);
mhvarj = MathHelper.floor(axisalignedbb.d + 1.0D);
mhvark = MathHelper.floor(axisalignedbb.b);
mhvarl = MathHelper.floor(axisalignedbb.e + 1.0D);
mhvari1 = MathHelper.floor(axisalignedbb.c);
mhvarj1 = MathHelper.floor(axisalignedbb.f + 1.0D);
}

// Changed signature - added gen and env
public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) {
Expand Down Expand Up @@ -199,7 +223,7 @@ public Block b(int i, int j) {
}

public Block getType(int i, int j, int k) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 && j >= 0 && j < 256) {
if (inBounds(i, k) && j >= 0 && j < 256) {
Chunk chunk = null;

try {
Expand Down Expand Up @@ -276,10 +300,8 @@ public Chunk getChunkAt(int i, int j) {
}

public boolean setTypeAndData(int i, int j, int k, Block block, int l, int i1) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (j < 0) {
return false;
} else if (j >= 256) {
if (inBounds(i, k)) {
if (j < 0 || j >= 256) {
return false;
} else {
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
Expand Down Expand Up @@ -315,10 +337,8 @@ public boolean setTypeAndData(int i, int j, int k, Block block, int l, int i1) {
}

public int getData(int i, int j, int k) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (j < 0) {
return 0;
} else if (j >= 256) {
if (inBounds(i, k)) {
if (j < 0 || j >= 256) {
return 0;
} else {
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
Expand All @@ -333,10 +353,8 @@ public int getData(int i, int j, int k) {
}

public boolean setData(int i, int j, int k, int l, int i1) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (j < 0) {
return false;
} else if (j >= 256) {
if (inBounds(i, k)) {
if (j < 0 || j >= 256) {
return false;
} else {
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
Expand Down Expand Up @@ -527,7 +545,7 @@ public int getLightLevel(int i, int j, int k) {
}

public int b(int i, int j, int k, boolean flag) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (inBounds(i, k)) {
if (flag && this.getType(i, j, k).n()) {
int l = this.b(i, j + 1, k, false);
int i1 = this.b(i + 1, j, k, false);
Expand Down Expand Up @@ -571,7 +589,7 @@ public int b(int i, int j, int k, boolean flag) {
}

public int getHighestBlockYAt(int i, int j) {
if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) {
if (inBounds(i, j)) {
if (!this.isChunkLoaded(i >> 4, j >> 4)) {
return 0;
} else {
Expand All @@ -585,7 +603,7 @@ public int getHighestBlockYAt(int i, int j) {
}

public int g(int i, int j) {
if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) {
if (inBounds(i, j)) {
if (!this.isChunkLoaded(i >> 4, j >> 4)) {
return 0;
} else {
Expand All @@ -607,7 +625,7 @@ public int b(EnumSkyBlock enumskyblock, int i, int j, int k) {
j = 255;
}

if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (inBounds(i, k)) {
int l = i >> 4;
int i1 = k >> 4;

Expand All @@ -624,7 +642,7 @@ public int b(EnumSkyBlock enumskyblock, int i, int j, int k) {
}

public void b(EnumSkyBlock enumskyblock, int i, int j, int k, int l) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (inBounds(i, k)) {
if (j >= 0) {
if (j < 256) {
if (this.isChunkLoaded(i >> 4, k >> 4)) {
Expand Down Expand Up @@ -990,20 +1008,15 @@ public void addIWorldAccess(IWorldAccess iworldaccess) {

public List getCubes(Entity entity, AxisAlignedBB axisalignedbb) {
this.L.clear();
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = i1; l1 < j1; ++l1) {
generateMHValues(axisalignedbb);

for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvari1; l1 < mhvarj1; ++l1) {
if (this.isLoaded(k1, 64, l1)) {
for (int i2 = k - 1; i2 < l; ++i2) {
for (int i2 = mhvark - 1; i2 < mhvarl; ++i2) {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Long-ish names like mhvark and mhvarl that differ only in the last character are very easy to typo and the resulting mistakes are then very hard to see. Also, putting those variables as fields in the class doesn't really buy you anything since they end up having to be reset at the start of every method that uses them. At least when they were local you knew they didn't bleed across methods in some weird way, but now that's much less obvious.

So I sympathize with the desire to do something about that annoying duplication, but I'm not sure this was the best way to deal with it. This would be much easier to deal with if Java had a clean way to return multiple variables from a function, but it doesn't. Sigh.

Block block;

if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) {
if (inBounds(k1, l1)) {
block = this.getType(k1, i2, l1);
} else {
block = Blocks.STONE;
Expand Down Expand Up @@ -1036,20 +1049,15 @@ public List getCubes(Entity entity, AxisAlignedBB axisalignedbb) {

public List a(AxisAlignedBB axisalignedbb) {
this.L.clear();
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = i1; l1 < j1; ++l1) {
generateMHValues(axisalignedbb);

for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvari1; l1 < mhvarj1; ++l1) {
if (this.isLoaded(k1, 64, l1)) {
for (int i2 = k - 1; i2 < l; ++i2) {
for (int i2 = mhvark - 1; i2 < mhvarl; ++i2) {
Block block;

if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) {
if (inBounds(k1, l1)) {
block = this.getType(k1, i2, l1);
} else {
block = Blocks.BEDROCK;
Expand Down Expand Up @@ -1415,28 +1423,23 @@ public boolean a(AxisAlignedBB axisalignedbb, Entity entity) {
}

public boolean c(AxisAlignedBB axisalignedbb) {
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);
generateMHValues(axisalignedbb);

if (axisalignedbb.a < 0.0D) {
--i;
--mhvari;
}

if (axisalignedbb.b < 0.0D) {
--k;
--mhvark;
}

if (axisalignedbb.c < 0.0D) {
--i1;
--mhvari1;
}

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = k; l1 < l; ++l1) {
for (int i2 = i1; i2 < j1; ++i2) {
for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvark; l1 < mhvarl; ++l1) {
for (int i2 = mhvari1; i2 < mhvarj1; ++i2) {
Block block = this.getType(k1, l1, i2);

if (block.getMaterial() != Material.AIR) {
Expand All @@ -1450,28 +1453,23 @@ public boolean c(AxisAlignedBB axisalignedbb) {
}

public boolean containsLiquid(AxisAlignedBB axisalignedbb) {
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);
generateMHValues(axisalignedbb);

if (axisalignedbb.a < 0.0D) {
--i;
--mhvari;
}

if (axisalignedbb.b < 0.0D) {
--k;
--mhvark;
}

if (axisalignedbb.c < 0.0D) {
--i1;
--mhvari1;
}

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = k; l1 < l; ++l1) {
for (int i2 = i1; i2 < j1; ++i2) {
for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvark; l1 < mhvarl; ++l1) {
for (int i2 = mhvari1; i2 < mhvarj1; ++i2) {
Block block = this.getType(k1, l1, i2);

if (block.getMaterial().isLiquid()) {
Expand All @@ -1485,17 +1483,12 @@ public boolean containsLiquid(AxisAlignedBB axisalignedbb) {
}

public boolean e(AxisAlignedBB axisalignedbb) {
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);

if (this.b(i, k, i1, j, l, j1)) {
for (int k1 = i; k1 < j; ++k1) {
for (int l1 = k; l1 < l; ++l1) {
for (int i2 = i1; i2 < j1; ++i2) {
generateMHValues(axisalignedbb);

if (this.b(mhvari, mhvark, mhvari1, mhvarj, mhvarl, mhvarj1)) {
for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvark; l1 < mhvarl; ++l1) {
for (int i2 = mhvari1; i2 < mhvarj1; ++i2) {
Block block = this.getType(k1, l1, i2);

if (block == Blocks.FIRE || block == Blocks.LAVA || block == Blocks.STATIONARY_LAVA) {
Expand All @@ -1510,22 +1503,17 @@ public boolean e(AxisAlignedBB axisalignedbb) {
}

public boolean a(AxisAlignedBB axisalignedbb, Material material, Entity entity) {
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);

if (!this.b(i, k, i1, j, l, j1)) {
generateMHValues(axisalignedbb);

if (!this.b(mhvari, mhvark, mhvari1, mhvarj, mhvarl, mhvarj1)) {
return false;
} else {
boolean flag = false;
Vec3D vec3d = Vec3D.a(0.0D, 0.0D, 0.0D);

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = k; l1 < l; ++l1) {
for (int i2 = i1; i2 < j1; ++i2) {
for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvark; l1 < mhvarl; ++l1) {
for (int i2 = mhvari1; i2 < mhvarj1; ++i2) {
Block block = this.getType(k1, l1, i2);

if (block.getMaterial() == material) {
Expand Down Expand Up @@ -1554,16 +1542,11 @@ public boolean a(AxisAlignedBB axisalignedbb, Material material, Entity entity)
}

public boolean a(AxisAlignedBB axisalignedbb, Material material) {
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = k; l1 < l; ++l1) {
for (int i2 = i1; i2 < j1; ++i2) {
generateMHValues(axisalignedbb);

for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvark; l1 < mhvarl; ++l1) {
for (int i2 = mhvari1; i2 < mhvarj1; ++i2) {
if (this.getType(k1, l1, i2).getMaterial() == material) {
return true;
}
Expand All @@ -1575,16 +1558,11 @@ public boolean a(AxisAlignedBB axisalignedbb, Material material) {
}

public boolean b(AxisAlignedBB axisalignedbb, Material material) {
int i = MathHelper.floor(axisalignedbb.a);
int j = MathHelper.floor(axisalignedbb.d + 1.0D);
int k = MathHelper.floor(axisalignedbb.b);
int l = MathHelper.floor(axisalignedbb.e + 1.0D);
int i1 = MathHelper.floor(axisalignedbb.c);
int j1 = MathHelper.floor(axisalignedbb.f + 1.0D);

for (int k1 = i; k1 < j; ++k1) {
for (int l1 = k; l1 < l; ++l1) {
for (int i2 = i1; i2 < j1; ++i2) {
generateMHValues(axisalignedbb);

for (int k1 = mhvari; k1 < mhvarj; ++k1) {
for (int l1 = mhvark; l1 < mhvarl; ++l1) {
for (int i2 = mhvari1; i2 < mhvarj1; ++i2) {
Block block = this.getType(k1, l1, i2);

if (block.getMaterial() == material) {
Expand Down Expand Up @@ -1793,7 +1771,7 @@ public static boolean a(IBlockAccess iblockaccess, int i, int j, int k) {
}

public boolean c(int i, int j, int k, boolean flag) {
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (inBounds(i, k)) {
Chunk chunk = this.chunkProvider.getOrCreateChunk(i >> 4, k >> 4);

if (chunk != null && !chunk.isEmpty()) {
Expand Down