Paper/src/main/java/net/minecraft/server/WorldServer.java
2011-01-14 13:31:10 +00:00

207 Zeilen
6.2 KiB
Java

package net.minecraft.server;
import java.io.File;
import java.util.*;
// CraftBukkit start
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.event.Event;
import org.bukkit.event.Event.Type;
import org.bukkit.event.block.BlockCanBuildEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
// CraftBukkit end
public class WorldServer extends World {
public ChunkProviderServer A;
public boolean B;
public boolean C;
private MinecraftServer D;
private MCHashTable E;
public WorldServer(MinecraftServer minecraftserver, File file, String s, int i) {
super(file, s, (new Random()).nextLong(), WorldProvider.a(i));
B = false;
E = new MCHashTable();
D = minecraftserver;
world = new CraftWorld(this); // CraftBukkit
server = minecraftserver.server; // CraftBukkit
}
public void f() {
super.f();
}
public void a(Entity entity, boolean flag) {
if (!D.m && ((entity instanceof EntityAnimals) || (entity instanceof EntityWaterMob))) {
entity.q();
}
if (entity.j == null || !(entity.j instanceof EntityPlayer)) {
super.a(entity, flag);
}
}
public void b(Entity entity, boolean flag) {
super.a(entity, flag);
}
protected IChunkProvider a(File file) {
A = new ChunkProviderServer(this, q.a(file), q.c());
return ((IChunkProvider) (A));
}
public List d(int i, int j, int k, int l, int i1, int j1) {
ArrayList arraylist = new ArrayList();
for (int k1 = 0; k1 < c.size(); k1++) {
TileEntity tileentity = (TileEntity) c.get(k1);
if (tileentity.b >= i && tileentity.c >= j && tileentity.d >= k && tileentity.b < l && tileentity.c < i1 && tileentity.d < j1) {
((List) (arraylist)).add(((tileentity)));
}
}
return ((List) (arraylist));
}
public boolean a(EntityPlayer entityplayer, int i, int j, int k) {
int l = (int) MathHelper.e(i - m);
int i1 = (int) MathHelper.e(k - o);
if (l > i1) {
i1 = l;
}
return i1 > 16 || D.f.g(entityplayer.aw);
}
protected void b(Entity entity) {
super.b(entity);
E.a(entity.g, ((entity)));
}
protected void c(Entity entity) {
super.c(entity);
E.d(entity.g);
}
public Entity a(int i) {
return (Entity) E.a(i);
}
public void a(Entity entity, byte byte0) {
Packet38 packet38 = new Packet38(entity.g, byte0);
D.k.b(entity, ((Packet) (packet38)));
}
public Explosion a(Entity entity, double d1, double d2, double d3, float f1, boolean flag) {
Explosion explosion = super.a(entity, d1, d2, d3, f1, flag);
D.f.a(d1, d2, d3, 64D, ((Packet) (new Packet60(d1, d2, d3, f1, explosion.g))));
return explosion;
}
// CraftBukkit start
private final CraftWorld world;
private final CraftServer server;
@Override
public boolean d(int i1, int j1, int k1, int l1) {
boolean result = super.d(i1, j1, k1, l1);
if ((result) && (world != null)) world.updateBlock(i1, j1, k1);
return result;
}
@Override
public boolean b(int i1, int j1, int k1, int l1) {
boolean result = super.b(i1, j1, k1, l1);
if ((result) && (world != null)) world.updateBlock(i1, j1, k1);
return result;
}
@Override
public void a(int i1, int j1, int k1, TileEntity tileentity) {
super.a(i1, j1, k1, tileentity);
if (world != null) world.updateBlock(i1, j1, k1);
}
public CraftWorld getWorld() {
return world;
}
public CraftServer getServer() {
return server;
}
// CraftBukkit end
// XXX: the following method is straight from the World.java with tweaks as noted. KEEP THEM UPDATED!
// XXX: done because it calls private k()
@Override
public void h(int i1, int j1, int k1, int l1) {
l(i1 - 1, j1, k1, l1);
l(i1 + 1, j1, k1, l1);
l(i1, j1 - 1, k1, l1);
l(i1, j1 + 1, k1, l1);
l(i1, j1, k1 - 1, l1);
l(i1, j1, k1 + 1, l1);
}
// XXX: the following method is straight from the World.java with tweaks as noted. KEEP THEM UPDATED!
private void l(int i1, int j1, int k1, int l1) {
if (i || z) {
return;
}
Block block = Block.m[a(i1, j1, k1)];
if (block != null) {
// CraftBukkit start
if (world != null) {
BlockPhysicsEvent event = new BlockPhysicsEvent(Event.Type.BLOCK_PHYSICS, world.getBlockAt(i1, j1, k1), l1);
server.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
}
// CraftBukkit stop
block.b(this, i1, j1, k1, l1);
}
}
// XXX: the following method is straight from the World.java with tweaks as noted. KEEP THEM UPDATED!
@Override
public boolean a(int i1, int j1, int k1, int l1, boolean flag) {
int i2 = a(j1, k1, l1);
Block block = Block.m[i2];
Block block1 = Block.m[i1];
AxisAlignedBB axisalignedbb = block1.d(this, j1, k1, l1);
if (flag) {
axisalignedbb = null;
}
if (axisalignedbb != null && !a(axisalignedbb)) {
return false;
}
// Craftbukkit start - We dont want to allow the user to override the bounding box check
boolean defaultReturn;
if (block == Block.A || block == Block.B || block == Block.C || block == Block.D || block == Block.ar || block == Block.aS) {
defaultReturn = true;
} else {
defaultReturn = (i1 > 0) && (block == null) && (block1.a(this, j1, k1, l1));
}
// Craftbukkit - If flag is true, it's natural, not user placement. Don't hook.
if (!flag) {
BlockCanBuildEvent event = new BlockCanBuildEvent(Type.BLOCK_CANBUILD, getWorld().getBlockAt(j1, k1, l1), i1, defaultReturn);
server.getPluginManager().callEvent(event);
return event.isBuildable();
} else {
return defaultReturn;
}
// CraftBukkit end
}
}