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 }