From 9c16f06540f882c332fcf9f5e1fbff2cc9c02b2b Mon Sep 17 00:00:00 2001 From: mckuhei Date: Thu, 4 May 2023 10:07:01 +0800 Subject: [PATCH] Add new perlin generator. --- .../net/minecraft/src/EntityPlayer.java | 27 +-- .../minecraft/src/NoiseGeneratorOctaves.java | 20 +- .../minecraft/src/NoiseGeneratorPerlin.java | 4 +- .../minecraft/src/NoiseGeneratorPerlin2.java | 213 ++++++++++++++++++ .../net/minecraft/src/PerlinNoiseFactory.java | 29 +++ 5 files changed, 276 insertions(+), 17 deletions(-) create mode 100644 src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java create mode 100644 src/minecraft/net/minecraft/src/PerlinNoiseFactory.java diff --git a/src/minecraft/net/minecraft/src/EntityPlayer.java b/src/minecraft/net/minecraft/src/EntityPlayer.java index 894a617..12940da 100644 --- a/src/minecraft/net/minecraft/src/EntityPlayer.java +++ b/src/minecraft/net/minecraft/src/EntityPlayer.java @@ -126,7 +126,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende this.craftingInventory = this.inventorySlots; this.yOffset = 1.62F; ChunkCoordinates var2 = par1World.getSpawnPoint(); - this.setLocationAndAngles((double)var2.posX.doubleValue() + 0.5D, (double)(var2.posY + 1), (double)var2.posZ.doubleValue() + 0.5D, 0.0F, 0.0F); + this.setLocationAndAngles(MathHelper.toBigDecimal(var2.posX).add(new BigDecimal(0.5)), (double)(var2.posY + 1), MathHelper.toBigDecimal(var2.posZ).add(new BigDecimal(0.5)), 0.0F, 0.0F); this.entityType = "humanoid"; this.field_70741_aB = 180.0F; this.fireResistance = 20; @@ -617,6 +617,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende public void moveEntity(double par1, double par3, double par5) { super.boundingBox.setBounds(this.boundingBox.minX.doubleValue(), this.boundingBox.minY, this.boundingBox.minZ.doubleValue(), this.boundingBox.maxX.doubleValue(), this.boundingBox.maxY, this.boundingBox.maxZ.doubleValue()); + AxisAlignedBB bb = super.boundingBox.copy(); super.moveEntity(par1, par3, par5); this.boundingBox.maxY = super.boundingBox.maxY; this.boundingBox.minY = super.boundingBox.minY; @@ -655,7 +656,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende { double var19; - for (var19 = 0.05D; par1 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, super.boundingBox.getOffsetBoundingBox(par1, -1.0D, 0.0D)).isEmpty(); var11 = par1) + for (var19 = 0.05D; par1 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, bb.getOffsetBoundingBox(par1, -1.0D, 0.0D)).isEmpty(); var11 = par1) { if (par1 < var19 && par1 >= -var19) { @@ -671,7 +672,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende } } - for (; par5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, super.boundingBox.getOffsetBoundingBox(0.0D, -1.0D, par5)).isEmpty(); var15 = par5) + for (; par5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, bb.getOffsetBoundingBox(0.0D, -1.0D, par5)).isEmpty(); var15 = par5) { if (par5 < var19 && par5 >= -var19) { @@ -687,7 +688,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende } } - while (par1 != 0.0D && par5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, super.boundingBox.getOffsetBoundingBox(par1, -1.0D, par5)).isEmpty()) + while (par1 != 0.0D && par5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, bb.getOffsetBoundingBox(par1, -1.0D, par5)).isEmpty()) { if (par1 < var19 && par1 >= -var19) { @@ -720,11 +721,11 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende } } - List var30 = this.worldObj.getCollidingBoundingBoxes(this, super.boundingBox.addCoord(par1, par3, par5)); + List var30 = this.worldObj.getCollidingBoundingBoxes(this, bb.addCoord(par1, par3, par5)); AxisAlignedBB var21; // Do not process Y axis movement -// for (Iterator var20 = var30.iterator(); var20.hasNext(); par3 = var21.calculateYOffset(super.boundingBox, par3)) +// for (Iterator var20 = var30.iterator(); var20.hasNext(); par3 = var21.calculateYOffset(bb, par3)) // { // var21 = (AxisAlignedBB)var20.next(); // } @@ -742,7 +743,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende AxisAlignedBB var22; Iterator var32; - for (var32 = var30.iterator(); var32.hasNext(); par1 = var22.calculateXOffset(super.boundingBox, par1)) + for (var32 = var30.iterator(); var32.hasNext(); par1 = var22.calculateXOffset(bb, par1)) { var22 = (AxisAlignedBB)var32.next(); } @@ -756,7 +757,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende par1 = 0.0D; } - for (var32 = var30.iterator(); var32.hasNext(); par5 = var22.calculateZOffset(super.boundingBox, par5)) + for (var32 = var30.iterator(); var32.hasNext(); par5 = var22.calculateZOffset(bb, par5)) { var22 = (AxisAlignedBB)var32.next(); } @@ -783,11 +784,11 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende par5 = var15; BigDecimalAABB var27 = this.boundingBox.copy(); this.boundingBox.setBB(var17); - var30 = this.worldObj.getCollidingBoundingBoxes(this, super.boundingBox.addCoord(var11, par3, var15)); + var30 = this.worldObj.getCollidingBoundingBoxes(this, bb.addCoord(var11, par3, var15)); Iterator var28; AxisAlignedBB var29; - for (var28 = var30.iterator(); var28.hasNext(); par3 = var29.calculateYOffset(super.boundingBox, par3)) + for (var28 = var30.iterator(); var28.hasNext(); par3 = var29.calculateYOffset(bb, par3)) { var29 = (AxisAlignedBB)var28.next(); } @@ -801,7 +802,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende par1 = 0.0D; } - for (var28 = var30.iterator(); var28.hasNext(); par1 = var29.calculateXOffset(super.boundingBox, par1)) + for (var28 = var30.iterator(); var28.hasNext(); par1 = var29.calculateXOffset(bb, par1)) { var29 = (AxisAlignedBB)var28.next(); } @@ -815,7 +816,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende par1 = 0.0D; } - for (var28 = var30.iterator(); var28.hasNext(); par5 = var29.calculateZOffset(super.boundingBox, par5)) + for (var28 = var30.iterator(); var28.hasNext(); par5 = var29.calculateZOffset(bb, par5)) { var29 = (AxisAlignedBB)var28.next(); } @@ -839,7 +840,7 @@ public abstract class EntityPlayer extends EntityLiving implements ICommandSende { par3 = (double)(-this.stepHeight); - for (var28 = var30.iterator(); var28.hasNext(); par3 = var29.calculateYOffset(super.boundingBox, par3)) + for (var28 = var30.iterator(); var28.hasNext(); par3 = var29.calculateYOffset(bb, par3)) { var29 = (AxisAlignedBB)var28.next(); } diff --git a/src/minecraft/net/minecraft/src/NoiseGeneratorOctaves.java b/src/minecraft/net/minecraft/src/NoiseGeneratorOctaves.java index a09c370..15876a5 100644 --- a/src/minecraft/net/minecraft/src/NoiseGeneratorOctaves.java +++ b/src/minecraft/net/minecraft/src/NoiseGeneratorOctaves.java @@ -7,11 +7,14 @@ import static net.minecraft.src.Constants.*; public class NoiseGeneratorOctaves extends NoiseGenerator { - /** + /** * Collection of noise generation functions. Output is combined to produce different octaves of noise. */ private NoiseGenerator[] generatorCollection; private int octaves; + + private static final String noiseType; + private static final PerlinNoiseFactory noiseFactory; public NoiseGeneratorOctaves(Random par1Random, int par2) { @@ -20,7 +23,7 @@ public class NoiseGeneratorOctaves extends NoiseGenerator for (int var3 = 0; var3 < par2; ++var3) { - this.generatorCollection[var3] = USE_64BIT_PERLIN_GENERATOR ? new NoiseGeneratorPerlin64(par1Random) : new NoiseGeneratorPerlin(par1Random); + this.generatorCollection[var3] = noiseFactory != null ? noiseFactory.createPerlinNoiseGenerator(par1Random) : USE_64BIT_PERLIN_GENERATOR ? new NoiseGeneratorPerlin64(par1Random) : new NoiseGeneratorPerlin(par1Random); } } @@ -77,4 +80,17 @@ public class NoiseGeneratorOctaves extends NoiseGenerator { return this.generateNoiseOctaves(par1ArrayOfDouble, par2, 10, par3, par4, 1, par5, par6, 1.0D, par8); } + + static { + PerlinNoiseFactory f = null; + noiseType = System.getProperty("net.minecraft.src.NoiseGeneratorOctaves.noiseType"); + try { + if(noiseType != null) { + f = PerlinNoiseFactory.valueOf(noiseType); + } + } catch(Throwable t) { + t.printStackTrace(); + } + noiseFactory = f; + } } diff --git a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java index 845568f..b481988 100644 --- a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java +++ b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java @@ -44,7 +44,7 @@ public class NoiseGeneratorPerlin extends NoiseGenerator return par3 + par1 * (par5 - par3); } - public final double func_76309_a(int par1, double par2, double par4) + public final double grad2(int par1, double par2, double par4) { int var6 = par1 & 15; double var7 = (double)(1 - ((var6 & 8) >> 3)) * par2; @@ -120,7 +120,7 @@ public class NoiseGeneratorPerlin extends NoiseGenerator int var66 = this.permutations[var19] + var41; int var67 = this.permutations[var34 + 1] + 0; var22 = this.permutations[var67] + var41; - var70 = this.lerp(var35, this.func_76309_a(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); + var70 = this.lerp(var35, this.grad2(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); double var79 = this.lerp(var42, var70, var73); var10001 = var75++; diff --git a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java new file mode 100644 index 0000000..0d7abd4 --- /dev/null +++ b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java @@ -0,0 +1,213 @@ +package net.minecraft.src; + +import java.util.Random; + +import static net.minecraft.src.Constants.*; + +public class NoiseGeneratorPerlin2 extends NoiseGenerator +{ + private int[] permutations; + public double xCoord; + public double yCoord; + public double zCoord; + + public NoiseGeneratorPerlin2() + { + this(new Random()); + } + + public NoiseGeneratorPerlin2(Random par1Random) + { + this.permutations = new int[512]; + this.xCoord = par1Random.nextDouble() * 256.0D; + this.yCoord = par1Random.nextDouble() * 256.0D; + this.zCoord = par1Random.nextDouble() * 256.0D; + int var2; + + for (var2 = 0; var2 < 256; this.permutations[var2] = var2++) + { + ; + } + + for (var2 = 0; var2 < 256; ++var2) + { + int var3 = par1Random.nextInt(256 - var2) + var2; + int var4 = this.permutations[var2]; + this.permutations[var2] = this.permutations[var3]; + this.permutations[var3] = var4; + this.permutations[var2 + 256] = this.permutations[var2]; + } + } + + public final double lerp(double par1, double par3, double par5) + { + return par3 + par1 * (par5 - par3); + } + + public final double grad2(int par1, double par2, double par4) + { + int var6 = par1 & 15; + double var7 = (double)(1 - ((var6 & 8) >> 3)) * par2; + double var9 = var6 < 4 ? 0.0D : (var6 != 12 && var6 != 14 ? par4 : par2); + return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9); + } + + public final double grad(int par1, double par2, double par4, double par6) + { + int var8 = par1 & 15; + double var9 = var8 < 8 ? par2 : par4; + double var11 = var8 < 4 ? par4 : (var8 != 12 && var8 != 14 ? par6 : par2); + return ((var8 & 1) == 0 ? var9 : -var9) + ((var8 & 2) == 0 ? var11 : -var11); + } + + /** + * pars: noiseArray , xOffset , yOffset , zOffset , xSize , ySize , zSize , xScale, yScale , zScale , noiseScale. + * noiseArray should be xSize*ySize*zSize in size + */ + public void populateNoiseArray(double[] par1ArrayOfDouble, double par2, double par4, double par6, int par8, int par9, int par10, double par11, double par13, double par15, double par17) + { + int var10001; + int var19; + int var22; + double var31; + double var35; + int var37; + double var38; + int var41; + double var42; + int var75; + + if (par9 == 1) + { + boolean var64 = false; + boolean var65 = false; + boolean var21 = false; + boolean var68 = false; + double var70 = 0.0D; + double var73 = 0.0D; + var75 = 0; + double var77 = 1.0D / par17; + + for (int var30 = 0; var30 < par8; ++var30) + { + var31 = par2 + (double)var30 * par11 + this.xCoord; + double var78 = Math.rint(var31); + + if (var31 < (double)var78) + { + --var78; + } + + int var34 = (int) (var78 % 256D) & 255; + var31 -= (double)var78; + var35 = var31 * var31 * var31 * (var31 * (var31 * 6.0D - 15.0D) + 10.0D); + + for (var37 = 0; var37 < par10; ++var37) + { + var38 = par6 + (double)var37 * par15 + this.zCoord; + double var40 = Math.rint(var38); + + if (var38 < (double)var40) + { + --var40; + } + + var41 = (int) (var40 % 256D) & 255; + var38 -= (double)var40; + var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D); + var19 = this.permutations[var34] + 0; + int var66 = this.permutations[var19] + var41; + int var67 = this.permutations[var34 + 1] + 0; + var22 = this.permutations[var67] + var41; + var70 = this.lerp(var35, this.grad2(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); + var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); + double var79 = this.lerp(var42, var70, var73); + var10001 = var75++; + par1ArrayOfDouble[var10001] += FLOAT_PERLIN_GENERATOR ? (float) (var79 * var77) : var79 * var77; + } + } + } + else + { + var19 = 0; + double var20 = 1.0D / par17; + var22 = -1; + boolean var23 = false; + boolean var24 = false; + boolean var25 = false; + boolean var26 = false; + boolean var27 = false; + boolean var28 = false; + double var29 = 0.0D; + var31 = 0.0D; + double var33 = 0.0D; + var35 = 0.0D; + + for (var37 = 0; var37 < par8; ++var37) + { + var38 = par2 + (double)var37 * par11 + this.xCoord; + double var40 = Math.rint(var38); + + if (var38 < (double)var40) + { + --var40; + } + + var41 = (int) (var40 % 256D) & 255; + var38 -= (double)var40; + var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D); + + for (int var44 = 0; var44 < par10; ++var44) + { + double var45 = par6 + (double)var44 * par15 + this.zCoord; + double var47 = Math.rint(var45); + + if (var45 < (double)var47) + { + --var47; + } + + int var48 = (int) (var47 % 256D) & 255; + var45 -= (double)var47; + double var49 = var45 * var45 * var45 * (var45 * (var45 * 6.0D - 15.0D) + 10.0D); + + for (int var51 = 0; var51 < par9; ++var51) + { + double var52 = par4 + (double)var51 * par13 + this.yCoord; + double var54 = Math.rint(var52); + + if (var52 < (double)var54) + { + --var54; + } + + int var55 = (int) (var54 % 256D) & 255; + var52 -= (double)var54; + double var56 = var52 * var52 * var52 * (var52 * (var52 * 6.0D - 15.0D) + 10.0D); + + if (var51 == 0 || var55 != var22) + { + var22 = var55; + int var69 = this.permutations[var41] + var55; + int var71 = this.permutations[var69] + var48; + int var72 = this.permutations[var69 + 1] + var48; + int var74 = this.permutations[var41 + 1] + var55; + var75 = this.permutations[var74] + var48; + int var76 = this.permutations[var74 + 1] + var48; + var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45)); + var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); + var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); + var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); + } + + double var58 = this.lerp(var56, var29, var31); + double var60 = this.lerp(var56, var33, var35); + double var62 = this.lerp(var49, var58, var60); + var10001 = var19++; + par1ArrayOfDouble[var10001] += FLOAT_PERLIN_GENERATOR ? (float) (var62 * var20) : var62 * var20; + } + } + } + } + } +} diff --git a/src/minecraft/net/minecraft/src/PerlinNoiseFactory.java b/src/minecraft/net/minecraft/src/PerlinNoiseFactory.java new file mode 100644 index 0000000..1e95180 --- /dev/null +++ b/src/minecraft/net/minecraft/src/PerlinNoiseFactory.java @@ -0,0 +1,29 @@ +package net.minecraft.src; + +import java.util.Random; + +public enum PerlinNoiseFactory { + intType { + @Override + public NoiseGenerator createPerlinNoiseGenerator(Random random) { + return new NoiseGeneratorPerlin(random); + } + }, + longType { + @Override + public NoiseGenerator createPerlinNoiseGenerator(Random random) { + return new NoiseGeneratorPerlin64(random); + } + }, + doubleType { + @Override + public NoiseGenerator createPerlinNoiseGenerator(Random random) { + return new NoiseGeneratorPerlin2(random); + } + }; + + public NoiseGenerator createPerlinNoiseGenerator() { + return createPerlinNoiseGenerator(new Random()); + } + public abstract NoiseGenerator createPerlinNoiseGenerator(Random random); +}