001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import cpw.mods.fml.common.network.FMLNetworkHandler; 006 007 import java.io.BufferedReader; 008 import java.io.ByteArrayInputStream; 009 import java.io.DataInputStream; 010 import java.io.IOException; 011 import java.io.InputStreamReader; 012 import java.math.BigInteger; 013 import java.net.InetAddress; 014 import java.net.Socket; 015 import java.net.URL; 016 import java.net.URLEncoder; 017 import java.security.PublicKey; 018 import java.util.ArrayList; 019 import java.util.HashMap; 020 import java.util.List; 021 import java.util.Map; 022 import java.util.Random; 023 import javax.crypto.SecretKey; 024 import net.minecraft.client.Minecraft; 025 import net.minecraftforge.client.ForgeHooksClient; 026 import net.minecraftforge.client.event.ClientChatReceivedEvent; 027 import net.minecraftforge.common.ForgeHooks; 028 import net.minecraftforge.common.MinecraftForge; 029 030 import org.lwjgl.input.Keyboard; 031 032 @SideOnly(Side.CLIENT) 033 public class NetClientHandler extends NetHandler 034 { 035 /** True if kicked or disconnected from the server. */ 036 private boolean disconnected = false; 037 038 /** Reference to the NetworkManager object. */ 039 private NetworkManager netManager; 040 public String field_72560_a; 041 042 /** Reference to the Minecraft object. */ 043 private Minecraft mc; 044 private WorldClient worldClient; 045 046 /** 047 * True if the client has finished downloading terrain and may spawn. Set upon receipt of a player position packet, 048 * reset upon respawning. 049 */ 050 private boolean doneLoadingTerrain = false; 051 public MapStorage mapStorage = new MapStorage((ISaveHandler)null); 052 053 /** A HashMap of all player names and their player information objects */ 054 private Map playerInfoMap = new HashMap(); 055 056 /** 057 * An ArrayList of GuiPlayerInfo (includes all the players' GuiPlayerInfo on the current server) 058 */ 059 public List playerInfoList = new ArrayList(); 060 public int currentServerMaxPlayers = 20; 061 062 /** RNG. */ 063 Random rand = new Random(); 064 065 private static byte connectionCompatibilityLevel; 066 067 public NetClientHandler(Minecraft par1Minecraft, String par2Str, int par3) throws IOException 068 { 069 this.mc = par1Minecraft; 070 Socket var4 = new Socket(InetAddress.getByName(par2Str), par3); 071 this.netManager = new TcpConnection(var4, "Client", this); 072 FMLNetworkHandler.onClientConnectionToRemoteServer(this, par2Str, par3, this.netManager); 073 } 074 075 public NetClientHandler(Minecraft par1Minecraft, IntegratedServer par2IntegratedServer) throws IOException 076 { 077 this.mc = par1Minecraft; 078 this.netManager = new MemoryConnection(this); 079 par2IntegratedServer.getServerListeningThread().func_71754_a((MemoryConnection)this.netManager, par1Minecraft.session.username); 080 FMLNetworkHandler.onClientConnectionToIntegratedServer(this, par2IntegratedServer, this.netManager); 081 } 082 083 /** 084 * sets netManager and worldClient to null 085 */ 086 public void cleanup() 087 { 088 if (this.netManager != null) 089 { 090 this.netManager.wakeThreads(); 091 } 092 093 this.netManager = null; 094 this.worldClient = null; 095 } 096 097 /** 098 * Processes the packets that have been read since the last call to this function. 099 */ 100 public void processReadPackets() 101 { 102 if (!this.disconnected && this.netManager != null) 103 { 104 this.netManager.processReadPackets(); 105 } 106 107 if (this.netManager != null) 108 { 109 this.netManager.wakeThreads(); 110 } 111 } 112 113 public void handleServerAuthData(Packet253ServerAuthData par1Packet253ServerAuthData) 114 { 115 String var2 = par1Packet253ServerAuthData.getServerId().trim(); 116 PublicKey var3 = par1Packet253ServerAuthData.getPublicKey(); 117 SecretKey var4 = CryptManager.func_75890_a(); 118 119 if (!"-".equals(var2)) 120 { 121 String var5 = (new BigInteger(CryptManager.func_75895_a(var2, var3, var4))).toString(16); 122 String var6 = this.func_72550_a(this.mc.session.username, this.mc.session.sessionId, var5); 123 124 if (!"ok".equalsIgnoreCase(var6)) 125 { 126 this.netManager.networkShutdown("disconnect.loginFailedInfo", new Object[] {var6}); 127 return; 128 } 129 } 130 131 this.addToSendQueue(new Packet252SharedKey(var4, var3, par1Packet253ServerAuthData.getVerifyToken())); 132 } 133 134 private String func_72550_a(String par1Str, String par2Str, String par3Str) 135 { 136 try 137 { 138 URL var4 = new URL("http://session.minecraft.net/game/joinserver.jsp?user=" + urlEncode(par1Str) + "&sessionId=" + urlEncode(par2Str) + "&serverId=" + urlEncode(par3Str)); 139 BufferedReader var5 = new BufferedReader(new InputStreamReader(var4.openStream())); 140 String var6 = var5.readLine(); 141 var5.close(); 142 return var6; 143 } 144 catch (IOException var7) 145 { 146 return var7.toString(); 147 } 148 } 149 150 /** 151 * Encode the given string for insertion into a URL 152 */ 153 private static String urlEncode(String par0Str) throws IOException 154 { 155 return URLEncoder.encode(par0Str, "UTF-8"); 156 } 157 158 public void handleSharedKey(Packet252SharedKey par1Packet252SharedKey) 159 { 160 this.addToSendQueue(FMLNetworkHandler.getFMLFakeLoginPacket()); 161 this.addToSendQueue(new Packet205ClientCommand(0)); 162 } 163 164 public void handleLogin(Packet1Login par1Packet1Login) 165 { 166 this.mc.playerController = new PlayerControllerMP(this.mc, this); 167 this.mc.statFileWriter.readStat(StatList.joinMultiplayerStat, 1); 168 this.worldClient = new WorldClient(this, new WorldSettings(0L, par1Packet1Login.gameType, false, par1Packet1Login.field_73560_c, par1Packet1Login.terrainType), par1Packet1Login.dimension, par1Packet1Login.difficultySetting, this.mc.mcProfiler); 169 this.worldClient.isRemote = true; 170 this.mc.loadWorld(this.worldClient); 171 this.mc.thePlayer.dimension = par1Packet1Login.dimension; 172 this.mc.displayGuiScreen(new GuiDownloadTerrain(this)); 173 this.mc.thePlayer.entityId = par1Packet1Login.clientEntityId; 174 this.currentServerMaxPlayers = par1Packet1Login.maxPlayers; 175 this.mc.playerController.setGameType(par1Packet1Login.gameType); 176 FMLNetworkHandler.onConnectionEstablishedToServer(this, netManager, par1Packet1Login); 177 this.addToSendQueue(new Packet204ClientInfo(this.mc.gameSettings.language, this.mc.gameSettings.renderDistance, this.mc.gameSettings.chatVisibility, this.mc.gameSettings.chatColours, this.mc.gameSettings.difficulty)); 178 } 179 180 public void handlePickupSpawn(Packet21PickupSpawn par1Packet21PickupSpawn) 181 { 182 double var2 = (double)par1Packet21PickupSpawn.xPosition / 32.0D; 183 double var4 = (double)par1Packet21PickupSpawn.yPosition / 32.0D; 184 double var6 = (double)par1Packet21PickupSpawn.zPosition / 32.0D; 185 EntityItem var8 = new EntityItem(this.worldClient, var2, var4, var6, new ItemStack(par1Packet21PickupSpawn.itemID, par1Packet21PickupSpawn.count, par1Packet21PickupSpawn.itemDamage)); 186 var8.motionX = (double)par1Packet21PickupSpawn.rotation / 128.0D; 187 var8.motionY = (double)par1Packet21PickupSpawn.pitch / 128.0D; 188 var8.motionZ = (double)par1Packet21PickupSpawn.roll / 128.0D; 189 var8.serverPosX = par1Packet21PickupSpawn.xPosition; 190 var8.serverPosY = par1Packet21PickupSpawn.yPosition; 191 var8.serverPosZ = par1Packet21PickupSpawn.zPosition; 192 this.worldClient.addEntityToWorld(par1Packet21PickupSpawn.entityId, var8); 193 } 194 195 public void handleVehicleSpawn(Packet23VehicleSpawn par1Packet23VehicleSpawn) 196 { 197 double var2 = (double)par1Packet23VehicleSpawn.xPosition / 32.0D; 198 double var4 = (double)par1Packet23VehicleSpawn.yPosition / 32.0D; 199 double var6 = (double)par1Packet23VehicleSpawn.zPosition / 32.0D; 200 Object var8 = null; 201 202 if (par1Packet23VehicleSpawn.type == 10) 203 { 204 var8 = new EntityMinecart(this.worldClient, var2, var4, var6, 0); 205 } 206 else if (par1Packet23VehicleSpawn.type == 11) 207 { 208 var8 = new EntityMinecart(this.worldClient, var2, var4, var6, 1); 209 } 210 else if (par1Packet23VehicleSpawn.type == 12) 211 { 212 var8 = new EntityMinecart(this.worldClient, var2, var4, var6, 2); 213 } 214 else if (par1Packet23VehicleSpawn.type == 90) 215 { 216 Entity var9 = this.getEntityByID(par1Packet23VehicleSpawn.throwerEntityId); 217 218 if (var9 instanceof EntityPlayer) 219 { 220 var8 = new EntityFishHook(this.worldClient, var2, var4, var6, (EntityPlayer)var9); 221 } 222 223 par1Packet23VehicleSpawn.throwerEntityId = 0; 224 } 225 else if (par1Packet23VehicleSpawn.type == 60) 226 { 227 var8 = new EntityArrow(this.worldClient, var2, var4, var6); 228 } 229 else if (par1Packet23VehicleSpawn.type == 61) 230 { 231 var8 = new EntitySnowball(this.worldClient, var2, var4, var6); 232 } 233 else if (par1Packet23VehicleSpawn.type == 65) 234 { 235 var8 = new EntityEnderPearl(this.worldClient, var2, var4, var6); 236 } 237 else if (par1Packet23VehicleSpawn.type == 72) 238 { 239 var8 = new EntityEnderEye(this.worldClient, var2, var4, var6); 240 } 241 else if (par1Packet23VehicleSpawn.type == 63) 242 { 243 var8 = new EntityFireball(this.worldClient, var2, var4, var6, (double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D); 244 par1Packet23VehicleSpawn.throwerEntityId = 0; 245 } 246 else if (par1Packet23VehicleSpawn.type == 64) 247 { 248 var8 = new EntitySmallFireball(this.worldClient, var2, var4, var6, (double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D); 249 par1Packet23VehicleSpawn.throwerEntityId = 0; 250 } 251 else if (par1Packet23VehicleSpawn.type == 62) 252 { 253 var8 = new EntityEgg(this.worldClient, var2, var4, var6); 254 } 255 else if (par1Packet23VehicleSpawn.type == 73) 256 { 257 var8 = new EntityPotion(this.worldClient, var2, var4, var6, par1Packet23VehicleSpawn.throwerEntityId); 258 par1Packet23VehicleSpawn.throwerEntityId = 0; 259 } 260 else if (par1Packet23VehicleSpawn.type == 75) 261 { 262 var8 = new EntityExpBottle(this.worldClient, var2, var4, var6); 263 par1Packet23VehicleSpawn.throwerEntityId = 0; 264 } 265 else if (par1Packet23VehicleSpawn.type == 1) 266 { 267 var8 = new EntityBoat(this.worldClient, var2, var4, var6); 268 } 269 else if (par1Packet23VehicleSpawn.type == 50) 270 { 271 var8 = new EntityTNTPrimed(this.worldClient, var2, var4, var6); 272 } 273 else if (par1Packet23VehicleSpawn.type == 51) 274 { 275 var8 = new EntityEnderCrystal(this.worldClient, var2, var4, var6); 276 } 277 else if (par1Packet23VehicleSpawn.type == 70) 278 { 279 var8 = new EntityFallingSand(this.worldClient, var2, var4, var6, par1Packet23VehicleSpawn.throwerEntityId & 65535, par1Packet23VehicleSpawn.throwerEntityId >> 16); 280 par1Packet23VehicleSpawn.throwerEntityId = 0; 281 } 282 283 if (var8 != null) 284 { 285 ((Entity)var8).serverPosX = par1Packet23VehicleSpawn.xPosition; 286 ((Entity)var8).serverPosY = par1Packet23VehicleSpawn.yPosition; 287 ((Entity)var8).serverPosZ = par1Packet23VehicleSpawn.zPosition; 288 ((Entity)var8).rotationYaw = 0.0F; 289 ((Entity)var8).rotationPitch = 0.0F; 290 Entity[] var15 = ((Entity)var8).getParts(); 291 292 if (var15 != null) 293 { 294 int var10 = par1Packet23VehicleSpawn.entityId - ((Entity)var8).entityId; 295 Entity[] var11 = var15; 296 int var12 = var15.length; 297 298 for (int var13 = 0; var13 < var12; ++var13) 299 { 300 Entity var14 = var11[var13]; 301 var14.entityId += var10; 302 } 303 } 304 305 ((Entity)var8).entityId = par1Packet23VehicleSpawn.entityId; 306 this.worldClient.addEntityToWorld(par1Packet23VehicleSpawn.entityId, (Entity)var8); 307 308 if (par1Packet23VehicleSpawn.throwerEntityId > 0) 309 { 310 if (par1Packet23VehicleSpawn.type == 60) 311 { 312 Entity var17 = this.getEntityByID(par1Packet23VehicleSpawn.throwerEntityId); 313 314 if (var17 instanceof EntityLiving) 315 { 316 EntityArrow var16 = (EntityArrow)var8; 317 var16.shootingEntity = var17; 318 } 319 } 320 321 ((Entity)var8).setVelocity((double)par1Packet23VehicleSpawn.speedX / 8000.0D, (double)par1Packet23VehicleSpawn.speedY / 8000.0D, (double)par1Packet23VehicleSpawn.speedZ / 8000.0D); 322 } 323 } 324 } 325 326 /** 327 * Handle a entity experience orb packet. 328 */ 329 public void handleEntityExpOrb(Packet26EntityExpOrb par1Packet26EntityExpOrb) 330 { 331 EntityXPOrb var2 = new EntityXPOrb(this.worldClient, (double)par1Packet26EntityExpOrb.posX, (double)par1Packet26EntityExpOrb.posY, (double)par1Packet26EntityExpOrb.posZ, par1Packet26EntityExpOrb.xpValue); 332 var2.serverPosX = par1Packet26EntityExpOrb.posX; 333 var2.serverPosY = par1Packet26EntityExpOrb.posY; 334 var2.serverPosZ = par1Packet26EntityExpOrb.posZ; 335 var2.rotationYaw = 0.0F; 336 var2.rotationPitch = 0.0F; 337 var2.entityId = par1Packet26EntityExpOrb.entityId; 338 this.worldClient.addEntityToWorld(par1Packet26EntityExpOrb.entityId, var2); 339 } 340 341 /** 342 * Handles weather packet 343 */ 344 public void handleWeather(Packet71Weather par1Packet71Weather) 345 { 346 double var2 = (double)par1Packet71Weather.posX / 32.0D; 347 double var4 = (double)par1Packet71Weather.posY / 32.0D; 348 double var6 = (double)par1Packet71Weather.posZ / 32.0D; 349 EntityLightningBolt var8 = null; 350 351 if (par1Packet71Weather.isLightningBolt == 1) 352 { 353 var8 = new EntityLightningBolt(this.worldClient, var2, var4, var6); 354 } 355 356 if (var8 != null) 357 { 358 var8.serverPosX = par1Packet71Weather.posX; 359 var8.serverPosY = par1Packet71Weather.posY; 360 var8.serverPosZ = par1Packet71Weather.posZ; 361 var8.rotationYaw = 0.0F; 362 var8.rotationPitch = 0.0F; 363 var8.entityId = par1Packet71Weather.entityID; 364 this.worldClient.addWeatherEffect(var8); 365 } 366 } 367 368 /** 369 * Packet handler 370 */ 371 public void handleEntityPainting(Packet25EntityPainting par1Packet25EntityPainting) 372 { 373 EntityPainting var2 = new EntityPainting(this.worldClient, par1Packet25EntityPainting.xPosition, par1Packet25EntityPainting.yPosition, par1Packet25EntityPainting.zPosition, par1Packet25EntityPainting.direction, par1Packet25EntityPainting.title); 374 this.worldClient.addEntityToWorld(par1Packet25EntityPainting.entityId, var2); 375 } 376 377 /** 378 * Packet handler 379 */ 380 public void handleEntityVelocity(Packet28EntityVelocity par1Packet28EntityVelocity) 381 { 382 Entity var2 = this.getEntityByID(par1Packet28EntityVelocity.entityId); 383 384 if (var2 != null) 385 { 386 var2.setVelocity((double)par1Packet28EntityVelocity.motionX / 8000.0D, (double)par1Packet28EntityVelocity.motionY / 8000.0D, (double)par1Packet28EntityVelocity.motionZ / 8000.0D); 387 } 388 } 389 390 /** 391 * Packet handler 392 */ 393 public void handleEntityMetadata(Packet40EntityMetadata par1Packet40EntityMetadata) 394 { 395 Entity var2 = this.getEntityByID(par1Packet40EntityMetadata.entityId); 396 397 if (var2 != null && par1Packet40EntityMetadata.getMetadata() != null) 398 { 399 var2.getDataWatcher().updateWatchedObjectsFromList(par1Packet40EntityMetadata.getMetadata()); 400 } 401 } 402 403 public void handleNamedEntitySpawn(Packet20NamedEntitySpawn par1Packet20NamedEntitySpawn) 404 { 405 double var2 = (double)par1Packet20NamedEntitySpawn.xPosition / 32.0D; 406 double var4 = (double)par1Packet20NamedEntitySpawn.yPosition / 32.0D; 407 double var6 = (double)par1Packet20NamedEntitySpawn.zPosition / 32.0D; 408 float var8 = (float)(par1Packet20NamedEntitySpawn.rotation * 360) / 256.0F; 409 float var9 = (float)(par1Packet20NamedEntitySpawn.pitch * 360) / 256.0F; 410 EntityOtherPlayerMP var10 = new EntityOtherPlayerMP(this.mc.theWorld, par1Packet20NamedEntitySpawn.name); 411 var10.prevPosX = var10.lastTickPosX = (double)(var10.serverPosX = par1Packet20NamedEntitySpawn.xPosition); 412 var10.prevPosY = var10.lastTickPosY = (double)(var10.serverPosY = par1Packet20NamedEntitySpawn.yPosition); 413 var10.prevPosZ = var10.lastTickPosZ = (double)(var10.serverPosZ = par1Packet20NamedEntitySpawn.zPosition); 414 int var11 = par1Packet20NamedEntitySpawn.currentItem; 415 416 if (var11 == 0) 417 { 418 var10.inventory.mainInventory[var10.inventory.currentItem] = null; 419 } 420 else 421 { 422 var10.inventory.mainInventory[var10.inventory.currentItem] = new ItemStack(var11, 1, 0); 423 } 424 425 var10.setPositionAndRotation(var2, var4, var6, var8, var9); 426 this.worldClient.addEntityToWorld(par1Packet20NamedEntitySpawn.entityId, var10); 427 List var12 = par1Packet20NamedEntitySpawn.func_73509_c(); 428 429 if (var12 != null) 430 { 431 var10.getDataWatcher().updateWatchedObjectsFromList(var12); 432 } 433 } 434 435 public void handleEntityTeleport(Packet34EntityTeleport par1Packet34EntityTeleport) 436 { 437 Entity var2 = this.getEntityByID(par1Packet34EntityTeleport.entityId); 438 439 if (var2 != null) 440 { 441 var2.serverPosX = par1Packet34EntityTeleport.xPosition; 442 var2.serverPosY = par1Packet34EntityTeleport.yPosition; 443 var2.serverPosZ = par1Packet34EntityTeleport.zPosition; 444 double var3 = (double)var2.serverPosX / 32.0D; 445 double var5 = (double)var2.serverPosY / 32.0D + 0.015625D; 446 double var7 = (double)var2.serverPosZ / 32.0D; 447 float var9 = (float)(par1Packet34EntityTeleport.yaw * 360) / 256.0F; 448 float var10 = (float)(par1Packet34EntityTeleport.pitch * 360) / 256.0F; 449 var2.setPositionAndRotation2(var3, var5, var7, var9, var10, 3); 450 } 451 } 452 453 public void handleEntity(Packet30Entity par1Packet30Entity) 454 { 455 Entity var2 = this.getEntityByID(par1Packet30Entity.entityId); 456 457 if (var2 != null) 458 { 459 var2.serverPosX += par1Packet30Entity.xPosition; 460 var2.serverPosY += par1Packet30Entity.yPosition; 461 var2.serverPosZ += par1Packet30Entity.zPosition; 462 double var3 = (double)var2.serverPosX / 32.0D; 463 double var5 = (double)var2.serverPosY / 32.0D; 464 double var7 = (double)var2.serverPosZ / 32.0D; 465 float var9 = par1Packet30Entity.rotating ? (float)(par1Packet30Entity.yaw * 360) / 256.0F : var2.rotationYaw; 466 float var10 = par1Packet30Entity.rotating ? (float)(par1Packet30Entity.pitch * 360) / 256.0F : var2.rotationPitch; 467 var2.setPositionAndRotation2(var3, var5, var7, var9, var10, 3); 468 } 469 } 470 471 public void handleEntityHeadRotation(Packet35EntityHeadRotation par1Packet35EntityHeadRotation) 472 { 473 Entity var2 = this.getEntityByID(par1Packet35EntityHeadRotation.entityId); 474 475 if (var2 != null) 476 { 477 float var3 = (float)(par1Packet35EntityHeadRotation.headRotationYaw * 360) / 256.0F; 478 var2.setHeadRotationYaw(var3); 479 } 480 } 481 482 public void handleDestroyEntity(Packet29DestroyEntity par1Packet29DestroyEntity) 483 { 484 for (int var2 = 0; var2 < par1Packet29DestroyEntity.entityId.length; ++var2) 485 { 486 this.worldClient.removeEntityFromWorld(par1Packet29DestroyEntity.entityId[var2]); 487 } 488 } 489 490 public void handleFlying(Packet10Flying par1Packet10Flying) 491 { 492 EntityClientPlayerMP var2 = this.mc.thePlayer; 493 double var3 = var2.posX; 494 double var5 = var2.posY; 495 double var7 = var2.posZ; 496 float var9 = var2.rotationYaw; 497 float var10 = var2.rotationPitch; 498 499 if (par1Packet10Flying.moving) 500 { 501 var3 = par1Packet10Flying.xPosition; 502 var5 = par1Packet10Flying.yPosition; 503 var7 = par1Packet10Flying.zPosition; 504 } 505 506 if (par1Packet10Flying.rotating) 507 { 508 var9 = par1Packet10Flying.yaw; 509 var10 = par1Packet10Flying.pitch; 510 } 511 512 var2.ySize = 0.0F; 513 var2.motionX = var2.motionY = var2.motionZ = 0.0D; 514 var2.setPositionAndRotation(var3, var5, var7, var9, var10); 515 par1Packet10Flying.xPosition = var2.posX; 516 par1Packet10Flying.yPosition = var2.boundingBox.minY; 517 par1Packet10Flying.zPosition = var2.posZ; 518 par1Packet10Flying.stance = var2.posY; 519 this.netManager.addToSendQueue(par1Packet10Flying); 520 521 if (!this.doneLoadingTerrain) 522 { 523 this.mc.thePlayer.prevPosX = this.mc.thePlayer.posX; 524 this.mc.thePlayer.prevPosY = this.mc.thePlayer.posY; 525 this.mc.thePlayer.prevPosZ = this.mc.thePlayer.posZ; 526 this.doneLoadingTerrain = true; 527 this.mc.displayGuiScreen((GuiScreen)null); 528 } 529 } 530 531 public void handleMultiBlockChange(Packet52MultiBlockChange par1Packet52MultiBlockChange) 532 { 533 int var2 = par1Packet52MultiBlockChange.xPosition * 16; 534 int var3 = par1Packet52MultiBlockChange.zPosition * 16; 535 536 if (par1Packet52MultiBlockChange.metadataArray != null) 537 { 538 DataInputStream var4 = new DataInputStream(new ByteArrayInputStream(par1Packet52MultiBlockChange.metadataArray)); 539 540 try 541 { 542 for (int var5 = 0; var5 < par1Packet52MultiBlockChange.size; ++var5) 543 { 544 short var6 = var4.readShort(); 545 short var7 = var4.readShort(); 546 int var8 = var7 >> 4 & 4095; 547 int var9 = var7 & 15; 548 int var10 = var6 >> 12 & 15; 549 int var11 = var6 >> 8 & 15; 550 int var12 = var6 & 255; 551 this.worldClient.setBlockAndMetadataAndInvalidate(var10 + var2, var12, var11 + var3, var8, var9); 552 } 553 } 554 catch (IOException var13) 555 { 556 ; 557 } 558 } 559 } 560 561 /** 562 * Handle Packet51MapChunk (full chunk update of blocks, metadata, light levels, and optionally biome data) 563 */ 564 public void handleMapChunk(Packet51MapChunk par1Packet51MapChunk) 565 { 566 if (par1Packet51MapChunk.includeInitialize) 567 { 568 if (par1Packet51MapChunk.yChMin == 0) 569 { 570 this.worldClient.doPreChunk(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh, false); 571 return; 572 } 573 574 this.worldClient.doPreChunk(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh, true); 575 } 576 577 this.worldClient.invalidateBlockReceiveRegion(par1Packet51MapChunk.xCh << 4, 0, par1Packet51MapChunk.zCh << 4, (par1Packet51MapChunk.xCh << 4) + 15, 256, (par1Packet51MapChunk.zCh << 4) + 15); 578 Chunk var2 = this.worldClient.getChunkFromChunkCoords(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh); 579 580 if (par1Packet51MapChunk.includeInitialize && var2 == null) 581 { 582 this.worldClient.doPreChunk(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh, true); 583 var2 = this.worldClient.getChunkFromChunkCoords(par1Packet51MapChunk.xCh, par1Packet51MapChunk.zCh); 584 } 585 586 if (var2 != null) 587 { 588 var2.fillChunk(par1Packet51MapChunk.func_73593_d(), par1Packet51MapChunk.yChMin, par1Packet51MapChunk.yChMax, par1Packet51MapChunk.includeInitialize); 589 this.worldClient.markBlocksDirty(par1Packet51MapChunk.xCh << 4, 0, par1Packet51MapChunk.zCh << 4, (par1Packet51MapChunk.xCh << 4) + 15, 256, (par1Packet51MapChunk.zCh << 4) + 15); 590 591 if (!par1Packet51MapChunk.includeInitialize || !(this.worldClient.provider instanceof WorldProviderSurface)) 592 { 593 var2.resetRelightChecks(); 594 } 595 } 596 } 597 598 public void handleBlockChange(Packet53BlockChange par1Packet53BlockChange) 599 { 600 this.worldClient.setBlockAndMetadataAndInvalidate(par1Packet53BlockChange.xPosition, par1Packet53BlockChange.yPosition, par1Packet53BlockChange.zPosition, par1Packet53BlockChange.type, par1Packet53BlockChange.metadata); 601 } 602 603 public void handleKickDisconnect(Packet255KickDisconnect par1Packet255KickDisconnect) 604 { 605 this.netManager.networkShutdown("disconnect.kicked", par1Packet255KickDisconnect.reason); 606 this.disconnected = true; 607 this.mc.loadWorld((WorldClient)null); 608 this.mc.displayGuiScreen(new GuiDisconnected("disconnect.disconnected", "disconnect.genericReason", new Object[] {par1Packet255KickDisconnect.reason})); 609 } 610 611 public void handleErrorMessage(String par1Str, Object[] par2ArrayOfObj) 612 { 613 if (!this.disconnected) 614 { 615 this.disconnected = true; 616 this.mc.loadWorld((WorldClient)null); 617 this.mc.displayGuiScreen(new GuiDisconnected("disconnect.lost", par1Str, par2ArrayOfObj)); 618 } 619 } 620 621 public void quitWithPacket(Packet par1Packet) 622 { 623 if (!this.disconnected) 624 { 625 this.netManager.addToSendQueue(par1Packet); 626 this.netManager.serverShutdown(); 627 FMLNetworkHandler.onConnectionClosed(this.netManager, this.getPlayer()); 628 } 629 } 630 631 /** 632 * Adds the packet to the send queue 633 */ 634 public void addToSendQueue(Packet par1Packet) 635 { 636 if (!this.disconnected) 637 { 638 this.netManager.addToSendQueue(par1Packet); 639 } 640 } 641 642 public void handleCollect(Packet22Collect par1Packet22Collect) 643 { 644 Entity var2 = this.getEntityByID(par1Packet22Collect.collectedEntityId); 645 Object var3 = (EntityLiving)this.getEntityByID(par1Packet22Collect.collectorEntityId); 646 647 if (var3 == null) 648 { 649 var3 = this.mc.thePlayer; 650 } 651 652 if (var2 != null) 653 { 654 if (var2 instanceof EntityXPOrb) 655 { 656 this.worldClient.playSoundAtEntity(var2, "random.orb", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); 657 } 658 else 659 { 660 this.worldClient.playSoundAtEntity(var2, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); 661 } 662 663 this.mc.effectRenderer.addEffect(new EntityPickupFX(this.mc.theWorld, var2, (Entity)var3, -0.5F)); 664 this.worldClient.removeEntityFromWorld(par1Packet22Collect.collectedEntityId); 665 } 666 } 667 668 public void handleChat(Packet3Chat par1Packet3Chat) 669 { 670 par1Packet3Chat = FMLNetworkHandler.handleChatMessage(this, par1Packet3Chat); 671 ClientChatReceivedEvent event = new ClientChatReceivedEvent(par1Packet3Chat.message); 672 if (!MinecraftForge.EVENT_BUS.post(event) && event.message != null) 673 { 674 this.mc.ingameGUI.getChatGUI().printChatMessage(par1Packet3Chat.message); 675 } 676 } 677 678 public void handleAnimation(Packet18Animation par1Packet18Animation) 679 { 680 Entity var2 = this.getEntityByID(par1Packet18Animation.entityId); 681 682 if (var2 != null) 683 { 684 EntityPlayer var3; 685 686 if (par1Packet18Animation.animate == 1) 687 { 688 var3 = (EntityPlayer)var2; 689 var3.swingItem(); 690 } 691 else if (par1Packet18Animation.animate == 2) 692 { 693 var2.performHurtAnimation(); 694 } 695 else if (par1Packet18Animation.animate == 3) 696 { 697 var3 = (EntityPlayer)var2; 698 var3.wakeUpPlayer(false, false, false); 699 } 700 else if (par1Packet18Animation.animate != 4) 701 { 702 if (par1Packet18Animation.animate == 6) 703 { 704 this.mc.effectRenderer.addEffect(new EntityCrit2FX(this.mc.theWorld, var2)); 705 } 706 else if (par1Packet18Animation.animate == 7) 707 { 708 EntityCrit2FX var4 = new EntityCrit2FX(this.mc.theWorld, var2, "magicCrit"); 709 this.mc.effectRenderer.addEffect(var4); 710 } 711 else if (par1Packet18Animation.animate == 5 && var2 instanceof EntityOtherPlayerMP) 712 { 713 ; 714 } 715 } 716 } 717 } 718 719 public void handleSleep(Packet17Sleep par1Packet17Sleep) 720 { 721 Entity var2 = this.getEntityByID(par1Packet17Sleep.entityID); 722 723 if (var2 != null) 724 { 725 if (par1Packet17Sleep.field_73622_e == 0) 726 { 727 EntityPlayer var3 = (EntityPlayer)var2; 728 var3.sleepInBedAt(par1Packet17Sleep.bedX, par1Packet17Sleep.bedY, par1Packet17Sleep.bedZ); 729 } 730 } 731 } 732 733 /** 734 * Disconnects the network connection. 735 */ 736 public void disconnect() 737 { 738 this.disconnected = true; 739 this.netManager.wakeThreads(); 740 this.netManager.networkShutdown("disconnect.closed", new Object[0]); 741 } 742 743 public void handleMobSpawn(Packet24MobSpawn par1Packet24MobSpawn) 744 { 745 double var2 = (double)par1Packet24MobSpawn.xPosition / 32.0D; 746 double var4 = (double)par1Packet24MobSpawn.yPosition / 32.0D; 747 double var6 = (double)par1Packet24MobSpawn.zPosition / 32.0D; 748 float var8 = (float)(par1Packet24MobSpawn.yaw * 360) / 256.0F; 749 float var9 = (float)(par1Packet24MobSpawn.pitch * 360) / 256.0F; 750 EntityLiving var10 = (EntityLiving)EntityList.createEntityByID(par1Packet24MobSpawn.type, this.mc.theWorld); 751 var10.serverPosX = par1Packet24MobSpawn.xPosition; 752 var10.serverPosY = par1Packet24MobSpawn.yPosition; 753 var10.serverPosZ = par1Packet24MobSpawn.zPosition; 754 var10.rotationYawHead = (float)(par1Packet24MobSpawn.headYaw * 360) / 256.0F; 755 Entity[] var11 = var10.getParts(); 756 757 if (var11 != null) 758 { 759 int var12 = par1Packet24MobSpawn.entityId - var10.entityId; 760 Entity[] var13 = var11; 761 int var14 = var11.length; 762 763 for (int var15 = 0; var15 < var14; ++var15) 764 { 765 Entity var16 = var13[var15]; 766 var16.entityId += var12; 767 } 768 } 769 770 var10.entityId = par1Packet24MobSpawn.entityId; 771 var10.setPositionAndRotation(var2, var4, var6, var8, var9); 772 var10.motionX = (double)((float)par1Packet24MobSpawn.velocityX / 8000.0F); 773 var10.motionY = (double)((float)par1Packet24MobSpawn.velocityY / 8000.0F); 774 var10.motionZ = (double)((float)par1Packet24MobSpawn.velocityZ / 8000.0F); 775 this.worldClient.addEntityToWorld(par1Packet24MobSpawn.entityId, var10); 776 List var17 = par1Packet24MobSpawn.getMetadata(); 777 778 if (var17 != null) 779 { 780 var10.getDataWatcher().updateWatchedObjectsFromList(var17); 781 } 782 } 783 784 public void handleUpdateTime(Packet4UpdateTime par1Packet4UpdateTime) 785 { 786 this.mc.theWorld.setWorldTime(par1Packet4UpdateTime.time); 787 } 788 789 public void handleSpawnPosition(Packet6SpawnPosition par1Packet6SpawnPosition) 790 { 791 this.mc.thePlayer.setSpawnChunk(new ChunkCoordinates(par1Packet6SpawnPosition.xPosition, par1Packet6SpawnPosition.yPosition, par1Packet6SpawnPosition.zPosition)); 792 this.mc.theWorld.getWorldInfo().setSpawnPosition(par1Packet6SpawnPosition.xPosition, par1Packet6SpawnPosition.yPosition, par1Packet6SpawnPosition.zPosition); 793 } 794 795 /** 796 * Packet handler 797 */ 798 public void handleAttachEntity(Packet39AttachEntity par1Packet39AttachEntity) 799 { 800 Object var2 = this.getEntityByID(par1Packet39AttachEntity.entityId); 801 Entity var3 = this.getEntityByID(par1Packet39AttachEntity.vehicleEntityId); 802 803 if (par1Packet39AttachEntity.entityId == this.mc.thePlayer.entityId) 804 { 805 var2 = this.mc.thePlayer; 806 807 if (var3 instanceof EntityBoat) 808 { 809 ((EntityBoat)var3).func_70270_d(false); 810 } 811 } 812 else if (var3 instanceof EntityBoat) 813 { 814 ((EntityBoat)var3).func_70270_d(true); 815 } 816 817 if (var2 != null) 818 { 819 ((Entity)var2).mountEntity(var3); 820 } 821 } 822 823 /** 824 * Packet handler 825 */ 826 public void handleEntityStatus(Packet38EntityStatus par1Packet38EntityStatus) 827 { 828 Entity var2 = this.getEntityByID(par1Packet38EntityStatus.entityId); 829 830 if (var2 != null) 831 { 832 var2.handleHealthUpdate(par1Packet38EntityStatus.entityStatus); 833 } 834 } 835 836 private Entity getEntityByID(int par1) 837 { 838 return (Entity)(par1 == this.mc.thePlayer.entityId ? this.mc.thePlayer : this.worldClient.getEntityByID(par1)); 839 } 840 841 /** 842 * Recieves player health from the server and then proceeds to set it locally on the client. 843 */ 844 public void handleUpdateHealth(Packet8UpdateHealth par1Packet8UpdateHealth) 845 { 846 this.mc.thePlayer.setHealth(par1Packet8UpdateHealth.healthMP); 847 this.mc.thePlayer.getFoodStats().setFoodLevel(par1Packet8UpdateHealth.food); 848 this.mc.thePlayer.getFoodStats().setFoodSaturationLevel(par1Packet8UpdateHealth.foodSaturation); 849 } 850 851 /** 852 * Handle an experience packet. 853 */ 854 public void handleExperience(Packet43Experience par1Packet43Experience) 855 { 856 this.mc.thePlayer.setXPStats(par1Packet43Experience.experience, par1Packet43Experience.experienceTotal, par1Packet43Experience.experienceLevel); 857 } 858 859 /** 860 * respawns the player 861 */ 862 public void handleRespawn(Packet9Respawn par1Packet9Respawn) 863 { 864 if (par1Packet9Respawn.respawnDimension != this.mc.thePlayer.dimension) 865 { 866 this.doneLoadingTerrain = false; 867 this.worldClient = new WorldClient(this, new WorldSettings(0L, par1Packet9Respawn.gameType, false, this.mc.theWorld.getWorldInfo().isHardcoreModeEnabled(), par1Packet9Respawn.terrainType), par1Packet9Respawn.respawnDimension, par1Packet9Respawn.difficulty, this.mc.mcProfiler); 868 this.worldClient.isRemote = true; 869 this.mc.loadWorld(this.worldClient); 870 this.mc.thePlayer.dimension = par1Packet9Respawn.respawnDimension; 871 this.mc.displayGuiScreen(new GuiDownloadTerrain(this)); 872 } 873 874 this.mc.setDimensionAndSpawnPlayer(par1Packet9Respawn.respawnDimension); 875 this.mc.playerController.setGameType(par1Packet9Respawn.gameType); 876 } 877 878 public void handleExplosion(Packet60Explosion par1Packet60Explosion) 879 { 880 Explosion var2 = new Explosion(this.mc.theWorld, (Entity)null, par1Packet60Explosion.explosionX, par1Packet60Explosion.explosionY, par1Packet60Explosion.explosionZ, par1Packet60Explosion.explosionSize); 881 var2.field_77281_g = par1Packet60Explosion.chunkPositionRecords; 882 var2.doExplosionB(true); 883 this.mc.thePlayer.motionX += (double)par1Packet60Explosion.func_73607_d(); 884 this.mc.thePlayer.motionY += (double)par1Packet60Explosion.func_73609_f(); 885 this.mc.thePlayer.motionZ += (double)par1Packet60Explosion.func_73608_g(); 886 } 887 888 public void handleOpenWindow(Packet100OpenWindow par1Packet100OpenWindow) 889 { 890 EntityClientPlayerMP var2 = this.mc.thePlayer; 891 892 switch (par1Packet100OpenWindow.inventoryType) 893 { 894 case 0: 895 var2.displayGUIChest(new InventoryBasic(par1Packet100OpenWindow.windowTitle, par1Packet100OpenWindow.slotsCount)); 896 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 897 break; 898 case 1: 899 var2.displayGUIWorkbench(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ)); 900 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 901 break; 902 case 2: 903 var2.displayGUIFurnace(new TileEntityFurnace()); 904 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 905 break; 906 case 3: 907 var2.displayGUIDispenser(new TileEntityDispenser()); 908 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 909 break; 910 case 4: 911 var2.displayGUIEnchantment(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ)); 912 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 913 break; 914 case 5: 915 var2.displayGUIBrewingStand(new TileEntityBrewingStand()); 916 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 917 break; 918 case 6: 919 var2.displayGUIMerchant(new NpcMerchant(var2)); 920 var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; 921 } 922 } 923 924 public void handleSetSlot(Packet103SetSlot par1Packet103SetSlot) 925 { 926 EntityClientPlayerMP var2 = this.mc.thePlayer; 927 928 if (par1Packet103SetSlot.windowId == -1) 929 { 930 var2.inventory.setItemStack(par1Packet103SetSlot.myItemStack); 931 } 932 else 933 { 934 boolean var3 = false; 935 936 if (this.mc.currentScreen instanceof GuiContainerCreative) 937 { 938 GuiContainerCreative var4 = (GuiContainerCreative)this.mc.currentScreen; 939 var3 = var4.func_74230_h() != CreativeTabs.tabInventory.getTabIndex(); 940 } 941 942 if (par1Packet103SetSlot.windowId == 0 && par1Packet103SetSlot.itemSlot >= 36 && par1Packet103SetSlot.itemSlot < 45) 943 { 944 ItemStack var5 = var2.inventorySlots.getSlot(par1Packet103SetSlot.itemSlot).getStack(); 945 946 if (par1Packet103SetSlot.myItemStack != null && (var5 == null || var5.stackSize < par1Packet103SetSlot.myItemStack.stackSize)) 947 { 948 par1Packet103SetSlot.myItemStack.animationsToGo = 5; 949 } 950 951 var2.inventorySlots.putStackInSlot(par1Packet103SetSlot.itemSlot, par1Packet103SetSlot.myItemStack); 952 } 953 else if (par1Packet103SetSlot.windowId == var2.craftingInventory.windowId && (par1Packet103SetSlot.windowId != 0 || !var3)) 954 { 955 var2.craftingInventory.putStackInSlot(par1Packet103SetSlot.itemSlot, par1Packet103SetSlot.myItemStack); 956 } 957 } 958 } 959 960 public void handleTransaction(Packet106Transaction par1Packet106Transaction) 961 { 962 Container var2 = null; 963 EntityClientPlayerMP var3 = this.mc.thePlayer; 964 965 if (par1Packet106Transaction.windowId == 0) 966 { 967 var2 = var3.inventorySlots; 968 } 969 else if (par1Packet106Transaction.windowId == var3.craftingInventory.windowId) 970 { 971 var2 = var3.craftingInventory; 972 } 973 974 if (var2 != null && !par1Packet106Transaction.accepted) 975 { 976 this.addToSendQueue(new Packet106Transaction(par1Packet106Transaction.windowId, par1Packet106Transaction.shortWindowId, true)); 977 } 978 } 979 980 public void handleWindowItems(Packet104WindowItems par1Packet104WindowItems) 981 { 982 EntityClientPlayerMP var2 = this.mc.thePlayer; 983 984 if (par1Packet104WindowItems.windowId == 0) 985 { 986 var2.inventorySlots.putStacksInSlots(par1Packet104WindowItems.itemStack); 987 } 988 else if (par1Packet104WindowItems.windowId == var2.craftingInventory.windowId) 989 { 990 var2.craftingInventory.putStacksInSlots(par1Packet104WindowItems.itemStack); 991 } 992 } 993 994 /** 995 * Updates Client side signs 996 */ 997 public void handleUpdateSign(Packet130UpdateSign par1Packet130UpdateSign) 998 { 999 if (this.mc.theWorld.blockExists(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition)) 1000 { 1001 TileEntity var2 = this.mc.theWorld.getBlockTileEntity(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition); 1002 1003 if (var2 instanceof TileEntitySign) 1004 { 1005 TileEntitySign var3 = (TileEntitySign)var2; 1006 1007 if (var3.isEditable()) 1008 { 1009 for (int var4 = 0; var4 < 4; ++var4) 1010 { 1011 var3.signText[var4] = par1Packet130UpdateSign.signLines[var4]; 1012 } 1013 1014 var3.onInventoryChanged(); 1015 } 1016 } 1017 } 1018 } 1019 1020 public void handleTileEntityData(Packet132TileEntityData par1Packet132TileEntityData) 1021 { 1022 if (this.mc.theWorld.blockExists(par1Packet132TileEntityData.xPosition, par1Packet132TileEntityData.yPosition, par1Packet132TileEntityData.zPosition)) 1023 { 1024 TileEntity var2 = this.mc.theWorld.getBlockTileEntity(par1Packet132TileEntityData.xPosition, par1Packet132TileEntityData.yPosition, par1Packet132TileEntityData.zPosition); 1025 1026 if (var2 != null && par1Packet132TileEntityData.actionType == 1 && var2 instanceof TileEntityMobSpawner) 1027 { 1028 ((TileEntityMobSpawner)var2).readFromNBT(par1Packet132TileEntityData.customParam1); 1029 } 1030 else if (var2 != null) 1031 { 1032 var2.onDataPacket(netManager, par1Packet132TileEntityData); 1033 } 1034 else 1035 { 1036 /*Packet132TileEntityData pkt = par1Packet132TileEntityData; 1037 ModLoader.getLogger().log(Level.WARNING, String.format( 1038 "Received a TileEntityData packet for a location that did not have a TileEntity: (%d, %d, %d) %d: %d, %d, %d", 1039 pkt.xPosition, pkt.yPosition, pkt.zPosition, 1040 pkt.actionType, 1041 pkt.customParam1, pkt.customParam2, pkt.customParam3));*/ 1042 } 1043 } 1044 } 1045 1046 public void handleUpdateProgressbar(Packet105UpdateProgressbar par1Packet105UpdateProgressbar) 1047 { 1048 EntityClientPlayerMP var2 = this.mc.thePlayer; 1049 this.unexpectedPacket(par1Packet105UpdateProgressbar); 1050 1051 if (var2.craftingInventory != null && var2.craftingInventory.windowId == par1Packet105UpdateProgressbar.windowId) 1052 { 1053 var2.craftingInventory.updateProgressBar(par1Packet105UpdateProgressbar.progressBar, par1Packet105UpdateProgressbar.progressBarValue); 1054 } 1055 } 1056 1057 public void handlePlayerInventory(Packet5PlayerInventory par1Packet5PlayerInventory) 1058 { 1059 Entity var2 = this.getEntityByID(par1Packet5PlayerInventory.entityID); 1060 1061 if (var2 != null) 1062 { 1063 var2.func_70062_b(par1Packet5PlayerInventory.slot, par1Packet5PlayerInventory.getItemSlot()); 1064 } 1065 } 1066 1067 public void handleCloseWindow(Packet101CloseWindow par1Packet101CloseWindow) 1068 { 1069 this.mc.thePlayer.closeScreen(); 1070 } 1071 1072 public void handleBlockEvent(Packet54PlayNoteBlock par1Packet54PlayNoteBlock) 1073 { 1074 this.mc.theWorld.addBlockEvent(par1Packet54PlayNoteBlock.xLocation, par1Packet54PlayNoteBlock.yLocation, par1Packet54PlayNoteBlock.zLocation, par1Packet54PlayNoteBlock.blockId, par1Packet54PlayNoteBlock.instrumentType, par1Packet54PlayNoteBlock.pitch); 1075 } 1076 1077 public void handleBlockDestroy(Packet55BlockDestroy par1Packet55BlockDestroy) 1078 { 1079 this.mc.theWorld.destroyBlockInWorldPartially(par1Packet55BlockDestroy.getEntityId(), par1Packet55BlockDestroy.getPosX(), par1Packet55BlockDestroy.getPosY(), par1Packet55BlockDestroy.getPosZ(), par1Packet55BlockDestroy.getDestroyedStage()); 1080 } 1081 1082 public void handleMapChunks(Packet56MapChunks par1Packet56MapChunks) 1083 { 1084 for (int var2 = 0; var2 < par1Packet56MapChunks.func_73581_d(); ++var2) 1085 { 1086 int var3 = par1Packet56MapChunks.func_73582_a(var2); 1087 int var4 = par1Packet56MapChunks.func_73580_b(var2); 1088 this.worldClient.doPreChunk(var3, var4, true); 1089 this.worldClient.invalidateBlockReceiveRegion(var3 << 4, 0, var4 << 4, (var3 << 4) + 15, 256, (var4 << 4) + 15); 1090 Chunk var5 = this.worldClient.getChunkFromChunkCoords(var3, var4); 1091 1092 if (var5 == null) 1093 { 1094 this.worldClient.doPreChunk(var3, var4, true); 1095 var5 = this.worldClient.getChunkFromChunkCoords(var3, var4); 1096 } 1097 1098 if (var5 != null) 1099 { 1100 var5.fillChunk(par1Packet56MapChunks.func_73583_c(var2), par1Packet56MapChunks.field_73590_a[var2], par1Packet56MapChunks.field_73588_b[var2], true); 1101 this.worldClient.markBlocksDirty(var3 << 4, 0, var4 << 4, (var3 << 4) + 15, 256, (var4 << 4) + 15); 1102 1103 if (!(this.worldClient.provider instanceof WorldProviderSurface)) 1104 { 1105 var5.resetRelightChecks(); 1106 } 1107 } 1108 } 1109 } 1110 1111 /** 1112 * packet.processPacket is only called if this returns true 1113 */ 1114 public boolean canProcessPackets() 1115 { 1116 return this.mc != null && this.mc.theWorld != null && this.mc.thePlayer != null && this.worldClient != null; 1117 } 1118 1119 public void handleBed(Packet70GameEvent par1Packet70GameEvent) 1120 { 1121 EntityClientPlayerMP var2 = this.mc.thePlayer; 1122 int var3 = par1Packet70GameEvent.bedState; 1123 int var4 = par1Packet70GameEvent.gameMode; 1124 1125 if (var3 >= 0 && var3 < Packet70GameEvent.bedChat.length && Packet70GameEvent.bedChat[var3] != null) 1126 { 1127 var2.addChatMessage(Packet70GameEvent.bedChat[var3]); 1128 } 1129 1130 if (var3 == 1) 1131 { 1132 this.worldClient.getWorldInfo().setRaining(true); 1133 this.worldClient.setRainStrength(0.0F); 1134 } 1135 else if (var3 == 2) 1136 { 1137 this.worldClient.getWorldInfo().setRaining(false); 1138 this.worldClient.setRainStrength(1.0F); 1139 } 1140 else if (var3 == 3) 1141 { 1142 this.mc.playerController.setGameType(EnumGameType.getByID(var4)); 1143 } 1144 else if (var3 == 4) 1145 { 1146 this.mc.displayGuiScreen(new GuiWinGame()); 1147 } 1148 else if (var3 == 5) 1149 { 1150 GameSettings var5 = this.mc.gameSettings; 1151 1152 if (var4 == 0) 1153 { 1154 this.mc.displayGuiScreen(new GuiScreenDemo()); 1155 } 1156 else if (var4 == 101) 1157 { 1158 this.mc.ingameGUI.getChatGUI().addTranslatedMessage("demo.help.movement", new Object[] {Keyboard.getKeyName(var5.keyBindForward.keyCode), Keyboard.getKeyName(var5.keyBindLeft.keyCode), Keyboard.getKeyName(var5.keyBindBack.keyCode), Keyboard.getKeyName(var5.keyBindRight.keyCode)}); 1159 } 1160 else if (var4 == 102) 1161 { 1162 this.mc.ingameGUI.getChatGUI().addTranslatedMessage("demo.help.jump", new Object[] {Keyboard.getKeyName(var5.keyBindJump.keyCode)}); 1163 } 1164 else if (var4 == 103) 1165 { 1166 this.mc.ingameGUI.getChatGUI().addTranslatedMessage("demo.help.inventory", new Object[] {Keyboard.getKeyName(var5.keyBindInventory.keyCode)}); 1167 } 1168 } 1169 } 1170 1171 /** 1172 * Contains logic for handling packets containing arbitrary unique item data. Currently this is only for maps. 1173 */ 1174 public void handleMapData(Packet131MapData par1Packet131MapData) 1175 { 1176 FMLNetworkHandler.handlePacket131Packet(this, par1Packet131MapData); 1177 } 1178 1179 public void fmlPacket131Callback(Packet131MapData par1Packet131MapData) 1180 { 1181 if (par1Packet131MapData.itemID == Item.map.shiftedIndex) 1182 { 1183 ItemMap.getMPMapData(par1Packet131MapData.uniqueID, this.mc.theWorld).updateMPMapData(par1Packet131MapData.itemData); 1184 } 1185 else 1186 { 1187 System.out.println("Unknown itemid: " + par1Packet131MapData.uniqueID); 1188 } 1189 } 1190 1191 public void handleDoorChange(Packet61DoorChange par1Packet61DoorChange) 1192 { 1193 this.mc.theWorld.playAuxSFX(par1Packet61DoorChange.sfxID, par1Packet61DoorChange.posX, par1Packet61DoorChange.posY, par1Packet61DoorChange.posZ, par1Packet61DoorChange.auxData); 1194 } 1195 1196 /** 1197 * Increment player statistics 1198 */ 1199 public void handleStatistic(Packet200Statistic par1Packet200Statistic) 1200 { 1201 this.mc.thePlayer.incrementStat(StatList.getOneShotStat(par1Packet200Statistic.statisticId), par1Packet200Statistic.amount); 1202 } 1203 1204 /** 1205 * Handle an entity effect packet. 1206 */ 1207 public void handleEntityEffect(Packet41EntityEffect par1Packet41EntityEffect) 1208 { 1209 Entity var2 = this.getEntityByID(par1Packet41EntityEffect.entityId); 1210 1211 if (var2 instanceof EntityLiving) 1212 { 1213 ((EntityLiving)var2).addPotionEffect(new PotionEffect(par1Packet41EntityEffect.effectId, par1Packet41EntityEffect.duration, par1Packet41EntityEffect.effectAmplifier)); 1214 } 1215 } 1216 1217 /** 1218 * Handle a remove entity effect packet. 1219 */ 1220 public void handleRemoveEntityEffect(Packet42RemoveEntityEffect par1Packet42RemoveEntityEffect) 1221 { 1222 Entity var2 = this.getEntityByID(par1Packet42RemoveEntityEffect.entityId); 1223 1224 if (var2 instanceof EntityLiving) 1225 { 1226 ((EntityLiving)var2).removePotionEffect(par1Packet42RemoveEntityEffect.effectId); 1227 } 1228 } 1229 1230 /** 1231 * determine if it is a server handler 1232 */ 1233 public boolean isServerHandler() 1234 { 1235 return false; 1236 } 1237 1238 /** 1239 * Handle a player information packet. 1240 */ 1241 public void handlePlayerInfo(Packet201PlayerInfo par1Packet201PlayerInfo) 1242 { 1243 GuiPlayerInfo var2 = (GuiPlayerInfo)this.playerInfoMap.get(par1Packet201PlayerInfo.playerName); 1244 1245 if (var2 == null && par1Packet201PlayerInfo.isConnected) 1246 { 1247 var2 = new GuiPlayerInfo(par1Packet201PlayerInfo.playerName); 1248 this.playerInfoMap.put(par1Packet201PlayerInfo.playerName, var2); 1249 this.playerInfoList.add(var2); 1250 } 1251 1252 if (var2 != null && !par1Packet201PlayerInfo.isConnected) 1253 { 1254 this.playerInfoMap.remove(par1Packet201PlayerInfo.playerName); 1255 this.playerInfoList.remove(var2); 1256 } 1257 1258 if (par1Packet201PlayerInfo.isConnected && var2 != null) 1259 { 1260 var2.responseTime = par1Packet201PlayerInfo.ping; 1261 } 1262 } 1263 1264 /** 1265 * Handle a keep alive packet. 1266 */ 1267 public void handleKeepAlive(Packet0KeepAlive par1Packet0KeepAlive) 1268 { 1269 this.addToSendQueue(new Packet0KeepAlive(par1Packet0KeepAlive.randomId)); 1270 } 1271 1272 /** 1273 * Handle a player abilities packet. 1274 */ 1275 public void handlePlayerAbilities(Packet202PlayerAbilities par1Packet202PlayerAbilities) 1276 { 1277 EntityClientPlayerMP var2 = this.mc.thePlayer; 1278 var2.capabilities.isFlying = par1Packet202PlayerAbilities.getFlying(); 1279 var2.capabilities.isCreativeMode = par1Packet202PlayerAbilities.isCreativeMode(); 1280 var2.capabilities.disableDamage = par1Packet202PlayerAbilities.getDisableDamage(); 1281 var2.capabilities.allowFlying = par1Packet202PlayerAbilities.getAllowFlying(); 1282 var2.capabilities.setFlySpeed(par1Packet202PlayerAbilities.getFlySpeed()); 1283 } 1284 1285 public void handleAutoComplete(Packet203AutoComplete par1Packet203AutoComplete) 1286 { 1287 String[] var2 = par1Packet203AutoComplete.getText().split("\u0000"); 1288 1289 if (this.mc.currentScreen instanceof GuiChat) 1290 { 1291 GuiChat var3 = (GuiChat)this.mc.currentScreen; 1292 var3.func_73894_a(var2); 1293 } 1294 } 1295 1296 public void handleLevelSound(Packet62LevelSound par1Packet62LevelSound) 1297 { 1298 this.mc.theWorld.playSound(par1Packet62LevelSound.getEffectX(), par1Packet62LevelSound.getEffectY(), par1Packet62LevelSound.getEffectZ(), par1Packet62LevelSound.getSoundName(), par1Packet62LevelSound.getVolume(), par1Packet62LevelSound.getPitch()); 1299 } 1300 1301 public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload) 1302 { 1303 FMLNetworkHandler.handlePacket250Packet(par1Packet250CustomPayload, netManager, this); 1304 } 1305 1306 public void handleVanilla250Packet(Packet250CustomPayload par1Packet250CustomPayload) 1307 { 1308 if ("MC|TPack".equals(par1Packet250CustomPayload.channel)) 1309 { 1310 String[] var2 = (new String(par1Packet250CustomPayload.data)).split("\u0000"); 1311 String var3 = var2[0]; 1312 1313 if (var2[1].equals("16")) 1314 { 1315 if (this.mc.texturePackList.getAcceptsTextures()) 1316 { 1317 this.mc.texturePackList.requestDownloadOfTexture(var3); 1318 } 1319 else if (this.mc.texturePackList.func_77300_f()) 1320 { 1321 this.mc.displayGuiScreen(new GuiYesNo(new NetClientWebTextures(this, var3), StringTranslate.getInstance().translateKey("multiplayer.texturePrompt.line1"), StringTranslate.getInstance().translateKey("multiplayer.texturePrompt.line2"), 0)); 1322 } 1323 } 1324 } 1325 else if ("MC|TrList".equals(par1Packet250CustomPayload.channel)) 1326 { 1327 DataInputStream var8 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data)); 1328 1329 try 1330 { 1331 int var9 = var8.readInt(); 1332 GuiScreen var4 = this.mc.currentScreen; 1333 1334 if (var4 != null && var4 instanceof GuiMerchant && var9 == this.mc.thePlayer.craftingInventory.windowId) 1335 { 1336 IMerchant var5 = ((GuiMerchant)var4).getIMerchant(); 1337 MerchantRecipeList var6 = MerchantRecipeList.readRecipiesFromStream(var8); 1338 var5.setRecipes(var6); 1339 } 1340 } 1341 catch (IOException var7) 1342 { 1343 var7.printStackTrace(); 1344 } 1345 } 1346 } 1347 1348 /** 1349 * Return the NetworkManager instance used by this NetClientHandler 1350 */ 1351 public NetworkManager getNetManager() 1352 { 1353 return this.netManager; 1354 } 1355 1356 @Override 1357 public EntityPlayer getPlayer() 1358 { 1359 return mc.thePlayer; 1360 } 1361 1362 public static void setConnectionCompatibilityLevel(byte connectionCompatibilityLevel) 1363 { 1364 NetClientHandler.connectionCompatibilityLevel = connectionCompatibilityLevel; 1365 } 1366 1367 public static byte getConnectionCompatibilityLevel() 1368 { 1369 return connectionCompatibilityLevel; 1370 } 1371 }