From 3c3a039fa2f7b29abecd4ae1eb902e0396fd7864 Mon Sep 17 00:00:00 2001 From: PeytonPlayz595 <106421860+PeytonPlayz595@users.noreply.github.com> Date: Mon, 18 Dec 2023 10:40:47 -0500 Subject: [PATCH] Upload server src --- minecraft-server.jar | Bin 0 -> 71577 bytes src/META-INF/MANIFEST.MF | 3 + .../mojang/minecraft/AvailableBlockType.java | 56 + src/com/mojang/minecraft/Entity.java | 467 +++++++++ .../mojang/minecraft/UNKNOWN0/UNKNOWN0.java | 5 + src/com/mojang/minecraft/Vector3DCreator.java | 10 + .../mojang/minecraft/level/BlockMap$Slot.java | 86 ++ src/com/mojang/minecraft/level/BlockMap.java | 279 +++++ src/com/mojang/minecraft/level/Level.java | 981 ++++++++++++++++++ src/com/mojang/minecraft/level/LevelIO.java | 83 ++ .../level/LevelObjectInputStream.java | 25 + .../minecraft/level/NextTickListEntry.java | 19 + src/com/mojang/minecraft/level/UNKNOWN0.java | 5 + src/com/mojang/minecraft/level/UNKNOWN1.java | 6 + .../level/generator/LevelGenerator.java | 516 +++++++++ .../level/generator/noise/CombinedNoise.java | 19 + .../level/generator/noise/Noise.java | 7 + .../level/generator/noise/OctaveNoise.java | 34 + .../level/generator/noise/PerlinNoise.java | 68 ++ .../minecraft/level/liquid/LiquidType.java | 16 + .../minecraft/level/tile/Tile$SoundType.java | 35 + src/com/mojang/minecraft/level/tile/a.java | 708 +++++++++++++ src/com/mojang/minecraft/level/tile/b.java | 18 + src/com/mojang/minecraft/level/tile/c.java | 10 + src/com/mojang/minecraft/level/tile/d.java | 10 + src/com/mojang/minecraft/level/tile/e.java | 10 + src/com/mojang/minecraft/level/tile/f.java | 45 + src/com/mojang/minecraft/level/tile/g.java | 14 + src/com/mojang/minecraft/level/tile/h.java | 32 + src/com/mojang/minecraft/level/tile/i.java | 56 + src/com/mojang/minecraft/level/tile/j.java | 14 + src/com/mojang/minecraft/level/tile/k.java | 45 + src/com/mojang/minecraft/level/tile/l.java | 31 + src/com/mojang/minecraft/level/tile/m.java | 40 + src/com/mojang/minecraft/level/tile/n.java | 14 + src/com/mojang/minecraft/level/tile/o.java | 35 + src/com/mojang/minecraft/level/tile/p.java | 14 + src/com/mojang/minecraft/level/tile/q.java | 18 + src/com/mojang/minecraft/level/tile/r.java | 141 +++ src/com/mojang/minecraft/level/tile/s.java | 14 + src/com/mojang/minecraft/level/tile/t.java | 23 + src/com/mojang/minecraft/model/Vector3D.java | 60 ++ src/com/mojang/minecraft/net/PacketType.java | 60 ++ src/com/mojang/minecraft/net/UNKNOWN0.java | 5 + src/com/mojang/minecraft/phys/AABB.java | 308 ++++++ src/com/mojang/minecraft/render/Frustrum.java | 18 + src/com/mojang/minecraft/render/UNKNOWN0.java | 5 + .../mojang/minecraft/server/ConsoleInput.java | 36 + .../minecraft/server/HeartbeatManager.java | 67 ++ .../mojang/minecraft/server/LevelSaver.java | 44 + .../mojang/minecraft/server/LogFormatter.java | 23 + .../mojang/minecraft/server/LogHandler.java | 18 + .../minecraft/server/MinecraftServer.java | 741 +++++++++++++ .../minecraft/server/NetworkManager.java | 385 +++++++ .../minecraft/server/PlayerManager.java | 84 ++ .../minecraft/server/SaltGenerator.java | 26 + src/com/mojang/minecraft/server/UNKNOWN0.java | 15 + src/com/mojang/net/BindTo.java | 22 + src/com/mojang/net/NetworkHandler.java | 153 +++ src/com/mojang/util/MathHelper.java | 27 + src/null | 0 61 files changed, 6109 insertions(+) create mode 100644 minecraft-server.jar create mode 100644 src/META-INF/MANIFEST.MF create mode 100644 src/com/mojang/minecraft/AvailableBlockType.java create mode 100644 src/com/mojang/minecraft/Entity.java create mode 100644 src/com/mojang/minecraft/UNKNOWN0/UNKNOWN0.java create mode 100644 src/com/mojang/minecraft/Vector3DCreator.java create mode 100644 src/com/mojang/minecraft/level/BlockMap$Slot.java create mode 100644 src/com/mojang/minecraft/level/BlockMap.java create mode 100644 src/com/mojang/minecraft/level/Level.java create mode 100644 src/com/mojang/minecraft/level/LevelIO.java create mode 100644 src/com/mojang/minecraft/level/LevelObjectInputStream.java create mode 100644 src/com/mojang/minecraft/level/NextTickListEntry.java create mode 100644 src/com/mojang/minecraft/level/UNKNOWN0.java create mode 100644 src/com/mojang/minecraft/level/UNKNOWN1.java create mode 100644 src/com/mojang/minecraft/level/generator/LevelGenerator.java create mode 100644 src/com/mojang/minecraft/level/generator/noise/CombinedNoise.java create mode 100644 src/com/mojang/minecraft/level/generator/noise/Noise.java create mode 100644 src/com/mojang/minecraft/level/generator/noise/OctaveNoise.java create mode 100644 src/com/mojang/minecraft/level/generator/noise/PerlinNoise.java create mode 100644 src/com/mojang/minecraft/level/liquid/LiquidType.java create mode 100644 src/com/mojang/minecraft/level/tile/Tile$SoundType.java create mode 100644 src/com/mojang/minecraft/level/tile/a.java create mode 100644 src/com/mojang/minecraft/level/tile/b.java create mode 100644 src/com/mojang/minecraft/level/tile/c.java create mode 100644 src/com/mojang/minecraft/level/tile/d.java create mode 100644 src/com/mojang/minecraft/level/tile/e.java create mode 100644 src/com/mojang/minecraft/level/tile/f.java create mode 100644 src/com/mojang/minecraft/level/tile/g.java create mode 100644 src/com/mojang/minecraft/level/tile/h.java create mode 100644 src/com/mojang/minecraft/level/tile/i.java create mode 100644 src/com/mojang/minecraft/level/tile/j.java create mode 100644 src/com/mojang/minecraft/level/tile/k.java create mode 100644 src/com/mojang/minecraft/level/tile/l.java create mode 100644 src/com/mojang/minecraft/level/tile/m.java create mode 100644 src/com/mojang/minecraft/level/tile/n.java create mode 100644 src/com/mojang/minecraft/level/tile/o.java create mode 100644 src/com/mojang/minecraft/level/tile/p.java create mode 100644 src/com/mojang/minecraft/level/tile/q.java create mode 100644 src/com/mojang/minecraft/level/tile/r.java create mode 100644 src/com/mojang/minecraft/level/tile/s.java create mode 100644 src/com/mojang/minecraft/level/tile/t.java create mode 100644 src/com/mojang/minecraft/model/Vector3D.java create mode 100644 src/com/mojang/minecraft/net/PacketType.java create mode 100644 src/com/mojang/minecraft/net/UNKNOWN0.java create mode 100644 src/com/mojang/minecraft/phys/AABB.java create mode 100644 src/com/mojang/minecraft/render/Frustrum.java create mode 100644 src/com/mojang/minecraft/render/UNKNOWN0.java create mode 100644 src/com/mojang/minecraft/server/ConsoleInput.java create mode 100644 src/com/mojang/minecraft/server/HeartbeatManager.java create mode 100644 src/com/mojang/minecraft/server/LevelSaver.java create mode 100644 src/com/mojang/minecraft/server/LogFormatter.java create mode 100644 src/com/mojang/minecraft/server/LogHandler.java create mode 100644 src/com/mojang/minecraft/server/MinecraftServer.java create mode 100644 src/com/mojang/minecraft/server/NetworkManager.java create mode 100644 src/com/mojang/minecraft/server/PlayerManager.java create mode 100644 src/com/mojang/minecraft/server/SaltGenerator.java create mode 100644 src/com/mojang/minecraft/server/UNKNOWN0.java create mode 100644 src/com/mojang/net/BindTo.java create mode 100644 src/com/mojang/net/NetworkHandler.java create mode 100644 src/com/mojang/util/MathHelper.java create mode 100644 src/null diff --git a/minecraft-server.jar b/minecraft-server.jar new file mode 100644 index 0000000000000000000000000000000000000000..c7c28fd303efa5a649798b774e749a81fc76e414 GIT binary patch literal 71577 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 0.0F; ++var2) { + this.setPos(var1, var2, var3); + if(this.level.getCubes(this.bb).size() == 0) { + break; + } + } + + this.xd = this.yd = this.zd = 0.0F; + this.yRot = this.level.rotSpawn; + this.xRot = 0.0F; + } + } + + public void remove() { + this.removed = true; + } + + protected void setSize(float var1, float var2) { + this.bbWidth = var1; + this.bbHeight = var2; + } + + protected void setPos(UNKNOWN0 var1) { + this.setPos(this.x, this.y, this.z); + this.setRot(this.yRot, this.xRot); + } + + protected void setRot(float var1, float var2) { + this.yRot = var1; + this.xRot = var2; + } + + protected void setPos(float var1, float var2, float var3) { + this.x = var1; + this.y = var2; + this.z = var3; + float var4 = this.bbWidth / 2.0F; + float var5 = this.bbHeight / 2.0F; + this.bb = new AABB(var1 - var4, var2 - var5, var3 - var4, var1 + var4, var2 + var5, var3 + var4); + } + + public void turn(float var1, float var2) { + float var3 = this.xRot; + float var4 = this.yRot; + this.yRot = (float)((double)this.yRot + (double)var1 * 0.15D); + this.xRot = (float)((double)this.xRot - (double)var2 * 0.15D); + if(this.xRot < -90.0F) { + this.xRot = -90.0F; + } + + if(this.xRot > 90.0F) { + this.xRot = 90.0F; + } + + this.xRotO += this.xRot - var3; + this.yRotO += this.yRot - var4; + } + + public void interpolateTurn(float var1, float var2) { + this.yRot = (float)((double)this.yRot + (double)var1 * 0.15D); + this.xRot = (float)((double)this.xRot - (double)var2 * 0.15D); + if(this.xRot < -90.0F) { + this.xRot = -90.0F; + } + + if(this.xRot > 90.0F) { + this.xRot = 90.0F; + } + + } + + public void tick() { + this.walkDistO = this.walkDist; + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + this.xRotO = this.xRot; + this.yRotO = this.yRot; + } + + public boolean isFree(float var1, float var2, float var3, float var4) { + AABB var5 = this.bb.grow(var4, var4, var4).cloneMove(var1, var2, var3); + return this.level.getCubes(var5).size() > 0?false:!this.level.containsAnyLiquid(var5); + } + + public boolean isFree(float var1, float var2, float var3) { + AABB var4 = this.bb.cloneMove(var1, var2, var3); + return this.level.getCubes(var4).size() > 0?false:!this.level.containsAnyLiquid(var4); + } + + public void move(float var1, float var2, float var3) { + if(this.noPhysics) { + this.bb.move(var1, var2, var3); + this.x = (this.bb.x0 + this.bb.x1) / 2.0F; + this.y = this.bb.y0 + this.heightOffset - this.ySlideOffset; + this.z = (this.bb.z0 + this.bb.z1) / 2.0F; + } else { + float var4 = this.x; + float var5 = this.z; + float var6 = var1; + float var7 = var2; + float var8 = var3; + AABB var9 = this.bb.copy(); + ArrayList var10 = this.level.getCubes(this.bb.expand(var1, var2, var3)); + + for(int var11 = 0; var11 < var10.size(); ++var11) { + var2 = ((AABB)var10.get(var11)).clipYCollide(this.bb, var2); + } + + this.bb.move(0.0F, var2, 0.0F); + if(!this.slide && var7 != var2) { + var3 = 0.0F; + var2 = 0.0F; + var1 = 0.0F; + } + + boolean var16 = this.onGround || var7 != var2 && var7 < 0.0F; + + int var12; + for(var12 = 0; var12 < var10.size(); ++var12) { + var1 = ((AABB)var10.get(var12)).clipXCollide(this.bb, var1); + } + + this.bb.move(var1, 0.0F, 0.0F); + if(!this.slide && var6 != var1) { + var3 = 0.0F; + var2 = 0.0F; + var1 = 0.0F; + } + + for(var12 = 0; var12 < var10.size(); ++var12) { + var3 = ((AABB)var10.get(var12)).clipZCollide(this.bb, var3); + } + + this.bb.move(0.0F, 0.0F, var3); + if(!this.slide && var8 != var3) { + var3 = 0.0F; + var2 = 0.0F; + var1 = 0.0F; + } + + float var17; + float var18; + if(this.footSize > 0.0F && var16 && this.ySlideOffset < 0.05F && (var6 != var1 || var8 != var3)) { + var18 = var1; + var17 = var2; + float var13 = var3; + var1 = var6; + var2 = this.footSize; + var3 = var8; + AABB var14 = this.bb.copy(); + this.bb = var9.copy(); + var10 = this.level.getCubes(this.bb.expand(var6, var2, var8)); + + int var15; + for(var15 = 0; var15 < var10.size(); ++var15) { + var2 = ((AABB)var10.get(var15)).clipYCollide(this.bb, var2); + } + + this.bb.move(0.0F, var2, 0.0F); + if(!this.slide && var7 != var2) { + var3 = 0.0F; + var2 = 0.0F; + var1 = 0.0F; + } + + for(var15 = 0; var15 < var10.size(); ++var15) { + var1 = ((AABB)var10.get(var15)).clipXCollide(this.bb, var1); + } + + this.bb.move(var1, 0.0F, 0.0F); + if(!this.slide && var6 != var1) { + var3 = 0.0F; + var2 = 0.0F; + var1 = 0.0F; + } + + for(var15 = 0; var15 < var10.size(); ++var15) { + var3 = ((AABB)var10.get(var15)).clipZCollide(this.bb, var3); + } + + this.bb.move(0.0F, 0.0F, var3); + if(!this.slide && var8 != var3) { + var3 = 0.0F; + var2 = 0.0F; + var1 = 0.0F; + } + + if(var18 * var18 + var13 * var13 >= var1 * var1 + var3 * var3) { + var1 = var18; + var2 = var17; + var3 = var13; + this.bb = var14.copy(); + } else { + this.ySlideOffset = (float)((double)this.ySlideOffset + 0.5D); + } + } + + this.horizontalCollision = var6 != var1 || var8 != var3; + this.onGround = var7 != var2 && var7 < 0.0F; + this.collision = this.horizontalCollision || var7 != var2; + if(this.onGround) { + if(this.fallDistance > 0.0F) { + this.causeFallDamage(this.fallDistance); + this.fallDistance = 0.0F; + } + } else if(var2 < 0.0F) { + this.fallDistance -= var2; + } + + if(var6 != var1) { + this.xd = 0.0F; + } + + if(var7 != var2) { + this.yd = 0.0F; + } + + if(var8 != var3) { + this.zd = 0.0F; + } + + this.x = (this.bb.x0 + this.bb.x1) / 2.0F; + this.y = this.bb.y0 + this.heightOffset - this.ySlideOffset; + this.z = (this.bb.z0 + this.bb.z1) / 2.0F; + var18 = this.x - var4; + var17 = this.z - var5; + this.walkDist = (float)((double)this.walkDist + (double)MathHelper.sqrt(var18 * var18 + var17 * var17) * 0.6D); + if(this.makeStepSound) { + int var19 = this.level.getTile((int)this.x, (int)(this.y - 0.2F - this.heightOffset), (int)this.z); + if(this.walkDist > (float)this.nextStep && var19 > 0) { + ++this.nextStep; + Tile$SoundType var20; + if((var20 = a.b[var19].ac) != Tile$SoundType.none) { + this.playSound("step." + var20.name, var20.getVolume() * 0.75F, var20.getPitch()); + } + } + } + + this.ySlideOffset *= 0.4F; + } + } + + protected void causeFallDamage(float var1) {} + + public boolean isInWater() { + return this.level.containsLiquid(this.bb.grow(0.0F, -0.4F, 0.0F), LiquidType.WATER); + } + + public boolean isUnderWater() { + int var1; + return (var1 = this.level.getTile((int)this.x, (int)(this.y + 0.12F), (int)this.z)) != 0?a.b[var1].d().equals(LiquidType.WATER):false; + } + + public boolean isInLava() { + return this.level.containsLiquid(this.bb.grow(0.0F, -0.4F, 0.0F), LiquidType.LAVA); + } + + public void moveRelative(float var1, float var2, float var3) { + float var4; + if((var4 = MathHelper.sqrt(var1 * var1 + var2 * var2)) >= 0.01F) { + if(var4 < 1.0F) { + var4 = 1.0F; + } + + var4 = var3 / var4; + var1 *= var4; + var2 *= var4; + var3 = MathHelper.sin(this.yRot * 3.1415927F / 180.0F); + var4 = MathHelper.cos(this.yRot * 3.1415927F / 180.0F); + this.xd += var1 * var4 - var2 * var3; + this.zd += var2 * var4 + var1 * var3; + } + } + + public boolean isLit() { + int var1 = (int)this.x; + int var2 = (int)this.y; + int var3 = (int)this.z; + return this.level.isLit(var1, var2, var3); + } + + public float getBrightness(float var1) { + int var4 = (int)this.x; + int var2 = (int)(this.y + this.heightOffset / 2.0F - 0.5F); + int var3 = (int)this.z; + return this.level.getBrightness(var4, var2, var3); + } + + public void render(com.mojang.minecraft.render.UNKNOWN0 var1, float var2) {} + + public void setLevel(Level var1) { + this.level = var1; + } + + public void playSound(String var1, float var2, float var3) { + this.level.playSound(var1, this, var2, var3); + } + + public void moveTo(float var1, float var2, float var3, float var4, float var5) { + this.xo = this.x = var1; + this.yo = this.y = var2; + this.zo = this.z = var3; + this.yRot = var4; + this.xRot = var5; + this.setPos(var1, var2, var3); + } + + public float distanceTo(Entity var1) { + float var2 = this.x - var1.x; + float var3 = this.y - var1.y; + float var4 = this.z - var1.z; + return MathHelper.sqrt(var2 * var2 + var3 * var3 + var4 * var4); + } + + public float distanceTo(float var1, float var2, float var3) { + var1 = this.x - var1; + var2 = this.y - var2; + float var4 = this.z - var3; + return MathHelper.sqrt(var1 * var1 + var2 * var2 + var4 * var4); + } + + public float distanceToSqr(Entity var1) { + float var2 = this.x - var1.x; + float var3 = this.y - var1.y; + float var4 = this.z - var1.z; + return var2 * var2 + var3 * var3 + var4 * var4; + } + + public void playerTouch(Entity var1) {} + + public void push(Entity var1) { + float var2 = var1.x - this.x; + float var3 = var1.z - this.z; + float var4; + if((var4 = var2 * var2 + var3 * var3) >= 0.01F) { + var4 = MathHelper.sqrt(var4); + var2 /= var4; + var3 /= var4; + var2 /= var4; + var3 /= var4; + var2 *= 0.05F; + var3 *= 0.05F; + var2 *= 1.0F - this.pushthrough; + var3 *= 1.0F - this.pushthrough; + this.push(-var2, 0.0F, -var3); + var1.push(var2, 0.0F, var3); + } + + } + + protected void push(float var1, float var2, float var3) { + this.xd += var1; + this.yd += var2; + this.zd += var3; + } + + public void hurt(Entity var1, int var2) {} + + public boolean intersects(float var1, float var2, float var3, float var4, float var5, float var6) { + return this.bb.intersects(var1, var2, var3, var4, var5, var6); + } + + public boolean isPickable() { + return false; + } + + public boolean isPushable() { + return false; + } + + public boolean isShootable() { + return false; + } + + public void awardKillScore(Entity var1, int var2) {} + + public boolean shouldRender(Vector3D var1) { + float var2 = this.x - var1.x; + float var3 = this.y - var1.y; + float var4 = this.z - var1.z; + var4 = var2 * var2 + var3 * var3 + var4 * var4; + return this.shouldRenderAtSqrDistance(var4); + } + + public boolean shouldRenderAtSqrDistance(float var1) { + float var2 = this.bb.getSize() * 64.0F; + return var1 < var2 * var2; + } + + public int getTexture() { + return this.textureId; + } + + public boolean isCreativeModeAllowed() { + return false; + } + + public void renderHover(com.mojang.minecraft.render.UNKNOWN0 var1, float var2) {} +} diff --git a/src/com/mojang/minecraft/UNKNOWN0/UNKNOWN0.java b/src/com/mojang/minecraft/UNKNOWN0/UNKNOWN0.java new file mode 100644 index 0000000..29b1136 --- /dev/null +++ b/src/com/mojang/minecraft/UNKNOWN0/UNKNOWN0.java @@ -0,0 +1,5 @@ +package com.mojang.minecraft.UNKNOWN0; + + +public interface UNKNOWN0 { +} diff --git a/src/com/mojang/minecraft/Vector3DCreator.java b/src/com/mojang/minecraft/Vector3DCreator.java new file mode 100644 index 0000000..c1f2836 --- /dev/null +++ b/src/com/mojang/minecraft/Vector3DCreator.java @@ -0,0 +1,10 @@ +package com.mojang.minecraft; + +import com.mojang.minecraft.model.Vector3D; + +public final class Vector3DCreator { + + public Vector3DCreator(int var1, int var2, int var3, int var4, Vector3D var5) { + new Vector3D(var5.x, var5.y, var5.z); + } +} diff --git a/src/com/mojang/minecraft/level/BlockMap$Slot.java b/src/com/mojang/minecraft/level/BlockMap$Slot.java new file mode 100644 index 0000000..3484f13 --- /dev/null +++ b/src/com/mojang/minecraft/level/BlockMap$Slot.java @@ -0,0 +1,86 @@ +package com.mojang.minecraft.level; + +import com.mojang.minecraft.Entity; +import com.mojang.minecraft.level.BlockMap; +import com.mojang.minecraft.level.UNKNOWN1; +import java.io.Serializable; + +class BlockMap$Slot implements Serializable { + + public static final long serialVersionUID = 0L; + private int xSlot; + private int ySlot; + private int zSlot; + // $FF: synthetic field + final BlockMap this$0; + + + private BlockMap$Slot(BlockMap var1) { + this.this$0 = var1; + } + + public BlockMap$Slot init(float var1, float var2, float var3) { + this.xSlot = (int)(var1 / 16.0F); + this.ySlot = (int)(var2 / 16.0F); + this.zSlot = (int)(var3 / 16.0F); + if(this.xSlot < 0) { + this.xSlot = 0; + } + + if(this.ySlot < 0) { + this.ySlot = 0; + } + + if(this.zSlot < 0) { + this.zSlot = 0; + } + + if(this.xSlot >= BlockMap.access$000(this.this$0)) { + this.xSlot = BlockMap.access$000(this.this$0) - 1; + } + + if(this.ySlot >= BlockMap.access$100(this.this$0)) { + this.ySlot = BlockMap.access$100(this.this$0) - 1; + } + + if(this.zSlot >= BlockMap.access$200(this.this$0)) { + this.zSlot = BlockMap.access$200(this.this$0) - 1; + } + + return this; + } + + public void add(Entity var1) { + if(this.xSlot >= 0 && this.ySlot >= 0 && this.zSlot >= 0) { + this.this$0.entityGrid[(this.zSlot * BlockMap.access$100(this.this$0) + this.ySlot) * BlockMap.access$000(this.this$0) + this.xSlot].add(var1); + } + + } + + public void remove(Entity var1) { + if(this.xSlot >= 0 && this.ySlot >= 0 && this.zSlot >= 0) { + this.this$0.entityGrid[(this.zSlot * BlockMap.access$100(this.this$0) + this.ySlot) * BlockMap.access$000(this.this$0) + this.xSlot].remove(var1); + } + + } + + // $FF: synthetic method + BlockMap$Slot(BlockMap var1, UNKNOWN1 var2) { + this(var1); + } + + // $FF: synthetic method + static int access$400(BlockMap$Slot var0) { + return var0.xSlot; + } + + // $FF: synthetic method + static int access$500(BlockMap$Slot var0) { + return var0.ySlot; + } + + // $FF: synthetic method + static int access$600(BlockMap$Slot var0) { + return var0.zSlot; + } +} diff --git a/src/com/mojang/minecraft/level/BlockMap.java b/src/com/mojang/minecraft/level/BlockMap.java new file mode 100644 index 0000000..79c1c96 --- /dev/null +++ b/src/com/mojang/minecraft/level/BlockMap.java @@ -0,0 +1,279 @@ +package com.mojang.minecraft.level; + +import com.mojang.minecraft.Entity; +import com.mojang.minecraft.level.BlockMap$Slot; +import com.mojang.minecraft.level.UNKNOWN1; +import com.mojang.minecraft.model.Vector3D; +import com.mojang.minecraft.phys.AABB; +import com.mojang.minecraft.render.Frustrum; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class BlockMap implements Serializable { + + public static final long serialVersionUID = 0L; + private int width; + private int depth; + private int height; + private BlockMap$Slot slot = new BlockMap$Slot(this, (UNKNOWN1)null); + private BlockMap$Slot slot2 = new BlockMap$Slot(this, (UNKNOWN1)null); + public List[] entityGrid; + public List all = new ArrayList(); + private List tmp = new ArrayList(); + + + public BlockMap(int var1, int var2, int var3) { + this.width = var1 / 16; + this.depth = var2 / 16; + this.height = var3 / 16; + if(this.width == 0) { + this.width = 1; + } + + if(this.depth == 0) { + this.depth = 1; + } + + if(this.height == 0) { + this.height = 1; + } + + this.entityGrid = new ArrayList[this.width * this.depth * this.height]; + + for(var1 = 0; var1 < this.width; ++var1) { + for(var2 = 0; var2 < this.depth; ++var2) { + for(var3 = 0; var3 < this.height; ++var3) { + this.entityGrid[(var3 * this.depth + var2) * this.width + var1] = new ArrayList(); + } + } + } + + } + + public void insert(Entity var1) { + this.all.add(var1); + this.slot.init(var1.x, var1.y, var1.z).add(var1); + var1.xOld = var1.x; + var1.yOld = var1.y; + var1.zOld = var1.z; + var1.blockMap = this; + } + + public void remove(Entity var1) { + this.slot.init(var1.xOld, var1.yOld, var1.zOld).remove(var1); + this.all.remove(var1); + } + + public void moved(Entity var1) { + BlockMap$Slot var2 = this.slot.init(var1.xOld, var1.yOld, var1.zOld); + BlockMap$Slot var3 = this.slot2.init(var1.x, var1.y, var1.z); + if(!var2.equals(var3)) { + var2.remove(var1); + var3.add(var1); + var1.xOld = var1.x; + var1.yOld = var1.y; + var1.zOld = var1.z; + } + } + + public List getEntities(Entity var1, float var2, float var3, float var4, float var5, float var6, float var7) { + this.tmp.clear(); + return this.getEntities(var1, var2, var3, var4, var5, var6, var7, this.tmp); + } + + public List getEntities(Entity var1, float var2, float var3, float var4, float var5, float var6, float var7, List var8) { + BlockMap$Slot var9 = this.slot.init(var2, var3, var4); + BlockMap$Slot var10 = this.slot2.init(var5, var6, var7); + + for(int var11 = BlockMap$Slot.access$400(var9) - 1; var11 <= BlockMap$Slot.access$400(var10) + 1; ++var11) { + for(int var12 = BlockMap$Slot.access$500(var9) - 1; var12 <= BlockMap$Slot.access$500(var10) + 1; ++var12) { + for(int var13 = BlockMap$Slot.access$600(var9) - 1; var13 <= BlockMap$Slot.access$600(var10) + 1; ++var13) { + if(var11 >= 0 && var12 >= 0 && var13 >= 0 && var11 < this.width && var12 < this.depth && var13 < this.height) { + List var14 = this.entityGrid[(var13 * this.depth + var12) * this.width + var11]; + + for(int var15 = 0; var15 < var14.size(); ++var15) { + Entity var16; + if((var16 = (Entity)var14.get(var15)) != var1 && var16.intersects(var2, var3, var4, var5, var6, var7)) { + var8.add(var16); + } + } + } + } + } + } + + return var8; + } + + public void removeAllNonCreativeModeEntities() { + for(int var1 = 0; var1 < this.width; ++var1) { + for(int var2 = 0; var2 < this.depth; ++var2) { + for(int var3 = 0; var3 < this.height; ++var3) { + List var4 = this.entityGrid[(var3 * this.depth + var2) * this.width + var1]; + + for(int var5 = 0; var5 < var4.size(); ++var5) { + if(!((Entity)var4.get(var5)).isCreativeModeAllowed()) { + var4.remove(var5--); + } + } + } + } + } + + } + + public void clear() { + for(int var1 = 0; var1 < this.width; ++var1) { + for(int var2 = 0; var2 < this.depth; ++var2) { + for(int var3 = 0; var3 < this.height; ++var3) { + this.entityGrid[(var3 * this.depth + var2) * this.width + var1].clear(); + } + } + } + + } + + public List getEntities(Entity var1, AABB var2) { + this.tmp.clear(); + return this.getEntities(var1, var2.x0, var2.y0, var2.z0, var2.x1, var2.y1, var2.z1, this.tmp); + } + + public List getEntities(Entity var1, AABB var2, List var3) { + return this.getEntities(var1, var2.x0, var2.y0, var2.z0, var2.x1, var2.y1, var2.z1, var3); + } + + public void tickAll() { + for(int var1 = 0; var1 < this.all.size(); ++var1) { + Entity var2; + (var2 = (Entity)this.all.get(var1)).tick(); + if(var2.removed) { + this.all.remove(var1--); + this.slot.init(var2.xOld, var2.yOld, var2.zOld).remove(var2); + } else { + int var3 = (int)(var2.xOld / 16.0F); + int var4 = (int)(var2.yOld / 16.0F); + int var5 = (int)(var2.zOld / 16.0F); + int var6 = (int)(var2.x / 16.0F); + int var7 = (int)(var2.y / 16.0F); + int var8 = (int)(var2.z / 16.0F); + if(var3 != var6 || var4 != var7 || var5 != var8) { + this.moved(var2); + } + } + } + + } + + public void render(Vector3D var1, Frustrum var2, com.mojang.minecraft.render.UNKNOWN0 var3, float var4) { + for(int var5 = 0; var5 < this.width; ++var5) { + float var6 = (float)((var5 << 4) - 2); + float var7 = (float)((var5 + 1 << 4) + 2); + + for(int var8 = 0; var8 < this.depth; ++var8) { + float var9 = (float)((var8 << 4) - 2); + float var10 = (float)((var8 + 1 << 4) + 2); + + for(int var11 = 0; var11 < this.height; ++var11) { + List var12; + if((var12 = this.entityGrid[(var11 * this.depth + var8) * this.width + var5]).size() != 0) { + float var13 = (float)((var11 << 4) - 2); + float var14 = (float)((var11 + 1 << 4) + 2); + if(var2.isBoxInFrustrum(var6, var9, var13, var7, var10, var14)) { + float var16 = var14; + float var17 = var10; + float var15 = var7; + var14 = var13; + var13 = var9; + float var18 = var6; + Frustrum var19 = var2; + int var20 = 0; + + boolean var10000; + while(true) { + if(var20 >= 6) { + var10000 = true; + break; + } + + if(var19.frustrum[var20][0] * var18 + var19.frustrum[var20][1] * var13 + var19.frustrum[var20][2] * var14 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var15 + var19.frustrum[var20][1] * var13 + var19.frustrum[var20][2] * var14 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var18 + var19.frustrum[var20][1] * var17 + var19.frustrum[var20][2] * var14 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var15 + var19.frustrum[var20][1] * var17 + var19.frustrum[var20][2] * var14 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var18 + var19.frustrum[var20][1] * var13 + var19.frustrum[var20][2] * var16 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var15 + var19.frustrum[var20][1] * var13 + var19.frustrum[var20][2] * var16 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var18 + var19.frustrum[var20][1] * var17 + var19.frustrum[var20][2] * var16 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + if(var19.frustrum[var20][0] * var15 + var19.frustrum[var20][1] * var17 + var19.frustrum[var20][2] * var16 + var19.frustrum[var20][3] <= 0.0F) { + var10000 = false; + break; + } + + ++var20; + } + + boolean var21 = var10000; + + for(int var23 = 0; var23 < var12.size(); ++var23) { + Entity var22; + if((var22 = (Entity)var12.get(var23)).shouldRender(var1)) { + if(!var21) { + AABB var24 = var22.bb; + if(!var2.isBoxInFrustrum(var24.x0, var24.y0, var24.z0, var24.x1, var24.y1, var24.z1)) { + continue; + } + } + + var22.render(var3, var4); + } + } + } + } + } + } + } + + } + + // $FF: synthetic method + static int access$000(BlockMap var0) { + return var0.width; + } + + // $FF: synthetic method + static int access$100(BlockMap var0) { + return var0.depth; + } + + // $FF: synthetic method + static int access$200(BlockMap var0) { + return var0.height; + } +} diff --git a/src/com/mojang/minecraft/level/Level.java b/src/com/mojang/minecraft/level/Level.java new file mode 100644 index 0000000..08b4aa6 --- /dev/null +++ b/src/com/mojang/minecraft/level/Level.java @@ -0,0 +1,981 @@ +package com.mojang.minecraft.level; + +import com.mojang.minecraft.Entity; +import com.mojang.minecraft.Vector3DCreator; +import com.mojang.minecraft.level.BlockMap; +import com.mojang.minecraft.level.NextTickListEntry; +import com.mojang.minecraft.level.UNKNOWN0; +import com.mojang.minecraft.level.liquid.LiquidType; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.model.Vector3D; +import com.mojang.minecraft.phys.AABB; +import com.mojang.minecraft.server.MinecraftServer; +import com.mojang.util.MathHelper; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +public class Level implements Serializable { + + public static final long serialVersionUID = 0L; + public int width; + public int height; + public int depth; + public byte[] blocks; + public String name; + public String creator; + public long createTime; + public int xSpawn; + public int ySpawn; + public int zSpawn; + public float rotSpawn; + private transient ArrayList listeners = new ArrayList(); + private transient int[] blockers; + transient Random random = new Random(); + private transient int randomID; + private transient ArrayList tickList; + public BlockMap blockMap; + private boolean networkMode; + public transient UNKNOWN0 rendererContext; + public boolean creativeMode; + public int waterLevel; + public int skyColor; + public int fogColor; + public int cloudColor; + int unprocessed; + private int tickCount; + public Entity player; + public transient com.mojang.minecraft.UNKNOWN0.UNKNOWN0 particleEngine; + public transient Object font; + public boolean growTrees; + + + public Level() { + this.randomID = this.random.nextInt(); + this.tickList = new ArrayList(); + this.networkMode = false; + this.unprocessed = 0; + this.tickCount = 0; + this.growTrees = false; + } + + public void initTransient() { + if(this.blocks == null) { + throw new RuntimeException("The level is corrupt!"); + } else { + this.listeners = new ArrayList(); + this.blockers = new int[this.width * this.height]; + Arrays.fill(this.blockers, this.depth); + this.calcLightDepths(0, 0, this.width, this.height); + this.random = new Random(); + this.randomID = this.random.nextInt(); + this.tickList = new ArrayList(); + if(this.waterLevel == 0) { + this.waterLevel = this.depth / 2; + } + + if(this.skyColor == 0) { + this.skyColor = 10079487; + } + + if(this.fogColor == 0) { + this.fogColor = 16777215; + } + + if(this.cloudColor == 0) { + this.cloudColor = 16777215; + } + + if(this.xSpawn == 0 && this.ySpawn == 0 && this.zSpawn == 0) { + this.findSpawn(); + } + + if(this.blockMap == null) { + this.blockMap = new BlockMap(this.width, this.depth, this.height); + } + + } + } + + public void setData(int var1, int var2, int var3, byte[] var4) { + this.width = var1; + this.height = var3; + this.depth = var2; + this.blocks = var4; + this.blockers = new int[var1 * var3]; + Arrays.fill(this.blockers, this.depth); + this.calcLightDepths(0, 0, var1, var3); + + for(var1 = 0; var1 < this.listeners.size(); ++var1) { + this.listeners.get(var1); + } + + this.tickList.clear(); + this.findSpawn(); + this.initTransient(); + System.gc(); + } + + public void findSpawn() { + Random var1 = new Random(); + int var2 = 0; + + int var3; + int var4; + int var5; + do { + ++var2; + var3 = var1.nextInt(this.width / 2) + this.width / 4; + var4 = var1.nextInt(this.height / 2) + this.height / 4; + var5 = this.getHighestTile(var3, var4) + 1; + if(var2 == 10000) { + this.xSpawn = var3; + this.ySpawn = -100; + this.zSpawn = var4; + return; + } + } while((float)var5 <= this.getWaterLevel()); + + this.xSpawn = var3; + this.ySpawn = var5; + this.zSpawn = var4; + } + + public void calcLightDepths(int var1, int var2, int var3, int var4) { + for(int var5 = var1; var5 < var1 + var3; ++var5) { + for(int var6 = var2; var6 < var2 + var4; ++var6) { + int var7 = this.blockers[var5 + var6 * this.width]; + + int var8; + for(var8 = this.depth - 1; var8 > 0 && !this.isLightBlocker(var5, var8, var6); --var8) { + ; + } + + this.blockers[var5 + var6 * this.width] = var8; + if(var7 != var8) { + for(var7 = 0; var7 < this.listeners.size(); ++var7) { + this.listeners.get(var7); + } + } + } + } + + } + + public void addListener$74652038(MinecraftServer var1) { + this.listeners.add(var1); + } + + public void finalize() {} + + public void removeListener$74652038(MinecraftServer var1) { + this.listeners.remove(var1); + } + + public boolean isLightBlocker(int var1, int var2, int var3) { + a var4; + return (var4 = a.b[this.getTile(var1, var2, var3)]) == null?false:var4.b(); + } + + public ArrayList getCubes(AABB var1) { + ArrayList var2 = new ArrayList(); + int var3 = (int)var1.x0; + int var4 = (int)var1.x1 + 1; + int var5 = (int)var1.y0; + int var6 = (int)var1.y1 + 1; + int var7 = (int)var1.z0; + int var8 = (int)var1.z1 + 1; + if(var1.x0 < 0.0F) { + --var3; + } + + if(var1.y0 < 0.0F) { + --var5; + } + + if(var1.z0 < 0.0F) { + --var7; + } + + for(var3 = var3; var3 < var4; ++var3) { + for(int var9 = var5; var9 < var6; ++var9) { + for(int var10 = var7; var10 < var8; ++var10) { + AABB var11; + if(var3 >= 0 && var9 >= 0 && var10 >= 0 && var3 < this.width && var9 < this.depth && var10 < this.height) { + a var12; + if((var12 = a.b[this.getTile(var3, var9, var10)]) != null && (var11 = var12.a(var3, var9, var10)) != null && var1.intersectsInner(var11)) { + var2.add(var11); + } + } else if((var3 < 0 || var9 < 0 || var10 < 0 || var3 >= this.width || var10 >= this.height) && (var11 = a.k.a(var3, var9, var10)) != null && var1.intersectsInner(var11)) { + var2.add(var11); + } + } + } + } + + return var2; + } + + public void swap(int var1, int var2, int var3, int var4, int var5, int var6) { + if(!this.networkMode) { + int var7 = this.getTile(var1, var2, var3); + int var8 = this.getTile(var4, var5, var6); + this.setTileNoNeighborChange(var1, var2, var3, var8); + this.setTileNoNeighborChange(var4, var5, var6, var7); + this.updateNeighborsAt(var1, var2, var3, var8); + this.updateNeighborsAt(var4, var5, var6, var7); + } + } + + public boolean setTileNoNeighborChange(int var1, int var2, int var3, int var4) { + return this.networkMode?false:this.netSetTileNoNeighborChange(var1, var2, var3, var4); + } + + public boolean netSetTileNoNeighborChange(int var1, int var2, int var3, int var4) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.depth && var3 < this.height) { + if(var4 == this.blocks[(var2 * this.height + var3) * this.width + var1]) { + return false; + } else { + if(var4 == 0 && (var1 == 0 || var3 == 0 || var1 == this.width - 1 || var3 == this.height - 1) && (float)var2 >= this.getGroundLevel() && (float)var2 < this.getWaterLevel()) { + var4 = a.l.ab; + } + + byte var5 = this.blocks[(var2 * this.height + var3) * this.width + var1]; + this.blocks[(var2 * this.height + var3) * this.width + var1] = (byte)var4; + if(var5 != 0) { + a.b[var5].c(this, var1, var2, var3); + } + + if(var4 != 0) { + a.b[var4].b(this, var1, var2, var3); + } + + this.calcLightDepths(var1, var3, 1, 1); + + for(var4 = 0; var4 < this.listeners.size(); ++var4) { + ((MinecraftServer)this.listeners.get(var4)).a(var1, var2, var3); + } + + return true; + } + } else { + return false; + } + } + + public boolean setTile(int var1, int var2, int var3, int var4) { + if(this.networkMode) { + return false; + } else if(this.setTileNoNeighborChange(var1, var2, var3, var4)) { + this.updateNeighborsAt(var1, var2, var3, var4); + return true; + } else { + return false; + } + } + + public boolean netSetTile(int var1, int var2, int var3, int var4) { + if(this.netSetTileNoNeighborChange(var1, var2, var3, var4)) { + this.updateNeighborsAt(var1, var2, var3, var4); + return true; + } else { + return false; + } + } + + public void updateNeighborsAt(int var1, int var2, int var3, int var4) { + this.a(var1 - 1, var2, var3, var4); + this.a(var1 + 1, var2, var3, var4); + this.a(var1, var2 - 1, var3, var4); + this.a(var1, var2 + 1, var3, var4); + this.a(var1, var2, var3 - 1, var4); + this.a(var1, var2, var3 + 1, var4); + } + + public boolean setTileNoUpdate(int var1, int var2, int var3, int var4) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.depth && var3 < this.height) { + if(var4 == this.blocks[(var2 * this.height + var3) * this.width + var1]) { + return false; + } else { + this.blocks[(var2 * this.height + var3) * this.width + var1] = (byte)var4; + return true; + } + } else { + return false; + } + } + + private void a(int var1, int var2, int var3, int var4) { + if(var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.depth && var3 < this.height) { + a var5; + if((var5 = a.b[this.blocks[(var2 * this.height + var3) * this.width + var1]]) != null) { + var5.a(this, var1, var2, var3, var4); + } + + } + } + + public boolean isLit(int var1, int var2, int var3) { + return var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.depth && var3 < this.height?var2 >= this.blockers[var1 + var3 * this.width]:true; + } + + public int getTile(int var1, int var2, int var3) { + return var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.depth && var3 < this.height?this.blocks[(var2 * this.height + var3) * this.width + var1] & 255:0; + } + + public boolean isSolidTile(int var1, int var2, int var3) { + a var4; + return (var4 = a.b[this.getTile(var1, var2, var3)]) == null?false:var4.c(); + } + + public void tickEntities() { + this.blockMap.tickAll(); + } + + public void tick() { + ++this.tickCount; + int var1 = 1; + + int var2; + for(var2 = 1; 1 << var1 < this.width; ++var1) { + ; + } + + while(1 << var2 < this.height) { + ++var2; + } + + int var3 = this.height - 1; + int var4 = this.width - 1; + int var5 = this.depth - 1; + int var6; + int var7; + if(this.tickCount % 5 == 0) { + var6 = this.tickList.size(); + + for(var7 = 0; var7 < var6; ++var7) { + NextTickListEntry var8; + if((var8 = (NextTickListEntry)this.tickList.remove(0)).ticks > 0) { + --var8.ticks; + this.tickList.add(var8); + } else { + byte var9; + if(this.a(var8.x, var8.y, var8.z) && (var9 = this.blocks[(var8.y * this.height + var8.z) * this.width + var8.x]) == var8.blocks && var9 > 0) { + a.b[var9].a(this, var8.x, var8.y, var8.z, this.random); + } + } + } + } + + this.unprocessed += this.width * this.height * this.depth; + var6 = this.unprocessed / 200; + this.unprocessed -= var6 * 200; + + for(var7 = 0; var7 < var6; ++var7) { + this.randomID = this.randomID * 3 + 1013904223; + int var12; + int var13 = (var12 = this.randomID >> 2) & var4; + int var10 = var12 >> var1 & var3; + var12 = var12 >> var1 + var2 & var5; + byte var11 = this.blocks[(var12 * this.height + var10) * this.width + var13]; + if(a.c[var11]) { + a.b[var11].a(this, var13, var12, var10, this.random); + } + } + + } + + public int countInstanceOf(Class var1) { + int var2 = 0; + + for(int var3 = 0; var3 < this.blockMap.all.size(); ++var3) { + Entity var4 = (Entity)this.blockMap.all.get(var3); + if(var1.isAssignableFrom(var4.getClass())) { + ++var2; + } + } + + return var2; + } + + private boolean a(int var1, int var2, int var3) { + return var1 >= 0 && var2 >= 0 && var3 >= 0 && var1 < this.width && var2 < this.depth && var3 < this.height; + } + + public float getGroundLevel() { + return this.getWaterLevel() - 2.0F; + } + + public float getWaterLevel() { + return (float)this.waterLevel; + } + + public boolean containsAnyLiquid(AABB var1) { + int var2 = (int)var1.x0; + int var3 = (int)var1.x1 + 1; + int var4 = (int)var1.y0; + int var5 = (int)var1.y1 + 1; + int var6 = (int)var1.z0; + int var7 = (int)var1.z1 + 1; + if(var1.x0 < 0.0F) { + --var2; + } + + if(var1.y0 < 0.0F) { + --var4; + } + + if(var1.z0 < 0.0F) { + --var6; + } + + if(var2 < 0) { + var2 = 0; + } + + if(var4 < 0) { + var4 = 0; + } + + if(var6 < 0) { + var6 = 0; + } + + if(var3 > this.width) { + var3 = this.width; + } + + if(var5 > this.depth) { + var5 = this.depth; + } + + if(var7 > this.height) { + var7 = this.height; + } + + for(int var10 = var2; var10 < var3; ++var10) { + for(var2 = var4; var2 < var5; ++var2) { + for(int var8 = var6; var8 < var7; ++var8) { + a var9; + if((var9 = a.b[this.getTile(var10, var2, var8)]) != null && var9.d() != LiquidType.NOT_LIQUID) { + return true; + } + } + } + } + + return false; + } + + public boolean containsLiquid(AABB var1, LiquidType var2) { + int var3 = (int)var1.x0; + int var4 = (int)var1.x1 + 1; + int var5 = (int)var1.y0; + int var6 = (int)var1.y1 + 1; + int var7 = (int)var1.z0; + int var8 = (int)var1.z1 + 1; + if(var1.x0 < 0.0F) { + --var3; + } + + if(var1.y0 < 0.0F) { + --var5; + } + + if(var1.z0 < 0.0F) { + --var7; + } + + if(var3 < 0) { + var3 = 0; + } + + if(var5 < 0) { + var5 = 0; + } + + if(var7 < 0) { + var7 = 0; + } + + if(var4 > this.width) { + var4 = this.width; + } + + if(var6 > this.depth) { + var6 = this.depth; + } + + if(var8 > this.height) { + var8 = this.height; + } + + for(int var11 = var3; var11 < var4; ++var11) { + for(var3 = var5; var3 < var6; ++var3) { + for(int var9 = var7; var9 < var8; ++var9) { + a var10; + if((var10 = a.b[this.getTile(var11, var3, var9)]) != null && var10.d() == var2) { + return true; + } + } + } + } + + return false; + } + + public void addToTickNextTick(int var1, int var2, int var3, int var4) { + if(!this.networkMode) { + NextTickListEntry var5 = new NextTickListEntry(var1, var2, var3, var4); + if(var4 > 0) { + var3 = a.b[var4].e(); + var5.ticks = var3; + } + + this.tickList.add(var5); + } + } + + public boolean isFree(AABB var1) { + return this.blockMap.getEntities((Entity)null, var1).size() == 0; + } + + public List findEntities(Entity var1, AABB var2) { + return this.blockMap.getEntities(var1, var2); + } + + public boolean isSolid(float var1, float var2, float var3, float var4) { + return this.a(var1 - var4, var2 - var4, var3 - var4)?true:(this.a(var1 - var4, var2 - var4, var3 + var4)?true:(this.a(var1 - var4, var2 + var4, var3 - var4)?true:(this.a(var1 - var4, var2 + var4, var3 + var4)?true:(this.a(var1 + var4, var2 - var4, var3 - var4)?true:(this.a(var1 + var4, var2 - var4, var3 + var4)?true:(this.a(var1 + var4, var2 + var4, var3 - var4)?true:this.a(var1 + var4, var2 + var4, var3 + var4))))))); + } + + private boolean a(float var1, float var2, float var3) { + int var4; + return (var4 = this.getTile((int)var1, (int)var2, (int)var3)) > 0 && a.b[var4].c(); + } + + public int getHighestTile(int var1, int var2) { + int var3; + for(var3 = this.depth; (this.getTile(var1, var3 - 1, var2) == 0 || a.b[this.getTile(var1, var3 - 1, var2)].d() != LiquidType.NOT_LIQUID) && var3 > 0; --var3) { + ; + } + + return var3; + } + + public void setSpawnPos(int var1, int var2, int var3, float var4) { + this.xSpawn = var1; + this.ySpawn = var2; + this.zSpawn = var3; + this.rotSpawn = var4; + } + + public float getBrightness(int var1, int var2, int var3) { + return this.isLit(var1, var2, var3)?1.0F:0.6F; + } + + public float getCaveness(float var1, float var2, float var3, float var4) { + int var5 = (int)var1; + int var14 = (int)var2; + int var6 = (int)var3; + float var7 = 0.0F; + float var8 = 0.0F; + + for(int var9 = var5 - 6; var9 <= var5 + 6; ++var9) { + for(int var10 = var6 - 6; var10 <= var6 + 6; ++var10) { + if(this.a(var9, var14, var10) && !this.isSolidTile(var9, var14, var10)) { + float var11 = (float)var9 + 0.5F - var1; + + float var12; + float var13; + for(var13 = (float)(Math.atan2((double)(var12 = (float)var10 + 0.5F - var3), (double)var11) - (double)(var4 * 3.1415927F / 180.0F) + 1.5707963705062866D); var13 < -3.1415927F; var13 += 6.2831855F) { + ; + } + + while(var13 >= 3.1415927F) { + var13 -= 6.2831855F; + } + + if(var13 < 0.0F) { + var13 = -var13; + } + + var11 = MathHelper.sqrt(var11 * var11 + 4.0F + var12 * var12); + var11 = 1.0F / var11; + if(var13 > 1.0F) { + var11 = 0.0F; + } + + if(var11 < 0.0F) { + var11 = 0.0F; + } + + var8 += var11; + if(this.isLit(var9, var14, var10)) { + var7 += var11; + } + } + } + } + + if(var8 == 0.0F) { + return 0.0F; + } else { + return var7 / var8; + } + } + + public float getCaveness(Entity var1) { + float var2 = MathHelper.cos(-var1.yRot * 0.017453292F + 3.1415927F); + float var3 = MathHelper.sin(-var1.yRot * 0.017453292F + 3.1415927F); + float var4 = MathHelper.cos(-var1.xRot * 0.017453292F); + float var5 = MathHelper.sin(-var1.xRot * 0.017453292F); + float var6 = var1.x; + float var7 = var1.y; + float var21 = var1.z; + float var8 = 1.6F; + float var9 = 0.0F; + float var10 = 0.0F; + + for(int var11 = 0; var11 <= 200; ++var11) { + float var12 = ((float)var11 / (float)200 - 0.5F) * 2.0F; + int var13 = 0; + + while(var13 <= 200) { + float var14 = ((float)var13 / (float)200 - 0.5F) * var8; + float var16 = var4 * var14 + var5; + var14 = var4 - var5 * var14; + float var17 = var2 * var12 + var3 * var14; + var16 = var16; + var14 = var2 * var14 - var3 * var12; + int var15 = 0; + + while(true) { + if(var15 < 10) { + float var18 = var6 + var17 * (float)var15 * 0.8F; + float var19 = var7 + var16 * (float)var15 * 0.8F; + float var20 = var21 + var14 * (float)var15 * 0.8F; + if(!this.a(var18, var19, var20)) { + ++var9; + if(this.isLit((int)var18, (int)var19, (int)var20)) { + ++var10; + } + + ++var15; + continue; + } + } + + ++var13; + break; + } + } + } + + if(var9 == 0.0F) { + return 0.0F; + } else { + float var22; + if((var22 = var10 / var9 / 0.1F) > 1.0F) { + var22 = 1.0F; + } + + var22 = 1.0F - var22; + return 1.0F - var22 * var22 * var22; + } + } + + public byte[] copyBlocks() { + return Arrays.copyOf(this.blocks, this.blocks.length); + } + + public LiquidType getLiquid(int var1, int var2, int var3) { + int var4; + return (var4 = this.getTile(var1, var2, var3)) == 0?LiquidType.NOT_LIQUID:a.b[var4].d(); + } + + public boolean isWater(int var1, int var2, int var3) { + int var4; + return (var4 = this.getTile(var1, var2, var3)) > 0 && a.b[var4].d() == LiquidType.WATER; + } + + public void setNetworkMode(boolean var1) { + this.networkMode = var1; + } + + public Vector3DCreator clip(Vector3D var1, Vector3D var2) { + if(!Float.isNaN(var1.x) && !Float.isNaN(var1.y) && !Float.isNaN(var1.z)) { + if(!Float.isNaN(var2.x) && !Float.isNaN(var2.y) && !Float.isNaN(var2.z)) { + int var3 = (int)Math.floor((double)var2.x); + int var4 = (int)Math.floor((double)var2.y); + int var5 = (int)Math.floor((double)var2.z); + int var6 = (int)Math.floor((double)var1.x); + int var7 = (int)Math.floor((double)var1.y); + int var8 = (int)Math.floor((double)var1.z); + int var9 = 20; + + while(var9-- >= 0) { + if(Float.isNaN(var1.x) || Float.isNaN(var1.y) || Float.isNaN(var1.z)) { + return null; + } + + if(var6 == var3 && var7 == var4 && var8 == var5) { + return null; + } + + float var10 = 999.0F; + float var11 = 999.0F; + float var12 = 999.0F; + if(var3 > var6) { + var10 = (float)var6 + 1.0F; + } + + if(var3 < var6) { + var10 = (float)var6; + } + + if(var4 > var7) { + var11 = (float)var7 + 1.0F; + } + + if(var4 < var7) { + var11 = (float)var7; + } + + if(var5 > var8) { + var12 = (float)var8 + 1.0F; + } + + if(var5 < var8) { + var12 = (float)var8; + } + + float var13 = 999.0F; + float var14 = 999.0F; + float var15 = 999.0F; + float var16 = var2.x - var1.x; + float var17 = var2.y - var1.y; + float var18 = var2.z - var1.z; + if(var10 != 999.0F) { + var13 = (var10 - var1.x) / var16; + } + + if(var11 != 999.0F) { + var14 = (var11 - var1.y) / var17; + } + + if(var12 != 999.0F) { + var15 = (var12 - var1.z) / var18; + } + + boolean var19 = false; + byte var24; + if(var13 < var14 && var13 < var15) { + if(var3 > var6) { + var24 = 4; + } else { + var24 = 5; + } + + var1.x = var10; + var1.y += var17 * var13; + var1.z += var18 * var13; + } else if(var14 < var15) { + if(var4 > var7) { + var24 = 0; + } else { + var24 = 1; + } + + var1.x += var16 * var14; + var1.y = var11; + var1.z += var18 * var14; + } else { + if(var5 > var8) { + var24 = 2; + } else { + var24 = 3; + } + + var1.x += var16 * var15; + var1.y += var17 * var15; + var1.z = var12; + } + + Vector3D var20; + var6 = (int)((var20 = new Vector3D(var1.x, var1.y, var1.z)).x = (float)Math.floor((double)var1.x)); + if(var24 == 5) { + --var6; + ++var20.x; + } + + var7 = (int)(var20.y = (float)Math.floor((double)var1.y)); + if(var24 == 1) { + --var7; + ++var20.y; + } + + var8 = (int)(var20.z = (float)Math.floor((double)var1.z)); + if(var24 == 3) { + --var8; + ++var20.z; + } + + int var22 = this.getTile(var6, var7, var8); + a var21 = a.b[var22]; + if(var22 > 0 && var21.d() == LiquidType.NOT_LIQUID) { + Vector3DCreator var23; + if(var21.a()) { + if((var23 = var21.a(var6, var7, var8, var1, var2)) != null) { + return var23; + } + } else if((var23 = var21.a(var6, var7, var8, var1, var2)) != null) { + return var23; + } + } + } + + return null; + } else { + return null; + } + } else { + return null; + } + } + + public void playSound(String var1, Entity var2, float var3, float var4) {} + + public void playSound(String var1, float var2, float var3, float var4, float var5, float var6) {} + + public boolean maybeGrowTree(int var1, int var2, int var3) { + int var4 = this.random.nextInt(3) + 4; + boolean var5 = true; + + int var6; + int var8; + int var9; + for(var6 = var2; var6 <= var2 + 1 + var4; ++var6) { + byte var7 = 1; + if(var6 == var2) { + var7 = 0; + } + + if(var6 >= var2 + 1 + var4 - 2) { + var7 = 2; + } + + for(var8 = var1 - var7; var8 <= var1 + var7 && var5; ++var8) { + for(var9 = var3 - var7; var9 <= var3 + var7 && var5; ++var9) { + if(var8 >= 0 && var6 >= 0 && var9 >= 0 && var8 < this.width && var6 < this.depth && var9 < this.height) { + if((this.blocks[(var6 * this.height + var9) * this.width + var8] & 255) != 0) { + var5 = false; + } + } else { + var5 = false; + } + } + } + } + + if(!var5) { + return false; + } else if((this.blocks[((var2 - 1) * this.height + var3) * this.width + var1] & 255) == a.f.ab && var2 < this.depth - var4 - 1) { + this.setTile(var1, var2 - 1, var3, a.g.ab); + + int var13; + for(var13 = var2 - 3 + var4; var13 <= var2 + var4; ++var13) { + var8 = var13 - (var2 + var4); + var9 = 1 - var8 / 2; + + for(int var10 = var1 - var9; var10 <= var1 + var9; ++var10) { + int var12 = var10 - var1; + + for(var6 = var3 - var9; var6 <= var3 + var9; ++var6) { + int var11 = var6 - var3; + if((Math.abs(var12) != var9 || Math.abs(var11) != var9 || this.random.nextInt(2) != 0 && var8 != 0) && this.getTile(var10, var13, var6) == 0) { + this.setTile(var10, var13, var6, a.v.ab); + } + } + } + } + + for(var13 = 0; var13 < var4; ++var13) { + if(this.getTile(var1, var2 + var13, var3) == 0) { + this.setTile(var1, var2 + var13, var3, a.u.ab); + } + } + + return true; + } else { + return false; + } + } + + public Entity getPlayer() { + return this.player; + } + + public void addEntity(Entity var1) { + this.blockMap.insert(var1); + var1.setLevel(this); + } + + public void removeEntity(Entity var1) { + this.blockMap.remove(var1); + } + + public void explode(Entity var1, float var2, float var3, float var4, float var5) { + int var6 = (int)(var2 - var5 - 1.0F); + int var7 = (int)(var2 + var5 + 1.0F); + int var8 = (int)(var3 - var5 - 1.0F); + int var9 = (int)(var3 + var5 + 1.0F); + int var10 = (int)(var4 - var5 - 1.0F); + int var11 = (int)(var4 + var5 + 1.0F); + + int var13; + float var15; + float var16; + for(int var12 = var6; var12 < var7; ++var12) { + for(var13 = var9 - 1; var13 >= var8; --var13) { + for(int var14 = var10; var14 < var11; ++var14) { + var15 = (float)var12 + 0.5F - var2; + var16 = (float)var13 + 0.5F - var3; + float var17 = (float)var14 + 0.5F - var4; + int var19; + if(var12 >= 0 && var13 >= 0 && var14 >= 0 && var12 < this.width && var13 < this.depth && var14 < this.height && var15 * var15 + var16 * var16 + var17 * var17 < var5 * var5 && (var19 = this.getTile(var12, var13, var14)) > 0 && a.b[var19].g()) { + a.b[var19].a(this, 0.3F); + this.setTile(var12, var13, var14, 0); + } + } + } + } + + List var18 = this.blockMap.getEntities(var1, (float)var6, (float)var8, (float)var10, (float)var7, (float)var9, (float)var11); + + for(var13 = 0; var13 < var18.size(); ++var13) { + Entity var20; + if((var15 = (var20 = (Entity)var18.get(var13)).distanceTo(var2, var3, var4) / var5) <= 1.0F) { + var16 = 1.0F - var15; + var20.hurt(var1, (int)(var16 * 15.0F + 1.0F)); + } + } + + } + + public Entity findSubclassOf(Class var1) { + for(int var2 = 0; var2 < this.blockMap.all.size(); ++var2) { + Entity var3 = (Entity)this.blockMap.all.get(var2); + if(var1.isAssignableFrom(var3.getClass())) { + return var3; + } + } + + return null; + } + + public void removeAllNonCreativeModeEntities() { + this.blockMap.removeAllNonCreativeModeEntities(); + } +} diff --git a/src/com/mojang/minecraft/level/LevelIO.java b/src/com/mojang/minecraft/level/LevelIO.java new file mode 100644 index 0000000..15af63e --- /dev/null +++ b/src/com/mojang/minecraft/level/LevelIO.java @@ -0,0 +1,83 @@ +package com.mojang.minecraft.level; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.LevelObjectInputStream; +import com.mojang.minecraft.server.MinecraftServer; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.InputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public final class LevelIO { + + private MinecraftServer server; + + + public LevelIO(MinecraftServer var1) { + this.server = var1; + } + + public final Level load(InputStream var1) { + if(this.server != null) { + this.server.a("Loading level"); + } + + if(this.server != null) { + this.server.b("Reading.."); + } + + try { + DataInputStream var10; + if((var10 = new DataInputStream(new GZIPInputStream(var1))).readInt() != 656127880) { + return null; + } else { + byte var12; + if((var12 = var10.readByte()) > 2) { + return null; + } else if(var12 <= 1) { + String var14 = var10.readUTF(); + String var15 = var10.readUTF(); + long var3 = var10.readLong(); + short var5 = var10.readShort(); + short var6 = var10.readShort(); + short var7 = var10.readShort(); + byte[] var8 = new byte[var5 * var6 * var7]; + var10.readFully(var8); + var10.close(); + Level var11; + (var11 = new Level()).setData(var5, var7, var6, var8); + var11.name = var14; + var11.creator = var15; + var11.createTime = var3; + return var11; + } else { + Level var2; + LevelObjectInputStream var13; + (var2 = (Level)(var13 = new LevelObjectInputStream(var10)).readObject()).initTransient(); + var13.close(); + return var2; + } + } + } catch (Exception var9) { + var9.printStackTrace(); + "Failed to load level: " + var9.toString(); + return null; + } + } + + public static void save(Level var0, OutputStream var1) { + try { + DataOutputStream var3; + (var3 = new DataOutputStream(new GZIPOutputStream(var1))).writeInt(656127880); + var3.writeByte(2); + ObjectOutputStream var4; + (var4 = new ObjectOutputStream(var3)).writeObject(var0); + var4.close(); + } catch (Exception var2) { + var2.printStackTrace(); + } + } +} diff --git a/src/com/mojang/minecraft/level/LevelObjectInputStream.java b/src/com/mojang/minecraft/level/LevelObjectInputStream.java new file mode 100644 index 0000000..8983c8c --- /dev/null +++ b/src/com/mojang/minecraft/level/LevelObjectInputStream.java @@ -0,0 +1,25 @@ +package com.mojang.minecraft.level; + +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.util.HashSet; +import java.util.Set; + +public final class LevelObjectInputStream extends ObjectInputStream { + + private Set classes = new HashSet(); + + + public LevelObjectInputStream(InputStream var1) { + super(var1); + this.classes.add("com.mojang.minecraft.player.Player$1"); + this.classes.add("com.mojang.minecraft.mob.Creeper$1"); + this.classes.add("com.mojang.minecraft.mob.Skeleton$1"); + } + + protected final ObjectStreamClass readClassDescriptor() { + ObjectStreamClass var1 = super.readClassDescriptor(); + return this.classes.contains(var1.getName())?ObjectStreamClass.lookup(Class.forName(var1.getName())):var1; + } +} diff --git a/src/com/mojang/minecraft/level/NextTickListEntry.java b/src/com/mojang/minecraft/level/NextTickListEntry.java new file mode 100644 index 0000000..89eba4b --- /dev/null +++ b/src/com/mojang/minecraft/level/NextTickListEntry.java @@ -0,0 +1,19 @@ +package com.mojang.minecraft.level; + + +public final class NextTickListEntry { + + public int x; + public int y; + public int z; + public int blocks; + public int ticks; + + + public NextTickListEntry(int var1, int var2, int var3, int var4) { + this.x = var1; + this.y = var2; + this.z = var3; + this.blocks = var4; + } +} diff --git a/src/com/mojang/minecraft/level/UNKNOWN0.java b/src/com/mojang/minecraft/level/UNKNOWN0.java new file mode 100644 index 0000000..1be035d --- /dev/null +++ b/src/com/mojang/minecraft/level/UNKNOWN0.java @@ -0,0 +1,5 @@ +package com.mojang.minecraft.level; + + +public interface UNKNOWN0 { +} diff --git a/src/com/mojang/minecraft/level/UNKNOWN1.java b/src/com/mojang/minecraft/level/UNKNOWN1.java new file mode 100644 index 0000000..3e9ff28 --- /dev/null +++ b/src/com/mojang/minecraft/level/UNKNOWN1.java @@ -0,0 +1,6 @@ +package com.mojang.minecraft.level; + + +// $FF: synthetic class +final class UNKNOWN1 { +} diff --git a/src/com/mojang/minecraft/level/generator/LevelGenerator.java b/src/com/mojang/minecraft/level/generator/LevelGenerator.java new file mode 100644 index 0000000..7a782b4 --- /dev/null +++ b/src/com/mojang/minecraft/level/generator/LevelGenerator.java @@ -0,0 +1,516 @@ +package com.mojang.minecraft.level.generator; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.generator.noise.CombinedNoise; +import com.mojang.minecraft.level.generator.noise.OctaveNoise; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.server.MinecraftServer; +import com.mojang.util.MathHelper; +import java.util.ArrayList; +import java.util.Random; + +public final class LevelGenerator { + + private MinecraftServer server; + private int width; + private int depth; + private int height; + private Random random = new Random(); + private byte[] blocks; + private int waterLevel; + private int[] h = new int[1048576]; + + + public LevelGenerator(MinecraftServer var1) { + this.server = var1; + } + + public final Level generate(String var1, int var2, int var3, int var4) { + this.server.a("Generating level"); + this.width = 256; + this.depth = 256; + this.height = 64; + this.waterLevel = 32; + this.blocks = new byte[256 << 8 << 6]; + this.server.b("Raising.."); + LevelGenerator var41 = this; + CombinedNoise var5 = new CombinedNoise(new OctaveNoise(this.random, 8), new OctaveNoise(this.random, 8)); + CombinedNoise var6 = new CombinedNoise(new OctaveNoise(this.random, 8), new OctaveNoise(this.random, 8)); + OctaveNoise var7 = new OctaveNoise(this.random, 6); + int[] var8 = new int[this.width * this.depth]; + float var9 = 1.3F; + + int var10; + int var11; + for(var10 = 0; var10 < var41.width; ++var10) { + for(var11 = 0; var11 < var41.depth; ++var11) { + double var12 = var5.compute((double)((float)var10 * var9), (double)((float)var11 * var9)) / 6.0D + (double)-4; + double var14 = var6.compute((double)((float)var10 * var9), (double)((float)var11 * var9)) / 5.0D + 10.0D + (double)-4; + if(var7.compute((double)var10, (double)var11) / 8.0D > 0.0D) { + var14 = var12; + } + + double var18; + if((var18 = Math.max(var12, var14) / 2.0D) < 0.0D) { + var18 *= 0.8D; + } + + var8[var10 + var11 * var41.width] = (int)var18; + } + } + + this.server.b("Eroding.."); + int[] var42 = var8; + var41 = this; + var6 = new CombinedNoise(new OctaveNoise(this.random, 8), new OctaveNoise(this.random, 8)); + CombinedNoise var47 = new CombinedNoise(new OctaveNoise(this.random, 8), new OctaveNoise(this.random, 8)); + + int var22; + int var51; + int var52; + for(var51 = 0; var51 < var41.width; ++var51) { + for(var52 = 0; var52 < var41.depth; ++var52) { + double var20 = var6.compute((double)(var51 << 1), (double)(var52 << 1)) / 8.0D; + var11 = var47.compute((double)(var51 << 1), (double)(var52 << 1)) > 0.0D?1:0; + if(var20 > 2.0D) { + var22 = ((var42[var51 + var52 * var41.width] - var11) / 2 << 1) + var11; + var42[var51 + var52 * var41.width] = var22; + } + } + } + + this.server.b("Soiling.."); + var42 = var8; + var41 = this; + int var44 = this.width; + int var49 = this.depth; + var51 = this.height; + OctaveNoise var54 = new OctaveNoise(this.random, 8); + + int var23; + int var25; + int var24; + int var27; + int var26; + for(var23 = 0; var23 < var44; ++var23) { + for(var10 = 0; var10 < var49; ++var10) { + var11 = (int)(var54.compute((double)var23, (double)var10) / 24.0D) - 4; + var24 = (var22 = var42[var23 + var10 * var44] + var41.waterLevel) + var11; + var42[var23 + var10 * var44] = Math.max(var22, var24); + if(var42[var23 + var10 * var44] > var51 - 2) { + var42[var23 + var10 * var44] = var51 - 2; + } + + if(var42[var23 + var10 * var44] < 1) { + var42[var23 + var10 * var44] = 1; + } + + for(var25 = 0; var25 < var51; ++var25) { + var26 = (var25 * var41.depth + var10) * var41.width + var23; + var27 = 0; + if(var25 <= var22) { + var27 = a.g.ab; + } + + if(var25 <= var24) { + var27 = a.e.ab; + } + + if(var25 == 0) { + var27 = a.n.ab; + } + + var41.blocks[var26] = (byte)var27; + } + } + } + + this.server.b("Carving.."); + boolean var48 = true; + boolean var43 = false; + var41 = this; + var49 = this.width; + var51 = this.depth; + var52 = this.height; + var23 = var49 * var51 * var52 / 256 / 64 << 1; + + for(var10 = 0; var10 < var23; ++var10) { + float var55 = var41.random.nextFloat() * (float)var49; + float var56 = var41.random.nextFloat() * (float)var52; + float var60 = var41.random.nextFloat() * (float)var51; + var25 = (int)((var41.random.nextFloat() + var41.random.nextFloat()) * 200.0F); + float var63 = var41.random.nextFloat() * 3.1415927F * 2.0F; + float var61 = 0.0F; + float var28 = var41.random.nextFloat() * 3.1415927F * 2.0F; + float var29 = 0.0F; + float var30 = var41.random.nextFloat() * var41.random.nextFloat(); + + for(var3 = 0; var3 < var25; ++var3) { + var55 += MathHelper.sin(var63) * MathHelper.cos(var28); + var60 += MathHelper.cos(var63) * MathHelper.cos(var28); + var56 += MathHelper.sin(var28); + var63 += var61 * 0.2F; + var61 = (var61 *= 0.9F) + (var41.random.nextFloat() - var41.random.nextFloat()); + var28 = (var28 + var29 * 0.5F) * 0.5F; + var29 = (var29 *= 0.75F) + (var41.random.nextFloat() - var41.random.nextFloat()); + if(var41.random.nextFloat() >= 0.25F) { + float var45 = var55 + (var41.random.nextFloat() * 4.0F - 2.0F) * 0.2F; + float var46 = var56 + (var41.random.nextFloat() * 4.0F - 2.0F) * 0.2F; + float var31 = var60 + (var41.random.nextFloat() * 4.0F - 2.0F) * 0.2F; + float var32 = ((float)var41.height - var46) / (float)var41.height; + var32 = 1.2F + (var32 * 3.5F + 1.0F) * var30; + var32 = MathHelper.sin((float)var3 * 3.1415927F / (float)var25) * var32; + + for(int var33 = (int)(var45 - var32); var33 <= (int)(var45 + var32); ++var33) { + for(int var34 = (int)(var46 - var32); var34 <= (int)(var46 + var32); ++var34) { + for(int var35 = (int)(var31 - var32); var35 <= (int)(var31 + var32); ++var35) { + float var36 = (float)var33 - var45; + float var37 = (float)var34 - var46; + float var38 = (float)var35 - var31; + if(var36 * var36 + var37 * var37 * 2.0F + var38 * var38 < var32 * var32 && var33 >= 1 && var34 >= 1 && var35 >= 1 && var33 < var41.width - 1 && var34 < var41.height - 1 && var35 < var41.depth - 1) { + int var65 = (var34 * var41.depth + var35) * var41.width + var33; + if(var41.blocks[var65] == a.e.ab) { + var41.blocks[var65] = 0; + } + } + } + } + } + } + } + } + + this.populateOre(a.t.ab, 90, 1, 4); + this.populateOre(a.s.ab, 70, 2, 4); + this.populateOre(a.r.ab, 50, 3, 4); + this.server.b("Watering.."); + var41 = this; + var51 = a.m.ab; + + for(var52 = 0; var52 < var41.width; ++var52) { + var41.flood(var52, var41.height / 2 - 1, 0, 0, var51); + var41.flood(var52, var41.height / 2 - 1, var41.depth - 1, 0, var51); + } + + for(var52 = 0; var52 < var41.depth; ++var52) { + var41.flood(0, var41.height / 2 - 1, var52, 0, var51); + var41.flood(var41.width - 1, var41.height / 2 - 1, var52, 0, var51); + } + + var52 = var41.width * var41.depth / 8000; + + for(var23 = 0; var23 < var52; ++var23) { + var10 = var41.random.nextInt(var41.width); + var11 = var41.waterLevel - 1 - var41.random.nextInt(2); + var22 = var41.random.nextInt(var41.depth); + if(var41.blocks[(var11 * var41.depth + var22) * var41.width + var10] == 0) { + var41.flood(var10, var11, var22, 0, var51); + } + } + + this.server.b("Melting.."); + var41 = this; + var44 = this.width * this.depth * this.height / 20000; + + for(var49 = 0; var49 < var44; ++var49) { + var51 = var41.random.nextInt(var41.width); + var52 = (int)(var41.random.nextFloat() * var41.random.nextFloat() * (float)(var41.waterLevel - 3)); + var23 = var41.random.nextInt(var41.depth); + if(var41.blocks[(var52 * var41.depth + var23) * var41.width + var51] == 0) { + var41.flood(var51, var52, var23, 0, a.o.ab); + } + } + + this.server.b("Growing.."); + var42 = var8; + var41 = this; + var44 = this.width; + var49 = this.depth; + var51 = this.height; + var54 = new OctaveNoise(this.random, 8); + OctaveNoise var57 = new OctaveNoise(this.random, 8); + + int var62; + for(var10 = 0; var10 < var44; ++var10) { + for(var11 = 0; var11 < var49; ++var11) { + boolean var59 = var54.compute((double)var10, (double)var11) > 8.0D; + boolean var58 = var57.compute((double)var10, (double)var11) > 12.0D; + var26 = ((var25 = var42[var10 + var11 * var44]) * var41.depth + var11) * var41.width + var10; + if(((var27 = var41.blocks[((var25 + 1) * var41.depth + var11) * var41.width + var10] & 255) == a.l.ab || var27 == a.m.ab) && var25 <= var51 / 2 - 1 && var58) { + var41.blocks[var26] = (byte)a.q.ab; + } + + if(var27 == 0) { + var62 = a.f.ab; + if(var25 <= var51 / 2 - 1 && var59) { + var62 = a.p.ab; + } + + var41.blocks[var26] = (byte)var62; + } + } + } + + this.server.b("Planting.."); + var42 = var8; + var41 = this; + var44 = this.width; + var49 = this.width * this.depth / 3000; + + for(var51 = 0; var51 < var49; ++var51) { + var52 = var41.random.nextInt(2); + var23 = var41.random.nextInt(var41.width); + var10 = var41.random.nextInt(var41.depth); + + for(var11 = 0; var11 < 10; ++var11) { + var22 = var23; + var24 = var10; + + for(var25 = 0; var25 < 5; ++var25) { + var22 += var41.random.nextInt(6) - var41.random.nextInt(6); + var24 += var41.random.nextInt(6) - var41.random.nextInt(6); + if((var52 < 2 || var41.random.nextInt(4) == 0) && var22 >= 0 && var24 >= 0 && var22 < var41.width && var24 < var41.depth) { + var26 = var42[var22 + var24 * var44] + 1; + if((var41.blocks[(var26 * var41.depth + var24) * var41.width + var22] & 255) == 0) { + var62 = (var26 * var41.depth + var24) * var41.width + var22; + if((var41.blocks[((var26 - 1) * var41.depth + var24) * var41.width + var22] & 255) == a.f.ab) { + if(var52 == 0) { + var41.blocks[var62] = (byte)a.O.ab; + } else if(var52 == 1) { + var41.blocks[var62] = (byte)a.P.ab; + } + } + } + } + } + } + } + + var42 = var8; + var41 = this; + var44 = this.width; + var51 = this.width * this.depth * this.height / 2000; + + for(var52 = 0; var52 < var51; ++var52) { + var23 = var41.random.nextInt(2); + var10 = var41.random.nextInt(var41.width); + var11 = var41.random.nextInt(var41.height); + var22 = var41.random.nextInt(var41.depth); + + for(var24 = 0; var24 < 20; ++var24) { + var25 = var10; + var26 = var11; + var27 = var22; + + for(var62 = 0; var62 < 5; ++var62) { + var25 += var41.random.nextInt(6) - var41.random.nextInt(6); + var26 += var41.random.nextInt(2) - var41.random.nextInt(2); + var27 += var41.random.nextInt(6) - var41.random.nextInt(6); + if((var23 < 2 || var41.random.nextInt(4) == 0) && var25 >= 0 && var27 >= 0 && var26 >= 1 && var25 < var41.width && var27 < var41.depth && var26 < var42[var25 + var27 * var44] - 1 && (var41.blocks[(var26 * var41.depth + var27) * var41.width + var25] & 255) == 0) { + int var64 = (var26 * var41.depth + var27) * var41.width + var25; + if((var41.blocks[((var26 - 1) * var41.depth + var27) * var41.width + var25] & 255) == a.e.ab) { + if(var23 == 0) { + var41.blocks[var64] = (byte)a.Q.ab; + } else if(var23 == 1) { + var41.blocks[var64] = (byte)a.R.ab; + } + } + } + } + } + } + + Level var40; + (var40 = new Level()).waterLevel = this.waterLevel; + var40.setData(256, 64, 256, this.blocks); + var40.createTime = System.currentTimeMillis(); + var40.creator = var1; + var40.name = "A Nice World"; + int[] var53 = var8; + Level var50 = var40; + var41 = this; + var49 = this.width; + var51 = this.width * this.depth / 4000; + + for(var52 = 0; var52 < var51; ++var52) { + var23 = var41.random.nextInt(var41.width); + var10 = var41.random.nextInt(var41.depth); + + for(var11 = 0; var11 < 20; ++var11) { + var22 = var23; + var24 = var10; + + for(var25 = 0; var25 < 20; ++var25) { + var22 += var41.random.nextInt(6) - var41.random.nextInt(6); + var24 += var41.random.nextInt(6) - var41.random.nextInt(6); + if(var22 >= 0 && var24 >= 0 && var22 < var41.width && var24 < var41.depth) { + var26 = var53[var22 + var24 * var49] + 1; + if(var41.random.nextInt(4) == 0) { + var50.maybeGrowTree(var22, var26, var24); + } + } + } + } + } + + return var40; + } + + private void populateOre(int var1, int var2, int var3, int var4) { + byte var24 = (byte)var1; + var3 = this.width; + var4 = this.depth; + int var5 = this.height; + int var6 = var3 * var4 * var5 / 256 / 64 * var2 / 100; + + for(int var7 = 0; var7 < var6; ++var7) { + float var8 = this.random.nextFloat() * (float)var3; + float var9 = this.random.nextFloat() * (float)var5; + float var10 = this.random.nextFloat() * (float)var4; + int var11 = (int)((this.random.nextFloat() + this.random.nextFloat()) * 75.0F * (float)var2 / 100.0F); + float var12 = this.random.nextFloat() * 3.1415927F * 2.0F; + float var13 = 0.0F; + float var14 = this.random.nextFloat() * 3.1415927F * 2.0F; + float var15 = 0.0F; + + for(int var16 = 0; var16 < var11; ++var16) { + var8 += MathHelper.sin(var12) * MathHelper.cos(var14); + var10 += MathHelper.cos(var12) * MathHelper.cos(var14); + var9 += MathHelper.sin(var14); + var12 += var13 * 0.2F; + var13 = (var13 *= 0.9F) + (this.random.nextFloat() - this.random.nextFloat()); + var14 = (var14 + var15 * 0.5F) * 0.5F; + var15 = (var15 *= 0.9F) + (this.random.nextFloat() - this.random.nextFloat()); + float var17 = MathHelper.sin((float)var16 * 3.1415927F / (float)var11) * (float)var2 / 100.0F + 1.0F; + + for(int var18 = (int)(var8 - var17); var18 <= (int)(var8 + var17); ++var18) { + for(int var19 = (int)(var9 - var17); var19 <= (int)(var9 + var17); ++var19) { + for(int var20 = (int)(var10 - var17); var20 <= (int)(var10 + var17); ++var20) { + float var21 = (float)var18 - var8; + float var22 = (float)var19 - var9; + float var23 = (float)var20 - var10; + if(var21 * var21 + var22 * var22 * 2.0F + var23 * var23 < var17 * var17 && var18 >= 1 && var19 >= 1 && var20 >= 1 && var18 < this.width - 1 && var19 < this.height - 1 && var20 < this.depth - 1) { + int var25 = (var19 * this.depth + var20) * this.width + var18; + if(this.blocks[var25] == a.e.ab) { + this.blocks[var25] = var24; + } + } + } + } + } + } + } + + } + + private long flood(int var1, int var2, int var3, int var4, int var5) { + byte var20 = (byte)var5; + ArrayList var21 = new ArrayList(); + byte var6 = 0; + int var7 = 1; + + int var8; + for(var8 = 1; 1 << var7 < this.width; ++var7) { + ; + } + + while(1 << var8 < this.depth) { + ++var8; + } + + int var9 = this.depth - 1; + int var10 = this.width - 1; + int var22 = var6 + 1; + this.h[0] = ((var2 << var8) + var3 << var7) + var1; + long var11 = 0L; + var1 = this.width * this.depth; + + while(var22 > 0) { + --var22; + var2 = this.h[var22]; + if(var22 == 0 && var21.size() > 0) { + this.h = (int[])var21.remove(var21.size() - 1); + var22 = this.h.length; + } + + var3 = var2 >> var7 & var9; + int var13 = var2 >> var7 + var8; + + int var14; + int var15; + for(var15 = var14 = var2 & var10; var14 > 0 && this.blocks[var2 - 1] == 0; --var2) { + --var14; + } + + while(var15 < this.width && this.blocks[var2 + var15 - var14] == 0) { + ++var15; + } + + int var16 = var2 >> var7 & var9; + int var17 = var2 >> var7 + var8; + if(var16 != var3 || var17 != var13) { + System.out.println("Diagonal flood!?"); + } + + boolean var23 = false; + boolean var24 = false; + boolean var18 = false; + var11 += (long)(var15 - var14); + + for(var14 = var14; var14 < var15; ++var14) { + this.blocks[var2] = var20; + boolean var19; + if(var3 > 0) { + if((var19 = this.blocks[var2 - this.width] == 0) && !var23) { + if(var22 == this.h.length) { + var21.add(this.h); + this.h = new int[1048576]; + var22 = 0; + } + + this.h[var22++] = var2 - this.width; + } + + var23 = var19; + } + + if(var3 < this.depth - 1) { + if((var19 = this.blocks[var2 + this.width] == 0) && !var24) { + if(var22 == this.h.length) { + var21.add(this.h); + this.h = new int[1048576]; + var22 = 0; + } + + this.h[var22++] = var2 + this.width; + } + + var24 = var19; + } + + if(var13 > 0) { + byte var25 = this.blocks[var2 - var1]; + if((var20 == a.n.ab || var20 == a.o.ab) && (var25 == a.l.ab || var25 == a.m.ab)) { + this.blocks[var2 - var1] = (byte)a.e.ab; + } + + if((var19 = var25 == 0) && !var18) { + if(var22 == this.h.length) { + var21.add(this.h); + this.h = new int[1048576]; + var22 = 0; + } + + this.h[var22++] = var2 - var1; + } + + var18 = var19; + } + + ++var2; + } + } + + return var11; + } +} diff --git a/src/com/mojang/minecraft/level/generator/noise/CombinedNoise.java b/src/com/mojang/minecraft/level/generator/noise/CombinedNoise.java new file mode 100644 index 0000000..3fd8645 --- /dev/null +++ b/src/com/mojang/minecraft/level/generator/noise/CombinedNoise.java @@ -0,0 +1,19 @@ +package com.mojang.minecraft.level.generator.noise; + +import com.mojang.minecraft.level.generator.noise.Noise; + +public final class CombinedNoise extends Noise { + + private Noise noise1; + private Noise noise2; + + + public CombinedNoise(Noise var1, Noise var2) { + this.noise1 = var1; + this.noise2 = var2; + } + + public final double compute(double var1, double var3) { + return this.noise1.compute(var1 + this.noise2.compute(var1, var3), var3); + } +} diff --git a/src/com/mojang/minecraft/level/generator/noise/Noise.java b/src/com/mojang/minecraft/level/generator/noise/Noise.java new file mode 100644 index 0000000..280f0ff --- /dev/null +++ b/src/com/mojang/minecraft/level/generator/noise/Noise.java @@ -0,0 +1,7 @@ +package com.mojang.minecraft.level.generator.noise; + + +public abstract class Noise { + + public abstract double compute(double var1, double var3); +} diff --git a/src/com/mojang/minecraft/level/generator/noise/OctaveNoise.java b/src/com/mojang/minecraft/level/generator/noise/OctaveNoise.java new file mode 100644 index 0000000..d7e4d1e --- /dev/null +++ b/src/com/mojang/minecraft/level/generator/noise/OctaveNoise.java @@ -0,0 +1,34 @@ +package com.mojang.minecraft.level.generator.noise; + +import com.mojang.minecraft.level.generator.noise.Noise; +import com.mojang.minecraft.level.generator.noise.PerlinNoise; +import java.util.Random; + +public final class OctaveNoise extends Noise { + + private PerlinNoise[] perlin; + private int octaves; + + + public OctaveNoise(Random var1, int var2) { + this.octaves = var2; + this.perlin = new PerlinNoise[var2]; + + for(int var3 = 0; var3 < var2; ++var3) { + this.perlin[var3] = new PerlinNoise(var1); + } + + } + + public final double compute(double var1, double var3) { + double var5 = 0.0D; + double var7 = 1.0D; + + for(int var9 = 0; var9 < this.octaves; ++var9) { + var5 += this.perlin[var9].compute(var1 / var7, var3 / var7) * var7; + var7 *= 2.0D; + } + + return var5; + } +} diff --git a/src/com/mojang/minecraft/level/generator/noise/PerlinNoise.java b/src/com/mojang/minecraft/level/generator/noise/PerlinNoise.java new file mode 100644 index 0000000..412f4db --- /dev/null +++ b/src/com/mojang/minecraft/level/generator/noise/PerlinNoise.java @@ -0,0 +1,68 @@ +package com.mojang.minecraft.level.generator.noise; + +import com.mojang.minecraft.level.generator.noise.Noise; +import java.util.Random; + +public final class PerlinNoise extends Noise { + + private int[] noise; + + + public PerlinNoise() { + this(new Random()); + } + + public PerlinNoise(Random var1) { + this.noise = new int[512]; + + int var2; + for(var2 = 0; var2 < 256; this.noise[var2] = var2++) { + ; + } + + for(var2 = 0; var2 < 256; ++var2) { + int var3 = var1.nextInt(256 - var2) + var2; + int var4 = this.noise[var2]; + this.noise[var2] = this.noise[var3]; + this.noise[var3] = var4; + this.noise[var2 + 256] = this.noise[var2]; + } + + } + + private static double a(double var0) { + return var0 * var0 * var0 * (var0 * (var0 * 6.0D - 15.0D) + 10.0D); + } + + private static double lerp(double var0, double var2, double var4) { + return var2 + var0 * (var4 - var2); + } + + private static double grad(int var0, double var1, double var3, double var5) { + double var7 = (var0 &= 15) < 8?var1:var3; + double var9 = var0 < 4?var3:(var0 != 12 && var0 != 14?var5:var1); + return ((var0 & 1) == 0?var7:-var7) + ((var0 & 2) == 0?var9:-var9); + } + + public final double compute(double var1, double var3) { + double var5 = 0.0D; + double var7 = var3; + double var9 = var1; + int var18 = (int)Math.floor(var1) & 255; + int var2 = (int)Math.floor(var3) & 255; + int var19 = (int)Math.floor(0.0D) & 255; + var9 -= Math.floor(var9); + var7 -= Math.floor(var7); + var5 = 0.0D - Math.floor(0.0D); + double var11 = a(var9); + double var13 = a(var7); + double var15 = a(var5); + int var4 = this.noise[var18] + var2; + int var17 = this.noise[var4] + var19; + var4 = this.noise[var4 + 1] + var19; + var18 = this.noise[var18 + 1] + var2; + var2 = this.noise[var18] + var19; + var18 = this.noise[var18 + 1] + var19; + return lerp(var15, lerp(var13, lerp(var11, grad(this.noise[var17], var9, var7, var5), grad(this.noise[var2], var9 - 1.0D, var7, var5)), lerp(var11, grad(this.noise[var4], var9, var7 - 1.0D, var5), grad(this.noise[var18], var9 - 1.0D, var7 - 1.0D, var5))), lerp(var13, lerp(var11, grad(this.noise[var17 + 1], var9, var7, var5 - 1.0D), grad(this.noise[var2 + 1], var9 - 1.0D, var7, var5 - 1.0D)), lerp(var11, grad(this.noise[var4 + 1], var9, var7 - 1.0D, var5 - 1.0D), grad(this.noise[var18 + 1], var9 - 1.0D, var7 - 1.0D, var5 - 1.0D)))); + } +} diff --git a/src/com/mojang/minecraft/level/liquid/LiquidType.java b/src/com/mojang/minecraft/level/liquid/LiquidType.java new file mode 100644 index 0000000..ffc26c8 --- /dev/null +++ b/src/com/mojang/minecraft/level/liquid/LiquidType.java @@ -0,0 +1,16 @@ +package com.mojang.minecraft.level.liquid; + + +public final class LiquidType { + + private static LiquidType[] values = new LiquidType[4]; + public static final LiquidType NOT_LIQUID = new LiquidType(0); + public static final LiquidType WATER = new LiquidType(1); + public static final LiquidType LAVA = new LiquidType(2); + + + private LiquidType(int var1) { + values[var1] = this; + } + +} diff --git a/src/com/mojang/minecraft/level/tile/Tile$SoundType.java b/src/com/mojang/minecraft/level/tile/Tile$SoundType.java new file mode 100644 index 0000000..5c9f978 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/Tile$SoundType.java @@ -0,0 +1,35 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public enum Tile$SoundType { + + none("none", 0, "-", 0.0F, 0.0F), + grass("grass", 1, "grass", 0.6F, 1.0F), + cloth("cloth", 2, "grass", 0.7F, 1.2F), + gravel("gravel", 3, "gravel", 1.0F, 1.0F), + stone("stone", 4, "stone", 1.0F, 1.0F), + metal("metal", 5, "stone", 1.0F, 2.0F), + wood("wood", 6, "wood", 1.0F, 1.0F); + public final String name; + private final float volume; + private final float pitch; + // $FF: synthetic field + private static final Tile$SoundType[] a = new Tile$SoundType[]{none, grass, cloth, gravel, stone, metal, wood}; + + + private Tile$SoundType(String var1, int var2, String var3, float var4, float var5) { + this.name = var3; + this.volume = var4; + this.pitch = var5; + } + + public final float getVolume() { + return this.volume / (a.a.nextFloat() * 0.4F + 1.0F) * 0.5F; + } + + public final float getPitch() { + return this.pitch / (a.a.nextFloat() * 0.2F + 0.9F); + } + +} diff --git a/src/com/mojang/minecraft/level/tile/a.java b/src/com/mojang/minecraft/level/tile/a.java new file mode 100644 index 0000000..3404eb3 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/a.java @@ -0,0 +1,708 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.Vector3DCreator; +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.liquid.LiquidType; +import com.mojang.minecraft.level.tile.Tile$SoundType; +import com.mojang.minecraft.level.tile.c; +import com.mojang.minecraft.level.tile.d; +import com.mojang.minecraft.level.tile.e; +import com.mojang.minecraft.level.tile.f; +import com.mojang.minecraft.level.tile.g; +import com.mojang.minecraft.level.tile.h; +import com.mojang.minecraft.level.tile.i; +import com.mojang.minecraft.level.tile.j; +import com.mojang.minecraft.level.tile.k; +import com.mojang.minecraft.level.tile.l; +import com.mojang.minecraft.level.tile.m; +import com.mojang.minecraft.level.tile.n; +import com.mojang.minecraft.level.tile.o; +import com.mojang.minecraft.level.tile.p; +import com.mojang.minecraft.level.tile.q; +import com.mojang.minecraft.level.tile.r; +import com.mojang.minecraft.level.tile.s; +import com.mojang.minecraft.level.tile.t; +import com.mojang.minecraft.model.Vector3D; +import com.mojang.minecraft.phys.AABB; +import java.util.Random; + +public class a { + + protected static Random a = new Random(); + public static final a[] b = new a[256]; + public static final boolean[] c = new boolean[256]; + private static boolean[] ad = new boolean[256]; + private static boolean[] ae = new boolean[256]; + public static final boolean[] d = new boolean[256]; + private static int[] af = new int[256]; + public static final a e; + public static final a f; + public static final a g; + public static final a h; + public static final a i; + public static final a j; + public static final a k; + public static final a l; + public static final a m; + public static final a n; + public static final a o; + public static final a p; + public static final a q; + public static final a r; + public static final a s; + public static final a t; + public static final a u; + public static final a v; + public static final a w; + public static final a x; + public static final a y; + public static final a z; + public static final a A; + public static final a B; + public static final a C; + public static final a D; + public static final a E; + public static final a F; + public static final a G; + public static final a H; + public static final a I; + public static final a J; + public static final a K; + public static final a L; + public static final a M; + public static final a N; + public static final a O; + public static final a P; + public static final a Q; + public static final a R; + public static final a S; + public static final a T; + public static final a U; + public static final a V; + public static final a W; + public static final a X; + public static final a Y; + public static final a Z; + public static final a aa; + public final int ab; + public Tile$SoundType ac; + private boolean ag; + private float ah; + private float ai; + private float aj; + private float ak; + private float al; + private float am; + + + protected a(int var1) { + this.ag = true; + b[var1] = this; + this.ab = var1; + this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + ad[var1] = this.c(); + ae[var1] = this.a(); + d[var1] = false; + } + + public boolean a() { + return true; + } + + protected final void a(boolean var1) { + c[this.ab] = var1; + } + + protected final void a(float var1, float var2, float var3, float var4, float var5, float var6) { + this.ah = var1; + this.ai = var2; + this.aj = var3; + this.ak = var4; + this.al = var5; + this.am = var6; + } + + protected a(int var1, int var2) { + this(var1); + } + + public final void a(int var1) { + af[this.ab] = 16; + } + + public AABB a(int var1, int var2, int var3) { + return new AABB((float)var1 + this.ah, (float)var2 + this.ai, (float)var3 + this.aj, (float)var1 + this.ak, (float)var2 + this.al, (float)var3 + this.am); + } + + public boolean b() { + return true; + } + + public boolean c() { + return true; + } + + public void a(Level var1, int var2, int var3, int var4, Random var5) {} + + public LiquidType d() { + return LiquidType.NOT_LIQUID; + } + + public void a(Level var1, int var2, int var3, int var4, int var5) {} + + public void a(Level var1, int var2, int var3, int var4) {} + + public int e() { + return 0; + } + + public void b(Level var1, int var2, int var3, int var4) {} + + public void c(Level var1, int var2, int var3, int var4) {} + + public int f() { + return 1; + } + + public void a(Level var1, float var2) { + if(!var1.creativeMode) { + int var3 = this.f(); + + for(int var4 = 0; var4 < var3; ++var4) { + if(a.nextFloat() <= var2) { + a.nextFloat(); + a.nextFloat(); + a.nextFloat(); + } + } + + } + } + + public final boolean g() { + return this.ag; + } + + public final Vector3DCreator a(int var1, int var2, int var3, Vector3D var4, Vector3D var5) { + var4 = var4.add((float)(-var1), (float)(-var2), (float)(-var3)); + var5 = var5.add((float)(-var1), (float)(-var2), (float)(-var3)); + Vector3D var6 = var4.getXIntersection(var5, this.ah); + Vector3D var7 = var4.getXIntersection(var5, this.ak); + Vector3D var8 = var4.getYIntersection(var5, this.ai); + Vector3D var9 = var4.getYIntersection(var5, this.al); + Vector3D var10 = var4.getZIntersection(var5, this.aj); + var5 = var4.getZIntersection(var5, this.am); + if(!this.a(var6)) { + var6 = null; + } + + if(!this.a(var7)) { + var7 = null; + } + + if(!this.b(var8)) { + var8 = null; + } + + if(!this.b(var9)) { + var9 = null; + } + + if(!this.c(var10)) { + var10 = null; + } + + if(!this.c(var5)) { + var5 = null; + } + + Vector3D var11 = null; + if(var6 != null) { + var11 = var6; + } + + if(var7 != null && (var11 == null || var4.distanceSquared(var7) < var4.distanceSquared(var11))) { + var11 = var7; + } + + if(var8 != null && (var11 == null || var4.distanceSquared(var8) < var4.distanceSquared(var11))) { + var11 = var8; + } + + if(var9 != null && (var11 == null || var4.distanceSquared(var9) < var4.distanceSquared(var11))) { + var11 = var9; + } + + if(var10 != null && (var11 == null || var4.distanceSquared(var10) < var4.distanceSquared(var11))) { + var11 = var10; + } + + if(var5 != null && (var11 == null || var4.distanceSquared(var5) < var4.distanceSquared(var11))) { + var11 = var5; + } + + if(var11 == null) { + return null; + } else { + byte var12 = -1; + if(var11 == var6) { + var12 = 4; + } + + if(var11 == var7) { + var12 = 5; + } + + if(var11 == var8) { + var12 = 0; + } + + if(var11 == var9) { + var12 = 1; + } + + if(var11 == var10) { + var12 = 2; + } + + if(var11 == var5) { + var12 = 3; + } + + return new Vector3DCreator(var1, var2, var3, var12, var11.add((float)var1, (float)var2, (float)var3)); + } + } + + private boolean a(Vector3D var1) { + return var1 == null?false:var1.y >= this.ai && var1.y <= this.al && var1.z >= this.aj && var1.z <= this.am; + } + + private boolean b(Vector3D var1) { + return var1 == null?false:var1.x >= this.ah && var1.x <= this.ak && var1.z >= this.aj && var1.z <= this.am; + } + + private boolean c(Vector3D var1) { + return var1 == null?false:var1.x >= this.ah && var1.x <= this.ak && var1.y >= this.ai && var1.y <= this.al; + } + + static { + e var10000 = new e(1, 1); + float var0 = 1.0F; + var0 = 1.0F; + var0 = 1.0F; + Tile$SoundType var1 = Tile$SoundType.stone; + e var2 = var10000; + var10000.ac = var1; + boolean var3 = false; + var2.ag = false; + e = var2; + l var22 = new l(2); + var0 = 0.6F; + var0 = 1.0F; + var0 = 0.9F; + var1 = Tile$SoundType.grass; + l var4 = var22; + var22.ac = var1; + f = var4; + c var23 = new c(3, 2); + var0 = 0.5F; + var0 = 1.0F; + var0 = 0.8F; + var1 = Tile$SoundType.grass; + c var5 = var23; + var23.ac = var1; + g = var5; + a var21 = new a(4, 16); + var0 = 1.5F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + a var6 = var21; + var21.ac = var1; + var3 = false; + var6.ag = false; + h = var6; + var21 = new a(5, 4); + var0 = 1.5F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.wood; + var6 = var21; + var21.ac = var1; + i = var6; + h var20 = new h(6, 15); + var0 = 0.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.none; + h var7 = var20; + var20.ac = var1; + j = var7; + var21 = new a(7, 17); + var0 = 999.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var6 = var21; + var21.ac = var1; + var3 = false; + var6.ag = false; + k = var6; + r var18 = new r(8, LiquidType.WATER); + var0 = 100.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.none; + r var8 = var18; + var18.ac = var1; + l = var8; + i var19 = new i(9, LiquidType.WATER); + var0 = 100.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.none; + i var9 = var19; + var19.ac = var1; + m = var9; + var18 = new r(10, LiquidType.LAVA); + var0 = 100.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.none; + var8 = var18; + var18.ac = var1; + n = var8; + var19 = new i(11, LiquidType.LAVA); + var0 = 100.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.none; + var9 = var19; + var19.ac = var1; + o = var9; + f var17 = new f(12, 18); + var0 = 0.5F; + var0 = 1.0F; + var0 = 0.8F; + var1 = Tile$SoundType.gravel; + f var10 = var17; + var17.ac = var1; + p = var10; + var17 = new f(13, 19); + var0 = 0.6F; + var0 = 1.0F; + var0 = 0.8F; + var1 = Tile$SoundType.gravel; + var10 = var17; + var17.ac = var1; + q = var10; + n var16 = new n(14, 32); + var0 = 3.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + n var11 = var16; + var16.ac = var1; + var3 = false; + var11.ag = false; + r = var11; + var16 = new n(15, 33); + var0 = 3.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var11 = var16; + var16.ac = var1; + var3 = false; + var11.ag = false; + s = var11; + var16 = new n(16, 34); + var0 = 3.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var11 = var16; + var16.ac = var1; + var3 = false; + var11.ag = false; + t = var11; + j var36 = new j(17); + var0 = 2.5F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.wood; + j var12 = var36; + var36.ac = var1; + u = var12; + p var38 = new p(18, 22); + var0 = 0.2F; + var0 = 0.4F; + var0 = 1.0F; + var1 = Tile$SoundType.grass; + p var14 = var38; + var38.ac = var1; + v = var14; + o var37 = new o(19); + var0 = 0.6F; + var0 = 0.9F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + o var13 = var37; + var37.ac = var1; + w = var13; + q var39 = new q(20, 49, false); + var0 = 0.3F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.metal; + q var15 = var39; + var39.ac = var1; + x = var15; + var21 = new a(21, 64); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + y = var6; + var21 = new a(22, 65); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + z = var6; + var21 = new a(23, 66); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + A = var6; + var21 = new a(24, 67); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + B = var6; + var21 = new a(25, 68); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + C = var6; + var21 = new a(26, 69); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + D = var6; + var21 = new a(27, 70); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + E = var6; + var21 = new a(28, 71); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + F = var6; + var21 = new a(29, 72); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + G = var6; + var21 = new a(30, 73); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + H = var6; + var21 = new a(31, 74); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + I = var6; + var21 = new a(32, 75); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + J = var6; + var21 = new a(33, 76); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + K = var6; + var21 = new a(34, 77); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + L = var6; + var21 = new a(35, 78); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + M = var6; + var21 = new a(36, 79); + var0 = 0.8F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + var6 = var21; + var21.ac = var1; + N = var6; + m var34 = new m(37, 13); + var0 = 0.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.none; + m var25 = var34; + var34.ac = var1; + O = var25; + var34 = new m(38, 12); + var0 = 0.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.none; + var25 = var34; + var34.ac = var1; + P = var25; + t var35 = new t(39, 29); + var0 = 0.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.none; + t var24 = var35; + var35.ac = var1; + Q = var24; + var35 = new t(40, 28); + var0 = 0.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.none; + var24 = var35; + var35.ac = var1; + R = var24; + d var30 = new d(41, 40); + var0 = 3.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.metal; + d var27 = var30; + var30.ac = var1; + var3 = false; + var27.ag = false; + S = var27; + var30 = new d(42, 39); + var0 = 5.0F; + var0 = 1.0F; + var0 = 0.7F; + var1 = Tile$SoundType.metal; + var27 = var30; + var30.ac = var1; + var3 = false; + var27.ag = false; + T = var27; + k var31 = new k(43, true); + var0 = 2.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + k var26 = var31; + var31.ac = var1; + var3 = false; + var26.ag = false; + U = var26; + var31 = new k(44, false); + var0 = 2.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var26 = var31; + var31.ac = var1; + var3 = false; + var26.ag = false; + V = var26; + var21 = new a(45, 7); + var0 = 2.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var6 = var21; + var21.ac = var1; + var3 = false; + var6.ag = false; + W = var6; + s var32 = new s(46, 8); + var0 = 0.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.cloth; + s var28 = var32; + var32.ac = var1; + X = var28; + g var33 = new g(47, 35); + var0 = 1.5F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.wood; + g var29 = var33; + var33.ac = var1; + Y = var29; + var21 = new a(48, 36); + var0 = 1.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var6 = var21; + var21.ac = var1; + var3 = false; + var6.ag = false; + Z = var6; + var10000 = new e(49, 37); + var0 = 10.0F; + var0 = 1.0F; + var0 = 1.0F; + var1 = Tile$SoundType.stone; + var2 = var10000; + var10000.ac = var1; + var3 = false; + var2.ag = false; + aa = var2; + } +} diff --git a/src/com/mojang/minecraft/level/tile/b.java b/src/com/mojang/minecraft/level/tile/b.java new file mode 100644 index 0000000..a4f3fb4 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/b.java @@ -0,0 +1,18 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public class b extends a { + + protected b(int var1, int var2, boolean var3) { + super(var1, var2); + } + + public final boolean c() { + return false; + } + + public final boolean b() { + return false; + } +} diff --git a/src/com/mojang/minecraft/level/tile/c.java b/src/com/mojang/minecraft/level/tile/c.java new file mode 100644 index 0000000..c5196a0 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/c.java @@ -0,0 +1,10 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class c extends a { + + protected c(int var1, int var2) { + super(3, 2); + } +} diff --git a/src/com/mojang/minecraft/level/tile/d.java b/src/com/mojang/minecraft/level/tile/d.java new file mode 100644 index 0000000..a2682b8 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/d.java @@ -0,0 +1,10 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class d extends a { + + public d(int var1, int var2) { + super(var1); + } +} diff --git a/src/com/mojang/minecraft/level/tile/e.java b/src/com/mojang/minecraft/level/tile/e.java new file mode 100644 index 0000000..a24be13 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/e.java @@ -0,0 +1,10 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class e extends a { + + public e(int var1, int var2) { + super(var1, var2); + } +} diff --git a/src/com/mojang/minecraft/level/tile/f.java b/src/com/mojang/minecraft/level/tile/f.java new file mode 100644 index 0000000..c637cf0 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/f.java @@ -0,0 +1,45 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.liquid.LiquidType; +import com.mojang.minecraft.level.tile.a; + +public final class f extends a { + + public f(int var1, int var2) { + super(var1, var2); + } + + public final void a(Level var1, int var2, int var3, int var4) { + this.d(var1, var2, var3, var4); + } + + public final void a(Level var1, int var2, int var3, int var4, int var5) { + this.d(var1, var2, var3, var4); + } + + private void d(Level var1, int var2, int var3, int var4) { + int var11 = var2; + int var5 = var3; + int var6 = var4; + + while(true) { + int var8 = var5 - 1; + int var10; + LiquidType var12; + if(!((var10 = var1.getTile(var11, var8, var6)) == 0?true:((var12 = a.b[var10].d()) == LiquidType.WATER?true:var12 == LiquidType.LAVA)) || var5 <= 0) { + if(var5 != var3) { + if((var10 = var1.getTile(var11, var5, var6)) > 0 && a.b[var10].d() != LiquidType.NOT_LIQUID) { + var1.setTileNoUpdate(var11, var5, var6, 0); + } + + var1.swap(var2, var3, var4, var11, var5, var6); + } + + return; + } + + --var5; + } + } +} diff --git a/src/com/mojang/minecraft/level/tile/g.java b/src/com/mojang/minecraft/level/tile/g.java new file mode 100644 index 0000000..216eb87 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/g.java @@ -0,0 +1,14 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class g extends a { + + public g(int var1, int var2) { + super(47, 35); + } + + public final int f() { + return 0; + } +} diff --git a/src/com/mojang/minecraft/level/tile/h.java b/src/com/mojang/minecraft/level/tile/h.java new file mode 100644 index 0000000..4ccfb89 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/h.java @@ -0,0 +1,32 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.level.tile.m; +import java.util.Random; + +public final class h extends m { + + protected h(int var1, int var2) { + super(6, 15); + float var3 = 0.4F; + this.a(0.5F - var3, 0.0F, 0.5F - var3, var3 + 0.5F, var3 * 2.0F, var3 + 0.5F); + } + + public final void a(Level var1, int var2, int var3, int var4, Random var5) { + if(var1.growTrees) { + int var6 = var1.getTile(var2, var3 - 1, var4); + if(var1.isLit(var2, var3, var4) && (var6 == a.g.ab || var6 == a.f.ab)) { + if(var5.nextInt(5) == 0) { + var1.setTileNoUpdate(var2, var3, var4, 0); + if(!var1.maybeGrowTree(var2, var3, var4)) { + var1.setTileNoUpdate(var2, var3, var4, this.ab); + } + } + + } else { + var1.setTile(var2, var3, var4, 0); + } + } + } +} diff --git a/src/com/mojang/minecraft/level/tile/i.java b/src/com/mojang/minecraft/level/tile/i.java new file mode 100644 index 0000000..e57dcf7 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/i.java @@ -0,0 +1,56 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.liquid.LiquidType; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.level.tile.r; +import java.util.Random; + +public final class i extends r { + + protected i(int var1, LiquidType var2) { + super(var1, var2); + this.af = var1 - 1; + this.ae = var1; + this.a(false); + } + + public final void a(Level var1, int var2, int var3, int var4, Random var5) {} + + public final void a(Level var1, int var2, int var3, int var4, int var5) { + boolean var6 = false; + if(var1.getTile(var2 - 1, var3, var4) == 0) { + var6 = true; + } + + if(var1.getTile(var2 + 1, var3, var4) == 0) { + var6 = true; + } + + if(var1.getTile(var2, var3, var4 - 1) == 0) { + var6 = true; + } + + if(var1.getTile(var2, var3, var4 + 1) == 0) { + var6 = true; + } + + if(var1.getTile(var2, var3 - 1, var4) == 0) { + var6 = true; + } + + if(var5 != 0) { + LiquidType var7 = a.b[var5].d(); + if(this.ad == LiquidType.WATER && var7 == LiquidType.LAVA || var7 == LiquidType.WATER && this.ad == LiquidType.LAVA) { + var1.setTile(var2, var3, var4, a.e.ab); + return; + } + } + + if(var6) { + var1.setTileNoUpdate(var2, var3, var4, this.af); + var1.addToTickNextTick(var2, var3, var4, this.af); + } + + } +} diff --git a/src/com/mojang/minecraft/level/tile/j.java b/src/com/mojang/minecraft/level/tile/j.java new file mode 100644 index 0000000..8f97f66 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/j.java @@ -0,0 +1,14 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class j extends a { + + protected j(int var1) { + super(17); + } + + public final int f() { + return a.nextInt(3) + 3; + } +} diff --git a/src/com/mojang/minecraft/level/tile/k.java b/src/com/mojang/minecraft/level/tile/k.java new file mode 100644 index 0000000..edd99fc --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/k.java @@ -0,0 +1,45 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; + +public final class k extends a { + + private boolean ad; + + + public k(int var1, boolean var2) { + super(var1, 6); + this.ad = var2; + if(!var2) { + this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + } + + } + + public final boolean c() { + return this.ad; + } + + public final void a(Level var1, int var2, int var3, int var4, int var5) { + if(this == a.V) { + ; + } + } + + public final void b(Level var1, int var2, int var3, int var4) { + if(this != a.V) { + super.b(var1, var2, var3, var4); + } + + if(var1.getTile(var2, var3 - 1, var4) == V.ab) { + var1.setTile(var2, var3, var4, 0); + var1.setTile(var2, var3 - 1, var4, a.U.ab); + } + + } + + public final boolean a() { + return this.ad; + } +} diff --git a/src/com/mojang/minecraft/level/tile/l.java b/src/com/mojang/minecraft/level/tile/l.java new file mode 100644 index 0000000..db3f20b --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/l.java @@ -0,0 +1,31 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; +import java.util.Random; + +public final class l extends a { + + protected l(int var1) { + super(2); + this.a(true); + } + + public final void a(Level var1, int var2, int var3, int var4, Random var5) { + if(var5.nextInt(4) == 0) { + if(!var1.isLit(var2, var3, var4)) { + var1.setTile(var2, var3, var4, a.g.ab); + } else { + for(int var9 = 0; var9 < 4; ++var9) { + int var6 = var2 + var5.nextInt(3) - 1; + int var7 = var3 + var5.nextInt(5) - 3; + int var8 = var4 + var5.nextInt(3) - 1; + if(var1.getTile(var6, var7, var8) == a.g.ab && var1.isLit(var6, var7, var8)) { + var1.setTile(var6, var7, var8, a.f.ab); + } + } + + } + } + } +} diff --git a/src/com/mojang/minecraft/level/tile/m.java b/src/com/mojang/minecraft/level/tile/m.java new file mode 100644 index 0000000..185edb6 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/m.java @@ -0,0 +1,40 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.phys.AABB; +import java.util.Random; + +public class m extends a { + + protected m(int var1, int var2) { + super(var1); + this.a(true); + float var3 = 0.2F; + this.a(0.5F - var3, 0.0F, 0.5F - var3, var3 + 0.5F, var3 * 3.0F, var3 + 0.5F); + } + + public void a(Level var1, int var2, int var3, int var4, Random var5) { + int var6 = var1.getTile(var2, var3 - 1, var4); + if(!var1.isLit(var2, var3, var4) || var6 != a.g.ab && var6 != a.f.ab) { + var1.setTile(var2, var3, var4, 0); + } + + } + + public final AABB a(int var1, int var2, int var3) { + return null; + } + + public final boolean b() { + return false; + } + + public final boolean c() { + return false; + } + + public final boolean a() { + return false; + } +} diff --git a/src/com/mojang/minecraft/level/tile/n.java b/src/com/mojang/minecraft/level/tile/n.java new file mode 100644 index 0000000..ac89ad4 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/n.java @@ -0,0 +1,14 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class n extends a { + + public n(int var1, int var2) { + super(var1, var2); + } + + public final int f() { + return a.nextInt(3) + 1; + } +} diff --git a/src/com/mojang/minecraft/level/tile/o.java b/src/com/mojang/minecraft/level/tile/o.java new file mode 100644 index 0000000..38fc621 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/o.java @@ -0,0 +1,35 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; + +public final class o extends a { + + protected o(int var1) { + super(19); + } + + public final void b(Level var1, int var2, int var3, int var4) { + for(int var7 = var2 - 2; var7 <= var2 + 2; ++var7) { + for(int var5 = var3 - 2; var5 <= var3 + 2; ++var5) { + for(int var6 = var4 - 2; var6 <= var4 + 2; ++var6) { + if(var1.isWater(var7, var5, var6)) { + var1.setTileNoNeighborChange(var7, var5, var6, 0); + } + } + } + } + + } + + public final void c(Level var1, int var2, int var3, int var4) { + for(int var7 = var2 - 2; var7 <= var2 + 2; ++var7) { + for(int var5 = var3 - 2; var5 <= var3 + 2; ++var5) { + for(int var6 = var4 - 2; var6 <= var4 + 2; ++var6) { + var1.updateNeighborsAt(var7, var5, var6, var1.getTile(var7, var5, var6)); + } + } + } + + } +} diff --git a/src/com/mojang/minecraft/level/tile/p.java b/src/com/mojang/minecraft/level/tile/p.java new file mode 100644 index 0000000..4418804 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/p.java @@ -0,0 +1,14 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.b; + +public final class p extends b { + + protected p(int var1, int var2) { + super(18, 22, true); + } + + public final int f() { + return a.nextInt(10) == 0?1:0; + } +} diff --git a/src/com/mojang/minecraft/level/tile/q.java b/src/com/mojang/minecraft/level/tile/q.java new file mode 100644 index 0000000..a965e39 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/q.java @@ -0,0 +1,18 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class q extends a { + + protected q(int var1, int var2, boolean var3) { + super(20, 49); + } + + public final boolean c() { + return false; + } + + public final boolean b() { + return false; + } +} diff --git a/src/com/mojang/minecraft/level/tile/r.java b/src/com/mojang/minecraft/level/tile/r.java new file mode 100644 index 0000000..1ffd0c5 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/r.java @@ -0,0 +1,141 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.liquid.LiquidType; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.phys.AABB; +import java.util.Random; + +public class r extends a { + + protected LiquidType ad; + protected int ae; + protected int af; + + + protected r(int var1, LiquidType var2) { + super(var1); + this.ad = var2; + a.d[var1] = true; + this.af = var1; + this.ae = var1 + 1; + float var4 = 0.01F; + float var3 = 0.1F; + this.a(var4 + 0.0F, 0.0F - var3 + var4, var4 + 0.0F, var4 + 1.0F, 1.0F - var3 + var4, var4 + 1.0F); + this.a(true); + if(var2 == LiquidType.LAVA) { + this.a(16); + } + + } + + public final boolean a() { + return false; + } + + public final void a(Level var1, int var2, int var3, int var4) { + var1.addToTickNextTick(var2, var3, var4, this.af); + } + + public void a(Level var1, int var2, int var3, int var4, Random var5) { + boolean var7 = false; + var4 = var4; + var3 = var3; + var2 = var2; + var1 = var1; + this = this; + boolean var8 = false; + + boolean var6; + do { + --var3; + if(var1.getTile(var2, var3, var4) != 0 || !this.d(var1, var2, var3, var4)) { + break; + } + + if(var6 = var1.setTile(var2, var3, var4, this.af)) { + var8 = true; + } + } while(var6 && this.ad != LiquidType.LAVA); + + ++var3; + if(this.ad == LiquidType.WATER || !var8) { + var8 = var8 | this.e(var1, var2 - 1, var3, var4) | this.e(var1, var2 + 1, var3, var4) | this.e(var1, var2, var3, var4 - 1) | this.e(var1, var2, var3, var4 + 1); + } + + if(!var8) { + var1.setTileNoUpdate(var2, var3, var4, this.ae); + } else { + var1.addToTickNextTick(var2, var3, var4, this.af); + } + + } + + private boolean d(Level var1, int var2, int var3, int var4) { + if(this.ad == LiquidType.WATER) { + for(int var7 = var2 - 2; var7 <= var2 + 2; ++var7) { + for(int var5 = var3 - 2; var5 <= var3 + 2; ++var5) { + for(int var6 = var4 - 2; var6 <= var4 + 2; ++var6) { + if(var1.getTile(var7, var5, var6) == a.w.ab) { + return false; + } + } + } + } + } + + return true; + } + + private boolean e(Level var1, int var2, int var3, int var4) { + if(var1.getTile(var2, var3, var4) == 0) { + if(!this.d(var1, var2, var3, var4)) { + return false; + } + + if(var1.setTile(var2, var3, var4, this.af)) { + var1.addToTickNextTick(var2, var3, var4, this.af); + } + } + + return false; + } + + public final AABB a(int var1, int var2, int var3) { + return null; + } + + public final boolean b() { + return true; + } + + public final boolean c() { + return false; + } + + public final LiquidType d() { + return this.ad; + } + + public void a(Level var1, int var2, int var3, int var4, int var5) { + if(var5 != 0) { + LiquidType var6 = a.b[var5].d(); + if(this.ad == LiquidType.WATER && var6 == LiquidType.LAVA || var6 == LiquidType.WATER && this.ad == LiquidType.LAVA) { + var1.setTile(var2, var3, var4, a.e.ab); + return; + } + } + + var1.addToTickNextTick(var2, var3, var4, var5); + } + + public final int e() { + return this.ad == LiquidType.LAVA?5:0; + } + + public final void a(Level var1, float var2) {} + + public final int f() { + return 0; + } +} diff --git a/src/com/mojang/minecraft/level/tile/s.java b/src/com/mojang/minecraft/level/tile/s.java new file mode 100644 index 0000000..f0efd3b --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/s.java @@ -0,0 +1,14 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.tile.a; + +public final class s extends a { + + public s(int var1, int var2) { + super(46, 8); + } + + public final int f() { + return 0; + } +} diff --git a/src/com/mojang/minecraft/level/tile/t.java b/src/com/mojang/minecraft/level/tile/t.java new file mode 100644 index 0000000..7cd8f32 --- /dev/null +++ b/src/com/mojang/minecraft/level/tile/t.java @@ -0,0 +1,23 @@ +package com.mojang.minecraft.level.tile; + +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.level.tile.m; +import java.util.Random; + +public final class t extends m { + + protected t(int var1, int var2) { + super(var1, var2); + float var3 = 0.2F; + this.a(0.5F - var3, 0.0F, 0.5F - var3, var3 + 0.5F, var3 * 2.0F, var3 + 0.5F); + } + + public final void a(Level var1, int var2, int var3, int var4, Random var5) { + int var6 = var1.getTile(var2, var3 - 1, var4); + if(var1.isLit(var2, var3, var4) || var6 != a.e.ab && var6 != a.q.ab && var6 != a.h.ab) { + var1.setTile(var2, var3, var4, 0); + } + + } +} diff --git a/src/com/mojang/minecraft/model/Vector3D.java b/src/com/mojang/minecraft/model/Vector3D.java new file mode 100644 index 0000000..a25cf29 --- /dev/null +++ b/src/com/mojang/minecraft/model/Vector3D.java @@ -0,0 +1,60 @@ +package com.mojang.minecraft.model; + +import com.mojang.util.MathHelper; + +public final class Vector3D { + + public float x; + public float y; + public float z; + + + public Vector3D(float var1, float var2, float var3) { + this.x = var1; + this.y = var2; + this.z = var3; + } + + public final Vector3D add(float var1, float var2, float var3) { + return new Vector3D(this.x + var1, this.y + var2, this.z + var3); + } + + public final float distanceSquared(Vector3D var1) { + float var2 = var1.x - this.x; + float var3 = var1.y - this.y; + float var4 = var1.z - this.z; + return MathHelper.sqrt(var2 * var2 + var3 * var3 + var4 * var4); + } + + public final float distance(Vector3D var1) { + float var2 = var1.x - this.x; + float var3 = var1.y - this.y; + float var4 = var1.z - this.z; + return var2 * var2 + var3 * var3 + var4 * var4; + } + + public final Vector3D getXIntersection(Vector3D var1, float var2) { + float var3 = var1.x - this.x; + float var4 = var1.y - this.y; + float var5 = var1.z - this.z; + return var3 * var3 < 1.0E-7F?null:((var2 = (var2 - this.x) / var3) >= 0.0F && var2 <= 1.0F?new Vector3D(this.x + var3 * var2, this.y + var4 * var2, this.z + var5 * var2):null); + } + + public final Vector3D getYIntersection(Vector3D var1, float var2) { + float var3 = var1.x - this.x; + float var4 = var1.y - this.y; + float var5 = var1.z - this.z; + return var4 * var4 < 1.0E-7F?null:((var2 = (var2 - this.y) / var4) >= 0.0F && var2 <= 1.0F?new Vector3D(this.x + var3 * var2, this.y + var4 * var2, this.z + var5 * var2):null); + } + + public final Vector3D getZIntersection(Vector3D var1, float var2) { + float var3 = var1.x - this.x; + float var4 = var1.y - this.y; + float var5; + return (var5 = var1.z - this.z) * var5 < 1.0E-7F?null:((var2 = (var2 - this.z) / var5) >= 0.0F && var2 <= 1.0F?new Vector3D(this.x + var3 * var2, this.y + var4 * var2, this.z + var5 * var2):null); + } + + public final String toString() { + return "(" + this.x + ", " + this.y + ", " + this.z + ")"; + } +} diff --git a/src/com/mojang/minecraft/net/PacketType.java b/src/com/mojang/minecraft/net/PacketType.java new file mode 100644 index 0000000..c08d7fc --- /dev/null +++ b/src/com/mojang/minecraft/net/PacketType.java @@ -0,0 +1,60 @@ +package com.mojang.minecraft.net; + + +public final class PacketType { + + public static final PacketType[] packets = new PacketType[256]; + public static final PacketType INDENTIFICATION = new PacketType(new Class[]{Byte.TYPE, String.class, String.class, Byte.TYPE}); + public static final PacketType PING = new PacketType(new Class[0]); + public static final PacketType LEVEL_INITIALIZE = new PacketType(new Class[0]); + public static final PacketType LEVEL_DATA_CHUNK = new PacketType(new Class[]{Short.TYPE, byte[].class, Byte.TYPE}); + public static final PacketType LEVEL_FINALIZE = new PacketType(new Class[]{Short.TYPE, Short.TYPE, Short.TYPE}); + public static final PacketType PLAYER_SET_BLOCK = new PacketType(new Class[]{Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE, Byte.TYPE}); + public static final PacketType BLOCK_CHANGE = new PacketType(new Class[]{Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE}); + public static final PacketType SPAWN_PLAYER = new PacketType(new Class[]{Byte.TYPE, String.class, Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE, Byte.TYPE}); + public static final PacketType POSITION_ROTATION = new PacketType(new Class[]{Byte.TYPE, Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE, Byte.TYPE}); + public static final PacketType POSITION_ROTATION_UPDATE = new PacketType(new Class[]{Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE}); + public static final PacketType POSITION_UPDATE = new PacketType(new Class[]{Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE}); + public static final PacketType ROTATION_UPDATE = new PacketType(new Class[]{Byte.TYPE, Byte.TYPE, Byte.TYPE}); + public static final PacketType DESPAWN_PLAYER = new PacketType(new Class[]{Byte.TYPE}); + public static final PacketType CHAT_MESSAGE = new PacketType(new Class[]{Byte.TYPE, String.class}); + public static final PacketType DISCONNECT = new PacketType(new Class[]{String.class}); + public static final PacketType UPDATE_PLAYER_TYPE = new PacketType(new Class[]{Byte.TYPE}); + public final int length; + private static int nextOpcode = 0; + public final byte opCode; + public Class[] params; + + + private PacketType(Class ... var1) { + this.opCode = (byte)(nextOpcode++); + packets[this.opCode] = this; + this.params = new Class[var1.length]; + int var2 = 0; + + for(int var3 = 0; var3 < var1.length; ++var3) { + Class var4 = var1[var3]; + this.params[var3] = var4; + if(var4 == Long.TYPE) { + var2 += 8; + } else if(var4 == Integer.TYPE) { + var2 += 4; + } else if(var4 == Short.TYPE) { + var2 += 2; + } else if(var4 == Byte.TYPE) { + ++var2; + } else if(var4 == Float.TYPE) { + var2 += 4; + } else if(var4 == Double.TYPE) { + var2 += 8; + } else if(var4 == byte[].class) { + var2 += 1024; + } else if(var4 == String.class) { + var2 += 64; + } + } + + this.length = var2; + } + +} diff --git a/src/com/mojang/minecraft/net/UNKNOWN0.java b/src/com/mojang/minecraft/net/UNKNOWN0.java new file mode 100644 index 0000000..ddbe8ba --- /dev/null +++ b/src/com/mojang/minecraft/net/UNKNOWN0.java @@ -0,0 +1,5 @@ +package com.mojang.minecraft.net; + + +public final class UNKNOWN0 { +} diff --git a/src/com/mojang/minecraft/phys/AABB.java b/src/com/mojang/minecraft/phys/AABB.java new file mode 100644 index 0000000..f26ac29 --- /dev/null +++ b/src/com/mojang/minecraft/phys/AABB.java @@ -0,0 +1,308 @@ +package com.mojang.minecraft.phys; + +import com.mojang.minecraft.Vector3DCreator; +import com.mojang.minecraft.model.Vector3D; +import java.io.Serializable; + +public class AABB implements Serializable { + + public static final long serialVersionUID = 0L; + private float epsilon = 0.0F; + public float x0; + public float y0; + public float z0; + public float x1; + public float y1; + public float z1; + + + public AABB(float var1, float var2, float var3, float var4, float var5, float var6) { + this.x0 = var1; + this.y0 = var2; + this.z0 = var3; + this.x1 = var4; + this.y1 = var5; + this.z1 = var6; + } + + public AABB expand(float var1, float var2, float var3) { + float var4 = this.x0; + float var5 = this.y0; + float var6 = this.z0; + float var7 = this.x1; + float var8 = this.y1; + float var9 = this.z1; + if(var1 < 0.0F) { + var4 += var1; + } + + if(var1 > 0.0F) { + var7 += var1; + } + + if(var2 < 0.0F) { + var5 += var2; + } + + if(var2 > 0.0F) { + var8 += var2; + } + + if(var3 < 0.0F) { + var6 += var3; + } + + if(var3 > 0.0F) { + var9 += var3; + } + + return new AABB(var4, var5, var6, var7, var8, var9); + } + + public AABB grow(float var1, float var2, float var3) { + float var4 = this.x0 - var1; + float var5 = this.y0 - var2; + float var6 = this.z0 - var3; + var1 += this.x1; + var2 += this.y1; + float var7 = this.z1 + var3; + return new AABB(var4, var5, var6, var1, var2, var7); + } + + public AABB cloneMove(float var1, float var2, float var3) { + return new AABB(this.x0 + var3, this.y0 + var2, this.z0 + var3, this.x1 + var1, this.y1 + var2, this.z1 + var3); + } + + public float clipXCollide(AABB var1, float var2) { + if(var1.y1 > this.y0 && var1.y0 < this.y1) { + if(var1.z1 > this.z0 && var1.z0 < this.z1) { + float var3; + if(var2 > 0.0F && var1.x1 <= this.x0 && (var3 = this.x0 - var1.x1 - this.epsilon) < var2) { + var2 = var3; + } + + if(var2 < 0.0F && var1.x0 >= this.x1 && (var3 = this.x1 - var1.x0 + this.epsilon) > var2) { + var2 = var3; + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public float clipYCollide(AABB var1, float var2) { + if(var1.x1 > this.x0 && var1.x0 < this.x1) { + if(var1.z1 > this.z0 && var1.z0 < this.z1) { + float var3; + if(var2 > 0.0F && var1.y1 <= this.y0 && (var3 = this.y0 - var1.y1 - this.epsilon) < var2) { + var2 = var3; + } + + if(var2 < 0.0F && var1.y0 >= this.y1 && (var3 = this.y1 - var1.y0 + this.epsilon) > var2) { + var2 = var3; + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public float clipZCollide(AABB var1, float var2) { + if(var1.x1 > this.x0 && var1.x0 < this.x1) { + if(var1.y1 > this.y0 && var1.y0 < this.y1) { + float var3; + if(var2 > 0.0F && var1.z1 <= this.z0 && (var3 = this.z0 - var1.z1 - this.epsilon) < var2) { + var2 = var3; + } + + if(var2 < 0.0F && var1.z0 >= this.z1 && (var3 = this.z1 - var1.z0 + this.epsilon) > var2) { + var2 = var3; + } + + return var2; + } else { + return var2; + } + } else { + return var2; + } + } + + public boolean intersects(AABB var1) { + return var1.x1 > this.x0 && var1.x0 < this.x1?(var1.y1 > this.y0 && var1.y0 < this.y1?var1.z1 > this.z0 && var1.z0 < this.z1:false):false; + } + + public boolean intersectsInner(AABB var1) { + return var1.x1 >= this.x0 && var1.x0 <= this.x1?(var1.y1 >= this.y0 && var1.y0 <= this.y1?var1.z1 >= this.z0 && var1.z0 <= this.z1:false):false; + } + + public void move(float var1, float var2, float var3) { + this.x0 += var1; + this.y0 += var2; + this.z0 += var3; + this.x1 += var1; + this.y1 += var2; + this.z1 += var3; + } + + public boolean intersects(float var1, float var2, float var3, float var4, float var5, float var6) { + return var4 > this.x0 && var1 < this.x1?(var5 > this.y0 && var2 < this.y1?var6 > this.z0 && var3 < this.z1:false):false; + } + + public boolean contains(Vector3D var1) { + return var1.x > this.x0 && var1.x < this.x1?(var1.y > this.y0 && var1.y < this.y1?var1.z > this.z0 && var1.z < this.z1:false):false; + } + + public float getSize() { + float var1 = this.x1 - this.x0; + float var2 = this.y1 - this.y0; + float var3 = this.z1 - this.z0; + return (var1 + var2 + var3) / 3.0F; + } + + public AABB shrink(float var1, float var2, float var3) { + float var4 = this.x0; + float var5 = this.y0; + float var6 = this.z0; + float var7 = this.x1; + float var8 = this.y1; + float var9 = this.z1; + if(var1 < 0.0F) { + var4 -= var1; + } + + if(var1 > 0.0F) { + var7 -= var1; + } + + if(var2 < 0.0F) { + var5 -= var2; + } + + if(var2 > 0.0F) { + var8 -= var2; + } + + if(var3 < 0.0F) { + var6 -= var3; + } + + if(var3 > 0.0F) { + var9 -= var3; + } + + return new AABB(var4, var5, var6, var7, var8, var9); + } + + public AABB copy() { + return new AABB(this.x0, this.y0, this.z0, this.x1, this.y1, this.z1); + } + + public Vector3DCreator clip(Vector3D var1, Vector3D var2) { + Vector3D var3 = var1.getXIntersection(var2, this.x0); + Vector3D var4 = var1.getXIntersection(var2, this.x1); + Vector3D var5 = var1.getYIntersection(var2, this.y0); + Vector3D var6 = var1.getYIntersection(var2, this.y1); + Vector3D var7 = var1.getZIntersection(var2, this.z0); + var2 = var1.getZIntersection(var2, this.z1); + if(!this.a(var3)) { + var3 = null; + } + + if(!this.a(var4)) { + var4 = null; + } + + if(!this.b(var5)) { + var5 = null; + } + + if(!this.b(var6)) { + var6 = null; + } + + if(!this.c(var7)) { + var7 = null; + } + + if(!this.c(var2)) { + var2 = null; + } + + Vector3D var8 = null; + if(var3 != null) { + var8 = var3; + } + + if(var4 != null && (var8 == null || var1.distance(var4) < var1.distance(var8))) { + var8 = var4; + } + + if(var5 != null && (var8 == null || var1.distance(var5) < var1.distance(var8))) { + var8 = var5; + } + + if(var6 != null && (var8 == null || var1.distance(var6) < var1.distance(var8))) { + var8 = var6; + } + + if(var7 != null && (var8 == null || var1.distance(var7) < var1.distance(var8))) { + var8 = var7; + } + + if(var2 != null && (var8 == null || var1.distance(var2) < var1.distance(var8))) { + var8 = var2; + } + + if(var8 == null) { + return null; + } else { + byte var9 = -1; + if(var8 == var3) { + var9 = 4; + } + + if(var8 == var4) { + var9 = 5; + } + + if(var8 == var5) { + var9 = 0; + } + + if(var8 == var6) { + var9 = 1; + } + + if(var8 == var7) { + var9 = 2; + } + + if(var8 == var2) { + var9 = 3; + } + + return new Vector3DCreator(0, 0, 0, var9, var8); + } + } + + private boolean a(Vector3D var1) { + return var1 == null?false:var1.y >= this.y0 && var1.y <= this.y1 && var1.z >= this.z0 && var1.z <= this.z1; + } + + private boolean b(Vector3D var1) { + return var1 == null?false:var1.x >= this.x0 && var1.x <= this.x1 && var1.z >= this.z0 && var1.z <= this.z1; + } + + private boolean c(Vector3D var1) { + return var1 == null?false:var1.x >= this.x0 && var1.x <= this.x1 && var1.y >= this.y0 && var1.y <= this.y1; + } +} diff --git a/src/com/mojang/minecraft/render/Frustrum.java b/src/com/mojang/minecraft/render/Frustrum.java new file mode 100644 index 0000000..aa4ca35 --- /dev/null +++ b/src/com/mojang/minecraft/render/Frustrum.java @@ -0,0 +1,18 @@ +package com.mojang.minecraft.render; + + +public final class Frustrum { + + public float[][] frustrum = new float[16][16]; + + + public final boolean isBoxInFrustrum(float var1, float var2, float var3, float var4, float var5, float var6) { + for(int var7 = 0; var7 < 6; ++var7) { + if(this.frustrum[var7][0] * var1 + this.frustrum[var7][1] * var2 + this.frustrum[var7][2] * var3 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var4 + this.frustrum[var7][1] * var2 + this.frustrum[var7][2] * var3 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var1 + this.frustrum[var7][1] * var5 + this.frustrum[var7][2] * var3 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var4 + this.frustrum[var7][1] * var5 + this.frustrum[var7][2] * var3 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var1 + this.frustrum[var7][1] * var2 + this.frustrum[var7][2] * var6 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var4 + this.frustrum[var7][1] * var2 + this.frustrum[var7][2] * var6 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var1 + this.frustrum[var7][1] * var5 + this.frustrum[var7][2] * var6 + this.frustrum[var7][3] <= 0.0F && this.frustrum[var7][0] * var4 + this.frustrum[var7][1] * var5 + this.frustrum[var7][2] * var6 + this.frustrum[var7][3] <= 0.0F) { + return false; + } + } + + return true; + } +} diff --git a/src/com/mojang/minecraft/render/UNKNOWN0.java b/src/com/mojang/minecraft/render/UNKNOWN0.java new file mode 100644 index 0000000..29c737c --- /dev/null +++ b/src/com/mojang/minecraft/render/UNKNOWN0.java @@ -0,0 +1,5 @@ +package com.mojang.minecraft.render; + + +public interface UNKNOWN0 { +} diff --git a/src/com/mojang/minecraft/server/ConsoleInput.java b/src/com/mojang/minecraft/server/ConsoleInput.java new file mode 100644 index 0000000..d0b9537 --- /dev/null +++ b/src/com/mojang/minecraft/server/ConsoleInput.java @@ -0,0 +1,36 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.server.MinecraftServer; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +final class ConsoleInput extends Thread { + + // $FF: synthetic field + private MinecraftServer server; + + + ConsoleInput(MinecraftServer var1) { + this.server = var1; + super(); + } + + public final void run() { + try { + BufferedReader var1 = new BufferedReader(new InputStreamReader(System.in)); + String var2 = null; + + while((var2 = var1.readLine()) != null) { + synchronized(MinecraftServer.a(this.server)) { + MinecraftServer.a(this.server).add(var2); + } + } + + MinecraftServer.logger.warning("stdin: end of file! No more direct console input is possible."); + } catch (IOException var5) { + MinecraftServer.logger.warning("stdin: ioexception! No more direct console input is possible."); + var5.printStackTrace(); + } + } +} diff --git a/src/com/mojang/minecraft/server/HeartbeatManager.java b/src/com/mojang/minecraft/server/HeartbeatManager.java new file mode 100644 index 0000000..329c9cc --- /dev/null +++ b/src/com/mojang/minecraft/server/HeartbeatManager.java @@ -0,0 +1,67 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.server.MinecraftServer; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.FileWriter; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.URL; + +final class HeartbeatManager extends Thread { + + // $FF: synthetic field + private String name; + // $FF: synthetic field + private MinecraftServer server; + + + HeartbeatManager(MinecraftServer var1, String var2) { + this.server = var1; + this.name = var2; + super(); + } + + public final void run() { + HttpURLConnection var1 = null; + + try { + (var1 = (HttpURLConnection)(new URL("http://www.minecraft.net/heartbeat.jsp")).openConnection()).setRequestMethod("POST"); + var1.setDoOutput(true); + var1.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + var1.setRequestProperty("Content-Length", "" + Integer.toString(this.name.getBytes().length)); + var1.setRequestProperty("Content-Language", "en-US"); + var1.setUseCaches(false); + var1.setDoInput(true); + var1.setDoOutput(true); + var1.connect(); + DataOutputStream var2; + (var2 = new DataOutputStream(var1.getOutputStream())).writeBytes(this.name); + var2.flush(); + var2.close(); + BufferedReader var9; + String var3 = (var9 = new BufferedReader(new InputStreamReader(var1.getInputStream()))).readLine(); + if(!MinecraftServer.b(this.server).equals(var3)) { + MinecraftServer.logger.info("To connect directly to this server, surf to: " + var3); + PrintWriter var4; + (var4 = new PrintWriter(new FileWriter("externalurl.txt"))).println(var3); + var4.close(); + MinecraftServer.logger.info("(This is also in externalurl.txt)"); + MinecraftServer.a(this.server, var3); + } + + var9.close(); + return; + } catch (Exception var7) { + MinecraftServer.logger.severe("Failed to assemble heartbeat: " + var7); + var7.printStackTrace(); + } finally { + if(var1 != null) { + var1.disconnect(); + } + + } + + } +} diff --git a/src/com/mojang/minecraft/server/LevelSaver.java b/src/com/mojang/minecraft/server/LevelSaver.java new file mode 100644 index 0000000..75fb6fa --- /dev/null +++ b/src/com/mojang/minecraft/server/LevelSaver.java @@ -0,0 +1,44 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.server.NetworkManager; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.zip.GZIPOutputStream; + +final class LevelSaver extends Thread { + + // $FF: synthetic field + private byte[] bytes; + // $FF: synthetic field + private NetworkManager networkManager; + + + LevelSaver(NetworkManager var1, byte[] var2) { + this.networkManager = var1; + this.bytes = var2; + super(); + } + + public final void run() { + try { + ByteArrayOutputStream var1 = new ByteArrayOutputStream(); + Thread.sleep(500L); + ByteArrayOutputStream var2 = var1; + byte[] var3 = this.bytes; + + try { + DataOutputStream var6; + (var6 = new DataOutputStream(new GZIPOutputStream(var2))).writeInt(var3.length); + var6.write(var3); + var6.close(); + } catch (Exception var4) { + throw new RuntimeException(var4); + } + + Thread.sleep(500L); + this.networkManager.a(var1.toByteArray()); + } catch (InterruptedException var5) { + ; + } + } +} diff --git a/src/com/mojang/minecraft/server/LogFormatter.java b/src/com/mojang/minecraft/server/LogFormatter.java new file mode 100644 index 0000000..494fdc9 --- /dev/null +++ b/src/com/mojang/minecraft/server/LogFormatter.java @@ -0,0 +1,23 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.server.MinecraftServer; +import java.util.logging.Formatter; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +final class LogFormatter extends Formatter { + + public final String format(LogRecord var1) { + Level var3 = var1.getLevel(); + String var2 = " "; + if(var3 == Level.WARNING) { + var2 = " !"; + } + + if(var3 == Level.SEVERE) { + var2 = "***"; + } + + return var2 + " " + MinecraftServer.dateFormat.format(Long.valueOf(var1.getMillis())) + " " + var1.getMessage() + "\n"; + } +} diff --git a/src/com/mojang/minecraft/server/LogHandler.java b/src/com/mojang/minecraft/server/LogHandler.java new file mode 100644 index 0000000..854f050 --- /dev/null +++ b/src/com/mojang/minecraft/server/LogHandler.java @@ -0,0 +1,18 @@ +package com.mojang.minecraft.server; + +import java.io.OutputStream; +import java.util.logging.Formatter; +import java.util.logging.LogRecord; +import java.util.logging.StreamHandler; + +final class LogHandler extends StreamHandler { + + LogHandler(OutputStream var1, Formatter var2) { + super(var1, var2); + } + + public final synchronized void publish(LogRecord var1) { + super.publish(var1); + this.flush(); + } +} diff --git a/src/com/mojang/minecraft/server/MinecraftServer.java b/src/com/mojang/minecraft/server/MinecraftServer.java new file mode 100644 index 0000000..ab66368 --- /dev/null +++ b/src/com/mojang/minecraft/server/MinecraftServer.java @@ -0,0 +1,741 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.level.LevelIO; +import com.mojang.minecraft.level.generator.LevelGenerator; +import com.mojang.minecraft.net.PacketType; +import com.mojang.minecraft.server.ConsoleInput; +import com.mojang.minecraft.server.HeartbeatManager; +import com.mojang.minecraft.server.LogFormatter; +import com.mojang.minecraft.server.LogHandler; +import com.mojang.minecraft.server.NetworkManager; +import com.mojang.minecraft.server.PlayerManager; +import com.mojang.minecraft.server.SaltGenerator; +import com.mojang.minecraft.server.UNKNOWN0; +import com.mojang.net.BindTo; +import com.mojang.net.NetworkHandler; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.channels.SocketChannel; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Random; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class MinecraftServer implements Runnable { + + static Logger logger = Logger.getLogger("MinecraftServer"); + static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + private BindTo bindTo; + private Map m = new HashMap(); + private List n = new ArrayList(); + private List o = new ArrayList(); + private int maxPlayers; + private Properties properties = new Properties(); + public com.mojang.minecraft.level.Level mainLevel; + private boolean public_ = false; + public String serverName; + public String MOTD; + private int port; + public boolean adminSlot; + private NetworkManager[] networkManager; + public PlayerManager playerManager1 = new PlayerManager("Admins", new File("admins.txt")); + public PlayerManager playerManager2 = new PlayerManager("Banned", new File("banned.txt")); + private PlayerManager playerManager3 = new PlayerManager("Banned (IP)", new File("banned-ip.txt")); + public PlayerManager playerManager4 = new PlayerManager("Players", new File("players.txt")); + private List v = new ArrayList(); + private String salt = "" + (new Random()).nextLong(); + private String x = ""; + public SaltGenerator saltGenerator; + public boolean verifyNames; + private boolean growTrees; + private int maxConnections; + + + public MinecraftServer() { + this.saltGenerator = new SaltGenerator(this.salt); + this.verifyNames = false; + this.growTrees = false; + + try { + this.properties.load(new FileReader("server.properties")); + } catch (Exception var4) { + logger.warning("Failed to load server.properties!"); + } + + try { + this.serverName = this.properties.getProperty("server-name", "Minecraft Server"); + this.MOTD = this.properties.getProperty("motd", "Welcome to my Minecraft Server!"); + this.port = Integer.parseInt(this.properties.getProperty("port", "25565")); + this.maxPlayers = Integer.parseInt(this.properties.getProperty("max-players", "16")); + this.public_ = Boolean.parseBoolean(this.properties.getProperty("public", "true")); + this.verifyNames = Boolean.parseBoolean(this.properties.getProperty("verify-names", "true")); + this.growTrees = Boolean.parseBoolean(this.properties.getProperty("grow-trees", "false")); + this.adminSlot = Boolean.parseBoolean(this.properties.getProperty("admin-slot", "false")); + if(this.maxPlayers < 1) { + this.maxPlayers = 1; + } + + if(this.maxPlayers > 32) { + this.maxPlayers = 32; + } + + this.maxConnections = Integer.parseInt(this.properties.getProperty("max-connections", "3")); + this.properties.setProperty("server-name", this.serverName); + this.properties.setProperty("motd", this.MOTD); + this.properties.setProperty("max-players", "" + this.maxPlayers); + this.properties.setProperty("port", "" + this.port); + this.properties.setProperty("public", "" + this.public_); + this.properties.setProperty("verify-names", "" + this.verifyNames); + this.properties.setProperty("max-connections", "3"); + this.properties.setProperty("grow-trees", "" + this.growTrees); + this.properties.setProperty("admin-slot", "" + this.adminSlot); + } catch (Exception var3) { + var3.printStackTrace(); + logger.warning("server.properties is broken! Delete it or fix it!"); + System.exit(0); + } + + if(!this.verifyNames) { + logger.warning("######################### WARNING #########################"); + logger.warning("verify-names is set to false! This means that anyone who"); + logger.warning("connects to this server can choose any username he or she"); + logger.warning("wants! This includes impersonating an OP!"); + if(this.public_) { + logger.warning(""); + logger.warning("AND SINCE THIS IS A PUBLIC SERVER, IT WILL HAPPEN TO YOU!"); + logger.warning(""); + } + + logger.warning("If you wish to fix this, edit server.properties, and change"); + logger.warning("verify-names to true."); + logger.warning("###########################################################"); + } + + try { + this.properties.store(new FileWriter("server.properties"), "Minecraft server properties"); + } catch (Exception var2) { + logger.warning("Failed to save server.properties!"); + } + + this.networkManager = new NetworkManager[this.maxPlayers]; + this.bindTo = new BindTo(this.port, this); + (new ConsoleInput(this)).start(); + } + + public final void a(NetworkHandler var1) { + NetworkManager var2; + if((var2 = (NetworkManager)this.m.get(var1)) != null) { + this.playerManager4.removePlayer(var2.playerName); + logger.info(var2 + " disconnected"); + this.m.remove(var2.networkHandler); + this.n.remove(var2); + if(var2.playerID >= 0) { + this.networkManager[var2.playerID] = null; + } + + this.a(PacketType.DESPAWN_PLAYER, new Object[]{Integer.valueOf(var2.playerID)}); + } + + } + + private void b(NetworkHandler var1) { + this.o.add(new UNKNOWN0(var1, 100)); + } + + public final void a(NetworkManager var1) { + this.o.add(new UNKNOWN0(var1.networkHandler, 100)); + } + + public static void b(NetworkManager var0) { + var0.networkHandler.close(); + } + + public final void a(PacketType var1, Object ... var2) { + for(int var3 = 0; var3 < this.n.size(); ++var3) { + try { + ((NetworkManager)this.n.get(var3)).b(var1, var2); + } catch (Exception var5) { + ((NetworkManager)this.n.get(var3)).a(var5); + } + } + + } + + public final void a(NetworkManager var1, PacketType var2, Object ... var3) { + for(int var4 = 0; var4 < this.n.size(); ++var4) { + if(this.n.get(var4) != var1) { + try { + ((NetworkManager)this.n.get(var4)).b(var2, var3); + } catch (Exception var6) { + ((NetworkManager)this.n.get(var4)).a(var6); + } + } + } + + } + + public void run() { + logger.info("Now accepting input on " + this.port); + int var1 = 50000000; + int var2 = 500000000; + + try { + long var3 = System.nanoTime(); + long var5 = System.nanoTime(); + int var7 = 0; + + while(true) { + this.d(); + + for(; System.nanoTime() - var5 > (long)var1; ++var7) { + var5 += (long)var1; + this.c(); + if(var7 % 1200 == 0) { + MinecraftServer var8 = this; + + try { + new LevelIO(var8); + LevelIO.save(var8.mainLevel, new FileOutputStream("server_level.dat")); + } catch (Exception var11) { + logger.severe("Failed to save the level! " + var11); + } + + logger.info("Level saved! Load: " + this.n.size() + "/" + this.maxPlayers); + } + + if(var7 % 900 == 0) { + HashMap var9; + (var9 = new HashMap()).put("name", this.serverName); + var9.put("users", Integer.valueOf(this.n.size())); + var9.put("max", Integer.valueOf(this.maxPlayers - (this.adminSlot?1:0))); + var9.put("public", Boolean.valueOf(this.public_)); + var9.put("port", Integer.valueOf(this.port)); + var9.put("salt", this.salt); + var9.put("admin-slot", Boolean.valueOf(this.adminSlot)); + var9.put("version", Byte.valueOf((byte)7)); + String var13 = a((Map)var9); + (new HeartbeatManager(this, var13)).start(); + } + } + + while(System.nanoTime() - var3 > (long)var2) { + var3 += (long)var2; + this.a(PacketType.PING, new Object[0]); + } + + Thread.sleep(5L); + } + } catch (Exception var12) { + logger.log(Level.SEVERE, "Error in main loop, server shutting down!", var12); + var12.printStackTrace(); + } + } + + private static String a(Map var0) { + try { + String var1 = ""; + + String var3; + for(Iterator var2 = var0.keySet().iterator(); var2.hasNext(); var1 = var1 + var3 + "=" + URLEncoder.encode(var0.get(var3).toString(), "UTF-8")) { + var3 = (String)var2.next(); + if(var1 != "") { + var1 = var1 + "&"; + } + } + + return var1; + } catch (Exception var4) { + var4.printStackTrace(); + throw new RuntimeException("Failed to assemble heartbeat! This is pretty fatal"); + } + } + + private void c() { + Iterator var1 = this.n.iterator(); + + while(var1.hasNext()) { + NetworkManager var2 = (NetworkManager)var1.next(); + + try { + var2.a(); + } catch (Exception var8) { + var2.a(var8); + } + } + + this.mainLevel.tick(); + + for(int var9 = 0; var9 < this.o.size(); ++var9) { + UNKNOWN0 var10 = (UNKNOWN0)this.o.get(var9); + this.a(var10.networkHandler); + + try { + NetworkHandler var3 = var10.networkHandler; + + try { + if(var3.out.position() > 0) { + var3.out.flip(); + var3.channel.write(var3.out); + var3.out.compact(); + } + } catch (IOException var6) { + ; + } + + if(var10.b-- <= 0) { + try { + var10.networkHandler.close(); + } catch (Exception var5) { + ; + } + + this.o.remove(var9--); + } + } catch (Exception var7) { + try { + var10.networkHandler.close(); + } catch (Exception var4) { + ; + } + } + } + + } + + public final void a(String var1) { + logger.info(var1); + } + + public final void b(String var1) { + logger.fine(var1); + } + + private void d() { + List var1 = this.v; + synchronized(this.v) { + while(this.v.size() > 0) { + this.a((NetworkManager)null, (String)this.v.remove(0)); + } + } + + try { + BindTo var13 = this.bindTo; + + SocketChannel var14; + while((var14 = var13.serverChannel.accept()) != null) { + try { + var14.configureBlocking(false); + NetworkHandler var2 = new NetworkHandler(var14); + var13.c.add(var2); + NetworkHandler var3 = var2; + MinecraftServer var4 = var13.server; + if(var13.server.playerManager3.containsPlayer(var2.address)) { + var2.send(PacketType.DISCONNECT, new Object[]{"You\'re banned!"}); + logger.info(var2.address + " tried to connect, but is banned."); + var4.b(var2); + } else { + int var5 = 0; + Iterator var6 = var4.n.iterator(); + + while(var6.hasNext()) { + if(((NetworkManager)var6.next()).networkHandler.address.equals(var3.address)) { + ++var5; + } + } + + if(var5 >= var4.maxConnections) { + var3.send(PacketType.DISCONNECT, new Object[]{"Too many connection!"}); + logger.info(var3.address + " tried to connect, but is already connected " + var5 + " times."); + var4.b(var3); + } else { + int var24; + if((var24 = var4.e()) < 0) { + var3.send(PacketType.DISCONNECT, new Object[]{"The server is full!"}); + logger.info(var3.address + " tried to connect, but failed because the server was full."); + var4.b(var3); + } else { + NetworkManager var16 = new NetworkManager(var4, var3, var24); + logger.info(var16 + " connected"); + var4.m.put(var3, var16); + var4.n.add(var16); + if(var16.playerID >= 0) { + var4.networkManager[var16.playerID] = var16; + } + } + } + } + } catch (IOException var10) { + var14.close(); + throw var10; + } + } + + for(int var17 = 0; var17 < var13.c.size(); ++var17) { + NetworkHandler var15 = (NetworkHandler)var13.c.get(var17); + + try { + NetworkHandler var20 = var15; + var15.channel.read(var15.in); + int var19 = 0; + + while(var20.in.position() > 0 && var19++ != 100) { + var20.in.flip(); + byte var22 = var20.in.get(0); + PacketType var25; + if((var25 = PacketType.packets[var22]) == null) { + throw new IOException("Bad command: " + var22); + } + + if(var20.in.remaining() < var25.length + 1) { + var20.in.compact(); + break; + } + + var20.in.get(); + Object[] var21 = new Object[var25.params.length]; + + for(int var7 = 0; var7 < var21.length; ++var7) { + var21[var7] = var20.receive(var25.params[var7]); + } + + var20.networkManager.a(var25, var21); + if(!var20.connected) { + break; + } + + var20.in.compact(); + } + + if(var20.out.position() > 0) { + var20.out.flip(); + var20.channel.write(var20.out); + var20.out.compact(); + } + } catch (Exception var9) { + MinecraftServer var10001 = var13.server; + NetworkManager var23; + if((var23 = (NetworkManager)var13.server.m.get(var15)) != null) { + var23.a(var9); + } + } + + try { + if(!var15.connected) { + var15.close(); + var13.server.a(var15); + var13.c.remove(var17--); + } + } catch (Exception var8) { + var8.printStackTrace(); + } + } + + } catch (IOException var11) { + throw new RuntimeException("IOException while ticking socketserver", var11); + } + } + + public final void a(NetworkManager var1, String var2) { + while(var2.startsWith("/")) { + var2 = var2.substring(1); + } + + logger.info((var1 == null?"[console]":var1.playerName) + " admins: " + var2); + String[] var3; + if((var3 = var2.split(" "))[0].toLowerCase().equals("ban") && var3.length > 1) { + this.e(var3[1]); + } else if(var3[0].toLowerCase().equals("kick") && var3.length > 1) { + this.d(var3[1]); + } else if(var3[0].toLowerCase().equals("banip") && var3.length > 1) { + this.h(var3[1]); + } else if(var3[0].toLowerCase().equals("unban") && var3.length > 1) { + String var5 = var3[1]; + this.playerManager2.removePlayer(var5); + } else if(var3[0].toLowerCase().equals("op") && var3.length > 1) { + this.f(var3[1]); + } else if(var3[0].toLowerCase().equals("deop") && var3.length > 1) { + this.g(var3[1]); + } else if(var3[0].toLowerCase().equals("setspawn")) { + if(var1 != null) { + this.mainLevel.setSpawnPos(var1.xSpawn / 32, var1.ySpawn / 32, var1.zSpawn / 32, (float)(var1.yawSpawn * 320 / 256)); + } else { + logger.info("Can\'t set spawn from console!"); + } + } else { + if(var3[0].toLowerCase().equals("solid")) { + if(var1 != null) { + var1.i = !var1.i; + if(var1.i) { + var1.b("Now placing unbreakable stone"); + return; + } + + var1.b("Now placing normal stone"); + return; + } + } else { + if(var3[0].toLowerCase().equals("broadcast") && var3.length > 1) { + this.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var2.substring("broadcast ".length()).trim()}); + return; + } + + if(var3[0].toLowerCase().equals("say") && var3.length > 1) { + this.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var2.substring("say ".length()).trim()}); + return; + } + + if((var3[0].toLowerCase().equals("teleport") || var3[0].toLowerCase().equals("tp")) && var3.length > 1) { + if(var1 == null) { + logger.info("Can\'t teleport from console!"); + return; + } + + NetworkManager var4; + if((var4 = this.c(var3[1])) == null) { + var1.b(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), "No such player"}); + return; + } + + var1.networkHandler.send(PacketType.POSITION_ROTATION, new Object[]{Integer.valueOf(-1), Integer.valueOf(var4.xSpawn), Integer.valueOf(var4.ySpawn), Integer.valueOf(var4.zSpawn), Integer.valueOf(var4.yawSpawn), Integer.valueOf(var4.pitchSpawn)}); + } else if(var1 != null) { + var1.b(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), "Unknown command!"}); + } + } + + } + } + + public final void a(int var1, int var2, int var3) { + this.a(PacketType.BLOCK_CHANGE, new Object[]{Integer.valueOf(var1), Integer.valueOf(var2), Integer.valueOf(var3), Integer.valueOf(this.mainLevel.getTile(var1, var2, var3))}); + } + + public final int a() { + int var1 = 0; + + for(int var2 = 0; var2 < this.maxPlayers; ++var2) { + if(this.networkManager[var2] == null) { + ++var1; + } + } + + return var1; + } + + private int e() { + for(int var1 = 0; var1 < this.maxPlayers; ++var1) { + if(this.networkManager[var1] == null) { + return var1; + } + } + + return -1; + } + + public final List b() { + return this.n; + } + + private void d(String var1) { + boolean var2 = false; + Iterator var3 = this.n.iterator(); + + while(var3.hasNext()) { + NetworkManager var4; + if((var4 = (NetworkManager)var3.next()).playerName.equalsIgnoreCase(var1)) { + var2 = true; + var4.a("You were kicked"); + } + } + + if(var2) { + this.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var1 + " got kicked from the server!"}); + } + + } + + private void e(String var1) { + this.playerManager2.addPlayer(var1); + boolean var2 = false; + Iterator var3 = this.n.iterator(); + + while(var3.hasNext()) { + NetworkManager var4; + if((var4 = (NetworkManager)var3.next()).playerName.equalsIgnoreCase(var1)) { + var2 = true; + var4.a("You were banned"); + } + } + + if(var2) { + this.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var1 + " got banned!"}); + } + + } + + private void f(String var1) { + this.playerManager1.addPlayer(var1); + Iterator var3 = this.n.iterator(); + + while(var3.hasNext()) { + NetworkManager var2; + if((var2 = (NetworkManager)var3.next()).playerName.equalsIgnoreCase(var1)) { + var2.b("You\'re now op!"); + var2.b(PacketType.UPDATE_PLAYER_TYPE, new Object[]{Integer.valueOf(100)}); + } + } + + } + + private void g(String var1) { + this.playerManager1.removePlayer(var1); + Iterator var3 = this.n.iterator(); + + while(var3.hasNext()) { + NetworkManager var2; + if((var2 = (NetworkManager)var3.next()).playerName.equalsIgnoreCase(var1)) { + var2.i = false; + var2.b("You\'re no longer op!"); + var2.b(PacketType.UPDATE_PLAYER_TYPE, new Object[]{Integer.valueOf(0)}); + } + } + + } + + private void h(String var1) { + boolean var2 = false; + String var3 = ""; + Iterator var4 = this.n.iterator(); + + while(var4.hasNext()) { + NetworkManager var5; + NetworkHandler var6; + if(!(var5 = (NetworkManager)var4.next()).playerName.equalsIgnoreCase(var1)) { + var6 = var5.networkHandler; + if(!var5.networkHandler.address.equalsIgnoreCase(var1)) { + var6 = var5.networkHandler; + if(!var5.networkHandler.address.equalsIgnoreCase("/" + var1)) { + continue; + } + } + } + + var6 = var5.networkHandler; + this.playerManager3.addPlayer(var5.networkHandler.address); + var5.a("You were banned"); + if(var3 == "") { + var3 = var3 + ", "; + } + + var3 = var3 + var5.playerName; + var2 = true; + } + + if(var2) { + this.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var3 + " got ip banned!"}); + } + + } + + public final NetworkManager c(String var1) { + Iterator var3 = this.n.iterator(); + + NetworkManager var2; + do { + if(!var3.hasNext()) { + return null; + } + } while(!(var2 = (NetworkManager)var3.next()).playerName.equalsIgnoreCase(var1)); + + return var2; + } + + public static void main(String[] var0) { + try { + MinecraftServer var6; + MinecraftServer var1 = var6 = new MinecraftServer(); + logger.info("Setting up"); + File var2; + if((var2 = new File("server_level.dat")).exists()) { + try { + var1.mainLevel = (new LevelIO(var1)).load(new FileInputStream(var2)); + } catch (Exception var4) { + logger.warning("Failed to load level. Generating a new level"); + var4.printStackTrace(); + } + } else { + logger.warning("No level file found. Generating a new level"); + } + + if(var1.mainLevel == null) { + var1.mainLevel = (new LevelGenerator(var1)).generate("--", 256, 256, 64); + } + + try { + new LevelIO(var1); + LevelIO.save(var1.mainLevel, new FileOutputStream("server_level.dat")); + } catch (Exception var3) { + ; + } + + var1.mainLevel.creativeMode = true; + var1.mainLevel.growTrees = var1.growTrees; + var1.mainLevel.addListener$74652038(var1); + (new Thread(var6)).start(); + } catch (Exception var5) { + logger.severe("Failed to start the server!"); + var5.printStackTrace(); + } + } + + // $FF: synthetic method + static List a(MinecraftServer var0) { + return var0.v; + } + + // $FF: synthetic method + static String b(MinecraftServer var0) { + return var0.x; + } + + // $FF: synthetic method + static String a(MinecraftServer var0, String var1) { + return var0.x = var1; + } + + static { + LogFormatter var0 = new LogFormatter(); + Handler[] var1; + int var2 = (var1 = logger.getParent().getHandlers()).length; + + for(int var3 = 0; var3 < var2; ++var3) { + Handler var4 = var1[var3]; + logger.getParent().removeHandler(var4); + } + + ConsoleHandler var6; + (var6 = new ConsoleHandler()).setFormatter(var0); + logger.addHandler(var6); + + try { + LogHandler var7; + (var7 = new LogHandler(new FileOutputStream("server.log"), var0)).setFormatter(var0); + logger.addHandler(var7); + } catch (Exception var5) { + logger.warning("Failed to open file server.log for writing: " + var5); + } + } +} diff --git a/src/com/mojang/minecraft/server/NetworkManager.java b/src/com/mojang/minecraft/server/NetworkManager.java new file mode 100644 index 0000000..7646031 --- /dev/null +++ b/src/com/mojang/minecraft/server/NetworkManager.java @@ -0,0 +1,385 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.AvailableBlockType; +import com.mojang.minecraft.level.Level; +import com.mojang.minecraft.level.tile.a; +import com.mojang.minecraft.net.PacketType; +import com.mojang.minecraft.server.LevelSaver; +import com.mojang.minecraft.server.MinecraftServer; +import com.mojang.net.NetworkHandler; +import com.mojang.util.MathHelper; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +public final class NetworkManager { + + private static Logger logger = MinecraftServer.logger; + public final NetworkHandler networkHandler; + private final MinecraftServer server; + private boolean l = false; + private boolean m = false; + public String playerName = ""; + public final int playerID; + private ArrayList n = new ArrayList(); + private long time; + private List p = new ArrayList(); + private int timeTillTalk = 0; + public int xSpawn; + public int ySpawn; + public int zSpawn; + public int pitchSpawn; + public int yawSpawn; + private boolean kicked = false; + private int clicks = 0; + private int t = 0; + private volatile byte[] bytes = null; + public boolean i = false; + + + public NetworkManager(MinecraftServer var1, NetworkHandler var2, int var3) { + this.server = var1; + this.networkHandler = var2; + this.playerID = var3; + this.time = System.currentTimeMillis(); + var2.networkManager = this; + Level var4 = var1.mainLevel; + this.xSpawn = (var4.xSpawn << 5) + 16; + this.ySpawn = (var4.ySpawn << 5) + 16; + this.zSpawn = (var4.zSpawn << 5) + 16; + this.yawSpawn = (int)(var4.rotSpawn * 256.0F / 360.0F); + this.pitchSpawn = 0; + } + + public final String toString() { + NetworkHandler var1; + return !this.l?(var1 = this.networkHandler).address:this.playerName + " (" + (var1 = this.networkHandler).address + ")"; + } + + public final void a(PacketType var1, Object[] var2) { + if(!this.kicked) { + if(var1 != PacketType.INDENTIFICATION) { + if(var1 != PacketType.PING) { + if(this.l && this.m) { + if(var1 == PacketType.PLAYER_SET_BLOCK) { + if(this.p.size() > 1200) { + this.d("Too much lag"); + } else { + this.p.add(var2); + } + } else if(var1 == PacketType.CHAT_MESSAGE) { + String var7; + if((var7 = var2[1].toString().trim()).length() > 0) { + this.c(var7); + } + + } else { + if(var1 == PacketType.POSITION_ROTATION) { + if(this.p.size() > 1200) { + this.d("Too much lag"); + return; + } + + this.p.add(var2); + } + + } + } + } + } else { + byte var6 = ((Byte)var2[0]).byteValue(); + String var3 = ((String)var2[1]).trim(); + String var8 = (String)var2[2]; + char[] var4 = var3.toCharArray(); + + for(int var5 = 0; var5 < var4.length; ++var5) { + if(var4[var5] < 32 || var4[var5] > 127) { + this.d("Bad name!"); + return; + } + } + + if(var3.length() < 2 || var3.length() > 16) { + this.a("Illegal name."); + } + + if(this.server.verifyNames && !var8.equals(this.server.saltGenerator.generate(var3))) { + this.a("The name wasn\'t verified by minecraft.net!"); + } else if(var6 != 7) { + this.a("Wrong protocol version."); + } else if(this.server.playerManager2.containsPlayer(var3)) { + this.a("You\'re banned!"); + } else if(this.server.adminSlot && !this.server.playerManager1.containsPlayer(var3) && this.server.a() < 1) { + this.networkHandler.send(PacketType.DISCONNECT, new Object[]{"The server is full!"}); + logger.info(var3 + " connected, but got kicked because the server was almost full and there are reserved admin slots."); + this.server.a(this); + this.kicked = true; + } else { + NetworkManager var11; + if((var11 = this.server.c(var3)) != null) { + var11.a("You logged in from another computer."); + } + + logger.info(this + " logged in as " + var3); + this.l = true; + this.playerName = var3; + this.networkHandler.send(PacketType.INDENTIFICATION, new Object[]{Byte.valueOf((byte)7), this.server.serverName, this.server.MOTD, Integer.valueOf(this.server.playerManager1.containsPlayer(var3)?100:0)}); + Level var9 = this.server.mainLevel; + byte[] var10 = var9.copyBlocks(); + (new LevelSaver(this, var10)).start(); + this.server.playerManager4.addPlayer(var3); + } + } + } + } + + private void c(String var1) { + var1 = var1.trim(); + this.timeTillTalk += var1.length() + 15 << 2; + if(this.timeTillTalk > 600) { + this.timeTillTalk = 760; + this.b(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), "Too much chatter! Muted for eight seconds."}); + logger.info("Muting " + this.playerName + " for chatting too much"); + } else { + char[] var2 = var1.toCharArray(); + + for(int var3 = 0; var3 < var2.length; ++var3) { + if(var2[var3] < 32 || var2[var3] > 127) { + this.d("Bad chat message!"); + return; + } + } + + if(var1.startsWith("/")) { + if(this.server.playerManager1.containsPlayer(this.playerName)) { + this.server.a(this, var1.substring(1)); + } else { + this.b(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), "You\'re not a server admin!"}); + } + } else { + logger.info(this.playerName + " says: " + var1); + this.server.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(this.playerID), this.playerName + ": " + var1}); + } + } + } + + public final void a(String var1) { + this.networkHandler.send(PacketType.DISCONNECT, new Object[]{var1}); + logger.info("Kicking " + this + ": " + var1); + this.server.a(this); + this.kicked = true; + } + + private void d(String var1) { + this.a("Cheat detected: " + var1); + } + + public final void b(String var1) { + this.b(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var1}); + } + + public final void a(byte[] var1) { + this.bytes = var1; + } + + public final void a() { + if(this.clicks >= 2) { + this.clicks -= 2; + } + + if(this.timeTillTalk > 0) { + --this.timeTillTalk; + if(this.timeTillTalk == 600) { + this.b(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), "You can now talk again."}); + this.timeTillTalk = 300; + } + } + + Object[] var2; + boolean var10000; + if(this.p.size() > 0) { + for(boolean var1 = true; this.p.size() > 0 && var1; var1 = var10000) { + byte var3; + byte var4; + short var5; + short var6; + short var13; + byte var10004; + short var10001; + short var10003; + short var10002; + if((var2 = (Object[])this.p.remove(0))[0] instanceof Short) { + var10001 = ((Short)var2[0]).shortValue(); + var10002 = ((Short)var2[1]).shortValue(); + var10003 = ((Short)var2[2]).shortValue(); + var10004 = ((Byte)var2[3]).byteValue(); + var3 = ((Byte)var2[4]).byteValue(); + var4 = var10004; + var5 = var10003; + var6 = var10002; + var13 = var10001; + ++this.clicks; + if(this.clicks == 100) { + this.d("Too much clicking!"); + } else { + Level var7 = this.server.mainLevel; + float var8 = (float)var13 - (float)this.xSpawn / 32.0F; + float var9 = (float)var6 - ((float)this.ySpawn / 32.0F - 1.62F); + float var10 = (float)var5 - (float)this.zSpawn / 32.0F; + var8 = var8 * var8 + var9 * var9 + var10 * var10; + var9 = 8.0F; + if(var8 >= var9 * var9) { + System.out.println("Distance: " + MathHelper.sqrt(var8)); + this.d("Distance"); + } else if(!AvailableBlockType.blocks.contains(a.b[var3])) { + this.d("Tile type"); + } else if(var13 >= 0 && var6 >= 0 && var5 >= 0 && var13 < var7.width && var6 < var7.depth && var5 < var7.height) { + if(var4 == 0) { + if(var7.getTile(var13, var6, var5) != a.k.ab || this.server.playerManager1.containsPlayer(this.playerName)) { + var7.setTile(var13, var6, var5, 0); + } + } else { + a var16; + if((var16 = a.b[var7.getTile(var13, var6, var5)]) == null || var16 == a.l || var16 == a.m || var16 == a.n || var16 == a.o) { + if(this.i && var3 == a.e.ab) { + var7.setTile(var13, var6, var5, a.k.ab); + } else { + var7.setTile(var13, var6, var5, var3); + } + + a.b[var3].a(var7, var13, var6, var5); + } + } + } + } + + var10000 = true; + } else { + ((Byte)var2[0]).byteValue(); + var10001 = ((Short)var2[1]).shortValue(); + var10002 = ((Short)var2[2]).shortValue(); + var10003 = ((Short)var2[3]).shortValue(); + var10004 = ((Byte)var2[4]).byteValue(); + var3 = ((Byte)var2[5]).byteValue(); + var4 = var10004; + var5 = var10003; + var6 = var10002; + var13 = var10001; + if(var13 == this.xSpawn && var6 == this.ySpawn && var5 == this.zSpawn && var4 == this.yawSpawn && var3 == this.pitchSpawn) { + var10000 = true; + } else { + boolean var21 = var13 == this.xSpawn && var6 == this.ySpawn && var5 == this.zSpawn; + if(this.t++ % 2 == 0) { + int var22 = var13 - this.xSpawn; + int var23 = var6 - this.ySpawn; + int var24 = var5 - this.zSpawn; + if(var22 >= 128 || var22 < -128 || var23 >= 128 || var23 < -128 || var24 >= 128 || var24 < -128 || this.t % 20 <= 1) { + this.xSpawn = var13; + this.ySpawn = var6; + this.zSpawn = var5; + this.yawSpawn = var4; + this.pitchSpawn = var3; + this.server.a(this, PacketType.POSITION_ROTATION, new Object[]{Integer.valueOf(this.playerID), Short.valueOf(var13), Short.valueOf(var6), Short.valueOf(var5), Byte.valueOf(var4), Byte.valueOf(var3)}); + var10000 = false; + continue; + } + + if(var13 == this.xSpawn && var6 == this.ySpawn && var5 == this.zSpawn) { + this.yawSpawn = var4; + this.pitchSpawn = var3; + this.server.a(this, PacketType.ROTATION_UPDATE, new Object[]{Integer.valueOf(this.playerID), Byte.valueOf(var4), Byte.valueOf(var3)}); + } else if(var4 == this.yawSpawn && var3 == this.pitchSpawn) { + this.xSpawn = var13; + this.ySpawn = var6; + this.zSpawn = var5; + this.server.a(this, PacketType.POSITION_UPDATE, new Object[]{Integer.valueOf(this.playerID), Integer.valueOf(var22), Integer.valueOf(var23), Integer.valueOf(var24)}); + } else { + this.xSpawn = var13; + this.ySpawn = var6; + this.zSpawn = var5; + this.yawSpawn = var4; + this.pitchSpawn = var3; + this.server.a(this, PacketType.POSITION_ROTATION_UPDATE, new Object[]{Integer.valueOf(this.playerID), Integer.valueOf(var22), Integer.valueOf(var23), Integer.valueOf(var24), Byte.valueOf(var4), Byte.valueOf(var3)}); + } + } + + var10000 = var21; + } + } + } + } + + if(!this.l && System.currentTimeMillis() - this.time > 5000L) { + this.a("You need to log in!"); + } else if(this.bytes != null) { + Level var11 = this.server.mainLevel; + byte[] var15 = new byte[1024]; + int var20 = 0; + int var19 = this.bytes.length; + this.networkHandler.send(PacketType.LEVEL_INITIALIZE, new Object[0]); + + int var17; + while(var19 > 0) { + var17 = var19; + if(var19 > var15.length) { + var17 = var15.length; + } + + System.arraycopy(this.bytes, var20, var15, 0, var17); + this.networkHandler.send(PacketType.LEVEL_DATA_CHUNK, new Object[]{Integer.valueOf(var17), var15, Integer.valueOf((var20 + var17) * 100 / this.bytes.length)}); + var19 -= var17; + var20 += var17; + } + + this.networkHandler.send(PacketType.LEVEL_FINALIZE, new Object[]{Integer.valueOf(var11.width), Integer.valueOf(var11.depth), Integer.valueOf(var11.height)}); + this.networkHandler.send(PacketType.SPAWN_PLAYER, new Object[]{Integer.valueOf(-1), this.playerName, Integer.valueOf(this.xSpawn), Integer.valueOf(this.ySpawn), Integer.valueOf(this.zSpawn), Integer.valueOf(this.yawSpawn), Integer.valueOf(this.pitchSpawn)}); + this.server.a(this, PacketType.SPAWN_PLAYER, new Object[]{Integer.valueOf(this.playerID), this.playerName, Integer.valueOf((var11.xSpawn << 5) + 16), Integer.valueOf((var11.ySpawn << 5) + 16), Integer.valueOf((var11.zSpawn << 5) + 16), Integer.valueOf((int)(var11.rotSpawn * 256.0F / 360.0F)), Integer.valueOf(0)}); + this.server.a(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), this.playerName + " joined the game"}); + Iterator var18 = this.server.b().iterator(); + + while(var18.hasNext()) { + NetworkManager var12; + if((var12 = (NetworkManager)var18.next()) != null && var12 != this && var12.l) { + this.networkHandler.send(PacketType.SPAWN_PLAYER, new Object[]{Integer.valueOf(var12.playerID), var12.playerName, Integer.valueOf(var12.xSpawn), Integer.valueOf(var12.ySpawn), Integer.valueOf(var12.zSpawn), Integer.valueOf(var12.yawSpawn), Integer.valueOf(var12.pitchSpawn)}); + } + } + + this.m = true; + var17 = 0; + + while(var17 < this.n.size()) { + PacketType var14 = (PacketType)this.n.get(var17++); + var2 = (Object[])((Object[])this.n.get(var17++)); + this.b(var14, var2); + } + + this.n = null; + this.bytes = null; + } + } + + public final void b(PacketType var1, Object ... var2) { + if(!this.m) { + this.n.add(var1); + this.n.add(var2); + } else { + this.networkHandler.send(var1, var2); + } + } + + public final void a(Exception var1) { + if(var1 instanceof IOException) { + logger.info(this + " lost connection suddenly. (" + var1 + ")"); + } else { + logger.warning(this + ":" + var1); + logger.log(java.util.logging.Level.WARNING, "Exception handling " + this + "!", var1); + var1.printStackTrace(); + } + + this.server.a(this, PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), this.playerName + " left the game"}); + MinecraftServer.b(this); + } + +} diff --git a/src/com/mojang/minecraft/server/PlayerManager.java b/src/com/mojang/minecraft/server/PlayerManager.java new file mode 100644 index 0000000..ad99c46 --- /dev/null +++ b/src/com/mojang/minecraft/server/PlayerManager.java @@ -0,0 +1,84 @@ +package com.mojang.minecraft.server; + +import com.mojang.minecraft.server.MinecraftServer; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.logging.Logger; + +public final class PlayerManager { + + private static Logger logger = MinecraftServer.logger; + private String name; + private File file; + private Set players = new HashSet(); + + + public PlayerManager(String var1, File var2) { + this.name = var1; + this.file = var2; + this.load(); + } + + public final void addPlayer(String var1) { + var1 = var1.toLowerCase(); + this.players.add(var1); + this.save(); + } + + public final void removePlayer(String var1) { + var1 = var1.toLowerCase(); + this.players.remove(var1); + this.save(); + } + + public final boolean containsPlayer(String var1) { + var1 = var1.toLowerCase(); + return this.players.contains(var1); + } + + private void load() { + try { + BufferedReader var1 = new BufferedReader(new FileReader(this.file)); + String var2 = null; + + while((var2 = var1.readLine()) != null) { + var2 = var2.toLowerCase(); + this.players.add(var2); + } + + var1.close(); + } catch (IOException var4) { + try { + this.file.createNewFile(); + } catch (IOException var3) { + var3.printStackTrace(); + } + + logger.warning("Failed to load player list \"" + this.name + "\". (" + var4 + ")"); + } + } + + private void save() { + try { + PrintWriter var1 = new PrintWriter(new FileWriter(this.file)); + Iterator var2 = this.players.iterator(); + + while(var2.hasNext()) { + String var3 = (String)var2.next(); + var1.println(var3); + } + + var1.close(); + } catch (IOException var4) { + logger.warning("Failed to save player list \"" + this.name + "\". (" + var4 + ")"); + } + } + +} diff --git a/src/com/mojang/minecraft/server/SaltGenerator.java b/src/com/mojang/minecraft/server/SaltGenerator.java new file mode 100644 index 0000000..d0f2dbe --- /dev/null +++ b/src/com/mojang/minecraft/server/SaltGenerator.java @@ -0,0 +1,26 @@ +package com.mojang.minecraft.server; + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public final class SaltGenerator { + + private String salt; + + + public SaltGenerator(String var1) { + this.salt = var1; + } + + public final String generate(String var1) { + try { + String var3 = this.salt + var1; + MessageDigest var4; + (var4 = MessageDigest.getInstance("MD5")).update(var3.getBytes(), 0, var3.length()); + return (new BigInteger(1, var4.digest())).toString(16); + } catch (NoSuchAlgorithmException var2) { + throw new RuntimeException(var2); + } + } +} diff --git a/src/com/mojang/minecraft/server/UNKNOWN0.java b/src/com/mojang/minecraft/server/UNKNOWN0.java new file mode 100644 index 0000000..1c6ef0e --- /dev/null +++ b/src/com/mojang/minecraft/server/UNKNOWN0.java @@ -0,0 +1,15 @@ +package com.mojang.minecraft.server; + +import com.mojang.net.NetworkHandler; + +public final class UNKNOWN0 { + + public NetworkHandler networkHandler; + public int b; + + + public UNKNOWN0(NetworkHandler var1, int var2) { + this.networkHandler = var1; + this.b = 100; + } +} diff --git a/src/com/mojang/net/BindTo.java b/src/com/mojang/net/BindTo.java new file mode 100644 index 0000000..54ea699 --- /dev/null +++ b/src/com/mojang/net/BindTo.java @@ -0,0 +1,22 @@ +package com.mojang.net; + +import com.mojang.minecraft.server.MinecraftServer; +import java.net.InetSocketAddress; +import java.nio.channels.ServerSocketChannel; +import java.util.LinkedList; +import java.util.List; + +public final class BindTo { + + public ServerSocketChannel serverChannel; + public MinecraftServer server; + public List c = new LinkedList(); + + + public BindTo(int var1, MinecraftServer var2) { + this.server = var2; + this.serverChannel = ServerSocketChannel.open(); + this.serverChannel.socket().bind(new InetSocketAddress(var1)); + this.serverChannel.configureBlocking(false); + } +} diff --git a/src/com/mojang/net/NetworkHandler.java b/src/com/mojang/net/NetworkHandler.java new file mode 100644 index 0000000..912a1e5 --- /dev/null +++ b/src/com/mojang/net/NetworkHandler.java @@ -0,0 +1,153 @@ +package com.mojang.net; + +import com.mojang.minecraft.net.PacketType; +import com.mojang.minecraft.server.NetworkManager; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.Arrays; + +public final class NetworkHandler { + + public volatile boolean connected; + public SocketChannel channel; + public ByteBuffer in = ByteBuffer.allocate(1048576); + public ByteBuffer out = ByteBuffer.allocate(1048576); + public NetworkManager networkManager; + private Socket socket; + private boolean h = false; + public String address; + private byte[] stringBytes = new byte[64]; + + + public NetworkHandler(SocketChannel var1) { + this.channel = var1; + this.channel.configureBlocking(false); + System.currentTimeMillis(); + this.socket = this.channel.socket(); + this.connected = true; + this.in.clear(); + this.out.clear(); + this.socket.setTcpNoDelay(true); + this.socket.setTrafficClass(24); + this.socket.setKeepAlive(false); + this.socket.setReuseAddress(false); + this.socket.setSoTimeout(100); + this.address = this.socket.getInetAddress().toString(); + } + + public final void close() { + try { + if(this.out.position() > 0) { + this.out.flip(); + this.channel.write(this.out); + this.out.compact(); + } + } catch (Exception var2) { + ; + } + + this.connected = false; + + try { + this.channel.close(); + } catch (Exception var1) { + ; + } + + this.socket = null; + this.channel = null; + } + + public final void send(PacketType var1, Object ... var2) { + if(this.connected) { + this.out.put(var1.opCode); + + for(int var3 = 0; var3 < var2.length; ++var3) { + Class var10001 = var1.params[var3]; + Object var4 = var2[var3]; + Class var5 = var10001; + NetworkHandler var6 = this; + if(this.connected) { + try { + if(var5 == Long.TYPE) { + var6.out.putLong(((Long)var4).longValue()); + } else if(var5 == Integer.TYPE) { + var6.out.putInt(((Number)var4).intValue()); + } else if(var5 == Short.TYPE) { + var6.out.putShort(((Number)var4).shortValue()); + } else if(var5 == Byte.TYPE) { + var6.out.put(((Number)var4).byteValue()); + } else if(var5 == Double.TYPE) { + var6.out.putDouble(((Double)var4).doubleValue()); + } else if(var5 == Float.TYPE) { + var6.out.putFloat(((Float)var4).floatValue()); + } else { + byte[] var9; + if(var5 != String.class) { + if(var5 == byte[].class) { + if((var9 = (byte[])((byte[])var4)).length < 1024) { + var9 = Arrays.copyOf(var9, 1024); + } + + var6.out.put(var9); + } + } else { + var9 = ((String)var4).getBytes("UTF-8"); + Arrays.fill(var6.stringBytes, (byte)32); + + int var8; + for(var8 = 0; var8 < 64 && var8 < var9.length; ++var8) { + var6.stringBytes[var8] = var9[var8]; + } + + for(var8 = var9.length; var8 < 64; ++var8) { + var6.stringBytes[var8] = 32; + } + + var6.out.put(var6.stringBytes); + } + } + } catch (Exception var7) { + this.networkManager.a(var7); + } + } + } + + } + } + + public Object receive(Class var1) { + if(!this.connected) { + return null; + } else { + try { + if(var1 == Long.TYPE) { + return Long.valueOf(this.in.getLong()); + } else if(var1 == Integer.TYPE) { + return Integer.valueOf(this.in.getInt()); + } else if(var1 == Short.TYPE) { + return Short.valueOf(this.in.getShort()); + } else if(var1 == Byte.TYPE) { + return Byte.valueOf(this.in.get()); + } else if(var1 == Double.TYPE) { + return Double.valueOf(this.in.getDouble()); + } else if(var1 == Float.TYPE) { + return Float.valueOf(this.in.getFloat()); + } else if(var1 == String.class) { + this.in.get(this.stringBytes); + return (new String(this.stringBytes, "UTF-8")).trim(); + } else if(var1 == byte[].class) { + byte[] var3 = new byte[1024]; + this.in.get(var3); + return var3; + } else { + return null; + } + } catch (Exception var2) { + this.networkManager.a(var2); + return null; + } + } + } +} diff --git a/src/com/mojang/util/MathHelper.java b/src/com/mojang/util/MathHelper.java new file mode 100644 index 0000000..f729503 --- /dev/null +++ b/src/com/mojang/util/MathHelper.java @@ -0,0 +1,27 @@ +package com.mojang.util; + + +public final class MathHelper { + + private static float[] SIN_TABLE = new float[65536]; + + + public static final float sin(float var0) { + return SIN_TABLE[(int)(var0 * 10430.378F) & '\uffff']; + } + + public static final float cos(float var0) { + return SIN_TABLE[(int)(var0 * 10430.378F + 16384.0F) & '\uffff']; + } + + public static final float sqrt(float var0) { + return (float)Math.sqrt((double)var0); + } + + static { + for(int var0 = 0; var0 < 65536; ++var0) { + SIN_TABLE[var0] = (float)Math.sin((double)var0 * 3.141592653589793D * 2.0D / 65536.0D); + } + + } +} diff --git a/src/null b/src/null new file mode 100644 index 0000000..e69de29