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 }