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 }