package net.minecraft.world.storage; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.Iterator; import java.util.List; import java.util.Map; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S34PacketMaps; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec4b; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; public class MapData extends WorldSavedData { public int xCenter; public int zCenter; public byte dimension; public byte scale; /** colours */ public byte[] colors = new byte[16384]; /** * Holds a reference to the MapInfo of the players who own a copy of the map */ public List playersArrayList = Lists.newArrayList(); /** * Holds a reference to the players who own a copy of the map and a reference to their MapInfo */ private Map playersHashMap = Maps.newHashMap(); public Map playersVisibleOnMap = Maps.newLinkedHashMap(); private static final String __OBFID = "CL_00000577"; public MapData(String p_i2140_1_) { super(p_i2140_1_); } public void func_176054_a(double p_176054_1_, double p_176054_3_, int p_176054_5_) { int var6 = 128 * (1 << p_176054_5_); int var7 = MathHelper.floor_double((p_176054_1_ + 64.0D) / (double)var6); int var8 = MathHelper.floor_double((p_176054_3_ + 64.0D) / (double)var6); this.xCenter = var7 * var6 + var6 / 2 - 64; this.zCenter = var8 * var6 + var6 / 2 - 64; } /** * reads in data from the NBTTagCompound into this MapDataBase */ public void readFromNBT(NBTTagCompound nbt) { this.dimension = nbt.getByte("dimension"); this.xCenter = nbt.getInteger("xCenter"); this.zCenter = nbt.getInteger("zCenter"); this.scale = nbt.getByte("scale"); this.scale = (byte)MathHelper.clamp_int(this.scale, 0, 4); short var2 = nbt.getShort("width"); short var3 = nbt.getShort("height"); if (var2 == 128 && var3 == 128) { this.colors = nbt.getByteArray("colors"); } else { byte[] var4 = nbt.getByteArray("colors"); this.colors = new byte[16384]; int var5 = (128 - var2) / 2; int var6 = (128 - var3) / 2; for (int var7 = 0; var7 < var3; ++var7) { int var8 = var7 + var6; if (var8 >= 0 || var8 < 128) { for (int var9 = 0; var9 < var2; ++var9) { int var10 = var9 + var5; if (var10 >= 0 || var10 < 128) { this.colors[var10 + var8 * 128] = var4[var9 + var7 * var2]; } } } } } } /** * write data to NBTTagCompound from this MapDataBase, similar to Entities and TileEntities */ public void writeToNBT(NBTTagCompound nbt) { nbt.setByte("dimension", this.dimension); nbt.setInteger("xCenter", this.xCenter); nbt.setInteger("zCenter", this.zCenter); nbt.setByte("scale", this.scale); nbt.setShort("width", (short)128); nbt.setShort("height", (short)128); nbt.setByteArray("colors", this.colors); } /** * Adds the player passed to the list of visible players and checks to see which players are visible */ public void updateVisiblePlayers(EntityPlayer p_76191_1_, ItemStack p_76191_2_) { if (!this.playersHashMap.containsKey(p_76191_1_)) { MapData.MapInfo var3 = new MapData.MapInfo(p_76191_1_); this.playersHashMap.put(p_76191_1_, var3); this.playersArrayList.add(var3); } if (!p_76191_1_.inventory.hasItemStack(p_76191_2_)) { this.playersVisibleOnMap.remove(p_76191_1_.getName()); } for (int var6 = 0; var6 < this.playersArrayList.size(); ++var6) { MapData.MapInfo var4 = (MapData.MapInfo)this.playersArrayList.get(var6); if (!var4.entityplayerObj.isDead && (var4.entityplayerObj.inventory.hasItemStack(p_76191_2_) || p_76191_2_.isOnItemFrame())) { if (!p_76191_2_.isOnItemFrame() && var4.entityplayerObj.dimension == this.dimension) { this.func_82567_a(0, var4.entityplayerObj.worldObj, var4.entityplayerObj.getName(), var4.entityplayerObj.posX, var4.entityplayerObj.posZ, (double)var4.entityplayerObj.rotationYaw); } } else { this.playersHashMap.remove(var4.entityplayerObj); this.playersArrayList.remove(var4); } } if (p_76191_2_.isOnItemFrame()) { EntityItemFrame var7 = p_76191_2_.getItemFrame(); BlockPos var9 = var7.func_174857_n(); this.func_82567_a(1, p_76191_1_.worldObj, "frame-" + var7.getEntityId(), (double)var9.getX(), (double)var9.getZ(), (double)(var7.field_174860_b.getHorizontalIndex() * 90)); } if (p_76191_2_.hasTagCompound() && p_76191_2_.getTagCompound().hasKey("Decorations", 9)) { NBTTagList var8 = p_76191_2_.getTagCompound().getTagList("Decorations", 10); for (int var10 = 0; var10 < var8.tagCount(); ++var10) { NBTTagCompound var5 = var8.getCompoundTagAt(var10); if (!this.playersVisibleOnMap.containsKey(var5.getString("id"))) { this.func_82567_a(var5.getByte("type"), p_76191_1_.worldObj, var5.getString("id"), var5.getDouble("x"), var5.getDouble("z"), var5.getDouble("rot")); } } } } private void func_82567_a(int p_82567_1_, World worldIn, String p_82567_3_, double p_82567_4_, double p_82567_6_, double p_82567_8_) { int var10 = 1 << this.scale; float var11 = (float)(p_82567_4_ - (double)this.xCenter) / (float)var10; float var12 = (float)(p_82567_6_ - (double)this.zCenter) / (float)var10; byte var13 = (byte)((int)((double)(var11 * 2.0F) + 0.5D)); byte var14 = (byte)((int)((double)(var12 * 2.0F) + 0.5D)); byte var16 = 63; byte var15; if (var11 >= (float)(-var16) && var12 >= (float)(-var16) && var11 <= (float)var16 && var12 <= (float)var16) { p_82567_8_ += p_82567_8_ < 0.0D ? -8.0D : 8.0D; var15 = (byte)((int)(p_82567_8_ * 16.0D / 360.0D)); if (this.dimension < 0) { int var17 = (int)(worldIn.getWorldInfo().getWorldTime() / 10L); var15 = (byte)(var17 * var17 * 34187121 + var17 * 121 >> 15 & 15); } } else { if (Math.abs(var11) >= 320.0F || Math.abs(var12) >= 320.0F) { this.playersVisibleOnMap.remove(p_82567_3_); return; } p_82567_1_ = 6; var15 = 0; if (var11 <= (float)(-var16)) { var13 = (byte)((int)((double)(var16 * 2) + 2.5D)); } if (var12 <= (float)(-var16)) { var14 = (byte)((int)((double)(var16 * 2) + 2.5D)); } if (var11 >= (float)var16) { var13 = (byte)(var16 * 2 + 1); } if (var12 >= (float)var16) { var14 = (byte)(var16 * 2 + 1); } } this.playersVisibleOnMap.put(p_82567_3_, new Vec4b((byte)p_82567_1_, var13, var14, var15)); } public Packet func_176052_a(ItemStack p_176052_1_, World worldIn, EntityPlayer p_176052_3_) { MapData.MapInfo var4 = (MapData.MapInfo)this.playersHashMap.get(p_176052_3_); return var4 == null ? null : var4.func_176101_a(p_176052_1_); } public void func_176053_a(int p_176053_1_, int p_176053_2_) { super.markDirty(); Iterator var3 = this.playersArrayList.iterator(); while (var3.hasNext()) { MapData.MapInfo var4 = (MapData.MapInfo)var3.next(); var4.func_176102_a(p_176053_1_, p_176053_2_); } } public MapData.MapInfo func_82568_a(EntityPlayer p_82568_1_) { MapData.MapInfo var2 = (MapData.MapInfo)this.playersHashMap.get(p_82568_1_); if (var2 == null) { var2 = new MapData.MapInfo(p_82568_1_); this.playersHashMap.put(p_82568_1_, var2); this.playersArrayList.add(var2); } return var2; } public class MapInfo { public final EntityPlayer entityplayerObj; private boolean field_176105_d = true; private int field_176106_e = 0; private int field_176103_f = 0; private int field_176104_g = 127; private int field_176108_h = 127; private int field_176109_i; public int field_82569_d; private static final String __OBFID = "CL_00000578"; public MapInfo(EntityPlayer p_i2138_2_) { this.entityplayerObj = p_i2138_2_; } public Packet func_176101_a(ItemStack p_176101_1_) { if (this.field_176105_d) { this.field_176105_d = false; return new S34PacketMaps(p_176101_1_.getMetadata(), MapData.this.scale, MapData.this.playersVisibleOnMap.values(), MapData.this.colors, this.field_176106_e, this.field_176103_f, this.field_176104_g + 1 - this.field_176106_e, this.field_176108_h + 1 - this.field_176103_f); } else { return this.field_176109_i++ % 5 == 0 ? new S34PacketMaps(p_176101_1_.getMetadata(), MapData.this.scale, MapData.this.playersVisibleOnMap.values(), MapData.this.colors, 0, 0, 0, 0) : null; } } public void func_176102_a(int p_176102_1_, int p_176102_2_) { if (this.field_176105_d) { this.field_176106_e = Math.min(this.field_176106_e, p_176102_1_); this.field_176103_f = Math.min(this.field_176103_f, p_176102_2_); this.field_176104_g = Math.max(this.field_176104_g, p_176102_1_); this.field_176108_h = Math.max(this.field_176108_h, p_176102_2_); } else { this.field_176105_d = true; this.field_176106_e = p_176102_1_; this.field_176103_f = p_176102_2_; this.field_176104_g = p_176102_1_; this.field_176108_h = p_176102_2_; } } } }