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 }