    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.ArrayList;
    006    import java.util.HashMap;
    007    import java.util.List;
    008    import java.util.Map;
    009
    010    public class MapData extends WorldSavedData
    011    {
    012        public int xCenter;
    013        public int zCenter;
    014        public int dimension;
    015        public byte scale;
    016
    017        /** colours */
    018        public byte[] colors = new byte[16384];
    019
    020        /**
    021         * Incremented each update of the map item, used for the patchy updating map effect and the spinning player icons
    022         * while in the End and Nether.
    023         */
    024        public int randomEffect;
    025
    026        /**
    027         * Holds a reference to the MapInfo of the players who own a copy of the map
    028         */
    029        public List playersArrayList = new ArrayList();
    030
    031        /**
    032         * Holds a reference to the players who own a copy of the map and a reference to their MapInfo
    033         */
    034        private Map playersHashMap = new HashMap();
    035        public List playersVisibleOnMap = new ArrayList();
    036
    037        public MapData(String par1Str)
    038        {
    039            super(par1Str);
    040        }
    041
    042        /**
    043         * reads in data from the NBTTagCompound into this MapDataBase
    044         */
    045        public void readFromNBT(NBTTagCompound par1NBTTagCompound)
    046        {
    047            NBTBase dimension = par1NBTTagCompound.getTag("dimension");
    048
    049            if (dimension instanceof NBTTagByte)
    050            {
    051                this.dimension = ((NBTTagByte)dimension).data;
    052            }
    053            else
    054            {
    055                this.dimension = ((NBTTagInt)dimension).data;
    056            }
    057            this.xCenter = par1NBTTagCompound.getInteger("xCenter");
    058            this.zCenter = par1NBTTagCompound.getInteger("zCenter");
    059            this.scale = par1NBTTagCompound.getByte("scale");
    060
    061            if (this.scale < 0)
    062            {
    063                this.scale = 0;
    064            }
    065
    066            if (this.scale > 4)
    067            {
    068                this.scale = 4;
    069            }
    070
    071            short var2 = par1NBTTagCompound.getShort("width");
    072            short var3 = par1NBTTagCompound.getShort("height");
    073
    074            if (var2 == 128 && var3 == 128)
    075            {
    076                this.colors = par1NBTTagCompound.getByteArray("colors");
    077            }
    078            else
    079            {
    080                byte[] var4 = par1NBTTagCompound.getByteArray("colors");
    081                this.colors = new byte[16384];
    082                int var5 = (128 - var2) / 2;
    083                int var6 = (128 - var3) / 2;
    084
    085                for (int var7 = 0; var7 < var3; ++var7)
    086                {
    087                    int var8 = var7 + var6;
    088
    089                    if (var8 >= 0 || var8 < 128)
    090                    {
    091                        for (int var9 = 0; var9 < var2; ++var9)
    092                        {
    093                            int var10 = var9 + var5;
    094
    095                            if (var10 >= 0 || var10 < 128)
    096                            {
    097                                this.colors[var10 + var8 * 128] = var4[var9 + var7 * var2];
    098                            }
    099                        }
    100                    }
    101                }
    102            }
    103        }
    104
    105        /**
    106         * write data to NBTTagCompound from this MapDataBase, similar to Entities and TileEntities
    107         */
    108        public void writeToNBT(NBTTagCompound par1NBTTagCompound)
    109        {
    110            par1NBTTagCompound.setInteger("dimension", this.dimension);
    111            par1NBTTagCompound.setInteger("xCenter", this.xCenter);
    112            par1NBTTagCompound.setInteger("zCenter", this.zCenter);
    113            par1NBTTagCompound.setByte("scale", this.scale);
    114            par1NBTTagCompound.setShort("width", (short)128);
    115            par1NBTTagCompound.setShort("height", (short)128);
    116            par1NBTTagCompound.setByteArray("colors", this.colors);
    117        }
    118
    119        /**
    120         * Adds the player passed to the list of visible players and checks to see which players are visible
    121         */
    122        public void updateVisiblePlayers(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
    123        {
    124            if (!this.playersHashMap.containsKey(par1EntityPlayer))
    125            {
    126                MapInfo var3 = new MapInfo(this, par1EntityPlayer);
    127                this.playersHashMap.put(par1EntityPlayer, var3);
    128                this.playersArrayList.add(var3);
    129            }
    130
    131            this.playersVisibleOnMap.clear();
    132
    133            for (int var14 = 0; var14 < this.playersArrayList.size(); ++var14)
    134            {
    135                MapInfo var4 = (MapInfo)this.playersArrayList.get(var14);
    136
    137                if (!var4.entityplayerObj.isDead && var4.entityplayerObj.inventory.hasItemStack(par2ItemStack))
    138                {
    139                    float var5 = (float)(var4.entityplayerObj.posX - (double)this.xCenter) / (float)(1 << this.scale);
    140                    float var6 = (float)(var4.entityplayerObj.posZ - (double)this.zCenter) / (float)(1 << this.scale);
    141                    byte var7 = 64;
    142                    byte var8 = 64;
    143
    144                    if (var5 >= (float)(-var7) && var6 >= (float)(-var8) && var5 <= (float)var7 && var6 <= (float)var8)
    145                    {
    146                        byte var9 = 0;
    147                        byte var10 = (byte)((int)((double)(var5 * 2.0F) + 0.5D));
    148                        byte var11 = (byte)((int)((double)(var6 * 2.0F) + 0.5D));
    149                        byte var12 = (byte)((int)((double)var4.entityplayerObj.rotationYaw * 16.0D / 360.0D));
    150
    151                        if (this.dimension < 0)
    152                        {
    153                            int var13 = this.randomEffect / 10;
    154                            var12 = (byte)(var13 * var13 * 34187121 + var13 * 121 >> 15 & 15);
    155                        }
    156
    157                        if (var4.entityplayerObj.dimension == this.dimension)
    158                        {
    159                            this.playersVisibleOnMap.add(new MapCoord(this, var9, var10, var11, var12));
    160                        }
    161                    }
    162                }
    163                else
    164                {
    165                    this.playersHashMap.remove(var4.entityplayerObj);
    166                    this.playersArrayList.remove(var4);
    167                }
    168            }
    169        }
    170
    171        public byte[] func_76193_a(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    172        {
    173            MapInfo var4 = (MapInfo)this.playersHashMap.get(par3EntityPlayer);
    174            return var4 == null ? null : var4.getPlayersOnMap(par1ItemStack);
    175        }
    176
    177        public void func_76194_a(int par1, int par2, int par3)
    178        {
    179            super.markDirty();
    180
    181            for (int var4 = 0; var4 < this.playersArrayList.size(); ++var4)
    182            {
    183                MapInfo var5 = (MapInfo)this.playersArrayList.get(var4);
    184
    185                if (var5.field_76209_b[par1] < 0 || var5.field_76209_b[par1] > par2)
    186                {
    187                    var5.field_76209_b[par1] = par2;
    188                }
    189
    190                if (var5.field_76210_c[par1] < 0 || var5.field_76210_c[par1] < par3)
    191                {
    192                    var5.field_76210_c[par1] = par3;
    193                }
    194            }
    195        }
    196
    197        @SideOnly(Side.CLIENT)
    198
    199        /**
    200         * Updates the client's map with information from other players in MP
    201         */
    202        public void updateMPMapData(byte[] par1ArrayOfByte)
    203        {
    204            int var2;
    205
    206            if (par1ArrayOfByte[0] == 0)
    207            {
    208                var2 = par1ArrayOfByte[1] & 255;
    209                int var3 = par1ArrayOfByte[2] & 255;
    210
    211                for (int var4 = 0; var4 < par1ArrayOfByte.length - 3; ++var4)
    212                {
    213                    this.colors[(var4 + var3) * 128 + var2] = par1ArrayOfByte[var4 + 3];
    214                }
    215
    216                this.markDirty();
    217            }
    218            else if (par1ArrayOfByte[0] == 1)
    219            {
    220                this.playersVisibleOnMap.clear();
    221
    222                for (var2 = 0; var2 < (par1ArrayOfByte.length - 1) / 3; ++var2)
    223                {
    224                    byte var7 = (byte)(par1ArrayOfByte[var2 * 3 + 1] % 16);
    225                    byte var8 = par1ArrayOfByte[var2 * 3 + 2];
    226                    byte var5 = par1ArrayOfByte[var2 * 3 + 3];
    227                    byte var6 = (byte)(par1ArrayOfByte[var2 * 3 + 1] / 16);
    228                    this.playersVisibleOnMap.add(new MapCoord(this, var7, var8, var5, var6));
    229                }
    230            }
    231        }
    232    }