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                double var19 = Math.min(Math.abs(var13), Math.abs(this.playerEntity.motionX));
323                double var21 = Math.min(Math.abs(var15), Math.abs(this.playerEntity.motionY));
324                double var23 = Math.min(Math.abs(var17), Math.abs(this.playerEntity.motionZ));
325                double var25 = var19 * var19 + var21 * var21 + var23 * var23;
326
327                if (var25 > 100.0D && (!this.mcServer.isSinglePlayer() || !this.mcServer.getServerOwner().equals(this.playerEntity.username)))
328                {
329                    logger.warning(this.playerEntity.username + " moved too quickly! " + var13 + "," + var15 + "," + var17 + " (" + var19 + ", " + var21 + ", " + var23 + ")");
330                    this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch);
331                    return;
332                }
333
334                float var27 = 0.0625F;
335                boolean var28 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty();
336
337                if (this.playerEntity.onGround && !par1Packet10Flying.onGround && var15 > 0.0D)
338                {
339                    this.playerEntity.addExhaustion(0.2F);
340                }
341
342                if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
343                {
344                    return;
345                }
346
347                this.playerEntity.moveEntity(var13, var15, var17);
348                this.playerEntity.onGround = par1Packet10Flying.onGround;
349                this.playerEntity.addMovementStat(var13, var15, var17);
350                double var29 = var15;
351                var13 = var5 - this.playerEntity.posX;
352                var15 = var7 - this.playerEntity.posY;
353
354                if (var15 > -0.5D || var15 < 0.5D)
355                {
356                    var15 = 0.0D;
357                }
358
359                var17 = var9 - this.playerEntity.posZ;
360                var25 = var13 * var13 + var15 * var15 + var17 * var17;
361                boolean var31 = false;
362
363                if (var25 > 0.0625D && !this.playerEntity.isPlayerSleeping() && !this.playerEntity.theItemInWorldManager.isCreative())
364                {
365                    var31 = true;
366                    logger.warning(this.playerEntity.username + " moved wrongly!");
367                }
368
369                if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
370                {
371                    return;
372                }
373
374                this.playerEntity.setPositionAndRotation(var5, var7, var9, var11, var12);
375                boolean var32 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty();
376
377                if (var28 && (var31 || !var32) && !this.playerEntity.isPlayerSleeping() && !this.playerEntity.noClip)
378                {
379                    this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12);
380                    return;
381                }
382
383                AxisAlignedBB var33 = this.playerEntity.boundingBox.copy().expand((double)var27, (double)var27, (double)var27).addCoord(0.0D, -0.55D, 0.0D);
384
385                if (!this.mcServer.isFlightAllowed() && !this.playerEntity.theItemInWorldManager.isCreative() && !var2.isAABBNonEmpty(var33)  && !this.playerEntity.capabilities.allowFlying)
386                {
387                    if (var29 >= -0.03125D)
388                    {
389                        ++this.ticksForFloatKick;
390
391                        if (this.ticksForFloatKick > 80)
392                        {
393                            logger.warning(this.playerEntity.username + " was kicked for floating too long!");
394                            this.kickPlayerFromServer("Flying is not enabled on this server");
395                            return;
396                        }
397                    }
398                }
399                else
400                {
401                    this.ticksForFloatKick = 0;
402                }
403
404                if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving
405                {
406                    return;
407                }
408
409                this.playerEntity.onGround = par1Packet10Flying.onGround;
410                this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity);
411                this.playerEntity.updateFlyingState(this.playerEntity.posY - var3, par1Packet10Flying.onGround);
412            }
413        }
414    }
415
416    /**
417     * Moves the player to the specified destination and rotation
418     */
419    public void setPlayerLocation(double par1, double par3, double par5, float par7, float par8)
420    {
421        this.hasMoved = false;
422        this.lastPosX = par1;
423        this.lastPosY = par3;
424        this.lastPosZ = par5;
425        this.playerEntity.setPositionAndRotation(par1, par3, par5, par7, par8);
426        this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet13PlayerLookMove(par1, par3 + 1.6200000047683716D, par3, par5, par7, par8, false));
427    }
428
429    public void handleBlockDig(Packet14BlockDig par1Packet14BlockDig)
430    {
431        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
432
433        if (par1Packet14BlockDig.status == 4)
434        {
435            this.playerEntity.dropOneItem(false);
436        }
437        else if (par1Packet14BlockDig.status == 3)
438        {
439            this.playerEntity.dropOneItem(true);
440        }
441        else if (par1Packet14BlockDig.status == 5)
442        {
443            this.playerEntity.stopUsingItem();
444        }
445        else
446        {
447            int var3 = this.mcServer.getSpawnProtectionSize();
448            boolean var4 = var2.provider.dimensionId != 0 || this.mcServer.getConfigurationManager().getOps().isEmpty() || this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username) || var3 <= 0 || this.mcServer.isSinglePlayer();
449            boolean var5 = false;
450
451            if (par1Packet14BlockDig.status == 0)
452            {
453                var5 = true;
454            }
455
456            if (par1Packet14BlockDig.status == 1)
457            {
458                var5 = true;
459            }
460
461            if (par1Packet14BlockDig.status == 2)
462            {
463                var5 = true;
464            }
465
466            int var6 = par1Packet14BlockDig.xPosition;
467            int var7 = par1Packet14BlockDig.yPosition;
468            int var8 = par1Packet14BlockDig.zPosition;
469
470            if (var5)
471            {
472                double var9 = this.playerEntity.posX - ((double)var6 + 0.5D);
473                double var11 = this.playerEntity.posY - ((double)var7 + 0.5D) + 1.5D;
474                double var13 = this.playerEntity.posZ - ((double)var8 + 0.5D);
475                double var15 = var9 * var9 + var11 * var11 + var13 * var13;
476
477                double dist = playerEntity.theItemInWorldManager.getBlockReachDistance() + 1;
478                dist *= dist;
479
480                if (var15 > dist)
481                {
482                    return;
483                }
484
485                if (var7 >= this.mcServer.getBuildLimit())
486                {
487                    return;
488                }
489            }
490
491            ChunkCoordinates var17 = var2.getSpawnPoint();
492            int var10 = MathHelper.abs_int(var6 - var17.posX);
493            int var18 = MathHelper.abs_int(var8 - var17.posZ);
494
495            if (var10 > var18)
496            {
497                var18 = var10;
498            }
499
500            if (par1Packet14BlockDig.status == 0)
501            {
502                if (var18 <= var3 && !var4)
503                {
504                    ForgeEventFactory.onPlayerInteract(playerEntity, Action.LEFT_CLICK_BLOCK, var6, var7, var8, 0);
505                    this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2));
506                }
507                else
508                {
509                    this.playerEntity.theItemInWorldManager.onBlockClicked(var6, var7, var8, par1Packet14BlockDig.face);
510                }
511            }
512            else if (par1Packet14BlockDig.status == 2)
513            {
514                this.playerEntity.theItemInWorldManager.uncheckedTryHarvestBlock(var6, var7, var8);
515
516                if (var2.getBlockId(var6, var7, var8) != 0)
517                {
518                    this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2));
519                }
520            }
521            else if (par1Packet14BlockDig.status == 1)
522            {
523                this.playerEntity.theItemInWorldManager.cancelDestroyingBlock(var6, var7, var8);
524
525                if (var2.getBlockId(var6, var7, var8) != 0)
526                {
527                    this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2));
528                }
529            }
530        }
531    }
532
533    public void handlePlace(Packet15Place par1Packet15Place)
534    {
535        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
536        ItemStack var3 = this.playerEntity.inventory.getCurrentItem();
537        boolean var4 = false;
538        int var5 = par1Packet15Place.getXPosition();
539        int var6 = par1Packet15Place.getYPosition();
540        int var7 = par1Packet15Place.getZPosition();
541        int var8 = par1Packet15Place.getDirection();
542        int var9 = this.mcServer.getSpawnProtectionSize();
543        boolean var10 = var2.provider.dimensionId != 0 || this.mcServer.getConfigurationManager().getOps().isEmpty() || this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username) || var9 <= 0 || this.mcServer.isSinglePlayer();
544
545        if (par1Packet15Place.getDirection() == 255)
546        {
547            if (var3 == null)
548            {
549                return;
550            }
551
552            PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(playerEntity, PlayerInteractEvent.Action.RIGHT_CLICK_AIR, 0, 0, 0, -1);
553            if (event.useItem != Event.Result.DENY)
554            {
555                this.playerEntity.theItemInWorldManager.tryUseItem(this.playerEntity, var2, var3);
556            }
557        }
558        else if (par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit() - 1 && (par1Packet15Place.getDirection() == 1 || par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit()))
559        {
560            this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet3Chat("\u00a77Height limit for building is " + this.mcServer.getBuildLimit()));
561            var4 = true;
562        }
563        else
564        {
565            ChunkCoordinates var11 = var2.getSpawnPoint();
566            int var12 = MathHelper.abs_int(var5 - var11.posX);
567            int var13 = MathHelper.abs_int(var7 - var11.posZ);
568
569            if (var12 > var13)
570            {
571                var13 = var12;
572            }
573
574            double dist = playerEntity.theItemInWorldManager.getBlockReachDistance() + 1;
575            dist *= dist;
576            if (this.hasMoved && this.playerEntity.getDistanceSq((double)var5 + 0.5D, (double)var6 + 0.5D, (double)var7 + 0.5D) < dist && (var13 > var9 || var10))
577            {
578                this.playerEntity.theItemInWorldManager.activateBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8, par1Packet15Place.getXOffset(), par1Packet15Place.getYOffset(), par1Packet15Place.getZOffset());
579            }
580
581            var4 = true;
582        }
583
584        if (var4)
585        {
586            this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2));
587
588            if (var8 == 0)
589            {
590                --var6;
591            }
592
593            if (var8 == 1)
594            {
595                ++var6;
596            }
597
598            if (var8 == 2)
599            {
600                --var7;
601            }
602
603            if (var8 == 3)
604            {
605                ++var7;
606            }
607
608            if (var8 == 4)
609            {
610                --var5;
611            }
612
613            if (var8 == 5)
614            {
615                ++var5;
616            }
617
618            this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2));
619        }
620
621        var3 = this.playerEntity.inventory.getCurrentItem();
622
623        if (var3 != null && var3.stackSize == 0)
624        {
625            this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = null;
626            var3 = null;
627        }
628
629        if (var3 == null || var3.getMaxItemUseDuration() == 0)
630        {
631            this.playerEntity.playerInventoryBeingManipulated = true;
632            this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = ItemStack.copyItemStack(this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem]);
633            Slot var14 = this.playerEntity.openContainer.getSlotFromInventory(this.playerEntity.inventory, this.playerEntity.inventory.currentItem);
634            this.playerEntity.openContainer.detectAndSendChanges();
635            this.playerEntity.playerInventoryBeingManipulated = false;
636
637            if (!ItemStack.areItemStacksEqual(this.playerEntity.inventory.getCurrentItem(), par1Packet15Place.getItemStack()))
638            {
639                this.sendPacketToPlayer(new Packet103SetSlot(this.playerEntity.openContainer.windowId, var14.slotNumber, this.playerEntity.inventory.getCurrentItem()));
640            }
641        }
642    }
643
644    public void handleErrorMessage(String par1Str, Object[] par2ArrayOfObj)
645    {
646        logger.info(this.playerEntity.username + " lost connection: " + par1Str);
647        this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game."));
648        this.mcServer.getConfigurationManager().playerLoggedOut(this.playerEntity);
649        this.connectionClosed = true;
650
651        if (this.mcServer.isSinglePlayer() && this.playerEntity.username.equals(this.mcServer.getServerOwner()))
652        {
653            logger.info("Stopping singleplayer server as player logged out");
654            this.mcServer.initiateShutdown();
655        }
656    }
657
658    /**
659     * Default handler called for packets that don't have their own handlers in NetClientHandler; currentlly does
660     * nothing.
661     */
662    public void unexpectedPacket(Packet par1Packet)
663    {
664        logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + par1Packet.getClass());
665        this.kickPlayerFromServer("Protocol error, unexpected packet");
666    }
667
668    /**
669     * addToSendQueue. if it is a chat packet, check before sending it
670     */
671    public void sendPacketToPlayer(Packet par1Packet)
672    {
673        if (par1Packet instanceof Packet3Chat)
674        {
675            Packet3Chat var2 = (Packet3Chat)par1Packet;
676            int var3 = this.playerEntity.getChatVisibility();
677
678            if (var3 == 2)
679            {
680                return;
681            }
682
683            if (var3 == 1 && !var2.getIsServer())
684            {
685                return;
686            }
687        }
688
689        this.netManager.addToSendQueue(par1Packet);
690    }
691
692    public void handleBlockItemSwitch(Packet16BlockItemSwitch par1Packet16BlockItemSwitch)
693    {
694        if (par1Packet16BlockItemSwitch.id >= 0 && par1Packet16BlockItemSwitch.id < InventoryPlayer.getHotbarSize())
695        {
696            this.playerEntity.inventory.currentItem = par1Packet16BlockItemSwitch.id;
697        }
698        else
699        {
700            logger.warning(this.playerEntity.username + " tried to set an invalid carried item");
701        }
702    }
703
704    public void handleChat(Packet3Chat par1Packet3Chat)
705    {
706        par1Packet3Chat = FMLNetworkHandler.handleChatMessage(this, par1Packet3Chat);
707        if (this.playerEntity.getChatVisibility() == 2)
708        {
709            this.sendPacketToPlayer(new Packet3Chat("Cannot send chat message."));
710        }
711        else
712        {
713            String var2 = par1Packet3Chat.message;
714
715            if (var2.length() > 100)
716            {
717                this.kickPlayerFromServer("Chat message too long");
718            }
719            else
720            {
721                var2 = var2.trim();
722
723                for (int var3 = 0; var3 < var2.length(); ++var3)
724                {
725                    if (!ChatAllowedCharacters.isAllowedCharacter(var2.charAt(var3)))
726                    {
727                        this.kickPlayerFromServer("Illegal characters in chat");
728                        return;
729                    }
730                }
731
732                if (var2.startsWith("/"))
733                {
734                    this.handleSlashCommand(var2);
735                }
736                else
737                {
738                    if (this.playerEntity.getChatVisibility() == 1)
739                    {
740                        this.sendPacketToPlayer(new Packet3Chat("Cannot send chat message."));
741                        return;
742                    }
743                    ServerChatEvent event = new ServerChatEvent(this.playerEntity, var2, "<" + this.playerEntity.username + "> " + var2);
744                    if (MinecraftForge.EVENT_BUS.post(event))
745                    {
746                        return;
747                    }
748                    var2 = event.line;
749                    logger.info(var2);
750                    this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat(var2, false));
751                }
752
753                this.chatSpamThresholdCount += 20;
754
755                if (this.chatSpamThresholdCount > 200 && !this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username))
756                {
757                    this.kickPlayerFromServer("disconnect.spam");
758                }
759            }
760        }
761    }
762
763    /**
764     * Processes a / command
765     */
766    private void handleSlashCommand(String par1Str)
767    {
768        this.mcServer.getCommandManager().executeCommand(this.playerEntity, par1Str);
769    }
770
771    public void handleAnimation(Packet18Animation par1Packet18Animation)
772    {
773        if (par1Packet18Animation.animate == 1)
774        {
775            this.playerEntity.swingItem();
776        }
777    }
778
779    /**
780     * runs registerPacket on the given Packet19EntityAction
781     */
782    public void handleEntityAction(Packet19EntityAction par1Packet19EntityAction)
783    {
784        if (par1Packet19EntityAction.state == 1)
785        {
786            this.playerEntity.setSneaking(true);
787        }
788        else if (par1Packet19EntityAction.state == 2)
789        {
790            this.playerEntity.setSneaking(false);
791        }
792        else if (par1Packet19EntityAction.state == 4)
793        {
794            this.playerEntity.setSprinting(true);
795        }
796        else if (par1Packet19EntityAction.state == 5)
797        {
798            this.playerEntity.setSprinting(false);
799        }
800        else if (par1Packet19EntityAction.state == 3)
801        {
802            this.playerEntity.wakeUpPlayer(false, true, true);
803            this.hasMoved = false;
804        }
805    }
806
807    public void handleKickDisconnect(Packet255KickDisconnect par1Packet255KickDisconnect)
808    {
809        this.netManager.networkShutdown("disconnect.quitting", new Object[0]);
810    }
811
812    /**
813     * returns 0 for memoryMapped connections
814     */
815    public int packetSize()
816    {
817        return this.netManager.packetSize();
818    }
819
820    public void handleUseEntity(Packet7UseEntity par1Packet7UseEntity)
821    {
822        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
823        Entity var3 = var2.getEntityByID(par1Packet7UseEntity.targetEntity);
824
825        if (var3 != null)
826        {
827            boolean var4 = this.playerEntity.canEntityBeSeen(var3);
828            double var5 = 36.0D;
829
830            if (!var4)
831            {
832                var5 = 9.0D;
833            }
834
835            if (this.playerEntity.getDistanceSqToEntity(var3) < var5)
836            {
837                if (par1Packet7UseEntity.isLeftClick == 0)
838                {
839                    this.playerEntity.interactWith(var3);
840                }
841                else if (par1Packet7UseEntity.isLeftClick == 1)
842                {
843                    this.playerEntity.attackTargetEntityWithCurrentItem(var3);
844                }
845            }
846        }
847    }
848
849    public void handleClientCommand(Packet205ClientCommand par1Packet205ClientCommand)
850    {
851        if (par1Packet205ClientCommand.forceRespawn == 1)
852        {
853            if (this.playerEntity.playerConqueredTheEnd)
854            {
855                this.playerEntity = this.mcServer.getConfigurationManager().respawnPlayer(this.playerEntity, 0, true);
856            }
857            else if (this.playerEntity.getServerForPlayer().getWorldInfo().isHardcoreModeEnabled())
858            {
859                if (this.mcServer.isSinglePlayer() && this.playerEntity.username.equals(this.mcServer.getServerOwner()))
860                {
861                    this.playerEntity.playerNetServerHandler.kickPlayerFromServer("You have died. Game over, man, it\'s game over!");
862                    this.mcServer.deleteWorldAndStopServer();
863                }
864                else
865                {
866                    BanEntry var2 = new BanEntry(this.playerEntity.username);
867                    var2.setBanReason("Death in Hardcore");
868                    this.mcServer.getConfigurationManager().getBannedPlayers().put(var2);
869                    this.playerEntity.playerNetServerHandler.kickPlayerFromServer("You have died. Game over, man, it\'s game over!");
870                }
871            }
872            else
873            {
874                if (this.playerEntity.getHealth() > 0)
875                {
876                    return;
877                }
878
879                this.playerEntity = this.mcServer.getConfigurationManager().respawnPlayer(this.playerEntity, playerEntity.dimension, false);
880            }
881        }
882    }
883
884    /**
885     * If this returns false, all packets will be queued for the main thread to handle, even if they would otherwise be
886     * processed asynchronously. Used to avoid processing packets on the client before the world has been downloaded
887     * (which happens on the main thread)
888     */
889    public boolean canProcessPacketsAsync()
890    {
891        return true;
892    }
893
894    /**
895     * respawns the player
896     */
897    public void handleRespawn(Packet9Respawn par1Packet9Respawn) {}
898
899    public void handleCloseWindow(Packet101CloseWindow par1Packet101CloseWindow)
900    {
901        this.playerEntity.closeInventory();
902    }
903
904    public void handleWindowClick(Packet102WindowClick par1Packet102WindowClick)
905    {
906        if (this.playerEntity.openContainer.windowId == par1Packet102WindowClick.window_Id && this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity))
907        {
908            ItemStack var2 = this.playerEntity.openContainer.slotClick(par1Packet102WindowClick.inventorySlot, par1Packet102WindowClick.mouseClick, par1Packet102WindowClick.holdingShift, this.playerEntity);
909
910            if (ItemStack.areItemStacksEqual(par1Packet102WindowClick.itemStack, var2))
911            {
912                this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet106Transaction(par1Packet102WindowClick.window_Id, par1Packet102WindowClick.action, true));
913                this.playerEntity.playerInventoryBeingManipulated = true;
914                this.playerEntity.openContainer.detectAndSendChanges();
915                this.playerEntity.updateHeldItem();
916                this.playerEntity.playerInventoryBeingManipulated = false;
917            }
918            else
919            {
920                this.field_72586_s.addKey(this.playerEntity.openContainer.windowId, Short.valueOf(par1Packet102WindowClick.action));
921                this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet106Transaction(par1Packet102WindowClick.window_Id, par1Packet102WindowClick.action, false));
922                this.playerEntity.openContainer.setPlayerIsPresent(this.playerEntity, false);
923                ArrayList var3 = new ArrayList();
924
925                for (int var4 = 0; var4 < this.playerEntity.openContainer.inventorySlots.size(); ++var4)
926                {
927                    var3.add(((Slot)this.playerEntity.openContainer.inventorySlots.get(var4)).getStack());
928                }
929
930                this.playerEntity.sendContainerAndContentsToPlayer(this.playerEntity.openContainer, var3);
931            }
932        }
933    }
934
935    public void handleEnchantItem(Packet108EnchantItem par1Packet108EnchantItem)
936    {
937        if (this.playerEntity.openContainer.windowId == par1Packet108EnchantItem.windowId && this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity))
938        {
939            this.playerEntity.openContainer.enchantItem(this.playerEntity, par1Packet108EnchantItem.enchantment);
940            this.playerEntity.openContainer.detectAndSendChanges();
941        }
942    }
943
944    /**
945     * Handle a creative slot packet.
946     */
947    public void handleCreativeSetSlot(Packet107CreativeSetSlot par1Packet107CreativeSetSlot)
948    {
949        if (this.playerEntity.theItemInWorldManager.isCreative())
950        {
951            boolean var2 = par1Packet107CreativeSetSlot.slot < 0;
952            ItemStack var3 = par1Packet107CreativeSetSlot.itemStack;
953            boolean var4 = par1Packet107CreativeSetSlot.slot >= 1 && par1Packet107CreativeSetSlot.slot < 36 + InventoryPlayer.getHotbarSize();
954            boolean var5 = var3 == null || var3.itemID < Item.itemsList.length && var3.itemID >= 0 && Item.itemsList[var3.itemID] != null;
955            boolean var6 = var3 == null || var3.getItemDamage() >= 0 && var3.getItemDamage() >= 0 && var3.stackSize <= 64 && var3.stackSize > 0;
956
957            if (var4 && var5 && var6)
958            {
959                if (var3 == null)
960                {
961                    this.playerEntity.inventoryContainer.putStackInSlot(par1Packet107CreativeSetSlot.slot, (ItemStack)null);
962                }
963                else
964                {
965                    this.playerEntity.inventoryContainer.putStackInSlot(par1Packet107CreativeSetSlot.slot, var3);
966                }
967
968                this.playerEntity.inventoryContainer.setPlayerIsPresent(this.playerEntity, true);
969            }
970            else if (var2 && var5 && var6 && this.creativeItemCreationSpamThresholdTally < 200)
971            {
972                this.creativeItemCreationSpamThresholdTally += 20;
973                EntityItem var7 = this.playerEntity.dropPlayerItem(var3);
974
975                if (var7 != null)
976                {
977                    var7.func_70288_d();
978                }
979            }
980        }
981    }
982
983    public void handleTransaction(Packet106Transaction par1Packet106Transaction)
984    {
985        Short var2 = (Short)this.field_72586_s.lookup(this.playerEntity.openContainer.windowId);
986
987        if (var2 != null && par1Packet106Transaction.shortWindowId == var2.shortValue() && this.playerEntity.openContainer.windowId == par1Packet106Transaction.windowId && !this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity))
988        {
989            this.playerEntity.openContainer.setPlayerIsPresent(this.playerEntity, true);
990        }
991    }
992
993    /**
994     * Updates Client side signs
995     */
996    public void handleUpdateSign(Packet130UpdateSign par1Packet130UpdateSign)
997    {
998        WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension);
999
1000        if (var2.blockExists(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition))
1001        {
1002            TileEntity var3 = var2.getBlockTileEntity(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition);
1003
1004            if (var3 instanceof TileEntitySign)
1005            {
1006                TileEntitySign var4 = (TileEntitySign)var3;
1007
1008                if (!var4.isEditable())
1009                {
1010                    this.mcServer.logWarning("Player " + this.playerEntity.username + " just tried to change non-editable sign");
1011                    return;
1012                }
1013            }
1014
1015            int var6;
1016            int var8;
1017
1018            for (var8 = 0; var8 < 4; ++var8)
1019            {
1020                boolean var5 = true;
1021
1022                if (par1Packet130UpdateSign.signLines[var8].length() > 15)
1023                {
1024                    var5 = false;
1025                }
1026                else
1027                {
1028                    for (var6 = 0; var6 < par1Packet130UpdateSign.signLines[var8].length(); ++var6)
1029                    {
1030                        if (ChatAllowedCharacters.allowedCharacters.indexOf(par1Packet130UpdateSign.signLines[var8].charAt(var6)) < 0)
1031                        {
1032                            var5 = false;
1033                        }
1034                    }
1035                }
1036
1037                if (!var5)
1038                {
1039                    par1Packet130UpdateSign.signLines[var8] = "!?";
1040                }
1041            }
1042
1043            if (var3 instanceof TileEntitySign)
1044            {
1045                var8 = par1Packet130UpdateSign.xPosition;
1046                int var9 = par1Packet130UpdateSign.yPosition;
1047                var6 = par1Packet130UpdateSign.zPosition;
1048                TileEntitySign var7 = (TileEntitySign)var3;
1049                System.arraycopy(par1Packet130UpdateSign.signLines, 0, var7.signText, 0, 4);
1050                var7.onInventoryChanged();
1051                var2.markBlockForUpdate(var8, var9, var6);
1052            }
1053        }
1054    }
1055
1056    /**
1057     * Handle a keep alive packet.
1058     */
1059    public void handleKeepAlive(Packet0KeepAlive par1Packet0KeepAlive)
1060    {
1061        if (par1Packet0KeepAlive.randomId == this.keepAliveRandomID)
1062        {
1063            int var2 = (int)(System.nanoTime() / 1000000L - this.keepAliveTimeSent);
1064            this.playerEntity.ping = (this.playerEntity.ping * 3 + var2) / 4;
1065        }
1066    }
1067
1068    /**
1069     * determine if it is a server handler
1070     */
1071    public boolean isServerHandler()
1072    {
1073        return true;
1074    }
1075
1076    /**
1077     * Handle a player abilities packet.
1078     */
1079    public void handlePlayerAbilities(Packet202PlayerAbilities par1Packet202PlayerAbilities)
1080    {
1081        this.playerEntity.capabilities.isFlying = par1Packet202PlayerAbilities.getFlying() && this.playerEntity.capabilities.allowFlying;
1082    }
1083
1084    public void handleAutoComplete(Packet203AutoComplete par1Packet203AutoComplete)
1085    {
1086        StringBuilder var2 = new StringBuilder();
1087        String var4;
1088
1089        for (Iterator var3 = this.mcServer.getPossibleCompletions(this.playerEntity, par1Packet203AutoComplete.getText()).iterator(); var3.hasNext(); var2.append(var4))
1090        {
1091            var4 = (String)var3.next();
1092
1093            if (var2.length() > 0)
1094            {
1095                var2.append("\u0000");
1096            }
1097        }
1098
1099        this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet203AutoComplete(var2.toString()));
1100    }
1101
1102    public void handleClientInfo(Packet204ClientInfo par1Packet204ClientInfo)
1103    {
1104        this.playerEntity.updateClientInfo(par1Packet204ClientInfo);
1105    }
1106
1107    public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload)
1108    {
1109        FMLNetworkHandler.handlePacket250Packet(par1Packet250CustomPayload, netManager, this);
1110    }
1111
1112    public void handleVanilla250Packet(Packet250CustomPayload par1Packet250CustomPayload)
1113    {
1114        DataInputStream var2;
1115        ItemStack var3;
1116        ItemStack var4;
1117
1118        if ("MC|BEdit".equals(par1Packet250CustomPayload.channel))
1119        {
1120            try
1121            {
1122                var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1123                var3 = Packet.readItemStack(var2);
1124
1125                if (!ItemWritableBook.validBookTagPages(var3.getTagCompound()))
1126                {
1127                    throw new IOException("Invalid book tag!");
1128                }
1129
1130                var4 = this.playerEntity.inventory.getCurrentItem();
1131
1132                if (var3 != null && var3.itemID == Item.writableBook.itemID && var3.itemID == var4.itemID)
1133                {
1134                    var4.setTagInfo("pages", var3.getTagCompound().getTagList("pages"));
1135                }
1136            }
1137            catch (Exception var12)
1138            {
1139                var12.printStackTrace();
1140            }
1141        }
1142        else if ("MC|BSign".equals(par1Packet250CustomPayload.channel))
1143        {
1144            try
1145            {
1146                var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1147                var3 = Packet.readItemStack(var2);
1148
1149                if (!ItemEditableBook.validBookTagContents(var3.getTagCompound()))
1150                {
1151                    throw new IOException("Invalid book tag!");
1152                }
1153
1154                var4 = this.playerEntity.inventory.getCurrentItem();
1155
1156                if (var3 != null && var3.itemID == Item.writtenBook.itemID && var4.itemID == Item.writableBook.itemID)
1157                {
1158                    var4.setTagInfo("author", new NBTTagString("author", this.playerEntity.username));
1159                    var4.setTagInfo("title", new NBTTagString("title", var3.getTagCompound().getString("title")));
1160                    var4.setTagInfo("pages", var3.getTagCompound().getTagList("pages"));
1161                    var4.itemID = Item.writtenBook.itemID;
1162                }
1163            }
1164            catch (Exception var11)
1165            {
1166                var11.printStackTrace();
1167            }
1168        }
1169        else
1170        {
1171            int var14;
1172
1173            if ("MC|TrSel".equals(par1Packet250CustomPayload.channel))
1174            {
1175                try
1176                {
1177                    var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1178                    var14 = var2.readInt();
1179                    Container var15 = this.playerEntity.openContainer;
1180
1181                    if (var15 instanceof ContainerMerchant)
1182                    {
1183                        ((ContainerMerchant)var15).setCurrentRecipeIndex(var14);
1184                    }
1185                }
1186                catch (Exception var10)
1187                {
1188                    var10.printStackTrace();
1189                }
1190            }
1191            else
1192            {
1193                int var18;
1194
1195                if ("MC|AdvCdm".equals(par1Packet250CustomPayload.channel))
1196                {
1197                    if (!this.mcServer.isCommandBlockEnabled())
1198                    {
1199                        this.playerEntity.sendChatToPlayer(this.playerEntity.translateString("advMode.notEnabled", new Object[0]));
1200                    }
1201                    else if (this.playerEntity.canCommandSenderUseCommand(2, "") && this.playerEntity.capabilities.isCreativeMode)
1202                    {
1203                        try
1204                        {
1205                            var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1206                            var14 = var2.readInt();
1207                            var18 = var2.readInt();
1208                            int var5 = var2.readInt();
1209                            String var6 = Packet.readString(var2, 256);
1210                            TileEntity var7 = this.playerEntity.worldObj.getBlockTileEntity(var14, var18, var5);
1211
1212                            if (var7 != null && var7 instanceof TileEntityCommandBlock)
1213                            {
1214                                ((TileEntityCommandBlock)var7).setCommand(var6);
1215                                this.playerEntity.worldObj.markBlockForUpdate(var14, var18, var5);
1216                                this.playerEntity.sendChatToPlayer("Command set: " + var6);
1217                            }
1218                        }
1219                        catch (Exception var9)
1220                        {
1221                            var9.printStackTrace();
1222                        }
1223                    }
1224                    else
1225                    {
1226                        this.playerEntity.sendChatToPlayer(this.playerEntity.translateString("advMode.notAllowed", new Object[0]));
1227                    }
1228                }
1229                else if ("MC|Beacon".equals(par1Packet250CustomPayload.channel))
1230                {
1231                    if (this.playerEntity.openContainer instanceof ContainerBeacon)
1232                    {
1233                        try
1234                        {
1235                            var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data));
1236                            var14 = var2.readInt();
1237                            var18 = var2.readInt();
1238                            ContainerBeacon var17 = (ContainerBeacon)this.playerEntity.openContainer;
1239                            Slot var19 = var17.getSlot(0);
1240
1241                            if (var19.getHasStack())
1242                            {
1243                                var19.decrStackSize(1);
1244                                TileEntityBeacon var20 = var17.getBeacon();
1245                                var20.func_82128_d(var14);
1246                                var20.func_82127_e(var18);
1247                                var20.onInventoryChanged();
1248                            }
1249                        }
1250                        catch (Exception var8)
1251                        {
1252                            var8.printStackTrace();
1253                        }
1254                    }
1255                }
1256                else if ("MC|ItemName".equals(par1Packet250CustomPayload.channel) && this.playerEntity.openContainer instanceof ContainerRepair)
1257                {
1258                    ContainerRepair var13 = (ContainerRepair)this.playerEntity.openContainer;
1259
1260                    if (par1Packet250CustomPayload.data != null && par1Packet250CustomPayload.data.length >= 1)
1261                    {
1262                        String var16 = ChatAllowedCharacters.filerAllowedCharacters(new String(par1Packet250CustomPayload.data));
1263
1264                        if (var16.length() <= 30)
1265                        {
1266                            var13.updateItemName(var16);
1267                        }
1268                    }
1269                    else
1270                    {
1271                        var13.updateItemName("");
1272                    }
1273                }
1274            }
1275        }
1276    }
1277    
1278
1279    @Override
1280
1281    /**
1282     * Contains logic for handling packets containing arbitrary unique item data. Currently this is only for maps.
1283     */
1284    public void handleMapData(Packet131MapData par1Packet131MapData)
1285    {
1286        FMLNetworkHandler.handlePacket131Packet(this, par1Packet131MapData);
1287    }
1288
1289    // modloader compat -- yuk!
1290    @Override
1291    public EntityPlayerMP getPlayer()
1292    {
1293        return playerEntity;
1294    }
1295}