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