001package net.minecraft.world.gen.layer;
002
003public class GenLayerVoronoiZoom extends GenLayer
004{
005    public GenLayerVoronoiZoom(long par1, GenLayer par3GenLayer)
006    {
007        super(par1);
008        super.parent = par3GenLayer;
009    }
010
011    /**
012     * Returns a list of integer values generated by this layer. These may be interpreted as temperatures, rainfall
013     * amounts, or biomeList[] indices based on the particular GenLayer subclass.
014     */
015    public int[] getInts(int par1, int par2, int par3, int par4)
016    {
017        par1 -= 2;
018        par2 -= 2;
019        byte b0 = 2;
020        int i1 = 1 << b0;
021        int j1 = par1 >> b0;
022        int k1 = par2 >> b0;
023        int l1 = (par3 >> b0) + 3;
024        int i2 = (par4 >> b0) + 3;
025        int[] aint = this.parent.getInts(j1, k1, l1, i2);
026        int j2 = l1 << b0;
027        int k2 = i2 << b0;
028        int[] aint1 = IntCache.getIntCache(j2 * k2);
029        int l2;
030
031        for (int i3 = 0; i3 < i2 - 1; ++i3)
032        {
033            l2 = aint[0 + (i3 + 0) * l1];
034            int j3 = aint[0 + (i3 + 1) * l1];
035
036            for (int k3 = 0; k3 < l1 - 1; ++k3)
037            {
038                double d0 = (double)i1 * 0.9D;
039                this.initChunkSeed((long)(k3 + j1 << b0), (long)(i3 + k1 << b0));
040                double d1 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0;
041                double d2 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0;
042                this.initChunkSeed((long)(k3 + j1 + 1 << b0), (long)(i3 + k1 << b0));
043                double d3 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0 + (double)i1;
044                double d4 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0;
045                this.initChunkSeed((long)(k3 + j1 << b0), (long)(i3 + k1 + 1 << b0));
046                double d5 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0;
047                double d6 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0 + (double)i1;
048                this.initChunkSeed((long)(k3 + j1 + 1 << b0), (long)(i3 + k1 + 1 << b0));
049                double d7 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0 + (double)i1;
050                double d8 = ((double)this.nextInt(1024) / 1024.0D - 0.5D) * d0 + (double)i1;
051                int l3 = aint[k3 + 1 + (i3 + 0) * l1];
052                int i4 = aint[k3 + 1 + (i3 + 1) * l1];
053
054                for (int j4 = 0; j4 < i1; ++j4)
055                {
056                    int k4 = ((i3 << b0) + j4) * j2 + (k3 << b0);
057
058                    for (int l4 = 0; l4 < i1; ++l4)
059                    {
060                        double d9 = ((double)j4 - d2) * ((double)j4 - d2) + ((double)l4 - d1) * ((double)l4 - d1);
061                        double d10 = ((double)j4 - d4) * ((double)j4 - d4) + ((double)l4 - d3) * ((double)l4 - d3);
062                        double d11 = ((double)j4 - d6) * ((double)j4 - d6) + ((double)l4 - d5) * ((double)l4 - d5);
063                        double d12 = ((double)j4 - d8) * ((double)j4 - d8) + ((double)l4 - d7) * ((double)l4 - d7);
064
065                        if (d9 < d10 && d9 < d11 && d9 < d12)
066                        {
067                            aint1[k4++] = l2;
068                        }
069                        else if (d10 < d9 && d10 < d11 && d10 < d12)
070                        {
071                            aint1[k4++] = l3;
072                        }
073                        else if (d11 < d9 && d11 < d10 && d11 < d12)
074                        {
075                            aint1[k4++] = j3;
076                        }
077                        else
078                        {
079                            aint1[k4++] = i4;
080                        }
081                    }
082                }
083
084                l2 = l3;
085                j3 = i4;
086            }
087        }
088
089        int[] aint2 = IntCache.getIntCache(par3 * par4);
090
091        for (l2 = 0; l2 < par4; ++l2)
092        {
093            System.arraycopy(aint1, (l2 + (par2 & i1 - 1)) * (l1 << b0) + (par1 & i1 - 1), aint2, l2 * par3, par3);
094        }
095
096        return aint2;
097    }
098}