001 package net.minecraft.client.multiplayer;
002
003 import cpw.mods.fml.common.network.FMLNetworkHandler;
004 import cpw.mods.fml.relauncher.Side;
005 import cpw.mods.fml.relauncher.SideOnly;
006 import java.io.BufferedReader;
007 import java.io.ByteArrayInputStream;
008 import java.io.DataInputStream;
009 import java.io.IOException;
010 import java.io.InputStreamReader;
011 import java.math.BigInteger;
012 import java.net.InetAddress;
013 import java.net.Socket;
014 import java.net.URL;
015 import java.net.URLEncoder;
016 import java.security.PublicKey;
017 import java.util.ArrayList;
018 import java.util.HashMap;
019 import java.util.List;
020 import java.util.Map;
021 import java.util.Random;
022 import javax.crypto.SecretKey;
023 import net.minecraft.client.Minecraft;
024 import net.minecraft.client.entity.EntityClientPlayerMP;
025 import net.minecraft.client.entity.EntityOtherPlayerMP;
026 import net.minecraft.client.gui.GuiChat;
027 import net.minecraft.client.gui.GuiDisconnected;
028 import net.minecraft.client.gui.GuiDownloadTerrain;
029 import net.minecraft.client.gui.GuiMerchant;
030 import net.minecraft.client.gui.GuiPlayerInfo;
031 import net.minecraft.client.gui.GuiScreen;
032 import net.minecraft.client.gui.GuiScreenDemo;
033 import net.minecraft.client.gui.GuiWinGame;
034 import net.minecraft.client.gui.GuiYesNo;
035 import net.minecraft.client.gui.inventory.GuiContainerCreative;
036 import net.minecraft.client.particle.EntityCrit2FX;
037 import net.minecraft.client.particle.EntityPickupFX;
038 import net.minecraft.client.settings.GameSettings;
039 import net.minecraft.creativetab.CreativeTabs;
040 import net.minecraft.entity.Entity;
041 import net.minecraft.entity.EntityList;
042 import net.minecraft.entity.EntityLiving;
043 import net.minecraft.entity.IMerchant;
044 import net.minecraft.entity.NpcMerchant;
045 import net.minecraft.entity.effect.EntityLightningBolt;
046 import net.minecraft.entity.item.EntityBoat;
047 import net.minecraft.entity.item.EntityEnderCrystal;
048 import net.minecraft.entity.item.EntityEnderEye;
049 import net.minecraft.entity.item.EntityEnderPearl;
050 import net.minecraft.entity.item.EntityExpBottle;
051 import net.minecraft.entity.item.EntityFallingSand;
052 import net.minecraft.entity.item.EntityFireworkRocket;
053 import net.minecraft.entity.item.EntityItem;
054 import net.minecraft.entity.item.EntityItemFrame;
055 import net.minecraft.entity.item.EntityMinecart;
056 import net.minecraft.entity.item.EntityPainting;
057 import net.minecraft.entity.item.EntityTNTPrimed;
058 import net.minecraft.entity.item.EntityXPOrb;
059 import net.minecraft.entity.player.EntityPlayer;
060 import net.minecraft.entity.player.InventoryPlayer;
061 import net.minecraft.entity.projectile.EntityArrow;
062 import net.minecraft.entity.projectile.EntityEgg;
063 import net.minecraft.entity.projectile.EntityFishHook;
064 import net.minecraft.entity.projectile.EntityLargeFireball;
065 import net.minecraft.entity.projectile.EntityPotion;
066 import net.minecraft.entity.projectile.EntitySmallFireball;
067 import net.minecraft.entity.projectile.EntitySnowball;
068 import net.minecraft.entity.projectile.EntityWitherSkull;
069 import net.minecraft.inventory.Container;
070 import net.minecraft.inventory.InventoryBasic;
071 import net.minecraft.item.Item;
072 import net.minecraft.item.ItemMap;
073 import net.minecraft.item.ItemStack;
074 import net.minecraft.network.INetworkManager;
075 import net.minecraft.network.MemoryConnection;
076 import net.minecraft.network.TcpConnection;
077 import net.minecraft.network.packet.NetHandler;
078 import net.minecraft.network.packet.Packet;
079 import net.minecraft.network.packet.Packet0KeepAlive;
080 import net.minecraft.network.packet.Packet100OpenWindow;
081 import net.minecraft.network.packet.Packet101CloseWindow;
082 import net.minecraft.network.packet.Packet103SetSlot;
083 import net.minecraft.network.packet.Packet104WindowItems;
084 import net.minecraft.network.packet.Packet105UpdateProgressbar;
085 import net.minecraft.network.packet.Packet106Transaction;
086 import net.minecraft.network.packet.Packet10Flying;
087 import net.minecraft.network.packet.Packet130UpdateSign;
088 import net.minecraft.network.packet.Packet131MapData;
089 import net.minecraft.network.packet.Packet132TileEntityData;
090 import net.minecraft.network.packet.Packet16BlockItemSwitch;
091 import net.minecraft.network.packet.Packet17Sleep;
092 import net.minecraft.network.packet.Packet18Animation;
093 import net.minecraft.network.packet.Packet1Login;
094 import net.minecraft.network.packet.Packet200Statistic;
095 import net.minecraft.network.packet.Packet201PlayerInfo;
096 import net.minecraft.network.packet.Packet202PlayerAbilities;
097 import net.minecraft.network.packet.Packet203AutoComplete;
098 import net.minecraft.network.packet.Packet205ClientCommand;
099 import net.minecraft.network.packet.Packet20NamedEntitySpawn;
100 import net.minecraft.network.packet.Packet22Collect;
101 import net.minecraft.network.packet.Packet23VehicleSpawn;
102 import net.minecraft.network.packet.Packet24MobSpawn;
103 import net.minecraft.network.packet.Packet250CustomPayload;
104 import net.minecraft.network.packet.Packet252SharedKey;
105 import net.minecraft.network.packet.Packet253ServerAuthData;
106 import net.minecraft.network.packet.Packet255KickDisconnect;
107 import net.minecraft.network.packet.Packet25EntityPainting;
108 import net.minecraft.network.packet.Packet26EntityExpOrb;
109 import net.minecraft.network.packet.Packet28EntityVelocity;
110 import net.minecraft.network.packet.Packet29DestroyEntity;
111 import net.minecraft.network.packet.Packet30Entity;
112 import net.minecraft.network.packet.Packet34EntityTeleport;
113 import net.minecraft.network.packet.Packet35EntityHeadRotation;
114 import net.minecraft.network.packet.Packet38EntityStatus;
115 import net.minecraft.network.packet.Packet39AttachEntity;
116 import net.minecraft.network.packet.Packet3Chat;
117 import net.minecraft.network.packet.Packet40EntityMetadata;
118 import net.minecraft.network.packet.Packet41EntityEffect;
119 import net.minecraft.network.packet.Packet42RemoveEntityEffect;
120 import net.minecraft.network.packet.Packet43Experience;
121 import net.minecraft.network.packet.Packet4UpdateTime;
122 import net.minecraft.network.packet.Packet51MapChunk;
123 import net.minecraft.network.packet.Packet52MultiBlockChange;
124 import net.minecraft.network.packet.Packet53BlockChange;
125 import net.minecraft.network.packet.Packet54PlayNoteBlock;
126 import net.minecraft.network.packet.Packet55BlockDestroy;
127 import net.minecraft.network.packet.Packet56MapChunks;
128 import net.minecraft.network.packet.Packet5PlayerInventory;
129 import net.minecraft.network.packet.Packet60Explosion;
130 import net.minecraft.network.packet.Packet61DoorChange;
131 import net.minecraft.network.packet.Packet62LevelSound;
132 import net.minecraft.network.packet.Packet6SpawnPosition;
133 import net.minecraft.network.packet.Packet70GameEvent;
134 import net.minecraft.network.packet.Packet71Weather;
135 import net.minecraft.network.packet.Packet8UpdateHealth;
136 import net.minecraft.network.packet.Packet9Respawn;
137 import net.minecraft.potion.PotionEffect;
138 import net.minecraft.server.integrated.IntegratedServer;
139 import net.minecraft.stats.StatList;
140 import net.minecraft.tileentity.TileEntity;
141 import net.minecraft.tileentity.TileEntityBeacon;
142 import net.minecraft.tileentity.TileEntityBrewingStand;
143 import net.minecraft.tileentity.TileEntityCommandBlock;
144 import net.minecraft.tileentity.TileEntityDispenser;
145 import net.minecraft.tileentity.TileEntityFurnace;
146 import net.minecraft.tileentity.TileEntityMobSpawner;
147 import net.minecraft.tileentity.TileEntitySign;
148 import net.minecraft.tileentity.TileEntitySkull;
149 import net.minecraft.util.ChunkCoordinates;
150 import net.minecraft.util.CryptManager;
151 import net.minecraft.util.MathHelper;
152 import net.minecraft.util.StringTranslate;
153 import net.minecraft.village.MerchantRecipeList;
154 import net.minecraft.world.EnumGameType;
155 import net.minecraft.world.Explosion;
156 import net.minecraft.world.WorldProviderSurface;
157 import net.minecraft.world.WorldSettings;
158 import net.minecraft.world.chunk.Chunk;
159 import net.minecraft.world.storage.ISaveHandler;
160 import net.minecraft.world.storage.MapStorage;
161 import org.lwjgl.input.Keyboard;
162
163 import net.minecraftforge.client.ForgeHooksClient;
164 import net.minecraftforge.client.event.ClientChatReceivedEvent;
165 import net.minecraftforge.common.ForgeHooks;
166 import net.minecraftforge.common.MinecraftForge;
167
168 @SideOnly(Side.CLIENT)
169 public class NetClientHandler extends NetHandler
170 {
171 /** True if kicked or disconnected from the server. */
172 private boolean disconnected = false;
173
174 /** Reference to the NetworkManager object. */
175 private INetworkManager netManager;
176 public String field_72560_a;
177
178 /** Reference to the Minecraft object. */
179 private Minecraft mc;
180 private WorldClient worldClient;
181
182 /**
183 * True if the client has finished downloading terrain and may spawn. Set upon receipt of a player position packet,
184 * reset upon respawning.
185 */
186 private boolean doneLoadingTerrain = false;
187 public MapStorage mapStorage = new MapStorage((ISaveHandler)null);
188
189 /** A HashMap of all player names and their player information objects */
190 private Map playerInfoMap = new HashMap();
191
192 /**
193 * An ArrayList of GuiPlayerInfo (includes all the players' GuiPlayerInfo on the current server)
194 */
195 public List playerInfoList = new ArrayList();
196 public int currentServerMaxPlayers = 20;
197
198 /** RNG. */
199 Random rand = new Random();
200
201 private static byte connectionCompatibilityLevel;
202
203 public NetClientHandler(Minecraft par1Minecraft, String par2Str, int par3) throws IOException
204 {
205 this.mc = par1Minecraft;
206 Socket var4 = new Socket(InetAddress.getByName(par2Str), par3);
207 this.netManager = new TcpConnection(var4, "Client", this);
208 FMLNetworkHandler.onClientConnectionToRemoteServer(this, par2Str, par3, this.netManager);
209 }
210
211 public NetClientHandler(Minecraft par1Minecraft, IntegratedServer par2IntegratedServer) throws IOException
212 {
213 this.mc = par1Minecraft;
214 this.netManager = new MemoryConnection(this);
215 par2IntegratedServer.getServerListeningThread().func_71754_a((MemoryConnection)this.netManager, par1Minecraft.session.username);
216 FMLNetworkHandler.onClientConnectionToIntegratedServer(this, par2IntegratedServer, this.netManager);
217 }
218
219 /**
220 * sets netManager and worldClient to null
221 */
222 public void cleanup()
223 {
224 if (this.netManager != null)
225 {
226 this.netManager.wakeThreads();
227 }
228
229 this.netManager = null;
230 this.worldClient = null;
231 }
232
233 /**
234 * Processes the packets that have been read since the last call to this function.
235 */
236 public void processReadPackets()
237 {
238 if (!this.disconnected && this.netManager != null)
239 {
240 this.netManager.processReadPackets();
241 }
242
243 if (this.netManager != null)
244 {
245 this.netManager.wakeThreads();
246 }
247 }
248
249 public void handleServerAuthData(Packet253ServerAuthData par1Packet253ServerAuthData)
250 {
251 String var2 = par1Packet253ServerAuthData.getServerId().trim();
252 PublicKey var3 = par1Packet253ServerAuthData.getPublicKey();
253 SecretKey var4 = CryptManager.createNewSharedKey();
254
255 if (!"-".equals(var2))
256 {
257 String var5 = (new BigInteger(CryptManager.getServerIdHash(var2, var3, var4))).toString(16);
258 String var6 = this.sendSessionRequest(this.mc.session.username, this.mc.session.sessionId, var5);
259
260 if (!"ok".equalsIgnoreCase(var6))
261 {
262 this.netManager.networkShutdown("disconnect.loginFailedInfo", new Object[] {var6});
263 return;
264 }
265 }
266
267 this.addToSendQueue(new Packet252SharedKey(var4, var3, par1Packet253ServerAuthData.getVerifyToken()));
268 }
269
270 /**
271 * Send request to http://session.minecraft.net with user's sessionId and serverId hash
272 */
273 private String sendSessionRequest(String par1Str, String par2Str, String par3Str)
274 {
275 try
276 {
277 URL var4 = new URL("http://session.minecraft.net/game/joinserver.jsp?user=" + urlEncode(par1Str) + "&sessionId=" + urlEncode(par2Str) + "&serverId=" + urlEncode(par3Str));
278 BufferedReader var5 = new BufferedReader(new InputStreamReader(var4.openStream()));
279 String var6 = var5.readLine();
280 var5.close();
281 return var6;
282 }
283 catch (IOException var7)
284 {
285 return var7.toString();
286 }
287 }
288
289 /**
290 * Encode the given string for insertion into a URL
291 */
292 private static String urlEncode(String par0Str) throws IOException
293 {
294 return URLEncoder.encode(par0Str, "UTF-8");
295 }
296
297 public void handleSharedKey(Packet252SharedKey par1Packet252SharedKey)
298 {
299 this.addToSendQueue(FMLNetworkHandler.getFMLFakeLoginPacket());
300 this.addToSendQueue(new Packet205ClientCommand(0));
301 }
302
303 public void handleLogin(Packet1Login par1Packet1Login)
304 {
305 this.mc.playerController = new PlayerControllerMP(this.mc, this);
306 this.mc.statFileWriter.readStat(StatList.joinMultiplayerStat, 1);
307 this.worldClient = new WorldClient(this, new WorldSettings(0L, par1Packet1Login.gameType, false, par1Packet1Login.hardcoreMode, par1Packet1Login.terrainType), par1Packet1Login.dimension, par1Packet1Login.difficultySetting, this.mc.mcProfiler);
308 this.worldClient.isRemote = true;
309 this.mc.loadWorld(this.worldClient);
310 this.mc.thePlayer.dimension = par1Packet1Login.dimension;
311 this.mc.displayGuiScreen(new GuiDownloadTerrain(this));
312 this.mc.thePlayer.entityId = par1Packet1Login.clientEntityId;
313 this.currentServerMaxPlayers = par1Packet1Login.maxPlayers;
314 this.mc.playerController.setGameType(par1Packet1Login.gameType);
315 FMLNetworkHandler.onConnectionEstablishedToServer(this, netManager, par1Packet1Login);
316 this.mc.gameSettings.sendSettingsToServer();
317 }
318
319 public void handleVehicleSpawn(Packet23VehicleSpawn par1Packet23VehicleSpawn)
320 {
321 double var2 = (double)par1Packet23VehicleSpawn.xPosition / 32.0D;
322 double var4 = (double)par1Packet23VehicleSpawn.yPosition / 32.0D;
323 double var6 = (double)par1Packet23VehicleSpawn.zPosition / 32.0D;
324 Object var8 = null;
325
326 if (par1Packet23VehicleSpawn.type == 10)
327 {
328 var8 = new EntityMinecart(this.worldClient, var2, var4, var6, 0);
329 }
330 else if (par1Packet23VehicleSpawn.type == 11)
331 {
332 var8 = new EntityMinecart(this.worldClient, var2, var4, var6, 1);
333 }
334 else if (par1Packet23VehicleSpawn.type == 12)
335 {
336 var8 = new EntityMinecart(this.worldClient, var2, var4, var6, 2);
337 }
338 else if (par1Packet23VehicleSpawn.type == 90)
339 {
340 Entity var9 = this.getEntityByID(par1Packet23VehicleSpawn.throwerEntityId);
341
342 if (var9 instanceof EntityPlayer)
343 {
344 var8 = new EntityFishHook(this.worldClient, var2, var4, var6, (EntityPlayer)var9);
345 }
346
347 par1Packet23VehicleSpawn.throwerEntityId = 0;
348 }
349 else if (par1Packet23VehicleSpawn.type == 60)
350 {
351 var8 = new EntityArrow(this.worldClient, var2, var4, var6);
352 }
353 else if (par1Packet23VehicleSpawn.type == 61)
354 {
355 var8 = new EntitySnowball(this.worldClient, var2, var4, var6);
356 }
357 else if (par1Packet23VehicleSpawn.type == 71)
358 {
359 var8 = new EntityItemFrame(this.worldClient, (int)var2, (int)var4, (int)var6, par1Packet23VehicleSpawn.throwerEntityId);
360 par1Packet23VehicleSpawn.throwerEntityId = 0;
361 }
362 else if (par1Packet23VehicleSpawn.type == 65)
363 {
364 var8 = new EntityEnderPearl(this.worldClient, var2, var4, var6);
365 }
366 else if (par1Packet23VehicleSpawn.type == 72)
367 {
368 var8 = new EntityEnderEye(this.worldClient, var2, var4, var6);
369 }
370 else if (par1Packet23VehicleSpawn.type == 76)
371 {
372 var8 = new EntityFireworkRocket(this.worldClient, var2, var4, var6, (ItemStack)null);
373 }
374 else if (par1Packet23VehicleSpawn.type == 63)
375 {
376 var8 = new EntityLargeFireball(this.worldClient, var2, var4, var6, (double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D);
377 par1Packet23VehicleSpawn.throwerEntityId = 0;
378 }
379 else if (par1Packet23VehicleSpawn.type == 64)
380 {
381 var8 = new EntitySmallFireball(this.worldClient, var2, var4, var6, (double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D);
382 par1Packet23VehicleSpawn.throwerEntityId = 0;
383 }
384 else if (par1Packet23VehicleSpawn.type == 66)
385 {
386 var8 = new EntityWitherSkull(this.worldClient, var2, var4, var6, (double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D);
387 par1Packet23VehicleSpawn.throwerEntityId = 0;
388 }
389 else if (par1Packet23VehicleSpawn.type == 62)
390 {
391 var8 = new EntityEgg(this.worldClient, var2, var4, var6);
392 }
393 else if (par1Packet23VehicleSpawn.type == 73)
394 {
395 var8 = new EntityPotion(this.worldClient, var2, var4, var6, par1Packet23VehicleSpawn.throwerEntityId);
396 par1Packet23VehicleSpawn.throwerEntityId = 0;
397 }
398 else if (par1Packet23VehicleSpawn.type == 75)
399 {
400 var8 = new EntityExpBottle(this.worldClient, var2, var4, var6);
401 par1Packet23VehicleSpawn.throwerEntityId = 0;
402 }
403 else if (par1Packet23VehicleSpawn.type == 1)
404 {
405 var8 = new EntityBoat(this.worldClient, var2, var4, var6);
406 }
407 else if (par1Packet23VehicleSpawn.type == 50)
408 {
409 var8 = new EntityTNTPrimed(this.worldClient, var2, var4, var6);
410 }
411 else if (par1Packet23VehicleSpawn.type == 51)
412 {
413 var8 = new EntityEnderCrystal(this.worldClient, var2, var4, var6);
414 }
415 else if (par1Packet23VehicleSpawn.type == 2)
416 {
417 var8 = new EntityItem(this.worldClient, var2, var4, var6);
418 }
419 else if (par1Packet23VehicleSpawn.type == 70)
420 {
421 var8 = new EntityFallingSand(this.worldClient, var2, var4, var6, par1Packet23VehicleSpawn.throwerEntityId & 65535, par1Packet23VehicleSpawn.throwerEntityId >> 16);
422 par1Packet23VehicleSpawn.throwerEntityId = 0;
423 }
424
425 if (var8 != null)
426 {
427 ((Entity)var8).serverPosX = par1Packet23VehicleSpawn.xPosition;
428 ((Entity)var8).serverPosY = par1Packet23VehicleSpawn.yPosition;
429 ((Entity)var8).serverPosZ = par1Packet23VehicleSpawn.zPosition;
430 ((Entity)var8).rotationPitch = (float)(par1Packet23VehicleSpawn.field_92025_h * 360) / 256.0F;
431 ((Entity)var8).rotationYaw = (float)(par1Packet23VehicleSpawn.field_92026_i * 360) / 256.0F;
432 Entity[] var12 = ((Entity)var8).getParts();
433
434 if (var12 != null)
435 {
436 int var10 = par1Packet23VehicleSpawn.entityId - ((Entity)var8).entityId;
437
438 for (int var11 = 0; var11 < var12.length; ++var11)
439 {
440 var12[var11].entityId += var10;
441 }
442 }
443
444 ((Entity)var8).entityId = par1Packet23VehicleSpawn.entityId;
445 this.worldClient.addEntityToWorld(par1Packet23VehicleSpawn.entityId, (Entity)var8);
446
447 if (par1Packet23VehicleSpawn.throwerEntityId > 0)
448 {
449 if (par1Packet23VehicleSpawn.type == 60)
450 {
451 Entity var13 = this.getEntityByID(par1Packet23VehicleSpawn.throwerEntityId);
452
453 if (var13 instanceof EntityLiving)
454 {
455 EntityArrow var14 = (EntityArrow)var8;
456 var14.shootingEntity = var13;
457 }
458 }
459
460 ((Entity)var8).setVelocity((double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D);
461 }
462 }
463 }
464
465 /**
466 * Handle a entity experience orb packet.
467 */
468 public void handleEntityExpOrb(Packet26EntityExpOrb par1Packet26EntityExpOrb)
469 {
470 EntityXPOrb var2 = new EntityXPOrb(this.worldClient, (double)par1Packet26EntityExpOrb.posX, (double)par1Packet26EntityExpOrb.posY, (double)par1Packet26EntityExpOrb.posZ, par1Packet26EntityExpOrb.xpValue);
471 var2.serverPosX = par1Packet26EntityExpOrb.posX;
472 var2.serverPosY = par1Packet26EntityExpOrb.posY;
473 var2.serverPosZ = par1Packet26EntityExpOrb.posZ;
474 var2.rotationYaw = 0.0F;
475 var2.rotationPitch = 0.0F;
476 var2.entityId = par1Packet26EntityExpOrb.entityId;
477 this.worldClient.addEntityToWorld(par1Packet26EntityExpOrb.entityId, var2);
478 }
479
480 /**
481 * Handles weather packet
482 */
483 public void handleWeather(Packet71Weather par1Packet71Weather)
484 {
485 double var2 = (double)par1Packet71Weather.posX / 32.0D;
486 double var4 = (double)par1Packet71Weather.posY / 32.0D;
487 double var6 = (double)par1Packet71Weather.posZ / 32.0D;
488 EntityLightningBolt var8 = null;
489
490 if (par1Packet71Weather.isLightningBolt == 1)
491 {
492 var8 = new EntityLightningBolt(this.worldClient, var2, var4, var6);
493 }
494
495 if (var8 != null)
496 {
497 var8.serverPosX = par1Packet71Weather.posX;
498 var8.serverPosY = par1Packet71Weather.posY;
499 var8.serverPosZ = par1Packet71Weather.posZ;
500 var8.rotationYaw = 0.0F;
501 var8.rotationPitch = 0.0F;
502 var8.entityId = par1Packet71Weather.entityID;
503 this.worldClient.addWeatherEffect(var8);
504 }
505 }
506
507 /**
508 * Packet handler
509 */
510 public void handleEntityPainting(Packet25EntityPainting par1Packet25EntityPainting)
511 {
512 EntityPainting var2 = new EntityPainting(this.worldClient, par1Packet25EntityPainting.xPosition, par1Packet25EntityPainting.yPosition, par1Packet25EntityPainting.zPosition, par1Packet25EntityPainting.direction, par1Packet25EntityPainting.title);
513 this.worldClient.addEntityToWorld(par1Packet25EntityPainting.entityId, var2);
514 }
515
516 /**
517 * Packet handler
518 */
519 public void handleEntityVelocity(Packet28EntityVelocity par1Packet28EntityVelocity)
520 {
521 Entity var2 = this.getEntityByID(par1Packet28EntityVelocity.entityId);
522
523 if (var2 != null)
524 {
525 var2.setVelocity((double)par1Packet28EntityVelocity.motionX / 8000.0D, (double)par1Packet28EntityVelocity.motionY / 8000.0D, (double)par1Packet28EntityVelocity.motionZ / 8000.0D);
526 }
527 }
528
529 /**
530 * Packet handler
531 */
532 public void handleEntityMetadata(Packet40EntityMetadata par1Packet40EntityMetadata)
533 {
534 Entity var2 = this.getEntityByID(par1Packet40EntityMetadata.entityId);
535
536 if (var2 != null && par1Packet40EntityMetadata.getMetadata() != null)
537 {
538 var2.getDataWatcher().updateWatchedObjectsFromList(par1Packet40EntityMetadata.getMetadata());
539 }
540 }
541
542 public void handleNamedEntitySpawn(Packet20NamedEntitySpawn par1Packet20NamedEntitySpawn)
543 {
544 double var2 = (double)par1Packet20NamedEntitySpawn.xPosition / 32.0D;
545 double var4 = (double)par1Packet20NamedEntitySpawn.yPosition / 32.0D;
546 double var6 = (double)par1Packet20NamedEntitySpawn.zPosition / 32.0D;
547 float var8 = (float)(par1Packet20NamedEntitySpawn.rotation * 360) / 256.0F;
548 float var9 = (float)(par1Packet20NamedEntitySpawn.pitch * 360) / 256.0F;
549 EntityOtherPlayerMP var10 = new EntityOtherPlayerMP(this.mc.theWorld, par1Packet20NamedEntitySpawn.name);
550 var10.prevPosX = var10.lastTickPosX = (double)(var10.serverPosX = par1Packet20NamedEntitySpawn.xPosition);
551 var10.prevPosY = var10.lastTickPosY = (double)(var10.serverPosY = par1Packet20NamedEntitySpawn.yPosition);
552 var10.prevPosZ = var10.lastTickPosZ = (double)(var10.serverPosZ = par1Packet20NamedEntitySpawn.zPosition);
553 int var11 = par1Packet20NamedEntitySpawn.currentItem;
554
555 if (var11 == 0)
556 {
557 var10.inventory.mainInventory[var10.inventory.currentItem] = null;
558 }
559 else
560 {
561 var10.inventory.mainInventory[var10.inventory.currentItem] = new ItemStack(var11, 1, 0);
562 }
563
564 var10.setPositionAndRotation(var2, var4, var6, var8, var9);
565 this.worldClient.addEntityToWorld(par1Packet20NamedEntitySpawn.entityId, var10);
566 List var12 = par1Packet20NamedEntitySpawn.func_73509_c();
567
568 if (var12 != null)
569 {
570 var10.getDataWatcher().updateWatchedObjectsFromList(var12);
571 }
572 }
573
574 public void handleEntityTeleport(Packet34EntityTeleport par1Packet34EntityTeleport)
575 {
576 Entity var2 = this.getEntityByID(par1Packet34EntityTeleport.entityId);
577
578 if (var2 != null)
579 {
580 var2.serverPosX = par1Packet34EntityTeleport.xPosition;
581 var2.serverPosY = par1Packet34EntityTeleport.yPosition;
582 var2.serverPosZ = par1Packet34EntityTeleport.zPosition;
583 double var3 = (double)var2.serverPosX / 32.0D;
584 double var5 = (double)var2.serverPosY / 32.0D + 0.015625D;
585 double var7 = (double)var2.serverPosZ / 32.0D;
586 float var9 = (float)(par1Packet34EntityTeleport.yaw * 360) / 256.0F;
587 float var10 = (float)(par1Packet34EntityTeleport.pitch * 360) / 256.0F;
588 var2.setPositionAndRotation2(var3, var5, var7, var9, var10, 3);
589 }
590 }
591
592 public void handleBlockItemSwitch(Packet16BlockItemSwitch par1Packet16BlockItemSwitch)
593 {
594 if (par1Packet16BlockItemSwitch.id >= 0 && par1Packet16BlockItemSwitch.id < InventoryPlayer.getHotbarSize())
595 {
596 this.mc.thePlayer.inventory.currentItem = par1Packet16BlockItemSwitch.id;
597 }
598 }
599
600 public void handleEntity(Packet30Entity par1Packet30Entity)
601 {
602 Entity var2 = this.getEntityByID(par1Packet30Entity.entityId);
603
604 if (var2 != null)
605 {
606 var2.serverPosX += par1Packet30Entity.xPosition;
607 var2.serverPosY += par1Packet30Entity.yPosition;
608 var2.serverPosZ += par1Packet30Entity.zPosition;
609 double var3 = (double)var2.serverPosX / 32.0D;
610 double var5 = (double)var2.serverPosY / 32.0D;
611 double var7 = (double)var2.serverPosZ / 32.0D;
612 float var9 = par1Packet30Entity.rotating ? (float)(par1Packet30Entity.yaw * 360) / 256.0F : var2.rotationYaw;
613 float var10 = par1Packet30Entity.rotating ? (float)(par1Packet30Entity.pitch * 360) / 256.0F : var2.rotationPitch;
614 var2.setPositionAndRotation2(var3, var5, var7, var9, var10, 3);
615 }
616 }
617
618 public void handleEntityHeadRotation(Packet35EntityHeadRotation par1Packet35EntityHeadRotation)
619 {
620 Entity var2 = this.getEntityByID(par1Packet35EntityHeadRotation.entityId);
621
622 if (var2 != null)
623 {
624 float var3 = (float)(par1Packet35EntityHeadRotation.headRotationYaw * 360) / 256.0F;
625 var2.setHeadRotationYaw(var3);
626 }
627 }
628
629 public void handleDestroyEntity(Packet29DestroyEntity par1Packet29DestroyEntity)
630 {
631 for (int var2 = 0; var2 < par1Packet29DestroyEntity.entityId.length; ++var2)
632 {
633 this.worldClient.removeEntityFromWorld(par1Packet29DestroyEntity.entityId[var2]);
634 }
635 }
636
637 public void handleFlying(Packet10Flying par1Packet10Flying)
638 {
639 EntityClientPlayerMP var2 = this.mc.thePlayer;
640 double var3 = var2.posX;
641 double var5 = var2.posY;
642 double var7 = var2.posZ;
643 float var9 = var2.rotationYaw;
644 float var10 = var2.rotationPitch;
645
646 if (par1Packet10Flying.moving)
647 {
648 var3 = par1Packet10Flying.xPosition;
649 var5 = par1Packet10Flying.yPosition;
650 var7 = par1Packet10Flying.zPosition;
651 }
652
653 if (par1Packet10Flying.rotating)
654 {
655 var9 = par1Packet10Flying.yaw;
656 var10 = par1Packet10Flying.pitch;
657 }
658
659 var2.ySize = 0.0F;
660 var2.motionX = var2.motionY = var2.motionZ = 0.0D;
661 var2.setPositionAndRotation(var3, var5, var7, var9, var10);
662 par1Packet10Flying.xPosition = var2.posX;
663 par1Packet10Flying.yPosition = var2.boundingBox.minY;
664 par1Packet10Flying.zPosition = var2.posZ;
665 par1Packet10Flying.stance = var2.posY;
666 this.netManager.addToSendQueue(par1Packet10Flying);
667
668 if (!this.doneLoadingTerrain)
669 {
670 this.mc.thePlayer.prevPosX = this.mc.thePlayer.posX;
671 this.mc.thePlayer.prevPosY = this.mc.thePlayer.posY;
672 this.mc.thePlayer.prevPosZ = this.mc.thePlayer.posZ;
673 this.doneLoadingTerrain = true;
674 this.mc.displayGuiScreen((GuiScreen)null);
675 }
676 }
677
678 public void handleMultiBlockChange(Packet52MultiBlockChange par1Packet52MultiBlockChange)
679 {
680 int var2 = par1Packet52MultiBlockChange.xPosition * 16;
681 int var3 = par1Packet52MultiBlockChange.zPosition * 16;
682
683 if (par1Packet52MultiBlockChange.metadataArray != null)
684 {
685 DataInputStream var4 = new DataInputStream(new ByteArrayInputStream(par1Packet52MultiBlockChange.metadataArray));
686
687 try
688 {
689 for (int var5 = 0; var5 < par1Packet52MultiBlockChange.size; ++var5)
690 {
691 short var6 = var4.readShort();
692 short var7 = var4.readShort();
693 int var8 = var7 >> 4 & 4095;
694 int var9 = var7 & 15;
695 int var10 = var6 >> 12 & 15;
696 int var11 = var6 >> 8 & 15;
697 int var12 = var6 & 255;
698 this.worldClient.setBlockAndMetadataAndInvalidate(var10 + var2, var12, var11 + var3, var8, var9);
699 }
700 }
701 catch (IOException var13)
702 {
703 ;
704 }
705 }
706 }
707
708 /**
709 * Handle Packet51MapChunk (full chunk update of blocks, metadata, light levels, and optionally biome data)
710 */
711 public void handleMapChunk(Packet51MapChunk par1Packet51MapChunk)
712 {
713 if (par1Packet51MapChunk.includeInitialize)
714 {
715 if (par1Packet51MapChunk.yChMin == 0)
716 {
717 this.worldClient.doPreChunk(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh, false);
718 return;
719 }
720
721 this.worldClient.doPreChunk(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh, true);
722 }
723
724 this.worldClient.invalidateBlockReceiveRegion(par1Packet51MapChunk.xCh << 4, 0, par1Packet51MapChunk.zCh << 4, (par1Packet51MapChunk.xCh << 4) + 15, 256, (par1Packet51MapChunk.zCh << 4) + 15);
725 Chunk var2 = this.worldClient.getChunkFromChunkCoords(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh);
726
727 if (par1Packet51MapChunk.includeInitialize && var2 == null)
728 {
729 this.worldClient.doPreChunk(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh, true);
730 var2 = this.worldClient.getChunkFromChunkCoords(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh);
731 }
732
733 if (var2 != null)
734 {
735 var2.fillChunk(par1Packet51MapChunk.func_73593_d(), par1Packet51MapChunk.yChMin, par1Packet51MapChunk.yChMax, par1Packet51MapChunk.includeInitialize);
736 this.worldClient.markBlockRangeForRenderUpdate(par1Packet51MapChunk.xCh << 4, 0, par1Packet51MapChunk.zCh << 4, (par1Packet51MapChunk.xCh << 4) + 15, 256, (par1Packet51MapChunk.zCh << 4) + 15);
737
738 if (!par1Packet51MapChunk.includeInitialize || !(this.worldClient.provider instanceof WorldProviderSurface))
739 {
740 var2.resetRelightChecks();
741 }
742 }
743 }
744
745 public void handleBlockChange(Packet53BlockChange par1Packet53BlockChange)
746 {
747 this.worldClient.setBlockAndMetadataAndInvalidate(par1Packet53BlockChange.xPosition, par1Packet53BlockChange.yPosition, par1Packet53BlockChange.zPosition, par1Packet53BlockChange.type, par1Packet53BlockChange.metadata);
748 }
749
750 public void handleKickDisconnect(Packet255KickDisconnect par1Packet255KickDisconnect)
751 {
752 this.netManager.networkShutdown("disconnect.kicked", par1Packet255KickDisconnect.reason);
753 this.disconnected = true;
754 this.mc.loadWorld((WorldClient)null);
755 this.mc.displayGuiScreen(new GuiDisconnected("disconnect.disconnected", "disconnect.genericReason", new Object[] {par1Packet255KickDisconnect.reason}));
756 }
757
758 public void handleErrorMessage(String par1Str, Object[] par2ArrayOfObj)
759 {
760 if (!this.disconnected)
761 {
762 this.disconnected = true;
763 this.mc.loadWorld((WorldClient)null);
764 this.mc.displayGuiScreen(new GuiDisconnected("disconnect.lost", par1Str, par2ArrayOfObj));
765 }
766 }
767
768 public void quitWithPacket(Packet par1Packet)
769 {
770 if (!this.disconnected)
771 {
772 this.netManager.addToSendQueue(par1Packet);
773 this.netManager.serverShutdown();
774 FMLNetworkHandler.onConnectionClosed(this.netManager, this.getPlayer());
775 }
776 }
777
778 /**
779 * Adds the packet to the send queue
780 */
781 public void addToSendQueue(Packet par1Packet)
782 {
783 if (!this.disconnected)
784 {
785 this.netManager.addToSendQueue(par1Packet);
786 }
787 }
788
789 public void handleCollect(Packet22Collect par1Packet22Collect)
790 {
791 Entity var2 = this.getEntityByID(par1Packet22Collect.collectedEntityId);
792 Object var3 = (EntityLiving)this.getEntityByID(par1Packet22Collect.collectorEntityId);
793
794 if (var3 == null)
795 {
796 var3 = this.mc.thePlayer;
797 }
798
799 if (var2 != null)
800 {
801 if (var2 instanceof EntityXPOrb)
802 {
803 this.worldClient.playSoundAtEntity(var2, "random.orb", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
804 }
805 else
806 {
807 this.worldClient.playSoundAtEntity(var2, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
808 }
809
810 this.mc.effectRenderer.addEffect(new EntityPickupFX(this.mc.theWorld, var2, (Entity)var3, -0.5F));
811 this.worldClient.removeEntityFromWorld(par1Packet22Collect.collectedEntityId);
812 }
813 }
814
815 public void handleChat(Packet3Chat par1Packet3Chat)
816 {
817 par1Packet3Chat = FMLNetworkHandler.handleChatMessage(this, par1Packet3Chat);
818 ClientChatReceivedEvent event = new ClientChatReceivedEvent(par1Packet3Chat.message);
819 if (!MinecraftForge.EVENT_BUS.post(event) && event.message != null)
820 {
821 this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message);
822 }
823 }
824
825 public void handleAnimation(Packet18Animation par1Packet18Animation)
826 {
827 Entity var2 = this.getEntityByID(par1Packet18Animation.entityId);
828
829 if (var2 != null)
830 {
831 if (par1Packet18Animation.animate == 1)
832 {
833 EntityLiving var3 = (EntityLiving)var2;
834 var3.swingItem();
835 }
836 else if (par1Packet18Animation.animate == 2)
837 {
838 var2.performHurtAnimation();
839 }
840 else if (par1Packet18Animation.animate == 3)
841 {
842 EntityPlayer var4 = (EntityPlayer)var2;
843 var4.wakeUpPlayer(false, false, false);
844 }
845 else if (par1Packet18Animation.animate != 4)
846 {
847 if (par1Packet18Animation.animate == 6)
848 {
849 this.mc.effectRenderer.addEffect(new EntityCrit2FX(this.mc.theWorld, var2));
850 }
851 else if (par1Packet18Animation.animate == 7)
852 {
853 EntityCrit2FX var5 = new EntityCrit2FX(this.mc.theWorld, var2, "magicCrit");
854 this.mc.effectRenderer.addEffect(var5);
855 }
856 else if (par1Packet18Animation.animate == 5 && var2 instanceof EntityOtherPlayerMP)
857 {
858 ;
859 }
860 }
861 }
862 }
863
864 public void handleSleep(Packet17Sleep par1Packet17Sleep)
865 {
866 Entity var2 = this.getEntityByID(par1Packet17Sleep.entityID);
867
868 if (var2 != null)
869 {
870 if (par1Packet17Sleep.field_73622_e == 0)
871 {
872 EntityPlayer var3 = (EntityPlayer)var2;
873 var3.sleepInBedAt(par1Packet17Sleep.bedX, par1Packet17Sleep.bedY, par1Packet17Sleep.bedZ);
874 }
875 }
876 }
877
878 /**
879 * Disconnects the network connection.
880 */
881 public void disconnect()
882 {
883 this.disconnected = true;
884 this.netManager.wakeThreads();
885 this.netManager.networkShutdown("disconnect.closed", new Object[0]);
886 }
887
888 public void handleMobSpawn(Packet24MobSpawn par1Packet24MobSpawn)
889 {
890 double var2 = (double)par1Packet24MobSpawn.xPosition / 32.0D;
891 double var4 = (double)par1Packet24MobSpawn.yPosition / 32.0D;
892 double var6 = (double)par1Packet24MobSpawn.zPosition / 32.0D;
893 float var8 = (float)(par1Packet24MobSpawn.yaw * 360) / 256.0F;
894 float var9 = (float)(par1Packet24MobSpawn.pitch * 360) / 256.0F;
895 EntityLiving var10 = (EntityLiving)EntityList.createEntityByID(par1Packet24MobSpawn.type, this.mc.theWorld);
896 var10.serverPosX = par1Packet24MobSpawn.xPosition;
897 var10.serverPosY = par1Packet24MobSpawn.yPosition;
898 var10.serverPosZ = par1Packet24MobSpawn.zPosition;
899 var10.rotationYawHead = (float)(par1Packet24MobSpawn.headYaw * 360) / 256.0F;
900 Entity[] var11 = var10.getParts();
901
902 if (var11 != null)
903 {
904 int var12 = par1Packet24MobSpawn.entityId - var10.entityId;
905
906 for (int var13 = 0; var13 < var11.length; ++var13)
907 {
908 var11[var13].entityId += var12;
909 }
910 }
911
912 var10.entityId = par1Packet24MobSpawn.entityId;
913 var10.setPositionAndRotation(var2, var4, var6, var8, var9);
914 var10.motionX = (double)((float)par1Packet24MobSpawn.velocityX / 8000.0F);
915 var10.motionY = (double)((float)par1Packet24MobSpawn.velocityY / 8000.0F);
916 var10.motionZ = (double)((float)par1Packet24MobSpawn.velocityZ / 8000.0F);
917 this.worldClient.addEntityToWorld(par1Packet24MobSpawn.entityId, var10);
918 List var14 = par1Packet24MobSpawn.getMetadata();
919
920 if (var14 != null)
921 {
922 var10.getDataWatcher().updateWatchedObjectsFromList(var14);
923 }
924 }
925
926 public void handleUpdateTime(Packet4UpdateTime par1Packet4UpdateTime)
927 {
928 this.mc.theWorld.func_82738_a(par1Packet4UpdateTime.field_82562_a);
929 this.mc.theWorld.setWorldTime(par1Packet4UpdateTime.time);
930 }
931
932 public void handleSpawnPosition(Packet6SpawnPosition par1Packet6SpawnPosition)
933 {
934 this.mc.thePlayer.setSpawnChunk(new ChunkCoordinates(par1Packet6SpawnPosition.xPosition, par1Packet6SpawnPosition.yPosition, par1Packet6SpawnPosition.zPosition), true);
935 this.mc.theWorld.getWorldInfo().setSpawnPosition(par1Packet6SpawnPosition.xPosition, par1Packet6SpawnPosition.yPosition, par1Packet6SpawnPosition.zPosition);
936 }
937
938 /**
939 * Packet handler
940 */
941 public void handleAttachEntity(Packet39AttachEntity par1Packet39AttachEntity)
942 {
943 Object var2 = this.getEntityByID(par1Packet39AttachEntity.entityId);
944 Entity var3 = this.getEntityByID(par1Packet39AttachEntity.vehicleEntityId);
945
946 if (par1Packet39AttachEntity.entityId == this.mc.thePlayer.entityId)
947 {
948 var2 = this.mc.thePlayer;
949
950 if (var3 instanceof EntityBoat)
951 {
952 ((EntityBoat)var3).func_70270_d(false);
953 }
954 }
955 else if (var3 instanceof EntityBoat)
956 {
957 ((EntityBoat)var3).func_70270_d(true);
958 }
959
960 if (var2 != null)
961 {
962 ((Entity)var2).mountEntity(var3);
963 }
964 }
965
966 /**
967 * Packet handler
968 */
969 public void handleEntityStatus(Packet38EntityStatus par1Packet38EntityStatus)
970 {
971 Entity var2 = this.getEntityByID(par1Packet38EntityStatus.entityId);
972
973 if (var2 != null)
974 {
975 var2.handleHealthUpdate(par1Packet38EntityStatus.entityStatus);
976 }
977 }
978
979 private Entity getEntityByID(int par1)
980 {
981 return (Entity)(par1 == this.mc.thePlayer.entityId ? this.mc.thePlayer : this.worldClient.getEntityByID(par1));
982 }
983
984 /**
985 * Recieves player health from the server and then proceeds to set it locally on the client.
986 */
987 public void handleUpdateHealth(Packet8UpdateHealth par1Packet8UpdateHealth)
988 {
989 this.mc.thePlayer.setHealth(par1Packet8UpdateHealth.healthMP);
990 this.mc.thePlayer.getFoodStats().setFoodLevel(par1Packet8UpdateHealth.food);
991 this.mc.thePlayer.getFoodStats().setFoodSaturationLevel(par1Packet8UpdateHealth.foodSaturation);
992 }
993
994 /**
995 * Handle an experience packet.
996 */
997 public void handleExperience(Packet43Experience par1Packet43Experience)
998 {
999 this.mc.thePlayer.setXPStats(par1Packet43Experience.experience, par1Packet43Experience.experienceTotal, par1Packet43Experience.experienceLevel);
1000 }
1001
1002 /**
1003 * respawns the player
1004 */
1005 public void handleRespawn(Packet9Respawn par1Packet9Respawn)
1006 {
1007 if (par1Packet9Respawn.respawnDimension != this.mc.thePlayer.dimension)
1008 {
1009 this.doneLoadingTerrain = false;
1010 this.worldClient = new WorldClient(this, new WorldSettings(0L, par1Packet9Respawn.gameType, false, this.mc.theWorld.getWorldInfo().isHardcoreModeEnabled(), par1Packet9Respawn.terrainType), par1Packet9Respawn.respawnDimension, par1Packet9Respawn.difficulty, this.mc.mcProfiler);
1011 this.worldClient.isRemote = true;
1012 this.mc.loadWorld(this.worldClient);
1013 this.mc.thePlayer.dimension = par1Packet9Respawn.respawnDimension;
1014 this.mc.displayGuiScreen(new GuiDownloadTerrain(this));
1015 }
1016
1017 this.mc.setDimensionAndSpawnPlayer(par1Packet9Respawn.respawnDimension);
1018 this.mc.playerController.setGameType(par1Packet9Respawn.gameType);
1019 }
1020
1021 public void handleExplosion(Packet60Explosion par1Packet60Explosion)
1022 {
1023 Explosion var2 = new Explosion(this.mc.theWorld, (Entity)null, par1Packet60Explosion.explosionX, par1Packet60Explosion.explosionY, par1Packet60Explosion.explosionZ, par1Packet60Explosion.explosionSize);
1024 var2.affectedBlockPositions = par1Packet60Explosion.chunkPositionRecords;
1025 var2.doExplosionB(true);
1026 this.mc.thePlayer.motionX += (double)par1Packet60Explosion.func_73607_d();
1027 this.mc.thePlayer.motionY += (double)par1Packet60Explosion.func_73609_f();
1028 this.mc.thePlayer.motionZ += (double)par1Packet60Explosion.func_73608_g();
1029 }
1030
1031 public void handleOpenWindow(Packet100OpenWindow par1Packet100OpenWindow)
1032 {
1033 EntityClientPlayerMP var2 = this.mc.thePlayer;
1034
1035 switch (par1Packet100OpenWindow.inventoryType)
1036 {
1037 case 0:
1038 var2.displayGUIChest(new InventoryBasic(par1Packet100OpenWindow.windowTitle, par1Packet100OpenWindow.slotsCount));
1039 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1040 break;
1041 case 1:
1042 var2.displayGUIWorkbench(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ));
1043 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1044 break;
1045 case 2:
1046 var2.displayGUIFurnace(new TileEntityFurnace());
1047 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1048 break;
1049 case 3:
1050 var2.displayGUIDispenser(new TileEntityDispenser());
1051 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1052 break;
1053 case 4:
1054 var2.displayGUIEnchantment(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ));
1055 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1056 break;
1057 case 5:
1058 var2.displayGUIBrewingStand(new TileEntityBrewingStand());
1059 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1060 break;
1061 case 6:
1062 var2.displayGUIMerchant(new NpcMerchant(var2));
1063 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1064 break;
1065 case 7:
1066 var2.displayGUIBeacon(new TileEntityBeacon());
1067 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1068 break;
1069 case 8:
1070 var2.displayGUIAnvil(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ));
1071 var2.openContainer.windowId = par1Packet100OpenWindow.windowId;
1072 }
1073 }
1074
1075 public void handleSetSlot(Packet103SetSlot par1Packet103SetSlot)
1076 {
1077 EntityClientPlayerMP var2 = this.mc.thePlayer;
1078
1079 if (par1Packet103SetSlot.windowId == -1)
1080 {
1081 var2.inventory.setItemStack(par1Packet103SetSlot.myItemStack);
1082 }
1083 else
1084 {
1085 boolean var3 = false;
1086
1087 if (this.mc.currentScreen instanceof GuiContainerCreative)
1088 {
1089 GuiContainerCreative var4 = (GuiContainerCreative)this.mc.currentScreen;
1090 var3 = var4.func_74230_h() != CreativeTabs.tabInventory.getTabIndex();
1091 }
1092
1093 if (par1Packet103SetSlot.windowId == 0 && par1Packet103SetSlot.itemSlot >= 36 && par1Packet103SetSlot.itemSlot < 45)
1094 {
1095 ItemStack var5 = var2.inventoryContainer.getSlot(par1Packet103SetSlot.itemSlot).getStack();
1096
1097 if (par1Packet103SetSlot.myItemStack != null && (var5 == null || var5.stackSize < par1Packet103SetSlot.myItemStack.stackSize))
1098 {
1099 par1Packet103SetSlot.myItemStack.animationsToGo = 5;
1100 }
1101
1102 var2.inventoryContainer.putStackInSlot(par1Packet103SetSlot.itemSlot, par1Packet103SetSlot.myItemStack);
1103 }
1104 else if (par1Packet103SetSlot.windowId == var2.openContainer.windowId && (par1Packet103SetSlot.windowId != 0 || !var3))
1105 {
1106 var2.openContainer.putStackInSlot(par1Packet103SetSlot.itemSlot, par1Packet103SetSlot.myItemStack);
1107 }
1108 }
1109 }
1110
1111 public void handleTransaction(Packet106Transaction par1Packet106Transaction)
1112 {
1113 Container var2 = null;
1114 EntityClientPlayerMP var3 = this.mc.thePlayer;
1115
1116 if (par1Packet106Transaction.windowId == 0)
1117 {
1118 var2 = var3.inventoryContainer;
1119 }
1120 else if (par1Packet106Transaction.windowId == var3.openContainer.windowId)
1121 {
1122 var2 = var3.openContainer;
1123 }
1124
1125 if (var2 != null && !par1Packet106Transaction.accepted)
1126 {
1127 this.addToSendQueue(new Packet106Transaction(par1Packet106Transaction.windowId, par1Packet106Transaction.shortWindowId, true));
1128 }
1129 }
1130
1131 public void handleWindowItems(Packet104WindowItems par1Packet104WindowItems)
1132 {
1133 EntityClientPlayerMP var2 = this.mc.thePlayer;
1134
1135 if (par1Packet104WindowItems.windowId == 0)
1136 {
1137 var2.inventoryContainer.putStacksInSlots(par1Packet104WindowItems.itemStack);
1138 }
1139 else if (par1Packet104WindowItems.windowId == var2.openContainer.windowId)
1140 {
1141 var2.openContainer.putStacksInSlots(par1Packet104WindowItems.itemStack);
1142 }
1143 }
1144
1145 /**
1146 * Updates Client side signs
1147 */
1148 public void handleUpdateSign(Packet130UpdateSign par1Packet130UpdateSign)
1149 {
1150 boolean var2 = false;
1151
1152 if (this.mc.theWorld.blockExists(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition))
1153 {
1154 TileEntity var3 = this.mc.theWorld.getBlockTileEntity(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition);
1155
1156 if (var3 instanceof TileEntitySign)
1157 {
1158 TileEntitySign var4 = (TileEntitySign)var3;
1159
1160 if (var4.isEditable())
1161 {
1162 for (int var5 = 0; var5 < 4; ++var5)
1163 {
1164 var4.signText[var5] = par1Packet130UpdateSign.signLines[var5];
1165 }
1166
1167 var4.onInventoryChanged();
1168 }
1169
1170 var2 = true;
1171 }
1172 }
1173
1174 if (!var2 && this.mc.thePlayer != null)
1175 {
1176 this.mc.thePlayer.sendChatToPlayer("Unable to locate sign at " + par1Packet130UpdateSign.xPosition + ", " + par1Packet130UpdateSign.yPosition + ", " + par1Packet130UpdateSign.zPosition);
1177 }
1178 }
1179
1180 public void handleTileEntityData(Packet132TileEntityData par1Packet132TileEntityData)
1181 {
1182 if (this.mc.theWorld.blockExists(par1Packet132TileEntityData.xPosition, par1Packet132TileEntityData.yPosition, par1Packet132TileEntityData.zPosition))
1183 {
1184 TileEntity var2 = this.mc.theWorld.getBlockTileEntity(par1Packet132TileEntityData.xPosition, par1Packet132TileEntityData.yPosition, par1Packet132TileEntityData.zPosition);
1185
1186 if (var2 != null)
1187 {
1188 if (par1Packet132TileEntityData.actionType == 1 && var2 instanceof TileEntityMobSpawner)
1189 {
1190 var2.readFromNBT(par1Packet132TileEntityData.customParam1);
1191 }
1192 else if (par1Packet132TileEntityData.actionType == 2 && var2 instanceof TileEntityCommandBlock)
1193 {
1194 var2.readFromNBT(par1Packet132TileEntityData.customParam1);
1195 }
1196 else if (par1Packet132TileEntityData.actionType == 3 && var2 instanceof TileEntityBeacon)
1197 {
1198 var2.readFromNBT(par1Packet132TileEntityData.customParam1);
1199 }
1200 else if (par1Packet132TileEntityData.actionType == 4 && var2 instanceof TileEntitySkull)
1201 {
1202 var2.readFromNBT(par1Packet132TileEntityData.customParam1);
1203 }
1204 else
1205 {
1206 var2.onDataPacket(netManager, par1Packet132TileEntityData);
1207 }
1208 }
1209 }
1210 }
1211
1212 public void handleUpdateProgressbar(Packet105UpdateProgressbar par1Packet105UpdateProgressbar)
1213 {
1214 EntityClientPlayerMP var2 = this.mc.thePlayer;
1215 this.unexpectedPacket(par1Packet105UpdateProgressbar);
1216
1217 if (var2.openContainer != null && var2.openContainer.windowId == par1Packet105UpdateProgressbar.windowId)
1218 {
1219 var2.openContainer.updateProgressBar(par1Packet105UpdateProgressbar.progressBar, par1Packet105UpdateProgressbar.progressBarValue);
1220 }
1221 }
1222
1223 public void handlePlayerInventory(Packet5PlayerInventory par1Packet5PlayerInventory)
1224 {
1225 Entity var2 = this.getEntityByID(par1Packet5PlayerInventory.entityID);
1226
1227 if (var2 != null)
1228 {
1229 var2.setCurrentItemOrArmor(par1Packet5PlayerInventory.slot, par1Packet5PlayerInventory.getItemSlot());
1230 }
1231 }
1232
1233 public void handleCloseWindow(Packet101CloseWindow par1Packet101CloseWindow)
1234 {
1235 this.mc.thePlayer.func_92015_f();
1236 }
1237
1238 public void handleBlockEvent(Packet54PlayNoteBlock par1Packet54PlayNoteBlock)
1239 {
1240 this.mc.theWorld.addBlockEvent(par1Packet54PlayNoteBlock.xLocation, par1Packet54PlayNoteBlock.yLocation, par1Packet54PlayNoteBlock.zLocation, par1Packet54PlayNoteBlock.blockId, par1Packet54PlayNoteBlock.instrumentType, par1Packet54PlayNoteBlock.pitch);
1241 }
1242
1243 public void handleBlockDestroy(Packet55BlockDestroy par1Packet55BlockDestroy)
1244 {
1245 this.mc.theWorld.destroyBlockInWorldPartially(par1Packet55BlockDestroy.getEntityId(), par1Packet55BlockDestroy.getPosX(), par1Packet55BlockDestroy.getPosY(), par1Packet55BlockDestroy.getPosZ(), par1Packet55BlockDestroy.getDestroyedStage());
1246 }
1247
1248 public void handleMapChunks(Packet56MapChunks par1Packet56MapChunks)
1249 {
1250 for (int var2 = 0; var2 < par1Packet56MapChunks.getNumberOfChunkInPacket(); ++var2)
1251 {
1252 int var3 = par1Packet56MapChunks.getChunkPosX(var2);
1253 int var4 = par1Packet56MapChunks.getChunkPosZ(var2);
1254 this.worldClient.doPreChunk(var3, var4, true);
1255 this.worldClient.invalidateBlockReceiveRegion(var3 << 4, 0, var4 << 4, (var3 << 4) + 15, 256, (var4 << 4) + 15);
1256 Chunk var5 = this.worldClient.getChunkFromChunkCoords(var3, var4);
1257
1258 if (var5 == null)
1259 {
1260 this.worldClient.doPreChunk(var3, var4, true);
1261 var5 = this.worldClient.getChunkFromChunkCoords(var3, var4);
1262 }
1263
1264 if (var5 != null)
1265 {
1266 var5.fillChunk(par1Packet56MapChunks.getChunkCompressedData(var2), par1Packet56MapChunks.field_73590_a[var2], par1Packet56MapChunks.field_73588_b[var2], true);
1267 this.worldClient.markBlockRangeForRenderUpdate(var3 << 4, 0, var4 << 4, (var3 << 4) + 15, 256, (var4 << 4) + 15);
1268
1269 if (!(this.worldClient.provider instanceof WorldProviderSurface))
1270 {
1271 var5.resetRelightChecks();
1272 }
1273 }
1274 }
1275 }
1276
1277 /**
1278 * If this returns false, all packets will be queued for the main thread to handle, even if they would otherwise be
1279 * processed asynchronously. Used to avoid processing packets on the client before the world has been downloaded
1280 * (which happens on the main thread)
1281 */
1282 public boolean canProcessPacketsAsync()
1283 {
1284 return this.mc != null && this.mc.theWorld != null && this.mc.thePlayer != null && this.worldClient != null;
1285 }
1286
1287 public void handleGameEvent(Packet70GameEvent par1Packet70GameEvent)
1288 {
1289 EntityClientPlayerMP var2 = this.mc.thePlayer;
1290 int var3 = par1Packet70GameEvent.eventType;
1291 int var4 = par1Packet70GameEvent.gameMode;
1292
1293 if (var3 >= 0 && var3 < Packet70GameEvent.clientMessage.length && Packet70GameEvent.clientMessage[var3] != null)
1294 {
1295 var2.addChatMessage(Packet70GameEvent.clientMessage[var3]);
1296 }
1297
1298 if (var3 == 1)
1299 {
1300 this.worldClient.getWorldInfo().setRaining(true);
1301 this.worldClient.setRainStrength(0.0F);
1302 }
1303 else if (var3 == 2)
1304 {
1305 this.worldClient.getWorldInfo().setRaining(false);
1306 this.worldClient.setRainStrength(1.0F);
1307 }
1308 else if (var3 == 3)
1309 {
1310 this.mc.playerController.setGameType(EnumGameType.getByID(var4));
1311 }
1312 else if (var3 == 4)
1313 {
1314 this.mc.displayGuiScreen(new GuiWinGame());
1315 }
1316 else if (var3 == 5)
1317 {
1318 GameSettings var5 = this.mc.gameSettings;
1319
1320 if (var4 == 0)
1321 {
1322 this.mc.displayGuiScreen(new GuiScreenDemo());
1323 }
1324 else if (var4 == 101)
1325 {
1326 this.mc.ingameGUI.getChatGUI().addTranslatedMessage("demo.help.movement", new Object[] {Keyboard.getKeyName(var5.keyBindForward.keyCode), Keyboard.getKeyName(var5.keyBindLeft.keyCode), Keyboard.getKeyName(var5.keyBindBack.keyCode), Keyboard.getKeyName(var5.keyBindRight.keyCode)});
1327 }
1328 else if (var4 == 102)
1329 {
1330 this.mc.ingameGUI.getChatGUI().addTranslatedMessage("demo.help.jump", new Object[] {Keyboard.getKeyName(var5.keyBindJump.keyCode)});
1331 }
1332 else if (var4 == 103)
1333 {
1334 this.mc.ingameGUI.getChatGUI().addTranslatedMessage("demo.help.inventory", new Object[] {Keyboard.getKeyName(var5.keyBindInventory.keyCode)});
1335 }
1336 }
1337 else if (var3 == 6)
1338 {
1339 this.worldClient.playSound(var2.posX, var2.posY + (double)var2.getEyeHeight(), var2.posZ, "random.successful_hit", 0.15F, 0.45F, false);
1340 }
1341 }
1342
1343 /**
1344 * Contains logic for handling packets containing arbitrary unique item data. Currently this is only for maps.
1345 */
1346 public void handleMapData(Packet131MapData par1Packet131MapData)
1347 {
1348 FMLNetworkHandler.handlePacket131Packet(this, par1Packet131MapData);
1349 }
1350
1351 public void fmlPacket131Callback(Packet131MapData par1Packet131MapData)
1352 {
1353 if (par1Packet131MapData.itemID == Item.map.itemID)
1354 {
1355 ItemMap.getMPMapData(par1Packet131MapData.uniqueID, this.mc.theWorld).updateMPMapData(par1Packet131MapData.itemData);
1356 }
1357 else
1358 {
1359 System.out.println("Unknown itemid: " + par1Packet131MapData.uniqueID);
1360 }
1361 }
1362
1363 public void handleDoorChange(Packet61DoorChange par1Packet61DoorChange)
1364 {
1365 if (par1Packet61DoorChange.func_82560_d())
1366 {
1367 this.mc.theWorld.func_82739_e(par1Packet61DoorChange.sfxID, par1Packet61DoorChange.posX, par1Packet61DoorChange.posY, par1Packet61DoorChange.posZ, par1Packet61DoorChange.auxData);
1368 }
1369 else
1370 {
1371 this.mc.theWorld.playAuxSFX(par1Packet61DoorChange.sfxID, par1Packet61DoorChange.posX, par1Packet61DoorChange.posY, par1Packet61DoorChange.posZ, par1Packet61DoorChange.auxData);
1372 }
1373 }
1374
1375 /**
1376 * Increment player statistics
1377 */
1378 public void handleStatistic(Packet200Statistic par1Packet200Statistic)
1379 {
1380 this.mc.thePlayer.incrementStat(StatList.getOneShotStat(par1Packet200Statistic.statisticId), par1Packet200Statistic.amount);
1381 }
1382
1383 /**
1384 * Handle an entity effect packet.
1385 */
1386 public void handleEntityEffect(Packet41EntityEffect par1Packet41EntityEffect)
1387 {
1388 Entity var2 = this.getEntityByID(par1Packet41EntityEffect.entityId);
1389
1390 if (var2 instanceof EntityLiving)
1391 {
1392 ((EntityLiving)var2).addPotionEffect(new PotionEffect(par1Packet41EntityEffect.effectId, par1Packet41EntityEffect.duration, par1Packet41EntityEffect.effectAmplifier));
1393 }
1394 }
1395
1396 /**
1397 * Handle a remove entity effect packet.
1398 */
1399 public void handleRemoveEntityEffect(Packet42RemoveEntityEffect par1Packet42RemoveEntityEffect)
1400 {
1401 Entity var2 = this.getEntityByID(par1Packet42RemoveEntityEffect.entityId);
1402
1403 if (var2 instanceof EntityLiving)
1404 {
1405 ((EntityLiving)var2).removePotionEffectClient(par1Packet42RemoveEntityEffect.effectId);
1406 }
1407 }
1408
1409 /**
1410 * determine if it is a server handler
1411 */
1412 public boolean isServerHandler()
1413 {
1414 return false;
1415 }
1416
1417 /**
1418 * Handle a player information packet.
1419 */
1420 public void handlePlayerInfo(Packet201PlayerInfo par1Packet201PlayerInfo)
1421 {
1422 GuiPlayerInfo var2 = (GuiPlayerInfo)this.playerInfoMap.get(par1Packet201PlayerInfo.playerName);
1423
1424 if (var2 == null && par1Packet201PlayerInfo.isConnected)
1425 {
1426 var2 = new GuiPlayerInfo(par1Packet201PlayerInfo.playerName);
1427 this.playerInfoMap.put(par1Packet201PlayerInfo.playerName, var2);
1428 this.playerInfoList.add(var2);
1429 }
1430
1431 if (var2 != null && !par1Packet201PlayerInfo.isConnected)
1432 {
1433 this.playerInfoMap.remove(par1Packet201PlayerInfo.playerName);
1434 this.playerInfoList.remove(var2);
1435 }
1436
1437 if (par1Packet201PlayerInfo.isConnected && var2 != null)
1438 {
1439 var2.responseTime = par1Packet201PlayerInfo.ping;
1440 }
1441 }
1442
1443 /**
1444 * Handle a keep alive packet.
1445 */
1446 public void handleKeepAlive(Packet0KeepAlive par1Packet0KeepAlive)
1447 {
1448 this.addToSendQueue(new Packet0KeepAlive(par1Packet0KeepAlive.randomId));
1449 }
1450
1451 /**
1452 * Handle a player abilities packet.
1453 */
1454 public void handlePlayerAbilities(Packet202PlayerAbilities par1Packet202PlayerAbilities)
1455 {
1456 EntityClientPlayerMP var2 = this.mc.thePlayer;
1457 var2.capabilities.isFlying = par1Packet202PlayerAbilities.getFlying();
1458 var2.capabilities.isCreativeMode = par1Packet202PlayerAbilities.isCreativeMode();
1459 var2.capabilities.disableDamage = par1Packet202PlayerAbilities.getDisableDamage();
1460 var2.capabilities.allowFlying = par1Packet202PlayerAbilities.getAllowFlying();
1461 var2.capabilities.setFlySpeed(par1Packet202PlayerAbilities.getFlySpeed());
1462 var2.capabilities.func_82877_b(par1Packet202PlayerAbilities.func_82558_j());
1463 }
1464
1465 public void handleAutoComplete(Packet203AutoComplete par1Packet203AutoComplete)
1466 {
1467 String[] var2 = par1Packet203AutoComplete.getText().split("\u0000");
1468
1469 if (this.mc.currentScreen instanceof GuiChat)
1470 {
1471 GuiChat var3 = (GuiChat)this.mc.currentScreen;
1472 var3.func_73894_a(var2);
1473 }
1474 }
1475
1476 public void handleLevelSound(Packet62LevelSound par1Packet62LevelSound)
1477 {
1478 this.mc.theWorld.playSound(par1Packet62LevelSound.getEffectX(), par1Packet62LevelSound.getEffectY(), par1Packet62LevelSound.getEffectZ(), par1Packet62LevelSound.getSoundName(), par1Packet62LevelSound.getVolume(), par1Packet62LevelSound.getPitch(), false);
1479 }
1480
1481 public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload)
1482 {
1483 FMLNetworkHandler.handlePacket250Packet(par1Packet250CustomPayload, netManager, this);
1484 }
1485
1486 public void handleVanilla250Packet(Packet250CustomPayload par1Packet250CustomPayload)
1487 {
1488 if ("MC|TPack".equals(par1Packet250CustomPayload.channel))
1489 {
1490 String[] var2 = (new String(par1Packet250CustomPayload.data)).split("\u0000");
1491 String var3 = var2[0];
1492
1493 if (var2[1].equals("16"))
1494 {
1495 if (this.mc.texturePackList.getAcceptsTextures())
1496 {
1497 this.mc.texturePackList.requestDownloadOfTexture(var3);
1498 }
1499 else if (this.mc.texturePackList.func_77300_f())
1500 {
1501 this.mc.displayGuiScreen(new GuiYesNo(new NetClientWebTextures(this, var3), StringTranslate.getInstance().translateKey("multiplayer.texturePrompt.line1"), StringTranslate.getInstance().translateKey("multiplayer.texturePrompt.line2"), 0));
1502 }
1503 }
1504 }
1505 else if ("MC|TrList".equals(par1Packet250CustomPayload.channel))
1506 {
1507 DataInputStream var8 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1508
1509 try
1510 {
1511 int var9 = var8.readInt();
1512 GuiScreen var4 = this.mc.currentScreen;
1513
1514 if (var4 != null && var4 instanceof GuiMerchant && var9 == this.mc.thePlayer.openContainer.windowId)
1515 {
1516 IMerchant var5 = ((GuiMerchant)var4).getIMerchant();
1517 MerchantRecipeList var6 = MerchantRecipeList.readRecipiesFromStream(var8);
1518 var5.setRecipes(var6);
1519 }
1520 }
1521 catch (IOException var7)
1522 {
1523 var7.printStackTrace();
1524 }
1525 }
1526 }
1527
1528 /**
1529 * Return the NetworkManager instance used by this NetClientHandler
1530 */
1531 public INetworkManager getNetManager()
1532 {
1533 return this.netManager;
1534 }
1535
1536 @Override
1537 public EntityPlayer getPlayer()
1538 {
1539 return mc.thePlayer;
1540 }
1541
1542 public static void setConnectionCompatibilityLevel(byte connectionCompatibilityLevel)
1543 {
1544 NetClientHandler.connectionCompatibilityLevel = connectionCompatibilityLevel;
1545 }
1546
1547 public static byte getConnectionCompatibilityLevel()
1548 {
1549 return connectionCompatibilityLevel;
1550 }
1551 }