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