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