@@ -0,0 +1,337 @@
import java.util.Iterator;
import java.util.Set;
import java.util.logging.Logger;
import net.minecraft.server.MinecraftServer;

public class OConsoleCommandHandler {

private static Logger a = Logger.getLogger("Minecraft");
private MinecraftServer b;


public OConsoleCommandHandler(MinecraftServer var1) {
super();
this.b = var1;
}

public void a(OServerCommand var1) {
String var2 = var1.a;
OICommandListener var3 = var1.b;
String var4 = var3.d();
OServerConfigurationManager var5 = this.b.f;
if(!var2.toLowerCase().startsWith("help") && !var2.toLowerCase().startsWith("?")) {
if(var2.toLowerCase().startsWith("list")) {
var3.b("Connected players: " + var5.c());
} else if(var2.toLowerCase().startsWith("stop")) {
this.a(var4, "Stopping the server..");
this.b.a();
} else {
int var6;
OWorldServer var7;
if(var2.toLowerCase().startsWith("save-all")) {
this.a(var4, "Forcing save..");
if(var5 != null) {
var5.d();
}

for(var6 = 0; var6 < this.b.e.length; ++var6) {
var7 = this.b.e[var6];
var7.a(true, (OIProgressUpdate)null);
}

this.a(var4, "Save complete.");
} else if(var2.toLowerCase().startsWith("save-off")) {
this.a(var4, "Disabling level saving..");

for(var6 = 0; var6 < this.b.e.length; ++var6) {
var7 = this.b.e[var6];
var7.O = true;
}
} else if(var2.toLowerCase().startsWith("save-on")) {
this.a(var4, "Enabling level saving..");

for(var6 = 0; var6 < this.b.e.length; ++var6) {
var7 = this.b.e[var6];
var7.O = false;
}
} else {
String var14;
if(var2.toLowerCase().startsWith("op ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var5.e(var14);
this.a(var4, "Opping " + var14);
var5.a(var14, "\u00a7eYou are now op!");
} else if(var2.toLowerCase().startsWith("deop ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var5.f(var14);
var5.a(var14, "\u00a7eYou are no longer op!");
this.a(var4, "De-opping " + var14);
} else if(var2.toLowerCase().startsWith("ban-ip ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var5.c(var14);
this.a(var4, "Banning ip " + var14);
} else if(var2.toLowerCase().startsWith("pardon-ip ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var5.d(var14);
this.a(var4, "Pardoning ip " + var14);
} else {
OEntityPlayerMP var15;
if(var2.toLowerCase().startsWith("ban ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var5.a(var14);
this.a(var4, "Banning " + var14);
var15 = var5.i(var14);
if(var15 != null) {
var15.a.a("Banned by admin");
}
} else if(var2.toLowerCase().startsWith("pardon ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var5.b(var14);
this.a(var4, "Pardoning " + var14);
} else {
int var8;
if(var2.toLowerCase().startsWith("kick ")) {
var14 = var2.substring(var2.indexOf(" ")).trim();
var15 = null;

for(var8 = 0; var8 < var5.b.size(); ++var8) {
OEntityPlayerMP var9 = (OEntityPlayerMP)var5.b.get(var8);
if(var9.u.equalsIgnoreCase(var14)) {
var15 = var9;
}
}

if(var15 != null) {
var15.a.a("Kicked by admin");
this.a(var4, "Kicking " + var15.u);
} else {
var3.b("Can\'t find user " + var14 + ". No kick.");
}
} else {
OEntityPlayerMP var16;
String[] var19;
if(var2.toLowerCase().startsWith("tp ")) {
var19 = var2.split(" ");
if(var19.length == 3) {
var15 = var5.i(var19[1]);
var16 = var5.i(var19[2]);
if(var15 == null) {
var3.b("Can\'t find user " + var19[1] + ". No tp.");
} else if(var16 == null) {
var3.b("Can\'t find user " + var19[2] + ". No tp.");
} else if(var15.v != var16.v) {
var3.b("User " + var19[1] + " and " + var19[2] + " are in different dimensions. No tp.");
} else {
var15.a.a(var16.bf, var16.bg, var16.bh, var16.bl, var16.bm);
this.a(var4, "Teleporting " + var19[1] + " to " + var19[2] + ".");
}
} else {
var3.b("Syntax error, please provice a source and a target.");
}
} else {
int var17;
String var18;
if(var2.toLowerCase().startsWith("give ")) {
var19 = var2.split(" ");
if(var19.length != 3 && var19.length != 4) {
return;
}

var18 = var19[1];
var16 = var5.i(var18);
if(var16 != null) {
try {
var17 = Integer.parseInt(var19[2]);
if(OItem.c[var17] != null) {
this.a(var4, "Giving " + var16.u + " some " + var17);
int var10 = 1;
if(var19.length > 3) {
var10 = this.a(var19[3], 1);
}

if(var10 < 1) {
var10 = 1;
}

if(var10 > 64) {
var10 = 64;
}

var16.b(new OItemStack(var17, var10, 0));
} else {
var3.b("There\'s no item with id " + var17);
}
} catch (NumberFormatException var12) {
var3.b("There\'s no item with id " + var19[2]);
}
} else {
var3.b("Can\'t find user " + var18);
}
} else if(var2.toLowerCase().startsWith("gamemode ")) {
var19 = var2.split(" ");
if(var19.length != 3) {
return;
}

var18 = var19[1];
var16 = var5.i(var18);
if(var16 != null) {
try {
var17 = Integer.parseInt(var19[2]);
var17 = OWorldSettings.a(var17);
if(var16.c.a() != var17) {
this.a(var4, "Setting " + var16.u + " to game mode " + var17);
var16.c.a(var17);
var16.a.b((OPacket)(new OPacket70Bed(3, var17)));
} else {
this.a(var4, var16.u + " already has game mode " + var17);
}
} catch (NumberFormatException var11) {
var3.b("There\'s no game mode with id " + var19[2]);
}
} else {
var3.b("Can\'t find user " + var18);
}
} else if(var2.toLowerCase().startsWith("time ")) {
var19 = var2.split(" ");
if(var19.length != 3) {
return;
}

var18 = var19[1];

try {
var8 = Integer.parseInt(var19[2]);
OWorldServer var20;
if("add".equalsIgnoreCase(var18)) {
for(var17 = 0; var17 < this.b.e.length; ++var17) {
var20 = this.b.e[var17];
var20.b(var20.l() + (long)var8);
}

this.a(var4, "Added " + var8 + " to time");
} else if("set".equalsIgnoreCase(var18)) {
for(var17 = 0; var17 < this.b.e.length; ++var17) {
var20 = this.b.e[var17];
var20.b((long)var8);
}

this.a(var4, "Set time to " + var8);
} else {
var3.b("Unknown method, use either \"add\" or \"set\"");
}
} catch (NumberFormatException var13) {
var3.b("Unable to convert time value, " + var19[2]);
}
} else if(var2.toLowerCase().startsWith("say ")) {
var2 = var2.substring(var2.indexOf(" ")).trim();
a.info("[" + var4 + "] " + var2);
var5.a((OPacket)(new OPacket3Chat("\u00a7d[Server] " + var2)));
} else if(var2.toLowerCase().startsWith("tell ")) {
var19 = var2.split(" ");
if(var19.length >= 3) {
var2 = var2.substring(var2.indexOf(" ")).trim();
var2 = var2.substring(var2.indexOf(" ")).trim();
a.info("[" + var4 + "->" + var19[1] + "] " + var2);
var2 = "\u00a77" + var4 + " whispers " + var2;
a.info(var2);
if(!var5.a(var19[1], (OPacket)(new OPacket3Chat(var2)))) {
var3.b("There\'s no player by that name online.");
}
}
} else if(var2.toLowerCase().startsWith("whitelist ")) {
this.a(var4, var2, var3);
} else {
a.info("Unknown console command. Type \"help\" for help.");
}
}
}
}
}
}
}
} else {
this.a(var3);
}

}

private void a(String var1, String var2, OICommandListener var3) {
String[] var4 = var2.split(" ");
if(var4.length >= 2) {
String var5 = var4[1].toLowerCase();
if("on".equals(var5)) {
this.a(var1, "Turned on white-listing");
this.b.d.b("white-list", true);
} else if("off".equals(var5)) {
this.a(var1, "Turned off white-listing");
this.b.d.b("white-list", false);
} else if("list".equals(var5)) {
Set var6 = this.b.f.e();
String var7 = "";

String var9;
for(Iterator var8 = var6.iterator(); var8.hasNext(); var7 = var7 + var9 + " ") {
var9 = (String)var8.next();
}

var3.b("White-listed players: " + var7);
} else {
String var10;
if("add".equals(var5) && var4.length == 3) {
var10 = var4[2].toLowerCase();
this.b.f.k(var10);
this.a(var1, "Added " + var10 + " to white-list");
} else if("remove".equals(var5) && var4.length == 3) {
var10 = var4[2].toLowerCase();
this.b.f.l(var10);
this.a(var1, "Removed " + var10 + " from white-list");
} else if("reload".equals(var5)) {
this.b.f.f();
this.a(var1, "Reloaded white-list from file");
}
}

}
}

private void a(OICommandListener var1) {
var1.b("To run the server without a gui, start it like this:");
var1.b(" java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui");
var1.b("Console commands:");
var1.b(" help or ? shows this message");
var1.b(" kick <player> removes a player from the server");
var1.b(" ban <player> bans a player from the server");
var1.b(" pardon <player> pardons a banned player so that they can connect again");
var1.b(" ban-ip <ip> bans an IP address from the server");
var1.b(" pardon-ip <ip> pardons a banned IP address so that they can connect again");
var1.b(" op <player> turns a player into an op");
var1.b(" deop <player> removes op status from a player");
var1.b(" tp <player1> <player2> moves one player to the same location as another player");
var1.b(" give <player> <id> [num] gives a player a resource");
var1.b(" tell <player> <message> sends a private message to a player");
var1.b(" stop gracefully stops the server");
var1.b(" save-all forces a server-wide level save");
var1.b(" save-off disables terrain saving (useful for backup scripts)");
var1.b(" save-on re-enables terrain saving");
var1.b(" list lists all currently connected players");
var1.b(" say <message> broadcasts a message to all players");
var1.b(" time <add|set> <amount> adds to or sets the world time (0-24000)");
var1.b(" gamemode <player> <mode> sets player\'s game mode (0 or 1)");
}

private void a(String var1, String var2) {
String var3 = var1 + ": " + var2;
this.b.f.j("\u00a77(" + var3 + ")");
a.info(var3);
}

private int a(String var1, int var2) {
try {
return Integer.parseInt(var1);
} catch (NumberFormatException var4) {
return var2;
}
}

}
@@ -0,0 +1,329 @@
public class OEntityEnderman extends OEntityMob {

private static boolean[] b = new boolean[256];
public boolean a = false;
private int g = 0;
private int h = 0;
// CanaryMod Start
Enderman entity = new Enderman(this);
// CanaryMod End

public OEntityEnderman(OWorld var1) {
super(var1);
this.ab = "/mob/enderman.png";
this.aU = 0.2F;
this.c = 5;
this.b(0.6F, 2.9F);
this.bI = 1.0F;
}

protected void b() {
super.b();
this.bU.a(16, new Byte((byte) 0));
this.bU.a(17, new Byte((byte) 0));
}

public void b(ONBTTagCompound var1) {
super.b(var1);
var1.a("carried", (short) this.x());
var1.a("carriedData", (short) this.y());
}

public void a(ONBTTagCompound var1) {
super.a(var1);
this.b(var1.d("carried"));
this.d(var1.d("carryingData"));
}

protected OEntity o() {
OEntityPlayer var1 = this.bb.a(this, 64.0D);
if (var1 != null) {
if (this.c(var1)) {
if (this.h++ == 5) {
this.h = 0;
return var1;
}
} else {
this.h = 0;
}
}

return null;
}

public float a_(float var1) {
return super.a_(var1);
}

private boolean c(OEntityPlayer var1) {
OItemStack var2 = var1.j.b[3];
if (var2 != null && var2.c == OBlock.bb.bA) {
return false;
} else {
OVec3D var3 = var1.c(1.0F).b();
OVec3D var4 = OVec3D.b(this.bf - var1.bf, this.bp.b + (double) (this.bA / 2.0F) - var1.bg + (double) var1.t(), this.bh - var1.bh);
double var5 = var4.c();
var4 = var4.b();
double var7 = var3.a(var4);
return var7 > 1.0D - 0.025D / var5 ? var1.f(this) : false;
}
}

public void s() {
if (this.an()) {
this.a(ODamageSource.e, 1);
}

this.a = this.d != null;
this.aU = this.d != null ? 4.5F : 0.3F;
int var1;
if (!this.bb.I) {
int var2;
int var3;
int var4;
if (this.x() == 0) {
if (this.bL.nextInt(20) == 0) {
var1 = OMathHelper.b(this.bf - 2.0D + this.bL.nextDouble() * 4.0D);
var2 = OMathHelper.b(this.bg + this.bL.nextDouble() * 3.0D);
var3 = OMathHelper.b(this.bh - 2.0D + this.bL.nextDouble() * 4.0D);
var4 = this.bb.a(var1, var2, var3);
if (b[var4]) {
//CanaryMod onEndermanPickup
if (!(Boolean)etc.getLoader().callHook(PluginLoader.Hook.ENDERMAN_PICKUP, entity, new Block(Block.Type.fromId(var4), this.bb.c(var1, var2, var3)))) {
this.b(this.bb.a(var1, var2, var3));
this.d(this.bb.c(var1, var2, var3));
this.bb.e(var1, var2, var3, 0);
}
}
}
} else if (this.bL.nextInt(2000) == 0) {
var1 = OMathHelper.b(this.bf - 1.0D + this.bL.nextDouble() * 2.0D);
var2 = OMathHelper.b(this.bg + this.bL.nextDouble() * 2.0D);
var3 = OMathHelper.b(this.bh - 1.0D + this.bL.nextDouble() * 2.0D);
var4 = this.bb.a(var1, var2, var3);
int var5 = this.bb.a(var1, var2 - 1, var3);
if (var4 == 0 && var5 > 0 && OBlock.m[var5].b()) {
//CanaryMod onEndermanDrop
if (!(Boolean)etc.getLoader().callHook(PluginLoader.Hook.ENDERMAN_DROP, entity, new Block(Block.Type.fromId(var5), this.bb.c(var1, var2, var3)))) {
this.bb.b(var1, var2, var3, this.x(), this.y());
this.b(0);
}
}
}
}

for (var1 = 0; var1 < 2; ++var1) {
this.bb.a("portal", this.bf + (this.bL.nextDouble() - 0.5D) * (double) this.bz, this.bg + this.bL.nextDouble() * (double) this.bA - 0.25D, this.bh + (this.bL.nextDouble() - 0.5D) * (double) this.bz, (this.bL.nextDouble() - 0.5D) * 2.0D, -this.bL.nextDouble(), (this.bL.nextDouble() - 0.5D) * 2.0D);
}

if (this.bb.d() && !this.bb.I) {
float var6 = this.a_(1.0F);
if (var6 > 0.5F && this.bb.j(OMathHelper.b(this.bf), OMathHelper.b(this.bg), OMathHelper.b(this.bh)) && this.bL.nextFloat() * 30.0F < (var6 - 0.4F) * 2.0F) {
this.bO = 300;
}
}

this.aS = false;
if (this.d != null) {
this.a(this.d, 100.0F, 100.0F);
}

if (!this.bb.I) {
if (this.d != null) {
if (this.d instanceof OEntityPlayer && this.c((OEntityPlayer) this.d)) {
this.aP = this.aQ = 0.0F;
this.aU = 0.0F;
if (this.d.h(this) < 16.0D) {
this.w();
}

this.g = 0;
} else if (this.d.h(this) > 256.0D && this.g++ >= 30 && this.e(this.d)) {
this.g = 0;
}
} else {
this.g = 0;
}
}

super.s();
}

protected boolean w() {
double var1 = this.bf + (this.bL.nextDouble() - 0.5D) * 64.0D;
double var3 = this.bg + (double) (this.bL.nextInt(64) - 32);
double var5 = this.bh + (this.bL.nextDouble() - 0.5D) * 64.0D;
return this.a(var1, var3, var5);
}

protected boolean e(OEntity var1) {
OVec3D var2 = OVec3D.b(this.bf - var1.bf, this.bp.b + (double) (this.bA / 2.0F) - var1.bg + (double) var1.t(), this.bh - var1.bh);
var2 = var2.b();
double var3 = 16.0D;
double var5 = this.bf + (this.bL.nextDouble() - 0.5D) * 8.0D - var2.a * var3;
double var7 = this.bg + (double) (this.bL.nextInt(16) - 8) - var2.b * var3;
double var9 = this.bh + (this.bL.nextDouble() - 0.5D) * 8.0D - var2.c * var3;
return this.a(var5, var7, var9);
}

protected boolean a(double var1, double var3, double var5) {
double var7 = this.bf;
double var9 = this.bg;
double var11 = this.bh;
this.bf = var1;
this.bg = var3;
this.bh = var5;
boolean var13 = false;
int var14 = OMathHelper.b(this.bf);
int var15 = OMathHelper.b(this.bg);
int var16 = OMathHelper.b(this.bh);
int var18;
if (this.bb.g(var14, var15, var16)) {
boolean var17 = false;

while (!var17 && var15 > 0) {
var18 = this.bb.a(var14, var15 - 1, var16);
if (var18 != 0 && OBlock.m[var18].bN.c()) {
var17 = true;
} else {
--this.bg;
--var15;
}
}

if (var17) {
this.c(this.bf, this.bg, this.bh);
if (this.bb.a((OEntity) this, this.bp).size() == 0 && !this.bb.c(this.bp)) {
var13 = true;
}
}
}

if (!var13) {
this.c(var7, var9, var11);
return false;
} else {
short var30 = 128;

for (var18 = 0; var18 < var30; ++var18) {
double var19 = (double) var18 / ((double) var30 - 1.0D);
float var21 = (this.bL.nextFloat() - 0.5F) * 0.2F;
float var22 = (this.bL.nextFloat() - 0.5F) * 0.2F;
float var23 = (this.bL.nextFloat() - 0.5F) * 0.2F;
double var24 = var7 + (this.bf - var7) * var19 + (this.bL.nextDouble() - 0.5D) * (double) this.bz * 2.0D;
double var26 = var9 + (this.bg - var9) * var19 + this.bL.nextDouble() * (double) this.bA;
double var28 = var11 + (this.bh - var11) * var19 + (this.bL.nextDouble() - 0.5D) * (double) this.bz * 2.0D;
this.bb.a("portal", var24, var26, var28, (double) var21, (double) var22, (double) var23);
}

return true;
}
}

protected String h() {
return "mob.zombie";
}

protected String i() {
return "mob.zombiehurt";
}

protected String j() {
return "mob.zombiedeath";
}

protected int k() {
return OItem.bl.bo;
}

protected void a(boolean var1) {
int var2 = this.k();
if (var2 > 0) {
int var3 = this.bL.nextInt(2);

for (int var4 = 0; var4 < var3; ++var4) {
this.b(var2, 1);
}
}

}

public void b(int var1) {
this.bU.b(16, Byte.valueOf((byte) (var1 & 255)));
}

public int x() {
return this.bU.a(16);
}

public void d(int var1) {
this.bU.b(17, Byte.valueOf((byte) (var1 & 255)));
}

public int y() {
return this.bU.a(17);
}

// CanaryMod start
public boolean canHoldItem(int blockID) {
return b[blockID];
}

public void setHoldable(int blockID, boolean holdable) {
b[blockID] = holdable;
}

public boolean getHoldable(int blockID) {
return b[blockID];
}

// CanaryMod end

static {
b[OBlock.u.bA] = true;
b[OBlock.v.bA] = true;
b[OBlock.w.bA] = true;
b[OBlock.x.bA] = true;
b[OBlock.y.bA] = true;
b[OBlock.F.bA] = true;
b[OBlock.G.bA] = true;
b[OBlock.H.bA] = true;
b[OBlock.I.bA] = true;
b[OBlock.J.bA] = true;
b[OBlock.K.bA] = true;
b[OBlock.L.bA] = true;
b[OBlock.M.bA] = true;
b[OBlock.N.bA] = true;
b[OBlock.O.bA] = true;
b[OBlock.P.bA] = true;
b[OBlock.R.bA] = true;
b[OBlock.ac.bA] = true;
b[OBlock.ae.bA] = true;
b[OBlock.af.bA] = true;
b[OBlock.ag.bA] = true;
b[OBlock.ah.bA] = true;
b[OBlock.ai.bA] = true;
b[OBlock.aj.bA] = true;
b[OBlock.am.bA] = true;
b[OBlock.an.bA] = true;
b[OBlock.ao.bA] = true;
b[OBlock.ap.bA] = true;
b[OBlock.ax.bA] = true;
b[OBlock.ay.bA] = true;
b[OBlock.az.bA] = true;
b[OBlock.aO.bA] = true;
b[OBlock.aP.bA] = true;
b[OBlock.aU.bA] = true;
b[OBlock.aW.bA] = true;
b[OBlock.aX.bA] = true;
b[OBlock.bb.bA] = true;
b[OBlock.bc.bA] = true;
b[OBlock.bd.bA] = true;
b[OBlock.be.bA] = true;
b[OBlock.bg.bA] = true;
b[OBlock.bn.bA] = true;
b[OBlock.bo.bA] = true;
b[OBlock.bp.bA] = true;
b[OBlock.bs.bA] = true;
}
}
@@ -0,0 +1,275 @@
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;

public class ORegionFile {

private static final byte[] a = new byte[4096];
private final File b;
private RandomAccessFile c;
private final int[] d = new int[1024];
private final int[] e = new int[1024];
private ArrayList f;
private int g;
private long h = 0L;


public ORegionFile(File var1) {
super();
this.b = var1;
this.b("REGION LOAD " + this.b);
this.g = 0;

try {
if(var1.exists()) {
this.h = var1.lastModified();
}

this.c = new RandomAccessFile(var1, "rw");
int var2;
if(this.c.length() < 4096L) {
for(var2 = 0; var2 < 1024; ++var2) {
this.c.writeInt(0);
}

for(var2 = 0; var2 < 1024; ++var2) {
this.c.writeInt(0);
}

this.g += 8192;
}

if((this.c.length() & 4095L) != 0L) {
for(var2 = 0; (long)var2 < (this.c.length() & 4095L); ++var2) {
this.c.write(0);
}
}

var2 = (int)this.c.length() / 4096;
this.f = new ArrayList(var2);

int var3;
for(var3 = 0; var3 < var2; ++var3) {
this.f.add(Boolean.valueOf(true));
}

this.f.set(0, Boolean.valueOf(false));
this.f.set(1, Boolean.valueOf(false));
this.c.seek(0L);

int var4;
for(var3 = 0; var3 < 1024; ++var3) {
var4 = this.c.readInt();
this.d[var3] = var4;
if(var4 != 0 && (var4 >> 8) + (var4 & 255) <= this.f.size()) {
for(int var5 = 0; var5 < (var4 & 255); ++var5) {
this.f.set((var4 >> 8) + var5, Boolean.valueOf(false));
}
}
}

for(var3 = 0; var3 < 1024; ++var3) {
var4 = this.c.readInt();
this.e[var3] = var4;
}
} catch (IOException var6) {
var6.printStackTrace();
}

}

public synchronized int a() {
int var1 = this.g;
this.g = 0;
return var1;
}

private void a(String var1) {}

private void b(String var1) {
this.a(var1 + "\n");
}

private void a(String var1, int var2, int var3, String var4) {
this.a("REGION " + var1 + " " + this.b.getName() + "[" + var2 + "," + var3 + "] = " + var4);
}

private void a(String var1, int var2, int var3, int var4, String var5) {
this.a("REGION " + var1 + " " + this.b.getName() + "[" + var2 + "," + var3 + "] " + var4 + "B = " + var5);
}

private void b(String var1, int var2, int var3, String var4) {
this.a(var1, var2, var3, var4 + "\n");
}

public synchronized DataInputStream a(int var1, int var2) {
if(this.d(var1, var2)) {
this.b("READ", var1, var2, "out of bounds");
return null;
} else {
try {
int var3 = this.e(var1, var2);
if(var3 == 0) {
return null;
} else {
int var4 = var3 >> 8;
int var5 = var3 & 255;
if(var4 + var5 > this.f.size()) {
this.b("READ", var1, var2, "invalid sector");
return null;
} else {
this.c.seek((long)(var4 * 4096));
int var6 = this.c.readInt();
if(var6 > 4096 * var5) {
this.b("READ", var1, var2, "invalid length: " + var6 + " > 4096 * " + var5);
return null;
} else {
byte var7 = this.c.readByte();
byte[] var8;
DataInputStream var9;
if(var7 == 1) {
var8 = new byte[var6 - 1];
this.c.read(var8);
var9 = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(var8)));
return var9;
} else if(var7 == 2) {
var8 = new byte[var6 - 1];
this.c.read(var8);
var9 = new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(var8)));
return var9;
} else {
this.b("READ", var1, var2, "unknown version " + var7);
return null;
}
}
}
}
} catch (IOException var10) {
this.b("READ", var1, var2, "exception");
return null;
}
}
}

public DataOutputStream b(int var1, int var2) {
return this.d(var1, var2)?null:new DataOutputStream(new DeflaterOutputStream(new ORegionFileChunkBuffer(this, var1, var2)));
}

protected synchronized void a(int var1, int var2, byte[] var3, int var4) {
try {
int var5 = this.e(var1, var2);
int var6 = var5 >> 8;
int var7 = var5 & 255;
int var8 = (var4 + 5) / 4096 + 1;
if(var8 >= 256) {
return;
}

if(var6 != 0 && var7 == var8) {
this.a("SAVE", var1, var2, var4, "rewrite");
this.a(var6, var3, var4);
} else {
int var9;
for(var9 = 0; var9 < var7; ++var9) {
this.f.set(var6 + var9, Boolean.valueOf(true));
}

var9 = this.f.indexOf(Boolean.valueOf(true));
int var10 = 0;
int var11;
if(var9 != -1) {
for(var11 = var9; var11 < this.f.size(); ++var11) {
if(var10 != 0) {
if(((Boolean)this.f.get(var11)).booleanValue()) {
++var10;
} else {
var10 = 0;
}
} else if(((Boolean)this.f.get(var11)).booleanValue()) {
var9 = var11;
var10 = 1;
}

if(var10 >= var8) {
break;
}
}
}

if(var10 >= var8) {
this.a("SAVE", var1, var2, var4, "reuse");
var6 = var9;
this.a(var1, var2, var9 << 8 | var8);

for(var11 = 0; var11 < var8; ++var11) {
this.f.set(var6 + var11, Boolean.valueOf(false));
}

this.a(var6, var3, var4);
} else {
this.a("SAVE", var1, var2, var4, "grow");
this.c.seek(this.c.length());
var6 = this.f.size();

for(var11 = 0; var11 < var8; ++var11) {
this.c.write(a);
this.f.add(Boolean.valueOf(false));
}

this.g += 4096 * var8;
this.a(var6, var3, var4);
this.a(var1, var2, var6 << 8 | var8);
}
}

this.b(var1, var2, (int)(System.currentTimeMillis() / 1000L));
} catch (IOException var12) {
var12.printStackTrace();
}

}

private void a(int var1, byte[] var2, int var3) throws IOException {
this.b(" " + var1);
this.c.seek((long)(var1 * 4096));
this.c.writeInt(var3 + 1);
this.c.writeByte(2);
this.c.write(var2, 0, var3);
}

private boolean d(int var1, int var2) {
return var1 < 0 || var1 >= 32 || var2 < 0 || var2 >= 32;
}

private int e(int var1, int var2) {
return this.d[var1 + var2 * 32];
}

public boolean c(int var1, int var2) {
return this.e(var1, var2) != 0;
}

private void a(int var1, int var2, int var3) throws IOException {
this.d[var1 + var2 * 32] = var3;
this.c.seek((long)((var1 + var2 * 32) * 4));
this.c.writeInt(var3);
}

private void b(int var1, int var2, int var3) throws IOException {
this.e[var1 + var2 * 32] = var3;
this.c.seek((long)(4096 + (var1 + var2 * 32) * 4));
this.c.writeInt(var3);
}

public void b() throws IOException {
this.c.close();
}

}
@@ -0,0 +1,51 @@

public class OTileEntitySign extends OTileEntity {

public String[] a = new String[]{"", "", "", ""};
public int b = -1;
private boolean c = true;


public OTileEntitySign() {
super();
}

public void b(ONBTTagCompound var1) {
super.b(var1);
var1.a("Text1", this.a[0]);
var1.a("Text2", this.a[1]);
var1.a("Text3", this.a[2]);
var1.a("Text4", this.a[3]);
}

public void a(ONBTTagCompound var1) {
this.c = false;
super.a(var1);

for(int var2 = 0; var2 < 4; ++var2) {
this.a[var2] = var1.i("Text" + (var2 + 1));
if(this.a[var2].length() > 15) {
this.a[var2] = this.a[var2].substring(0, 15);
}
}

}

public OPacket l() {
String[] var1 = new String[4];

for(int var2 = 0; var2 < 4; ++var2) {
var1[var2] = this.a[var2];
}

return new OPacket130UpdateSign(this.j, this.k, this.l, var1);
}

public boolean a() {
return this.c;
}

public void a(boolean var1) {
this.c = var1;
}
}