001package net.minecraft.network;
002
003import java.io.ByteArrayInputStream;
004import java.io.DataInputStream;
005import java.io.IOException;
006import java.util.ArrayList;
007import java.util.Iterator;
008import java.util.Random;
009import java.util.logging.Logger;
010
011import cpw.mods.fml.common.network.FMLNetworkHandler;
012import net.minecraft.entity.Entity;
013import net.minecraft.entity.item.EntityItem;
014import net.minecraft.entity.player.EntityPlayerMP;
015import net.minecraft.entity.player.InventoryPlayer;
016import net.minecraft.inventory.Container;
017import net.minecraft.inventory.ContainerBeacon;
018import net.minecraft.inventory.ContainerMerchant;
019import net.minecraft.inventory.ContainerRepair;
020import net.minecraft.inventory.Slot;
021import net.minecraft.item.Item;
022import net.minecraft.item.ItemEditableBook;
023import net.minecraft.item.ItemStack;
024import net.minecraft.item.ItemWritableBook;
025import net.minecraft.nbt.NBTTagString;
026import net.minecraft.network.packet.NetHandler;
027import net.minecraft.network.packet.Packet;
028import net.minecraft.network.packet.Packet0KeepAlive;
029import net.minecraft.network.packet.Packet101CloseWindow;
030import net.minecraft.network.packet.Packet102WindowClick;
031import net.minecraft.network.packet.Packet103SetSlot;
032import net.minecraft.network.packet.Packet106Transaction;
033import net.minecraft.network.packet.Packet107CreativeSetSlot;
034import net.minecraft.network.packet.Packet108EnchantItem;
035import net.minecraft.network.packet.Packet10Flying;
036import net.minecraft.network.packet.Packet130UpdateSign;
037import net.minecraft.network.packet.Packet131MapData;
038import net.minecraft.network.packet.Packet13PlayerLookMove;
039import net.minecraft.network.packet.Packet14BlockDig;
040import net.minecraft.network.packet.Packet15Place;
041import net.minecraft.network.packet.Packet16BlockItemSwitch;
042import net.minecraft.network.packet.Packet18Animation;
043import net.minecraft.network.packet.Packet19EntityAction;
044import net.minecraft.network.packet.Packet202PlayerAbilities;
045import net.minecraft.network.packet.Packet203AutoComplete;
046import net.minecraft.network.packet.Packet204ClientInfo;
047import net.minecraft.network.packet.Packet205ClientCommand;
048import net.minecraft.network.packet.Packet250CustomPayload;
049import net.minecraft.network.packet.Packet255KickDisconnect;
050import net.minecraft.network.packet.Packet3Chat;
051import net.minecraft.network.packet.Packet53BlockChange;
052import net.minecraft.network.packet.Packet7UseEntity;
053import net.minecraft.network.packet.Packet9Respawn;
054import net.minecraft.server.MinecraftServer;
055import net.minecraft.server.management.BanEntry;
056import net.minecraft.tileentity.TileEntity;
057import net.minecraft.tileentity.TileEntityBeacon;
058import net.minecraft.tileentity.TileEntityCommandBlock;
059import net.minecraft.tileentity.TileEntitySign;
060import net.minecraft.util.AxisAlignedBB;
061import net.minecraft.util.ChatAllowedCharacters;
062import net.minecraft.util.ChunkCoordinates;
063import net.minecraft.util.IntHashMap;
064import net.minecraft.util.MathHelper;
065import net.minecraft.world.WorldServer;
066
067import net.minecraftforge.common.MinecraftForge;
068import net.minecraftforge.event.Event;
069import net.minecraftforge.event.ForgeEventFactory;
070import net.minecraftforge.event.ServerChatEvent;
071import net.minecraftforge.event.entity.player.PlayerInteractEvent;
072import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
073
074public class NetServerHandler extends NetHandler
075{
076    /** The logging system. */
077    public static Logger logger = Logger.getLogger("Minecraft");
078
079    /** The underlying network manager for this server handler. */
080    public INetworkManager netManager;
081
082    /** This is set to true whenever a player disconnects from the server. */
083    public boolean connectionClosed = false;
084
085    /** Reference to the MinecraftServer object. */
086    private MinecraftServer mcServer;
087
088    /** Reference to the EntityPlayerMP object. */
089    public EntityPlayerMP playerEntity;
090
091    /** incremented each tick */
092    private int currentTicks;
093
094    /**
095     * player is kicked if they float for over 80 ticks without flying enabled
096     */
097    public int ticksForFloatKick;
098    private boolean field_72584_h;
099    private int keepAliveRandomID;
100    private long keepAliveTimeSent;
101    private static Random randomGenerator = new Random();
102    private long ticksOfLastKeepAlive;
103    private int chatSpamThresholdCount = 0;
104    private int creativeItemCreationSpamThresholdTally = 0;
105
106    /** The last known x position for this connection. */
107    private double lastPosX;
108
109    /** The last known y position for this connection. */
110    private double lastPosY;
111
112    /** The last known z position for this connection. */
113    private double lastPosZ;
114
115    /** is true when the player has moved since his last movement packet */
116    private boolean hasMoved = true;
117    private IntHashMap field_72586_s = new IntHashMap();
118
119    public NetServerHandler(MinecraftServer par1, INetworkManager par2, EntityPlayerMP par3)
120    {
121        this.mcServer = par1;
122        this.netManager = par2;
123        par2.setNetHandler(this);
124        this.playerEntity = par3;
125        par3.playerNetServerHandler = this;
126    }
127
128    /**
129     * run once each game tick
130     */
131    public void networkTick()
132    {
133        this.field_72584_h = false;
134        ++this.currentTicks;
135        this.mcServer.theProfiler.startSection("packetflow");
136        this.netManager.processReadPackets();
137        this.mcServer.theProfiler.endStartSection("keepAlive");
138
139        if ((long)this.currentTicks - this.ticksOfLastKeepAlive > 20L)
140        {
141            this.ticksOfLastKeepAlive = (long)this.currentTicks;
142            this.keepAliveTimeSent = System.nanoTime() / 1000000L;
143            this.keepAliveRandomID = randomGenerator.nextInt();
144            this.sendPacketToPlayer(new Packet0KeepAlive(this.keepAliveRandomID));
145        }
146
147        if (this.chatSpamThresholdCount > 0)
148        {
149            --this.chatSpamThresholdCount;
150        }
151
152        if (this.creativeItemCreationSpamThresholdTally > 0)
153        {
154            --this.creativeItemCreationSpamThresholdTally;
155        }
156
157        this.mcServer.theProfiler.endStartSection("playerTick");
158        this.mcServer.theProfiler.endSection();
159    }
160
161    public void kickPlayerFromServer(String par1Str)
162    {
163        if (!this.connectionClosed)
164        {
165            this.playerEntity.mountEntityAndWakeUp();
166            this.sendPacketToPlayer(new Packet255KickDisconnect(par1Str));
167            this.netManager.serverShutdown();
168            this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game."));
169            this.mcServer.getConfigurationManager().playerLoggedOut(this.playerEntity);
170            this.connectionClosed = true;
171        }
172    }
173
174    public void handleFlying(Packet10Flying par1Packet10Flying)
175    {
176        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
177        this.field_72584_h = true;
178
179        if (!this.playerEntity.playerConqueredTheEnd)
180        {
181            double var3;
182
183            if (!this.hasMoved)
184            {
185                var3 = par1Packet10Flying.yPosition - this.lastPosY;
186
187                if (par1Packet10Flying.xPosition == this.lastPosX && var3 * var3 < 0.01D && par1Packet10Flying.zPosition == this.lastPosZ)
188                {
189                    this.hasMoved = true;
190                }
191            }
192
193            if (this.hasMoved)
194            {
195                double var5;
196                double var7;
197                double var9;
198                double var13;
199
200                if (this.playerEntity.ridingEntity != null)
201                {
202                    float var34 = this.playerEntity.rotationYaw;
203                    float var4 = this.playerEntity.rotationPitch;
204                    this.playerEntity.ridingEntity.updateRiderPosition();
205                    var5 = this.playerEntity.posX;
206                    var7 = this.playerEntity.posY;
207                    var9 = this.playerEntity.posZ;
208                    double var35 = 0.0D;
209                    var13 = 0.0D;
210
211                    if (par1Packet10Flying.rotating)
212                    {
213                        var34 = par1Packet10Flying.yaw;
214                        var4 = par1Packet10Flying.pitch;
215                    }
216
217                    if (par1Packet10Flying.moving && par1Packet10Flying.yPosition == -999.0D && par1Packet10Flying.stance == -999.0D)
218                    {
219                        if (Math.abs(par1Packet10Flying.xPosition) > 1.0D || Math.abs(par1Packet10Flying.zPosition) > 1.0D)
220                        {
221                            System.err.println(this.playerEntity.username + " was caught trying to crash the server with an invalid position.");
222                            this.kickPlayerFromServer("Nope!");
223                            return;
224                        }
225
226                        var35 = par1Packet10Flying.xPosition;
227                        var13 = par1Packet10Flying.zPosition;
228                    }
229
230                    this.playerEntity.onGround = par1Packet10Flying.onGround;
231                    this.playerEntity.onUpdateEntity();
232                    this.playerEntity.moveEntity(var35, 0.0D, var13);
233                    this.playerEntity.setPositionAndRotation(var5, var7, var9, var34, var4);
234                    this.playerEntity.motionX = var35;
235                    this.playerEntity.motionZ = var13;
236
237                    if (this.playerEntity.ridingEntity != null)
238                    {
239                        var2.uncheckedUpdateEntity(this.playerEntity.ridingEntity, true);
240                    }
241
242                    if (this.playerEntity.ridingEntity != null)
243                    {
244                        this.playerEntity.ridingEntity.updateRiderPosition();
245                    }
246
247                    if (!this.hasMoved) //Fixes teleportation kick while riding entities
248                    {
249                        return;
250                    }
251
252                    this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity);
253                    this.lastPosX = this.playerEntity.posX;
254                    this.lastPosY = this.playerEntity.posY;
255                    this.lastPosZ = this.playerEntity.posZ;
256                    var2.updateEntity(this.playerEntity);
257                    return;
258                }
259
260                if (this.playerEntity.isPlayerSleeping())
261                {
262                    this.playerEntity.onUpdateEntity();
263                    this.playerEntity.setPositionAndRotation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch);
264                    var2.updateEntity(this.playerEntity);
265                    return;
266                }
267
268                var3 = this.playerEntity.posY;
269                this.lastPosX = this.playerEntity.posX;
270                this.lastPosY = this.playerEntity.posY;
271                this.lastPosZ = this.playerEntity.posZ;
272                var5 = this.playerEntity.posX;
273                var7 = this.playerEntity.posY;
274                var9 = this.playerEntity.posZ;
275                float var11 = this.playerEntity.rotationYaw;
276                float var12 = this.playerEntity.rotationPitch;
277
278                if (par1Packet10Flying.moving && par1Packet10Flying.yPosition == -999.0D && par1Packet10Flying.stance == -999.0D)
279                {
280                    par1Packet10Flying.moving = false;
281                }
282
283                if (par1Packet10Flying.moving)
284                {
285                    var5 = par1Packet10Flying.xPosition;
286                    var7 = par1Packet10Flying.yPosition;
287                    var9 = par1Packet10Flying.zPosition;
288                    var13 = par1Packet10Flying.stance - par1Packet10Flying.yPosition;
289
290                    if (!this.playerEntity.isPlayerSleeping() && (var13 > 1.65D || var13 < 0.1D))
291                    {
292                        this.kickPlayerFromServer("Illegal stance");
293                        logger.warning(this.playerEntity.username + " had an illegal stance: " + var13);
294                        return;
295                    }
296
297                    if (Math.abs(par1Packet10Flying.xPosition) > 3.2E7D || Math.abs(par1Packet10Flying.zPosition) > 3.2E7D)
298                    {
299                        this.kickPlayerFromServer("Illegal position");
300                        return;
301                    }
302                }
303
304                if (par1Packet10Flying.rotating)
305                {
306                    var11 = par1Packet10Flying.yaw;
307                    var12 = par1Packet10Flying.pitch;
308                }
309
310                this.playerEntity.onUpdateEntity();
311                this.playerEntity.ySize = 0.0F;
312                this.playerEntity.setPositionAndRotation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12);
313
314                if (!this.hasMoved)
315                {
316                    return;
317                }
318
319                var13 = var5 - this.playerEntity.posX;
320                double var15 = var7 - this.playerEntity.posY;
321                double var17 = var9 - this.playerEntity.posZ;
322                //Change min->max, fixes movement speed check 
323                double var19 = Math.max(Math.abs(var13), Math.abs(this.playerEntity.motionX));
324                double var21 = Math.max(Math.abs(var15), Math.abs(this.playerEntity.motionY));
325                double var23 = Math.max(Math.abs(var17), Math.abs(this.playerEntity.motionZ));
326                double var25 = var19 * var19 + var21 * var21 + var23 * var23;
327
328                if (var25 > 100.0D && (!this.mcServer.isSinglePlayer() || !this.mcServer.getServerOwner().equals(this.playerEntity.username)))
329                {
330                    logger.warning(this.playerEntity.username + " moved too quickly! " + var13 + "," + var15 + "," + var17 + " (" + var19 + ", " + var21 + ", " + var23 + ")");
331                    this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch);
332                    return;
333                }
334
335                float var27 = 0.0625F;
336                boolean var28 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty();
337
338                if (this.playerEntity.onGround && !par1Packet10Flying.onGround && var15 > 0.0D)
339                {
340                    this.playerEntity.addExhaustion(0.2F);
341                }
342
343                if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
344                {
345                    return;
346                }
347
348                this.playerEntity.moveEntity(var13, var15, var17);
349                this.playerEntity.onGround = par1Packet10Flying.onGround;
350                this.playerEntity.addMovementStat(var13, var15, var17);
351                double var29 = var15;
352                var13 = var5 - this.playerEntity.posX;
353                var15 = var7 - this.playerEntity.posY;
354
355                if (var15 > -0.5D || var15 < 0.5D)
356                {
357                    var15 = 0.0D;
358                }
359
360                var17 = var9 - this.playerEntity.posZ;
361                var25 = var13 * var13 + var15 * var15 + var17 * var17;
362                boolean var31 = false;
363
364                if (var25 > 0.0625D && !this.playerEntity.isPlayerSleeping() && !this.playerEntity.theItemInWorldManager.isCreative())
365                {
366                    var31 = true;
367                    logger.warning(this.playerEntity.username + " moved wrongly!");
368                }
369
370                if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
371                {
372                    return;
373                }
374
375                this.playerEntity.setPositionAndRotation(var5, var7, var9, var11, var12);
376                boolean var32 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty();
377
378                if (var28 && (var31 || !var32) && !this.playerEntity.isPlayerSleeping() && !this.playerEntity.noClip)
379                {
380                    this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12);
381                    return;
382                }
383
384                AxisAlignedBB var33 = this.playerEntity.boundingBox.copy().expand((double)var27, (double)var27, (double)var27).addCoord(0.0D, -0.55D, 0.0D);
385
386                if (!this.mcServer.isFlightAllowed() && !this.playerEntity.theItemInWorldManager.isCreative() && !var2.isAABBNonEmpty(var33)  && !this.playerEntity.capabilities.allowFlying)
387                {
388                    if (var29 >= -0.03125D)
389                    {
390                        ++this.ticksForFloatKick;
391
392                        if (this.ticksForFloatKick > 80)
393                        {
394                            logger.warning(this.playerEntity.username + " was kicked for floating too long!");
395                            this.kickPlayerFromServer("Flying is not enabled on this server");
396                            return;
397                        }
398                    }
399                }
400                else
401                {
402                    this.ticksForFloatKick = 0;
403                }
404
405                if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
406                {
407                    return;
408                }
409
410                this.playerEntity.onGround = par1Packet10Flying.onGround;
411                this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity);
412                this.playerEntity.updateFlyingState(this.playerEntity.posY - var3, par1Packet10Flying.onGround);
413            }
414        }
415    }
416
417    /**
418     * Moves the player to the specified destination and rotation
419     */
420    public void setPlayerLocation(double par1, double par3, double par5, float par7, float par8)
421    {
422        this.hasMoved = false;
423        this.lastPosX = par1;
424        this.lastPosY = par3;
425        this.lastPosZ = par5;
426        this.playerEntity.setPositionAndRotation(par1, par3, par5, par7, par8);
427        this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet13PlayerLookMove(par1, par3 + 1.6200000047683716D, par3, par5, par7, par8, false));
428    }
429
430    public void handleBlockDig(Packet14BlockDig par1Packet14BlockDig)
431    {
432        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
433
434        if (par1Packet14BlockDig.status == 4)
435        {
436            this.playerEntity.dropOneItem(false);
437        }
438        else if (par1Packet14BlockDig.status == 3)
439        {
440            this.playerEntity.dropOneItem(true);
441        }
442        else if (par1Packet14BlockDig.status == 5)
443        {
444            this.playerEntity.stopUsingItem();
445        }
446        else
447        {
448            int var3 = this.mcServer.getSpawnProtectionSize();
449            boolean var4 = var2.provider.dimensionId != 0 || this.mcServer.getConfigurationManager().getOps().isEmpty() || this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username) || var3 <= 0 || this.mcServer.isSinglePlayer();
450            boolean var5 = false;
451
452            if (par1Packet14BlockDig.status == 0)
453            {
454                var5 = true;
455            }
456
457            if (par1Packet14BlockDig.status == 1)
458            {
459                var5 = true;
460            }
461
462            if (par1Packet14BlockDig.status == 2)
463            {
464                var5 = true;
465            }
466
467            int var6 = par1Packet14BlockDig.xPosition;
468            int var7 = par1Packet14BlockDig.yPosition;
469            int var8 = par1Packet14BlockDig.zPosition;
470
471            if (var5)
472            {
473                double var9 = this.playerEntity.posX - ((double)var6 + 0.5D);
474                double var11 = this.playerEntity.posY - ((double)var7 + 0.5D) + 1.5D;
475                double var13 = this.playerEntity.posZ - ((double)var8 + 0.5D);
476                double var15 = var9 * var9 + var11 * var11 + var13 * var13;
477
478                double dist = playerEntity.theItemInWorldManager.getBlockReachDistance() + 1;
479                dist *= dist;
480
481                if (var15 > dist)
482                {
483                    return;
484                }
485
486                if (var7 >= this.mcServer.getBuildLimit())
487                {
488                    return;
489                }
490            }
491
492            ChunkCoordinates var17 = var2.getSpawnPoint();
493            int var10 = MathHelper.abs_int(var6 - var17.posX);
494            int var18 = MathHelper.abs_int(var8 - var17.posZ);
495
496            if (var10 > var18)
497            {
498                var18 = var10;
499            }
500
501            if (par1Packet14BlockDig.status == 0)
502            {
503                if (var18 <= var3 && !var4)
504                {
505                    ForgeEventFactory.onPlayerInteract(playerEntity, Action.LEFT_CLICK_BLOCK, var6, var7, var8, 0);
506                    this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2));
507                }
508                else
509                {
510                    this.playerEntity.theItemInWorldManager.onBlockClicked(var6, var7, var8, par1Packet14BlockDig.face);
511                }
512            }
513            else if (par1Packet14BlockDig.status == 2)
514            {
515                this.playerEntity.theItemInWorldManager.uncheckedTryHarvestBlock(var6, var7, var8);
516
517                if (var2.getBlockId(var6, var7, var8) != 0)
518                {
519                    this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2));
520                }
521            }
522            else if (par1Packet14BlockDig.status == 1)
523            {
524                this.playerEntity.theItemInWorldManager.cancelDestroyingBlock(var6, var7, var8);
525
526                if (var2.getBlockId(var6, var7, var8) != 0)
527                {
528                    this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2));
529                }
530            }
531        }
532    }
533
534    public void handlePlace(Packet15Place par1Packet15Place)
535    {
536        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
537        ItemStack var3 = this.playerEntity.inventory.getCurrentItem();
538        boolean var4 = false;
539        int var5 = par1Packet15Place.getXPosition();
540        int var6 = par1Packet15Place.getYPosition();
541        int var7 = par1Packet15Place.getZPosition();
542        int var8 = par1Packet15Place.getDirection();
543        int var9 = this.mcServer.getSpawnProtectionSize();
544        boolean var10 = var2.provider.dimensionId != 0 || this.mcServer.getConfigurationManager().getOps().isEmpty() || this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username) || var9 <= 0 || this.mcServer.isSinglePlayer();
545
546        if (par1Packet15Place.getDirection() == 255)
547        {
548            if (var3 == null)
549            {
550                return;
551            }
552
553            PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(playerEntity, PlayerInteractEvent.Action.RIGHT_CLICK_AIR, 0, 0, 0, -1);
554            if (event.useItem != Event.Result.DENY)
555            {
556                this.playerEntity.theItemInWorldManager.tryUseItem(this.playerEntity, var2, var3);
557            }
558        }
559        else if (par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit() - 1 && (par1Packet15Place.getDirection() == 1 || par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit()))
560        {
561            this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet3Chat("\u00a77Height limit for building is " + this.mcServer.getBuildLimit()));
562            var4 = true;
563        }
564        else
565        {
566            ChunkCoordinates var11 = var2.getSpawnPoint();
567            int var12 = MathHelper.abs_int(var5 - var11.posX);
568            int var13 = MathHelper.abs_int(var7 - var11.posZ);
569
570            if (var12 > var13)
571            {
572                var13 = var12;
573            }
574
575            double dist = playerEntity.theItemInWorldManager.getBlockReachDistance() + 1;
576            dist *= dist;
577            if (this.hasMoved && this.playerEntity.getDistanceSq((double)var5 + 0.5D, (double)var6 + 0.5D, (double)var7 + 0.5D) < dist && (var13 > var9 || var10))
578            {
579                this.playerEntity.theItemInWorldManager.activateBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8, par1Packet15Place.getXOffset(), par1Packet15Place.getYOffset(), par1Packet15Place.getZOffset());
580            }
581
582            var4 = true;
583        }
584
585        if (var4)
586        {
587            this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2));
588
589            if (var8 == 0)
590            {
591                --var6;
592            }
593
594            if (var8 == 1)
595            {
596                ++var6;
597            }
598
599            if (var8 == 2)
600            {
601                --var7;
602            }
603
604            if (var8 == 3)
605            {
606                ++var7;
607            }
608
609            if (var8 == 4)
610            {
611                --var5;
612            }
613
614            if (var8 == 5)
615            {
616                ++var5;
617            }
618
619            this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2));
620        }
621
622        var3 = this.playerEntity.inventory.getCurrentItem();
623
624        if (var3 != null && var3.stackSize == 0)
625        {
626            this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = null;
627            var3 = null;
628        }
629
630        if (var3 == null || var3.getMaxItemUseDuration() == 0)
631        {
632            this.playerEntity.playerInventoryBeingManipulated = true;
633            this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = ItemStack.copyItemStack(this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem]);
634            Slot var14 = this.playerEntity.openContainer.getSlotFromInventory(this.playerEntity.inventory, this.playerEntity.inventory.currentItem);
635            this.playerEntity.openContainer.detectAndSendChanges();
636            this.playerEntity.playerInventoryBeingManipulated = false;
637
638            if (!ItemStack.areItemStacksEqual(this.playerEntity.inventory.getCurrentItem(), par1Packet15Place.getItemStack()))
639            {
640                this.sendPacketToPlayer(new Packet103SetSlot(this.playerEntity.openContainer.windowId, var14.slotNumber, this.playerEntity.inventory.getCurrentItem()));
641            }
642        }
643    }
644
645    public void handleErrorMessage(String par1Str, Object[] par2ArrayOfObj)
646    {
647        logger.info(this.playerEntity.username + " lost connection: " + par1Str);
648        this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game."));
649        this.mcServer.getConfigurationManager().playerLoggedOut(this.playerEntity);
650        this.connectionClosed = true;
651
652        if (this.mcServer.isSinglePlayer() && this.playerEntity.username.equals(this.mcServer.getServerOwner()))
653        {
654            logger.info("Stopping singleplayer server as player logged out");
655            this.mcServer.initiateShutdown();
656        }
657    }
658
659    /**
660     * Default handler called for packets that don't have their own handlers in NetClientHandler; currentlly does
661     * nothing.
662     */
663    public void unexpectedPacket(Packet par1Packet)
664    {
665        logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + par1Packet.getClass());
666        this.kickPlayerFromServer("Protocol error, unexpected packet");
667    }
668
669    /**
670     * addToSendQueue. if it is a chat packet, check before sending it
671     */
672    public void sendPacketToPlayer(Packet par1Packet)
673    {
674        if (par1Packet instanceof Packet3Chat)
675        {
676            Packet3Chat var2 = (Packet3Chat)par1Packet;
677            int var3 = this.playerEntity.getChatVisibility();
678
679            if (var3 == 2)
680            {
681                return;
682            }
683
684            if (var3 == 1 && !var2.getIsServer())
685            {
686                return;
687            }
688        }
689
690        this.netManager.addToSendQueue(par1Packet);
691    }
692
693    public void handleBlockItemSwitch(Packet16BlockItemSwitch par1Packet16BlockItemSwitch)
694    {
695        if (par1Packet16BlockItemSwitch.id >= 0 && par1Packet16BlockItemSwitch.id < InventoryPlayer.getHotbarSize())
696        {
697            this.playerEntity.inventory.currentItem = par1Packet16BlockItemSwitch.id;
698        }
699        else
700        {
701            logger.warning(this.playerEntity.username + " tried to set an invalid carried item");
702        }
703    }
704
705    public void handleChat(Packet3Chat par1Packet3Chat)
706    {
707        par1Packet3Chat = FMLNetworkHandler.handleChatMessage(this, par1Packet3Chat);
708        if (this.playerEntity.getChatVisibility() == 2)
709        {
710            this.sendPacketToPlayer(new Packet3Chat("Cannot send chat message."));
711        }
712        else
713        {
714            String var2 = par1Packet3Chat.message;
715
716            if (var2.length() > 100)
717            {
718                this.kickPlayerFromServer("Chat message too long");
719            }
720            else
721            {
722                var2 = var2.trim();
723
724                for (int var3 = 0; var3 < var2.length(); ++var3)
725                {
726                    if (!ChatAllowedCharacters.isAllowedCharacter(var2.charAt(var3)))
727                    {
728                        this.kickPlayerFromServer("Illegal characters in chat");
729                        return;
730                    }
731                }
732
733                if (var2.startsWith("/"))
734                {
735                    this.handleSlashCommand(var2);
736                }
737                else
738                {
739                    if (this.playerEntity.getChatVisibility() == 1)
740                    {
741                        this.sendPacketToPlayer(new Packet3Chat("Cannot send chat message."));
742                        return;
743                    }
744                    ServerChatEvent event = new ServerChatEvent(this.playerEntity, var2, "<" + this.playerEntity.username + "> " + var2);
745                    if (MinecraftForge.EVENT_BUS.post(event))
746                    {
747                        return;
748                    }
749                    var2 = event.line;
750                    logger.info(var2);
751                    this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat(var2, false));
752                }
753
754                this.chatSpamThresholdCount += 20;
755
756                if (this.chatSpamThresholdCount > 200 && !this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username))
757                {
758                    this.kickPlayerFromServer("disconnect.spam");
759                }
760            }
761        }
762    }
763
764    /**
765     * Processes a / command
766     */
767    private void handleSlashCommand(String par1Str)
768    {
769        this.mcServer.getCommandManager().executeCommand(this.playerEntity, par1Str);
770    }
771
772    public void handleAnimation(Packet18Animation par1Packet18Animation)
773    {
774        if (par1Packet18Animation.animate == 1)
775        {
776            this.playerEntity.swingItem();
777        }
778    }
779
780    /**
781     * runs registerPacket on the given Packet19EntityAction
782     */
783    public void handleEntityAction(Packet19EntityAction par1Packet19EntityAction)
784    {
785        if (par1Packet19EntityAction.state == 1)
786        {
787            this.playerEntity.setSneaking(true);
788        }
789        else if (par1Packet19EntityAction.state == 2)
790        {
791            this.playerEntity.setSneaking(false);
792        }
793        else if (par1Packet19EntityAction.state == 4)
794        {
795            this.playerEntity.setSprinting(true);
796        }
797        else if (par1Packet19EntityAction.state == 5)
798        {
799            this.playerEntity.setSprinting(false);
800        }
801        else if (par1Packet19EntityAction.state == 3)
802        {
803            this.playerEntity.wakeUpPlayer(false, true, true);
804            this.hasMoved = false;
805        }
806    }
807
808    public void handleKickDisconnect(Packet255KickDisconnect par1Packet255KickDisconnect)
809    {
810        this.netManager.networkShutdown("disconnect.quitting", new Object[0]);
811    }
812
813    /**
814     * returns 0 for memoryMapped connections
815     */
816    public int packetSize()
817    {
818        return this.netManager.packetSize();
819    }
820
821    public void handleUseEntity(Packet7UseEntity par1Packet7UseEntity)
822    {
823        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
824        Entity var3 = var2.getEntityByID(par1Packet7UseEntity.targetEntity);
825
826        if (var3 != null)
827        {
828            boolean var4 = this.playerEntity.canEntityBeSeen(var3);
829            double var5 = 36.0D;
830
831            if (!var4)
832            {
833                var5 = 9.0D;
834            }
835
836            if (this.playerEntity.getDistanceSqToEntity(var3) < var5)
837            {
838                if (par1Packet7UseEntity.isLeftClick == 0)
839                {
840                    this.playerEntity.interactWith(var3);
841                }
842                else if (par1Packet7UseEntity.isLeftClick == 1)
843                {
844                    this.playerEntity.attackTargetEntityWithCurrentItem(var3);
845                }
846            }
847        }
848    }
849
850    public void handleClientCommand(Packet205ClientCommand par1Packet205ClientCommand)
851    {
852        if (par1Packet205ClientCommand.forceRespawn == 1)
853        {
854            if (this.playerEntity.playerConqueredTheEnd)
855            {
856                this.playerEntity = this.mcServer.getConfigurationManager().respawnPlayer(this.playerEntity, 0, true);
857            }
858            else if (this.playerEntity.getServerForPlayer().getWorldInfo().isHardcoreModeEnabled())
859            {
860                if (this.mcServer.isSinglePlayer() && this.playerEntity.username.equals(this.mcServer.getServerOwner()))
861                {
862                    this.playerEntity.playerNetServerHandler.kickPlayerFromServer("You have died. Game over, man, it\'s game over!");
863                    this.mcServer.deleteWorldAndStopServer();
864                }
865                else
866                {
867                    BanEntry var2 = new BanEntry(this.playerEntity.username);
868                    var2.setBanReason("Death in Hardcore");
869                    this.mcServer.getConfigurationManager().getBannedPlayers().put(var2);
870                    this.playerEntity.playerNetServerHandler.kickPlayerFromServer("You have died. Game over, man, it\'s game over!");
871                }
872            }
873            else
874            {
875                if (this.playerEntity.getHealth() > 0)
876                {
877                    return;
878                }
879
880                this.playerEntity = this.mcServer.getConfigurationManager().respawnPlayer(this.playerEntity, playerEntity.dimension, false);
881            }
882        }
883    }
884
885    /**
886     * If this returns false, all packets will be queued for the main thread to handle, even if they would otherwise be
887     * processed asynchronously. Used to avoid processing packets on the client before the world has been downloaded
888     * (which happens on the main thread)
889     */
890    public boolean canProcessPacketsAsync()
891    {
892        return true;
893    }
894
895    /**
896     * respawns the player
897     */
898    public void handleRespawn(Packet9Respawn par1Packet9Respawn) {}
899
900    public void handleCloseWindow(Packet101CloseWindow par1Packet101CloseWindow)
901    {
902        this.playerEntity.closeInventory();
903    }
904
905    public void handleWindowClick(Packet102WindowClick par1Packet102WindowClick)
906    {
907        if (this.playerEntity.openContainer.windowId == par1Packet102WindowClick.window_Id && this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity))
908        {
909            ItemStack var2 = this.playerEntity.openContainer.slotClick(par1Packet102WindowClick.inventorySlot, par1Packet102WindowClick.mouseClick, par1Packet102WindowClick.holdingShift, this.playerEntity);
910
911            if (ItemStack.areItemStacksEqual(par1Packet102WindowClick.itemStack, var2))
912            {
913                this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet106Transaction(par1Packet102WindowClick.window_Id, par1Packet102WindowClick.action, true));
914                this.playerEntity.playerInventoryBeingManipulated = true;
915                this.playerEntity.openContainer.detectAndSendChanges();
916                this.playerEntity.updateHeldItem();
917                this.playerEntity.playerInventoryBeingManipulated = false;
918            }
919            else
920            {
921                this.field_72586_s.addKey(this.playerEntity.openContainer.windowId, Short.valueOf(par1Packet102WindowClick.action));
922                this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet106Transaction(par1Packet102WindowClick.window_Id, par1Packet102WindowClick.action, false));
923                this.playerEntity.openContainer.setPlayerIsPresent(this.playerEntity, false);
924                ArrayList var3 = new ArrayList();
925
926                for (int var4 = 0; var4 < this.playerEntity.openContainer.inventorySlots.size(); ++var4)
927                {
928                    var3.add(((Slot)this.playerEntity.openContainer.inventorySlots.get(var4)).getStack());
929                }
930
931                this.playerEntity.sendContainerAndContentsToPlayer(this.playerEntity.openContainer, var3);
932            }
933        }
934    }
935
936    public void handleEnchantItem(Packet108EnchantItem par1Packet108EnchantItem)
937    {
938        if (this.playerEntity.openContainer.windowId == par1Packet108EnchantItem.windowId && this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity))
939        {
940            this.playerEntity.openContainer.enchantItem(this.playerEntity, par1Packet108EnchantItem.enchantment);
941            this.playerEntity.openContainer.detectAndSendChanges();
942        }
943    }
944
945    /**
946     * Handle a creative slot packet.
947     */
948    public void handleCreativeSetSlot(Packet107CreativeSetSlot par1Packet107CreativeSetSlot)
949    {
950        if (this.playerEntity.theItemInWorldManager.isCreative())
951        {
952            boolean var2 = par1Packet107CreativeSetSlot.slot < 0;
953            ItemStack var3 = par1Packet107CreativeSetSlot.itemStack;
954            boolean var4 = par1Packet107CreativeSetSlot.slot >= 1 && par1Packet107CreativeSetSlot.slot < 36 + InventoryPlayer.getHotbarSize();
955            boolean var5 = var3 == null || var3.itemID < Item.itemsList.length && var3.itemID >= 0 && Item.itemsList[var3.itemID] != null;
956            boolean var6 = var3 == null || var3.getItemDamage() >= 0 && var3.getItemDamage() >= 0 && var3.stackSize <= 64 && var3.stackSize > 0;
957
958            if (var4 && var5 && var6)
959            {
960                if (var3 == null)
961                {
962                    this.playerEntity.inventoryContainer.putStackInSlot(par1Packet107CreativeSetSlot.slot, (ItemStack)null);
963                }
964                else
965                {
966                    this.playerEntity.inventoryContainer.putStackInSlot(par1Packet107CreativeSetSlot.slot, var3);
967                }
968
969                this.playerEntity.inventoryContainer.setPlayerIsPresent(this.playerEntity, true);
970            }
971            else if (var2 && var5 && var6 && this.creativeItemCreationSpamThresholdTally < 200)
972            {
973                this.creativeItemCreationSpamThresholdTally += 20;
974                EntityItem var7 = this.playerEntity.dropPlayerItem(var3);
975
976                if (var7 != null)
977                {
978                    var7.func_70288_d();
979                }
980            }
981        }
982    }
983
984    public void handleTransaction(Packet106Transaction par1Packet106Transaction)
985    {
986        Short var2 = (Short)this.field_72586_s.lookup(this.playerEntity.openContainer.windowId);
987
988        if (var2 != null && par1Packet106Transaction.shortWindowId == var2.shortValue() && this.playerEntity.openContainer.windowId == par1Packet106Transaction.windowId && !this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity))
989        {
990            this.playerEntity.openContainer.setPlayerIsPresent(this.playerEntity, true);
991        }
992    }
993
994    /**
995     * Updates Client side signs
996     */
997    public void handleUpdateSign(Packet130UpdateSign par1Packet130UpdateSign)
998    {
999        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
1000
1001        if (var2.blockExists(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition))
1002        {
1003            TileEntity var3 = var2.getBlockTileEntity(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition);
1004
1005            if (var3 instanceof TileEntitySign)
1006            {
1007                TileEntitySign var4 = (TileEntitySign)var3;
1008
1009                if (!var4.isEditable())
1010                {
1011                    this.mcServer.logWarning("Player " + this.playerEntity.username + " just tried to change non-editable sign");
1012                    return;
1013                }
1014            }
1015
1016            int var6;
1017            int var8;
1018
1019            for (var8 = 0; var8 < 4; ++var8)
1020            {
1021                boolean var5 = true;
1022
1023                if (par1Packet130UpdateSign.signLines[var8].length() > 15)
1024                {
1025                    var5 = false;
1026                }
1027                else
1028                {
1029                    for (var6 = 0; var6 < par1Packet130UpdateSign.signLines[var8].length(); ++var6)
1030                    {
1031                        if (ChatAllowedCharacters.allowedCharacters.indexOf(par1Packet130UpdateSign.signLines[var8].charAt(var6)) < 0)
1032                        {
1033                            var5 = false;
1034                        }
1035                    }
1036                }
1037
1038                if (!var5)
1039                {
1040                    par1Packet130UpdateSign.signLines[var8] = "!?";
1041                }
1042            }
1043
1044            if (var3 instanceof TileEntitySign)
1045            {
1046                var8 = par1Packet130UpdateSign.xPosition;
1047                int var9 = par1Packet130UpdateSign.yPosition;
1048                var6 = par1Packet130UpdateSign.zPosition;
1049                TileEntitySign var7 = (TileEntitySign)var3;
1050                System.arraycopy(par1Packet130UpdateSign.signLines, 0, var7.signText, 0, 4);
1051                var7.onInventoryChanged();
1052                var2.markBlockForUpdate(var8, var9, var6);
1053            }
1054        }
1055    }
1056
1057    /**
1058     * Handle a keep alive packet.
1059     */
1060    public void handleKeepAlive(Packet0KeepAlive par1Packet0KeepAlive)
1061    {
1062        if (par1Packet0KeepAlive.randomId == this.keepAliveRandomID)
1063        {
1064            int var2 = (int)(System.nanoTime() / 1000000L - this.keepAliveTimeSent);
1065            this.playerEntity.ping = (this.playerEntity.ping * 3 + var2) / 4;
1066        }
1067    }
1068
1069    /**
1070     * determine if it is a server handler
1071     */
1072    public boolean isServerHandler()
1073    {
1074        return true;
1075    }
1076
1077    /**
1078     * Handle a player abilities packet.
1079     */
1080    public void handlePlayerAbilities(Packet202PlayerAbilities par1Packet202PlayerAbilities)
1081    {
1082        this.playerEntity.capabilities.isFlying = par1Packet202PlayerAbilities.getFlying() && this.playerEntity.capabilities.allowFlying;
1083    }
1084
1085    public void handleAutoComplete(Packet203AutoComplete par1Packet203AutoComplete)
1086    {
1087        StringBuilder var2 = new StringBuilder();
1088        String var4;
1089
1090        for (Iterator var3 = this.mcServer.getPossibleCompletions(this.playerEntity, par1Packet203AutoComplete.getText()).iterator(); var3.hasNext(); var2.append(var4))
1091        {
1092            var4 = (String)var3.next();
1093
1094            if (var2.length() > 0)
1095            {
1096                var2.append("\u0000");
1097            }
1098        }
1099
1100        this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet203AutoComplete(var2.toString()));
1101    }
1102
1103    public void handleClientInfo(Packet204ClientInfo par1Packet204ClientInfo)
1104    {
1105        this.playerEntity.updateClientInfo(par1Packet204ClientInfo);
1106    }
1107
1108    public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload)
1109    {
1110        FMLNetworkHandler.handlePacket250Packet(par1Packet250CustomPayload, netManager, this);
1111    }
1112
1113    public void handleVanilla250Packet(Packet250CustomPayload par1Packet250CustomPayload)
1114    {
1115        DataInputStream var2;
1116        ItemStack var3;
1117        ItemStack var4;
1118
1119        if ("MC|BEdit".equals(par1Packet250CustomPayload.channel))
1120        {
1121            try
1122            {
1123                var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1124                var3 = Packet.readItemStack(var2);
1125
1126                if (!ItemWritableBook.validBookTagPages(var3.getTagCompound()))
1127                {
1128                    throw new IOException("Invalid book tag!");
1129                }
1130
1131                var4 = this.playerEntity.inventory.getCurrentItem();
1132
1133                if (var3 != null && var3.itemID == Item.writableBook.itemID && var3.itemID == var4.itemID)
1134                {
1135                    var4.setTagInfo("pages", var3.getTagCompound().getTagList("pages"));
1136                }
1137            }
1138            catch (Exception var12)
1139            {
1140                var12.printStackTrace();
1141            }
1142        }
1143        else if ("MC|BSign".equals(par1Packet250CustomPayload.channel))
1144        {
1145            try
1146            {
1147                var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1148                var3 = Packet.readItemStack(var2);
1149
1150                if (!ItemEditableBook.validBookTagContents(var3.getTagCompound()))
1151                {
1152                    throw new IOException("Invalid book tag!");
1153                }
1154
1155                var4 = this.playerEntity.inventory.getCurrentItem();
1156
1157                if (var3 != null && var3.itemID == Item.writtenBook.itemID && var4.itemID == Item.writableBook.itemID)
1158                {
1159                    var4.setTagInfo("author", new NBTTagString("author", this.playerEntity.username));
1160                    var4.setTagInfo("title", new NBTTagString("title", var3.getTagCompound().getString("title")));
1161                    var4.setTagInfo("pages", var3.getTagCompound().getTagList("pages"));
1162                    var4.itemID = Item.writtenBook.itemID;
1163                }
1164            }
1165            catch (Exception var11)
1166            {
1167                var11.printStackTrace();
1168            }
1169        }
1170        else
1171        {
1172            int var14;
1173
1174            if ("MC|TrSel".equals(par1Packet250CustomPayload.channel))
1175            {
1176                try
1177                {
1178                    var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1179                    var14 = var2.readInt();
1180                    Container var15 = this.playerEntity.openContainer;
1181
1182                    if (var15 instanceof ContainerMerchant)
1183                    {
1184                        ((ContainerMerchant)var15).setCurrentRecipeIndex(var14);
1185                    }
1186                }
1187                catch (Exception var10)
1188                {
1189                    var10.printStackTrace();
1190                }
1191            }
1192            else
1193            {
1194                int var18;
1195
1196                if ("MC|AdvCdm".equals(par1Packet250CustomPayload.channel))
1197                {
1198                    if (!this.mcServer.isCommandBlockEnabled())
1199                    {
1200                        this.playerEntity.sendChatToPlayer(this.playerEntity.translateString("advMode.notEnabled", new Object[0]));
1201                    }
1202                    else if (this.playerEntity.canCommandSenderUseCommand(2, "") && this.playerEntity.capabilities.isCreativeMode)
1203                    {
1204                        try
1205                        {
1206                            var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1207                            var14 = var2.readInt();
1208                            var18 = var2.readInt();
1209                            int var5 = var2.readInt();
1210                            String var6 = Packet.readString(var2, 256);
1211                            TileEntity var7 = this.playerEntity.worldObj.getBlockTileEntity(var14, var18, var5);
1212
1213                            if (var7 != null && var7 instanceof TileEntityCommandBlock)
1214                            {
1215                                ((TileEntityCommandBlock)var7).setCommand(var6);
1216                                this.playerEntity.worldObj.markBlockForUpdate(var14, var18, var5);
1217                                this.playerEntity.sendChatToPlayer("Command set: " + var6);
1218                            }
1219                        }
1220                        catch (Exception var9)
1221                        {
1222                            var9.printStackTrace();
1223                        }
1224                    }
1225                    else
1226                    {
1227                        this.playerEntity.sendChatToPlayer(this.playerEntity.translateString("advMode.notAllowed", new Object[0]));
1228                    }
1229                }
1230                else if ("MC|Beacon".equals(par1Packet250CustomPayload.channel))
1231                {
1232                    if (this.playerEntity.openContainer instanceof ContainerBeacon)
1233                    {
1234                        try
1235                        {
1236                            var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1237                            var14 = var2.readInt();
1238                            var18 = var2.readInt();
1239                            ContainerBeacon var17 = (ContainerBeacon)this.playerEntity.openContainer;
1240                            Slot var19 = var17.getSlot(0);
1241
1242                            if (var19.getHasStack())
1243                            {
1244                                var19.decrStackSize(1);
1245                                TileEntityBeacon var20 = var17.getBeacon();
1246                                var20.func_82128_d(var14);
1247                                var20.func_82127_e(var18);
1248                                var20.onInventoryChanged();
1249                            }
1250                        }
1251                        catch (Exception var8)
1252                        {
1253                            var8.printStackTrace();
1254                        }
1255                    }
1256                }
1257                else if ("MC|ItemName".equals(par1Packet250CustomPayload.channel) && this.playerEntity.openContainer instanceof ContainerRepair)
1258                {
1259                    ContainerRepair var13 = (ContainerRepair)this.playerEntity.openContainer;
1260
1261                    if (par1Packet250CustomPayload.data != null && par1Packet250CustomPayload.data.length >= 1)
1262                    {
1263                        String var16 = ChatAllowedCharacters.filerAllowedCharacters(new String(par1Packet250CustomPayload.data));
1264
1265                        if (var16.length() <= 30)
1266                        {
1267                            var13.updateItemName(var16);
1268                        }
1269                    }
1270                    else
1271                    {
1272                        var13.updateItemName("");
1273                    }
1274                }
1275            }
1276        }
1277    }
1278    
1279
1280    @Override
1281
1282    /**
1283     * Contains logic for handling packets containing arbitrary unique item data. Currently this is only for maps.
1284     */
1285    public void handleMapData(Packet131MapData par1Packet131MapData)
1286    {
1287        FMLNetworkHandler.handlePacket131Packet(this, par1Packet131MapData);
1288    }
1289
1290    // modloader compat -- yuk!
1291    @Override
1292    public EntityPlayerMP getPlayer()
1293    {
1294        return playerEntity;
1295    }
1296}