001    package net.minecraft.src;
002    
003    public class MapInfo
004    {
005        /** Reference for EntityPlayer object in MapInfo */
006        public final EntityPlayer entityplayerObj;
007        public int[] field_76209_b;
008        public int[] field_76210_c;
009    
010        /**
011         * updated by x = mod(x*11,128) +1  x-1 is used to index field_76209_b and field_76210_c
012         */
013        private int currentRandomNumber;
014        private int ticksUntilPlayerLocationMapUpdate;
015    
016        /**
017         * a cache of the result from getPlayersOnMap so that it is not resent when nothing changes
018         */
019        private byte[] lastPlayerLocationOnMap;
020    
021        /** reference in MapInfo to MapData object */
022        final MapData mapDataObj;
023    
024        public MapInfo(MapData par1MapData, EntityPlayer par2EntityPlayer)
025        {
026            this.mapDataObj = par1MapData;
027            this.field_76209_b = new int[128];
028            this.field_76210_c = new int[128];
029            this.currentRandomNumber = 0;
030            this.ticksUntilPlayerLocationMapUpdate = 0;
031            this.entityplayerObj = par2EntityPlayer;
032    
033            for (int var3 = 0; var3 < this.field_76209_b.length; ++var3)
034            {
035                this.field_76209_b[var3] = 0;
036                this.field_76210_c[var3] = 127;
037            }
038        }
039    
040        /**
041         * returns a 1+players*3 array, of x,y, and color . the name of this function may be partially wrong, as there is a
042         * second branch to the code here
043         */
044        public byte[] getPlayersOnMap(ItemStack par1ItemStack)
045        {
046            int var3;
047            int var10;
048    
049            if (--this.ticksUntilPlayerLocationMapUpdate < 0)
050            {
051                this.ticksUntilPlayerLocationMapUpdate = 4;
052                byte[] var2 = new byte[this.mapDataObj.playersVisibleOnMap.size() * 3 + 1];
053                var2[0] = 1;
054    
055                for (var3 = 0; var3 < this.mapDataObj.playersVisibleOnMap.size(); ++var3)
056                {
057                    MapCoord var4 = (MapCoord)this.mapDataObj.playersVisibleOnMap.get(var3);
058                    var2[var3 * 3 + 1] = (byte)(var4.iconSize + (var4.iconRotation & 15) * 16);
059                    var2[var3 * 3 + 2] = var4.centerX;
060                    var2[var3 * 3 + 3] = var4.centerZ;
061                }
062    
063                boolean var9 = true;
064    
065                if (this.lastPlayerLocationOnMap != null && this.lastPlayerLocationOnMap.length == var2.length)
066                {
067                    for (var10 = 0; var10 < var2.length; ++var10)
068                    {
069                        if (var2[var10] != this.lastPlayerLocationOnMap[var10])
070                        {
071                            var9 = false;
072                            break;
073                        }
074                    }
075                }
076                else
077                {
078                    var9 = false;
079                }
080    
081                if (!var9)
082                {
083                    this.lastPlayerLocationOnMap = var2;
084                    return var2;
085                }
086            }
087    
088            for (int var8 = 0; var8 < 10; ++var8)
089            {
090                var3 = this.currentRandomNumber * 11 % 128;
091                ++this.currentRandomNumber;
092    
093                if (this.field_76209_b[var3] >= 0)
094                {
095                    var10 = this.field_76210_c[var3] - this.field_76209_b[var3] + 1;
096                    int var5 = this.field_76209_b[var3];
097                    byte[] var6 = new byte[var10 + 3];
098                    var6[0] = 0;
099                    var6[1] = (byte)var3;
100                    var6[2] = (byte)var5;
101    
102                    for (int var7 = 0; var7 < var6.length - 3; ++var7)
103                    {
104                        var6[var7 + 3] = this.mapDataObj.colors[(var7 + var5) * 128 + var3];
105                    }
106    
107                    this.field_76210_c[var3] = -1;
108                    this.field_76209_b[var3] = -1;
109                    return var6;
110                }
111            }
112    
113            return null;
114        }
115    }