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