    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    }