001 package net.minecraft.network;
002
003 import java.io.ByteArrayInputStream;
004 import java.io.DataInputStream;
005 import java.io.IOException;
006 import java.util.ArrayList;
007 import java.util.Iterator;
008 import java.util.Random;
009 import java.util.logging.Logger;
010
011 import cpw.mods.fml.common.network.FMLNetworkHandler;
012 import net.minecraft.entity.Entity;
013 import net.minecraft.entity.item.EntityItem;
014 import net.minecraft.entity.player.EntityPlayerMP;
015 import net.minecraft.entity.player.InventoryPlayer;
016 import net.minecraft.inventory.Container;
017 import net.minecraft.inventory.ContainerBeacon;
018 import net.minecraft.inventory.ContainerMerchant;
019 import net.minecraft.inventory.ContainerRepair;
020 import net.minecraft.inventory.Slot;
021 import net.minecraft.item.Item;
022 import net.minecraft.item.ItemEditableBook;
023 import net.minecraft.item.ItemStack;
024 import net.minecraft.item.ItemWritableBook;
025 import net.minecraft.nbt.NBTTagString;
026 import net.minecraft.network.packet.NetHandler;
027 import net.minecraft.network.packet.Packet;
028 import net.minecraft.network.packet.Packet0KeepAlive;
029 import net.minecraft.network.packet.Packet101CloseWindow;
030 import net.minecraft.network.packet.Packet102WindowClick;
031 import net.minecraft.network.packet.Packet103SetSlot;
032 import net.minecraft.network.packet.Packet106Transaction;
033 import net.minecraft.network.packet.Packet107CreativeSetSlot;
034 import net.minecraft.network.packet.Packet108EnchantItem;
035 import net.minecraft.network.packet.Packet10Flying;
036 import net.minecraft.network.packet.Packet130UpdateSign;
037 import net.minecraft.network.packet.Packet131MapData;
038 import net.minecraft.network.packet.Packet13PlayerLookMove;
039 import net.minecraft.network.packet.Packet14BlockDig;
040 import net.minecraft.network.packet.Packet15Place;
041 import net.minecraft.network.packet.Packet16BlockItemSwitch;
042 import net.minecraft.network.packet.Packet18Animation;
043 import net.minecraft.network.packet.Packet19EntityAction;
044 import net.minecraft.network.packet.Packet202PlayerAbilities;
045 import net.minecraft.network.packet.Packet203AutoComplete;
046 import net.minecraft.network.packet.Packet204ClientInfo;
047 import net.minecraft.network.packet.Packet205ClientCommand;
048 import net.minecraft.network.packet.Packet250CustomPayload;
049 import net.minecraft.network.packet.Packet255KickDisconnect;
050 import net.minecraft.network.packet.Packet3Chat;
051 import net.minecraft.network.packet.Packet53BlockChange;
052 import net.minecraft.network.packet.Packet7UseEntity;
053 import net.minecraft.network.packet.Packet9Respawn;
054 import net.minecraft.server.MinecraftServer;
055 import net.minecraft.server.management.BanEntry;
056 import net.minecraft.tileentity.TileEntity;
057 import net.minecraft.tileentity.TileEntityBeacon;
058 import net.minecraft.tileentity.TileEntityCommandBlock;
059 import net.minecraft.tileentity.TileEntitySign;
060 import net.minecraft.util.AxisAlignedBB;
061 import net.minecraft.util.ChatAllowedCharacters;
062 import net.minecraft.util.ChunkCoordinates;
063 import net.minecraft.util.IntHashMap;
064 import net.minecraft.util.MathHelper;
065 import net.minecraft.world.WorldServer;
066
067 import net.minecraftforge.common.MinecraftForge;
068 import net.minecraftforge.event.Event;
069 import net.minecraftforge.event.ForgeEventFactory;
070 import net.minecraftforge.event.ServerChatEvent;
071 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
072 import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
073
074 public 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 }