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