001package net.minecraft.world.storage; 002 003import java.util.Iterator; 004import net.minecraft.entity.player.EntityPlayer; 005import net.minecraft.item.ItemStack; 006 007public class MapInfo 008{ 009 /** Reference for EntityPlayer object in MapInfo */ 010 public final EntityPlayer entityplayerObj; 011 public int[] field_76209_b; 012 public int[] field_76210_c; 013 014 /** 015 * updated by x = mod(x*11,128) +1 x-1 is used to index field_76209_b and field_76210_c 016 */ 017 private int currentRandomNumber; 018 private int ticksUntilPlayerLocationMapUpdate; 019 020 /** 021 * a cache of the result from getPlayersOnMap so that it is not resent when nothing changes 022 */ 023 private byte[] lastPlayerLocationOnMap; 024 public int field_82569_d; 025 private boolean field_82570_i; 026 027 /** reference in MapInfo to MapData object */ 028 final MapData mapDataObj; 029 030 public MapInfo(MapData par1MapData, EntityPlayer par2EntityPlayer) 031 { 032 this.mapDataObj = par1MapData; 033 this.field_76209_b = new int[128]; 034 this.field_76210_c = new int[128]; 035 this.currentRandomNumber = 0; 036 this.ticksUntilPlayerLocationMapUpdate = 0; 037 this.field_82570_i = false; 038 this.entityplayerObj = par2EntityPlayer; 039 040 for (int i = 0; i < this.field_76209_b.length; ++i) 041 { 042 this.field_76209_b[i] = 0; 043 this.field_76210_c[i] = 127; 044 } 045 } 046 047 /** 048 * returns a 1+players*3 array, of x,y, and color . the name of this function may be partially wrong, as there is a 049 * second branch to the code here 050 */ 051 public byte[] getPlayersOnMap(ItemStack par1ItemStack) 052 { 053 byte[] abyte; 054 055 if (!this.field_82570_i) 056 { 057 abyte = new byte[] {(byte)2, this.mapDataObj.scale}; 058 this.field_82570_i = true; 059 return abyte; 060 } 061 else 062 { 063 int i; 064 int j; 065 066 if (--this.ticksUntilPlayerLocationMapUpdate < 0) 067 { 068 this.ticksUntilPlayerLocationMapUpdate = 4; 069 abyte = new byte[this.mapDataObj.playersVisibleOnMap.size() * 3 + 1]; 070 abyte[0] = 1; 071 i = 0; 072 073 for (Iterator iterator = this.mapDataObj.playersVisibleOnMap.values().iterator(); iterator.hasNext(); ++i) 074 { 075 MapCoord mapcoord = (MapCoord)iterator.next(); 076 abyte[i * 3 + 1] = (byte)(mapcoord.iconSize << 4 | mapcoord.iconRotation & 15); 077 abyte[i * 3 + 2] = mapcoord.centerX; 078 abyte[i * 3 + 3] = mapcoord.centerZ; 079 } 080 081 boolean flag = !par1ItemStack.isOnItemFrame(); 082 083 if (this.lastPlayerLocationOnMap != null && this.lastPlayerLocationOnMap.length == abyte.length) 084 { 085 for (j = 0; j < abyte.length; ++j) 086 { 087 if (abyte[j] != this.lastPlayerLocationOnMap[j]) 088 { 089 flag = false; 090 break; 091 } 092 } 093 } 094 else 095 { 096 flag = false; 097 } 098 099 if (!flag) 100 { 101 this.lastPlayerLocationOnMap = abyte; 102 return abyte; 103 } 104 } 105 106 for (int k = 0; k < 1; ++k) 107 { 108 i = this.currentRandomNumber++ * 11 % 128; 109 110 if (this.field_76209_b[i] >= 0) 111 { 112 int l = this.field_76210_c[i] - this.field_76209_b[i] + 1; 113 j = this.field_76209_b[i]; 114 byte[] abyte1 = new byte[l + 3]; 115 abyte1[0] = 0; 116 abyte1[1] = (byte)i; 117 abyte1[2] = (byte)j; 118 119 for (int i1 = 0; i1 < abyte1.length - 3; ++i1) 120 { 121 abyte1[i1 + 3] = this.mapDataObj.colors[(i1 + j) * 128 + i]; 122 } 123 124 this.field_76210_c[i] = -1; 125 this.field_76209_b[i] = -1; 126 return abyte1; 127 } 128 } 129 130 return null; 131 } 132 } 133}