| @@ -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; | ||
| } | ||
| } |