6672 lines
221 KiB
Diff
6672 lines
221 KiB
Diff
|
From 9d81fa71539abae7bb7da53ea6824ab1743972d8 Mon Sep 17 00:00:00 2001
|
||
|
From: Zach Brown <Zbob750@live.com>
|
||
|
Date: Tue, 22 Jul 2014 21:05:53 -0500
|
||
|
Subject: [PATCH] mc-dev imports
|
||
|
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/BiomeBase.java b/src/main/java/net/minecraft/server/BiomeBase.java
|
||
|
new file mode 100644
|
||
|
index 000000000..1372955b3
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/BiomeBase.java
|
||
|
@@ -0,0 +1,391 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import net.minecraft.util.com.google.common.collect.Sets;
|
||
|
+import org.apache.logging.log4j.LogManager;
|
||
|
+import org.apache.logging.log4j.Logger;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.List;
|
||
|
+import java.util.Random;
|
||
|
+import java.util.Set;
|
||
|
+
|
||
|
+public abstract class BiomeBase {
|
||
|
+
|
||
|
+ private static final Logger aC = LogManager.getLogger();
|
||
|
+ protected static final BiomeTemperature a = new BiomeTemperature(0.1F, 0.2F);
|
||
|
+ protected static final BiomeTemperature b = new BiomeTemperature(-0.5F, 0.0F);
|
||
|
+ protected static final BiomeTemperature c = new BiomeTemperature(-1.0F, 0.1F);
|
||
|
+ protected static final BiomeTemperature d = new BiomeTemperature(-1.8F, 0.1F);
|
||
|
+ protected static final BiomeTemperature e = new BiomeTemperature(0.125F, 0.05F);
|
||
|
+ protected static final BiomeTemperature f = new BiomeTemperature(0.2F, 0.2F);
|
||
|
+ protected static final BiomeTemperature g = new BiomeTemperature(0.45F, 0.3F);
|
||
|
+ protected static final BiomeTemperature h = new BiomeTemperature(1.5F, 0.025F);
|
||
|
+ protected static final BiomeTemperature i = new BiomeTemperature(1.0F, 0.5F);
|
||
|
+ protected static final BiomeTemperature j = new BiomeTemperature(0.0F, 0.025F);
|
||
|
+ protected static final BiomeTemperature k = new BiomeTemperature(0.1F, 0.8F);
|
||
|
+ protected static final BiomeTemperature l = new BiomeTemperature(0.2F, 0.3F);
|
||
|
+ protected static final BiomeTemperature m = new BiomeTemperature(-0.2F, 0.1F);
|
||
|
+ private static final BiomeBase[] biomes = new BiomeBase[256];
|
||
|
+ public static final Set n = Sets.newHashSet();
|
||
|
+ public static final BiomeBase OCEAN = (new BiomeOcean(0)).b(112).a("Ocean").a(c);
|
||
|
+ public static final BiomeBase PLAINS = (new BiomePlains(1)).b(9286496).a("Plains");
|
||
|
+ public static final BiomeBase DESERT = (new BiomeDesert(2)).b(16421912).a("Desert").b().a(2.0F, 0.0F).a(e);
|
||
|
+ public static final BiomeBase EXTREME_HILLS = (new BiomeBigHills(3, false)).b(6316128).a("Extreme Hills").a(i).a(0.2F, 0.3F);
|
||
|
+ public static final BiomeBase FOREST = (new BiomeForest(4, 0)).b(353825).a("Forest");
|
||
|
+ public static final BiomeBase TAIGA = (new BiomeTaiga(5, 0)).b(747097).a("Taiga").a(5159473).a(0.25F, 0.8F).a(f);
|
||
|
+ public static final BiomeBase SWAMPLAND = (new BiomeSwamp(6)).b(522674).a("Swampland").a(9154376).a(m).a(0.8F, 0.9F);
|
||
|
+ public static final BiomeBase RIVER = (new BiomeRiver(7)).b(255).a("River").a(b);
|
||
|
+ public static final BiomeBase HELL = (new BiomeHell(8)).b(16711680).a("Hell").b().a(2.0F, 0.0F);
|
||
|
+ public static final BiomeBase SKY = (new BiomeTheEnd(9)).b(8421631).a("Sky").b();
|
||
|
+ public static final BiomeBase FROZEN_OCEAN = (new BiomeOcean(10)).b(9474208).a("FrozenOcean").c().a(c).a(0.0F, 0.5F);
|
||
|
+ public static final BiomeBase FROZEN_RIVER = (new BiomeRiver(11)).b(10526975).a("FrozenRiver").c().a(b).a(0.0F, 0.5F);
|
||
|
+ public static final BiomeBase ICE_PLAINS = (new BiomeIcePlains(12, false)).b(16777215).a("Ice Plains").c().a(0.0F, 0.5F).a(e);
|
||
|
+ public static final BiomeBase ICE_MOUNTAINS = (new BiomeIcePlains(13, false)).b(10526880).a("Ice Mountains").c().a(g).a(0.0F, 0.5F);
|
||
|
+ public static final BiomeBase MUSHROOM_ISLAND = (new BiomeMushrooms(14)).b(16711935).a("MushroomIsland").a(0.9F, 1.0F).a(l);
|
||
|
+ public static final BiomeBase MUSHROOM_SHORE = (new BiomeMushrooms(15)).b(10486015).a("MushroomIslandShore").a(0.9F, 1.0F).a(j);
|
||
|
+ public static final BiomeBase BEACH = (new BiomeBeach(16)).b(16440917).a("Beach").a(0.8F, 0.4F).a(j);
|
||
|
+ public static final BiomeBase DESERT_HILLS = (new BiomeDesert(17)).b(13786898).a("DesertHills").b().a(2.0F, 0.0F).a(g);
|
||
|
+ public static final BiomeBase FOREST_HILLS = (new BiomeForest(18, 0)).b(2250012).a("ForestHills").a(g);
|
||
|
+ public static final BiomeBase TAIGA_HILLS = (new BiomeTaiga(19, 0)).b(1456435).a("TaigaHills").a(5159473).a(0.25F, 0.8F).a(g);
|
||
|
+ public static final BiomeBase SMALL_MOUNTAINS = (new BiomeBigHills(20, true)).b(7501978).a("Extreme Hills Edge").a(i.a()).a(0.2F, 0.3F);
|
||
|
+ public static final BiomeBase JUNGLE = (new BiomeJungle(21, false)).b(5470985).a("Jungle").a(5470985).a(0.95F, 0.9F);
|
||
|
+ public static final BiomeBase JUNGLE_HILLS = (new BiomeJungle(22, false)).b(2900485).a("JungleHills").a(5470985).a(0.95F, 0.9F).a(g);
|
||
|
+ public static final BiomeBase JUNGLE_EDGE = (new BiomeJungle(23, true)).b(6458135).a("JungleEdge").a(5470985).a(0.95F, 0.8F);
|
||
|
+ public static final BiomeBase DEEP_OCEAN = (new BiomeOcean(24)).b(48).a("Deep Ocean").a(d);
|
||
|
+ public static final BiomeBase STONE_BEACH = (new BiomeStoneBeach(25)).b(10658436).a("Stone Beach").a(0.2F, 0.3F).a(k);
|
||
|
+ public static final BiomeBase COLD_BEACH = (new BiomeBeach(26)).b(16445632).a("Cold Beach").a(0.05F, 0.3F).a(j).c();
|
||
|
+ public static final BiomeBase BIRCH_FOREST = (new BiomeForest(27, 2)).a("Birch Forest").b(3175492);
|
||
|
+ public static final BiomeBase BIRCH_FOREST_HILLS = (new BiomeForest(28, 2)).a("Birch Forest Hills").b(2055986).a(g);
|
||
|
+ public static final BiomeBase ROOFED_FOREST = (new BiomeForest(29, 3)).b(4215066).a("Roofed Forest");
|
||
|
+ public static final BiomeBase COLD_TAIGA = (new BiomeTaiga(30, 0)).b(3233098).a("Cold Taiga").a(5159473).c().a(-0.5F, 0.4F).a(f).c(16777215);
|
||
|
+ public static final BiomeBase COLD_TAIGA_HILLS = (new BiomeTaiga(31, 0)).b(2375478).a("Cold Taiga Hills").a(5159473).c().a(-0.5F, 0.4F).a(g).c(16777215);
|
||
|
+ public static final BiomeBase MEGA_TAIGA = (new BiomeTaiga(32, 1)).b(5858897).a("Mega Taiga").a(5159473).a(0.3F, 0.8F).a(f);
|
||
|
+ public static final BiomeBase MEGA_TAIGA_HILLS = (new BiomeTaiga(33, 1)).b(4542270).a("Mega Taiga Hills").a(5159473).a(0.3F, 0.8F).a(g);
|
||
|
+ public static final BiomeBase EXTREME_HILLS_PLUS = (new BiomeBigHills(34, true)).b(5271632).a("Extreme Hills+").a(i).a(0.2F, 0.3F);
|
||
|
+ public static final BiomeBase SAVANNA = (new BiomeSavanna(35)).b(12431967).a("Savanna").a(1.2F, 0.0F).b().a(e);
|
||
|
+ public static final BiomeBase SAVANNA_PLATEAU = (new BiomeSavanna(36)).b(10984804).a("Savanna Plateau").a(1.0F, 0.0F).b().a(h);
|
||
|
+ public static final BiomeBase MESA = (new BiomeMesa(37, false, false)).b(14238997).a("Mesa");
|
||
|
+ public static final BiomeBase MESA_PLATEAU_F = (new BiomeMesa(38, false, true)).b(11573093).a("Mesa Plateau F").a(h);
|
||
|
+ public static final BiomeBase MESA_PLATEAU = (new BiomeMesa(39, false, false)).b(13274213).a("Mesa Plateau").a(h);
|
||
|
+ protected static final NoiseGenerator3 ac;
|
||
|
+ protected static final NoiseGenerator3 ad;
|
||
|
+ protected static final WorldGenTallPlant ae;
|
||
|
+ public String af;
|
||
|
+ public int ag;
|
||
|
+ public int ah;
|
||
|
+ public Block ai;
|
||
|
+ public int aj;
|
||
|
+ public Block ak;
|
||
|
+ public int al;
|
||
|
+ public float am;
|
||
|
+ public float an;
|
||
|
+ public float temperature;
|
||
|
+ public float humidity;
|
||
|
+ public int aq;
|
||
|
+ public BiomeDecorator ar;
|
||
|
+ protected List as;
|
||
|
+ protected List at;
|
||
|
+ protected List au;
|
||
|
+ protected List av;
|
||
|
+ protected boolean aw;
|
||
|
+ protected boolean ax;
|
||
|
+ public final int id;
|
||
|
+ protected WorldGenTrees az;
|
||
|
+ protected WorldGenBigTree aA;
|
||
|
+ protected WorldGenSwampTree aB;
|
||
|
+
|
||
|
+ protected BiomeBase(int i) {
|
||
|
+ this.ai = Blocks.GRASS;
|
||
|
+ this.aj = 0;
|
||
|
+ this.ak = Blocks.DIRT;
|
||
|
+ this.al = 5169201;
|
||
|
+ this.am = a.a;
|
||
|
+ this.an = a.b;
|
||
|
+ this.temperature = 0.5F;
|
||
|
+ this.humidity = 0.5F;
|
||
|
+ this.aq = 16777215;
|
||
|
+ this.as = new ArrayList();
|
||
|
+ this.at = new ArrayList();
|
||
|
+ this.au = new ArrayList();
|
||
|
+ this.av = new ArrayList();
|
||
|
+ this.ax = true;
|
||
|
+ this.az = new WorldGenTrees(false);
|
||
|
+ this.aA = new WorldGenBigTree(false);
|
||
|
+ this.aB = new WorldGenSwampTree();
|
||
|
+ this.id = i;
|
||
|
+ biomes[i] = this;
|
||
|
+ this.ar = this.a();
|
||
|
+ this.at.add(new BiomeMeta(EntitySheep.class, 12, 4, 4));
|
||
|
+ this.at.add(new BiomeMeta(EntityPig.class, 10, 4, 4));
|
||
|
+ this.at.add(new BiomeMeta(EntityChicken.class, 10, 4, 4));
|
||
|
+ this.at.add(new BiomeMeta(EntityCow.class, 8, 4, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntitySpider.class, 100, 4, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntityZombie.class, 100, 4, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntitySkeleton.class, 100, 4, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntityCreeper.class, 100, 4, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntitySlime.class, 100, 4, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntityEnderman.class, 10, 1, 4));
|
||
|
+ this.as.add(new BiomeMeta(EntityWitch.class, 5, 1, 1));
|
||
|
+ this.au.add(new BiomeMeta(EntitySquid.class, 10, 4, 4));
|
||
|
+ this.av.add(new BiomeMeta(EntityBat.class, 10, 8, 8));
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeDecorator a() {
|
||
|
+ return new BiomeDecorator();
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase a(float f, float f1) {
|
||
|
+ if (f > 0.1F && f < 0.2F) {
|
||
|
+ throw new IllegalArgumentException("Please avoid temperatures in the range 0.1 - 0.2 because of snow");
|
||
|
+ } else {
|
||
|
+ this.temperature = f;
|
||
|
+ this.humidity = f1;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected final BiomeBase a(BiomeTemperature biometemperature) {
|
||
|
+ this.am = biometemperature.a;
|
||
|
+ this.an = biometemperature.b;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase b() {
|
||
|
+ this.ax = false;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldGenTreeAbstract a(Random random) {
|
||
|
+ return (WorldGenTreeAbstract) (random.nextInt(10) == 0 ? this.aA : this.az);
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldGenerator b(Random random) {
|
||
|
+ return new WorldGenGrass(Blocks.LONG_GRASS, 1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public String a(Random random, int i, int j, int k) {
|
||
|
+ return random.nextInt(3) > 0 ? BlockFlowers.b[0] : BlockFlowers.a[0];
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase c() {
|
||
|
+ this.aw = true;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase a(String s) {
|
||
|
+ this.af = s;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase a(int i) {
|
||
|
+ this.al = i;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase b(int i) {
|
||
|
+ this.a(i, false);
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase c(int i) {
|
||
|
+ this.ah = i;
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase a(int i, boolean flag) {
|
||
|
+ this.ag = i;
|
||
|
+ if (flag) {
|
||
|
+ this.ah = (i & 16711422) >> 1;
|
||
|
+ } else {
|
||
|
+ this.ah = i;
|
||
|
+ }
|
||
|
+
|
||
|
+ return this;
|
||
|
+ }
|
||
|
+
|
||
|
+ public List getMobs(EnumCreatureType enumcreaturetype) {
|
||
|
+ return enumcreaturetype == EnumCreatureType.MONSTER ? this.as : (enumcreaturetype == EnumCreatureType.CREATURE ? this.at : (enumcreaturetype == EnumCreatureType.WATER_CREATURE ? this.au : (enumcreaturetype == EnumCreatureType.AMBIENT ? this.av : null)));
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean d() {
|
||
|
+ return this.j();
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean e() {
|
||
|
+ return this.j() ? false : this.ax;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean f() {
|
||
|
+ return this.humidity > 0.85F;
|
||
|
+ }
|
||
|
+
|
||
|
+ public float g() {
|
||
|
+ return 0.1F;
|
||
|
+ }
|
||
|
+
|
||
|
+ public final int h() {
|
||
|
+ return (int) (this.humidity * 65536.0F);
|
||
|
+ }
|
||
|
+
|
||
|
+ public final float a(int i, int j, int k) {
|
||
|
+ if (j > 64) {
|
||
|
+ float f = (float) ac.a((double) i * 1.0D / 8.0D, (double) k * 1.0D / 8.0D) * 4.0F;
|
||
|
+
|
||
|
+ return this.temperature - (f + (float) j - 64.0F) * 0.05F / 30.0F;
|
||
|
+ } else {
|
||
|
+ return this.temperature;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, Random random, int i, int j) {
|
||
|
+ this.ar.a(world, random, this, i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean j() {
|
||
|
+ return this.aw;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, Random random, Block[] ablock, byte[] abyte, int i, int j, double d0) {
|
||
|
+ this.b(world, random, ablock, abyte, i, j, d0);
|
||
|
+ }
|
||
|
+
|
||
|
+ public final void b(World world, Random random, Block[] ablock, byte[] abyte, int i, int j, double d0) {
|
||
|
+ boolean flag = true;
|
||
|
+ Block block = this.ai;
|
||
|
+ byte b0 = (byte) (this.aj & 255);
|
||
|
+ Block block1 = this.ak;
|
||
|
+ int k = -1;
|
||
|
+ int l = (int) (d0 / 3.0D + 3.0D + random.nextDouble() * 0.25D);
|
||
|
+ int i1 = i & 15;
|
||
|
+ int j1 = j & 15;
|
||
|
+ int k1 = ablock.length / 256;
|
||
|
+
|
||
|
+ for (int l1 = 255; l1 >= 0; --l1) {
|
||
|
+ int i2 = (j1 * 16 + i1) * k1 + l1;
|
||
|
+
|
||
|
+ if (l1 <= 0 + random.nextInt(5)) {
|
||
|
+ ablock[i2] = Blocks.BEDROCK;
|
||
|
+ } else {
|
||
|
+ Block block2 = ablock[i2];
|
||
|
+
|
||
|
+ if (block2 != null && block2.getMaterial() != Material.AIR) {
|
||
|
+ if (block2 == Blocks.STONE) {
|
||
|
+ if (k == -1) {
|
||
|
+ if (l <= 0) {
|
||
|
+ block = null;
|
||
|
+ b0 = 0;
|
||
|
+ block1 = Blocks.STONE;
|
||
|
+ } else if (l1 >= 59 && l1 <= 64) {
|
||
|
+ block = this.ai;
|
||
|
+ b0 = (byte) (this.aj & 255);
|
||
|
+ block1 = this.ak;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l1 < 63 && (block == null || block.getMaterial() == Material.AIR)) {
|
||
|
+ if (this.a(i, l1, j) < 0.15F) {
|
||
|
+ block = Blocks.ICE;
|
||
|
+ b0 = 0;
|
||
|
+ } else {
|
||
|
+ block = Blocks.STATIONARY_WATER;
|
||
|
+ b0 = 0;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ k = l;
|
||
|
+ if (l1 >= 62) {
|
||
|
+ ablock[i2] = block;
|
||
|
+ abyte[i2] = b0;
|
||
|
+ } else if (l1 < 56 - l) {
|
||
|
+ block = null;
|
||
|
+ block1 = Blocks.STONE;
|
||
|
+ ablock[i2] = Blocks.GRAVEL;
|
||
|
+ } else {
|
||
|
+ ablock[i2] = block1;
|
||
|
+ }
|
||
|
+ } else if (k > 0) {
|
||
|
+ --k;
|
||
|
+ ablock[i2] = block1;
|
||
|
+ if (k == 0 && block1 == Blocks.SAND) {
|
||
|
+ k = random.nextInt(4) + Math.max(0, l1 - 63);
|
||
|
+ block1 = Blocks.SANDSTONE;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ k = -1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase k() {
|
||
|
+ return new BiomeBaseSub(this.id + 128, this);
|
||
|
+ }
|
||
|
+
|
||
|
+ public Class l() {
|
||
|
+ return this.getClass();
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a(BiomeBase biomebase) {
|
||
|
+ return biomebase == this ? true : (biomebase == null ? false : this.l() == biomebase.l());
|
||
|
+ }
|
||
|
+
|
||
|
+ public EnumTemperature m() {
|
||
|
+ return (double) this.temperature < 0.2D ? EnumTemperature.COLD : ((double) this.temperature < 1.0D ? EnumTemperature.MEDIUM : EnumTemperature.WARM);
|
||
|
+ }
|
||
|
+
|
||
|
+ public static BiomeBase[] getBiomes() {
|
||
|
+ return biomes;
|
||
|
+ }
|
||
|
+
|
||
|
+ public static BiomeBase getBiome(int i) {
|
||
|
+ if (i >= 0 && i <= biomes.length) {
|
||
|
+ return biomes[i];
|
||
|
+ } else {
|
||
|
+ aC.warn("Biome ID is out of bounds: " + i + ", defaulting to 0 (Ocean)");
|
||
|
+ return OCEAN;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ static {
|
||
|
+ PLAINS.k();
|
||
|
+ DESERT.k();
|
||
|
+ FOREST.k();
|
||
|
+ TAIGA.k();
|
||
|
+ SWAMPLAND.k();
|
||
|
+ ICE_PLAINS.k();
|
||
|
+ JUNGLE.k();
|
||
|
+ JUNGLE_EDGE.k();
|
||
|
+ COLD_TAIGA.k();
|
||
|
+ SAVANNA.k();
|
||
|
+ SAVANNA_PLATEAU.k();
|
||
|
+ MESA.k();
|
||
|
+ MESA_PLATEAU_F.k();
|
||
|
+ MESA_PLATEAU.k();
|
||
|
+ BIRCH_FOREST.k();
|
||
|
+ BIRCH_FOREST_HILLS.k();
|
||
|
+ ROOFED_FOREST.k();
|
||
|
+ MEGA_TAIGA.k();
|
||
|
+ EXTREME_HILLS.k();
|
||
|
+ EXTREME_HILLS_PLUS.k();
|
||
|
+ biomes[MEGA_TAIGA_HILLS.id + 128] = biomes[MEGA_TAIGA.id + 128];
|
||
|
+ BiomeBase[] abiomebase = biomes;
|
||
|
+ int i = abiomebase.length;
|
||
|
+
|
||
|
+ for (int j = 0; j < i; ++j) {
|
||
|
+ BiomeBase biomebase = abiomebase[j];
|
||
|
+
|
||
|
+ if (biomebase != null && biomebase.id < 128) {
|
||
|
+ n.add(biomebase);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ n.remove(HELL);
|
||
|
+ n.remove(SKY);
|
||
|
+ n.remove(FROZEN_OCEAN);
|
||
|
+ n.remove(SMALL_MOUNTAINS);
|
||
|
+ ac = new NoiseGenerator3(new Random(1234L), 1);
|
||
|
+ ad = new NoiseGenerator3(new Random(2345L), 1);
|
||
|
+ ae = new WorldGenTallPlant();
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/BiomeCache.java b/src/main/java/net/minecraft/server/BiomeCache.java
|
||
|
new file mode 100644
|
||
|
index 000000000..833854f5f
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/BiomeCache.java
|
||
|
@@ -0,0 +1,65 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
+public class BiomeCache {
|
||
|
+
|
||
|
+ private final WorldChunkManager a;
|
||
|
+ private long b;
|
||
|
+ private LongHashMap c = new LongHashMap();
|
||
|
+ private List d = new ArrayList();
|
||
|
+
|
||
|
+ public BiomeCache(WorldChunkManager worldchunkmanager) {
|
||
|
+ this.a = worldchunkmanager;
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeCacheBlock a(int i, int j) {
|
||
|
+ i >>= 4;
|
||
|
+ j >>= 4;
|
||
|
+ long k = (long) i & 4294967295L | ((long) j & 4294967295L) << 32;
|
||
|
+ BiomeCacheBlock biomecacheblock = (BiomeCacheBlock) this.c.getEntry(k);
|
||
|
+
|
||
|
+ if (biomecacheblock == null) {
|
||
|
+ biomecacheblock = new BiomeCacheBlock(this, i, j);
|
||
|
+ this.c.put(k, biomecacheblock);
|
||
|
+ this.d.add(biomecacheblock);
|
||
|
+ }
|
||
|
+
|
||
|
+ biomecacheblock.e = MinecraftServer.ar();
|
||
|
+ return biomecacheblock;
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeBase b(int i, int j) {
|
||
|
+ return this.a(i, j).a(i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a() {
|
||
|
+ long i = MinecraftServer.ar();
|
||
|
+ long j = i - this.b;
|
||
|
+
|
||
|
+ if (j > 7500L || j < 0L) {
|
||
|
+ this.b = i;
|
||
|
+
|
||
|
+ for (int k = 0; k < this.d.size(); ++k) {
|
||
|
+ BiomeCacheBlock biomecacheblock = (BiomeCacheBlock) this.d.get(k);
|
||
|
+ long l = i - biomecacheblock.e;
|
||
|
+
|
||
|
+ if (l > 30000L || l < 0L) {
|
||
|
+ this.d.remove(k--);
|
||
|
+ long i1 = (long) biomecacheblock.c & 4294967295L | ((long) biomecacheblock.d & 4294967295L) << 32;
|
||
|
+
|
||
|
+ this.c.remove(i1);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeBase[] d(int i, int j) {
|
||
|
+ return this.a(i, j).b;
|
||
|
+ }
|
||
|
+
|
||
|
+ static WorldChunkManager a(BiomeCache biomecache) {
|
||
|
+ return biomecache.a;
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/BiomeMesa.java b/src/main/java/net/minecraft/server/BiomeMesa.java
|
||
|
new file mode 100644
|
||
|
index 000000000..7a184e23a
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/BiomeMesa.java
|
||
|
@@ -0,0 +1,279 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Arrays;
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class BiomeMesa extends BiomeBase {
|
||
|
+
|
||
|
+ private byte[] aC;
|
||
|
+ private long aD;
|
||
|
+ private NoiseGenerator3 aE;
|
||
|
+ private NoiseGenerator3 aF;
|
||
|
+ private NoiseGenerator3 aG;
|
||
|
+ private boolean aH;
|
||
|
+ private boolean aI;
|
||
|
+
|
||
|
+ public BiomeMesa(int i, boolean flag, boolean flag1) {
|
||
|
+ super(i);
|
||
|
+ this.aH = flag;
|
||
|
+ this.aI = flag1;
|
||
|
+ this.b();
|
||
|
+ this.a(2.0F, 0.0F);
|
||
|
+ this.at.clear();
|
||
|
+ this.ai = Blocks.SAND;
|
||
|
+ this.aj = 1;
|
||
|
+ this.ak = Blocks.STAINED_HARDENED_CLAY;
|
||
|
+ this.ar.x = -999;
|
||
|
+ this.ar.A = 20;
|
||
|
+ this.ar.C = 3;
|
||
|
+ this.ar.D = 5;
|
||
|
+ this.ar.y = 0;
|
||
|
+ this.at.clear();
|
||
|
+ if (flag1) {
|
||
|
+ this.ar.x = 5;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldGenTreeAbstract a(Random random) {
|
||
|
+ return this.az;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, Random random, int i, int j) {
|
||
|
+ super.a(world, random, i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, Random random, Block[] ablock, byte[] abyte, int i, int j, double d0) {
|
||
|
+ if (this.aC == null || this.aD != world.getSeed()) {
|
||
|
+ this.a(world.getSeed());
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.aE == null || this.aF == null || this.aD != world.getSeed()) {
|
||
|
+ Random random1 = new Random(this.aD);
|
||
|
+
|
||
|
+ this.aE = new NoiseGenerator3(random1, 4);
|
||
|
+ this.aF = new NoiseGenerator3(random1, 1);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.aD = world.getSeed();
|
||
|
+ double d1 = 0.0D;
|
||
|
+ int k;
|
||
|
+ int l;
|
||
|
+
|
||
|
+ if (this.aH) {
|
||
|
+ k = (i & -16) + (j & 15);
|
||
|
+ l = (j & -16) + (i & 15);
|
||
|
+ double d2 = Math.min(Math.abs(d0), this.aE.a((double) k * 0.25D, (double) l * 0.25D));
|
||
|
+
|
||
|
+ if (d2 > 0.0D) {
|
||
|
+ double d3 = 0.001953125D;
|
||
|
+ double d4 = Math.abs(this.aF.a((double) k * d3, (double) l * d3));
|
||
|
+
|
||
|
+ d1 = d2 * d2 * 2.5D;
|
||
|
+ double d5 = Math.ceil(d4 * 50.0D) + 14.0D;
|
||
|
+
|
||
|
+ if (d1 > d5) {
|
||
|
+ d1 = d5;
|
||
|
+ }
|
||
|
+
|
||
|
+ d1 += 64.0D;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ k = i & 15;
|
||
|
+ l = j & 15;
|
||
|
+ boolean flag = true;
|
||
|
+ Block block = Blocks.STAINED_HARDENED_CLAY;
|
||
|
+ Block block1 = this.ak;
|
||
|
+ int i1 = (int) (d0 / 3.0D + 3.0D + random.nextDouble() * 0.25D);
|
||
|
+ boolean flag1 = Math.cos(d0 / 3.0D * 3.141592653589793D) > 0.0D;
|
||
|
+ int j1 = -1;
|
||
|
+ boolean flag2 = false;
|
||
|
+ int k1 = ablock.length / 256;
|
||
|
+
|
||
|
+ for (int l1 = 255; l1 >= 0; --l1) {
|
||
|
+ int i2 = (l * 16 + k) * k1 + l1;
|
||
|
+
|
||
|
+ if ((ablock[i2] == null || ablock[i2].getMaterial() == Material.AIR) && l1 < (int) d1) {
|
||
|
+ ablock[i2] = Blocks.STONE;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l1 <= 0 + random.nextInt(5)) {
|
||
|
+ ablock[i2] = Blocks.BEDROCK;
|
||
|
+ } else {
|
||
|
+ Block block2 = ablock[i2];
|
||
|
+
|
||
|
+ if (block2 != null && block2.getMaterial() != Material.AIR) {
|
||
|
+ if (block2 == Blocks.STONE) {
|
||
|
+ byte b0;
|
||
|
+
|
||
|
+ if (j1 == -1) {
|
||
|
+ flag2 = false;
|
||
|
+ if (i1 <= 0) {
|
||
|
+ block = null;
|
||
|
+ block1 = Blocks.STONE;
|
||
|
+ } else if (l1 >= 59 && l1 <= 64) {
|
||
|
+ block = Blocks.STAINED_HARDENED_CLAY;
|
||
|
+ block1 = this.ak;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l1 < 63 && (block == null || block.getMaterial() == Material.AIR)) {
|
||
|
+ block = Blocks.STATIONARY_WATER;
|
||
|
+ }
|
||
|
+
|
||
|
+ j1 = i1 + Math.max(0, l1 - 63);
|
||
|
+ if (l1 >= 62) {
|
||
|
+ if (this.aI && l1 > 86 + i1 * 2) {
|
||
|
+ if (flag1) {
|
||
|
+ ablock[i2] = Blocks.DIRT;
|
||
|
+ abyte[i2] = 1;
|
||
|
+ } else {
|
||
|
+ ablock[i2] = Blocks.GRASS;
|
||
|
+ }
|
||
|
+ } else if (l1 > 66 + i1) {
|
||
|
+ b0 = 16;
|
||
|
+ if (l1 >= 64 && l1 <= 127) {
|
||
|
+ if (!flag1) {
|
||
|
+ b0 = this.d(i, l1, j);
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ b0 = 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (b0 < 16) {
|
||
|
+ ablock[i2] = Blocks.STAINED_HARDENED_CLAY;
|
||
|
+ abyte[i2] = (byte) b0;
|
||
|
+ } else {
|
||
|
+ ablock[i2] = Blocks.HARDENED_CLAY;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ ablock[i2] = this.ai;
|
||
|
+ abyte[i2] = (byte) this.aj;
|
||
|
+ flag2 = true;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ ablock[i2] = block1;
|
||
|
+ if (block1 == Blocks.STAINED_HARDENED_CLAY) {
|
||
|
+ abyte[i2] = 1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else if (j1 > 0) {
|
||
|
+ --j1;
|
||
|
+ if (flag2) {
|
||
|
+ ablock[i2] = Blocks.STAINED_HARDENED_CLAY;
|
||
|
+ abyte[i2] = 1;
|
||
|
+ } else {
|
||
|
+ b0 = this.d(i, l1, j);
|
||
|
+ if (b0 < 16) {
|
||
|
+ ablock[i2] = Blocks.STAINED_HARDENED_CLAY;
|
||
|
+ abyte[i2] = b0;
|
||
|
+ } else {
|
||
|
+ ablock[i2] = Blocks.HARDENED_CLAY;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ j1 = -1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private void a(long i) {
|
||
|
+ this.aC = new byte[64];
|
||
|
+ Arrays.fill(this.aC, (byte) 16);
|
||
|
+ Random random = new Random(i);
|
||
|
+
|
||
|
+ this.aG = new NoiseGenerator3(random, 1);
|
||
|
+
|
||
|
+ int j;
|
||
|
+
|
||
|
+ for (j = 0; j < 64; ++j) {
|
||
|
+ j += random.nextInt(5) + 1;
|
||
|
+ if (j < 64) {
|
||
|
+ this.aC[j] = 1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ j = random.nextInt(4) + 2;
|
||
|
+
|
||
|
+ int k;
|
||
|
+ int l;
|
||
|
+ int i1;
|
||
|
+ int j1;
|
||
|
+
|
||
|
+ for (k = 0; k < j; ++k) {
|
||
|
+ l = random.nextInt(3) + 1;
|
||
|
+ i1 = random.nextInt(64);
|
||
|
+
|
||
|
+ for (j1 = 0; i1 + j1 < 64 && j1 < l; ++j1) {
|
||
|
+ this.aC[i1 + j1] = 4;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ k = random.nextInt(4) + 2;
|
||
|
+
|
||
|
+ int k1;
|
||
|
+
|
||
|
+ for (l = 0; l < k; ++l) {
|
||
|
+ i1 = random.nextInt(3) + 2;
|
||
|
+ j1 = random.nextInt(64);
|
||
|
+
|
||
|
+ for (k1 = 0; j1 + k1 < 64 && k1 < i1; ++k1) {
|
||
|
+ this.aC[j1 + k1] = 12;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ l = random.nextInt(4) + 2;
|
||
|
+
|
||
|
+ for (i1 = 0; i1 < l; ++i1) {
|
||
|
+ j1 = random.nextInt(3) + 1;
|
||
|
+ k1 = random.nextInt(64);
|
||
|
+
|
||
|
+ for (int l1 = 0; k1 + l1 < 64 && l1 < j1; ++l1) {
|
||
|
+ this.aC[k1 + l1] = 14;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ i1 = random.nextInt(3) + 3;
|
||
|
+ j1 = 0;
|
||
|
+
|
||
|
+ for (k1 = 0; k1 < i1; ++k1) {
|
||
|
+ byte b0 = 1;
|
||
|
+
|
||
|
+ j1 += random.nextInt(16) + 4;
|
||
|
+
|
||
|
+ for (int i2 = 0; j1 + i2 < 64 && i2 < b0; ++i2) {
|
||
|
+ this.aC[j1 + i2] = 0;
|
||
|
+ if (j1 + i2 > 1 && random.nextBoolean()) {
|
||
|
+ this.aC[j1 + i2 - 1] = 8;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j1 + i2 < 63 && random.nextBoolean()) {
|
||
|
+ this.aC[j1 + i2 + 1] = 8;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private byte d(int i, int j, int k) {
|
||
|
+ int l = (int) Math.round(this.aG.a((double) i * 1.0D / 512.0D, (double) i * 1.0D / 512.0D) * 2.0D);
|
||
|
+
|
||
|
+ return this.aC[(j + l + 64) % 64];
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BiomeBase k() {
|
||
|
+ boolean flag = this.id == BiomeBase.MESA.id;
|
||
|
+ BiomeMesa biomemesa = new BiomeMesa(this.id + 128, flag, this.aI);
|
||
|
+
|
||
|
+ if (!flag) {
|
||
|
+ biomemesa.a(g);
|
||
|
+ biomemesa.a(this.af + " M");
|
||
|
+ } else {
|
||
|
+ biomemesa.a(this.af + " (Bryce)");
|
||
|
+ }
|
||
|
+
|
||
|
+ biomemesa.a(this.ag, true);
|
||
|
+ return biomemesa;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/BlockFalling.java b/src/main/java/net/minecraft/server/BlockFalling.java
|
||
|
new file mode 100644
|
||
|
index 000000000..473fc3121
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/BlockFalling.java
|
||
|
@@ -0,0 +1,78 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class BlockFalling extends Block {
|
||
|
+
|
||
|
+ public static boolean instaFall;
|
||
|
+
|
||
|
+ public BlockFalling() {
|
||
|
+ super(Material.SAND);
|
||
|
+ this.a(CreativeModeTab.b);
|
||
|
+ }
|
||
|
+
|
||
|
+ public BlockFalling(Material material) {
|
||
|
+ super(material);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void onPlace(World world, int i, int j, int k) {
|
||
|
+ world.a(i, j, k, this, this.a(world));
|
||
|
+ }
|
||
|
+
|
||
|
+ public void doPhysics(World world, int i, int j, int k, Block block) {
|
||
|
+ world.a(i, j, k, this, this.a(world));
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, int i, int j, int k, Random random) {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ this.m(world, i, j, k);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private void m(World world, int i, int j, int k) {
|
||
|
+ if (canFall(world, i, j - 1, k) && j >= 0) {
|
||
|
+ byte b0 = 32;
|
||
|
+
|
||
|
+ if (!instaFall && world.b(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ EntityFallingBlock entityfallingblock = new EntityFallingBlock(world, (double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this, world.getData(i, j, k));
|
||
|
+
|
||
|
+ this.a(entityfallingblock);
|
||
|
+ world.addEntity(entityfallingblock);
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ world.setAir(i, j, k);
|
||
|
+
|
||
|
+ while (canFall(world, i, j - 1, k) && j > 0) {
|
||
|
+ --j;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j > 0) {
|
||
|
+ world.setTypeUpdate(i, j, k, this);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void a(EntityFallingBlock entityfallingblock) {}
|
||
|
+
|
||
|
+ public int a(World world) {
|
||
|
+ return 2;
|
||
|
+ }
|
||
|
+
|
||
|
+ public static boolean canFall(World world, int i, int j, int k) {
|
||
|
+ Block block = world.getType(i, j, k);
|
||
|
+
|
||
|
+ if (block.material == Material.AIR) {
|
||
|
+ return true;
|
||
|
+ } else if (block == Blocks.FIRE) {
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ Material material = block.material;
|
||
|
+
|
||
|
+ return material == Material.WATER ? true : material == Material.LAVA;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, int i, int j, int k, int l) {}
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java b/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java
|
||
|
new file mode 100644
|
||
|
index 000000000..d36aacbda
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/BlockMinecartTrackAbstract.java
|
||
|
@@ -0,0 +1,145 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public abstract class BlockMinecartTrackAbstract extends Block {
|
||
|
+
|
||
|
+ protected final boolean a;
|
||
|
+
|
||
|
+ public static final boolean b_(World world, int i, int j, int k) {
|
||
|
+ return a(world.getType(i, j, k));
|
||
|
+ }
|
||
|
+
|
||
|
+ public static final boolean a(Block block) {
|
||
|
+ return block == Blocks.RAILS || block == Blocks.GOLDEN_RAIL || block == Blocks.DETECTOR_RAIL || block == Blocks.ACTIVATOR_RAIL;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected BlockMinecartTrackAbstract(boolean flag) {
|
||
|
+ super(Material.ORIENTABLE);
|
||
|
+ this.a = flag;
|
||
|
+ this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
|
||
|
+ this.a(CreativeModeTab.e);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean e() {
|
||
|
+ return this.a;
|
||
|
+ }
|
||
|
+
|
||
|
+ public AxisAlignedBB a(World world, int i, int j, int k) {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean c() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) {
|
||
|
+ this.updateShape(world, i, j, k);
|
||
|
+ return super.a(world, i, j, k, vec3d, vec3d1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) {
|
||
|
+ int l = iblockaccess.getData(i, j, k);
|
||
|
+
|
||
|
+ if (l >= 2 && l <= 5) {
|
||
|
+ this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F);
|
||
|
+ } else {
|
||
|
+ this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean d() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int b() {
|
||
|
+ return 9;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int a(Random random) {
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean canPlace(World world, int i, int j, int k) {
|
||
|
+ return World.a((IBlockAccess) world, i, j - 1, k);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void onPlace(World world, int i, int j, int k) {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ this.a(world, i, j, k, true);
|
||
|
+ if (this.a) {
|
||
|
+ this.doPhysics(world, i, j, k, this);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void doPhysics(World world, int i, int j, int k, Block block) {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ int l = world.getData(i, j, k);
|
||
|
+ int i1 = l;
|
||
|
+
|
||
|
+ if (this.a) {
|
||
|
+ i1 = l & 7;
|
||
|
+ }
|
||
|
+
|
||
|
+ boolean flag = false;
|
||
|
+
|
||
|
+ if (!World.a((IBlockAccess) world, i, j - 1, k)) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i1 == 2 && !World.a((IBlockAccess) world, i + 1, j, k)) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i1 == 3 && !World.a((IBlockAccess) world, i - 1, j, k)) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i1 == 4 && !World.a((IBlockAccess) world, i, j, k - 1)) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i1 == 5 && !World.a((IBlockAccess) world, i, j, k + 1)) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ this.b(world, i, j, k, world.getData(i, j, k), 0);
|
||
|
+ world.setAir(i, j, k);
|
||
|
+ } else {
|
||
|
+ this.a(world, i, j, k, l, i1, block);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void a(World world, int i, int j, int k, int l, int i1, Block block) {}
|
||
|
+
|
||
|
+ protected void a(World world, int i, int j, int k, boolean flag) {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ (new MinecartTrackLogic(this, world, i, j, k)).a(world.isBlockIndirectlyPowered(i, j, k), flag);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public int h() {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void remove(World world, int i, int j, int k, Block block, int l) {
|
||
|
+ int i1 = l;
|
||
|
+
|
||
|
+ if (this.a) {
|
||
|
+ i1 = l & 7;
|
||
|
+ }
|
||
|
+
|
||
|
+ super.remove(world, i, j, k, block, l);
|
||
|
+ if (i1 == 2 || i1 == 3 || i1 == 4 || i1 == 5) {
|
||
|
+ world.applyPhysics(i, j + 1, k, block);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.a) {
|
||
|
+ world.applyPhysics(i, j, k, block);
|
||
|
+ world.applyPhysics(i, j - 1, k, block);
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/BlockTorch.java b/src/main/java/net/minecraft/server/BlockTorch.java
|
||
|
new file mode 100644
|
||
|
index 000000000..d95aff288
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/BlockTorch.java
|
||
|
@@ -0,0 +1,167 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class BlockTorch extends Block {
|
||
|
+
|
||
|
+ protected BlockTorch() {
|
||
|
+ super(Material.ORIENTABLE);
|
||
|
+ this.a(true);
|
||
|
+ this.a(CreativeModeTab.c);
|
||
|
+ }
|
||
|
+
|
||
|
+ public AxisAlignedBB a(World world, int i, int j, int k) {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean c() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean d() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int b() {
|
||
|
+ return 2;
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean m(World world, int i, int j, int k) {
|
||
|
+ if (World.a((IBlockAccess) world, i, j, k)) {
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ Block block = world.getType(i, j, k);
|
||
|
+
|
||
|
+ return block == Blocks.FENCE || block == Blocks.NETHER_FENCE || block == Blocks.GLASS || block == Blocks.COBBLE_WALL;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean canPlace(World world, int i, int j, int k) {
|
||
|
+ return world.c(i - 1, j, k, true) ? true : (world.c(i + 1, j, k, true) ? true : (world.c(i, j, k - 1, true) ? true : (world.c(i, j, k + 1, true) ? true : this.m(world, i, j - 1, k))));
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) {
|
||
|
+ int j1 = i1;
|
||
|
+
|
||
|
+ if (l == 1 && this.m(world, i, j - 1, k)) {
|
||
|
+ j1 = 5;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l == 2 && world.c(i, j, k + 1, true)) {
|
||
|
+ j1 = 4;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l == 3 && world.c(i, j, k - 1, true)) {
|
||
|
+ j1 = 3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l == 4 && world.c(i + 1, j, k, true)) {
|
||
|
+ j1 = 2;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l == 5 && world.c(i - 1, j, k, true)) {
|
||
|
+ j1 = 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ return j1;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(World world, int i, int j, int k, Random random) {
|
||
|
+ super.a(world, i, j, k, random);
|
||
|
+ if (world.getData(i, j, k) == 0) {
|
||
|
+ this.onPlace(world, i, j, k);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void onPlace(World world, int i, int j, int k) {
|
||
|
+ if (world.getData(i, j, k) == 0) {
|
||
|
+ if (world.c(i - 1, j, k, true)) {
|
||
|
+ world.setData(i, j, k, 1, 2);
|
||
|
+ } else if (world.c(i + 1, j, k, true)) {
|
||
|
+ world.setData(i, j, k, 2, 2);
|
||
|
+ } else if (world.c(i, j, k - 1, true)) {
|
||
|
+ world.setData(i, j, k, 3, 2);
|
||
|
+ } else if (world.c(i, j, k + 1, true)) {
|
||
|
+ world.setData(i, j, k, 4, 2);
|
||
|
+ } else if (this.m(world, i, j - 1, k)) {
|
||
|
+ world.setData(i, j, k, 5, 2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ this.e(world, i, j, k);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void doPhysics(World world, int i, int j, int k, Block block) {
|
||
|
+ this.b(world, i, j, k, block);
|
||
|
+ }
|
||
|
+
|
||
|
+ protected boolean b(World world, int i, int j, int k, Block block) {
|
||
|
+ if (this.e(world, i, j, k)) {
|
||
|
+ int l = world.getData(i, j, k);
|
||
|
+ boolean flag = false;
|
||
|
+
|
||
|
+ if (!world.c(i - 1, j, k, true) && l == 1) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!world.c(i + 1, j, k, true) && l == 2) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!world.c(i, j, k - 1, true) && l == 3) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!world.c(i, j, k + 1, true) && l == 4) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!this.m(world, i, j - 1, k) && l == 5) {
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ this.b(world, i, j, k, world.getData(i, j, k), 0);
|
||
|
+ world.setAir(i, j, k);
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected boolean e(World world, int i, int j, int k) {
|
||
|
+ if (!this.canPlace(world, i, j, k)) {
|
||
|
+ if (world.getType(i, j, k) == this) {
|
||
|
+ this.b(world, i, j, k, world.getData(i, j, k), 0);
|
||
|
+ world.setAir(i, j, k);
|
||
|
+ }
|
||
|
+
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) {
|
||
|
+ int l = world.getData(i, j, k) & 7;
|
||
|
+ float f = 0.15F;
|
||
|
+
|
||
|
+ if (l == 1) {
|
||
|
+ this.a(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f);
|
||
|
+ } else if (l == 2) {
|
||
|
+ this.a(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f);
|
||
|
+ } else if (l == 3) {
|
||
|
+ this.a(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F);
|
||
|
+ } else if (l == 4) {
|
||
|
+ this.a(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F);
|
||
|
+ } else {
|
||
|
+ f = 0.1F;
|
||
|
+ this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.6F, 0.5F + f);
|
||
|
+ }
|
||
|
+
|
||
|
+ return super.a(world, i, j, k, vec3d, vec3d1);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkCoordIntPair.java b/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
||
|
new file mode 100644
|
||
|
index 000000000..1594f40de
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkCoordIntPair.java
|
||
|
@@ -0,0 +1,51 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ChunkCoordIntPair {
|
||
|
+
|
||
|
+ public final int x;
|
||
|
+ public final int z;
|
||
|
+
|
||
|
+ public ChunkCoordIntPair(int i, int j) {
|
||
|
+ this.x = i;
|
||
|
+ this.z = j;
|
||
|
+ }
|
||
|
+
|
||
|
+ public static long a(int i, int j) {
|
||
|
+ return (long) i & 4294967295L | ((long) j & 4294967295L) << 32;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int hashCode() {
|
||
|
+ int i = 1664525 * this.x + 1013904223;
|
||
|
+ int j = 1664525 * (this.z ^ -559038737) + 1013904223;
|
||
|
+
|
||
|
+ return i ^ j;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean equals(Object object) {
|
||
|
+ if (this == object) {
|
||
|
+ return true;
|
||
|
+ } else if (!(object instanceof ChunkCoordIntPair)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) object;
|
||
|
+
|
||
|
+ return this.x == chunkcoordintpair.x && this.z == chunkcoordintpair.z;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public int a() {
|
||
|
+ return (this.x << 4) + 8;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int b() {
|
||
|
+ return (this.z << 4) + 8;
|
||
|
+ }
|
||
|
+
|
||
|
+ public ChunkPosition a(int i) {
|
||
|
+ return new ChunkPosition(this.a(), i, this.b());
|
||
|
+ }
|
||
|
+
|
||
|
+ public String toString() {
|
||
|
+ return "[" + this.x + ", " + this.z + "]";
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkMap.java b/src/main/java/net/minecraft/server/ChunkMap.java
|
||
|
new file mode 100644
|
||
|
index 000000000..374983a06
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkMap.java
|
||
|
@@ -0,0 +1,10 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ChunkMap {
|
||
|
+
|
||
|
+ public byte[] a;
|
||
|
+ public int b;
|
||
|
+ public int c;
|
||
|
+
|
||
|
+ public ChunkMap() {}
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderFlat.java b/src/main/java/net/minecraft/server/ChunkProviderFlat.java
|
||
|
new file mode 100644
|
||
|
index 000000000..0f7518287
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderFlat.java
|
||
|
@@ -0,0 +1,238 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.Iterator;
|
||
|
+import java.util.List;
|
||
|
+import java.util.Map;
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class ChunkProviderFlat implements IChunkProvider {
|
||
|
+
|
||
|
+ private World a;
|
||
|
+ private Random b;
|
||
|
+ private final Block[] c = new Block[256];
|
||
|
+ private final byte[] d = new byte[256];
|
||
|
+ private final WorldGenFlatInfo e;
|
||
|
+ private final List f = new ArrayList();
|
||
|
+ private final boolean g;
|
||
|
+ private final boolean h;
|
||
|
+ private WorldGenLakes i;
|
||
|
+ private WorldGenLakes j;
|
||
|
+
|
||
|
+ public ChunkProviderFlat(World world, long i, boolean flag, String s) {
|
||
|
+ this.a = world;
|
||
|
+ this.b = new Random(i);
|
||
|
+ this.e = WorldGenFlatInfo.a(s);
|
||
|
+ if (flag) {
|
||
|
+ Map map = this.e.b();
|
||
|
+
|
||
|
+ if (map.containsKey("village")) {
|
||
|
+ Map map1 = (Map) map.get("village");
|
||
|
+
|
||
|
+ if (!map1.containsKey("size")) {
|
||
|
+ map1.put("size", "1");
|
||
|
+ }
|
||
|
+
|
||
|
+ this.f.add(new WorldGenVillage(map1));
|
||
|
+ }
|
||
|
+
|
||
|
+ if (map.containsKey("biome_1")) {
|
||
|
+ this.f.add(new WorldGenLargeFeature((Map) map.get("biome_1")));
|
||
|
+ }
|
||
|
+
|
||
|
+ if (map.containsKey("mineshaft")) {
|
||
|
+ this.f.add(new WorldGenMineshaft((Map) map.get("mineshaft")));
|
||
|
+ }
|
||
|
+
|
||
|
+ if (map.containsKey("stronghold")) {
|
||
|
+ this.f.add(new WorldGenStronghold((Map) map.get("stronghold")));
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ this.g = this.e.b().containsKey("decoration");
|
||
|
+ if (this.e.b().containsKey("lake")) {
|
||
|
+ this.i = new WorldGenLakes(Blocks.STATIONARY_WATER);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.e.b().containsKey("lava_lake")) {
|
||
|
+ this.j = new WorldGenLakes(Blocks.STATIONARY_LAVA);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.h = this.e.b().containsKey("dungeon");
|
||
|
+ Iterator iterator = this.e.c().iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ WorldGenFlatLayerInfo worldgenflatlayerinfo = (WorldGenFlatLayerInfo) iterator.next();
|
||
|
+
|
||
|
+ for (int j = worldgenflatlayerinfo.d(); j < worldgenflatlayerinfo.d() + worldgenflatlayerinfo.a(); ++j) {
|
||
|
+ this.c[j] = worldgenflatlayerinfo.b();
|
||
|
+ this.d[j] = (byte) worldgenflatlayerinfo.c();
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public Chunk getChunkAt(int i, int j) {
|
||
|
+ return this.getOrCreateChunk(i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public Chunk getOrCreateChunk(int i, int j) {
|
||
|
+ Chunk chunk = new Chunk(this.a, i, j);
|
||
|
+
|
||
|
+ int k;
|
||
|
+
|
||
|
+ for (int l = 0; l < this.c.length; ++l) {
|
||
|
+ Block block = this.c[l];
|
||
|
+
|
||
|
+ if (block != null) {
|
||
|
+ k = l >> 4;
|
||
|
+ ChunkSection chunksection = chunk.getSections()[k];
|
||
|
+
|
||
|
+ if (chunksection == null) {
|
||
|
+ chunksection = new ChunkSection(l, !this.a.worldProvider.g);
|
||
|
+ chunk.getSections()[k] = chunksection;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < 16; ++i1) {
|
||
|
+ for (int j1 = 0; j1 < 16; ++j1) {
|
||
|
+ chunksection.setTypeId(i1, l & 15, j1, block);
|
||
|
+ chunksection.setData(i1, l & 15, j1, this.d[l]);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ chunk.initLighting();
|
||
|
+ BiomeBase[] abiomebase = this.a.getWorldChunkManager().getBiomeBlock((BiomeBase[]) null, i * 16, j * 16, 16, 16);
|
||
|
+ byte[] abyte = chunk.m();
|
||
|
+
|
||
|
+ for (k = 0; k < abyte.length; ++k) {
|
||
|
+ abyte[k] = (byte) abiomebase[k].id;
|
||
|
+ }
|
||
|
+
|
||
|
+ Iterator iterator = this.f.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ WorldGenBase worldgenbase = (WorldGenBase) iterator.next();
|
||
|
+
|
||
|
+ worldgenbase.a(this, this.a, i, j, (Block[]) null);
|
||
|
+ }
|
||
|
+
|
||
|
+ chunk.initLighting();
|
||
|
+ return chunk;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isChunkLoaded(int i, int j) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void getChunkAt(IChunkProvider ichunkprovider, int i, int j) {
|
||
|
+ int k = i * 16;
|
||
|
+ int l = j * 16;
|
||
|
+ BiomeBase biomebase = this.a.getBiome(k + 16, l + 16);
|
||
|
+ boolean flag = false;
|
||
|
+
|
||
|
+ this.b.setSeed(this.a.getSeed());
|
||
|
+ long i1 = this.b.nextLong() / 2L * 2L + 1L;
|
||
|
+ long j1 = this.b.nextLong() / 2L * 2L + 1L;
|
||
|
+
|
||
|
+ this.b.setSeed((long) i * i1 + (long) j * j1 ^ this.a.getSeed());
|
||
|
+ Iterator iterator = this.f.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ StructureGenerator structuregenerator = (StructureGenerator) iterator.next();
|
||
|
+ boolean flag1 = structuregenerator.a(this.a, this.b, i, j);
|
||
|
+
|
||
|
+ if (structuregenerator instanceof WorldGenVillage) {
|
||
|
+ flag |= flag1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ int k1;
|
||
|
+ int l1;
|
||
|
+ int i2;
|
||
|
+
|
||
|
+ if (this.i != null && !flag && this.b.nextInt(4) == 0) {
|
||
|
+ l1 = k + this.b.nextInt(16) + 8;
|
||
|
+ k1 = this.b.nextInt(256);
|
||
|
+ i2 = l + this.b.nextInt(16) + 8;
|
||
|
+ this.i.generate(this.a, this.b, l1, k1, i2);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.j != null && !flag && this.b.nextInt(8) == 0) {
|
||
|
+ l1 = k + this.b.nextInt(16) + 8;
|
||
|
+ k1 = this.b.nextInt(this.b.nextInt(248) + 8);
|
||
|
+ i2 = l + this.b.nextInt(16) + 8;
|
||
|
+ if (k1 < 63 || this.b.nextInt(10) == 0) {
|
||
|
+ this.j.generate(this.a, this.b, l1, k1, i2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.h) {
|
||
|
+ for (l1 = 0; l1 < 8; ++l1) {
|
||
|
+ k1 = k + this.b.nextInt(16) + 8;
|
||
|
+ i2 = this.b.nextInt(256);
|
||
|
+ int j2 = l + this.b.nextInt(16) + 8;
|
||
|
+
|
||
|
+ (new WorldGenDungeons()).generate(this.a, this.b, k1, i2, j2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.g) {
|
||
|
+ biomebase.a(this.a, this.b, k, l);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {}
|
||
|
+
|
||
|
+ public boolean unloadChunks() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean canSave() {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String getName() {
|
||
|
+ return "FlatLevelSource";
|
||
|
+ }
|
||
|
+
|
||
|
+ public List getMobsFor(EnumCreatureType enumcreaturetype, int i, int j, int k) {
|
||
|
+ BiomeBase biomebase = this.a.getBiome(i, k);
|
||
|
+
|
||
|
+ return biomebase.getMobs(enumcreaturetype);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ChunkPosition findNearestMapFeature(World world, String s, int i, int j, int k) {
|
||
|
+ if ("Stronghold".equals(s)) {
|
||
|
+ Iterator iterator = this.f.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ StructureGenerator structuregenerator = (StructureGenerator) iterator.next();
|
||
|
+
|
||
|
+ if (structuregenerator instanceof WorldGenStronghold) {
|
||
|
+ return structuregenerator.getNearestGeneratedFeature(world, i, j, k);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getLoadedChunks() {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void recreateStructures(int i, int j) {
|
||
|
+ Iterator iterator = this.f.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ StructureGenerator structuregenerator = (StructureGenerator) iterator.next();
|
||
|
+
|
||
|
+ structuregenerator.a(this, this.a, i, j, (Block[]) null);
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
|
||
|
new file mode 100644
|
||
|
index 000000000..813df4d63
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
|
||
|
@@ -0,0 +1,392 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.List;
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class ChunkProviderGenerate implements IChunkProvider {
|
||
|
+
|
||
|
+ private Random i;
|
||
|
+ private NoiseGeneratorOctaves j;
|
||
|
+ private NoiseGeneratorOctaves k;
|
||
|
+ private NoiseGeneratorOctaves l;
|
||
|
+ private NoiseGenerator3 m;
|
||
|
+ public NoiseGeneratorOctaves a;
|
||
|
+ public NoiseGeneratorOctaves b;
|
||
|
+ public NoiseGeneratorOctaves c;
|
||
|
+ private World n;
|
||
|
+ private final boolean o;
|
||
|
+ private WorldType p;
|
||
|
+ private final double[] q;
|
||
|
+ private final float[] r;
|
||
|
+ private double[] s = new double[256];
|
||
|
+ private WorldGenBase t = new WorldGenCaves();
|
||
|
+ private WorldGenStronghold u = new WorldGenStronghold();
|
||
|
+ private WorldGenVillage v = new WorldGenVillage();
|
||
|
+ private WorldGenMineshaft w = new WorldGenMineshaft();
|
||
|
+ private WorldGenLargeFeature x = new WorldGenLargeFeature();
|
||
|
+ private WorldGenBase y = new WorldGenCanyon();
|
||
|
+ private BiomeBase[] z;
|
||
|
+ double[] d;
|
||
|
+ double[] e;
|
||
|
+ double[] f;
|
||
|
+ double[] g;
|
||
|
+ int[][] h = new int[32][32];
|
||
|
+
|
||
|
+ public ChunkProviderGenerate(World world, long i, boolean flag) {
|
||
|
+ this.n = world;
|
||
|
+ this.o = flag;
|
||
|
+ this.p = world.getWorldData().getType();
|
||
|
+ this.i = new Random(i);
|
||
|
+ this.j = new NoiseGeneratorOctaves(this.i, 16);
|
||
|
+ this.k = new NoiseGeneratorOctaves(this.i, 16);
|
||
|
+ this.l = new NoiseGeneratorOctaves(this.i, 8);
|
||
|
+ this.m = new NoiseGenerator3(this.i, 4);
|
||
|
+ this.a = new NoiseGeneratorOctaves(this.i, 10);
|
||
|
+ this.b = new NoiseGeneratorOctaves(this.i, 16);
|
||
|
+ this.c = new NoiseGeneratorOctaves(this.i, 8);
|
||
|
+ this.q = new double[825];
|
||
|
+ this.r = new float[25];
|
||
|
+
|
||
|
+ for (int j = -2; j <= 2; ++j) {
|
||
|
+ for (int k = -2; k <= 2; ++k) {
|
||
|
+ float f = 10.0F / MathHelper.c((float) (j * j + k * k) + 0.2F);
|
||
|
+
|
||
|
+ this.r[j + 2 + (k + 2) * 5] = f;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(int i, int j, Block[] ablock) {
|
||
|
+ byte b0 = 63;
|
||
|
+
|
||
|
+ this.z = this.n.getWorldChunkManager().getBiomes(this.z, i * 4 - 2, j * 4 - 2, 10, 10);
|
||
|
+ this.a(i * 4, 0, j * 4);
|
||
|
+
|
||
|
+ for (int k = 0; k < 4; ++k) {
|
||
|
+ int l = k * 5;
|
||
|
+ int i1 = (k + 1) * 5;
|
||
|
+
|
||
|
+ for (int j1 = 0; j1 < 4; ++j1) {
|
||
|
+ int k1 = (l + j1) * 33;
|
||
|
+ int l1 = (l + j1 + 1) * 33;
|
||
|
+ int i2 = (i1 + j1) * 33;
|
||
|
+ int j2 = (i1 + j1 + 1) * 33;
|
||
|
+
|
||
|
+ for (int k2 = 0; k2 < 32; ++k2) {
|
||
|
+ double d0 = 0.125D;
|
||
|
+ double d1 = this.q[k1 + k2];
|
||
|
+ double d2 = this.q[l1 + k2];
|
||
|
+ double d3 = this.q[i2 + k2];
|
||
|
+ double d4 = this.q[j2 + k2];
|
||
|
+ double d5 = (this.q[k1 + k2 + 1] - d1) * d0;
|
||
|
+ double d6 = (this.q[l1 + k2 + 1] - d2) * d0;
|
||
|
+ double d7 = (this.q[i2 + k2 + 1] - d3) * d0;
|
||
|
+ double d8 = (this.q[j2 + k2 + 1] - d4) * d0;
|
||
|
+
|
||
|
+ for (int l2 = 0; l2 < 8; ++l2) {
|
||
|
+ double d9 = 0.25D;
|
||
|
+ double d10 = d1;
|
||
|
+ double d11 = d2;
|
||
|
+ double d12 = (d3 - d1) * d9;
|
||
|
+ double d13 = (d4 - d2) * d9;
|
||
|
+
|
||
|
+ for (int i3 = 0; i3 < 4; ++i3) {
|
||
|
+ int j3 = i3 + k * 4 << 12 | 0 + j1 * 4 << 8 | k2 * 8 + l2;
|
||
|
+ short short1 = 256;
|
||
|
+
|
||
|
+ j3 -= short1;
|
||
|
+ double d14 = 0.25D;
|
||
|
+ double d15 = (d11 - d10) * d14;
|
||
|
+ double d16 = d10 - d15;
|
||
|
+
|
||
|
+ for (int k3 = 0; k3 < 4; ++k3) {
|
||
|
+ if ((d16 += d15) > 0.0D) {
|
||
|
+ ablock[j3 += short1] = Blocks.STONE;
|
||
|
+ } else if (k2 * 8 + l2 < b0) {
|
||
|
+ ablock[j3 += short1] = Blocks.STATIONARY_WATER;
|
||
|
+ } else {
|
||
|
+ ablock[j3 += short1] = null;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ d10 += d12;
|
||
|
+ d11 += d13;
|
||
|
+ }
|
||
|
+
|
||
|
+ d1 += d5;
|
||
|
+ d2 += d6;
|
||
|
+ d3 += d7;
|
||
|
+ d4 += d8;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(int i, int j, Block[] ablock, byte[] abyte, BiomeBase[] abiomebase) {
|
||
|
+ double d0 = 0.03125D;
|
||
|
+
|
||
|
+ this.s = this.m.a(this.s, (double) (i * 16), (double) (j * 16), 16, 16, d0 * 2.0D, d0 * 2.0D, 1.0D);
|
||
|
+
|
||
|
+ for (int k = 0; k < 16; ++k) {
|
||
|
+ for (int l = 0; l < 16; ++l) {
|
||
|
+ BiomeBase biomebase = abiomebase[l + k * 16];
|
||
|
+
|
||
|
+ biomebase.a(this.n, this.i, ablock, abyte, i * 16 + k, j * 16 + l, this.s[l + k * 16]);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public Chunk getChunkAt(int i, int j) {
|
||
|
+ return this.getOrCreateChunk(i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public Chunk getOrCreateChunk(int i, int j) {
|
||
|
+ this.i.setSeed((long) i * 341873128712L + (long) j * 132897987541L);
|
||
|
+ Block[] ablock = new Block[65536];
|
||
|
+ byte[] abyte = new byte[65536];
|
||
|
+
|
||
|
+ this.a(i, j, ablock);
|
||
|
+ this.z = this.n.getWorldChunkManager().getBiomeBlock(this.z, i * 16, j * 16, 16, 16);
|
||
|
+ this.a(i, j, ablock, abyte, this.z);
|
||
|
+ this.t.a(this, this.n, i, j, ablock);
|
||
|
+ this.y.a(this, this.n, i, j, ablock);
|
||
|
+ if (this.o) {
|
||
|
+ this.w.a(this, this.n, i, j, ablock);
|
||
|
+ this.v.a(this, this.n, i, j, ablock);
|
||
|
+ this.u.a(this, this.n, i, j, ablock);
|
||
|
+ this.x.a(this, this.n, i, j, ablock);
|
||
|
+ }
|
||
|
+
|
||
|
+ Chunk chunk = new Chunk(this.n, ablock, abyte, i, j);
|
||
|
+ byte[] abyte1 = chunk.m();
|
||
|
+
|
||
|
+ for (int k = 0; k < abyte1.length; ++k) {
|
||
|
+ abyte1[k] = (byte) this.z[k].id;
|
||
|
+ }
|
||
|
+
|
||
|
+ chunk.initLighting();
|
||
|
+ return chunk;
|
||
|
+ }
|
||
|
+
|
||
|
+ private void a(int i, int j, int k) {
|
||
|
+ double d0 = 684.412D;
|
||
|
+ double d1 = 684.412D;
|
||
|
+ double d2 = 512.0D;
|
||
|
+ double d3 = 512.0D;
|
||
|
+
|
||
|
+ this.g = this.b.a(this.g, i, k, 5, 5, 200.0D, 200.0D, 0.5D);
|
||
|
+ this.d = this.l.a(this.d, i, j, k, 5, 33, 5, 8.555150000000001D, 4.277575000000001D, 8.555150000000001D);
|
||
|
+ this.e = this.j.a(this.e, i, j, k, 5, 33, 5, 684.412D, 684.412D, 684.412D);
|
||
|
+ this.f = this.k.a(this.f, i, j, k, 5, 33, 5, 684.412D, 684.412D, 684.412D);
|
||
|
+ boolean flag = false;
|
||
|
+ boolean flag1 = false;
|
||
|
+ int l = 0;
|
||
|
+ int i1 = 0;
|
||
|
+ double d4 = 8.5D;
|
||
|
+
|
||
|
+ for (int j1 = 0; j1 < 5; ++j1) {
|
||
|
+ for (int k1 = 0; k1 < 5; ++k1) {
|
||
|
+ float f = 0.0F;
|
||
|
+ float f1 = 0.0F;
|
||
|
+ float f2 = 0.0F;
|
||
|
+ byte b0 = 2;
|
||
|
+ BiomeBase biomebase = this.z[j1 + 2 + (k1 + 2) * 10];
|
||
|
+
|
||
|
+ for (int l1 = -b0; l1 <= b0; ++l1) {
|
||
|
+ for (int i2 = -b0; i2 <= b0; ++i2) {
|
||
|
+ BiomeBase biomebase1 = this.z[j1 + l1 + 2 + (k1 + i2 + 2) * 10];
|
||
|
+ float f3 = biomebase1.am;
|
||
|
+ float f4 = biomebase1.an;
|
||
|
+
|
||
|
+ if (this.p == WorldType.AMPLIFIED && f3 > 0.0F) {
|
||
|
+ f3 = 1.0F + f3 * 2.0F;
|
||
|
+ f4 = 1.0F + f4 * 4.0F;
|
||
|
+ }
|
||
|
+
|
||
|
+ float f5 = this.r[l1 + 2 + (i2 + 2) * 5] / (f3 + 2.0F);
|
||
|
+
|
||
|
+ if (biomebase1.am > biomebase.am) {
|
||
|
+ f5 /= 2.0F;
|
||
|
+ }
|
||
|
+
|
||
|
+ f += f4 * f5;
|
||
|
+ f1 += f3 * f5;
|
||
|
+ f2 += f5;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ f /= f2;
|
||
|
+ f1 /= f2;
|
||
|
+ f = f * 0.9F + 0.1F;
|
||
|
+ f1 = (f1 * 4.0F - 1.0F) / 8.0F;
|
||
|
+ double d5 = this.g[i1] / 8000.0D;
|
||
|
+
|
||
|
+ if (d5 < 0.0D) {
|
||
|
+ d5 = -d5 * 0.3D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d5 = d5 * 3.0D - 2.0D;
|
||
|
+ if (d5 < 0.0D) {
|
||
|
+ d5 /= 2.0D;
|
||
|
+ if (d5 < -1.0D) {
|
||
|
+ d5 = -1.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d5 /= 1.4D;
|
||
|
+ d5 /= 2.0D;
|
||
|
+ } else {
|
||
|
+ if (d5 > 1.0D) {
|
||
|
+ d5 = 1.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d5 /= 8.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ ++i1;
|
||
|
+ double d6 = (double) f1;
|
||
|
+ double d7 = (double) f;
|
||
|
+
|
||
|
+ d6 += d5 * 0.2D;
|
||
|
+ d6 = d6 * 8.5D / 8.0D;
|
||
|
+ double d8 = 8.5D + d6 * 4.0D;
|
||
|
+
|
||
|
+ for (int j2 = 0; j2 < 33; ++j2) {
|
||
|
+ double d9 = ((double) j2 - d8) * 12.0D * 128.0D / 256.0D / d7;
|
||
|
+
|
||
|
+ if (d9 < 0.0D) {
|
||
|
+ d9 *= 4.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ double d10 = this.e[l] / 512.0D;
|
||
|
+ double d11 = this.f[l] / 512.0D;
|
||
|
+ double d12 = (this.d[l] / 10.0D + 1.0D) / 2.0D;
|
||
|
+ double d13 = MathHelper.b(d10, d11, d12) - d9;
|
||
|
+
|
||
|
+ if (j2 > 29) {
|
||
|
+ double d14 = (double) ((float) (j2 - 29) / 3.0F);
|
||
|
+
|
||
|
+ d13 = d13 * (1.0D - d14) + -10.0D * d14;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.q[l] = d13;
|
||
|
+ ++l;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isChunkLoaded(int i, int j) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void getChunkAt(IChunkProvider ichunkprovider, int i, int j) {
|
||
|
+ BlockFalling.instaFall = true;
|
||
|
+ int k = i * 16;
|
||
|
+ int l = j * 16;
|
||
|
+ BiomeBase biomebase = this.n.getBiome(k + 16, l + 16);
|
||
|
+
|
||
|
+ this.i.setSeed(this.n.getSeed());
|
||
|
+ long i1 = this.i.nextLong() / 2L * 2L + 1L;
|
||
|
+ long j1 = this.i.nextLong() / 2L * 2L + 1L;
|
||
|
+
|
||
|
+ this.i.setSeed((long) i * i1 + (long) j * j1 ^ this.n.getSeed());
|
||
|
+ boolean flag = false;
|
||
|
+
|
||
|
+ if (this.o) {
|
||
|
+ this.w.a(this.n, this.i, i, j);
|
||
|
+ flag = this.v.a(this.n, this.i, i, j);
|
||
|
+ this.u.a(this.n, this.i, i, j);
|
||
|
+ this.x.a(this.n, this.i, i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ int k1;
|
||
|
+ int l1;
|
||
|
+ int i2;
|
||
|
+
|
||
|
+ if (biomebase != BiomeBase.DESERT && biomebase != BiomeBase.DESERT_HILLS && !flag && this.i.nextInt(4) == 0) {
|
||
|
+ k1 = k + this.i.nextInt(16) + 8;
|
||
|
+ l1 = this.i.nextInt(256);
|
||
|
+ i2 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenLakes(Blocks.STATIONARY_WATER)).generate(this.n, this.i, k1, l1, i2);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!flag && this.i.nextInt(8) == 0) {
|
||
|
+ k1 = k + this.i.nextInt(16) + 8;
|
||
|
+ l1 = this.i.nextInt(this.i.nextInt(248) + 8);
|
||
|
+ i2 = l + this.i.nextInt(16) + 8;
|
||
|
+ if (l1 < 63 || this.i.nextInt(10) == 0) {
|
||
|
+ (new WorldGenLakes(Blocks.STATIONARY_LAVA)).generate(this.n, this.i, k1, l1, i2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ for (k1 = 0; k1 < 8; ++k1) {
|
||
|
+ l1 = k + this.i.nextInt(16) + 8;
|
||
|
+ i2 = this.i.nextInt(256);
|
||
|
+ int j2 = l + this.i.nextInt(16) + 8;
|
||
|
+
|
||
|
+ (new WorldGenDungeons()).generate(this.n, this.i, l1, i2, j2);
|
||
|
+ }
|
||
|
+
|
||
|
+ biomebase.a(this.n, this.i, k, l);
|
||
|
+ SpawnerCreature.a(this.n, biomebase, k + 8, l + 8, 16, 16, this.i);
|
||
|
+ k += 8;
|
||
|
+ l += 8;
|
||
|
+
|
||
|
+ for (k1 = 0; k1 < 16; ++k1) {
|
||
|
+ for (l1 = 0; l1 < 16; ++l1) {
|
||
|
+ i2 = this.n.h(k + k1, l + l1);
|
||
|
+ if (this.n.r(k1 + k, i2 - 1, l1 + l)) {
|
||
|
+ this.n.setTypeAndData(k1 + k, i2 - 1, l1 + l, Blocks.ICE, 0, 2);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.n.e(k1 + k, i2, l1 + l, true)) {
|
||
|
+ this.n.setTypeAndData(k1 + k, i2, l1 + l, Blocks.SNOW, 0, 2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ BlockFalling.instaFall = false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {}
|
||
|
+
|
||
|
+ public boolean unloadChunks() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean canSave() {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String getName() {
|
||
|
+ return "RandomLevelSource";
|
||
|
+ }
|
||
|
+
|
||
|
+ public List getMobsFor(EnumCreatureType enumcreaturetype, int i, int j, int k) {
|
||
|
+ BiomeBase biomebase = this.n.getBiome(i, k);
|
||
|
+
|
||
|
+ return enumcreaturetype == EnumCreatureType.MONSTER && this.x.a(i, j, k) ? this.x.b() : biomebase.getMobs(enumcreaturetype);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ChunkPosition findNearestMapFeature(World world, String s, int i, int j, int k) {
|
||
|
+ return "Stronghold".equals(s) && this.u != null ? this.u.getNearestGeneratedFeature(world, i, j, k) : null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getLoadedChunks() {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void recreateStructures(int i, int j) {
|
||
|
+ if (this.o) {
|
||
|
+ this.w.a(this, this.n, i, j, (Block[]) null);
|
||
|
+ this.v.a(this, this.n, i, j, (Block[]) null);
|
||
|
+ this.u.a(this, this.n, i, j, (Block[]) null);
|
||
|
+ this.x.a(this, this.n, i, j, (Block[]) null);
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderHell.java b/src/main/java/net/minecraft/server/ChunkProviderHell.java
|
||
|
new file mode 100644
|
||
|
index 000000000..ef4894e63
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderHell.java
|
||
|
@@ -0,0 +1,445 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.List;
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class ChunkProviderHell implements IChunkProvider {
|
||
|
+
|
||
|
+ private Random i;
|
||
|
+ private NoiseGeneratorOctaves j;
|
||
|
+ private NoiseGeneratorOctaves k;
|
||
|
+ private NoiseGeneratorOctaves l;
|
||
|
+ private NoiseGeneratorOctaves m;
|
||
|
+ private NoiseGeneratorOctaves n;
|
||
|
+ public NoiseGeneratorOctaves a;
|
||
|
+ public NoiseGeneratorOctaves b;
|
||
|
+ private World o;
|
||
|
+ private double[] p;
|
||
|
+ public WorldGenNether c = new WorldGenNether();
|
||
|
+ private double[] q = new double[256];
|
||
|
+ private double[] r = new double[256];
|
||
|
+ private double[] s = new double[256];
|
||
|
+ private WorldGenBase t = new WorldGenCavesHell();
|
||
|
+ double[] d;
|
||
|
+ double[] e;
|
||
|
+ double[] f;
|
||
|
+ double[] g;
|
||
|
+ double[] h;
|
||
|
+
|
||
|
+ public ChunkProviderHell(World world, long i) {
|
||
|
+ this.o = world;
|
||
|
+ this.i = new Random(i);
|
||
|
+ this.j = new NoiseGeneratorOctaves(this.i, 16);
|
||
|
+ this.k = new NoiseGeneratorOctaves(this.i, 16);
|
||
|
+ this.l = new NoiseGeneratorOctaves(this.i, 8);
|
||
|
+ this.m = new NoiseGeneratorOctaves(this.i, 4);
|
||
|
+ this.n = new NoiseGeneratorOctaves(this.i, 4);
|
||
|
+ this.a = new NoiseGeneratorOctaves(this.i, 10);
|
||
|
+ this.b = new NoiseGeneratorOctaves(this.i, 16);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(int i, int j, Block[] ablock) {
|
||
|
+ byte b0 = 4;
|
||
|
+ byte b1 = 32;
|
||
|
+ int k = b0 + 1;
|
||
|
+ byte b2 = 17;
|
||
|
+ int l = b0 + 1;
|
||
|
+
|
||
|
+ this.p = this.a(this.p, i * b0, 0, j * b0, k, b2, l);
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < b0; ++i1) {
|
||
|
+ for (int j1 = 0; j1 < b0; ++j1) {
|
||
|
+ for (int k1 = 0; k1 < 16; ++k1) {
|
||
|
+ double d0 = 0.125D;
|
||
|
+ double d1 = this.p[((i1 + 0) * l + j1 + 0) * b2 + k1 + 0];
|
||
|
+ double d2 = this.p[((i1 + 0) * l + j1 + 1) * b2 + k1 + 0];
|
||
|
+ double d3 = this.p[((i1 + 1) * l + j1 + 0) * b2 + k1 + 0];
|
||
|
+ double d4 = this.p[((i1 + 1) * l + j1 + 1) * b2 + k1 + 0];
|
||
|
+ double d5 = (this.p[((i1 + 0) * l + j1 + 0) * b2 + k1 + 1] - d1) * d0;
|
||
|
+ double d6 = (this.p[((i1 + 0) * l + j1 + 1) * b2 + k1 + 1] - d2) * d0;
|
||
|
+ double d7 = (this.p[((i1 + 1) * l + j1 + 0) * b2 + k1 + 1] - d3) * d0;
|
||
|
+ double d8 = (this.p[((i1 + 1) * l + j1 + 1) * b2 + k1 + 1] - d4) * d0;
|
||
|
+
|
||
|
+ for (int l1 = 0; l1 < 8; ++l1) {
|
||
|
+ double d9 = 0.25D;
|
||
|
+ double d10 = d1;
|
||
|
+ double d11 = d2;
|
||
|
+ double d12 = (d3 - d1) * d9;
|
||
|
+ double d13 = (d4 - d2) * d9;
|
||
|
+
|
||
|
+ for (int i2 = 0; i2 < 4; ++i2) {
|
||
|
+ int j2 = i2 + i1 * 4 << 11 | 0 + j1 * 4 << 7 | k1 * 8 + l1;
|
||
|
+ short short1 = 128;
|
||
|
+ double d14 = 0.25D;
|
||
|
+ double d15 = d10;
|
||
|
+ double d16 = (d11 - d10) * d14;
|
||
|
+
|
||
|
+ for (int k2 = 0; k2 < 4; ++k2) {
|
||
|
+ Block block = null;
|
||
|
+
|
||
|
+ if (k1 * 8 + l1 < b1) {
|
||
|
+ block = Blocks.STATIONARY_LAVA;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d15 > 0.0D) {
|
||
|
+ block = Blocks.NETHERRACK;
|
||
|
+ }
|
||
|
+
|
||
|
+ ablock[j2] = block;
|
||
|
+ j2 += short1;
|
||
|
+ d15 += d16;
|
||
|
+ }
|
||
|
+
|
||
|
+ d10 += d12;
|
||
|
+ d11 += d13;
|
||
|
+ }
|
||
|
+
|
||
|
+ d1 += d5;
|
||
|
+ d2 += d6;
|
||
|
+ d3 += d7;
|
||
|
+ d4 += d8;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void b(int i, int j, Block[] ablock) {
|
||
|
+ byte b0 = 64;
|
||
|
+ double d0 = 0.03125D;
|
||
|
+
|
||
|
+ this.q = this.m.a(this.q, i * 16, j * 16, 0, 16, 16, 1, d0, d0, 1.0D);
|
||
|
+ this.r = this.m.a(this.r, i * 16, 109, j * 16, 16, 1, 16, d0, 1.0D, d0);
|
||
|
+ this.s = this.n.a(this.s, i * 16, j * 16, 0, 16, 16, 1, d0 * 2.0D, d0 * 2.0D, d0 * 2.0D);
|
||
|
+
|
||
|
+ for (int k = 0; k < 16; ++k) {
|
||
|
+ for (int l = 0; l < 16; ++l) {
|
||
|
+ boolean flag = this.q[k + l * 16] + this.i.nextDouble() * 0.2D > 0.0D;
|
||
|
+ boolean flag1 = this.r[k + l * 16] + this.i.nextDouble() * 0.2D > 0.0D;
|
||
|
+ int i1 = (int) (this.s[k + l * 16] / 3.0D + 3.0D + this.i.nextDouble() * 0.25D);
|
||
|
+ int j1 = -1;
|
||
|
+ Block block = Blocks.NETHERRACK;
|
||
|
+ Block block1 = Blocks.NETHERRACK;
|
||
|
+
|
||
|
+ for (int k1 = 127; k1 >= 0; --k1) {
|
||
|
+ int l1 = (l * 16 + k) * 128 + k1;
|
||
|
+
|
||
|
+ if (k1 < 127 - this.i.nextInt(5) && k1 > 0 + this.i.nextInt(5)) {
|
||
|
+ Block block2 = ablock[l1];
|
||
|
+
|
||
|
+ if (block2 != null && block2.getMaterial() != Material.AIR) {
|
||
|
+ if (block2 == Blocks.NETHERRACK) {
|
||
|
+ if (j1 == -1) {
|
||
|
+ if (i1 <= 0) {
|
||
|
+ block = null;
|
||
|
+ block1 = Blocks.NETHERRACK;
|
||
|
+ } else if (k1 >= b0 - 4 && k1 <= b0 + 1) {
|
||
|
+ block = Blocks.NETHERRACK;
|
||
|
+ block1 = Blocks.NETHERRACK;
|
||
|
+ if (flag1) {
|
||
|
+ block = Blocks.GRAVEL;
|
||
|
+ block1 = Blocks.NETHERRACK;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ block = Blocks.SOUL_SAND;
|
||
|
+ block1 = Blocks.SOUL_SAND;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (k1 < b0 && (block == null || block.getMaterial() == Material.AIR)) {
|
||
|
+ block = Blocks.STATIONARY_LAVA;
|
||
|
+ }
|
||
|
+
|
||
|
+ j1 = i1;
|
||
|
+ if (k1 >= b0 - 1) {
|
||
|
+ ablock[l1] = block;
|
||
|
+ } else {
|
||
|
+ ablock[l1] = block1;
|
||
|
+ }
|
||
|
+ } else if (j1 > 0) {
|
||
|
+ --j1;
|
||
|
+ ablock[l1] = block1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ j1 = -1;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ ablock[l1] = Blocks.BEDROCK;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public Chunk getChunkAt(int i, int j) {
|
||
|
+ return this.getOrCreateChunk(i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public Chunk getOrCreateChunk(int i, int j) {
|
||
|
+ this.i.setSeed((long) i * 341873128712L + (long) j * 132897987541L);
|
||
|
+ Block[] ablock = new Block['\u8000'];
|
||
|
+
|
||
|
+ this.a(i, j, ablock);
|
||
|
+ this.b(i, j, ablock);
|
||
|
+ this.t.a(this, this.o, i, j, ablock);
|
||
|
+ this.c.a(this, this.o, i, j, ablock);
|
||
|
+ Chunk chunk = new Chunk(this.o, ablock, i, j);
|
||
|
+ BiomeBase[] abiomebase = this.o.getWorldChunkManager().getBiomeBlock((BiomeBase[]) null, i * 16, j * 16, 16, 16);
|
||
|
+ byte[] abyte = chunk.m();
|
||
|
+
|
||
|
+ for (int k = 0; k < abyte.length; ++k) {
|
||
|
+ abyte[k] = (byte) abiomebase[k].id;
|
||
|
+ }
|
||
|
+
|
||
|
+ chunk.n();
|
||
|
+ return chunk;
|
||
|
+ }
|
||
|
+
|
||
|
+ private double[] a(double[] adouble, int i, int j, int k, int l, int i1, int j1) {
|
||
|
+ if (adouble == null) {
|
||
|
+ adouble = new double[l * i1 * j1];
|
||
|
+ }
|
||
|
+
|
||
|
+ double d0 = 684.412D;
|
||
|
+ double d1 = 2053.236D;
|
||
|
+
|
||
|
+ this.g = this.a.a(this.g, i, j, k, l, 1, j1, 1.0D, 0.0D, 1.0D);
|
||
|
+ this.h = this.b.a(this.h, i, j, k, l, 1, j1, 100.0D, 0.0D, 100.0D);
|
||
|
+ this.d = this.l.a(this.d, i, j, k, l, i1, j1, d0 / 80.0D, d1 / 60.0D, d0 / 80.0D);
|
||
|
+ this.e = this.j.a(this.e, i, j, k, l, i1, j1, d0, d1, d0);
|
||
|
+ this.f = this.k.a(this.f, i, j, k, l, i1, j1, d0, d1, d0);
|
||
|
+ int k1 = 0;
|
||
|
+ int l1 = 0;
|
||
|
+ double[] adouble1 = new double[i1];
|
||
|
+
|
||
|
+ int i2;
|
||
|
+
|
||
|
+ for (i2 = 0; i2 < i1; ++i2) {
|
||
|
+ adouble1[i2] = Math.cos((double) i2 * 3.141592653589793D * 6.0D / (double) i1) * 2.0D;
|
||
|
+ double d2 = (double) i2;
|
||
|
+
|
||
|
+ if (i2 > i1 / 2) {
|
||
|
+ d2 = (double) (i1 - 1 - i2);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d2 < 4.0D) {
|
||
|
+ d2 = 4.0D - d2;
|
||
|
+ adouble1[i2] -= d2 * d2 * d2 * 10.0D;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ for (i2 = 0; i2 < l; ++i2) {
|
||
|
+ for (int j2 = 0; j2 < j1; ++j2) {
|
||
|
+ double d3 = (this.g[l1] + 256.0D) / 512.0D;
|
||
|
+
|
||
|
+ if (d3 > 1.0D) {
|
||
|
+ d3 = 1.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ double d4 = 0.0D;
|
||
|
+ double d5 = this.h[l1] / 8000.0D;
|
||
|
+
|
||
|
+ if (d5 < 0.0D) {
|
||
|
+ d5 = -d5;
|
||
|
+ }
|
||
|
+
|
||
|
+ d5 = d5 * 3.0D - 3.0D;
|
||
|
+ if (d5 < 0.0D) {
|
||
|
+ d5 /= 2.0D;
|
||
|
+ if (d5 < -1.0D) {
|
||
|
+ d5 = -1.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d5 /= 1.4D;
|
||
|
+ d5 /= 2.0D;
|
||
|
+ d3 = 0.0D;
|
||
|
+ } else {
|
||
|
+ if (d5 > 1.0D) {
|
||
|
+ d5 = 1.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d5 /= 6.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d3 += 0.5D;
|
||
|
+ d5 = d5 * (double) i1 / 16.0D;
|
||
|
+ ++l1;
|
||
|
+
|
||
|
+ for (int k2 = 0; k2 < i1; ++k2) {
|
||
|
+ double d6 = 0.0D;
|
||
|
+ double d7 = adouble1[k2];
|
||
|
+ double d8 = this.e[k1] / 512.0D;
|
||
|
+ double d9 = this.f[k1] / 512.0D;
|
||
|
+ double d10 = (this.d[k1] / 10.0D + 1.0D) / 2.0D;
|
||
|
+
|
||
|
+ if (d10 < 0.0D) {
|
||
|
+ d6 = d8;
|
||
|
+ } else if (d10 > 1.0D) {
|
||
|
+ d6 = d9;
|
||
|
+ } else {
|
||
|
+ d6 = d8 + (d9 - d8) * d10;
|
||
|
+ }
|
||
|
+
|
||
|
+ d6 -= d7;
|
||
|
+ double d11;
|
||
|
+
|
||
|
+ if (k2 > i1 - 4) {
|
||
|
+ d11 = (double) ((float) (k2 - (i1 - 4)) / 3.0F);
|
||
|
+ d6 = d6 * (1.0D - d11) + -10.0D * d11;
|
||
|
+ }
|
||
|
+
|
||
|
+ if ((double) k2 < d4) {
|
||
|
+ d11 = (d4 - (double) k2) / 4.0D;
|
||
|
+ if (d11 < 0.0D) {
|
||
|
+ d11 = 0.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d11 > 1.0D) {
|
||
|
+ d11 = 1.0D;
|
||
|
+ }
|
||
|
+
|
||
|
+ d6 = d6 * (1.0D - d11) + -10.0D * d11;
|
||
|
+ }
|
||
|
+
|
||
|
+ adouble[k1] = d6;
|
||
|
+ ++k1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return adouble;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isChunkLoaded(int i, int j) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void getChunkAt(IChunkProvider ichunkprovider, int i, int j) {
|
||
|
+ BlockFalling.instaFall = true;
|
||
|
+ int k = i * 16;
|
||
|
+ int l = j * 16;
|
||
|
+
|
||
|
+ this.c.a(this.o, this.i, i, j);
|
||
|
+
|
||
|
+ int i1;
|
||
|
+ int j1;
|
||
|
+ int k1;
|
||
|
+ int l1;
|
||
|
+
|
||
|
+ for (i1 = 0; i1 < 8; ++i1) {
|
||
|
+ j1 = k + this.i.nextInt(16) + 8;
|
||
|
+ k1 = this.i.nextInt(120) + 4;
|
||
|
+ l1 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenHellLava(Blocks.LAVA, false)).generate(this.o, this.i, j1, k1, l1);
|
||
|
+ }
|
||
|
+
|
||
|
+ i1 = this.i.nextInt(this.i.nextInt(10) + 1) + 1;
|
||
|
+
|
||
|
+ int i2;
|
||
|
+
|
||
|
+ for (j1 = 0; j1 < i1; ++j1) {
|
||
|
+ k1 = k + this.i.nextInt(16) + 8;
|
||
|
+ l1 = this.i.nextInt(120) + 4;
|
||
|
+ i2 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenFire()).generate(this.o, this.i, k1, l1, i2);
|
||
|
+ }
|
||
|
+
|
||
|
+ i1 = this.i.nextInt(this.i.nextInt(10) + 1);
|
||
|
+
|
||
|
+ for (j1 = 0; j1 < i1; ++j1) {
|
||
|
+ k1 = k + this.i.nextInt(16) + 8;
|
||
|
+ l1 = this.i.nextInt(120) + 4;
|
||
|
+ i2 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenLightStone1()).generate(this.o, this.i, k1, l1, i2);
|
||
|
+ }
|
||
|
+
|
||
|
+ for (j1 = 0; j1 < 10; ++j1) {
|
||
|
+ k1 = k + this.i.nextInt(16) + 8;
|
||
|
+ l1 = this.i.nextInt(128);
|
||
|
+ i2 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenLightStone2()).generate(this.o, this.i, k1, l1, i2);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.i.nextInt(1) == 0) {
|
||
|
+ j1 = k + this.i.nextInt(16) + 8;
|
||
|
+ k1 = this.i.nextInt(128);
|
||
|
+ l1 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenFlowers(Blocks.BROWN_MUSHROOM)).generate(this.o, this.i, j1, k1, l1);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.i.nextInt(1) == 0) {
|
||
|
+ j1 = k + this.i.nextInt(16) + 8;
|
||
|
+ k1 = this.i.nextInt(128);
|
||
|
+ l1 = l + this.i.nextInt(16) + 8;
|
||
|
+ (new WorldGenFlowers(Blocks.RED_MUSHROOM)).generate(this.o, this.i, j1, k1, l1);
|
||
|
+ }
|
||
|
+
|
||
|
+ WorldGenMinable worldgenminable = new WorldGenMinable(Blocks.QUARTZ_ORE, 13, Blocks.NETHERRACK);
|
||
|
+
|
||
|
+ int j2;
|
||
|
+
|
||
|
+ for (k1 = 0; k1 < 16; ++k1) {
|
||
|
+ l1 = k + this.i.nextInt(16);
|
||
|
+ i2 = this.i.nextInt(108) + 10;
|
||
|
+ j2 = l + this.i.nextInt(16);
|
||
|
+ worldgenminable.generate(this.o, this.i, l1, i2, j2);
|
||
|
+ }
|
||
|
+
|
||
|
+ for (k1 = 0; k1 < 16; ++k1) {
|
||
|
+ l1 = k + this.i.nextInt(16);
|
||
|
+ i2 = this.i.nextInt(108) + 10;
|
||
|
+ j2 = l + this.i.nextInt(16);
|
||
|
+ (new WorldGenHellLava(Blocks.LAVA, true)).generate(this.o, this.i, l1, i2, j2);
|
||
|
+ }
|
||
|
+
|
||
|
+ BlockFalling.instaFall = false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {}
|
||
|
+
|
||
|
+ public boolean unloadChunks() {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean canSave() {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String getName() {
|
||
|
+ return "HellRandomLevelSource";
|
||
|
+ }
|
||
|
+
|
||
|
+ public List getMobsFor(EnumCreatureType enumcreaturetype, int i, int j, int k) {
|
||
|
+ if (enumcreaturetype == EnumCreatureType.MONSTER) {
|
||
|
+ if (this.c.b(i, j, k)) {
|
||
|
+ return this.c.b();
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.c.d(i, j, k) && this.o.getType(i, j - 1, k) == Blocks.NETHER_BRICK) {
|
||
|
+ return this.c.b();
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ BiomeBase biomebase = this.o.getBiome(i, k);
|
||
|
+
|
||
|
+ return biomebase.getMobs(enumcreaturetype);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ChunkPosition findNearestMapFeature(World world, String s, int i, int j, int k) {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getLoadedChunks() {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void recreateStructures(int i, int j) {
|
||
|
+ this.c.a(this, this.o, i, j, (Block[]) null);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/FileIOThread.java b/src/main/java/net/minecraft/server/FileIOThread.java
|
||
|
new file mode 100644
|
||
|
index 000000000..e9c333bfb
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/FileIOThread.java
|
||
|
@@ -0,0 +1,70 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.Collections;
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
+public class FileIOThread implements Runnable {
|
||
|
+
|
||
|
+ public static final FileIOThread a = new FileIOThread();
|
||
|
+ private List b = Collections.synchronizedList(new ArrayList());
|
||
|
+ private volatile long c;
|
||
|
+ private volatile long d;
|
||
|
+ private volatile boolean e;
|
||
|
+
|
||
|
+ private FileIOThread() {
|
||
|
+ Thread thread = new Thread(this, "File IO Thread");
|
||
|
+
|
||
|
+ thread.setPriority(1);
|
||
|
+ thread.start();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void run() {
|
||
|
+ while (true) {
|
||
|
+ this.b();
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private void b() {
|
||
|
+ for (int i = 0; i < this.b.size(); ++i) {
|
||
|
+ IAsyncChunkSaver iasyncchunksaver = (IAsyncChunkSaver) this.b.get(i);
|
||
|
+ boolean flag = iasyncchunksaver.c();
|
||
|
+
|
||
|
+ if (!flag) {
|
||
|
+ this.b.remove(i--);
|
||
|
+ ++this.d;
|
||
|
+ }
|
||
|
+
|
||
|
+ try {
|
||
|
+ Thread.sleep(this.e ? 0L : 10L);
|
||
|
+ } catch (InterruptedException interruptedexception) {
|
||
|
+ interruptedexception.printStackTrace();
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.b.isEmpty()) {
|
||
|
+ try {
|
||
|
+ Thread.sleep(25L);
|
||
|
+ } catch (InterruptedException interruptedexception1) {
|
||
|
+ interruptedexception1.printStackTrace();
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(IAsyncChunkSaver iasyncchunksaver) {
|
||
|
+ if (!this.b.contains(iasyncchunksaver)) {
|
||
|
+ ++this.c;
|
||
|
+ this.b.add(iasyncchunksaver);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a() throws InterruptedException {
|
||
|
+ this.e = true;
|
||
|
+
|
||
|
+ while (this.c != this.d) {
|
||
|
+ Thread.sleep(10L);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.e = false;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/GenLayer.java b/src/main/java/net/minecraft/server/GenLayer.java
|
||
|
new file mode 100644
|
||
|
index 000000000..b15e0f608
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/GenLayer.java
|
||
|
@@ -0,0 +1,168 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.concurrent.Callable;
|
||
|
+
|
||
|
+public abstract class GenLayer {
|
||
|
+
|
||
|
+ private long c;
|
||
|
+ protected GenLayer a;
|
||
|
+ private long d;
|
||
|
+ protected long b;
|
||
|
+
|
||
|
+ public static GenLayer[] a(long i, WorldType worldtype) {
|
||
|
+ boolean flag = false;
|
||
|
+ LayerIsland layerisland = new LayerIsland(1L);
|
||
|
+ GenLayerZoomFuzzy genlayerzoomfuzzy = new GenLayerZoomFuzzy(2000L, layerisland);
|
||
|
+ GenLayerIsland genlayerisland = new GenLayerIsland(1L, genlayerzoomfuzzy);
|
||
|
+ GenLayerZoom genlayerzoom = new GenLayerZoom(2001L, genlayerisland);
|
||
|
+
|
||
|
+ genlayerisland = new GenLayerIsland(2L, genlayerzoom);
|
||
|
+ genlayerisland = new GenLayerIsland(50L, genlayerisland);
|
||
|
+ genlayerisland = new GenLayerIsland(70L, genlayerisland);
|
||
|
+ GenLayerIcePlains genlayericeplains = new GenLayerIcePlains(2L, genlayerisland);
|
||
|
+ GenLayerTopSoil genlayertopsoil = new GenLayerTopSoil(2L, genlayericeplains);
|
||
|
+
|
||
|
+ genlayerisland = new GenLayerIsland(3L, genlayertopsoil);
|
||
|
+ GenLayerSpecial genlayerspecial = new GenLayerSpecial(2L, genlayerisland, EnumGenLayerSpecial.COOL_WARM);
|
||
|
+
|
||
|
+ genlayerspecial = new GenLayerSpecial(2L, genlayerspecial, EnumGenLayerSpecial.HEAT_ICE);
|
||
|
+ genlayerspecial = new GenLayerSpecial(3L, genlayerspecial, EnumGenLayerSpecial.PUFFERFISH);
|
||
|
+ genlayerzoom = new GenLayerZoom(2002L, genlayerspecial);
|
||
|
+ genlayerzoom = new GenLayerZoom(2003L, genlayerzoom);
|
||
|
+ genlayerisland = new GenLayerIsland(4L, genlayerzoom);
|
||
|
+ GenLayerMushroomIsland genlayermushroomisland = new GenLayerMushroomIsland(5L, genlayerisland);
|
||
|
+ GenLayerDeepOcean genlayerdeepocean = new GenLayerDeepOcean(4L, genlayermushroomisland);
|
||
|
+ GenLayer genlayer = GenLayerZoom.b(1000L, genlayerdeepocean, 0);
|
||
|
+ byte b0 = 4;
|
||
|
+
|
||
|
+ if (worldtype == WorldType.LARGE_BIOMES) {
|
||
|
+ b0 = 6;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ b0 = 4;
|
||
|
+ }
|
||
|
+
|
||
|
+ GenLayer genlayer1 = GenLayerZoom.b(1000L, genlayer, 0);
|
||
|
+ GenLayerCleaner genlayercleaner = new GenLayerCleaner(100L, genlayer1);
|
||
|
+ Object object = new GenLayerBiome(200L, genlayer, worldtype);
|
||
|
+
|
||
|
+ if (!flag) {
|
||
|
+ GenLayer genlayer2 = GenLayerZoom.b(1000L, (GenLayer) object, 2);
|
||
|
+
|
||
|
+ object = new GenLayerDesert(1000L, genlayer2);
|
||
|
+ }
|
||
|
+
|
||
|
+ GenLayer genlayer3 = GenLayerZoom.b(1000L, genlayercleaner, 2);
|
||
|
+ GenLayerRegionHills genlayerregionhills = new GenLayerRegionHills(1000L, (GenLayer) object, genlayer3);
|
||
|
+
|
||
|
+ genlayer1 = GenLayerZoom.b(1000L, genlayercleaner, 2);
|
||
|
+ genlayer1 = GenLayerZoom.b(1000L, genlayer1, b0);
|
||
|
+ GenLayerRiver genlayerriver = new GenLayerRiver(1L, genlayer1);
|
||
|
+ GenLayerSmooth genlayersmooth = new GenLayerSmooth(1000L, genlayerriver);
|
||
|
+
|
||
|
+ object = new GenLayerPlains(1001L, genlayerregionhills);
|
||
|
+
|
||
|
+ for (int j = 0; j < b0; ++j) {
|
||
|
+ object = new GenLayerZoom((long) (1000 + j), (GenLayer) object);
|
||
|
+ if (j == 0) {
|
||
|
+ object = new GenLayerIsland(3L, (GenLayer) object);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j == 1) {
|
||
|
+ object = new GenLayerMushroomShore(1000L, (GenLayer) object);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ GenLayerSmooth genlayersmooth1 = new GenLayerSmooth(1000L, (GenLayer) object);
|
||
|
+ GenLayerRiverMix genlayerrivermix = new GenLayerRiverMix(100L, genlayersmooth1, genlayersmooth);
|
||
|
+ GenLayerZoomVoronoi genlayerzoomvoronoi = new GenLayerZoomVoronoi(10L, genlayerrivermix);
|
||
|
+
|
||
|
+ genlayerrivermix.a(i);
|
||
|
+ genlayerzoomvoronoi.a(i);
|
||
|
+ return new GenLayer[] { genlayerrivermix, genlayerzoomvoronoi, genlayerrivermix};
|
||
|
+ }
|
||
|
+
|
||
|
+ public GenLayer(long i) {
|
||
|
+ this.b = i;
|
||
|
+ this.b *= this.b * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.b += i;
|
||
|
+ this.b *= this.b * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.b += i;
|
||
|
+ this.b *= this.b * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.b += i;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(long i) {
|
||
|
+ this.c = i;
|
||
|
+ if (this.a != null) {
|
||
|
+ this.a.a(i);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.c *= this.c * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.c += this.b;
|
||
|
+ this.c *= this.c * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.c += this.b;
|
||
|
+ this.c *= this.c * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.c += this.b;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(long i, long j) {
|
||
|
+ this.d = this.c;
|
||
|
+ this.d *= this.d * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.d += i;
|
||
|
+ this.d *= this.d * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.d += j;
|
||
|
+ this.d *= this.d * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.d += i;
|
||
|
+ this.d *= this.d * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.d += j;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected int a(int i) {
|
||
|
+ int j = (int) ((this.d >> 24) % (long) i);
|
||
|
+
|
||
|
+ if (j < 0) {
|
||
|
+ j += i;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.d *= this.d * 6364136223846793005L + 1442695040888963407L;
|
||
|
+ this.d += this.c;
|
||
|
+ return j;
|
||
|
+ }
|
||
|
+
|
||
|
+ public abstract int[] a(int i, int j, int k, int l);
|
||
|
+
|
||
|
+ protected static boolean a(int i, int j) {
|
||
|
+ if (i == j) {
|
||
|
+ return true;
|
||
|
+ } else if (i != BiomeBase.MESA_PLATEAU_F.id && i != BiomeBase.MESA_PLATEAU.id) {
|
||
|
+ try {
|
||
|
+ return BiomeBase.getBiome(i) != null && BiomeBase.getBiome(j) != null ? BiomeBase.getBiome(i).a(BiomeBase.getBiome(j)) : false;
|
||
|
+ } catch (Throwable throwable) {
|
||
|
+ CrashReport crashreport = CrashReport.a(throwable, "Comparing biomes");
|
||
|
+ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Biomes being compared");
|
||
|
+
|
||
|
+ crashreportsystemdetails.a("Biome A ID", Integer.valueOf(i));
|
||
|
+ crashreportsystemdetails.a("Biome B ID", Integer.valueOf(j));
|
||
|
+ crashreportsystemdetails.a("Biome A", (Callable) (new CrashReportGenLayer1(i)));
|
||
|
+ crashreportsystemdetails.a("Biome B", (Callable) (new CrashReportGenLayer2(j)));
|
||
|
+ throw new ReportedException(crashreport);
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ return j == BiomeBase.MESA_PLATEAU_F.id || j == BiomeBase.MESA_PLATEAU.id;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected static boolean b(int i) {
|
||
|
+ return i == BiomeBase.OCEAN.id || i == BiomeBase.DEEP_OCEAN.id || i == BiomeBase.FROZEN_OCEAN.id;
|
||
|
+ }
|
||
|
+
|
||
|
+ protected int a(int... aint) {
|
||
|
+ return aint[this.a(aint.length)];
|
||
|
+ }
|
||
|
+
|
||
|
+ protected int b(int i, int j, int k, int l) {
|
||
|
+ return j == k && k == l ? j : (i == j && i == k ? i : (i == j && i == l ? i : (i == k && i == l ? i : (i == j && k != l ? i : (i == k && j != l ? i : (i == l && j != k ? i : (j == k && i != l ? j : (j == l && i != k ? j : (k == l && i != j ? k : this.a(new int[] { i, j, k, l}))))))))));
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/GenLayerBiome.java b/src/main/java/net/minecraft/server/GenLayerBiome.java
|
||
|
new file mode 100644
|
||
|
index 000000000..42fe8f1a1
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/GenLayerBiome.java
|
||
|
@@ -0,0 +1,69 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class GenLayerBiome extends GenLayer {
|
||
|
+
|
||
|
+ private BiomeBase[] c;
|
||
|
+ private BiomeBase[] d;
|
||
|
+ private BiomeBase[] e;
|
||
|
+ private BiomeBase[] f;
|
||
|
+
|
||
|
+ public GenLayerBiome(long i, GenLayer genlayer, WorldType worldtype) {
|
||
|
+ super(i);
|
||
|
+ this.c = new BiomeBase[] { BiomeBase.DESERT, BiomeBase.DESERT, BiomeBase.DESERT, BiomeBase.SAVANNA, BiomeBase.SAVANNA, BiomeBase.PLAINS};
|
||
|
+ this.d = new BiomeBase[] { BiomeBase.FOREST, BiomeBase.ROOFED_FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.PLAINS, BiomeBase.BIRCH_FOREST, BiomeBase.SWAMPLAND};
|
||
|
+ this.e = new BiomeBase[] { BiomeBase.FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.TAIGA, BiomeBase.PLAINS};
|
||
|
+ this.f = new BiomeBase[] { BiomeBase.ICE_PLAINS, BiomeBase.ICE_PLAINS, BiomeBase.ICE_PLAINS, BiomeBase.COLD_TAIGA};
|
||
|
+ this.a = genlayer;
|
||
|
+ if (worldtype == WorldType.NORMAL_1_1) {
|
||
|
+ this.c = new BiomeBase[] { BiomeBase.DESERT, BiomeBase.FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.SWAMPLAND, BiomeBase.PLAINS, BiomeBase.TAIGA};
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public int[] a(int i, int j, int k, int l) {
|
||
|
+ int[] aint = this.a.a(i, j, k, l);
|
||
|
+ int[] aint1 = IntCache.a(k * l);
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < l; ++i1) {
|
||
|
+ for (int j1 = 0; j1 < k; ++j1) {
|
||
|
+ this.a((long) (j1 + i), (long) (i1 + j));
|
||
|
+ int k1 = aint[j1 + i1 * k];
|
||
|
+ int l1 = (k1 & 3840) >> 8;
|
||
|
+
|
||
|
+ k1 &= -3841;
|
||
|
+ if (b(k1)) {
|
||
|
+ aint1[j1 + i1 * k] = k1;
|
||
|
+ } else if (k1 == BiomeBase.MUSHROOM_ISLAND.id) {
|
||
|
+ aint1[j1 + i1 * k] = k1;
|
||
|
+ } else if (k1 == 1) {
|
||
|
+ if (l1 > 0) {
|
||
|
+ if (this.a(3) == 0) {
|
||
|
+ aint1[j1 + i1 * k] = BiomeBase.MESA_PLATEAU.id;
|
||
|
+ } else {
|
||
|
+ aint1[j1 + i1 * k] = BiomeBase.MESA_PLATEAU_F.id;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ aint1[j1 + i1 * k] = this.c[this.a(this.c.length)].id;
|
||
|
+ }
|
||
|
+ } else if (k1 == 2) {
|
||
|
+ if (l1 > 0) {
|
||
|
+ aint1[j1 + i1 * k] = BiomeBase.JUNGLE.id;
|
||
|
+ } else {
|
||
|
+ aint1[j1 + i1 * k] = this.d[this.a(this.d.length)].id;
|
||
|
+ }
|
||
|
+ } else if (k1 == 3) {
|
||
|
+ if (l1 > 0) {
|
||
|
+ aint1[j1 + i1 * k] = BiomeBase.MEGA_TAIGA.id;
|
||
|
+ } else {
|
||
|
+ aint1[j1 + i1 * k] = this.e[this.a(this.e.length)].id;
|
||
|
+ }
|
||
|
+ } else if (k1 == 4) {
|
||
|
+ aint1[j1 + i1 * k] = this.f[this.a(this.f.length)].id;
|
||
|
+ } else {
|
||
|
+ aint1[j1 + i1 * k] = BiomeBase.MUSHROOM_ISLAND.id;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return aint1;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/GenLayerRegionHills.java b/src/main/java/net/minecraft/server/GenLayerRegionHills.java
|
||
|
new file mode 100644
|
||
|
index 000000000..7543f301b
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/GenLayerRegionHills.java
|
||
|
@@ -0,0 +1,131 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import org.apache.logging.log4j.LogManager;
|
||
|
+import org.apache.logging.log4j.Logger;
|
||
|
+
|
||
|
+public class GenLayerRegionHills extends GenLayer {
|
||
|
+
|
||
|
+ private static final Logger c = LogManager.getLogger();
|
||
|
+ private GenLayer d;
|
||
|
+
|
||
|
+ public GenLayerRegionHills(long i, GenLayer genlayer, GenLayer genlayer1) {
|
||
|
+ super(i);
|
||
|
+ this.a = genlayer;
|
||
|
+ this.d = genlayer1;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int[] a(int i, int j, int k, int l) {
|
||
|
+ int[] aint = this.a.a(i - 1, j - 1, k + 2, l + 2);
|
||
|
+ int[] aint1 = this.d.a(i - 1, j - 1, k + 2, l + 2);
|
||
|
+ int[] aint2 = IntCache.a(k * l);
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < l; ++i1) {
|
||
|
+ for (int j1 = 0; j1 < k; ++j1) {
|
||
|
+ this.a((long) (j1 + i), (long) (i1 + j));
|
||
|
+ int k1 = aint[j1 + 1 + (i1 + 1) * (k + 2)];
|
||
|
+ int l1 = aint1[j1 + 1 + (i1 + 1) * (k + 2)];
|
||
|
+ boolean flag = (l1 - 2) % 29 == 0;
|
||
|
+
|
||
|
+ if (k1 > 255) {
|
||
|
+ c.debug("old! " + k1);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (k1 != 0 && l1 >= 2 && (l1 - 2) % 29 == 1 && k1 < 128) {
|
||
|
+ if (BiomeBase.getBiome(k1 + 128) != null) {
|
||
|
+ aint2[j1 + i1 * k] = k1 + 128;
|
||
|
+ } else {
|
||
|
+ aint2[j1 + i1 * k] = k1;
|
||
|
+ }
|
||
|
+ } else if (this.a(3) != 0 && !flag) {
|
||
|
+ aint2[j1 + i1 * k] = k1;
|
||
|
+ } else {
|
||
|
+ int i2 = k1;
|
||
|
+ int j2;
|
||
|
+
|
||
|
+ if (k1 == BiomeBase.DESERT.id) {
|
||
|
+ i2 = BiomeBase.DESERT_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.FOREST.id) {
|
||
|
+ i2 = BiomeBase.FOREST_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.BIRCH_FOREST.id) {
|
||
|
+ i2 = BiomeBase.BIRCH_FOREST_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.ROOFED_FOREST.id) {
|
||
|
+ i2 = BiomeBase.PLAINS.id;
|
||
|
+ } else if (k1 == BiomeBase.TAIGA.id) {
|
||
|
+ i2 = BiomeBase.TAIGA_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.MEGA_TAIGA.id) {
|
||
|
+ i2 = BiomeBase.MEGA_TAIGA_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.COLD_TAIGA.id) {
|
||
|
+ i2 = BiomeBase.COLD_TAIGA_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.PLAINS.id) {
|
||
|
+ if (this.a(3) == 0) {
|
||
|
+ i2 = BiomeBase.FOREST_HILLS.id;
|
||
|
+ } else {
|
||
|
+ i2 = BiomeBase.FOREST.id;
|
||
|
+ }
|
||
|
+ } else if (k1 == BiomeBase.ICE_PLAINS.id) {
|
||
|
+ i2 = BiomeBase.ICE_MOUNTAINS.id;
|
||
|
+ } else if (k1 == BiomeBase.JUNGLE.id) {
|
||
|
+ i2 = BiomeBase.JUNGLE_HILLS.id;
|
||
|
+ } else if (k1 == BiomeBase.OCEAN.id) {
|
||
|
+ i2 = BiomeBase.DEEP_OCEAN.id;
|
||
|
+ } else if (k1 == BiomeBase.EXTREME_HILLS.id) {
|
||
|
+ i2 = BiomeBase.EXTREME_HILLS_PLUS.id;
|
||
|
+ } else if (k1 == BiomeBase.SAVANNA.id) {
|
||
|
+ i2 = BiomeBase.SAVANNA_PLATEAU.id;
|
||
|
+ } else if (a(k1, BiomeBase.MESA_PLATEAU_F.id)) {
|
||
|
+ i2 = BiomeBase.MESA.id;
|
||
|
+ } else if (k1 == BiomeBase.DEEP_OCEAN.id && this.a(3) == 0) {
|
||
|
+ j2 = this.a(2);
|
||
|
+ if (j2 == 0) {
|
||
|
+ i2 = BiomeBase.PLAINS.id;
|
||
|
+ } else {
|
||
|
+ i2 = BiomeBase.FOREST.id;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag && i2 != k1) {
|
||
|
+ if (BiomeBase.getBiome(i2 + 128) != null) {
|
||
|
+ i2 += 128;
|
||
|
+ } else {
|
||
|
+ i2 = k1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i2 == k1) {
|
||
|
+ aint2[j1 + i1 * k] = k1;
|
||
|
+ } else {
|
||
|
+ j2 = aint[j1 + 1 + (i1 + 1 - 1) * (k + 2)];
|
||
|
+ int k2 = aint[j1 + 1 + 1 + (i1 + 1) * (k + 2)];
|
||
|
+ int l2 = aint[j1 + 1 - 1 + (i1 + 1) * (k + 2)];
|
||
|
+ int i3 = aint[j1 + 1 + (i1 + 1 + 1) * (k + 2)];
|
||
|
+ int j3 = 0;
|
||
|
+
|
||
|
+ if (a(j2, k1)) {
|
||
|
+ ++j3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (a(k2, k1)) {
|
||
|
+ ++j3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (a(l2, k1)) {
|
||
|
+ ++j3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (a(i3, k1)) {
|
||
|
+ ++j3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j3 >= 3) {
|
||
|
+ aint2[j1 + i1 * k] = i2;
|
||
|
+ } else {
|
||
|
+ aint2[j1 + i1 * k] = k1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return aint2;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemEgg.java b/src/main/java/net/minecraft/server/ItemEgg.java
|
||
|
new file mode 100644
|
||
|
index 000000000..b74c8fe65
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemEgg.java
|
||
|
@@ -0,0 +1,22 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemEgg extends Item {
|
||
|
+
|
||
|
+ public ItemEgg() {
|
||
|
+ this.maxStackSize = 16;
|
||
|
+ this.a(CreativeModeTab.l);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F));
|
||
|
+ if (!world.isStatic) {
|
||
|
+ world.addEntity(new EntityEgg(world, entityhuman));
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemEnderEye.java b/src/main/java/net/minecraft/server/ItemEnderEye.java
|
||
|
new file mode 100644
|
||
|
index 000000000..91d9770c2
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemEnderEye.java
|
||
|
@@ -0,0 +1,134 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemEnderEye extends Item {
|
||
|
+
|
||
|
+ public ItemEnderEye() {
|
||
|
+ this.a(CreativeModeTab.f);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
|
||
|
+ Block block = world.getType(i, j, k);
|
||
|
+ int i1 = world.getData(i, j, k);
|
||
|
+
|
||
|
+ if (entityhuman.a(i, j, k, l, itemstack) && block == Blocks.ENDER_PORTAL_FRAME && !BlockEnderPortalFrame.b(i1)) {
|
||
|
+ if (world.isStatic) {
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ world.setData(i, j, k, i1 + 4, 2);
|
||
|
+ world.updateAdjacentComparators(i, j, k, Blocks.ENDER_PORTAL_FRAME);
|
||
|
+ --itemstack.count;
|
||
|
+
|
||
|
+ int j1;
|
||
|
+
|
||
|
+ for (j1 = 0; j1 < 16; ++j1) {
|
||
|
+ double d0 = (double) ((float) i + (5.0F + g.nextFloat() * 6.0F) / 16.0F);
|
||
|
+ double d1 = (double) ((float) j + 0.8125F);
|
||
|
+ double d2 = (double) ((float) k + (5.0F + g.nextFloat() * 6.0F) / 16.0F);
|
||
|
+ double d3 = 0.0D;
|
||
|
+ double d4 = 0.0D;
|
||
|
+ double d5 = 0.0D;
|
||
|
+
|
||
|
+ world.addParticle("smoke", d0, d1, d2, d3, d4, d5);
|
||
|
+ }
|
||
|
+
|
||
|
+ j1 = i1 & 3;
|
||
|
+ int k1 = 0;
|
||
|
+ int l1 = 0;
|
||
|
+ boolean flag = false;
|
||
|
+ boolean flag1 = true;
|
||
|
+ int i2 = Direction.g[j1];
|
||
|
+
|
||
|
+ int j2;
|
||
|
+ int k2;
|
||
|
+ int l2;
|
||
|
+
|
||
|
+ for (l2 = -2; l2 <= 2; ++l2) {
|
||
|
+ j2 = i + Direction.a[i2] * l2;
|
||
|
+ k2 = k + Direction.b[i2] * l2;
|
||
|
+ if (world.getType(j2, j, k2) == Blocks.ENDER_PORTAL_FRAME) {
|
||
|
+ if (!BlockEnderPortalFrame.b(world.getData(j2, j, k2))) {
|
||
|
+ flag1 = false;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ l1 = l2;
|
||
|
+ if (!flag) {
|
||
|
+ k1 = l2;
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag1 && l1 == k1 + 2) {
|
||
|
+ for (l2 = k1; l2 <= l1; ++l2) {
|
||
|
+ j2 = i + Direction.a[i2] * l2;
|
||
|
+ k2 = k + Direction.b[i2] * l2;
|
||
|
+ j2 += Direction.a[j1] * 4;
|
||
|
+ k2 += Direction.b[j1] * 4;
|
||
|
+ if (world.getType(j2, j, k2) != Blocks.ENDER_PORTAL_FRAME || !BlockEnderPortalFrame.b(world.getData(j2, j, k2))) {
|
||
|
+ flag1 = false;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ int i3;
|
||
|
+
|
||
|
+ for (l2 = k1 - 1; l2 <= l1 + 1; l2 += 4) {
|
||
|
+ for (j2 = 1; j2 <= 3; ++j2) {
|
||
|
+ k2 = i + Direction.a[i2] * l2;
|
||
|
+ i3 = k + Direction.b[i2] * l2;
|
||
|
+ k2 += Direction.a[j1] * j2;
|
||
|
+ i3 += Direction.b[j1] * j2;
|
||
|
+ if (world.getType(k2, j, i3) != Blocks.ENDER_PORTAL_FRAME || !BlockEnderPortalFrame.b(world.getData(k2, j, i3))) {
|
||
|
+ flag1 = false;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag1) {
|
||
|
+ for (l2 = k1; l2 <= l1; ++l2) {
|
||
|
+ for (j2 = 1; j2 <= 3; ++j2) {
|
||
|
+ k2 = i + Direction.a[i2] * l2;
|
||
|
+ i3 = k + Direction.b[i2] * l2;
|
||
|
+ k2 += Direction.a[j1] * j2;
|
||
|
+ i3 += Direction.b[j1] * j2;
|
||
|
+ world.setTypeAndData(k2, j, i3, Blocks.ENDER_PORTAL, 0, 2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ MovingObjectPosition movingobjectposition = this.a(world, entityhuman, false);
|
||
|
+
|
||
|
+ if (movingobjectposition != null && movingobjectposition.type == EnumMovingObjectType.BLOCK && world.getType(movingobjectposition.b, movingobjectposition.c, movingobjectposition.d) == Blocks.ENDER_PORTAL_FRAME) {
|
||
|
+ return itemstack;
|
||
|
+ } else {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ ChunkPosition chunkposition = world.b("Stronghold", (int) entityhuman.locX, (int) entityhuman.locY, (int) entityhuman.locZ);
|
||
|
+
|
||
|
+ if (chunkposition != null) {
|
||
|
+ EntityEnderSignal entityendersignal = new EntityEnderSignal(world, entityhuman.locX, entityhuman.locY + 1.62D - (double) entityhuman.height, entityhuman.locZ);
|
||
|
+
|
||
|
+ entityendersignal.a((double) chunkposition.x, chunkposition.y, (double) chunkposition.z);
|
||
|
+ world.addEntity(entityendersignal);
|
||
|
+ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F));
|
||
|
+ world.a((EntityHuman) null, 1002, (int) entityhuman.locX, (int) entityhuman.locY, (int) entityhuman.locZ, 0);
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemEnderPearl.java b/src/main/java/net/minecraft/server/ItemEnderPearl.java
|
||
|
new file mode 100644
|
||
|
index 000000000..2fe9c3c6c
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemEnderPearl.java
|
||
|
@@ -0,0 +1,23 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemEnderPearl extends Item {
|
||
|
+
|
||
|
+ public ItemEnderPearl() {
|
||
|
+ this.maxStackSize = 16;
|
||
|
+ this.a(CreativeModeTab.f);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ return itemstack;
|
||
|
+ } else {
|
||
|
+ --itemstack.count;
|
||
|
+ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F));
|
||
|
+ if (!world.isStatic) {
|
||
|
+ world.addEntity(new EntityEnderPearl(world, entityhuman));
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemExpBottle.java b/src/main/java/net/minecraft/server/ItemExpBottle.java
|
||
|
new file mode 100644
|
||
|
index 000000000..a7eba06db
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemExpBottle.java
|
||
|
@@ -0,0 +1,21 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemExpBottle extends Item {
|
||
|
+
|
||
|
+ public ItemExpBottle() {
|
||
|
+ this.a(CreativeModeTab.f);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F));
|
||
|
+ if (!world.isStatic) {
|
||
|
+ world.addEntity(new EntityThrownExpBottle(world, entityhuman));
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemFireworks.java b/src/main/java/net/minecraft/server/ItemFireworks.java
|
||
|
new file mode 100644
|
||
|
index 000000000..ad61d22a2
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemFireworks.java
|
||
|
@@ -0,0 +1,21 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemFireworks extends Item {
|
||
|
+
|
||
|
+ public ItemFireworks() {}
|
||
|
+
|
||
|
+ public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
|
||
|
+ if (!world.isStatic) {
|
||
|
+ EntityFireworks entityfireworks = new EntityFireworks(world, (double) ((float) i + f), (double) ((float) j + f1), (double) ((float) k + f2), itemstack);
|
||
|
+
|
||
|
+ world.addEntity(entityfireworks);
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemMilkBucket.java b/src/main/java/net/minecraft/server/ItemMilkBucket.java
|
||
|
new file mode 100644
|
||
|
index 000000000..39f1bc031
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemMilkBucket.java
|
||
|
@@ -0,0 +1,34 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemMilkBucket extends Item {
|
||
|
+
|
||
|
+ public ItemMilkBucket() {
|
||
|
+ this.e(1);
|
||
|
+ this.a(CreativeModeTab.f);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!world.isStatic) {
|
||
|
+ entityhuman.removeAllEffects();
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack.count <= 0 ? new ItemStack(Items.BUCKET) : itemstack;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int d_(ItemStack itemstack) {
|
||
|
+ return 32;
|
||
|
+ }
|
||
|
+
|
||
|
+ public EnumAnimation d(ItemStack itemstack) {
|
||
|
+ return EnumAnimation.DRINK;
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ entityhuman.a(itemstack, this.d_(itemstack));
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemPotion.java b/src/main/java/net/minecraft/server/ItemPotion.java
|
||
|
new file mode 100644
|
||
|
index 000000000..120bf1ce3
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemPotion.java
|
||
|
@@ -0,0 +1,147 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.HashMap;
|
||
|
+import java.util.Iterator;
|
||
|
+import java.util.LinkedHashMap;
|
||
|
+import java.util.List;
|
||
|
+import java.util.Map;
|
||
|
+
|
||
|
+public class ItemPotion extends Item {
|
||
|
+
|
||
|
+ private HashMap a = new HashMap();
|
||
|
+ private static final Map b = new LinkedHashMap();
|
||
|
+
|
||
|
+ public ItemPotion() {
|
||
|
+ this.e(1);
|
||
|
+ this.a(true);
|
||
|
+ this.setMaxDurability(0);
|
||
|
+ this.a(CreativeModeTab.k);
|
||
|
+ }
|
||
|
+
|
||
|
+ public List g(ItemStack itemstack) {
|
||
|
+ if (itemstack.hasTag() && itemstack.getTag().hasKeyOfType("CustomPotionEffects", 9)) {
|
||
|
+ ArrayList arraylist = new ArrayList();
|
||
|
+ NBTTagList nbttaglist = itemstack.getTag().getList("CustomPotionEffects", 10);
|
||
|
+
|
||
|
+ for (int i = 0; i < nbttaglist.size(); ++i) {
|
||
|
+ NBTTagCompound nbttagcompound = nbttaglist.get(i);
|
||
|
+ MobEffect mobeffect = MobEffect.b(nbttagcompound);
|
||
|
+
|
||
|
+ if (mobeffect != null) {
|
||
|
+ arraylist.add(mobeffect);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return arraylist;
|
||
|
+ } else {
|
||
|
+ List list = (List) this.a.get(Integer.valueOf(itemstack.getData()));
|
||
|
+
|
||
|
+ if (list == null) {
|
||
|
+ list = PotionBrewer.getEffects(itemstack.getData(), false);
|
||
|
+ this.a.put(Integer.valueOf(itemstack.getData()), list);
|
||
|
+ }
|
||
|
+
|
||
|
+ return list;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public List c(int i) {
|
||
|
+ List list = (List) this.a.get(Integer.valueOf(i));
|
||
|
+
|
||
|
+ if (list == null) {
|
||
|
+ list = PotionBrewer.getEffects(i, false);
|
||
|
+ this.a.put(Integer.valueOf(i), list);
|
||
|
+ }
|
||
|
+
|
||
|
+ return list;
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!world.isStatic) {
|
||
|
+ List list = this.g(itemstack);
|
||
|
+
|
||
|
+ if (list != null) {
|
||
|
+ Iterator iterator = list.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ MobEffect mobeffect = (MobEffect) iterator.next();
|
||
|
+
|
||
|
+ entityhuman.addEffect(new MobEffect(mobeffect));
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ if (itemstack.count <= 0) {
|
||
|
+ return new ItemStack(Items.GLASS_BOTTLE);
|
||
|
+ }
|
||
|
+
|
||
|
+ entityhuman.inventory.pickup(new ItemStack(Items.GLASS_BOTTLE));
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int d_(ItemStack itemstack) {
|
||
|
+ return 32;
|
||
|
+ }
|
||
|
+
|
||
|
+ public EnumAnimation d(ItemStack itemstack) {
|
||
|
+ return EnumAnimation.DRINK;
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (g(itemstack.getData())) {
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F));
|
||
|
+ if (!world.isStatic) {
|
||
|
+ world.addEntity(new EntityPotion(world, entityhuman, itemstack));
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ } else {
|
||
|
+ entityhuman.a(itemstack, this.d_(itemstack));
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public static boolean g(int i) {
|
||
|
+ return (i & 16384) != 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String n(ItemStack itemstack) {
|
||
|
+ if (itemstack.getData() == 0) {
|
||
|
+ return LocaleI18n.get("item.emptyPotion.name").trim();
|
||
|
+ } else {
|
||
|
+ String s = "";
|
||
|
+
|
||
|
+ if (g(itemstack.getData())) {
|
||
|
+ s = LocaleI18n.get("potion.prefix.grenade").trim() + " ";
|
||
|
+ }
|
||
|
+
|
||
|
+ List list = Items.POTION.g(itemstack);
|
||
|
+ String s1;
|
||
|
+
|
||
|
+ if (list != null && !list.isEmpty()) {
|
||
|
+ s1 = ((MobEffect) list.get(0)).f();
|
||
|
+ s1 = s1 + ".postfix";
|
||
|
+ return s + LocaleI18n.get(s1).trim();
|
||
|
+ } else {
|
||
|
+ s1 = PotionBrewer.c(itemstack.getData());
|
||
|
+ return LocaleI18n.get(s1).trim() + " " + super.n(itemstack);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/ItemSnowball.java b/src/main/java/net/minecraft/server/ItemSnowball.java
|
||
|
new file mode 100644
|
||
|
index 000000000..fb5e8536d
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/ItemSnowball.java
|
||
|
@@ -0,0 +1,22 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class ItemSnowball extends Item {
|
||
|
+
|
||
|
+ public ItemSnowball() {
|
||
|
+ this.maxStackSize = 16;
|
||
|
+ this.a(CreativeModeTab.f);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) {
|
||
|
+ if (!entityhuman.abilities.canInstantlyBuild) {
|
||
|
+ --itemstack.count;
|
||
|
+ }
|
||
|
+
|
||
|
+ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F));
|
||
|
+ if (!world.isStatic) {
|
||
|
+ world.addEntity(new EntitySnowball(world, entityhuman));
|
||
|
+ }
|
||
|
+
|
||
|
+ return itemstack;
|
||
|
+ }
|
||
|
+}
|
||
|
\ No newline at end of file
|
||
|
diff --git a/src/main/java/net/minecraft/server/LayerIsland.java b/src/main/java/net/minecraft/server/LayerIsland.java
|
||
|
new file mode 100644
|
||
|
index 000000000..8a21033cc
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/LayerIsland.java
|
||
|
@@ -0,0 +1,25 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class LayerIsland extends GenLayer {
|
||
|
+
|
||
|
+ public LayerIsland(long i) {
|
||
|
+ super(i);
|
||
|
+ }
|
||
|
+
|
||
|
+ public int[] a(int i, int j, int k, int l) {
|
||
|
+ int[] aint = IntCache.a(k * l);
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < l; ++i1) {
|
||
|
+ for (int j1 = 0; j1 < k; ++j1) {
|
||
|
+ this.a((long) (i + j1), (long) (j + i1));
|
||
|
+ aint[j1 + i1 * k] = this.a(10) == 0 ? 1 : 0;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i > -k && i <= 0 && j > -l && j <= 0) {
|
||
|
+ aint[-i + -j * k] = 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ return aint;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/MobEffectAttackDamage.java b/src/main/java/net/minecraft/server/MobEffectAttackDamage.java
|
||
|
new file mode 100644
|
||
|
index 000000000..3eb029d46
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/MobEffectAttackDamage.java
|
||
|
@@ -0,0 +1,12 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class MobEffectAttackDamage extends MobEffectList {
|
||
|
+
|
||
|
+ protected MobEffectAttackDamage(int i, boolean flag, int j) {
|
||
|
+ super(i, flag, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public double a(int i, AttributeModifier attributemodifier) {
|
||
|
+ return this.id == MobEffectList.WEAKNESS.id ? (double) (-0.5F * (float) (i + 1)) : 1.3D * (double) (i + 1);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/NBTTagList.java b/src/main/java/net/minecraft/server/NBTTagList.java
|
||
|
new file mode 100644
|
||
|
index 000000000..bdde30a29
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/NBTTagList.java
|
||
|
@@ -0,0 +1,168 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.io.DataInput;
|
||
|
+import java.io.DataOutput;
|
||
|
+import java.io.IOException;
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.Iterator;
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
+public class NBTTagList extends NBTBase {
|
||
|
+
|
||
|
+ private List list = new ArrayList();
|
||
|
+ private byte type = 0;
|
||
|
+
|
||
|
+ public NBTTagList() {}
|
||
|
+
|
||
|
+ void write(DataOutput dataoutput) throws IOException {
|
||
|
+ if (!this.list.isEmpty()) {
|
||
|
+ this.type = ((NBTBase) this.list.get(0)).getTypeId();
|
||
|
+ } else {
|
||
|
+ this.type = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ dataoutput.writeByte(this.type);
|
||
|
+ dataoutput.writeInt(this.list.size());
|
||
|
+
|
||
|
+ for (int i = 0; i < this.list.size(); ++i) {
|
||
|
+ ((NBTBase) this.list.get(i)).write(dataoutput);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ void load(DataInput datainput, int i, NBTReadLimiter nbtreadlimiter) throws IOException {
|
||
|
+ if (i > 512) {
|
||
|
+ throw new RuntimeException("Tried to read NBT tag with too high complexity, depth > 512");
|
||
|
+ } else {
|
||
|
+ nbtreadlimiter.a(8L);
|
||
|
+ this.type = datainput.readByte();
|
||
|
+ int j = datainput.readInt();
|
||
|
+
|
||
|
+ this.list = new ArrayList();
|
||
|
+
|
||
|
+ for (int k = 0; k < j; ++k) {
|
||
|
+ NBTBase nbtbase = NBTBase.createTag(this.type);
|
||
|
+
|
||
|
+ nbtbase.load(datainput, i + 1, nbtreadlimiter);
|
||
|
+ this.list.add(nbtbase);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public byte getTypeId() {
|
||
|
+ return (byte) 9;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String toString() {
|
||
|
+ String s = "[";
|
||
|
+ int i = 0;
|
||
|
+
|
||
|
+ for (Iterator iterator = this.list.iterator(); iterator.hasNext(); ++i) {
|
||
|
+ NBTBase nbtbase = (NBTBase) iterator.next();
|
||
|
+
|
||
|
+ s = s + "" + i + ':' + nbtbase + ',';
|
||
|
+ }
|
||
|
+
|
||
|
+ return s + "]";
|
||
|
+ }
|
||
|
+
|
||
|
+ public void add(NBTBase nbtbase) {
|
||
|
+ if (this.type == 0) {
|
||
|
+ this.type = nbtbase.getTypeId();
|
||
|
+ } else if (this.type != nbtbase.getTypeId()) {
|
||
|
+ System.err.println("WARNING: Adding mismatching tag types to tag list");
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.list.add(nbtbase);
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTTagCompound get(int i) {
|
||
|
+ if (i >= 0 && i < this.list.size()) {
|
||
|
+ NBTBase nbtbase = (NBTBase) this.list.get(i);
|
||
|
+
|
||
|
+ return nbtbase.getTypeId() == 10 ? (NBTTagCompound) nbtbase : new NBTTagCompound();
|
||
|
+ } else {
|
||
|
+ return new NBTTagCompound();
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public int[] c(int i) {
|
||
|
+ if (i >= 0 && i < this.list.size()) {
|
||
|
+ NBTBase nbtbase = (NBTBase) this.list.get(i);
|
||
|
+
|
||
|
+ return nbtbase.getTypeId() == 11 ? ((NBTTagIntArray) nbtbase).c() : new int[0];
|
||
|
+ } else {
|
||
|
+ return new int[0];
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public double d(int i) {
|
||
|
+ if (i >= 0 && i < this.list.size()) {
|
||
|
+ NBTBase nbtbase = (NBTBase) this.list.get(i);
|
||
|
+
|
||
|
+ return nbtbase.getTypeId() == 6 ? ((NBTTagDouble) nbtbase).g() : 0.0D;
|
||
|
+ } else {
|
||
|
+ return 0.0D;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public float e(int i) {
|
||
|
+ if (i >= 0 && i < this.list.size()) {
|
||
|
+ NBTBase nbtbase = (NBTBase) this.list.get(i);
|
||
|
+
|
||
|
+ return nbtbase.getTypeId() == 5 ? ((NBTTagFloat) nbtbase).h() : 0.0F;
|
||
|
+ } else {
|
||
|
+ return 0.0F;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public String getString(int i) {
|
||
|
+ if (i >= 0 && i < this.list.size()) {
|
||
|
+ NBTBase nbtbase = (NBTBase) this.list.get(i);
|
||
|
+
|
||
|
+ return nbtbase.getTypeId() == 8 ? nbtbase.a_() : nbtbase.toString();
|
||
|
+ } else {
|
||
|
+ return "";
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public int size() {
|
||
|
+ return this.list.size();
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTBase clone() {
|
||
|
+ NBTTagList nbttaglist = new NBTTagList();
|
||
|
+
|
||
|
+ nbttaglist.type = this.type;
|
||
|
+ Iterator iterator = this.list.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ NBTBase nbtbase = (NBTBase) iterator.next();
|
||
|
+ NBTBase nbtbase1 = nbtbase.clone();
|
||
|
+
|
||
|
+ nbttaglist.list.add(nbtbase1);
|
||
|
+ }
|
||
|
+
|
||
|
+ return nbttaglist;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean equals(Object object) {
|
||
|
+ if (super.equals(object)) {
|
||
|
+ NBTTagList nbttaglist = (NBTTagList) object;
|
||
|
+
|
||
|
+ if (this.type == nbttaglist.type) {
|
||
|
+ return this.list.equals(nbttaglist.list);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int hashCode() {
|
||
|
+ return super.hashCode() ^ this.list.hashCode();
|
||
|
+ }
|
||
|
+
|
||
|
+ public int d() {
|
||
|
+ return this.type;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/NBTTagString.java b/src/main/java/net/minecraft/server/NBTTagString.java
|
||
|
new file mode 100644
|
||
|
index 000000000..9b0697965
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/NBTTagString.java
|
||
|
@@ -0,0 +1,60 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.io.DataInput;
|
||
|
+import java.io.DataOutput;
|
||
|
+import java.io.IOException;
|
||
|
+
|
||
|
+public class NBTTagString extends NBTBase {
|
||
|
+
|
||
|
+ private String data;
|
||
|
+
|
||
|
+ public NBTTagString() {
|
||
|
+ this.data = "";
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTTagString(String s) {
|
||
|
+ this.data = s;
|
||
|
+ if (s == null) {
|
||
|
+ throw new IllegalArgumentException("Empty string not allowed");
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ void write(DataOutput dataoutput) throws IOException {
|
||
|
+ dataoutput.writeUTF(this.data);
|
||
|
+ }
|
||
|
+
|
||
|
+ void load(DataInput datainput, int i, NBTReadLimiter nbtreadlimiter) throws IOException {
|
||
|
+ this.data = datainput.readUTF();
|
||
|
+ nbtreadlimiter.a((long) (16 * this.data.length()));
|
||
|
+ }
|
||
|
+
|
||
|
+ public byte getTypeId() {
|
||
|
+ return (byte) 8;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String toString() {
|
||
|
+ return "\"" + this.data + "\"";
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTBase clone() {
|
||
|
+ return new NBTTagString(this.data);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean equals(Object object) {
|
||
|
+ if (!super.equals(object)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ NBTTagString nbttagstring = (NBTTagString) object;
|
||
|
+
|
||
|
+ return this.data == null && nbttagstring.data == null || this.data != null && this.data.equals(nbttagstring.data);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public int hashCode() {
|
||
|
+ return super.hashCode() ^ this.data.hashCode();
|
||
|
+ }
|
||
|
+
|
||
|
+ public String a_() {
|
||
|
+ return this.data;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/Navigation.java b/src/main/java/net/minecraft/server/Navigation.java
|
||
|
new file mode 100644
|
||
|
index 000000000..7002621b1
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/Navigation.java
|
||
|
@@ -0,0 +1,348 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class Navigation {
|
||
|
+
|
||
|
+ private EntityInsentient a;
|
||
|
+ private World b;
|
||
|
+ private PathEntity c;
|
||
|
+ private double d;
|
||
|
+ private AttributeInstance e;
|
||
|
+ private boolean f;
|
||
|
+ private int g;
|
||
|
+ private int h;
|
||
|
+ private Vec3D i = Vec3D.a(0.0D, 0.0D, 0.0D);
|
||
|
+ private boolean j = true;
|
||
|
+ private boolean k;
|
||
|
+ private boolean l;
|
||
|
+ private boolean m;
|
||
|
+
|
||
|
+ public Navigation(EntityInsentient entityinsentient, World world) {
|
||
|
+ this.a = entityinsentient;
|
||
|
+ this.b = world;
|
||
|
+ this.e = entityinsentient.getAttributeInstance(GenericAttributes.b);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(boolean flag) {
|
||
|
+ this.l = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ return this.l;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void b(boolean flag) {
|
||
|
+ this.k = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c(boolean flag) {
|
||
|
+ this.j = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean c() {
|
||
|
+ return this.k;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d(boolean flag) {
|
||
|
+ this.f = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(double d0) {
|
||
|
+ this.d = d0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void e(boolean flag) {
|
||
|
+ this.m = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public float d() {
|
||
|
+ return (float) this.e.getValue();
|
||
|
+ }
|
||
|
+
|
||
|
+ public PathEntity a(double d0, double d1, double d2) {
|
||
|
+ return !this.l() ? null : this.b.a(this.a, MathHelper.floor(d0), (int) d1, MathHelper.floor(d2), this.d(), this.j, this.k, this.l, this.m);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a(double d0, double d1, double d2, double d3) {
|
||
|
+ PathEntity pathentity = this.a((double) MathHelper.floor(d0), (double) ((int) d1), (double) MathHelper.floor(d2));
|
||
|
+
|
||
|
+ return this.a(pathentity, d3);
|
||
|
+ }
|
||
|
+
|
||
|
+ public PathEntity a(Entity entity) {
|
||
|
+ return !this.l() ? null : this.b.findPath(this.a, entity, this.d(), this.j, this.k, this.l, this.m);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a(Entity entity, double d0) {
|
||
|
+ PathEntity pathentity = this.a(entity);
|
||
|
+
|
||
|
+ return pathentity != null ? this.a(pathentity, d0) : false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a(PathEntity pathentity, double d0) {
|
||
|
+ if (pathentity == null) {
|
||
|
+ this.c = null;
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ if (!pathentity.a(this.c)) {
|
||
|
+ this.c = pathentity;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.f) {
|
||
|
+ this.n();
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.c.d() == 0) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.d = d0;
|
||
|
+ Vec3D vec3d = this.j();
|
||
|
+
|
||
|
+ this.h = this.g;
|
||
|
+ this.i.a = vec3d.a;
|
||
|
+ this.i.b = vec3d.b;
|
||
|
+ this.i.c = vec3d.c;
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public PathEntity e() {
|
||
|
+ return this.c;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void f() {
|
||
|
+ ++this.g;
|
||
|
+ if (!this.g()) {
|
||
|
+ if (this.l()) {
|
||
|
+ this.i();
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!this.g()) {
|
||
|
+ Vec3D vec3d = this.c.a((Entity) this.a);
|
||
|
+
|
||
|
+ if (vec3d != null) {
|
||
|
+ this.a.getControllerMove().a(vec3d.a, vec3d.b, vec3d.c, this.d);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private void i() {
|
||
|
+ Vec3D vec3d = this.j();
|
||
|
+ int i = this.c.d();
|
||
|
+
|
||
|
+ for (int j = this.c.e(); j < this.c.d(); ++j) {
|
||
|
+ if (this.c.a(j).b != (int) vec3d.b) {
|
||
|
+ i = j;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ float f = this.a.width * this.a.width;
|
||
|
+
|
||
|
+ int k;
|
||
|
+
|
||
|
+ for (k = this.c.e(); k < i; ++k) {
|
||
|
+ if (vec3d.distanceSquared(this.c.a(this.a, k)) < (double) f) {
|
||
|
+ this.c.c(k + 1);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ k = MathHelper.f(this.a.width);
|
||
|
+ int l = (int) this.a.length + 1;
|
||
|
+ int i1 = k;
|
||
|
+
|
||
|
+ for (int j1 = i - 1; j1 >= this.c.e(); --j1) {
|
||
|
+ if (this.a(vec3d, this.c.a(this.a, j1), k, l, i1)) {
|
||
|
+ this.c.c(j1);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.g - this.h > 100) {
|
||
|
+ if (vec3d.distanceSquared(this.i) < 2.25D) {
|
||
|
+ this.h();
|
||
|
+ }
|
||
|
+
|
||
|
+ this.h = this.g;
|
||
|
+ this.i.a = vec3d.a;
|
||
|
+ this.i.b = vec3d.b;
|
||
|
+ this.i.c = vec3d.c;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean g() {
|
||
|
+ return this.c == null || this.c.b();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void h() {
|
||
|
+ this.c = null;
|
||
|
+ }
|
||
|
+
|
||
|
+ private Vec3D j() {
|
||
|
+ return Vec3D.a(this.a.locX, (double) this.k(), this.a.locZ);
|
||
|
+ }
|
||
|
+
|
||
|
+ private int k() {
|
||
|
+ if (this.a.M() && this.m) {
|
||
|
+ int i = (int) this.a.boundingBox.b;
|
||
|
+ Block block = this.b.getType(MathHelper.floor(this.a.locX), i, MathHelper.floor(this.a.locZ));
|
||
|
+ int j = 0;
|
||
|
+
|
||
|
+ do {
|
||
|
+ if (block != Blocks.WATER && block != Blocks.STATIONARY_WATER) {
|
||
|
+ return i;
|
||
|
+ }
|
||
|
+
|
||
|
+ ++i;
|
||
|
+ block = this.b.getType(MathHelper.floor(this.a.locX), i, MathHelper.floor(this.a.locZ));
|
||
|
+ ++j;
|
||
|
+ } while (j <= 16);
|
||
|
+
|
||
|
+ return (int) this.a.boundingBox.b;
|
||
|
+ } else {
|
||
|
+ return (int) (this.a.boundingBox.b + 0.5D);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean l() {
|
||
|
+ return this.a.onGround || this.m && this.m() || this.a.am() && this.a instanceof EntityZombie && this.a.vehicle instanceof EntityChicken;
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean m() {
|
||
|
+ return this.a.M() || this.a.P();
|
||
|
+ }
|
||
|
+
|
||
|
+ private void n() {
|
||
|
+ if (!this.b.i(MathHelper.floor(this.a.locX), (int) (this.a.boundingBox.b + 0.5D), MathHelper.floor(this.a.locZ))) {
|
||
|
+ for (int i = 0; i < this.c.d(); ++i) {
|
||
|
+ PathPoint pathpoint = this.c.a(i);
|
||
|
+
|
||
|
+ if (this.b.i(pathpoint.a, pathpoint.b, pathpoint.c)) {
|
||
|
+ this.c.b(i - 1);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean a(Vec3D vec3d, Vec3D vec3d1, int i, int j, int k) {
|
||
|
+ int l = MathHelper.floor(vec3d.a);
|
||
|
+ int i1 = MathHelper.floor(vec3d.c);
|
||
|
+ double d0 = vec3d1.a - vec3d.a;
|
||
|
+ double d1 = vec3d1.c - vec3d.c;
|
||
|
+ double d2 = d0 * d0 + d1 * d1;
|
||
|
+
|
||
|
+ if (d2 < 1.0E-8D) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ double d3 = 1.0D / Math.sqrt(d2);
|
||
|
+
|
||
|
+ d0 *= d3;
|
||
|
+ d1 *= d3;
|
||
|
+ i += 2;
|
||
|
+ k += 2;
|
||
|
+ if (!this.a(l, (int) vec3d.b, i1, i, j, k, vec3d, d0, d1)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ i -= 2;
|
||
|
+ k -= 2;
|
||
|
+ double d4 = 1.0D / Math.abs(d0);
|
||
|
+ double d5 = 1.0D / Math.abs(d1);
|
||
|
+ double d6 = (double) (l * 1) - vec3d.a;
|
||
|
+ double d7 = (double) (i1 * 1) - vec3d.c;
|
||
|
+
|
||
|
+ if (d0 >= 0.0D) {
|
||
|
+ ++d6;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d1 >= 0.0D) {
|
||
|
+ ++d7;
|
||
|
+ }
|
||
|
+
|
||
|
+ d6 /= d0;
|
||
|
+ d7 /= d1;
|
||
|
+ int j1 = d0 < 0.0D ? -1 : 1;
|
||
|
+ int k1 = d1 < 0.0D ? -1 : 1;
|
||
|
+ int l1 = MathHelper.floor(vec3d1.a);
|
||
|
+ int i2 = MathHelper.floor(vec3d1.c);
|
||
|
+ int j2 = l1 - l;
|
||
|
+ int k2 = i2 - i1;
|
||
|
+
|
||
|
+ do {
|
||
|
+ if (j2 * j1 <= 0 && k2 * k1 <= 0) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d6 < d7) {
|
||
|
+ d6 += d4;
|
||
|
+ l += j1;
|
||
|
+ j2 = l1 - l;
|
||
|
+ } else {
|
||
|
+ d7 += d5;
|
||
|
+ i1 += k1;
|
||
|
+ k2 = i2 - i1;
|
||
|
+ }
|
||
|
+ } while (this.a(l, (int) vec3d.b, i1, i, j, k, vec3d, d0, d1));
|
||
|
+
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean a(int i, int j, int k, int l, int i1, int j1, Vec3D vec3d, double d0, double d1) {
|
||
|
+ int k1 = i - l / 2;
|
||
|
+ int l1 = k - j1 / 2;
|
||
|
+
|
||
|
+ if (!this.b(k1, j, l1, l, i1, j1, vec3d, d0, d1)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ for (int i2 = k1; i2 < k1 + l; ++i2) {
|
||
|
+ for (int j2 = l1; j2 < l1 + j1; ++j2) {
|
||
|
+ double d2 = (double) i2 + 0.5D - vec3d.a;
|
||
|
+ double d3 = (double) j2 + 0.5D - vec3d.c;
|
||
|
+
|
||
|
+ if (d2 * d0 + d3 * d1 >= 0.0D) {
|
||
|
+ Block block = this.b.getType(i2, j - 1, j2);
|
||
|
+ Material material = block.getMaterial();
|
||
|
+
|
||
|
+ if (material == Material.AIR) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (material == Material.WATER && !this.a.M()) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (material == Material.LAVA) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean b(int i, int j, int k, int l, int i1, int j1, Vec3D vec3d, double d0, double d1) {
|
||
|
+ for (int k1 = i; k1 < i + l; ++k1) {
|
||
|
+ for (int l1 = j; l1 < j + i1; ++l1) {
|
||
|
+ for (int i2 = k; i2 < k + j1; ++i2) {
|
||
|
+ double d2 = (double) k1 + 0.5D - vec3d.a;
|
||
|
+ double d3 = (double) i2 + 0.5D - vec3d.c;
|
||
|
+
|
||
|
+ if (d2 * d0 + d3 * d1 >= 0.0D) {
|
||
|
+ Block block = this.b.getType(k1, l1, i2);
|
||
|
+
|
||
|
+ if (!block.b(this.b, k1, l1, i2)) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/Pathfinder.java b/src/main/java/net/minecraft/server/Pathfinder.java
|
||
|
new file mode 100644
|
||
|
index 000000000..de9593976
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/Pathfinder.java
|
||
|
@@ -0,0 +1,283 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class Pathfinder {
|
||
|
+
|
||
|
+ private IBlockAccess a;
|
||
|
+ private Path b = new Path();
|
||
|
+ private IntHashMap c = new IntHashMap();
|
||
|
+ private PathPoint[] d = new PathPoint[32];
|
||
|
+ private boolean e;
|
||
|
+ private boolean f;
|
||
|
+ private boolean g;
|
||
|
+ private boolean h;
|
||
|
+
|
||
|
+ public Pathfinder(IBlockAccess iblockaccess, boolean flag, boolean flag1, boolean flag2, boolean flag3) {
|
||
|
+ this.a = iblockaccess;
|
||
|
+ this.e = flag;
|
||
|
+ this.f = flag1;
|
||
|
+ this.g = flag2;
|
||
|
+ this.h = flag3;
|
||
|
+ }
|
||
|
+
|
||
|
+ public PathEntity a(Entity entity, Entity entity1, float f) {
|
||
|
+ return this.a(entity, entity1.locX, entity1.boundingBox.b, entity1.locZ, f);
|
||
|
+ }
|
||
|
+
|
||
|
+ public PathEntity a(Entity entity, int i, int j, int k, float f) {
|
||
|
+ return this.a(entity, (double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), f);
|
||
|
+ }
|
||
|
+
|
||
|
+ private PathEntity a(Entity entity, double d0, double d1, double d2, float f) {
|
||
|
+ this.b.a();
|
||
|
+ this.c.c();
|
||
|
+ boolean flag = this.g;
|
||
|
+ int i = MathHelper.floor(entity.boundingBox.b + 0.5D);
|
||
|
+
|
||
|
+ if (this.h && entity.M()) {
|
||
|
+ i = (int) entity.boundingBox.b;
|
||
|
+
|
||
|
+ for (Block block = this.a.getType(MathHelper.floor(entity.locX), i, MathHelper.floor(entity.locZ)); block == Blocks.WATER || block == Blocks.STATIONARY_WATER; block = this.a.getType(MathHelper.floor(entity.locX), i, MathHelper.floor(entity.locZ))) {
|
||
|
+ ++i;
|
||
|
+ }
|
||
|
+
|
||
|
+ flag = this.g;
|
||
|
+ this.g = false;
|
||
|
+ } else {
|
||
|
+ i = MathHelper.floor(entity.boundingBox.b + 0.5D);
|
||
|
+ }
|
||
|
+
|
||
|
+ PathPoint pathpoint = this.a(MathHelper.floor(entity.boundingBox.a), i, MathHelper.floor(entity.boundingBox.c));
|
||
|
+ PathPoint pathpoint1 = this.a(MathHelper.floor(d0 - (double) (entity.width / 2.0F)), MathHelper.floor(d1), MathHelper.floor(d2 - (double) (entity.width / 2.0F)));
|
||
|
+ PathPoint pathpoint2 = new PathPoint(MathHelper.d(entity.width + 1.0F), MathHelper.d(entity.length + 1.0F), MathHelper.d(entity.width + 1.0F));
|
||
|
+ PathEntity pathentity = this.a(entity, pathpoint, pathpoint1, pathpoint2, f);
|
||
|
+
|
||
|
+ this.g = flag;
|
||
|
+ return pathentity;
|
||
|
+ }
|
||
|
+
|
||
|
+ private PathEntity a(Entity entity, PathPoint pathpoint, PathPoint pathpoint1, PathPoint pathpoint2, float f) {
|
||
|
+ pathpoint.e = 0.0F;
|
||
|
+ pathpoint.f = pathpoint.b(pathpoint1);
|
||
|
+ pathpoint.g = pathpoint.f;
|
||
|
+ this.b.a();
|
||
|
+ this.b.a(pathpoint);
|
||
|
+ PathPoint pathpoint3 = pathpoint;
|
||
|
+
|
||
|
+ while (!this.b.e()) {
|
||
|
+ PathPoint pathpoint4 = this.b.c();
|
||
|
+
|
||
|
+ if (pathpoint4.equals(pathpoint1)) {
|
||
|
+ return this.a(pathpoint, pathpoint1);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint4.b(pathpoint1) < pathpoint3.b(pathpoint1)) {
|
||
|
+ pathpoint3 = pathpoint4;
|
||
|
+ }
|
||
|
+
|
||
|
+ pathpoint4.i = true;
|
||
|
+ int i = this.b(entity, pathpoint4, pathpoint2, pathpoint1, f);
|
||
|
+
|
||
|
+ for (int j = 0; j < i; ++j) {
|
||
|
+ PathPoint pathpoint5 = this.d[j];
|
||
|
+ float f1 = pathpoint4.e + pathpoint4.b(pathpoint5);
|
||
|
+
|
||
|
+ if (!pathpoint5.a() || f1 < pathpoint5.e) {
|
||
|
+ pathpoint5.h = pathpoint4;
|
||
|
+ pathpoint5.e = f1;
|
||
|
+ pathpoint5.f = pathpoint5.b(pathpoint1);
|
||
|
+ if (pathpoint5.a()) {
|
||
|
+ this.b.a(pathpoint5, pathpoint5.e + pathpoint5.f);
|
||
|
+ } else {
|
||
|
+ pathpoint5.g = pathpoint5.e + pathpoint5.f;
|
||
|
+ this.b.a(pathpoint5);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint3 == pathpoint) {
|
||
|
+ return null;
|
||
|
+ } else {
|
||
|
+ return this.a(pathpoint, pathpoint3);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private int b(Entity entity, PathPoint pathpoint, PathPoint pathpoint1, PathPoint pathpoint2, float f) {
|
||
|
+ int i = 0;
|
||
|
+ byte b0 = 0;
|
||
|
+
|
||
|
+ if (this.a(entity, pathpoint.a, pathpoint.b + 1, pathpoint.c, pathpoint1) == 1) {
|
||
|
+ b0 = 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ PathPoint pathpoint3 = this.a(entity, pathpoint.a, pathpoint.b, pathpoint.c + 1, pathpoint1, b0);
|
||
|
+ PathPoint pathpoint4 = this.a(entity, pathpoint.a - 1, pathpoint.b, pathpoint.c, pathpoint1, b0);
|
||
|
+ PathPoint pathpoint5 = this.a(entity, pathpoint.a + 1, pathpoint.b, pathpoint.c, pathpoint1, b0);
|
||
|
+ PathPoint pathpoint6 = this.a(entity, pathpoint.a, pathpoint.b, pathpoint.c - 1, pathpoint1, b0);
|
||
|
+
|
||
|
+ if (pathpoint3 != null && !pathpoint3.i && pathpoint3.a(pathpoint2) < f) {
|
||
|
+ this.d[i++] = pathpoint3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint4 != null && !pathpoint4.i && pathpoint4.a(pathpoint2) < f) {
|
||
|
+ this.d[i++] = pathpoint4;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint5 != null && !pathpoint5.i && pathpoint5.a(pathpoint2) < f) {
|
||
|
+ this.d[i++] = pathpoint5;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint6 != null && !pathpoint6.i && pathpoint6.a(pathpoint2) < f) {
|
||
|
+ this.d[i++] = pathpoint6;
|
||
|
+ }
|
||
|
+
|
||
|
+ return i;
|
||
|
+ }
|
||
|
+
|
||
|
+ private PathPoint a(Entity entity, int i, int j, int k, PathPoint pathpoint, int l) {
|
||
|
+ PathPoint pathpoint1 = null;
|
||
|
+ int i1 = this.a(entity, i, j, k, pathpoint);
|
||
|
+
|
||
|
+ if (i1 == 2) {
|
||
|
+ return this.a(i, j, k);
|
||
|
+ } else {
|
||
|
+ if (i1 == 1) {
|
||
|
+ pathpoint1 = this.a(i, j, k);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint1 == null && l > 0 && i1 != -3 && i1 != -4 && this.a(entity, i, j + l, k, pathpoint) == 1) {
|
||
|
+ pathpoint1 = this.a(i, j + l, k);
|
||
|
+ j += l;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pathpoint1 != null) {
|
||
|
+ int j1 = 0;
|
||
|
+ int k1 = 0;
|
||
|
+
|
||
|
+ while (j > 0) {
|
||
|
+ k1 = this.a(entity, i, j - 1, k, pathpoint);
|
||
|
+ if (this.g && k1 == -1) {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (k1 != 1) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j1++ >= entity.ax()) {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ --j;
|
||
|
+ if (j > 0) {
|
||
|
+ pathpoint1 = this.a(i, j, k);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (k1 == -2) {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return pathpoint1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private final PathPoint a(int i, int j, int k) {
|
||
|
+ int l = PathPoint.a(i, j, k);
|
||
|
+ PathPoint pathpoint = (PathPoint) this.c.get(l);
|
||
|
+
|
||
|
+ if (pathpoint == null) {
|
||
|
+ pathpoint = new PathPoint(i, j, k);
|
||
|
+ this.c.a(l, pathpoint);
|
||
|
+ }
|
||
|
+
|
||
|
+ return pathpoint;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int a(Entity entity, int i, int j, int k, PathPoint pathpoint) {
|
||
|
+ return a(entity, i, j, k, pathpoint, this.g, this.f, this.e);
|
||
|
+ }
|
||
|
+
|
||
|
+ public static int a(Entity entity, int i, int j, int k, PathPoint pathpoint, boolean flag, boolean flag1, boolean flag2) {
|
||
|
+ boolean flag3 = false;
|
||
|
+
|
||
|
+ for (int l = i; l < i + pathpoint.a; ++l) {
|
||
|
+ for (int i1 = j; i1 < j + pathpoint.b; ++i1) {
|
||
|
+ for (int j1 = k; j1 < k + pathpoint.c; ++j1) {
|
||
|
+ Block block = entity.world.getType(l, i1, j1);
|
||
|
+
|
||
|
+ if (block.getMaterial() != Material.AIR) {
|
||
|
+ if (block == Blocks.TRAP_DOOR) {
|
||
|
+ flag3 = true;
|
||
|
+ } else if (block != Blocks.WATER && block != Blocks.STATIONARY_WATER) {
|
||
|
+ if (!flag2 && block == Blocks.WOODEN_DOOR) {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ if (flag) {
|
||
|
+ return -1;
|
||
|
+ }
|
||
|
+
|
||
|
+ flag3 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ int k1 = block.b();
|
||
|
+
|
||
|
+ if (entity.world.getType(l, i1, j1).b() == 9) {
|
||
|
+ int l1 = MathHelper.floor(entity.locX);
|
||
|
+ int i2 = MathHelper.floor(entity.locY);
|
||
|
+ int j2 = MathHelper.floor(entity.locZ);
|
||
|
+
|
||
|
+ if (entity.world.getType(l1, i2, j2).b() != 9 && entity.world.getType(l1, i2 - 1, j2).b() != 9) {
|
||
|
+ return -3;
|
||
|
+ }
|
||
|
+ } else if (!block.b(entity.world, l, i1, j1) && (!flag1 || block != Blocks.WOODEN_DOOR)) {
|
||
|
+ if (k1 == 11 || block == Blocks.FENCE_GATE || k1 == 32) {
|
||
|
+ return -3;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (block == Blocks.TRAP_DOOR) {
|
||
|
+ return -4;
|
||
|
+ }
|
||
|
+
|
||
|
+ Material material = block.getMaterial();
|
||
|
+
|
||
|
+ if (material != Material.LAVA) {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!entity.P()) {
|
||
|
+ return -2;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return flag3 ? 2 : 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ private PathEntity a(PathPoint pathpoint, PathPoint pathpoint1) {
|
||
|
+ int i = 1;
|
||
|
+
|
||
|
+ PathPoint pathpoint2;
|
||
|
+
|
||
|
+ for (pathpoint2 = pathpoint1; pathpoint2.h != null; pathpoint2 = pathpoint2.h) {
|
||
|
+ ++i;
|
||
|
+ }
|
||
|
+
|
||
|
+ PathPoint[] apathpoint = new PathPoint[i];
|
||
|
+
|
||
|
+ pathpoint2 = pathpoint1;
|
||
|
+ --i;
|
||
|
+
|
||
|
+ for (apathpoint[i] = pathpoint1; pathpoint2.h != null; apathpoint[i] = pathpoint2) {
|
||
|
+ pathpoint2 = pathpoint2.h;
|
||
|
+ --i;
|
||
|
+ }
|
||
|
+
|
||
|
+ return new PathEntity(apathpoint);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalAvoidPlayer.java b/src/main/java/net/minecraft/server/PathfinderGoalAvoidPlayer.java
|
||
|
new file mode 100644
|
||
|
index 000000000..e964925af
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalAvoidPlayer.java
|
||
|
@@ -0,0 +1,82 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
+public class PathfinderGoalAvoidPlayer extends PathfinderGoal {
|
||
|
+
|
||
|
+ public final IEntitySelector a = new EntitySelectorViewable(this);
|
||
|
+ private EntityCreature b;
|
||
|
+ private double c;
|
||
|
+ private double d;
|
||
|
+ private Entity e;
|
||
|
+ private float f;
|
||
|
+ private PathEntity g;
|
||
|
+ private Navigation h;
|
||
|
+ private Class i;
|
||
|
+
|
||
|
+ public PathfinderGoalAvoidPlayer(EntityCreature entitycreature, Class oclass, float f, double d0, double d1) {
|
||
|
+ this.b = entitycreature;
|
||
|
+ this.i = oclass;
|
||
|
+ this.f = f;
|
||
|
+ this.c = d0;
|
||
|
+ this.d = d1;
|
||
|
+ this.h = entitycreature.getNavigation();
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ if (this.i == EntityHuman.class) {
|
||
|
+ if (this.b instanceof EntityTameableAnimal && ((EntityTameableAnimal) this.b).isTamed()) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.e = this.b.world.findNearbyPlayer(this.b, (double) this.f);
|
||
|
+ if (this.e == null) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ List list = this.b.world.a(this.i, this.b.boundingBox.grow((double) this.f, 3.0D, (double) this.f), this.a);
|
||
|
+
|
||
|
+ if (list.isEmpty()) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.e = (Entity) list.get(0);
|
||
|
+ }
|
||
|
+
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.b(this.b, 16, 7, Vec3D.a(this.e.locX, this.e.locY, this.e.locZ));
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ } else if (this.e.e(vec3d.a, vec3d.b, vec3d.c) < this.e.f((Entity) this.b)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.g = this.h.a(vec3d.a, vec3d.b, vec3d.c);
|
||
|
+ return this.g == null ? false : this.g.b(vec3d);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return !this.h.g();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.h.a(this.g, this.c);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d() {
|
||
|
+ this.e = null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void e() {
|
||
|
+ if (this.b.f(this.e) < 49.0D) {
|
||
|
+ this.b.getNavigation().a(this.d);
|
||
|
+ } else {
|
||
|
+ this.b.getNavigation().a(this.c);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ static EntityCreature a(PathfinderGoalAvoidPlayer pathfindergoalavoidplayer) {
|
||
|
+ return pathfindergoalavoidplayer.b;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalFleeSun.java b/src/main/java/net/minecraft/server/PathfinderGoalFleeSun.java
|
||
|
new file mode 100644
|
||
|
index 000000000..846214a4d
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalFleeSun.java
|
||
|
@@ -0,0 +1,65 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class PathfinderGoalFleeSun extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityCreature a;
|
||
|
+ private double b;
|
||
|
+ private double c;
|
||
|
+ private double d;
|
||
|
+ private double e;
|
||
|
+ private World f;
|
||
|
+
|
||
|
+ public PathfinderGoalFleeSun(EntityCreature entitycreature, double d0) {
|
||
|
+ this.a = entitycreature;
|
||
|
+ this.e = d0;
|
||
|
+ this.f = entitycreature.world;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ if (!this.f.w()) {
|
||
|
+ return false;
|
||
|
+ } else if (!this.a.isBurning()) {
|
||
|
+ return false;
|
||
|
+ } else if (!this.f.i(MathHelper.floor(this.a.locX), (int) this.a.boundingBox.b, MathHelper.floor(this.a.locZ))) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ Vec3D vec3d = this.f();
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.b = vec3d.a;
|
||
|
+ this.c = vec3d.b;
|
||
|
+ this.d = vec3d.c;
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return !this.a.getNavigation().g();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.a.getNavigation().a(this.b, this.c, this.d, this.e);
|
||
|
+ }
|
||
|
+
|
||
|
+ private Vec3D f() {
|
||
|
+ Random random = this.a.aI();
|
||
|
+
|
||
|
+ for (int i = 0; i < 10; ++i) {
|
||
|
+ int j = MathHelper.floor(this.a.locX + (double) random.nextInt(20) - 10.0D);
|
||
|
+ int k = MathHelper.floor(this.a.boundingBox.b + (double) random.nextInt(6) - 3.0D);
|
||
|
+ int l = MathHelper.floor(this.a.locZ + (double) random.nextInt(20) - 10.0D);
|
||
|
+
|
||
|
+ if (!this.f.i(j, k, l) && this.a.a(j, k, l) < 0.0F) {
|
||
|
+ return Vec3D.a((double) j, (double) k, (double) l);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java b/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java
|
||
|
new file mode 100644
|
||
|
index 000000000..e28f3f20e
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java
|
||
|
@@ -0,0 +1,98 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class PathfinderGoalJumpOnBlock extends PathfinderGoal {
|
||
|
+
|
||
|
+ private final EntityOcelot a;
|
||
|
+ private final double b;
|
||
|
+ private int c;
|
||
|
+ private int d;
|
||
|
+ private int e;
|
||
|
+ private int f;
|
||
|
+ private int g;
|
||
|
+ private int h;
|
||
|
+
|
||
|
+ public PathfinderGoalJumpOnBlock(EntityOcelot entityocelot, double d0) {
|
||
|
+ this.a = entityocelot;
|
||
|
+ this.b = d0;
|
||
|
+ this.a(5);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ return this.a.isTamed() && !this.a.isSitting() && this.a.aI().nextDouble() <= 0.006500000134110451D && this.f();
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return this.c <= this.e && this.d <= 60 && this.a(this.a.world, this.f, this.g, this.h);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.a.getNavigation().a((double) ((float) this.f) + 0.5D, (double) (this.g + 1), (double) ((float) this.h) + 0.5D, this.b);
|
||
|
+ this.c = 0;
|
||
|
+ this.d = 0;
|
||
|
+ this.e = this.a.aI().nextInt(this.a.aI().nextInt(1200) + 1200) + 1200;
|
||
|
+ this.a.getGoalSit().setSitting(false);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d() {
|
||
|
+ this.a.setSitting(false);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void e() {
|
||
|
+ ++this.c;
|
||
|
+ this.a.getGoalSit().setSitting(false);
|
||
|
+ if (this.a.e((double) this.f, (double) (this.g + 1), (double) this.h) > 1.0D) {
|
||
|
+ this.a.setSitting(false);
|
||
|
+ this.a.getNavigation().a((double) ((float) this.f) + 0.5D, (double) (this.g + 1), (double) ((float) this.h) + 0.5D, this.b);
|
||
|
+ ++this.d;
|
||
|
+ } else if (!this.a.isSitting()) {
|
||
|
+ this.a.setSitting(true);
|
||
|
+ } else {
|
||
|
+ --this.d;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean f() {
|
||
|
+ int i = (int) this.a.locY;
|
||
|
+ double d0 = 2.147483647E9D;
|
||
|
+
|
||
|
+ for (int j = (int) this.a.locX - 8; (double) j < this.a.locX + 8.0D; ++j) {
|
||
|
+ for (int k = (int) this.a.locZ - 8; (double) k < this.a.locZ + 8.0D; ++k) {
|
||
|
+ if (this.a(this.a.world, j, i, k) && this.a.world.isEmpty(j, i + 1, k)) {
|
||
|
+ double d1 = this.a.e((double) j, (double) i, (double) k);
|
||
|
+
|
||
|
+ if (d1 < d0) {
|
||
|
+ this.f = j;
|
||
|
+ this.g = i;
|
||
|
+ this.h = k;
|
||
|
+ d0 = d1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return d0 < 2.147483647E9D;
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean a(World world, int i, int j, int k) {
|
||
|
+ Block block = world.getType(i, j, k);
|
||
|
+ int l = world.getData(i, j, k);
|
||
|
+
|
||
|
+ if (block == Blocks.CHEST) {
|
||
|
+ TileEntityChest tileentitychest = (TileEntityChest) world.getTileEntity(i, j, k);
|
||
|
+
|
||
|
+ if (tileentitychest.o < 1) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ if (block == Blocks.BURNING_FURNACE) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (block == Blocks.BED && !BlockBed.b(l)) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMoveIndoors.java b/src/main/java/net/minecraft/server/PathfinderGoalMoveIndoors.java
|
||
|
new file mode 100644
|
||
|
index 000000000..06f2765d6
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalMoveIndoors.java
|
||
|
@@ -0,0 +1,62 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class PathfinderGoalMoveIndoors extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityCreature a;
|
||
|
+ private VillageDoor b;
|
||
|
+ private int c = -1;
|
||
|
+ private int d = -1;
|
||
|
+
|
||
|
+ public PathfinderGoalMoveIndoors(EntityCreature entitycreature) {
|
||
|
+ this.a = entitycreature;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ int i = MathHelper.floor(this.a.locX);
|
||
|
+ int j = MathHelper.floor(this.a.locY);
|
||
|
+ int k = MathHelper.floor(this.a.locZ);
|
||
|
+
|
||
|
+ if ((!this.a.world.w() || this.a.world.Q() || !this.a.world.getBiome(i, k).e()) && !this.a.world.worldProvider.g) {
|
||
|
+ if (this.a.aI().nextInt(50) != 0) {
|
||
|
+ return false;
|
||
|
+ } else if (this.c != -1 && this.a.e((double) this.c, this.a.locY, (double) this.d) < 4.0D) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ Village village = this.a.world.villages.getClosestVillage(i, j, k, 14);
|
||
|
+
|
||
|
+ if (village == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.b = village.c(i, j, k);
|
||
|
+ return this.b != null;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return !this.a.getNavigation().g();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.c = -1;
|
||
|
+ if (this.a.e((double) this.b.getIndoorsX(), (double) this.b.locY, (double) this.b.getIndoorsZ()) > 256.0D) {
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 14, 3, Vec3D.a((double) this.b.getIndoorsX() + 0.5D, (double) this.b.getIndoorsY(), (double) this.b.getIndoorsZ() + 0.5D));
|
||
|
+
|
||
|
+ if (vec3d != null) {
|
||
|
+ this.a.getNavigation().a(vec3d.a, vec3d.b, vec3d.c, 1.0D);
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ this.a.getNavigation().a((double) this.b.getIndoorsX() + 0.5D, (double) this.b.getIndoorsY(), (double) this.b.getIndoorsZ() + 0.5D, 1.0D);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d() {
|
||
|
+ this.c = this.b.getIndoorsX();
|
||
|
+ this.d = this.b.getIndoorsZ();
|
||
|
+ this.b = null;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMoveThroughVillage.java b/src/main/java/net/minecraft/server/PathfinderGoalMoveThroughVillage.java
|
||
|
new file mode 100644
|
||
|
index 000000000..f4ec2d44d
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalMoveThroughVillage.java
|
||
|
@@ -0,0 +1,121 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.Iterator;
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
+public class PathfinderGoalMoveThroughVillage extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityCreature a;
|
||
|
+ private double b;
|
||
|
+ private PathEntity c;
|
||
|
+ private VillageDoor d;
|
||
|
+ private boolean e;
|
||
|
+ private List f = new ArrayList();
|
||
|
+
|
||
|
+ public PathfinderGoalMoveThroughVillage(EntityCreature entitycreature, double d0, boolean flag) {
|
||
|
+ this.a = entitycreature;
|
||
|
+ this.b = d0;
|
||
|
+ this.e = flag;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ this.f();
|
||
|
+ if (this.e && this.a.world.w()) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ Village village = this.a.world.villages.getClosestVillage(MathHelper.floor(this.a.locX), MathHelper.floor(this.a.locY), MathHelper.floor(this.a.locZ), 0);
|
||
|
+
|
||
|
+ if (village == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.d = this.a(village);
|
||
|
+ if (this.d == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ boolean flag = this.a.getNavigation().c();
|
||
|
+
|
||
|
+ this.a.getNavigation().b(false);
|
||
|
+ this.c = this.a.getNavigation().a((double) this.d.locX, (double) this.d.locY, (double) this.d.locZ);
|
||
|
+ this.a.getNavigation().b(flag);
|
||
|
+ if (this.c != null) {
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 10, 7, Vec3D.a((double) this.d.locX, (double) this.d.locY, (double) this.d.locZ));
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.a.getNavigation().b(false);
|
||
|
+ this.c = this.a.getNavigation().a(vec3d.a, vec3d.b, vec3d.c);
|
||
|
+ this.a.getNavigation().b(flag);
|
||
|
+ return this.c != null;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ if (this.a.getNavigation().g()) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ float f = this.a.width + 4.0F;
|
||
|
+
|
||
|
+ return this.a.e((double) this.d.locX, (double) this.d.locY, (double) this.d.locZ) > (double) (f * f);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.a.getNavigation().a(this.c, this.b);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d() {
|
||
|
+ if (this.a.getNavigation().g() || this.a.e((double) this.d.locX, (double) this.d.locY, (double) this.d.locZ) < 16.0D) {
|
||
|
+ this.f.add(this.d);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private VillageDoor a(Village village) {
|
||
|
+ VillageDoor villagedoor = null;
|
||
|
+ int i = Integer.MAX_VALUE;
|
||
|
+ List list = village.getDoors();
|
||
|
+ Iterator iterator = list.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ VillageDoor villagedoor1 = (VillageDoor) iterator.next();
|
||
|
+ int j = villagedoor1.b(MathHelper.floor(this.a.locX), MathHelper.floor(this.a.locY), MathHelper.floor(this.a.locZ));
|
||
|
+
|
||
|
+ if (j < i && !this.a(villagedoor1)) {
|
||
|
+ villagedoor = villagedoor1;
|
||
|
+ i = j;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return villagedoor;
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean a(VillageDoor villagedoor) {
|
||
|
+ Iterator iterator = this.f.iterator();
|
||
|
+
|
||
|
+ VillageDoor villagedoor1;
|
||
|
+
|
||
|
+ do {
|
||
|
+ if (!iterator.hasNext()) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+
|
||
|
+ villagedoor1 = (VillageDoor) iterator.next();
|
||
|
+ } while (villagedoor.locX != villagedoor1.locX || villagedoor.locY != villagedoor1.locY || villagedoor.locZ != villagedoor1.locZ);
|
||
|
+
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ private void f() {
|
||
|
+ if (this.f.size() > 15) {
|
||
|
+ this.f.remove(0);
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMoveTowardsRestriction.java b/src/main/java/net/minecraft/server/PathfinderGoalMoveTowardsRestriction.java
|
||
|
new file mode 100644
|
||
|
index 000000000..69a940e5d
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalMoveTowardsRestriction.java
|
||
|
@@ -0,0 +1,42 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class PathfinderGoalMoveTowardsRestriction extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityCreature a;
|
||
|
+ private double b;
|
||
|
+ private double c;
|
||
|
+ private double d;
|
||
|
+ private double e;
|
||
|
+
|
||
|
+ public PathfinderGoalMoveTowardsRestriction(EntityCreature entitycreature, double d0) {
|
||
|
+ this.a = entitycreature;
|
||
|
+ this.e = d0;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ if (this.a.bU()) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ ChunkCoordinates chunkcoordinates = this.a.bV();
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 16, 7, Vec3D.a((double) chunkcoordinates.x, (double) chunkcoordinates.y, (double) chunkcoordinates.z));
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.b = vec3d.a;
|
||
|
+ this.c = vec3d.b;
|
||
|
+ this.d = vec3d.c;
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return !this.a.getNavigation().g();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.a.getNavigation().a(this.b, this.c, this.d, this.e);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMoveTowardsTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalMoveTowardsTarget.java
|
||
|
new file mode 100644
|
||
|
index 000000000..28c6252c8
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalMoveTowardsTarget.java
|
||
|
@@ -0,0 +1,51 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class PathfinderGoalMoveTowardsTarget extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityCreature a;
|
||
|
+ private EntityLiving b;
|
||
|
+ private double c;
|
||
|
+ private double d;
|
||
|
+ private double e;
|
||
|
+ private double f;
|
||
|
+ private float g;
|
||
|
+
|
||
|
+ public PathfinderGoalMoveTowardsTarget(EntityCreature entitycreature, double d0, float f) {
|
||
|
+ this.a = entitycreature;
|
||
|
+ this.f = d0;
|
||
|
+ this.g = f;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ this.b = this.a.getGoalTarget();
|
||
|
+ if (this.b == null) {
|
||
|
+ return false;
|
||
|
+ } else if (this.b.f(this.a) > (double) (this.g * this.g)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 16, 7, Vec3D.a(this.b.locX, this.b.locY, this.b.locZ));
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.c = vec3d.a;
|
||
|
+ this.d = vec3d.b;
|
||
|
+ this.e = vec3d.c;
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return !this.a.getNavigation().g() && this.b.isAlive() && this.b.f(this.a) < (double) (this.g * this.g);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d() {
|
||
|
+ this.b = null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.a.getNavigation().a(this.c, this.d, this.e, this.f);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalPlay.java b/src/main/java/net/minecraft/server/PathfinderGoalPlay.java
|
||
|
new file mode 100644
|
||
|
index 000000000..8fba19a7f
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalPlay.java
|
||
|
@@ -0,0 +1,87 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Iterator;
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
+public class PathfinderGoalPlay extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityVillager a;
|
||
|
+ private EntityLiving b;
|
||
|
+ private double c;
|
||
|
+ private int d;
|
||
|
+
|
||
|
+ public PathfinderGoalPlay(EntityVillager entityvillager, double d0) {
|
||
|
+ this.a = entityvillager;
|
||
|
+ this.c = d0;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ if (this.a.getAge() >= 0) {
|
||
|
+ return false;
|
||
|
+ } else if (this.a.aI().nextInt(400) != 0) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ List list = this.a.world.a(EntityVillager.class, this.a.boundingBox.grow(6.0D, 3.0D, 6.0D));
|
||
|
+ double d0 = Double.MAX_VALUE;
|
||
|
+ Iterator iterator = list.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ EntityVillager entityvillager = (EntityVillager) iterator.next();
|
||
|
+
|
||
|
+ if (entityvillager != this.a && !entityvillager.cb() && entityvillager.getAge() < 0) {
|
||
|
+ double d1 = entityvillager.f(this.a);
|
||
|
+
|
||
|
+ if (d1 <= d0) {
|
||
|
+ d0 = d1;
|
||
|
+ this.b = entityvillager;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.b == null) {
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 16, 3);
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return this.d > 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ if (this.b != null) {
|
||
|
+ this.a.j(true);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.d = 1000;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d() {
|
||
|
+ this.a.j(false);
|
||
|
+ this.b = null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void e() {
|
||
|
+ --this.d;
|
||
|
+ if (this.b != null) {
|
||
|
+ if (this.a.f(this.b) > 4.0D) {
|
||
|
+ this.a.getNavigation().a((Entity) this.b, this.c);
|
||
|
+ }
|
||
|
+ } else if (this.a.getNavigation().g()) {
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 16, 3);
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.a.getNavigation().a(vec3d.a, vec3d.b, vec3d.c, this.c);
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java b/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java
|
||
|
new file mode 100644
|
||
|
index 000000000..396997afe
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java
|
||
|
@@ -0,0 +1,43 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class PathfinderGoalRandomStroll extends PathfinderGoal {
|
||
|
+
|
||
|
+ private EntityCreature a;
|
||
|
+ private double b;
|
||
|
+ private double c;
|
||
|
+ private double d;
|
||
|
+ private double e;
|
||
|
+
|
||
|
+ public PathfinderGoalRandomStroll(EntityCreature entitycreature, double d0) {
|
||
|
+ this.a = entitycreature;
|
||
|
+ this.e = d0;
|
||
|
+ this.a(1);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a() {
|
||
|
+ if (this.a.aN() >= 100) {
|
||
|
+ return false;
|
||
|
+ } else if (this.a.aI().nextInt(120) != 0) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ Vec3D vec3d = RandomPositionGenerator.a(this.a, 10, 7);
|
||
|
+
|
||
|
+ if (vec3d == null) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ this.b = vec3d.a;
|
||
|
+ this.c = vec3d.b;
|
||
|
+ this.d = vec3d.c;
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean b() {
|
||
|
+ return !this.a.getNavigation().g();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void c() {
|
||
|
+ this.a.getNavigation().a(this.b, this.c, this.d, this.e);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/QueuedProtocolSwitch.java b/src/main/java/net/minecraft/server/QueuedProtocolSwitch.java
|
||
|
new file mode 100644
|
||
|
index 000000000..344e4f00b
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/QueuedProtocolSwitch.java
|
||
|
@@ -0,0 +1,29 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import net.minecraft.util.io.netty.channel.ChannelFutureListener;
|
||
|
+import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener;
|
||
|
+
|
||
|
+class QueuedProtocolSwitch implements Runnable {
|
||
|
+
|
||
|
+ final EnumProtocol a;
|
||
|
+ final EnumProtocol b;
|
||
|
+ final Packet c;
|
||
|
+ final GenericFutureListener[] d;
|
||
|
+ final NetworkManager e;
|
||
|
+
|
||
|
+ QueuedProtocolSwitch(NetworkManager networkmanager, EnumProtocol enumprotocol, EnumProtocol enumprotocol1, Packet packet, GenericFutureListener[] agenericfuturelistener) {
|
||
|
+ this.e = networkmanager;
|
||
|
+ this.a = enumprotocol;
|
||
|
+ this.b = enumprotocol1;
|
||
|
+ this.c = packet;
|
||
|
+ this.d = agenericfuturelistener;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void run() {
|
||
|
+ if (this.a != this.b) {
|
||
|
+ this.e.a(this.a);
|
||
|
+ }
|
||
|
+
|
||
|
+ NetworkManager.a(this.e).writeAndFlush(this.c).addListeners(this.d).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/RandomPositionGenerator.java b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
||
|
new file mode 100644
|
||
|
index 000000000..9342a3f42
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
||
|
@@ -0,0 +1,74 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class RandomPositionGenerator {
|
||
|
+
|
||
|
+ private static Vec3D a = Vec3D.a(0.0D, 0.0D, 0.0D);
|
||
|
+
|
||
|
+ public static Vec3D a(EntityCreature entitycreature, int i, int j) {
|
||
|
+ return c(entitycreature, i, j, (Vec3D) null);
|
||
|
+ }
|
||
|
+
|
||
|
+ public static Vec3D a(EntityCreature entitycreature, int i, int j, Vec3D vec3d) {
|
||
|
+ a.a = vec3d.a - entitycreature.locX;
|
||
|
+ a.b = vec3d.b - entitycreature.locY;
|
||
|
+ a.c = vec3d.c - entitycreature.locZ;
|
||
|
+ return c(entitycreature, i, j, a);
|
||
|
+ }
|
||
|
+
|
||
|
+ public static Vec3D b(EntityCreature entitycreature, int i, int j, Vec3D vec3d) {
|
||
|
+ a.a = entitycreature.locX - vec3d.a;
|
||
|
+ a.b = entitycreature.locY - vec3d.b;
|
||
|
+ a.c = entitycreature.locZ - vec3d.c;
|
||
|
+ return c(entitycreature, i, j, a);
|
||
|
+ }
|
||
|
+
|
||
|
+ private static Vec3D c(EntityCreature entitycreature, int i, int j, Vec3D vec3d) {
|
||
|
+ Random random = entitycreature.aI();
|
||
|
+ boolean flag = false;
|
||
|
+ int k = 0;
|
||
|
+ int l = 0;
|
||
|
+ int i1 = 0;
|
||
|
+ float f = -99999.0F;
|
||
|
+ boolean flag1;
|
||
|
+
|
||
|
+ if (entitycreature.bY()) {
|
||
|
+ double d0 = (double) (entitycreature.bV().e(MathHelper.floor(entitycreature.locX), MathHelper.floor(entitycreature.locY), MathHelper.floor(entitycreature.locZ)) + 4.0F);
|
||
|
+ double d1 = (double) (entitycreature.bW() + (float) i);
|
||
|
+
|
||
|
+ flag1 = d0 < d1 * d1;
|
||
|
+ } else {
|
||
|
+ flag1 = false;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (int j1 = 0; j1 < 10; ++j1) {
|
||
|
+ int k1 = random.nextInt(2 * i) - i;
|
||
|
+ int l1 = random.nextInt(2 * j) - j;
|
||
|
+ int i2 = random.nextInt(2 * i) - i;
|
||
|
+
|
||
|
+ if (vec3d == null || (double) k1 * vec3d.a + (double) i2 * vec3d.c >= 0.0D) {
|
||
|
+ k1 += MathHelper.floor(entitycreature.locX);
|
||
|
+ l1 += MathHelper.floor(entitycreature.locY);
|
||
|
+ i2 += MathHelper.floor(entitycreature.locZ);
|
||
|
+ if (!flag1 || entitycreature.b(k1, l1, i2)) {
|
||
|
+ float f1 = entitycreature.a(k1, l1, i2);
|
||
|
+
|
||
|
+ if (f1 > f) {
|
||
|
+ f = f1;
|
||
|
+ k = k1;
|
||
|
+ l = l1;
|
||
|
+ i1 = i2;
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ return Vec3D.a((double) k, (double) l, (double) i1);
|
||
|
+ } else {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/RegistryBlocks.java b/src/main/java/net/minecraft/server/RegistryBlocks.java
|
||
|
new file mode 100644
|
||
|
index 000000000..43f926919
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/RegistryBlocks.java
|
||
|
@@ -0,0 +1,35 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class RegistryBlocks extends RegistryMaterials {
|
||
|
+
|
||
|
+ private final String d;
|
||
|
+ private Object e;
|
||
|
+
|
||
|
+ public RegistryBlocks(String s) {
|
||
|
+ this.d = s;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(int i, String s, Object object) {
|
||
|
+ if (this.d.equals(s)) {
|
||
|
+ this.e = object;
|
||
|
+ }
|
||
|
+
|
||
|
+ super.a(i, s, object);
|
||
|
+ }
|
||
|
+
|
||
|
+ public Object get(String s) {
|
||
|
+ Object object = super.get(s);
|
||
|
+
|
||
|
+ return object == null ? this.e : object;
|
||
|
+ }
|
||
|
+
|
||
|
+ public Object a(int i) {
|
||
|
+ Object object = super.a(i);
|
||
|
+
|
||
|
+ return object == null ? this.e : object;
|
||
|
+ }
|
||
|
+
|
||
|
+ public Object get(Object object) {
|
||
|
+ return this.get((String) object);
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/Scoreboard.java b/src/main/java/net/minecraft/server/Scoreboard.java
|
||
|
new file mode 100644
|
||
|
index 000000000..d3511ca08
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/Scoreboard.java
|
||
|
@@ -0,0 +1,275 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.Collection;
|
||
|
+import java.util.Collections;
|
||
|
+import java.util.HashMap;
|
||
|
+import java.util.Iterator;
|
||
|
+import java.util.List;
|
||
|
+import java.util.Map;
|
||
|
+
|
||
|
+public class Scoreboard {
|
||
|
+
|
||
|
+ private final Map objectivesByName = new HashMap();
|
||
|
+ private final Map objectivesByCriteria = new HashMap();
|
||
|
+ private final Map playerScores = new HashMap();
|
||
|
+ private final ScoreboardObjective[] displaySlots = new ScoreboardObjective[3];
|
||
|
+ private final Map teamsByName = new HashMap();
|
||
|
+ private final Map teamsByPlayer = new HashMap();
|
||
|
+
|
||
|
+ public Scoreboard() {}
|
||
|
+
|
||
|
+ public ScoreboardObjective getObjective(String s) {
|
||
|
+ return (ScoreboardObjective) this.objectivesByName.get(s);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ScoreboardObjective registerObjective(String s, IScoreboardCriteria iscoreboardcriteria) {
|
||
|
+ ScoreboardObjective scoreboardobjective = this.getObjective(s);
|
||
|
+
|
||
|
+ if (scoreboardobjective != null) {
|
||
|
+ throw new IllegalArgumentException("An objective with the name \'" + s + "\' already exists!");
|
||
|
+ } else {
|
||
|
+ scoreboardobjective = new ScoreboardObjective(this, s, iscoreboardcriteria);
|
||
|
+ Object object = (List) this.objectivesByCriteria.get(iscoreboardcriteria);
|
||
|
+
|
||
|
+ if (object == null) {
|
||
|
+ object = new ArrayList();
|
||
|
+ this.objectivesByCriteria.put(iscoreboardcriteria, object);
|
||
|
+ }
|
||
|
+
|
||
|
+ ((List) object).add(scoreboardobjective);
|
||
|
+ this.objectivesByName.put(s, scoreboardobjective);
|
||
|
+ this.handleObjectiveAdded(scoreboardobjective);
|
||
|
+ return scoreboardobjective;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getObjectivesForCriteria(IScoreboardCriteria iscoreboardcriteria) {
|
||
|
+ Collection collection = (Collection) this.objectivesByCriteria.get(iscoreboardcriteria);
|
||
|
+
|
||
|
+ return collection == null ? new ArrayList() : new ArrayList(collection);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ScoreboardScore getPlayerScoreForObjective(String s, ScoreboardObjective scoreboardobjective) {
|
||
|
+ Object object = (Map) this.playerScores.get(s);
|
||
|
+
|
||
|
+ if (object == null) {
|
||
|
+ object = new HashMap();
|
||
|
+ this.playerScores.put(s, object);
|
||
|
+ }
|
||
|
+
|
||
|
+ ScoreboardScore scoreboardscore = (ScoreboardScore) ((Map) object).get(scoreboardobjective);
|
||
|
+
|
||
|
+ if (scoreboardscore == null) {
|
||
|
+ scoreboardscore = new ScoreboardScore(this, scoreboardobjective, s);
|
||
|
+ ((Map) object).put(scoreboardobjective, scoreboardscore);
|
||
|
+ }
|
||
|
+
|
||
|
+ return scoreboardscore;
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getScoresForObjective(ScoreboardObjective scoreboardobjective) {
|
||
|
+ ArrayList arraylist = new ArrayList();
|
||
|
+ Iterator iterator = this.playerScores.values().iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ Map map = (Map) iterator.next();
|
||
|
+ ScoreboardScore scoreboardscore = (ScoreboardScore) map.get(scoreboardobjective);
|
||
|
+
|
||
|
+ if (scoreboardscore != null) {
|
||
|
+ arraylist.add(scoreboardscore);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ Collections.sort(arraylist, ScoreboardScore.a);
|
||
|
+ return arraylist;
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getObjectives() {
|
||
|
+ return this.objectivesByName.values();
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getPlayers() {
|
||
|
+ return this.playerScores.keySet();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void resetPlayerScores(String s) {
|
||
|
+ Map map = (Map) this.playerScores.remove(s);
|
||
|
+
|
||
|
+ if (map != null) {
|
||
|
+ this.handlePlayerRemoved(s);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getScores() {
|
||
|
+ Collection collection = this.playerScores.values();
|
||
|
+ ArrayList arraylist = new ArrayList();
|
||
|
+ Iterator iterator = collection.iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ Map map = (Map) iterator.next();
|
||
|
+
|
||
|
+ arraylist.addAll(map.values());
|
||
|
+ }
|
||
|
+
|
||
|
+ return arraylist;
|
||
|
+ }
|
||
|
+
|
||
|
+ public Map getPlayerObjectives(String s) {
|
||
|
+ Object object = (Map) this.playerScores.get(s);
|
||
|
+
|
||
|
+ if (object == null) {
|
||
|
+ object = new HashMap();
|
||
|
+ }
|
||
|
+
|
||
|
+ return (Map) object;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void unregisterObjective(ScoreboardObjective scoreboardobjective) {
|
||
|
+ this.objectivesByName.remove(scoreboardobjective.getName());
|
||
|
+
|
||
|
+ for (int i = 0; i < 3; ++i) {
|
||
|
+ if (this.getObjectiveForSlot(i) == scoreboardobjective) {
|
||
|
+ this.setDisplaySlot(i, (ScoreboardObjective) null);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ List list = (List) this.objectivesByCriteria.get(scoreboardobjective.getCriteria());
|
||
|
+
|
||
|
+ if (list != null) {
|
||
|
+ list.remove(scoreboardobjective);
|
||
|
+ }
|
||
|
+
|
||
|
+ Iterator iterator = this.playerScores.values().iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ Map map = (Map) iterator.next();
|
||
|
+
|
||
|
+ map.remove(scoreboardobjective);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.handleObjectiveRemoved(scoreboardobjective);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setDisplaySlot(int i, ScoreboardObjective scoreboardobjective) {
|
||
|
+ this.displaySlots[i] = scoreboardobjective;
|
||
|
+ }
|
||
|
+
|
||
|
+ public ScoreboardObjective getObjectiveForSlot(int i) {
|
||
|
+ return this.displaySlots[i];
|
||
|
+ }
|
||
|
+
|
||
|
+ public ScoreboardTeam getTeam(String s) {
|
||
|
+ return (ScoreboardTeam) this.teamsByName.get(s);
|
||
|
+ }
|
||
|
+
|
||
|
+ public ScoreboardTeam createTeam(String s) {
|
||
|
+ ScoreboardTeam scoreboardteam = this.getTeam(s);
|
||
|
+
|
||
|
+ if (scoreboardteam != null) {
|
||
|
+ throw new IllegalArgumentException("A team with the name \'" + s + "\' already exists!");
|
||
|
+ } else {
|
||
|
+ scoreboardteam = new ScoreboardTeam(this, s);
|
||
|
+ this.teamsByName.put(s, scoreboardteam);
|
||
|
+ this.handleTeamAdded(scoreboardteam);
|
||
|
+ return scoreboardteam;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void removeTeam(ScoreboardTeam scoreboardteam) {
|
||
|
+ this.teamsByName.remove(scoreboardteam.getName());
|
||
|
+ Iterator iterator = scoreboardteam.getPlayerNameSet().iterator();
|
||
|
+
|
||
|
+ while (iterator.hasNext()) {
|
||
|
+ String s = (String) iterator.next();
|
||
|
+
|
||
|
+ this.teamsByPlayer.remove(s);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.handleTeamRemoved(scoreboardteam);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean addPlayerToTeam(String s, String s1) {
|
||
|
+ if (!this.teamsByName.containsKey(s1)) {
|
||
|
+ return false;
|
||
|
+ } else {
|
||
|
+ ScoreboardTeam scoreboardteam = this.getTeam(s1);
|
||
|
+
|
||
|
+ if (this.getPlayerTeam(s) != null) {
|
||
|
+ this.removePlayerFromTeam(s);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.teamsByPlayer.put(s, scoreboardteam);
|
||
|
+ scoreboardteam.getPlayerNameSet().add(s);
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean removePlayerFromTeam(String s) {
|
||
|
+ ScoreboardTeam scoreboardteam = this.getPlayerTeam(s);
|
||
|
+
|
||
|
+ if (scoreboardteam != null) {
|
||
|
+ this.removePlayerFromTeam(s, scoreboardteam);
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) {
|
||
|
+ if (this.getPlayerTeam(s) != scoreboardteam) {
|
||
|
+ throw new IllegalStateException("Player is either on another team or not on any team. Cannot remove from team \'" + scoreboardteam.getName() + "\'.");
|
||
|
+ } else {
|
||
|
+ this.teamsByPlayer.remove(s);
|
||
|
+ scoreboardteam.getPlayerNameSet().remove(s);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getTeamNames() {
|
||
|
+ return this.teamsByName.keySet();
|
||
|
+ }
|
||
|
+
|
||
|
+ public Collection getTeams() {
|
||
|
+ return this.teamsByName.values();
|
||
|
+ }
|
||
|
+
|
||
|
+ public ScoreboardTeam getPlayerTeam(String s) {
|
||
|
+ return (ScoreboardTeam) this.teamsByPlayer.get(s);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void handleObjectiveAdded(ScoreboardObjective scoreboardobjective) {}
|
||
|
+
|
||
|
+ public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) {}
|
||
|
+
|
||
|
+ public void handleObjectiveRemoved(ScoreboardObjective scoreboardobjective) {}
|
||
|
+
|
||
|
+ public void handleScoreChanged(ScoreboardScore scoreboardscore) {}
|
||
|
+
|
||
|
+ public void handlePlayerRemoved(String s) {}
|
||
|
+
|
||
|
+ public void handleTeamAdded(ScoreboardTeam scoreboardteam) {}
|
||
|
+
|
||
|
+ public void handleTeamChanged(ScoreboardTeam scoreboardteam) {}
|
||
|
+
|
||
|
+ public void handleTeamRemoved(ScoreboardTeam scoreboardteam) {}
|
||
|
+
|
||
|
+ public static String getSlotName(int i) {
|
||
|
+ switch (i) {
|
||
|
+ case 0:
|
||
|
+ return "list";
|
||
|
+
|
||
|
+ case 1:
|
||
|
+ return "sidebar";
|
||
|
+
|
||
|
+ case 2:
|
||
|
+ return "belowName";
|
||
|
+
|
||
|
+ default:
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public static int getSlotForName(String s) {
|
||
|
+ return s.equalsIgnoreCase("list") ? 0 : (s.equalsIgnoreCase("sidebar") ? 1 : (s.equalsIgnoreCase("belowName") ? 2 : -1));
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/TileEntityEnderChest.java b/src/main/java/net/minecraft/server/TileEntityEnderChest.java
|
||
|
new file mode 100644
|
||
|
index 000000000..b205ab70d
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/TileEntityEnderChest.java
|
||
|
@@ -0,0 +1,84 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class TileEntityEnderChest extends TileEntity {
|
||
|
+
|
||
|
+ public float a;
|
||
|
+ public float i;
|
||
|
+ public int j;
|
||
|
+ private int k;
|
||
|
+
|
||
|
+ public TileEntityEnderChest() {}
|
||
|
+
|
||
|
+ public void h() {
|
||
|
+ super.h();
|
||
|
+ if (++this.k % 20 * 4 == 0) {
|
||
|
+ this.world.playBlockAction(this.x, this.y, this.z, Blocks.ENDER_CHEST, 1, this.j);
|
||
|
+ }
|
||
|
+
|
||
|
+ this.i = this.a;
|
||
|
+ float f = 0.1F;
|
||
|
+ double d0;
|
||
|
+
|
||
|
+ if (this.j > 0 && this.a == 0.0F) {
|
||
|
+ double d1 = (double) this.x + 0.5D;
|
||
|
+
|
||
|
+ d0 = (double) this.z + 0.5D;
|
||
|
+ this.world.makeSound(d1, (double) this.y + 0.5D, d0, "random.chestopen", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.j == 0 && this.a > 0.0F || this.j > 0 && this.a < 1.0F) {
|
||
|
+ float f1 = this.a;
|
||
|
+
|
||
|
+ if (this.j > 0) {
|
||
|
+ this.a += f;
|
||
|
+ } else {
|
||
|
+ this.a -= f;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.a > 1.0F) {
|
||
|
+ this.a = 1.0F;
|
||
|
+ }
|
||
|
+
|
||
|
+ float f2 = 0.5F;
|
||
|
+
|
||
|
+ if (this.a < f2 && f1 >= f2) {
|
||
|
+ d0 = (double) this.x + 0.5D;
|
||
|
+ double d2 = (double) this.z + 0.5D;
|
||
|
+
|
||
|
+ this.world.makeSound(d0, (double) this.y + 0.5D, d2, "random.chestclosed", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (this.a < 0.0F) {
|
||
|
+ this.a = 0.0F;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean c(int i, int j) {
|
||
|
+ if (i == 1) {
|
||
|
+ this.j = j;
|
||
|
+ return true;
|
||
|
+ } else {
|
||
|
+ return super.c(i, j);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public void s() {
|
||
|
+ this.u();
|
||
|
+ super.s();
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a() {
|
||
|
+ ++this.j;
|
||
|
+ this.world.playBlockAction(this.x, this.y, this.z, Blocks.ENDER_CHEST, 1, this.j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public void b() {
|
||
|
+ --this.j;
|
||
|
+ this.world.playBlockAction(this.x, this.y, this.z, Blocks.ENDER_CHEST, 1, this.j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a(EntityHuman entityhuman) {
|
||
|
+ return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/TileEntityLightDetector.java b/src/main/java/net/minecraft/server/TileEntityLightDetector.java
|
||
|
new file mode 100644
|
||
|
index 000000000..143cffbab
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/TileEntityLightDetector.java
|
||
|
@@ -0,0 +1,15 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public class TileEntityLightDetector extends TileEntity {
|
||
|
+
|
||
|
+ public TileEntityLightDetector() {}
|
||
|
+
|
||
|
+ public void h() {
|
||
|
+ if (this.world != null && !this.world.isStatic && this.world.getTime() % 20L == 0L) {
|
||
|
+ this.h = this.q();
|
||
|
+ if (this.h instanceof BlockDaylightDetector) {
|
||
|
+ ((BlockDaylightDetector) this.h).e(this.world, this.x, this.y, this.z);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldChunkManager.java b/src/main/java/net/minecraft/server/WorldChunkManager.java
|
||
|
new file mode 100644
|
||
|
index 000000000..4b94d1cf6
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldChunkManager.java
|
||
|
@@ -0,0 +1,195 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.List;
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class WorldChunkManager {
|
||
|
+
|
||
|
+ private GenLayer c;
|
||
|
+ private GenLayer d;
|
||
|
+ private BiomeCache e;
|
||
|
+ private List f;
|
||
|
+
|
||
|
+ protected WorldChunkManager() {
|
||
|
+ this.e = new BiomeCache(this);
|
||
|
+ this.f = new ArrayList();
|
||
|
+ this.f.add(BiomeBase.FOREST);
|
||
|
+ this.f.add(BiomeBase.PLAINS);
|
||
|
+ this.f.add(BiomeBase.TAIGA);
|
||
|
+ this.f.add(BiomeBase.TAIGA_HILLS);
|
||
|
+ this.f.add(BiomeBase.FOREST_HILLS);
|
||
|
+ this.f.add(BiomeBase.JUNGLE);
|
||
|
+ this.f.add(BiomeBase.JUNGLE_HILLS);
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldChunkManager(long i, WorldType worldtype) {
|
||
|
+ this();
|
||
|
+ GenLayer[] agenlayer = GenLayer.a(i, worldtype);
|
||
|
+
|
||
|
+ this.c = agenlayer[0];
|
||
|
+ this.d = agenlayer[1];
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldChunkManager(World world) {
|
||
|
+ this(world.getSeed(), world.getWorldData().getType());
|
||
|
+ }
|
||
|
+
|
||
|
+ public List a() {
|
||
|
+ return this.f;
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeBase getBiome(int i, int j) {
|
||
|
+ return this.e.b(i, j);
|
||
|
+ }
|
||
|
+
|
||
|
+ public float[] getWetness(float[] afloat, int i, int j, int k, int l) {
|
||
|
+ IntCache.a();
|
||
|
+ if (afloat == null || afloat.length < k * l) {
|
||
|
+ afloat = new float[k * l];
|
||
|
+ }
|
||
|
+
|
||
|
+ int[] aint = this.d.a(i, j, k, l);
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < k * l; ++i1) {
|
||
|
+ try {
|
||
|
+ float f = (float) BiomeBase.getBiome(aint[i1]).h() / 65536.0F;
|
||
|
+
|
||
|
+ if (f > 1.0F) {
|
||
|
+ f = 1.0F;
|
||
|
+ }
|
||
|
+
|
||
|
+ afloat[i1] = f;
|
||
|
+ } catch (Throwable throwable) {
|
||
|
+ CrashReport crashreport = CrashReport.a(throwable, "Invalid Biome id");
|
||
|
+ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("DownfallBlock");
|
||
|
+
|
||
|
+ crashreportsystemdetails.a("biome id", Integer.valueOf(i1));
|
||
|
+ crashreportsystemdetails.a("downfalls[] size", Integer.valueOf(afloat.length));
|
||
|
+ crashreportsystemdetails.a("x", Integer.valueOf(i));
|
||
|
+ crashreportsystemdetails.a("z", Integer.valueOf(j));
|
||
|
+ crashreportsystemdetails.a("w", Integer.valueOf(k));
|
||
|
+ crashreportsystemdetails.a("h", Integer.valueOf(l));
|
||
|
+ throw new ReportedException(crashreport);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return afloat;
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeBase[] getBiomes(BiomeBase[] abiomebase, int i, int j, int k, int l) {
|
||
|
+ IntCache.a();
|
||
|
+ if (abiomebase == null || abiomebase.length < k * l) {
|
||
|
+ abiomebase = new BiomeBase[k * l];
|
||
|
+ }
|
||
|
+
|
||
|
+ int[] aint = this.c.a(i, j, k, l);
|
||
|
+
|
||
|
+ try {
|
||
|
+ for (int i1 = 0; i1 < k * l; ++i1) {
|
||
|
+ abiomebase[i1] = BiomeBase.getBiome(aint[i1]);
|
||
|
+ }
|
||
|
+
|
||
|
+ return abiomebase;
|
||
|
+ } catch (Throwable throwable) {
|
||
|
+ CrashReport crashreport = CrashReport.a(throwable, "Invalid Biome id");
|
||
|
+ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("RawBiomeBlock");
|
||
|
+
|
||
|
+ crashreportsystemdetails.a("biomes[] size", Integer.valueOf(abiomebase.length));
|
||
|
+ crashreportsystemdetails.a("x", Integer.valueOf(i));
|
||
|
+ crashreportsystemdetails.a("z", Integer.valueOf(j));
|
||
|
+ crashreportsystemdetails.a("w", Integer.valueOf(k));
|
||
|
+ crashreportsystemdetails.a("h", Integer.valueOf(l));
|
||
|
+ throw new ReportedException(crashreport);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeBase[] getBiomeBlock(BiomeBase[] abiomebase, int i, int j, int k, int l) {
|
||
|
+ return this.a(abiomebase, i, j, k, l, true);
|
||
|
+ }
|
||
|
+
|
||
|
+ public BiomeBase[] a(BiomeBase[] abiomebase, int i, int j, int k, int l, boolean flag) {
|
||
|
+ IntCache.a();
|
||
|
+ if (abiomebase == null || abiomebase.length < k * l) {
|
||
|
+ abiomebase = new BiomeBase[k * l];
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag && k == 16 && l == 16 && (i & 15) == 0 && (j & 15) == 0) {
|
||
|
+ BiomeBase[] abiomebase1 = this.e.d(i, j);
|
||
|
+
|
||
|
+ System.arraycopy(abiomebase1, 0, abiomebase, 0, k * l);
|
||
|
+ return abiomebase;
|
||
|
+ } else {
|
||
|
+ int[] aint = this.d.a(i, j, k, l);
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < k * l; ++i1) {
|
||
|
+ abiomebase[i1] = BiomeBase.getBiome(aint[i1]);
|
||
|
+ }
|
||
|
+
|
||
|
+ return abiomebase;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean a(int i, int j, int k, List list) {
|
||
|
+ IntCache.a();
|
||
|
+ int l = i - k >> 2;
|
||
|
+ int i1 = j - k >> 2;
|
||
|
+ int j1 = i + k >> 2;
|
||
|
+ int k1 = j + k >> 2;
|
||
|
+ int l1 = j1 - l + 1;
|
||
|
+ int i2 = k1 - i1 + 1;
|
||
|
+ int[] aint = this.c.a(l, i1, l1, i2);
|
||
|
+
|
||
|
+ try {
|
||
|
+ for (int j2 = 0; j2 < l1 * i2; ++j2) {
|
||
|
+ BiomeBase biomebase = BiomeBase.getBiome(aint[j2]);
|
||
|
+
|
||
|
+ if (!list.contains(biomebase)) {
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ } catch (Throwable throwable) {
|
||
|
+ CrashReport crashreport = CrashReport.a(throwable, "Invalid Biome id");
|
||
|
+ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Layer");
|
||
|
+
|
||
|
+ crashreportsystemdetails.a("Layer", this.c.toString());
|
||
|
+ crashreportsystemdetails.a("x", Integer.valueOf(i));
|
||
|
+ crashreportsystemdetails.a("z", Integer.valueOf(j));
|
||
|
+ crashreportsystemdetails.a("radius", Integer.valueOf(k));
|
||
|
+ crashreportsystemdetails.a("allowed", list);
|
||
|
+ throw new ReportedException(crashreport);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public ChunkPosition a(int i, int j, int k, List list, Random random) {
|
||
|
+ IntCache.a();
|
||
|
+ int l = i - k >> 2;
|
||
|
+ int i1 = j - k >> 2;
|
||
|
+ int j1 = i + k >> 2;
|
||
|
+ int k1 = j + k >> 2;
|
||
|
+ int l1 = j1 - l + 1;
|
||
|
+ int i2 = k1 - i1 + 1;
|
||
|
+ int[] aint = this.c.a(l, i1, l1, i2);
|
||
|
+ ChunkPosition chunkposition = null;
|
||
|
+ int j2 = 0;
|
||
|
+
|
||
|
+ for (int k2 = 0; k2 < l1 * i2; ++k2) {
|
||
|
+ int l2 = l + k2 % l1 << 2;
|
||
|
+ int i3 = i1 + k2 / l1 << 2;
|
||
|
+ BiomeBase biomebase = BiomeBase.getBiome(aint[k2]);
|
||
|
+
|
||
|
+ if (list.contains(biomebase) && (chunkposition == null || random.nextInt(j2 + 1) == 0)) {
|
||
|
+ chunkposition = new ChunkPosition(l2, 0, i3);
|
||
|
+ ++j2;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return chunkposition;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void b() {
|
||
|
+ this.e.a();
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldData.java b/src/main/java/net/minecraft/server/WorldData.java
|
||
|
new file mode 100644
|
||
|
index 000000000..3036d3d31
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldData.java
|
||
|
@@ -0,0 +1,417 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.concurrent.Callable;
|
||
|
+
|
||
|
+public class WorldData {
|
||
|
+
|
||
|
+ private long seed;
|
||
|
+ private WorldType type;
|
||
|
+ private String generatorOptions;
|
||
|
+ private int spawnX;
|
||
|
+ private int spawnY;
|
||
|
+ private int spawnZ;
|
||
|
+ private long time;
|
||
|
+ private long dayTime;
|
||
|
+ private long lastPlayed;
|
||
|
+ private long sizeOnDisk;
|
||
|
+ private NBTTagCompound playerData;
|
||
|
+ private int dimension;
|
||
|
+ private String name;
|
||
|
+ private int version;
|
||
|
+ private boolean isRaining;
|
||
|
+ private int rainTicks;
|
||
|
+ private boolean isThundering;
|
||
|
+ private int thunderTicks;
|
||
|
+ private EnumGamemode gameType;
|
||
|
+ private boolean useMapFeatures;
|
||
|
+ private boolean hardcore;
|
||
|
+ private boolean allowCommands;
|
||
|
+ private boolean initialized;
|
||
|
+ private GameRules gameRules;
|
||
|
+
|
||
|
+ protected WorldData() {
|
||
|
+ this.type = WorldType.NORMAL;
|
||
|
+ this.generatorOptions = "";
|
||
|
+ this.gameRules = new GameRules();
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldData(NBTTagCompound nbttagcompound) {
|
||
|
+ this.type = WorldType.NORMAL;
|
||
|
+ this.generatorOptions = "";
|
||
|
+ this.gameRules = new GameRules();
|
||
|
+ this.seed = nbttagcompound.getLong("RandomSeed");
|
||
|
+ if (nbttagcompound.hasKeyOfType("generatorName", 8)) {
|
||
|
+ String s = nbttagcompound.getString("generatorName");
|
||
|
+
|
||
|
+ this.type = WorldType.getType(s);
|
||
|
+ if (this.type == null) {
|
||
|
+ this.type = WorldType.NORMAL;
|
||
|
+ } else if (this.type.f()) {
|
||
|
+ int i = 0;
|
||
|
+
|
||
|
+ if (nbttagcompound.hasKeyOfType("generatorVersion", 99)) {
|
||
|
+ i = nbttagcompound.getInt("generatorVersion");
|
||
|
+ }
|
||
|
+
|
||
|
+ this.type = this.type.a(i);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (nbttagcompound.hasKeyOfType("generatorOptions", 8)) {
|
||
|
+ this.generatorOptions = nbttagcompound.getString("generatorOptions");
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ this.gameType = EnumGamemode.getById(nbttagcompound.getInt("GameType"));
|
||
|
+ if (nbttagcompound.hasKeyOfType("MapFeatures", 99)) {
|
||
|
+ this.useMapFeatures = nbttagcompound.getBoolean("MapFeatures");
|
||
|
+ } else {
|
||
|
+ this.useMapFeatures = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.spawnX = nbttagcompound.getInt("SpawnX");
|
||
|
+ this.spawnY = nbttagcompound.getInt("SpawnY");
|
||
|
+ this.spawnZ = nbttagcompound.getInt("SpawnZ");
|
||
|
+ this.time = nbttagcompound.getLong("Time");
|
||
|
+ if (nbttagcompound.hasKeyOfType("DayTime", 99)) {
|
||
|
+ this.dayTime = nbttagcompound.getLong("DayTime");
|
||
|
+ } else {
|
||
|
+ this.dayTime = this.time;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.lastPlayed = nbttagcompound.getLong("LastPlayed");
|
||
|
+ this.sizeOnDisk = nbttagcompound.getLong("SizeOnDisk");
|
||
|
+ this.name = nbttagcompound.getString("LevelName");
|
||
|
+ this.version = nbttagcompound.getInt("version");
|
||
|
+ this.rainTicks = nbttagcompound.getInt("rainTime");
|
||
|
+ this.isRaining = nbttagcompound.getBoolean("raining");
|
||
|
+ this.thunderTicks = nbttagcompound.getInt("thunderTime");
|
||
|
+ this.isThundering = nbttagcompound.getBoolean("thundering");
|
||
|
+ this.hardcore = nbttagcompound.getBoolean("hardcore");
|
||
|
+ if (nbttagcompound.hasKeyOfType("initialized", 99)) {
|
||
|
+ this.initialized = nbttagcompound.getBoolean("initialized");
|
||
|
+ } else {
|
||
|
+ this.initialized = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (nbttagcompound.hasKeyOfType("allowCommands", 99)) {
|
||
|
+ this.allowCommands = nbttagcompound.getBoolean("allowCommands");
|
||
|
+ } else {
|
||
|
+ this.allowCommands = this.gameType == EnumGamemode.CREATIVE;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (nbttagcompound.hasKeyOfType("Player", 10)) {
|
||
|
+ this.playerData = nbttagcompound.getCompound("Player");
|
||
|
+ this.dimension = this.playerData.getInt("Dimension");
|
||
|
+ }
|
||
|
+
|
||
|
+ if (nbttagcompound.hasKeyOfType("GameRules", 10)) {
|
||
|
+ this.gameRules.a(nbttagcompound.getCompound("GameRules"));
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldData(WorldSettings worldsettings, String s) {
|
||
|
+ this.type = WorldType.NORMAL;
|
||
|
+ this.generatorOptions = "";
|
||
|
+ this.gameRules = new GameRules();
|
||
|
+ this.seed = worldsettings.d();
|
||
|
+ this.gameType = worldsettings.e();
|
||
|
+ this.useMapFeatures = worldsettings.g();
|
||
|
+ this.name = s;
|
||
|
+ this.hardcore = worldsettings.f();
|
||
|
+ this.type = worldsettings.h();
|
||
|
+ this.generatorOptions = worldsettings.j();
|
||
|
+ this.allowCommands = worldsettings.i();
|
||
|
+ this.initialized = false;
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldData(WorldData worlddata) {
|
||
|
+ this.type = WorldType.NORMAL;
|
||
|
+ this.generatorOptions = "";
|
||
|
+ this.gameRules = new GameRules();
|
||
|
+ this.seed = worlddata.seed;
|
||
|
+ this.type = worlddata.type;
|
||
|
+ this.generatorOptions = worlddata.generatorOptions;
|
||
|
+ this.gameType = worlddata.gameType;
|
||
|
+ this.useMapFeatures = worlddata.useMapFeatures;
|
||
|
+ this.spawnX = worlddata.spawnX;
|
||
|
+ this.spawnY = worlddata.spawnY;
|
||
|
+ this.spawnZ = worlddata.spawnZ;
|
||
|
+ this.time = worlddata.time;
|
||
|
+ this.dayTime = worlddata.dayTime;
|
||
|
+ this.lastPlayed = worlddata.lastPlayed;
|
||
|
+ this.sizeOnDisk = worlddata.sizeOnDisk;
|
||
|
+ this.playerData = worlddata.playerData;
|
||
|
+ this.dimension = worlddata.dimension;
|
||
|
+ this.name = worlddata.name;
|
||
|
+ this.version = worlddata.version;
|
||
|
+ this.rainTicks = worlddata.rainTicks;
|
||
|
+ this.isRaining = worlddata.isRaining;
|
||
|
+ this.thunderTicks = worlddata.thunderTicks;
|
||
|
+ this.isThundering = worlddata.isThundering;
|
||
|
+ this.hardcore = worlddata.hardcore;
|
||
|
+ this.allowCommands = worlddata.allowCommands;
|
||
|
+ this.initialized = worlddata.initialized;
|
||
|
+ this.gameRules = worlddata.gameRules;
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTTagCompound a() {
|
||
|
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||
|
+
|
||
|
+ this.a(nbttagcompound, this.playerData);
|
||
|
+ return nbttagcompound;
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTTagCompound a(NBTTagCompound nbttagcompound) {
|
||
|
+ NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||
|
+
|
||
|
+ this.a(nbttagcompound1, nbttagcompound);
|
||
|
+ return nbttagcompound1;
|
||
|
+ }
|
||
|
+
|
||
|
+ private void a(NBTTagCompound nbttagcompound, NBTTagCompound nbttagcompound1) {
|
||
|
+ nbttagcompound.setLong("RandomSeed", this.seed);
|
||
|
+ nbttagcompound.setString("generatorName", this.type.name());
|
||
|
+ nbttagcompound.setInt("generatorVersion", this.type.getVersion());
|
||
|
+ nbttagcompound.setString("generatorOptions", this.generatorOptions);
|
||
|
+ nbttagcompound.setInt("GameType", this.gameType.getId());
|
||
|
+ nbttagcompound.setBoolean("MapFeatures", this.useMapFeatures);
|
||
|
+ nbttagcompound.setInt("SpawnX", this.spawnX);
|
||
|
+ nbttagcompound.setInt("SpawnY", this.spawnY);
|
||
|
+ nbttagcompound.setInt("SpawnZ", this.spawnZ);
|
||
|
+ nbttagcompound.setLong("Time", this.time);
|
||
|
+ nbttagcompound.setLong("DayTime", this.dayTime);
|
||
|
+ nbttagcompound.setLong("SizeOnDisk", this.sizeOnDisk);
|
||
|
+ nbttagcompound.setLong("LastPlayed", MinecraftServer.ar());
|
||
|
+ nbttagcompound.setString("LevelName", this.name);
|
||
|
+ nbttagcompound.setInt("version", this.version);
|
||
|
+ nbttagcompound.setInt("rainTime", this.rainTicks);
|
||
|
+ nbttagcompound.setBoolean("raining", this.isRaining);
|
||
|
+ nbttagcompound.setInt("thunderTime", this.thunderTicks);
|
||
|
+ nbttagcompound.setBoolean("thundering", this.isThundering);
|
||
|
+ nbttagcompound.setBoolean("hardcore", this.hardcore);
|
||
|
+ nbttagcompound.setBoolean("allowCommands", this.allowCommands);
|
||
|
+ nbttagcompound.setBoolean("initialized", this.initialized);
|
||
|
+ nbttagcompound.set("GameRules", this.gameRules.a());
|
||
|
+ if (nbttagcompound1 != null) {
|
||
|
+ nbttagcompound.set("Player", nbttagcompound1);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public long getSeed() {
|
||
|
+ return this.seed;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int c() {
|
||
|
+ return this.spawnX;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int d() {
|
||
|
+ return this.spawnY;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int e() {
|
||
|
+ return this.spawnZ;
|
||
|
+ }
|
||
|
+
|
||
|
+ public long getTime() {
|
||
|
+ return this.time;
|
||
|
+ }
|
||
|
+
|
||
|
+ public long getDayTime() {
|
||
|
+ return this.dayTime;
|
||
|
+ }
|
||
|
+
|
||
|
+ public NBTTagCompound i() {
|
||
|
+ return this.playerData;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int j() {
|
||
|
+ return this.dimension;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setTime(long i) {
|
||
|
+ this.time = i;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setDayTime(long i) {
|
||
|
+ this.dayTime = i;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setSpawn(int i, int j, int k) {
|
||
|
+ this.spawnX = i;
|
||
|
+ this.spawnY = j;
|
||
|
+ this.spawnZ = k;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String getName() {
|
||
|
+ return this.name;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setName(String s) {
|
||
|
+ this.name = s;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int l() {
|
||
|
+ return this.version;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void e(int i) {
|
||
|
+ this.version = i;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isThundering() {
|
||
|
+ return this.isThundering;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setThundering(boolean flag) {
|
||
|
+ this.isThundering = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getThunderDuration() {
|
||
|
+ return this.thunderTicks;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setThunderDuration(int i) {
|
||
|
+ this.thunderTicks = i;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean hasStorm() {
|
||
|
+ return this.isRaining;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setStorm(boolean flag) {
|
||
|
+ this.isRaining = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getWeatherDuration() {
|
||
|
+ return this.rainTicks;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setWeatherDuration(int i) {
|
||
|
+ this.rainTicks = i;
|
||
|
+ }
|
||
|
+
|
||
|
+ public EnumGamemode getGameType() {
|
||
|
+ return this.gameType;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean shouldGenerateMapFeatures() {
|
||
|
+ return this.useMapFeatures;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setGameType(EnumGamemode enumgamemode) {
|
||
|
+ this.gameType = enumgamemode;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isHardcore() {
|
||
|
+ return this.hardcore;
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldType getType() {
|
||
|
+ return this.type;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void setType(WorldType worldtype) {
|
||
|
+ this.type = worldtype;
|
||
|
+ }
|
||
|
+
|
||
|
+ public String getGeneratorOptions() {
|
||
|
+ return this.generatorOptions;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean allowCommands() {
|
||
|
+ return this.allowCommands;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isInitialized() {
|
||
|
+ return this.initialized;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void d(boolean flag) {
|
||
|
+ this.initialized = flag;
|
||
|
+ }
|
||
|
+
|
||
|
+ public GameRules getGameRules() {
|
||
|
+ return this.gameRules;
|
||
|
+ }
|
||
|
+
|
||
|
+ public void a(CrashReportSystemDetails crashreportsystemdetails) {
|
||
|
+ crashreportsystemdetails.a("Level seed", (Callable) (new CrashReportLevelSeed(this)));
|
||
|
+ crashreportsystemdetails.a("Level generator", (Callable) (new CrashReportLevelGenerator(this)));
|
||
|
+ crashreportsystemdetails.a("Level generator options", (Callable) (new CrashReportLevelGeneratorOptions(this)));
|
||
|
+ crashreportsystemdetails.a("Level spawn location", (Callable) (new CrashReportLevelSpawnLocation(this)));
|
||
|
+ crashreportsystemdetails.a("Level time", (Callable) (new CrashReportLevelTime(this)));
|
||
|
+ crashreportsystemdetails.a("Level dimension", (Callable) (new CrashReportLevelDimension(this)));
|
||
|
+ crashreportsystemdetails.a("Level storage version", (Callable) (new CrashReportLevelStorageVersion(this)));
|
||
|
+ crashreportsystemdetails.a("Level weather", (Callable) (new CrashReportLevelWeather(this)));
|
||
|
+ crashreportsystemdetails.a("Level game mode", (Callable) (new CrashReportLevelGameMode(this)));
|
||
|
+ }
|
||
|
+
|
||
|
+ static WorldType a(WorldData worlddata) {
|
||
|
+ return worlddata.type;
|
||
|
+ }
|
||
|
+
|
||
|
+ static boolean b(WorldData worlddata) {
|
||
|
+ return worlddata.useMapFeatures;
|
||
|
+ }
|
||
|
+
|
||
|
+ static String c(WorldData worlddata) {
|
||
|
+ return worlddata.generatorOptions;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int d(WorldData worlddata) {
|
||
|
+ return worlddata.spawnX;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int e(WorldData worlddata) {
|
||
|
+ return worlddata.spawnY;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int f(WorldData worlddata) {
|
||
|
+ return worlddata.spawnZ;
|
||
|
+ }
|
||
|
+
|
||
|
+ static long g(WorldData worlddata) {
|
||
|
+ return worlddata.time;
|
||
|
+ }
|
||
|
+
|
||
|
+ static long h(WorldData worlddata) {
|
||
|
+ return worlddata.dayTime;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int i(WorldData worlddata) {
|
||
|
+ return worlddata.dimension;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int j(WorldData worlddata) {
|
||
|
+ return worlddata.version;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int k(WorldData worlddata) {
|
||
|
+ return worlddata.rainTicks;
|
||
|
+ }
|
||
|
+
|
||
|
+ static boolean l(WorldData worlddata) {
|
||
|
+ return worlddata.isRaining;
|
||
|
+ }
|
||
|
+
|
||
|
+ static int m(WorldData worlddata) {
|
||
|
+ return worlddata.thunderTicks;
|
||
|
+ }
|
||
|
+
|
||
|
+ static boolean n(WorldData worlddata) {
|
||
|
+ return worlddata.isThundering;
|
||
|
+ }
|
||
|
+
|
||
|
+ static EnumGamemode o(WorldData worlddata) {
|
||
|
+ return worlddata.gameType;
|
||
|
+ }
|
||
|
+
|
||
|
+ static boolean p(WorldData worlddata) {
|
||
|
+ return worlddata.hardcore;
|
||
|
+ }
|
||
|
+
|
||
|
+ static boolean q(WorldData worlddata) {
|
||
|
+ return worlddata.allowCommands;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldGenCanyon.java b/src/main/java/net/minecraft/server/WorldGenCanyon.java
|
||
|
new file mode 100644
|
||
|
index 000000000..5c68df1a0
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldGenCanyon.java
|
||
|
@@ -0,0 +1,189 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class WorldGenCanyon extends WorldGenBase {
|
||
|
+
|
||
|
+ private float[] d = new float[1024];
|
||
|
+
|
||
|
+ public WorldGenCanyon() {}
|
||
|
+
|
||
|
+ protected void a(long i, int j, int k, Block[] ablock, double d0, double d1, double d2, float f, float f1, float f2, int l, int i1, double d3) {
|
||
|
+ Random random = new Random(i);
|
||
|
+ double d4 = (double) (j * 16 + 8);
|
||
|
+ double d5 = (double) (k * 16 + 8);
|
||
|
+ float f3 = 0.0F;
|
||
|
+ float f4 = 0.0F;
|
||
|
+
|
||
|
+ if (i1 <= 0) {
|
||
|
+ int j1 = this.a * 16 - 16;
|
||
|
+
|
||
|
+ i1 = j1 - random.nextInt(j1 / 4);
|
||
|
+ }
|
||
|
+
|
||
|
+ boolean flag = false;
|
||
|
+
|
||
|
+ if (l == -1) {
|
||
|
+ l = i1 / 2;
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ float f5 = 1.0F;
|
||
|
+
|
||
|
+ for (int k1 = 0; k1 < 256; ++k1) {
|
||
|
+ if (k1 == 0 || random.nextInt(3) == 0) {
|
||
|
+ f5 = 1.0F + random.nextFloat() * random.nextFloat() * 1.0F;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.d[k1] = f5 * f5;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (; l < i1; ++l) {
|
||
|
+ double d6 = 1.5D + (double) (MathHelper.sin((float) l * 3.1415927F / (float) i1) * f * 1.0F);
|
||
|
+ double d7 = d6 * d3;
|
||
|
+
|
||
|
+ d6 *= (double) random.nextFloat() * 0.25D + 0.75D;
|
||
|
+ d7 *= (double) random.nextFloat() * 0.25D + 0.75D;
|
||
|
+ float f6 = MathHelper.cos(f2);
|
||
|
+ float f7 = MathHelper.sin(f2);
|
||
|
+
|
||
|
+ d0 += (double) (MathHelper.cos(f1) * f6);
|
||
|
+ d1 += (double) f7;
|
||
|
+ d2 += (double) (MathHelper.sin(f1) * f6);
|
||
|
+ f2 *= 0.7F;
|
||
|
+ f2 += f4 * 0.05F;
|
||
|
+ f1 += f3 * 0.05F;
|
||
|
+ f4 *= 0.8F;
|
||
|
+ f3 *= 0.5F;
|
||
|
+ f4 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2.0F;
|
||
|
+ f3 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4.0F;
|
||
|
+ if (flag || random.nextInt(4) != 0) {
|
||
|
+ double d8 = d0 - d4;
|
||
|
+ double d9 = d2 - d5;
|
||
|
+ double d10 = (double) (i1 - l);
|
||
|
+ double d11 = (double) (f + 2.0F + 16.0F);
|
||
|
+
|
||
|
+ if (d8 * d8 + d9 * d9 - d10 * d10 > d11 * d11) {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d0 >= d4 - 16.0D - d6 * 2.0D && d2 >= d5 - 16.0D - d6 * 2.0D && d0 <= d4 + 16.0D + d6 * 2.0D && d2 <= d5 + 16.0D + d6 * 2.0D) {
|
||
|
+ int l1 = MathHelper.floor(d0 - d6) - j * 16 - 1;
|
||
|
+ int i2 = MathHelper.floor(d0 + d6) - j * 16 + 1;
|
||
|
+ int j2 = MathHelper.floor(d1 - d7) - 1;
|
||
|
+ int k2 = MathHelper.floor(d1 + d7) + 1;
|
||
|
+ int l2 = MathHelper.floor(d2 - d6) - k * 16 - 1;
|
||
|
+ int i3 = MathHelper.floor(d2 + d6) - k * 16 + 1;
|
||
|
+
|
||
|
+ if (l1 < 0) {
|
||
|
+ l1 = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i2 > 16) {
|
||
|
+ i2 = 16;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j2 < 1) {
|
||
|
+ j2 = 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (k2 > 248) {
|
||
|
+ k2 = 248;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l2 < 0) {
|
||
|
+ l2 = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i3 > 16) {
|
||
|
+ i3 = 16;
|
||
|
+ }
|
||
|
+
|
||
|
+ boolean flag1 = false;
|
||
|
+
|
||
|
+ int j3;
|
||
|
+ int k3;
|
||
|
+
|
||
|
+ for (j3 = l1; !flag1 && j3 < i2; ++j3) {
|
||
|
+ for (int l3 = l2; !flag1 && l3 < i3; ++l3) {
|
||
|
+ for (int i4 = k2 + 1; !flag1 && i4 >= j2 - 1; --i4) {
|
||
|
+ k3 = (j3 * 16 + l3) * 256 + i4;
|
||
|
+ if (i4 >= 0 && i4 < 256) {
|
||
|
+ Block block = ablock[k3];
|
||
|
+
|
||
|
+ if (block == Blocks.WATER || block == Blocks.STATIONARY_WATER) {
|
||
|
+ flag1 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i4 != j2 - 1 && j3 != l1 && j3 != i2 - 1 && l3 != l2 && l3 != i3 - 1) {
|
||
|
+ i4 = j2;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!flag1) {
|
||
|
+ for (j3 = l1; j3 < i2; ++j3) {
|
||
|
+ double d12 = ((double) (j3 + j * 16) + 0.5D - d0) / d6;
|
||
|
+
|
||
|
+ for (k3 = l2; k3 < i3; ++k3) {
|
||
|
+ double d13 = ((double) (k3 + k * 16) + 0.5D - d2) / d6;
|
||
|
+ int j4 = (j3 * 16 + k3) * 256 + k2;
|
||
|
+ boolean flag2 = false;
|
||
|
+
|
||
|
+ if (d12 * d12 + d13 * d13 < 1.0D) {
|
||
|
+ for (int k4 = k2 - 1; k4 >= j2; --k4) {
|
||
|
+ double d14 = ((double) k4 + 0.5D - d1) / d7;
|
||
|
+
|
||
|
+ if ((d12 * d12 + d13 * d13) * (double) this.d[k4] + d14 * d14 / 6.0D < 1.0D) {
|
||
|
+ Block block1 = ablock[j4];
|
||
|
+
|
||
|
+ if (block1 == Blocks.GRASS) {
|
||
|
+ flag2 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (block1 == Blocks.STONE || block1 == Blocks.DIRT || block1 == Blocks.GRASS) {
|
||
|
+ if (k4 < 10) {
|
||
|
+ ablock[j4] = Blocks.LAVA;
|
||
|
+ } else {
|
||
|
+ ablock[j4] = null;
|
||
|
+ if (flag2 && ablock[j4 - 1] == Blocks.DIRT) {
|
||
|
+ ablock[j4 - 1] = this.c.getBiome(j3 + j * 16, k3 + k * 16).ai;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ --j4;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void a(World world, int i, int j, int k, int l, Block[] ablock) {
|
||
|
+ if (this.b.nextInt(50) == 0) {
|
||
|
+ double d0 = (double) (i * 16 + this.b.nextInt(16));
|
||
|
+ double d1 = (double) (this.b.nextInt(this.b.nextInt(40) + 8) + 20);
|
||
|
+ double d2 = (double) (j * 16 + this.b.nextInt(16));
|
||
|
+ byte b0 = 1;
|
||
|
+
|
||
|
+ for (int i1 = 0; i1 < b0; ++i1) {
|
||
|
+ float f = this.b.nextFloat() * 3.1415927F * 2.0F;
|
||
|
+ float f1 = (this.b.nextFloat() - 0.5F) * 2.0F / 8.0F;
|
||
|
+ float f2 = (this.b.nextFloat() * 2.0F + this.b.nextFloat()) * 2.0F;
|
||
|
+
|
||
|
+ this.a(this.b.nextLong(), k, l, ablock, d0, d1, d2, f2, f, f1, 0, 0, 3.0D);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldGenCaves.java b/src/main/java/net/minecraft/server/WorldGenCaves.java
|
||
|
new file mode 100644
|
||
|
index 000000000..707938031
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldGenCaves.java
|
||
|
@@ -0,0 +1,206 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class WorldGenCaves extends WorldGenBase {
|
||
|
+
|
||
|
+ public WorldGenCaves() {}
|
||
|
+
|
||
|
+ protected void a(long i, int j, int k, Block[] ablock, double d0, double d1, double d2) {
|
||
|
+ this.a(i, j, k, ablock, d0, d1, d2, 1.0F + this.b.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D);
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void a(long i, int j, int k, Block[] ablock, double d0, double d1, double d2, float f, float f1, float f2, int l, int i1, double d3) {
|
||
|
+ double d4 = (double) (j * 16 + 8);
|
||
|
+ double d5 = (double) (k * 16 + 8);
|
||
|
+ float f3 = 0.0F;
|
||
|
+ float f4 = 0.0F;
|
||
|
+ Random random = new Random(i);
|
||
|
+
|
||
|
+ if (i1 <= 0) {
|
||
|
+ int j1 = this.a * 16 - 16;
|
||
|
+
|
||
|
+ i1 = j1 - random.nextInt(j1 / 4);
|
||
|
+ }
|
||
|
+
|
||
|
+ boolean flag = false;
|
||
|
+
|
||
|
+ if (l == -1) {
|
||
|
+ l = i1 / 2;
|
||
|
+ flag = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ int k1 = random.nextInt(i1 / 2) + i1 / 4;
|
||
|
+
|
||
|
+ for (boolean flag1 = random.nextInt(6) == 0; l < i1; ++l) {
|
||
|
+ double d6 = 1.5D + (double) (MathHelper.sin((float) l * 3.1415927F / (float) i1) * f * 1.0F);
|
||
|
+ double d7 = d6 * d3;
|
||
|
+ float f5 = MathHelper.cos(f2);
|
||
|
+ float f6 = MathHelper.sin(f2);
|
||
|
+
|
||
|
+ d0 += (double) (MathHelper.cos(f1) * f5);
|
||
|
+ d1 += (double) f6;
|
||
|
+ d2 += (double) (MathHelper.sin(f1) * f5);
|
||
|
+ if (flag1) {
|
||
|
+ f2 *= 0.92F;
|
||
|
+ } else {
|
||
|
+ f2 *= 0.7F;
|
||
|
+ }
|
||
|
+
|
||
|
+ f2 += f4 * 0.1F;
|
||
|
+ f1 += f3 * 0.1F;
|
||
|
+ f4 *= 0.9F;
|
||
|
+ f3 *= 0.75F;
|
||
|
+ f4 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2.0F;
|
||
|
+ f3 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4.0F;
|
||
|
+ if (!flag && l == k1 && f > 1.0F && i1 > 0) {
|
||
|
+ this.a(random.nextLong(), j, k, ablock, d0, d1, d2, random.nextFloat() * 0.5F + 0.5F, f1 - 1.5707964F, f2 / 3.0F, l, i1, 1.0D);
|
||
|
+ this.a(random.nextLong(), j, k, ablock, d0, d1, d2, random.nextFloat() * 0.5F + 0.5F, f1 + 1.5707964F, f2 / 3.0F, l, i1, 1.0D);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag || random.nextInt(4) != 0) {
|
||
|
+ double d8 = d0 - d4;
|
||
|
+ double d9 = d2 - d5;
|
||
|
+ double d10 = (double) (i1 - l);
|
||
|
+ double d11 = (double) (f + 2.0F + 16.0F);
|
||
|
+
|
||
|
+ if (d8 * d8 + d9 * d9 - d10 * d10 > d11 * d11) {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (d0 >= d4 - 16.0D - d6 * 2.0D && d2 >= d5 - 16.0D - d6 * 2.0D && d0 <= d4 + 16.0D + d6 * 2.0D && d2 <= d5 + 16.0D + d6 * 2.0D) {
|
||
|
+ int l1 = MathHelper.floor(d0 - d6) - j * 16 - 1;
|
||
|
+ int i2 = MathHelper.floor(d0 + d6) - j * 16 + 1;
|
||
|
+ int j2 = MathHelper.floor(d1 - d7) - 1;
|
||
|
+ int k2 = MathHelper.floor(d1 + d7) + 1;
|
||
|
+ int l2 = MathHelper.floor(d2 - d6) - k * 16 - 1;
|
||
|
+ int i3 = MathHelper.floor(d2 + d6) - k * 16 + 1;
|
||
|
+
|
||
|
+ if (l1 < 0) {
|
||
|
+ l1 = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i2 > 16) {
|
||
|
+ i2 = 16;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (j2 < 1) {
|
||
|
+ j2 = 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (k2 > 248) {
|
||
|
+ k2 = 248;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (l2 < 0) {
|
||
|
+ l2 = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i3 > 16) {
|
||
|
+ i3 = 16;
|
||
|
+ }
|
||
|
+
|
||
|
+ boolean flag2 = false;
|
||
|
+
|
||
|
+ int j3;
|
||
|
+ int k3;
|
||
|
+
|
||
|
+ for (j3 = l1; !flag2 && j3 < i2; ++j3) {
|
||
|
+ for (int l3 = l2; !flag2 && l3 < i3; ++l3) {
|
||
|
+ for (int i4 = k2 + 1; !flag2 && i4 >= j2 - 1; --i4) {
|
||
|
+ k3 = (j3 * 16 + l3) * 256 + i4;
|
||
|
+ if (i4 >= 0 && i4 < 256) {
|
||
|
+ Block block = ablock[k3];
|
||
|
+
|
||
|
+ if (block == Blocks.WATER || block == Blocks.STATIONARY_WATER) {
|
||
|
+ flag2 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (i4 != j2 - 1 && j3 != l1 && j3 != i2 - 1 && l3 != l2 && l3 != i3 - 1) {
|
||
|
+ i4 = j2;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (!flag2) {
|
||
|
+ for (j3 = l1; j3 < i2; ++j3) {
|
||
|
+ double d12 = ((double) (j3 + j * 16) + 0.5D - d0) / d6;
|
||
|
+
|
||
|
+ for (k3 = l2; k3 < i3; ++k3) {
|
||
|
+ double d13 = ((double) (k3 + k * 16) + 0.5D - d2) / d6;
|
||
|
+ int j4 = (j3 * 16 + k3) * 256 + k2;
|
||
|
+ boolean flag3 = false;
|
||
|
+
|
||
|
+ if (d12 * d12 + d13 * d13 < 1.0D) {
|
||
|
+ for (int k4 = k2 - 1; k4 >= j2; --k4) {
|
||
|
+ double d14 = ((double) k4 + 0.5D - d1) / d7;
|
||
|
+
|
||
|
+ if (d14 > -0.7D && d12 * d12 + d14 * d14 + d13 * d13 < 1.0D) {
|
||
|
+ Block block1 = ablock[j4];
|
||
|
+
|
||
|
+ if (block1 == Blocks.GRASS) {
|
||
|
+ flag3 = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (block1 == Blocks.STONE || block1 == Blocks.DIRT || block1 == Blocks.GRASS) {
|
||
|
+ if (k4 < 10) {
|
||
|
+ ablock[j4] = Blocks.STATIONARY_LAVA;
|
||
|
+ } else {
|
||
|
+ ablock[j4] = null;
|
||
|
+ if (flag3 && ablock[j4 - 1] == Blocks.DIRT) {
|
||
|
+ ablock[j4 - 1] = this.c.getBiome(j3 + j * 16, k3 + k * 16).ai;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ --j4;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (flag) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void a(World world, int i, int j, int k, int l, Block[] ablock) {
|
||
|
+ int i1 = this.b.nextInt(this.b.nextInt(this.b.nextInt(15) + 1) + 1);
|
||
|
+
|
||
|
+ if (this.b.nextInt(7) != 0) {
|
||
|
+ i1 = 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ for (int j1 = 0; j1 < i1; ++j1) {
|
||
|
+ double d0 = (double) (i * 16 + this.b.nextInt(16));
|
||
|
+ double d1 = (double) this.b.nextInt(this.b.nextInt(120) + 8);
|
||
|
+ double d2 = (double) (j * 16 + this.b.nextInt(16));
|
||
|
+ int k1 = 1;
|
||
|
+
|
||
|
+ if (this.b.nextInt(4) == 0) {
|
||
|
+ this.a(this.b.nextLong(), k, l, ablock, d0, d1, d2);
|
||
|
+ k1 += this.b.nextInt(4);
|
||
|
+ }
|
||
|
+
|
||
|
+ for (int l1 = 0; l1 < k1; ++l1) {
|
||
|
+ float f = this.b.nextFloat() * 3.1415927F * 2.0F;
|
||
|
+ float f1 = (this.b.nextFloat() - 0.5F) * 2.0F / 8.0F;
|
||
|
+ float f2 = this.b.nextFloat() * 2.0F + this.b.nextFloat();
|
||
|
+
|
||
|
+ if (this.b.nextInt(10) == 0) {
|
||
|
+ f2 *= this.b.nextFloat() * this.b.nextFloat() * 3.0F + 1.0F;
|
||
|
+ }
|
||
|
+
|
||
|
+ this.a(this.b.nextLong(), k, l, ablock, d0, d1, d2, f2, f, f1, 0, 0, 1.0D);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldGenMinable.java b/src/main/java/net/minecraft/server/WorldGenMinable.java
|
||
|
new file mode 100644
|
||
|
index 000000000..1d58f3e56
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldGenMinable.java
|
||
|
@@ -0,0 +1,67 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+import java.util.Random;
|
||
|
+
|
||
|
+public class WorldGenMinable extends WorldGenerator {
|
||
|
+
|
||
|
+ private Block a;
|
||
|
+ private int b;
|
||
|
+ private Block c;
|
||
|
+
|
||
|
+ public WorldGenMinable(Block block, int i) {
|
||
|
+ this(block, i, Blocks.STONE);
|
||
|
+ }
|
||
|
+
|
||
|
+ public WorldGenMinable(Block block, int i, Block block1) {
|
||
|
+ this.a = block;
|
||
|
+ this.b = i;
|
||
|
+ this.c = block1;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean generate(World world, Random random, int i, int j, int k) {
|
||
|
+ float f = random.nextFloat() * 3.1415927F;
|
||
|
+ double d0 = (double) ((float) (i + 8) + MathHelper.sin(f) * (float) this.b / 8.0F);
|
||
|
+ double d1 = (double) ((float) (i + 8) - MathHelper.sin(f) * (float) this.b / 8.0F);
|
||
|
+ double d2 = (double) ((float) (k + 8) + MathHelper.cos(f) * (float) this.b / 8.0F);
|
||
|
+ double d3 = (double) ((float) (k + 8) - MathHelper.cos(f) * (float) this.b / 8.0F);
|
||
|
+ double d4 = (double) (j + random.nextInt(3) - 2);
|
||
|
+ double d5 = (double) (j + random.nextInt(3) - 2);
|
||
|
+
|
||
|
+ for (int l = 0; l <= this.b; ++l) {
|
||
|
+ double d6 = d0 + (d1 - d0) * (double) l / (double) this.b;
|
||
|
+ double d7 = d4 + (d5 - d4) * (double) l / (double) this.b;
|
||
|
+ double d8 = d2 + (d3 - d2) * (double) l / (double) this.b;
|
||
|
+ double d9 = random.nextDouble() * (double) this.b / 16.0D;
|
||
|
+ double d10 = (double) (MathHelper.sin((float) l * 3.1415927F / (float) this.b) + 1.0F) * d9 + 1.0D;
|
||
|
+ double d11 = (double) (MathHelper.sin((float) l * 3.1415927F / (float) this.b) + 1.0F) * d9 + 1.0D;
|
||
|
+ int i1 = MathHelper.floor(d6 - d10 / 2.0D);
|
||
|
+ int j1 = MathHelper.floor(d7 - d11 / 2.0D);
|
||
|
+ int k1 = MathHelper.floor(d8 - d10 / 2.0D);
|
||
|
+ int l1 = MathHelper.floor(d6 + d10 / 2.0D);
|
||
|
+ int i2 = MathHelper.floor(d7 + d11 / 2.0D);
|
||
|
+ int j2 = MathHelper.floor(d8 + d10 / 2.0D);
|
||
|
+
|
||
|
+ for (int k2 = i1; k2 <= l1; ++k2) {
|
||
|
+ double d12 = ((double) k2 + 0.5D - d6) / (d10 / 2.0D);
|
||
|
+
|
||
|
+ if (d12 * d12 < 1.0D) {
|
||
|
+ for (int l2 = j1; l2 <= i2; ++l2) {
|
||
|
+ double d13 = ((double) l2 + 0.5D - d7) / (d11 / 2.0D);
|
||
|
+
|
||
|
+ if (d12 * d12 + d13 * d13 < 1.0D) {
|
||
|
+ for (int i3 = k1; i3 <= j2; ++i3) {
|
||
|
+ double d14 = ((double) i3 + 0.5D - d8) / (d10 / 2.0D);
|
||
|
+
|
||
|
+ if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getType(k2, l2, i3) == this.c) {
|
||
|
+ world.setTypeAndData(k2, l2, i3, this.a, 0, 2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldProvider.java b/src/main/java/net/minecraft/server/WorldProvider.java
|
||
|
new file mode 100644
|
||
|
index 000000000..bd9156552
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldProvider.java
|
||
|
@@ -0,0 +1,99 @@
|
||
|
+package net.minecraft.server;
|
||
|
+
|
||
|
+public abstract class WorldProvider {
|
||
|
+
|
||
|
+ public static final float[] a = new float[] { 1.0F, 0.75F, 0.5F, 0.25F, 0.0F, 0.25F, 0.5F, 0.75F};
|
||
|
+ public World b;
|
||
|
+ public WorldType type;
|
||
|
+ public String d;
|
||
|
+ public WorldChunkManager e;
|
||
|
+ public boolean f;
|
||
|
+ public boolean g;
|
||
|
+ public float[] h = new float[16];
|
||
|
+ public int dimension;
|
||
|
+ private float[] j = new float[4];
|
||
|
+
|
||
|
+ public WorldProvider() {}
|
||
|
+
|
||
|
+ public final void a(World world) {
|
||
|
+ this.b = world;
|
||
|
+ this.type = world.getWorldData().getType();
|
||
|
+ this.d = world.getWorldData().getGeneratorOptions();
|
||
|
+ this.b();
|
||
|
+ this.a();
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void a() {
|
||
|
+ float f = 0.0F;
|
||
|
+
|
||
|
+ for (int i = 0; i <= 15; ++i) {
|
||
|
+ float f1 = 1.0F - (float) i / 15.0F;
|
||
|
+
|
||
|
+ this.h[i] = (1.0F - f1) / (f1 * 3.0F + 1.0F) * (1.0F - f) + f;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ protected void b() {
|
||
|
+ if (this.b.getWorldData().getType() == WorldType.FLAT) {
|
||
|
+ WorldGenFlatInfo worldgenflatinfo = WorldGenFlatInfo.a(this.b.getWorldData().getGeneratorOptions());
|
||
|
+
|
||
|
+ this.e = new WorldChunkManagerHell(BiomeBase.getBiome(worldgenflatinfo.a()), 0.5F);
|
||
|
+ } else {
|
||
|
+ this.e = new WorldChunkManager(this.b);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ public IChunkProvider getChunkProvider() {
|
||
|
+ return (IChunkProvider) (this.type == WorldType.FLAT ? new ChunkProviderFlat(this.b, this.b.getSeed(), this.b.getWorldData().shouldGenerateMapFeatures(), this.d) : new ChunkProviderGenerate(this.b, this.b.getSeed(), this.b.getWorldData().shouldGenerateMapFeatures()));
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean canSpawn(int i, int j) {
|
||
|
+ return this.b.b(i, j) == Blocks.GRASS;
|
||
|
+ }
|
||
|
+
|
||
|
+ public float a(long i, float f) {
|
||
|
+ int j = (int) (i % 24000L);
|
||
|
+ float f1 = ((float) j + f) / 24000.0F - 0.25F;
|
||
|
+
|
||
|
+ if (f1 < 0.0F) {
|
||
|
+ ++f1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (f1 > 1.0F) {
|
||
|
+ --f1;
|
||
|
+ }
|
||
|
+
|
||
|
+ float f2 = f1;
|
||
|
+
|
||
|
+ f1 = 1.0F - (float) ((Math.cos((double) f1 * 3.141592653589793D) + 1.0D) / 2.0D);
|
||
|
+ f1 = f2 + (f1 - f2) / 3.0F;
|
||
|
+ return f1;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int a(long i) {
|
||
|
+ return (int) (i / 24000L % 8L + 8L) % 8;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean d() {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean e() {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+
|
||
|
+ public static WorldProvider byDimension(int i) {
|
||
|
+ return (WorldProvider) (i == -1 ? new WorldProviderHell() : (i == 0 ? new WorldProviderNormal() : (i == 1 ? new WorldProviderTheEnd() : null)));
|
||
|
+ }
|
||
|
+
|
||
|
+ public ChunkCoordinates h() {
|
||
|
+ return null;
|
||
|
+ }
|
||
|
+
|
||
|
+ public int getSeaLevel() {
|
||
|
+ return this.type == WorldType.FLAT ? 4 : 64;
|
||
|
+ }
|
||
|
+
|
||
|
+ public abstract String getName();
|
||
|
+
|
||
|
+}
|
||
|
--
|
||
|
2.15.2 (Apple Git-101.1)
|
||
|
|