001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005
006 public class ItemMap extends ItemMapBase
007 {
008 protected ItemMap(int par1)
009 {
010 super(par1);
011 this.setMaxStackSize(1);
012 this.setCreativeTab(CreativeTabs.tabMisc);
013 }
014
015 @SideOnly(Side.CLIENT)
016 public static MapData getMPMapData(short par0, World par1World)
017 {
018 MapData var3 = (MapData)par1World.loadItemData(MapData.class, "map_" + par0);
019
020 if (var3 == null)
021 {
022 int var4 = par1World.getUniqueDataId("map");
023 String var2 = "map_" + var4;
024 var3 = new MapData(var2);
025 par1World.setItemData(var2, var3);
026 }
027
028 return var3;
029 }
030
031 public MapData getMapData(ItemStack par1ItemStack, World par2World)
032 {
033 MapData var4 = (MapData)par2World.loadItemData(MapData.class, "map_" + par1ItemStack.getItemDamage());
034
035 if (var4 == null)
036 {
037 par1ItemStack.setItemDamage(par2World.getUniqueDataId("map"));
038 String var3 = "map_" + par1ItemStack.getItemDamage();
039 var4 = new MapData(var3);
040 var4.xCenter = par2World.getWorldInfo().getSpawnX();
041 var4.zCenter = par2World.getWorldInfo().getSpawnZ();
042 var4.scale = 3;
043 var4.dimension = par2World.provider.dimensionId;
044 var4.markDirty();
045 par2World.setItemData(var3, var4);
046 }
047
048 return var4;
049 }
050
051 public void updateMapData(World par1World, Entity par2Entity, MapData par3MapData)
052 {
053 if (par1World.provider.dimensionId == par3MapData.dimension)
054 {
055 short var4 = 128;
056 short var5 = 128;
057 int var6 = 1 << par3MapData.scale;
058 int var7 = par3MapData.xCenter;
059 int var8 = par3MapData.zCenter;
060 int var9 = MathHelper.floor_double(par2Entity.posX - (double)var7) / var6 + var4 / 2;
061 int var10 = MathHelper.floor_double(par2Entity.posZ - (double)var8) / var6 + var5 / 2;
062 int var11 = 128 / var6;
063
064 if (par1World.provider.hasNoSky)
065 {
066 var11 /= 2;
067 }
068
069 ++par3MapData.randomEffect;
070
071 for (int var12 = var9 - var11 + 1; var12 < var9 + var11; ++var12)
072 {
073 if ((var12 & 15) == (par3MapData.randomEffect & 15))
074 {
075 int var13 = 255;
076 int var14 = 0;
077 double var15 = 0.0D;
078
079 for (int var17 = var10 - var11 - 1; var17 < var10 + var11; ++var17)
080 {
081 if (var12 >= 0 && var17 >= -1 && var12 < var4 && var17 < var5)
082 {
083 int var18 = var12 - var9;
084 int var19 = var17 - var10;
085 boolean var20 = var18 * var18 + var19 * var19 > (var11 - 2) * (var11 - 2);
086 int var21 = (var7 / var6 + var12 - var4 / 2) * var6;
087 int var22 = (var8 / var6 + var17 - var5 / 2) * var6;
088 byte var23 = 0;
089 byte var24 = 0;
090 byte var25 = 0;
091 int[] var26 = new int[Block.blocksList.length];
092 Chunk var27 = par1World.getChunkFromBlockCoords(var21, var22);
093
094 if (!var27.isEmpty())
095 {
096 int var28 = var21 & 15;
097 int var29 = var22 & 15;
098 int var30 = 0;
099 double var31 = 0.0D;
100 int var34;
101 int var35;
102 int var33;
103 int var38;
104
105 if (par1World.provider.hasNoSky)
106 {
107 var33 = var21 + var22 * 231871;
108 var33 = var33 * var33 * 31287121 + var33 * 11;
109
110 if ((var33 >> 20 & 1) == 0)
111 {
112 var26[Block.dirt.blockID] += 10;
113 }
114 else
115 {
116 var26[Block.stone.blockID] += 10;
117 }
118
119 var31 = 100.0D;
120 }
121 else
122 {
123 for (var33 = 0; var33 < var6; ++var33)
124 {
125 for (var34 = 0; var34 < var6; ++var34)
126 {
127 var35 = var27.getHeightValue(var33 + var28, var34 + var29) + 1;
128 int var36 = 0;
129
130 if (var35 > 1)
131 {
132 boolean var37 = false;
133
134 do
135 {
136 var37 = true;
137 var36 = var27.getBlockID(var33 + var28, var35 - 1, var34 + var29);
138
139 if (var36 == 0)
140 {
141 var37 = false;
142 }
143 else if (var35 > 0 && var36 > 0 && Block.blocksList[var36].blockMaterial.materialMapColor == MapColor.airColor)
144 {
145 var37 = false;
146 }
147
148 if (!var37)
149 {
150 --var35;
151
152 if (var35 <= 0)
153 {
154 break;
155 }
156
157 var36 = var27.getBlockID(var33 + var28, var35 - 1, var34 + var29);
158 }
159 }
160 while (var35 > 0 && !var37);
161
162 if (var35 > 0 && var36 != 0 && Block.blocksList[var36].blockMaterial.isLiquid())
163 {
164 var38 = var35 - 1;
165 boolean var39 = false;
166 int var41;
167
168 do
169 {
170 var41 = var27.getBlockID(var33 + var28, var38--, var34 + var29);
171 ++var30;
172 }
173 while (var38 > 0 && var41 != 0 && Block.blocksList[var41].blockMaterial.isLiquid());
174 }
175 }
176
177 var31 += (double)var35 / (double)(var6 * var6);
178 ++var26[var36];
179 }
180 }
181 }
182
183 var30 /= var6 * var6;
184 int var10000 = var23 / (var6 * var6);
185 var10000 = var24 / (var6 * var6);
186 var10000 = var25 / (var6 * var6);
187 var33 = 0;
188 var34 = 0;
189
190 for (var35 = 0; var35 < Block.blocksList.length; ++var35)
191 {
192 if (var26[var35] > var33)
193 {
194 var34 = var35;
195 var33 = var26[var35];
196 }
197 }
198
199 double var43 = (var31 - var15) * 4.0D / (double)(var6 + 4) + ((double)(var12 + var17 & 1) - 0.5D) * 0.4D;
200 byte var42 = 1;
201
202 if (var43 > 0.6D)
203 {
204 var42 = 2;
205 }
206
207 if (var43 < -0.6D)
208 {
209 var42 = 0;
210 }
211
212 var38 = 0;
213
214 if (var34 > 0)
215 {
216 MapColor var45 = Block.blocksList[var34].blockMaterial.materialMapColor;
217
218 if (var45 == MapColor.waterColor)
219 {
220 var43 = (double)var30 * 0.1D + (double)(var12 + var17 & 1) * 0.2D;
221 var42 = 1;
222
223 if (var43 < 0.5D)
224 {
225 var42 = 2;
226 }
227
228 if (var43 > 0.9D)
229 {
230 var42 = 0;
231 }
232 }
233
234 var38 = var45.colorIndex;
235 }
236
237 var15 = var31;
238
239 if (var17 >= 0 && var18 * var18 + var19 * var19 < var11 * var11 && (!var20 || (var12 + var17 & 1) != 0))
240 {
241 byte var44 = par3MapData.colors[var12 + var17 * var4];
242 byte var40 = (byte)(var38 * 4 + var42);
243
244 if (var44 != var40)
245 {
246 if (var13 > var17)
247 {
248 var13 = var17;
249 }
250
251 if (var14 < var17)
252 {
253 var14 = var17;
254 }
255
256 par3MapData.colors[var12 + var17 * var4] = var40;
257 }
258 }
259 }
260 }
261 }
262
263 if (var13 <= var14)
264 {
265 par3MapData.func_76194_a(var12, var13, var14);
266 }
267 }
268 }
269 }
270 }
271
272 /**
273 * Called each tick as long the item is on a player inventory. Uses by maps to check if is on a player hand and
274 * update it's contents.
275 */
276 public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5)
277 {
278 if (!par2World.isRemote)
279 {
280 MapData var6 = this.getMapData(par1ItemStack, par2World);
281
282 if (par3Entity instanceof EntityPlayer)
283 {
284 EntityPlayer var7 = (EntityPlayer)par3Entity;
285 var6.updateVisiblePlayers(var7, par1ItemStack);
286 }
287
288 if (par5)
289 {
290 this.updateMapData(par2World, par3Entity, var6);
291 }
292 }
293 }
294
295 /**
296 * Called when item is crafted/smelted. Used only by maps so far.
297 */
298 public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
299 {
300 par1ItemStack.setItemDamage(par2World.getUniqueDataId("map"));
301 String var4 = "map_" + par1ItemStack.getItemDamage();
302 MapData var5 = new MapData(var4);
303 par2World.setItemData(var4, var5);
304 var5.xCenter = MathHelper.floor_double(par3EntityPlayer.posX);
305 var5.zCenter = MathHelper.floor_double(par3EntityPlayer.posZ);
306 var5.scale = 3;
307 var5.dimension = par2World.provider.dimensionId;
308 var5.markDirty();
309 }
310
311 /**
312 * returns null if no update is to be sent
313 */
314 public Packet createMapDataPacket(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
315 {
316 byte[] var4 = this.getMapData(par1ItemStack, par2World).func_76193_a(par1ItemStack, par2World, par3EntityPlayer);
317 return var4 == null ? null : new Packet131MapData((short)Item.map.shiftedIndex, (short)par1ItemStack.getItemDamage(), var4);
318 }
319 }