001    package net.minecraft.world.gen.feature;
002    
003    import java.util.ArrayList;
004    import java.util.Arrays;
005    import java.util.Iterator;
006    import java.util.List;
007    import java.util.Map;
008    import java.util.Random;
009    import java.util.Map.Entry;
010    import net.minecraft.entity.monster.EntityWitch;
011    import net.minecraft.util.MathHelper;
012    import net.minecraft.world.biome.BiomeGenBase;
013    import net.minecraft.world.biome.SpawnListEntry;
014    import net.minecraft.world.gen.structure.MapGenStructure;
015    import net.minecraft.world.gen.structure.StructureScatteredFeatureStart;
016    import net.minecraft.world.gen.structure.StructureStart;
017    
018    public class MapGenScatteredFeature extends MapGenStructure
019    {
020        private static List biomelist = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.desert, BiomeGenBase.desertHills, BiomeGenBase.jungle, BiomeGenBase.jungleHills, BiomeGenBase.swampland});
021    
022        /** contains possible spawns for scattered features */
023        private List scatteredFeatureSpawnList;
024    
025        /** the maximum distance between scattered features */
026        private int maxDistanceBetweenScatteredFeatures;
027    
028        /** the minimum distance between scattered features */
029        private int minDistanceBetweenScatteredFeatures;
030    
031        public MapGenScatteredFeature()
032        {
033            this.scatteredFeatureSpawnList = new ArrayList();
034            this.maxDistanceBetweenScatteredFeatures = 32;
035            this.minDistanceBetweenScatteredFeatures = 8;
036            this.scatteredFeatureSpawnList.add(new SpawnListEntry(EntityWitch.class, 1, 1, 1));
037        }
038    
039        public MapGenScatteredFeature(Map par1Map)
040        {
041            this();
042            Iterator var2 = par1Map.entrySet().iterator();
043    
044            while (var2.hasNext())
045            {
046                Entry var3 = (Entry)var2.next();
047    
048                if (((String)var3.getKey()).equals("distance"))
049                {
050                    this.maxDistanceBetweenScatteredFeatures = MathHelper.parseIntWithDefaultAndMax((String)var3.getValue(), this.maxDistanceBetweenScatteredFeatures, this.minDistanceBetweenScatteredFeatures + 1);
051                }
052            }
053        }
054    
055        protected boolean canSpawnStructureAtCoords(int par1, int par2)
056        {
057            int var3 = par1;
058            int var4 = par2;
059    
060            if (par1 < 0)
061            {
062                par1 -= this.maxDistanceBetweenScatteredFeatures - 1;
063            }
064    
065            if (par2 < 0)
066            {
067                par2 -= this.maxDistanceBetweenScatteredFeatures - 1;
068            }
069    
070            int var5 = par1 / this.maxDistanceBetweenScatteredFeatures;
071            int var6 = par2 / this.maxDistanceBetweenScatteredFeatures;
072            Random var7 = this.worldObj.setRandomSeed(var5, var6, 14357617);
073            var5 *= this.maxDistanceBetweenScatteredFeatures;
074            var6 *= this.maxDistanceBetweenScatteredFeatures;
075            var5 += var7.nextInt(this.maxDistanceBetweenScatteredFeatures - this.minDistanceBetweenScatteredFeatures);
076            var6 += var7.nextInt(this.maxDistanceBetweenScatteredFeatures - this.minDistanceBetweenScatteredFeatures);
077    
078            if (var3 == var5 && var4 == var6)
079            {
080                BiomeGenBase var8 = this.worldObj.getWorldChunkManager().getBiomeGenAt(var3 * 16 + 8, var4 * 16 + 8);
081                Iterator var9 = biomelist.iterator();
082    
083                while (var9.hasNext())
084                {
085                    BiomeGenBase var10 = (BiomeGenBase)var9.next();
086    
087                    if (var8 == var10)
088                    {
089                        return true;
090                    }
091                }
092            }
093    
094            return false;
095        }
096    
097        protected StructureStart getStructureStart(int par1, int par2)
098        {
099            return new StructureScatteredFeatureStart(this.worldObj, this.rand, par1, par2);
100        }
101    
102        /**
103         * returns possible spawns for scattered features
104         */
105        public List getScatteredFeatureSpawnList()
106        {
107            return this.scatteredFeatureSpawnList;
108        }
109    }