2011-02-07 06:56:07 +01:00
|
|
|
package net.minecraft.server;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2011-06-30 00:02:25 +02:00
|
|
|
import java.util.Collection;
|
2011-02-07 06:56:07 +01:00
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Random;
|
2012-07-29 09:33:13 +02:00
|
|
|
import java.util.concurrent.Callable;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-02-07 10:43:50 +01:00
|
|
|
// CraftBukkit start
|
2011-06-17 04:06:45 +02:00
|
|
|
import org.bukkit.Bukkit;
|
2012-08-18 01:53:59 +02:00
|
|
|
import org.bukkit.craftbukkit.util.LongHashSet;
|
2012-08-17 19:55:33 +02:00
|
|
|
import org.bukkit.craftbukkit.util.UnsafeList;
|
2011-06-06 15:52:02 +02:00
|
|
|
import org.bukkit.generator.ChunkGenerator;
|
2011-04-26 01:47:25 +02:00
|
|
|
import org.bukkit.craftbukkit.CraftServer;
|
2011-02-07 10:43:50 +01:00
|
|
|
import org.bukkit.craftbukkit.CraftWorld;
|
2011-03-20 21:18:38 +01:00
|
|
|
import org.bukkit.craftbukkit.event.CraftEventFactory;
|
2011-02-07 10:43:50 +01:00
|
|
|
import org.bukkit.event.block.BlockCanBuildEvent;
|
|
|
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
2011-06-21 22:20:11 +02:00
|
|
|
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
2011-04-26 01:47:25 +02:00
|
|
|
import org.bukkit.event.weather.WeatherChangeEvent;
|
|
|
|
import org.bukkit.event.weather.ThunderChangeEvent;
|
2011-02-07 10:43:50 +01:00
|
|
|
// CraftBukkit end
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public abstract class World implements IBlockAccess {
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean e = false;
|
2012-03-01 11:49:23 +01:00
|
|
|
public List entityList = new ArrayList();
|
2012-07-29 09:33:13 +02:00
|
|
|
protected List g = new ArrayList();
|
2012-03-01 11:49:23 +01:00
|
|
|
public List tileEntityList = new ArrayList();
|
2012-07-29 09:33:13 +02:00
|
|
|
private List a = new ArrayList();
|
|
|
|
private List b = new ArrayList();
|
2012-03-01 11:49:23 +01:00
|
|
|
public List players = new ArrayList();
|
2012-07-29 09:33:13 +02:00
|
|
|
public List j = new ArrayList();
|
|
|
|
private long c = 16777215L;
|
|
|
|
public int k = 0;
|
|
|
|
protected int l = (new Random()).nextInt();
|
|
|
|
protected final int m = 1013904223;
|
|
|
|
protected float n;
|
|
|
|
protected float o;
|
|
|
|
protected float p;
|
|
|
|
protected float q;
|
|
|
|
protected int r = 0;
|
|
|
|
public int s = 0;
|
2012-03-01 11:49:23 +01:00
|
|
|
public boolean suppressPhysics = false;
|
2011-09-24 23:03:31 +02:00
|
|
|
public int difficulty;
|
2012-03-01 11:49:23 +01:00
|
|
|
public Random random = new Random();
|
2011-06-12 00:02:58 +02:00
|
|
|
public WorldProvider worldProvider; // CraftBukkit - remove final
|
2012-07-29 09:33:13 +02:00
|
|
|
protected List x = new ArrayList();
|
2011-05-14 16:29:42 +02:00
|
|
|
public IChunkProvider chunkProvider; // CraftBukkit - protected -> public
|
2011-11-30 00:17:43 +01:00
|
|
|
protected final IDataManager dataManager;
|
2011-05-14 16:29:42 +02:00
|
|
|
public WorldData worldData; // CraftBukkit - protected -> public
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean isLoading;
|
2011-06-27 00:25:01 +02:00
|
|
|
public WorldMapCollection worldMaps;
|
2012-03-01 11:49:23 +01:00
|
|
|
public final VillageCollection villages = new VillageCollection(this);
|
2012-07-29 09:33:13 +02:00
|
|
|
protected final VillageSiege siegeManager = new VillageSiege(this);
|
|
|
|
public final MethodProfiler methodProfiler;
|
2012-08-17 19:55:33 +02:00
|
|
|
private UnsafeList d = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList
|
2012-07-29 09:33:13 +02:00
|
|
|
private boolean L;
|
|
|
|
// CraftBukkit start - public, longhashset
|
|
|
|
public boolean allowMonsters = true;
|
|
|
|
public boolean allowAnimals = true;
|
2012-08-18 01:53:59 +02:00
|
|
|
protected LongHashSet chunkTickList = new LongHashSet();
|
2012-07-29 09:33:13 +02:00
|
|
|
public long ticksPerAnimalSpawns;
|
|
|
|
public long ticksPerMonsterSpawns;
|
|
|
|
// CraftBukkit end
|
|
|
|
private int M;
|
|
|
|
int[] J;
|
|
|
|
private List N;
|
2011-02-07 06:56:07 +01:00
|
|
|
public boolean isStatic;
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public BiomeBase getBiome(int i, int j) {
|
|
|
|
if (this.isLoaded(i, 0, j)) {
|
|
|
|
Chunk chunk = this.getChunkAtWorldCoords(i, j);
|
|
|
|
|
|
|
|
if (chunk != null) {
|
|
|
|
return chunk.a(i & 15, j & 15, this.worldProvider.c);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.worldProvider.c.getBiome(i, j);
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public WorldChunkManager getWorldChunkManager() {
|
2012-01-12 23:10:13 +01:00
|
|
|
return this.worldProvider.c;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-06-12 00:02:58 +02:00
|
|
|
// CraftBukkit start
|
2011-06-17 04:06:45 +02:00
|
|
|
private final CraftWorld world;
|
2011-06-12 00:02:58 +02:00
|
|
|
public boolean pvpMode;
|
2011-07-27 01:24:27 +02:00
|
|
|
public boolean keepSpawnInMemory = true;
|
2011-06-12 00:02:58 +02:00
|
|
|
public ChunkGenerator generator;
|
|
|
|
Chunk lastChunkAccessed;
|
|
|
|
int lastXAccessed = Integer.MIN_VALUE;
|
|
|
|
int lastZAccessed = Integer.MIN_VALUE;
|
|
|
|
final Object chunkLock = new Object();
|
|
|
|
|
2011-06-17 04:06:45 +02:00
|
|
|
public CraftWorld getWorld() {
|
2011-06-27 00:25:01 +02:00
|
|
|
return this.world;
|
2011-06-17 04:06:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public CraftServer getServer() {
|
2011-06-27 00:25:01 +02:00
|
|
|
return (CraftServer) Bukkit.getServer();
|
2011-06-17 04:06:45 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
// Changed signature
|
|
|
|
public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) {
|
2011-06-06 15:52:02 +02:00
|
|
|
this.generator = gen;
|
2011-06-27 00:25:01 +02:00
|
|
|
this.world = new CraftWorld((WorldServer) this, gen, env);
|
2012-02-10 16:23:52 +01:00
|
|
|
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
|
|
|
|
this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit
|
2012-07-29 09:33:13 +02:00
|
|
|
// CraftBukkit end
|
|
|
|
|
|
|
|
this.M = this.random.nextInt(12000);
|
|
|
|
this.J = new int['\u8000'];
|
2012-08-17 19:55:33 +02:00
|
|
|
this.N = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList
|
2011-02-07 06:56:07 +01:00
|
|
|
this.isStatic = false;
|
2011-11-30 00:17:43 +01:00
|
|
|
this.dataManager = idatamanager;
|
2012-07-29 09:33:13 +02:00
|
|
|
this.methodProfiler = methodprofiler;
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldMaps = new WorldMapCollection(idatamanager);
|
2011-11-30 00:17:43 +01:00
|
|
|
this.worldData = idatamanager.getWorldData();
|
2011-02-07 06:56:07 +01:00
|
|
|
if (worldprovider != null) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.worldProvider = worldprovider;
|
2012-07-29 09:33:13 +02:00
|
|
|
} else if (this.worldData != null && this.worldData.i() != 0) {
|
|
|
|
this.worldProvider = WorldProvider.byDimension(this.worldData.i());
|
2011-02-23 03:37:56 +01:00
|
|
|
} else {
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldProvider = WorldProvider.byDimension(0);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.worldData == null) {
|
2011-09-15 02:23:52 +02:00
|
|
|
this.worldData = new WorldData(worldsettings, s);
|
2011-02-23 03:37:56 +01:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.worldData.setName(s);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
this.worldProvider.a(this);
|
2012-08-25 02:51:51 +02:00
|
|
|
this.chunkProvider = this.i();
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!this.worldData.isInitialized()) {
|
|
|
|
this.a(worldsettings);
|
|
|
|
this.worldData.d(true);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.v();
|
|
|
|
this.a();
|
2011-06-17 04:06:45 +02:00
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
this.getServer().addWorld(this.world); // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-08-25 02:51:51 +02:00
|
|
|
protected abstract IChunkProvider i();
|
2011-02-23 03:37:56 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
protected void a(WorldSettings worldsettings) {
|
|
|
|
this.worldData.d(true);
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public int b(int i, int j) {
|
2011-02-07 06:56:07 +01:00
|
|
|
int k;
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
for (k = 63; !this.isEmpty(i, k + 1, j); ++k) {
|
2011-02-07 06:56:07 +01:00
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.getTypeId(i, k, j);
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getTypeId(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 ? (j < 0 ? 0 : (j >= 256 ? 0 : this.getChunkAt(i >> 4, k >> 4).getTypeId(i & 15, j, k & 15))) : 0;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public int b(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 ? (j < 0 ? 0 : (j >= 256 ? 0 : this.getChunkAt(i >> 4, k >> 4).b(i & 15, j, k & 15))) : 0;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isEmpty(int i, int j, int k) {
|
|
|
|
return this.getTypeId(i, j, k) == 0;
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public boolean isTileEntity(int i, int j, int k) {
|
|
|
|
int l = this.getTypeId(i, j, k);
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
return Block.byId[l] != null && Block.byId[l].s();
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean isLoaded(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return j >= 0 && j < 256 ? this.isChunkLoaded(i >> 4, k >> 4) : false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
public boolean areChunksLoaded(int i, int j, int k, int l) {
|
2012-07-29 09:33:13 +02:00
|
|
|
return this.c(i - l, j - l, k - l, i + l, j + l, k + l);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean c(int i, int j, int k, int l, int i1, int j1) {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (i1 >= 0 && j < 256) {
|
2011-02-07 06:56:07 +01:00
|
|
|
i >>= 4;
|
|
|
|
k >>= 4;
|
|
|
|
l >>= 4;
|
|
|
|
j1 >>= 4;
|
|
|
|
|
|
|
|
for (int k1 = i; k1 <= l; ++k1) {
|
|
|
|
for (int l1 = k; l1 <= j1; ++l1) {
|
2012-08-19 23:06:14 +02:00
|
|
|
// CraftBukkit - check unload queue too so we don't leak a chunk
|
|
|
|
if (!this.isChunkLoaded(k1, l1) || ((WorldServer) this).chunkProviderServer.unloadQueue.contains(k1, l1)) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
protected boolean isChunkLoaded(int i, int j) {
|
2011-04-20 19:05:14 +02:00
|
|
|
return this.chunkProvider.isChunkLoaded(i, j);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
public Chunk getChunkAtWorldCoords(int i, int j) {
|
2011-04-20 19:05:14 +02:00
|
|
|
return this.getChunkAt(i >> 4, j >> 4);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-02-07 09:43:51 +01:00
|
|
|
// CraftBukkit start
|
2011-04-20 19:05:14 +02:00
|
|
|
public Chunk getChunkAt(int i, int j) {
|
2011-02-10 12:56:30 +01:00
|
|
|
Chunk result = null;
|
2011-06-27 00:25:01 +02:00
|
|
|
synchronized (this.chunkLock) {
|
|
|
|
if (this.lastChunkAccessed == null || this.lastXAccessed != i || this.lastZAccessed != j) {
|
|
|
|
this.lastXAccessed = i;
|
|
|
|
this.lastZAccessed = j;
|
|
|
|
this.lastChunkAccessed = this.chunkProvider.getOrCreateChunk(i, j);
|
2011-02-10 12:56:30 +01:00
|
|
|
}
|
2011-06-27 00:25:01 +02:00
|
|
|
result = this.lastChunkAccessed;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
2011-02-10 12:56:30 +01:00
|
|
|
return result;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
2011-02-07 09:43:51 +01:00
|
|
|
// CraftBukkit end
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean setRawTypeIdAndData(int i, int j, int k, int l, int i1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
return this.setRawTypeIdAndData(i, j, k, l, i1, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean setRawTypeIdAndData(int i, int j, int k, int l, int i1, boolean flag) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (j < 0) {
|
|
|
|
return false;
|
2012-03-01 11:49:23 +01:00
|
|
|
} else if (j >= 256) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return false;
|
|
|
|
} else {
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2012-07-29 09:33:13 +02:00
|
|
|
boolean flag1 = chunk.a(i & 15, j, k & 15, l, i1);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("checkLight");
|
2012-07-29 09:33:13 +02:00
|
|
|
this.x(i, j, k);
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2012-07-29 09:33:13 +02:00
|
|
|
if (flag && flag1 && (this.isStatic || chunk.seenByPlayer)) {
|
|
|
|
this.notify(i, j, k);
|
|
|
|
}
|
|
|
|
|
|
|
|
return flag1;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean setRawTypeId(int i, int j, int k, int l) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (j < 0) {
|
|
|
|
return false;
|
2012-03-01 11:49:23 +01:00
|
|
|
} else if (j >= 256) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return false;
|
|
|
|
} else {
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2011-09-15 02:23:52 +02:00
|
|
|
boolean flag = chunk.a(i & 15, j, k & 15, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("checkLight");
|
2012-07-29 09:33:13 +02:00
|
|
|
this.x(i, j, k);
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2012-07-29 09:33:13 +02:00
|
|
|
if (flag && (this.isStatic || chunk.seenByPlayer)) {
|
|
|
|
this.notify(i, j, k);
|
|
|
|
}
|
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
return flag;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Material getMaterial(int i, int j, int k) {
|
|
|
|
int l = this.getTypeId(i, j, k);
|
|
|
|
|
|
|
|
return l == 0 ? Material.AIR : Block.byId[l].material;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getData(int i, int j, int k) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (j < 0) {
|
|
|
|
return 0;
|
2012-03-01 11:49:23 +01:00
|
|
|
} else if (j >= 256) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return 0;
|
|
|
|
} else {
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
i &= 15;
|
|
|
|
k &= 15;
|
2011-04-20 19:05:14 +02:00
|
|
|
return chunk.getData(i, j, k);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void setData(int i, int j, int k, int l) {
|
|
|
|
if (this.setRawData(i, j, k, l)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.update(i, j, k, this.getTypeId(i, j, k));
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean setRawData(int i, int j, int k, int l) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (j < 0) {
|
|
|
|
return false;
|
2012-03-01 11:49:23 +01:00
|
|
|
} else if (j >= 256) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return false;
|
|
|
|
} else {
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2012-07-29 09:33:13 +02:00
|
|
|
int i1 = i & 15;
|
|
|
|
int j1 = k & 15;
|
|
|
|
boolean flag = chunk.b(i1, j, j1, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (flag && (this.isStatic || chunk.seenByPlayer && Block.r[chunk.getTypeId(i1, j, j1) & 4095])) {
|
|
|
|
this.notify(i, j, k);
|
|
|
|
}
|
|
|
|
|
|
|
|
return flag;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean setTypeId(int i, int j, int k, int l) {
|
2011-05-14 16:29:42 +02:00
|
|
|
// CraftBukkit start
|
2011-03-14 05:47:41 +01:00
|
|
|
int old = this.getTypeId(i, j, k);
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.setRawTypeId(i, j, k, l)) {
|
|
|
|
this.update(i, j, k, l == 0 ? old : l);
|
2012-07-29 09:33:13 +02:00
|
|
|
// CraftBukkit end
|
2011-02-07 06:56:07 +01:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean setTypeIdAndData(int i, int j, int k, int l, int i1) {
|
|
|
|
if (this.setRawTypeIdAndData(i, j, k, l, i1)) {
|
2012-05-15 03:51:20 +02:00
|
|
|
this.update(i, j, k, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void notify(int i, int j, int k) {
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(i, j, k);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public void update(int i, int j, int k, int l) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.applyPhysics(i, j, k, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void g(int i, int j, int k, int l) {
|
2011-09-15 02:23:52 +02:00
|
|
|
int i1;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
if (k > l) {
|
|
|
|
i1 = l;
|
2011-02-07 06:56:07 +01:00
|
|
|
l = k;
|
|
|
|
k = i1;
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
if (!this.worldProvider.e) {
|
2011-11-20 09:01:14 +01:00
|
|
|
for (i1 = k; i1 <= l; ++i1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.c(EnumSkyBlock.SKY, i, i1, j);
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.d(i, k, j, i, l, j);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void i(int i, int j, int k) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(i, j, k, i, j, k);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void d(int i, int j, int k, int l, int i1, int j1) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(i, j, k, l, i1, j1);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void applyPhysics(int i, int j, int k, int l) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.m(i - 1, j, k, l);
|
|
|
|
this.m(i + 1, j, k, l);
|
|
|
|
this.m(i, j - 1, k, l);
|
|
|
|
this.m(i, j + 1, k, l);
|
|
|
|
this.m(i, j, k - 1, l);
|
|
|
|
this.m(i, j, k + 1, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
private void m(int i, int j, int k, int l) {
|
2011-06-27 00:25:01 +02:00
|
|
|
if (!this.suppressPhysics && !this.isStatic) {
|
2011-02-07 06:56:07 +01:00
|
|
|
Block block = Block.byId[this.getTypeId(i, j, k)];
|
|
|
|
|
|
|
|
if (block != null) {
|
2011-02-07 10:26:12 +01:00
|
|
|
// CraftBukkit start
|
2011-02-07 10:43:50 +01:00
|
|
|
CraftWorld world = ((WorldServer) this).getWorld();
|
2011-02-07 10:26:12 +01:00
|
|
|
if (world != null) {
|
2011-03-26 22:32:56 +01:00
|
|
|
BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(i, j, k), l);
|
2011-06-27 00:25:01 +02:00
|
|
|
this.getServer().getPluginManager().callEvent(event);
|
2011-02-23 13:56:36 +01:00
|
|
|
|
2011-02-07 10:26:12 +01:00
|
|
|
if (event.isCancelled()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2011-05-14 16:29:42 +02:00
|
|
|
// CraftBukkit end
|
2011-02-07 10:26:12 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
block.doPhysics(this, i, j, k, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean j(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return this.getChunkAt(i >> 4, k >> 4).d(i & 15, j, k & 15);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public int k(int i, int j, int k) {
|
2011-05-26 14:48:22 +02:00
|
|
|
if (j < 0) {
|
|
|
|
return 0;
|
|
|
|
} else {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (j >= 256) {
|
|
|
|
j = 255;
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return this.getChunkAt(i >> 4, k >> 4).c(i & 15, j, k & 15, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public int getLightLevel(int i, int j, int k) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return this.a(i, j, k, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public int a(int i, int j, int k, boolean flag) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (flag) {
|
2011-05-26 14:48:22 +02:00
|
|
|
int l = this.getTypeId(i, j, k);
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (l == Block.STEP.id || l == Block.WOOD_STEP.id || l == Block.SOIL.id || l == Block.COBBLESTONE_STAIRS.id || l == Block.WOOD_STAIRS.id) {
|
2011-02-07 06:56:07 +01:00
|
|
|
int i1 = this.a(i, j + 1, k, false);
|
|
|
|
int j1 = this.a(i + 1, j, k, false);
|
|
|
|
int k1 = this.a(i - 1, j, k, false);
|
|
|
|
int l1 = this.a(i, j, k + 1, false);
|
|
|
|
int i2 = this.a(i, j, k - 1, false);
|
|
|
|
|
|
|
|
if (j1 > i1) {
|
|
|
|
i1 = j1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (k1 > i1) {
|
|
|
|
i1 = k1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l1 > i1) {
|
|
|
|
i1 = l1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i2 > i1) {
|
|
|
|
i1 = i2;
|
|
|
|
}
|
|
|
|
|
|
|
|
return i1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (j < 0) {
|
|
|
|
return 0;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (j >= 256) {
|
|
|
|
j = 255;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
i &= 15;
|
|
|
|
k &= 15;
|
2012-07-29 09:33:13 +02:00
|
|
|
return chunk.c(i, j, k, this.k);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 15;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public int getHighestBlockYAt(int i, int j) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) {
|
2011-04-20 19:05:14 +02:00
|
|
|
if (!this.isChunkLoaded(i >> 4, j >> 4)) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return 0;
|
|
|
|
} else {
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, j >> 4);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
return chunk.b(i & 15, j & 15);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public int b(EnumSkyBlock enumskyblock, int i, int j, int k) {
|
2011-05-26 14:48:22 +02:00
|
|
|
if (j < 0) {
|
|
|
|
j = 0;
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
if (j >= 256) {
|
|
|
|
j = 255;
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
int l = i >> 4;
|
|
|
|
int i1 = k >> 4;
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
if (!this.isChunkLoaded(l, i1)) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return enumskyblock.c;
|
2011-02-07 06:56:07 +01:00
|
|
|
} else {
|
2011-04-20 19:05:14 +02:00
|
|
|
Chunk chunk = this.getChunkAt(l, i1);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-02-29 22:31:04 +01:00
|
|
|
return chunk.getBrightness(enumskyblock, i & 15, j, k & 15);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return enumskyblock.c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void b(EnumSkyBlock enumskyblock, int i, int j, int k, int l) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (j >= 0) {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (j < 256) {
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.isChunkLoaded(i >> 4, k >> 4)) {
|
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
chunk.a(enumskyblock, i & 15, j, k & 15, l);
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
iworldaccess.b(i, j, k);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void n(int i, int j, int k) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.b(i, j, k);
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public float o(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return this.worldProvider.f[this.getLightLevel(i, j, k)];
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-08-25 02:51:51 +02:00
|
|
|
public boolean s() {
|
2012-07-29 09:33:13 +02:00
|
|
|
return this.k < 4;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public MovingObjectPosition a(Vec3D vec3d, Vec3D vec3d1) {
|
2011-05-26 14:48:22 +02:00
|
|
|
return this.rayTrace(vec3d, vec3d1, false, false);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public MovingObjectPosition rayTrace(Vec3D vec3d, Vec3D vec3d1, boolean flag) {
|
2011-05-26 14:48:22 +02:00
|
|
|
return this.rayTrace(vec3d, vec3d1, flag, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public MovingObjectPosition rayTrace(Vec3D vec3d, Vec3D vec3d1, boolean flag, boolean flag1) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (!Double.isNaN(vec3d.a) && !Double.isNaN(vec3d.b) && !Double.isNaN(vec3d.c)) {
|
|
|
|
if (!Double.isNaN(vec3d1.a) && !Double.isNaN(vec3d1.b) && !Double.isNaN(vec3d1.c)) {
|
2011-04-20 19:05:14 +02:00
|
|
|
int i = MathHelper.floor(vec3d1.a);
|
|
|
|
int j = MathHelper.floor(vec3d1.b);
|
|
|
|
int k = MathHelper.floor(vec3d1.c);
|
|
|
|
int l = MathHelper.floor(vec3d.a);
|
|
|
|
int i1 = MathHelper.floor(vec3d.b);
|
|
|
|
int j1 = MathHelper.floor(vec3d.c);
|
2011-05-26 14:48:22 +02:00
|
|
|
int k1 = this.getTypeId(l, i1, j1);
|
|
|
|
int l1 = this.getData(l, i1, j1);
|
|
|
|
Block block = Block.byId[k1];
|
|
|
|
|
2011-06-30 00:02:25 +02:00
|
|
|
if ((!flag1 || block == null || block.e(this, l, i1, j1) != null) && k1 > 0 && block.a(l1, flag)) {
|
2011-05-26 14:48:22 +02:00
|
|
|
MovingObjectPosition movingobjectposition = block.a(this, l, i1, j1, vec3d, vec3d1);
|
|
|
|
|
|
|
|
if (movingobjectposition != null) {
|
|
|
|
return movingobjectposition;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
k1 = 200;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
while (k1-- >= 0) {
|
|
|
|
if (Double.isNaN(vec3d.a) || Double.isNaN(vec3d.b) || Double.isNaN(vec3d.c)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l == i && i1 == j && j1 == k) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
boolean flag2 = true;
|
|
|
|
boolean flag3 = true;
|
|
|
|
boolean flag4 = true;
|
2011-02-07 06:56:07 +01:00
|
|
|
double d0 = 999.0D;
|
|
|
|
double d1 = 999.0D;
|
|
|
|
double d2 = 999.0D;
|
|
|
|
|
|
|
|
if (i > l) {
|
|
|
|
d0 = (double) l + 1.0D;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else if (i < l) {
|
2011-02-07 06:56:07 +01:00
|
|
|
d0 = (double) l + 0.0D;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else {
|
|
|
|
flag2 = false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (j > i1) {
|
|
|
|
d1 = (double) i1 + 1.0D;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else if (j < i1) {
|
2011-02-07 06:56:07 +01:00
|
|
|
d1 = (double) i1 + 0.0D;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else {
|
|
|
|
flag3 = false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (k > j1) {
|
|
|
|
d2 = (double) j1 + 1.0D;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else if (k < j1) {
|
2011-02-07 06:56:07 +01:00
|
|
|
d2 = (double) j1 + 0.0D;
|
2011-05-26 14:48:22 +02:00
|
|
|
} else {
|
|
|
|
flag4 = false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
double d3 = 999.0D;
|
|
|
|
double d4 = 999.0D;
|
|
|
|
double d5 = 999.0D;
|
|
|
|
double d6 = vec3d1.a - vec3d.a;
|
|
|
|
double d7 = vec3d1.b - vec3d.b;
|
|
|
|
double d8 = vec3d1.c - vec3d.c;
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
if (flag2) {
|
2011-02-07 06:56:07 +01:00
|
|
|
d3 = (d0 - vec3d.a) / d6;
|
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
if (flag3) {
|
2011-02-07 06:56:07 +01:00
|
|
|
d4 = (d1 - vec3d.b) / d7;
|
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
if (flag4) {
|
2011-02-07 06:56:07 +01:00
|
|
|
d5 = (d2 - vec3d.c) / d8;
|
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
boolean flag5 = false;
|
2011-02-07 06:56:07 +01:00
|
|
|
byte b0;
|
|
|
|
|
|
|
|
if (d3 < d4 && d3 < d5) {
|
|
|
|
if (i > l) {
|
|
|
|
b0 = 4;
|
|
|
|
} else {
|
|
|
|
b0 = 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
vec3d.a = d0;
|
|
|
|
vec3d.b += d7 * d3;
|
|
|
|
vec3d.c += d8 * d3;
|
|
|
|
} else if (d4 < d5) {
|
|
|
|
if (j > i1) {
|
|
|
|
b0 = 0;
|
|
|
|
} else {
|
|
|
|
b0 = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
vec3d.a += d6 * d4;
|
|
|
|
vec3d.b = d1;
|
|
|
|
vec3d.c += d8 * d4;
|
|
|
|
} else {
|
|
|
|
if (k > j1) {
|
|
|
|
b0 = 2;
|
|
|
|
} else {
|
|
|
|
b0 = 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
vec3d.a += d6 * d5;
|
|
|
|
vec3d.b += d7 * d5;
|
|
|
|
vec3d.c = d2;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
Vec3D vec3d2 = Vec3D.a().create(vec3d.a, vec3d.b, vec3d.c);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
l = (int) (vec3d2.a = (double) MathHelper.floor(vec3d.a));
|
2011-02-07 06:56:07 +01:00
|
|
|
if (b0 == 5) {
|
|
|
|
--l;
|
|
|
|
++vec3d2.a;
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
i1 = (int) (vec3d2.b = (double) MathHelper.floor(vec3d.b));
|
2011-02-07 06:56:07 +01:00
|
|
|
if (b0 == 1) {
|
|
|
|
--i1;
|
|
|
|
++vec3d2.b;
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
j1 = (int) (vec3d2.c = (double) MathHelper.floor(vec3d.c));
|
2011-02-07 06:56:07 +01:00
|
|
|
if (b0 == 3) {
|
|
|
|
--j1;
|
|
|
|
++vec3d2.c;
|
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
int i2 = this.getTypeId(l, i1, j1);
|
|
|
|
int j2 = this.getData(l, i1, j1);
|
|
|
|
Block block1 = Block.byId[i2];
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-06-30 00:02:25 +02:00
|
|
|
if ((!flag1 || block1 == null || block1.e(this, l, i1, j1) != null) && i2 > 0 && block1.a(j2, flag)) {
|
2011-05-26 14:48:22 +02:00
|
|
|
MovingObjectPosition movingobjectposition1 = block1.a(this, l, i1, j1, vec3d, vec3d1);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
if (movingobjectposition1 != null) {
|
2012-08-12 00:27:27 +02:00
|
|
|
Vec3D.a().release(vec3d2); // CraftBukkit
|
2011-05-26 14:48:22 +02:00
|
|
|
return movingobjectposition1;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
2012-08-12 00:27:27 +02:00
|
|
|
Vec3D.a().release(vec3d2); // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void makeSound(Entity entity, String s, float f, float f1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (entity != null && s != null) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
2012-09-11 02:42:26 +02:00
|
|
|
((WorldManager) iworldaccess).a(s, entity.locX, entity.locY - (double) entity.height, entity.locZ, f, f1, entity); // CraftBukkit - Cast to WorldManager, add sourceentity
|
2012-07-29 09:33:13 +02:00
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void makeSound(double d0, double d1, double d2, String s, float f, float f1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (s != null) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(s, d0, d1, d2, f, f1);
|
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void a(String s, int i, int j, int k) {
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(s, i, j, k);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void a(String s, double d0, double d1, double d2, double d3, double d4, double d5) {
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(s, d0, d1, d2, d3, d4, d5);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
public boolean strikeLightning(Entity entity) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.j.add(entity);
|
2011-04-20 22:47:26 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-06-21 22:20:11 +02:00
|
|
|
// CraftBukkit start - used for entities other than creatures
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean addEntity(Entity entity) {
|
2012-04-14 08:44:01 +02:00
|
|
|
return this.addEntity(entity, SpawnReason.DEFAULT); // Set reason as DEFAULT
|
2011-06-21 22:20:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason
|
2012-01-27 19:42:04 +01:00
|
|
|
if (entity == null) return false;
|
2012-01-28 09:04:16 +01:00
|
|
|
// CraftBukkit end
|
2012-01-27 19:42:04 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
int i = MathHelper.floor(entity.locX / 16.0D);
|
|
|
|
int j = MathHelper.floor(entity.locZ / 16.0D);
|
2011-02-07 06:56:07 +01:00
|
|
|
boolean flag = false;
|
|
|
|
|
|
|
|
if (entity instanceof EntityHuman) {
|
|
|
|
flag = true;
|
|
|
|
}
|
|
|
|
|
2011-02-23 13:56:36 +01:00
|
|
|
// CraftBukkit start
|
2012-04-04 00:41:55 +02:00
|
|
|
org.bukkit.event.Cancellable event = null;
|
2011-04-01 09:15:48 +02:00
|
|
|
if (entity instanceof EntityLiving && !(entity instanceof EntityPlayer)) {
|
2012-03-11 11:28:03 +01:00
|
|
|
boolean isAnimal = entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal || entity instanceof EntityGolem;
|
2011-09-20 04:53:36 +02:00
|
|
|
boolean isMonster = entity instanceof EntityMonster || entity instanceof EntityGhast || entity instanceof EntitySlime;
|
|
|
|
|
2012-04-14 13:56:23 +02:00
|
|
|
if (spawnReason != SpawnReason.CUSTOM) {
|
2012-04-04 00:41:55 +02:00
|
|
|
if (isAnimal && !allowAnimals || isMonster && !allowMonsters) {
|
|
|
|
entity.dead = true;
|
|
|
|
return false;
|
|
|
|
}
|
2011-09-20 04:53:36 +02:00
|
|
|
}
|
|
|
|
|
2012-04-04 00:41:55 +02:00
|
|
|
event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason);
|
2011-06-11 08:00:05 +02:00
|
|
|
} else if (entity instanceof EntityItem) {
|
2012-04-04 00:41:55 +02:00
|
|
|
event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
|
2012-03-12 17:45:09 +01:00
|
|
|
} else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) {
|
|
|
|
// Not all projectiles extend EntityProjectile, so check for Bukkit interface instead
|
2012-04-04 00:41:55 +02:00
|
|
|
event = CraftEventFactory.callProjectileLaunchEvent(entity);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (event != null && (event.isCancelled() || entity.dead)) {
|
|
|
|
entity.dead = true;
|
|
|
|
return false;
|
2011-02-17 04:42:41 +01:00
|
|
|
}
|
2011-02-23 03:37:56 +01:00
|
|
|
// CraftBukkit end
|
2011-02-17 04:42:41 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
if (!flag && !this.isChunkLoaded(i, j)) {
|
2012-04-04 00:41:55 +02:00
|
|
|
entity.dead = true; // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
if (entity instanceof EntityHuman) {
|
|
|
|
EntityHuman entityhuman = (EntityHuman) entity;
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
this.players.add(entityhuman);
|
|
|
|
this.everyoneSleeping();
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
this.getChunkAt(i, j).a(entity);
|
|
|
|
this.entityList.add(entity);
|
2012-07-29 09:33:13 +02:00
|
|
|
this.a(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
protected void a(Entity entity) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
2012-08-22 03:21:01 +02:00
|
|
|
|
|
|
|
entity.valid = true; // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
protected void b(Entity entity) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
2012-06-25 10:24:53 +02:00
|
|
|
|
|
|
|
entity.valid = false; // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void kill(Entity entity) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (entity.passenger != null) {
|
2011-04-20 19:05:14 +02:00
|
|
|
entity.passenger.mount((Entity) null);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (entity.vehicle != null) {
|
2011-04-20 19:05:14 +02:00
|
|
|
entity.mount((Entity) null);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
entity.die();
|
2011-02-07 06:56:07 +01:00
|
|
|
if (entity instanceof EntityHuman) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.players.remove(entity);
|
2011-04-20 19:05:14 +02:00
|
|
|
this.everyoneSleeping();
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void removeEntity(Entity entity) {
|
|
|
|
entity.die();
|
2011-02-07 06:56:07 +01:00
|
|
|
if (entity instanceof EntityHuman) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.players.remove(entity);
|
2011-04-20 19:05:14 +02:00
|
|
|
this.everyoneSleeping();
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
int i = entity.ah;
|
|
|
|
int j = entity.aj;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (entity.ag && this.isChunkLoaded(i, j)) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.getChunkAt(i, j).b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
this.entityList.remove(entity);
|
2012-07-29 09:33:13 +02:00
|
|
|
this.b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void addIWorldAccess(IWorldAccess iworldaccess) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.x.add(iworldaccess);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-02-29 22:31:04 +01:00
|
|
|
public List getCubes(Entity entity, AxisAlignedBB axisalignedbb) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.d.clear();
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = i1; l1 < j1; ++l1) {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (this.isLoaded(k1, 64, l1)) {
|
2011-02-07 06:56:07 +01:00
|
|
|
for (int i2 = k - 1; i2 < l; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, i2, l1)];
|
|
|
|
|
|
|
|
if (block != null) {
|
2012-07-29 09:33:13 +02:00
|
|
|
block.a(this, k1, i2, l1, axisalignedbb, this.d, entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
double d0 = 0.25D;
|
2012-01-12 16:27:39 +01:00
|
|
|
List list = this.getEntities(entity, axisalignedbb.grow(d0, d0, d0));
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = list.iterator();
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
while (iterator.hasNext()) {
|
|
|
|
Entity entity1 = (Entity) iterator.next();
|
|
|
|
AxisAlignedBB axisalignedbb1 = entity1.E();
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.d.add(axisalignedbb1);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
axisalignedbb1 = entity.g(entity1);
|
2011-02-07 06:56:07 +01:00
|
|
|
if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.d.add(axisalignedbb1);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
return this.d;
|
|
|
|
}
|
|
|
|
|
|
|
|
public List a(AxisAlignedBB axisalignedbb) {
|
|
|
|
this.d.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) {
|
|
|
|
if (this.isLoaded(k1, 64, l1)) {
|
|
|
|
for (int i2 = k - 1; i2 < l; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, i2, l1)];
|
|
|
|
|
|
|
|
if (block != null) {
|
|
|
|
block.a(this, k1, i2, l1, axisalignedbb, this.d, (Entity) null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.d;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public int a(float f) {
|
2012-07-29 09:33:13 +02:00
|
|
|
float f1 = this.c(f);
|
2011-04-20 19:05:14 +02:00
|
|
|
float f2 = 1.0F - (MathHelper.cos(f1 * 3.1415927F * 2.0F) * 2.0F + 0.5F);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if (f2 < 0.0F) {
|
|
|
|
f2 = 0.0F;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (f2 > 1.0F) {
|
|
|
|
f2 = 1.0F;
|
|
|
|
}
|
|
|
|
|
2011-04-20 22:47:26 +02:00
|
|
|
f2 = 1.0F - f2;
|
2012-07-29 09:33:13 +02:00
|
|
|
f2 = (float) ((double) f2 * (1.0D - (double) (this.j(f) * 5.0F) / 16.0D));
|
|
|
|
f2 = (float) ((double) f2 * (1.0D - (double) (this.i(f) * 5.0F) / 16.0D));
|
2011-04-20 22:47:26 +02:00
|
|
|
f2 = 1.0F - f2;
|
2011-02-07 06:56:07 +01:00
|
|
|
return (int) (f2 * 11.0F);
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public float c(float f) {
|
2012-01-14 21:03:48 +01:00
|
|
|
return this.worldProvider.a(this.worldData.getTime(), f);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public int g(int i, int j) {
|
2012-03-01 11:49:23 +01:00
|
|
|
return this.getChunkAtWorldCoords(i, j).d(i & 15, j & 15);
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public int h(int i, int j) {
|
2011-06-27 00:25:01 +02:00
|
|
|
Chunk chunk = this.getChunkAtWorldCoords(i, j);
|
2012-07-29 09:33:13 +02:00
|
|
|
int k = chunk.h() + 15;
|
2011-05-26 14:48:22 +02:00
|
|
|
|
|
|
|
i &= 15;
|
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
for (j &= 15; k > 0; --k) {
|
2011-04-20 19:05:14 +02:00
|
|
|
int l = chunk.getTypeId(i, k, j);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
if (l != 0 && Block.byId[l].material.isSolid() && Block.byId[l].material != Material.LEAVES) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return k + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void a(int i, int j, int k, int l, int i1) {}
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void b(int i, int j, int k, int l, int i1) {}
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2011-09-24 23:03:31 +02:00
|
|
|
public void tickEntities() {
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("entities");
|
|
|
|
this.methodProfiler.a("global");
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
int i;
|
|
|
|
Entity entity;
|
2011-04-20 22:47:26 +02:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
for (i = 0; i < this.j.size(); ++i) {
|
|
|
|
entity = (Entity) this.j.get(i);
|
2012-08-04 09:22:57 +02:00
|
|
|
// CraftBukkit start - fixed an NPE, don't process entities in chunks queued for unload
|
2012-08-18 01:53:59 +02:00
|
|
|
if (entity == null) {
|
2012-08-04 09:22:57 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-08-18 01:53:59 +02:00
|
|
|
ChunkProviderServer chunkProviderServer = ((WorldServer) entity.world).chunkProviderServer;
|
|
|
|
if (chunkProviderServer.unloadQueue.contains(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4)) {
|
2011-06-18 05:36:35 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.h_();
|
2011-04-20 22:47:26 +02:00
|
|
|
if (entity.dead) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.j.remove(i--);
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.c("remove");
|
2012-07-29 09:33:13 +02:00
|
|
|
this.entityList.removeAll(this.g);
|
|
|
|
Iterator iterator = this.g.iterator();
|
2011-04-20 22:47:26 +02:00
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
int j;
|
|
|
|
int k;
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
while (iterator.hasNext()) {
|
|
|
|
entity = (Entity) iterator.next();
|
|
|
|
j = entity.ah;
|
|
|
|
k = entity.aj;
|
|
|
|
if (entity.ag && this.isChunkLoaded(j, k)) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.getChunkAt(j, k).b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
iterator = this.g.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
entity = (Entity) iterator.next();
|
|
|
|
this.b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.g.clear();
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.c("regular");
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
for (i = 0; i < this.entityList.size(); ++i) {
|
|
|
|
entity = (Entity) this.entityList.get(i);
|
2012-08-04 09:22:57 +02:00
|
|
|
|
|
|
|
// CraftBukkit start - don't tick entities in chunks queued for unload
|
|
|
|
ChunkProviderServer chunkProviderServer = ((WorldServer) entity.world).chunkProviderServer;
|
2012-08-18 01:53:59 +02:00
|
|
|
if (chunkProviderServer.unloadQueue.contains(MathHelper.floor(entity.locX) >> 4, MathHelper.floor(entity.locZ) >> 4)) {
|
2012-08-04 09:22:57 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
if (entity.vehicle != null) {
|
|
|
|
if (!entity.vehicle.dead && entity.vehicle.passenger == entity) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
entity.vehicle.passenger = null;
|
|
|
|
entity.vehicle = null;
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("tick");
|
2011-02-07 06:56:07 +01:00
|
|
|
if (!entity.dead) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.playerJoinedWorld(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
|
|
|
this.methodProfiler.a("remove");
|
2011-02-07 06:56:07 +01:00
|
|
|
if (entity.dead) {
|
2012-07-29 09:33:13 +02:00
|
|
|
j = entity.ah;
|
|
|
|
k = entity.aj;
|
|
|
|
if (entity.ag && this.isChunkLoaded(j, k)) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.getChunkAt(j, k).b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
this.entityList.remove(i--);
|
2012-07-29 09:33:13 +02:00
|
|
|
this.b(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.c("tileEntities");
|
2012-07-29 09:33:13 +02:00
|
|
|
this.L = true;
|
|
|
|
iterator = this.tileEntityList.iterator();
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-06-30 00:02:25 +02:00
|
|
|
while (iterator.hasNext()) {
|
|
|
|
TileEntity tileentity = (TileEntity) iterator.next();
|
|
|
|
|
2012-08-04 09:22:57 +02:00
|
|
|
// CraftBukkit start - don't tick entities in chunks queued for unload
|
|
|
|
ChunkProviderServer chunkProviderServer = ((WorldServer) tileentity.world).chunkProviderServer;
|
2012-08-18 01:53:59 +02:00
|
|
|
if (chunkProviderServer.unloadQueue.contains(tileentity.x >> 4, tileentity.z >> 4)) {
|
2012-08-04 09:22:57 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!tileentity.p() && tileentity.m() && this.isLoaded(tileentity.x, tileentity.y, tileentity.z)) {
|
|
|
|
tileentity.g();
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (tileentity.p()) {
|
2011-06-30 00:02:25 +02:00
|
|
|
iterator.remove();
|
2011-09-15 02:23:52 +02:00
|
|
|
if (this.isChunkLoaded(tileentity.x >> 4, tileentity.z >> 4)) {
|
|
|
|
Chunk chunk = this.getChunkAt(tileentity.x >> 4, tileentity.z >> 4);
|
2011-06-30 00:02:25 +02:00
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
if (chunk != null) {
|
2012-03-01 11:49:23 +01:00
|
|
|
chunk.f(tileentity.x & 15, tileentity.y, tileentity.z & 15);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.L = false;
|
|
|
|
if (!this.b.isEmpty()) {
|
|
|
|
this.tileEntityList.removeAll(this.b);
|
|
|
|
this.b.clear();
|
2011-08-04 12:57:51 +02:00
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.c("pendingTileEntities");
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!this.a.isEmpty()) {
|
|
|
|
Iterator iterator1 = this.a.iterator();
|
2011-06-30 00:02:25 +02:00
|
|
|
|
|
|
|
while (iterator1.hasNext()) {
|
|
|
|
TileEntity tileentity1 = (TileEntity) iterator1.next();
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!tileentity1.p()) {
|
|
|
|
/* CraftBukkit start - order matters, moved down
|
|
|
|
if (!this.tileEntityList.contains(tileentity1)) {
|
|
|
|
this.tileEntityList.add(tileentity1);
|
|
|
|
}
|
|
|
|
// CraftBukkit end */
|
2011-06-30 00:02:25 +02:00
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
if (this.isChunkLoaded(tileentity1.x >> 4, tileentity1.z >> 4)) {
|
|
|
|
Chunk chunk1 = this.getChunkAt(tileentity1.x >> 4, tileentity1.z >> 4);
|
2011-06-30 00:02:25 +02:00
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
if (chunk1 != null) {
|
|
|
|
chunk1.a(tileentity1.x & 15, tileentity1.y, tileentity1.z & 15, tileentity1);
|
2012-07-29 09:33:13 +02:00
|
|
|
// CraftBukkit start - moved down from above
|
2012-01-14 21:03:48 +01:00
|
|
|
if (!this.tileEntityList.contains(tileentity1)) {
|
|
|
|
this.tileEntityList.add(tileentity1);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
// CraftBukkit end
|
2011-07-14 01:49:20 +02:00
|
|
|
}
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
this.notify(tileentity1.x, tileentity1.y, tileentity1.z);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.a.clear();
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
|
|
|
this.methodProfiler.b();
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void a(Collection collection) {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.L) {
|
|
|
|
this.a.addAll(collection);
|
2011-06-30 00:02:25 +02:00
|
|
|
} else {
|
2012-01-14 21:03:48 +01:00
|
|
|
this.tileEntityList.addAll(collection);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void playerJoinedWorld(Entity entity) {
|
|
|
|
this.entityJoinedWorld(entity, true);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void entityJoinedWorld(Entity entity, boolean flag) {
|
|
|
|
int i = MathHelper.floor(entity.locX);
|
|
|
|
int j = MathHelper.floor(entity.locZ);
|
2011-02-07 06:56:07 +01:00
|
|
|
byte b0 = 32;
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!flag || this.c(i - b0, 0, j - b0, i + b0, 0, j + b0)) {
|
|
|
|
entity.S = entity.locX;
|
|
|
|
entity.T = entity.locY;
|
|
|
|
entity.U = entity.locZ;
|
2011-02-07 06:56:07 +01:00
|
|
|
entity.lastYaw = entity.yaw;
|
|
|
|
entity.lastPitch = entity.pitch;
|
2012-07-29 09:33:13 +02:00
|
|
|
if (flag && entity.ag) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (entity.vehicle != null) {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.U();
|
2011-02-07 06:56:07 +01:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.h_();
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("chunkCheck");
|
2011-02-07 06:56:07 +01:00
|
|
|
if (Double.isNaN(entity.locX) || Double.isInfinite(entity.locX)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.locX = entity.S;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (Double.isNaN(entity.locY) || Double.isInfinite(entity.locY)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.locY = entity.T;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (Double.isNaN(entity.locZ) || Double.isInfinite(entity.locZ)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.locZ = entity.U;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (Double.isNaN((double) entity.pitch) || Double.isInfinite((double) entity.pitch)) {
|
|
|
|
entity.pitch = entity.lastPitch;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Double.isNaN((double) entity.yaw) || Double.isInfinite((double) entity.yaw)) {
|
|
|
|
entity.yaw = entity.lastYaw;
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
int k = MathHelper.floor(entity.locX / 16.0D);
|
|
|
|
int l = MathHelper.floor(entity.locY / 16.0D);
|
|
|
|
int i1 = MathHelper.floor(entity.locZ / 16.0D);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!entity.ag || entity.ah != k || entity.ai != l || entity.aj != i1) {
|
|
|
|
if (entity.ag && this.isChunkLoaded(entity.ah, entity.aj)) {
|
|
|
|
this.getChunkAt(entity.ah, entity.aj).a(entity, entity.ai);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.isChunkLoaded(k, i1)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.ag = true;
|
2011-04-20 19:05:14 +02:00
|
|
|
this.getChunkAt(k, i1).a(entity);
|
2011-02-07 06:56:07 +01:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
entity.ag = false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2012-07-29 09:33:13 +02:00
|
|
|
if (flag && entity.ag && entity.passenger != null) {
|
2011-02-07 06:56:07 +01:00
|
|
|
if (!entity.passenger.dead && entity.passenger.vehicle == entity) {
|
2011-04-20 19:05:14 +02:00
|
|
|
this.playerJoinedWorld(entity.passenger);
|
2011-02-07 06:56:07 +01:00
|
|
|
} else {
|
|
|
|
entity.passenger.vehicle = null;
|
|
|
|
entity.passenger = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean b(AxisAlignedBB axisalignedbb) {
|
|
|
|
return this.a(axisalignedbb, (Entity) null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean a(AxisAlignedBB axisalignedbb, Entity entity) {
|
2012-01-12 23:10:13 +01:00
|
|
|
List list = this.getEntities((Entity) null, axisalignedbb);
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = list.iterator();
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
Entity entity1;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
do {
|
|
|
|
if (!iterator.hasNext()) {
|
|
|
|
return true;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
entity1 = (Entity) iterator.next();
|
|
|
|
} while (entity1.dead || !entity1.m || entity1 == entity);
|
|
|
|
|
|
|
|
return false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean c(AxisAlignedBB axisalignedbb) {
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if (axisalignedbb.a < 0.0D) {
|
|
|
|
--i;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (axisalignedbb.b < 0.0D) {
|
|
|
|
--k;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (axisalignedbb.c < 0.0D) {
|
|
|
|
--i1;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = k; l1 < l; ++l1) {
|
|
|
|
for (int i2 = i1; i2 < j1; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, l1, i2)];
|
|
|
|
|
2011-04-20 22:47:26 +02:00
|
|
|
if (block != null) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-02-29 22:31:04 +01:00
|
|
|
public boolean containsLiquid(AxisAlignedBB axisalignedbb) {
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-04-20 22:47:26 +02:00
|
|
|
if (axisalignedbb.a < 0.0D) {
|
|
|
|
--i;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (axisalignedbb.b < 0.0D) {
|
|
|
|
--k;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (axisalignedbb.c < 0.0D) {
|
|
|
|
--i1;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = k; l1 < l; ++l1) {
|
|
|
|
for (int i2 = i1; i2 < j1; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, l1, i2)];
|
|
|
|
|
|
|
|
if (block != null && block.material.isLiquid()) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean e(AxisAlignedBB axisalignedbb) {
|
2011-04-20 22:47:26 +02:00
|
|
|
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);
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.c(i, k, i1, j, l, j1)) {
|
2011-02-07 06:56:07 +01:00
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = k; l1 < l; ++l1) {
|
|
|
|
for (int i2 = i1; i2 < j1; ++i2) {
|
|
|
|
int j2 = this.getTypeId(k1, l1, i2);
|
|
|
|
|
|
|
|
if (j2 == Block.FIRE.id || j2 == Block.LAVA.id || j2 == Block.STATIONARY_LAVA.id) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean a(AxisAlignedBB axisalignedbb, Material material, Entity entity) {
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!this.c(i, k, i1, j, l, j1)) {
|
2011-02-07 06:56:07 +01:00
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
boolean flag = false;
|
2012-07-29 09:33:13 +02:00
|
|
|
Vec3D vec3d = Vec3D.a().create(0.0D, 0.0D, 0.0D);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = k; l1 < l; ++l1) {
|
|
|
|
for (int i2 = i1; i2 < j1; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, l1, i2)];
|
|
|
|
|
|
|
|
if (block != null && block.material == material) {
|
2011-11-20 09:01:14 +01:00
|
|
|
double d0 = (double) ((float) (l1 + 1) - BlockFluids.d(this.getData(k1, l1, i2)));
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if ((double) l >= d0) {
|
|
|
|
flag = true;
|
|
|
|
block.a(this, k1, l1, i2, entity, vec3d);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vec3d.c() > 0.0D) {
|
|
|
|
vec3d = vec3d.b();
|
2011-04-20 22:47:26 +02:00
|
|
|
double d1 = 0.014D;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
entity.motX += vec3d.a * d1;
|
|
|
|
entity.motY += vec3d.b * d1;
|
|
|
|
entity.motZ += vec3d.c * d1;
|
|
|
|
}
|
2012-08-12 00:27:27 +02:00
|
|
|
Vec3D.a().release(vec3d); // CraftBukkit - pop it - we're done
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
return flag;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean a(AxisAlignedBB axisalignedbb, Material material) {
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = k; l1 < l; ++l1) {
|
|
|
|
for (int i2 = i1; i2 < j1; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, l1, i2)];
|
|
|
|
|
|
|
|
if (block != null && block.material == material) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean b(AxisAlignedBB axisalignedbb, Material material) {
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
for (int k1 = i; k1 < j; ++k1) {
|
|
|
|
for (int l1 = k; l1 < l; ++l1) {
|
|
|
|
for (int i2 = i1; i2 < j1; ++i2) {
|
|
|
|
Block block = Block.byId[this.getTypeId(k1, l1, i2)];
|
|
|
|
|
|
|
|
if (block != null && block.material == material) {
|
|
|
|
int j2 = this.getData(k1, l1, i2);
|
|
|
|
double d0 = (double) (l1 + 1);
|
|
|
|
|
|
|
|
if (j2 < 8) {
|
|
|
|
d0 = (double) (l1 + 1) - (double) j2 / 8.0D;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (d0 >= axisalignedbb.b) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-02-29 22:31:04 +01:00
|
|
|
public Explosion explode(Entity entity, double d0, double d1, double d2, float f) {
|
2011-04-20 19:05:14 +02:00
|
|
|
return this.createExplosion(entity, d0, d1, d2, f, false);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag) {
|
2011-02-07 06:56:07 +01:00
|
|
|
Explosion explosion = new Explosion(this, entity, d0, d1, d2, f);
|
|
|
|
|
|
|
|
explosion.a = flag;
|
|
|
|
explosion.a();
|
2011-04-20 22:47:26 +02:00
|
|
|
explosion.a(true);
|
2011-02-07 06:56:07 +01:00
|
|
|
return explosion;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float a(Vec3D vec3d, AxisAlignedBB axisalignedbb) {
|
|
|
|
double d0 = 1.0D / ((axisalignedbb.d - axisalignedbb.a) * 2.0D + 1.0D);
|
|
|
|
double d1 = 1.0D / ((axisalignedbb.e - axisalignedbb.b) * 2.0D + 1.0D);
|
|
|
|
double d2 = 1.0D / ((axisalignedbb.f - axisalignedbb.c) * 2.0D + 1.0D);
|
|
|
|
int i = 0;
|
|
|
|
int j = 0;
|
|
|
|
|
2012-08-12 00:27:27 +02:00
|
|
|
Vec3D vec3d2 = Vec3D.a().create(0, 0, 0); // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
for (float f = 0.0F; f <= 1.0F; f = (float) ((double) f + d0)) {
|
|
|
|
for (float f1 = 0.0F; f1 <= 1.0F; f1 = (float) ((double) f1 + d1)) {
|
|
|
|
for (float f2 = 0.0F; f2 <= 1.0F; f2 = (float) ((double) f2 + d2)) {
|
|
|
|
double d3 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) f;
|
|
|
|
double d4 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) f1;
|
|
|
|
double d5 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) f2;
|
|
|
|
|
2012-08-12 00:27:27 +02:00
|
|
|
if (this.a(vec3d2.b(d3, d4, d5), vec3d) == null) { // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
++i;
|
|
|
|
}
|
|
|
|
|
|
|
|
++j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-08-12 00:27:27 +02:00
|
|
|
Vec3D.a().release(vec3d2); // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
return (float) i / (float) j;
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public boolean douseFire(EntityHuman entityhuman, int i, int j, int k, int l) {
|
2011-05-26 14:48:22 +02:00
|
|
|
if (l == 0) {
|
|
|
|
--j;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l == 1) {
|
|
|
|
++j;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l == 2) {
|
|
|
|
--k;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l == 3) {
|
|
|
|
++k;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l == 4) {
|
|
|
|
--i;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l == 5) {
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.getTypeId(i, j, k) == Block.FIRE.id) {
|
|
|
|
this.a(entityhuman, 1004, i, j, k, 0);
|
|
|
|
this.setTypeId(i, j, k, 0);
|
2012-03-01 11:49:23 +01:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
public TileEntity getTileEntity(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (j >= 256) {
|
2011-11-20 09:01:14 +01:00
|
|
|
return null;
|
|
|
|
} else {
|
2012-03-01 11:49:23 +01:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
|
|
|
|
|
|
|
if (chunk == null) {
|
|
|
|
return null;
|
|
|
|
} else {
|
|
|
|
TileEntity tileentity = chunk.e(i & 15, j, k & 15);
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
if (tileentity == null) {
|
2012-07-29 09:33:13 +02:00
|
|
|
Iterator iterator = this.a.iterator();
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
while (iterator.hasNext()) {
|
|
|
|
TileEntity tileentity1 = (TileEntity) iterator.next();
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (!tileentity1.p() && tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
tileentity = tileentity1;
|
|
|
|
break;
|
|
|
|
}
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
return tileentity;
|
|
|
|
}
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void setTileEntity(int i, int j, int k, TileEntity tileentity) {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (tileentity != null && !tileentity.p()) {
|
|
|
|
if (this.L) {
|
2011-06-30 00:02:25 +02:00
|
|
|
tileentity.x = i;
|
|
|
|
tileentity.y = j;
|
|
|
|
tileentity.z = k;
|
2012-07-29 09:33:13 +02:00
|
|
|
this.a.add(tileentity);
|
2011-06-30 00:02:25 +02:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.tileEntityList.add(tileentity);
|
2011-06-30 00:02:25 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-06-30 00:02:25 +02:00
|
|
|
if (chunk != null) {
|
|
|
|
chunk.a(i & 15, j, k & 15, tileentity);
|
|
|
|
}
|
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public void q(int i, int j, int k) {
|
2011-06-30 00:02:25 +02:00
|
|
|
TileEntity tileentity = this.getTileEntity(i, j, k);
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (tileentity != null && this.L) {
|
2012-03-01 11:49:23 +01:00
|
|
|
tileentity.j();
|
2012-07-29 09:33:13 +02:00
|
|
|
this.a.remove(tileentity);
|
2011-06-30 00:02:25 +02:00
|
|
|
} else {
|
|
|
|
if (tileentity != null) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.a.remove(tileentity);
|
2012-01-14 21:03:48 +01:00
|
|
|
this.tileEntityList.remove(tileentity);
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-06-30 00:02:25 +02:00
|
|
|
Chunk chunk = this.getChunkAt(i >> 4, k >> 4);
|
|
|
|
|
|
|
|
if (chunk != null) {
|
2012-03-01 11:49:23 +01:00
|
|
|
chunk.f(i & 15, j, k & 15);
|
2011-06-30 00:02:25 +02:00
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
public void a(TileEntity tileentity) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.b.add(tileentity);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public boolean r(int i, int j, int k) {
|
2011-02-07 06:56:07 +01:00
|
|
|
Block block = Block.byId[this.getTypeId(i, j, k)];
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
return block == null ? false : block.d();
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean s(int i, int j, int k) {
|
|
|
|
return Block.i(this.getTypeId(i, j, k));
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean t(int i, int j, int k) {
|
|
|
|
Block block = Block.byId[this.getTypeId(i, j, k)];
|
|
|
|
|
|
|
|
return block == null ? false : (block.material.k() && block.c() ? true : (block instanceof BlockStairs ? (this.getData(i, j, k) & 4) == 4 : (block instanceof BlockStepAbstract ? (this.getData(i, j, k) & 8) == 8 : false)));
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
public boolean b(int i, int j, int k, boolean flag) {
|
|
|
|
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
|
|
|
|
Chunk chunk = this.chunkProvider.getOrCreateChunk(i >> 4, k >> 4);
|
|
|
|
|
|
|
|
if (chunk != null && !chunk.isEmpty()) {
|
|
|
|
Block block = Block.byId[this.getTypeId(i, j, k)];
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
return block == null ? false : block.material.k() && block.c();
|
2011-11-20 09:01:14 +01:00
|
|
|
} else {
|
|
|
|
return flag;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return flag;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void v() {
|
2011-02-07 06:56:07 +01:00
|
|
|
int i = this.a(1.0F);
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (i != this.k) {
|
|
|
|
this.k = i;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void setSpawnFlags(boolean flag, boolean flag1) {
|
|
|
|
this.allowMonsters = flag;
|
|
|
|
this.allowAnimals = flag1;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void doTick() {
|
2012-08-25 02:51:51 +02:00
|
|
|
this.m();
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
private void a() {
|
2011-06-27 00:25:01 +02:00
|
|
|
if (this.worldData.hasStorm()) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.o = 1.0F;
|
2011-06-27 00:25:01 +02:00
|
|
|
if (this.worldData.isThundering()) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.q = 1.0F;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-08-25 02:51:51 +02:00
|
|
|
protected void m() {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (!this.worldProvider.e) {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.r > 0) {
|
|
|
|
--this.r;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
int i = this.worldData.getThunderDuration();
|
2011-04-20 22:47:26 +02:00
|
|
|
|
|
|
|
if (i <= 0) {
|
2011-06-27 00:25:01 +02:00
|
|
|
if (this.worldData.isThundering()) {
|
|
|
|
this.worldData.setThunderDuration(this.random.nextInt(12000) + 3600);
|
2011-04-20 22:47:26 +02:00
|
|
|
} else {
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldData.setThunderDuration(this.random.nextInt(168000) + 12000);
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
--i;
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldData.setThunderDuration(i);
|
2011-04-20 22:47:26 +02:00
|
|
|
if (i <= 0) {
|
2011-04-26 04:00:18 +02:00
|
|
|
// CraftBukkit start
|
2011-06-27 00:25:01 +02:00
|
|
|
ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), !this.worldData.isThundering());
|
|
|
|
this.getServer().getPluginManager().callEvent(thunder);
|
2011-04-26 01:47:25 +02:00
|
|
|
if (!thunder.isCancelled()) {
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldData.setThundering(!this.worldData.isThundering());
|
2011-04-26 01:47:25 +02:00
|
|
|
}
|
2011-04-26 04:00:18 +02:00
|
|
|
// CraftBukkit end
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
int j = this.worldData.getWeatherDuration();
|
2011-04-20 22:47:26 +02:00
|
|
|
|
|
|
|
if (j <= 0) {
|
2011-06-27 00:25:01 +02:00
|
|
|
if (this.worldData.hasStorm()) {
|
|
|
|
this.worldData.setWeatherDuration(this.random.nextInt(12000) + 12000);
|
2011-04-20 22:47:26 +02:00
|
|
|
} else {
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldData.setWeatherDuration(this.random.nextInt(168000) + 12000);
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
--j;
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldData.setWeatherDuration(j);
|
2011-04-20 22:47:26 +02:00
|
|
|
if (j <= 0) {
|
2011-04-26 04:00:18 +02:00
|
|
|
// CraftBukkit start
|
2011-06-27 00:25:01 +02:00
|
|
|
WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), !this.worldData.hasStorm());
|
|
|
|
this.getServer().getPluginManager().callEvent(weather);
|
2011-04-26 01:47:25 +02:00
|
|
|
|
|
|
|
if (!weather.isCancelled()) {
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldData.setStorm(!this.worldData.hasStorm());
|
2011-04-26 01:47:25 +02:00
|
|
|
}
|
2011-04-26 04:00:18 +02:00
|
|
|
// CraftBukkit end
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.n = this.o;
|
2011-06-27 00:25:01 +02:00
|
|
|
if (this.worldData.hasStorm()) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.o = (float) ((double) this.o + 0.01D);
|
2011-04-20 22:47:26 +02:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.o = (float) ((double) this.o - 0.01D);
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.o < 0.0F) {
|
|
|
|
this.o = 0.0F;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.o > 1.0F) {
|
|
|
|
this.o = 1.0F;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.p = this.q;
|
2011-06-27 00:25:01 +02:00
|
|
|
if (this.worldData.isThundering()) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.q = (float) ((double) this.q + 0.01D);
|
2011-04-20 22:47:26 +02:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.q = (float) ((double) this.q - 0.01D);
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.q < 0.0F) {
|
|
|
|
this.q = 0.0F;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.q > 1.0F) {
|
|
|
|
this.q = 1.0F;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void w() {
|
2011-11-20 09:01:14 +01:00
|
|
|
this.worldData.setWeatherDuration(1);
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
protected void x() {
|
2012-03-01 11:49:23 +01:00
|
|
|
// this.chunkTickList.clear(); // CraftBukkit - removed
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("buildList");
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
int i;
|
2012-03-01 11:49:23 +01:00
|
|
|
EntityHuman entityhuman;
|
2011-02-07 06:56:07 +01:00
|
|
|
int j;
|
2012-03-01 11:49:23 +01:00
|
|
|
int k;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
for (i = 0; i < this.players.size(); ++i) {
|
2012-03-01 11:49:23 +01:00
|
|
|
entityhuman = (EntityHuman) this.players.get(i);
|
|
|
|
j = MathHelper.floor(entityhuman.locX / 16.0D);
|
|
|
|
k = MathHelper.floor(entityhuman.locZ / 16.0D);
|
2011-11-20 09:01:14 +01:00
|
|
|
byte b0 = 7;
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
for (int l = -b0; l <= b0; ++l) {
|
2011-11-20 09:01:14 +01:00
|
|
|
for (int i1 = -b0; i1 <= b0; ++i1) {
|
2012-08-04 09:22:57 +02:00
|
|
|
// CraftBukkit start - don't tick chunks queued for unload
|
|
|
|
ChunkProviderServer chunkProviderServer = ((WorldServer) entityhuman.world).chunkProviderServer;
|
2012-08-18 01:53:59 +02:00
|
|
|
if (chunkProviderServer.unloadQueue.contains(l + j, i1 + k)) {
|
2012-08-04 09:22:57 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(l + j, i1 + k)); // CraftBukkit
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.M > 0) {
|
|
|
|
--this.M;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("playerCheckLight");
|
2012-03-01 11:49:23 +01:00
|
|
|
if (!this.players.isEmpty()) {
|
|
|
|
i = this.random.nextInt(this.players.size());
|
|
|
|
entityhuman = (EntityHuman) this.players.get(i);
|
|
|
|
j = MathHelper.floor(entityhuman.locX) + this.random.nextInt(11) - 5;
|
|
|
|
k = MathHelper.floor(entityhuman.locY) + this.random.nextInt(11) - 5;
|
|
|
|
int j1 = MathHelper.floor(entityhuman.locZ) + this.random.nextInt(11) - 5;
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.x(j, k, j1);
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
2011-11-20 09:01:14 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void a(int i, int j, Chunk chunk) {
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.c("moodSound");
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.M == 0) {
|
|
|
|
this.l = this.l * 3 + 1013904223;
|
|
|
|
int k = this.l >> 2;
|
2012-03-01 11:49:23 +01:00
|
|
|
int l = k & 15;
|
|
|
|
int i1 = k >> 8 & 15;
|
2012-03-01 22:13:53 +01:00
|
|
|
int j1 = k >> 16 & 255; // CraftBukkit - 127 -> 255
|
2012-03-01 11:49:23 +01:00
|
|
|
int k1 = chunk.getTypeId(l, j1, i1);
|
|
|
|
|
|
|
|
l += i;
|
|
|
|
i1 += j;
|
2012-07-29 09:33:13 +02:00
|
|
|
if (k1 == 0 && this.k(l, j1, i1) <= this.random.nextInt(8) && this.b(EnumSkyBlock.SKY, l, j1, i1) <= 0) {
|
2012-03-01 11:49:23 +01:00
|
|
|
EntityHuman entityhuman = this.findNearbyPlayer((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D, 8.0D);
|
|
|
|
|
|
|
|
if (entityhuman != null && entityhuman.e((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D) > 4.0D) {
|
|
|
|
this.makeSound((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.random.nextFloat() * 0.2F);
|
2012-07-29 09:33:13 +02:00
|
|
|
this.M = this.random.nextInt(12000) + 6000;
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.c("checkLight");
|
2012-07-29 09:33:13 +02:00
|
|
|
chunk.o();
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
protected void g() {
|
|
|
|
this.x();
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
2011-04-20 22:47:26 +02:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean u(int i, int j, int k) {
|
2011-11-20 09:01:14 +01:00
|
|
|
return this.c(i, j, k, false);
|
|
|
|
}
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean v(int i, int j, int k) {
|
2011-11-20 09:01:14 +01:00
|
|
|
return this.c(i, j, k, true);
|
|
|
|
}
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
public boolean c(int i, int j, int k, boolean flag) {
|
2012-03-01 11:49:23 +01:00
|
|
|
BiomeBase biomebase = this.getBiome(i, k);
|
2012-07-29 09:33:13 +02:00
|
|
|
float f = biomebase.j();
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
if (f > 0.15F) {
|
|
|
|
return false;
|
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (j >= 0 && j < 256 && this.b(EnumSkyBlock.BLOCK, i, j, k) < 10) {
|
2011-11-20 09:01:14 +01:00
|
|
|
int l = this.getTypeId(i, j, k);
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
if ((l == Block.STATIONARY_WATER.id || l == Block.WATER.id) && this.getData(i, j, k) == 0) {
|
|
|
|
if (!flag) {
|
|
|
|
return true;
|
|
|
|
}
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
boolean flag1 = true;
|
2011-06-17 20:48:20 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
if (flag1 && this.getMaterial(i - 1, j, k) != Material.WATER) {
|
|
|
|
flag1 = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag1 && this.getMaterial(i + 1, j, k) != Material.WATER) {
|
|
|
|
flag1 = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag1 && this.getMaterial(i, j, k - 1) != Material.WATER) {
|
|
|
|
flag1 = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag1 && this.getMaterial(i, j, k + 1) != Material.WATER) {
|
|
|
|
flag1 = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!flag1) {
|
|
|
|
return true;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean w(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
BiomeBase biomebase = this.getBiome(i, k);
|
2012-07-29 09:33:13 +02:00
|
|
|
float f = biomebase.j();
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
if (f > 0.15F) {
|
|
|
|
return false;
|
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (j >= 0 && j < 256 && this.b(EnumSkyBlock.BLOCK, i, j, k) < 10) {
|
2011-11-20 09:01:14 +01:00
|
|
|
int l = this.getTypeId(i, j - 1, k);
|
|
|
|
int i1 = this.getTypeId(i, j, k);
|
|
|
|
|
|
|
|
if (i1 == 0 && Block.SNOW.canPlace(this, i, j, k) && l != 0 && l != Block.ICE.id && Block.byId[l].material.isSolid()) {
|
|
|
|
return true;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
2011-11-20 09:01:14 +01:00
|
|
|
|
|
|
|
return false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void x(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
if (!this.worldProvider.e) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.c(EnumSkyBlock.SKY, i, j, k);
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.c(EnumSkyBlock.BLOCK, i, j, k);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
private int a(int i, int j, int k, int l, int i1, int j1) {
|
2011-09-15 02:23:52 +02:00
|
|
|
int k1 = 0;
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.j(j, k, l)) {
|
2011-09-15 02:23:52 +02:00
|
|
|
k1 = 15;
|
|
|
|
} else {
|
|
|
|
if (j1 == 0) {
|
|
|
|
j1 = 1;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
int l1 = this.b(EnumSkyBlock.SKY, j - 1, k, l) - j1;
|
|
|
|
int i2 = this.b(EnumSkyBlock.SKY, j + 1, k, l) - j1;
|
|
|
|
int j2 = this.b(EnumSkyBlock.SKY, j, k - 1, l) - j1;
|
|
|
|
int k2 = this.b(EnumSkyBlock.SKY, j, k + 1, l) - j1;
|
|
|
|
int l2 = this.b(EnumSkyBlock.SKY, j, k, l - 1) - j1;
|
|
|
|
int i3 = this.b(EnumSkyBlock.SKY, j, k, l + 1) - j1;
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
if (l1 > k1) {
|
|
|
|
k1 = l1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i2 > k1) {
|
|
|
|
k1 = i2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (j2 > k1) {
|
|
|
|
k1 = j2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (k2 > k1) {
|
|
|
|
k1 = k2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l2 > k1) {
|
|
|
|
k1 = l2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i3 > k1) {
|
|
|
|
k1 = i3;
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return k1;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
private int f(int i, int j, int k, int l, int i1, int j1) {
|
2012-01-14 21:03:48 +01:00
|
|
|
int k1 = Block.lightEmission[i1];
|
2012-07-29 09:33:13 +02:00
|
|
|
int l1 = this.b(EnumSkyBlock.BLOCK, j - 1, k, l) - j1;
|
|
|
|
int i2 = this.b(EnumSkyBlock.BLOCK, j + 1, k, l) - j1;
|
|
|
|
int j2 = this.b(EnumSkyBlock.BLOCK, j, k - 1, l) - j1;
|
|
|
|
int k2 = this.b(EnumSkyBlock.BLOCK, j, k + 1, l) - j1;
|
|
|
|
int l2 = this.b(EnumSkyBlock.BLOCK, j, k, l - 1) - j1;
|
|
|
|
int i3 = this.b(EnumSkyBlock.BLOCK, j, k, l + 1) - j1;
|
2011-09-15 02:23:52 +02:00
|
|
|
|
|
|
|
if (l1 > k1) {
|
|
|
|
k1 = l1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i2 > k1) {
|
|
|
|
k1 = i2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (j2 > k1) {
|
|
|
|
k1 = j2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (k2 > k1) {
|
|
|
|
k1 = k2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l2 > k1) {
|
|
|
|
k1 = l2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i3 > k1) {
|
|
|
|
k1 = i3;
|
|
|
|
}
|
|
|
|
|
|
|
|
return k1;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void c(EnumSkyBlock enumskyblock, int i, int j, int k) {
|
2011-09-15 02:23:52 +02:00
|
|
|
if (this.areChunksLoaded(i, j, k, 17)) {
|
|
|
|
int l = 0;
|
|
|
|
int i1 = 0;
|
2012-03-01 11:49:23 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("getBrightness");
|
2012-07-29 09:33:13 +02:00
|
|
|
int j1 = this.b(enumskyblock, i, j, k);
|
2011-09-15 02:23:52 +02:00
|
|
|
boolean flag = false;
|
|
|
|
int k1 = this.getTypeId(i, j, k);
|
2012-07-29 09:33:13 +02:00
|
|
|
int l1 = this.b(i, j, k);
|
2011-09-15 02:23:52 +02:00
|
|
|
|
|
|
|
if (l1 == 0) {
|
|
|
|
l1 = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean flag1 = false;
|
|
|
|
int i2;
|
|
|
|
|
|
|
|
if (enumskyblock == EnumSkyBlock.SKY) {
|
2012-07-29 09:33:13 +02:00
|
|
|
i2 = this.a(j1, i, j, k, k1, l1);
|
2011-09-15 02:23:52 +02:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
i2 = this.f(j1, i, j, k, k1, l1);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int j2;
|
|
|
|
int k2;
|
|
|
|
int l2;
|
|
|
|
int i3;
|
|
|
|
int j3;
|
|
|
|
int k3;
|
2012-07-29 09:33:13 +02:00
|
|
|
int l3;
|
|
|
|
int i4;
|
2011-09-15 02:23:52 +02:00
|
|
|
|
|
|
|
if (i2 > j1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.J[i1++] = 133152;
|
2011-09-15 02:23:52 +02:00
|
|
|
} else if (i2 < j1) {
|
|
|
|
if (enumskyblock != EnumSkyBlock.BLOCK) {
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
this.J[i1++] = 133152 + (j1 << 18);
|
2011-09-15 02:23:52 +02:00
|
|
|
|
|
|
|
while (l < i1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
k1 = this.J[l++];
|
|
|
|
l1 = (k1 & 63) - 32 + i;
|
|
|
|
i2 = (k1 >> 6 & 63) - 32 + j;
|
|
|
|
j2 = (k1 >> 12 & 63) - 32 + k;
|
|
|
|
k2 = k1 >> 18 & 15;
|
|
|
|
l2 = this.b(enumskyblock, l1, i2, j2);
|
2011-09-15 02:23:52 +02:00
|
|
|
if (l2 == k2) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.b(enumskyblock, l1, i2, j2, 0);
|
2011-09-15 02:23:52 +02:00
|
|
|
if (k2 > 0) {
|
2012-07-29 09:33:13 +02:00
|
|
|
i3 = l1 - i;
|
|
|
|
k3 = i2 - j;
|
|
|
|
j3 = j2 - k;
|
2011-09-15 02:23:52 +02:00
|
|
|
if (i3 < 0) {
|
|
|
|
i3 = -i3;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (k3 < 0) {
|
|
|
|
k3 = -k3;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (j3 < 0) {
|
|
|
|
j3 = -j3;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i3 + k3 + j3 < 17) {
|
2012-07-29 09:33:13 +02:00
|
|
|
for (i4 = 0; i4 < 6; ++i4) {
|
|
|
|
l3 = i4 % 2 * 2 - 1;
|
|
|
|
int j4 = l1 + i4 / 2 % 3 / 2 * l3;
|
|
|
|
int k4 = i2 + (i4 / 2 + 1) % 3 / 2 * l3;
|
|
|
|
int l4 = j2 + (i4 / 2 + 2) % 3 / 2 * l3;
|
2011-09-15 02:23:52 +02:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
l2 = this.b(enumskyblock, j4, k4, l4);
|
2012-01-14 21:03:48 +01:00
|
|
|
int i5 = Block.lightBlock[this.getTypeId(j4, k4, l4)];
|
2011-11-20 09:01:14 +01:00
|
|
|
|
|
|
|
if (i5 == 0) {
|
|
|
|
i5 = 1;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (l2 == k2 - i5 && i1 < this.J.length) {
|
|
|
|
this.J[i1++] = j4 - i + 32 + (k4 - j + 32 << 6) + (l4 - k + 32 << 12) + (k2 - i5 << 18);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
l = 0;
|
|
|
|
}
|
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
|
|
|
this.methodProfiler.a("tcp < tcc");
|
2012-03-01 11:49:23 +01:00
|
|
|
|
2011-09-15 02:23:52 +02:00
|
|
|
while (l < i1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
k1 = this.J[l++];
|
|
|
|
l1 = (k1 & 63) - 32 + i;
|
|
|
|
i2 = (k1 >> 6 & 63) - 32 + j;
|
|
|
|
j2 = (k1 >> 12 & 63) - 32 + k;
|
|
|
|
k2 = this.b(enumskyblock, l1, i2, j2);
|
|
|
|
l2 = this.getTypeId(l1, i2, j2);
|
|
|
|
i3 = Block.lightBlock[l2];
|
|
|
|
if (i3 == 0) {
|
|
|
|
i3 = 1;
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
boolean flag2 = false;
|
|
|
|
|
|
|
|
if (enumskyblock == EnumSkyBlock.SKY) {
|
2012-07-29 09:33:13 +02:00
|
|
|
k3 = this.a(k2, l1, i2, j2, l2, i3);
|
2011-09-15 02:23:52 +02:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
k3 = this.f(k2, l1, i2, j2, l2, i3);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (k3 != k2) {
|
|
|
|
this.b(enumskyblock, l1, i2, j2, k3);
|
|
|
|
if (k3 > k2) {
|
|
|
|
j3 = l1 - i;
|
|
|
|
i4 = i2 - j;
|
|
|
|
l3 = j2 - k;
|
|
|
|
if (j3 < 0) {
|
|
|
|
j3 = -j3;
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (i4 < 0) {
|
|
|
|
i4 = -i4;
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (l3 < 0) {
|
|
|
|
l3 = -l3;
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (j3 + i4 + l3 < 17 && i1 < this.J.length - 6) {
|
|
|
|
if (this.b(enumskyblock, l1 - 1, i2, j2) < k3) {
|
|
|
|
this.J[i1++] = l1 - 1 - i + 32 + (i2 - j + 32 << 6) + (j2 - k + 32 << 12);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.b(enumskyblock, l1 + 1, i2, j2) < k3) {
|
|
|
|
this.J[i1++] = l1 + 1 - i + 32 + (i2 - j + 32 << 6) + (j2 - k + 32 << 12);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.b(enumskyblock, l1, i2 - 1, j2) < k3) {
|
|
|
|
this.J[i1++] = l1 - i + 32 + (i2 - 1 - j + 32 << 6) + (j2 - k + 32 << 12);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.b(enumskyblock, l1, i2 + 1, j2) < k3) {
|
|
|
|
this.J[i1++] = l1 - i + 32 + (i2 + 1 - j + 32 << 6) + (j2 - k + 32 << 12);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.b(enumskyblock, l1, i2, j2 - 1) < k3) {
|
|
|
|
this.J[i1++] = l1 - i + 32 + (i2 - j + 32 << 6) + (j2 - 1 - k + 32 << 12);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.b(enumskyblock, l1, i2, j2 + 1) < k3) {
|
|
|
|
this.J[i1++] = l1 - i + 32 + (i2 - j + 32 << 6) + (j2 + 1 - k + 32 << 12);
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-03-01 11:49:23 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2011-09-15 02:23:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
public boolean a(boolean flag) {
|
2012-07-29 09:33:13 +02:00
|
|
|
return false;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
public List a(Chunk chunk, boolean flag) {
|
2012-07-29 09:33:13 +02:00
|
|
|
return null;
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
|
2012-01-12 16:27:39 +01:00
|
|
|
public List getEntities(Entity entity, AxisAlignedBB axisalignedbb) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.N.clear();
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
|
|
|
int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
for (int i1 = i; i1 <= j; ++i1) {
|
|
|
|
for (int j1 = k; j1 <= l; ++j1) {
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.isChunkLoaded(i1, j1)) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.getChunkAt(i1, j1).a(entity, axisalignedbb, this.N);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
return this.N;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public List a(Class oclass, AxisAlignedBB axisalignedbb) {
|
2011-04-20 19:05:14 +02:00
|
|
|
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);
|
|
|
|
int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D);
|
2011-02-07 06:56:07 +01:00
|
|
|
ArrayList arraylist = new ArrayList();
|
|
|
|
|
|
|
|
for (int i1 = i; i1 <= j; ++i1) {
|
|
|
|
for (int j1 = k; j1 <= l; ++j1) {
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.isChunkLoaded(i1, j1)) {
|
|
|
|
this.getChunkAt(i1, j1).a(oclass, axisalignedbb, arraylist);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return arraylist;
|
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public Entity a(Class oclass, AxisAlignedBB axisalignedbb, Entity entity) {
|
|
|
|
List list = this.a(oclass, axisalignedbb);
|
|
|
|
Entity entity1 = null;
|
|
|
|
double d0 = Double.MAX_VALUE;
|
|
|
|
Iterator iterator = list.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
Entity entity2 = (Entity) iterator.next();
|
|
|
|
|
|
|
|
if (entity2 != entity) {
|
2012-07-29 09:33:13 +02:00
|
|
|
double d1 = entity.e(entity2);
|
2012-03-01 11:49:23 +01:00
|
|
|
|
|
|
|
if (d1 <= d0) {
|
|
|
|
entity1 = entity2;
|
|
|
|
d0 = d1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return entity1;
|
|
|
|
}
|
|
|
|
|
2011-02-07 06:56:07 +01:00
|
|
|
public void b(int i, int j, int k, TileEntity tileentity) {
|
2011-04-20 19:05:14 +02:00
|
|
|
if (this.isLoaded(i, j, k)) {
|
2012-03-01 11:49:23 +01:00
|
|
|
this.getChunkAtWorldCoords(i, k).e();
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public int a(Class oclass) {
|
|
|
|
int i = 0;
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
for (int j = 0; j < this.entityList.size(); ++j) {
|
|
|
|
Entity entity = (Entity) this.entityList.get(j);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if (oclass.isAssignableFrom(entity.getClass())) {
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void a(List list) {
|
2011-03-20 21:18:38 +01:00
|
|
|
// CraftBukkit start
|
|
|
|
Entity entity = null;
|
2011-02-07 06:56:07 +01:00
|
|
|
for (int i = 0; i < list.size(); ++i) {
|
2011-03-20 21:18:38 +01:00
|
|
|
entity = (Entity) list.get(i);
|
2011-06-18 05:36:35 +02:00
|
|
|
if (entity == null) {
|
|
|
|
continue;
|
|
|
|
}
|
2011-04-20 19:05:14 +02:00
|
|
|
this.entityList.add(entity);
|
2011-03-20 21:18:38 +01:00
|
|
|
// CraftBukkit end
|
2012-07-29 09:33:13 +02:00
|
|
|
this.a((Entity) list.get(i));
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void b(List list) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.g.addAll(list);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean mayPlace(int i, int j, int k, int l, boolean flag, int i1, Entity entity) {
|
2011-05-26 14:48:22 +02:00
|
|
|
int j1 = this.getTypeId(j, k, l);
|
|
|
|
Block block = Block.byId[j1];
|
2011-02-07 06:56:07 +01:00
|
|
|
Block block1 = Block.byId[i];
|
2011-06-30 00:02:25 +02:00
|
|
|
AxisAlignedBB axisalignedbb = block1.e(this, j, k, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if (flag) {
|
|
|
|
axisalignedbb = null;
|
|
|
|
}
|
|
|
|
|
2011-06-12 00:02:58 +02:00
|
|
|
boolean defaultReturn; // CraftBukkit - store the default action
|
2011-02-07 10:26:12 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
if (axisalignedbb != null && !this.a(axisalignedbb, entity)) {
|
2011-06-12 00:02:58 +02:00
|
|
|
defaultReturn = false; // CraftBukkit
|
2011-05-14 16:29:42 +02:00
|
|
|
} else {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (block != null && (block == Block.WATER || block == Block.STATIONARY_WATER || block == Block.LAVA || block == Block.STATIONARY_LAVA || block == Block.FIRE || block.material.isReplaceable())) {
|
2011-05-14 16:29:42 +02:00
|
|
|
block = null;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
defaultReturn = i > 0 && block == null && block1.canPlace(this, j, k, l, i1);
|
2011-02-07 10:26:12 +01:00
|
|
|
}
|
|
|
|
|
2011-05-14 16:29:42 +02:00
|
|
|
// CraftBukkit start
|
2011-06-27 00:25:01 +02:00
|
|
|
BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(j, k, l), i, defaultReturn);
|
|
|
|
this.getServer().getPluginManager().callEvent(event);
|
2011-02-07 10:26:12 +01:00
|
|
|
|
|
|
|
return event.isBuildable();
|
|
|
|
// CraftBukkit end
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public PathEntity findPath(Entity entity, Entity entity1, float f, boolean flag, boolean flag1, boolean flag2, boolean flag3) {
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("pathfind");
|
2011-04-20 19:05:14 +02:00
|
|
|
int i = MathHelper.floor(entity.locX);
|
2012-03-01 11:49:23 +01:00
|
|
|
int j = MathHelper.floor(entity.locY + 1.0D);
|
2011-04-20 19:05:14 +02:00
|
|
|
int k = MathHelper.floor(entity.locZ);
|
2011-02-07 06:56:07 +01:00
|
|
|
int l = (int) (f + 16.0F);
|
|
|
|
int i1 = i - l;
|
|
|
|
int j1 = j - l;
|
|
|
|
int k1 = k - l;
|
|
|
|
int l1 = i + l;
|
|
|
|
int i2 = j + l;
|
|
|
|
int j2 = k + l;
|
|
|
|
ChunkCache chunkcache = new ChunkCache(this, i1, j1, k1, l1, i2, j2);
|
2012-03-01 11:49:23 +01:00
|
|
|
PathEntity pathentity = (new Pathfinder(chunkcache, flag, flag1, flag2, flag3)).a(entity, entity1, f);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2011-11-20 09:01:14 +01:00
|
|
|
return pathentity;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public PathEntity a(Entity entity, int i, int j, int k, float f, boolean flag, boolean flag1, boolean flag2, boolean flag3) {
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.a("pathfind");
|
2011-04-20 19:05:14 +02:00
|
|
|
int l = MathHelper.floor(entity.locX);
|
|
|
|
int i1 = MathHelper.floor(entity.locY);
|
|
|
|
int j1 = MathHelper.floor(entity.locZ);
|
2011-02-07 06:56:07 +01:00
|
|
|
int k1 = (int) (f + 8.0F);
|
|
|
|
int l1 = l - k1;
|
|
|
|
int i2 = i1 - k1;
|
|
|
|
int j2 = j1 - k1;
|
|
|
|
int k2 = l + k1;
|
|
|
|
int l2 = i1 + k1;
|
|
|
|
int i3 = j1 + k1;
|
|
|
|
ChunkCache chunkcache = new ChunkCache(this, l1, i2, j2, k2, l2, i3);
|
2012-03-01 11:49:23 +01:00
|
|
|
PathEntity pathentity = (new Pathfinder(chunkcache, flag, flag1, flag2, flag3)).a(entity, i, j, k, f);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-09-10 06:19:28 +02:00
|
|
|
this.methodProfiler.b();
|
2011-11-20 09:01:14 +01:00
|
|
|
return pathentity;
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean isBlockFacePowered(int i, int j, int k, int l) {
|
2011-02-07 06:56:07 +01:00
|
|
|
int i1 = this.getTypeId(i, j, k);
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
return i1 == 0 ? false : Block.byId[i1].c(this, i, j, k, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean isBlockPowered(int i, int j, int k) {
|
|
|
|
return this.isBlockFacePowered(i, j - 1, k, 0) ? true : (this.isBlockFacePowered(i, j + 1, k, 1) ? true : (this.isBlockFacePowered(i, j, k - 1, 2) ? true : (this.isBlockFacePowered(i, j, k + 1, 3) ? true : (this.isBlockFacePowered(i - 1, j, k, 4) ? true : this.isBlockFacePowered(i + 1, j, k, 5)))));
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean isBlockFaceIndirectlyPowered(int i, int j, int k, int l) {
|
2012-07-29 09:33:13 +02:00
|
|
|
if (this.s(i, j, k)) {
|
2011-04-20 19:05:14 +02:00
|
|
|
return this.isBlockPowered(i, j, k);
|
2011-02-07 06:56:07 +01:00
|
|
|
} else {
|
|
|
|
int i1 = this.getTypeId(i, j, k);
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
return i1 == 0 ? false : Block.byId[i1].a(this, i, j, k, l);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public boolean isBlockIndirectlyPowered(int i, int j, int k) {
|
|
|
|
return this.isBlockFaceIndirectlyPowered(i, j - 1, k, 0) ? true : (this.isBlockFaceIndirectlyPowered(i, j + 1, k, 1) ? true : (this.isBlockFaceIndirectlyPowered(i, j, k - 1, 2) ? true : (this.isBlockFaceIndirectlyPowered(i, j, k + 1, 3) ? true : (this.isBlockFaceIndirectlyPowered(i - 1, j, k, 4) ? true : this.isBlockFaceIndirectlyPowered(i + 1, j, k, 5)))));
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-06-27 00:25:01 +02:00
|
|
|
public EntityHuman findNearbyPlayer(Entity entity, double d0) {
|
2011-11-30 00:17:43 +01:00
|
|
|
return this.findNearbyPlayer(entity.locX, entity.locY, entity.locZ, d0);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public EntityHuman findNearbyPlayer(double d0, double d1, double d2, double d3) {
|
2011-02-07 06:56:07 +01:00
|
|
|
double d4 = -1.0D;
|
|
|
|
EntityHuman entityhuman = null;
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
for (int i = 0; i < this.players.size(); ++i) {
|
|
|
|
EntityHuman entityhuman1 = (EntityHuman) this.players.get(i);
|
2011-06-18 05:36:35 +02:00
|
|
|
// CraftBukkit start - fixed an NPE
|
2011-06-19 06:53:45 +02:00
|
|
|
if (entityhuman1 == null || entityhuman1.dead) {
|
2011-06-18 05:36:35 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
2011-07-08 14:25:53 +02:00
|
|
|
double d5 = entityhuman1.e(d0, d1, d2);
|
2011-02-07 06:56:07 +01:00
|
|
|
|
|
|
|
if ((d3 < 0.0D || d5 < d3 * d3) && (d4 == -1.0D || d5 < d4)) {
|
|
|
|
d4 = d5;
|
|
|
|
entityhuman = entityhuman1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return entityhuman;
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public EntityHuman findNearbyVulnerablePlayer(Entity entity, double d0) {
|
|
|
|
return this.findNearbyVulnerablePlayer(entity.locX, entity.locY, entity.locZ, d0);
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public EntityHuman findNearbyVulnerablePlayer(double d0, double d1, double d2, double d3) {
|
2011-11-20 09:01:14 +01:00
|
|
|
double d4 = -1.0D;
|
|
|
|
EntityHuman entityhuman = null;
|
|
|
|
|
|
|
|
for (int i = 0; i < this.players.size(); ++i) {
|
|
|
|
EntityHuman entityhuman1 = (EntityHuman) this.players.get(i);
|
2012-07-29 09:33:13 +02:00
|
|
|
// CraftBukkit start - fixed an NPE
|
|
|
|
if (entityhuman1 == null || entityhuman1.dead) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
2012-01-08 01:12:38 +01:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
if (!entityhuman1.abilities.isInvulnerable) {
|
|
|
|
double d5 = entityhuman1.e(d0, d1, d2);
|
|
|
|
|
|
|
|
if ((d3 < 0.0D || d5 < d3 * d3) && (d4 == -1.0D || d5 < d4)) {
|
|
|
|
d4 = d5;
|
|
|
|
entityhuman = entityhuman1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return entityhuman;
|
|
|
|
}
|
|
|
|
|
2011-03-31 22:40:00 +02:00
|
|
|
public EntityHuman a(String s) {
|
2011-04-20 19:05:14 +02:00
|
|
|
for (int i = 0; i < this.players.size(); ++i) {
|
|
|
|
if (s.equals(((EntityHuman) this.players.get(i)).name)) {
|
|
|
|
return (EntityHuman) this.players.get(i);
|
2011-03-31 22:40:00 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void B() throws ExceptionWorldConflict { // CraftBukkit - added throws
|
2011-11-30 00:17:43 +01:00
|
|
|
this.dataManager.checkSession();
|
2011-02-23 03:37:56 +01:00
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public void setTime(long i) {
|
2012-07-29 09:33:13 +02:00
|
|
|
this.worldData.b(i);
|
2011-07-08 14:25:53 +02:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public long getSeed() {
|
2011-06-27 00:25:01 +02:00
|
|
|
return this.worldData.getSeed();
|
2011-02-23 03:37:56 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public long getTime() {
|
2012-01-14 21:03:48 +01:00
|
|
|
return this.worldData.getTime();
|
2011-02-23 03:37:56 +01:00
|
|
|
}
|
|
|
|
|
2011-04-20 19:05:14 +02:00
|
|
|
public ChunkCoordinates getSpawn() {
|
|
|
|
return new ChunkCoordinates(this.worldData.c(), this.worldData.d(), this.worldData.e());
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean a(EntityHuman entityhuman, int i, int j, int k) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-02-29 22:31:04 +01:00
|
|
|
public void broadcastEntityEffect(Entity entity, byte b0) {}
|
2011-02-07 06:56:07 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public IChunkProvider F() {
|
2011-04-20 19:05:14 +02:00
|
|
|
return this.chunkProvider;
|
2011-03-31 22:40:00 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void playNote(int i, int j, int k, int l, int i1, int j1) {
|
|
|
|
if (l > 0) {
|
|
|
|
Block.byId[l].b(this, i, j, k, i1, j1);
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|
|
|
|
}
|
2011-02-23 03:37:56 +01:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public IDataManager getDataManager() {
|
|
|
|
return this.dataManager;
|
2011-02-23 03:37:56 +01:00
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public WorldData getWorldData() {
|
2011-04-20 19:05:14 +02:00
|
|
|
return this.worldData;
|
2011-02-23 03:37:56 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void everyoneSleeping() {}
|
2011-02-23 03:37:56 +01:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
// CraftBukkit start
|
2011-04-11 20:48:31 +02:00
|
|
|
// Calls the method that checks to see if players are sleeping
|
|
|
|
// Called by CraftPlayer.setPermanentSleeping()
|
|
|
|
public void checkSleepStatus() {
|
2011-06-27 00:25:01 +02:00
|
|
|
if (!this.isStatic) {
|
|
|
|
this.everyoneSleeping();
|
2011-04-11 20:48:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public float i(float f) {
|
|
|
|
return (this.p + (this.q - this.p) * f) * this.j(f);
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public float j(float f) {
|
|
|
|
return this.n + (this.o - this.n) * f;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean I() {
|
|
|
|
return (double) this.i(1.0F) > 0.9D;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean J() {
|
|
|
|
return (double) this.j(1.0F) > 0.2D;
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean B(int i, int j, int k) {
|
|
|
|
if (!this.J()) {
|
2011-04-20 22:47:26 +02:00
|
|
|
return false;
|
2012-07-29 09:33:13 +02:00
|
|
|
} else if (!this.j(i, j, k)) {
|
2011-04-20 22:47:26 +02:00
|
|
|
return false;
|
2012-07-29 09:33:13 +02:00
|
|
|
} else if (this.g(i, k) > j) {
|
2011-04-20 22:47:26 +02:00
|
|
|
return false;
|
|
|
|
} else {
|
2012-03-01 11:49:23 +01:00
|
|
|
BiomeBase biomebase = this.getBiome(i, k);
|
2011-04-20 22:47:26 +02:00
|
|
|
|
2012-03-22 21:39:39 +01:00
|
|
|
return biomebase.c() ? false : biomebase.d();
|
2011-04-20 22:47:26 +02:00
|
|
|
}
|
|
|
|
}
|
2011-05-26 14:48:22 +02:00
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public boolean C(int i, int j, int k) {
|
2012-03-01 11:49:23 +01:00
|
|
|
BiomeBase biomebase = this.getBiome(i, k);
|
|
|
|
|
2012-03-22 21:39:39 +01:00
|
|
|
return biomebase.e();
|
2012-03-01 11:49:23 +01:00
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:22 +02:00
|
|
|
public void a(String s, WorldMapBase worldmapbase) {
|
2011-06-27 00:25:01 +02:00
|
|
|
this.worldMaps.a(s, worldmapbase);
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public WorldMapBase a(Class oclass, String s) {
|
2012-01-12 16:27:39 +01:00
|
|
|
return this.worldMaps.get(oclass, s);
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public int b(String s) {
|
2011-06-27 00:25:01 +02:00
|
|
|
return this.worldMaps.a(s);
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
|
2012-02-29 22:31:04 +01:00
|
|
|
public void triggerEffect(int i, int j, int k, int l, int i1) {
|
2011-05-26 14:48:22 +02:00
|
|
|
this.a((EntityHuman) null, i, j, k, l, i1);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) {
|
2012-07-29 09:33:13 +02:00
|
|
|
for (int j1 = 0; j1 < this.x.size(); ++j1) {
|
|
|
|
((IWorldAccess) this.x.get(j1)).a(entityhuman, i, j, k, l, i1);
|
2011-05-26 14:48:22 +02:00
|
|
|
}
|
|
|
|
}
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2012-03-01 11:49:23 +01:00
|
|
|
public int getHeight() {
|
|
|
|
return 256;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public int L() {
|
|
|
|
return this.worldProvider.e ? 128 : 256;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Random D(int i, int j, int k) {
|
2011-11-30 00:17:43 +01:00
|
|
|
long l = (long) i * 341873128712L + (long) j * 132897987541L + this.getWorldData().getSeed() + (long) k;
|
2011-09-15 02:23:52 +02:00
|
|
|
|
|
|
|
this.random.setSeed(l);
|
|
|
|
return this.random;
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public boolean updateLights() {
|
2011-09-15 02:23:52 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public ChunkPosition b(String s, int i, int j, int k) {
|
|
|
|
return this.F().findNearestMapFeature(this, s, i, j, k);
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public CrashReport a(CrashReport crashreport) {
|
|
|
|
crashreport.a("World " + this.worldData.getName() + " Entities", (Callable) (new CrashReportEntities(this)));
|
|
|
|
crashreport.a("World " + this.worldData.getName() + " Players", (Callable) (new CrashReportPlayers(this)));
|
|
|
|
crashreport.a("World " + this.worldData.getName() + " Chunk Stats", (Callable) (new CrashReportChunkStats(this)));
|
|
|
|
return crashreport;
|
2011-11-20 09:01:14 +01:00
|
|
|
}
|
|
|
|
|
2012-07-29 09:33:13 +02:00
|
|
|
public void f(int i, int j, int k, int l, int i1) {
|
|
|
|
Iterator iterator = this.x.iterator();
|
|
|
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
IWorldAccess iworldaccess = (IWorldAccess) iterator.next();
|
|
|
|
|
|
|
|
iworldaccess.a(i, j, k, l, i1);
|
|
|
|
}
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
2011-02-07 06:56:07 +01:00
|
|
|
}
|