2010-12-29 00:52:29 +01:00
|
|
|
package net.minecraft.server;
|
|
|
|
|
|
|
|
import java.io.File;
|
2011-01-01 07:20:44 +01:00
|
|
|
import java.util.Random;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
2011-01-01 09:12:39 +01:00
|
|
|
|
|
|
|
import org.bukkit.Material;
|
2010-12-30 23:07:54 +01:00
|
|
|
import org.bukkit.craftbukkit.CraftServer;
|
2010-12-29 00:52:29 +01:00
|
|
|
import org.bukkit.craftbukkit.CraftWorld;
|
2010-12-31 13:52:40 +01:00
|
|
|
import org.bukkit.event.Event;
|
2011-01-01 07:20:44 +01:00
|
|
|
import org.bukkit.event.Event.Type;
|
|
|
|
import org.bukkit.event.block.BlockCanBuildEvent;
|
2010-12-30 23:07:54 +01:00
|
|
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
2010-12-29 00:52:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
public class WorldServer extends World {
|
|
|
|
|
|
|
|
public ChunkProviderServer A;
|
|
|
|
public boolean B;
|
|
|
|
public boolean C;
|
|
|
|
private MinecraftServer D;
|
|
|
|
private MCHashTable E;
|
|
|
|
private final CraftWorld world; // CraftBukkit
|
2010-12-30 23:07:54 +01:00
|
|
|
private final CraftServer server; // CraftBukkit
|
2010-12-29 00:52:29 +01:00
|
|
|
|
|
|
|
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;
|
2010-12-30 05:37:32 +01:00
|
|
|
world = new CraftWorld(this); // CraftBukkit
|
2010-12-30 23:07:54 +01:00
|
|
|
server = minecraftserver.server; // CraftBukkit
|
2010-12-29 00:52:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// CraftBukkit start
|
|
|
|
@Override
|
|
|
|
public boolean c(int i1, int j1, int k1, int l1) {
|
|
|
|
boolean result = super.c(i1, j1, k1, l1);
|
|
|
|
world.updateBlock(i1, j1, k1);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean d(int i1, int j1, int k1, int l1) {
|
|
|
|
boolean result = super.d(i1, j1, k1, l1);
|
|
|
|
world.updateBlock(i1, j1, k1);
|
|
|
|
return result;
|
|
|
|
}
|
2010-12-30 05:37:32 +01:00
|
|
|
|
|
|
|
public CraftWorld getWorld() {
|
|
|
|
return world;
|
|
|
|
}
|
2010-12-31 13:52:40 +01:00
|
|
|
|
2011-01-01 04:59:30 +01:00
|
|
|
public CraftServer getServer() {
|
|
|
|
return server;
|
2010-12-31 22:58:18 +01:00
|
|
|
}
|
2010-12-29 00:52:29 +01:00
|
|
|
// CraftBukkit stop
|
|
|
|
|
2010-12-30 23:07:54 +01:00
|
|
|
// CraftBukkit start - note: the following methods are straight from the
|
|
|
|
// World.java with tweaks as noted. KEEP THEM UPDATED!
|
|
|
|
@Override
|
|
|
|
public void g(int i1, int j1, int k1, int l1) {
|
|
|
|
k(i1 - 1, j1, k1, l1);
|
|
|
|
k(i1 + 1, j1, k1, l1);
|
|
|
|
k(i1, j1 - 1, k1, l1);
|
|
|
|
k(i1, j1 + 1, k1, l1);
|
|
|
|
k(i1, j1, k1 - 1, l1);
|
|
|
|
k(i1, j1, k1 + 1, l1);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void k(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
|
2010-12-31 22:58:18 +01:00
|
|
|
BlockPhysicsEvent event = new BlockPhysicsEvent(Event.Type.BLOCK_PHYSICS, world.getBlockAt(i1, j1, k1), l1);
|
2010-12-30 23:07:54 +01:00
|
|
|
server.getPluginManager().callEvent(event);
|
|
|
|
if (event.isCancelled()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// CraftBukkit stop
|
|
|
|
|
|
|
|
block.b(this, i1, j1, k1, l1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// CraftBukkit stop
|
|
|
|
|
2011-01-01 07:20:44 +01:00
|
|
|
// CraftBukkit start
|
|
|
|
@Override
|
2011-01-01 07:39:28 +01:00
|
|
|
public boolean a(int i1, int j1, int k1, int l1, boolean flag) {
|
|
|
|
boolean superResult = super.a(i1, j1, k1, l1, flag);
|
2011-01-01 07:20:44 +01:00
|
|
|
|
2011-01-01 07:39:28 +01:00
|
|
|
if (!flag) {
|
2011-01-01 09:21:49 +01:00
|
|
|
BlockCanBuildEvent event = new BlockCanBuildEvent(Type.BLOCK_CANBUILD, getWorld().getBlockAt(j1, k1, l1), i1, superResult);
|
2011-01-01 07:39:28 +01:00
|
|
|
server.getPluginManager().callEvent(event);
|
|
|
|
|
2011-01-01 09:12:39 +01:00
|
|
|
return event.isBuildable();
|
2011-01-01 07:39:28 +01:00
|
|
|
} else {
|
|
|
|
return superResult;
|
|
|
|
}
|
2011-01-01 07:20:44 +01:00
|
|
|
}
|
|
|
|
// CraftBukkit stop
|
|
|
|
|
2010-12-29 00:52:29 +01:00
|
|
|
public void f() {
|
|
|
|
super.f();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void a(Entity entity, boolean flag) {
|
|
|
|
if (!D.m && (entity instanceof EntityAnimals)) {
|
|
|
|
entity.l();
|
|
|
|
}
|
|
|
|
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 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) {
|
|
|
|
arraylist.add(tileentity);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 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, 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, new Packet60(d1, d2, d3, f1, explosion.g));
|
|
|
|
return explosion;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|