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.LinkedHashMap;
008 import java.util.List;
009 import java.util.Map;
010
011 public class MapData extends WorldSavedData
012 {
013 public int xCenter;
014 public int zCenter;
015 public int dimension;
016 public byte scale;
017
018 /** colours */
019 public byte[] colors = new byte[16384];
020
021 /**
022 * Holds a reference to the MapInfo of the players who own a copy of the map
023 */
024 public List playersArrayList = new ArrayList();
025
026 /**
027 * Holds a reference to the players who own a copy of the map and a reference to their MapInfo
028 */
029 private Map playersHashMap = new HashMap();
030 public Map playersVisibleOnMap = new LinkedHashMap();
031
032 public MapData(String par1Str)
033 {
034 super(par1Str);
035 }
036
037 /**
038 * reads in data from the NBTTagCompound into this MapDataBase
039 */
040 public void readFromNBT(NBTTagCompound par1NBTTagCompound)
041 {
042 NBTBase dimension = par1NBTTagCompound.getTag("dimension");
043
044 if (dimension instanceof NBTTagByte)
045 {
046 this.dimension = ((NBTTagByte)dimension).data;
047 }
048 else
049 {
050 this.dimension = ((NBTTagInt)dimension).data;
051 }
052 this.xCenter = par1NBTTagCompound.getInteger("xCenter");
053 this.zCenter = par1NBTTagCompound.getInteger("zCenter");
054 this.scale = par1NBTTagCompound.getByte("scale");
055
056 if (this.scale < 0)
057 {
058 this.scale = 0;
059 }
060
061 if (this.scale > 4)
062 {
063 this.scale = 4;
064 }
065
066 short var2 = par1NBTTagCompound.getShort("width");
067 short var3 = par1NBTTagCompound.getShort("height");
068
069 if (var2 == 128 && var3 == 128)
070 {
071 this.colors = par1NBTTagCompound.getByteArray("colors");
072 }
073 else
074 {
075 byte[] var4 = par1NBTTagCompound.getByteArray("colors");
076 this.colors = new byte[16384];
077 int var5 = (128 - var2) / 2;
078 int var6 = (128 - var3) / 2;
079
080 for (int var7 = 0; var7 < var3; ++var7)
081 {
082 int var8 = var7 + var6;
083
084 if (var8 >= 0 || var8 < 128)
085 {
086 for (int var9 = 0; var9 < var2; ++var9)
087 {
088 int var10 = var9 + var5;
089
090 if (var10 >= 0 || var10 < 128)
091 {
092 this.colors[var10 + var8 * 128] = var4[var9 + var7 * var2];
093 }
094 }
095 }
096 }
097 }
098 }
099
100 /**
101 * write data to NBTTagCompound from this MapDataBase, similar to Entities and TileEntities
102 */
103 public void writeToNBT(NBTTagCompound par1NBTTagCompound)
104 {
105 par1NBTTagCompound.setInteger("dimension", this.dimension);
106 par1NBTTagCompound.setInteger("xCenter", this.xCenter);
107 par1NBTTagCompound.setInteger("zCenter", this.zCenter);
108 par1NBTTagCompound.setByte("scale", this.scale);
109 par1NBTTagCompound.setShort("width", (short)128);
110 par1NBTTagCompound.setShort("height", (short)128);
111 par1NBTTagCompound.setByteArray("colors", this.colors);
112 }
113
114 /**
115 * Adds the player passed to the list of visible players and checks to see which players are visible
116 */
117 public void updateVisiblePlayers(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
118 {
119 if (!this.playersHashMap.containsKey(par1EntityPlayer))
120 {
121 MapInfo var3 = new MapInfo(this, par1EntityPlayer);
122 this.playersHashMap.put(par1EntityPlayer, var3);
123 this.playersArrayList.add(var3);
124 }
125
126 if (!par1EntityPlayer.inventory.hasItemStack(par2ItemStack))
127 {
128 this.playersVisibleOnMap.remove(par1EntityPlayer.getCommandSenderName());
129 }
130
131 for (int var5 = 0; var5 < this.playersArrayList.size(); ++var5)
132 {
133 MapInfo var4 = (MapInfo)this.playersArrayList.get(var5);
134
135 if (!var4.entityplayerObj.isDead && (var4.entityplayerObj.inventory.hasItemStack(par2ItemStack) || par2ItemStack.isOnItemFrame()))
136 {
137 if (!par2ItemStack.isOnItemFrame() && var4.entityplayerObj.dimension == this.dimension)
138 {
139 this.func_82567_a(0, var4.entityplayerObj.worldObj, var4.entityplayerObj.getCommandSenderName(), var4.entityplayerObj.posX, var4.entityplayerObj.posZ, (double)var4.entityplayerObj.rotationYaw);
140 }
141 }
142 else
143 {
144 this.playersHashMap.remove(var4.entityplayerObj);
145 this.playersArrayList.remove(var4);
146 }
147 }
148
149 if (par2ItemStack.isOnItemFrame())
150 {
151 this.func_82567_a(1, par1EntityPlayer.worldObj, "frame-" + par2ItemStack.getItemFrame().entityId, (double)par2ItemStack.getItemFrame().xPosition, (double)par2ItemStack.getItemFrame().zPosition, (double)(par2ItemStack.getItemFrame().field_82332_a * 90));
152 }
153 }
154
155 private void func_82567_a(int par1, World par2World, String par3Str, double par4, double par6, double par8)
156 {
157 int var10 = 1 << this.scale;
158 float var11 = (float)(par4 - (double)this.xCenter) / (float)var10;
159 float var12 = (float)(par6 - (double)this.zCenter) / (float)var10;
160 byte var13 = (byte)((int)((double)(var11 * 2.0F) + 0.5D));
161 byte var14 = (byte)((int)((double)(var12 * 2.0F) + 0.5D));
162 byte var16 = 63;
163 byte var15;
164
165 if (var11 >= (float)(-var16) && var12 >= (float)(-var16) && var11 <= (float)var16 && var12 <= (float)var16)
166 {
167 par8 += par8 < 0.0D ? -8.0D : 8.0D;
168 var15 = (byte)((int)(par8 * 16.0D / 360.0D));
169
170 if (this.dimension < 0)
171 {
172 int var17 = (int)(par2World.getWorldInfo().getWorldTime() / 10L);
173 var15 = (byte)(var17 * var17 * 34187121 + var17 * 121 >> 15 & 15);
174 }
175 }
176 else
177 {
178 if (Math.abs(var11) >= 320.0F || Math.abs(var12) >= 320.0F)
179 {
180 this.playersVisibleOnMap.remove(par3Str);
181 return;
182 }
183
184 par1 = 6;
185 var15 = 0;
186
187 if (var11 <= (float)(-var16))
188 {
189 var13 = (byte)((int)((double)(var16 * 2) + 2.5D));
190 }
191
192 if (var12 <= (float)(-var16))
193 {
194 var14 = (byte)((int)((double)(var16 * 2) + 2.5D));
195 }
196
197 if (var11 >= (float)var16)
198 {
199 var13 = (byte)(var16 * 2 + 1);
200 }
201
202 if (var12 >= (float)var16)
203 {
204 var14 = (byte)(var16 * 2 + 1);
205 }
206 }
207
208 this.playersVisibleOnMap.put(par3Str, new MapCoord(this, (byte)par1, var13, var14, var15));
209 }
210
211 public byte[] func_76193_a(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
212 {
213 MapInfo var4 = (MapInfo)this.playersHashMap.get(par3EntityPlayer);
214 return var4 == null ? null : var4.getPlayersOnMap(par1ItemStack);
215 }
216
217 public void func_76194_a(int par1, int par2, int par3)
218 {
219 super.markDirty();
220
221 for (int var4 = 0; var4 < this.playersArrayList.size(); ++var4)
222 {
223 MapInfo var5 = (MapInfo)this.playersArrayList.get(var4);
224
225 if (var5.field_76209_b[par1] < 0 || var5.field_76209_b[par1] > par2)
226 {
227 var5.field_76209_b[par1] = par2;
228 }
229
230 if (var5.field_76210_c[par1] < 0 || var5.field_76210_c[par1] < par3)
231 {
232 var5.field_76210_c[par1] = par3;
233 }
234 }
235 }
236
237 @SideOnly(Side.CLIENT)
238
239 /**
240 * Updates the client's map with information from other players in MP
241 */
242 public void updateMPMapData(byte[] par1ArrayOfByte)
243 {
244 int var2;
245
246 if (par1ArrayOfByte[0] == 0)
247 {
248 var2 = par1ArrayOfByte[1] & 255;
249 int var3 = par1ArrayOfByte[2] & 255;
250
251 for (int var4 = 0; var4 < par1ArrayOfByte.length - 3; ++var4)
252 {
253 this.colors[(var4 + var3) * 128 + var2] = par1ArrayOfByte[var4 + 3];
254 }
255
256 this.markDirty();
257 }
258 else if (par1ArrayOfByte[0] == 1)
259 {
260 this.playersVisibleOnMap.clear();
261
262 for (var2 = 0; var2 < (par1ArrayOfByte.length - 1) / 3; ++var2)
263 {
264 byte var7 = (byte)(par1ArrayOfByte[var2 * 3 + 1] >> 4);
265 byte var8 = par1ArrayOfByte[var2 * 3 + 2];
266 byte var5 = par1ArrayOfByte[var2 * 3 + 3];
267 byte var6 = (byte)(par1ArrayOfByte[var2 * 3 + 1] & 15);
268 this.playersVisibleOnMap.put("icon-" + var2, new MapCoord(this, var7, var8, var5, var6));
269 }
270 }
271 else if (par1ArrayOfByte[0] == 2)
272 {
273 this.scale = par1ArrayOfByte[1];
274 }
275 }
276
277 public MapInfo func_82568_a(EntityPlayer par1EntityPlayer)
278 {
279 MapInfo var2 = (MapInfo)this.playersHashMap.get(par1EntityPlayer);
280
281 if (var2 == null)
282 {
283 var2 = new MapInfo(this, par1EntityPlayer);
284 this.playersHashMap.put(par1EntityPlayer, var2);
285 this.playersArrayList.add(var2);
286 }
287
288 return var2;
289 }
290 }