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().hangingDirection * 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 (par2World.provider.shouldMapSpin(par3Str, par4, par6, par8)) 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 /** 218 * Marks a vertical range of pixels as being modified so they will be resent to clients. Parameters: X, lowest Y, 219 * highest Y 220 */ 221 public void setColumnDirty(int par1, int par2, int par3) 222 { 223 super.markDirty(); 224 225 for (int var4 = 0; var4 < this.playersArrayList.size(); ++var4) 226 { 227 MapInfo var5 = (MapInfo)this.playersArrayList.get(var4); 228 229 if (var5.field_76209_b[par1] < 0 || var5.field_76209_b[par1] > par2) 230 { 231 var5.field_76209_b[par1] = par2; 232 } 233 234 if (var5.field_76210_c[par1] < 0 || var5.field_76210_c[par1] < par3) 235 { 236 var5.field_76210_c[par1] = par3; 237 } 238 } 239 } 240 241 @SideOnly(Side.CLIENT) 242 243 /** 244 * Updates the client's map with information from other players in MP 245 */ 246 public void updateMPMapData(byte[] par1ArrayOfByte) 247 { 248 int var2; 249 250 if (par1ArrayOfByte[0] == 0) 251 { 252 var2 = par1ArrayOfByte[1] & 255; 253 int var3 = par1ArrayOfByte[2] & 255; 254 255 for (int var4 = 0; var4 < par1ArrayOfByte.length - 3; ++var4) 256 { 257 this.colors[(var4 + var3) * 128 + var2] = par1ArrayOfByte[var4 + 3]; 258 } 259 260 this.markDirty(); 261 } 262 else if (par1ArrayOfByte[0] == 1) 263 { 264 this.playersVisibleOnMap.clear(); 265 266 for (var2 = 0; var2 < (par1ArrayOfByte.length - 1) / 3; ++var2) 267 { 268 byte var7 = (byte)(par1ArrayOfByte[var2 * 3 + 1] >> 4); 269 byte var8 = par1ArrayOfByte[var2 * 3 + 2]; 270 byte var5 = par1ArrayOfByte[var2 * 3 + 3]; 271 byte var6 = (byte)(par1ArrayOfByte[var2 * 3 + 1] & 15); 272 this.playersVisibleOnMap.put("icon-" + var2, new MapCoord(this, var7, var8, var5, var6)); 273 } 274 } 275 else if (par1ArrayOfByte[0] == 2) 276 { 277 this.scale = par1ArrayOfByte[1]; 278 } 279 } 280 281 public MapInfo func_82568_a(EntityPlayer par1EntityPlayer) 282 { 283 MapInfo var2 = (MapInfo)this.playersHashMap.get(par1EntityPlayer); 284 285 if (var2 == null) 286 { 287 var2 = new MapInfo(this, par1EntityPlayer); 288 this.playersHashMap.put(par1EntityPlayer, var2); 289 this.playersArrayList.add(var2); 290 } 291 292 return var2; 293 } 294 }