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